From 8e25fefb508656d3bfafeeccdc512720045d1294 Mon Sep 17 00:00:00 2001 From: Dino Date: Sun, 14 Jun 2026 00:14:41 -0400 Subject: [PATCH] improve reporting of obsolete wonder RM #2052 --- server/techtools.c | 54 ++++++++++++++++++++++++++++++++++++---------- 1 file changed, 43 insertions(+), 11 deletions(-) diff --git a/server/techtools.c b/server/techtools.c index c6a2c1a994..64fcb86452 100644 --- a/server/techtools.c +++ b/server/techtools.c @@ -373,17 +373,49 @@ void found_new_tech(struct research *presearch, Tech_type_id tech_found, /* Alert the owners of any wonders that have been made obsolete */ improvement_iterate(pimprove) { requirement_vector_iterate(&pimprove->obsolete_by, pobs) { + bool is_range_ok = FALSE; + struct player *city_owner = NULL; + struct player *new_tech_player = + player_by_number(research_number(presearch)); + pcity = city_from_great_wonder(pimprove); + if (pcity) { + city_owner = city_owner(pcity); + } + switch (pobs->range) { + case REQ_RANGE_PLAYER: + if (city_owner + && (new_tech_player == city_owner)) { + is_range_ok = TRUE; + } + break; + case REQ_RANGE_TEAM: + if (city_owner + && players_on_same_team(new_tech_player, city_owner)) { + is_range_ok = TRUE; + } + break; + case REQ_RANGE_ALLIANCE: + if (city_owner + && pplayers_allied(new_tech_player, city_owner)) { + is_range_ok = TRUE; + } + break; + case REQ_RANGE_WORLD: + is_range_ok = TRUE; + break; + default: + break; + } if (pobs->source.kind == VUT_ADVANCE && pobs->source.value.advance == vap - && pobs->range >= REQ_RANGE_WORLD + && is_range_ok && pobs->present - && pobs->survives && is_great_wonder(pimprove) - && (pcity = city_from_great_wonder(pimprove))) { - notify_player(city_owner(pcity), NULL, E_WONDER_OBSOLETE, ftc_server, - _("Discovery of %s OBSOLETES %s in %s!"), + && city_owner) { + notify_player(city_owner, NULL, E_WONDER_OBSOLETE, ftc_server, + _("Discovery of %s OBSOLETES %s in %s!"), research_advance_name_translation - (research_get(city_owner(pcity)), tech_found), + (research_get(city_owner), tech_found), improvement_name_translation(pimprove), city_link(pcity)); } @@ -1258,7 +1290,7 @@ Tech_type_id steal_a_tech(struct player *pplayer, struct player *victim, j++; } } advance_index_iterate_max_end; - + if (j == 0) { /* We've moved on to future tech */ if (vresearch->future_tech > presearch->future_tech) { @@ -1275,11 +1307,11 @@ Tech_type_id steal_a_tech(struct player *pplayer, struct player *victim, game.info.tech_steal_allow_holes) && research_invention_state(presearch, i) != TECH_KNOWN && research_invention_state(vresearch, i) == TECH_KNOWN) { - j--; + j--; } if (j == 0) { - stolen_tech = i; - break; + stolen_tech = i; + break; } } advance_index_iterate_max_end; fc_assert(stolen_tech != A_NONE); @@ -1343,7 +1375,7 @@ void handle_player_research(struct player *pplayer, int tech) if (tech != A_FUTURE && !valid_advance_by_number(tech)) { return; } - + if (tech != A_FUTURE && research_invention_state(research, tech) != TECH_PREREQS_KNOWN) { return; -- 2.31.0