// Return new array with duplicate values removed function array_unique(arr) { var a = []; var l = arr.length; for(var i=0; i' + x + '') .css({'position': 'absolute', 'float': 'left', 'visibility': 'hidden', 'font': f}) .appendTo($('body')); if ( o.width() > width ) width = o.width(); height += 5 + o.height(); o.remove(); }, this); return [width, height]; } function rotatePoints(arr, x, y, degrees) { arr.forEach(function(p) { p.rotate(x, y, degrees, true); }, this); } function positiveRectangle(x, y, w, h) { if ( w < 0 ) { w = -(w); x = x - w; } if ( h < 0 ) { h = -(h); y = y - h; } return new Phaser.Rectangle(x, y, w, h); } function nearestInGroup(sprite, group, sprite_group) { var nearest = null; var lastdist = 0.0; for ( var i = 0 ; i < group.length; i++ ) { console.log("Checking distance to group[" + i + "]"); var spr = group.getChildAt(i); console.log(spr); if ( (typeof sprite_group !== undefined) && spr.sprite_group !== sprite_group ) continue; var dist = new Phaser.Line(sprite.x, sprite.y, spr.x, spr.y); if ( (lastdist == 0.0 ) || (dist.length < lastdist) ) { lastdist = dist.length; nearest = spr; } } return nearest; } function nearestWalkableTile(spr) { var grid = gridWithAISprites(); function _walkable_inner(multiplier) { var startx = parseInt(Math.max((spr.x / 32) - (1 * multiplier), 0)); var starty = parseInt(Math.max((spr.y / 32) - (1 * multiplier), 0)); var endx = parseInt(Math.min((spr.x / 32) + 1 + (1 * multiplier), game.state.states.game.map.width)); var endy = parseInt(Math.min((spr.y / 32) + 1 + (1 * multiplier), game.state.states.game.map.height)); for ( var x = startx ; x <= endx ; x++ ) { for ( var y = starty ; y <= endy ; y++ ) { if ( (x == startx ) || (x == endx ) || (y == starty ) || (y == endy) ) { if ( grid.nodes[y][x].walkable == true ) { console.log([x, y]); return [x, y]; } } } } return null; } for ( var i = 1 ; i < 100 ; i++ ) { var rv = _walkable_inner(i); if ( isSet(rv) ) { console.log("Found near walkable tile"); console.log([rv] + [spr.x / 32, spr.y / 32]); return rv } } //if ( multiplier >= 10 ) console.log("Couldn't find a near walkable tile"); console.log([spr.x / 32, spr.y / 32]); return [parseInt(spr.x / 32), parseInt(spr.y / 32)]; //return nearestWalkableTile(spr, multiplier + 1); } function addAnimation(obj, anim) { a = moonlightSettings['animations'][anim] obj.animations.add(anim, a['frames'], a['speed'], a['loop']) } function getAwarenessState(spr) { if ( hasState(spr, STATE_UNAWARE) ) return STATE_UNAWARE; if ( hasState(spr, STATE_CONCERNED) ) return STATE_CONCERNED; if ( hasState(spr, STATE_ALERTED) ) return STATE_ALERTED; if ( hasState(spr, STATE_LOSTHIM) ) return STATE_LOSTHIM; } function getFaceState(spr) { if ( hasState(spr, STATE_FACE_LEFT) ) return STATE_FACE_LEFT; if ( hasState(spr, STATE_FACE_RIGHT) ) return STATE_FACE_RIGHT; if ( hasState(spr, STATE_FACE_DOWN) ) return STATE_FACE_DOWN; if ( hasState(spr, STATE_FACE_UP) ) return STATE_FACE_UP; } function getMoveState(spr) { return ( hasState(spr, STATE_MOVING) || hasState(spr, STATE_RUNNING) ); } function delState(spr, state) { if ( hasState(spr, state) ) spr.state = spr.state ^ state; } function addState(spr, state) { spr.state = spr.state | state; } function setMovingState(spr, state) { delState(spr, STATE_FACE_LEFT); delState(spr, STATE_FACE_RIGHT); delState(spr, STATE_FACE_DOWN); delState(spr, STATE_FACE_UP); delState(spr, STATE_MOVING); delState(spr, STATE_RUNNING); addState(spr, state); } function setAwarenessState(spr, state) { delState(spr, STATE_UNAWARE); delState(spr, STATE_CONCERNED); delState(spr, STATE_ALERTED); delState(spr, STATE_LOSTHIM); addState(spr, state); } function exchangeState(spr, state1, state2) { delState(spr, state1); addState(spr, state2); } function hasAnyState(spr, states) { var hasstate = false; states.forEach(function(x) { if ( hasState(spr, x) ) hasstate = true; }, this); return hasstate; } function hasState(spr, state) { if ( (spr.state & state) == state ) return true; return false; } function spriteFacing(spr) { if ( hasState(spr, STATE_FACE_LEFT) ) return "left"; if ( hasState(spr, STATE_FACE_RIGHT) ) return "right"; if ( hasState(spr, STATE_FACE_DOWN) ) return "down"; if ( hasState(spr, STATE_FACE_UP) ) return "up"; } function parseBoolean(val) { return ( val == 'true' || val == true ); } function getMovingAnimationName(spr) { var sprbase = "bipedwalk"; if ( hasState(spr, STATE_RUNNING) ) sprbase = "bipedrun"; return sprbase + spriteFacing(spr); } function setSpriteMovement(spr, velocity) { var x = 0; var y = 0; var dir = spriteFacing(spr); velocity = ( typeof velocity == undefined ? velocity : [SPEED_WALKING, SPEED_RUNNING] ); spr.body.setSize(16, 16, 8, 16); if ( hasState(spr, STATE_RUNNING) ) { if ( velocity !== false ) velocity = velocity[1]; spr.animations.play("bipedrun" + dir); } else if ( hasState(spr, STATE_MOVING) ) { if ( velocity !== false ) velocity = velocity[0]; spr.animations.play("bipedwalk" + dir); } else { if ( velocity !== false ) { spr.body.velocity.x = 0; spr.body.velocity.y = 0; } spr.animations.stop(); return; } if ( velocity !== false ) { if ( dir == "left" ) { spr.body.velocity.x = -(velocity * velocity); spr.body.velocity.y = 0; } else if ( dir == "right" ) { spr.body.velocity.x = (velocity * velocity); spr.body.velocity.y = 0; } else if ( dir == "up" ) { spr.body.velocity.x = 0; spr.body.velocity.y = -(velocity * velocity); } else if ( dir == "down" ) { spr.body.velocity.x = 0; spr.body.velocity.y = (velocity * velocity); } } } function genericGridClone() { return pathfinder_grid.clone(); } function gridWithAISprites() { var grid = pathfinder_grid.clone(); var aiSprites = game.state.states.game.aiSprites; for ( var i = 0 ; i < aiSprites.length ; i++ ) { var spr = aiSprites.getChildAt(i); // --- We have to normalize the (x,y) because this may be // called before the sprites are rebounded back inside the map, // and these references will go out of bounds var normx = Math.max(parseInt(spr.x/32), 0); var normy = Math.max(parseInt(spr.y/32), 0); grid.nodes[normy][normx].walkable = false; } return grid; } function stringifyInt(x) { return ("" + x); } function isSet(x) { return ( (typeof x !== 'undefined') && ( x !== null ) ); }