From 937e71cfbb389040b9c375b5d30962e01f490595 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Mon, 18 Oct 2021 18:54:35 +0200 Subject: [PATCH] - refactor Roach to use actors. --- source/games/exhumed/src/aistuff.h | 3 +- source/games/exhumed/src/engine.h | 2 + source/games/exhumed/src/exhumed.cpp | 4 +- source/games/exhumed/src/exhumedactor.h | 4 +- source/games/exhumed/src/init.cpp | 7 +- source/games/exhumed/src/osdcmds.cpp | 4 +- source/games/exhumed/src/roach.cpp | 170 +++++++++--------------- source/games/exhumed/src/save.cpp | 2 - 8 files changed, 77 insertions(+), 119 deletions(-) diff --git a/source/games/exhumed/src/aistuff.h b/source/games/exhumed/src/aistuff.h index 63aa37ecb..e42fe1165 100644 --- a/source/games/exhumed/src/aistuff.h +++ b/source/games/exhumed/src/aistuff.h @@ -416,8 +416,7 @@ void FuncRex(int, int, int, int); // roach -void InitRoachs(); -void BuildRoach(int nType, int nSprite, int x, int y, int z, short nSector, int angle); +void BuildRoach(int nType, DExhumedActor* nSprite, int x, int y, int z, short nSector, int angle); void FuncRoach(int a, int, int nDamage, int nRun); // runlist diff --git a/source/games/exhumed/src/engine.h b/source/games/exhumed/src/engine.h index 2f8c5f2d3..7c1c9630a 100644 --- a/source/games/exhumed/src/engine.h +++ b/source/games/exhumed/src/engine.h @@ -81,6 +81,8 @@ enum ECounter kCountLion, kCountMummy, kCountRex, + kCountRoach, + kCountScorp, kNumCounters }; diff --git a/source/games/exhumed/src/exhumed.cpp b/source/games/exhumed/src/exhumed.cpp index c9040cbb7..03b80aebe 100644 --- a/source/games/exhumed/src/exhumed.cpp +++ b/source/games/exhumed/src/exhumed.cpp @@ -607,7 +607,9 @@ FSerializer& Serialize(FSerializer& arc, const char* keyname, DExhumedActor& w, ("target", w.pTarget) ("count", w.nCount) ("run", w.nRun) - //("index", w.nIndex) + ("index", w.nIndex) + ("index2", w.nIndex2) // scorpion + ("channel", w.nChannel) // scorpion .EndObject(); } return arc; diff --git a/source/games/exhumed/src/exhumedactor.h b/source/games/exhumed/src/exhumedactor.h index fcb05b406..431d5d1d4 100644 --- a/source/games/exhumed/src/exhumedactor.h +++ b/source/games/exhumed/src/exhumedactor.h @@ -94,7 +94,9 @@ public: short nAction; short nCount; short nRun; - //short nIndex; + short nIndex; + short nIndex2; + short nChannel; DExhumedActor() :index(int(this - base())) {} DExhumedActor& operator=(const DExhumedActor& other) = default; diff --git a/source/games/exhumed/src/init.cpp b/source/games/exhumed/src/init.cpp index 66f01aab7..5bbeccf43 100644 --- a/source/games/exhumed/src/init.cpp +++ b/source/games/exhumed/src/init.cpp @@ -94,8 +94,7 @@ uint8_t LoadLevel(MapRecord* map) InitSets(); InitQueens(); - InitRoachs(); - InitWasps(); + InitWasps(); InitRats(); InitBullets(); InitWeapons(); @@ -594,7 +593,7 @@ void ProcessSpriteTag(short nSprite, short nLotag, short nHitag) return; } - BuildRoach(1, nSprite, 0, 0, 0, 0, 0); + BuildRoach(1, pActor, 0, 0, 0, 0, 0); return; } case 103: @@ -604,7 +603,7 @@ void ProcessSpriteTag(short nSprite, short nLotag, short nHitag) return; } - BuildRoach(0, nSprite, 0, 0, 0, 0, 0); + BuildRoach(0, pActor, 0, 0, 0, 0, 0); return; } case 102: diff --git a/source/games/exhumed/src/osdcmds.cpp b/source/games/exhumed/src/osdcmds.cpp index aeaaf3d44..cd96332e5 100644 --- a/source/games/exhumed/src/osdcmds.cpp +++ b/source/games/exhumed/src/osdcmds.cpp @@ -89,8 +89,8 @@ static int osdcmd_spawn(CCmdFuncPtr parm) else if (!stricmp(c, "rex")) BuildRex(nullptr, initx, inity, sector[initsect].floorz, initsect, inita, nNetPlayerCount); else if (!stricmp(c, "set")) BuildSet(-1, initx, inity, sector[initsect].floorz, initsect, inita, nNetPlayerCount); else if (!stricmp(c, "queen")) BuildQueen(-1, initx, inity, sector[initsect].floorz, initsect, inita, nNetPlayerCount); - else if (!stricmp(c, "roach")) BuildRoach(0, -1, initx, inity, sector[initsect].floorz, initsect, inita); - else if (!stricmp(c, "roach2")) BuildRoach(1, -1, initx, inity, sector[initsect].floorz, initsect, inita); + else if (!stricmp(c, "roach")) BuildRoach(0, nullptr, initx, inity, sector[initsect].floorz, initsect, inita); + else if (!stricmp(c, "roach2")) BuildRoach(1, nullptr, initx, inity, sector[initsect].floorz, initsect, inita); else if (!stricmp(c, "wasp")) BuildWasp(-1, initx, inity, sector[initsect].floorz - 25600, initsect, inita); else if (!stricmp(c, "scorp")) BuildScorp(-1, initx, inity, sector[initsect].floorz, initsect, inita, nNetPlayerCount); else if (!stricmp(c, "rat")) BuildRat(nullptr, initx, inity, sector[initsect].floorz, initsect, inita); diff --git a/source/games/exhumed/src/roach.cpp b/source/games/exhumed/src/roach.cpp index d8fce3087..7e195fdc0 100644 --- a/source/games/exhumed/src/roach.cpp +++ b/source/games/exhumed/src/roach.cpp @@ -46,61 +46,25 @@ struct Roach short nIndex; }; -TArray RoachList; - -FSerializer& Serialize(FSerializer& arc, const char* keyname, Roach& w, Roach* def) -{ - if (arc.BeginObject(keyname)) - { - arc("health", w.nHealth) - ("frame", w.nFrame) - ("action", w.nAction) - ("sprite", w.nSprite) - ("target", w.nTarget) - ("run", w.nRun) - ("count", w.nCount) - ("index", w.nIndex) - .EndObject(); - } - return arc; -} - -void SerializeRoach(FSerializer& arc) -{ - arc("roach", RoachList); -} - - - -/* Kilmaat Sentry */ - -void InitRoachs() -{ - RoachList.Clear(); -} - // TODO - make nType a bool? -void BuildRoach(int nType, int nSprite, int x, int y, int z, short nSector, int angle) +void BuildRoach(int nType, DExhumedActor* pActor, int x, int y, int z, short nSector, int angle) { - auto RoachCount = RoachList.Reserve(1); - - auto pSprite = &sprite[nSprite]; - if (nSprite == -1) + spritetype* pSprite; + if (pActor == nullptr) { - nSprite = insertsprite(nSector, 105); - pSprite = &sprite[nSprite]; + pActor = insertActor(nSector, 105); + pSprite = &pActor->s(); } else { - changespritestat(nSprite, 105); + ChangeActorStat(pActor, 105); + pSprite = &pActor->s(); x = pSprite->x; y = pSprite->y; z = sector[pSprite->sectnum].floorz; angle = pSprite->ang; } - assert(nSprite >= 0 && nSprite < kMaxSprites); - pSprite->x = x; pSprite->y = y; pSprite->z = z; @@ -125,37 +89,35 @@ void BuildRoach(int nType, int nSprite, int x, int y, int z, short nSector, int if (nType) { - RoachList[RoachCount].nAction = 0; + pActor->nAction = 0; } else { - RoachList[RoachCount].nAction = 1; + pActor->nAction = 1; } - RoachList[RoachCount].nSprite = nSprite; - RoachList[RoachCount].nFrame = 0; - RoachList[RoachCount].nCount = 0; - RoachList[RoachCount].nTarget = -1; - RoachList[RoachCount].nHealth = 600; + pActor->nFrame = 0; + pActor->nCount = 0; + pActor->pTarget = nullptr; + pActor->nHealth = 600; + pActor->nPhase = Counters[kCountRoach]++; - pSprite->owner = runlist_AddRunRec(pSprite->lotag - 1, RoachCount, 0x1C0000); - RoachList[RoachCount].nRun = runlist_AddRunRec(NewRun, RoachCount, 0x1C0000); + pSprite->owner = runlist_AddRunRec(pSprite->lotag - 1, pActor, 0x1C0000); + pActor->nRun = runlist_AddRunRec(NewRun, pActor, 0x1C0000); nCreaturesTotal++; } -void GoRoach(short nSprite) +void GoRoach(spritetype* pSprite) { - auto pSprite = &sprite[nSprite]; pSprite->xvel = bcos(pSprite->ang, -1) - bcos(pSprite->ang, -3); pSprite->yvel = bsin(pSprite->ang, -1) - bsin(pSprite->ang, -3); } void AIRoach::Draw(RunListEvent* ev) { - short nRoach = RunData[ev->nRun].nObjIndex; - assert(nRoach >= 0 && nRoach < (int)RoachList.Size()); - auto pActor = &RoachList[nRoach]; + auto pActor = ev->pObjActor; + if (!pActor) return; short nAction = pActor->nAction; seq_PlotSequence(ev->nParam, RoachSeq[nAction].a + SeqOffsets[kSeqRoach], pActor->nFrame, RoachSeq[nAction].b); @@ -164,23 +126,19 @@ void AIRoach::Draw(RunListEvent* ev) void AIRoach::RadialDamage(RunListEvent* ev) { - short nRoach = RunData[ev->nRun].nObjIndex; - assert(nRoach >= 0 && nRoach < (int)RoachList.Size()); - auto pActor = &RoachList[nRoach]; - short nSprite = pActor->nSprite; - - ev->nDamage = runlist_CheckRadialDamage(nSprite); + auto pActor = ev->pObjActor; + if (!pActor) return; + + ev->nDamage = runlist_CheckRadialDamage(pActor); Damage(ev); } void AIRoach::Damage(RunListEvent* ev) { - short nRoach = RunData[ev->nRun].nObjIndex; - assert(nRoach >= 0 && nRoach < (int)RoachList.Size()); - auto pActor = &RoachList[nRoach]; + auto pActor = ev->pObjActor; + if (!pActor) return; - short nSprite = pActor->nSprite; - auto pSprite = &sprite[nSprite]; + auto pSprite = &pActor->s(); short nAction = pActor->nAction; if (ev->nDamage) @@ -201,7 +159,7 @@ void AIRoach::Damage(RunListEvent* ev) if (nAction < 5) { - DropMagic(nSprite); + DropMagic(pActor); pActor->nAction = 5; pActor->nFrame = 0; } @@ -210,17 +168,17 @@ void AIRoach::Damage(RunListEvent* ev) } else { - short nSprite2 = ev->nParam; - if (nSprite2 >= 0) + auto pSprite2 = ev->pOtherActor; + if (pSprite2) { - if (sprite[nSprite2].statnum < 199) { - pActor->nTarget = nSprite2; + if (pSprite2->s().statnum < 199) { + pActor->pTarget = pSprite2; } if (nAction == 0) { pActor->nAction = 2; - GoRoach(nSprite); + GoRoach(pSprite); pActor->nFrame = 0; } else @@ -238,21 +196,19 @@ void AIRoach::Damage(RunListEvent* ev) void AIRoach::Tick(RunListEvent* ev) { - short nRoach = RunData[ev->nRun].nObjIndex; - assert(nRoach >= 0 && nRoach < (int)RoachList.Size()); - auto pActor = &RoachList[nRoach]; + auto pActor = ev->pObjActor; + if (!pActor) return; - short nSprite = pActor->nSprite; - auto pSprite = &sprite[nSprite]; + auto pSprite = &pActor->s(); short nAction = pActor->nAction; bool bVal = false; - Gravity(nSprite); + Gravity(pActor); int nSeq = SeqOffsets[kSeqRoach] + RoachSeq[pActor->nAction].a; pSprite->picnum = seq_GetSeqPicnum2(nSeq, pActor->nFrame); - seq_MoveSequence(nSprite, nSeq, pActor->nFrame); + seq_MoveSequence(pActor, nSeq, pActor->nFrame); pActor->nFrame++; if (pActor->nFrame >= SeqSize[nSeq]) @@ -262,7 +218,7 @@ void AIRoach::Tick(RunListEvent* ev) } int nFlag = FrameFlag[SeqBase[nSeq] + pActor->nFrame]; - short nTarget = pActor->nTarget; + auto pTarget = pActor->pTarget; if (nAction > 5) { return; @@ -285,15 +241,15 @@ void AIRoach::Tick(RunListEvent* ev) } } - if (((nRoach & 0xF) == (totalmoves & 0xF)) && nTarget < 0) + if (((pActor->nPhase & 0xF) == (totalmoves & 0xF)) && pTarget == nullptr) { - short nTarget = FindPlayer(nSprite, 50); - if (nTarget >= 0) + auto pTarget = FindPlayer(pActor, 50); + if (pTarget) { pActor->nAction = 2; pActor->nFrame = 0; - pActor->nTarget = nTarget; - GoRoach(nSprite); + pActor->pTarget = pTarget; + GoRoach(pSprite); } } @@ -303,15 +259,15 @@ void AIRoach::Tick(RunListEvent* ev) case 1: { // partly the same as case 0. - if (((nRoach & 0xF) == (totalmoves & 0xF)) && nTarget < 0) + if (((pActor->nPhase & 0xF) == (totalmoves & 0xF)) && pTarget == nullptr) { - short nTarget = FindPlayer(nSprite, 100); - if (nTarget >= 0) + auto pTarget = FindPlayer(pActor, 100); + if (pTarget) { pActor->nAction = 2; pActor->nFrame = 0; - pActor->nTarget = nTarget; - GoRoach(nSprite); + pActor->pTarget = pTarget; + GoRoach(pSprite); } } @@ -320,17 +276,17 @@ void AIRoach::Tick(RunListEvent* ev) case 2: { - if ((totalmoves & 0xF) == (nRoach & 0xF)) + if ((totalmoves & 0xF) == (pActor->nPhase & 0xF)) { - PlotCourseToSprite(nSprite, nTarget); - GoRoach(nSprite); + PlotCourseToSprite(pActor, pTarget); + GoRoach(pSprite); } - int nMov = MoveCreatureWithCaution(nSprite); + auto nMov = MoveCreatureWithCaution(pActor); - if ((nMov & 0xC000) == 0xC000) + if (nMov.type == kHitSprite) { - if ((nMov & 0x3FFF) == nTarget) + if (nMov.actor == pTarget) { // repeated below pActor->nIndex = RandomSize(2) + 1; @@ -338,20 +294,20 @@ void AIRoach::Tick(RunListEvent* ev) pSprite->xvel = 0; pSprite->yvel = 0; - pSprite->ang = GetMyAngle(sprite[nTarget].x - pSprite->x, sprite[nTarget].y - pSprite->y); + pSprite->ang = GetMyAngle(pTarget->s().x - pSprite->x, pTarget->s().y - pSprite->y); pActor->nFrame = 0; } else { pSprite->ang = (pSprite->ang + 256) & kAngleMask; - GoRoach(nSprite); + GoRoach(pSprite); } } - else if ((nMov & 0xC000) == 0x8000) + else if (nMov.type == kHitWall) { pSprite->ang = (pSprite->ang + 256) & kAngleMask; - GoRoach(nSprite); + GoRoach(pSprite); } else { @@ -367,18 +323,18 @@ void AIRoach::Tick(RunListEvent* ev) pSprite->xvel = 0; pSprite->yvel = 0; - pSprite->ang = GetMyAngle(sprite[nTarget].x - pSprite->x, sprite[nTarget].y - pSprite->y); + pSprite->ang = GetMyAngle(pTarget->s().x - pSprite->x, pTarget->s().y - pSprite->y); pActor->nFrame = 0; } } - if (nTarget != -1 && !(sprite[nTarget].cstat & 0x101)) + if (pTarget && !(pTarget->s().cstat & 0x101)) { pActor->nAction = 1; pActor->nFrame = 0; pActor->nCount = 100; - pActor->nTarget = -1; + pActor->pTarget = nullptr; pSprite->xvel = 0; pSprite->yvel = 0; } @@ -394,7 +350,7 @@ void AIRoach::Tick(RunListEvent* ev) if (pActor->nIndex <= 0) { pActor->nAction = 2; - GoRoach(nSprite); + GoRoach(pSprite); pActor->nFrame = 0; pActor->nCount = RandomSize(7); } @@ -403,7 +359,7 @@ void AIRoach::Tick(RunListEvent* ev) { if (nFlag & 0x80) { - BuildBullet(nSprite, 13, 0, 0, -1, pSprite->ang, nTarget + 10000, 1); + BuildBullet(pActor, 13, -1, pSprite->ang, pTarget, 1); } } diff --git a/source/games/exhumed/src/save.cpp b/source/games/exhumed/src/save.cpp index 9eedba7b6..73875b576 100644 --- a/source/games/exhumed/src/save.cpp +++ b/source/games/exhumed/src/save.cpp @@ -50,7 +50,6 @@ void SerializeView(FSerializer& arc); void SerializeQueen(FSerializer& arc); void SerializeRat(FSerializer& arc); -void SerializeRoach(FSerializer& arc); void SerializeScorpion(FSerializer& arc); void SerializeSet(FSerializer& arc); void SerializeSpider(FSerializer& arc); @@ -82,7 +81,6 @@ void GameInterface::SerializeGameState(FSerializer& arc) SerializeQueen(arc); SerializeRat(arc); - SerializeRoach(arc); SerializeScorpion(arc); SerializeSet(arc); SerializeSpider(arc);