weiss_core/
events.rs

1use crate::db::CardId;
2use crate::state::{
3    AttackType, ChoiceOptionRef, ChoiceReason, DamageModifierKind, DamageType, ModifierDuration,
4    ModifierKind, StackItem, TimingWindow, TriggerEffect,
5};
6use serde::{Deserialize, Serialize};
7
8#[derive(Clone, Copy, Debug, Serialize, Deserialize)]
9pub enum RevealReason {
10    TriggerCheck,
11    DamageCheck,
12    RefreshPenalty,
13    Play,
14    AbilityEffect,
15}
16
17#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
18pub enum RevealAudience {
19    Public,
20    OwnerOnly,
21    ControllerOnly,
22    BothPlayers,
23    ReplayOnly,
24}
25
26#[derive(Clone, Copy, Debug, Serialize, Deserialize)]
27pub enum TriggerCancelReason {
28    InvalidSource,
29    Suppressed,
30}
31
32#[derive(Clone, Copy, Debug, Serialize, Deserialize)]
33pub enum ChoiceSkipReason {
34    NoCandidates,
35}
36
37#[derive(Clone, Copy, Debug, Serialize, Deserialize)]
38pub enum Zone {
39    Deck,
40    Hand,
41    WaitingRoom,
42    Clock,
43    Level,
44    Stock,
45    Memory,
46    Climax,
47    Resolution,
48    Stage,
49}
50
51#[derive(Clone, Debug, Serialize, Deserialize)]
52pub struct ChoiceOptionSnapshot {
53    pub option_id: u64,
54    pub reference: ChoiceOptionRef,
55}
56
57#[derive(Clone, Debug, Serialize, Deserialize)]
58pub enum Event {
59    Draw {
60        player: u8,
61        card: CardId,
62    },
63    Damage {
64        player: u8,
65        card: CardId,
66    },
67    DamageCancel {
68        player: u8,
69    },
70    DamageIntent {
71        event_id: u32,
72        source_player: u8,
73        source_slot: Option<u8>,
74        target: u8,
75        amount: i32,
76        damage_type: DamageType,
77        cancelable: bool,
78    },
79    DamageModifierApplied {
80        event_id: u32,
81        modifier: DamageModifierKind,
82        before_amount: i32,
83        after_amount: i32,
84        before_cancelable: bool,
85        after_cancelable: bool,
86        before_canceled: bool,
87        after_canceled: bool,
88    },
89    DamageModified {
90        event_id: u32,
91        target: u8,
92        original: i32,
93        modified: i32,
94        canceled: bool,
95        damage_type: DamageType,
96    },
97    DamageCommitted {
98        event_id: u32,
99        target: u8,
100        card: CardId,
101        damage_type: DamageType,
102    },
103    ReversalCommitted {
104        player: u8,
105        slot: u8,
106        cause_damage_event: Option<u32>,
107    },
108    Reveal {
109        player: u8,
110        card: CardId,
111        reason: RevealReason,
112        audience: RevealAudience,
113    },
114    TriggerQueued {
115        trigger_id: u32,
116        group_id: u32,
117        player: u8,
118        source: CardId,
119        effect: TriggerEffect,
120    },
121    TriggerGrouped {
122        group_id: u32,
123        trigger_ids: Vec<u32>,
124    },
125    TriggerResolved {
126        trigger_id: u32,
127        player: u8,
128        effect: TriggerEffect,
129    },
130    TriggerCanceled {
131        trigger_id: u32,
132        player: u8,
133        reason: TriggerCancelReason,
134    },
135    TimingWindowEntered {
136        window: TimingWindow,
137        player: u8,
138    },
139    PriorityGranted {
140        window: TimingWindow,
141        player: u8,
142    },
143    PriorityPassed {
144        player: u8,
145        window: TimingWindow,
146        pass_count: u8,
147    },
148    StackGroupPresented {
149        group_id: u32,
150        controller: u8,
151        items: Vec<StackItem>,
152    },
153    StackOrderChosen {
154        group_id: u32,
155        controller: u8,
156        stack_id: u32,
157    },
158    StackPushed {
159        item: StackItem,
160    },
161    StackResolved {
162        item: StackItem,
163    },
164    AutoResolveCapExceeded {
165        cap: u32,
166        stack_len: u32,
167        window: Option<TimingWindow>,
168    },
169    WindowAdvanced {
170        from: TimingWindow,
171        to: Option<TimingWindow>,
172    },
173    ChoicePresented {
174        choice_id: u32,
175        player: u8,
176        reason: ChoiceReason,
177        options: Vec<ChoiceOptionSnapshot>,
178        total_candidates: u16,
179        page_start: u16,
180    },
181    ChoicePageChanged {
182        choice_id: u32,
183        player: u8,
184        from_start: u16,
185        to_start: u16,
186    },
187    ChoiceMade {
188        choice_id: u32,
189        player: u8,
190        reason: ChoiceReason,
191        option: ChoiceOptionRef,
192    },
193    ChoiceAutopicked {
194        choice_id: u32,
195        player: u8,
196        reason: ChoiceReason,
197        option: ChoiceOptionRef,
198    },
199    ChoiceSkipped {
200        choice_id: u32,
201        player: u8,
202        reason: ChoiceReason,
203        skip_reason: ChoiceSkipReason,
204    },
205    ZoneMove {
206        player: u8,
207        card: CardId,
208        from: Zone,
209        to: Zone,
210        from_slot: Option<u8>,
211        to_slot: Option<u8>,
212    },
213    ControlChanged {
214        card: CardId,
215        owner: u8,
216        from_controller: u8,
217        to_controller: u8,
218        from_slot: u8,
219        to_slot: u8,
220    },
221    ModifierAdded {
222        id: u32,
223        source: CardId,
224        target_player: u8,
225        target_slot: u8,
226        target_card: CardId,
227        kind: ModifierKind,
228        magnitude: i32,
229        duration: ModifierDuration,
230    },
231    ModifierRemoved {
232        id: u32,
233        reason: ModifierRemoveReason,
234    },
235    Concede {
236        player: u8,
237    },
238    Play {
239        player: u8,
240        card: CardId,
241        slot: u8,
242    },
243    PlayEvent {
244        player: u8,
245        card: CardId,
246    },
247    PlayClimax {
248        player: u8,
249        card: CardId,
250    },
251    Trigger {
252        player: u8,
253        icon: crate::db::TriggerIcon,
254        card: Option<CardId>,
255    },
256    Attack {
257        player: u8,
258        slot: u8,
259    },
260    AttackType {
261        player: u8,
262        attacker_slot: u8,
263        attack_type: AttackType,
264    },
265    Counter {
266        player: u8,
267        card: CardId,
268        power: i32,
269    },
270    Clock {
271        player: u8,
272        card: Option<CardId>,
273    },
274    Shuffle {
275        player: u8,
276        zone: Zone,
277    },
278    Refresh {
279        player: u8,
280    },
281    RefreshPenalty {
282        player: u8,
283        card: CardId,
284    },
285    LevelUpChoice {
286        player: u8,
287        card: CardId,
288    },
289    Encore {
290        player: u8,
291        slot: u8,
292        kept: bool,
293    },
294    Stand {
295        player: u8,
296    },
297    EndTurn {
298        player: u8,
299    },
300    Terminal {
301        winner: Option<u8>,
302    },
303}
304
305#[derive(Clone, Copy, Debug, Serialize, Deserialize)]
306pub enum ModifierRemoveReason {
307    EndOfTurn,
308    TargetLeftStage,
309    ContinuousRefresh,
310}