From ab931d23c0406f7e03bbcbff896788fd7c76b557 Mon Sep 17 00:00:00 2001
From: Yona-TYT <yonatan.el.amigo@gmail.com>
Date: Thu, 1 Dec 2022 05:35:11 -0400
Subject: [PATCH] Add get label list 2

---
 src/simutrans/script/api/api_world.cc         | 56 +++++++++++++++++++
 .../script/api/squirrel_types_ai.awk          |  1 +
 .../script/api/squirrel_types_scenario.awk    |  1 +
 3 files changed, 58 insertions(+)

diff --git a/src/simutrans/script/api/api_world.cc b/src/simutrans/script/api/api_world.cc
index 63496d331..58c8aadf5 100644
--- a/src/simutrans/script/api/api_world.cc
+++ b/src/simutrans/script/api/api_world.cc
@@ -16,6 +16,7 @@
 #include "../../simversion.h"
 #include "../../player/simplay.h"
 #include "../../obj/gebaeude.h"
+#include "../../obj/label.h"
 #include "../../descriptor/ground_desc.h"
 #include "../../simware.h"
 #include "../../builder/goods_manager.h"
@@ -200,6 +201,49 @@ const char* get_version_number()
 	return VERSION_NUMBER;
 }
 
+vector_tpl<label_t*> const generic_get_label_list()
+{
+	vector_tpl<label_t*> list;
+	list.clear();
+
+	// fill list
+	for(koord const& k : welt->get_label_list()) {
+		label_t* label = welt->lookup_kartenboden(k)->find<label_t>();
+		list.append(label);
+	}
+	return list;
+}
+
+SQInteger generic_get_label_count(HSQUIRRELVM vm)
+{
+	vector_tpl<label_t*> const list = generic_get_label_list();
+	return !list.empty() ? param<uint32>::push(vm, list.get_count()) : param<uint32>::push(vm, 0);
+}
+
+SQInteger generic_get_next_label(HSQUIRRELVM vm)
+{
+	vector_tpl<label_t*> const list = generic_get_label_list();
+	return !list.empty() ? generic_get_next(vm, list.get_count()) : generic_get_next(vm, 0);
+}
+
+SQInteger generic_get_label_by_index(HSQUIRRELVM vm)
+{
+	vector_tpl<label_t*> const list = generic_get_label_list();
+	uint32 index = param<uint32>::get(vm, 2);
+
+	if (index < list.get_count()) {
+		label_t* label = (list)[index];
+		koord pos = label->get_pos().get_2d();
+		coordinate_transform_t::koord_w2sq(pos);
+		sint16 x = pos.x;
+		sint16 y = pos.y;
+		sint8  z = label->get_pos().z;
+
+		return push_instance(vm, "label_x", x, y, z);
+	}
+	return SQ_OK;
+}
+
 void export_world(HSQUIRRELVM vm, bool scenario)
 {
 	/**
@@ -422,6 +466,8 @@ void export_world(HSQUIRRELVM vm, bool scenario)
 	 */
 	STATIC register_function(vm, world_get_size, "get_size", 1, ".");
 
+	STATIC register_function(vm, world_get_label_list, "get_label_list", 1, ".");
+
 	end_class(vm);
 
 	/**
@@ -462,4 +508,14 @@ void export_world(HSQUIRRELVM vm, bool scenario)
 	 * Returns simutrans version number
 	 */
 	register_method(vm, get_version_number, "get_version_number");
+
+	begin_class(vm, "label_list_x");
+
+	register_function(vm, generic_get_next_label,     "_nexti",  2, "x o|i");
+
+	register_function(vm, generic_get_label_by_index, "_get",    2, "xi");
+
+	register_function(vm, generic_get_label_count, "get_count",  1, "x");
+
+	end_class(vm);
 }
diff --git a/src/simutrans/script/api/squirrel_types_ai.awk b/src/simutrans/script/api/squirrel_types_ai.awk
index a9cf20340..7ee3a007c 100644
--- a/src/simutrans/script/api/squirrel_types_ai.awk
+++ b/src/simutrans/script/api/squirrel_types_ai.awk
@@ -393,6 +393,7 @@ BEGIN {
 	export_types_ai["world::get_year_ratio_goods"] = "array<integer>()"
 	export_types_ai["world::get_year_transported_goods"] = "array<integer>()"
 	export_types_ai["world::use_timeline"] = "bool()"
+	export_types_ai["world::get_label_list"] = "array<label_x>()"
 	export_types_ai["attraction_list_x::_get"] = "building_x(integer)"
 	export_types_ai["::get_pakset_name"] = "string()"
 	export_types_ai["::get_version_number"] = "string()"
diff --git a/src/simutrans/script/api/squirrel_types_scenario.awk b/src/simutrans/script/api/squirrel_types_scenario.awk
index 7ccebccee..86b98f080 100644
--- a/src/simutrans/script/api/squirrel_types_scenario.awk
+++ b/src/simutrans/script/api/squirrel_types_scenario.awk
@@ -413,6 +413,7 @@ BEGIN {
 	export_types_scenario["world::get_year_ratio_goods"] = "array<integer>()"
 	export_types_scenario["world::get_year_transported_goods"] = "array<integer>()"
 	export_types_scenario["world::use_timeline"] = "bool()"
+	export_types_scenario["world::get_label_list"] = "array<label_x>()"
 	export_types_scenario["attraction_list_x::_get"] = "building_x(integer)"
 	export_types_scenario["::get_pakset_name"] = "string()"
 	export_types_scenario["::get_version_number"] = "string()"
-- 
2.38.1

