Skip to content

Commit af2fe50

Browse files
authored
Rework Game Modifiers to be temporary (#724)
1 parent a0951b1 commit af2fe50

File tree

13 files changed

+113
-21
lines changed

13 files changed

+113
-21
lines changed

prboom2/src/d_main.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,8 @@ dboolean nomonsters; // working -nomonsters
137137
dboolean respawnparm; // working -respawn
138138
dboolean fastparm; // working -fast
139139

140+
dboolean pistolstart;
141+
140142
dboolean randomclass;
141143

142144
dboolean singletics = false; // debug flag to cancel adaptiveness
@@ -2155,6 +2157,7 @@ static void D_DoomMainSetup(void)
21552157
dsda_LoadWadPreferences();
21562158
dsda_LoadMapInfo();
21572159
dsda_InitSkills();
2160+
dsda_InitGameModifiers(); // Set game modifiers based off args / persistent cfgs
21582161

21592162
//jff 9/3/98 use logical output routine
21602163
lprintf(LO_DEBUG, "\nP_Init: Init Playloop state.\n");

prboom2/src/doomstat.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,8 @@ extern complevel_t compatibility_level;
7474

7575
extern int demo_insurance; // killough 4/5/98
7676

77+
extern dboolean pistolstart;
78+
7779
// -------------------------------------------
7880
// killough 10/98: compatibility vector
7981

prboom2/src/dsda/args.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@ static arg_config_t arg_config[dsda_arg_count] = {
198198
"play single player with coop thing spawns",
199199
arg_null,
200200
},
201-
[dsda_arg_pistolstart] = {
201+
[dsda_arg_pistol_start] = {
202202
"-pistolstart", "-wandstart", NULL,
203203
"automatically pistol start each map",
204204
arg_null,

prboom2/src/dsda/args.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ typedef enum {
5050
dsda_arg_dsdademo,
5151
dsda_arg_solo_net,
5252
dsda_arg_coop_spawns,
53-
dsda_arg_pistolstart,
53+
dsda_arg_pistol_start,
5454
dsda_arg_chain_episodes,
5555
dsda_arg_stroller,
5656
dsda_arg_turbo,

prboom2/src/dsda/configuration.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,8 @@ void dsda_InitExHud(void);
135135
void dsda_UpdateFreeText(void);
136136
void dsda_ResetAirControl(void);
137137
void dsda_AlterGameFlags(void);
138+
void dsda_RefreshPistolStart(void);
139+
void dsda_RefreshAlwaysPistolStart(void);
138140

139141
void dsda_TrackConfigFeatures(void) {
140142
if (!demorecording)
@@ -983,7 +985,11 @@ dsda_config_t dsda_config[dsda_config_count] = {
983985
},
984986
[dsda_config_pistol_start] = {
985987
"dsda_pistol_start", dsda_config_pistol_start,
986-
CONF_BOOL(0), NULL, NOT_STRICT
988+
CONF_BOOL(0), NULL, NOT_STRICT, dsda_RefreshPistolStart
989+
},
990+
[dsda_config_always_pistol_start] = {
991+
"dsda_always_pistol_start", dsda_config_always_pistol_start,
992+
CONF_BOOL(0), NULL, NOT_STRICT, dsda_RefreshAlwaysPistolStart
987993
},
988994
[dsda_config_respawn_monsters] = {
989995
"dsda_respawn_monsters", dsda_config_respawn_monsters,

prboom2/src/dsda/configuration.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,7 @@ typedef enum {
215215
dsda_config_quickstart_cache_tics,
216216
dsda_config_death_use_action,
217217
dsda_config_allow_jumping,
218+
dsda_config_always_pistol_start,
218219
dsda_config_pistol_start,
219220
dsda_config_respawn_monsters,
220221
dsda_config_fast_monsters,

prboom2/src/dsda/demo.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -277,7 +277,7 @@ void dsda_InitDemoRecording(void) {
277277
I_Error("You must specify a skill level when recording a demo!\n"
278278
"Example: dsda-doom -iwad DOOM -complevel 3 -skill 4 -record demo");
279279

280-
if (dsda_Flag(dsda_arg_pistolstart))
280+
if (dsda_Flag(dsda_arg_pistol_start))
281281
I_Error("The -pistolstart option is not allowed when recording a demo!");
282282

283283
demorecording = true;

prboom2/src/dsda/save.c

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,38 @@ static void dsda_UnArchiveContext(void) {
142142
true_basetic = gametic - true_logictic_value;
143143
}
144144

145+
int saved_pistolstart, saved_respawnparm, saved_fastparm, saved_nomonsters, saved_coop_spawns;
146+
147+
void dsda_ArchiveGameModifiers(void)
148+
{
149+
saved_pistolstart = pistolstart;
150+
saved_respawnparm = respawnparm;
151+
saved_fastparm = fastparm;
152+
saved_nomonsters = nomonsters;
153+
saved_coop_spawns = coop_spawns;
154+
155+
P_SAVE_X(saved_pistolstart);
156+
P_SAVE_X(saved_respawnparm);
157+
P_SAVE_X(saved_fastparm);
158+
P_SAVE_X(saved_nomonsters);
159+
P_SAVE_X(saved_coop_spawns);
160+
}
161+
162+
void dsda_UnArchiveGameModifiers(void)
163+
{
164+
P_LOAD_X(saved_pistolstart);
165+
P_LOAD_X(saved_respawnparm);
166+
P_LOAD_X(saved_fastparm);
167+
P_LOAD_X(saved_nomonsters);
168+
P_LOAD_X(saved_coop_spawns);
169+
170+
dsda_UpdateIntConfig(dsda_config_pistol_start, saved_pistolstart, true);
171+
dsda_UpdateIntConfig(dsda_config_respawn_monsters, saved_respawnparm, true);
172+
dsda_UpdateIntConfig(dsda_config_fast_monsters, saved_fastparm, true);
173+
dsda_UpdateIntConfig(dsda_config_no_monsters, saved_nomonsters, true);
174+
dsda_UpdateIntConfig(dsda_config_coop_spawns, saved_coop_spawns, true);
175+
}
176+
145177
void dsda_ArchiveAll(void) {
146178
dsda_ArchiveContext();
147179

@@ -159,6 +191,7 @@ void dsda_ArchiveAll(void) {
159191
P_ArchiveRNG();
160192
P_ArchiveMap();
161193

194+
dsda_ArchiveGameModifiers();
162195
dsda_ArchiveInternal();
163196
}
164197

@@ -179,6 +212,7 @@ void dsda_UnArchiveAll(void) {
179212
P_UnArchiveMap();
180213
P_MapEnd();
181214

215+
dsda_UnArchiveGameModifiers();
182216
dsda_UnArchiveInternal();
183217
}
184218

prboom2/src/dsda/skill_info.c

Lines changed: 54 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -221,23 +221,67 @@ void dsda_InitSkills(void) {
221221
}
222222
}
223223

224-
static void dsda_ResetGameFlags(void)
224+
// At startup, set-up temp game modifier configs based off args / persistent cfgs
225+
// Only set once, as modifiers can break away from args
226+
//
227+
// "Always Pistol Start" is the only persistent cfg (saved in cfg file)
228+
//
229+
230+
void dsda_InitGameModifiers(void)
231+
{
232+
if (dsda_Flag(dsda_arg_pistol_start) || dsda_IntConfig(dsda_config_always_pistol_start))
233+
dsda_UpdateIntConfig(dsda_config_pistol_start, true, true);
234+
if (dsda_Flag(dsda_arg_respawn))
235+
dsda_UpdateIntConfig(dsda_config_respawn_monsters, true, true);
236+
if (dsda_Flag(dsda_arg_fast))
237+
dsda_UpdateIntConfig(dsda_config_fast_monsters, true, true);
238+
if (dsda_Flag(dsda_arg_nomonsters))
239+
dsda_UpdateIntConfig(dsda_config_no_monsters, true, true);
240+
if (dsda_Flag(dsda_arg_coop_spawns))
241+
dsda_UpdateIntConfig(dsda_config_coop_spawns, true, true);
242+
}
243+
244+
// if "Pistol Start" is disabled, disable "Always Pistol Start" (avoid impossible condition)
245+
void dsda_RefreshPistolStart(void)
246+
{
247+
dboolean pistol_start_conflict = dsda_IntConfig(dsda_config_always_pistol_start) && !dsda_IntConfig(dsda_config_pistol_start);
248+
249+
if (allow_incompatibility || in_game)
250+
if (pistol_start_conflict)
251+
{
252+
dsda_UpdateIntConfig(dsda_config_always_pistol_start, false, true);
253+
dsda_ResetGameModifiers();
254+
}
255+
}
256+
257+
// if "Always Pistol Start" is enabled, enable "Pistol Start" (avoid impossible condition)
258+
void dsda_RefreshAlwaysPistolStart(void)
259+
{
260+
dboolean pistol_start_conflict = dsda_IntConfig(dsda_config_always_pistol_start) && !dsda_IntConfig(dsda_config_pistol_start);
261+
262+
if (allow_incompatibility || in_game)
263+
if (pistol_start_conflict)
264+
{
265+
dsda_UpdateIntConfig(dsda_config_pistol_start, true, true);
266+
dsda_ResetGameModifiers();
267+
}
268+
}
269+
270+
// During demo recording/playback only use args, else use cfgs
271+
void dsda_ResetGameModifiers(void)
225272
{
226-
respawnparm = dsda_Flag(dsda_arg_respawn) ||
227-
(allow_incompatibility && dsda_IntConfig(dsda_config_respawn_monsters));
228-
fastparm = dsda_Flag(dsda_arg_fast) ||
229-
(allow_incompatibility && dsda_IntConfig(dsda_config_fast_monsters));
230-
nomonsters = dsda_Flag(dsda_arg_nomonsters) ||
231-
(allow_incompatibility && dsda_IntConfig(dsda_config_no_monsters));
232-
coop_spawns = dsda_Flag(dsda_arg_coop_spawns) ||
233-
(allow_incompatibility && dsda_IntConfig(dsda_config_coop_spawns));
273+
pistolstart = (allow_incompatibility ? dsda_IntConfig(dsda_config_pistol_start) : false); // pistolstart not allowed in demos
274+
respawnparm = (allow_incompatibility ? dsda_IntConfig(dsda_config_respawn_monsters) : dsda_Flag(dsda_arg_respawn));
275+
fastparm = (allow_incompatibility ? dsda_IntConfig(dsda_config_fast_monsters) : dsda_Flag(dsda_arg_fast));
276+
nomonsters = (allow_incompatibility ? dsda_IntConfig(dsda_config_no_monsters) : dsda_Flag(dsda_arg_nomonsters));
277+
coop_spawns = (allow_incompatibility ? dsda_IntConfig(dsda_config_coop_spawns) : dsda_Flag(dsda_arg_coop_spawns));
234278
}
235279

236280
void dsda_RefreshGameSkill(void) {
237281
void G_RefreshFastMonsters(void);
238282

239283
if (allow_incompatibility)
240-
dsda_ResetGameFlags();
284+
dsda_ResetGameModifiers();
241285

242286
skill_info = skill_infos[gameskill];
243287

prboom2/src/dsda/skill_info.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,5 +60,9 @@ void dsda_InitSkills(void);
6060
void dsda_RefreshGameSkill(void);
6161
void dsda_UpdateGameSkill(int skill);
6262
void dsda_AlterGameFlags(void);
63+
void dsda_InitGameModifiers(void);
64+
void dsda_ResetGameModifiers(void);
65+
void dsda_RefreshPistolStart(void);
66+
void dsda_RefreshAlwaysPistolStart(void);
6367

6468
#endif

0 commit comments

Comments
 (0)