diff --git a/src/ship/map.rs b/src/ship/map.rs
index 7bdc779..7bde3f3 100644
--- a/src/ship/map.rs
+++ b/src/ship/map.rs
@@ -346,7 +346,7 @@ impl MapObject {
}
-#[derive(Debug)]
+#[derive(Debug, PartialEq)]
enum MapVariantMode {
Online,
Offline,
@@ -369,6 +369,35 @@ pub enum MapArea {
DeRolLe,
VolOpt,
DarkFalz,
+ Pioneer2Ep2,
+ VrTempleAlpha,
+ VrTempleBeta,
+ VrSpaceshipAlpha,
+ VrSpaceshipBeta,
+ Cca,
+ JungleAreaNorth,
+ JungleAreaEast,
+ Mountain,
+ Seaside,
+ SeabedUpper,
+ SeabedLower,
+ GalGryphon,
+ OlgaFlow,
+ BarbaRay,
+ GolDragon,
+ // Seaside2,
+ // Tower,
+ Pioneer2Ep4,
+ CraterEast,
+ CraterWest,
+ CraterSouth,
+ CraterNorth,
+ CraterInterior,
+ SubDesert1,
+ SubDesert2,
+ SubDesert3,
+ SaintMillion,
+ // TestMapEp4,
}
#[derive(Error, Debug)]
@@ -395,6 +424,35 @@ impl MapArea {
(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::Seaside2), // valid map?
+ // (Episode::Two, 17) => Ok(MapArea::Tower), // valid map?
+ (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), // invalid map!
_ => Err(MapAreaError::UnknownMapArea(area))
}
}
@@ -415,6 +473,35 @@ impl MapArea {
MapArea::DeRolLe => Some(5),
MapArea::VolOpt => Some(7),
MapArea::DarkFalz => Some(9),
+ MapArea::Pioneer2Ep2 => Some(0),
+ MapArea::VrTempleAlpha => Some(1),
+ MapArea::VrTempleBeta => Some(2),
+ MapArea::VrSpaceshipAlpha => Some(3),
+ MapArea::VrSpaceshipBeta => Some(4),
+ MapArea::Cca => Some(5),
+ MapArea::JungleAreaNorth => Some(6),
+ MapArea::JungleAreaEast => Some(7),
+ MapArea::Mountain => Some(8),
+ MapArea::Seaside => Some(9),
+ MapArea::SeabedUpper => Some(10),
+ MapArea::SeabedLower => Some(11),
+ MapArea::GalGryphon => Some(12),
+ MapArea::OlgaFlow => Some(13),
+ MapArea::BarbaRay => Some(14),
+ MapArea::GolDragon => Some(15),
+ // MapArea::Seaside2 => Some(16),
+ // MapArea::Tower => Some(17),
+ MapArea::Pioneer2Ep4 => Some(0),
+ MapArea::CraterEast => Some(1),
+ MapArea::CraterWest => Some(2),
+ MapArea::CraterSouth => Some(3),
+ MapArea::CraterNorth => Some(4),
+ MapArea::CraterInterior => Some(5),
+ MapArea::SubDesert1 => Some(6),
+ MapArea::SubDesert2 => Some(7),
+ MapArea::SubDesert3 => Some(8),
+ MapArea::SaintMillion => Some(9),
+ // MapArea::TestMapEp4 => Some(10),
_ => None
}
}
@@ -436,6 +523,35 @@ impl MapArea {
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::Seaside2 => 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,
}
}
}
@@ -451,31 +567,88 @@ struct MapVariant {
impl MapVariant {
fn new(map: MapArea, mode: MapVariantMode) -> MapVariant {
- let major = match map {
- MapArea::Pioneer2Ep1 => 0,
- MapArea::Forest1 | MapArea::Forest2 => 0,
- MapArea::Caves1 | MapArea::Caves2 | MapArea::Caves3 => rand::thread_rng().gen_range(0, 3),
- MapArea::Mines1 | MapArea::Mines2 => rand::thread_rng().gen_range(0, 3),
- MapArea::Ruins1 | MapArea::Ruins2 | MapArea::Ruins3 => rand::thread_rng().gen_range(0, 3),
- MapArea::Dragon | MapArea::DeRolLe | MapArea::VolOpt | MapArea::DarkFalz => 0,
- };
-
- let minor = match map {
- MapArea::Pioneer2Ep1 => 0,
- MapArea::Forest1 => rand::thread_rng().gen_range(0, 5),
- MapArea::Forest2 => rand::thread_rng().gen_range(0, 5),
- MapArea::Caves1 | MapArea::Caves2 | MapArea::Caves3 => rand::thread_rng().gen_range(0, 2),
- MapArea::Mines1 | MapArea::Mines2 => rand::thread_rng().gen_range(0, 2),
- MapArea::Ruins1 | MapArea::Ruins2 | MapArea::Ruins3 => rand::thread_rng().gen_range(0, 2),
- MapArea::Dragon | MapArea::DeRolLe | MapArea::VolOpt | MapArea::DarkFalz => 0,
- };
-
- MapVariant {
- map: map,
- mode: mode,
- major: major,
- minor: minor,
- }
+ // if mode == MapVariantMode::Online {
+ let major = match map {
+ MapArea::Pioneer2Ep1 => 0,
+ MapArea::Forest1 | MapArea::Forest2 => 0,
+ MapArea::Caves1 | MapArea::Caves2 | MapArea::Caves3 => rand::thread_rng().gen_range(0, 3),
+ MapArea::Mines1 | MapArea::Mines2 => rand::thread_rng().gen_range(0, 3),
+ MapArea::Ruins1 | MapArea::Ruins2 | MapArea::Ruins3 => rand::thread_rng().gen_range(0, 3),
+ MapArea::Dragon | MapArea::DeRolLe | MapArea::VolOpt | MapArea::DarkFalz => 0,
+ MapArea::Pioneer2Ep2 => 0,
+ MapArea::VrTempleAlpha | MapArea::VrTempleBeta | MapArea::VrSpaceshipAlpha | MapArea::VrSpaceshipBeta => rand::thread_rng().gen_range(0, 1),
+ MapArea::Cca | MapArea::JungleAreaNorth | MapArea::JungleAreaEast | MapArea::Seaside => rand::thread_rng().gen_range(0, 2),
+ MapArea::Mountain => rand::thread_rng().gen_range(0, 1),
+ MapArea::SeabedUpper | MapArea::SeabedLower => rand::thread_rng().gen_range(0, 1),
+ MapArea::BarbaRay | MapArea::GolDragon | MapArea::GalGryphon | MapArea::OlgaFlow => 0,
+ MapArea::Pioneer2Ep4 => 0,
+ MapArea::CraterEast => 0,
+ MapArea::CraterWest => 1,
+ MapArea::CraterSouth => 2,
+ MapArea::CraterNorth => 3,
+ MapArea::CraterInterior => 0,
+ MapArea::SubDesert1 | MapArea::SubDesert3 => rand::thread_rng().gen_range(0, 2),
+ MapArea::SubDesert2 => 0,
+ MapArea::SaintMillion => 0,
+ };
+
+ let minor = match map {
+ MapArea::Pioneer2Ep1 => 0,
+ MapArea::Forest1 => rand::thread_rng().gen_range(0, 5),
+ MapArea::Forest2 => rand::thread_rng().gen_range(0, 5),
+ MapArea::Caves1 | MapArea::Caves2 | MapArea::Caves3 => rand::thread_rng().gen_range(0, 2),
+ MapArea::Mines1 | MapArea::Mines2 => rand::thread_rng().gen_range(0, 2),
+ MapArea::Ruins1 | MapArea::Ruins2 | MapArea::Ruins3 => rand::thread_rng().gen_range(0, 2),
+ MapArea::Dragon | MapArea::DeRolLe | MapArea::VolOpt | MapArea::DarkFalz => 0,
+ MapArea::Pioneer2Ep2 => 0,
+ MapArea::VrTempleAlpha | MapArea::VrTempleBeta | MapArea::VrSpaceshipAlpha | MapArea::VrSpaceshipBeta => 0,
+ MapArea::Cca | MapArea::JungleAreaNorth | MapArea::JungleAreaEast | MapArea::Seaside => rand::thread_rng().gen_range(0, 2),
+ MapArea::Mountain => rand::thread_rng().gen_range(0, 1),
+ MapArea::SeabedUpper | MapArea::SeabedLower => rand::thread_rng().gen_range(0, 1),
+ MapArea::GalGryphon => 0,
+ MapArea::OlgaFlow => 0,
+ MapArea::BarbaRay => 0,
+ MapArea::GolDragon => 0,
+ MapArea::Pioneer2Ep4 => 0,
+ MapArea::CraterEast | MapArea::CraterWest | MapArea::CraterSouth | MapArea::CraterNorth | MapArea::CraterInterior => rand::thread_rng().gen_range(0, 2),
+ MapArea::SubDesert1 | MapArea::SubDesert3 => 0,
+ MapArea::SubDesert2 => rand::thread_rng().gen_range(0, 2),
+ MapArea::SaintMillion => 0,
+ };
+ MapVariant {
+ map: map,
+ mode: mode,
+ major: major,
+ minor: minor,
+ }
+ // }
+ // else {
+ // let major = match map {
+ // MapArea::Pioneer2Ep1 | MapArea::Pioneer2Ep2 | MapArea::Pioneer2Ep4 => 0,
+ // MapArea::Forest1 | MapArea::Forest2 => 0,
+ // MapArea::Caves1 | MapArea::Caves2 | MapArea::Caves3 => rand::thread_rng().gen_range(0, 3),
+ // MapArea::Mines1 | MapArea::Mines2 => rand::thread_rng().gen_range(0, 3),
+ // MapArea::Ruins1 | MapArea::Ruins2 | MapArea::Ruins3 => rand::thread_rng().gen_range(0, 3),
+ // MapArea::Dragon | MapArea::DeRolLe | MapArea::VolOpt | MapArea::DarkFalz => 0,
+ // };
+
+ // let minor = match map {
+ // MapArea::Pioneer2Ep1 | MapArea::Pioneer2Ep2 | MapArea::Pioneer2Ep4 => 0,
+ // MapArea::Forest1 => rand::thread_rng().gen_range(0, 5),
+ // MapArea::Forest2 => rand::thread_rng().gen_range(0, 5),
+ // MapArea::Caves1 | MapArea::Caves2 | MapArea::Caves3 => rand::thread_rng().gen_range(0, 2),
+ // MapArea::Mines1 | MapArea::Mines2 => rand::thread_rng().gen_range(0, 2),
+ // MapArea::Ruins1 | MapArea::Ruins2 | MapArea::Ruins3 => rand::thread_rng().gen_range(0, 2),
+ // MapArea::Dragon | MapArea::DeRolLe | MapArea::VolOpt | MapArea::DarkFalz => 0,
+ // };
+
+ // MapVariant {
+ // map: map,
+ // mode: mode,
+ // major: major,
+ // minor: minor,
+ // }
+ // }
}
// TODO: rename to npc_file
fn dat_file(&self) -> String {
@@ -495,6 +668,32 @@ impl MapVariant {
MapArea::DeRolLe => "data/maps/map_boss02e.dat".into(),
MapArea::VolOpt => "data/maps/map_boss03e.dat".into(),
MapArea::DarkFalz => "data/maps/map_boss04e.dat".into(),
+ MapArea::Pioneer2Ep2 => "data/maps/map_labo00_00e.dat".into(),
+ MapArea::VrTempleAlpha => format!("data/maps/map_ruins01_0{}_0{}e.dat", self.major, self.minor),
+ MapArea::VrTempleBeta => format!("data/maps/map_ruins02_0{}_0{}e.dat", self.major, self.minor),
+ MapArea::VrSpaceshipAlpha => format!("data/maps/map_space01_0{}_0{}e.dat", self.major, self.minor),
+ MapArea::VrSpaceshipBeta => format!("data/maps/map_space02_0{}_0{}e.dat", self.major, self.minor),
+ MapArea::Cca => format!("data/maps/map_jungle01_0{}e.dat", self.major),
+ MapArea::JungleAreaNorth => format!("data/maps/map_jungle02_0{}e.dat", self.major),
+ MapArea::JungleAreaEast => format!("data/maps/map_jungle03_0{}e.dat", self.major),
+ MapArea::Mountain => format!("data/maps/map_jungle04_0{}_0{}e.dat", self.major, self.minor),
+ MapArea::Seaside => format!("data/maps/map_jungle05_0{}e.dat", self.major),
+ MapArea::SeabedUpper => format!("data/maps/map_seabed01_0{}_0{}e.dat", self.major, self.minor),
+ MapArea::SeabedLower => format!("data/maps/map_seabed02_0{}_0{}e.dat", self.major, self.minor),
+ MapArea::GalGryphon => "data/maps/map_boss05e.dat".into(),
+ MapArea::OlgaFlow => "data/maps/map_boss06e.dat".into(),
+ MapArea::BarbaRay => "data/maps/map_boss07e.dat".into(),
+ MapArea::GolDragon => "data/maps/map_boss08e.dat".into(),
+ MapArea::Pioneer2Ep4 => "data/maps/map_city02_00_00e.dat".into(),
+ MapArea::CraterEast => format!("data/maps/map_wilds01_0{}_0{}e.dat", self.major, self.minor),
+ MapArea::CraterWest => format!("data/maps/map_wilds01_0{}_0{}e.dat", self.major, self.minor),
+ MapArea::CraterSouth => format!("data/maps/map_wilds01_0{}_0{}e.dat", self.major, self.minor),
+ MapArea::CraterNorth => format!("data/maps/map_wilds01_0{}_0{}e.dat", self.major, self.minor),
+ MapArea::CraterInterior => format!("data/maps/map_crater01_0{}_0{}e.dat", self.major, self.minor),
+ MapArea::SubDesert1 => format!("data/maps/map_desert01_0{}_0{}e.dat", self.major, self.minor),
+ MapArea::SubDesert2 => format!("data/maps/map_desert02_0{}_0{}e.dat", self.major, self.minor),
+ MapArea::SubDesert3 => format!("data/maps/map_desert03_0{}_0{}e.dat", self.major, self.minor),
+ MapArea::SaintMillion => "data/maps/map_boss09_00_00e.dat".into(),
}
}
@@ -515,6 +714,32 @@ impl MapVariant {
MapArea::DeRolLe => "data/maps/map_boss02o.dat".into(),
MapArea::VolOpt => "data/maps/map_boss03o.dat".into(),
MapArea::DarkFalz => "data/maps/map_boss04o.dat".into(),
+ MapArea::Pioneer2Ep2 => "data/maps/map_labo00_00o.dat".into(),
+ MapArea::VrTempleAlpha => format!("data/maps/map_ruins01_0{}_0{}o.dat", self.major, self.minor),
+ MapArea::VrTempleBeta => format!("data/maps/map_ruins02_0{}_0{}o.dat", self.major, self.minor),
+ MapArea::VrSpaceshipAlpha => format!("data/maps/map_space01_0{}_0{}o.dat", self.major, self.minor),
+ MapArea::VrSpaceshipBeta => format!("data/maps/map_space02_0{}_0{}o.dat", self.major, self.minor),
+ MapArea::Cca => format!("data/maps/map_jungle01_0{}o.dat", self.major),
+ MapArea::JungleAreaNorth => format!("data/maps/map_jungle02_0{}o.dat", self.major),
+ MapArea::JungleAreaEast => format!("data/maps/map_jungle03_0{}o.dat", self.major),
+ MapArea::Mountain => format!("data/maps/map_jungle04_0{}_0{}o.dat", self.major, self.minor),
+ MapArea::Seaside => format!("data/maps/map_jungle05_0{}o.dat", self.major),
+ MapArea::SeabedUpper => format!("data/maps/map_seabed01_0{}_0{}o.dat", self.major, self.minor),
+ MapArea::SeabedLower => format!("data/maps/map_seabed02_0{}_0{}o.dat", self.major, self.minor),
+ MapArea::GalGryphon => "data/maps/map_boss05o.dat".into(),
+ MapArea::OlgaFlow => "data/maps/map_boss06o.dat".into(),
+ MapArea::BarbaRay => "data/maps/map_boss07o.dat".into(),
+ MapArea::GolDragon => "data/maps/map_boss08o.dat".into(),
+ MapArea::Pioneer2Ep4 => "data/maps/map_city02_00_00o.dat".into(),
+ MapArea::CraterEast => format!("data/maps/map_wilds01_0{}_0{}o.dat", self.major, self.minor),
+ MapArea::CraterWest => format!("data/maps/map_wilds01_0{}_0{}o.dat", self.major, self.minor),
+ MapArea::CraterSouth => format!("data/maps/map_wilds01_0{}_0{}o.dat", self.major, self.minor),
+ MapArea::CraterNorth => format!("data/maps/map_wilds01_0{}_0{}o.dat", self.major, self.minor),
+ MapArea::CraterInterior => format!("data/maps/map_crater01_0{}_0{}o.dat", self.major, self.minor),
+ MapArea::SubDesert1 => format!("data/maps/map_desert01_0{}_0{}o.dat", self.major, self.minor),
+ MapArea::SubDesert2 => format!("data/maps/map_desert02_0{}_0{}o.dat", self.major, self.minor),
+ MapArea::SubDesert3 => format!("data/maps/map_desert03_0{}_0{}o.dat", self.major, self.minor),
+ MapArea::SaintMillion => "data/maps/map_boss09_00_00o.dat".into(),
}
}
@@ -651,7 +876,7 @@ pub enum MapsError {
#[derive(Debug)]
pub struct Maps {
- map_variants: [MapVariant; 15],
+ map_variants: [MapVariant; 15], // Needs to be a vector. There is an unequal number of maps on each episode
enemy_data: Vec