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.

362 lines
8.7 KiB

4 years ago
5 years ago
  1. // TODO: ch_class to CharacterClass enum
  2. // TODO: section_id to SectionId enum
  3. // TODO: techniques to enum
  4. use psopacket::PSOPacketData;
  5. use crate::{PSOPacketData, PacketParseError};
  6. #[repr(u32)]
  7. #[derive(Copy, Clone, Hash, PartialEq, Eq)]
  8. pub enum Class {
  9. HUmar,
  10. HUnewearl,
  11. HUcast,
  12. HUcaseal,
  13. RAmar,
  14. RAmarl,
  15. RAcast,
  16. RAcaseal,
  17. FOmar,
  18. FOmarl,
  19. FOnewm,
  20. FOnewearl,
  21. }
  22. impl std::convert::From<u8> for Class {
  23. fn from(f: u8) -> Class {
  24. match f {
  25. 0 => Class::HUmar,
  26. 1 => Class::HUnewearl,
  27. 2 => Class::HUcast,
  28. 3 => Class::RAmar,
  29. 4 => Class::RAcast,
  30. 5 => Class::RAcaseal,
  31. 6 => Class::FOmarl,
  32. 7 => Class::FOnewm,
  33. 8 => Class::FOnewearl,
  34. 9 => Class::HUcaseal,
  35. 10 => Class::RAmarl,
  36. 11 => Class::FOmar,
  37. _ => panic!("unknown class")
  38. }
  39. }
  40. }
  41. pub enum SectionID {
  42. Viridia,
  43. Greenill,
  44. Skyly,
  45. Bluefull,
  46. Purplenum,
  47. Pinkal,
  48. Redria,
  49. Oran,
  50. Yellowboze,
  51. Whitill,
  52. }
  53. #[derive(PSOPacketData, Copy, Clone)]
  54. #[repr(C)]
  55. pub struct Character {
  56. pub atp: u16,
  57. pub mst: u16,
  58. pub evp: u16,
  59. pub hp: u16,
  60. pub dfp: u16,
  61. pub ata: u16,
  62. pub lck: u16,
  63. pub _unknown1: u16,
  64. pub _unknown2: [u32; 2],
  65. pub level: u32,
  66. pub exp: u32,
  67. pub meseta: u32,
  68. pub guildcard: [u8; 16],
  69. pub _unknown3: [u32; 2],
  70. pub name_color: u32,
  71. pub model: u8,
  72. pub _unused: [u8; 11],
  73. pub play_time: u32,
  74. pub name_color_checksum: u32,
  75. pub section_id: u8,
  76. pub ch_class: u8,
  77. pub v2flags: u8,
  78. pub version: u8,
  79. pub v1flags: u32,
  80. pub costume: u16,
  81. pub skin: u16,
  82. pub face: u16,
  83. pub head: u16,
  84. pub hair: u16,
  85. pub hair_r: u16,
  86. pub hair_g: u16,
  87. pub hair_b: u16,
  88. pub prop_x: f32,
  89. pub prop_y: f32,
  90. pub name: [u16; 16],
  91. pub config: [u8; 0xE8],
  92. pub techniques: [u8; 0x14],
  93. }
  94. impl Character {
  95. pub fn as_select_screen(self) -> SelectScreenCharacter {
  96. SelectScreenCharacter {
  97. exp: self.exp,
  98. level: self.level,
  99. guildcard: self.guildcard,
  100. _unknown: self._unknown3,
  101. name_color: self.name_color,
  102. model: self.model,
  103. _unused: [0; 15],
  104. name_color_checksum: self.name_color_checksum,
  105. section_id: self.section_id,
  106. ch_class: self.ch_class,
  107. v2flags: self.v2flags,
  108. version: self.version,
  109. v1flags: self.v1flags,
  110. costume: self.costume,
  111. skin: self.skin,
  112. face: self.face,
  113. head: self.head,
  114. hair: self.hair,
  115. hair_r: self.hair_r,
  116. hair_g: self.hair_g,
  117. hair_b: self.hair_b,
  118. prop_x: self.prop_x,
  119. prop_y: self.prop_y,
  120. name: self.name,
  121. play_time: self.play_time,
  122. }
  123. }
  124. }
  125. impl std::default::Default for Character {
  126. fn default() -> Character {
  127. Character::from_bytes(&mut std::io::Cursor::new([0; 0x190].to_vec())).unwrap()
  128. }
  129. }
  130. #[derive(Copy, Clone, Debug, PartialEq, Default)]
  131. #[repr(C)]
  132. pub struct SelectScreenCharacter {
  133. pub exp: u32,
  134. pub level: u32,
  135. pub guildcard: [u8; 16],
  136. pub _unknown: [u32; 2],
  137. pub name_color: u32,
  138. pub model: u8,
  139. pub _unused: [u8; 15],
  140. pub name_color_checksum: u32,
  141. pub section_id: u8,
  142. pub ch_class: u8,
  143. pub v2flags: u8,
  144. pub version: u8,
  145. pub v1flags: u32,
  146. pub costume: u16,
  147. pub skin: u16,
  148. pub face: u16,
  149. pub head: u16,
  150. pub hair: u16,
  151. pub hair_r: u16,
  152. pub hair_g: u16,
  153. pub hair_b: u16,
  154. pub prop_x: f32,
  155. pub prop_y: f32,
  156. pub name: [u16; 16],
  157. pub play_time: u32,
  158. }
  159. impl SelectScreenCharacter {
  160. pub const SIZE: usize = 0x7C;
  161. pub fn from_le_bytes(bytes: [u8; 0x7C]) -> Result<SelectScreenCharacter, crate::PacketParseError> {
  162. unsafe {
  163. Ok(std::mem::transmute(bytes))
  164. }
  165. }
  166. pub fn to_le_bytes(&self) -> [u8; 0x7C] {
  167. unsafe {
  168. std::mem::transmute(*self)
  169. }
  170. }
  171. pub fn as_character(&self) -> Character {
  172. Character {
  173. exp: self.exp,
  174. level: self.level,
  175. guildcard: self.guildcard,
  176. _unknown3: self._unknown,
  177. name_color: self.name_color,
  178. model: self.model,
  179. name_color_checksum: self.name_color_checksum,
  180. section_id: self.section_id,
  181. ch_class: self.ch_class,
  182. v2flags: self.v2flags,
  183. version: self.version,
  184. v1flags: self.v1flags,
  185. costume: self.costume,
  186. skin: self.skin,
  187. face: self.face,
  188. head: self.head,
  189. hair: self.hair,
  190. hair_r: self.hair_r,
  191. hair_g: self.hair_g,
  192. hair_b: self.hair_b,
  193. prop_x: self.prop_x,
  194. prop_y: self.prop_y,
  195. name: self.name,
  196. play_time: self.play_time,
  197. _unknown1: 0,
  198. _unknown2: [0; 2],
  199. _unused: [0; 11],
  200. atp: 0,
  201. mst: 0,
  202. evp: 0,
  203. hp: 0,
  204. dfp: 0,
  205. ata: 0,
  206. lck: 0,
  207. config: [0; 0xE8],
  208. meseta: 0,
  209. techniques: [0; 0x14],
  210. }
  211. }
  212. }
  213. #[derive(PSOPacketData, Default, Copy, Clone)]
  214. pub struct InventoryItem {
  215. pub equipped: u16,
  216. pub tech: u8,
  217. pub material_count: u8, // in items 7 - 11 material usage values are stored here
  218. pub flags: u32,
  219. pub data1: [u8; 12],
  220. pub item_id: u32,
  221. pub data2: [u8; 4],
  222. }
  223. #[derive(PSOPacketData, Default, Copy, Clone)]
  224. pub struct BankItem {
  225. pub data1: [u8; 12],
  226. pub item_id: u32,
  227. pub data2: [u8; 4],
  228. pub amount: u16,
  229. pub flags: u16,
  230. }
  231. #[derive(PSOPacketData, Default, Copy, Clone)]
  232. pub struct Inventory {
  233. pub item_count: u8,
  234. pub hp_mats_used: u8,
  235. pub tp_mats_used: u8,
  236. pub language: u8,
  237. pub items: [InventoryItem; 30],
  238. }
  239. #[derive(PSOPacketData, Copy, Clone)]
  240. pub struct Bank {
  241. pub item_count: u32,
  242. pub meseta: u32,
  243. pub items: [BankItem; 200],
  244. }
  245. impl std::default::Default for Bank {
  246. fn default() -> Bank {
  247. Bank::from_bytes(&mut std::io::Cursor::new([0; 0x12C8].to_vec())).unwrap()
  248. }
  249. }
  250. #[derive(PSOPacketData, Copy, Clone)]
  251. pub struct KeyTeamConfig {
  252. pub _unknown: [u8; 0x114],
  253. pub keyboard_config: [u8; 0x16C],
  254. pub joystick_config: [u8; 0x38],
  255. pub guildcard: u32,
  256. pub team_id: u32,
  257. pub team_info: [u32; 2],
  258. pub team_priv: u16,
  259. pub _reserved: u16,
  260. pub team_name: [u16; 16],
  261. pub team_flag: [u8; 2048],
  262. //pub team_rewards: [u32; 2],
  263. pub team_rewards: u32,
  264. }
  265. impl std::default::Default for KeyTeamConfig {
  266. fn default() -> KeyTeamConfig {
  267. KeyTeamConfig::from_bytes(&mut std::io::Cursor::new([0; 0xAF4].to_vec())).unwrap()
  268. }
  269. }
  270. #[derive(PSOPacketData, Copy, Clone)]
  271. pub struct Player {
  272. pub inventory: Inventory,
  273. pub character: Character,
  274. pub c_rank: [u8; 0x174],
  275. pub info_board: [u16; 172],
  276. pub blacklist: [u32; 30],
  277. pub autoreply: [u16; 172],
  278. }
  279. #[derive(PSOPacketData, Copy, Clone)]
  280. pub struct FullCharacter {
  281. pub inventory: Inventory,
  282. pub character: Character,
  283. pub _unknown1: [u8; 16],
  284. pub option_flags: u32,
  285. pub quest_data1: [u8; 520],
  286. pub bank: Bank,
  287. pub guildcard: u32,
  288. pub name: [u16; 24],
  289. pub team_name: [u16; 16],
  290. pub guildcard_desc: [u16; 88],
  291. pub _reserved1: u8,
  292. pub _reserved2: u8,
  293. pub section_id: u8,
  294. pub char_class: u8,
  295. pub _unknown2: u32,
  296. pub symbol_chats: [u8; 0x4E0],
  297. pub shortcuts: [u8; 2624],
  298. pub autoreply: [u16; 172],
  299. pub info_board: [u16; 172],
  300. pub _unknown3: [u8; 28],
  301. pub challenge_data: [u8; 320],
  302. pub tech_menu: [u8; 40],
  303. pub _unknown4: [u8; 44],
  304. pub quest_data2: [u8; 88],
  305. pub key_team_config: KeyTeamConfig,
  306. }
  307. impl std::default::Default for FullCharacter {
  308. fn default() -> FullCharacter {
  309. FullCharacter::from_bytes(&mut std::io::Cursor::new([0; 0x3998].to_vec())).unwrap()
  310. }
  311. }
  312. #[derive(PSOPacketData, Copy, Clone)]
  313. pub struct DBChar {
  314. pub inventory: Inventory,
  315. pub character: Character,
  316. pub quest_data1: [u8; 520],
  317. pub bank: Bank,
  318. pub guildcard_desc: [u16; 88],
  319. pub autoreply: [u16; 172],
  320. pub info_board: [u16; 172],
  321. pub challenge_data: [u8; 320],
  322. pub tech_menu: [u8; 40],
  323. pub quest_data2: [u8; 88],
  324. }
  325. #[derive(PSOPacketData, Copy, Clone)]
  326. pub struct DBOpts {
  327. pub blocked: [u32; 30],
  328. pub keyboard_config: [u8; 0x16C],
  329. pub joystick_config: [u8; 0x38],
  330. pub option_flags: u32,
  331. pub shortcuts: [u8; 0xA40],
  332. pub symbol_chats: [u8; 0x4E0],
  333. pub team_name: [u16; 16],
  334. }