Skip to content

Commit 0eb4a21

Browse files
committed
Add Custom Skill
1 parent 9533fb9 commit 0eb4a21

File tree

12 files changed

+419
-16
lines changed

12 files changed

+419
-16
lines changed

prboom2/src/doomdef.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -421,6 +421,8 @@ typedef enum {
421421

422422
extern dboolean raven;
423423

424+
extern dboolean customskill;
425+
424426
// heretic
425427

426428
#define FRICTION_LOW 0xf900

prboom2/src/dsda/configuration.c

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
#include "dsda/exhud.h"
3838
#include "dsda/features.h"
3939
#include "dsda/input.h"
40+
#include "dsda/skill_info.h"
4041
#include "dsda/stretch.h"
4142
#include "dsda/utility.h"
4243

@@ -1001,6 +1002,70 @@ dsda_config_t dsda_config[dsda_config_count] = {
10011002
"dsda_coop_spawns", dsda_config_coop_spawns,
10021003
CONF_BOOL(0), NULL, NOT_STRICT, dsda_AlterGameFlags
10031004
},
1005+
[dsda_config_skill_spawn_filter] = {
1006+
"dsda_skill_spawn_filter", dsda_config_skill_spawn_filter,
1007+
dsda_config_int, 0, 2, { 1 }, &cskill_spawn_filter
1008+
},
1009+
[dsda_config_skill_coop_spawns] = {
1010+
"dsda_skill_coop_spawns", dsda_config_skill_coop_spawns,
1011+
CONF_BOOL(0), &cskill_coop_spawns
1012+
},
1013+
[dsda_config_skill_ammo_factor] = {
1014+
"dsda_skill_ammo_factor", dsda_config_skill_ammo_factor,
1015+
dsda_config_int, 0, 4, { 1 }, &cskill_ammo_factor
1016+
},
1017+
[dsda_config_skill_damage_factor] = {
1018+
"dsda_skill_damage_factor", dsda_config_skill_damage_factor,
1019+
dsda_config_int, 0, 4, { 1 }, &cskill_damage_factor
1020+
},
1021+
[dsda_config_skill_armor_factor] = {
1022+
"dsda_skill_armor_factor", dsda_config_skill_armor_factor,
1023+
dsda_config_int, 0, 4, { 1 }, &cskill_armor_factor
1024+
},
1025+
[dsda_config_skill_health_factor] = {
1026+
"dsda_skill_health_factor", dsda_config_skill_health_factor,
1027+
dsda_config_int, 0, 4, { 1 }, &cskill_health_factor
1028+
},
1029+
[dsda_config_skill_monster_health_factor] = {
1030+
"dsda_skill_monster_health_factor", dsda_config_skill_monster_health_factor,
1031+
dsda_config_int, 0, 4, { 1 }, &cskill_monster_hp_factor
1032+
},
1033+
[dsda_config_skill_friend_health_factor] = {
1034+
"dsda_skill_friend_health_factor", dsda_config_skill_friend_health_factor,
1035+
dsda_config_int, 0, 4, { 1 }, &cskill_friend_hp_factor
1036+
},
1037+
[dsda_config_skill_respawn_monsters] = {
1038+
"dsda_skill_respawn_monsters", dsda_config_skill_respawn_monsters,
1039+
CONF_BOOL(0), &cskill_respawn
1040+
},
1041+
[dsda_config_skill_respawn_time] = {
1042+
"dsda_skill_respawn_time", dsda_config_skill_respawn_time,
1043+
dsda_config_int, 1, 32, { 12 }, &cskill_respawn_time
1044+
},
1045+
[dsda_config_skill_no_monsters] = {
1046+
"dsda_skill_no_monsters", dsda_config_skill_no_monsters,
1047+
CONF_BOOL(0), &cskill_no_monsters
1048+
},
1049+
[dsda_config_skill_fast_monsters] = {
1050+
"dsda_skill_fast_monsters", dsda_config_skill_fast_monsters,
1051+
CONF_BOOL(0), &cskill_fast_monsters
1052+
},
1053+
[dsda_config_skill_aggressive_monsters] = {
1054+
"dsda_skill_aggressive_monsters", dsda_config_skill_aggressive_monsters,
1055+
CONF_BOOL(0), &cskill_aggressive
1056+
},
1057+
[dsda_config_skill_easy_brain] = {
1058+
"dsda_skill_easy_brain", dsda_config_skill_easy_brain,
1059+
CONF_BOOL(0), &cskill_easy_brain
1060+
},
1061+
[dsda_config_skill_auto_use_health] = {
1062+
"dsda_skill_auto_use_health", dsda_config_skill_auto_use_health,
1063+
CONF_BOOL(0), &cskill_auto_use_hp
1064+
},
1065+
[dsda_config_skill_no_pain] = {
1066+
"dsda_skill_no_pain", dsda_config_skill_no_pain,
1067+
CONF_BOOL(0), &cskill_no_pain
1068+
},
10041069
[dsda_config_parallel_sfx_limit] = {
10051070
"dsda_parallel_sfx_limit", dsda_config_parallel_sfx_limit,
10061071
dsda_config_int, 0, 32, { 0 }, NULL, NOT_STRICT, dsda_InitParallelSFXFilter

prboom2/src/dsda/configuration.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,22 @@ typedef enum {
220220
dsda_config_fast_monsters,
221221
dsda_config_no_monsters,
222222
dsda_config_coop_spawns,
223+
dsda_config_skill_spawn_filter,
224+
dsda_config_skill_coop_spawns,
225+
dsda_config_skill_ammo_factor,
226+
dsda_config_skill_damage_factor,
227+
dsda_config_skill_armor_factor,
228+
dsda_config_skill_health_factor,
229+
dsda_config_skill_monster_health_factor,
230+
dsda_config_skill_friend_health_factor,
231+
dsda_config_skill_respawn_monsters,
232+
dsda_config_skill_respawn_time,
233+
dsda_config_skill_no_monsters,
234+
dsda_config_skill_fast_monsters,
235+
dsda_config_skill_aggressive_monsters,
236+
dsda_config_skill_easy_brain,
237+
dsda_config_skill_auto_use_health,
238+
dsda_config_skill_no_pain,
223239
dsda_config_parallel_sfx_limit,
224240
dsda_config_parallel_sfx_window,
225241
dsda_config_movement_toggle_sfx,

prboom2/src/dsda/demo.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
#include "dsda/map_format.h"
4040
#include "dsda/preferences.h"
4141
#include "dsda/settings.h"
42+
#include "dsda/skill_info.h"
4243
#include "dsda/split_tracker.h"
4344
#include "dsda/utility.h"
4445

@@ -280,6 +281,12 @@ void dsda_InitDemoRecording(void) {
280281
if (dsda_Flag(dsda_arg_pistolstart))
281282
I_Error("The -pistolstart option is not allowed when recording a demo!");
282283

284+
if (customskill && dsda_Flag(dsda_arg_skill))
285+
{
286+
if (dsda_Arg(dsda_arg_skill)->value.v_int > num_skills - customskill)
287+
I_Error("Custom Skill is not allowed when recording a demo!\n");
288+
}
289+
283290
demorecording = true;
284291

285292
// Key settings revert when starting a new attempt

prboom2/src/dsda/global.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,8 @@ dboolean hexen = false;
139139
dboolean heretic = false;
140140
dboolean raven = false;
141141

142+
dboolean customskill = false;
143+
142144
static void dsda_InitDoom(void) {
143145
int i;
144146
doom_mobjinfo_t* mobjinfo_p;

prboom2/src/dsda/skill_info.c

Lines changed: 102 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ static void dsda_CopyFactor(fixed_t* dest, const char* source) {
139139
*dest = dsda_StringToFixed(source) + 1;
140140
}
141141

142-
void dsda_CopySkillInfo(int i, const doom_mapinfo_skill_t* info) {
142+
static void dsda_CopySkillInfo(int i, const doom_mapinfo_skill_t* info) {
143143
memset(&skill_infos[i], 0, sizeof(skill_infos[i]));
144144

145145
dsda_CopyFactor(&skill_infos[i].ammo_factor, info->ammo_factor);
@@ -171,11 +171,20 @@ void dsda_CopySkillInfo(int i, const doom_mapinfo_skill_t* info) {
171171
void dsda_InitSkills(void) {
172172
int i = 0;
173173
int j;
174+
int original_skill_list;
174175
dboolean clear_skills;
176+
doom_mapinfo_t mapinfo;
175177

176-
clear_skills = (doom_mapinfo.num_skills && doom_mapinfo.skills_cleared);
178+
// Check for new skills
179+
dsda_CheckCustomSkill();
177180

178-
num_skills = (clear_skills ? 0 : 5) + doom_mapinfo.num_skills;
181+
mapinfo = doom_mapinfo;
182+
183+
clear_skills = (mapinfo.num_skills && mapinfo.skills_cleared);
184+
185+
num_skills = (clear_skills ? 0 : 5) + (int)mapinfo.num_skills + customskill;
186+
187+
original_skill_list = 5;
179188

180189
skill_infos = Z_Calloc(num_skills, sizeof(*skill_infos));
181190

@@ -186,7 +195,7 @@ void dsda_InitSkills(void) {
186195
heretic ? heretic_skill_infos :
187196
doom_skill_infos;
188197

189-
for (i = 0; i < 5; ++i)
198+
for (i = 0; i < original_skill_list; ++i)
190199
skill_infos[i] = original_skill_infos[i];
191200
}
192201

@@ -219,6 +228,85 @@ void dsda_InitSkills(void) {
219228
else
220229
dsda_CopySkillInfo(i + j, &doom_mapinfo.skills[j]);
221230
}
231+
232+
if (customskill)
233+
skill_infos[num_skills-1].name = "Custom Skill";
234+
}
235+
236+
/////////////////////////////////////////
237+
//
238+
// Add Custom Skill Properties
239+
//
240+
//
241+
242+
static int dsda_GetCustomSpawnFilter(int config) {
243+
switch (config)
244+
{
245+
case 0: return 1; // if "easy", skill 1
246+
case 1: return 3; // if "medium", skill 3
247+
case 2: return 4; // if "hard", skill 4
248+
default: return false;
249+
}
250+
}
251+
252+
static int dsda_GetCustomFactor(int config) {
253+
switch (config)
254+
{
255+
case 0: return FRACUNIT / 2;
256+
case 1: return FRACUNIT;
257+
case 2: return FRACUNIT * 3 / 2;
258+
case 3: return FRACUNIT * 2;
259+
case 4: return FRACUNIT * 4;
260+
default: return false;
261+
}
262+
}
263+
264+
// Custom Skill variables
265+
int cskill_spawn_filter;
266+
int cskill_ammo_factor;
267+
int cskill_damage_factor;
268+
int cskill_armor_factor;
269+
int cskill_health_factor;
270+
int cskill_monster_hp_factor;
271+
int cskill_friend_hp_factor;
272+
int cskill_respawn;
273+
int cskill_respawn_time;
274+
int cskill_coop_spawns;
275+
int cskill_no_monsters;
276+
int cskill_fast_monsters;
277+
int cskill_aggressive;
278+
int cskill_no_pain;
279+
int cskill_easy_brain;
280+
int cskill_auto_use_hp;
281+
int cskill_easy_key;
282+
283+
void dsda_UpdateCustomSkill(int custom_skill_num) {
284+
// Reset custom skill
285+
skill_infos[custom_skill_num].flags = 0;
286+
skill_infos[custom_skill_num].respawn_time = 0;
287+
288+
// Get spawn filter value
289+
skill_infos[custom_skill_num].spawn_filter = dsda_GetCustomSpawnFilter(cskill_spawn_filter);;
290+
291+
// Get multiplier factors
292+
skill_infos[custom_skill_num].ammo_factor = dsda_GetCustomFactor(cskill_ammo_factor);
293+
skill_infos[custom_skill_num].damage_factor = dsda_GetCustomFactor(cskill_damage_factor);
294+
skill_infos[custom_skill_num].armor_factor = dsda_GetCustomFactor(cskill_armor_factor);
295+
skill_infos[custom_skill_num].health_factor = dsda_GetCustomFactor(cskill_health_factor);
296+
skill_infos[custom_skill_num].monster_health_factor = dsda_GetCustomFactor(cskill_monster_hp_factor);
297+
skill_infos[custom_skill_num].friend_health_factor = dsda_GetCustomFactor(cskill_friend_hp_factor);
298+
299+
// Get respawn time (if respawn is enabled)
300+
if (cskill_respawn) skill_infos[custom_skill_num].respawn_time = cskill_respawn_time;
301+
302+
// Add remaining flags
303+
if (cskill_coop_spawns) skill_infos[custom_skill_num].flags |= SI_SPAWN_MULTI;
304+
if (cskill_no_monsters) skill_infos[custom_skill_num].flags |= SI_NO_MONSTERS;
305+
if (cskill_fast_monsters) skill_infos[custom_skill_num].flags |= SI_FAST_MONSTERS;
306+
if (cskill_aggressive) skill_infos[custom_skill_num].flags |= SI_INSTANT_REACTION;
307+
if (cskill_no_pain) skill_infos[custom_skill_num].flags |= SI_NO_PAIN;
308+
if (cskill_easy_brain && !raven) skill_infos[custom_skill_num].flags |= SI_EASY_BOSS_BRAIN;
309+
if (cskill_auto_use_hp && raven) skill_infos[custom_skill_num].flags |= SI_AUTO_USE_HEALTH;
222310
}
223311

224312
static void dsda_ResetGameFlags(void)
@@ -271,3 +359,13 @@ void dsda_AlterGameFlags(void)
271359

272360
dsda_RefreshGameSkill();
273361
}
362+
363+
void dsda_CheckCustomSkill(void) {
364+
//if (started_demo)
365+
//return;
366+
367+
if (!allow_incompatibility || netgame)
368+
return;
369+
370+
customskill = true;
371+
}

prboom2/src/dsda/skill_info.h

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,24 @@
3333
#define SI_AUTO_USE_HEALTH 0x0400
3434
#define SI_NO_MONSTERS 0x1000
3535

36+
// Custom Skill variables
37+
extern int cskill_spawn_filter;
38+
extern int cskill_ammo_factor;
39+
extern int cskill_damage_factor;
40+
extern int cskill_armor_factor;
41+
extern int cskill_health_factor;
42+
extern int cskill_monster_hp_factor;
43+
extern int cskill_friend_hp_factor;
44+
extern int cskill_respawn;
45+
extern int cskill_respawn_time;
46+
extern int cskill_coop_spawns;
47+
extern int cskill_no_monsters;
48+
extern int cskill_fast_monsters;
49+
extern int cskill_aggressive;
50+
extern int cskill_no_pain;
51+
extern int cskill_easy_brain;
52+
extern int cskill_auto_use_hp;
53+
3654
typedef uint16_t skill_info_flags_t;
3755

3856
typedef struct {
@@ -60,6 +78,9 @@ extern int num_skills;
6078
void dsda_InitSkills(void);
6179
void dsda_RefreshGameSkill(void);
6280
void dsda_UpdateGameSkill(int skill);
81+
void dsda_UpdateCustomSkill(int custom_skill);
82+
void dsda_CheckCustomSkill(void);
83+
6384
void dsda_AlterGameFlags(void);
6485

6586
#endif

prboom2/src/dsda/wad_stats.c

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -268,18 +268,22 @@ void dsda_WadStatsExitMap(int missed_monsters) {
268268
int skill;
269269
int nightmare_skill;
270270
int best_normal_skill;
271+
int extra_skill;
271272
int nomo_flag;
273+
int skip_stats;
272274

273275
if (!current_map_stats || demoplayback)
274276
return;
275277

276-
nightmare_skill = num_skills;
277-
best_normal_skill = num_skills - 1;
278+
nightmare_skill = num_skills - customskill;
279+
best_normal_skill = num_skills - 1 - customskill;
278280

279281
// Get conditions for recording wad stats
282+
extra_skill = customskill && (gameskill == num_skills-1);
280283
nomo_flag = skill_info.flags & SI_NO_MONSTERS;
284+
skip_stats = extra_skill || nomo_flag;
281285

282-
if (!nomo_flag) {
286+
if (!skip_stats) {
283287
skill = gameskill + 1;
284288
if (skill > current_map_stats->best_skill) {
285289
if (current_map_stats->best_skill < best_normal_skill) {

prboom2/src/g_game.c

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,7 @@ int levels_completed;
185185
int longtics;
186186

187187
dboolean coop_spawns;
188+
dboolean skill_no_pistol_start;
188189

189190
// e6y
190191
// There is a new command-line switch "-shorttics".
@@ -1235,9 +1236,13 @@ static void G_DoLoadLevel (void)
12351236

12361237
// automatic pistol start when advancing from one level to the next
12371238
if (dsda_Flag(dsda_arg_pistolstart) || dsda_IntConfig(dsda_config_pistol_start))
1238-
if (allow_incompatibility)
1239+
if (!skill_no_pistol_start && allow_incompatibility)
12391240
G_PlayerReborn(0);
12401241

1242+
// Custom Skill - Pistol Start Override
1243+
if (skill_no_pistol_start)
1244+
skill_no_pistol_start = false;
1245+
12411246
// initialize the msecnode_t freelist. phares 3/25/98
12421247
// any nodes in the freelist are gone by now, cleared
12431248
// by Z_FreeTag() when the previous level ended or player
@@ -1492,7 +1497,7 @@ void G_Ticker (void)
14921497
{
14931498
case ga_loadlevel:
14941499
// force players to be initialized on level reload
1495-
if (!hexen)
1500+
if (!hexen && !skill_no_pistol_start)
14961501
for (i = 0; i < g_maxplayers; i++)
14971502
players[i].playerstate = PST_REBORN;
14981503
G_DoLoadLevel();
@@ -2625,6 +2630,21 @@ void G_DeferedInitNew(int skill, int episode, int map)
26252630
dsda_WatchDeferredInitNew(skill, episode, map);
26262631
}
26272632

2633+
// Custom Skill - Restart with loadout [Nugget]
2634+
void G_RestartWithLoadout(void)
2635+
{
2636+
gameaction = ga_loadlevel;
2637+
2638+
G_PlayerFinishLevel(consoleplayer);
2639+
2640+
if (automap_active)
2641+
AM_Stop(true);
2642+
2643+
AM_clearMarks();
2644+
2645+
skill_no_pistol_start = true;
2646+
}
2647+
26282648
/* cph -
26292649
* G_Compatibility
26302650
*

0 commit comments

Comments
 (0)