Skip to main content

s2protocol/game_events/
mod.rs

1//! Decodes the Game Events.
2//! These are stored in an embedded file in the MPQ file called 'replay.game.events'
3
4use serde::{Deserialize, Serialize};
5pub mod state;
6pub use state::*;
7pub mod iterator;
8pub use iterator::*;
9pub mod ability;
10pub use ability::*;
11#[cfg(feature = "dep_arrow")]
12pub mod arrow_store;
13#[cfg(feature = "dep_arrow")]
14pub use arrow_store::*;
15
16#[cfg(feature = "dep_arrow")]
17use arrow_convert::{ArrowDeserialize, ArrowField, ArrowSerialize};
18
19use crate::SC2ReplayFilters;
20
21pub type TUserId = u8;
22pub type GameTUnitTag = u32;
23pub type GameTUnitLink = u16;
24pub type GameTPlayerId = i64;
25pub type GameTMapCoordFixedBits = i64;
26pub type GameTFixedBits = i32;
27pub type GameTAbilLink = u16;
28pub type GameTFixedMiniBitsSigned = i16;
29pub type GameTFixedMiniBitsUnsigned = i64;
30pub type GameTControlGroupId = u8;
31pub type GameTSubgroupIndex = u16;
32pub type GameTSelectionIndex = u16;
33pub type GameTSubgroupPriority = u8;
34pub type GameTSelectionCount = u16;
35pub type GameTSubgroupCount = u16;
36pub type GameTControlGroupIndex = u8;
37pub type GameTControlGroupCount = u8;
38pub type GameTSyncChecksum = u32;
39pub type GameTButtonLink = u16;
40
41#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
42#[cfg_attr(
43    feature = "dep_arrow",
44    derive(ArrowField, ArrowSerialize, ArrowDeserialize)
45)]
46pub struct GameEvent {
47    pub delta: i64,
48    pub user_id: i64,
49    pub event: ReplayGameEvent,
50}
51
52#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
53#[cfg_attr(
54    feature = "dep_arrow",
55    derive(ArrowField, ArrowSerialize, ArrowDeserialize)
56)]
57#[cfg_attr(feature = "dep_arrow", arrow_field(type = "sparse"))]
58pub enum ReplayGameEvent {
59    DropUser(DropUserEvent),
60    CameraSave(CameraSaveEvent),
61    Cmd(GameSCmdEvent),
62    SelectionDelta(GameSSelectionDeltaEvent),
63    ControlGroupUpdate(GameSControlGroupUpdateEvent),
64    SelectionSyncCheck(GameSSelectionSyncCheckEvent),
65    TriggerChatMessage(GameSTriggerChatMessageEvent),
66    UnitClick(GameSUnitClickEvent),
67    UnitHighlight(GameSUnitHighlightEvent),
68    TriggerReplySelected(GameSTriggerReplySelectedEvent),
69    CameraUpdate(CameraUpdateEvent),
70    TriggerMouseClicked(GameSTriggerMouseClickedEvent),
71    TriggerMouseMoved(GameSTriggerMouseMovedEvent),
72    TriggerHotkeyPressed(GameSTriggerHotkeyPressedEvent),
73    TriggerTargetModeUpdate(GameSTriggerTargetModeUpdateEvent),
74    TriggerKeyPressed(GameSTriggerKeyPressedEvent),
75    TriggerMouseWheel(GameSTriggerMouseWheelEvent),
76    TriggerButtonPressed(GameSTriggerButtonPressedEvent),
77    /*GameUserLeave(GameSGameUserLeaveEvent),
78    GameUserJoin(GameSGameUserJoinEvent),*/
79    CommandManagerState(GameSCommandManagerStateEvent),
80    CmdUpdateTargetPoint(GameSCmdUpdateTargetPointEvent),
81    CmdUpdateTargetUnit(GameSCmdUpdateTargetUnitEvent),
82    /*TriggerAnimLengthQueryByName(GameSTriggerAnimLengthQueryByNameEvent),
83    TriggerAnimLengthQueryByProps(GameSTriggerAnimLengthQueryByPropsEvent),*/
84}
85
86impl ReplayGameEvent {
87    pub fn should_skip(&self, _filters: &SC2ReplayFilters) -> bool {
88        // for now we do not filter GameEvents
89        false
90    }
91}
92
93#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
94#[cfg_attr(
95    feature = "dep_arrow",
96    derive(ArrowField, ArrowSerialize, ArrowDeserialize)
97)]
98#[cfg_attr(feature = "dep_arrow", arrow_field(type = "sparse"))]
99pub enum ELeaveReason {
100    UserLeft,
101    UserDropped,
102    UserBanned,
103    UserVictory,
104    UserDefeat,
105    UserTied,
106    UserDesynced,
107    UserOutOfTime,
108    WeWereUnresponsive,
109    WeContinuedAlone,
110    ReplayDesynced,
111    UserTimeout,
112    UserDisconnected,
113    Unrecoverable,
114    UserCatchupDesynced,
115    TakeCommandDropped,
116}
117
118#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
119#[cfg_attr(
120    feature = "dep_arrow",
121    derive(ArrowField, ArrowSerialize, ArrowDeserialize)
122)]
123pub struct DropUserEvent {
124    pub m_drop_session_user_id: TUserId,
125    pub m_reason: ELeaveReason,
126}
127
128#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
129#[cfg_attr(
130    feature = "dep_arrow",
131    derive(ArrowField, ArrowSerialize, ArrowDeserialize)
132)]
133pub struct CameraSaveEvent {
134    pub m_which: i64,
135    pub m_target: GameSPointMini,
136}
137
138#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
139#[cfg_attr(
140    feature = "dep_arrow",
141    derive(ArrowField, ArrowSerialize, ArrowDeserialize)
142)]
143pub struct CameraUpdateEvent {
144    pub m_target: Option<GameSPointMini>,
145    pub m_distance: Option<GameTFixedMiniBitsUnsigned>,
146    pub m_pitch: Option<GameTFixedMiniBitsUnsigned>,
147    pub m_yaw: Option<GameTFixedMiniBitsUnsigned>,
148    pub m_reason: Option<i8>,
149    pub m_follow: bool,
150}
151
152#[derive(Debug, Default, PartialEq, Clone, Serialize, Deserialize)]
153#[cfg_attr(
154    feature = "dep_arrow",
155    derive(ArrowField, ArrowSerialize, ArrowDeserialize)
156)]
157pub struct GameSPointMini {
158    pub x: GameTFixedMiniBitsUnsigned,
159    pub y: GameTFixedMiniBitsUnsigned,
160}
161
162#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
163#[cfg_attr(
164    feature = "dep_arrow",
165    derive(ArrowField, ArrowSerialize, ArrowDeserialize)
166)]
167pub struct GameSCmdEvent {
168    pub m_cmd_flags: i64,
169    pub m_abil: Option<GameSCmdAbil>,
170    pub m_data: GameSCmdData,
171    pub m_sequence: i64,
172    pub m_other_unit: Option<GameTUnitTag>,
173    pub m_unit_group: Option<u32>,
174}
175
176#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
177#[cfg_attr(
178    feature = "dep_arrow",
179    derive(ArrowField, ArrowSerialize, ArrowDeserialize)
180)]
181pub struct GameSCmdAbil {
182    pub m_abil_link: GameTAbilLink,
183    pub ability: String,
184    pub m_abil_cmd_index: i64,
185    pub m_abil_cmd_data: Option<u8>,
186}
187
188#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
189#[cfg_attr(
190    feature = "dep_arrow",
191    derive(ArrowField, ArrowSerialize, ArrowDeserialize)
192)]
193#[cfg_attr(feature = "dep_arrow", arrow_field(type = "sparse"))]
194pub enum GameSCmdData {
195    None,
196    TargetPoint(GameSMapCoord3D),
197    TargetUnit(GameSCmdDataTargetUnit),
198    Data(u32),
199}
200
201#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
202#[cfg_attr(
203    feature = "dep_arrow",
204    derive(ArrowField, ArrowSerialize, ArrowDeserialize)
205)]
206pub struct GameSMapCoord3D {
207    pub x: GameTMapCoordFixedBits,
208    pub y: GameTMapCoordFixedBits,
209    pub z: GameTFixedBits,
210}
211
212#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
213#[cfg_attr(
214    feature = "dep_arrow",
215    derive(ArrowField, ArrowSerialize, ArrowDeserialize)
216)]
217pub struct GameSCmdDataTargetUnit {
218    pub m_target_unit_flags: u16,
219    pub m_timer: u8,
220    pub m_tag: GameTUnitTag,
221    pub m_snapshot_unit_link: GameTUnitLink,
222    pub m_snapshot_control_player_id: Option<GameTPlayerId>,
223    pub m_snapshot_upkeep_player_id: Option<GameTPlayerId>,
224    pub m_snapshot_point: GameSMapCoord3D,
225}
226
227#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
228#[cfg_attr(
229    feature = "dep_arrow",
230    derive(ArrowField, ArrowSerialize, ArrowDeserialize)
231)]
232pub struct GameSCmdUpdateTargetPointEvent {
233    pub m_target: GameSMapCoord3D,
234}
235
236#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
237#[cfg_attr(
238    feature = "dep_arrow",
239    derive(ArrowField, ArrowSerialize, ArrowDeserialize)
240)]
241pub struct GameSCmdUpdateTargetUnitEvent {
242    pub m_target: GameSCmdDataTargetUnit,
243}
244#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
245#[cfg_attr(
246    feature = "dep_arrow",
247    derive(ArrowField, ArrowSerialize, ArrowDeserialize)
248)]
249pub struct GameSTriggerMouseClickedEvent {
250    pub m_button: u32,
251    pub m_down: bool,
252    pub m_pos_ui: GameSuiCoord,
253    pub m_pos_world: GameSMapCoord3D,
254    pub m_flags: i8,
255}
256#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
257#[cfg_attr(
258    feature = "dep_arrow",
259    derive(ArrowField, ArrowSerialize, ArrowDeserialize)
260)]
261pub struct GameSTriggerMouseMovedEvent {
262    pub m_pos_ui: GameSuiCoord,
263    pub m_pos_world: GameSMapCoord3D,
264    pub m_flags: i8,
265}
266#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
267#[cfg_attr(
268    feature = "dep_arrow",
269    derive(ArrowField, ArrowSerialize, ArrowDeserialize)
270)]
271pub struct GameSuiCoord {
272    pub x: u16,
273    pub y: u16,
274}
275#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
276#[cfg_attr(
277    feature = "dep_arrow",
278    derive(ArrowField, ArrowSerialize, ArrowDeserialize)
279)]
280pub struct GameSTriggerMouseWheelEvent {
281    pub m_wheel_spin: GameTFixedMiniBitsSigned,
282    pub m_flags: i8,
283}
284
285#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
286#[cfg_attr(
287    feature = "dep_arrow",
288    derive(ArrowField, ArrowSerialize, ArrowDeserialize)
289)]
290pub struct GameSUnitClickEvent {
291    pub m_unit_tag: GameTUnitTag,
292}
293
294#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
295#[cfg_attr(
296    feature = "dep_arrow",
297    derive(ArrowField, ArrowSerialize, ArrowDeserialize)
298)]
299pub struct GameSUnitHighlightEvent {
300    pub m_unit_tag: GameTUnitTag,
301    pub m_flags: u8,
302}
303#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
304#[cfg_attr(
305    feature = "dep_arrow",
306    derive(ArrowField, ArrowSerialize, ArrowDeserialize)
307)]
308pub struct GameSSelectionDeltaEvent {
309    pub m_control_group_id: GameTControlGroupId,
310    pub m_delta: GameSSelectionDelta,
311}
312#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
313#[cfg_attr(
314    feature = "dep_arrow",
315    derive(ArrowField, ArrowSerialize, ArrowDeserialize)
316)]
317pub struct GameSSelectionDelta {
318    pub m_subgroup_index: GameTSubgroupIndex,
319    pub m_remove_mask: GameSSelectionMask,
320    pub m_add_subgroups: Vec<GameSSelectionDeltaSubgroup>,
321    pub m_add_unit_tags: Vec<GameTUnitTag>,
322}
323
324#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
325#[cfg_attr(
326    feature = "dep_arrow",
327    derive(ArrowField, ArrowSerialize, ArrowDeserialize)
328)]
329pub struct GameSSelectionDeltaSubgroup {
330    pub m_unit_link: GameTUnitLink,
331    pub m_subgroup_priority: GameTSubgroupPriority,
332    pub m_intra_subgroup_priority: GameTSubgroupPriority,
333    pub m_count: GameTSelectionCount,
334}
335
336#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
337#[cfg_attr(
338    feature = "dep_arrow",
339    derive(ArrowField, ArrowSerialize, ArrowDeserialize)
340)]
341#[cfg_attr(feature = "dep_arrow", arrow_field(type = "sparse"))]
342pub enum GameSSelectionMask {
343    None,
344    Mask(GameSelectionMaskType),
345    OneIndices(GameSelectionIndexArrayType),
346    ZeroIndices(GameSelectionIndexArrayType),
347}
348
349#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
350#[cfg_attr(
351    feature = "dep_arrow",
352    derive(ArrowField, ArrowSerialize, ArrowDeserialize)
353)]
354pub struct GameSelectionMaskType {
355    pub value: Vec<u8>,
356}
357
358#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
359#[cfg_attr(
360    feature = "dep_arrow",
361    derive(ArrowField, ArrowSerialize, ArrowDeserialize)
362)]
363pub struct GameSelectionIndexArrayType {
364    pub value: Vec<GameTSelectionIndex>,
365}
366
367#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
368#[cfg_attr(
369    feature = "dep_arrow",
370    derive(ArrowField, ArrowSerialize, ArrowDeserialize)
371)]
372pub struct GameSSelectionSyncCheckEvent {
373    pub m_control_group_id: GameTControlGroupId,
374    pub m_selection_sync_data: GameSSelectionSyncData,
375}
376
377#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
378#[cfg_attr(
379    feature = "dep_arrow",
380    derive(ArrowField, ArrowSerialize, ArrowDeserialize)
381)]
382pub struct GameSSelectionSyncData {
383    pub m_count: GameTSelectionCount,
384    pub m_subgroup_count: GameTSubgroupCount,
385    pub m_active_subgroup_index: GameTSubgroupIndex,
386    pub m_unit_tags_checksum: GameTSyncChecksum,
387    pub m_subgroup_indices_checksum: GameTSyncChecksum,
388    pub m_subgroups_checksum: GameTSyncChecksum,
389}
390
391#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
392#[cfg_attr(
393    feature = "dep_arrow",
394    derive(ArrowField, ArrowSerialize, ArrowDeserialize)
395)]
396pub struct GameSControlGroupUpdateEvent {
397    pub m_control_group_index: GameTControlGroupIndex,
398    pub m_control_group_update: GameEControlGroupUpdate,
399    pub m_mask: GameSSelectionMask,
400}
401
402#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
403#[cfg_attr(
404    feature = "dep_arrow",
405    derive(ArrowField, ArrowSerialize, ArrowDeserialize)
406)]
407#[cfg_attr(feature = "dep_arrow", arrow_field(type = "sparse"))]
408pub enum GameEControlGroupUpdate {
409    ESet,
410    EAppend,
411    ERecall,
412    EClear,
413    ESetAndSteal,
414    EAppendAndSteal,
415}
416
417#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
418#[cfg_attr(
419    feature = "dep_arrow",
420    derive(ArrowField, ArrowSerialize, ArrowDeserialize)
421)]
422pub struct GameSTriggerChatMessageEvent {
423    pub m_chat_message: String,
424}
425
426#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
427#[cfg_attr(
428    feature = "dep_arrow",
429    derive(ArrowField, ArrowSerialize, ArrowDeserialize)
430)]
431pub struct GameSTriggerReplySelectedEvent {
432    pub m_conversation_id: i32,
433    pub m_reply_id: i32,
434}
435
436#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
437#[cfg_attr(
438    feature = "dep_arrow",
439    derive(ArrowField, ArrowSerialize, ArrowDeserialize)
440)]
441pub struct GameSTriggerHotkeyPressedEvent {
442    pub m_hotkey: u32,
443    pub m_down: bool,
444}
445
446#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
447#[cfg_attr(
448    feature = "dep_arrow",
449    derive(ArrowField, ArrowSerialize, ArrowDeserialize)
450)]
451pub struct GameSTriggerTargetModeUpdateEvent {
452    pub m_abil_link: GameTAbilLink,
453    pub ability: String,
454    pub m_abil_cmd_index: i64,
455    pub m_state: i8,
456}
457
458#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
459#[cfg_attr(
460    feature = "dep_arrow",
461    derive(ArrowField, ArrowSerialize, ArrowDeserialize)
462)]
463pub struct GameSTriggerKeyPressedEvent {
464    pub m_key: i8,
465    pub m_flags: i8,
466}
467
468#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
469#[cfg_attr(
470    feature = "dep_arrow",
471    derive(ArrowField, ArrowSerialize, ArrowDeserialize)
472)]
473pub struct GameSTriggerButtonPressedEvent {
474    pub m_button: GameTButtonLink,
475}
476
477#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
478#[cfg_attr(
479    feature = "dep_arrow",
480    derive(ArrowField, ArrowSerialize, ArrowDeserialize)
481)]
482pub struct GameSCommandManagerStateEvent {
483    pub m_state: GameECommandManagerState,
484    pub m_sequence: Option<i64>,
485}
486#[derive(Debug, PartialEq, Clone, Serialize, Deserialize)]
487#[cfg_attr(
488    feature = "dep_arrow",
489    derive(ArrowField, ArrowSerialize, ArrowDeserialize)
490)]
491#[cfg_attr(feature = "dep_arrow", arrow_field(type = "sparse"))]
492pub enum GameECommandManagerState {
493    EFireDone,
494    EFireOnce,
495    EFireMany,
496}