- Exhumed: Cleanup of RestartPlayer

Use pointers instead of endless array accesses to the same element.
This commit is contained in:
Christoph Oelckers 2020-10-14 00:19:39 +02:00
parent b6149f88f7
commit a34525574c

View file

@ -257,223 +257,228 @@ short GetPlayerFromSprite(short nSprite)
void RestartPlayer(short nPlayer) void RestartPlayer(short nPlayer)
{ {
int nSprite = PlayerList[nPlayer].nSprite; auto plr = &PlayerList[nPlayer];
int nDopSprite = nDoppleSprite[nPlayer]; int nSprite = plr->nSprite;
auto nSpr = &sprite[nSprite];
int nDopSprite = nDoppleSprite[nPlayer];
int floorspr; int floorspr;
if (nSprite > -1) if (nSprite > -1)
{ {
runlist_DoSubRunRec(sprite[nSprite].owner); runlist_DoSubRunRec(nSpr->owner);
runlist_FreeRun(sprite[nSprite].lotag - 1); runlist_FreeRun(nSpr->lotag - 1);
changespritestat(nSprite, 0); changespritestat(nSprite, 0);
PlayerList[nPlayer].nSprite = -1; plr->nSprite = -1;
int nFloorSprite = nPlayerFloorSprite[nPlayer]; int nFloorSprite = nPlayerFloorSprite[nPlayer];
if (nFloorSprite > -1) { if (nFloorSprite > -1) {
mydeletesprite(nFloorSprite); mydeletesprite(nFloorSprite);
} }
if (nDopSprite > -1) if (nDopSprite > -1)
{ {
runlist_DoSubRunRec(sprite[nDopSprite].owner); runlist_DoSubRunRec(sprite[nDopSprite].owner);
runlist_FreeRun(sprite[nDopSprite].lotag - 1); runlist_FreeRun(sprite[nDopSprite].lotag - 1);
mydeletesprite(nDopSprite); mydeletesprite(nDopSprite);
} }
} }
nSprite = GrabBody(); nSprite = GrabBody();
nSpr = &sprite[nSprite];
mychangespritesect(nSprite, sPlayerSave[nPlayer].nSector); mychangespritesect(nSprite, sPlayerSave[nPlayer].nSector);
changespritestat(nSprite, 100); changespritestat(nSprite, 100);
assert(nSprite >= 0 && nSprite < kMaxSprites); assert(nSprite >= 0 && nSprite < kMaxSprites);
int nDSprite = insertsprite(sprite[nSprite].sectnum, 100); int nDSprite = insertsprite(nSpr->sectnum, 100);
nDoppleSprite[nPlayer] = nDSprite; nDoppleSprite[nPlayer] = nDSprite;
assert(nDSprite >= 0 && nDSprite < kMaxSprites); assert(nDSprite >= 0 && nDSprite < kMaxSprites);
if (nTotalPlayers > 1) if (nTotalPlayers > 1)
{ {
int nNStartSprite = nNetStartSprite[nCurStartSprite]; int nNStartSprite = nNetStartSprite[nCurStartSprite];
nCurStartSprite++; auto nstspr = &sprite[nNStartSprite];
nCurStartSprite++;
if (nCurStartSprite >= nNetStartSprites) { if (nCurStartSprite >= nNetStartSprites) {
nCurStartSprite = 0; nCurStartSprite = 0;
} }
sprite[nSprite].x = sprite[nNStartSprite].x; nSpr->x = nstspr->x;
sprite[nSprite].y = sprite[nNStartSprite].y; nSpr->y = nstspr->y;
sprite[nSprite].z = sprite[nNStartSprite].z; nSpr->z = nstspr->z;
mychangespritesect(nSprite, sprite[nNStartSprite].sectnum); mychangespritesect(nSprite, nstspr->sectnum);
PlayerList[nPlayer].angle.ang = buildang(sprite[nNStartSprite].ang&kAngleMask); plr->angle.ang = buildang(nstspr->ang&kAngleMask);
sprite[nSprite].ang = PlayerList[nPlayer].angle.ang.asbuild(); nSpr->ang = plr->angle.ang.asbuild();
floorspr = insertsprite(sprite[nSprite].sectnum, 0); floorspr = insertsprite(nSpr->sectnum, 0);
assert(floorspr >= 0 && floorspr < kMaxSprites); assert(floorspr >= 0 && floorspr < kMaxSprites);
auto fspr = &sprite[floorspr];
sprite[floorspr].x = sprite[nSprite].x; fspr->x = nSpr->x;
sprite[floorspr].y = sprite[nSprite].y; fspr->y = nSpr->y;
sprite[floorspr].z = sprite[nSprite].z; fspr->z = nSpr->z;
sprite[floorspr].yrepeat = 64; fspr->yrepeat = 64;
sprite[floorspr].xrepeat = 64; fspr->xrepeat = 64;
sprite[floorspr].cstat = 32; fspr->cstat = 32;
sprite[floorspr].picnum = nPlayer + kTile3571; fspr->picnum = nPlayer + kTile3571;
} }
else else
{ {
sprite[nSprite].x = sPlayerSave[nPlayer].x; nSpr->x = sPlayerSave[nPlayer].x;
sprite[nSprite].y = sPlayerSave[nPlayer].y; nSpr->y = sPlayerSave[nPlayer].y;
sprite[nSprite].z = sector[sPlayerSave[nPlayer].nSector].floorz; nSpr->z = sector[sPlayerSave[nPlayer].nSector].floorz;
PlayerList[nPlayer].angle.ang = buildang(sPlayerSave[nPlayer].nAngle&kAngleMask); plr->angle.ang = buildang(sPlayerSave[nPlayer].nAngle&kAngleMask);
sprite[nSprite].ang = PlayerList[nPlayer].angle.ang.asbuild(); nSpr->ang = plr->angle.ang.asbuild();
floorspr = -1; floorspr = -1;
} }
PlayerList[nPlayer].opos = sprite[nSprite].pos; plr->opos = nSpr->pos;
PlayerList[nPlayer].angle.backup(); plr->angle.backup();
PlayerList[nPlayer].horizon.backup(); plr->horizon.backup();
nPlayerFloorSprite[nPlayer] = floorspr; nPlayerFloorSprite[nPlayer] = floorspr;
sprite[nSprite].cstat = 0x101; nSpr->cstat = 0x101;
sprite[nSprite].shade = -12; nSpr->shade = -12;
sprite[nSprite].clipdist = 58; nSpr->clipdist = 58;
sprite[nSprite].pal = 0; nSpr->pal = 0;
sprite[nSprite].xrepeat = 40; nSpr->xrepeat = 40;
sprite[nSprite].yrepeat = 40; nSpr->yrepeat = 40;
sprite[nSprite].xoffset = 0; nSpr->xoffset = 0;
sprite[nSprite].yoffset = 0; nSpr->yoffset = 0;
sprite[nSprite].picnum = seq_GetSeqPicnum(kSeqJoe, 18, 0); nSpr->picnum = seq_GetSeqPicnum(kSeqJoe, 18, 0);
int nHeight = GetSpriteHeight(nSprite); int nHeight = GetSpriteHeight(nSprite);
sprite[nSprite].xvel = 0; nSpr->xvel = 0;
sprite[nSprite].yvel = 0; nSpr->yvel = 0;
sprite[nSprite].zvel = 0; nSpr->zvel = 0;
nStandHeight = nHeight; nStandHeight = nHeight;
sprite[nSprite].hitag = 0; nSpr->hitag = 0;
sprite[nSprite].extra = -1; nSpr->extra = -1;
sprite[nSprite].lotag = runlist_HeadRun() + 1; nSpr->lotag = runlist_HeadRun() + 1;
sprite[nDSprite].x = sprite[nSprite].x; auto nDSpr = &sprite[nDSprite];
sprite[nDSprite].y = sprite[nSprite].y; nDSpr->x = nSpr->x;
sprite[nDSprite].z = sprite[nSprite].z; nDSpr->y = nSpr->y;
sprite[nDSprite].xrepeat = sprite[nSprite].xrepeat; nDSpr->z = nSpr->z;
sprite[nDSprite].yrepeat = sprite[nSprite].yrepeat; nDSpr->xrepeat = nSpr->xrepeat;
sprite[nDSprite].xoffset = 0; nDSpr->yrepeat = nSpr->yrepeat;
sprite[nDSprite].yoffset = 0; nDSpr->xoffset = 0;
sprite[nDSprite].shade = sprite[nSprite].shade; nDSpr->yoffset = 0;
sprite[nDSprite].ang = sprite[nSprite].ang; nDSpr->shade = nSpr->shade;
sprite[nDSprite].cstat = sprite[nSprite].cstat; nDSpr->ang = nSpr->ang;
nDSpr->cstat = nSpr->cstat;
sprite[nDSprite].lotag = runlist_HeadRun() + 1; nDSpr->lotag = runlist_HeadRun() + 1;
PlayerList[nPlayer].nAction = 0; plr->nAction = 0;
PlayerList[nPlayer].nHealth = 800; // TODO - define plr->nHealth = 800; // TODO - define
if (nNetPlayerCount) { if (nNetPlayerCount) {
PlayerList[nPlayer].nHealth = 1600; // TODO - define plr->nHealth = 1600; // TODO - define
} }
PlayerList[nPlayer].field_2 = 0; plr->field_2 = 0;
PlayerList[nPlayer].nSprite = nSprite; plr->nSprite = nSprite;
PlayerList[nPlayer].bIsMummified = false; plr->bIsMummified = false;
if (PlayerList[nPlayer].invincibility >= 0) { if (plr->invincibility >= 0) {
PlayerList[nPlayer].invincibility = 0; plr->invincibility = 0;
} }
nPlayerTorch[nPlayer] = 0; nPlayerTorch[nPlayer] = 0;
PlayerList[nPlayer].nMaskAmount = 0; plr->nMaskAmount = 0;
SetTorch(nPlayer, 0); SetTorch(nPlayer, 0);
nPlayerInvisible[nPlayer] = 0; nPlayerInvisible[nPlayer] = 0;
PlayerList[nPlayer].bIsFiring = 0; plr->bIsFiring = 0;
PlayerList[nPlayer].field_3FOUR = 0; plr->field_3FOUR = 0;
nPlayerViewSect[nPlayer] = sPlayerSave[nPlayer].nSector; nPlayerViewSect[nPlayer] = sPlayerSave[nPlayer].nSector;
PlayerList[nPlayer].field_3A = 0; plr->field_3A = 0;
nPlayerDouble[nPlayer] = 0; nPlayerDouble[nPlayer] = 0;
PlayerList[nPlayer].nSeq = kSeqJoe; plr->nSeq = kSeqJoe;
nPlayerPushSound[nPlayer] = -1; nPlayerPushSound[nPlayer] = -1;
PlayerList[nPlayer].field_38 = -1; plr->field_38 = -1;
if (PlayerList[nPlayer].nCurrentWeapon == 7) { if (plr->nCurrentWeapon == 7) {
PlayerList[nPlayer].nCurrentWeapon = PlayerList[nPlayer].field_3C; plr->nCurrentWeapon = plr->field_3C;
} }
PlayerList[nPlayer].field_3C = 0; plr->field_3C = 0;
PlayerList[nPlayer].nAir = 100; plr->nAir = 100;
airpages = 0; airpages = 0;
if (currentLevel->levelNumber <= kMap20) if (currentLevel->levelNumber <= kMap20)
{ {
RestoreMinAmmo(nPlayer); RestoreMinAmmo(nPlayer);
} }
else else
{ {
ResetPlayerWeapons(nPlayer); ResetPlayerWeapons(nPlayer);
PlayerList[nPlayer].nMagic = 0; plr->nMagic = 0;
} }
nPlayerGrenade[nPlayer] = -1; nPlayerGrenade[nPlayer] = -1;
oeyelevel[nPlayer] = eyelevel[nPlayer] = -14080; oeyelevel[nPlayer] = eyelevel[nPlayer] = -14080;
dVertPan[nPlayer] = 0; dVertPan[nPlayer] = 0;
nTemperature[nPlayer] = 0; nTemperature[nPlayer] = 0;
nYDamage[nPlayer] = 0; nYDamage[nPlayer] = 0;
nXDamage[nPlayer] = 0; nXDamage[nPlayer] = 0;
PlayerList[nPlayer].horizon.ohoriz = PlayerList[nPlayer].horizon.horiz = q16horiz(0); plr->horizon.ohoriz = plr->horizon.horiz = q16horiz(0);
nBreathTimer[nPlayer] = 90; nBreathTimer[nPlayer] = 90;
nTauntTimer[nPlayer] = RandomSize(3) + 3; nTauntTimer[nPlayer] = RandomSize(3) + 3;
sprite[nDSprite].owner = runlist_AddRunRec(sprite[nDSprite].lotag - 1, nPlayer | 0xA0000); nDSpr->owner = runlist_AddRunRec(nDSpr->lotag - 1, nPlayer | 0xA0000);
sprite[nSprite].owner = runlist_AddRunRec(sprite[nSprite].lotag - 1, nPlayer | 0xA0000); nSpr->owner = runlist_AddRunRec(nSpr->lotag - 1, nPlayer | 0xA0000);
if (PlayerList[nPlayer].nRun < 0) { if (plr->nRun < 0) {
PlayerList[nPlayer].nRun = runlist_AddRunRec(NewRun, nPlayer | 0xA0000); plr->nRun = runlist_AddRunRec(NewRun, nPlayer | 0xA0000);
} }
BuildRa(nPlayer); BuildRa(nPlayer);
if (nPlayer == nLocalPlayer) if (nPlayer == nLocalPlayer)
{ {
nLocalSpr = nSprite; nLocalSpr = nSprite;
SetMagicFrame(); SetMagicFrame();
RestoreGreenPal(); RestoreGreenPal();
} }
sprintf(playerNames[nPlayer], "JOE%d", nPlayer); sprintf(playerNames[nPlayer], "JOE%d", nPlayer);
namelen[nPlayer] = strlen(playerNames[nPlayer]); namelen[nPlayer] = strlen(playerNames[nPlayer]);
ototalvel[nPlayer] = totalvel[nPlayer] = 0; ototalvel[nPlayer] = totalvel[nPlayer] = 0;
memset(&sPlayerInput[nPlayer], 0, sizeof(PlayerInput)); memset(&sPlayerInput[nPlayer], 0, sizeof(PlayerInput));
sPlayerInput[nPlayer].nItem = -1; sPlayerInput[nPlayer].nItem = -1;
nDeathType[nPlayer] = 0; nDeathType[nPlayer] = 0;
nQuake[nPlayer] = 0; nQuake[nPlayer] = 0;
if (nPlayer == nLocalPlayer) { if (nPlayer == nLocalPlayer) {
SetHealthFrame(0); SetHealthFrame(0);
} }
} }
// done // done
int GrabPlayer() int GrabPlayer()
{ {