From e1f90da11e130cff5a5fc6070b4264b1bff6d0f9 Mon Sep 17 00:00:00 2001 From: Ihnatus Date: Mon, 7 Feb 2022 22:14:30 +0300 Subject: [PATCH] Add signals for player phase stages. player_alive_phase_end and player_phase_end are added where currently there are per-turn bonuses that may be unhardcoded by Lua, player_phase_begin is added for symmetry. See OSDN#42663 Signed-off-by: Ihnatus --- server/scripting/script_server.c | 7 +++++++ server/srv_main.c | 25 +++++++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/server/scripting/script_server.c b/server/scripting/script_server.c index ee4e44eb33..eb382099db 100644 --- a/server/scripting/script_server.c +++ b/server/scripting/script_server.c @@ -430,6 +430,13 @@ static void script_server_signals_create(void) API_TYPE_INT, API_TYPE_INT); deprecate_signal(depr, "turn_started", "turn_begin", "3.0"); + luascript_signal_create(fcl_main, "player_phase_begin", 2, + API_TYPE_PLAYER, API_TYPE_BOOL); + luascript_signal_create(fcl_main, "player_alive_phase_end", 1, + API_TYPE_PLAYER); + luascript_signal_create(fcl_main, "player_phase_end", 1, + API_TYPE_PLAYER); + luascript_signal_create(fcl_main, "unit_moved", 3, API_TYPE_UNIT, API_TYPE_TILE, API_TYPE_TILE); diff --git a/server/srv_main.c b/server/srv_main.c index fd081cbbca..50a0f9cb62 100644 --- a/server/srv_main.c +++ b/server/srv_main.c @@ -1252,6 +1252,13 @@ static void begin_phase(bool is_new_phase) /* Execute orders after activities have been completed (roads built, * pillage done, etc.). */ phase_players_iterate(pplayer) { + int plrid = player_number(pplayer); + + script_server_signal_emit("player_phase_begin", pplayer, is_new_phase); + if (player_by_number(plrid) != pplayer) { + /* removed */ + continue; + } execute_unit_orders(pplayer); flush_packets(); } phase_players_iterate_end; @@ -1407,7 +1414,18 @@ static void end_phase(void) } phase_players_iterate_end; alive_phase_players_iterate(pplayer) { + int plrid = player_number(pplayer); + do_tech_parasite_effect(pplayer); + script_server_signal_emit("player_alive_phase_end", pplayer); + if (player_by_number(plrid) != pplayer) { + /* removed */ + continue; + } + if (!pplayer->is_alive) { + /* died */ + continue; + } player_restore_units(pplayer); /* If player finished spaceship parts last turn already, and didn't place them @@ -1447,6 +1465,13 @@ static void end_phase(void) do_border_vision_effect(); phase_players_iterate(pplayer) { + int plrid = player_number(pplayer); + + script_server_signal_emit("player_phase_end", pplayer); + if (player_by_number(plrid) != pplayer) { + /* removed */ + continue; + } CALL_PLR_AI_FUNC(phase_finished, pplayer, pplayer); /* This has to be after all access to advisor data. */ /* We used to run this for ai players only, but data phase -- 2.32.0