diff --git a/common/main/multibot.h b/common/main/multibot.h index a693e575c..8e0392737 100644 --- a/common/main/multibot.h +++ b/common/main/multibot.h @@ -33,18 +33,26 @@ COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED. #include "fwd-vecmat.h" #include "robot.h" +namespace dcx { + +enum class multi_send_robot_position_priority : uint8_t +{ + _0, + _1, + _2, +}; + constexpr std::integral_constant MAX_ROBOTS_CONTROLLED{}; constexpr std::integral_constant HANDS_OFF_PERIOD{}; // i.e. one slow above max extern std::array robot_controlled; -namespace dcx { extern std::array robot_agitation; extern std::bitset robot_fired; } #ifdef dsx int multi_can_move_robot(vmobjptridx_t objnum, int agitation); -void multi_send_robot_position(object &objnum, int fired); +void multi_send_robot_position(object &objnum, multi_send_robot_position_priority fired); void multi_send_robot_fire(vmobjptridx_t objnum, int gun_num, const vms_vector &fire); void multi_send_claim_robot(vmobjptridx_t objnum); void multi_send_robot_explode(imobjptridx_t objnum, objnum_t killer); diff --git a/similar/main/ai.cpp b/similar/main/ai.cpp index 4509351da..01af35596 100644 --- a/similar/main/ai.cpp +++ b/similar/main/ai.cpp @@ -2726,9 +2726,7 @@ static void do_d2_boss_stuff(fvmsegptridx &vmsegptridx, const vmobjptridx_t objp static void ai_multi_send_robot_position(object &obj, int force) { if (Game_mode & GM_MULTI) - { - multi_send_robot_position(obj, force != -1); - } + multi_send_robot_position(obj, force != -1 ? multi_send_robot_position_priority::_2 : multi_send_robot_position_priority::_1); return; } diff --git a/similar/main/multibot.cpp b/similar/main/multibot.cpp index 2383dfde0..8e2a63df1 100644 --- a/similar/main/multibot.cpp +++ b/similar/main/multibot.cpp @@ -61,11 +61,13 @@ COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED. namespace dcx { namespace { -std::array robot_send_pending; +std::array robot_send_pending; } +std::array robot_controlled; std::array robot_agitation; std::bitset robot_fired; } + namespace dsx { namespace { static int multi_add_controlled_robot(vmobjptridx_t objnum, int agitation); @@ -93,7 +95,6 @@ static void multi_delete_controlled_robot(const vmobjptridx_t objnum); #define MIN_TO_ADD 60 -std::array robot_controlled; std::array robot_controlled_time, robot_last_send_time, robot_last_message_time; @@ -180,8 +181,8 @@ void multi_check_robot_timeout() Int3(); // Non-terminal but Rob is interesting, step over please... return; } - if (robot_send_pending[i]) - multi_send_robot_position(robot_objp, 1); + if (robot_send_pending[i] != multi_send_robot_position_priority::_0) + multi_send_robot_position(robot_objp, multi_send_robot_position_priority::_2); multi_send_release_robot(robot_objp); // multi_delete_controlled_robot(robot_controlled[i]); // robot_controlled[i] = -1; @@ -283,8 +284,8 @@ int multi_add_controlled_robot(const vmobjptridx_t objnum, int agitation) if (robot_last_message_time[i] + ROBOT_TIMEOUT < GameTime64) { const auto &&robot_objp = vmobjptridx(robot_controlled[i]); - if (robot_send_pending[i]) - multi_send_robot_position(robot_objp, 1); + if (robot_send_pending[i] != multi_send_robot_position_priority::_0) + multi_send_robot_position(robot_objp, multi_send_robot_position_priority::_2); multi_send_release_robot(robot_objp); first_free_robot = i; break; @@ -307,8 +308,8 @@ int multi_add_controlled_robot(const vmobjptridx_t objnum, int agitation) ) // Replace some old robot with a more agitated one { const auto &&robot_objp = vmobjptridx(robot_controlled[lowest_agitated_bot]); - if (robot_send_pending[lowest_agitated_bot]) - multi_send_robot_position(robot_objp, 1); + if (robot_send_pending[lowest_agitated_bot] != multi_send_robot_position_priority::_0) + multi_send_robot_position(robot_objp, multi_send_robot_position_priority::_2); multi_send_release_robot(robot_objp); i = lowest_agitated_bot; @@ -350,7 +351,7 @@ void multi_delete_controlled_robot(const vmobjptridx_t objnum) objrobot.ctype.ai_info.REMOTE_OWNER = -1; objrobot.ctype.ai_info.REMOTE_SLOT_NUM = 0; robot_controlled[i] = object_none; - robot_send_pending[i] = 0; + robot_send_pending[i] = multi_send_robot_position_priority::_0; robot_fired[i] = 0; } } @@ -398,8 +399,6 @@ void multi_send_release_robot(const vmobjptridx_t objnum) } } -#define MIN_ROBOT_COM_GAP F1_0/12 - int multi_send_robot_frame(int sent) { auto &Objects = LevelUniqueObjectState.Objects; @@ -412,11 +411,12 @@ int multi_send_robot_frame(int sent) for (i = 0; i < MAX_ROBOTS_CONTROLLED; i++) { int sending = (last_sent+1+i)%MAX_ROBOTS_CONTROLLED; - if (robot_controlled[sending] != object_none && (robot_send_pending[sending] > sent || robot_fired[sending] > sent)) + if (robot_controlled[sending] != object_none && (underlying_value(robot_send_pending[sending]) > sent || robot_fired[sending] > sent)) { - if (robot_send_pending[sending]) + if (auto &pending = robot_send_pending[sending]; pending != multi_send_robot_position_priority::_0) { - multi_send_robot_position_sub(vmobjptridx(robot_controlled[sending]), (std::exchange(robot_send_pending[sending], 0) > 1)); + const auto p = std::exchange(pending, multi_send_robot_position_priority::_0); + multi_send_robot_position_sub(vmobjptridx(robot_controlled[sending]), underlying_value(p) > 1); } if (auto &&b = robot_fired[sending]) @@ -504,7 +504,7 @@ void multi_send_robot_position_sub(const vmobjptridx_t objnum, int now) } } -void multi_send_robot_position(object &obj, int force) +void multi_send_robot_position(object &obj, const multi_send_robot_position_priority force) { // Send robot position to other player(s). Includes a byte // value describing whether or not they fired a weapon @@ -525,7 +525,7 @@ void multi_send_robot_position(object &obj, int force) const auto slot = obj.ctype.ai_info.REMOTE_SLOT_NUM; robot_last_send_time[slot] = GameTime64; - robot_send_pending[slot] = 1+force; + robot_send_pending[slot] = force; return; } @@ -1405,8 +1405,8 @@ void multi_robot_request_change(const vmobjptridx_t robot, int player_num) if ( (robot_agitation[slot] < 70) || (MULTI_ROBOT_PRIORITY(remote_objnum, player_num) > MULTI_ROBOT_PRIORITY(remote_objnum, Player_num)) || (d_rand() > 0x4400)) { - if (robot_send_pending[slot]) - multi_send_robot_position(rcrobot, -1); + if (robot_send_pending[slot] != multi_send_robot_position_priority::_0) + multi_send_robot_position(rcrobot, multi_send_robot_position_priority::_0); multi_send_release_robot(rcrobot); objrobot.ctype.ai_info.REMOTE_SLOT_NUM = HANDS_OFF_PERIOD; // Hands-off period }