Use primary_weapon_index_t for pick_up_primary

This commit is contained in:
Kp 2021-01-25 00:45:07 +00:00
parent 2196f6add5
commit 5d0d9dcc1a
3 changed files with 21 additions and 20 deletions

View file

@ -195,7 +195,7 @@ has_weapon_result player_has_secondary_weapon(const player_info &, secondary_wea
//called when one of these weapons is picked up
//when you pick up a secondary, you always get the weapon & ammo for it
int pick_up_primary(player_info &, int weapon_index);
int pick_up_primary(player_info &, primary_weapon_index_t weapon_index);
int pick_up_secondary(player_info &, secondary_weapon_index_t weapon_index, int count, const control_info &Controls);
//called when a primary weapon is picked up

View file

@ -218,7 +218,7 @@ static int pick_up_energy(player_info &player_info)
return used;
}
static int pick_up_primary_or_energy(player_info &player_info, int weapon_index)
static int pick_up_primary_or_energy(player_info &player_info, const primary_weapon_index_t weapon_index)
{
const auto used = pick_up_primary(player_info, weapon_index);
if (used || (Game_mode & GM_MULTI))

View file

@ -282,7 +282,7 @@ constexpr std::array<uint8_t, MAX_SECONDARY_WEAPONS + 1> DefaultSecondaryOrder={
//flags whether the last time we use this weapon, it was the 'super' version
#endif
static unsigned get_mapped_weapon_index(const player_info &player_info, const primary_weapon_index_t weapon_index)
static primary_weapon_index_t get_mapped_weapon_index(const player_info &player_info, const primary_weapon_index_t weapon_index)
{
#if defined(DXX_BUILD_DESCENT_I)
(void)player_info;
@ -408,13 +408,12 @@ void InitWeaponOrdering ()
namespace {
static uint_fast32_t POrderList(uint_fast32_t num);
static uint_fast32_t SOrderList(uint_fast32_t num);
static uint_fast32_t POrderList(primary_weapon_index_t num);
static uint_fast32_t SOrderList(secondary_weapon_index_t num);
class cycle_weapon_state
{
public:
static constexpr std::integral_constant<uint8_t, 255> cycle_never_autoselect_below{};
static constexpr char DXX_WEAPON_TEXT_NEVER_AUTOSELECT[] = "--- Never autoselect below ---";
__attribute_cold
__attribute_noreturn
@ -423,9 +422,10 @@ public:
class cycle_primary_state : public cycle_weapon_state
{
using weapon_index_type = primary_weapon_index_t;
player_info &pl_info;
public:
using weapon_index_type = primary_weapon_index_t;
static constexpr std::integral_constant<weapon_index_type, weapon_index_type{255}> cycle_never_autoselect_below{};
cycle_primary_state(player_info &p) :
pl_info(p)
{
@ -433,7 +433,7 @@ public:
static constexpr std::integral_constant<uint_fast32_t, MAX_PRIMARY_WEAPONS> max_weapons{};
static constexpr char reorder_title[] = "Reorder Primary";
static constexpr char error_weapon_list_corrupt[] = "primary weapon list corrupt";
static uint_fast32_t get_cycle_position(uint_fast32_t i)
static uint_fast32_t get_cycle_position(primary_weapon_index_t i)
{
return POrderList(i);
}
@ -483,9 +483,10 @@ public:
class cycle_secondary_state : public cycle_weapon_state
{
using weapon_index_type = secondary_weapon_index_t;
player_info &pl_info;
public:
using weapon_index_type = secondary_weapon_index_t;
static constexpr std::integral_constant<weapon_index_type, weapon_index_type{255}> cycle_never_autoselect_below{};
cycle_secondary_state(player_info &p) :
pl_info(p)
{
@ -493,7 +494,7 @@ public:
static constexpr std::integral_constant<uint_fast32_t, MAX_SECONDARY_WEAPONS> max_weapons{};
static constexpr char reorder_title[] = "Reorder Secondary";
static constexpr char error_weapon_list_corrupt[] = "secondary weapon list corrupt";
static uint_fast32_t get_cycle_position(uint_fast32_t i)
static uint_fast32_t get_cycle_position(secondary_weapon_index_t i)
{
return SOrderList(i);
}
@ -529,7 +530,7 @@ void cycle_weapon_state::report_runtime_error(const char *const p)
}
template <typename T>
void CycleWeapon(T t, const uint_fast32_t effective_weapon)
void CycleWeapon(T t, const typename T::weapon_index_type effective_weapon)
{
auto cur_order_slot = t.get_cycle_position(effective_weapon);
const auto autoselect_order_slot = t.get_cycle_position(t.cycle_never_autoselect_below);
@ -939,10 +940,10 @@ void delayed_autoselect(player_info &player_info, const control_info &Controls)
namespace {
static void maybe_autoselect_primary_weapon(player_info &player_info, int weapon_index, const control_info &Controls)
static void maybe_autoselect_primary_weapon(player_info &player_info, primary_weapon_index_t weapon_index, const control_info &Controls)
{
const auto want_switch = [weapon_index, &player_info]{
const auto cutpoint = POrderList(255);
const auto cutpoint = POrderList(cycle_primary_state::cycle_never_autoselect_below);
const auto weapon_order = POrderList(weapon_index);
return weapon_order < cutpoint && weapon_order < POrderList(get_mapped_weapon_index(player_info, player_info.Primary_weapon.get_delayed()));
};
@ -951,7 +952,7 @@ static void maybe_autoselect_primary_weapon(player_info &player_info, int weapon
if (PlayerCfg.NoFireAutoselect == FiringAutoselectMode::Delayed)
{
if (want_switch())
player_info.Primary_weapon.set_delayed(static_cast<primary_weapon_index_t>(weapon_index));
player_info.Primary_weapon.set_delayed(weapon_index);
}
}
else if (want_switch())
@ -989,7 +990,7 @@ int pick_up_secondary(player_info &player_info, secondary_weapon_index_t weapon_
const auto weapon_order = SOrderList(weapon_index);
auto &Secondary_weapon = player_info.Secondary_weapon;
const auto want_switch = [weapon_order, &secondary_ammo, &Secondary_weapon]{
return weapon_order < SOrderList(255) && (
return weapon_order < SOrderList(cycle_secondary_state::cycle_never_autoselect_below) && (
secondary_ammo[Secondary_weapon.get_delayed()] == 0 ||
weapon_order < SOrderList(Secondary_weapon.get_delayed())
);
@ -1074,12 +1075,12 @@ namespace dsx {
namespace {
uint_fast32_t POrderList (uint_fast32_t num)
uint_fast32_t POrderList (primary_weapon_index_t num)
{
return search_weapon_order_list<cycle_primary_state>(num);
}
uint_fast32_t SOrderList (uint_fast32_t num)
uint_fast32_t SOrderList (secondary_weapon_index_t num)
{
return search_weapon_order_list<cycle_secondary_state>(num);
}
@ -1088,7 +1089,7 @@ uint_fast32_t SOrderList (uint_fast32_t num)
//called when a primary weapon is picked up
//returns true if actually picked up
int pick_up_primary(player_info &player_info, int weapon_index)
int pick_up_primary(player_info &player_info, const primary_weapon_index_t weapon_index)
{
ushort flag = HAS_PRIMARY_FLAG(weapon_index);
@ -1118,7 +1119,7 @@ void check_to_use_primary_super_laser(player_info &player_info)
{
const auto weapon_index = primary_weapon_index_t::SUPER_LASER_INDEX;
const auto pwi = POrderList(weapon_index);
if (pwi < POrderList(255) &&
if (pwi < POrderList(cycle_primary_state::cycle_never_autoselect_below) &&
pwi < POrderList(player_info.Primary_weapon))
{
select_primary_weapon(player_info, nullptr, primary_weapon_index_t::LASER_INDEX, 1);
@ -1140,7 +1141,7 @@ static void maybe_autoselect_vulcan_weapon(player_info &player_info)
const auto primary_weapon_flags = player_info.primary_weapon_flags;
if (!(primary_weapon_flags & weapon_flag_mask))
return;
const auto cutpoint = POrderList(255);
const auto cutpoint = POrderList(cycle_primary_state::cycle_never_autoselect_below);
auto weapon_index = primary_weapon_index_t::VULCAN_INDEX;
#if defined(DXX_BUILD_DESCENT_I)
const auto weapon_order_vulcan = POrderList(primary_weapon_index_t::VULCAN_INDEX);