From 58b7bdd0e955284f6ec8130feb8d494facf9cbd5 Mon Sep 17 00:00:00 2001 From: Roman Fomin Date: Mon, 16 Sep 2024 17:59:39 +0700 Subject: [PATCH] make death use action demo compatible (#1910) --- src/g_game.c | 28 ++++++++++++++++++++++++++-- src/p_user.c | 37 ++++++++++++++----------------------- src/p_user.h | 1 + 3 files changed, 41 insertions(+), 25 deletions(-) diff --git a/src/g_game.c b/src/g_game.c index 19fe8176..d8b395d2 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -546,6 +546,28 @@ void G_PrepGyroTiccmd(void) } } +static boolean FilterDeathUseAction(void) +{ + if (players[consoleplayer].playerstate & PST_DEAD) + { + switch (death_use_action) + { + case death_use_nothing: + return true; + case death_use_reload: + if (!demoplayback && !demorecording && !netgame) + { + activate_death_use_reload = true; + } + return true; + default: + break; + } + } + + return false; +} + // // G_BuildTiccmd // Builds a ticcmd from all of the available inputs @@ -703,7 +725,8 @@ void G_BuildTiccmd(ticcmd_t* cmd) if (M_InputGameActive(input_use)) // [FG] mouse button for "use" { - cmd->buttons |= BT_USE; + if (!FilterDeathUseAction()) + cmd->buttons |= BT_USE; // clear double clicks if hit use button dclick = false; } @@ -811,7 +834,8 @@ void G_BuildTiccmd(ticcmd_t* cmd) if (dclick) { dclick = false; - cmd->buttons |= BT_USE; + if (!FilterDeathUseAction()) + cmd->buttons |= BT_USE; } // special buttons diff --git a/src/p_user.c b/src/p_user.c index 295ef53c..98f22801 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -31,7 +31,6 @@ #include "hu_stuff.h" #include "info.h" #include "m_cheat.h" -#include "m_input.h" #include "p_map.h" #include "p_mobj.h" #include "p_pspr.h" @@ -39,7 +38,6 @@ #include "p_user.h" #include "r_defs.h" #include "r_main.h" -#include "r_state.h" #include "st_stuff.h" static fixed_t PlayerSlope(player_t *player) @@ -259,6 +257,7 @@ void P_MovePlayer (player_t* player) #define ANG5 (ANG90/18) death_use_action_t death_use_action; +boolean activate_death_use_reload; // // P_DeathThink @@ -316,29 +315,21 @@ void P_DeathThink (player_t* player) if (player->cmd.buttons & BT_USE) { - if (demorecording || demoplayback || netgame) - player->playerstate = PST_REBORN; - else switch(death_use_action) + player->playerstate = PST_REBORN; + } + + if (activate_death_use_reload) + { + activate_death_use_reload = false; + + if (savegameslot >= 0) { - case death_use_default: - player->playerstate = PST_REBORN; - break; - case death_use_reload: - if (savegameslot >= 0) - { - char *file = G_SaveGameName(savegameslot); - G_LoadGame(file, savegameslot, false); - free(file); - // [Woof!] prevent on-death-action reloads from activating specials - M_InputGameDeactivate(input_use); - } - else - player->playerstate = PST_REBORN; - break; - case death_use_nothing: - default: - break; + char *file = G_SaveGameName(savegameslot); + G_LoadGame(file, savegameslot, false); + free(file); } + else + player->playerstate = PST_REBORN; } } diff --git a/src/p_user.h b/src/p_user.h index 2fafed16..ade8cdc2 100644 --- a/src/p_user.h +++ b/src/p_user.h @@ -41,6 +41,7 @@ typedef enum } death_use_action_t; extern death_use_action_t death_use_action; +extern boolean activate_death_use_reload; extern boolean onground; // whether player is on ground or in air