misc stuff (add Scenes to Game?)

This commit is contained in:
Max Bradbury 2021-11-14 18:07:57 +00:00
parent 751e3bb5f0
commit 946f8b7826
1 changed files with 86 additions and 10 deletions

View File

@ -26,6 +26,12 @@ pub struct Position {
y: u8, y: u8,
} }
impl Position {
pub fn to_index(&self, width: u8) -> u16 {
(self.y * width + self.x) as u16
}
}
// #[derive(Serialize, Deserialize)] // #[derive(Serialize, Deserialize)]
// pub enum DataType { // pub enum DataType {
// Image, // Image,
@ -100,10 +106,11 @@ pub struct Position {
pub struct Game { pub struct Game {
pub config: Config, pub config: Config,
pub palettes: Vec<Palette>,
pub images: Vec<Image>,
pub tiles: Vec<Tile>,
pub entities: Vec<Entity>, pub entities: Vec<Entity>,
pub images: Vec<Image>,
pub palettes: Vec<Palette>,
pub scenes: Vec<Scene>,
pub tiles: Vec<Tile>,
// pub variables: Vec<Variable>, // pub variables: Vec<Variable>,
// pub triggers: HashMap<String, ScriptCollection>, // pub triggers: HashMap<String, ScriptCollection>,
pub music: Vec<Music>, pub music: Vec<Music>,
@ -113,12 +120,32 @@ pub struct Game {
pub struct GameParseError; pub struct GameParseError;
impl Game { impl Game {
pub fn new() -> Self {
Self {
config: Config {
name: None,
width: 16,
height: 9,
tick: 400,
starting_room: None,
version: (0, 1)
},
entities: vec![],
images: vec![],
palettes: vec![],
scenes: vec![],
tiles: vec![],
music: vec![]
}
}
pub fn from_dir(path: PathBuf) -> Result<Game, GameParseError> { pub fn from_dir(path: PathBuf) -> Result<Game, GameParseError> {
let mut images = Vec::new(); let mut images = Vec::new();
let mut tiles = Vec::new(); let mut tiles = Vec::new();
let mut entities = Vec::new(); let mut entities = Vec::new();
let mut music = Vec::new(); let mut music = Vec::new();
let mut palettes = Vec::new(); let mut palettes = Vec::new();
let mut scenes = Vec::new();
let mut music_dir = path.clone(); let mut music_dir = path.clone();
music_dir.push("music"); music_dir.push("music");
@ -176,6 +203,17 @@ impl Game {
entities.push(Entity::from_file(file.path())); entities.push(Entity::from_file(file.path()));
} }
let mut scenes_dir = path.clone();
scenes_dir.push("scenes");
let scenes_files = scenes_dir.read_dir()
.expect("couldn't read scene dir");
for file in scenes_files {
let file = file.unwrap();
scenes.push(Scene::from_file(file.path()));
}
let mut game_config = path.clone(); let mut game_config = path.clone();
game_config.push("game.toml"); game_config.push("game.toml");
let config = fs::read_to_string(game_config) let config = fs::read_to_string(game_config)
@ -183,7 +221,7 @@ impl Game {
let config: Config = toml::from_str(&config) let config: Config = toml::from_str(&config)
.expect("Couldn't parse game config"); .expect("Couldn't parse game config");
Ok(Game { config, images, tiles, palettes, music, entities }) Ok(Game { config, images, tiles, palettes, music, entities, scenes })
} }
// todo Result<&Image>? // todo Result<&Image>?
@ -213,7 +251,7 @@ impl Game {
pub fn get_entity_by_name(&self, name: String) -> Option<&Entity> { pub fn get_entity_by_name(&self, name: String) -> Option<&Entity> {
for entity in self.entities.iter() { for entity in self.entities.iter() {
if entity.name == name { if entity.name == name {
return Some(&entity); return Some(entity);
} }
} }
@ -224,7 +262,7 @@ impl Game {
pub fn get_music_by_name(&self, name: String) -> Option<&Music> { pub fn get_music_by_name(&self, name: String) -> Option<&Music> {
for music in self.music.iter() { for music in self.music.iter() {
if music.name == name { if music.name == name {
return Some(&music); return Some(music);
} }
} }
@ -232,10 +270,10 @@ impl Game {
} }
// todo Result<&Palette>? // todo Result<&Palette>?
pub fn get_palette_by_name(&self, name: String) -> Option<&Palette> { pub fn find_palette(&mut self, name: &str) -> Option<&mut Palette> {
for palette in self.palettes.iter() { for palette in self.palettes.iter_mut() {
if palette.name == name { if palette.name == name {
return Some(&palette); return Some(palette);
} }
} }
@ -246,10 +284,48 @@ impl Game {
pub fn get_tile_by_name(&self, name: String) -> Option<&Tile> { pub fn get_tile_by_name(&self, name: String) -> Option<&Tile> {
for tile in self.tiles.iter() { for tile in self.tiles.iter() {
if tile.name == name { if tile.name == name {
return Some(&tile); return Some(tile);
} }
} }
None None
} }
pub fn get_scene_by_name(&mut self, name: String) -> Option<&mut Scene> {
for scene in self.scenes.iter_mut() {
if scene.name == name {
return Some(scene);
}
}
None
}
pub fn remove_entity(&mut self, scene_name: String, position: Position) {
let width = self.config.width.clone();
self.get_scene_by_name(scene_name).unwrap()
.foreground[position.to_index(width) as usize] = None;
}
}
#[cfg(test)]
mod test {
use crate::{Position, Game};
#[test]
fn position_to_index() {
assert_eq!(Position { x: 1, y: 5 }.to_index(8), 41);
assert_eq!(Position { x: 0, y: 0 }.to_index(8), 0);
}
#[test]
fn remove_entity() {
let mut game = Game::new();
game.scenes.push(crate::mock::scenes::zero());
game.remove_entity("zero".into(), Position { x: 1, y: 1 });
assert_eq!(game.scenes[0].foreground[9], None);
}
} }