static int cfun_ai_execute_attack(lua_State *L) { int index = 1; if (false) { error_call_destructors: return luaL_typerror(L, index, "location (unit/integers)"); } ai::readonly_context &context = get_readonly_context(L); int side = context.get_side(); map_location attacker, defender; if (!to_map_location(L, index, attacker)) goto error_call_destructors; if (!to_map_location(L, index, defender)) goto error_call_destructors; int attacker_weapon = -1;//-1 means 'select what is best' double aggression = context.get_aggression();//use the aggression from the context if (!lua_isnoneornil(L, index+1) && lua_isnumber(L,index+1)) { aggression = lua_tonumber(L, index+1); } if (!lua_isnoneornil(L, index)) { attacker_weapon = lua_tointeger(L, index); } ai::attack_result_ptr attack_result = ai::actions::execute_attack_action(side,true,attacker,defender,attacker_weapon,aggression); return transform_ai_action(L,attack_result); }
static int ai_move(lua_State *L, bool exec, bool remove_movement) { int index = 1; if (false) { error_call_destructors: return luaL_typerror(L, index, "location (unit/integers)"); } int side = get_readonly_context(L).get_side(); map_location from, to; if (!to_map_location(L, index, from)) goto error_call_destructors; if (!to_map_location(L, index, to)) goto error_call_destructors; bool unreach_is_ok = false; if (lua_isboolean(L, index)) { unreach_is_ok = lua_toboolean(L, index); } ai::move_result_ptr move_result = ai::actions::execute_move_action(side,exec,from,to,remove_movement, unreach_is_ok); return transform_ai_action(L,move_result); }
static int ai_attack(lua_State *L, bool exec) { int index = 1; if (false) { error_call_destructors: return luaL_typerror(L, index, "location (unit/integers)"); } ai::readonly_context &context = get_readonly_context(L); int side = context.get_side(); map_location attacker, defender; if (!to_map_location(L, index, attacker)) goto error_call_destructors; if (!to_map_location(L, index, defender)) goto error_call_destructors; int attacker_weapon = -1;//-1 means 'select what is best' double aggression = context.get_aggression();//use the aggression from the context if (!lua_isnoneornil(L, index)) { attacker_weapon = lua_tointeger(L, index); if (attacker_weapon != -1) { attacker_weapon--; // Done for consistency of the Lua style } } //TODO: Right now, aggression is used by the attack execution functions to determine the weapon to be used. // If a decision is made to expand the function that determines the weapon, this block must be refactored // to parse aggression if a single int is on the stack, or create a table of parameters, if a table is on the // stack. if (!lua_isnoneornil(L, index + 1) && lua_isnumber(L,index + 1)) { aggression = lua_tonumber(L, index + 1); } unit_advancements_aspect advancements = context.get_advancements(); ai::attack_result_ptr attack_result = ai::actions::execute_attack_action(side,exec,attacker,defender,attacker_weapon,aggression,advancements); return transform_ai_action(L,attack_result); }
static int ai_stopunit_select(lua_State *L, bool exec, bool remove_movement, bool remove_attacks) { int index = 1; if (false) { error_call_destructors: return luaL_typerror(L, index, "location (unit/integers)"); } int side = get_readonly_context(L).get_side(); map_location loc; if (!to_map_location(L, index, loc)) goto error_call_destructors; ai::stopunit_result_ptr stopunit_result = ai::actions::execute_stopunit_action(side,exec,loc,remove_movement,remove_attacks); return transform_ai_action(L,stopunit_result); }