diff --git a/source/games/exhumed/src/aistuff.h b/source/games/exhumed/src/aistuff.h index b32e42339..5cf3cce45 100644 --- a/source/games/exhumed/src/aistuff.h +++ b/source/games/exhumed/src/aistuff.h @@ -77,15 +77,8 @@ int GrabBullet(); void DestroyBullet(short nRun); int MoveBullet(short nBullet); void SetBulletEnemy(short nBullet, DExhumedActor* nEnemy); -int BuildBullet(short nSprite, int nType, int val1, int nAngle, int val2, int val3); -inline DExhumedActor* BuildBullet(DExhumedActor* pActor, int nType, int val1, int nAngle, DExhumedActor* pTarget, int val3) -{ - int v = BuildBullet(pActor->GetSpriteIndex(), nType, val1, nAngle, pTarget->GetSpriteIndex() + 10000, val3); - if (v < 0) return nullptr; - auto a = &exhumedActors[v & 0xffff]; - a->nPhase = (v >> 16); - return a; -} +DExhumedActor* BuildBullet(DExhumedActor* pActor, int nType, int val1, int nAngle, DExhumedActor* pTarget, int val3); + void IgniteSprite(int nSprite); void FuncBullet(int, int, int, int); void BackUpBullet(int *x, int *y, short nAngle); diff --git a/source/games/exhumed/src/bullet.cpp b/source/games/exhumed/src/bullet.cpp index 40c73ed2f..b7bcef4d6 100644 --- a/source/games/exhumed/src/bullet.cpp +++ b/source/games/exhumed/src/bullet.cpp @@ -42,7 +42,7 @@ struct Bullet short field_6; short field_8; short nType; - short field_C; + short nPitch; short field_E; uint16_t field_10; uint8_t field_12; @@ -77,7 +77,7 @@ FSerializer& Serialize(FSerializer& arc, const char* keyname, Bullet& w, Bullet* ("z", w.z, def->z) ("at6", w.field_6, def->field_6) ("at8", w.field_8, def->field_8) - ("atc", w.field_C, def->field_C) + ("atc", w.nPitch, def->nPitch) ("ate", w.field_E, def->field_E) ("at10", w.field_10, def->field_10) ("at12", w.field_12, def->field_12) @@ -450,9 +450,9 @@ MOVEEND: hitdata_t hitData; int dz; if (bVanilla) - dz = -bsin(pBullet->field_C, 3); + dz = -bsin(pBullet->nPitch, 3); else - dz = -pBullet->field_C * 512; + dz = -pBullet->nPitch * 512; hitscan(&startPos, pSprite->sectnum, bcos(pSprite->ang), bsin(pSprite->ang), dz, &hitData, CLIPMASK1); x2 = hitData.pos.x; y2 = hitData.pos.y; @@ -576,20 +576,18 @@ void SetBulletEnemy(short nBullet, DExhumedActor* pEnemy) } } -int BuildBullet(short nSprite, int nType, int nZOffset, int nAngle, int nTarget, int nDoubleDamage) +DExhumedActor* BuildBullet(DExhumedActor* pActor, int nType, int nZOffset, int nAngle, DExhumedActor* pTarget, int nDoubleDamage) { - auto pSprite = &sprite[nSprite]; + auto pSprite = &pActor->s(); Bullet sBullet; bulletInfo *pBulletInfo = &BulletInfo[nType]; + int nPitch = 0; if (pBulletInfo->field_4 > 30000) { - if (nTarget >= 10000) + if (pTarget) { - nTarget -= 10000; - - short nTargetSprite = nTarget; - spritetype *pTargetSprite = &sprite[nTargetSprite]; + spritetype *pTargetSprite = &pTarget->s(); // assert(pTargetSprite->sectnum <= kMaxSectors); @@ -601,31 +599,31 @@ int BuildBullet(short nSprite, int nType, int nZOffset, int nAngle, int nTarget, sBullet.pActor = insertActor(pSprite->sectnum, 200); sBullet.pActor->s().ang = nAngle; - int nHeight = GetSpriteHeight(nTargetSprite); + int nHeight = GetActorHeight(pTarget); assert(pTargetSprite->sectnum >= 0 && pTargetSprite->sectnum < kMaxSectors); - BulletHitsSprite(&sBullet, nSprite, nTargetSprite, pTargetSprite->x, pTargetSprite->y, pTargetSprite->z - (nHeight >> 1), pTargetSprite->sectnum); + BulletHitsSprite(&sBullet, pActor->GetSpriteIndex(), pTarget->GetSpriteIndex(), pTargetSprite->x, pTargetSprite->y, pTargetSprite->z - (nHeight >> 1), pTargetSprite->sectnum); DeleteActor(sBullet.pActor); - return -1; + return nullptr; } else { - nTarget = 0; + nPitch = 0; } } } int nBullet = GrabBullet(); if (nBullet < 0) { - return -1; + return nullptr; } short nSector; if (pSprite->statnum == 100) { - nSector = nPlayerViewSect[GetPlayerFromSprite(nSprite)]; + nSector = nPlayerViewSect[GetPlayerFromActor(pActor)]; } else { @@ -634,7 +632,7 @@ int BuildBullet(short nSprite, int nType, int nZOffset, int nAngle, int nTarget, auto pBulletActor = insertActor(nSector, 200); auto pBulletSprite = &pBulletActor->s(); - int nHeight = GetSpriteHeight(nSprite); + int nHeight = GetActorHeight(pActor); nHeight = nHeight - (nHeight >> 2); if (nZOffset == -1) { @@ -674,10 +672,11 @@ int BuildBullet(short nSprite, int nType, int nZOffset, int nAngle, int nTarget, pBulletSprite->xvel = 0; pBulletSprite->yvel = 0; pBulletSprite->zvel = 0; - pBulletSprite->owner = nSprite; + pBulletSprite->owner = pActor->GetSpriteIndex(); pBulletSprite->lotag = runlist_HeadRun() + 1; pBulletSprite->extra = -1; pBulletSprite->hitag = 0; + pBulletActor->nPhase = nBullet; // GrabTimeSlot(3); @@ -706,7 +705,7 @@ int BuildBullet(short nSprite, int nType, int nZOffset, int nAngle, int nTarget, pBulletSprite->cstat |= 0x8000; } - pBullet->field_C = nTarget; + pBullet->nPitch = nPitch; pBullet->nType = nType; pBullet->pActor = pBulletActor; pBullet->field_6 = runlist_AddRunRec(pBulletSprite->lotag - 1, nBullet, 0xB0000); @@ -731,24 +730,21 @@ int BuildBullet(short nSprite, int nType, int nZOffset, int nAngle, int nTarget, ChangeActorSect(pBulletActor, nSector); } - if (nTarget < 10000) + if (pTarget == nullptr) { - var_18 = (-bsin(nTarget) * pBulletInfo->field_4) >> 11; + var_18 = (-bsin(nPitch) * pBulletInfo->field_4) >> 11; } else { - nTarget -= 10000; - - short nTargetSprite = nTarget; - auto pTargetSprite = &sprite[nTargetSprite]; + auto pTargetSprite = &pTarget->s(); if ((unsigned int)pBulletInfo->field_4 > 30000) { - BulletList[nBullet].pEnemy = &exhumedActors[nTargetSprite]; + BulletList[nBullet].pEnemy = pTarget; } else { - nHeight = GetSpriteHeight(nTargetSprite); + nHeight = GetActorHeight(pTarget); if (pTargetSprite->statnum == 100) { @@ -763,7 +759,7 @@ int BuildBullet(short nSprite, int nType, int nZOffset, int nAngle, int nTarget, int x, y; - if (nSprite != -1 && pSprite->statnum != 100) + if (pActor != nullptr && pSprite->statnum != 100) { x = pTargetSprite->x; y = pTargetSprite->y; @@ -775,7 +771,7 @@ int BuildBullet(short nSprite, int nType, int nZOffset, int nAngle, int nTarget, } else { - int nPlayer = GetPlayerFromSprite(nTargetSprite); + int nPlayer = GetPlayerFromActor(pTarget); if (nPlayer > -1) { x += nPlayerDX[nPlayer] * 15; @@ -813,7 +809,7 @@ int BuildBullet(short nSprite, int nType, int nZOffset, int nAngle, int nTarget, pBullet->y = (pSprite->clipdist << 2) * bsin(nAngle); BulletList[nBullet].pEnemy = nullptr; - int pb = pBulletActor->GetSpriteIndex(); + if (MoveBullet(nBullet)) { pBulletActor = nullptr; @@ -826,7 +822,7 @@ int BuildBullet(short nSprite, int nType, int nZOffset, int nAngle, int nTarget, pBullet->z = var_18 >> 3; } - return pb | (nBullet << 16); + return pBulletActor; } void AIBullet::Tick(RunListEvent* ev) diff --git a/source/games/exhumed/src/gun.cpp b/source/games/exhumed/src/gun.cpp index a3ed82b77..1d22c597a 100644 --- a/source/games/exhumed/src/gun.cpp +++ b/source/games/exhumed/src/gun.cpp @@ -337,6 +337,7 @@ void MoveWeapons(short nPlayer) if (!PlayerList[nPlayer].bIsFiring || (nSectFlag & kSectUnderwater)) nTemperature[nPlayer] = 0; + auto pPlayerActor = PlayerList[nPlayer].Actor(); short nPlayerSprite = PlayerList[nPlayer].nSprite; auto pPlayerSprite = &sprite[nPlayerSprite]; short nWeapon = PlayerList[nPlayer].nCurrentWeapon; @@ -823,6 +824,7 @@ loc_flag: nHeight -= h; int target = 0; + bool gottarg = false; if (sPlayerInput[nPlayer].nTarget >= 0 && Autoaim(nPlayer)) { assert(sprite[sPlayerInput[nPlayer].nTarget].sectnum < kMaxSectors); @@ -833,11 +835,15 @@ loc_flag: auto pTargetSprite = &sprite[t]; int angletotarget = bvectangbam(pTargetSprite->x - pPlayerSprite->x, pTargetSprite->y - pPlayerSprite->y).asbuild(); int anglediff = (pPlayerSprite->ang - angletotarget) & 2047; - if (anglediff < 512 || anglediff > 1536) target = t + 10000; + if (anglediff < 512 || anglediff > 1536) + { + target = t; + gottarg = true; + } } } - BuildBullet(nPlayerSprite, nAmmoType, nHeight, nAngle, target, var_1C); + BuildBullet(pPlayerActor, nAmmoType, nHeight, nAngle,gottarg? &exhumedActors[target] : nullptr, var_1C); break; } diff --git a/source/games/exhumed/src/object.cpp b/source/games/exhumed/src/object.cpp index e050ad463..dfe62de9a 100644 --- a/source/games/exhumed/src/object.cpp +++ b/source/games/exhumed/src/object.cpp @@ -1427,20 +1427,17 @@ void AITrap::Tick(RunListEvent* ev) return; } - int nBullet = BuildBullet(nSprite, nType, 0, pSprite->ang, 0, 1); - if (nBullet > -1) + auto pBullet = BuildBullet(&exhumedActors[nSprite], nType, 0, pSprite->ang, nullptr, 1); + if (pBullet) { - int nBulletSprite = nBullet & 0xFFFF; // isolate the sprite index (disregard top 16 bits) - assert(nBulletSprite >= 0); - if (nType == 15) { - sprite[nBulletSprite].ang = (sprite[nBulletSprite].ang - 512) & kAngleMask; - D3PlayFX(StaticSound[kSound32], nSprite); + pBullet->s().ang = (pBullet->s().ang - 512) & kAngleMask; + D3PlayFX(StaticSound[kSound32], pBullet); } else { - sprite[nBulletSprite].clipdist = 50; + pBullet->s().clipdist = 50; short nWall = sTrap[nTrap].field_6; if (nWall > -1) @@ -1454,7 +1451,7 @@ void AITrap::Tick(RunListEvent* ev) wall[nWall].picnum = sTrap[nTrap].field_C + 1; } - D3PlayFX(StaticSound[kSound36], nSprite); + D3PlayFX(StaticSound[kSound36], pBullet); } } } diff --git a/source/games/exhumed/src/queen.cpp b/source/games/exhumed/src/queen.cpp index 83519e806..a51fe1428 100644 --- a/source/games/exhumed/src/queen.cpp +++ b/source/games/exhumed/src/queen.cpp @@ -1403,7 +1403,7 @@ void AIQueen::Tick(RunListEvent* ev) if (!si) { - BuildBullet(nSprite, 12, -1, pSprite->ang, nTarget + 10000, 1); + BuildBullet(&exhumedActors[nSprite], 12, -1, pSprite->ang, &exhumedActors[nTarget], 1); } else {