Skip to content

Commit 3145683

Browse files
authored
Hexen: sideloading optimization & bugfixing (#1403)
* Hexen: tryout changing the S_InitScript and InitMapInfo * Revert "Hexen: tryout changing the S_InitScript and InitMapInfo" This reverts commit 8fa0992. * Hexen: Fix bug with wrong demo reel when in episode selection * Hexen: only reinit episode in case it is changed * Hexen: chose different way how to detect HEXDD.WAD .. and move the check back after W_GenerateHashTable. * Hexen: smaller adaptions for end game while sideloading
1 parent f3127d7 commit 3145683

6 files changed

Lines changed: 56 additions & 25 deletions

File tree

src/hexen/d_pwad.c

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -36,15 +36,13 @@ static boolean CheckHEXDDLoaded (void)
3636
{
3737
int i, j;
3838

39-
i = P_TranslateMap(1);
40-
j = P_TranslateMap(20);
41-
42-
// Check if HEXDD.WAD is already loaded by checking MapInfo Mapnames for warptarget 1 and 20
43-
if (i >= 0 && j >= 0 &&
44-
!strcasecmp(P_GetMapName(i), "RUINED VILLAGE") &&
45-
!strcasecmp(P_GetMapName(j), "DARK CITADEL"))
39+
// Check if HEXDD.WAD is already loaded
40+
if ((i = W_CheckNumForName("MAP41")) != -1 &&
41+
(j = W_CheckNumForName("MAP60")) != -1 &&
42+
!strcasecmp(W_WadNameForLump(lumpinfo[i]), "HEXDD.WAD") &&
43+
!strcasecmp(W_WadNameForLump(lumpinfo[j]), "HEXDD.WAD"))
4644
{
47-
gameepisode = 2;
45+
gameepisode = prev_episode = 2;
4846
return true;
4947
}
5048

@@ -134,13 +132,13 @@ static void CheckLoadHEXDD (void)
134132
}
135133
}
136134

137-
// [crispy] load WAD and DEH files from autoload directories
135+
// [crispy] load WAD from autoload directories
138136
if (!M_ParmExists("-noautoload"))
139137
{
140138
if ((autoload_dir = M_GetAutoloadDir(dd_basename, false)))
141139
{
142140
W_AutoLoadWADsRename(autoload_dir, hexdd_lumps, arrlen(hexdd_lumps));
143-
//DEH_AutoLoadPatches(autoload_dir);
141+
// TODO? DEH_AutoLoadPatches(autoload_dir);
144142
free(autoload_dir);
145143
}
146144
}

src/hexen/g_game.c

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
// External functions
4040

4141
extern void R_ExecuteSetViewSize(void); // [crispy] for clean screenshot
42+
extern void S_InitScript(void); // [crispy] multiple episodes
4243

4344
// Functions
4445

@@ -69,6 +70,7 @@ gameaction_t gameaction;
6970
gamestate_t gamestate;
7071
skill_t gameskill;
7172
//boolean respawnmonsters;
73+
int prev_episode; // [crispy] previous episode up until InitEpisode
7274
int gameepisode;
7375
int gamemap;
7476
int prevmap;
@@ -1918,6 +1920,8 @@ void G_StartNewGame(skill_t skill)
19181920
int realMap;
19191921

19201922
G_StartNewInit();
1923+
// [crispy] re-init scripts and mapinfo to support multiple episodes
1924+
H2_InitEpisode(false);
19211925
realMap = P_TranslateMap(1);
19221926
if (realMap == -1)
19231927
{
@@ -2282,7 +2286,8 @@ void G_InitNew(skill_t skill, int episode, int map)
22822286
}
22832287
paused = false;
22842288
viewactive = true;
2285-
gameepisode = episode;
2289+
// [crispy] don't let e. g. demo episode overwrite gameepisode
2290+
// gameepisode = episode;
22862291
gamemap = map;
22872292
gameskill = skill;
22882293
BorderNeedRefresh = true;
@@ -2728,3 +2733,34 @@ boolean G_CheckDemoStatus(void)
27282733

