The Battle for Wesnoth  1.17.12+dev
game_lua_kernel.hpp
Go to the documentation of this file.
1 /*
2  Copyright (C) 2009 - 2022
3  by Guillaume Melquiond <guillaume.melquiond@gmail.com>
4  Part of the Battle for Wesnoth Project https://www.wesnoth.org/
5 
6  This program is free software; you can redistribute it and/or modify
7  it under the terms of the GNU General Public License as published by
8  the Free Software Foundation; either version 2 of the License, or
9  (at your option) any later version.
10  This program is distributed in the hope that it will be useful,
11  but WITHOUT ANY WARRANTY.
12 
13  See the COPYING file for more details.
14 */
15 
16 #pragma once
17 
18 #include "scripting/lua_kernel_base.hpp" // for lua_kernel_base
19 
20 #include "game_events/action_wml.hpp" // for wml_action, etc
21 
22 #include <stack>
23 #include <string> // for string
24 
25 class config;
26 class game_config_view;
27 class unit;
28 class vconfig;
29 namespace ai { class engine_lua; }
30 namespace ai { class lua_ai_action_handler; }
31 namespace ai { class lua_ai_context; }
32 namespace game_events { struct queued_event; }
33 
34 class game_display;
35 class game_state;
36 class game_board;
37 class unit_map;
38 class gamemap;
39 class team;
40 class game_data;
41 class tod_manager;
42 class play_controller;
43 class reports;
44 
45 struct map_location;
46 typedef int (*lua_CFunction) (lua_State *L);
47 
49 {
54 
55  // Private functions to ease access to parts of game_state
56  unit_map & units();
57  game_data & gamedata();
58  tod_manager & tod_man();
59 
62  bool has_preloaded_ = false;
63 
64  std::stack<game_events::queued_event const * > queued_events_;
65 
66  const game_events::queued_event & get_event_info();
67 
68  static void extract_preload_scripts(const game_config_view& game_config);
69  static std::vector<config> preload_scripts;
71 
72  friend class game_config_manager; // to allow it to call extract_preload_scripts
73 
74  // Private lua callbacks
75  int intf_allow_end_turn(lua_State *);
76  int intf_allow_undo(lua_State *);
77  int intf_cancel_action(lua_State *);
78  int intf_add_time_area(lua_State *);
79  int intf_remove_time_area(lua_State *);
80  int intf_get_time_area(lua_State *);
81  int intf_animate_unit(lua_State *);
82  int intf_gamestate_inspector(lua_State *);
83  int impl_run_animation(lua_State *);
84  int intf_create_animator(lua_State *);
85  int intf_get_unit(lua_State *);
86  int intf_get_units(lua_State *);
87  int intf_get_displayed_unit(lua_State*);
88  int intf_match_unit(lua_State *L);
89  int intf_get_recall_units(lua_State *L);
90  int intf_get_variable(lua_State *L);
91  int intf_set_variable(lua_State *L);
92  int intf_highlight_hex(lua_State *L);
93  int intf_is_enemy(lua_State *L);
94  int intf_unit_ability(lua_State *L);
95  int intf_view_locked(lua_State *L);
96  int intf_lock_view(lua_State *L);
97  int impl_get_terrain_info(lua_State *L);
98  template<bool consider_illuminates>
99  int intf_get_time_of_day(lua_State *L);
100  int impl_schedule_get(lua_State *L);
101  int impl_schedule_len(lua_State *L);
102  void luaW_push_schedule(lua_State* L, int area_index);
103  int intf_get_village_owner(lua_State *L);
104  int intf_set_village_owner(lua_State *L);
105  int intf_get_mouseover_tile(lua_State *L);
106  int intf_get_selected_tile(lua_State *L);
107  int impl_game_config_get(lua_State *L) override;
108  int impl_game_config_set(lua_State *L) override;
109  int impl_scenario_get(lua_State *L);
110  int impl_scenario_set(lua_State *L);
111  int impl_current_get(lua_State *L);
112  int intf_clear_messages(lua_State*);
113  int impl_end_level_data_set(lua_State*);
114  int intf_end_turn(lua_State*);
115  int intf_find_cost_map(lua_State *L);
116  int intf_find_path(lua_State *L);
117  int intf_find_reach(lua_State *L);
118  int intf_find_vision_range(lua_State *L);
119  int intf_heal_unit(lua_State *L);
120  int intf_message(lua_State *L);
121  int intf_play_sound(lua_State *L);
122  int intf_set_achievement(lua_State *L);
123  int intf_has_achievement(lua_State *L);
124  int intf_get_achievement(lua_State *L);
125  int intf_set_floating_label(lua_State* L, bool spawn);
126  int intf_remove_floating_label(lua_State* L);
127  int intf_move_floating_label(lua_State* L);
128  void put_unit_helper(const map_location& loc);
129  int intf_put_unit(lua_State *L);
130  int intf_erase_unit(lua_State *L);
131  int intf_put_recall_unit(lua_State *L);
132  int intf_extract_unit(lua_State *L);
133  int intf_find_vacant_tile(lua_State *L);
134  int intf_float_label(lua_State *L);
135  int intf_set_end_campaign_credits(lua_State *L);
136  int intf_set_end_campaign_text(lua_State *L);
137  int intf_clear_menu_item(lua_State *L);
138  int intf_create_side(lua_State *L);
139  int intf_set_menu_item(lua_State *L);
140  int intf_toggle_shroud(lua_State *L, bool place_shroud);
141  int intf_override_shroud(lua_State *L);
142  int intf_simulate_combat(lua_State *L);
143  int intf_scroll_to_tile(lua_State *L);
144  int intf_select_unit(lua_State *L);
145  int intf_deselect_hex(lua_State *L);
146  int intf_is_skipping_messages(lua_State *L);
147  int intf_skip_messages(lua_State *L);
148  int intf_get_locations(lua_State *L);
149  int intf_match_location(lua_State *L);
150  int intf_match_side(lua_State *L);
151  int intf_set_side_id(lua_State *L);
152  int intf_modify_ai_wml(lua_State *L);
153  int intf_get_sides(lua_State* L);
154  int intf_get_side(lua_State* L);
155  int intf_add_tile_overlay(lua_State *L);
156  int intf_remove_tile_overlay(lua_State *L);
157  template<bool is_menu_item>
158  int intf_add_event_simple(lua_State* L);
159  int intf_add_event_wml(lua_State* L);
160  int intf_add_event(lua_State *L);
161  int intf_remove_event(lua_State *L);
162  int intf_color_adjust(lua_State *L);
163  int intf_get_color_adjust(lua_State *L);
164  int intf_screen_fade(lua_State *L);
165  int intf_delay(lua_State *L);
166  int intf_add_label(lua_State *L);
167  int intf_remove_label(lua_State *L);
168  int intf_get_label(lua_State* L);
169  int intf_redraw(lua_State *L);
170  int intf_replace_schedule(lua_State *l);
171  int impl_schedule_set(lua_State *L);
172  int intf_scroll(lua_State *L);
173  int intf_get_all_vars(lua_State *L);
174  int impl_theme_item(lua_State *L, std::string name);
175  int impl_theme_items_get(lua_State *L);
176  int impl_theme_items_set(lua_State *L);
177  int cfun_builtin_effect(lua_State *L);
178  int cfun_wml_action(lua_State *L);
179  int intf_fire_event(lua_State *L, const bool by_id);
180  int intf_fire_wml_menu_item(lua_State *L);
181  int intf_teleport(lua_State *L);
182  int intf_log(lua_State *L);
183  int intf_toggle_fog(lua_State *L, const bool clear);
184  int intf_get_fog_or_shroud(lua_State *L, bool fog);
185  int intf_log_replay(lua_State* L);
186  int intf_zoom(lua_State* L);
187 
188  //private helpers
189  std::string synced_state();
190  void lua_chat(const std::string& caption, const std::string& msg);
191  std::vector<int> get_sides_vector(const vconfig& cfg);
192 
193 public:
194  game_board & board();
195  std::vector<team> & teams();
196  const gamemap & map() const;
197  game_display * get_display() const { return game_display_; }
198  /**
199  A value != 0 means that the shouldn't remove any units from the map, usually because
200  we are currently operating on a unit& and removing it might cause memory corruptions
201  note that we don't check for the dtor of lua owned units because we assume that
202  we operate on such a unit that the lua function that invoked the operation on that unit
203  (like wesnoth.units.add_modification, wesnoth.units.matches ..) have a local copy of that
204  lua_unit* userdata in its stack that prevents it from being collected.
205  */
208 
209  void set_game_display(game_display * gd);
210 
211  virtual std::string my_name() override { return "Game Lua Kernel"; }
212 
213  std::string apply_effect(const std::string& name, unit& u, const config& cfg, bool need_apply);
214  void initialize(const config& level);
215  void save_game(config & level);
216  void load_game(const config& level);
217  bool run_event(const game_events::queued_event&);
218  void custom_command(const std::string&, const config&);
219  void push_builtin_effect();
220  void set_wml_action(const std::string&, game_events::wml_action::handler);
221  void set_wml_condition(const std::string&, bool(*)(const vconfig&));
222  bool run_wml_action(const std::string&, const vconfig&,
224  bool run_filter(char const *name, const unit& u);
225  bool run_filter(char const *name, const map_location& l);
226  bool run_filter(char const *name, const team& t);
227  bool run_filter(char const *name, int nArgs);
228  bool run_wml_conditional(const std::string&, const vconfig&);
229  /**
230  * Store a WML event in the Lua registry, as a function.
231  * Uses a default function that interprets ActionWML.
232  * @return A unique index into the EVENT_TABLE within the Lua registry
233  */
234  int save_wml_event();
235  /**
236  * Store a WML event in the Lua registry, as a function.
237  * Compiles the function from the given code.
238  * @param name The event name, used to generate a chunk name for the compiled function
239  * @param id The event id, used to generate a chunk name for the compiled function
240  * @param code The actual code of the function
241  * @return A unique index into the EVENT_TABLE within the Lua registry
242  */
243  int save_wml_event(const std::string& name, const std::string& id, const std::string& code);
244  /**
245  * Store a WML event in the Lua registry, as a function.
246  * Uses the function at the specified Lua stack index.
247  * @param idx The Lua stack index of the function to store
248  * @return A unique index into the EVENT_TABLE within the Lua registry
249  */
250  int save_wml_event(int idx);
251  /**
252  * Clear a WML event store in the Lua registry.
253  * @param ref The unique index into the EVENT_TABLE within the Lua registry
254  */
255  void clear_wml_event(int ref);
256  /**
257  * Run a WML stored in the Lua registry.
258  * @param ref The unique index into the EVENT_TABLE within the Lua registry
259  * @param args Arguments to pass to the event function, as a config
260  * @param ev The event data for the event being fired
261  * @param out If non-null, receives the result of the called function (provided it is a boolean value)
262  * @return Whether the function was successfully called; could be false if @a ref was invalid or if the function raised an error
263  */
264  bool run_wml_event(int ref, const vconfig& args, const game_events::queued_event& ev, bool* out = nullptr);
265 
266  virtual void log_error(char const* msg, char const* context = "Lua error") override;
267 
268  ai::lua_ai_context* create_lua_ai_context(char const *code, ai::engine_lua *engine);
269  ai::lua_ai_action_handler* create_lua_ai_action_handler(char const *code, ai::lua_ai_context &context);
270 
271  void mouse_over_hex_callback(const map_location& loc);
272  void select_hex_callback(const map_location& loc);
273  void preload_finished() {has_preloaded_ = true;}
274 };
std::stack< game_events::queued_event const *> queued_events_
Game board class.
Definition: game_board.hpp:52
int map_locked_
A value != 0 means that the shouldn&#39;t remove any units from the map, usually because we are currently...
game_display * game_display_
This class represents a single unit of a specific type.
Definition: unit.hpp:133
int(* lua_CFunction)(lua_State *L)
void clear(const std::string &key)
Definition: general.cpp:190
virtual std::string my_name() override
User-visible name of the lua kernel that they are talking to.
const std::string & gamedata
Define actions for the game&#39;s events mechanism.
static void msg(const char *act, debug_info &i, const char *to="", const char *result="")
Definition: debugger.cpp:110
void(* handler)(const queued_event &, const vconfig &)
Definition: action_wml.hpp:50
Unit and team statistics.
bool fog()
Definition: game.cpp:526
This class stores all the data for a single &#39;side&#39; (in game nomenclature).
Definition: team.hpp:75
A small explanation about what&#39;s going on here: Each action has access to two game_info objects First...
Definition: actions.cpp:61
static int intf_delay(lua_State *L)
Proxy table for the AI context.
Definition: core.hpp:33
Encapsulates the map of the game.
Definition: map.hpp:171
play_controller & play_controller_
Encapsulates the map of the game.
Definition: location.hpp:38
Domain specific events.
Game configuration data as global variables.
Definition: build_info.cpp:60
Proxy class for calling AI action handlers defined in Lua.
Definition: core.hpp:70
double t
Definition: astarsearch.cpp:65
static int intf_find_path(lua_State *L)
Finds a path between two locations.
A variable-expanding proxy for the config class.
Definition: variable.hpp:44
static config preload_config
Container associating units to locations.
Definition: map.hpp:98
game_display * get_display() const
A config object defines a single node in a WML file, with access to child nodes.
Definition: config.hpp:60
std::string custom_command()
Definition: game.cpp:927
game_state & game_state_
static std::vector< config > preload_scripts
static int intf_log(lua_State *L)
Logs a message Arg 1: (optional) Logger Arg 2: Message.