mirror of
https://github.com/wesnoth/wesnoth
synced 2025-04-26 04:03:16 +00:00

The whitespace-fixing script seems to be slightly different depending on the platform. Even though it produces no effect in the CI, it made these changes locally on my Mac. I'm committing them now so as to avoid unrelated files being changed in other pull requests.
62 lines
2.2 KiB
Lua
62 lines
2.2 KiB
Lua
-- An example CA that tries to uncover shrouded areas of the map
|
|
-- This is a very simple and naive scouting algorithm.
|
|
-- It often does stupid things like sending one unit to a village on one turn,
|
|
-- but then changing its mind and sending a different unit to that village on the next turn.
|
|
-- Or sending a faraway unit instead of a close unit to a given village.
|
|
|
|
local LS = wesnoth.require "location_set"
|
|
local F = wesnoth.require "functional"
|
|
local AH = wesnoth.require "ai/lua/ai_helper"
|
|
local simple_scouting = {}
|
|
|
|
local possible_scouts, shroud
|
|
|
|
function simple_scouting:evaluation(cfg, data, filter_own)
|
|
shroud = LS.of_pairs(wesnoth.map.find{
|
|
include_borders = false,
|
|
wml.tag.filter_vision{
|
|
visible = false,
|
|
respect_fog = false,
|
|
side = ai.side,
|
|
}
|
|
})
|
|
if shroud:size() == 0 then return 0 end
|
|
possible_scouts = wesnoth.units.find{
|
|
side = ai.side,
|
|
canrecruit = false,
|
|
formula = "max_moves > 5 and moves > 0",
|
|
wml.tag["and"](filter_own)
|
|
}
|
|
if #possible_scouts == 0 then return 0 end
|
|
return 30000
|
|
end
|
|
|
|
function simple_scouting:execution(cfg, data, filter_own)
|
|
local villages = LS.of_pairs(wesnoth.map.find{owner_side = 0, gives_income = true})
|
|
while villages:size() > 0 and #possible_scouts > 0 do
|
|
local current_scout = table.remove(possible_scouts)
|
|
local best = F.choose(villages:to_pairs(), function(loc)
|
|
return -wesnoth.map.distance_between(loc, current_scout)
|
|
end)
|
|
if not best then
|
|
table.insert(possible_scouts, current_scout)
|
|
break
|
|
end
|
|
local hop = AH.next_hop(current_scout, best.x, best.y)
|
|
ai.move(current_scout, hop)
|
|
villages:remove(best)
|
|
end
|
|
while shroud:size() > 0 and #possible_scouts > 0 do
|
|
local current_scout = table.remove(possible_scouts)
|
|
local best = F.choose(shroud:to_pairs(), function(loc)
|
|
return -wesnoth.map.distance_between(loc, current_scout)
|
|
end)
|
|
if not best then break end
|
|
local hop = AH.next_hop(current_scout, best.x, best.y)
|
|
ai.move(current_scout, hop)
|
|
shroud:remove(best)
|
|
end
|
|
end
|
|
|
|
return simple_scouting
|