1
Fork 0
mirror of https://github.com/redstrate/Kawari.git synced 2025-04-27 08:57:45 +00:00
kawari/src/lobby/client_select_data.rs

89 lines
3.1 KiB
Rust

use serde_json::json;
use crate::common::CustomizeData;
// TODO: this isn't really an enum in the game, nor is it a flag either. it's weird!
#[derive(Clone, Copy)]
#[repr(i32)]
pub enum RemakeMode {
/// No remake options are available.
None,
/// "You are granted one opportunity to edit your character's race, tribe, gender, appearance, and name."
EditAppearanceName = 1,
/// "If you wish, you can edit your character's race, sex, and appearance."
EditAppearance = 4,
}
/// See https://github.com/aers/FFXIVClientStructs/blob/main/FFXIVClientStructs/FFXIV/Application/Network/WorkDefinitions/ClientSelectData.cs
pub struct ClientSelectData {
pub game_name_unk: String,
pub current_class: i32,
pub class_levels: [i32; 30],
pub race: i32,
pub subrace: i32,
pub gender: i32,
pub birth_month: i32,
pub birth_day: i32,
pub guardian: i32,
pub unk8: i32,
pub unk9: i32,
pub zone_id: i32,
/// Index into the ContentFinderCondition Excel sheet (presumably). But if != 0, then it does special things to the Lobby screen.
/// The most notable is if your character can be remade, it says "Your character is currently bound by duty..."
pub content_finder_condition: i32,
pub customize: CustomizeData,
pub model_main_weapon: i32,
pub model_sub_weapon: i32,
pub unk14: [i32; 10], // probably model ids
pub unk15: i32,
pub unk16: i32,
pub remake_mode: RemakeMode, // TODO: upstream a comment about this to FFXIVClientStructs
/// If above 0, then a message warns the user that they have X minutes left to remake their character.
pub remake_minutes_remaining: i32,
pub voice_id: i32, // presumably
pub unk20: i32,
pub world_name: String,
pub unk22: i32,
pub unk23: i32,
}
impl ClientSelectData {
pub fn to_json(&self) -> String {
let content = json!([
self.game_name_unk,
self.current_class.to_string(),
self.class_levels.map(|x| x.to_string()),
self.race.to_string(),
self.subrace.to_string(),
self.gender.to_string(),
self.birth_month.to_string(),
self.birth_day.to_string(),
self.guardian.to_string(),
self.unk8.to_string(),
self.unk9.to_string(),
self.zone_id.to_string(),
self.content_finder_condition.to_string(),
self.customize.to_json(),
self.model_main_weapon.to_string(),
self.model_sub_weapon.to_string(),
self.unk14.map(|x| x.to_string()),
self.unk15.to_string(),
self.unk16.to_string(),
(self.remake_mode as i32).to_string(),
self.remake_minutes_remaining.to_string(),
self.voice_id.to_string(),
self.unk20.to_string(),
self.world_name,
self.unk22.to_string(),
self.unk23.to_string(),
]);
let obj = json!({
"content": content,
"classname": "ClientSelectData",
"classid": 116,
});
serde_json::to_string(&obj).unwrap()
}
}