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}