From 99b70c7578dd24e580ab893084dca653e2fcb4d3 Mon Sep 17 00:00:00 2001 From: Chris Mounce Date: Mon, 16 Feb 2026 22:17:21 -0800 Subject: [PATCH] Replace old text parser with new one --- src/zzt/parse.rs | 73 ++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 70 insertions(+), 3 deletions(-) diff --git a/src/zzt/parse.rs b/src/zzt/parse.rs index 844dad8..086dc76 100644 --- a/src/zzt/parse.rs +++ b/src/zzt/parse.rs @@ -7,6 +7,7 @@ use nom::{ number::complete::{le_i16, le_u8, le_u16}, }; +use super::elements::Element; use super::encoding::{decode_multiline, decode_oneline, encode_multiline, encode_oneline}; use super::error::ParseError; @@ -36,7 +37,7 @@ impl Default for Program { } /// A status element on a ZZT board. -#[derive(Debug, Default, Clone)] +#[derive(Debug, Clone)] pub struct Stat { pub x: u8, pub y: u8, @@ -53,8 +54,31 @@ pub struct Stat { pub program: Program, } +impl Default for Stat { + fn default() -> Self { + Stat { + x: 0, + y: 0, + x_step: 0, + y_step: 0, + cycle: 0, + p1: 0, + p2: 0, + p3: 0, + follower: -1, + leader: -1, + under: Tile { + element: Element::Empty as u8, + color: 0x0f, + }, + instruction_pointer: 0, + program: Program::default(), + } + } +} + /// A ZZT board. -#[derive(Debug, Default, Clone)] +#[derive(Debug, Clone)] pub struct Board { pub name: String, pub tiles: Vec, @@ -72,8 +96,29 @@ pub struct Board { pub stats: Vec, } +impl Default for Board { + fn default() -> Self { + Board { + name: String::new(), + tiles: Vec::new(), + max_shots: 255, + is_dark: false, + exit_north: None, + exit_south: None, + exit_west: None, + exit_east: None, + restart_on_zap: false, + message: String::new(), + enter_x: 1, + enter_y: 1, + time_limit: 0, + stats: Vec::new(), + } + } +} + /// A ZZT world file. -#[derive(Clone, Debug, Default)] +#[derive(Clone, Debug)] pub struct World { pub ammo: i16, pub gems: i16, @@ -92,6 +137,28 @@ pub struct World { pub boards: Vec, } +impl Default for World { + fn default() -> Self { + World { + ammo: 0, + gems: 0, + keys: [false; 7], + health: 100, + starting_board: 0, + torches: 0, + torch_cycles: 0, + energizer_cycles: 0, + score: 0, + name: String::new(), + flags: Default::default(), + time: 0, + time_ticks: 0, + locked: false, + boards: Vec::new(), + } + } +} + // Parsing helpers fn bool_u8(input: &[u8]) -> IResult<&[u8], bool, ParseError> {