mod actions; mod collision; mod map_file; mod movement; mod scripting; use std::collections::BTreeMap; use crate::archetype::Archetype; use crate::board::Board; use crate::object_def::ObjectDef; use crate::utils::Player; use crate::game::GameState; /// Builds a 1×1 board with a single object that optionally references a /// script, plus the given `(name, source)` script table entries. fn board_with_object(object_script: Option<&str>, scripts: &[(&str, &str)]) -> Board { let mut object = ObjectDef::new(0, 0); object.id = 1; object.script_name = object_script.map(str::to_string); Board { name: "test".into(), width: 1, height: 1, cells: vec![(Archetype::Empty.default_glyph(), Archetype::Empty)], floor: vec![Archetype::Empty.default_glyph()], floor_spec: None, player: Player { x: 0, y: 0 }, objects: BTreeMap::from([(1, object)]), next_object_id: 2, portals: Vec::new(), font: None, zoom: 1, scripts: scripts.iter().map(|(k, v)| (k.to_string(), v.to_string())).collect(), board_script_name: None, load_errors: Vec::new(), } } /// Returns an `ObjectDef` at `(x, y)` bound to the named script. fn scripted_object(x: usize, y: usize, script: &str) -> ObjectDef { let mut o = ObjectDef::new(x, y); o.script_name = Some(script.to_string()); o } /// Flattens each log line into a single string for easy assertions. fn log_texts(game: &GameState) -> Vec { game.log .iter() .map(|line| line.spans.iter().map(|s| s.text.as_str()).collect()) .collect() }