You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

154 lines
3.9 KiB

// TODO: ch_class to CharacterClass enum
// TODO: section_id to SectionId enum
// TODO: techniques to enum?
#[derive(Default, Copy, Clone, PartialEq, Debug)]
#[repr(C)]
pub struct Character {
pub atp: u16,
pub mst: u16,
pub evp: u16,
pub hp: u16,
pub dfp: u16,
pub ata: u16,
pub lck: u16,
pub _unknown1: u16,
pub _unknown2: [u32; 2],
pub level: u32,
pub exp: u32,
pub meseta: u32,
pub guildcard: [u8; 16],
pub _unknown3: [u32; 2],
pub name_color: u32,
pub model: u8,
pub _unused: [u8; 11],
pub play_time: u32,
pub name_color_checksum: u32,
pub section_id: u8,
pub ch_class: u8,
pub v2flags: u8,
pub version: u8,
pub v1flags: u8,
pub costume: u16,
pub skin: u16,
pub face: u16,
pub head: u16,
pub hair: u16,
pub hair_r: u16,
pub hair_g: u16,
pub hair_b: u16,
pub prop_x: f32,
pub prop_y: f32,
pub name: [u16; 16],
//pub config: [u8; 0xE8],
pub techniques: [u8; 0x14],
}
impl Character {
pub fn as_select_screen(self) -> SelectScreenCharacter {
SelectScreenCharacter {
exp: self.exp,
level: self.level,
guildcard: self.guildcard,
_unknown: self._unknown3,
name_color: self.name_color,
model: self.model,
_unused: [0; 15],
name_color_checksum: self.name_color_checksum,
section_id: self.section_id,
ch_class: self.ch_class,
v2flags: self.v2flags,
version: self.version,
v1flags: self.v1flags,
costume: self.costume,
skin: self.skin,
face: self.face,
head: self.head,
hair: self.hair,
hair_r: self.hair_r,
hair_g: self.hair_g,
hair_b: self.hair_b,
prop_x: self.prop_x,
prop_y: self.prop_y,
name: self.name,
play_time: self.play_time,
}
}
}
#[derive(Copy, Clone, PartialEq, Debug)]
#[repr(C)]
pub struct SelectScreenCharacter {
pub exp: u32,
pub level: u32,
pub guildcard: [u8; 16],
pub _unknown: [u32; 2],
pub name_color: u32,
pub model: u8,
pub _unused: [u8; 15],
pub name_color_checksum: u32,
pub section_id: u8,
pub ch_class: u8,
pub v2flags: u8,
pub version: u8,
pub v1flags: u8,
pub costume: u16,
pub skin: u16,
pub face: u16,
pub head: u16,
pub hair: u16,
pub hair_r: u16,
pub hair_g: u16,
pub hair_b: u16,
pub prop_x: f32,
pub prop_y: f32,
pub name: [u16; 16],
pub play_time: u32,
}
impl SelectScreenCharacter {
pub const SIZE: usize = 0x7C;
pub fn from_le_bytes(bytes: [u8; 0x7C]) -> Result<SelectScreenCharacter, crate::PacketParseError> {
unsafe {
Ok(std::mem::transmute(bytes))
}
}
pub fn to_le_bytes(&self) -> [u8; 0x7C] {
unsafe {
std::mem::transmute(*self)
}
}
pub fn as_character(&self) -> Character {
Character {
exp: self.exp,
level: self.level,
guildcard: self.guildcard,
_unknown3: self._unknown,
name_color: self.name_color,
model: self.model,
name_color_checksum: self.name_color_checksum,
section_id: self.section_id,
ch_class: self.ch_class,
v2flags: self.v2flags,
version: self.version,
v1flags: self.v1flags,
costume: self.costume,
skin: self.skin,
face: self.face,
head: self.head,
hair: self.hair,
hair_r: self.hair_r,
hair_g: self.hair_g,
hair_b: self.hair_b,
prop_x: self.prop_x,
prop_y: self.prop_y,
name: self.name,
play_time: self.play_time,
..Character::default()
}
}
}