diff --git a/source/games/exhumed/src/aistuff.h b/source/games/exhumed/src/aistuff.h index aabad5323..c4a5aa728 100644 --- a/source/games/exhumed/src/aistuff.h +++ b/source/games/exhumed/src/aistuff.h @@ -76,7 +76,7 @@ void InitBullets(); int GrabBullet(); void DestroyBullet(short nRun); int MoveBullet(short nBullet); -void SetBulletEnemy(short nBullet, short nEnemy); +void SetBulletEnemy(short nBullet, DExhumedActor* nEnemy); int BuildBullet(short nSprite, int nType, int ebx, int ecx, int val1, int nAngle, int val2, int val3); inline DExhumedActor* BuildBullet(DExhumedActor* pActor, int nType, int val1, int nAngle, DExhumedActor* pTarget, int val3) { diff --git a/source/games/exhumed/src/bullet.cpp b/source/games/exhumed/src/bullet.cpp index 75bf53945..a75b396fd 100644 --- a/source/games/exhumed/src/bullet.cpp +++ b/source/games/exhumed/src/bullet.cpp @@ -35,6 +35,7 @@ enum { kMaxBullets = 500 }; struct Bullet { DExhumedActor* pActor; + DExhumedActor* pEnemy; short nSeq; short nFrame; @@ -49,7 +50,6 @@ struct Bullet int x; int y; int z; - int enemy; }; FreeListArray BulletList; @@ -82,7 +82,7 @@ FSerializer& Serialize(FSerializer& arc, const char* keyname, Bullet& w, Bullet* ("at10", w.field_10, def->field_10) ("at12", w.field_12, def->field_12) ("at13", w.field_13, def->field_13) - ("enemy", w.enemy, def->enemy) + ("enemy", w.pEnemy, def->pEnemy) .EndObject(); } return arc; @@ -134,7 +134,7 @@ int GrabBullet() { int grabbed = BulletList.Get(); if (grabbed < 0) return -1; - BulletList[grabbed].enemy = -1; + BulletList[grabbed].pEnemy = nullptr; return grabbed; } @@ -325,14 +325,14 @@ int MoveBullet(short nBullet) if (pBullet->field_10 < 30000) { - short nEnemySprite = BulletList[nBullet].enemy; - if (nEnemySprite > -1) + auto pEnemyActor = BulletList[nBullet].pEnemy; + if (pEnemyActor) { - if (!(sprite[nEnemySprite].cstat & 0x101)) - BulletList[nBullet].enemy = -1; + if (!(pEnemyActor->s().cstat & 0x101)) + BulletList[nBullet].pEnemy = nullptr; else { - coll = AngleChase(pActor, &exhumedActors[nEnemySprite], pBullet->field_10, 0, 16); + coll = AngleChase(pActor, pEnemyActor, pBullet->field_10, 0, 16); goto MOVEEND; } } @@ -435,9 +435,9 @@ MOVEEND: { nVal = 1; - if (BulletList[nBullet].enemy > -1) + if (BulletList[nBullet].pEnemy) { - hitactor = &exhumedActors[BulletList[nBullet].enemy]; + hitactor = BulletList[nBullet].pEnemy; auto hitsprite = &hitactor->s(); x2 = hitsprite->x; y2 = hitsprite->y; @@ -457,7 +457,7 @@ MOVEEND: x2 = hitData.pos.x; y2 = hitData.pos.y; z2 = hitData.pos.z; - hitactor = &exhumedActors[hitData.sprite]; + hitactor = GetActor(hitData); hitsect = hitData.sect; hitwall = hitData.wall; } @@ -569,10 +569,10 @@ HITWALL: return nVal; } -void SetBulletEnemy(short nBullet, short nEnemy) +void SetBulletEnemy(short nBullet, DExhumedActor* pEnemy) { if (nBullet >= 0) { - BulletList[nBullet].enemy = nEnemy; + BulletList[nBullet].pEnemy = pEnemy; } } @@ -647,7 +647,7 @@ int BuildBullet(short nSprite, int nType, int, int, int val1, int nAngle, int va Bullet *pBullet = &BulletList[nBullet]; - pBullet->enemy = -1; + pBullet->pEnemy = nullptr; pBulletSprite->cstat = 0; pBulletSprite->shade = -64; @@ -744,7 +744,7 @@ int BuildBullet(short nSprite, int nType, int, int, int val1, int nAngle, int va if ((unsigned int)pBulletInfo->field_4 > 30000) { - BulletList[nBullet].enemy = nTargetSprite; + BulletList[nBullet].pEnemy = &exhumedActors[nTargetSprite]; } else { @@ -811,8 +811,9 @@ int BuildBullet(short nSprite, int nType, int, int, int val1, int nAngle, int va pBullet->z = 0; pBullet->x = (pSprite->clipdist << 2) * bcos(nAngle); pBullet->y = (pSprite->clipdist << 2) * bsin(nAngle); - BulletList[nBullet].enemy = -1; + BulletList[nBullet].pEnemy = nullptr; + int pb = pBulletActor->GetSpriteIndex(); if (MoveBullet(nBullet)) { pBulletActor = nullptr; @@ -825,7 +826,7 @@ int BuildBullet(short nSprite, int nType, int, int, int val1, int nAngle, int va pBullet->z = var_18 >> 3; } - return pBulletActor->GetSpriteIndex() | (nBullet << 16); + return pb | (nBullet << 16); } void AIBullet::Tick(RunListEvent* ev) diff --git a/source/games/exhumed/src/mummy.cpp b/source/games/exhumed/src/mummy.cpp index 4ea9ba83d..128d90d51 100644 --- a/source/games/exhumed/src/mummy.cpp +++ b/source/games/exhumed/src/mummy.cpp @@ -343,7 +343,7 @@ void AIMummy::Tick(RunListEvent* ev) { if (!RandomSize(3)) { - SetBulletEnemy(pBullet->nPhase, pTarget->GetSpriteIndex()); + SetBulletEnemy(pBullet->nPhase, pTarget); pBullet->s().pal = 5; } } diff --git a/source/games/exhumed/src/set.cpp b/source/games/exhumed/src/set.cpp index 47eb4ec6d..0dee12927 100644 --- a/source/games/exhumed/src/set.cpp +++ b/source/games/exhumed/src/set.cpp @@ -520,7 +520,7 @@ void AISet::Tick(RunListEvent* ev) { auto pBullet = BuildBullet(pActor, 11, -1, pSprite->ang, pTarget, 1); if (pBullet) - SetBulletEnemy(pBullet->nPhase, pTarget->GetSpriteIndex()); + SetBulletEnemy(pBullet->nPhase, pTarget); pActor->nRun--; if (pActor->nRun <= 0 || !RandomBit())