The Battle for Wesnoth  1.15.0-dev
lua_object.cpp
Go to the documentation of this file.
1 /*
2  Copyright (C) 2011 - 2018 by Dmitry Kovalenko <nephro.wes@gmail.com>
3  Part of the Battle for Wesnoth Project https://www.wesnoth.org/
4 
5  This program is free software; you can redistribute it and/or modify
6  it under the terms of the GNU General Public License as published by
7  the Free Software Foundation; either version 2 of the License, or
8  (at your option) any later version.
9  This program is distributed in the hope that it will be useful,
10  but WITHOUT ANY WARRANTY.
11 
12  See the COPYING file for more details.
13 */
14 
15 /**
16  * @file
17  * Lua object(code) wrapper implementation
18  */
19 
20 #include "ai/lua/lua_object.hpp"
22 #include "ai/lua/engine_lua.hpp"
23 #include "resources.hpp"
24 #include "scripting/lua_common.hpp"
25 
26 #include "lua/lauxlib.h"
27 
28 namespace ai
29 {
31 {
32  // empty
33 }
34 
35 // MSVC fails to compile without this line
37 
38 template<>
39 std::shared_ptr<aspect_attacks_lua_filter> lua_object<aspect_attacks_lua_filter>::to_type(lua_State* L, int n)
40 {
41  std::shared_ptr<aspect_attacks_lua_filter> att(new aspect_attacks_lua_filter);
42  att->lua = nullptr;
43  att->ref_own_ = att->ref_enemy_ = -1;
44 
45  if(!lua_istable(L, n)) {
46  return att;
47  }
48 
49  lua_getfield(L, n, "own");
50  if(lua_istable(L, -1)) {
51  vconfig vcfg(config(), true);
52  if(luaW_tovconfig(L, -1, vcfg)) {
53  att->filter_own_.reset(new unit_filter(vcfg));
54  }
55  } else if(lua_isfunction(L, -1)) {
56  att->lua = L;
57  att->ref_own_ = luaL_ref(L, LUA_REGISTRYINDEX);
58  assert(att->ref_own_ != -1);
59  }
60 
61  lua_getfield(L, n, "enemy");
62  if(lua_istable(L, -1)) {
63  vconfig vcfg(config(), true);
64  if(luaW_tovconfig(L, -1, vcfg)) {
65  att->filter_enemy_.reset(new unit_filter(vcfg));
66  }
67  } else if(lua_isfunction(L, -1)) {
68  att->lua = L;
69  att->ref_enemy_ = luaL_ref(L, LUA_REGISTRYINDEX);
70  assert(att->ref_enemy_ != -1);
71  }
72 
73  lua_pop(L, 2);
74  return att;
75 }
76 
77 } // end of namespace ai
bool luaW_tovconfig(lua_State *L, int index, vconfig &vcfg)
Gets an optional vconfig from either a table or a userdata.
Definition: lua_common.cpp:816
LUALIB_API int luaL_ref(lua_State *L, int t)
Definition: lauxlib.cpp:595
Lua object(value) wrapper implementation.
#define lua_pop(L, n)
Definition: lua.h:344
std::shared_ptr< T > to_type(lua_State *, int)
Definition: lua_object.hpp:76
A small explanation about what&#39;s going on here: Each action has access to two game_info objects First...
Definition: actions.cpp:58
#define lua_isfunction(L, n)
Definition: lua.h:352
Aspect: attacks.
#define LUA_REGISTRYINDEX
Definition: lua.h:42
#define lua_istable(L, n)
Definition: lua.h:353
A variable-expanding proxy for the config class.
Definition: variable.hpp:42
A config object defines a single node in a WML file, with access to child nodes.
Definition: config.hpp:68
LUA_API int lua_getfield(lua_State *L, int idx, const char *k)
Definition: lapi.cpp:622
LUA AI Support engine - creating specific ai components from config.
static map_location::DIRECTION n