From 2a6a2503a0b9375fe79da1074798cbae8f5754a5 Mon Sep 17 00:00:00 2001 From: Cong Date: Sat, 24 May 2014 18:54:23 +1000 Subject: [PATCH] Convert trigger activation to event (#225) --- src/cdogs/actors.c | 19 ++++++++++++------- src/cdogs/game_events.h | 6 ++++++ src/cdogs/triggers.c | 14 +++++++------- src/cdogs/triggers.h | 3 ++- src/handle_game_events.c | 15 +++++++++++++++ 5 files changed, 42 insertions(+), 15 deletions(-) diff --git a/src/cdogs/actors.c b/src/cdogs/actors.c index 036965c28..b7d323f0e 100644 --- a/src/cdogs/actors.c +++ b/src/cdogs/actors.c @@ -409,16 +409,21 @@ void UpdateActorState(TActor * actor, int ticks) } -static void CheckTrigger(Vec2i pos) +static void CheckTrigger(const Vec2i tilePos) { - Tile *t = MapGetTile(&gMap, Vec2iToTile(pos)); + const Tile *t = MapGetTile(&gMap, tilePos); int i; for (i = 0; i < (int)t->triggers.size; i++) { - TriggerActivate( - *(Trigger **)CArrayGet(&t->triggers, i), - gMission.flags, - &gMap.triggers); + Trigger **tp = CArrayGet(&t->triggers, i); + if (TriggerCanActivate(*tp, gMission.flags)) + { + GameEvent e; + e.Type = GAME_EVENT_TRIGGER; + e.u.Trigger.Id = (*tp)->id; + e.u.Trigger.TilePos = tilePos; + GameEventsEnqueue(&gGameEvents, e); + } } } @@ -610,7 +615,7 @@ bool TryMoveActor(TActor *actor, Vec2i pos) } } - CheckTrigger(realPos); + CheckTrigger(Vec2iToTile(realPos)); if (actor->pData) { diff --git a/src/cdogs/game_events.h b/src/cdogs/game_events.h index b695c2e1b..bb6ca534d 100644 --- a/src/cdogs/game_events.h +++ b/src/cdogs/game_events.h @@ -58,6 +58,7 @@ typedef enum GAME_EVENT_HIT_CHARACTER, GAME_EVENT_ACTOR_IMPULSE, GAME_EVENT_DAMAGE_CHARACTER, + GAME_EVENT_TRIGGER, GAME_EVENT_UPDATE_OBJECTIVE, // Can complete mission @@ -135,6 +136,11 @@ typedef struct int TargetPlayerIndex; } DamageCharacter; struct + { + int Id; + Vec2i TilePos; + } Trigger; + struct { int ObjectiveIndex; int Update; diff --git a/src/cdogs/triggers.c b/src/cdogs/triggers.c index 91f367aa0..6c97472a8 100644 --- a/src/cdogs/triggers.c +++ b/src/cdogs/triggers.c @@ -236,14 +236,14 @@ static int ConditionsMet(CArray *conditions) return 1; } -void TriggerActivate(Trigger *t, int flags, CArray *mapTriggers) +bool TriggerCanActivate(const Trigger *t, const int flags) { - int i; - if (!t->isActive || (t->flags != 0 && !(t->flags & flags))) - { - return; - } - for (i = 0; i < (int)t->actions.size; i++) + return t->isActive && (t->flags == 0 || (t->flags & flags)); +} + +void TriggerActivate(Trigger *t, CArray *mapTriggers) +{ + for (int i = 0; i < (int)t->actions.size; i++) { ActionRun(CArrayGet(&t->actions, i), mapTriggers); } diff --git a/src/cdogs/triggers.h b/src/cdogs/triggers.h index 468b4705f..efddee426 100644 --- a/src/cdogs/triggers.h +++ b/src/cdogs/triggers.h @@ -102,7 +102,8 @@ struct Watch { typedef struct Watch TWatch; -void TriggerActivate(Trigger *t, int flags, CArray *mapTriggers); +bool TriggerCanActivate(const Trigger *t, const int flags); +void TriggerActivate(Trigger *t, CArray *mapTriggers); void UpdateWatches(CArray *mapTriggers); Trigger *TriggerNew(void); void TriggerTerminate(Trigger *t); diff --git a/src/handle_game_events.c b/src/handle_game_events.c index 65956de08..bea24e0f2 100644 --- a/src/handle_game_events.c +++ b/src/handle_game_events.c @@ -30,6 +30,7 @@ #include #include #include +#include static void HandleGameEvent( @@ -147,6 +148,20 @@ static void HandleGameEvent( -e->u.DamageCharacter.Power); } break; + case GAME_EVENT_TRIGGER: + { + const Tile *t = MapGetTile(&gMap, e->u.Trigger.TilePos); + for (int i = 0; i < (int)t->triggers.size; i++) + { + Trigger **tp = CArrayGet(&t->triggers, i); + if ((*tp)->id == e->u.Trigger.Id) + { + TriggerActivate(*tp, &gMap.triggers); + break; + } + } + } + break; case GAME_EVENT_UPDATE_OBJECTIVE: { struct Objective *o = CArrayGet(