From 2a773e2028861d6ed058e0ee84c79e8662ddb5f3 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Thu, 12 Oct 2023 17:37:19 +0200 Subject: [PATCH] implement better ways to get the player index. --- source/games/blood/src/actor.cpp | 2 +- source/games/blood/src/actor.h | 2 +- source/games/blood/src/ai.cpp | 5 ++- source/games/blood/src/aiunicult.cpp | 2 +- source/games/blood/src/blood.cpp | 7 +++- source/games/blood/src/common_game.h | 8 ----- source/games/blood/src/dude.h | 1 + source/games/blood/src/endgame.cpp | 2 +- source/games/blood/src/nnexts.cpp | 22 ++++++------- source/games/blood/src/player.cpp | 8 ++--- source/games/blood/src/prediction.cpp | 4 +-- source/games/blood/src/view.cpp | 2 +- source/games/blood/src/weapon.cpp | 6 ++-- .../static/filter/blood/rmapinfo.spawnclasses | 16 +++++----- .../zscript/games/blood/actors/dudes.zs | 32 ------------------- 15 files changed, 41 insertions(+), 78 deletions(-) diff --git a/source/games/blood/src/actor.cpp b/source/games/blood/src/actor.cpp index bc6530432..cd85ebf59 100644 --- a/source/games/blood/src/actor.cpp +++ b/source/games/blood/src/actor.cpp @@ -4083,7 +4083,7 @@ void actProcessSprites(void) DBloodActor* actSpawnSprite(sectortype* pSector, const DVector3& pos, int nStat, bool setextra, PClass* cls, int type) { DBloodActor* actor = InsertSprite(pSector, nStat, cls); - actor->spr.lotag = type; // we still need this. + if (type >= 0) actor->spr.lotag = type; // we may still need this. SetActor(actor, pos); if (setextra && !actor->hasX()) diff --git a/source/games/blood/src/actor.h b/source/games/blood/src/actor.h index 0378a1f00..4ce58c9a8 100644 --- a/source/games/blood/src/actor.h +++ b/source/games/blood/src/actor.h @@ -124,7 +124,7 @@ void actAirDrag(DBloodActor *pSprite, fixed_t drag); void actExplodeSprite(DBloodActor *pSprite); void actActivateGibObject(DBloodActor *actor); void actProcessSprites(void); -DBloodActor* actSpawnSprite(sectortype* pSector, const DVector3& pos, int nStat, bool setextra, PClass* cls = nullptr, int type = 0); +DBloodActor* actSpawnSprite(sectortype* pSector, const DVector3& pos, int nStat, bool setextra, PClass* cls = nullptr, int type = -1); DBloodActor* actSpawnDude(DBloodActor* pSource, int nType, double dist); DBloodActor * actSpawnSprite(DBloodActor *pSource, int nStat, PClass* cls = nullptr, int type = 0); DBloodActor* actSpawnThing(sectortype* pSector, const DVector3& pos, int nThingType); diff --git a/source/games/blood/src/ai.cpp b/source/games/blood/src/ai.cpp index 612a597a9..a7eff5674 100644 --- a/source/games/blood/src/ai.cpp +++ b/source/games/blood/src/ai.cpp @@ -131,12 +131,11 @@ static bool isImmune(DBloodActor* actor, int dmgType, int minScale) if (dmgType >= kDmgFall && dmgType < kDmgMax && actor->hasX() && actor->xspr.locked != 1) { - int type = actor->GetType(); - if (type >= kThingBase && type < kThingMax) + if (actor->IsThingActor()) return (actor->dmgControl[dmgType] <= minScale); else if (actor->IsDudeActor()) { - if (actor->IsPlayerActor()) return (getPlayer(type - kDudePlayer1)->godMode || getPlayer(type - kDudePlayer1)->damageControl[dmgType] <= minScale); + if (actor->IsPlayerActor()) return (getPlayer(actor)->godMode || getPlayer(actor)->damageControl[dmgType] <= minScale); else return (actor->dmgControl[dmgType] <= minScale); } } diff --git a/source/games/blood/src/aiunicult.cpp b/source/games/blood/src/aiunicult.cpp index 01662c2ee..6cbd5854e 100644 --- a/source/games/blood/src/aiunicult.cpp +++ b/source/games/blood/src/aiunicult.cpp @@ -460,7 +460,7 @@ static void unicultThinkChase(DBloodActor* actor) if (target->xspr.health <= 0) // target is dead { DBloodPlayer* pPlayer = NULL; - if ((!target->IsPlayerActor()) || ((pPlayer = getPlayerById(target->GetType())) != NULL && pPlayer->fragger == actor)) + if ((!target->IsPlayerActor()) || ((pPlayer = safeGetPlayer(target)) != NULL && pPlayer->fragger == actor)) { playGenDudeSound(actor, kGenDudeSndTargetDead); if (spriteIsUnderwater(actor, false)) aiGenDudeNewState(actor, &genDudeSearchShortW); diff --git a/source/games/blood/src/blood.cpp b/source/games/blood/src/blood.cpp index 7bdd87ea5..8f84f62c6 100644 --- a/source/games/blood/src/blood.cpp +++ b/source/games/blood/src/blood.cpp @@ -768,7 +768,12 @@ enum inline DBloodPlayer* getPlayer(DBloodActor* actor) { - return getPlayer(actor->GetType() - kDudePlayer1); + return getPlayer(actor->spr.xint); +} + +inline DBloodPlayer* safeGetPlayer(DBloodActor* actor) +{ + return actor->IsPlayerActor()? getPlayer(actor) : nullptr; } diff --git a/source/games/blood/src/common_game.h b/source/games/blood/src/common_game.h index 49d85242b..d94fd4834 100644 --- a/source/games/blood/src/common_game.h +++ b/source/games/blood/src/common_game.h @@ -285,14 +285,6 @@ enum { kDudeCerberusOneHead = 228, kDudeTchernobog = 229, kDudeCultistTommyProne = 230, - kDudePlayer1 = 231, - kDudePlayer2 = 232, - kDudePlayer3 = 233, - kDudePlayer4 = 234, - kDudePlayer5 = 235, - kDudePlayer6 = 236, - kDudePlayer7 = 237, - kDudePlayer8 = 238, kDudeBurningInnocent = 239, kDudeBurningCultist = 240, kDudeBurningZombieAxe = 241, diff --git a/source/games/blood/src/dude.h b/source/games/blood/src/dude.h index a801b18bf..ef790d162 100644 --- a/source/games/blood/src/dude.h +++ b/source/games/blood/src/dude.h @@ -91,5 +91,6 @@ struct DUDEINFO { extern DUDEINFO gPlayerTemplate[4]; DBloodPlayer* getPlayer(DBloodActor* actor); +DBloodPlayer* safeGetPlayer(DBloodActor* actor); END_BLD_NS diff --git a/source/games/blood/src/endgame.cpp b/source/games/blood/src/endgame.cpp index 97b21b5e2..596378cf7 100644 --- a/source/games/blood/src/endgame.cpp +++ b/source/games/blood/src/endgame.cpp @@ -70,7 +70,7 @@ void AddKill(DBloodActor* killer, DBloodActor* killed) { if (AllowedKillType(killed)) { - int playernum = killer->IsPlayerActor() ? killer->GetType() - kDudePlayer1 : -1; + int playernum = killer->IsPlayerActor() ? getPlayer(killer)->pnum : -1; Level.addKill(playernum, 1); } } diff --git a/source/games/blood/src/nnexts.cpp b/source/games/blood/src/nnexts.cpp index e51225e81..a1e4f729d 100644 --- a/source/games/blood/src/nnexts.cpp +++ b/source/games/blood/src/nnexts.cpp @@ -2877,7 +2877,7 @@ void usePropertiesChanger(DBloodActor* sourceactor, int objType, sectortype* pSe if (iactor->spr.statnum != kStatDude || !iactor->IsDudeActor() || !iactor->hasX()) continue; - auto pPlayer = getPlayerById(iactor->GetType()); + auto pPlayer = safeGetPlayer(iactor); if (pXSector->Underwater) { if (aLower) @@ -3124,7 +3124,7 @@ void useVelocityChanger(DBloodActor* actor, sectortype* sect, DBloodActor* initi void useTeleportTarget(DBloodActor* sourceactor, DBloodActor* actor) { - auto pPlayer = getPlayerById(actor->GetType()); + auto pPlayer = safeGetPlayer(actor); XSECTOR* pXSector = (sourceactor->sector()->hasX()) ? &sourceactor->sector()->xs() : nullptr; bool isDude = (!pPlayer && actor->IsDudeActor()); @@ -3545,7 +3545,7 @@ void damageSprites(DBloodActor* sourceactor, DBloodActor* actor) int health = 0; - auto pPlayer = getPlayerById(actor->GetType()); + auto pPlayer = safeGetPlayer(actor); int dmgType = (sourceactor->xspr.data2 >= kDmgFall) ? ClipHigh(sourceactor->xspr.data2, kDmgElectric) : -1; int dmg = actor->xspr.health << 4; int armor[3]; @@ -4612,7 +4612,7 @@ bool condCheckSprite(DBloodActor* aCond, int cmpOp, bool PUSH) } double range = arg3 * 2; - if ((pPlayer = getPlayerById(objActor->GetType())) != NULL) + if ((pPlayer = safeGetPlayer(objActor)) != NULL) var = HitScan(objActor, pPlayer->zWeapon, pPlayer->aim, arg1, range); else if (objActor->IsDudeActor()) var = HitScan(objActor, objActor->spr.pos.Z, DVector3(objActor->spr.Angles.Yaw.ToVector(), (!objActor->hasX()) ? 0 : objActor->dudeSlope), arg1, range); @@ -5971,13 +5971,12 @@ bool modernTypeOperateSprite(DBloodActor* actor, EVENT& event) int cmd = (event.cmd >= kCmdNumberic) ? event.cmd : actor->xspr.command; - int playerID; if ((actor->xspr.txID == kChannelEventCauser || actor->xspr.data1 == 0) && initiator && initiator->IsPlayerActor()) - playerID = initiator->GetType(); + pPlayer = getPlayer(initiator); else - playerID = actor->xspr.data1; + pPlayer = getPlayerById(actor->xspr.data1); - if ((pPlayer = getPlayerById(playerID)) == NULL + if (pPlayer == NULL || ((cmd < 67 || cmd > 68) && !modernTypeSetSpriteState(actor, actor->xspr.state ^ 1, initiator))) return true; @@ -7365,6 +7364,7 @@ void playerQavSceneReset(DBloodPlayer* pPlayer) DBloodPlayer* getPlayerById(int id) { + const int kPlayerType1 = 231; // relative to connected players if (id >= 1 && id <= kMaxPlayers) { @@ -7375,9 +7375,9 @@ DBloodPlayer* getPlayerById(int id) return getPlayer(i); } - // absolute sprite type } - else if (id >= kDudePlayer1 && id <= kDudePlayer8) + // absolute sprite type (kinda smelly) + else if (id >= kPlayerType1 && id < kPlayerType1 + kMaxPlayers) { for (int i = connecthead; i >= 0; i = connectpoint2[i]) { @@ -9148,7 +9148,7 @@ void changeSpriteAngle(DBloodActor* pSpr, DAngle nAng) pSpr->spr.Angles.Yaw = nAng; else { - auto pPlayer = getPlayerById(pSpr->GetType()); + auto pPlayer = safeGetPlayer(pSpr); if (pPlayer) pPlayer->GetActor()->spr.Angles.Yaw = nAng; else diff --git a/source/games/blood/src/player.cpp b/source/games/blood/src/player.cpp index 671a0f051..7fa3ab7e3 100644 --- a/source/games/blood/src/player.cpp +++ b/source/games/blood/src/player.cpp @@ -836,11 +836,11 @@ void playerStart(int nPlayer, int bNewLevel) pStartZone = &gStartZone[Random(8)]; } - auto cls = GetSpawnType(kDudePlayer1 + nPlayer); - auto actor = actSpawnSprite(pStartZone->sector, pStartZone->pos, kStatDude, 1, cls, kDudePlayer1 + nPlayer); + auto actor = actSpawnSprite(pStartZone->sector, pStartZone->pos, kStatDude, 1, BloodPlayerBaseClass); assert(actor->hasX()); pPlayer->actor = actor; pPlayer->Angles.initialize(actor); + actor->spr.xint = nPlayer; // store the index directly so we do not have to rely on the type anymore. DUDEINFO* pDudeInfo = &gPlayerTemplate[0]; pPlayer->pDudeInfo = pDudeInfo; @@ -1935,9 +1935,9 @@ void playerFrag(DBloodPlayer* pKiller, DBloodPlayer* pVictim) assert(pVictim != NULL); char buffer[128] = ""; - int nKiller = pKiller->GetActor()->GetType() - kDudePlayer1; + int nKiller = pKiller->pnum; assert(nKiller >= 0 && nKiller < kMaxPlayers); - int nVictim = pVictim->GetActor()->GetType() - kDudePlayer1; + int nVictim = pVictim->pnum; assert(nVictim >= 0 && nVictim < kMaxPlayers); if (nKiller == nVictim) { diff --git a/source/games/blood/src/prediction.cpp b/source/games/blood/src/prediction.cpp index 72ae01ea1..3b75b0a5d 100644 --- a/source/games/blood/src/prediction.cpp +++ b/source/games/blood/src/prediction.cpp @@ -352,10 +352,8 @@ void fakePlayerProcess(DBloodPlayer* pPlayer, InputPacket* pInput) static void fakeMoveDude(DBloodActor* actor) { #if 0 // not needed for single player, temporarily disabled due to icompatibilities with the refactored API. - PLAYER* pPlayer = NULL; int bottom, top; - if (IsPlayerSprite(pSprite)) - pPlayer = &gPlayer[pSprite->type - kDudePlayer1]; + DBloodPlayer* pPlayer = safeGetPlayer(pSprite); GetSpriteExtents(pSprite, &top, &bottom); top += predict.z - pSprite->z; bottom += predict.z - pSprite->z; diff --git a/source/games/blood/src/view.cpp b/source/games/blood/src/view.cpp index e19e1384c..6b92d0232 100644 --- a/source/games/blood/src/view.cpp +++ b/source/games/blood/src/view.cpp @@ -111,7 +111,7 @@ void viewDrawAimedPlayerName(DBloodPlayer* pPlayer) auto actor = gHitInfo.actor(); if (actor && actor->IsPlayerActor()) { - int nPlayer = actor->GetType() - kDudePlayer1; + int nPlayer = getPlayer(actor)->pnum; const char* szName = PlayerName(nPlayer); int nPalette = (getPlayer(nPlayer)->teamId & 3) + 11; viewDrawText(DigiFont, szName, 160, 125, -128, nPalette, 1, 1); diff --git a/source/games/blood/src/weapon.cpp b/source/games/blood/src/weapon.cpp index 57abfe83c..1c833569e 100644 --- a/source/games/blood/src/weapon.cpp +++ b/source/games/blood/src/weapon.cpp @@ -1355,7 +1355,7 @@ void ThrowRemote(int, DBloodPlayer* pPlayer) auto spawned = playerFireThing(pPlayer, 0, -9460 / 65536., kThingArmedRemoteBomb, nSpeed); if (spawned) { - spawned->xspr.rxID = 90 + (pPlayer->GetActor()->GetType() - kDudePlayer1); + spawned->xspr.rxID = 90 + (pPlayer->pnum); UseAmmo(pPlayer, 11, 1); pPlayer->throwPower = 0; } @@ -1372,14 +1372,14 @@ void DropRemote(int, DBloodPlayer* pPlayer) auto spawned = playerFireThing(pPlayer, 0, 0, kThingArmedRemoteBomb, 0); if (spawned) { - spawned->xspr.rxID = 90 + (pPlayer->GetActor()->GetType() - kDudePlayer1); + spawned->xspr.rxID = 90 + (pPlayer->pnum); UseAmmo(pPlayer, 11, 1); } } void FireRemote(int, DBloodPlayer* pPlayer) { - evSendGame(90 + (pPlayer->GetActor()->GetType() - kDudePlayer1), kCmdOn); + evSendGame(90 + (pPlayer->pnum), kCmdOn); } //--------------------------------------------------------------------------- diff --git a/wadsrc/static/filter/blood/rmapinfo.spawnclasses b/wadsrc/static/filter/blood/rmapinfo.spawnclasses index 4a9301e13..84b8309ad 100644 --- a/wadsrc/static/filter/blood/rmapinfo.spawnclasses +++ b/wadsrc/static/filter/blood/rmapinfo.spawnclasses @@ -124,14 +124,14 @@ spawnclasses 228 = BloodDudeCerberusOneHead 229 = BloodDudeTchernobog 230 = BloodDudeCultistTommyProne - 231 = BloodDudePlayer1 - 232 = BloodDudePlayer2 - 233 = BloodDudePlayer3 - 234 = BloodDudePlayer4 - 235 = BloodDudePlayer5 - 236 = BloodDudePlayer6 - 237 = BloodDudePlayer7 - 238 = BloodDudePlayer8 + 231 = BloodPlayerBase + 232 = BloodPlayerBase + 233 = BloodPlayerBase + 234 = BloodPlayerBase + 235 = BloodPlayerBase + 236 = BloodPlayerBase + 237 = BloodPlayerBase + 238 = BloodPlayerBase 239 = BloodDudeBurningInnocent 240 = BloodDudeBurningCultist 241 = BloodDudeBurningZombieAxe diff --git a/wadsrc/static/zscript/games/blood/actors/dudes.zs b/wadsrc/static/zscript/games/blood/actors/dudes.zs index b5b0b2dcb..950ce3fc3 100644 --- a/wadsrc/static/zscript/games/blood/actors/dudes.zs +++ b/wadsrc/static/zscript/games/blood/actors/dudes.zs @@ -1240,38 +1240,6 @@ class BloodDudeCultistTommyProne : BloodDudeBase } } -class BloodDudePlayer1 : BloodPlayerBase -{ -} - -class BloodDudePlayer2 : BloodPlayerBase -{ -} - -class BloodDudePlayer3 : BloodPlayerBase -{ -} - -class BloodDudePlayer4 : BloodPlayerBase -{ -} - -class BloodDudePlayer5 : BloodPlayerBase -{ -} - -class BloodDudePlayer6 : BloodPlayerBase -{ -} - -class BloodDudePlayer7 : BloodPlayerBase -{ -} - -class BloodDudePlayer8 : BloodPlayerBase -{ -} - class BloodDudeBurningInnocent : BloodDudeBase { default