Wrap laser level in class

Move enum laser_level_t to weapon.h for the new class.
This commit is contained in:
Kp 2015-04-26 20:15:56 +00:00
parent 144477f92a
commit 8d849b2b39
12 changed files with 86 additions and 42 deletions

View file

@ -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)

View file

@ -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

View file

@ -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)

View file

@ -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>
{

View file

@ -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;
}

View file

@ -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)
{

View file

@ -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)

View file

@ -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);

View file

@ -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++;

View file

@ -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)

View file

@ -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);

View file

@ -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;