///|
/// Showcase a tactical movement preview with range, planned route, and goal path.
fn main {
let source =
#|S......#...G
#|.####..#....
#|....#.......
#|.##.#.####..
#|....#.......
#|..###..##...
#|............
let map = @pixelkit.parse_ascii_map(source).unwrap()
let actor = map.single_point_with_id("start").unwrap()
let goal = map.single_point_with_id("goal").unwrap()
let move_budget = 8
let selected_target = @pixelkit.point(6, 2)
let preview = @pixelkit.movement_preview(
map, actor, selected_target, move_budget,
).unwrap()
let reachable = preview.reachable_points()
let turn_path = preview.path().unwrap()
let turn_report = map.validate_path(turn_path).unwrap()
let goal_path = @pixelkit.astar(map, actor, goal).unwrap().unwrap()
let goal_report = map.validate_path(goal_path).unwrap()
println("moonbit-pixelkit tactical preview")
println("")
println(
"Legend: S actor, G goal, # wall, + reachable this turn, * planned path",
)
println("")
println("Input battlefield:")
println(map.render_ascii())
println("")
println("Turn 1 movement range, budget \{move_budget}:")
println(map.render_ascii_overlay(reachable~))
println("")
println("Selected target: (\{selected_target.x()}, \{selected_target.y()})")
println("Selected target reachable: \{preview.target_reachable()}")
println("This-turn path cost: \{preview.path_cost().unwrap()}")
println("This-turn path steps: \{turn_report.steps()}")
println(map.render_ascii_overlay(reachable~, path=turn_path))
println("")
println("Full route to goal:")
println("Goal path length: \{goal_path.length()}")
println("Goal path cost: \{map.path_cost(goal_path).unwrap()}")
println("Goal path steps: \{goal_report.steps()}")
println(map.render_ascii(path=goal_path))
}