From 851b60980ea5a5eab48f5d9722a47709fa40abf3 Mon Sep 17 00:00:00 2001
From: Yona-TYT <yonatan.el.amigo@gmail.com>
Date: Sun, 10 Nov 2024 07:27:13 -0400
Subject: [PATCH] ADD get builds list from city_x

---
 src/simutrans/script/api/api_city.cc                | 13 ++++++++++++-
 src/simutrans/script/api/squirrel_types_ai.awk      |  1 +
 .../script/api/squirrel_types_scenario.awk          |  1 +
 src/simutrans/world/simcity.cc                      |  8 ++++++++
 src/simutrans/world/simcity.h                       |  5 +++++
 5 files changed, 27 insertions(+), 1 deletion(-)

diff --git a/src/simutrans/script/api/api_city.cc b/src/simutrans/script/api/api_city.cc
index 8ba6f228f..bc7a4dc24 100644
--- a/src/simutrans/script/api/api_city.cc
+++ b/src/simutrans/script/api/api_city.cc
@@ -36,7 +36,6 @@ vector_tpl<sint64> const& get_city_stat(stadt_t* city, bool monthly, sint32 INDE
 	return v;
 }
 
-
 SQInteger world_get_next_city(HSQUIRRELVM vm)
 {
 	return generic_get_next(vm, welt->get_cities().get_count());
@@ -77,6 +76,12 @@ call_tool_work city_change_size(stadt_t *city, sint32 delta)
 	}
 }
 
+vector_tpl<gebaeude_t*> const& city_get_builds_list(stadt_t *city)
+{
+	static vector_tpl<gebaeude_t*> list;
+	city->get_builds_list(list);
+	return list;
+}
 
 void export_city(HSQUIRRELVM vm)
 {
@@ -256,5 +261,11 @@ void export_city(HSQUIRRELVM vm)
 	 */
 	register_method(vm, &set_citygrowth, "set_citygrowth_enabled", true);
 
+	/**
+	 * Get list of all buildings in this city.
+	 * @returns array of building_x objects
+	 */
+	register_method(vm, &city_get_builds_list, "get_builds_list", true);
+
 	end_class(vm);
 }
diff --git a/src/simutrans/script/api/squirrel_types_ai.awk b/src/simutrans/script/api/squirrel_types_ai.awk
index d0e5b23f0..9fbeff262 100644
--- a/src/simutrans/script/api/squirrel_types_ai.awk
+++ b/src/simutrans/script/api/squirrel_types_ai.awk
@@ -31,6 +31,7 @@ BEGIN {
 	export_types_ai["city_x::get_pos_se"] = "coord()"
 	export_types_ai["city_x::change_size"] = "string(integer)"
 	export_types_ai["city_x::set_citygrowth_enabled"] = "void(bool)"
+	export_types_ai["city_x::get_builds_list"] = "array<building_x>()"
 	export_types_ai["::get_ops_total"] = "integer()"
 	export_types_ai["::get_ops_remaining"] = "integer()"
 	export_types_ai["debug::pause"] = "bool()"
diff --git a/src/simutrans/script/api/squirrel_types_scenario.awk b/src/simutrans/script/api/squirrel_types_scenario.awk
index 7032b7f64..6caa64493 100644
--- a/src/simutrans/script/api/squirrel_types_scenario.awk
+++ b/src/simutrans/script/api/squirrel_types_scenario.awk
@@ -31,6 +31,7 @@ BEGIN {
 	export_types_scenario["city_x::get_pos_se"] = "coord()"
 	export_types_scenario["city_x::change_size"] = "string(integer)"
 	export_types_scenario["city_x::set_citygrowth_enabled"] = "void(bool)"
+	export_types_scenario["city_x::get_builds_list"] = "array<building_x>()"
 	export_types_scenario["::get_ops_total"] = "integer()"
 	export_types_scenario["::get_ops_remaining"] = "integer()"
 	export_types_scenario["debug::pause"] = "bool()"
diff --git a/src/simutrans/world/simcity.cc b/src/simutrans/world/simcity.cc
index 7ff35be7c..17d1dbf48 100644
--- a/src/simutrans/world/simcity.cc
+++ b/src/simutrans/world/simcity.cc
@@ -624,6 +624,14 @@ void stadt_t::update_gebaeude_from_stadt(gebaeude_t* gb)
 	buildings.append(gb, gb->get_tile()->get_desc()->get_level() + 1);
 }
 
+// get buildings list for script API
+void stadt_t::get_builds_list( vector_tpl<gebaeude_t*> &build_list ) const
+{
+	build_list.clear();
+	for(gebaeude_t* const i : buildings) {
+		build_list.append( i );
+	}
+}
 
 void stadt_t::pruefe_grenzen(koord /*k*/, koord /*size*/)
 {
diff --git a/src/simutrans/world/simcity.h b/src/simutrans/world/simcity.h
index 9499e1706..2ede9b00f 100644
--- a/src/simutrans/world/simcity.h
+++ b/src/simutrans/world/simcity.h
@@ -423,6 +423,10 @@ public:
 	// (called when removed by player, or by town)
 	void remove_gebaeude_from_stadt(gebaeude_t *gb);
 
+	// get buildings list for script API
+	// It is only called from a script
+	void get_builds_list( vector_tpl<gebaeude_t*> &fields_list ) const;
+
 	/**
 	 * This function adds houses to the city house list.
 	 * @param ordered true for multithreaded loading, will insert buidings ordered, will not update city limits
@@ -514,6 +518,7 @@ public:
 
 	void new_month( bool recalc_destinations );
 
+
 private:
 	/**
 	 * List of target cities weighted by both city size and distance
-- 
2.47.0

