2026-06-07 00:46:38 -05:00
|
|
|
|
mod grid_errors;
|
|
|
|
|
|
mod object_placement;
|
|
|
|
|
|
mod player_placement;
|
2026-06-13 16:24:29 -05:00
|
|
|
|
mod portal_placement;
|
2026-06-07 00:46:38 -05:00
|
|
|
|
mod round_trip;
|
|
|
|
|
|
|
|
|
|
|
|
use crate::board::Board;
|
|
|
|
|
|
use crate::map_file::MapFile;
|
|
|
|
|
|
|
|
|
|
|
|
fn load_board(toml: &str) -> Board {
|
|
|
|
|
|
let mf: MapFile = toml::from_str(toml).expect("parse toml");
|
|
|
|
|
|
Board::try_from(mf).expect("convert to board")
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// A 3×1 map (`empty` palette `.`) whose grid is `grid`, plus the given
|
|
|
|
|
|
/// `[[objects]]` TOML appended. Keeps placement tests compact.
|
|
|
|
|
|
fn map_3x1(grid: &str, objects: &str) -> String {
|
|
|
|
|
|
format!(
|
|
|
|
|
|
r##"
|
|
|
|
|
|
[map]
|
|
|
|
|
|
name = "Test"
|
|
|
|
|
|
width = 3
|
|
|
|
|
|
height = 1
|
|
|
|
|
|
player_start = [2, 0]
|
|
|
|
|
|
|
|
|
|
|
|
[palette]
|
|
|
|
|
|
"." = {{ archetype = "empty", tile = 46, fg = "#000000", bg = "#000000" }}
|
|
|
|
|
|
"#" = {{ archetype = "wall", tile = 35, fg = "#808080", bg = "#606060" }}
|
|
|
|
|
|
|
|
|
|
|
|
[grid]
|
|
|
|
|
|
content = """
|
|
|
|
|
|
{grid}
|
|
|
|
|
|
"""
|
|
|
|
|
|
{objects}
|
|
|
|
|
|
"##
|
|
|
|
|
|
)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// A standard `[[objects]]` block placed by palette char `ch`.
|
|
|
|
|
|
fn obj_palette(ch: &str, extra: &str) -> String {
|
|
|
|
|
|
format!(
|
|
|
|
|
|
"[[objects]]\npalette = \"{ch}\"\ntile = 64\nfg = \"#00FFFF\"\nbg = \"#000000\"\n{extra}"
|
|
|
|
|
|
)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// A 1-row map of the given `width` with a raw `player_start` TOML value
|
|
|
|
|
|
/// (`start`, e.g. `[1, 0]` or `"@"`), grid, and objects block.
|
|
|
|
|
|
fn player_map(width: usize, start: &str, grid: &str, objects: &str) -> String {
|
|
|
|
|
|
format!(
|
|
|
|
|
|
r##"
|
|
|
|
|
|
[map]
|
|
|
|
|
|
name = "Test"
|
|
|
|
|
|
width = {width}
|
|
|
|
|
|
height = 1
|
|
|
|
|
|
player_start = {start}
|
|
|
|
|
|
|
|
|
|
|
|
[palette]
|
|
|
|
|
|
"." = {{ archetype = "empty", tile = 46, fg = "#000000", bg = "#000000" }}
|
|
|
|
|
|
"#" = {{ archetype = "wall", tile = 35, fg = "#808080", bg = "#606060" }}
|
|
|
|
|
|
|
|
|
|
|
|
[grid]
|
|
|
|
|
|
content = """
|
|
|
|
|
|
{grid}
|
|
|
|
|
|
"""
|
|
|
|
|
|
{objects}
|
|
|
|
|
|
"##
|
|
|
|
|
|
)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// Minimal valid TOML with a configurable grid, used as a base for dimension tests.
|
|
|
|
|
|
fn minimal_toml(width: usize, height: usize, grid_rows: &[&str]) -> String {
|
|
|
|
|
|
let content = grid_rows.join("\n");
|
|
|
|
|
|
format!(
|
|
|
|
|
|
r##"
|
|
|
|
|
|
[map]
|
|
|
|
|
|
name = "Test"
|
|
|
|
|
|
width = {width}
|
|
|
|
|
|
height = {height}
|
|
|
|
|
|
player_start = [0, 0]
|
|
|
|
|
|
|
|
|
|
|
|
[palette]
|
|
|
|
|
|
"." = {{ archetype = "empty", tile = 46, fg = "#000000", bg = "#000000" }}
|
|
|
|
|
|
|
|
|
|
|
|
[grid]
|
|
|
|
|
|
content = """
|
|
|
|
|
|
{content}
|
|
|
|
|
|
"""
|
|
|
|
|
|
"##
|
|
|
|
|
|
)
|
|
|
|
|
|
}
|