From 6d736aea1958a8686be7d81d45ee71d4e53d3196 Mon Sep 17 00:00:00 2001 From: Mitchell Richters Date: Wed, 23 Nov 2022 18:08:35 +1100 Subject: [PATCH] - SW: Swap out the internals of the player's pos methods and get the game going again. * Leave `PLAYER::PlayerOldPosition` for now. --- source/games/sw/src/draw.cpp | 2 +- source/games/sw/src/game.cpp | 5 ++--- source/games/sw/src/game.h | 26 +++++++++++------------ source/games/sw/src/misc.h | 4 ++-- source/games/sw/src/ninja.cpp | 18 ++++++++++++---- source/games/sw/src/player.cpp | 38 ++++++++++++++-------------------- source/games/sw/src/player.h | 2 +- source/games/sw/src/save.cpp | 5 +---- source/games/sw/src/sounds.cpp | 4 ++-- 9 files changed, 51 insertions(+), 53 deletions(-) diff --git a/source/games/sw/src/draw.cpp b/source/games/sw/src/draw.cpp index 77466afd2..c5e20ec55 100644 --- a/source/games/sw/src/draw.cpp +++ b/source/games/sw/src/draw.cpp @@ -1240,7 +1240,7 @@ void drawscreen(PLAYER* pp, double interpfrac, bool sceneonly) } // Get initial player position, interpolating if required. - DVector3 tpos = interpolatedvalue(camerapp->posprevGet(), camerapp->posGet(), interpfrac); + DVector3 tpos = camerapp->actor->getRenderPos(interpfrac); if (SyncInput() || pp != Player+myconnectindex) { tang = camerapp->angle.interpolatedsum(interpfrac); diff --git a/source/games/sw/src/game.cpp b/source/games/sw/src/game.cpp index ce4f57d93..633ce0aa6 100644 --- a/source/games/sw/src/game.cpp +++ b/source/games/sw/src/game.cpp @@ -408,7 +408,6 @@ void InitLevel(MapRecord *maprec) SpawnSpriteDef sprites; DVector3 ppos; loadMap(maprec->fileName, SW_SHAREWARE ? 1 : 0, &ppos, &ang, &cursect, sprites); - Player[0].posSet(ppos); spawnactors(sprites); Player[0].cursector = cursect; @@ -434,8 +433,8 @@ void InitLevel(MapRecord *maprec) QueueReset(); PreMapCombineFloors(); - InitMultiPlayerInfo(); - InitAllPlayerSprites(); + InitMultiPlayerInfo(ppos); + InitAllPlayerSprites(ppos); // // Do setup for sprite, track, panel, sector, etc diff --git a/source/games/sw/src/game.h b/source/games/sw/src/game.h index d57385321..77ff13b05 100644 --- a/source/games/sw/src/game.h +++ b/source/games/sw/src/game.h @@ -1708,9 +1708,7 @@ BEGIN_SW_NS struct PLAYER { - // variable that fit in the sprite or user structure - - DVector3 PlayerNowPosition, PlayerPrevPosition, PlayerOldPosition; + DVector3 PlayerOldPosition; DSWActor* actor; // this may not be a TObjPtr! TObjPtr lowActor, highActor; @@ -1889,52 +1887,52 @@ struct PLAYER DVector2& posXY() { - return PlayerNowPosition.XY(); + return actor->spr.pos.XY(); } void posZset(const double val) { - PlayerNowPosition.Z = val; + actor->spr.pos.Z = val - actor->viewzoffset; } void posZadd(const double val) { - PlayerNowPosition.Z += val; + actor->spr.pos.Z += val; } double posZget() { - return PlayerNowPosition.Z; + return actor->spr.pos.Z + actor->viewzoffset; } void posSet(const DVector3& val) { - PlayerNowPosition = val; + actor->spr.pos = val.plusZ(-actor->viewzoffset); } void posAdd(const DVector2& val) { - PlayerNowPosition += val; + actor->spr.pos += val; } DVector3 posGet() { - return PlayerNowPosition; + return actor->spr.pos.plusZ(actor->viewzoffset); } DVector2& posprevXY() { - return PlayerPrevPosition.XY(); + return actor->opos.XY(); } void posprevZset(const double val) { - PlayerPrevPosition.Z = val; + actor->opos.Z = val - actor->viewzoffset; } void posprevSet(const DVector3& val) { - PlayerPrevPosition = val; + actor->opos = val.plusZ(-actor->viewzoffset); } DVector3 posprevGet() { - return PlayerPrevPosition; + return actor->opos.plusZ(actor->viewzoffset); } DVector2& posoldXY() diff --git a/source/games/sw/src/misc.h b/source/games/sw/src/misc.h index 2ccd3127d..5cc47d2a9 100644 --- a/source/games/sw/src/misc.h +++ b/source/games/sw/src/misc.h @@ -71,8 +71,8 @@ int DoActorSectorDamage(DSWActor* actor); int DoScaleSprite(DSWActor* actor); int DoActorStopFall(DSWActor* actor); -void InitPlayerSprite(PLAYER* pp); -void InitAllPlayerSprites(void); +void InitPlayerSprite(PLAYER* pp, const DVector3& spawnpos); +void InitAllPlayerSprites(const DVector3& spawnpos); void PlayerPanelSetup(void); void PlayerDeathReset(PLAYER* pp); void SpawnPlayerUnderSprite(PLAYER* pp); diff --git a/source/games/sw/src/ninja.cpp b/source/games/sw/src/ninja.cpp index d708e2881..5113e986a 100644 --- a/source/games/sw/src/ninja.cpp +++ b/source/games/sw/src/ninja.cpp @@ -2166,13 +2166,13 @@ int DoNinjaCeiling(DSWActor* actor) // too convienent to put it here. // -void InitAllPlayerSprites(void) +void InitAllPlayerSprites(const DVector3& spawnpos) { short i; TRAVERSE_CONNECT(i) { - InitPlayerSprite(Player + i); + InitPlayerSprite(Player + i, spawnpos); } } @@ -2385,14 +2385,24 @@ extern ACTOR_ACTION_SET PlayerNinjaActionSet; // //--------------------------------------------------------------------------- -void InitPlayerSprite(PLAYER* pp) +void InitPlayerSprite(PLAYER* pp, const DVector3& spawnpos) { int pnum = int(pp - Player); + double fz,cz; extern bool NewGame; COVER_SetReverb(0); // Turn off any echoing that may have been going before pp->Reverb = 0; - auto actor = SpawnActor(STAT_PLAYER0 + pnum, NINJA_RUN_R0, nullptr, pp->cursector, pp->posGet(), pp->angle.ang); + auto actor = SpawnActor(STAT_PLAYER0 + pnum, NINJA_RUN_R0, nullptr, pp->cursector, spawnpos.plusZ(PLAYER_HEIGHTF), pp->angle.ang); + actor->viewzoffset = -PLAYER_HEIGHTF; + + // if too close to the floor - stand up + calcSlope(pp->cursector, actor->getPosWithOffsetZ(), &cz, &fz); + if (actor->spr.pos.Z > fz) + { + actor->spr.pos.Z = fz; + } + actor->backuppos(); pp->actor = actor; pp->pnum = pnum; diff --git a/source/games/sw/src/player.cpp b/source/games/sw/src/player.cpp index e149ea768..c7d5f7068 100644 --- a/source/games/sw/src/player.cpp +++ b/source/games/sw/src/player.cpp @@ -1859,10 +1859,6 @@ void UpdatePlayerSprite(PLAYER* pp) DSWActor* actor = pp->actor; if (!actor) return; - // Update sprite representation of player - - actor->spr.pos.XY() = pp->posXY(); - // there are multiple death functions if (pp->Flags & (PF_DEAD)) { @@ -6137,14 +6133,10 @@ void DoPlayerDeathCheckKeys(PLAYER* pp) InitBloodSpray(plActor,true,-1); } - PlayerSpawnPosition(pp); - NewStateGroup(plActor, plActor->user.ActorActionSet->Stand); plActor->spr.picnum = plActor->user.State->Pic; plActor->spr.picnum = plActor->user.State->Pic; - plActor->spr.scale = DVector2(PLAYER_NINJA_XREPEAT, PLAYER_NINJA_XREPEAT); plActor->spr.cstat &= ~(CSTAT_SPRITE_YCENTER); - plActor->spr.pos = pp->posGet().plusZ(PLAYER_HEIGHTF); plActor->spr.angle = pp->angle.ang; DoSpawnTeleporterEffect(plActor); @@ -6165,7 +6157,6 @@ void DoPlayerDeathCheckKeys(PLAYER* pp) plActor->spr.scale = DVector2(PLAYER_NINJA_XREPEAT, PLAYER_NINJA_YREPEAT); pp->horizon.horiz = nullAngle; - DoPlayerResetMovement(pp); plActor->user.ID = NINJA_RUN_R0; PlayerDeathReset(pp); @@ -7186,8 +7177,6 @@ void InitAllPlayers(void) // Initialize all [MAX_SW_PLAYERS] arrays here! for (pp = Player; pp < &Player[MAX_SW_PLAYERS]; pp++) { - pp->posSet(pfirst->posGet()); - pp->posprevSet(pfirst->posGet()); pp->angle.ang = pp->angle.oang = pfirst->angle.ang; pp->horizon.horiz = pp->horizon.ohoriz = pfirst->horizon.horiz; pp->cursector = pfirst->cursector; @@ -7196,7 +7185,6 @@ void InitAllPlayers(void) //pp->MaxHealth = 100; - pp->posoldXY().Zero(); pp->climb_ndx = 10; pp->KillerActor = nullptr; pp->Kills = 0; @@ -7287,7 +7275,6 @@ void PlayerSpawnPosition(PLAYER* pp) { short pnum = short(pp - Player); short pos_num = pnum; - double fz,cz; int i; DSWActor* spawn_sprite = nullptr; @@ -7346,17 +7333,14 @@ void PlayerSpawnPosition(PLAYER* pp) ASSERT(spawn_sprite != nullptr); - pp->posSet(spawn_sprite->spr.pos); - pp->posprevSet(pp->posGet()); pp->angle.ang = pp->angle.oang = spawn_sprite->spr.angle; pp->setcursector(spawn_sprite->sector()); - calcSlope(pp->cursector, pp->posGet(), &cz, &fz); - // if too close to the floor - stand up - if (pp->posZget() > fz - PLAYER_HEIGHTF) + if (pp->actor) { - pp->posZset(fz - PLAYER_HEIGHTF); - pp->posprevZset(pp->posZget()); + pp->actor->spr.pos = spawn_sprite->spr.pos; + pp->actor->viewzoffset = spawn_sprite->viewzoffset; + pp->actor->backuppos(); } } @@ -7366,12 +7350,13 @@ void PlayerSpawnPosition(PLAYER* pp) // //--------------------------------------------------------------------------- -void InitMultiPlayerInfo(void) +void InitMultiPlayerInfo(const DVector3& spawnpos) { PLAYER* pp; short pnum; unsigned stat; int tag; + double fz,cz; static short MultiStatList[] = { STAT_MULTI_START, @@ -7411,7 +7396,16 @@ void InitMultiPlayerInfo(void) continue; } - auto start0 = SpawnActor(MultiStatList[stat], ST1, nullptr, pp->cursector, pp->posGet(), pp->angle.ang); + auto start0 = SpawnActor(MultiStatList[stat], ST1, nullptr, pp->cursector, spawnpos.plusZ(PLAYER_HEIGHTF), pp->angle.ang); + start0->viewzoffset = -PLAYER_HEIGHTF; + + // if too close to the floor - stand up + calcSlope(pp->cursector, start0->getPosWithOffsetZ(), &cz, &fz); + if (start0->spr.pos.Z > fz) + { + start0->spr.pos.Z = fz; + } + start0->backuppos(); start0->clearUser(); start0->spr.picnum = ST1; } diff --git a/source/games/sw/src/player.h b/source/games/sw/src/player.h index 5f0b90c40..79de680c5 100644 --- a/source/games/sw/src/player.h +++ b/source/games/sw/src/player.h @@ -126,7 +126,7 @@ void HeadBobStateControl(void); void DoPlayer(void); void domovethings(void); void InitAllPlayers(void); -void InitMultiPlayerInfo(void); +void InitMultiPlayerInfo(const DVector3& spawnpos); void MoveScrollMode2D(PLAYER* pp, ControlInfo* const hidInput); void DoPlayerDivePalette(PLAYER* pp); void DoPlayerNightVisionPalette(PLAYER* pp); diff --git a/source/games/sw/src/save.cpp b/source/games/sw/src/save.cpp index 65fc7784b..a47b5d64d 100644 --- a/source/games/sw/src/save.cpp +++ b/source/games/sw/src/save.cpp @@ -435,10 +435,7 @@ FSerializer& Serialize(FSerializer& arc, const char* keyname, PLAYER& w, PLAYER* { if (arc.BeginObject(keyname)) { - arc("x", w.PlayerNowPosition.X) - ("y", w.PlayerNowPosition.Y) - ("z", w.PlayerNowPosition.Z) - ("lv_sectnum", w.lv_sector) + arc("lv_sectnum", w.lv_sector) ("lv_x", w.lv.X) ("lv_y", w.lv.Y) ("lv_z", w.lv.Z) diff --git a/source/games/sw/src/sounds.cpp b/source/games/sw/src/sounds.cpp index 9d0e42b1a..5bf9d9525 100644 --- a/source/games/sw/src/sounds.cpp +++ b/source/games/sw/src/sounds.cpp @@ -513,7 +513,7 @@ void SWSoundEngine::CalcPosVel(int type, const void* source, const float pt[3], if (pos != nullptr) { PLAYER* pp = Player + screenpeek; - FVector3 campos = GetSoundPos(pp->posGet()); + FVector3 campos = GetSoundPos(pp->actor ? pp->posGet() : DVector3()); DVector3 vPos = {}; bool pancheck = false; @@ -605,7 +605,7 @@ void GameInterface::UpdateSounds(void) listener.angle = float(-tang.Radians()); listener.velocity.Zero(); - listener.position = GetSoundPos(pp->posGet()); + listener.position = GetSoundPos(pp->actor ? pp->posGet() : DVector3()); listener.underwater = false; // This should probably use a real environment instead of the pitch hacking in S_PlaySound3D. // listenactor->waterlevel == 3;