implement better ways to get the player index.

This commit is contained in:
Christoph Oelckers 2023-10-12 17:37:19 +02:00
parent b8720c3329
commit 2a773e2028
15 changed files with 41 additions and 78 deletions

View file

@ -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())

View file

@ -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);

View file

@ -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);
}
}

View file

@ -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);

View file

@ -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;
}

View file

@ -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,

View file

@ -91,5 +91,6 @@ struct DUDEINFO {
extern DUDEINFO gPlayerTemplate[4];
DBloodPlayer* getPlayer(DBloodActor* actor);
DBloodPlayer* safeGetPlayer(DBloodActor* actor);
END_BLD_NS

View file

@ -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);
}
}

View file

@ -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

View file

@ -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)
{

View file

@ -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;

View file

@ -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);

View file

@ -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);
}
//---------------------------------------------------------------------------

View file

@ -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

View file

@ -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