1
Fork 0
mirror of https://github.com/redstrate/Kawari.git synced 2025-05-05 20:27:45 +00:00
kawari/src/world/player_setup.rs
Joshua Goins a72199e5af Use the same nameday/deity/etc information everywhere, add tests for PlayerSpawn
This doesn't really fix anything functionally, but makes the Character window
look nicer. The same (currently unchangable) data is now reflected in the lobby.
2025-03-16 14:43:30 -04:00

199 lines
5.7 KiB
Rust

use binrw::binrw;
use crate::{
CHAR_NAME_MAX_LENGTH,
common::{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<u8>,
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<u8>,
pub ornament_mask: [u8; 4],
#[br(count = 85)]
#[bw(pad_size_to = 85)]
pub unknown281: Vec<u8>,
#[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<u8>,
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<u8>,
#[br(count = 36)]
#[bw(pad_size_to = 36)]
pub howto: Vec<u8>,
pub unknown554: [u8; 4],
#[br(count = 60)]
#[bw(pad_size_to = 60)]
pub minions: Vec<u8>,
pub chocobo_taxi_mask: [u8; 12],
#[br(count = 159)]
#[bw(pad_size_to = 159)]
pub watched_cutscenes: Vec<u8>,
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<u8>,
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<u8>,
#[br(count = 102)]
#[bw(pad_size_to = 102)]
pub hunting_mark_mask: Vec<u8>,
#[br(count = 45)]
#[bw(pad_size_to = 45)]
pub triple_triad_cards: Vec<u8>,
pub unknown895: u8,
pub unknown7d7: [u8; 15],
pub unknown7d8: u8,
#[br(count = 49)]
#[bw(pad_size_to = 49)]
pub unknown7e6: Vec<u8>,
pub regional_folklore_mask: [u8; 6],
#[br(count = 87)]
#[bw(pad_size_to = 87)]
pub orchestrion_mask: Vec<u8>,
pub hall_of_novice_completion: [u8; 3],
pub anima_completion: [u8; 11],
#[br(count = 41)]
#[bw(pad_size_to = 41)]
pub unknown85e: Vec<u8>,
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 = 192)]
#[bw(pad_size_to = 192)]
pub unknown948: Vec<u8>,
}
#[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
}
}