/** * Gets the attacks of a unit or unit type (__index metamethod). * - Arg 1: table containing the userdata containing the unit or unit type. * - Arg 2: index (int) or id (string) identifying a particular attack. * - Ret 1: the unit's attacks. */ static int impl_unit_attacks_get(lua_State *L) { if(!lua_istable(L, 1)) { return luaW_type_error(L, 1, "unit attacks"); } lua_rawgeti(L, 1, 0); lua_unit* lu = luaW_tounit_ref(L, -1); const unit_type* ut = luaW_tounittype(L, -1); if(lu && lu->get()) { unit* u = lu->get(); attack_ptr atk = lua_isnumber(L, 2) ? find_attack(u, luaL_checkinteger(L, 2) - 1) : find_attack(u, luaL_checkstring(L, 2)); luaW_pushweapon(L, atk); } else if(ut) { const_attack_ptr atk = lua_isnumber(L, 2) ? find_attack(ut, luaL_checkinteger(L, 2) - 1) : find_attack(ut, luaL_checkstring(L, 2)); luaW_pushweapon(L, atk); } else { return luaL_argerror(L, 1, "unit not found"); } return 1; }
static int intf_create_attack(lua_State* L) { auto atk = std::make_shared<attack_type>(luaW_checkconfig(L, 1)); luaW_pushweapon(L, atk); return 1; }