From d3e55739c7724c5587f7a82e3e943d79315af354 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Thu, 21 Oct 2021 15:02:18 +0200 Subject: [PATCH] - energy blocks. --- source/games/exhumed/src/aistuff.h | 3 +- source/games/exhumed/src/bullet.cpp | 4 +-- source/games/exhumed/src/object.cpp | 47 ++++++++++++++-------------- source/games/exhumed/src/runlist.cpp | 4 +-- 4 files changed, 28 insertions(+), 30 deletions(-) diff --git a/source/games/exhumed/src/aistuff.h b/source/games/exhumed/src/aistuff.h index ad9523d2c..e177c0cb1 100644 --- a/source/games/exhumed/src/aistuff.h +++ b/source/games/exhumed/src/aistuff.h @@ -71,6 +71,7 @@ extern short lasthitsect; extern int lasthitz; extern int lasthitx; extern int lasthity; +extern TArray EnergyBlocks; void InitBullets(); int GrabBullet(); @@ -337,7 +338,7 @@ int BuildObject(int const nSprite, int nOjectType, int nHitag); int BuildArrow(DExhumedActor* nSprite, int nVal); int BuildFireBall(DExhumedActor*, int a, int b); void BuildDrip(int nSprite); -int BuildEnergyBlock(short nSector); +DExhumedActor* BuildEnergyBlock(short nSector); int BuildElevC(int arg1, int nChannel, int nSector, int nWallSprite, int arg5, int arg6, int nCount, ...); int BuildElevF(int nChannel, int nSector, int nWallSprite, int arg_4, int arg_5, int nCount, ...); int BuildWallFace(short nChannel, short nWall, int nCount, ...); diff --git a/source/games/exhumed/src/bullet.cpp b/source/games/exhumed/src/bullet.cpp index 04f524f13..972f2d396 100644 --- a/source/games/exhumed/src/bullet.cpp +++ b/source/games/exhumed/src/bullet.cpp @@ -495,9 +495,7 @@ HITWALL: nDamage *= 2; } - short nNormal = GetWallNormal(hitwall) & kAngleMask; - - runlist_DamageEnemy(sector[nSector].extra, nNormal, nDamage); + runlist_DamageEnemy(EnergyBlocks[sector[nSector].extra], pActor, nDamage); } } } diff --git a/source/games/exhumed/src/object.cpp b/source/games/exhumed/src/object.cpp index 5879d6f8d..f772c06b7 100644 --- a/source/games/exhumed/src/object.cpp +++ b/source/games/exhumed/src/object.cpp @@ -186,10 +186,10 @@ TArray sMoveSect; TArray SlideData; TArray WallFace; TArray sDrip; +TArray EnergyBlocks; int lFinaleStart; -short nEnergyBlocks; short nFinaleStage; DExhumedActor* pFinaleSpr; @@ -385,7 +385,7 @@ void SerializeObjects(FSerializer& arc) ("wallface", WallFace) ("drips", sDrip) ("finalestart", lFinaleStart) - ("energyblocks", nEnergyBlocks) + ("energyblocks", EnergyBlocks) ("finalestage", nFinaleStage) ("finalespr", pFinaleSpr) ("dronepitch", nDronePitch) @@ -404,8 +404,8 @@ void InitObjects() ObjectList.Clear(); sMoveSect.Clear(); sDrip.Clear(); + EnergyBlocks.Clear(); - nEnergyBlocks = 0; nDronePitch = 0; nFinaleStage = 0; lFinaleStart = 0; @@ -1692,7 +1692,7 @@ void DoFinale() } } -int BuildEnergyBlock(short nSector) +DExhumedActor* BuildEnergyBlock(short nSector) { short startwall = sector[nSector].wallptr; short nWalls = sector[nSector].wallnum; @@ -1713,8 +1713,8 @@ int BuildEnergyBlock(short nSector) int xAvg = x / nWalls; int yAvg = y / nWalls; - int const nSprite = insertsprite(nSector, 406); - auto spr = &sprite[nSprite]; + auto pActor = insertActor(nSector, 406); + auto spr = &pActor->s(); short nextsector = wall[startwall].nextsector; @@ -1722,7 +1722,7 @@ int BuildEnergyBlock(short nSector) spr->x = xAvg; spr->y = yAvg; - sector[nSector].extra = nSprite; + sector[nSector].extra = (int16_t)EnergyBlocks.Push(pActor); // GrabTimeSlot(3); @@ -1742,12 +1742,10 @@ int BuildEnergyBlock(short nSector) spr->extra = -1; spr->lotag = runlist_HeadRun() + 1; spr->hitag = 0; - spr->owner = runlist_AddRunRec(spr->lotag - 1, nSprite, 0x250000); + spr->owner = runlist_AddRunRec(spr->lotag - 1, pActor, 0x250000); spr->backuppos(); - nEnergyBlocks++; - - return nSprite | 0x250000; + return pActor; } // TODO - tidy @@ -1766,7 +1764,7 @@ void KillCreatures() ExhumedStatIterator it(v1); while (auto i = it.Next()) { - runlist_DamageEnemy(i->GetSpriteIndex(), -1, 1600); + runlist_DamageEnemy(i, nullptr, 1600); } } ++v0; @@ -1778,10 +1776,9 @@ void KillCreatures() } } -void ExplodeEnergyBlock(int nSprite) +void ExplodeEnergyBlock(DExhumedActor* pActor) { - auto pActor = &exhumedActors[nSprite]; - auto pSprite = &sprite[nSprite]; + auto pSprite = &pActor->s(); short nSector = pSprite->sectnum; @@ -1822,7 +1819,7 @@ void ExplodeEnergyBlock(int nSprite) pSprite->cstat = 0; pSprite->xrepeat = 100; - PlayFX2(StaticSound[kSound78], nSprite); + PlayFX2(StaticSound[kSound78], pActor); pSprite->xrepeat = 0; @@ -1847,7 +1844,7 @@ void ExplodeEnergyBlock(int nSprite) } else { - pFinaleSpr = &exhumedActors[nSprite]; + pFinaleSpr = pActor; lFinaleStart = PlayClock; if (!lFinaleStart) { @@ -1878,13 +1875,14 @@ void ExplodeEnergyBlock(int nSprite) KillCreatures(); } - changespritestat(nSprite, 0); + ChangeActorStat(pActor, 0); } void AIEnergyBlock::Damage(RunListEvent* ev) { - int const nSprite = RunData[ev->nRun].nObjIndex; - auto spr = &sprite[nSprite]; + auto pActor = ev->pObjActor; + if (!pActor) return; + auto spr = &pActor->s(); ev->nDamage >>= 2; if (ev->nDamage <= 0) { @@ -1909,14 +1907,15 @@ void AIEnergyBlock::Damage(RunListEvent* ev) else { spr->xrepeat = 0; // using xrepeat to store health - ExplodeEnergyBlock(nSprite); + ExplodeEnergyBlock(pActor); } } void AIEnergyBlock::RadialDamage(RunListEvent* ev) { - int const nSprite = RunData[ev->nRun].nObjIndex; - auto spr = &sprite[nSprite]; + auto pActor = ev->pObjActor; + if (!pActor) return; + auto spr = &pActor->s(); short nSector = spr->sectnum; @@ -1929,7 +1928,7 @@ void AIEnergyBlock::RadialDamage(RunListEvent* ev) sector[nSector].floorz = spr->z; spr->z -= 256; - ev->nDamage = runlist_CheckRadialDamage(nSprite); + ev->nDamage = runlist_CheckRadialDamage(pActor); // restore previous values sector[nSector].floorz = nFloorZ; diff --git a/source/games/exhumed/src/runlist.cpp b/source/games/exhumed/src/runlist.cpp index 6e93d1e4b..03a3f05bf 100644 --- a/source/games/exhumed/src/runlist.cpp +++ b/source/games/exhumed/src/runlist.cpp @@ -1063,10 +1063,10 @@ void runlist_ProcessSectorTag(int nSector, int nLotag, int nHitag) { nEnergyTowers++; - int nEnergyBlock = BuildEnergyBlock(nSector); + auto nEnergyBlock = BuildEnergyBlock(nSector); if (nLotag == 36) { - pFinaleSpr = &exhumedActors[nEnergyBlock]; + pFinaleSpr = nEnergyBlock; } return;