From d130a43aa069c1fea82c20b04b1ac1713007a613 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Wed, 8 Sep 2021 22:08:55 +0200 Subject: [PATCH] - preparations for cleaning up Exhumed's event dispatcher. --- source/games/exhumed/src/aistuff.h | 43 ++++++++++++++++++++++ source/games/exhumed/src/runlist.cpp | 55 ++++++++++++++++++++++++++++ 2 files changed, 98 insertions(+) diff --git a/source/games/exhumed/src/aistuff.h b/source/games/exhumed/src/aistuff.h index 6aeaf83fe..b9ff35b1e 100644 --- a/source/games/exhumed/src/aistuff.h +++ b/source/games/exhumed/src/aistuff.h @@ -389,6 +389,49 @@ struct RunChannel short d; }; +enum class EMessageType +{ + ProcessChannel = 1, + Tick, + Process, + Use, + TouchFloor, + LeaveSector, + EnterSector, + Damage, + Draw, + RadialDamage +}; + +struct RunListEvent +{ + EMessageType nMessage; + int nIndex; // mostly the player, sometimes the channel list + tspritetype* pTSprite; // for the draw event + DExhumedActor* pActor; // for the damage event, radialSpr for radial damage - owner will not be passed as it can be retrieved from this. + int nDamage, nRun; + + int nRadialDamage; // Radial damage needs a bit more info. + int nDamageRadius; +}; + +struct ExhumedAI +{ + virtual ~ExhumedAI() = default; + virtual void ProcessChannel(RunListEvent* ev) {} + virtual void Tick(RunListEvent* ev) {} + virtual void Process(RunListEvent* ev) {} + virtual void Use(RunListEvent* ev) {} + virtual void TouchFloor(RunListEvent* ev) {} + virtual void LeaveSector(RunListEvent* ev) {} + virtual void EnterSector(RunListEvent* ev) {} + virtual void Damage(RunListEvent* ev) {} + virtual void Draw(RunListEvent* ev) {} + virtual void RadialDamage(RunListEvent* ev) {} +}; + +void runlist_DispatchEvent(ExhumedAI* ai, int nObject, int nMessage, int nDamage, int nRun); + typedef void(*AiFunc)(int, int, int, int nRun); extern FreeListArray RunData; diff --git a/source/games/exhumed/src/runlist.cpp b/source/games/exhumed/src/runlist.cpp index ac5ae5f07..12b69e725 100644 --- a/source/games/exhumed/src/runlist.cpp +++ b/source/games/exhumed/src/runlist.cpp @@ -1699,5 +1699,60 @@ void runlist_DamageEnemy(int nSprite, int nSprite2, short nDamage) } } +// This is only temporary so that the event system can be refactored in smaller steps. +void runlist_DispatchEvent(ExhumedAI* ai, int nObject, int nMessage, int nDamage, int nRun) +{ + RunListEvent ev; + ev.nMessage = (EMessageType)(nMessage >> 16); + ev.nIndex = nObject; + switch (ev.nMessage) + { + case EMessageType::ProcessChannel: + ai->ProcessChannel(&ev); + break; + + case EMessageType::Tick: + ai->Tick(&ev); + break; + + case EMessageType::Process: + ai->Process(&ev); + break; + + case EMessageType::Use: + ai->Use(&ev); + break; + + case EMessageType::TouchFloor: + ai->TouchFloor(&ev); + break; + + case EMessageType::LeaveSector: + ai->LeaveSector(&ev); + break; + + case EMessageType::EnterSector: + ai->EnterSector(&ev); + break; + + case EMessageType::Damage: + ev.pActor = &exhumedActors[nObject]; + ai->Damage(&ev); + break; + + case EMessageType::Draw: + ev.pTSprite = &mytsprite[nObject]; + ai->Draw(&ev); + break; + + case EMessageType::RadialDamage: + ev.nRadialDamage = nRadialDamage; + ev.nDamageRadius = nDamageRadius; + ev.pActor = &exhumedActors[nRadialSpr]; + ai->RadialDamage(&ev); + break; + } +} + END_PS_NS