allow wesnoth.simulate_combat to have defenders not on the map.

just like it does for attackers.
This commit is contained in:
gfgtdf 2018-10-20 19:58:21 +02:00
parent d10c51feb1
commit dccda8294b
3 changed files with 9 additions and 5 deletions

View File

@ -398,14 +398,16 @@ battle_context::battle_context(const unit_map& units,
int defender_weapon,
double aggression,
const combatant* prev_def,
const unit* attacker_ptr)
const unit* attacker_ptr,
const unit* defender_ptr)
: attacker_stats_(nullptr)
, defender_stats_(nullptr)
, attacker_combatant_(nullptr)
, defender_combatant_(nullptr)
{
//TODO: maybe check before dereferencing units.find(attacker_loc),units.find(defender_loc) ?
const unit& attacker = attacker_ptr ? *attacker_ptr : *units.find(attacker_loc);
const unit& defender = *units.find(defender_loc);
const unit& defender = defender_ptr ? *defender_ptr : *units.find(defender_loc);
const double harm_weight = 1.0 - aggression;
if(attacker_weapon == -1) {

View File

@ -183,7 +183,8 @@ public:
int defender_weapon = -1,
double aggression = 0.0,
const combatant* prev_def = nullptr,
const unit* attacker_ptr = nullptr);
const unit* attacker_ptr = nullptr,
const unit* defender_ptr = nullptr);
/** Used by the AI which caches battle_context_unit_stats */
battle_context(const battle_context_unit_stats& att, const battle_context_unit_stats& def);

View File

@ -2626,6 +2626,7 @@ static void luaW_pushsimweapon(lua_State *L, const battle_context_unit_stats &bc
* - Arg 2: optional weapon index.
* - Arg 3: defender userdata.
* - Arg 4: optional weapon index.
*
* - Ret 1: attacker results.
* - Ret 2: defender results.
* - Ret 3: info about the attacker weapon.
@ -2644,7 +2645,7 @@ int game_lua_kernel::intf_simulate_combat(lua_State *L)
++arg_num;
}
const unit& def = luaW_checkunit(L, arg_num, true);
const unit& def = luaW_checkunit(L, arg_num);
++arg_num;
if (lua_isnumber(L, arg_num)) {
def_w = lua_tointeger(L, arg_num) - 1;
@ -2654,7 +2655,7 @@ int game_lua_kernel::intf_simulate_combat(lua_State *L)
}
battle_context context(units(), att.get_location(),
def.get_location(), att_w, def_w, 0.0, nullptr, &att);
def.get_location(), att_w, def_w, 0.0, nullptr, &att, &def);
luaW_pushsimdata(L, context.get_attacker_combatant());
luaW_pushsimdata(L, context.get_defender_combatant());