From e83dbd1845021587cb1be61ddade7438cc76cc9e Mon Sep 17 00:00:00 2001 From: hugomflavio Date: Thu, 5 Sep 2024 09:19:38 -0400 Subject: [PATCH 1/4] change bombarding message system So the bombarder does not reveal the units bombarded. --- client/packhand.cpp | 8 ++++--- common/events.cpp | 2 ++ common/events.h | 3 +++ common/networking/packets.def | 1 + data/misc/events.png | Bin 16111 -> 16859 bytes data/misc/events.spec | 2 ++ data/stdsounds.soundspec | 2 ++ server/unithand.cpp | 39 ++++++++++++++++++++-------------- 8 files changed, 38 insertions(+), 19 deletions(-) diff --git a/client/packhand.cpp b/client/packhand.cpp index 924b4de9c4..d769c9b994 100644 --- a/client/packhand.cpp +++ b/client/packhand.cpp @@ -495,9 +495,11 @@ void handle_unit_combat_info(const struct packet_unit_combat_info *packet) struct unit *punit1 = game_unit_by_number(packet->defender_unit_id); if (punit0 && punit1) { - popup_combat_info(packet->attacker_unit_id, packet->defender_unit_id, - packet->attacker_hp, packet->defender_hp, - packet->make_att_veteran, packet->make_def_veteran); + if (!packet->bombard) { + popup_combat_info(packet->attacker_unit_id, packet->defender_unit_id, + packet->attacker_hp, packet->defender_hp, + packet->make_att_veteran, packet->make_def_veteran); + } if (tile_visible_mapcanvas(unit_tile(punit0)) && tile_visible_mapcanvas(unit_tile(punit1))) { show_combat = true; diff --git a/common/events.cpp b/common/events.cpp index bf6a71f6ca..2241f72005 100644 --- a/common/events.cpp +++ b/common/events.cpp @@ -158,11 +158,13 @@ static struct { GEN_EV(E_UNIT_LOST_ATT, E_S_UNIT, N_("Attack Failed")), GEN_EV(E_UNIT_TIE_ATT, E_S_UNIT, N_("Attack Tied")), GEN_EV(E_UNIT_WIN_ATT, E_S_UNIT, N_("Attack Succeeded")), + GEN_EV(E_UNIT_BOMB_ATT, E_S_UNIT, N_("Attacker Bombarding")), GEN_EV(E_UNIT_BUY, E_S_UNIT, N_("Bought")), GEN_EV(E_UNIT_BUILT, E_S_UNIT, N_("Built")), GEN_EV(E_UNIT_LOST_DEF, E_S_UNIT, N_("Defender Destroyed")), GEN_EV(E_UNIT_TIE_DEF, E_S_UNIT, N_("Defender Tied")), GEN_EV(E_UNIT_WIN_DEF, E_S_UNIT, N_("Defender Survived")), + GEN_EV(E_UNIT_BOMB_DEF, E_S_UNIT, N_("Defender Bombarded")), GEN_EV(E_UNIT_BECAME_VET, E_S_UNIT, N_("Promoted to Veteran")), GEN_EV(E_UNIT_LOST_MISC, E_S_UNIT, N_("Lost Outside Battle")), GEN_EV(E_UNIT_UPGRADED, E_S_UNIT, N_("Production Upgraded")), diff --git a/common/events.h b/common/events.h index 5923113a9e..c119b6fa27 100644 --- a/common/events.h +++ b/common/events.h @@ -168,6 +168,9 @@ // Combat without winner (Combat_Rounds) #define SPECENUM_VALUE136 E_UNIT_TIE_ATT #define SPECENUM_VALUE137 E_UNIT_TIE_DEF +// bombarding +#define SPECENUM_VALUE138 E_UNIT_BOMB_ATT +#define SPECENUM_VALUE139 E_UNIT_BOMB_DEF /* * Note: If you add a new event, make sure you make a similar change diff --git a/common/networking/packets.def b/common/networking/packets.def index 2d389b2604..ced045a97f 100644 --- a/common/networking/packets.def +++ b/common/networking/packets.def @@ -1086,6 +1086,7 @@ PACKET_UNIT_COMBAT_INFO = 65; sc, lsend HP defender_hp; BOOL make_att_veteran; BOOL make_def_veteran; + BOOL bombard; end PACKET_UNIT_BOMBARD_INFO = 66; sc, lsend, cap(bombard-info) diff --git a/data/misc/events.png b/data/misc/events.png index 50cb4f320033b39f92ba6104c0abe4ba850534b4..e0946f5c46f446923f5633ed349511941b159a56 100644 GIT binary patch delta 13305 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 Dc0?eg diff --git a/data/misc/events.spec b/data/misc/events.spec index 65216e9422..24ab32465c 100644 --- a/data/misc/events.spec +++ b/data/misc/events.spec @@ -120,6 +120,8 @@ tiles = { "row", "column", "tag" 4, 9, "e_my_spy_nuke" 4, 10, "e_my_spy_steal_map" ; 4, 11, "e_embassy_was_expelled" + 4, 12, "e_unit_bomb_att" + 4, 13, "e_unit_bomb_def" ; 5, 0, "e_enemy_diplomat_escape" ; base sprite for enemy diplomats 5, 1, "e_enemy_diplomat_bribe" diff --git a/data/stdsounds.soundspec b/data/stdsounds.soundspec index fbbf0b5512..259bb9bee2 100644 --- a/data/stdsounds.soundspec +++ b/data/stdsounds.soundspec @@ -310,7 +310,9 @@ e_log_fatal = "stdsounds/LrgExpl.ogg" ; [warzone] ;e_unit_upgraded = "" ;e_unit_tie_def = "" ;e_unit_win_def = "" +;e_unit_bomb_def = "" ;e_unit_tie_att = "" +;e_unit_bomb_att = "" ;e_unit_win_att = "" ;e_unit_did_expel = "" ;e_unit_was_expelled = "" diff --git a/server/unithand.cpp b/server/unithand.cpp index 32225cb228..52782f8b20 100644 --- a/server/unithand.cpp +++ b/server/unithand.cpp @@ -13,6 +13,7 @@ #include #include +#include // utility #include "astring.h" @@ -3692,6 +3693,7 @@ static bool unit_bombard(struct unit *punit, struct tile *ptile, { struct player *pplayer = unit_owner(punit); struct city *pcity = tile_city(ptile); + std::set players_to_notify; // Sanity check: The actor still exists. fc_assert_ret_val(pplayer, false); @@ -3733,20 +3735,7 @@ static bool unit_bombard(struct unit *punit, struct tile *ptile, unit_bombs_unit(punit, pdefender, &att_hp, &def_hp); - notify_player(pplayer, ptile, E_UNIT_WIN_ATT, ftc_server, - /* TRANS: Your Bomber bombards the English Rifleman.*/ - _("Your %s bombards the %s %s."), - unit_name_translation(punit), - nation_adjective_for_player(unit_owner(pdefender)), - unit_name_translation(pdefender)); - - notify_player( - unit_owner(pdefender), ptile, E_UNIT_WIN_DEF, ftc_server, - /* TRANS: Your Rifleman is bombarded by the French Bomber.*/ - _("Your %s is bombarded by the %s %s."), - unit_name_translation(pdefender), - nation_adjective_for_player(pplayer), - unit_name_translation(punit)); + players_to_notify.insert(unit_owner(pdefender)); punit->hp = att_hp; pdefender->hp = def_hp; @@ -3759,11 +3748,11 @@ static bool unit_bombard(struct unit *punit, struct tile *ptile, } unit_list_iterate_safe_end; - // Notify the client + // Notify the client (triggers explosion on tile) see_combat_unit(punit); send_bombardment(punit, ptile); - // Send units about affected units + // Send updates about affected units unit_list_iterate_safe(ptile->units, pdefender) { if (is_unit_reachable_at(pdefender, punit, ptile)) { @@ -3772,6 +3761,24 @@ static bool unit_bombard(struct unit *punit, struct tile *ptile, } unit_list_iterate_safe_end; + // Notify the players hit by the bombardment + for (auto player_to_notify : players_to_notify) { + notify_player( + player_to_notify, ptile, E_UNIT_BOMB_DEF, ftc_server, + /* TRANS: Your units in [tile] have been bombarded by the French + Bomber.*/ + _("Your units in %s were bombarded by a %s %s %s [id:%d]."), + tile_link(ptile), nation_adjective_for_player(pplayer), + unit_veteran_level_string(punit), unit_name_translation(punit), + punit->id); + } + // Notify the player that bombarded + notify_player(pplayer, ptile, E_UNIT_BOMB_ATT, ftc_server, + /* TRANS: Your Bomber bombarded [coords?].*/ + _("Your %s %s [id:%d] bombarded the units at %s."), + unit_veteran_level_string(punit), + unit_name_translation(punit), punit->id, tile_link(ptile)); + unit_did_action(punit); unit_forget_last_activity(punit); unit_attack_civilian_casualties(punit, pcity, paction, "bombard"); From 68626e6c4ed4cda624f75c01e12c86715bf7f7d7 Mon Sep 17 00:00:00 2001 From: hugomflavio Date: Sun, 8 Sep 2024 15:26:57 -0400 Subject: [PATCH 2/4] revert compatibilty-breaking changes no longer needed --- client/packhand.cpp | 8 +++----- common/networking/packets.def | 1 - 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/client/packhand.cpp b/client/packhand.cpp index d769c9b994..924b4de9c4 100644 --- a/client/packhand.cpp +++ b/client/packhand.cpp @@ -495,11 +495,9 @@ void handle_unit_combat_info(const struct packet_unit_combat_info *packet) struct unit *punit1 = game_unit_by_number(packet->defender_unit_id); if (punit0 && punit1) { - if (!packet->bombard) { - popup_combat_info(packet->attacker_unit_id, packet->defender_unit_id, - packet->attacker_hp, packet->defender_hp, - packet->make_att_veteran, packet->make_def_veteran); - } + popup_combat_info(packet->attacker_unit_id, packet->defender_unit_id, + packet->attacker_hp, packet->defender_hp, + packet->make_att_veteran, packet->make_def_veteran); if (tile_visible_mapcanvas(unit_tile(punit0)) && tile_visible_mapcanvas(unit_tile(punit1))) { show_combat = true; diff --git a/common/networking/packets.def b/common/networking/packets.def index ced045a97f..2d389b2604 100644 --- a/common/networking/packets.def +++ b/common/networking/packets.def @@ -1086,7 +1086,6 @@ PACKET_UNIT_COMBAT_INFO = 65; sc, lsend HP defender_hp; BOOL make_att_veteran; BOOL make_def_veteran; - BOOL bombard; end PACKET_UNIT_BOMBARD_INFO = 66; sc, lsend, cap(bombard-info) From c902a605a01d962956f139c8065d93b6762c9d32 Mon Sep 17 00:00:00 2001 From: hugomflavio Date: Sun, 8 Sep 2024 16:49:46 -0400 Subject: [PATCH 3/4] replace in with at --- server/unithand.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/unithand.cpp b/server/unithand.cpp index 52782f8b20..300282c829 100644 --- a/server/unithand.cpp +++ b/server/unithand.cpp @@ -3765,9 +3765,9 @@ static bool unit_bombard(struct unit *punit, struct tile *ptile, for (auto player_to_notify : players_to_notify) { notify_player( player_to_notify, ptile, E_UNIT_BOMB_DEF, ftc_server, - /* TRANS: Your units in [tile] have been bombarded by the French + /* TRANS: Your units at [tile] have been bombarded by the French Bomber.*/ - _("Your units in %s were bombarded by a %s %s %s [id:%d]."), + _("Your units at %s were bombarded by a %s %s %s [id:%d]."), tile_link(ptile), nation_adjective_for_player(pplayer), unit_veteran_level_string(punit), unit_name_translation(punit), punit->id); From 6964ec8c0ff88217139d8f4b61495c335cd9219a Mon Sep 17 00:00:00 2001 From: hugomflavio Date: Sun, 8 Sep 2024 16:52:14 -0400 Subject: [PATCH 4/4] update 'TRANS' comments --- server/unithand.cpp | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/server/unithand.cpp b/server/unithand.cpp index 300282c829..bd5dd4b66e 100644 --- a/server/unithand.cpp +++ b/server/unithand.cpp @@ -3765,19 +3765,20 @@ static bool unit_bombard(struct unit *punit, struct tile *ptile, for (auto player_to_notify : players_to_notify) { notify_player( player_to_notify, ptile, E_UNIT_BOMB_DEF, ftc_server, - /* TRANS: Your units at [tile] have been bombarded by the French - Bomber.*/ + /* TRANS: Your units at (x, y) have been bombarded by the French + green Bomber [id:123].*/ _("Your units at %s were bombarded by a %s %s %s [id:%d]."), tile_link(ptile), nation_adjective_for_player(pplayer), unit_veteran_level_string(punit), unit_name_translation(punit), punit->id); } // Notify the player that bombarded - notify_player(pplayer, ptile, E_UNIT_BOMB_ATT, ftc_server, - /* TRANS: Your Bomber bombarded [coords?].*/ - _("Your %s %s [id:%d] bombarded the units at %s."), - unit_veteran_level_string(punit), - unit_name_translation(punit), punit->id, tile_link(ptile)); + notify_player( + pplayer, ptile, E_UNIT_BOMB_ATT, ftc_server, + /* TRANS: Your green Bomber [id:123] bombarded the units at (x, y).*/ + _("Your %s %s [id:%d] bombarded the units at %s."), + unit_veteran_level_string(punit), unit_name_translation(punit), + punit->id, tile_link(ptile)); unit_did_action(punit); unit_forget_last_activity(punit);