Fraser commited on
Commit
80733a2
·
1 Parent(s): ab8a147

battle system plan

Browse files
Files changed (1) hide show
  1. battle_system_design.md +1364 -0
battle_system_design.md ADDED
@@ -0,0 +1,1364 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Pictuary Battle System Design Document
2
+
3
+ ## Overview
4
+
5
+ This document defines a new programmatic battle system for Pictuary that replaces the current description-based approach with executable building blocks. The design is inspired by Pokemon Emerald's sophisticated battle mechanics while being simplified for our use case.
6
+
7
+ ## Core Philosophy
8
+
9
+ The battle system is built on **composable building blocks** that can be combined to create unique and dynamic effects. Each action and ability is defined using simple, atomic operations that can be chained together to create complex behaviors.
10
+
11
+ ## JSON Schema for `generateStats`
12
+
13
+ ### Monster Definition
14
+
15
+ ```json
16
+ {
17
+ "name": "Zephyr Sprite",
18
+ "description": "A mysterious floating creature that manipulates wind currents",
19
+ "tier": "medium",
20
+ "primaryType": "wind",
21
+ "secondaryType": null,
22
+ "baseStats": {
23
+ "hp": 65,
24
+ "attack": 50,
25
+ "defense": 40,
26
+ "fieldAttack": 85,
27
+ "fieldDefense": 70,
28
+ "speed": 90
29
+ },
30
+ "nature": "hasty",
31
+ "specialAbility": {
32
+ "name": "Wind Currents",
33
+ "description": "Gains +25% speed when opponent uses a contact move",
34
+ "trigger": "onOpponentContactMove",
35
+ "effects": [
36
+ {
37
+ "type": "modifyStats",
38
+ "target": "self",
39
+ "stats": { "speed": "increase" }
40
+ }
41
+ ]
42
+ },
43
+ "movepool": [
44
+ {
45
+ "name": "Gust Strike",
46
+ "type": "wind",
47
+ "category": "physical",
48
+ "power": 65,
49
+ "accuracy": 95,
50
+ "pp": 20,
51
+ "priority": 0,
52
+ "flags": ["contact"],
53
+ "effects": [
54
+ {
55
+ "type": "damage",
56
+ "target": "opponent",
57
+ "formula": "standard"
58
+ }
59
+ ]
60
+ },
61
+ {
62
+ "name": "Piercing Gale",
63
+ "type": "wind",
64
+ "category": "special",
65
+ "power": 80,
66
+ "accuracy": 85,
67
+ "pp": 15,
68
+ "priority": 0,
69
+ "flags": [],
70
+ "effects": [
71
+ {
72
+ "type": "damage",
73
+ "target": "opponent",
74
+ "formula": "standard"
75
+ },
76
+ {
77
+ "type": "modifyStats",
78
+ "target": "self",
79
+ "stats": { "accuracy": "decrease" },
80
+ "condition": "afterUse"
81
+ }
82
+ ]
83
+ },
84
+ {
85
+ "name": "Tailwind Boost",
86
+ "type": "wind",
87
+ "category": "status",
88
+ "power": 0,
89
+ "accuracy": 100,
90
+ "pp": 10,
91
+ "priority": 1,
92
+ "flags": [],
93
+ "effects": [
94
+ {
95
+ "type": "modifyStats",
96
+ "target": "self",
97
+ "stats": { "speed": "greatly_increase" }
98
+ }
99
+ ]
100
+ },
101
+ {
102
+ "name": "Reckless Dive",
103
+ "type": "wind",
104
+ "category": "physical",
105
+ "power": 120,
106
+ "accuracy": 80,
107
+ "pp": 5,
108
+ "priority": 0,
109
+ "flags": ["contact", "reckless"],
110
+ "effects": [
111
+ {
112
+ "type": "damage",
113
+ "target": "opponent",
114
+ "formula": "standard"
115
+ },
116
+ {
117
+ "type": "damage",
118
+ "target": "self",
119
+ "formula": "recoil",
120
+ "value": 0.25
121
+ }
122
+ ]
123
+ }
124
+ ]
125
+ }
126
+ ```
127
+
128
+ ## Building Blocks System
129
+
130
+ ### Effect Types
131
+
132
+ All battle effects are built from these atomic operations:
133
+
134
+ #### 1. **damage**
135
+ ```json
136
+ {
137
+ "type": "damage",
138
+ "target": "opponent" | "self" | "all" | "allies",
139
+ "formula": "standard" | "fixed" | "recoil" | "drain" | "custom",
140
+ "value": 80, // Fixed damage amount or percentage for recoil/drain
141
+ "multiplier": 1.0, // Damage multiplier
142
+ "condition": "always" | "ifLowHp" | "ifHighHp" | "afterKO" | "custom"
143
+ }
144
+ ```
145
+
146
+ #### 2. **modifyStats**
147
+ ```json
148
+ {
149
+ "type": "modifyStats",
150
+ "target": "self" | "opponent" | "all",
151
+ "stats": {
152
+ "attack": "increase", // "increase" | "decrease" | "greatly_increase" | "greatly_decrease"
153
+ "defense": "decrease",
154
+ "speed": "greatly_increase",
155
+ "accuracy": "decrease"
156
+ },
157
+ "condition": "always" | "onHit" | "afterUse" | "ifCritical"
158
+ }
159
+ ```
160
+
161
+ **Standard Stat Modification Levels:**
162
+ - **increase**: +25% (1.25x multiplier)
163
+ - **decrease**: -25% (0.75x multiplier)
164
+ - **greatly_increase**: +50% (1.5x multiplier)
165
+ - **greatly_decrease**: -50% (0.5x multiplier)
166
+
167
+ #### 3. **applyStatus**
168
+ ```json
169
+ {
170
+ "type": "applyStatus",
171
+ "target": "opponent" | "self",
172
+ "status": "burn" | "freeze" | "paralyze" | "poison" | "sleep" | "confuse",
173
+ "chance": 30, // Percentage chance
174
+ "condition": "onHit" | "always"
175
+ }
176
+ ```
177
+
178
+ #### 4. **heal**
179
+ ```json
180
+ {
181
+ "type": "heal",
182
+ "target": "self" | "ally",
183
+ "amount": "percentage" | "fixed",
184
+ "value": 50, // 50% of max HP or 50 fixed HP
185
+ "condition": "always" | "ifLowHp" | "endOfTurn"
186
+ }
187
+ ```
188
+
189
+ #### 5. **manipulatePP**
190
+ ```json
191
+ {
192
+ "type": "manipulatePP",
193
+ "target": "opponent",
194
+ "action": "drain" | "restore" | "disable",
195
+ "amount": 3, // PP to drain/restore
196
+ "targetMove": "last" | "random" | "strongest"
197
+ }
198
+ ```
199
+
200
+ #### 6. **fieldEffect**
201
+ ```json
202
+ {
203
+ "type": "fieldEffect",
204
+ "effect": "reflect" | "lightScreen" | "spikes" | "healingMist" | "toxicSpikes",
205
+ "target": "playerSide" | "opponentSide" | "field",
206
+ "stackable": false
207
+ }
208
+ ```
209
+
210
+ #### 7. **counter**
211
+ ```json
212
+ {
213
+ "type": "counter",
214
+ "counterType": "physical" | "special" | "any",
215
+ "multiplier": 2.0, // Damage multiplier when countering
216
+ "condition": "ifDamagedThisTurn"
217
+ }
218
+ ```
219
+
220
+ #### 8. **priority**
221
+ ```json
222
+ {
223
+ "type": "priority",
224
+ "target": "self",
225
+ "value": 1, // Priority bracket (-5 to +5)
226
+ "condition": "ifLowHp" | "always"
227
+ }
228
+ ```
229
+
230
+ #### 9. **removeStatus**
231
+ ```json
232
+ {
233
+ "type": "removeStatus",
234
+ "target": "self" | "opponent" | "allies" | "all",
235
+ "status": "burn" | "freeze" | "paralyze" | "poison" | "sleep" | "confuse" | "all",
236
+ "condition": "always" | "onSwitchIn" | "endOfTurn"
237
+ }
238
+ ```
239
+
240
+ ### Triggers and Conditions
241
+
242
+ Effects can be triggered by various battle events:
243
+
244
+ - **always**: Effect always applies when move is used
245
+ - **onHit**: Effect applies only if the move hits
246
+ - **afterUse**: Effect applies after move execution regardless of hit/miss
247
+ - **onCritical**: Effect applies only on critical hits
248
+ - **ifLowHp**: Effect applies if user's HP < 25%
249
+ - **ifHighHp**: Effect applies if user's HP > 75%
250
+ - **onOpponentContactMove**: Trigger when opponent uses a contact move
251
+ - **endOfTurn**: Effect applies at the end of each turn
252
+ - **onSwitchIn**: Effect applies when Piclet enters battle
253
+ - **afterKO**: Effect applies after knocking out an opponent
254
+
255
+ ### Target Specification
256
+
257
+ - **self**: The move user
258
+ - **opponent**: The target opponent
259
+ - **all**: All Piclets in battle
260
+ - **allies**: All allied Piclets (in team battles)
261
+ - **playerSide**: Player's side of the field
262
+ - **opponentSide**: Opponent's side of the field
263
+ - **field**: Entire battlefield
264
+
265
+ ## Special Abilities
266
+
267
+ Special abilities are passive traits that can fundamentally alter battle mechanics. They can use standard effect building blocks OR modify core game mechanics directly.
268
+
269
+ ### Mechanic Modifications
270
+
271
+ Special abilities can override or alter fundamental battle mechanics:
272
+
273
+ #### 9. **mechanicOverride**
274
+ ```json
275
+ {
276
+ "type": "mechanicOverride",
277
+ "mechanic": "criticalHits" | "statusImmunity" | "damageReflection" | "healingInversion" | "priorityOverride" | "accuracyBypass" | "typeImmunity" | "contactDamage" | "drainInversion" | "weatherImmunity",
278
+ "condition": "always" | "ifLowHp" | "whenStatusAfflicted" | "vsPhysical" | "vsSpecial",
279
+ "value": true | false | "invert" | "double" | "absorb" | "reflect"
280
+ }
281
+ ```
282
+
283
+ **Mechanic Types:**
284
+ - **criticalHits**: `false` = cannot be crit, `true` = always crit, `"double"` = 2x crit rate
285
+ - **statusImmunity**: Array of status types to be immune to
286
+ - **damageReflection**: Reflects % of damage back to attacker
287
+ - **healingInversion**: Healing effects cause damage instead
288
+ - **priorityOverride**: Always goes first/last regardless of speed
289
+ - **accuracyBypass**: Moves cannot miss this Piclet
290
+ - **typeImmunity**: Immune to specific damage types
291
+ - **contactDamage**: Attackers take damage when using contact moves
292
+ - **drainInversion**: HP draining moves heal the target instead
293
+ - **weatherImmunity**: Unaffected by weather damage/effects
294
+
295
+ ### Advanced Ability Examples
296
+
297
+ #### 1. **Shell Armor** - Cannot be critically hit
298
+ ```json
299
+ {
300
+ "name": "Shell Armor",
301
+ "description": "Hard shell prevents critical hits",
302
+ "effects": [
303
+ {
304
+ "type": "mechanicOverride",
305
+ "mechanic": "criticalHits",
306
+ "condition": "always",
307
+ "value": false
308
+ }
309
+ ]
310
+ }
311
+ ```
312
+
313
+ #### 2. **Rough Skin** - Contact moves damage attacker
314
+ ```json
315
+ {
316
+ "name": "Rough Skin",
317
+ "description": "Rough skin damages attackers on contact",
318
+ "triggers": [
319
+ {
320
+ "event": "onContactDamage",
321
+ "effects": [
322
+ {
323
+ "type": "damage",
324
+ "target": "attacker",
325
+ "formula": "fixed",
326
+ "value": 12
327
+ }
328
+ ]
329
+ }
330
+ ]
331
+ }
332
+ ```
333
+
334
+ #### 3. **Sap Sipper** - Healed by nature-type moves
335
+ ```json
336
+ {
337
+ "name": "Sap Sipper",
338
+ "description": "Absorbs nature-type moves to restore HP",
339
+ "triggers": [
340
+ {
341
+ "event": "onDamageTaken",
342
+ "condition": "ifMoveType:nature",
343
+ "effects": [
344
+ {
345
+ "type": "mechanicOverride",
346
+ "mechanic": "damageAbsorption",
347
+ "value": "absorb"
348
+ },
349
+ {
350
+ "type": "heal",
351
+ "target": "self",
352
+ "amount": "percentage",
353
+ "value": 25
354
+ }
355
+ ]
356
+ }
357
+ ]
358
+ }
359
+ ```
360
+
361
+ #### 4. **Poison Heal** - Healed by poison instead of damaged
362
+ ```json
363
+ {
364
+ "name": "Poison Heal",
365
+ "description": "Poison heals instead of damages",
366
+ "effects": [
367
+ {
368
+ "type": "mechanicOverride",
369
+ "mechanic": "statusEffect:poison",
370
+ "value": "invert"
371
+ }
372
+ ]
373
+ }
374
+ ```
375
+
376
+ #### 5. **Wonder Guard** - Only super-effective moves can hit
377
+ ```json
378
+ {
379
+ "name": "Wonder Guard",
380
+ "description": "Only super-effective moves deal damage",
381
+ "effects": [
382
+ {
383
+ "type": "mechanicOverride",
384
+ "mechanic": "damageCalculation",
385
+ "condition": "ifNotSuperEffective",
386
+ "value": false
387
+ }
388
+ ]
389
+ }
390
+ ```
391
+
392
+ #### 6. **Levitate** - Immune to ground-type moves
393
+ ```json
394
+ {
395
+ "name": "Levitate",
396
+ "description": "Floating ability makes ground moves miss",
397
+ "effects": [
398
+ {
399
+ "type": "mechanicOverride",
400
+ "mechanic": "typeImmunity",
401
+ "value": ["ground"]
402
+ }
403
+ ]
404
+ }
405
+ ```
406
+
407
+ #### 7. **Vampiric** - Drain moves damage the drainer
408
+ ```json
409
+ {
410
+ "name": "Vampiric",
411
+ "description": "Cursed blood damages those who try to drain it",
412
+ "triggers": [
413
+ {
414
+ "event": "onHPDrained",
415
+ "effects": [
416
+ {
417
+ "type": "mechanicOverride",
418
+ "mechanic": "drainInversion",
419
+ "value": true
420
+ },
421
+ {
422
+ "type": "damage",
423
+ "target": "attacker",
424
+ "formula": "fixed",
425
+ "value": 20
426
+ }
427
+ ]
428
+ }
429
+ ]
430
+ }
431
+ ```
432
+
433
+ #### 8. **Insomnia** - Cannot be put to sleep
434
+ ```json
435
+ {
436
+ "name": "Insomnia",
437
+ "description": "Prevents sleep status",
438
+ "effects": [
439
+ {
440
+ "type": "mechanicOverride",
441
+ "mechanic": "statusImmunity",
442
+ "value": ["sleep"]
443
+ }
444
+ ]
445
+ }
446
+ ```
447
+
448
+ #### 9. **Prankster** - Status moves have +1 priority
449
+ ```json
450
+ {
451
+ "name": "Prankster",
452
+ "description": "Status moves gain priority",
453
+ "effects": [
454
+ {
455
+ "type": "mechanicOverride",
456
+ "mechanic": "priorityOverride",
457
+ "condition": "ifStatusMove",
458
+ "value": 1
459
+ }
460
+ ]
461
+ }
462
+ ```
463
+
464
+ #### 10. **Magic Bounce** - Reflects status moves
465
+ ```json
466
+ {
467
+ "name": "Magic Bounce",
468
+ "description": "Reflects status moves back at the user",
469
+ "triggers": [
470
+ {
471
+ "event": "onStatusMoveTargeted",
472
+ "effects": [
473
+ {
474
+ "type": "mechanicOverride",
475
+ "mechanic": "targetRedirection",
476
+ "value": "reflect"
477
+ }
478
+ ]
479
+ }
480
+ ]
481
+ }
482
+ ```
483
+
484
+ ### Complex Multi-Mechanic Abilities
485
+
486
+ #### **Protean** - Changes type to match moves used
487
+ ```json
488
+ {
489
+ "name": "Protean",
490
+ "description": "Changes type to match the move being used",
491
+ "triggers": [
492
+ {
493
+ "event": "beforeMoveUse",
494
+ "effects": [
495
+ {
496
+ "type": "mechanicOverride",
497
+ "mechanic": "typeChange",
498
+ "value": "matchMoveType"
499
+ }
500
+ ]
501
+ }
502
+ ]
503
+ }
504
+ ```
505
+
506
+ #### **Contrary** - Stat changes are reversed
507
+ ```json
508
+ {
509
+ "name": "Contrary",
510
+ "description": "Stat changes have the opposite effect",
511
+ "effects": [
512
+ {
513
+ "type": "mechanicOverride",
514
+ "mechanic": "statModification",
515
+ "value": "invert"
516
+ }
517
+ ]
518
+ }
519
+ ```
520
+
521
+ ### Status-Specific Abilities
522
+
523
+ #### **Frost Walker** - Heal when frozen
524
+ ```json
525
+ {
526
+ "name": "Frost Walker",
527
+ "description": "Thrives in frozen conditions, healing instead of being immobilized",
528
+ "effects": [
529
+ {
530
+ "type": "mechanicOverride",
531
+ "mechanic": "statusEffect:freeze",
532
+ "value": "invert"
533
+ }
534
+ ],
535
+ "triggers": [
536
+ {
537
+ "event": "onStatusInflicted",
538
+ "condition": "ifStatus:freeze",
539
+ "effects": [
540
+ {
541
+ "type": "heal",
542
+ "target": "self",
543
+ "amount": "percentage",
544
+ "value": 12
545
+ }
546
+ ]
547
+ }
548
+ ]
549
+ }
550
+ ```
551
+
552
+ #### **Glacial Birth** - Starts battle frozen
553
+ ```json
554
+ {
555
+ "name": "Glacial Birth",
556
+ "description": "Enters battle in a frozen state but gains defensive bonuses",
557
+ "triggers": [
558
+ {
559
+ "event": "onSwitchIn",
560
+ "effects": [
561
+ {
562
+ "type": "applyStatus",
563
+ "target": "self",
564
+ "status": "freeze",
565
+ "chance": 100
566
+ },
567
+ {
568
+ "type": "modifyStats",
569
+ "target": "self",
570
+ "stats": { "defense": "greatly_increase" },
571
+ "condition": "whileFrozen"
572
+ }
573
+ ]
574
+ }
575
+ ]
576
+ }
577
+ ```
578
+
579
+ #### **Cryogenic Touch** - Freezes enemy on contact
580
+ ```json
581
+ {
582
+ "name": "Cryogenic Touch",
583
+ "description": "Contact moves have a chance to freeze the attacker",
584
+ "triggers": [
585
+ {
586
+ "event": "onContactDamage",
587
+ "effects": [
588
+ {
589
+ "type": "applyStatus",
590
+ "target": "attacker",
591
+ "status": "freeze",
592
+ "chance": 30
593
+ }
594
+ ]
595
+ }
596
+ ]
597
+ }
598
+ ```
599
+
600
+ #### **Slumber Heal** - Heal when asleep
601
+ ```json
602
+ {
603
+ "name": "Slumber Heal",
604
+ "description": "Restores HP while sleeping instead of being unable to act",
605
+ "triggers": [
606
+ {
607
+ "event": "endOfTurn",
608
+ "condition": "ifStatus:sleep",
609
+ "effects": [
610
+ {
611
+ "type": "heal",
612
+ "target": "self",
613
+ "amount": "percentage",
614
+ "value": 15
615
+ }
616
+ ]
617
+ }
618
+ ]
619
+ }
620
+ ```
621
+
622
+ #### **Toxic Skin** - Poisons on contact
623
+ ```json
624
+ {
625
+ "name": "Toxic Skin",
626
+ "description": "Physical contact poisons the attacker",
627
+ "triggers": [
628
+ {
629
+ "event": "onContactDamage",
630
+ "effects": [
631
+ {
632
+ "type": "applyStatus",
633
+ "target": "attacker",
634
+ "status": "poison",
635
+ "chance": 50
636
+ }
637
+ ]
638
+ }
639
+ ]
640
+ }
641
+ ```
642
+
643
+ #### **Paralytic Aura** - Starts battle with paralyzed enemy
644
+ ```json
645
+ {
646
+ "name": "Paralytic Aura",
647
+ "description": "Intimidating presence paralyzes the opponent upon entry",
648
+ "triggers": [
649
+ {
650
+ "event": "onSwitchIn",
651
+ "effects": [
652
+ {
653
+ "type": "applyStatus",
654
+ "target": "opponent",
655
+ "status": "paralyze",
656
+ "chance": 75
657
+ }
658
+ ]
659
+ }
660
+ ]
661
+ }
662
+ ```
663
+
664
+ #### **Burn Boost** - Powered up when burned
665
+ ```json
666
+ {
667
+ "name": "Burn Boost",
668
+ "description": "Fire damage energizes this Piclet, increasing attack power",
669
+ "triggers": [
670
+ {
671
+ "event": "onStatusInflicted",
672
+ "condition": "ifStatus:burn",
673
+ "effects": [
674
+ {
675
+ "type": "modifyStats",
676
+ "target": "self",
677
+ "stats": { "attack": "greatly_increase" }
678
+ }
679
+ ]
680
+ }
681
+ ]
682
+ }
683
+ ```
684
+
685
+ #### **Confusion Clarity** - Cannot be confused, clears team confusion
686
+ ```json
687
+ {
688
+ "name": "Confusion Clarity",
689
+ "description": "Clear mind prevents confusion and helps allies focus",
690
+ "effects": [
691
+ {
692
+ "type": "mechanicOverride",
693
+ "mechanic": "statusImmunity",
694
+ "value": ["confuse"]
695
+ }
696
+ ],
697
+ "triggers": [
698
+ {
699
+ "event": "onSwitchIn",
700
+ "effects": [
701
+ {
702
+ "type": "removeStatus",
703
+ "target": "allies",
704
+ "status": "confuse"
705
+ }
706
+ ]
707
+ }
708
+ ]
709
+ }
710
+ ```
711
+
712
+ ### Event Triggers for Abilities
713
+
714
+ Extended list of trigger events:
715
+ - **onDamageTaken**: When this Piclet takes damage
716
+ - **onDamageDealt**: When this Piclet deals damage
717
+ - **onContactDamage**: When hit by a contact move
718
+ - **onStatusInflicted**: When a status is applied to this Piclet
719
+ - **onStatusMove**: When targeted by a status move
720
+ - **onCriticalHit**: When this Piclet lands/receives a critical hit
721
+ - **onHPDrained**: When HP is drained from this Piclet
722
+ - **onKO**: When this Piclet knocks out an opponent
723
+ - **onSwitchIn**: When this Piclet enters battle
724
+ - **onSwitchOut**: When this Piclet leaves battle
725
+ - **onWeatherChange**: When battlefield weather changes
726
+ - **beforeMoveUse**: Just before this Piclet uses a move
727
+ - **afterMoveUse**: Just after this Piclet uses a move
728
+ - **onLowHP**: When HP drops below 25%
729
+ - **onFullHP**: When HP is at 100%
730
+
731
+ ## Move Categories and Interactions
732
+
733
+ ### Physical vs Special Attacks
734
+
735
+ - **Physical**: Use attack vs defense stats, affected by contact abilities
736
+ - **Special**: Use fieldAttack vs fieldDefense stats, no contact interactions
737
+ - **Status**: No damage, focus on effects and stat manipulation
738
+
739
+ ### Move Flags
740
+
741
+ Moves can have flags that affect interactions:
742
+
743
+ - **contact**: Triggers contact-based abilities (like Rough Skin)
744
+ - **sound**: Affects sound-based interactions
745
+ - **bite**: Triggers bite-specific abilities
746
+ - **punch**: Triggers punch-specific abilities
747
+ - **reckless**: Increased power but with drawbacks
748
+ - **priority**: Natural priority moves
749
+ - **multiHit**: Hits multiple times
750
+ - **charging**: Requires charging turn
751
+
752
+ ## Dynamic Combinations
753
+
754
+ ### Power vs Risk Tradeoffs
755
+
756
+ 1. **High Power, Self-Debuff**
757
+ ```json
758
+ {
759
+ "name": "Berserker Strike",
760
+ "power": 130,
761
+ "effects": [
762
+ {
763
+ "type": "damage",
764
+ "target": "opponent",
765
+ "formula": "standard"
766
+ },
767
+ {
768
+ "type": "modifyStats",
769
+ "target": "self",
770
+ "stats": { "defense": "greatly_decrease" },
771
+ "condition": "afterUse"
772
+ }
773
+ ]
774
+ }
775
+ ```
776
+
777
+ 2. **Accuracy Trade for Power**
778
+ ```json
779
+ {
780
+ "name": "Wild Swing",
781
+ "power": 100,
782
+ "accuracy": 70,
783
+ "effects": [
784
+ {
785
+ "type": "damage",
786
+ "target": "opponent",
787
+ "formula": "standard"
788
+ },
789
+ {
790
+ "type": "modifyStats",
791
+ "target": "self",
792
+ "stats": { "accuracy": "decrease" },
793
+ "condition": "afterUse"
794
+ }
795
+ ]
796
+ }
797
+ ```
798
+
799
+ 3. **Conditional Power Scaling**
800
+ ```json
801
+ {
802
+ "name": "Revenge Strike",
803
+ "power": 60,
804
+ "effects": [
805
+ {
806
+ "type": "damage",
807
+ "target": "opponent",
808
+ "formula": "standard",
809
+ "multiplier": 1.0,
810
+ "condition": "always"
811
+ },
812
+ {
813
+ "type": "damage",
814
+ "target": "opponent",
815
+ "formula": "standard",
816
+ "multiplier": 2.0,
817
+ "condition": "ifDamagedThisTurn"
818
+ }
819
+ ]
820
+ }
821
+ ```
822
+
823
+ ### Extreme Risk-Reward Moves
824
+
825
+ Powerful moves with dramatic sacrifices create high-stakes decision making:
826
+
827
+ #### **Self Destruct** - Ultimate sacrifice for massive damage
828
+ ```json
829
+ {
830
+ "name": "Self Destruct",
831
+ "category": "physical",
832
+ "power": 200,
833
+ "accuracy": 100,
834
+ "pp": 1,
835
+ "priority": 0,
836
+ "flags": ["explosive", "contact"],
837
+ "effects": [
838
+ {
839
+ "type": "damage",
840
+ "target": "all",
841
+ "formula": "standard",
842
+ "multiplier": 1.5
843
+ },
844
+ {
845
+ "type": "damage",
846
+ "target": "self",
847
+ "formula": "fixed",
848
+ "value": 9999,
849
+ "condition": "afterUse"
850
+ }
851
+ ]
852
+ }
853
+ ```
854
+
855
+ #### **Life Drain Overload** - Heal massively but lose stats permanently
856
+ ```json
857
+ {
858
+ "name": "Life Drain Overload",
859
+ "category": "special",
860
+ "power": 0,
861
+ "accuracy": 100,
862
+ "pp": 3,
863
+ "priority": 0,
864
+ "flags": ["draining"],
865
+ "effects": [
866
+ {
867
+ "type": "heal",
868
+ "target": "self",
869
+ "amount": "percentage",
870
+ "value": 75
871
+ },
872
+ {
873
+ "type": "modifyStats",
874
+ "target": "self",
875
+ "stats": { "attack": "greatly_decrease", "fieldAttack": "greatly_decrease" },
876
+ "condition": "afterUse"
877
+ }
878
+ ]
879
+ }
880
+ ```
881
+
882
+ #### **Berserker's End** - More damage as HP gets lower, but can't heal
883
+ ```json
884
+ {
885
+ "name": "Berserker's End",
886
+ "category": "physical",
887
+ "power": 80,
888
+ "accuracy": 95,
889
+ "pp": 10,
890
+ "priority": 0,
891
+ "flags": ["contact", "reckless"],
892
+ "effects": [
893
+ {
894
+ "type": "damage",
895
+ "target": "opponent",
896
+ "formula": "standard",
897
+ "multiplier": 1.0,
898
+ "condition": "ifHighHp"
899
+ },
900
+ {
901
+ "type": "damage",
902
+ "target": "opponent",
903
+ "formula": "standard",
904
+ "multiplier": 2.0,
905
+ "condition": "ifLowHp"
906
+ },
907
+ {
908
+ "type": "mechanicOverride",
909
+ "target": "self",
910
+ "mechanic": "healingBlocked",
911
+ "value": true,
912
+ "condition": "afterUse"
913
+ }
914
+ ]
915
+ }
916
+ ```
917
+
918
+ #### **Mirror Shatter** - Reflect all damage taken this turn back doubled
919
+ ```json
920
+ {
921
+ "name": "Mirror Shatter",
922
+ "category": "status",
923
+ "power": 0,
924
+ "accuracy": 100,
925
+ "pp": 5,
926
+ "priority": 4,
927
+ "flags": ["priority"],
928
+ "effects": [
929
+ {
930
+ "type": "mechanicOverride",
931
+ "target": "self",
932
+ "mechanic": "damageReflection",
933
+ "value": "double",
934
+ "condition": "thisTurn"
935
+ },
936
+ {
937
+ "type": "modifyStats",
938
+ "target": "self",
939
+ "stats": { "defense": "greatly_decrease", "fieldDefense": "greatly_decrease" },
940
+ "condition": "afterUse"
941
+ }
942
+ ]
943
+ }
944
+ ```
945
+
946
+ #### **Temporal Overload** - Act twice next turn, skip following turn
947
+ ```json
948
+ {
949
+ "name": "Temporal Overload",
950
+ "category": "status",
951
+ "power": 0,
952
+ "accuracy": 100,
953
+ "pp": 2,
954
+ "priority": 0,
955
+ "flags": ["temporal"],
956
+ "effects": [
957
+ {
958
+ "type": "mechanicOverride",
959
+ "target": "self",
960
+ "mechanic": "extraTurn",
961
+ "value": true,
962
+ "condition": "nextTurn"
963
+ },
964
+ {
965
+ "type": "applyStatus",
966
+ "target": "self",
967
+ "status": "paralyzed",
968
+ "chance": 100,
969
+ "condition": "turnAfterNext"
970
+ }
971
+ ]
972
+ }
973
+ ```
974
+
975
+ #### **Blood Pact** - Sacrifice HP to double all damage dealt
976
+ ```json
977
+ {
978
+ "name": "Blood Pact",
979
+ "category": "status",
980
+ "power": 0,
981
+ "accuracy": 100,
982
+ "pp": 3,
983
+ "priority": 0,
984
+ "flags": ["sacrifice"],
985
+ "effects": [
986
+ {
987
+ "type": "damage",
988
+ "target": "self",
989
+ "formula": "percentage",
990
+ "value": 50
991
+ },
992
+ {
993
+ "type": "mechanicOverride",
994
+ "target": "self",
995
+ "mechanic": "damageMultiplier",
996
+ "value": 2.0,
997
+ "condition": "restOfBattle"
998
+ }
999
+ ]
1000
+ }
1001
+ ```
1002
+
1003
+ #### **Soul Burn** - Massive special attack that burns user's PP
1004
+ ```json
1005
+ {
1006
+ "name": "Soul Burn",
1007
+ "category": "special",
1008
+ "power": 150,
1009
+ "accuracy": 90,
1010
+ "pp": 5,
1011
+ "priority": 0,
1012
+ "flags": ["burning"],
1013
+ "effects": [
1014
+ {
1015
+ "type": "damage",
1016
+ "target": "opponent",
1017
+ "formula": "standard"
1018
+ },
1019
+ {
1020
+ "type": "manipulatePP",
1021
+ "target": "self",
1022
+ "action": "drain",
1023
+ "amount": 3,
1024
+ "targetMove": "random",
1025
+ "condition": "afterUse"
1026
+ }
1027
+ ]
1028
+ }
1029
+ ```
1030
+
1031
+ #### **Cursed Gambit** - Random effect: heal fully OR faint instantly
1032
+ ```json
1033
+ {
1034
+ "name": "Cursed Gambit",
1035
+ "category": "status",
1036
+ "power": 0,
1037
+ "accuracy": 100,
1038
+ "pp": 1,
1039
+ "priority": 0,
1040
+ "flags": ["gambling", "cursed"],
1041
+ "effects": [
1042
+ {
1043
+ "type": "heal",
1044
+ "target": "self",
1045
+ "amount": "percentage",
1046
+ "value": 100,
1047
+ "condition": "ifLucky50"
1048
+ },
1049
+ {
1050
+ "type": "damage",
1051
+ "target": "self",
1052
+ "formula": "fixed",
1053
+ "value": 9999,
1054
+ "condition": "ifUnlucky50"
1055
+ }
1056
+ ]
1057
+ }
1058
+ ```
1059
+
1060
+ #### **Apocalypse Strike** - Massive damage to all, but user becomes vulnerable
1061
+ ```json
1062
+ {
1063
+ "name": "Apocalypse Strike",
1064
+ "category": "special",
1065
+ "power": 120,
1066
+ "accuracy": 85,
1067
+ "pp": 1,
1068
+ "priority": 0,
1069
+ "flags": ["apocalyptic"],
1070
+ "effects": [
1071
+ {
1072
+ "type": "damage",
1073
+ "target": "all",
1074
+ "formula": "standard",
1075
+ "multiplier": 1.3
1076
+ },
1077
+ {
1078
+ "type": "mechanicOverride",
1079
+ "target": "self",
1080
+ "mechanic": "criticalHits",
1081
+ "value": "alwaysReceive",
1082
+ "condition": "restOfBattle"
1083
+ },
1084
+ {
1085
+ "type": "modifyStats",
1086
+ "target": "self",
1087
+ "stats": { "defense": "greatly_decrease", "fieldDefense": "greatly_decrease" }
1088
+ }
1089
+ ]
1090
+ }
1091
+ ```
1092
+
1093
+ ### Multi-Stage Effects
1094
+
1095
+ Complex moves can have multiple phases:
1096
+
1097
+ ```json
1098
+ {
1099
+ "name": "Charging Blast",
1100
+ "category": "special",
1101
+ "power": 120,
1102
+ "accuracy": 90,
1103
+ "pp": 5,
1104
+ "flags": ["charging"],
1105
+ "effects": [
1106
+ {
1107
+ "type": "modifyStats",
1108
+ "target": "self",
1109
+ "stats": { "defense": "increase" },
1110
+ "condition": "onCharging"
1111
+ },
1112
+ {
1113
+ "type": "damage",
1114
+ "target": "opponent",
1115
+ "formula": "standard",
1116
+ "condition": "afterCharging"
1117
+ },
1118
+ {
1119
+ "type": "applyStatus",
1120
+ "target": "self",
1121
+ "status": "vulnerable",
1122
+ "condition": "afterCharging"
1123
+ }
1124
+ ]
1125
+ }
1126
+ ```
1127
+
1128
+ ## Implementation Benefits
1129
+
1130
+ ### 1. **Programmatic Execution**
1131
+ - All effects are defined as data structures
1132
+ - Battle engine can execute any combination of effects
1133
+ - No hardcoded move implementations needed
1134
+
1135
+ ### 2. **Infinite Variety**
1136
+ - Mix and match building blocks for unique moves
1137
+ - Same building blocks create vastly different strategies
1138
+ - Easy to balance by adjusting values
1139
+
1140
+ ### 3. **Clear Tradeoffs**
1141
+ - Every powerful effect has a drawback
1142
+ - Players must weigh risk vs reward
1143
+ - Multiple viable strategies emerge
1144
+
1145
+ ### 4. **Emergent Complexity**
1146
+ - Simple rules create complex interactions
1147
+ - Abilities interact with moves in unexpected ways
1148
+ - Meta-game develops naturally
1149
+
1150
+ ### 5. **Easy Extension**
1151
+ - New effect types can be added seamlessly
1152
+ - New conditions and triggers expand possibilities
1153
+ - Backward compatible with existing definitions
1154
+
1155
+ ## Battle Flow Integration
1156
+
1157
+ The battle system processes effects in this order:
1158
+
1159
+ 1. **Pre-Move Phase**: Priority calculation, ability triggers
1160
+ 2. **Move Execution**: Damage calculation, hit/miss determination
1161
+ 3. **Effect Application**: Apply all move effects based on conditions
1162
+ 4. **Post-Move Phase**: End-of-turn abilities, status effects
1163
+ 5. **Turn Cleanup**: Duration decrements, expired effect removal
1164
+
1165
+ This ensures predictable interaction resolution while allowing for complex chains of effects.
1166
+
1167
+ ## Balancing Philosophy
1168
+
1169
+ The system encourages diverse strategies through:
1170
+
1171
+ - **No "strictly better" moves**: Every powerful move has meaningful drawbacks
1172
+ - **Type diversity matters**: Different types offer different utility patterns
1173
+ - **Timing is crucial**: When to use high-risk moves becomes strategic
1174
+ - **Adaptation required**: Static strategies are punishable by counter-play
1175
+
1176
+ This creates a dynamic battle system where player skill and strategic thinking matter more than raw stat advantages.
1177
+
1178
+ ## Complete Example: Tempest Wraith
1179
+
1180
+ Here's a full example of a Piclet using the complete schema with advanced abilities and dramatic moves:
1181
+
1182
+ ```json
1183
+ {
1184
+ "name": "Tempest Wraith",
1185
+ "description": "A ghostly creature born from violent storms, wielding lightning and shadow in equal measure",
1186
+ "tier": "high",
1187
+ "primaryType": "storm",
1188
+ "secondaryType": "shadow",
1189
+ "baseStats": {
1190
+ "hp": 75,
1191
+ "attack": 60,
1192
+ "defense": 45,
1193
+ "fieldAttack": 95,
1194
+ "fieldDefense": 80,
1195
+ "speed": 85
1196
+ },
1197
+ "nature": "timid",
1198
+ "specialAbility": {
1199
+ "name": "Storm Caller",
1200
+ "description": "When HP drops below 25%, gains immunity to status effects and +50% speed",
1201
+ "triggers": [
1202
+ {
1203
+ "event": "onLowHP",
1204
+ "effects": [
1205
+ {
1206
+ "type": "mechanicOverride",
1207
+ "mechanic": "statusImmunity",
1208
+ "value": ["burn", "freeze", "paralyze", "poison", "sleep", "confuse"]
1209
+ },
1210
+ {
1211
+ "type": "modifyStats",
1212
+ "target": "self",
1213
+ "stats": { "speed": "greatly_increase" }
1214
+ }
1215
+ ]
1216
+ },
1217
+ {
1218
+ "event": "onSwitchIn",
1219
+ "condition": "ifWeather:storm",
1220
+ "effects": [
1221
+ {
1222
+ "type": "modifyStats",
1223
+ "target": "self",
1224
+ "stats": { "fieldAttack": "increase" }
1225
+ }
1226
+ ]
1227
+ }
1228
+ ]
1229
+ },
1230
+ "movepool": [
1231
+ {
1232
+ "name": "Shadow Pulse",
1233
+ "type": "shadow",
1234
+ "category": "special",
1235
+ "power": 70,
1236
+ "accuracy": 100,
1237
+ "pp": 15,
1238
+ "priority": 0,
1239
+ "flags": [],
1240
+ "effects": [
1241
+ {
1242
+ "type": "damage",
1243
+ "target": "opponent",
1244
+ "formula": "standard"
1245
+ },
1246
+ {
1247
+ "type": "applyStatus",
1248
+ "target": "opponent",
1249
+ "status": "confuse",
1250
+ "chance": 20,
1251
+ "condition": "onHit"
1252
+ }
1253
+ ]
1254
+ },
1255
+ {
1256
+ "name": "Lightning Strike",
1257
+ "type": "storm",
1258
+ "category": "special",
1259
+ "power": 85,
1260
+ "accuracy": 90,
1261
+ "pp": 10,
1262
+ "priority": 0,
1263
+ "flags": [],
1264
+ "effects": [
1265
+ {
1266
+ "type": "damage",
1267
+ "target": "opponent",
1268
+ "formula": "standard"
1269
+ },
1270
+ {
1271
+ "type": "applyStatus",
1272
+ "target": "opponent",
1273
+ "status": "paralyze",
1274
+ "chance": 15,
1275
+ "condition": "onHit"
1276
+ }
1277
+ ]
1278
+ },
1279
+ {
1280
+ "name": "Spectral Drain",
1281
+ "type": "shadow",
1282
+ "category": "special",
1283
+ "power": 60,
1284
+ "accuracy": 95,
1285
+ "pp": 12,
1286
+ "priority": 0,
1287
+ "flags": ["draining"],
1288
+ "effects": [
1289
+ {
1290
+ "type": "damage",
1291
+ "target": "opponent",
1292
+ "formula": "drain",
1293
+ "value": 0.5
1294
+ },
1295
+ {
1296
+ "type": "heal",
1297
+ "target": "self",
1298
+ "amount": "percentage",
1299
+ "value": 50,
1300
+ "condition": "onHit"
1301
+ }
1302
+ ]
1303
+ },
1304
+ {
1305
+ "name": "Storm's Sacrifice",
1306
+ "type": "storm",
1307
+ "category": "special",
1308
+ "power": 130,
1309
+ "accuracy": 85,
1310
+ "pp": 1,
1311
+ "priority": 0,
1312
+ "flags": ["sacrifice", "explosive"],
1313
+ "effects": [
1314
+ {
1315
+ "type": "damage",
1316
+ "target": "all",
1317
+ "formula": "standard",
1318
+ "multiplier": 1.2
1319
+ },
1320
+ {
1321
+ "type": "damage",
1322
+ "target": "self",
1323
+ "formula": "percentage",
1324
+ "value": 75,
1325
+ "condition": "afterUse"
1326
+ },
1327
+ {
1328
+ "type": "fieldEffect",
1329
+ "effect": "electricStorm",
1330
+ "target": "field",
1331
+ "stackable": false,
1332
+ "condition": "afterUse"
1333
+ }
1334
+ ]
1335
+ }
1336
+ ]
1337
+ }
1338
+ ```
1339
+
1340
+ This example demonstrates:
1341
+
1342
+ ### **Advanced Special Ability**
1343
+ - **Conditional Triggers**: Different effects based on HP and weather
1344
+ - **Multiple Mechanics**: Status immunity + stat boosts + weather interactions
1345
+ - **Strategic Depth**: Becomes more dangerous when near defeat
1346
+
1347
+ ### **Diverse Movepool**
1348
+ - **Standard Attack**: Shadow Pulse with minor status chance
1349
+ - **Type Coverage**: Storm and Shadow moves for different matchups
1350
+ - **Utility Move**: Spectral Drain for sustainability
1351
+ - **Ultimate Move**: Storm's Sacrifice - massive AoE damage with severe self-harm
1352
+
1353
+ ### **Meaningful Tradeoffs**
1354
+ - **Spectral Drain**: Healing requires hitting the opponent
1355
+ - **Storm's Sacrifice**: Incredible power (130 base + 20% bonus to all) but costs 75% of user's HP
1356
+ - **Low defenses**: High speed/special attack but vulnerable to physical moves
1357
+
1358
+ ### **Emergent Strategy**
1359
+ - Use standard moves early while healthy
1360
+ - Spectral Drain for sustain in mid-game
1361
+ - When low on HP, ability kicks in for immunity and speed boost
1362
+ - Storm's Sacrifice as desperate finisher or when opponent is also low
1363
+
1364
+ This creates a Piclet that plays differently throughout the battle, rewards risk-taking, and offers multiple viable strategies depending on the situation!