27292734
return false;
27302735
}
2736+
2737+
/*
2738+
===============================================================================
2739+
2740+
[crispy] Additional Functions
2741+
2742+
===============================================================================
2743+
*/
2744+
2745+
/*
2746+
===================
2747+
=
2748+
= H2_InitEpisode
2749+
=
2750+
= (Re-)Init episode related MapInfo and Sound Scripts
2751+
= to support multiple episodes in Hexen.
2752+
===================
2753+
*/
2754+
2755+
void H2_InitEpisode(bool forceinit)
2756+
{
2757+
if (!crispy->havedeathkings)
2758+
return;
2759+
2760+
if (forceinit || (prev_episode != gameepisode))
2761+
{
2762+
S_InitScript();
2763+
InitMapInfo();
2764+
prev_episode = gameepisode;
2765+
}
2766+
}

src/hexen/h2_main.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -484,6 +484,7 @@ void D_DoomMain(void)
484484

485485
I_AtExit(D_HexenQuitMessage, false);
486486
startepisode = 1;
487+
gameepisode = prev_episode = startepisode; // [crispy] init gameepisode
487488
autostart = false;
488489
startmap = 1;
489490
gamemode = commercial;

src/hexen/h2def.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -677,6 +677,7 @@ extern int Sky2Texture;
677677
extern gamestate_t gamestate;
678678
extern skill_t gameskill;
679679
//extern boolean respawnmonsters;
680+
extern int prev_episode; // [crispy]
680681
extern int gameepisode;
681682
extern int gamemap;
682683
extern int prevmap;
@@ -755,6 +756,7 @@ void H2_GameLoop(void);
755756

756757
void H2_StartTitle(void);
757758

759+
void H2_InitEpisode(bool forceinit); // [crispy]
758760

759761
extern boolean artiskip;
760762

src/hexen/mn_menu.c

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,6 @@ extern void I_ReInitGraphics(int reinit); // [crispy]
114114
extern void R_ExecuteSetViewSize(void); // [crispy]
115115
extern void AM_LevelInit(boolean reinit); // [crispy]
116116
extern void AM_initVariables(void); // [crispy]
117-
extern void S_InitScript(void); // [crispy]
118117

119118
// PUBLIC FUNCTION PROTOTYPES ----------------------------------------------
120119

@@ -1579,12 +1578,9 @@ static void SCEpisode(int option)
15791578
demoextend = false;
15801579
}
15811580

1582-
// Execude Episode Selection
1581+
// [crispy] Execude Episode Selection
1582+
prev_episode = gameepisode;
15831583
gameepisode = option;
1584-
1585-
S_InitScript();
1586-
InitMapInfo();
1587-
15881584
SetMenu(MENU_CLASS);
15891585
}
15901586

@@ -2320,12 +2316,11 @@ boolean MN_Responder(event_t * event)
23202316
I_SetPalette(0);
23212317
#endif
23222318
H2_StartTitle(); // go to intro/demo mode.
2323-
// [crispy] re-init episode 1 for correct demo reel
2324-
if (gameepisode > 1)
2319+
// [crispy] re-init startepisode for correct demo reel
2320+
if (crispy->havedeathkings && gameepisode != startepisode)
23252321
{
2326-
gameepisode = 1;
2327-
S_InitScript();
2328-
InitMapInfo();
2322+
gameepisode = prev_episode = startepisode;
2323+
H2_InitEpisode(true);
23292324
}
23302325
return false;
23312326
case 3:

src/hexen/sv_save.c

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,6 @@ typedef struct
8989

9090
// EXTERNAL FUNCTION PROTOTYPES --------------------------------------------
9191

92-
extern void S_InitScript(void); // [crispy] support multiple episodes
9392
void P_SpawnPlayer(mapthing_t * mthing);
9493

9594
// PUBLIC FUNCTION PROTOTYPES ----------------------------------------------
@@ -2129,6 +2128,7 @@ void SV_LoadGame(int slot)
21292128

21302129
AssertSegment(ASEG_GAME_HEADER);
21312130

2131+
prev_episode = gameepisode; // [crispy]
21322132
gameepisode = 1;
21332133
gamemap = SV_ReadByte();
21342134
gameskill = SV_ReadByte();
@@ -2154,8 +2154,7 @@ void SV_LoadGame(int slot)
21542154
SV_ReadExtendedSaveGameData(EXTSAVEG_GAME);
21552155

21562156
// [crispy] re-init scripts and mapinfo to support multiple episodes
2157-
S_InitScript();
2158-
InitMapInfo();
2157+
H2_InitEpisode(false);
21592158

21602159
// Save player structs
21612160
for (i = 0; i < maxplayers; i++)

0 commit comments

Comments
 (0)