character/guildcard structs
This commit is contained in:
parent
ecbd67e8d1
commit
a756af5f30
@ -2,7 +2,8 @@
|
|||||||
// TODO: section_id to SectionId enum
|
// TODO: section_id to SectionId enum
|
||||||
// TODO: techniques to enum?
|
// TODO: techniques to enum?
|
||||||
|
|
||||||
#[derive(Default)]
|
#[derive(Default, Copy, Clone, PartialEq, Debug)]
|
||||||
|
#[repr(C)]
|
||||||
pub struct Character {
|
pub struct Character {
|
||||||
pub atp: u16,
|
pub atp: u16,
|
||||||
pub mst: u16,
|
pub mst: u16,
|
||||||
@ -75,6 +76,8 @@ impl Character {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Copy, Clone, PartialEq, Debug)]
|
||||||
|
#[repr(C)]
|
||||||
pub struct SelectScreenCharacter {
|
pub struct SelectScreenCharacter {
|
||||||
pub exp: u32,
|
pub exp: u32,
|
||||||
pub level: u32,
|
pub level: u32,
|
||||||
@ -102,3 +105,19 @@ pub struct SelectScreenCharacter {
|
|||||||
pub name: [u16; 16],
|
pub name: [u16; 16],
|
||||||
pub play_time: u32,
|
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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -112,3 +112,30 @@ impl Default for GuildCardData {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl GuildCardData {
|
||||||
|
pub fn from_bytes(bytes: [u8; 0xD590]) -> GuildCardData {
|
||||||
|
unsafe {
|
||||||
|
std::mem::transmute(bytes)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn as_bytes(&self) -> [u8; 0xD590] {
|
||||||
|
unsafe {
|
||||||
|
std::mem::transmute(*self)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
#[test]
|
||||||
|
fn guildcard_default_zero() {
|
||||||
|
let gc = super::GuildCardData::default();
|
||||||
|
let bytes = gc.as_bytes();
|
||||||
|
for k in bytes.iter() {
|
||||||
|
assert!(*k == 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -1,9 +1,12 @@
|
|||||||
use psopacket::pso_packet;
|
use psopacket::pso_packet;
|
||||||
use crate::{PSOPacket, PacketParseError};
|
use crate::{PSOPacket, PacketParseError};
|
||||||
|
|
||||||
|
use crate::character::character::SelectScreenCharacter;
|
||||||
|
|
||||||
use std::io::{Read, Seek, SeekFrom};
|
use std::io::{Read, Seek, SeekFrom};
|
||||||
|
|
||||||
pub const PATCH_FILE_CHUNK_SIZE: u16 = 0x8000; // 32kb
|
pub const PATCH_FILE_CHUNK_SIZE: u16 = 0x8000; // 32kb
|
||||||
|
pub const GUILD_CARD_CHUNK_SIZE: usize = 0x6800;
|
||||||
|
|
||||||
#[allow(non_camel_case_types)]
|
#[allow(non_camel_case_types)]
|
||||||
type u8_str = u8;
|
type u8_str = u8;
|
||||||
@ -228,6 +231,103 @@ pub struct CharAck {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#[pso_packet(0xE5)]
|
||||||
|
pub struct CharacterPreview {
|
||||||
|
pub flag: u32,
|
||||||
|
pub slot: u32,
|
||||||
|
pub character: SelectScreenCharacter,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[pso_packet(0x3E8)]
|
||||||
|
pub struct GuildcardDataRequest {
|
||||||
|
flag: u32,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[pso_packet(0x1DC)]
|
||||||
|
pub struct GuildcardDataHeader {
|
||||||
|
flag: u32,
|
||||||
|
one: u32,
|
||||||
|
len: u32,
|
||||||
|
checksum: u32,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl GuildcardDataHeader {
|
||||||
|
pub fn new(len: usize, checksum: u32) -> GuildcardDataHeader {
|
||||||
|
GuildcardDataHeader {
|
||||||
|
flag: 0,
|
||||||
|
one: 1,
|
||||||
|
len: len as u32,
|
||||||
|
checksum: checksum
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[pso_packet(0x3DC)]
|
||||||
|
pub struct GuildcardDataChunkRequest {
|
||||||
|
flag: u32,
|
||||||
|
_unknown: u32,
|
||||||
|
pub chunk: u32,
|
||||||
|
pub again: u32,
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct GuildcardDataChunk {
|
||||||
|
flag: u32,
|
||||||
|
_unknown: u32,
|
||||||
|
chunk: u32,
|
||||||
|
pub buffer: [u8; GUILD_CARD_CHUNK_SIZE],
|
||||||
|
|
||||||
|
len: usize,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl GuildcardDataChunk {
|
||||||
|
pub fn new(chunk: u32, buffer: [u8; GUILD_CARD_CHUNK_SIZE], len: usize) -> GuildcardDataChunk {
|
||||||
|
GuildcardDataChunk {
|
||||||
|
flag: 0,
|
||||||
|
_unknown: 0,
|
||||||
|
chunk: chunk as u32,
|
||||||
|
buffer: buffer,
|
||||||
|
len: len,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl PSOPacket for GuildcardDataChunk {
|
||||||
|
fn from_bytes(_data: &[u8]) -> Result<GuildcardDataChunk, PacketParseError> {
|
||||||
|
unimplemented!();
|
||||||
|
}
|
||||||
|
|
||||||
|
fn as_bytes(&self) -> Vec<u8> {
|
||||||
|
let mut buf: Vec<u8> = Vec::new();
|
||||||
|
buf.extend_from_slice(&u32::to_le_bytes(self.flag));
|
||||||
|
buf.extend_from_slice(&u32::to_le_bytes(self._unknown));
|
||||||
|
buf.extend_from_slice(&u32::to_le_bytes(self.chunk));
|
||||||
|
buf.extend_from_slice(&self.buffer[0..self.len]);
|
||||||
|
while buf.len() % 4 != 0 {
|
||||||
|
buf.push(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
let pkt_len = (buf.len() + 4) as u16;
|
||||||
|
let mut prebuf: Vec<u8> = Vec::new();
|
||||||
|
prebuf.extend_from_slice(&u16::to_le_bytes(pkt_len));
|
||||||
|
prebuf.extend_from_slice(&u16::to_le_bytes(0x2DC));
|
||||||
|
prebuf.append(&mut buf);
|
||||||
|
prebuf
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl std::fmt::Debug for GuildcardDataChunk {
|
||||||
|
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
|
||||||
|
write!(f, "packet GuildcardDataChunk {{\n").unwrap();
|
||||||
|
write!(f, " flag: {:?}\n", self.flag).unwrap();
|
||||||
|
write!(f, " _unknown: {:X?}\n", self._unknown).unwrap();
|
||||||
|
write!(f, " chunk: {:X?}\n", self.chunk).unwrap();
|
||||||
|
write!(f, " buffer: [0..{:X}]\n", self.len).unwrap();
|
||||||
|
write!(f, "}}")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
#[test]
|
#[test]
|
||||||
|
Loading…
x
Reference in New Issue
Block a user