pso2packetlib/protocol/
palette.rs

1//! Palette related packets. \[0x21\]
2use crate::fixed_types::FixedVec;
3
4use super::{HelperReadWrite, PacketReadWrite};
5
6// ----------------------------------------------------------------
7// Palette packets
8// ----------------------------------------------------------------
9
10/// (0x21, 0x01) Load Palettes.
11///
12/// (S -> C) Sent when a player starts a game or when a palette is updated.
13///
14/// Response to:
15/// [`crate::protocol::Packet::StartGame`],
16/// [`crate::protocol::Packet::UpdatePalette`]
17#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
18#[cfg_attr(feature = "serde", serde(default))]
19#[derive(Debug, Default, Clone, PartialEq, PacketReadWrite)]
20#[Id(0x21, 0x01)]
21pub struct LoadPalettePacket {
22    /// Current palette index.
23    pub cur_palette: u32,
24    /// Current subpalette index.
25    pub cur_subpalette: u32,
26    /// Current book index.
27    pub cur_book: u32,
28    /// Palettes in the first book.
29    pub palettes: [WeaponPalette; 6],
30    /// Subpalettes in the first book.
31    #[SeekAfter(0x240)] // maybe other books
32    pub subpalettes: [SubPalette; 6],
33}
34
35/// (0x21, 0x03) Full Palette Info.
36///
37/// (S -> C) Sent in response to the request.
38///
39/// Response to:
40/// [`crate::protocol::Packet::FullPaletteInfoRequest`]
41#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
42#[cfg_attr(feature = "serde", serde(default))]
43#[derive(Debug, Default, Clone, PartialEq, PacketReadWrite)]
44#[Id(0x21, 0x03)]
45pub struct FullPaletteInfoPacket {
46    // from packet 0x21, 0x01
47    /// Current palette index.
48    pub cur_palette: u32,
49    /// Current subpalette index.
50    pub cur_subpalette: u32,
51    /// Current book index.
52    pub cur_book: u32,
53    /// Palettes in the first book.
54    pub palettes: [WeaponPalette; 6],
55    /// Subpalettes in the first book.
56    pub subpalettes: [SubPalette; 6],
57    #[Seek(0x240)] // maybe other books
58    // from packet 0x21, 0x0F
59    /// Default photon arts (?).
60    #[SeekAfter(0x240)] // padding??
61    pub default_pa: FixedVec<0x1A0, u32>,
62}
63
64/// (0x21, 0x04) Set Active Palette.
65///
66/// (C -> S) Sent when a player changes their active palette.
67///
68/// Respond with:
69/// [`crate::protocol::Packet::EquipedWeapon`],
70/// [`crate::protocol::Packet::ChangeWeaponPalette`]
71#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
72#[cfg_attr(feature = "serde", serde(default))]
73#[derive(Debug, Default, Clone, PartialEq, PacketReadWrite)]
74#[Id(0x21, 0x04)]
75pub struct SetPalettePacket {
76    /// Selected palette index.
77    pub palette: u32,
78    pub unk: u32,
79}
80
81/// (0x21, 0x05) Update Subpalette.
82///
83/// (C -> S) Sent when a player updates their subpalette (i.e. changes installed items).
84///
85/// Respond with:
86/// [`crate::protocol::Packet::LoadPalette`]
87#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
88#[cfg_attr(feature = "serde", serde(default))]
89#[derive(Debug, Default, Clone, PartialEq, PacketReadWrite)]
90#[Id(0x21, 0x05)]
91pub struct UpdateSubPalettePacket {
92    /// New subpalettes.
93    pub subpalettes: [SubPalette; 6],
94    pub unk: FixedVec<0x90, u32>,
95    /// Current subpalette index.
96    pub cur_subpalette: u32,
97    /// Current book index.
98    pub cur_book: u32,
99}
100
101/// (0x21, 0x06) Update Palette.
102///
103/// (C -> S) Sent when a player updates their palette (i.e. changes installed weapons).
104///
105/// Respond with:
106/// [`crate::protocol::Packet::LoadPalette`]
107#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
108#[cfg_attr(feature = "serde", serde(default))]
109#[derive(Debug, Default, Clone, PartialEq, PacketReadWrite)]
110#[Id(0x21, 0x06)]
111pub struct UpdatePalettePacket {
112    /// Current palette index.
113    pub cur_palette: u32,
114    /// New palettes.
115    pub palettes: [WeaponPalette; 6],
116}
117
118/// (0x21, 0x08) Set Active Subpalette.
119///
120/// (C -> S) Sent when a player changes their active subpalette.
121#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
122#[cfg_attr(feature = "serde", serde(default))]
123#[derive(Debug, Default, Clone, PartialEq, PacketReadWrite)]
124#[Id(0x21, 0x08)]
125pub struct SetSubPalettePacket {
126    /// New subpalette index.
127    pub subpalette: u32,
128}
129
130/// (0x21, 0x0A) Set Default Photon Arts (?)
131///
132/// (C -> S) Reasons for sending currently unknown.
133///
134/// Respond with: [`crate::protocol::Packet::NewDefaultPAs`]
135#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
136#[cfg_attr(feature = "serde", serde(default))]
137#[derive(Debug, Default, Clone, PartialEq, PacketReadWrite)]
138#[Id(0x21, 0x0A)]
139pub struct SetDefaultPAsPacket {
140    pub default: FixedVec<0x1A0, u32>,
141}
142
143/// (0x21, 0x0F) New Default Photon Arts (?)
144///
145/// (S -> C) Sent in response to the request.
146///
147/// Response to: [`crate::protocol::Packet::SetDefaultPAs`]
148#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
149#[cfg_attr(feature = "serde", serde(default))]
150#[derive(Debug, Default, Clone, PartialEq, PacketReadWrite)]
151#[Id(0x21, 0x0F)]
152pub struct NewDefaultPAsPacket {
153    #[SeekAfter(0x240)] // padding??
154    pub default: FixedVec<0x1A0, u32>,
155}
156
157// ----------------------------------------------------------------
158// Additional structs
159// ----------------------------------------------------------------
160
161/// Weapon in the palette.
162#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
163#[cfg_attr(feature = "serde", serde(default))]
164#[derive(Debug, Default, Clone, PartialEq, HelperReadWrite)]
165pub struct WeaponPalette {
166    /// Item UUID.
167    pub uuid: u64,
168    pub unk1: u32,
169    pub unk2: PalettePA,
170    pub unk3: PalettePA,
171    pub unk4: PalettePA,
172    pub unk: [u32; 3],
173    /// Pet ID (for summoner).
174    pub pet_id: u32,
175    /// Weapon skills.
176    pub skills: [PalettePA; 6],
177}
178
179/// Subpalette definition.
180#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
181#[cfg_attr(feature = "serde", serde(default))]
182#[derive(Debug, Default, Clone, PartialEq, HelperReadWrite)]
183pub struct SubPalette {
184    /// Items in the subpalette.
185    pub items: [PalettePA; 12],
186}
187
188/// Photon Art in the palette.
189#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
190#[cfg_attr(feature = "serde", serde(default))]
191#[derive(Debug, Default, Clone, PartialEq, HelperReadWrite)]
192pub struct PalettePA {
193    /// PA ID.
194    pub id: u8,
195    /// PA category.
196    pub category: u8,
197    pub unk: u8,
198    /// PA level.
199    pub level: u8,
200}