59 lines
1.8 KiB
Rust
59 lines
1.8 KiB
Rust
//! Spinners are scripted objects: the `spinner_cw`/`spinner_ccw` archetypes expand
|
|
//! into objects carrying the embedded `spinner.rhai` plus a `BUILTIN_spinner_<dir>`
|
|
//! tag, and collapse back to the keyword on save (just like pushers).
|
|
|
|
use super::{layer, load_board, map};
|
|
use crate::map_file::MapFile;
|
|
|
|
#[test]
|
|
fn spinner_loads_as_a_tagged_scripted_solid_object() {
|
|
let board = load_board(&map(
|
|
3,
|
|
1,
|
|
&[layer(
|
|
"S @",
|
|
&[("S", "kind = \"spinner_cw\""), ("@", "kind = \"player\"")],
|
|
)],
|
|
));
|
|
let (_, obj) = board
|
|
.objects
|
|
.iter()
|
|
.find(|(_, o)| o.tags.contains("BUILTIN_spinner_cw"))
|
|
.expect("spinner object");
|
|
assert_eq!((obj.x, obj.y), (0, 0));
|
|
assert!(
|
|
obj.builtin_script.is_some(),
|
|
"carries the embedded spinner script"
|
|
);
|
|
assert!(obj.script_name.is_none());
|
|
assert!(!board.is_passable(0, 0), "spinner is solid");
|
|
}
|
|
|
|
#[test]
|
|
fn spinner_round_trips_to_its_keyword() {
|
|
let board = load_board(&map(
|
|
3,
|
|
1,
|
|
&[layer(
|
|
"S @",
|
|
&[("S", "kind = \"spinner_ccw\""), ("@", "kind = \"player\"")],
|
|
)],
|
|
));
|
|
// Save collapses the expanded object back into the `spinner_ccw` keyword.
|
|
let toml_out = toml::to_string_pretty(&MapFile::from(&board)).unwrap();
|
|
assert!(
|
|
toml_out.contains("spinner_ccw"),
|
|
"spinner should save as its archetype keyword, got:\n{toml_out}"
|
|
);
|
|
|
|
// Reload: it is a working spinner object again, still counter-clockwise.
|
|
let board2 = load_board(&toml_out);
|
|
let (_, obj) = board2
|
|
.objects
|
|
.iter()
|
|
.find(|(_, o)| o.tags.contains("BUILTIN_spinner_ccw"))
|
|
.expect("spinner object after round-trip");
|
|
assert_eq!((obj.x, obj.y), (0, 0));
|
|
assert!(obj.builtin_script.is_some());
|
|
}
|