221 lines
7.4 KiB
Rust
221 lines
7.4 KiB
Rust
// 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<MapArea, MapAreaError> {
|
|
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<u32> {
|
|
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,
|
|
}
|
|
}
|
|
}
|