Move to a state machine

This commit is contained in:
2014-06-14 11:59:41 -07:00
parent 98fe04e4aa
commit 868ddd8688

View File

@@ -2,11 +2,16 @@ STATE_UNAWARE = 1 << 1;
STATE_CONCERNED = 1 << 2; STATE_CONCERNED = 1 << 2;
STATE_ALERTED = 1 << 3; STATE_ALERTED = 1 << 3;
STATE_LOSTHIM = 1 << 4; STATE_LOSTHIM = 1 << 4;
STATE_RUN = 1 << 5;
STATE_MOVE_LEFT = 1 << 6; STATE_RUNNING = 1 << 5;
STATE_MOVE_RIGHT = 1 << 7; STATE_FACE_LEFT = 1 << 6;
STATE_MOVE_UP = 1 << 8; STATE_FACE_RIGHT = 1 << 7;
STATE_MOVE_DOWN = 1 << 9; STATE_FACE_UP = 1 << 8;
STATE_FACE_DOWN = 1 << 9;
STATE_MOVING = 1 << 10;
STATES_MOVEMENT = (STATE_MOVING | STATE_RUNNING);
STATES_FACE = (STATE_FACE_LEFT | STATE_FACE_RIGHT | STATE_FACE_DOWN | STATE_FACE_UP);
SPRITE_TOWNSFOLK_MALE = 1; SPRITE_TOWNSFOLK_MALE = 1;
SPRITE_TOWNSFOLK_FEMALE = 2; SPRITE_TOWNSFOLK_FEMALE = 2;
@@ -16,10 +21,12 @@ SPRITE_TOWNSFOLK_MALE1 = 1;
SPRITE_TOWNSFOLK_MALE2 = 2; SPRITE_TOWNSFOLK_MALE2 = 2;
SPRITE_TOWNSFOLK_MALE3 = 3; SPRITE_TOWNSFOLK_MALE3 = 3;
SPRITE_TOWNSFOLK_MALE4 = 4; SPRITE_TOWNSFOLK_MALE4 = 4;
SPRITE_TOWNSFOLK_FEMALE1 = 5; SPRITE_TOWNSFOLK_FEMALE1 = 5;
SPRITE_TOWNSFOLK_FEMALE2 = 6; SPRITE_TOWNSFOLK_FEMALE2 = 6;
SPRITE_TOWNSFOLK_FEMALE3 = 7; SPRITE_TOWNSFOLK_FEMALE3 = 7;
SPRITE_TOWNSFOLK_FEMALE4 = 8; SPRITE_TOWNSFOLK_FEMALE4 = 8;
SPRITE_TOWNSFOLK_GUARD1 = 9; SPRITE_TOWNSFOLK_GUARD1 = 9;
SPRITE_TOWNSFOLK_GUARD2 = 10; SPRITE_TOWNSFOLK_GUARD2 = 10;
@@ -618,6 +625,7 @@ var AISprite = function(game, x, y, key, frame) {
this.update = function() this.update = function()
{ {
var running = false; var running = false;
var newstate = STATE_NONE;
if ( this.bubble_text !== null ) { if ( this.bubble_text !== null ) {
if ( this.clear_bubble == true ) { if ( this.clear_bubble == true ) {
@@ -633,27 +641,29 @@ var AISprite = function(game, x, y, key, frame) {
if ( game.rnd.integerInRange(0, 100) < 95 ) if ( game.rnd.integerInRange(0, 100) < 95 )
return; return;
//if ( game.rnd.integerInRange(0, 100) > 90 ) { if ( game.rnd.integerInRange(0, 100) > 90 ) {
// running = true; newstate = STATE_RUNNING;
//} }
switch ( game.rnd.integerInRange(0, 4) ) { switch ( game.rnd.integerInRange(0, 4) ) {
case 0: { case 0: {
setSpriteMovement(this, running, 'up'); newstate = newstate | (STATE_FACE_RIGHT | STATE_MOVING);
break; break;
} }
case 1: { case 1: {
setSpriteMovement(this, running, 'down'); newstate = newstate | (STATE_FACE_LEFT | STATE_MOVING);
break; break;
} }
case 2: { case 2: {
setSpriteMovement(this, running, 'left'); newstate = newstate | (STATE_FACE_UP | STATE_MOVING);
break; break;
} }
case 3: { case 3: {
setSpriteMovement(this, running, 'right'); newstate = newstate | (STATE_FACE_DOWN | STATE_MOVING);
} }
} }
exchangeState(this, (STATES_FACE | STATES_MOVEMENT), newstate);
setSpriteMovement(this);
} }
this.update_new_values = function() { this.update_new_values = function() {
@@ -672,7 +682,8 @@ var AISprite = function(game, x, y, key, frame) {
addAnimation(this, 'bipedrunright'); addAnimation(this, 'bipedrunright');
addAnimation(this, 'bipedrunup'); addAnimation(this, 'bipedrunup');
addAnimation(this, 'bipedrundown'); addAnimation(this, 'bipedrundown');
setSpriteMovement(this, false, 'down'); exchangeState(this, (STATES_FACE | STATES_MOVEMENT), STATE_FACE_DOWN);
setSpriteMovement(this);
} }
var spritenames_by_type = [ var spritenames_by_type = [
@@ -848,19 +859,60 @@ GameState.prototype.updateShadowTexture = function() {
this.shadowTexture.dirty = true; this.shadowTexture.dirty = true;
}; };
function setSpriteMovement(spr, running, dir) function delState(spr, state)
{
spr.state = spr.state ^ state;
}
function addState(spr, state)
{
spr.state = spr.state | state;
}
function exchangeState(spr, state1, state2)
{
delState(spr, state1);
addState(spr, state2);
}
function hasState(spr, state)
{
return ( spr.state & state == state );
}
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 setSpriteMovement(spr)
{ {
var x = 0; var x = 0;
var y = 0; var y = 0;
var dir = spriteFacing(spr);
if ( running ) { spr.body.setSize(16, 16, 8, 16);
if ( hasState(spr, STATE_RUNNING) ) {
x = 200; x = 200;
y = 200; y = 200;
spr.animations.play("bipedrun" + dir); spr.animations.play("bipedrun" + dir);
} else { } else if ( hasState(spr, STATE_MOVING) ) {
x = 75; x = 75;
y = 75; y = 75;
spr.animations.play("bipedwalk" + dir); spr.animations.play("bipedwalk" + dir);
} else {
spr.body.velocity.x = 0;
spr.body.velocity.y = 0;
spr.animations.stop();
return;
} }
if ( dir == "left" ) { if ( dir == "left" ) {
@@ -876,7 +928,6 @@ function setSpriteMovement(spr, running, dir)
spr.body.velocity.x = 0; spr.body.velocity.x = 0;
spr.body.velocity.y = y; spr.body.velocity.y = y;
} }
spr.body.setSize(16, 16, 8, 16);
} }
GameState.prototype.check_input = function() GameState.prototype.check_input = function()
@@ -884,18 +935,38 @@ GameState.prototype.check_input = function()
player.body.velocity.x = 0; player.body.velocity.x = 0;
player.body.velocity.y = 0; player.body.velocity.y = 0;
velocityMod = 0; velocityMod = 0;
var newstate = 0;
if ( controls.up.isDown) { if ( controls.up.isDown) {
setSpriteMovement(player, controls.up.shiftKey, 'up'); if ( controls.up.shiftKey ) {
newstate = (STATE_FACE_LEFT | STATE_MOVING | STATE_RUNNING);
} else {
newstate = (STATE_FACE_LEFT | STATE_MOVING );
}
} else if ( controls.down.isDown ) { } else if ( controls.down.isDown ) {
setSpriteMovement(player, controls.up.shiftKey, 'down'); if ( controls.down.shiftKey ) {
newstate = (STATE_FACE_DOWN | STATE_MOVING | STATE_RUNNING);
} else {
newstate = (STATE_FACE_DOWN | STATE_MOVING );
}
} else if ( controls.left.isDown ) { } else if ( controls.left.isDown ) {
setSpriteMovement(player, controls.up.shiftKey, 'left'); if ( controls.left.shiftKey ) {
newstate = (STATE_FACE_LEFT | STATE_MOVING | STATE_RUNNING);
} else {
newstate = (STATE_FACE_LEFT | STATE_MOVING );
}
} else if ( controls.right.isDown ) { } else if ( controls.right.isDown ) {
setSpriteMovement(player, controls.up.shiftKey, 'right'); if ( controls.right.shiftKey ) {
newstate = (STATE_FACE_RIGHT | STATE_MOVING | STATE_RUNNING);
} else {
newstate = (STATE_FACE_RIGHT | STATE_MOVING );
}
} else { } else {
player.animations.stop(null, true); newstate = STATE_NONE;
} }
exchangeState(player, (STATES_FACE | STATES_MOVEMENT), newstate);
setSpriteMovement(player);
} }
GameState.prototype.update = function() GameState.prototype.update = function()