From df0453ca167f458e4555d965c1591c35affef26b Mon Sep 17 00:00:00 2001
From: Yona-TYT <yonatan.el.amigo@gmail.com>
Date: Wed, 16 Oct 2024 21:56:40 -0400
Subject: [PATCH] ADD Scenario start_pos, is_drag_tool, is_ctrl and is_shift
 pressed

---
 src/simutrans/dataobj/scenario.cc      | 24 ++++++++++++++++++++++--
 src/simutrans/script/api/api_simple.cc | 10 ++++++++++
 src/simutrans/script/api/api_simple.h  | 13 +++++++++++++
 src/simutrans/script/api_param.h       |  2 ++
 4 files changed, 47 insertions(+), 2 deletions(-)

diff --git a/src/simutrans/dataobj/scenario.cc b/src/simutrans/dataobj/scenario.cc
index 9f4199c8b..b52a4cf06 100644
--- a/src/simutrans/dataobj/scenario.cc
+++ b/src/simutrans/dataobj/scenario.cc
@@ -33,6 +33,7 @@
 #include "../script/api/api.h"
 #include "../script/api_param.h"
 #include "../script/api_class.h"
+#include "../script/api/api_simple.h"
 
 #include "../tpl/plainstringhashtable_tpl.h"
 
 {
 	if (what_scenario != SCRIPTED  &&  what_scenario != SCRIPTED_NETWORK) {
 		return NULL;
@@ -494,8 +495,27 @@ const char* scenario_t::is_work_allowed_here(const player_t* player, uint16 tool
 	// cannot be done for two_click_tool_t's as they depend on routefinding,
 	// which is done per client
 	if (what_scenario == SCRIPTED) {
+
+		koord3d start_pos = koord3d::invalid;
+		bool is_drag_tool = false;
+		bool is_ctrl = false;
+		bool is_shift = false;
+
+		uint8 player_nr = player ? player->get_player_nr() : PLAYER_UNOWNED;
+		if(player_nr != PLAYER_UNOWNED){
+			if (two_click_tool_t *two_tool = dynamic_cast<two_click_tool_t*>(welt->get_tool(player_nr))) {
+				start_pos = two_tool->get_start_pos();
+				is_drag_tool = !two_tool->is_first_click();
+				is_ctrl = two_tool->is_ctrl_pressed();
+				is_shift = two_tool->is_shift_pressed();
+			}
+			else if (tool_t *tool = dynamic_cast<tool_t*>(welt->get_tool(player_nr))) {
+				is_ctrl = tool->is_ctrl_pressed();
+				is_shift = tool->is_shift_pressed();
+			}
+		}
 		static plainstring msg;
-		const char *err = script->call_function(script_vm_t::FORCE, "is_work_allowed_here", msg, (uint8)(player ? player->get_player_nr() : PLAYER_UNOWNED), tool_id, pos);
+		const char *err = script->call_function(script_vm_t::FORCE, "is_work_allowed_here", msg, (uint8)(player ? player->get_player_nr() : PLAYER_UNOWNED), tool_id, pos, script_api::mytool_data_t(start_pos, is_drag_tool, is_ctrl, is_shift));
 
 		return err == NULL ? msg.c_str() : NULL;
 	}
diff --git a/src/simutrans/script/api/api_simple.cc b/src/simutrans/script/api/api_simple.cc
index 7fae978dc..49a29e4c5 100644
--- a/src/simutrans/script/api/api_simple.cc
+++ b/src/simutrans/script/api/api_simple.cc
@@ -67,6 +67,16 @@ SQInteger param<mytime_ticks_t>::push(HSQUIRRELVM vm, mytime_ticks_t const& v)
 	return 1;
 }
 
+SQInteger param<mytool_data_t>::push(HSQUIRRELVM vm, mytool_data_t const& v)
+{
+	sq_newtableex(vm, 6);
+	create_slot<koord3d>(vm, "start_pos",	v.start_pos);
+	create_slot<bool>(vm, "is_drag_tool",	v.is_drag_tool);
+	create_slot<bool>(vm, "is_ctrl",		v.is_ctrl);
+	create_slot<bool>(vm, "is_shift",		v.is_shift);
+	return 1;
+}
+
 
 mytime_t param<mytime_t>::get(HSQUIRRELVM vm, SQInteger index)
 {
diff --git a/src/simutrans/script/api/api_simple.h b/src/simutrans/script/api/api_simple.h
index 77a23a2da..4d94d7156 100644
--- a/src/simutrans/script/api/api_simple.h
+++ b/src/simutrans/script/api/api_simple.h
@@ -58,6 +58,19 @@ namespace script_api {
 			ticks(t), ticks_per_month(tpm), next_month_ticks(nmt)
 		{}
 	};
+
+	struct mytool_data_t 
+	{
+		koord3d start_pos;
+		bool is_drag_tool;
+		bool is_ctrl;
+		bool is_shift;
+
+		mytool_data_t(koord3d pos, bool drag, bool ctrl, bool shift) :
+			start_pos(pos), is_drag_tool(drag), is_ctrl(ctrl), is_shift(shift)
+		{}
+	};
+
 };
 
 #endif
diff --git a/src/simutrans/script/api_param.h b/src/simutrans/script/api_param.h
index 2d290bd03..7f29b96e0 100644
--- a/src/simutrans/script/api_param.h
+++ b/src/simutrans/script/api_param.h
@@ -64,6 +64,7 @@ namespace script_api {
 	// forward declaration
 	struct mytime_t;
 	struct mytime_ticks_t;
+	struct mytool_data_t;
 
 	/**
 	 * Templated interface to transfer variables from / to squirrel.
@@ -400,6 +401,7 @@ namespace script_api {
 	declare_specialized_param(schedule_entry_t, "t|x|y", "schedule_entry_x");
 	declare_specialized_param(mytime_t, "i|t|x|y", "time_x");
 	declare_specialized_param(mytime_ticks_t, "i|t|x|y", "time_ticks_x");
+	declare_specialized_param(mytool_data_t, "i|t|x|y", "tool_data_x");
 	declare_specialized_param(scenario_t*, "t|x|y", "");
 	declare_specialized_param(simline_t*, "t|x|y", "line_x");
 	declare_specialized_param(player_t*, "t|x|y", "player_x");
-- 
2.47.0

