From f54d79619655cc47b6deacfb1300984bce8957b1 Mon Sep 17 00:00:00 2001 From: Dino Bollinger Date: Wed, 20 Apr 2022 22:59:46 +0200 Subject: [PATCH] Duke3D: Fix viewscreens being permanently deactivated after loading a save Also decreases MAXUSERTILES to (MAXTILES - 256) to ensure the tilespace used by the viewscreens isn't encroached on by user tiles. --- source/build/include/build.h | 2 +- source/duke3d/src/duke3d.h | 2 +- source/duke3d/src/premap.cpp | 6 ++++++ source/duke3d/src/savegame.cpp | 12 +++++++++++- 4 files changed, 19 insertions(+), 3 deletions(-) diff --git a/source/build/include/build.h b/source/build/include/build.h index 152d09d07..688e64788 100644 --- a/source/build/include/build.h +++ b/source/build/include/build.h @@ -92,7 +92,7 @@ enum rendmode_t { #define MAXWALLSB ((MAXWALLS>>2)+(MAXWALLS>>3)) #define MAXTILES 30720 -#define MAXUSERTILES (MAXTILES-16) // reserve 16 tiles at the end +#define MAXUSERTILES (MAXTILES-256) // reserve 256 tiles at the end #define MAXVOXELS 1024 #define MAXSTATUS 1024 diff --git a/source/duke3d/src/duke3d.h b/source/duke3d/src/duke3d.h index e8b4e0bf0..9f189ad0c 100644 --- a/source/duke3d/src/duke3d.h +++ b/source/duke3d/src/duke3d.h @@ -108,7 +108,7 @@ enum { // Reserved: TILE_VIEWSCR_1 (MAXTILES-6) // Reserved: TILE_VIEWSCR_2 (MAXTILES-7) // Reserved: (MAXTILES-8) to (MAXTILES-196) for additional Viewscreen tilespace -//EDUKE32_STATIC_ASSERT(4 + (3 * MAX_ACTIVE_VIEWSCREENS) <= MAXTILES-MAXUSERTILES); +EDUKE32_STATIC_ASSERT(4 + (3 * MAX_ACTIVE_VIEWSCREENS) <= MAXTILES-MAXUSERTILES); // sprites with these statnums should be considered for fixing #define ROTFIXSPR_STATNUMP(k) ((k)==STAT_DEFAULT || (k)==STAT_STANDABLE || (k)==STAT_FX || \ diff --git a/source/duke3d/src/premap.cpp b/source/duke3d/src/premap.cpp index d020dfa7b..63c1f55f6 100644 --- a/source/duke3d/src/premap.cpp +++ b/source/duke3d/src/premap.cpp @@ -929,7 +929,10 @@ static void P_PrepForNewLevel(int playerNum, int gameMode) g_interpolationCnt = 0; for (int vscrIndex = 0; vscrIndex < MAX_ACTIVE_VIEWSCREENS; vscrIndex++) + { g_activeVscrSprite[vscrIndex] = -1; + g_activeVscrTile[vscrIndex] = -1; + } randomseed = 1996; screenpeek = myconnectindex; @@ -1710,7 +1713,10 @@ void G_ResetTimers(bool saveMoveCnt) for (int vscrIndex = 0; vscrIndex < MAX_ACTIVE_VIEWSCREENS; vscrIndex++) { if (g_activeVscrSprite[vscrIndex] >= 0) + { actor[g_activeVscrSprite[vscrIndex]].t_data[0] = 0; + actor[g_activeVscrSprite[vscrIndex]].t_data[1] = -1; + } } } diff --git a/source/duke3d/src/savegame.cpp b/source/duke3d/src/savegame.cpp index 39ea31f03..7155f9355 100644 --- a/source/duke3d/src/savegame.cpp +++ b/source/duke3d/src/savegame.cpp @@ -636,6 +636,11 @@ int32_t G_LoadPlayer(savebrief_t & sv) sjson_destroy_context(ctx); + for (int vscrIndex = 0; vscrIndex < MAX_ACTIVE_VIEWSCREENS; vscrIndex++) + { + g_activeVscrSprite[vscrIndex] = -1; + g_activeVscrTile[vscrIndex] = -1; + } if (G_EnterLevel(MODE_GAME|MODE_EOL)) G_BackToMenu(); @@ -645,7 +650,6 @@ int32_t G_LoadPlayer(savebrief_t & sv) // sv_postudload(); - VM_OnEvent(EVENT_LOADGAME, g_player[screenpeek].ps->i, screenpeek); return 0; @@ -725,6 +729,12 @@ int32_t G_LoadPlayer(savebrief_t & sv) Bmemcpy(currentboardfilename, boardfilename, BMAX_PATH); + for (int vscrIndex = 0; vscrIndex < MAX_ACTIVE_VIEWSCREENS; vscrIndex++) + { + g_activeVscrSprite[vscrIndex] = -1; + g_activeVscrTile[vscrIndex] = -1; + } + if (status == 2) G_NewGame_EnterLevel(); else if ((status = sv_loadsnapshot(fil, 0, &h))) // read the rest... -- GitLab