From 3b879a28f2819ca06f3423677282e40e6ee43a6d Mon Sep 17 00:00:00 2001
From: Marko Lindqvist <cazfi74@gmail.com>
Date: Sun, 6 Jul 2025 00:00:37 +0300
Subject: [PATCH 74/74] Send tiledefs to client

See RM #1573

Signed-off-by: Marko Lindqvist <cazfi74@gmail.com>
---
 client/packhand.c             | 19 +++++++++++++++++++
 common/networking/packets.def | 10 +++++++++-
 server/ruleset/ruleload.c     | 28 ++++++++++++++++++++++++++++
 3 files changed, 56 insertions(+), 1 deletion(-)

diff --git a/client/packhand.c b/client/packhand.c
index 7cdade3aca..49816b2df9 100644
--- a/client/packhand.c
+++ b/client/packhand.c
@@ -51,6 +51,7 @@
 #include "spaceship.h"
 #include "specialist.h"
 #include "style.h"
+#include "tiledef.h"
 #include "traderoutes.h"
 #include "unit.h"
 #include "unitlist.h"
@@ -4492,6 +4493,24 @@ void handle_ruleset_road(const struct packet_ruleset_road *p)
   proad->flags = p->flags;
 }
 
+/************************************************************************//**
+  Handle a packet about a particular tiledef type.
+****************************************************************************/
+void handle_ruleset_tiledef(const struct packet_ruleset_tiledef *p)
+{
+  struct tiledef *td = tiledef_by_number(p->id);
+
+  fc_assert_ret_msg(td != nullptr, "Bad tiledef %d.", p->id);
+
+  names_set(&td->name, nullptr, p->name, p->rule_name);
+
+  extra_type_iterate(pextra) {
+    if (BV_ISSET(p->extras, extra_index(pextra))) {
+      extra_type_list_append(td->extras, pextra);
+    }
+  } extra_type_iterate_end;
+}
+
 /************************************************************************//**
   Handle a packet about a particular goods type.
 ****************************************************************************/
diff --git a/common/networking/packets.def b/common/networking/packets.def
index 68c2cfa81c..9b390fb5cf 100644
--- a/common/networking/packets.def
+++ b/common/networking/packets.def
@@ -3,7 +3,7 @@
 Max used id:
 ============
 
-Max id: 519
+Max id: 520
 
 Packets are not ordered by their id, but by their category. New packet
 with higher id may get added to existing category, and not to the end of file.
@@ -1949,6 +1949,14 @@ PACKET_RULESET_CLAUSE = 512; sc, lsend
   REQUIREMENT giver_reqs[*], receiver_reqs[*], either_reqs[*];
 end
 
+PACKET_RULESET_TILEDEF = 520; sc, lsend
+  UINT8 id;
+  STRING name[MAX_LEN_NAME];
+  STRING rule_name[MAX_LEN_NAME];
+
+  BV_EXTRAS extras;
+end
+
 /**************************************************************************
   Ruleset control values: single values, all of which are needed before
   sending other ruleset data. After sending this packet, resend every
diff --git a/server/ruleset/ruleload.c b/server/ruleset/ruleload.c
index a9d573003a..b63f01a700 100644
--- a/server/ruleset/ruleload.c
+++ b/server/ruleset/ruleload.c
@@ -197,6 +197,7 @@ static void send_ruleset_resources(struct conn_list *dest);
 static void send_ruleset_extras(struct conn_list *dest);
 static void send_ruleset_bases(struct conn_list *dest);
 static void send_ruleset_roads(struct conn_list *dest);
+static void send_ruleset_tiledefs(struct conn_list *dest);
 static void send_ruleset_goods(struct conn_list *dest);
 static void send_ruleset_governments(struct conn_list *dest);
 static void send_ruleset_styles(struct conn_list *dest);
@@ -8793,6 +8794,32 @@ static void send_ruleset_roads(struct conn_list *dest)
   } extra_type_by_cause_iterate_end;
 }
 
+/**********************************************************************//**
+  Send the tiledefs ruleset information (all individual tiledef types)
+  to the specified connections.
+**************************************************************************/
+static void send_ruleset_tiledefs(struct conn_list *dest)
+{
+  struct packet_ruleset_tiledef packet;
+
+  tiledef_iterate(td) {
+    bv_extras extras;
+
+    packet.id = tiledef_number(td);
+    sz_strlcpy(packet.name, untranslated_name(&td->name));
+    sz_strlcpy(packet.rule_name, rule_name_get(&td->name));
+
+    BV_CLR_ALL(extras);
+    extra_type_list_iterate(td->extras, pextra) {
+      BV_SET(extras, extra_index(pextra));
+    } extra_type_list_iterate_end;
+
+    packet.extras = extras;
+
+    lsend_packet_ruleset_tiledef(dest, &packet);
+  } tiledef_iterate_end;
+}
+
 /**********************************************************************//**
   Send the goods ruleset information (all individual goods types) to the
   specified connections.
@@ -9746,6 +9773,7 @@ void send_rulesets(struct conn_list *dest)
   send_ruleset_roads(dest);
   send_ruleset_resources(dest);
   send_ruleset_terrain(dest);
+  send_ruleset_tiledefs(dest);
   send_ruleset_goods(dest);
   send_ruleset_buildings(dest);
   send_ruleset_styles(dest);
-- 
2.47.2

