diff --git a/src/Player.cc b/src/Player.cc index 94c51e22..a625c44f 100644 --- a/src/Player.cc +++ b/src/Player.cc @@ -91,6 +91,7 @@ PlayerDispDataDCPCV3 PlayerDispDataBB::to_dcpcv3() const { ret.stats = this->stats; ret.visual = this->visual; ret.visual.name = this->name; + remove_language_marker_inplace(ret.visual.name); ret.config = this->config; ret.v1_technique_levels = this->technique_levels; return ret; diff --git a/src/SendCommands.cc b/src/SendCommands.cc index 32bd652a..769a0bf1 100644 --- a/src/SendCommands.cc +++ b/src/SendCommands.cc @@ -1619,7 +1619,7 @@ void send_join_game_dc_nte(shared_ptr c, shared_ptr l) { send_command_t(c, 0x64, player_count, cmd); } -template +template void send_join_lobby_t(shared_ptr c, shared_ptr l, shared_ptr joining_client = nullptr) { uint8_t command; @@ -1687,6 +1687,10 @@ void send_join_lobby_t(shared_ptr c, shared_ptr l, e.lobby_data.guild_card = lc->license->serial_number; e.lobby_data.client_id = lc->lobby_client_id; e.lobby_data.name = lc->game_data.player()->disp.name; + remove_language_marker_inplace(e.lobby_data.name); + if (UseLanguageMarkerInName) { + add_language_marker_inplace(e.lobby_data.name, 'J'); + } e.inventory = lc->game_data.player()->inventory; if (c->version() == GameVersion::GC) { for (size_t z = 0; z < 30; z++) { @@ -1776,20 +1780,20 @@ void send_join_lobby(shared_ptr c, shared_ptr l) { if (c->flags & (Client::Flag::IS_DC_TRIAL_EDITION | Client::Flag::IS_DC_V1_PROTOTYPE)) { send_join_lobby_dc_nte(c, l); } else { - send_join_lobby_t(c, l); + send_join_lobby_t(c, l); } break; case GameVersion::PC: - send_join_lobby_t(c, l); + send_join_lobby_t(c, l); break; case GameVersion::GC: - send_join_lobby_t(c, l); + send_join_lobby_t(c, l); break; case GameVersion::XB: - send_join_lobby_t(c, l); + send_join_lobby_t(c, l); break; case GameVersion::BB: - send_join_lobby_t(c, l); + send_join_lobby_t(c, l); break; default: throw logic_error("unimplemented versioned command"); @@ -1811,20 +1815,20 @@ void send_player_join_notification(shared_ptr c, if (c->flags & (Client::Flag::IS_DC_TRIAL_EDITION | Client::Flag::IS_DC_V1_PROTOTYPE)) { send_join_lobby_dc_nte(c, l, joining_client); } else { - send_join_lobby_t(c, l, joining_client); + send_join_lobby_t(c, l, joining_client); } break; case GameVersion::PC: - send_join_lobby_t(c, l, joining_client); + send_join_lobby_t(c, l, joining_client); break; case GameVersion::GC: - send_join_lobby_t(c, l, joining_client); + send_join_lobby_t(c, l, joining_client); break; case GameVersion::XB: - send_join_lobby_t(c, l, joining_client); + send_join_lobby_t(c, l, joining_client); break; case GameVersion::BB: - send_join_lobby_t(c, l, joining_client); + send_join_lobby_t(c, l, joining_client); break; default: throw logic_error("unimplemented versioned command"); diff --git a/src/Text.hh b/src/Text.hh index ddff1ecf..93a9a969 100644 --- a/src/Text.hh +++ b/src/Text.hh @@ -515,6 +515,22 @@ std::basic_string add_language_marker( return ret; } +template +void add_language_marker_inplace(ptext& s, char16_t marker) { + static_assert(Count >= 2, "cannot use add_language_marker_inplace on ptext with fewer than 2 characters"); + + if ((s.items[0] == '\t') && (s.items[1] != 'C')) { + return; + } + + size_t end_offset = std::min(s.len() + 2, Count); + for (size_t z = end_offset; z > 2; z--) { + s[z - 1] = s[z - 3]; + } + s[0] = '\t'; + s[1] = marker; +} + template const CharT* remove_language_marker(const CharT* s) { if ((s[0] != '\t') || (s[1] == 'C')) {