Fix up names, doc comments for some Board fields

This commit is contained in:
2026-03-20 20:27:20 -07:00
parent 4ed4eb46b4
commit 24d20ae01f
3 changed files with 33 additions and 29 deletions
+1 -1
View File
@@ -34,7 +34,7 @@
//! ```rust,no_run //! ```rust,no_run
//! let bytes = std::fs::read("TOWN.ZZT")?; //! let bytes = std::fs::read("TOWN.ZZT")?;
//! let world = zztff::World::from_bytes(&bytes)?; //! let world = zztff::World::from_bytes(&bytes)?;
//! let first3: Vec<&str> = world.boards.iter().take(3).map(|b| b.name.as_str()).collect(); //! let first3: Vec<&str> = world.boards.iter().take(3).map(|b| b.title.as_str()).collect();
//! println!("Loaded world {:?}, {} boards.", world.name, world.boards.len()); //! println!("Loaded world {:?}, {} boards.", world.name, world.boards.len());
//! println!("First 3 boards: {:?}", first3); //! println!("First 3 boards: {:?}", first3);
//! # Ok::<(), Box<dyn std::error::Error>>(()) //! # Ok::<(), Box<dyn std::error::Error>>(())
@@ -39,7 +39,7 @@ World {
saved_game: true, saved_game: true,
boards: [ boards: [
Board { Board {
name: "Title screen", title: "Title screen",
tiles: [Tile; 1500], tiles: [Tile; 1500],
max_shots: 255, max_shots: 255,
is_dark: false, is_dark: false,
@@ -47,7 +47,7 @@ World {
exit_south: None, exit_south: None,
exit_west: None, exit_west: None,
exit_east: None, exit_east: None,
restart_on_zap: false, reenter_when_zapped: false,
message: "", message: "",
enter_x: 1, enter_x: 1,
enter_y: 1, enter_y: 1,
@@ -76,7 +76,7 @@ World {
], ],
}, },
Board { Board {
name: "First board (NW, defaults)", title: "First board (NW, defaults)",
tiles: [Tile; 1500], tiles: [Tile; 1500],
max_shots: 255, max_shots: 255,
is_dark: false, is_dark: false,
@@ -88,7 +88,7 @@ World {
exit_east: Some( exit_east: Some(
2, 2,
), ),
restart_on_zap: false, reenter_when_zapped: false,
message: "", message: "",
enter_x: 1, enter_x: 1,
enter_y: 1, enter_y: 1,
@@ -117,7 +117,7 @@ World {
], ],
}, },
Board { Board {
name: "Second board (NE, non-default settings)", title: "Second board (NE, non-default settings)",
tiles: [Tile; 1500], tiles: [Tile; 1500],
max_shots: 0, max_shots: 0,
is_dark: true, is_dark: true,
@@ -129,7 +129,7 @@ World {
1, 1,
), ),
exit_east: None, exit_east: None,
restart_on_zap: true, reenter_when_zapped: true,
message: "Hello, board message!", message: "Hello, board message!",
enter_x: 12, enter_x: 12,
enter_y: 34, enter_y: 34,
@@ -158,7 +158,7 @@ World {
], ],
}, },
Board { Board {
name: "Third board (SE, mostly object stats)", title: "Third board (SE, mostly object stats)",
tiles: [Tile; 1500], tiles: [Tile; 1500],
max_shots: 255, max_shots: 255,
is_dark: false, is_dark: false,
@@ -170,7 +170,7 @@ World {
4, 4,
), ),
exit_east: None, exit_east: None,
restart_on_zap: false, reenter_when_zapped: false,
message: "", message: "",
enter_x: 1, enter_x: 1,
enter_y: 1, enter_y: 1,
@@ -299,7 +299,7 @@ World {
], ],
}, },
Board { Board {
name: "Fourth board (SW, other stats)", title: "Fourth board (SW, other stats)",
tiles: [Tile; 1500], tiles: [Tile; 1500],
max_shots: 255, max_shots: 255,
is_dark: false, is_dark: false,
@@ -311,7 +311,7 @@ World {
exit_east: Some( exit_east: Some(
3, 3,
), ),
restart_on_zap: false, reenter_when_zapped: false,
message: "", message: "",
enter_x: 1, enter_x: 1,
enter_y: 1, enter_y: 1,
+22 -18
View File
@@ -137,7 +137,7 @@ pub struct Board {
/// shorter limits: ZZT's internal editor artificially limits titles to 34 characters, and /// shorter limits: ZZT's internal editor artificially limits titles to 34 characters, and
/// titles longer than 42 characters may cause visual glitches when displayed in a /// titles longer than 42 characters may cause visual glitches when displayed in a
/// standard-width message box. /// standard-width message box.
pub name: String, pub title: String,
/// The 60x25 terrain grid, stored in order from left-to-right, top-to-bottom. /// The 60x25 terrain grid, stored in order from left-to-right, top-to-bottom.
/// ///
/// For convenience, [`Board::tile`] and [`Board::set_tile`] are available for coordinate-based /// For convenience, [`Board::tile`] and [`Board::set_tile`] are available for coordinate-based
@@ -159,15 +159,16 @@ pub struct Board {
pub exit_west: Option<NonZero<u8>>, pub exit_west: Option<NonZero<u8>>,
/// Board index of the eastern neighbor, or `None` for no exit. /// Board index of the eastern neighbor, or `None` for no exit.
pub exit_east: Option<NonZero<u8>>, pub exit_east: Option<NonZero<u8>>,
/// Whether the player restarts at the board entrance after taking damage. /// Whether the player, upon taking damage, is transported back to where they entered the board.
pub restart_on_zap: bool, pub reenter_when_zapped: bool,
/// The currently-flashing status bar message (max 58 characters). /// The currently-flashing status bar message (max 58 characters).
pub message: String, pub message: String,
/// X coordinate where the player entered the board (1-based). /// X coordinate where the player entered the board (1-based).
/// ///
/// The entrance coordinates are part of the "re-enter when zapped" feature. The values only /// The entry coordinates are part of the "re-enter when zapped" feature. These don't matter
/// really matter if the user starts out on this board; they will be overwritten with the /// most of the time; ZZT ignores the coordinates from the file, preferring to update these with
/// player's actual entry coordinates during play. /// the player's actual entry coordinates. The only time they are ever loaded is for the current
/// board when the user restores a save file.
pub enter_x: u8, pub enter_x: u8,
/// Y coordinate where the player entered the board (1-based). /// Y coordinate where the player entered the board (1-based).
pub enter_y: u8, pub enter_y: u8,
@@ -184,7 +185,7 @@ pub struct Board {
impl Default for Board { impl Default for Board {
fn default() -> Self { fn default() -> Self {
Board { Board {
name: String::new(), title: String::new(),
tiles: [Tile::default(); 1500], tiles: [Tile::default(); 1500],
max_shots: 255, max_shots: 255,
is_dark: false, is_dark: false,
@@ -192,8 +193,11 @@ impl Default for Board {
exit_south: None, exit_south: None,
exit_west: None, exit_west: None,
exit_east: None, exit_east: None,
restart_on_zap: false, reenter_when_zapped: false,
message: String::new(), message: String::new(),
// (1, 1) is objectively a better default for enter x/y than (0, 0). It is possible to
// get ZZT to consume this value by restoring a game, and in that case (0, 0) will take
// the player out of bounds, leading to a crash.
enter_x: 1, enter_x: 1,
enter_y: 1, enter_y: 1,
time_limit: 0, time_limit: 0,
@@ -213,7 +217,7 @@ impl Default for Board {
impl Debug for Board { impl Debug for Board {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("Board") f.debug_struct("Board")
.field("name", &self.name) .field("title", &self.title)
.field("tiles", &format_args!("[Tile; 1500]")) .field("tiles", &format_args!("[Tile; 1500]"))
.field("max_shots", &self.max_shots) .field("max_shots", &self.max_shots)
.field("is_dark", &self.is_dark) .field("is_dark", &self.is_dark)
@@ -221,7 +225,7 @@ impl Debug for Board {
.field("exit_south", &self.exit_south) .field("exit_south", &self.exit_south)
.field("exit_west", &self.exit_west) .field("exit_west", &self.exit_west)
.field("exit_east", &self.exit_east) .field("exit_east", &self.exit_east)
.field("restart_on_zap", &self.restart_on_zap) .field("reenter_when_zapped", &self.reenter_when_zapped)
.field("message", &self.message) .field("message", &self.message)
.field("enter_x", &self.enter_x) .field("enter_x", &self.enter_x)
.field("enter_y", &self.enter_y) .field("enter_y", &self.enter_y)
@@ -510,8 +514,8 @@ impl Board {
// Ignore length bytes // Ignore length bytes
let (input, _) = le_u16.parse(bytes)?; let (input, _) = le_u16.parse(bytes)?;
// Read board name // Read board title
let (input, name) = pstring(50)(input)?; let (input, title) = pstring(50)(input)?;
// Read terrain // Read terrain
const NUM_TILES: usize = 60 * 25; const NUM_TILES: usize = 60 * 25;
@@ -539,7 +543,7 @@ impl Board {
let exit_south = NonZero::new(exit_s); let exit_south = NonZero::new(exit_s);
let exit_west = NonZero::new(exit_w); let exit_west = NonZero::new(exit_w);
let exit_east = NonZero::new(exit_e); let exit_east = NonZero::new(exit_e);
let (input, (restart_on_zap, message)) = (bool_u8, pstring(58)).parse(input)?; let (input, (reenter_when_zapped, message)) = (bool_u8, pstring(58)).parse(input)?;
let (input, (enter_x, enter_y, time_limit)) = (le_u8, le_u8, le_i16).parse(input)?; let (input, (enter_x, enter_y, time_limit)) = (le_u8, le_u8, le_i16).parse(input)?;
let (input, _) = take(16usize)(input)?; let (input, _) = take(16usize)(input)?;
@@ -552,7 +556,7 @@ impl Board {
let (_input, stats) = count(Stat::parse, num_stats as usize).parse(input)?; let (_input, stats) = count(Stat::parse, num_stats as usize).parse(input)?;
Ok(Board { Ok(Board {
name, title,
tiles, tiles,
max_shots, max_shots,
is_dark, is_dark,
@@ -560,7 +564,7 @@ impl Board {
exit_south, exit_south,
exit_east, exit_east,
exit_west, exit_west,
restart_on_zap, reenter_when_zapped,
message, message,
enter_x, enter_x,
enter_y, enter_y,
@@ -573,7 +577,7 @@ impl Board {
pub fn to_bytes(&self) -> Result<Vec<u8>, EncodeError> { pub fn to_bytes(&self) -> Result<Vec<u8>, EncodeError> {
let mut result = vec![]; let mut result = vec![];
result.push_padding(2); // reserve space for board size result.push_padding(2); // reserve space for board size
result.push_string(50, &self.name)?; result.push_string(50, &self.title)?;
// Encode terrain // Encode terrain
let mut iter = self.tiles.iter().peekable(); let mut iter = self.tiles.iter().peekable();
@@ -595,7 +599,7 @@ impl Board {
result.push(self.exit_south.map_or(0, |n| n.get())); result.push(self.exit_south.map_or(0, |n| n.get()));
result.push(self.exit_west.map_or(0, |n| n.get())); result.push(self.exit_west.map_or(0, |n| n.get()));
result.push(self.exit_east.map_or(0, |n| n.get())); result.push(self.exit_east.map_or(0, |n| n.get()));
result.push_bool(self.restart_on_zap); result.push_bool(self.reenter_when_zapped);
result.push_string(58, &self.message)?; result.push_string(58, &self.message)?;
result.push(self.enter_x); result.push(self.enter_x);
result.push(self.enter_y); result.push(self.enter_y);
@@ -810,7 +814,7 @@ mod tests {
let world = World::from_bytes(WORLD).unwrap(); let world = World::from_bytes(WORLD).unwrap();
let mut all_tiles = String::new(); let mut all_tiles = String::new();
for (i, board) in world.boards.iter().enumerate() { for (i, board) in world.boards.iter().enumerate() {
all_tiles.push_str(&format!("// board {}: {}\n", i, board.name)); all_tiles.push_str(&format!("// board {}: {}\n", i, board.title));
all_tiles.push_str(&format_tiles(board)); all_tiles.push_str(&format_tiles(board));
} }
insta::assert_snapshot!(all_tiles); insta::assert_snapshot!(all_tiles);