Add "last used weapon" binding

This commit is contained in:
ceski 2024-09-17 15:29:41 -07:00
parent ede79db438
commit 6f6629ac56
7 changed files with 36 additions and 0 deletions

View File

@ -223,6 +223,9 @@ typedef struct player_s
int num_visitedlevels; int num_visitedlevels;
level_t *visitedlevels; level_t *visitedlevels;
// Last used weapon (last readyweapon).
weapontype_t lastweapon;
} player_t; } player_t;

View File

@ -318,6 +318,23 @@ static int G_NextWeapon(int direction)
return weapon_order_table[i].weapon_num; return weapon_order_table[i].weapon_num;
} }
static weapontype_t LastWeapon(void)
{
const weapontype_t weapon = players[consoleplayer].lastweapon;
if (weapon < wp_fist || weapon >= NUMWEAPONS || !WeaponSelectable(weapon))
{
return wp_nochange;
}
if (demo_compatibility && weapon == wp_supershotgun)
{
return wp_shotgun;
}
return weapon;
}
static weapontype_t WeaponSSG(void) static weapontype_t WeaponSSG(void)
{ {
const player_t *player = &players[consoleplayer]; const player_t *player = &players[consoleplayer];
@ -788,6 +805,10 @@ void G_BuildTiccmd(ticcmd_t* cmd)
boom_weapon_state_injection = false; boom_weapon_state_injection = false;
newweapon = P_SwitchWeapon(&players[consoleplayer]); // phares newweapon = P_SwitchWeapon(&players[consoleplayer]); // phares
} }
else if (M_InputGameActive(input_lastweapon))
{
newweapon = LastWeapon();
}
else else
{ // phares 02/26/98: Added gamemode checks { // phares 02/26/98: Added gamemode checks
// [FG] prev/next weapon keys and buttons // [FG] prev/next weapon keys and buttons
@ -2937,6 +2958,7 @@ void G_PlayerReborn(int player)
p->usedown = p->attackdown = true; // don't do anything immediately p->usedown = p->attackdown = true; // don't do anything immediately
p->playerstate = PST_LIVE; p->playerstate = PST_LIVE;
p->health = initial_health; // Ty 03/12/98 - use dehacked values p->health = initial_health; // Ty 03/12/98 - use dehacked values
p->lastweapon = wp_fist;
p->readyweapon = p->pendingweapon = wp_pistol; p->readyweapon = p->pendingweapon = wp_pistol;
p->weaponowned[wp_fist] = true; p->weaponowned[wp_fist] = true;
p->weaponowned[wp_pistol] = true; p->weaponowned[wp_pistol] = true;

View File

@ -699,6 +699,7 @@ void M_BindInputVariables(void)
BIND_INPUT(input_weapon8, "Switch to weapon 8 (Chainsaw)"); BIND_INPUT(input_weapon8, "Switch to weapon 8 (Chainsaw)");
BIND_INPUT(input_weapon9, "Switch to weapon 9 (Super Shotgun)"); BIND_INPUT(input_weapon9, "Switch to weapon 9 (Super Shotgun)");
BIND_INPUT(input_weapontoggle, "Switch between the two most-preferred weapons with ammo"); BIND_INPUT(input_weapontoggle, "Switch between the two most-preferred weapons with ammo");
BIND_INPUT(input_lastweapon, "Switch to last used weapon");
BIND_INPUT(input_menu_reloadlevel, "Restart current level/demo"); BIND_INPUT(input_menu_reloadlevel, "Restart current level/demo");
BIND_INPUT(input_menu_nextlevel, "Go to next level"); BIND_INPUT(input_menu_nextlevel, "Go to next level");

View File

@ -56,6 +56,7 @@ enum
input_weapon8, input_weapon8,
input_weapon9, input_weapon9,
input_weapontoggle, input_weapontoggle,
input_lastweapon,
input_menu_up, input_menu_up,
input_menu_down, input_menu_down,

View File

@ -1361,6 +1361,7 @@ static setup_menu_t keys_settings2[] = {
{"Chainsaw", S_INPUT, KB_X, M_SPC, {0}, m_scrn, input_weapon8}, {"Chainsaw", S_INPUT, KB_X, M_SPC, {0}, m_scrn, input_weapon8},
{"SSG", S_INPUT, KB_X, M_SPC, {0}, m_scrn, input_weapon9}, {"SSG", S_INPUT, KB_X, M_SPC, {0}, m_scrn, input_weapon9},
{"Best", S_INPUT, KB_X, M_SPC, {0}, m_scrn, input_weapontoggle}, {"Best", S_INPUT, KB_X, M_SPC, {0}, m_scrn, input_weapontoggle},
{"Last", S_INPUT, KB_X, M_SPC, {0}, m_scrn, input_lastweapon},
MI_GAP, MI_GAP,
// [FG] prev/next weapon keys and buttons // [FG] prev/next weapon keys and buttons
{"Prev", S_INPUT, KB_X, M_SPC, {0}, m_scrn, input_prevweapon}, {"Prev", S_INPUT, KB_X, M_SPC, {0}, m_scrn, input_prevweapon},

View File

@ -588,6 +588,7 @@ void A_Lower(player_t *player, pspdef_t *psp)
if (player->pendingweapon < NUMWEAPONS || !mbf21) if (player->pendingweapon < NUMWEAPONS || !mbf21)
{ {
player->lastweapon = player->readyweapon;
player->readyweapon = player->pendingweapon; player->readyweapon = player->pendingweapon;
} }

View File

@ -989,11 +989,15 @@ static void saveg_read_player_t(player_t *str)
level.map = saveg_read32(); level.map = saveg_read32();
array_push(str->visitedlevels, level); array_push(str->visitedlevels, level);
} }
// [Woof!]: weapontype_t lastweapon;
str->lastweapon = saveg_read_enum();
} }
else else
{ {
str->num_visitedlevels = 0; str->num_visitedlevels = 0;
array_clear(str->visitedlevels); array_clear(str->visitedlevels);
str->lastweapon = wp_nochange;
} }
} }
@ -1158,6 +1162,9 @@ static void saveg_write_player_t(player_t *str)
saveg_write32(level->episode); saveg_write32(level->episode);
saveg_write32(level->map); saveg_write32(level->map);
} }
// [Woof!]: weapontype_t lastweapon;
saveg_write_enum(str->lastweapon);
} }