From e420f1176b89983cb14da77761f388f139be4c26 Mon Sep 17 00:00:00 2001
From: Yona-TYT <yonatan.el.amigo@gmail.com>
Date: Mon, 23 Mar 2026 15:10:04 -0400
Subject: [PATCH] Script API add  get_cursor_pos

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

diff --git a/src/simutrans/script/api/api_world.cc b/src/simutrans/script/api/api_world.cc
index 43ba2987c..c91af70b7 100644
--- a/src/simutrans/script/api/api_world.cc
+++ b/src/simutrans/script/api/api_world.cc
@@ -17,6 +17,7 @@
 #include "../../player/simplay.h"
 #include "../../obj/gebaeude.h"
 #include "../../obj/label.h"
+#include "../../obj/zeiger.h"
 #include "../../descriptor/ground_desc.h"
 #include "../../simware.h"
 #include "../../builder/goods_manager.h"
@@ -232,6 +233,17 @@ const char* get_version_number()
 	return VERSION_NUMBER;
 }
 
+/** 
+ * Returns the current mouse cursor position on the map (koord3d).
+ * This is the exact position as shown by the in-game cursor (zeiger).
+ * Returns koord3d::invalid if no valid cursor position is available.
+ */
+static SQInteger world_get_cursor_pos(HSQUIRRELVM vm)
+{
+    koord3d pos = welt->get_zeiger()->get_pos();
+    return param<koord3d>::push(vm, pos);
+}
+
 void export_world(HSQUIRRELVM vm, bool scenario)
 {
 	/**
@@ -462,6 +474,12 @@ void export_world(HSQUIRRELVM vm, bool scenario)
 	 */
 	STATIC register_function(vm, world_get_size, "get_size", 1, ".");
 
+    /**
+     * @returns current cursor position on the map (coord3d_x)
+     * @typemask coord3d()
+     */
+    STATIC register_function(vm, world_get_cursor_pos, "get_cursor_pos", 1, ".");
+
 	end_class(vm);
 
 	/**
diff --git a/src/simutrans/script/api/squirrel_types_ai.awk b/src/simutrans/script/api/squirrel_types_ai.awk
index 54b722a8c..f2b162e3c 100644
--- a/src/simutrans/script/api/squirrel_types_ai.awk
+++ b/src/simutrans/script/api/squirrel_types_ai.awk
@@ -400,6 +400,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_cursor_pos"] = "coord3d()"
 	export_types_ai["attraction_list_x::_get"] = "building_x(integer)"
 	export_types_ai["label_list_x::_get"] = "label_x(integer)"
 	export_types_ai["label_list_x::get_count"] = "integer()"
diff --git a/src/simutrans/script/api/squirrel_types_scenario.awk b/src/simutrans/script/api/squirrel_types_scenario.awk
index e36680c37..bed142456 100644
--- a/src/simutrans/script/api/squirrel_types_scenario.awk
+++ b/src/simutrans/script/api/squirrel_types_scenario.awk
@@ -421,6 +421,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_cursor_pos"] = "coord3d()"
 	export_types_scenario["attraction_list_x::_get"] = "building_x(integer)"
 	export_types_scenario["label_list_x::_get"] = "label_x(integer)"
 	export_types_scenario["label_list_x::get_count"] = "integer()"
-- 
2.43.0

