simplify matters in cheat code handling, again (#768)

One less level of function pointer indirection, still full clang-15 compatible.
This commit is contained in:
Fabian Greffrath 2022-10-14 21:28:49 +02:00 committed by GitHub
parent 004cd3928d
commit e413bb866a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 41 additions and 51 deletions

View File

@ -52,16 +52,16 @@
// //
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
static void cheat_mus(cheatarg_t arg); static void cheat_mus(char *buf);
static void cheat_choppers(); static void cheat_choppers();
static void cheat_god(); static void cheat_god();
static void cheat_fa(); static void cheat_fa();
static void cheat_k(); static void cheat_k();
static void cheat_kfa(); static void cheat_kfa();
static void cheat_noclip(); static void cheat_noclip();
static void cheat_pw(cheatarg_t arg); static void cheat_pw(int pw);
static void cheat_behold(); static void cheat_behold();
static void cheat_clev(cheatarg_t arg); static void cheat_clev(char *buf);
static void cheat_clev0(); static void cheat_clev0();
static void cheat_mypos(); static void cheat_mypos();
static void cheat_comp(); static void cheat_comp();
@ -74,11 +74,11 @@ static void cheat_hom();
static void cheat_fast(); static void cheat_fast();
static void cheat_key(); static void cheat_key();
static void cheat_keyx(); static void cheat_keyx();
static void cheat_keyxx(cheatarg_t arg); static void cheat_keyxx(int key);
static void cheat_weap(); static void cheat_weap();
static void cheat_weapx(cheatarg_t arg); static void cheat_weapx(char *buf);
static void cheat_ammo(); static void cheat_ammo();
static void cheat_ammox(cheatarg_t arg); static void cheat_ammox(char *buf);
static void cheat_smart(); static void cheat_smart();
static void cheat_pitch(); static void cheat_pitch();
static void cheat_nuke(); static void cheat_nuke();
@ -114,7 +114,7 @@ static void cheat_showfps(); // [FG] FPS counter widget
struct cheat_s cheat[] = { struct cheat_s cheat[] = {
{"idmus", "Change music", always, {"idmus", "Change music", always,
{cheat_mus}, {-2} }, {cheat_mus}, -2 },
{"idchoppers", "Chainsaw", not_net | not_demo, {"idchoppers", "Chainsaw", not_net | not_demo,
{cheat_choppers} }, {cheat_choppers} },
@ -141,31 +141,31 @@ struct cheat_s cheat[] = {
{cheat_noclip} }, {cheat_noclip} },
{"idbeholdo", NULL, not_net | not_demo | not_deh, {"idbeholdo", NULL, not_net | not_demo | not_deh,
{cheat_pw}, {NUMPOWERS} }, // [FG] disable all powerups at once {cheat_pw}, NUMPOWERS }, // [FG] disable all powerups at once
{"idbeholdv", "Invincibility", not_net | not_demo, {"idbeholdv", "Invincibility", not_net | not_demo,
{cheat_pw}, {pw_invulnerability} }, {cheat_pw}, pw_invulnerability },
{"idbeholds", "Berserk", not_net | not_demo, {"idbeholds", "Berserk", not_net | not_demo,
{cheat_pw}, {pw_strength} }, {cheat_pw}, pw_strength },
{"idbeholdi", "Invisibility", not_net | not_demo, {"idbeholdi", "Invisibility", not_net | not_demo,
{cheat_pw}, {pw_invisibility} }, {cheat_pw}, pw_invisibility },
{"idbeholdr", "Radiation Suit", not_net | not_demo, {"idbeholdr", "Radiation Suit", not_net | not_demo,
{cheat_pw}, {pw_ironfeet} }, {cheat_pw}, pw_ironfeet },
{"idbeholda", "Auto-map", not_net | not_demo, {"idbeholda", "Auto-map", not_net | not_demo,
{cheat_pw}, {pw_allmap} }, {cheat_pw}, pw_allmap },
{"idbeholdl", "Lite-Amp Goggles", not_net | not_demo, {"idbeholdl", "Lite-Amp Goggles", not_net | not_demo,
{cheat_pw}, {pw_infrared} }, {cheat_pw}, pw_infrared },
{"idbehold", "BEHOLD menu", not_net | not_demo, {"idbehold", "BEHOLD menu", not_net | not_demo,
{cheat_behold} }, {cheat_behold} },
{"idclev", "Level Warp", not_net | not_demo | not_menu, {"idclev", "Level Warp", not_net | not_demo | not_menu,
{cheat_clev}, {-2} }, {cheat_clev}, -2 },
{"idclev", "Level Warp", not_net | not_demo | not_menu, {"idclev", "Level Warp", not_net | not_demo | not_menu,
{cheat_clev0} }, {cheat_clev0} },
@ -204,34 +204,34 @@ struct cheat_s cheat[] = {
{cheat_keyx} }, {cheat_keyx} },
{"keyrc", NULL, not_net | not_demo, {"keyrc", NULL, not_net | not_demo,
{cheat_keyxx}, {it_redcard} }, {cheat_keyxx}, it_redcard },
{"keyyc", NULL, not_net | not_demo, {"keyyc", NULL, not_net | not_demo,
{cheat_keyxx}, {it_yellowcard} }, {cheat_keyxx}, it_yellowcard },
{"keybc", NULL, not_net | not_demo, {"keybc", NULL, not_net | not_demo,
{cheat_keyxx}, {it_bluecard} }, {cheat_keyxx}, it_bluecard },
{"keyrs", NULL, not_net | not_demo, {"keyrs", NULL, not_net | not_demo,
{cheat_keyxx}, {it_redskull} }, {cheat_keyxx}, it_redskull },
{"keyys", NULL, not_net | not_demo, {"keyys", NULL, not_net | not_demo,
{cheat_keyxx}, {it_yellowskull} }, {cheat_keyxx}, it_yellowskull },
{"keybs", NULL, not_net | not_demo, {"keybs", NULL, not_net | not_demo,
{cheat_keyxx}, {it_blueskull} }, // killough 2/16/98: end generalized keys {cheat_keyxx}, it_blueskull }, // killough 2/16/98: end generalized keys
{"weap", NULL, not_net | not_demo, {"weap", NULL, not_net | not_demo,
{cheat_weap} }, // killough 2/16/98: generalized weapon cheats {cheat_weap} }, // killough 2/16/98: generalized weapon cheats
{"weap", NULL, not_net | not_demo, {"weap", NULL, not_net | not_demo,
{cheat_weapx}, {-1} }, {cheat_weapx}, -1 },
{"ammo", NULL, not_net | not_demo, {"ammo", NULL, not_net | not_demo,
{cheat_ammo} }, {cheat_ammo} },
{"ammo", NULL, not_net | not_demo, {"ammo", NULL, not_net | not_demo,
{cheat_ammox}, {-1} }, // killough 2/16/98: end generalized weapons {cheat_ammox}, -1 }, // killough 2/16/98: end generalized weapons
{"tran", NULL, always, {"tran", NULL, always,
{cheat_tran} }, // invoke translucency // phares {cheat_tran} }, // invoke translucency // phares
@ -300,9 +300,8 @@ static void cheat_autoaim()
"Projectile autoaiming off"; "Projectile autoaiming off";
} }
static void cheat_mus(cheatarg_t arg) static void cheat_mus(char *buf)
{ {
char *buf = arg.s;
int musnum; int musnum;
//jff 3/20/98 note: this cheat allowed in netgame/demorecord //jff 3/20/98 note: this cheat allowed in netgame/demorecord
@ -464,9 +463,8 @@ static void cheat_noclip()
} }
// 'behold?' power-up cheats (modified for infinite duration -- killough) // 'behold?' power-up cheats (modified for infinite duration -- killough)
static void cheat_pw(cheatarg_t arg) static void cheat_pw(int pw)
{ {
int pw = arg.i;
if (pw == NUMPOWERS) if (pw == NUMPOWERS)
{ {
memset(plyr->powers, 0, sizeof(plyr->powers)); memset(plyr->powers, 0, sizeof(plyr->powers));
@ -510,9 +508,8 @@ static void cheat_clev0()
free(cur); free(cur);
} }
static void cheat_clev(cheatarg_t arg) static void cheat_clev(char *buf)
{ {
char *buf = arg.s;
int epsd, map; int epsd, map;
mapentry_t* entry; mapentry_t* entry;
@ -844,9 +841,8 @@ static void cheat_keyx()
plyr->message = "Card, Skull"; // Ty 03/27/98 - *not* externalized plyr->message = "Card, Skull"; // Ty 03/27/98 - *not* externalized
} }
static void cheat_keyxx(cheatarg_t arg) static void cheat_keyxx(int key)
{ {
int key = arg.i;
plyr->message = (plyr->cards[key] = !plyr->cards[key]) ? plyr->message = (plyr->cards[key] = !plyr->cards[key]) ?
"Key Added" : "Key Removed"; // Ty 03/27/98 - *not* externalized "Key Added" : "Key Removed"; // Ty 03/27/98 - *not* externalized
} }
@ -859,9 +855,8 @@ static void cheat_weap()
"Weapon number 1-9" : "Weapon number 1-8"; "Weapon number 1-9" : "Weapon number 1-8";
} }
static void cheat_weapx(cheatarg_t arg) static void cheat_weapx(char *buf)
{ {
char *buf = arg.s;
int w = *buf - '1'; int w = *buf - '1';
if ((w==wp_supershotgun && gamemode!=commercial) || // killough 2/28/98 if ((w==wp_supershotgun && gamemode!=commercial) || // killough 2/28/98
@ -869,7 +864,7 @@ static void cheat_weapx(cheatarg_t arg)
return; return;
if (w==wp_fist) // make '1' apply beserker strength toggle if (w==wp_fist) // make '1' apply beserker strength toggle
cheat_pw((cheatarg_t){.i = pw_strength}); cheat_pw(pw_strength);
else else
if (w >= 0 && w < NUMWEAPONS) if (w >= 0 && w < NUMWEAPONS)
{ {
@ -890,9 +885,8 @@ static void cheat_ammo()
plyr->message = "Ammo 1-4, Backpack"; // Ty 03/27/98 - *not* externalized plyr->message = "Ammo 1-4, Backpack"; // Ty 03/27/98 - *not* externalized
} }
static void cheat_ammox(cheatarg_t arg) static void cheat_ammox(char *buf)
{ {
char *buf = arg.s;
int a = *buf - '1'; int a = *buf - '1';
if (*buf == 'b') // Ty 03/27/98 - strings *not* externalized if (*buf == 'b') // Ty 03/27/98 - strings *not* externalized
if ((plyr->backpack = !plyr->backpack)) if ((plyr->backpack = !plyr->backpack))
@ -960,7 +954,7 @@ boolean M_FindCheats(int key)
{ {
*arg++ = tolower(key); // store key in arg buffer *arg++ = tolower(key); // store key in arg buffer
if (!--argsleft) // if last key in arg list, if (!--argsleft) // if last key in arg list,
cheat[cht].func.p1((cheatarg_t){.s = argbuf}); // process the arg buffer cheat[cht].func.s(argbuf); // process the arg buffer
return 1; // affirmative response return 1; // affirmative response
} }
@ -1006,18 +1000,18 @@ boolean M_FindCheats(int key)
!(cheat[i].when & beta_only && !beta_emulation) && !(cheat[i].when & beta_only && !beta_emulation) &&
!(cheat[i].when & not_deh && cheat[i].deh_modified)) !(cheat[i].when & not_deh && cheat[i].deh_modified))
{ {
if (cheat[i].arg.i < 0) // if additional args are required if (cheat[i].arg < 0) // if additional args are required
{ {
cht = i; // remember this cheat code cht = i; // remember this cheat code
arg = argbuf; // point to start of arg buffer arg = argbuf; // point to start of arg buffer
argsleft = -cheat[i].arg.i; // number of args expected argsleft = -cheat[i].arg; // number of args expected
ret = 1; // responder has eaten key ret = 1; // responder has eaten key
} }
else else
if (!matchedbefore) // allow only one cheat at a time if (!matchedbefore) // allow only one cheat at a time
{ {
matchedbefore = ret = 1; // responder has eaten key matchedbefore = ret = 1; // responder has eaten key
cheat[i].func.p1(cheat[i].arg); // call cheat handler cheat[i].func.i(cheat[i].arg); // call cheat handler
} }
} }
return ret; return ret;

View File

@ -31,19 +31,15 @@
#include "doomtype.h" #include "doomtype.h"
typedef union cheatarg_u
{
int i;
char *s;
} cheatarg_t;
typedef void (*cheatf_v)(); typedef void (*cheatf_v)();
typedef void (*cheatf_p1)(cheatarg_t); typedef void (*cheatf_i)(int i);
typedef void (*cheatf_s)(char *s);
typedef union typedef union
{ {
cheatf_v v; cheatf_v v;
cheatf_p1 p1; cheatf_i i;
cheatf_s s;
} cheatf_t; } cheatf_t;
// killough 4/16/98: Cheat table structure // killough 4/16/98: Cheat table structure
@ -62,7 +58,7 @@ extern struct cheat_s {
not_net = not_dm | not_coop not_net = not_dm | not_coop
} const when; } const when;
const cheatf_t func; const cheatf_t func;
const cheatarg_t arg; const int arg;
uint64_t code, mask; uint64_t code, mask;
boolean deh_modified; // killough 9/12/98 boolean deh_modified; // killough 9/12/98
} cheat[]; } cheat[];