misc stuff (add Scenes to Game?)
This commit is contained in:
parent
751e3bb5f0
commit
946f8b7826
96
src/lib.rs
96
src/lib.rs
|
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue