Move MarkerMessage[] into wrapper d_marker_state

Also, fix an ancient bug with the automap handling of markers caused by
WET anti-pattern.
This commit is contained in:
Kp 2018-03-10 18:32:02 +00:00
parent ca2b1e0cf0
commit 7dee4ca49f
6 changed files with 29 additions and 21 deletions

View file

@ -60,10 +60,13 @@ window_event_result MarkerInputMessage(int key);
constexpr std::integral_constant<std::size_t, 16> NUM_MARKERS{};
constexpr std::integral_constant<std::size_t, 40> MARKER_MESSAGE_LEN{};
struct marker_message_text_t : ntstring<MARKER_MESSAGE_LEN - 1> {};
struct marker_messages_array_t : public array<marker_message_text_t, NUM_MARKERS> {};
struct d_marker_state
{
array<marker_message_text_t, NUM_MARKERS> message;
};
extern marker_message_text_t Marker_input;
extern marker_messages_array_t MarkerMessage;
extern d_marker_state MarkerState;
extern array<objnum_t, NUM_MARKERS> MarkerObject;
extern ubyte DefiningMarkerMessage;
}

View file

@ -615,7 +615,7 @@ static imsegidx_t find_exit_segment()
}
// -----------------------------------------------------------------------------
static void say_escort_goal(escort_goal_t goal_num)
static void say_escort_goal(const escort_goal_t goal_num)
{
if (Player_dead_state != player_dead_state::no)
return;
@ -676,7 +676,10 @@ static void say_escort_goal(escort_goal_t goal_num)
case ESCORT_GOAL_MARKER7:
case ESCORT_GOAL_MARKER8:
case ESCORT_GOAL_MARKER9:
buddy_message("Finding marker %i: '%.24s'", goal_num-ESCORT_GOAL_MARKER1+1, &MarkerMessage[goal_num-ESCORT_GOAL_MARKER1][0]);
{
const unsigned zero_based_goal_num = goal_num - ESCORT_GOAL_MARKER1;
buddy_message("Finding marker %i: '%.24s'", zero_based_goal_num + 1, &MarkerState.message[zero_based_goal_num][0]);
}
return;
}
buddy_message_str(str);

View file

