From cb4bda4ff29237c293bc32d32174a10b57bdafec Mon Sep 17 00:00:00 2001
From: Marko Lindqvist <cazfi74@gmail.com>
Date: Sun, 1 Nov 2026 02:58:15 +0200
Subject: [PATCH 79/79] savegame: Save unit's scouting tile

This is just the saving side. The active scouting is not yet
set back up on loading side.

See RM #2428

Signed-off-by: Marko Lindqvist <cazfi74@gmail.com>
---
 server/savegame/savecompat.c | 30 ++++++++++++++++++++++++++++++
 server/savegame/savegame3.c  | 11 +++++++++++
 2 files changed, 41 insertions(+)

diff --git a/server/savegame/savecompat.c b/server/savegame/savecompat.c
index b5cb80cefa..1859a91767 100644
--- a/server/savegame/savecompat.c
+++ b/server/savegame/savecompat.c
@@ -2654,6 +2654,20 @@ static void compat_load_030400(struct loaddata *loading,
       secfile_entry_ignore(loading->file, "player%d.c%d.allow_specialists",
                            plrno, cnro);
     }
+
+    if (format_class != SAVEGAME_2) {
+      int nunits = secfile_lookup_int_default(loading->file, 0,
+                                              "player%d.nunits",
+                                              plrno);
+      int unro;
+
+      for (unro = 0; unro < nunits; unro++) {
+        secfile_insert_int(loading->file, -1, "player%d.u%d.scout_x",
+                           plrno, unro);
+        secfile_insert_int(loading->file, -1, "player%d.u%d.scout_y",
+                           plrno, unro);
+      }
+    }
   } player_slots_iterate_end;
 }
 
@@ -2683,6 +2697,8 @@ static void compat_load_dev(struct loaddata *loading)
       int plrno = player_slot_index(pslot);
       int ncities;
       int cnro;
+      int nunits;
+      int unro;
 
       if (secfile_section_lookup(loading->file, "player%d", plrno) == nullptr) {
         continue;
@@ -2695,6 +2711,20 @@ static void compat_load_dev(struct loaddata *loading)
         secfile_entry_ignore(loading->file, "player%d.c%d.allow_specialists",
                              plrno, cnro);
       }
+
+      nunits = secfile_lookup_int_default(loading->file, 0,
+                                          "player%d.nunits",
+                                          plrno);
+
+      for (unro = 0; unro < nunits; unro++) {
+        if (secfile_entry_lookup(loading->file, "player%d.u%d.scout_x",
+                                 plrno, unro) == nullptr) {
+          secfile_insert_int(loading->file, -1, "player%d.u%d.scout_x",
+                             plrno, unro);
+          secfile_insert_int(loading->file, -1, "player%d.u%d.scout_y",
+                             plrno, unro);
+        }
+      }
     } player_slots_iterate_end;
 
   } /* Version < 3.3.91 */
diff --git a/server/savegame/savegame3.c b/server/savegame/savegame3.c
index 07450b0555..16d7662b11 100644
--- a/server/savegame/savegame3.c
+++ b/server/savegame/savegame3.c
@@ -6877,6 +6877,17 @@ static void sg_save_player_units(struct savedata *saving,
       secfile_insert_int(saving->file, 0, "%s.goto_y", buf);
     }
 
+    if (punit->server.scout_vision != nullptr) {
+      index_to_native_pos(&nat_x, &nat_y,
+                          tile_index(punit->server.scout_vision->tile));
+      secfile_insert_int(saving->file, nat_x, "%s.scout_x", buf);
+      secfile_insert_int(saving->file, nat_y, "%s.scout_y", buf);
+    } else {
+      /* Set this values to allow saving it as table. */
+      secfile_insert_int(saving->file, -1, "%s.scout_x", buf);
+      secfile_insert_int(saving->file, -1, "%s.scout_y", buf);
+    }
+
     secfile_insert_int(saving->file, punit->ssa_controller,
                         "%s.server_side_agent", buf);
 
-- 
2.53.0

