jake
5 years ago
2 changed files with 182 additions and 0 deletions
@ -0,0 +1,181 @@ |
|||||
|
use log::warn;
|
||||
|
use std::io::Cursor;
|
||||
|
use std::convert::Into;
|
||||
|
use std::path::PathBuf;
|
||||
|
use std::io::{Read};
|
||||
|
use std::fs::File;
|
||||
|
|
||||
|
use byteorder::{LittleEndian, ReadBytesExt};
|
||||
|
|
||||
|
use crate::ship::monster::MonsterType;
|
||||
|
|
||||
|
#[derive(Debug, Copy, Clone)]
|
||||
|
struct RawMapEnemy {
|
||||
|
id: u32,
|
||||
|
_unknown1: u16,
|
||||
|
children: u16,
|
||||
|
_unknown3: u16,
|
||||
|
_unknown4: u16,
|
||||
|
section: u16,
|
||||
|
wave_idd: u16,
|
||||
|
wave_id: u32,
|
||||
|
x: f32,
|
||||
|
y: f32,
|
||||
|
z: f32,
|
||||
|
xrot: u32,
|
||||
|
yrot: u32,
|
||||
|
zrot: u32,
|
||||
|
_field1: f32,
|
||||
|
_field2: f32,
|
||||
|
_field3: f32,
|
||||
|
_field4: f32,
|
||||
|
_field5: f32,
|
||||
|
skin: u32,
|
||||
|
_field6: u32 |
||||
|
}
|
||||
|
|
||||
|
impl RawMapEnemy {
|
||||
|
fn from_byte_stream<R: Read>(cursor: &mut R) -> Result<RawMapEnemy, std::io::Error> {
|
||||
|
Ok(RawMapEnemy {
|
||||
|
id: cursor.read_u32::<LittleEndian>()?,
|
||||
|
_unknown1: cursor.read_u16::<LittleEndian>()?,
|
||||
|
children: cursor.read_u16::<LittleEndian>()?,
|
||||
|
_unknown3: cursor.read_u16::<LittleEndian>()?,
|
||||
|
_unknown4: cursor.read_u16::<LittleEndian>()?,
|
||||
|
section: cursor.read_u16::<LittleEndian>()?,
|
||||
|
wave_idd: cursor.read_u16::<LittleEndian>()?,
|
||||
|
wave_id: cursor.read_u32::<LittleEndian>()?,
|
||||
|
x: cursor.read_f32::<LittleEndian>()?,
|
||||
|
y: cursor.read_f32::<LittleEndian>()?,
|
||||
|
z: cursor.read_f32::<LittleEndian>()?,
|
||||
|
xrot: cursor.read_u32::<LittleEndian>()?,
|
||||
|
yrot: cursor.read_u32::<LittleEndian>()?,
|
||||
|
zrot: cursor.read_u32::<LittleEndian>()?,
|
||||
|
_field1: cursor.read_f32::<LittleEndian>()?,
|
||||
|
_field2: cursor.read_f32::<LittleEndian>()?,
|
||||
|
_field3: cursor.read_f32::<LittleEndian>()?,
|
||||
|
_field4: cursor.read_f32::<LittleEndian>()?,
|
||||
|
_field5: cursor.read_f32::<LittleEndian>()?,
|
||||
|
skin: cursor.read_u32::<LittleEndian>()?,
|
||||
|
_field6: cursor.read_u32::<LittleEndian>()?,
|
||||
|
})
|
||||
|
}
|
||||
|
}
|
||||
|
|
||||
|
|
||||
|
|
||||
|
struct MapObjects {
|
||||
|
|
||||
|
}
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
struct MapEnemies {
|
||||
|
|
||||
|
}
|
||||
|
|
||||
|
impl MapEnemies {
|
||||
|
fn new(path: PathBuf) -> MapEnemies {
|
||||
|
MapEnemies {
|
||||
|
|
||||
|
}
|
||||
|
}
|
||||
|
|
||||
|
fn read_next_enemy(&mut self) -> Option<MapEnemy> {
|
||||
|
None
|
||||
|
}
|
||||
|
}
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
#[derive(Debug, Copy, Clone)]
|
||||
|
pub struct MapEnemy {
|
||||
|
pub monster: MonsterType,
|
||||
|
hp: u32,
|
||||
|
// other stats from bp.n
|
||||
|
dead: bool,
|
||||
|
}
|
||||
|
|
||||
|
|
||||
|
impl MapEnemy {
|
||||
|
fn from_raw(enemy: RawMapEnemy /*, battleparam */) -> MapEnemy {
|
||||
|
//warn!("loading {} {} {}", enemy.id, enemy.skin, enemy.children);
|
||||
|
warn!("{:?}", enemy);
|
||||
|
let monster = match (enemy.id, enemy.skin) {
|
||||
|
(66, 0) => MonsterType::Monest,
|
||||
|
(68, 0) => MonsterType::Booma,
|
||||
|
(68, 1) => MonsterType::Gobooma,
|
||||
|
(68, 2) => MonsterType::Gigobooma,
|
||||
|
|
||||
|
(99, 0) => MonsterType::EvilShark,
|
||||
|
|
||||
|
_ => MonsterType::AlRappy,
|
||||
|
};
|
||||
|
|
||||
|
MapEnemy {
|
||||
|
monster: monster,
|
||||
|
hp: 0,
|
||||
|
dead: false,
|
||||
|
}
|
||||
|
}
|
||||
|
|
||||
|
fn new(monster: MonsterType) -> MapEnemy {
|
||||
|
MapEnemy {
|
||||
|
monster: monster,
|
||||
|
hp: 0,
|
||||
|
dead: false,
|
||||
|
}
|
||||
|
}
|
||||
|
}
|
||||
|
|
||||
|
//impl From<RawMapEnemy> for MapEnemy
|
||||
|
|
||||
|
|
||||
|
|
||||
|
#[derive(Debug)]
|
||||
|
pub struct Maps {
|
||||
|
//map_indexes:
|
||||
|
enemy_data: Vec<MapEnemy>
|
||||
|
|
||||
|
}
|
||||
|
|
||||
|
|
||||
|
|
||||
|
impl Maps {
|
||||
|
pub fn new() -> Maps {
|
||||
|
let mut maps = Maps {
|
||||
|
enemy_data: Vec::new(),
|
||||
|
};
|
||||
|
maps.add_map("data/maps/map_city00_00e.dat".into());
|
||||
|
maps.add_map("data/maps/map_forest01_00e.dat".into());
|
||||
|
maps.add_map("data/maps/map_cave01_00_00e.dat".into());
|
||||
|
|
||||
|
warn!("len {}", maps.enemy_data.len());
|
||||
|
maps
|
||||
|
}
|
||||
|
|
||||
|
fn add_map(&mut self, path: PathBuf) {
|
||||
|
let mut cursor = File::open(path).unwrap();
|
||||
|
while let Ok(enemy) = RawMapEnemy::from_byte_stream(&mut cursor) {
|
||||
|
let new_enemy = MapEnemy::from_raw(enemy);
|
||||
|
match new_enemy.monster {
|
||||
|
MonsterType::Monest => {
|
||||
|
self.enemy_data.push(new_enemy);
|
||||
|
for _ in 0..30 {
|
||||
|
self.enemy_data.push(MapEnemy::new(MonsterType::Mothmant));
|
||||
|
}
|
||||
|
},
|
||||
|
_ => self.enemy_data.push(new_enemy)
|
||||
|
}
|
||||
|
}
|
||||
|
}
|
||||
|
|
||||
|
pub fn enemy_by_id(&self, id: usize) -> MapEnemy {
|
||||
|
self.enemy_data[id]
|
||||
|
}
|
||||
|
}
|
||||
|
|
||||
|
|
Write
Preview
Loading…
Cancel
Save
Reference in new issue