use binrw::binrw; use crate::common::{CHAR_NAME_MAX_LENGTH, read_string, write_string}; #[binrw] #[derive(Debug, Clone, Default)] pub struct PlayerSetup { pub content_id: u64, pub crest: u64, pub unknown10: u64, pub char_id: u32, pub rested_exp: u32, pub companion_current_exp: u32, pub unknown1c: u32, pub fish_caught: u32, pub use_bait_catalog_id: u32, pub unknown28: u32, pub unknown_pvp2c: u16, pub unknown2e: u16, pub pvp_frontline_overall_campaigns: u32, pub unknown_timestamp34: u32, pub unknown_timestamp38: u32, pub unknown3c: u32, pub unknown40: u32, pub unknown44: u32, pub companion_time_passed: f32, pub unknown4c: u32, pub unknown50: u16, pub unknown_pvp52: [u16; 4], pub pvp_series_exp: u16, pub player_commendations: u16, pub unknown64: [u16; 8], pub pvp_rival_wings_total_matches: u16, pub pvp_rival_wings_total_victories: u16, pub pvp_rival_wings_weekly_matches: u16, pub pvp_rival_wings_weekly_victories: u16, pub max_level: u8, pub expansion: u8, pub unknown76: u8, pub unknown77: u8, pub unknown78: u8, pub race: u8, pub tribe: u8, pub gender: u8, pub current_job: u8, pub current_class: u8, pub deity: u8, pub nameday_month: u8, pub nameday_day: u8, pub city_state: u8, pub homepoint: u8, pub unknown8d: [u8; 3], pub companion_rank: u8, pub companion_stars: u8, pub companion_sp: u8, pub companion_unk93: u8, pub companion_color: u8, pub companion_fav_feed: u8, pub fav_aetheryte_count: u8, pub unknown97: [u8; 5], pub sightseeing21_to_80_unlock: u8, pub sightseeing_heavensward_unlock: u8, pub unknown9e: [u8; 26], pub exp: [u32; 32], pub pvp_total_exp: u32, pub unknown_pvp124: u32, pub pvp_exp: u32, pub pvp_frontline_overall_ranks: [u32; 3], pub unknown138: u32, pub levels: [u16; 32], #[br(count = 218)] #[bw(pad_size_to = 218)] pub unknown194: Vec, pub companion_name: [u8; 21], pub companion_def_rank: u8, pub companion_att_rank: u8, pub companion_heal_rank: u8, #[br(count = 33)] #[bw(pad_size_to = 33)] pub mount_guide_mask: Vec, pub ornament_mask: [u8; 4], #[br(count = 85)] #[bw(pad_size_to = 85)] pub unknown281: Vec, #[br(count = CHAR_NAME_MAX_LENGTH)] #[bw(pad_size_to = CHAR_NAME_MAX_LENGTH)] #[br(map = read_string)] #[bw(map = write_string)] pub name: String, pub unknown293: [u8; 16], pub unknown2a3: u8, #[br(count = 64)] #[bw(pad_size_to = 64)] pub unlock_bitmask: Vec, pub aetheryte: [u8; 26], pub favorite_aetheryte_ids: [u16; 4], pub free_aetheryte_id: u16, pub ps_plus_free_aetheryte_id: u16, #[br(count = 480)] #[bw(pad_size_to = 480)] pub discovery: Vec, #[br(count = 36)] #[bw(pad_size_to = 36)] pub howto: Vec, pub unknown554: [u8; 4], #[br(count = 60)] #[bw(pad_size_to = 60)] pub minions: Vec, pub chocobo_taxi_mask: [u8; 12], #[br(count = 159)] #[bw(pad_size_to = 159)] pub watched_cutscenes: Vec, pub companion_barding_mask: [u8; 12], pub companion_equipped_head: u8, pub companion_equipped_body: u8, pub companion_equipped_legs: u8, #[br(count = 287)] #[bw(pad_size_to = 287)] pub unknown_mask: Vec, pub pose: [u8; 7], pub unknown6df: [u8; 3], pub challenge_log_complete: [u8; 13], pub secret_recipe_book_mask: [u8; 12], pub unknown_mask6f7: [u8; 29], pub relic_completion: [u8; 12], #[br(count = 37)] #[bw(pad_size_to = 37)] pub sightseeing_mask: Vec, #[br(count = 102)] #[bw(pad_size_to = 102)] pub hunting_mark_mask: Vec, #[br(count = 45)] #[bw(pad_size_to = 45)] pub triple_triad_cards: Vec, pub unknown895: u8, pub unknown7d7: [u8; 15], pub unknown7d8: u8, #[br(count = 49)] #[bw(pad_size_to = 49)] pub unknown7e6: Vec, pub regional_folklore_mask: [u8; 6], #[br(count = 87)] #[bw(pad_size_to = 87)] pub orchestrion_mask: Vec, pub hall_of_novice_completion: [u8; 3], pub anima_completion: [u8; 11], #[br(count = 41)] #[bw(pad_size_to = 41)] pub unknown85e: Vec, pub unlocked_raids: [u8; 28], pub unlocked_dungeons: [u8; 18], pub unlocked_guildhests: [u8; 10], pub unlocked_trials: [u8; 12], pub unlocked_pvp: [u8; 5], pub cleared_raids: [u8; 28], pub cleared_dungeons: [u8; 18], pub cleared_guildhests: [u8; 10], pub cleared_trials: [u8; 12], pub cleared_pvp: [u8; 5], // meh, this is where i put all of the new data #[br(count = 216)] #[bw(pad_size_to = 216)] pub unknown948: Vec, } #[cfg(test)] mod tests { use std::{fs::read, io::Cursor, path::PathBuf}; use binrw::BinRead; use super::*; #[test] fn read_playerspawn() { let mut d = PathBuf::from(env!("CARGO_MANIFEST_DIR")); d.push("resources/tests/player_setup.bin"); let buffer = read(d).unwrap(); let mut buffer = Cursor::new(&buffer); let player_setup = PlayerSetup::read_le(&mut buffer).unwrap(); assert_eq!(player_setup.content_id, 0x004000174c50560d); assert_eq!(player_setup.char_id, 0x107476e7); assert_eq!(player_setup.name, "Lavenaa Warren"); assert_eq!(player_setup.max_level, 100); assert_eq!(player_setup.gender, 1); assert_eq!(player_setup.race, 1); assert_eq!(player_setup.tribe, 2); assert_eq!(player_setup.expansion, 5); assert_eq!(player_setup.current_job, 1); // adventurer assert_eq!(player_setup.current_class, 1); // ditto assert_eq!(player_setup.levels[1], 1); // adventurer } }