- nPlayerViewSect

This commit is contained in:
Christoph Oelckers 2021-11-23 00:20:15 +01:00
parent eaa155d52e
commit a3f1821670
13 changed files with 57 additions and 71 deletions

View file

@ -234,7 +234,7 @@ DExhumedActor* FindPlayer(DExhumedActor* nSprite, int nDistance, bool dontengage
DExhumedActor* BuildCreatureChunk(DExhumedActor* pSrc, int nPic, bool bSpecial = false);
void BuildNear(int x, int y, int walldist, int nSector);
int PlotCourseToSprite(DExhumedActor* nSprite1, DExhumedActor* nSprite2);
void CheckSectorFloor(int nSector, int z, int *x, int *y);
void CheckSectorFloor(sectortype* nSector, int z, int *x, int *y);
int GetAngleToSprite(DExhumedActor* nSprite1, DExhumedActor* nSprite2);
int GetWallNormal(walltype* nWall);
int GetUpAngle(DExhumedActor* nSprite1, int nVal, DExhumedActor* nSprite2, int ecx);

View file

@ -609,18 +609,18 @@ DExhumedActor* BuildBullet(DExhumedActor* pActor, int nType, int nZOffset, int n
return nullptr;
}
int nSector;
sectortype* pSector;
if (pSprite->statnum == 100)
{
nSector = PlayerList[GetPlayerFromActor(pActor)].nPlayerViewSect;
pSector = PlayerList[GetPlayerFromActor(pActor)].pPlayerViewSect;
}
else
{
nSector = pSprite->sectnum;
pSector = pSprite->sector();
}
auto pBulletActor = insertActor(nSector, 200);
auto pBulletActor = insertActor(pSector, 200);
auto pBulletSprite = &pBulletActor->s();
int nHeight = GetActorHeight(pActor);
nHeight = nHeight - (nHeight >> 2);
@ -706,7 +706,7 @@ DExhumedActor* BuildBullet(DExhumedActor* pActor, int nType, int nZOffset, int n
int var_18 = 0;
auto pSector = pBulletSprite->sector();
pSector = pBulletSprite->sector();
while (pBulletSprite->z < pSector->ceilingz)
{

View file

@ -38,20 +38,17 @@ void precache()
{
if (!r_precache) return;
int i;
for (i = 0; i < numsectors; i++)
for (auto& sect: sectors())
{
auto sectp = &sector[i];
int j = sectp->ceilingpicnum;
markTileForPrecache(j, sectp->ceilingpal);
int j = sect.ceilingpicnum;
markTileForPrecache(j, sect.ceilingpal);
if (picanm[j].sf & PICANM_ANIMTYPE_MASK)
for (int k = 1; k <= picanm[j].num; k++) markTileForPrecache(j + k, sectp->ceilingpal);
for (int k = 1; k <= picanm[j].num; k++) markTileForPrecache(j + k, sect.ceilingpal);
j = sectp->floorpicnum;
markTileForPrecache(j, sectp->floorpal);
j = sect.floorpicnum;
markTileForPrecache(j, sect.floorpal);
if (picanm[j].sf & PICANM_ANIMTYPE_MASK)
for (int k = 1; k <= picanm[j].num; k++) markTileForPrecache(j + k, sectp->floorpal);
for (int k = 1; k <= picanm[j].num; k++) markTileForPrecache(j + k, sect.floorpal);
}
for(auto& wal : walls())

View file

@ -59,7 +59,7 @@ void ThrowGrenade(int nPlayer, int, int, int ecx, int push1)
int nAngle = pPlayerSprite->ang;
ChangeActorSect(pActor, PlayerList[nPlayer].nPlayerViewSect);
ChangeActorSect(pActor, PlayerList[nPlayer].pPlayerViewSect);
pGrenadeSprite->x = pPlayerSprite->x;
pGrenadeSprite->y = pPlayerSprite->y;
@ -102,7 +102,7 @@ void ThrowGrenade(int nPlayer, int, int, int ecx, int push1)
void BuildGrenade(int nPlayer)
{
auto pActor = insertActor(PlayerList[nPlayer].nPlayerViewSect, 201);
auto pActor = insertActor(PlayerList[nPlayer].pPlayerViewSect, 201);
auto pSprite = &pActor->s();
auto pPlayerSprite = &PlayerList[nPlayer].Actor()->s();

View file

@ -220,9 +220,9 @@ void SetWeaponStatus(int nPlayer)
uint8_t WeaponCanFire(int nPlayer)
{
int nWeapon = PlayerList[nPlayer].nCurrentWeapon;
int nSector =PlayerList[nPlayer].nPlayerViewSect;
auto pSector =PlayerList[nPlayer].pPlayerViewSect;
if (!(sector[nSector].Flag & kSectUnderwater) || WeaponInfo[nWeapon].bFireUnderwater)
if (!(pSector->Flag & kSectUnderwater) || WeaponInfo[nWeapon].bFireUnderwater)
{
int nAmmoType = WeaponInfo[nWeapon].nAmmoType;
@ -313,7 +313,7 @@ void MoveWeapons(int nPlayer)
{
static int dword_96E22 = 0;
int nSectFlag = sector[PlayerList[nPlayer].nPlayerViewSect].Flag;
int nSectFlag = PlayerList[nPlayer].pPlayerViewSect->Flag;
if ((nSectFlag & kSectUnderwater) && (totalmoves & 1)) {
return;

View file

@ -159,7 +159,7 @@ void InitLevel(MapRecord* map)
for (int i = 0; i < nTotalPlayers; i++)
{
SetSavePoint(i, initx, inity, initz, initsect, inita);
SetSavePoint(i, initx, inity, initz, &sector[initsect], inita);
RestartPlayer(i);
InitPlayerKeys(i);
}

View file

@ -33,7 +33,7 @@ BEGIN_PS_NS
int nPushBlocks;
// TODO - moveme?
int overridesect;
sectortype* overridesect;
DExhumedActor* nBodySprite[50];
@ -282,7 +282,7 @@ int BelowNear(DExhumedActor* pActor, int x, int y, int walldist, int _nSector)
if (z2 < pSprite->z)
{
pSprite->z = z2;
overridesect = sectnum(pSector);
overridesect = pSector;
pSprite->zvel = 0;
bTouchFloor = true;
@ -301,7 +301,7 @@ Collision movespritez(DExhumedActor* pActor, int z, int height, int, int clipdis
auto pSector = pSprite->sector();
assert(pSector);
overridesect = sectnum(pSector);
overridesect = pSector;
auto pSect2 = pSector;
// backup cstat
@ -742,9 +742,8 @@ DExhumedActor* FindPlayer(DExhumedActor* pActor, int nDistance, bool dontengage)
return pPlayerActor;
}
void CheckSectorFloor(int nSector, int z, int *x, int *y)
void CheckSectorFloor(sectortype* pSector, int z, int *x, int *y)
{
auto pSector = &sector[nSector];
int nSpeed = pSector->Speed;
if (!nSpeed) {
@ -754,7 +753,7 @@ void CheckSectorFloor(int nSector, int z, int *x, int *y)
int nFlag = pSector->Flag;
int nAng = nFlag & kAngleMask;
if (z >= sector[nSector].floorz)
if (z >= pSector->floorz)
{
*x += bcos(nAng, 3) * nSpeed;
*y += bsin(nAng, 3) * nSpeed;

View file

@ -87,21 +87,12 @@ int PlayerCount;
int nNetStartSprites;
int nCurStartSprite;
void RestoreSavePoint(int nPlayer, int *x, int *y, int *z, int *nSector, int16_t *nAngle)
{
*x = PlayerList[nPlayer].sPlayerSave.x;
*y = PlayerList[nPlayer].sPlayerSave.y;
*z = PlayerList[nPlayer].sPlayerSave.z;
*nSector = PlayerList[nPlayer].sPlayerSave.nSector;
*nAngle = PlayerList[nPlayer].sPlayerSave.nAngle;
}
void SetSavePoint(int nPlayer, int x, int y, int z, int nSector, int nAngle)
void SetSavePoint(int nPlayer, int x, int y, int z, sectortype* pSector, int nAngle)
{
PlayerList[nPlayer].sPlayerSave.x = x;
PlayerList[nPlayer].sPlayerSave.y = y;
PlayerList[nPlayer].sPlayerSave.z = z;
PlayerList[nPlayer].sPlayerSave.nSector = nSector;
PlayerList[nPlayer].sPlayerSave.pSector = pSector;
PlayerList[nPlayer].sPlayerSave.nAngle = nAngle;
}
@ -246,7 +237,7 @@ void RestartPlayer(int nPlayer)
pActor = GrabBody();
auto nSpr = &pActor->s();
ChangeActorSect(pActor, plr->sPlayerSave.nSector);
ChangeActorSect(pActor, plr->sPlayerSave.pSector);
ChangeActorStat(pActor, 100);
auto pDActor = insertActor(nSpr->sectnum, 100);
@ -284,7 +275,7 @@ void RestartPlayer(int nPlayer)
{
nSpr->x = plr->sPlayerSave.x;
nSpr->y = plr->sPlayerSave.y;
nSpr->z = sector[plr->sPlayerSave.nSector].floorz;
nSpr->z = plr->sPlayerSave.pSector->floorz;
plr->angle.ang = buildang(plr->sPlayerSave.nAngle&kAngleMask);
nSpr->ang = plr->angle.ang.asbuild();
@ -355,7 +346,7 @@ void RestartPlayer(int nPlayer)
plr->bIsFiring = 0;
plr->nSeqSize2 = 0;
plr->nPlayerViewSect = plr->sPlayerSave.nSector;
plr->pPlayerViewSect = plr->sPlayerSave.pSector;
plr->nState = 0;
plr->nDouble = 0;
@ -863,7 +854,7 @@ void AIPlayer::Tick(RunListEvent* ev)
// loc_1A4E6
int nSector =pPlayerSprite->sectnum;
int nSectFlag = sector[PlayerList[nPlayer].nPlayerViewSect].Flag;
int nSectFlag = PlayerList[nPlayer].pPlayerViewSect->Flag;
int playerX = pPlayerSprite->x;
int playerY = pPlayerSprite->y;
@ -1165,7 +1156,7 @@ sectdone:
}
// loc_1ADAF
PlayerList[nPlayer].nPlayerViewSect = sectnum(pViewSect);
PlayerList[nPlayer].pPlayerViewSect = pViewSect;
PlayerList[nPlayer].nPlayerDX = pPlayerSprite->x - spr_x;
PlayerList[nPlayer].nPlayerDY = pPlayerSprite->y - spr_y;
@ -2215,7 +2206,7 @@ sectdone:
ChangeActorStat(pActorB, 899);
}
SetSavePoint(nPlayer, pPlayerSprite->x, pPlayerSprite->y, pPlayerSprite->z, pPlayerSprite->sectnum, pPlayerSprite->ang);
SetSavePoint(nPlayer, pPlayerSprite->x, pPlayerSprite->y, pPlayerSprite->z, pPlayerSprite->sector(), pPlayerSprite->ang);
break;
}
@ -2506,7 +2497,7 @@ sectdone:
// loc_1C201:
if (nLocalPlayer == nPlayer)
{
nLocalEyeSect = PlayerList[nLocalPlayer].nPlayerViewSect;
nLocalEyeSect = sectnum(PlayerList[nLocalPlayer].pPlayerViewSect);
CheckAmbience(nLocalEyeSect);
}
@ -2670,7 +2661,7 @@ FSerializer& Serialize(FSerializer& arc, const char* keyname, Player& w, Player*
("pushsound", w.nPlayerPushSound)
("taunttimer", w.nTauntTimer)
("weapons", w.nPlayerWeapons)
("viewsect", w.nPlayerViewSect)
("viewsect", w.pPlayerViewSect)
("floorspr", w.pPlayerFloorSprite)
("save", w.sPlayerSave)
("totalvel", w.totalvel)
@ -2689,7 +2680,7 @@ FSerializer& Serialize(FSerializer& arc, const char* keyname, PlayerSave& w, Pla
arc("x", w.x)
("y", w.y)
("z", w.z)
("sector", w.nSector)
("sector", w.pSector)
("angle", w.nAngle)
.EndObject();
}
@ -2764,7 +2755,7 @@ DEFINE_ACTION_FUNCTION(_ExhumedPlayer, IsUnderwater)
{
PARAM_SELF_STRUCT_PROLOGUE(Player);
auto nLocalPlayer = self - PlayerList;
ACTION_RETURN_BOOL(sector[PlayerList[nLocalPlayer].nPlayerViewSect].Flag & kSectUnderwater);
ACTION_RETURN_BOOL(PlayerList[nLocalPlayer].pPlayerViewSect->Flag & kSectUnderwater);
}
DEFINE_ACTION_FUNCTION(_ExhumedPlayer, GetAngle)

View file

@ -23,8 +23,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
BEGIN_PS_NS
void RestoreSavePoint(int nPlayer, int *x, int *y, int *z, int *nSector, int16_t *nAngle);
void SetSavePoint(int nPlayer, int x, int y, int z, int nSector, int nAngle);
void SetSavePoint(int nPlayer, int x, int y, int z, sectortype* nSector, int nAngle);
void InitPlayer();
void InitPlayerKeys(int nPlayer);
int GrabPlayer();
@ -48,10 +47,10 @@ extern int lPlayerYVel;
struct PlayerSave
{
sectortype* pSector;
int x;
int y;
int z;
int nSector;
int16_t nAngle;
};
@ -90,6 +89,7 @@ struct Player
PlayerHorizon horizon;
PlayerAngle angle;
sectortype* pPlayerPushSect;
sectortype* pPlayerViewSect;
int16_t nBreathTimer;
int16_t nPlayerSwear;
@ -106,7 +106,6 @@ struct Player
int16_t nPlayerPushSound;
int16_t nTauntTimer;
uint16_t nPlayerWeapons; // each set bit represents a weapon the player has
int nPlayerViewSect;
PlayerSave sPlayerSave;
int ototalvel;
int totalvel;

View file

@ -361,9 +361,9 @@ int16_t seq_GetFrameFlag(int16_t val, int16_t nFrame)
void seq_DrawPilotLightSeq(double xOffset, double yOffset)
{
int16_t nSect = PlayerList[nLocalPlayer].nPlayerViewSect;
auto pSect = PlayerList[nLocalPlayer].pPlayerViewSect;
if (!(sector[nSect].Flag & kSectUnderwater))
if (!(pSect->Flag & kSectUnderwater))
{
int16_t nFrame = nPilotLightBase + nPilotLightFrame;
int16_t nFrameBase = FrameBase[nFrame];

View file

@ -122,7 +122,7 @@ void BuildSnake(int nPlayer, int zVal)
auto pPlayerActor = PlayerList[nPlayer].Actor();
auto pPlayerSprite = &pPlayerActor->s();
int nViewSect = PlayerList[nPlayer].nPlayerViewSect;
auto pViewSect = PlayerList[nPlayer].pPlayerViewSect;
int nPic = seq_GetSeqPicnum(kSeqSnakBody, 0, 0);
int x = pPlayerSprite->x;
@ -191,7 +191,7 @@ void BuildSnake(int nPlayer, int zVal)
for (int i = 0; i < kSnakeSprites; i++)
{
auto pActor = insertActor(nViewSect, 202);
auto pActor = insertActor(pViewSect, 202);
auto pSprite = &pActor->s();
pActor->pTarget = pPlayerActor;
@ -205,7 +205,7 @@ void BuildSnake(int nPlayer, int zVal)
pSprite->z = pPlayerSprite->z + zVal;
pSprite->xrepeat = 32;
pSprite->yrepeat = 32;
nViewSect = pSprite->sectnum;
pViewSect = pSprite->sector();
sprt = pActor;
}
else

View file

@ -237,8 +237,8 @@ void InitFX(void)
void GetSpriteSoundPitch(int* pVolume, int* pPitch)
{
int nSoundSect = PlayerList[nLocalPlayer].nPlayerViewSect;
int nLocalSectFlags = sector[nSoundSect].Flag;
auto pSoundSect = PlayerList[nLocalPlayer].pPlayerViewSect;
int nLocalSectFlags = pSoundSect->Flag;
if (nLocalSectFlags & kSectUnderwater)
{
if (*pVolume == 255)
@ -724,7 +724,7 @@ void UpdateCreepySounds()
nCreepyTimer--;
if (nCreepyTimer <= 0)
{
if (nCreaturesKilled < nCreaturesTotal && !(sector[PlayerList[nLocalPlayer].nPlayerViewSect].Flag & 0x2000))
if (nCreaturesKilled < nCreaturesTotal && !(PlayerList[nLocalPlayer].pPlayerViewSect->Flag & 0x2000))
{
int vsi = seq_GetFrameSound(SeqOffsets[kSeqCreepy], totalmoves % SeqSize[SeqOffsets[kSeqCreepy]]);
if (vsi >= 0 && (vsi & 0x1ff) < kMaxSounds)

View file

@ -202,7 +202,7 @@ void DrawView(double smoothRatio, bool sceneonly)
int playerX;
int playerY;
int playerZ;
int nSector;
sectortype* pSector = nullptr;
binangle nAngle, rotscrnang;
fixedhoriz pan = {};
@ -225,7 +225,7 @@ void DrawView(double smoothRatio, bool sceneonly)
playerX = pSprite->x;
playerY = pSprite->y;
playerZ = pSprite->z;
nSector = pSprite->sectnum;
pSector = pSprite->sector();
nAngle = buildang(pSprite->ang);
rotscrnang = buildang(0);
@ -249,9 +249,9 @@ void DrawView(double smoothRatio, bool sceneonly)
playerY = pPlayerSprite->interpolatedy(smoothRatio);
playerZ = pPlayerSprite->interpolatedz(smoothRatio) + interpolatedvalue(PlayerList[nLocalPlayer].oeyelevel, PlayerList[nLocalPlayer].eyelevel, smoothRatio);
nSector = PlayerList[nLocalPlayer].nPlayerViewSect;
updatesector(playerX, playerY, &nSector);
if (nSector == -1) PlayerList[nLocalPlayer].nPlayerViewSect;
pSector = PlayerList[nLocalPlayer].pPlayerViewSect;
updatesector(playerX, playerY, &pSector);
if (pSector == nullptr) pSector = PlayerList[nLocalPlayer].pPlayerViewSect;
if (!SyncInput())
{
@ -299,21 +299,21 @@ void DrawView(double smoothRatio, bool sceneonly)
if (bCamera)
{
viewz -= 2560;
/* needs fixing.
if (!calcChaseCamPos(&playerX, &playerY, &viewz, pPlayerSprite, &nSector, nAngle, pan, smoothRatio))
{
viewz += 2560;
calcChaseCamPos(&playerX, &playerY, &viewz, pPlayerSprite, &nSector, nAngle, pan, smoothRatio);
}
*/
}
}
nCamerax = playerX;
nCameray = playerY;
nCameraz = playerZ;
if (nSector != -1)
if (pSector != nullptr)
{
auto pSector = &sector[nSector];
int Z = pSector->ceilingz + 256;
if (Z <= viewz)
{
@ -369,13 +369,13 @@ void DrawView(double smoothRatio, bool sceneonly)
if (!testnewrenderer)
{
renderSetRollAngle((float)rotscrnang.asbuildf());
renderDrawRoomsQ16(nCamerax, nCameray, viewz, nCameraa.asq16(), nCamerapan.asq16(), nSector, false);
renderDrawRoomsQ16(nCamerax, nCameray, viewz, nCameraa.asq16(), nCamerapan.asq16(), sectnum(pSector), false);
analyzesprites(pm_tsprite, pm_spritesortcnt, nCamerax, nCameray, viewz, smoothRatio);
renderDrawMasks();
}
else
{
render_drawrooms(nullptr, { nCamerax, nCameray, viewz }, nSector, nCameraa, nCamerapan, rotscrnang, smoothRatio);
render_drawrooms(nullptr, { nCamerax, nCameray, viewz }, sectnum(pSector), nCameraa, nCamerapan, rotscrnang, smoothRatio);
}
if (HavePLURemap())