add some vars to MapEnemy, error types to misc map functions, and MapArea -> u8
This commit is contained in:
		
							parent
							
								
									d773002eaa
								
							
						
					
					
						commit
						0e3b305f95
					
				
							
								
								
									
										103
									
								
								src/ship/map.rs
									
									
									
									
									
								
							
							
						
						
									
										103
									
								
								src/ship/map.rs
									
									
									
									
									
								
							@ -7,6 +7,7 @@ use std::fs::File;
 | 
			
		||||
 | 
			
		||||
use byteorder::{LittleEndian, ReadBytesExt};
 | 
			
		||||
use rand::Rng;
 | 
			
		||||
use thiserror::Error;
 | 
			
		||||
 | 
			
		||||
use crate::ship::monster::MonsterType;
 | 
			
		||||
use crate::ship::room::Episode;
 | 
			
		||||
@ -65,18 +66,22 @@ impl RawMapEnemy {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#[derive(Debug)]
 | 
			
		||||
#[derive(Error, Debug)]
 | 
			
		||||
#[error("")]
 | 
			
		||||
enum MapEnemyError {
 | 
			
		||||
    UnknownEnemyId(u32),
 | 
			
		||||
    MapAreaError(#[from] MapAreaError),
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#[derive(Debug, Copy, Clone)]
 | 
			
		||||
pub struct MapEnemy {
 | 
			
		||||
    pub monster: MonsterType,
 | 
			
		||||
    pub map_area: MapArea,
 | 
			
		||||
    hp: u32,
 | 
			
		||||
    // other stats from bp.n
 | 
			
		||||
    dead: bool,
 | 
			
		||||
    // TODO: other stats from battleparam
 | 
			
		||||
    pub dropped_item: bool,
 | 
			
		||||
    pub gave_exp: bool,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl MapEnemy {
 | 
			
		||||
@ -169,16 +174,20 @@ impl MapEnemy {
 | 
			
		||||
 | 
			
		||||
        Ok(MapEnemy {
 | 
			
		||||
            monster: monster,
 | 
			
		||||
            map_area: MapArea::from_value(&episode, enemy.map_area as u32)?,
 | 
			
		||||
            hp: 0,
 | 
			
		||||
            dead: false,
 | 
			
		||||
            dropped_item: false,
 | 
			
		||||
            gave_exp: false,
 | 
			
		||||
        })
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fn new(monster: MonsterType) -> MapEnemy {
 | 
			
		||||
    fn new(monster: MonsterType, map_area: MapArea) -> MapEnemy {
 | 
			
		||||
        MapEnemy {
 | 
			
		||||
            monster: monster,
 | 
			
		||||
            map_area: map_area,
 | 
			
		||||
            hp: 0,
 | 
			
		||||
            dead: false,
 | 
			
		||||
            dropped_item: false,
 | 
			
		||||
            gave_exp: false,
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -340,7 +349,7 @@ enum MapVariantMode {
 | 
			
		||||
    Offline,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Debug)]
 | 
			
		||||
#[derive(Debug, Copy, Clone)]
 | 
			
		||||
pub enum MapArea {
 | 
			
		||||
    Pioneer2Ep1,
 | 
			
		||||
    Forest1,
 | 
			
		||||
@ -359,12 +368,14 @@ pub enum MapArea {
 | 
			
		||||
    DarkFalz,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Error, Debug)]
 | 
			
		||||
#[error("")]
 | 
			
		||||
pub enum MapAreaError {
 | 
			
		||||
    UnknownMapArea(u32),
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl MapArea {
 | 
			
		||||
    pub fn from_value(episode: Episode, area: u32) -> Result<MapArea, MapAreaError> {
 | 
			
		||||
    pub fn from_value(episode: &Episode, area: u32) -> Result<MapArea, MapAreaError> {
 | 
			
		||||
        match (episode, area) {
 | 
			
		||||
            (Episode::One, 0) => Ok(MapArea::Pioneer2Ep1),
 | 
			
		||||
            (Episode::One, 1) => Ok(MapArea::Forest1),
 | 
			
		||||
@ -404,6 +415,26 @@ impl MapArea {
 | 
			
		||||
            _ => 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,
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -516,76 +547,76 @@ fn enemy_data_from_map_data(path: PathBuf, episode: &Episode) -> Vec<Option<MapE
 | 
			
		||||
                                   match monster.monster {
 | 
			
		||||
                                       MonsterType::Monest => {
 | 
			
		||||
                                           for _ in 0..30 {
 | 
			
		||||
                                               monsters.push(Some(MapEnemy::new(MonsterType::Mothmant)));
 | 
			
		||||
                                               monsters.push(Some(MapEnemy::new(MonsterType::Mothmant, monster.map_area)));
 | 
			
		||||
                                           }
 | 
			
		||||
                                       },
 | 
			
		||||
                                       MonsterType::PofuillySlime => {
 | 
			
		||||
                                           for _ in 0..4 {
 | 
			
		||||
                                               monsters.push(Some(MapEnemy::new(MonsterType::PofuillySlime)));
 | 
			
		||||
                                               monsters.push(Some(MapEnemy::new(MonsterType::PofuillySlime, monster.map_area)));
 | 
			
		||||
                                           }
 | 
			
		||||
                                       },
 | 
			
		||||
                                       MonsterType::PanArms => {
 | 
			
		||||
                                           monsters.push(Some(MapEnemy::new(MonsterType::Hidoom)));
 | 
			
		||||
                                           monsters.push(Some(MapEnemy::new(MonsterType::Migium)));
 | 
			
		||||
                                           monsters.push(Some(MapEnemy::new(MonsterType::Hidoom, monster.map_area)));
 | 
			
		||||
                                           monsters.push(Some(MapEnemy::new(MonsterType::Migium, monster.map_area)));
 | 
			
		||||
                                       },
 | 
			
		||||
                                       MonsterType::SinowBeat => {
 | 
			
		||||
                                           for _ in 0..4 {
 | 
			
		||||
                                               monsters.push(Some(MapEnemy::new(MonsterType::SinowBeat)));
 | 
			
		||||
                                               monsters.push(Some(MapEnemy::new(MonsterType::SinowBeat, monster.map_area)));
 | 
			
		||||
                                           }
 | 
			
		||||
                                       },
 | 
			
		||||
                                       MonsterType::SinowGold => {
 | 
			
		||||
                                           for _ in 0..4 {
 | 
			
		||||
                                               monsters.push(Some(MapEnemy::new(MonsterType::SinowGold)));
 | 
			
		||||
                                               monsters.push(Some(MapEnemy::new(MonsterType::SinowGold, monster.map_area)));
 | 
			
		||||
                                           }
 | 
			
		||||
                                       },
 | 
			
		||||
                                       MonsterType::Canane => {
 | 
			
		||||
                                           for _ in 0..8 {
 | 
			
		||||
                                               monsters.push(Some(MapEnemy::new(MonsterType::RingCanadine)));
 | 
			
		||||
                                               monsters.push(Some(MapEnemy::new(MonsterType::RingCanadine, monster.map_area)));
 | 
			
		||||
                                           }
 | 
			
		||||
                                       },
 | 
			
		||||
                                       MonsterType::ChaosSorcerer => {
 | 
			
		||||
                                           monsters.push(Some(MapEnemy::new(MonsterType::BeeR)));
 | 
			
		||||
                                           monsters.push(Some(MapEnemy::new(MonsterType::BeeL)));
 | 
			
		||||
                                           monsters.push(Some(MapEnemy::new(MonsterType::BeeR, monster.map_area)));
 | 
			
		||||
                                           monsters.push(Some(MapEnemy::new(MonsterType::BeeL, monster.map_area)));
 | 
			
		||||
                                       },
 | 
			
		||||
                                       MonsterType::Bulclaw => {
 | 
			
		||||
                                           for _ in 0..4 {
 | 
			
		||||
                                               monsters.push(Some(MapEnemy::new(MonsterType::Claw)));
 | 
			
		||||
                                               monsters.push(Some(MapEnemy::new(MonsterType::Claw, monster.map_area)));
 | 
			
		||||
                                           }
 | 
			
		||||
                                       },
 | 
			
		||||
                                       MonsterType::DeRolLe => {
 | 
			
		||||
                                           for _ in 0..10 {
 | 
			
		||||
                                               monsters.push(Some(MapEnemy::new(MonsterType::DeRolLeBody)));
 | 
			
		||||
                                               monsters.push(Some(MapEnemy::new(MonsterType::DeRolLeBody, monster.map_area)));
 | 
			
		||||
                                           }
 | 
			
		||||
                                           for _ in 0..9 {
 | 
			
		||||
                                               monsters.push(Some(MapEnemy::new(MonsterType::DeRolLeMine)));
 | 
			
		||||
                                               monsters.push(Some(MapEnemy::new(MonsterType::DeRolLeMine, monster.map_area)));
 | 
			
		||||
                                           }
 | 
			
		||||
                                       },
 | 
			
		||||
                                       MonsterType::VolOptPartA => {
 | 
			
		||||
                                           for _ in 0..6 {
 | 
			
		||||
                                               monsters.push(Some(MapEnemy::new(MonsterType::VolOptPillar)));
 | 
			
		||||
                                               monsters.push(Some(MapEnemy::new(MonsterType::VolOptPillar, monster.map_area)));
 | 
			
		||||
                                           }
 | 
			
		||||
                                           for _ in 0..24 {
 | 
			
		||||
                                               monsters.push(Some(MapEnemy::new(MonsterType::VolOptMonitor)));
 | 
			
		||||
                                               monsters.push(Some(MapEnemy::new(MonsterType::VolOptMonitor, monster.map_area)));
 | 
			
		||||
                                           }
 | 
			
		||||
                                           for _ in 0..2 {
 | 
			
		||||
                                               monsters.push(Some(MapEnemy::new(MonsterType::VolOptUnused)));
 | 
			
		||||
                                               monsters.push(Some(MapEnemy::new(MonsterType::VolOptUnused, monster.map_area)));
 | 
			
		||||
                                           }
 | 
			
		||||
                                           monsters.push(Some(MapEnemy::new(MonsterType::VolOptAmp)));
 | 
			
		||||
                                           monsters.push(Some(MapEnemy::new(MonsterType::VolOptCore)));
 | 
			
		||||
                                           monsters.push(Some(MapEnemy::new(MonsterType::VolOptUnused)));
 | 
			
		||||
                                           monsters.push(Some(MapEnemy::new(MonsterType::VolOptAmp, monster.map_area)));
 | 
			
		||||
                                           monsters.push(Some(MapEnemy::new(MonsterType::VolOptCore, monster.map_area)));
 | 
			
		||||
                                           monsters.push(Some(MapEnemy::new(MonsterType::VolOptUnused, monster.map_area)));
 | 
			
		||||
                                       },
 | 
			
		||||
                                       // TOOD: this cares about difficulty (theres an ult-specific darvant?)
 | 
			
		||||
                                       MonsterType::DarkFalz => {
 | 
			
		||||
                                           for _ in 0..509 {
 | 
			
		||||
                                               monsters.push(Some(MapEnemy::new(MonsterType::Darvant)));
 | 
			
		||||
                                               monsters.push(Some(MapEnemy::new(MonsterType::Darvant, monster.map_area)));
 | 
			
		||||
                                           }
 | 
			
		||||
                                           monsters.push(Some(MapEnemy::new(MonsterType::DarkFalz3)));
 | 
			
		||||
                                           monsters.push(Some(MapEnemy::new(MonsterType::DarkFalz2)));
 | 
			
		||||
                                           monsters.push(Some(MapEnemy::new(MonsterType::DarkFalz1)));
 | 
			
		||||
                                           monsters.push(Some(MapEnemy::new(MonsterType::DarkFalz3, monster.map_area)));
 | 
			
		||||
                                           monsters.push(Some(MapEnemy::new(MonsterType::DarkFalz2, monster.map_area)));
 | 
			
		||||
                                           monsters.push(Some(MapEnemy::new(MonsterType::DarkFalz1, monster.map_area)));
 | 
			
		||||
                                       },
 | 
			
		||||
                                       _ => {
 | 
			
		||||
                                           for _ in 0..enemy.children {
 | 
			
		||||
                                               monsters.push(Some(MapEnemy::new(monster.monster)));
 | 
			
		||||
                                               monsters.push(Some(MapEnemy::new(monster.monster, monster.map_area)));
 | 
			
		||||
                                           }
 | 
			
		||||
                                       }
 | 
			
		||||
                                   }
 | 
			
		||||
@ -596,6 +627,12 @@ fn enemy_data_from_map_data(path: PathBuf, episode: &Episode) -> Vec<Option<MapE
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#[derive(Error, Debug)]
 | 
			
		||||
#[error("")]
 | 
			
		||||
pub enum MapsError {
 | 
			
		||||
    InvalidMonsterId(usize),
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[derive(Debug)]
 | 
			
		||||
pub struct Maps {
 | 
			
		||||
    map_variants: [MapVariant; 15],
 | 
			
		||||
@ -641,8 +678,8 @@ impl Maps {
 | 
			
		||||
        maps
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    pub fn enemy_by_id(&self, id: usize) -> MapEnemy {
 | 
			
		||||
        self.enemy_data[id].unwrap()
 | 
			
		||||
    pub fn enemy_by_id(&self, id: usize) -> Result<MapEnemy, MapsError> {
 | 
			
		||||
        self.enemy_data[id].ok_or(MapsError::InvalidMonsterId(id))
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    pub fn map_headers(&self) -> [u32; 0x20] {
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user