Wrap laser level in class
Move enum laser_level_t to weapon.h for the new class.
This commit is contained in:
parent
144477f92a
commit
8d849b2b39
|
@ -131,25 +131,6 @@ enum weapon_type_t
|
|||
|
||||
#define MAX_LASER_LEVEL LASER_LEVEL_4 // Note, laser levels are numbered from 0.
|
||||
|
||||
enum laser_level_t
|
||||
{
|
||||
LASER_LEVEL_1,
|
||||
LASER_LEVEL_2,
|
||||
LASER_LEVEL_3,
|
||||
LASER_LEVEL_4,
|
||||
#if defined(DXX_BUILD_DESCENT_II)
|
||||
#define LASER_HELIX_FLAG0 4 // helix uses 3 bits for angle
|
||||
#define LASER_HELIX_FLAG1 8 // helix uses 3 bits for angle
|
||||
#define LASER_HELIX_FLAG2 16 // helix uses 3 bits for angle
|
||||
|
||||
#define LASER_HELIX_SHIFT 2 // how far to shift count to put in flags
|
||||
#define LASER_HELIX_MASK 7 // must match number of bits in flags
|
||||
LASER_LEVEL_5,
|
||||
LASER_LEVEL_6,
|
||||
#define MAX_SUPER_LASER_LEVEL LASER_LEVEL_6 // Note, laser levels are numbered from 0.
|
||||
#endif
|
||||
};
|
||||
|
||||
#if defined(DXX_BUILD_DESCENT_I)
|
||||
#define DXX_MAXIMUM_LASER_LEVEL LASER_LEVEL_4
|
||||
#elif defined(DXX_BUILD_DESCENT_II)
|
||||
|
|
|
@ -322,10 +322,10 @@ public:
|
|||
}
|
||||
};
|
||||
|
||||
static inline unsigned map_granted_flags_to_laser_level(const packed_spawn_granted_items &grant)
|
||||
static inline laser_level_t map_granted_flags_to_laser_level(const packed_spawn_granted_items &grant)
|
||||
{
|
||||
/* Laser level in lowest bits */
|
||||
return grant.mask & ((1 << DXX_GRANT_LASER_LEVEL_BITS) - 1);
|
||||
return laser_level_t(grant.mask & ((1 << DXX_GRANT_LASER_LEVEL_BITS) - 1));
|
||||
}
|
||||
uint_fast32_t map_granted_flags_to_player_flags(packed_spawn_granted_items grant);
|
||||
uint_fast32_t map_granted_flags_to_primary_weapon_flags(packed_spawn_granted_items grant);
|
||||
|
@ -346,7 +346,7 @@ class powerup_cap_state
|
|||
array_type m_powerups, m_max;
|
||||
static powerup_type_t map_powerup_type_to_index(powerup_type_t);
|
||||
static powerup_type_t map_powerup_4pack(powerup_type_t);
|
||||
void cap_laser_powerup_level(uint8_t &player_level, powerup_type_t idx, uint_fast32_t level_bias) const;
|
||||
void cap_laser_powerup_level(stored_laser_level &player_level, powerup_type_t idx, uint_fast32_t level_bias) const;
|
||||
enum which
|
||||
{
|
||||
current,
|
||||
|
@ -383,7 +383,7 @@ public:
|
|||
{
|
||||
m_max[type] = value;
|
||||
}
|
||||
void cap_laser_level(uint8_t &player_level) const;
|
||||
void cap_laser_level(stored_laser_level &player_level) const;
|
||||
void cap_secondary_ammo(powerup_type_t type, uint16_t &player_ammo) const;
|
||||
void cap_flag(uint32_t &player_flags, uint32_t powerup_flag, powerup_type_t idx) const;
|
||||
bool can_add_mapped_powerup(const powerup_type_t type) const
|
||||
|
|
|
@ -175,7 +175,7 @@ struct player : public prohibit_void_ptr<player>
|
|||
fix shields; // shields remaining (protection)
|
||||
ubyte lives; // Lives remaining, 0 = game over.
|
||||
sbyte level; // Current level player is playing. (must be signed for secret levels)
|
||||
ubyte laser_level; // Current level of the laser.
|
||||
stored_laser_level laser_level; // Current level of the laser.
|
||||
sbyte starting_level; // What level the player started on.
|
||||
objnum_t killer_objnum; // Who killed me.... (-1 if no one)
|
||||
#if defined(DXX_BUILD_DESCENT_I)
|
||||
|
|
|
@ -39,6 +39,64 @@ COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED.
|
|||
|
||||
enum powerup_type_t : uint8_t;
|
||||
|
||||
enum laser_level_t : uint8_t
|
||||
{
|
||||
LASER_LEVEL_1,
|
||||
LASER_LEVEL_2,
|
||||
LASER_LEVEL_3,
|
||||
LASER_LEVEL_4,
|
||||
#if defined(DXX_BUILD_DESCENT_II)
|
||||
#define LASER_HELIX_FLAG0 4 // helix uses 3 bits for angle
|
||||
#define LASER_HELIX_FLAG1 8 // helix uses 3 bits for angle
|
||||
#define LASER_HELIX_FLAG2 16 // helix uses 3 bits for angle
|
||||
#define LASER_HELIX_SHIFT 2 // how far to shift count to put in flags
|
||||
#define LASER_HELIX_MASK 7 // must match number of bits in flags
|
||||
LASER_LEVEL_5,
|
||||
LASER_LEVEL_6,
|
||||
#define MAX_SUPER_LASER_LEVEL LASER_LEVEL_6 // Note, laser levels are numbered from 0.
|
||||
#endif
|
||||
};
|
||||
|
||||
class stored_laser_level
|
||||
{
|
||||
laser_level_t m_level;
|
||||
public:
|
||||
stored_laser_level() = default;
|
||||
constexpr stored_laser_level(const laser_level_t l) :
|
||||
m_level(l)
|
||||
{
|
||||
}
|
||||
constexpr explicit stored_laser_level(uint8_t i) :
|
||||
m_level(static_cast<laser_level_t>(i))
|
||||
{
|
||||
}
|
||||
operator laser_level_t() const
|
||||
{
|
||||
return m_level;
|
||||
}
|
||||
/* Assume no overflow/underflow.
|
||||
* This was never checked when it was a simple ubyte.
|
||||
*/
|
||||
stored_laser_level &operator+=(uint8_t i)
|
||||
{
|
||||
m_level = static_cast<laser_level_t>(static_cast<uint8_t>(m_level) + i);
|
||||
return *this;
|
||||
}
|
||||
stored_laser_level &operator-=(uint8_t i)
|
||||
{
|
||||
m_level = static_cast<laser_level_t>(static_cast<uint8_t>(m_level) - i);
|
||||
return *this;
|
||||
}
|
||||
stored_laser_level &operator++()
|
||||
{
|
||||
return *this += 1;
|
||||
}
|
||||
stored_laser_level &operator--()
|
||||
{
|
||||
return *this -= 1;
|
||||
}
|
||||
};
|
||||
|
||||
#if defined(DXX_BUILD_DESCENT_I) || defined(DXX_BUILD_DESCENT_II)
|
||||
struct weapon_info : prohibit_void_ptr<weapon_info>
|
||||
{
|
||||
|
|
|
@ -1389,7 +1389,7 @@ static int maybe_steal_primary_weapon(int player_num, int weapon_num)
|
|||
Stolen_items[Stolen_item_index] = Primary_weapon_to_powerup[weapon_num];
|
||||
}
|
||||
thief_message("%s level decreased!", PRIMARY_WEAPON_NAMES(weapon_num)); // Danger! Danger! Use of literal! Danger!
|
||||
Players[player_num].laser_level--;
|
||||
-- Players[player_num].laser_level;
|
||||
digi_play_sample_once(SOUND_WEAPON_STOLEN, F1_0);
|
||||
return 1;
|
||||
}
|
||||
|
|
|
@ -1861,7 +1861,7 @@ void drop_player_eggs(const vobjptridx_t playerobj)
|
|||
{
|
||||
if (plr.laser_level <= granted_laser_level)
|
||||
/* All levels were from grant */
|
||||
plr.laser_level = 0;
|
||||
plr.laser_level = LASER_LEVEL_1;
|
||||
#if defined(DXX_BUILD_DESCENT_II)
|
||||
else if (granted_laser_level > MAX_LASER_LEVEL)
|
||||
{
|
||||
|
|
|
@ -1788,7 +1788,7 @@ public:
|
|||
DXX_##VERB##_NUMBER("Shields", opt_shields, menu_fix_wrapper(plr.shields), 0, 200) \
|
||||
DXX_##VERB##_TEXT(TXT_SCORE, opt_txt_score) \
|
||||
DXX_##VERB##_INPUT(score_text, opt_score) \
|
||||
DXX_##VERB##_NUMBER("Laser Level", opt_laser_level, menu_number_bias_wrapper(plr.laser_level, 1), LASER_LEVEL_1 + 1, DXX_MAXIMUM_LASER_LEVEL + 1) \
|
||||
DXX_##VERB##_NUMBER("Laser Level", opt_laser_level, menu_number_bias_wrapper(plr_laser_level, 1), LASER_LEVEL_1 + 1, DXX_MAXIMUM_LASER_LEVEL + 1) \
|
||||
DXX_##VERB##_NUMBER("Concussion", opt_concussion, plr.secondary_ammo[CONCUSSION_INDEX], 0, 200) \
|
||||
|
||||
static void do_cheat_menu()
|
||||
|
@ -1801,10 +1801,12 @@ static void do_cheat_menu()
|
|||
char score_text[sizeof("2147483647")];
|
||||
auto &plr = Players[Player_num];
|
||||
snprintf(score_text, sizeof(score_text), "%d", plr.score);
|
||||
uint8_t plr_laser_level = plr.laser_level;
|
||||
DXX_WIMP_MENU(ADD);
|
||||
mmn = newmenu_do("Wimp Menu",NULL,m, unused_newmenu_subfunction, unused_newmenu_userdata);
|
||||
if (mmn > -1 ) {
|
||||
DXX_WIMP_MENU(READ);
|
||||
plr.laser_level = laser_level_t(plr_laser_level);
|
||||
char *p;
|
||||
auto ul = strtoul(score_text, &p, 10);
|
||||
if (!*p)
|
||||
|
|
|
@ -275,7 +275,7 @@ void init_player_stats_game(ubyte pnum)
|
|||
Players[pnum].hostages_rescued_total = 0;
|
||||
Players[pnum].hostages_level = 0;
|
||||
Players[pnum].hostages_total = 0;
|
||||
Players[pnum].laser_level = 0;
|
||||
Players[pnum].laser_level = LASER_LEVEL_1;
|
||||
Players[pnum].flags = 0;
|
||||
|
||||
init_player_stats_new_ship(pnum);
|
||||
|
|
|
@ -222,19 +222,19 @@ const char multi_allow_powerup_text[MULTI_ALLOW_POWERUP_MAX][MULTI_ALLOW_POWERUP
|
|||
for_each_netflag_value(define_netflag_string)
|
||||
};
|
||||
|
||||
void powerup_cap_state::cap_laser_powerup_level(uint8_t &player_level, const powerup_type_t type, const uint_fast32_t level_bias) const
|
||||
void powerup_cap_state::cap_laser_powerup_level(stored_laser_level &player_level, const powerup_type_t type, const uint_fast32_t level_bias) const
|
||||
{
|
||||
const uint_fast32_t current_in_mine = get_current(type);
|
||||
const uint_fast32_t maximum_allowed = get_max(type);
|
||||
const uint_fast32_t player_would_drop = player_level - level_bias;
|
||||
if (player_would_drop + current_in_mine <= maximum_allowed)
|
||||
return;
|
||||
const uint8_t capped = (current_in_mine < maximum_allowed) ? static_cast<uint8_t>(maximum_allowed - current_in_mine + level_bias) : 0;
|
||||
const auto capped = (current_in_mine < maximum_allowed) ? stored_laser_level(maximum_allowed - current_in_mine + level_bias) : stored_laser_level(LASER_LEVEL_1);
|
||||
player_level = capped;
|
||||
con_printf(CON_VERBOSE, "Capping laser due to powerup cap: current=%u max=%u was=%u now=%hu", get_current(type), get_max(type), static_cast<unsigned>(player_would_drop), capped);
|
||||
con_printf(CON_VERBOSE, "Capping laser due to powerup cap: current=%u max=%u was=%u capped=%u", get_current(type), get_max(type), static_cast<unsigned>(player_would_drop), static_cast<laser_level_t>(capped));
|
||||
}
|
||||
|
||||
void powerup_cap_state::cap_laser_level(uint8_t &player_level) const
|
||||
void powerup_cap_state::cap_laser_level(stored_laser_level &player_level) const
|
||||
{
|
||||
#if defined(DXX_BUILD_DESCENT_II)
|
||||
if (player_level > MAX_LASER_LEVEL)
|
||||
|
@ -1687,7 +1687,7 @@ static void multi_do_player_deres(const playernum_t pnum, const ubyte *buf)
|
|||
#endif
|
||||
Players[pnum].primary_weapon_flags = GET_WEAPON_FLAGS(buf,count);
|
||||
Players[pnum].secondary_weapon_flags = GET_WEAPON_FLAGS(buf,count);
|
||||
Players[pnum].laser_level = buf[count]; count++;
|
||||
Players[pnum].laser_level = stored_laser_level(buf[count]); count++;
|
||||
Players[pnum].secondary_ammo[HOMING_INDEX] = buf[count]; count++;
|
||||
Players[pnum].secondary_ammo[CONCUSSION_INDEX] = buf[count];count++;
|
||||
Players[pnum].secondary_ammo[SMART_INDEX] = buf[count]; count++;
|
||||
|
|
|
@ -1607,7 +1607,7 @@ enum purpose_type
|
|||
|
||||
static int newdemo_read_demo_start(enum purpose_type purpose)
|
||||
{
|
||||
sbyte i=0, version=0, game_type=0, laser_level=0, c=0;
|
||||
sbyte i=0, version=0, game_type=0, c=0;
|
||||
ubyte energy=0, shield=0;
|
||||
char current_mission[9];
|
||||
fix nd_GameTime32 = 0;
|
||||
|
@ -1781,7 +1781,8 @@ static int newdemo_read_demo_start(enum purpose_type purpose)
|
|||
nd_write_short(i);
|
||||
}
|
||||
|
||||
nd_read_byte(&laser_level);
|
||||
nd_read_byte(&i);
|
||||
const stored_laser_level laser_level(i);
|
||||
if ((purpose != PURPOSE_REWRITE) && (laser_level != Players[Player_num].laser_level)) {
|
||||
Players[Player_num].laser_level = laser_level;
|
||||
update_laser_weapon_info();
|
||||
|
@ -2925,10 +2926,10 @@ static int newdemo_read_frame_information(int rewrite)
|
|||
break;
|
||||
}
|
||||
if ((Newdemo_vcr_state == ND_STATE_REWINDING) || (Newdemo_vcr_state == ND_STATE_ONEFRAMEBACKWARD)) {
|
||||
Players[Player_num].laser_level = old_level;
|
||||
Players[Player_num].laser_level = stored_laser_level(old_level);
|
||||
update_laser_weapon_info();
|
||||
} else if ((Newdemo_vcr_state == ND_STATE_PLAYBACK) || (Newdemo_vcr_state == ND_STATE_FASTFORWARD) || (Newdemo_vcr_state == ND_STATE_ONEFRAMEFORWARD)) {
|
||||
Players[Player_num].laser_level = new_level;
|
||||
Players[Player_num].laser_level = stored_laser_level(new_level);
|
||||
update_laser_weapon_info();
|
||||
}
|
||||
break;
|
||||
|
@ -3160,7 +3161,7 @@ void newdemo_goto_beginning()
|
|||
void newdemo_goto_end(int to_rewrite)
|
||||
{
|
||||
short frame_length=0, byte_count=0, bshort=0;
|
||||
sbyte level=0, bbyte=0, laser_level=0, c=0, cloaked=0;
|
||||
sbyte level=0, bbyte=0, c=0, cloaked=0;
|
||||
ubyte energy=0, shield=0;
|
||||
int loc=0, bint=0;
|
||||
|
||||
|
@ -3249,7 +3250,9 @@ void newdemo_goto_end(int to_rewrite)
|
|||
}
|
||||
range_for (auto &i, Players[Player_num].secondary_ammo)
|
||||
nd_read_short((short *)&(i));
|
||||
nd_read_byte(&laser_level);
|
||||
int8_t i;
|
||||
nd_read_byte(&i);
|
||||
const stored_laser_level laser_level(i);
|
||||
if (laser_level != Players[Player_num].laser_level) {
|
||||
Players[Player_num].laser_level = laser_level;
|
||||
if (!to_rewrite)
|
||||
|
|
|
@ -293,7 +293,7 @@ int do_powerup(const vobjptridx_t obj)
|
|||
} else {
|
||||
if (Newdemo_state == ND_STATE_RECORDING)
|
||||
newdemo_record_laser_level(Players[Player_num].laser_level, Players[Player_num].laser_level + 1);
|
||||
Players[Player_num].laser_level++;
|
||||
++ Players[Player_num].laser_level;
|
||||
powerup_basic(10, 0, 10, LASER_SCORE, "%s %s %d",TXT_LASER,TXT_BOOSTED_TO, Players[Player_num].laser_level+1);
|
||||
update_laser_weapon_info();
|
||||
pick_up_primary (LASER_INDEX);
|
||||
|
@ -571,7 +571,7 @@ int do_powerup(const vobjptridx_t obj)
|
|||
|
||||
if (Players[Player_num].laser_level <= MAX_LASER_LEVEL)
|
||||
Players[Player_num].laser_level = MAX_LASER_LEVEL;
|
||||
Players[Player_num].laser_level++;
|
||||
++ Players[Player_num].laser_level;
|
||||
if (Newdemo_state == ND_STATE_RECORDING)
|
||||
newdemo_record_laser_level(old_level, Players[Player_num].laser_level);
|
||||
powerup_basic(10, 0, 10, LASER_SCORE, "Super Boost to Laser level %d",Players[Player_num].laser_level+1);
|
||||
|
|
|
@ -527,7 +527,7 @@ static void state_player_rw_to_player(const player_rw *pl_rw, player *pl)
|
|||
pl->shields = pl_rw->shields;
|
||||
pl->lives = pl_rw->lives;
|
||||
pl->level = pl_rw->level;
|
||||
pl->laser_level = pl_rw->laser_level;
|
||||
pl->laser_level = stored_laser_level(pl_rw->laser_level);
|
||||
pl->starting_level = pl_rw->starting_level;
|
||||
pl->killer_objnum = pl_rw->killer_objnum;
|
||||
pl->primary_weapon_flags = pl_rw->primary_weapon_flags;
|
||||
|
|
Loading…
Reference in a new issue