52 lines
1.6 KiB
Rust
52 lines
1.6 KiB
Rust
|
|
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.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<String> {
|
|||
|
|
game.log
|
|||
|
|
.iter()
|
|||
|
|
.map(|line| line.spans.iter().map(|s| s.text.as_str()).collect())
|
|||
|
|
.collect()
|
|||
|
|
}
|