From 8d849b2b39d5f5fe88774ff29f062b23a072d4cd Mon Sep 17 00:00:00 2001 From: Kp Date: Sun, 26 Apr 2015 20:15:56 +0000 Subject: [PATCH] Wrap laser level in class Move enum laser_level_t to weapon.h for the new class. --- common/main/laser.h | 19 ------------ common/main/multi.h | 8 ++--- common/main/player.h | 2 +- common/main/weapon.h | 58 +++++++++++++++++++++++++++++++++++++ d2x-rebirth/main/escort.cpp | 2 +- similar/main/collide.cpp | 2 +- similar/main/gamecntl.cpp | 4 ++- similar/main/gameseq.cpp | 2 +- similar/main/multi.cpp | 10 +++---- similar/main/newdemo.cpp | 15 ++++++---- similar/main/powerup.cpp | 4 +-- similar/main/state.cpp | 2 +- 12 files changed, 86 insertions(+), 42 deletions(-) diff --git a/common/main/laser.h b/common/main/laser.h index 648cfdc4f..3e842a457 100644 --- a/common/main/laser.h +++ b/common/main/laser.h @@ -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) diff --git a/common/main/multi.h b/common/main/multi.h index c38672ef0..88107fea5 100644 --- a/common/main/multi.h +++ b/common/main/multi.h @@ -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 diff --git a/common/main/player.h b/common/main/player.h index cba7c9b97..7f59a11ca 100644 --- a/common/main/player.h +++ b/common/main/player.h @@ -175,7 +175,7 @@ struct player : public prohibit_void_ptr 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) diff --git a/common/main/weapon.h b/common/main/weapon.h index 17335a6f9..819d91ac9 100644 --- a/common/main/weapon.h +++ b/common/main/weapon.h @@ -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(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(static_cast(m_level) + i); + return *this; + } + stored_laser_level &operator-=(uint8_t i) + { + m_level = static_cast(static_cast(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 { diff --git a/d2x-rebirth/main/escort.cpp b/d2x-rebirth/main/escort.cpp index 6b95a17f9..7ad31fa5b 100644 --- a/d2x-rebirth/main/escort.cpp +++ b/d2x-rebirth/main/escort.cpp @@ -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; } diff --git a/similar/main/collide.cpp b/similar/main/collide.cpp index d5ad89ef0..e70b61d54 100644 --- a/similar/main/collide.cpp +++ b/similar/main/collide.cpp @@ -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) { diff --git a/similar/main/gamecntl.cpp b/similar/main/gamecntl.cpp index d737c69cc..d2ef5ea23 100644 --- a/similar/main/gamecntl.cpp +++ b/similar/main/gamecntl.cpp @@ -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) diff --git a/similar/main/gameseq.cpp b/similar/main/gameseq.cpp index 8457dc7a5..5ab79b2d8 100644 --- a/similar/main/gameseq.cpp +++ b/similar/main/gameseq.cpp @@ -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); diff --git a/similar/main/multi.cpp b/similar/main/multi.cpp index e2ca52740..dd4495d44 100644 --- a/similar/main/multi.cpp +++ b/similar/main/multi.cpp @@ -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(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(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(player_would_drop), static_cast(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++; diff --git a/similar/main/newdemo.cpp b/similar/main/newdemo.cpp index 46ae66de2..db69a6164 100644 --- a/similar/main/newdemo.cpp +++ b/similar/main/newdemo.cpp @@ -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) diff --git a/similar/main/powerup.cpp b/similar/main/powerup.cpp index 97a9efd01..31d9fed61 100644 --- a/similar/main/powerup.cpp +++ b/similar/main/powerup.cpp @@ -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); diff --git a/similar/main/state.cpp b/similar/main/state.cpp index bb08f4a56..d2a043abf 100644 --- a/similar/main/state.cpp +++ b/similar/main/state.cpp @@ -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;