// TOOD: `pub(super) for most of these?` use std::convert::Into; use std::path::PathBuf; use std::io::{Read}; use std::fs::File; use byteorder::{LittleEndian, ReadBytesExt}; use rand::Rng; use thiserror::Error; use crate::ship::monster::MonsterType; use crate::ship::room::{Episode, RoomMode}; // TODO: don't use * use crate::ship::map::*; #[derive(Debug, Copy, Clone, PartialEq)] pub enum MapArea { Pioneer2Ep1, Forest1, Forest2, Caves1, Caves2, Caves3, Mines1, Mines2, Ruins1, Ruins2, Ruins3, Dragon, DeRolLe, VolOpt, DarkFalz, Pioneer2Ep2, VrTempleAlpha, VrTempleBeta, VrSpaceshipAlpha, VrSpaceshipBeta, Cca, JungleAreaNorth, JungleAreaEast, Mountain, Seaside, SeabedUpper, SeabedLower, GalGryphon, OlgaFlow, BarbaRay, GolDragon, SeasideNight, Tower, Pioneer2Ep4, CraterEast, CraterWest, CraterSouth, CraterNorth, CraterInterior, SubDesert1, SubDesert2, SubDesert3, SaintMillion, // TestMapEp4, } #[derive(Error, Debug)] #[error("")] pub enum MapAreaError { UnknownMapArea(u16), } impl MapArea { pub fn from_value(episode: &Episode, area: u16) -> Result { match (episode, area) { (Episode::One, 0) => Ok(MapArea::Pioneer2Ep1), (Episode::One, 1) => Ok(MapArea::Forest1), (Episode::One, 2) => Ok(MapArea::Forest2), (Episode::One, 3) => Ok(MapArea::Caves1), (Episode::One, 4) => Ok(MapArea::Caves2), (Episode::One, 5) => Ok(MapArea::Caves3), (Episode::One, 6) => Ok(MapArea::Mines1), (Episode::One, 7) => Ok(MapArea::Mines2), (Episode::One, 8) => Ok(MapArea::Ruins1), (Episode::One, 9) => Ok(MapArea::Ruins2), (Episode::One, 10) => Ok(MapArea::Ruins3), (Episode::One, 11) => Ok(MapArea::Dragon), (Episode::One, 12) => Ok(MapArea::DeRolLe), (Episode::One, 13) => Ok(MapArea::VolOpt), (Episode::One, 14) => Ok(MapArea::DarkFalz), (Episode::Two, 0) => Ok(MapArea::Pioneer2Ep2), (Episode::Two, 1) => Ok(MapArea::VrTempleAlpha), (Episode::Two, 2) => Ok(MapArea::VrTempleBeta), (Episode::Two, 3) => Ok(MapArea::VrSpaceshipAlpha), (Episode::Two, 4) => Ok(MapArea::VrSpaceshipBeta), (Episode::Two, 5) => Ok(MapArea::Cca), (Episode::Two, 6) => Ok(MapArea::JungleAreaNorth), (Episode::Two, 7) => Ok(MapArea::JungleAreaEast), (Episode::Two, 8) => Ok(MapArea::Mountain), (Episode::Two, 9) => Ok(MapArea::Seaside), (Episode::Two, 10) => Ok(MapArea::SeabedUpper), (Episode::Two, 11) => Ok(MapArea::SeabedLower), (Episode::Two, 12) => Ok(MapArea::GalGryphon), (Episode::Two, 13) => Ok(MapArea::OlgaFlow), (Episode::Two, 14) => Ok(MapArea::BarbaRay), (Episode::Two, 15) => Ok(MapArea::GolDragon), (Episode::Two, 16) => Ok(MapArea::SeasideNight), (Episode::Two, 17) => Ok(MapArea::Tower), (Episode::Four, 0) => Ok(MapArea::Pioneer2Ep4), (Episode::Four, 1) => Ok(MapArea::CraterEast), (Episode::Four, 2) => Ok(MapArea::CraterWest), (Episode::Four, 3) => Ok(MapArea::CraterSouth), (Episode::Four, 4) => Ok(MapArea::CraterNorth), (Episode::Four, 5) => Ok(MapArea::CraterInterior), (Episode::Four, 6) => Ok(MapArea::SubDesert1), (Episode::Four, 7) => Ok(MapArea::SubDesert2), (Episode::Four, 8) => Ok(MapArea::SubDesert3), (Episode::Four, 9) => Ok(MapArea::SaintMillion), // (Episode::Four, 10) => Ok(MapArea::TestMapEp4), _ => Err(MapAreaError::UnknownMapArea(area)) } } pub fn drop_area_value(&self) -> Option { match self { MapArea::Forest1 => Some(0), MapArea::Forest2 => Some(1), MapArea::Caves1 => Some(2), MapArea::Caves2 => Some(3), MapArea::Caves3 => Some(4), MapArea::Mines1 => Some(5), MapArea::Mines2 => Some(6), MapArea::Ruins1 => Some(7), MapArea::Ruins2 => Some(8), MapArea::Ruins3 => Some(9), MapArea::Dragon => Some(2), MapArea::DeRolLe => Some(5), MapArea::VolOpt => Some(7), MapArea::DarkFalz => Some(9), MapArea::VrTempleAlpha => Some(0), MapArea::VrTempleBeta => Some(1), MapArea::VrSpaceshipAlpha => Some(2), MapArea::VrSpaceshipBeta => Some(3), MapArea::Cca => Some(4), MapArea::JungleAreaNorth => Some(5), MapArea::JungleAreaEast => Some(5), MapArea::Mountain => Some(6), MapArea::Seaside => Some(7), MapArea::SeabedUpper => Some(8), MapArea::SeabedLower => Some(9), MapArea::GalGryphon => Some(8), MapArea::OlgaFlow => Some(9), MapArea::BarbaRay => Some(2), MapArea::GolDragon => Some(5), MapArea::SeasideNight => Some(7), MapArea::Tower => Some(9), MapArea::CraterEast => Some(2), MapArea::CraterWest => Some(3), MapArea::CraterSouth => Some(4), MapArea::CraterNorth => Some(5), MapArea::CraterInterior => Some(6), MapArea::SubDesert1 => Some(7), MapArea::SubDesert2 => Some(8), MapArea::SubDesert3 => Some(9), MapArea::SaintMillion => Some(9), // MapArea::TestMapEp4 => Some(0), _ => None } } pub fn area_value(&self) -> u8 { match self { MapArea::Pioneer2Ep1 => 0, MapArea::Forest1 => 1, MapArea::Forest2 => 2, MapArea::Caves1 => 3, MapArea::Caves2 => 4, MapArea::Caves3 => 5, MapArea::Mines1 => 6, MapArea::Mines2 => 7, MapArea::Ruins1 => 8, MapArea::Ruins2 => 9, MapArea::Ruins3 => 10, MapArea::Dragon => 11, MapArea::DeRolLe => 12, MapArea::VolOpt => 13, MapArea::DarkFalz => 14, MapArea::Pioneer2Ep2 => 0, MapArea::VrTempleAlpha => 1, MapArea::VrTempleBeta => 2, MapArea::VrSpaceshipAlpha => 3, MapArea::VrSpaceshipBeta => 4, MapArea::Cca => 5, MapArea::JungleAreaNorth => 6, MapArea::JungleAreaEast => 7, MapArea::Mountain => 8, MapArea::Seaside => 9, MapArea::SeabedUpper => 10, MapArea::SeabedLower => 11, MapArea::GalGryphon => 12, MapArea::OlgaFlow => 13, MapArea::BarbaRay => 14, MapArea::GolDragon => 15, MapArea::SeasideNight => 16, MapArea::Tower => 17, MapArea::Pioneer2Ep4 => 0, MapArea::CraterEast => 1, MapArea::CraterWest => 2, MapArea::CraterSouth => 3, MapArea::CraterNorth => 4, MapArea::CraterInterior => 5, MapArea::SubDesert1 => 6, MapArea::SubDesert2 => 7, MapArea::SubDesert3 => 8, MapArea::SaintMillion => 9, // MapArea::TestMapEp4 => 10, } } }