From 67078daf1c2df2fcf2f84f84362a7d129aaab572 Mon Sep 17 00:00:00 2001 From: Ihnatus Date: Wed, 9 Feb 2022 21:06:24 +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 da7462e3f2..caae208058 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 16e0f177c4..bfd40b76a2 100644 --- a/server/srv_main.c +++ b/server/srv_main.c @@ -1260,6 +1260,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; + } random_movements(pplayer); execute_unit_orders(pplayer); flush_packets(); @@ -1416,7 +1423,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 @@ -1456,6 +1474,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