From fb0fac0665e43e22d00a25a3d0593825cd8a6da4 Mon Sep 17 00:00:00 2001 From: Max Bradbury Date: Sat, 11 Apr 2020 23:24:23 +0100 Subject: [PATCH] game to string function; example game function --- README.md | 6 - src/main.rs | 344 ++++++++++++++++++++++++++++++---------------------- 2 files changed, 199 insertions(+), 151 deletions(-) diff --git a/README.md b/README.md index 87e3108..870a81b 100644 --- a/README.md +++ b/README.md @@ -4,10 +4,6 @@ a library for parsing Bitsy game data. ## todo -### functions - -* game to - ### tidy up split into multiple files @@ -24,5 +20,3 @@ e.g. "DLG SPR_1..." instead of just "SPR_1..." examples of use cases (dedupe tiles, merge games, etc.) ### publish to crates.io - -(not much point until it's feature-complete, I think) diff --git a/src/main.rs b/src/main.rs index 16d0c13..44f97f7 100644 --- a/src/main.rs +++ b/src/main.rs @@ -280,6 +280,150 @@ fn example_room_string() -> String { include_str!("../test/resources/room").to_string() } +fn example_game_default() -> Game { + Game { + name: "Write your game's title here".to_string(), + version: 6.5, + room_format: 1, + palettes: vec![ + Palette { + id: "0".to_string(), + name: None, + colours: vec![ + Colour {red: 0, green: 82, blue: 204 }, + Colour {red: 128, green: 159, blue: 255 }, + Colour {red: 255, green: 255, blue: 255 }, + ] + } + ], + rooms: vec![ + Room { + id: "0".to_string(), + palette: "0".to_string(), + name: None, + tiles: vec![ + "0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(), + "0".to_string(),"a".to_string(),"a".to_string(),"a".to_string(),"a".to_string(),"a".to_string(),"a".to_string(),"a".to_string(),"a".to_string(),"a".to_string(),"a".to_string(),"a".to_string(),"a".to_string(),"a".to_string(),"a".to_string(),"0".to_string(), + "0".to_string(),"a".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"a".to_string(),"0".to_string(), + "0".to_string(),"a".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"a".to_string(),"0".to_string(), + "0".to_string(),"a".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"a".to_string(),"0".to_string(), + "0".to_string(),"a".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"a".to_string(),"0".to_string(), + "0".to_string(),"a".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"a".to_string(),"0".to_string(), + "0".to_string(),"a".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"a".to_string(),"0".to_string(), + "0".to_string(),"a".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"a".to_string(),"0".to_string(), + "0".to_string(),"a".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"a".to_string(),"0".to_string(), + "0".to_string(),"a".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"a".to_string(),"0".to_string(), + "0".to_string(),"a".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"a".to_string(),"0".to_string(), + "0".to_string(),"a".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"a".to_string(),"0".to_string(), + "0".to_string(),"a".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"a".to_string(),"0".to_string(), + "0".to_string(),"a".to_string(),"a".to_string(),"a".to_string(),"a".to_string(),"a".to_string(),"a".to_string(),"a".to_string(),"a".to_string(),"a".to_string(),"a".to_string(),"a".to_string(),"a".to_string(),"a".to_string(),"a".to_string(),"0".to_string(), + "0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(), + ], + items: vec![], + exits: vec![], + endings: vec![] + } + ], + tiles: vec![ + Tile { + id: "a".to_string(), + name: None, + wall: false, + animation_frames: vec![ + Image { + pixels: vec![ + 1,1,1,1,1,1,1,1, + 1,0,0,0,0,0,0,1, + 1,0,0,0,0,0,0,1, + 1,0,0,1,1,0,0,1, + 1,0,0,1,1,0,0,1, + 1,0,0,0,0,0,0,1, + 1,0,0,0,0,0,0,1, + 1,1,1,1,1,1,1,1, + ] + } + ] + } + ], + avatar: Avatar { + animation_frames: vec![ + Image { + pixels: vec![ + 0,0,0,1,1,0,0,0, + 0,0,0,1,1,0,0,0, + 0,0,0,1,1,0,0,0, + 0,0,1,1,1,1,0,0, + 0,1,1,1,1,1,1,0, + 1,0,1,1,1,1,0,1, + 0,0,1,0,0,1,0,0, + 0,0,1,0,0,1,0,0, + ] + } + ], + room: "0".to_string(), + position: Position { x: 4, y: 4 } + }, + sprites: vec![ + Sprite { + id: "a".to_string(), + name: None, + animation_frames: vec![ + Image { + pixels: vec![ + 0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0, + 0,1,0,1,0,0,0,1, + 0,1,1,1,0,0,0,1, + 0,1,1,1,0,0,1,0, + 0,1,1,1,1,1,0,0, + 0,0,1,1,1,1,0,0, + 0,0,1,0,0,1,0,0, + ] + } + ], + dialogue: Some("SPR_0".to_string()), + room: "0".to_string(), + position: Position { x: 8, y: 12 } + } + ], + items: vec![ + Item { + id: "0".to_string(), + animation_frames: vec![ + Image { + pixels: vec![ + 0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0, + 0,0,1,1,1,1,0,0, + 0,1,1,0,0,1,0,0, + 0,0,1,0,0,1,0,0, + 0,0,0,1,1,0,0,0, + 0,0,0,0,0,0,0,0, + ] + }, + ], + name: Some("tea".to_string()), + dialogue: Some("ITM_0".to_string()) + }, + ], + dialogues: vec![ + Dialogue { + id: "SPR_0".to_string(), + contents: "I'm a cat".to_string(), + }, + Dialogue { + id: "ITM_0".to_string(), + contents: "You found a nice warm cup of tea".to_string(), + }, + ], + endings: vec![], + variables: vec![ + Variable { id: "a".to_string(), initial_value: "42".to_string() } + ], + } +} + fn image_from_string(string: String) -> Image { let string = string.replace("\n", ""); let pixels: Vec<&str> = string.split("").collect(); @@ -1083,155 +1227,65 @@ fn test_game_from_string() { let output = game_from_string( include_str!["../test/resources/default.bitsy"].to_string() ); - - let expected = Game { - name: "Write your game's title here".to_string(), - version: 6.5, - room_format: 1, - palettes: vec![ - Palette { - id: "0".to_string(), - name: None, - colours: vec![ - Colour {red: 0, green: 82, blue: 204 }, - Colour {red: 128, green: 159, blue: 255 }, - Colour {red: 255, green: 255, blue: 255 }, - ] - } - ], - rooms: vec![ - Room { - id: "0".to_string(), - palette: "0".to_string(), - name: None, - tiles: vec![ - "0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(), - "0".to_string(),"a".to_string(),"a".to_string(),"a".to_string(),"a".to_string(),"a".to_string(),"a".to_string(),"a".to_string(),"a".to_string(),"a".to_string(),"a".to_string(),"a".to_string(),"a".to_string(),"a".to_string(),"a".to_string(),"0".to_string(), - "0".to_string(),"a".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"a".to_string(),"0".to_string(), - "0".to_string(),"a".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"a".to_string(),"0".to_string(), - "0".to_string(),"a".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"a".to_string(),"0".to_string(), - "0".to_string(),"a".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"a".to_string(),"0".to_string(), - "0".to_string(),"a".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"a".to_string(),"0".to_string(), - "0".to_string(),"a".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"a".to_string(),"0".to_string(), - "0".to_string(),"a".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"a".to_string(),"0".to_string(), - "0".to_string(),"a".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"a".to_string(),"0".to_string(), - "0".to_string(),"a".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"a".to_string(),"0".to_string(), - "0".to_string(),"a".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"a".to_string(),"0".to_string(), - "0".to_string(),"a".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"a".to_string(),"0".to_string(), - "0".to_string(),"a".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"a".to_string(),"0".to_string(), - "0".to_string(),"a".to_string(),"a".to_string(),"a".to_string(),"a".to_string(),"a".to_string(),"a".to_string(),"a".to_string(),"a".to_string(),"a".to_string(),"a".to_string(),"a".to_string(),"a".to_string(),"a".to_string(),"a".to_string(),"0".to_string(), - "0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(),"0".to_string(), - ], - items: vec![], - exits: vec![], - endings: vec![] - } - ], - tiles: vec![ - Tile { - id: "a".to_string(), - name: None, - wall: false, - animation_frames: vec![ - Image { - pixels: vec![ - 1,1,1,1,1,1,1,1, - 1,0,0,0,0,0,0,1, - 1,0,0,0,0,0,0,1, - 1,0,0,1,1,0,0,1, - 1,0,0,1,1,0,0,1, - 1,0,0,0,0,0,0,1, - 1,0,0,0,0,0,0,1, - 1,1,1,1,1,1,1,1, - ] - } - ] - } - ], - avatar: Avatar { - animation_frames: vec![ - Image { - pixels: vec![ - 0,0,0,1,1,0,0,0, - 0,0,0,1,1,0,0,0, - 0,0,0,1,1,0,0,0, - 0,0,1,1,1,1,0,0, - 0,1,1,1,1,1,1,0, - 1,0,1,1,1,1,0,1, - 0,0,1,0,0,1,0,0, - 0,0,1,0,0,1,0,0, - ] - } - ], - room: "0".to_string(), - position: Position { x: 4, y: 4 } - }, - sprites: vec![ - Sprite { - id: "a".to_string(), - name: None, - animation_frames: vec![ - Image { - pixels: vec![ - 0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0, - 0,1,0,1,0,0,0,1, - 0,1,1,1,0,0,0,1, - 0,1,1,1,0,0,1,0, - 0,1,1,1,1,1,0,0, - 0,0,1,1,1,1,0,0, - 0,0,1,0,0,1,0,0, - ] - } - ], - dialogue: Some("SPR_0".to_string()), - room: "0".to_string(), - position: Position { x: 8, y: 12 } - } - ], - items: vec![ - Item { - id: "0".to_string(), - animation_frames: vec![ - Image { - pixels: vec![ - 0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0, - 0,0,1,1,1,1,0,0, - 0,1,1,0,0,1,0,0, - 0,0,1,0,0,1,0,0, - 0,0,0,1,1,0,0,0, - 0,0,0,0,0,0,0,0, - ] - }, - ], - name: Some("tea".to_string()), - dialogue: Some("ITM_0".to_string()) - }, - ], - dialogues: vec![ - Dialogue { - id: "SPR_0".to_string(), - contents: "I'm a cat".to_string(), - }, - Dialogue { - id: "ITM_0".to_string(), - contents: "You found a nice warm cup of tea".to_string(), - }, - ], - endings: vec![], - variables: vec![ - Variable { id: "a".to_string(), initial_value: "42".to_string() } - ], - }; + let expected = example_game_default(); assert_eq!(output, expected); } -// fn game_to_string(game: Game) -> String { -// -// } +fn game_to_string(game: Game) -> String { + let mut segments : Vec = Vec::new(); + + // todo refactor + + for palette in game.palettes { + segments.push(palette_to_string(palette)); + } + + for room in game.rooms { + segments.push(room_to_string(room)); + } + + for tile in game.tiles { + segments.push(tile_to_string(tile)); + } + + segments.push(avatar_to_string(game.avatar)); + + for sprite in game.sprites { + segments.push(sprite_to_string(sprite)); + } + + for item in game.items { + segments.push(item_to_string(item)); + } + + for dialogue in game.dialogues { + segments.push(dialogue_to_string(dialogue)); + } + + for ending in game.endings { + segments.push(ending_to_string(ending)); + } + + for variable in game.variables { + segments.push(variable_to_string(variable)); + } + + format!( + "{}\n\n# BITSY VERSION {}\n\n! ROOM_FORMAT {}\n\n{}\n\n", + game.name, + game.version, + game.room_format, + segments.join("\n\n"), + ) +} + +#[test] +fn test_game_to_string() { + let output = game_to_string(example_game_default()); + let expected = include_str!["../test/resources/default.bitsy"].to_string(); + assert_eq!(output, expected); +} fn main() { println!("why does a crate need a main function?");