better documentation
This commit is contained in:
parent
b95d9d28d4
commit
4182079a73
33
src/game.rs
33
src/game.rs
|
@ -96,7 +96,8 @@ pub struct Game {
|
||||||
pub room_format: Option<RoomFormat>,
|
pub room_format: Option<RoomFormat>,
|
||||||
pub(crate) room_type: RoomType,
|
pub(crate) room_type: RoomType,
|
||||||
pub font: Font,
|
pub font: Font,
|
||||||
pub custom_font: Option<String>, // used if font is Font::Custom
|
/// used if font is `Font::Custom`
|
||||||
|
pub custom_font: Option<String>,
|
||||||
pub text_direction: TextDirection,
|
pub text_direction: TextDirection,
|
||||||
pub palettes: Vec<Palette>,
|
pub palettes: Vec<Palette>,
|
||||||
pub rooms: Vec<Room>,
|
pub rooms: Vec<Room>,
|
||||||
|
@ -107,7 +108,8 @@ pub struct Game {
|
||||||
pub endings: Vec<Ending>,
|
pub endings: Vec<Ending>,
|
||||||
pub variables: Vec<Variable>,
|
pub variables: Vec<Variable>,
|
||||||
pub font_data: Option<String>, // todo make this an actual struct for parsing
|
pub font_data: Option<String>, // todo make this an actual struct for parsing
|
||||||
pub(crate) line_endings_crlf: bool, // otherwise lf (unix/mac)
|
/// true if CRLF (Windows), otherwise LF (unix/mac)
|
||||||
|
pub(crate) line_endings_crlf: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Game {
|
impl Game {
|
||||||
|
@ -173,6 +175,7 @@ impl Game {
|
||||||
let mut items: Vec<Item> = Vec::new();
|
let mut items: Vec<Item> = Vec::new();
|
||||||
let mut avatar_exists = false;
|
let mut avatar_exists = false;
|
||||||
|
|
||||||
|
// todo can we use multithreading here?
|
||||||
for segment in segments {
|
for segment in segments {
|
||||||
if segment.starts_with("# BITSY VERSION") {
|
if segment.starts_with("# BITSY VERSION") {
|
||||||
let segment = segment.replace("# BITSY VERSION ", "");
|
let segment = segment.replace("# BITSY VERSION ", "");
|
||||||
|
@ -340,13 +343,13 @@ impl Game {
|
||||||
let mut tile_ids = room.tiles.clone();
|
let mut tile_ids = room.tiles.clone();
|
||||||
tile_ids.sort();
|
tile_ids.sort();
|
||||||
tile_ids.dedup();
|
tile_ids.dedup();
|
||||||
// remove 0 as this isn't a real tile
|
|
||||||
let zero_index = tile_ids.iter()
|
// remove "0" as this isn't a real tile
|
||||||
.position(|i| i == "0");
|
if let Some(zero_index) = tile_ids.iter().position(|i| i == "0") {
|
||||||
if let Some(zero_index) = zero_index {
|
|
||||||
tile_ids.remove(zero_index);
|
tile_ids.remove(zero_index);
|
||||||
}
|
}
|
||||||
// remove Ok once this function returns a result
|
|
||||||
|
// todo remove Ok once get_tiles_by_ids returns a Result
|
||||||
Ok(self.get_tiles_by_ids(tile_ids))
|
Ok(self.get_tiles_by_ids(tile_ids))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -521,13 +524,13 @@ impl Game {
|
||||||
self.add_room(room);
|
self.add_room(room);
|
||||||
}
|
}
|
||||||
|
|
||||||
// a sprite has a dialogue ID, so we need to handle these after dialogues
|
// a sprite has a dialogue ID, so we need to handle sprites after dialogues
|
||||||
// a sprite has a position in a room, so we need to handle these after the rooms
|
// a sprite has a position in a room, so we need to handle sprites after rooms
|
||||||
for sprite in &game.sprites {
|
for sprite in &game.sprites {
|
||||||
let mut sprite = sprite.clone();
|
let mut sprite = sprite.clone();
|
||||||
// avoid having two avatars
|
// avoid having two avatars
|
||||||
if sprite.id == "A" {
|
if sprite.id == "A" {
|
||||||
sprite.id = "0".to_string(); // just a default value for replacement
|
sprite.id = "0".to_string(); // just a default value for later replacement
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Some(key) = sprite.dialogue_id.clone() {
|
if let Some(key) = sprite.dialogue_id.clone() {
|
||||||
|
@ -576,7 +579,9 @@ impl ToString for Game {
|
||||||
}
|
}
|
||||||
|
|
||||||
for dialogue in &self.dialogues {
|
for dialogue in &self.dialogues {
|
||||||
// this replacement is silly but see segments_from_string() for explanation
|
// some dialogues are multiline (starting/ending with `"""`) but have no contents
|
||||||
|
// and this kinda messes things up when trying to export unmodified dialogues
|
||||||
|
// in their original format for testing purposes
|
||||||
segments.push(dialogue.to_string().replace("\"\"\"\n\"\"\"", ""));
|
segments.push(dialogue.to_string().replace("\"\"\"\n\"\"\"", ""));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -620,6 +625,7 @@ impl Game {
|
||||||
pub fn sprite_ids(&self) -> Vec<String> {
|
pub fn sprite_ids(&self) -> Vec<String> {
|
||||||
self.sprites.iter().map(|sprite| sprite.id.clone()).collect()
|
self.sprites.iter().map(|sprite| sprite.id.clone()).collect()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn room_ids(&self) -> Vec<String> {
|
pub fn room_ids(&self) -> Vec<String> {
|
||||||
self.rooms.iter().map(|room| room.id.clone()).collect()
|
self.rooms.iter().map(|room| room.id.clone()).collect()
|
||||||
}
|
}
|
||||||
|
@ -866,7 +872,10 @@ mod test {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn game_from_string() {
|
fn game_from_string() {
|
||||||
let (output, _) = Game::from(include_str!["test-resources/default.bitsy"].to_string()).unwrap();
|
let (output, _error) = Game::from(
|
||||||
|
include_str!["test-resources/default.bitsy"].to_string()
|
||||||
|
).unwrap();
|
||||||
|
|
||||||
let expected = crate::mock::game_default();
|
let expected = crate::mock::game_default();
|
||||||
|
|
||||||
assert_eq!(output, expected);
|
assert_eq!(output, expected);
|
||||||
|
|
13
src/tile.rs
13
src/tile.rs
|
@ -5,14 +5,19 @@ use crate::image::animation_frames_from_str;
|
||||||
pub struct Tile {
|
pub struct Tile {
|
||||||
pub id: String,
|
pub id: String,
|
||||||
pub name: Option<String>,
|
pub name: Option<String>,
|
||||||
/// this is "optional" in that a tile can have `WAL true`, `WAL false` or neither
|
/// Can the player move over this tile?
|
||||||
/// obviously Some(false) is the same as None but we want to preserve the original formatting
|
/// This is "optional" in that a tile can have `WAL true`, `WAL false` or neither.
|
||||||
|
/// obviously Some(false) is functionally the same as None
|
||||||
|
/// but we want to preserve the original formatting where possible.
|
||||||
pub wall: Option<bool>,
|
pub wall: Option<bool>,
|
||||||
pub animation_frames: Vec<Image>,
|
pub animation_frames: Vec<Image>,
|
||||||
|
/// Bitsy has an undocumented feature where a tile can be rendered
|
||||||
|
/// in a specific colour (`COL n`) from the current palette.
|
||||||
pub colour_id: Option<u64>,
|
pub colour_id: Option<u64>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl PartialEq for Tile {
|
impl PartialEq for Tile {
|
||||||
|
/// ignore id and name.
|
||||||
fn eq(&self, other: &Self) -> bool {
|
fn eq(&self, other: &Self) -> bool {
|
||||||
self.wall == other.wall
|
self.wall == other.wall
|
||||||
&&
|
&&
|
||||||
|
@ -44,6 +49,7 @@ impl Tile {
|
||||||
}
|
}
|
||||||
|
|
||||||
// todo refactor
|
// todo refactor
|
||||||
|
// can we do map_in_place or something?
|
||||||
|
|
||||||
pub fn invert(&mut self) {
|
pub fn invert(&mut self) {
|
||||||
self.animation_frames = self.animation_frames.iter().map(|frame: &Image| {
|
self.animation_frames = self.animation_frames.iter().map(|frame: &Image| {
|
||||||
|
@ -162,8 +168,7 @@ mod test {
|
||||||
mock::image::chequers_2(),
|
mock::image::chequers_2(),
|
||||||
],
|
],
|
||||||
colour_id: None,
|
colour_id: None,
|
||||||
}
|
}.to_string();
|
||||||
.to_string();
|
|
||||||
|
|
||||||
let expected = include_str!("test-resources/tile-chequers").to_string();
|
let expected = include_str!("test-resources/tile-chequers").to_string();
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue