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.
200 lines
4.7 KiB
200 lines
4.7 KiB
use std::collections::HashMap;
|
|
use serde::{Serialize, Deserialize};
|
|
|
|
use libpso::packet::ship::{UpdateConfig, WriteInfoboard};
|
|
use libpso::character::{CharacterClass, SectionID};
|
|
use libpso::character::settings::{DEFAULT_PALETTE_CONFIG, DEFAULT_TECH_MENU};
|
|
use crate::item::tech::Technique;
|
|
use crate::account::UserAccountId;
|
|
|
|
|
|
#[derive(Clone, Debug, Default)]
|
|
pub struct CharacterAppearance {
|
|
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,
|
|
}
|
|
|
|
|
|
#[derive(Clone, Debug, PartialEq, Eq)]
|
|
pub struct TechLevel(pub u8);
|
|
|
|
#[derive(Clone, Debug, Default)]
|
|
pub struct CharacterTechniques {
|
|
pub techs: HashMap<Technique, TechLevel>
|
|
}
|
|
|
|
impl CharacterTechniques {
|
|
pub fn set_tech(&mut self, tech: Technique, level: TechLevel) {
|
|
self.techs.insert(tech, TechLevel(level.0));
|
|
}
|
|
|
|
pub fn as_bytes(&self) -> [u8; 20] {
|
|
self.techs.iter()
|
|
.fold([0xFF; 20], |mut techlist, (tech, level)| {
|
|
let index = tech.as_value();
|
|
techlist[index as usize] = level.0 - 1;
|
|
techlist
|
|
})
|
|
}
|
|
}
|
|
|
|
|
|
#[derive(Debug, Clone)]
|
|
pub struct CharacterConfig {
|
|
pub raw_data: [u8; 0xE8],
|
|
}
|
|
|
|
impl Default for CharacterConfig {
|
|
fn default() -> CharacterConfig {
|
|
CharacterConfig {
|
|
raw_data: DEFAULT_PALETTE_CONFIG,
|
|
}
|
|
}
|
|
}
|
|
|
|
impl CharacterConfig {
|
|
pub fn update(&mut self, new_config: &UpdateConfig) {
|
|
self.raw_data = new_config.config;
|
|
}
|
|
|
|
pub fn as_bytes(&self) -> [u8; 0xE8] {
|
|
self.raw_data
|
|
}
|
|
}
|
|
|
|
#[derive(Debug, Clone)]
|
|
pub struct CharacterInfoboard {
|
|
pub board: [u16; 172],
|
|
}
|
|
|
|
impl Default for CharacterInfoboard {
|
|
fn default() -> CharacterInfoboard {
|
|
CharacterInfoboard {
|
|
board: [0; 172]
|
|
}
|
|
}
|
|
}
|
|
|
|
impl CharacterInfoboard {
|
|
pub fn as_bytes(&self) -> [u16; 172] {
|
|
self.board
|
|
}
|
|
|
|
pub fn update_infoboard(&mut self, new_board: &WriteInfoboard) {
|
|
self.board = libpso::util::utf8_to_utf16_array(&new_board.message);
|
|
}
|
|
}
|
|
|
|
#[derive(Debug, Clone, Default)]
|
|
pub struct CharacterGuildCard {
|
|
pub description: String,
|
|
}
|
|
|
|
#[derive(Debug, Clone)]
|
|
pub struct CharacterTechMenu {
|
|
pub tech_menu: [u8; 40],
|
|
}
|
|
|
|
impl Default for CharacterTechMenu {
|
|
fn default() -> CharacterTechMenu {
|
|
CharacterTechMenu {
|
|
tech_menu: DEFAULT_TECH_MENU,
|
|
}
|
|
}
|
|
}
|
|
|
|
impl CharacterTechMenu {
|
|
pub fn as_bytes(&self) -> [u8; 40] {
|
|
self.tech_menu
|
|
}
|
|
}
|
|
|
|
#[derive(Clone, Default, Debug)]
|
|
pub struct CharacterMaterials {
|
|
pub power: u32,
|
|
pub mind: u32,
|
|
pub def: u32,
|
|
pub evade: u32,
|
|
pub luck: u32,
|
|
pub hp: u32,
|
|
pub tp: u32,
|
|
}
|
|
|
|
#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize, Default, derive_more::Display)]
|
|
pub struct CharacterEntityId(pub u32);
|
|
|
|
#[derive(Clone)]
|
|
pub struct NewCharacterEntity {
|
|
pub user_id: UserAccountId,
|
|
pub slot: u32,
|
|
|
|
pub name: String,
|
|
pub exp: u32,
|
|
|
|
pub char_class: CharacterClass,
|
|
pub section_id: SectionID,
|
|
|
|
pub appearance: CharacterAppearance,
|
|
pub techs: CharacterTechniques,
|
|
pub config: CharacterConfig,
|
|
pub info_board: CharacterInfoboard,
|
|
pub guildcard: CharacterGuildCard,
|
|
pub materials: CharacterMaterials,
|
|
|
|
pub tech_menu: CharacterTechMenu,
|
|
pub option_flags: u32,
|
|
}
|
|
|
|
impl NewCharacterEntity {
|
|
pub fn new(user: UserAccountId) -> NewCharacterEntity {
|
|
NewCharacterEntity {
|
|
user_id: user,
|
|
slot: 0,
|
|
name: "".into(),
|
|
exp: 0,
|
|
char_class: CharacterClass::HUmar,
|
|
section_id: SectionID::Viridia,
|
|
appearance: CharacterAppearance::default(),
|
|
techs: CharacterTechniques::default(),
|
|
config: CharacterConfig::default(),
|
|
info_board: CharacterInfoboard::default(),
|
|
guildcard: CharacterGuildCard::default(),
|
|
materials: CharacterMaterials::default(),
|
|
tech_menu: CharacterTechMenu::default(),
|
|
option_flags: 0,
|
|
}
|
|
}
|
|
}
|
|
|
|
#[derive(Clone, Default, Debug)]
|
|
pub struct CharacterEntity {
|
|
pub id: CharacterEntityId,
|
|
pub user_id: UserAccountId,
|
|
pub slot: u32,
|
|
|
|
pub name: String,
|
|
pub exp: u32,
|
|
|
|
pub char_class: CharacterClass,
|
|
pub section_id: SectionID,
|
|
|
|
pub appearance: CharacterAppearance,
|
|
pub techs: CharacterTechniques,
|
|
pub config: CharacterConfig,
|
|
pub info_board: CharacterInfoboard,
|
|
pub guildcard: CharacterGuildCard,
|
|
pub materials: CharacterMaterials,
|
|
|
|
pub tech_menu: CharacterTechMenu,
|
|
pub option_flags: u32,
|
|
|
|
pub playtime: u32,
|
|
}
|