From 68ea04c3371a3ebb46db39fe6997a76b265feb56 Mon Sep 17 00:00:00 2001
From: Marko Lindqvist <cazfi74@gmail.com>
Date: Sun, 4 Oct 2026 23:03:48 +0300
Subject: [PATCH 86/86] Refactor scout vision handling

Implement unit_scout_vision_gain() and unit_scout_vision_clear(),
and use those.

See RM #2331

Signed-off-by: Marko Lindqvist <cazfi74@gmail.com>
---
 server/unithand.c  | 11 ++---------
 server/unittools.c | 43 +++++++++++++++++++++++++++++++++----------
 server/unittools.h |  3 +++
 3 files changed, 38 insertions(+), 19 deletions(-)

diff --git a/server/unithand.c b/server/unithand.c
index 54a9f84217..b57cd96a71 100644
--- a/server/unithand.c
+++ b/server/unithand.c
@@ -6878,20 +6878,13 @@ static bool unit_activity_targeted_internal(struct unit *punit,
 static bool do_scout(struct unit *punit, struct tile *ptile,
                      const struct action *paction)
 {
-  struct player *owner = unit_owner(punit);
-
   if (punit->server.scout_vision != nullptr
       && punit->server.scout_vision->tile != ptile) {
-    vision_free(punit->server.scout_vision);
-    punit->server.scout_vision = nullptr;
+    unit_scout_vision_clear(punit);
   }
 
   if (punit->server.scout_vision == nullptr) {
-    const v_radius_t radius_sq = V_RADIUS(5, 0, 0);
-
-    punit->server.scout_vision = vision_new(owner, ptile);
-    vision_reveal_tiles(punit->server.scout_vision, TRUE);
-    vision_change_sight(punit->server.scout_vision, radius_sq);
+    unit_scout_vision_gain(punit, ptile);
   }
 
   return TRUE;
diff --git a/server/unittools.c b/server/unittools.c
index 74d73bbed4..5597a0164b 100644
--- a/server/unittools.c
+++ b/server/unittools.c
@@ -710,11 +710,7 @@ void finalize_unit_phase_beginning(struct player *pplayer)
     punit->changed_from_target = punit->activity_target;
     punit->changed_from_count = punit->activity_count;
 
-    if (punit->server.scout_vision != nullptr) {
-      vision_clear_sight(punit->server.scout_vision);
-      vision_free(punit->server.scout_vision);
-      punit->server.scout_vision = nullptr;
-    }
+    unit_scout_vision_clear(punit);
 
     send_unit_info(nullptr, punit);
   } unit_list_iterate_end;
@@ -1844,11 +1840,7 @@ static void server_remove_unit_full(struct unit *punit, bool transported,
     vision_free(punit->server.vision);
     punit->server.vision = nullptr;
   }
-  if (punit->server.scout_vision != nullptr) {
-    vision_clear_sight(punit->server.scout_vision);
-    vision_free(punit->server.scout_vision);
-    punit->server.scout_vision = nullptr;
-  }
+  unit_scout_vision_clear(punit);
 
   packet.unit_id = punit->id;
   /* Send to onlookers. */
@@ -5201,3 +5193,34 @@ void unit_make_contact(const struct unit *punit,
   maybe_make_contact(ptile != nullptr ? ptile : unit_tile(punit),
                      pplayer != nullptr ? pplayer : unit_owner(punit));
 }
+
+/**********************************************************************//**
+  Add scout vision to the unit.
+
+  @param punit Unit to add the scout vision for
+  @param ptile Central tile of the scouted area
+**************************************************************************/
+void unit_scout_vision_gain(struct unit *punit, struct tile *ptile)
+{
+  const v_radius_t radius_sq = V_RADIUS(5, 0, 0);
+
+  fc_assert(punit->server.scout_vision == nullptr);
+
+  punit->server.scout_vision = vision_new(unit_owner(punit), ptile);
+  vision_reveal_tiles(punit->server.scout_vision, TRUE);
+  vision_change_sight(punit->server.scout_vision, radius_sq);
+}
+
+/**********************************************************************//**
+  Clear scout vision from the unit.
+
+  @param punit Unit to clear the scout vision from
+**************************************************************************/
+void unit_scout_vision_clear(struct unit *punit)
+{
+  if (punit->server.scout_vision != nullptr) {
+    vision_clear_sight(punit->server.scout_vision);
+    vision_free(punit->server.scout_vision);
+    punit->server.scout_vision = nullptr;
+  }
+}
diff --git a/server/unittools.h b/server/unittools.h
index 27243c233c..1616d274fb 100644
--- a/server/unittools.h
+++ b/server/unittools.h
@@ -195,4 +195,7 @@ void unit_activities_cancel_all_illegal_area(const struct tile *ptile);
 
 void unit_get_goods(struct unit *punit);
 
+void unit_scout_vision_gain(struct unit *punit, struct tile *ptile);
+void unit_scout_vision_clear(struct unit *punit);
+
 #endif /* FC__UNITTOOLS_H */
-- 
2.53.0

