diff --git a/kiln-core/src/board.rs b/kiln-core/src/board.rs index 0e196da..7ae2231 100644 --- a/kiln-core/src/board.rs +++ b/kiln-core/src/board.rs @@ -640,8 +640,7 @@ pub(crate) mod tests { /// (or must share a cell) has to live off-grid in [`Board::sensors`]. pub(crate) fn sensor_at(board: &mut Board, x: usize, y: usize, script: &str) -> ObjectId { let sensor = SensorSpec { - x, - y, + location: (x, y).into(), script: Some(script.to_string()), glyph: Glyph::transparent(), optics: Optics::default(), @@ -662,8 +661,7 @@ pub(crate) mod tests { pub(crate) fn lamp_at(board: &mut Board, x: usize, y: usize) { let lamp = Sensor { - x, - y, + location: (x, y).into(), draw_layer: DrawLayer::Above, scripting: ScriptAttributes { id: board.next_object_id, @@ -798,7 +796,7 @@ pub(crate) mod tests { // apply_shift validates all cells upfront; any out-of-bounds cell causes immediate failure. let mut board = open_board(3, 1, (2, 0)); crate_at(&mut board, 0, 0); - let errs = board.apply_shift(&[(0, 0), (9, 0)]); + let errs = board.apply_shift(&[(0, 0).into(), (9, 0).into()]); assert!(errs.is_err()); assert!(is_builtin(&board, 0, 0, "crate")); // unchanged } @@ -822,7 +820,7 @@ pub(crate) mod tests { // blocked = {2}; Crate at (0,0) is NOT blocked // Result: Crate(0,0)→(1,0), empty→no-op, Wall stays at (2,0), // Crate(3,0)→(4,0), Crate(4,0)→(0,0) wrap - let _errs = board.apply_shift(&[(0, 0), (1, 0), (2, 0), (3, 0), (4, 0)]); + let _errs = board.apply_shift(&[(0, 0), (1, 0), (2, 0), (3, 0), (4, 0)].map(Into::into)); assert!(is_builtin(&board, 0, 0, "crate")); // wrapped from (4,0) assert!(is_builtin(&board, 1, 0, "crate")); // moved from (0,0) diff --git a/kiln-core/src/builtin.rs b/kiln-core/src/builtin.rs index 7640818..45f17dc 100644 --- a/kiln-core/src/builtin.rs +++ b/kiln-core/src/builtin.rs @@ -177,17 +177,17 @@ builtins! { //enter: EnterResponse::Push(Pushable::Any), enter: EnterResponse::Block, optics: Optics { opaque: true, glow: 0 }, - script: ScriptKey::Builtin("crate"), + script: ScriptKey::Builtin("crate") }, HCrate => ["hcrate" => g('↔', 0xaa, 0xaa, 0xaa)] { // CP437 ↔ (left-right arrow) — pushable east/west enter: EnterResponse::Push(Pushable::Horizontal), optics: Optics { opaque: true, glow: 0 }, - script: ScriptKey::None + script: ScriptKey::Builtin("hcrate") }, VCrate => ["vcrate" => g('↕', 0xaa, 0xaa, 0xaa)] { // CP437 ↕ (up-down arrow) — pushable north/south enter: EnterResponse::Push(Pushable::Vertical), optics: Optics { opaque: true, glow: 0 }, - script: ScriptKey::None + script: ScriptKey::Builtin("vcrate") }, } @@ -201,6 +201,8 @@ lazy_static! { m.insert(ScriptKey::Builtin("transporter"), include_str!("scripts/transporter.rhai")); m.insert(ScriptKey::Builtin("key"), include_str!("scripts/key.rhai")); m.insert(ScriptKey::Builtin("crate"), include_str!("scripts/crate.rhai")); + m.insert(ScriptKey::Builtin("hcrate"), include_str!("scripts/hcrate.rhai")); + m.insert(ScriptKey::Builtin("vcrate"), include_str!("scripts/vcrate.rhai")); m }; } diff --git a/kiln-core/src/scripts/hcrate.rhai b/kiln-core/src/scripts/hcrate.rhai new file mode 100644 index 0000000..de0ba7c --- /dev/null +++ b/kiln-core/src/scripts/hcrate.rhai @@ -0,0 +1,10 @@ +fn bump(me, dir) { + if dir == North || dir == South { + return; + } + push(me.x, me.y, dir.opposite); // Try to clear our target cell + let tgt = dir.opposite.from_point(me.x, me.y); + // This will silently-nop if tgt is occupied, and it will evaluate that after the push + // (queue both right now, evaluate in that order after) + teleport(me.id, tgt.x, tgt.y); +} diff --git a/kiln-core/src/scripts/vcrate.rhai b/kiln-core/src/scripts/vcrate.rhai new file mode 100644 index 0000000..6d6326a --- /dev/null +++ b/kiln-core/src/scripts/vcrate.rhai @@ -0,0 +1,10 @@ +fn bump(me, dir) { + if dir == East || dir == West { + return; + } + push(me.x, me.y, dir.opposite); // Try to clear our target cell + let tgt = dir.opposite.from_point(me.x, me.y); + // This will silently-nop if tgt is occupied, and it will evaluate that after the push + // (queue both right now, evaluate in that order after) + teleport(me.id, tgt.x, tgt.y); +}