mirror of
https://github.com/wesnoth/wesnoth
synced 2025-05-06 02:55:43 +00:00

The ai_helper functions are optimized for speed (as much as possible in a general setting) and do all the necessary tests. For example, get_units_with_attacks() checks both whether the unit has attacks left, and whether it has any attacks in the first place. (cherry-picked from commit 75843541bcf92e743b911ef49046c54a050e8a0f)
44 lines
1.5 KiB
Lua
44 lines
1.5 KiB
Lua
------- Retreat CA --------------
|
|
|
|
local AH = wesnoth.require "ai/lua/ai_helper.lua"
|
|
local R = wesnoth.require "ai/lua/retreat.lua"
|
|
|
|
local retreat_unit, retreat_loc
|
|
|
|
local ca_retreat_injured = {}
|
|
|
|
function ca_retreat_injured:evaluation(cfg, data)
|
|
local start_time, ca_name = wesnoth.get_time_stamp() / 1000., 'retreat_injured'
|
|
if AH.print_eval() then AH.print_ts(' - Evaluating retreat_injured CA:') end
|
|
|
|
local units = AH.get_units_with_moves { side = wesnoth.current.side }
|
|
local unit, loc = R.retreat_injured_units(units)
|
|
if unit then
|
|
retreat_unit = unit
|
|
retreat_loc = loc
|
|
|
|
-- First check if attacks are possible for any unit
|
|
-- If one with > 50% chance of kill is possible, set return_value to lower than combat CA
|
|
local attacks = ai.get_attacks()
|
|
for i,a in ipairs(attacks) do
|
|
if (#a.movements == 1) and (a.chance_to_kill > 0.5) then
|
|
if AH.print_eval() then AH.done_eval_messages(start_time, ca_name) end
|
|
return 95000
|
|
end
|
|
end
|
|
if AH.print_eval() then AH.done_eval_messages(start_time, ca_name) end
|
|
return 192000
|
|
end
|
|
if AH.print_eval() then AH.done_eval_messages(start_time, ca_name) end
|
|
return 0
|
|
end
|
|
|
|
function ca_retreat_injured:execution(cfg, data)
|
|
if AH.print_exec() then AH.print_ts(' Executing retreat_injured CA') end
|
|
AH.robust_move_and_attack(ai, retreat_unit, retreat_loc)
|
|
retreat_unit = nil
|
|
retreat_loc = nil
|
|
end
|
|
|
|
return ca_retreat_injured
|