@ -239,7 +239,6 @@ static void automap_build_edge_list(automap *am, int add_all_edges);
namespace dsx {
int HighlightMarker=-1;
marker_message_text_t Marker_input;
marker_messages_array_t MarkerMessage;
static float MarkerScale=2.0;
template <std::size_t... N>
@ -249,6 +248,7 @@ static inline constexpr array<objnum_t, sizeof...(N)> init_MarkerObject(index_se
}
array<objnum_t, NUM_MARKERS> MarkerObject = init_MarkerObject(make_tree_index_sequence<NUM_MARKERS>());
d_marker_state MarkerState;
}
#endif
@ -368,20 +368,18 @@ static void DropMarker(fvmobjptridx &vmobjptridx, fvmsegptridx &vmsegptridx, con
MarkerObject[marker_num] = drop_marker_object(plrobj.pos, vmsegptridx(plrobj.segnum), plrobj.orient, marker_num);
if (Game_mode & GM_MULTI)
multi_send_drop_marker(Player_num, plrobj.pos, player_marker_num, MarkerMessage[marker_num]);
multi_send_drop_marker(Player_num, plrobj.pos, player_marker_num, MarkerState.message[marker_num]);
}
void DropBuddyMarker(const vmobjptr_t objp)
{
int marker_num;
// Find spare marker slot. "if" code below should be an assert, but what if someone changes NUM_MARKERS or MAX_CROP_SINGLE and it never gets hit?
static_assert(MAX_DROP_SINGLE + 1 <= NUM_MARKERS - 1, "not enough markers");
marker_num = MAX_DROP_SINGLE+1;
if (marker_num > NUM_MARKERS-1)
marker_num = NUM_MARKERS-1;
snprintf(&MarkerMessage[marker_num][0], MarkerMessage[marker_num].size(), "RIP: %s", static_cast<const char *>(PlayerCfg.GuidebotName));
auto &MarkerMessage = MarkerState.message[marker_num];
snprintf(&MarkerMessage[0], MarkerMessage.size(), "RIP: %s", static_cast<const char *>(PlayerCfg.GuidebotName));
if (MarkerObject[marker_num] != object_none)
obj_delete(vmobjptridx(MarkerObject[marker_num]));
@ -443,8 +441,8 @@ static void ClearMarkers()
{
int i;
MarkerState.message = {};
for (i=0;i<NUM_MARKERS;i++) {
MarkerMessage[i][0]=0;
MarkerObject[i]=object_none;
}
}
@ -755,9 +753,13 @@ static void draw_automap(fvcobjptr &vcobjptr, automap *am)
name_frame(canvas, am);
#if defined(DXX_BUILD_DESCENT_II)
if (HighlightMarker>-1 && MarkerMessage[HighlightMarker][0]!=0)
if (HighlightMarker > -1)
{
gr_printf(canvas, (SWIDTH/64),(SHEIGHT/18), "Marker %d: %s",HighlightMarker+1,&MarkerMessage[(Player_num*2)+HighlightMarker][0]);
auto &m = MarkerState.message[(Player_num * 2) + HighlightMarker];
if (m[0])
{
gr_printf(canvas, (SWIDTH/64), (SHEIGHT/18), "Marker %d: %s", HighlightMarker + 1, &m[0]);
}
}
#endif
@ -890,7 +892,7 @@ static window_event_result automap_key_command(window *, const d_event &event, a
* so that they remove the marker.
*/
obj_delete(vmobjptridx(exchange(MarkerObject[HighlightMarker], object_none)));
MarkerMessage[HighlightMarker][0]=0;
MarkerState.message[HighlightMarker] = {};
HighlightMarker = -1;
}
set_screen_mode(SCREEN_GAME);
@ -1541,7 +1543,7 @@ window_event_result MarkerInputMessage(int key)
Marker_input[Marker_index] = 0;
break;
case KEY_ENTER:
MarkerMessage[(Player_num*2)+MarkerBeingDefined] = Marker_input;
MarkerState.message[(Player_num*2)+MarkerBeingDefined] = Marker_input;
DropMarker(vmobjptridx, vmsegptridx, get_local_plrobj(), MarkerBeingDefined);
LastMarkerDropped = MarkerBeingDefined;
/* fallthrough */

View file

@ -1150,7 +1150,7 @@ static void collide_player_and_marker(const object_base &playerobj, const vmobjp
int drawn;
const unsigned marker_id = get_marker_id(marker);
auto &msg = MarkerMessage[marker_id];
auto &msg = MarkerState.message[marker_id];
if (Game_mode & GM_MULTI)
{
drawn = HUD_init_message(HM_DEFAULT|HM_MAYDUPL, "MARKER %s: %s", static_cast<const char *>(vcplayerptr(marker_id / 2)->callsign), &msg[0]);

View file

@ -2315,7 +2315,7 @@ static void multi_do_drop_marker(object_array &objects, fvmsegptridx &vmsegptrid
const unsigned mnum = (pnum * 2) + mesnum;
for (i=0;i<40;i++)
MarkerMessage[mnum][i]=buf[15+i];
MarkerState.message[mnum][i] = buf[15 + i];
auto &mo = MarkerObject[mnum];
if (mo != object_none)
@ -2563,10 +2563,10 @@ void multi_send_markers()
objnum_t mo;
mo = MarkerObject[(i*2)];
if (mo!=object_none)
multi_send_drop_marker (i, vcobjptr(mo)->pos, 0, MarkerMessage[i*2]);
multi_send_drop_marker(i, vcobjptr(mo)->pos, 0, MarkerState.message[i * 2]);
mo = MarkerObject[(i*2)+1];
if (mo!=object_none)
multi_send_drop_marker (i, vcobjptr(mo)->pos, 1, MarkerMessage[(i*2)+1]);
multi_send_drop_marker(i, vcobjptr(mo)->pos, 1, MarkerState.message[(i * 2) + 1]);
}
}
#endif

View file

@ -1221,7 +1221,7 @@ int state_save_all_sub(const char *filename, const char *desc)
PHYSFS_write(fp, &m, sizeof(m), 1);
}
PHYSFS_seek(fp, PHYSFS_tell(fp) + (NUM_MARKERS)*(CALLSIGN_LEN+1)); // PHYSFS_write(fp, MarkerOwner, sizeof(MarkerOwner), 1); MarkerOwner is obsolete
range_for (const auto &m, MarkerMessage)
range_for (const auto &m, MarkerState.message)
PHYSFS_write(fp, m.data(), m.size(), 1);
PHYSFS_write(fp, &Afterburner_charge, sizeof(fix), 1);
@ -1822,7 +1822,7 @@ int state_restore_all_sub(const char *filename, const secret_restore secret)
range_for (auto &i, MarkerObject)
i = PHYSFSX_readSXE32(fp, swap);
PHYSFS_seek(fp, PHYSFS_tell(fp) + (NUM_MARKERS)*(CALLSIGN_LEN+1)); // PHYSFS_read(fp, MarkerOwner, sizeof(MarkerOwner), 1); // skip obsolete MarkerOwner
range_for (auto &i, MarkerMessage)
range_for (auto &i, MarkerState.message)
{
array<char, MARKER_MESSAGE_LEN> a;
PHYSFS_read(fp, a.data(), a.size(), 1);