Close #10 : AI stops and chats when they touch each other

This commit is contained in:
2014-07-11 08:10:42 -07:00
parent ce098c1e37
commit a8d33e956d
5 changed files with 60 additions and 36 deletions

View File

@@ -365,13 +365,13 @@
"sprite_facing":"right", "sprite_facing":"right",
"sprite_group":"townsfolk-male", "sprite_group":"townsfolk-male",
"sprite_has_treasure":"true", "sprite_has_treasure":"true",
"sprite_name":"townsfolk-male-3", "sprite_name":"townsfolk-male-1",
"sprite_route":"BigTopRoute2" "sprite_route":"BigTopRoute2"
}, },
"type":"AI", "type":"AI",
"visible":true, "visible":true,
"width":0, "width":0,
"x":576, "x":608,
"y":512 "y":512
}], }],
"opacity":1, "opacity":1,

View File

@@ -76,6 +76,21 @@ var AISprite = function(game, x, y, key, frame) {
this.awareness_change_enabled = true; this.awareness_change_enabled = true;
} }
this.enableAwarenessChange = function(state) {
delState(this, STATE_CONVERSATION_DISABLED);
}
this.startConversationTimer = function() {
addState(this, STATE_CONVERSATION_DISABLED);
if ( isSet(this.conversation_timer) )
this.conversation_timer.stop();
this.conversation_timer = game.time.create(false);
this.conversation_timer.add(this.sprite_conversation_duration,
this.enableConversationChange,
this);
this.conversation_timer.start()
}
this.startAwarenessTimer = function() { this.startAwarenessTimer = function() {
this.awareness_change_enabled = false; this.awareness_change_enabled = false;
if ( isSet(this.awareness_timer) ) if ( isSet(this.awareness_timer) )
@@ -140,8 +155,9 @@ var AISprite = function(game, x, y, key, frame) {
if ( hasState(this, STATE_CONVERSING) == true && if ( hasState(this, STATE_CONVERSING) == true &&
( state == STATE_CONCERNED || ( state == STATE_CONCERNED ||
state == STATE_ALERTED ) ) state == STATE_ALERTED ) ) {
purgeConversation(this, this.conversation_partner); purgeConversation(this, this.conversation_partner);
}
awardPlayerScoreByState(state); awardPlayerScoreByState(state);
this.state_changed_at = new Phaser.Point(this.x, this.y); this.state_changed_at = new Phaser.Point(this.x, this.y);
@@ -382,9 +398,6 @@ var AISprite = function(game, x, y, key, frame) {
this._object.animations.play(getMovingAnimationName(this._object)); this._object.animations.play(getMovingAnimationName(this._object));
}, tween); }, tween);
tween.onComplete.add(function() { tween.onComplete.add(function() {
if ( this._object.resetPathOnCollision() == true ) {
return;
}
this._object.path_index += 1; this._object.path_index += 1;
setMovingState(this._object, getFaceState(this._object)); setMovingState(this._object, getFaceState(this._object));
this._object.animations.play(getMovingAnimationName(this._object)); this._object.animations.play(getMovingAnimationName(this._object));
@@ -399,40 +412,10 @@ var AISprite = function(game, x, y, key, frame) {
this.path_tweens[0].start(); this.path_tweens[0].start();
} }
this.resetPathOnCollision = function() {
if ( hasState(this, STATE_CONVERSING) == true )
return true;
var aiSprites = game.state.states.game.aiSprites;
var hasBeenReset = false;
aiSprites.forEach(function(spr) {
if ( hasBeenReset == true || spr == this)
return;
if ( game.physics.arcade.overlap(spr, this) ) {
this.path_tween_stop();
this.path_purge();
hasBeenReset = true;
if ( spr.conversation_partner == null &&
getAwarenessState(spr) == STATE_UNAWARE &&
getAwarenessState(this) == STATE_UNAWARE &&
game.rnd.integerInRange(0, 100) >= 50 ) {
setMovingState(this, getFaceState(this));
addState(this, STATE_CONVERSING);
setConversation(spr, this);
spr.path_tween_stop();
spr.path_purge();
addState(spr, STATE_CONVERSING);
setMovingState(spr, getFaceState(spr));
}
}
}, this);
return hasBeenReset;
}
this.path_tween_stop = function() this.path_tween_stop = function()
{ {
this.path_tweens.forEach(function(x) { this.path_tweens.forEach(function(x) {
x.stop(); x.stop();
game.tweens.remove(x);
}, this); }, this);
this.path_tweens = []; this.path_tweens = [];
} }
@@ -700,10 +683,40 @@ var AISprite = function(game, x, y, key, frame) {
// setSpriteMovement(this); // setSpriteMovement(this);
} }
this.collide_with_AI = function(spr)
{
if ( spr == this )
return;
this.path_tween_stop();
this.path_purge();
spr.path_tween_stop();
spr.path_purge();
this.animations.stop();
spr.animations.stop();
if ( hasState(this, STATE_CONVERSATION_DISABLED) == false &&
hasState(this, STATE_CONVERSATION_DISABLED) == false &&
spr.conversation_partner == null &&
getAwarenessState(spr) == STATE_UNAWARE &&
getAwarenessState(this) == STATE_UNAWARE &&
game.rnd.integerInRange(0, 100) >= 50 ) {
setMovingState(this, getFaceState(this));
addState(this, STATE_CONVERSING);
setConversation(spr, this);
spr.path_tween_stop();
spr.path_purge();
addState(spr, STATE_CONVERSING);
setMovingState(spr, getFaceState(spr));
}
}
this.update = function() this.update = function()
{ {
if ( this.ready_to_update == false ) if ( this.ready_to_update == false )
return; return;
// if ( hasState(this, STATE_CONVERSING) == true && game.tweens.isTweening(this) )
// throw "WHY THE FUCK AM I STILL TWEENING";
if ( isSet(this.awareness_effect) ) { if ( isSet(this.awareness_effect) ) {
if ( this.awareness_effect.alive == false ) { if ( this.awareness_effect.alive == false ) {
@@ -815,6 +828,7 @@ var AISprite = function(game, x, y, key, frame) {
this.sprite_can_see_lightmeter = 0.3; this.sprite_can_see_lightmeter = 0.3;
this.awareness_effect = null; this.awareness_effect = null;
this.awareness_timer = null; this.awareness_timer = null;
this.conversation_timer = null;
this.glint_effect = null; this.glint_effect = null;
this.glint_timer = null; this.glint_timer = null;
this.lastSawPlayerAt = null; this.lastSawPlayerAt = null;

View File

@@ -39,6 +39,7 @@ STATE_LOOKINGFORTARGET = 1 << 13;
STATE_STEALING = 1 << 13; STATE_STEALING = 1 << 13;
STATE_CONVERSING = 1 << 14; STATE_CONVERSING = 1 << 14;
STATE_CONVERSING_YOURTURN = 1 << 15; STATE_CONVERSING_YOURTURN = 1 << 15;
STATE_CONVERSATION_DISABLED = 1 << 16;
STATES_AWARENESS = (STATE_UNAWARE | STATE_CONCERNED | STATE_ALERTED | STATE_LOSTHIM); STATES_AWARENESS = (STATE_UNAWARE | STATE_CONCERNED | STATE_ALERTED | STATE_LOSTHIM);
STATES_MOVEMENT = (STATE_MOVING | STATE_RUNNING); STATES_MOVEMENT = (STATE_MOVING | STATE_RUNNING);

View File

@@ -399,7 +399,14 @@ GameState.prototype.update = function()
// this.effectSprites.forEach(_player_collide, this); // this.effectSprites.forEach(_player_collide, this);
function _AI_collide(o1, o2)
{
o1.collide_with_AI(o2);
}
this.aiSprites.forEach(_player_collide, this); this.aiSprites.forEach(_player_collide, this);
game.physics.arcade.overlap(this.aiSprites, this.aiSprites,
_AI_collide);
this.updateShadowTexture(); this.updateShadowTexture();
if ( this.aiSprites.debug == false ) { if ( this.aiSprites.debug == false ) {

View File

@@ -398,6 +398,8 @@ function purgeConversation(obj1, obj2)
delState(obj2, STATE_CONVERSING_YOURTURN); delState(obj2, STATE_CONVERSING_YOURTURN);
obj1.clearWordBubble(); obj1.clearWordBubble();
obj2.clearWordBubble(); obj2.clearWordBubble();
obj1.startConversationTimer();
obj2.startConversationTimer();
} }
function setConversation(obj1, obj2) function setConversation(obj1, obj2)