|
|
-
- // Utility function
- var util = {};
-
- // Heading: 0 <
- // 1 ^
- // 2 >
- // 3 v
- util.moves = [{dx: -1, dy: 0}, {dx: 0, dy: -1}, {dx: +1, dy: 0}, {dx: 0, dy: +1}];
-
- // Unit types and powers
- util.unitTypes = ["hq", "soldier", "tank", "canon", "helo"];
- util.unitPowers = [constant.powerHq, constant.powerSoldier, constant.powerTank, constant.powerCanon, constant.powerHelo];
- util.unitStats = [constant.statHq, constant.statSoldier, constant.statTank, constant.statCanon, constant.statHelo];
-
- // Unit type
- util.explosionsImages = ["explosion_1", "explosion_2", "explosion_3", "explosion_4", "explosion_5", "explosion_6", "explosion_7"];
-
-
- // Prepare board using ground model
- util.createMap = function(grounds) {
- var game = [];
- var index = 0;
- for (var i = 0 ; i < constant.boardHeight ; i++ ) {
- var line = []
- for (var j = 0 ; j < constant.boardWidth ; j++ ) {
- var ground = constant.tileEmpty;
- var current = grounds[index];
- if (current == 'O')
- ground = constant.tileWater;
- else if (current == 'H')
- ground = constant.tileTrees;
- else if (current == '^')
- ground = constant.tileMountain;
- line.push(ground);
- index++;
- }
- game.push(line);
- }
-
- return game;
- }
-
- // Create a set of units
- util.createUnit = function(unit) {
- var heading = unit.color == "blue" ? 2 : 0;
- var power = 0;
- for (var i = 0 ; i < util.unitTypes.length ; i++) {
- if (util.unitTypes[i] == unit.type) {
- power = util.unitPowers[i];
- }
- }
- var imageprefix = unit.type + "_" + unit.color;
- while(util.lookForUnit(unit) != null)
- unit.x = unit.x+1;
- var newUnit = new Sprite({
- x: unit.x, y: unit.y,
- heading: heading, power: power,
- engine: unit.engine,
- images: (unit.type == "hq") ? [imageprefix] : [imageprefix+"_0", imageprefix+"_1", imageprefix+"_2", imageprefix+"_3"]
- });
- return newUnit;
- }
-
- util.createUnits = function(units) {
- var created = [];
- for (var i = 0 ; i < units.length ; i++) {
- created.push(util.createUnit(units[i]));
- }
- return created;
- }
-
- // Test if
- util.isValidPosition = function(position, sprite) {
- // Out of board
- if (position.x < 0 || position.x == constant.boardWidth || position.y < 0 || position.y == constant.boardHeight)
- return false;
-
- // Authorized ground depend of unit type
- var maptype=play.game[position.y][position.x];
- var unittype=util.getUnitType(sprite);
- if (unittype == 4)
- return true; // Helo can go anywhere
- if (maptype == constant.tileEmpty)
- return true; // Grass is for everyone
- if (unittype == 0)
- return maptype == constant.tileEmpty; // HQ only on grass
- if (maptype == constant.tileTrees)
- return unittype == 1; // Trees is only for soldier
- else if (maptype == constant.tileWater)
- return unittype == 1; // Water is only for soldier
-
- // Already a unit inside
- var unitinside = util.lookForUnit(position);
- if (unitinside != null)
- return unitinside == sprite;
- return false;
- }
-
- // Compute next position if sprite go ahead in the current heading
- util.nextPositionOnHeading = function(sprite) {
- return { x: sprite.x + util.moves[sprite.heading].dx, y: sprite.y + util.moves[sprite.heading].dy };
- }
-
- // Look for unit at a position
- util.lookForUnit = function(position) {
- // Check this position for each unit
- for (var i = 0 ; i < play.units.length ; i++)
- if (play.units[i].x == position.x && play.units[i].y == position.y)
- return play.units[i];
- return null;
- }
-
- // Look for unit with a value
- util.lookForValue = function(value) {
- // Check this value on each unit
- var set = [];
- for (var i = 0 ; i < play.units.length ; i++) {
- if (play.units[i].value !== undefined && play.units[i].value.result == value)
- set.push(play.units[i]);
- }
- return set;
- }
-
- // Look for opponent around the sprite
- util.lookForOpponent = function(sprite) {
- var oppositeColor = sprite.getCurrentImage().indexOf("red") != -1 ? "blue" : "red";
- for (var i = 0 ; i < util.moves.length ; i++ ) {
- var position = {x: sprite.x + util.moves[i].dx, y: sprite.y + util.moves[i].dy};
- var neighbour = util.lookForUnit(position);
- if (neighbour != null && neighbour.getCurrentImage().indexOf(oppositeColor) != -1)
- return {heading: i, unit: neighbour};
- }
- return null;
- }
-
- // Get unit type
- util.getUnitType = function(unit) {
- var image = unit.getCurrentImage();
- for (var i = 0 ; i < util.unitTypes.length ; i++)
- if (image.indexOf(util.unitTypes[i]) != -1)
- return i;
- return -1;
- }
-
- // Test if a unit could beat another
- util.couldBeat = function(unit1, unit2) {
- var type1 = util.getUnitType(unit1);
- var type2 = util.getUnitType(unit2);
- if (type1 == 1 && type2 == util.unitTypes.length - 1) // Soldier could beat Helo
- return true;
- return (type1 >= type2);
- }
-
- // Handle fight between two opponents
- util.processFight = function(unit1, unit2, power) {
- if (unit1 != null && !util.couldBeat(unit1, unit2))
- return;
- unit2.power = unit2.power - (power !== undefined ? power : 1);
- util.doExplosion(unit2);
- }
-
- // Do explosion animation
- util.doExplosion = function(position) {
- var index = 0;
- sound.play("audio/explosion");
- var timer = window.setInterval(function() {
- if (index == util.explosionsImages.length || app.endOfGame) {
- window.clearInterval(timer);
- return;
- }
- var ctx = play.canvas.hasNode().getContext('2d');
- var image = document.getElementById(util.explosionsImages[index]);
- if (!enyo.platform.android || document.location.protocol.substr(0,4) == "http") {
- // HACK: Don't do on Android because it flash the screen
- ctx.save();
- ctx.translate(position.x*constant.tileSize, position.y*constant.tileSize);
- ctx.drawImage(image, 0, 0);
- ctx.restore();
- }
- index++;
- }, constant.explosionInterval);
- }
-
- // Get URL parameter
- util.getUrlParameter = function(name) {
- var match = RegExp('[?&]' + name + '=([^&]*)').exec(window.location.search);
- return match && decodeURIComponent(match[1].replace(/\+/g, ' '));
- }
-
- // Get a random number
- util.random = function(max) {
- return Math.floor(Math.random()*max);
- }
-
- // Get randomly a unit name
- util.randomUnit = function(stats) {
- var unittype = util.random(10);
- for (var i = util.unitStats.length-1 ; i > 0 ; i--) {
- if (unittype >= stats[i]) {
- return util.unitTypes[i];
- }
- }
- }
-
- // Computer nearest unit from me
- util.nearestUnit = function(me, units) {
- var current = -1;
- var near = constant.boardWidth*constant.boardHeight;
- for (var i = 0 ; i < units.length ; i++) {
- var distance = Math.abs(units[i].x - me.x)+Math.abs(units[i].y - me.y);
- if (distance < near) {
- current = i;
- near = distance;
- }
- }
- return current != -1 ? units[current] : null;
- }
|