Fraser commited on
Commit
946e7bf
·
1 Parent(s): 836962d
Files changed (1) hide show
  1. battle_system_design.md +620 -114
battle_system_design.md CHANGED
@@ -17,14 +17,12 @@ The battle system is built on **composable building blocks** that can be combine
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",
@@ -43,8 +41,7 @@ The battle system is built on **composable building blocks** that can be combine
43
  "movepool": [
44
  {
45
  "name": "Gust Strike",
46
- "type": "wind",
47
- "category": "physical",
48
  "power": 65,
49
  "accuracy": 95,
50
  "pp": 20,
@@ -54,14 +51,13 @@ The battle system is built on **composable building blocks** that can be combine
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,
@@ -71,7 +67,7 @@ The battle system is built on **composable building blocks** that can be combine
71
  {
72
  "type": "damage",
73
  "target": "opponent",
74
- "formula": "standard"
75
  },
76
  {
77
  "type": "modifyStats",
@@ -83,8 +79,7 @@ The battle system is built on **composable building blocks** that can be combine
83
  },
84
  {
85
  "name": "Tailwind Boost",
86
- "type": "wind",
87
- "category": "status",
88
  "power": 0,
89
  "accuracy": 100,
90
  "pp": 10,
@@ -100,8 +95,7 @@ The battle system is built on **composable building blocks** that can be combine
100
  },
101
  {
102
  "name": "Reckless Dive",
103
- "type": "wind",
104
- "category": "physical",
105
  "power": 120,
106
  "accuracy": 80,
107
  "pp": 5,
@@ -111,7 +105,7 @@ The battle system is built on **composable building blocks** that can be combine
111
  {
112
  "type": "damage",
113
  "target": "opponent",
114
- "formula": "standard"
115
  },
116
  {
117
  "type": "damage",
@@ -136,10 +130,7 @@ All battle effects are built from these atomic operations:
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
 
@@ -169,9 +160,7 @@ All battle effects are built from these atomic operations:
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
 
@@ -180,9 +169,7 @@ All battle effects are built from these atomic operations:
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
 
@@ -192,8 +179,7 @@ All battle effects are built from these atomic operations:
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
 
@@ -212,8 +198,7 @@ All battle effects are built from these atomic operations:
212
  {
213
  "type": "counter",
214
  "counterType": "physical" | "special" | "any",
215
- "multiplier": 2.0, // Damage multiplier when countering
216
- "condition": "ifDamagedThisTurn"
217
  }
218
  ```
219
 
@@ -231,12 +216,44 @@ All battle effects are built from these atomic operations:
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:
@@ -291,6 +308,9 @@ Special abilities can override or alter fundamental battle mechanics:
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
 
@@ -331,15 +351,15 @@ Special abilities can override or alter fundamental battle mechanics:
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",
@@ -520,30 +540,20 @@ Special abilities can override or alter fundamental battle mechanics:
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
  }
@@ -709,6 +719,128 @@ Special abilities can override or alter fundamental battle mechanics:
709
  }
710
  ```
711
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
712
  ### Event Triggers for Abilities
713
 
714
  Extended list of trigger events:
@@ -732,8 +864,8 @@ Extended list of trigger events:
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
@@ -805,15 +937,12 @@ Moves can have flags that affect interactions:
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
  ]
@@ -828,7 +957,6 @@ Powerful moves with dramatic sacrifices create high-stakes decision making:
828
  ```json
829
  {
830
  "name": "Self Destruct",
831
- "category": "physical",
832
  "power": 200,
833
  "accuracy": 100,
834
  "pp": 1,
@@ -856,7 +984,6 @@ Powerful moves with dramatic sacrifices create high-stakes decision making:
856
  ```json
857
  {
858
  "name": "Life Drain Overload",
859
- "category": "special",
860
  "power": 0,
861
  "accuracy": 100,
862
  "pp": 3,
@@ -872,7 +999,7 @@ Powerful moves with dramatic sacrifices create high-stakes decision making:
872
  {
873
  "type": "modifyStats",
874
  "target": "self",
875
- "stats": { "attack": "greatly_decrease", "fieldAttack": "greatly_decrease" },
876
  "condition": "afterUse"
877
  }
878
  ]
@@ -882,8 +1009,7 @@ Powerful moves with dramatic sacrifices create high-stakes decision making:
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,
@@ -893,23 +1019,19 @@ Powerful moves with dramatic sacrifices create high-stakes decision making:
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
  }
@@ -918,8 +1040,7 @@ Powerful moves with dramatic sacrifices create high-stakes decision making:
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,
@@ -947,7 +1068,6 @@ Powerful moves with dramatic sacrifices create high-stakes decision making:
947
  ```json
948
  {
949
  "name": "Temporal Overload",
950
- "category": "status",
951
  "power": 0,
952
  "accuracy": 100,
953
  "pp": 2,
@@ -976,7 +1096,6 @@ Powerful moves with dramatic sacrifices create high-stakes decision making:
976
  ```json
977
  {
978
  "name": "Blood Pact",
979
- "category": "status",
980
  "power": 0,
981
  "accuracy": 100,
982
  "pp": 3,
@@ -1004,7 +1123,6 @@ Powerful moves with dramatic sacrifices create high-stakes decision making:
1004
  ```json
1005
  {
1006
  "name": "Soul Burn",
1007
- "category": "special",
1008
  "power": 150,
1009
  "accuracy": 90,
1010
  "pp": 5,
@@ -1032,7 +1150,6 @@ Powerful moves with dramatic sacrifices create high-stakes decision making:
1032
  ```json
1033
  {
1034
  "name": "Cursed Gambit",
1035
- "category": "status",
1036
  "power": 0,
1037
  "accuracy": 100,
1038
  "pp": 1,
@@ -1061,7 +1178,6 @@ Powerful moves with dramatic sacrifices create high-stakes decision making:
1061
  ```json
1062
  {
1063
  "name": "Apocalypse Strike",
1064
- "category": "special",
1065
  "power": 120,
1066
  "accuracy": 85,
1067
  "pp": 1,
@@ -1097,7 +1213,6 @@ Complex moves can have multiple phases:
1097
  ```json
1098
  {
1099
  "name": "Charging Blast",
1100
- "category": "special",
1101
  "power": 120,
1102
  "accuracy": 90,
1103
  "pp": 5,
@@ -1175,6 +1290,411 @@ The system encourages diverse strategies through:
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:
@@ -1182,16 +1702,14 @@ Here's a full example of a Piclet using the complete schema with advanced abilit
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",
@@ -1221,7 +1739,7 @@ Here's a full example of a Piclet using the complete schema with advanced abilit
1221
  {
1222
  "type": "modifyStats",
1223
  "target": "self",
1224
- "stats": { "fieldAttack": "increase" }
1225
  }
1226
  ]
1227
  }
@@ -1230,8 +1748,7 @@ Here's a full example of a Piclet using the complete schema with advanced abilit
1230
  "movepool": [
1231
  {
1232
  "name": "Shadow Pulse",
1233
- "type": "shadow",
1234
- "category": "special",
1235
  "power": 70,
1236
  "accuracy": 100,
1237
  "pp": 15,
@@ -1241,21 +1758,18 @@ Here's a full example of a Piclet using the complete schema with advanced abilit
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,
@@ -1265,21 +1779,18 @@ Here's a full example of a Piclet using the complete schema with advanced abilit
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,
@@ -1295,16 +1806,13 @@ Here's a full example of a Piclet using the complete schema with advanced abilit
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,
@@ -1321,15 +1829,13 @@ Here's a full example of a Piclet using the complete schema with advanced abilit
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
  }
 
17
  "name": "Zephyr Sprite",
18
  "description": "A mysterious floating creature that manipulates wind currents",
19
  "tier": "medium",
20
+ "primaryType": "space",
21
  "secondaryType": null,
22
  "baseStats": {
23
  "hp": 65,
24
+ "attack": 85,
25
  "defense": 40,
 
 
26
  "speed": 90
27
  },
28
  "nature": "hasty",
 
41
  "movepool": [
42
  {
43
  "name": "Gust Strike",
44
+ "type": "space",
 
45
  "power": 65,
46
  "accuracy": 95,
47
  "pp": 20,
 
51
  {
52
  "type": "damage",
53
  "target": "opponent",
54
+ "amount": "normal"
55
  }
56
  ]
57
  },
58
  {
59
  "name": "Piercing Gale",
60
+ "type": "space",
 
61
  "power": 80,
62
  "accuracy": 85,
63
  "pp": 15,
 
67
  {
68
  "type": "damage",
69
  "target": "opponent",
70
+ "amount": "normal"
71
  },
72
  {
73
  "type": "modifyStats",
 
79
  },
80
  {
81
  "name": "Tailwind Boost",
82
+ "type": "space",
 
83
  "power": 0,
84
  "accuracy": 100,
85
  "pp": 10,
 
95
  },
96
  {
97
  "name": "Reckless Dive",
98
+ "type": "space",
 
99
  "power": 120,
100
  "accuracy": 80,
101
  "pp": 5,
 
105
  {
106
  "type": "damage",
107
  "target": "opponent",
108
+ "amount": "normal"
109
  },
110
  {
111
  "type": "damage",
 
130
  {
131
  "type": "damage",
132
  "target": "opponent" | "self" | "all" | "allies",
133
+ "amount": "weak" | "normal" | "strong" | "extreme"
 
 
 
134
  }
135
  ```
136
 
 
160
  {
161
  "type": "applyStatus",
162
  "target": "opponent" | "self",
163
+ "status": "burn" | "freeze" | "paralyze" | "poison" | "sleep" | "confuse"
 
 
164
  }
165
  ```
166
 
 
169
  {
170
  "type": "heal",
171
  "target": "self" | "ally",
172
+ "amount": "small" | "medium" | "large" | "full"
 
 
173
  }
174
  ```
175
 
 
179
  "type": "manipulatePP",
180
  "target": "opponent",
181
  "action": "drain" | "restore" | "disable",
182
+ "amount": "small" | "medium" | "large"
 
183
  }
184
  ```
185
 
 
198
  {
199
  "type": "counter",
200
  "counterType": "physical" | "special" | "any",
201
+ "strength": "weak" | "normal" | "strong"
 
202
  }
203
  ```
204
 
 
216
  ```json
217
  {
218
  "type": "removeStatus",
219
+ "target": "self" | "opponent" | "allies",
220
+ "status": "burn" | "freeze" | "paralyze" | "poison" | "sleep" | "confuse"
 
221
  }
222
  ```
223
 
224
+ ### Move Flags
225
+
226
+ Moves can have flags that affect how they interact with abilities and other mechanics:
227
+
228
+ #### **Combat Flags**
229
+ - **contact**: Move makes physical contact (triggers contact abilities like Rough Skin)
230
+ - **bite**: Biting move (affected by Strong Jaw ability, blocked by certain defenses)
231
+ - **punch**: Punching move (affected by Iron Fist ability)
232
+ - **sound**: Sound-based move (bypasses Substitute, blocked by Soundproof)
233
+ - **explosive**: Explosive move (affected by Damp ability)
234
+ - **draining**: Move that drains HP (affected by Liquid Ooze ability)
235
+ - **ground**: Ground-based attack (blocked by Sky Dancer, Levitate abilities)
236
+
237
+ #### **Priority Flags**
238
+ - **priority**: Move has natural priority (+1 to +5)
239
+ - **lowPriority**: Move has negative priority (-1 to -5)
240
+
241
+ #### **Special Mechanics**
242
+ - **charging**: Move requires charging turn (Sky Attack, Solar Beam)
243
+ - **recharge**: User must recharge next turn (Hyper Beam)
244
+ - **multiHit**: Hits multiple times (2-5 hits)
245
+ - **twoTurn**: Takes two turns to execute
246
+ - **sacrifice**: Move involves self-sacrifice or major cost
247
+ - **gambling**: Move has random outcomes
248
+ - **reckless**: Move gains power but has drawbacks (affected by Reckless ability)
249
+
250
+ #### **Interaction Flags**
251
+ - **reflectable**: Can be reflected by Magic Coat
252
+ - **snatchable**: Can be stolen by Snatch
253
+ - **copyable**: Can be copied by Mirror Move
254
+ - **protectable**: Blocked by Protect/Detect
255
+ - **bypassProtect**: Ignores Protect/Detect
256
+
257
  ### Triggers and Conditions
258
 
259
  Effects can be triggered by various battle events:
 
308
  - **contactDamage**: Attackers take damage when using contact moves
309
  - **drainInversion**: HP draining moves heal the target instead
310
  - **weatherImmunity**: Unaffected by weather damage/effects
311
+ - **flagImmunity**: Immune to moves with specific flags
312
+ - **flagWeakness**: Takes extra damage from moves with specific flags
313
+ - **flagResistance**: Takes reduced damage from moves with specific flags
314
 
315
  ### Advanced Ability Examples
316
 
 
351
  }
352
  ```
353
 
354
+ #### 3. **Photosynthesis** - Healed by flora-type moves
355
  ```json
356
  {
357
+ "name": "Photosynthesis",
358
+ "description": "Absorbs flora-type moves to restore HP",
359
  "triggers": [
360
  {
361
  "event": "onDamageTaken",
362
+ "condition": "ifMoveType:flora",
363
  "effects": [
364
  {
365
  "type": "mechanicOverride",
 
540
 
541
  ### Status-Specific Abilities
542
 
543
+ #### **Frost Walker** - Alternative effect when frozen
544
  ```json
545
  {
546
  "name": "Frost Walker",
547
+ "description": "Instead of being frozen, gains +50% attack",
548
  "effects": [
549
  {
550
  "type": "mechanicOverride",
551
+ "mechanic": "statusReplacement:freeze",
552
+ "value": {
553
+ "type": "modifyStats",
554
+ "target": "self",
555
+ "stats": { "attack": "greatly_increase" }
556
+ }
 
 
 
 
 
 
 
 
 
 
557
  }
558
  ]
559
  }
 
719
  }
720
  ```
721
 
722
+ ### Flag-Based Immunities and Weaknesses
723
+
724
+ #### **Sky Dancer** - Immune to ground-flagged attacks
725
+ ```json
726
+ {
727
+ "name": "Sky Dancer",
728
+ "description": "Floating in air, immune to ground-based attacks",
729
+ "effects": [
730
+ {
731
+ "type": "mechanicOverride",
732
+ "mechanic": "flagImmunity",
733
+ "value": ["ground"]
734
+ }
735
+ ]
736
+ }
737
+ ```
738
+
739
+ #### **Sound Barrier** - Immune to sound attacks
740
+ ```json
741
+ {
742
+ "name": "Sound Barrier",
743
+ "description": "Natural sound dampening prevents sound-based moves",
744
+ "effects": [
745
+ {
746
+ "type": "mechanicOverride",
747
+ "mechanic": "flagImmunity",
748
+ "value": ["sound"]
749
+ }
750
+ ]
751
+ }
752
+ ```
753
+
754
+ #### **Soft Body** - Weak to punch moves, immune to explosive
755
+ ```json
756
+ {
757
+ "name": "Soft Body",
758
+ "description": "Gelatinous form absorbs explosions but vulnerable to direct hits",
759
+ "effects": [
760
+ {
761
+ "type": "mechanicOverride",
762
+ "mechanic": "flagImmunity",
763
+ "value": ["explosive"]
764
+ },
765
+ {
766
+ "type": "mechanicOverride",
767
+ "mechanic": "flagWeakness",
768
+ "value": ["punch"]
769
+ }
770
+ ]
771
+ }
772
+ ```
773
+
774
+ #### **Ethereal Form** - Immune to contact moves
775
+ ```json
776
+ {
777
+ "name": "Ethereal Form",
778
+ "description": "Ghostly body cannot be touched by physical contact",
779
+ "effects": [
780
+ {
781
+ "type": "mechanicOverride",
782
+ "mechanic": "flagImmunity",
783
+ "value": ["contact"]
784
+ }
785
+ ]
786
+ }
787
+ ```
788
+
789
+ #### **Fragile Shell** - Takes double damage from explosive moves
790
+ ```json
791
+ {
792
+ "name": "Fragile Shell",
793
+ "description": "Hard shell provides defense but shatters from explosions",
794
+ "effects": [
795
+ {
796
+ "type": "modifyStats",
797
+ "target": "self",
798
+ "stats": { "defense": "increase" }
799
+ },
800
+ {
801
+ "type": "mechanicOverride",
802
+ "mechanic": "flagWeakness",
803
+ "value": ["explosive"]
804
+ }
805
+ ]
806
+ }
807
+ ```
808
+
809
+ #### **Liquid Body** - Immune to punch/bite, weak to sound
810
+ ```json
811
+ {
812
+ "name": "Liquid Body",
813
+ "description": "Fluid form flows around physical attacks but resonates with sound",
814
+ "effects": [
815
+ {
816
+ "type": "mechanicOverride",
817
+ "mechanic": "flagImmunity",
818
+ "value": ["punch", "bite"]
819
+ },
820
+ {
821
+ "type": "mechanicOverride",
822
+ "mechanic": "flagWeakness",
823
+ "value": ["sound"]
824
+ }
825
+ ]
826
+ }
827
+ ```
828
+
829
+ #### **Thick Hide** - Reduced damage from contact moves
830
+ ```json
831
+ {
832
+ "name": "Thick Hide",
833
+ "description": "Tough skin reduces impact from physical contact",
834
+ "effects": [
835
+ {
836
+ "type": "mechanicOverride",
837
+ "mechanic": "flagResistance",
838
+ "value": ["contact"]
839
+ }
840
+ ]
841
+ }
842
+ ```
843
+
844
  ### Event Triggers for Abilities
845
 
846
  Extended list of trigger events:
 
864
 
865
  ### Physical vs Special Attacks
866
 
867
+ - **Physical**: Direct combat using attack vs defense stats, affected by contact abilities
868
+ - **Special**: Ranged/magical attacks using attack vs defense stats, no contact interactions
869
  - **Status**: No damage, focus on effects and stat manipulation
870
 
871
  ### Move Flags
 
937
  {
938
  "type": "damage",
939
  "target": "opponent",
940
+ "amount": "normal"
 
 
941
  },
942
  {
943
  "type": "damage",
944
  "target": "opponent",
945
+ "amount": "strong",
 
946
  "condition": "ifDamagedThisTurn"
947
  }
948
  ]
 
957
  ```json
958
  {
959
  "name": "Self Destruct",
 
960
  "power": 200,
961
  "accuracy": 100,
962
  "pp": 1,
 
984
  ```json
985
  {
986
  "name": "Life Drain Overload",
 
987
  "power": 0,
988
  "accuracy": 100,
989
  "pp": 3,
 
999
  {
1000
  "type": "modifyStats",
1001
  "target": "self",
1002
+ "stats": { "attack": "greatly_decrease" },
1003
  "condition": "afterUse"
1004
  }
1005
  ]
 
1009
  #### **Berserker's End** - More damage as HP gets lower, but can't heal
1010
  ```json
1011
  {
1012
+ "name": "Berserker's End",
 
1013
  "power": 80,
1014
  "accuracy": 95,
1015
  "pp": 10,
 
1019
  {
1020
  "type": "damage",
1021
  "target": "opponent",
1022
+ "amount": "normal"
 
 
1023
  },
1024
  {
1025
  "type": "damage",
1026
  "target": "opponent",
1027
+ "amount": "strong",
 
1028
  "condition": "ifLowHp"
1029
  },
1030
  {
1031
  "type": "mechanicOverride",
1032
  "target": "self",
1033
  "mechanic": "healingBlocked",
1034
+ "value": true
 
1035
  }
1036
  ]
1037
  }
 
1040
  #### **Mirror Shatter** - Reflect all damage taken this turn back doubled
1041
  ```json
1042
  {
1043
+ "name": "Mirror Shatter",
 
1044
  "power": 0,
1045
  "accuracy": 100,
1046
  "pp": 5,
 
1068
  ```json
1069
  {
1070
  "name": "Temporal Overload",
 
1071
  "power": 0,
1072
  "accuracy": 100,
1073
  "pp": 2,
 
1096
  ```json
1097
  {
1098
  "name": "Blood Pact",
 
1099
  "power": 0,
1100
  "accuracy": 100,
1101
  "pp": 3,
 
1123
  ```json
1124
  {
1125
  "name": "Soul Burn",
 
1126
  "power": 150,
1127
  "accuracy": 90,
1128
  "pp": 5,
 
1150
  ```json
1151
  {
1152
  "name": "Cursed Gambit",
 
1153
  "power": 0,
1154
  "accuracy": 100,
1155
  "pp": 1,
 
1178
  ```json
1179
  {
1180
  "name": "Apocalypse Strike",
 
1181
  "power": 120,
1182
  "accuracy": 85,
1183
  "pp": 1,
 
1213
  ```json
1214
  {
1215
  "name": "Charging Blast",
 
1216
  "power": 120,
1217
  "accuracy": 90,
1218
  "pp": 5,
 
1290
 
1291
  This creates a dynamic battle system where player skill and strategic thinking matter more than raw stat advantages.
1292
 
1293
+ ## Complete System Reference
1294
+
1295
+ ### Available Conditions
1296
+ - **always**: Effect always applies when triggered
1297
+ - **onHit**: Effect applies only if the move hits successfully
1298
+ - **afterUse**: Effect applies after move execution regardless of hit/miss
1299
+ - **onCritical**: Effect applies only on critical hits
1300
+ - **ifLowHp**: Effect applies if user's HP < 25%
1301
+ - **ifHighHp**: Effect applies if user's HP > 75%
1302
+ - **thisTurn**: Effect lasts only for the current turn
1303
+ - **nextTurn**: Effect applies on the next turn
1304
+ - **turnAfterNext**: Effect applies two turns from now
1305
+ - **restOfBattle**: Effect persists for the remainder of the battle
1306
+ - **onCharging**: Effect applies during charging phase of two-turn moves
1307
+ - **afterCharging**: Effect applies after charging phase completes
1308
+ - **ifDamagedThisTurn**: Effect applies if user took damage this turn
1309
+ - **ifNotSuperEffective**: Effect applies if move would not be super effective
1310
+ - **ifMoveType:[type]**: Effect applies if move is of specified type
1311
+ - **ifStatus:[status]**: Effect applies if user has specified status
1312
+ - **whileFrozen**: Effect applies while user is frozen
1313
+ - **ifWeather:[weather]**: Effect applies if weather condition is active
1314
+ - **ifStatusMove**: Effect applies if move is a status move
1315
+ - **ifLucky50**: Effect applies on 50% random chance (good outcome)
1316
+ - **ifUnlucky50**: Effect applies on 50% random chance (bad outcome)
1317
+
1318
+ ### Available Mechanic Overrides
1319
+ - **criticalHits**: Modify critical hit behavior
1320
+ - **statusImmunity**: Immunity to specific status effects
1321
+ - **statusReplacement:[status]**: Replace status effect with different effect
1322
+ - **damageReflection**: Reflect damage back to attacker
1323
+ - **damageAbsorption**: Absorb damage of specific types
1324
+ - **damageCalculation**: Modify damage calculation rules
1325
+ - **damageMultiplier**: Multiply all damage dealt
1326
+ - **healingInversion**: Healing effects cause damage instead
1327
+ - **healingBlocked**: Prevent all healing
1328
+ - **priorityOverride**: Override move priority
1329
+ - **accuracyBypass**: Moves cannot miss
1330
+ - **typeImmunity**: Immunity to specific damage types
1331
+ - **typeChange**: Change Piclet's type
1332
+ - **contactDamage**: Deal damage to contact move users
1333
+ - **drainInversion**: HP drain heals target instead
1334
+ - **weatherImmunity**: Immunity to weather effects
1335
+ - **flagImmunity**: Immunity to moves with specific flags
1336
+ - **flagWeakness**: Extra damage from moves with specific flags
1337
+ - **flagResistance**: Reduced damage from moves with specific flags
1338
+ - **statModification**: Modify how stat changes work
1339
+ - **targetRedirection**: Change move targets
1340
+ - **extraTurn**: Grant additional turns
1341
+
1342
+ ### Available Event Triggers
1343
+ - **onDamageTaken**: When this Piclet takes damage
1344
+ - **onDamageDealt**: When this Piclet deals damage
1345
+ - **onContactDamage**: When hit by a contact move
1346
+ - **onStatusInflicted**: When a status is applied to this Piclet
1347
+ - **onStatusMove**: When targeted by a status move
1348
+ - **onStatusMoveTargeted**: When targeted by opponent's status move
1349
+ - **onCriticalHit**: When this Piclet lands/receives a critical hit
1350
+ - **onHPDrained**: When HP is drained from this Piclet
1351
+ - **onKO**: When this Piclet knocks out an opponent
1352
+ - **onSwitchIn**: When this Piclet enters battle
1353
+ - **onSwitchOut**: When this Piclet leaves battle
1354
+ - **onWeatherChange**: When battlefield weather changes
1355
+ - **beforeMoveUse**: Just before this Piclet uses a move
1356
+ - **afterMoveUse**: Just after this Piclet uses a move
1357
+ - **onLowHP**: When HP drops below 25%
1358
+ - **onFullHP**: When HP is at 100%
1359
+ - **endOfTurn**: At the end of each turn
1360
+ - **onOpponentContactMove**: When opponent uses contact move
1361
+
1362
+ ### Available Status Effects
1363
+ - **burn**: Ongoing fire damage
1364
+ - **freeze**: Cannot act (unless replaced by ability)
1365
+ - **paralyze**: Speed reduction and chance to be unable to move
1366
+ - **poison**: Ongoing poison damage
1367
+ - **sleep**: Cannot act for several turns
1368
+ - **confuse**: Chance to hit self instead of target
1369
+
1370
+ ### Available Move Flags
1371
+ - **contact**: Makes physical contact
1372
+ - **bite**: Biting attack
1373
+ - **punch**: Punching attack
1374
+ - **sound**: Sound-based attack
1375
+ - **explosive**: Explosive attack
1376
+ - **draining**: Drains HP from target
1377
+ - **ground**: Ground-based attack
1378
+ - **priority**: Has natural priority
1379
+ - **lowPriority**: Has negative priority
1380
+ - **charging**: Requires charging turn
1381
+ - **recharge**: User must recharge after
1382
+ - **multiHit**: Hits multiple times
1383
+ - **twoTurn**: Takes two turns to execute
1384
+ - **sacrifice**: Involves self-sacrifice
1385
+ - **gambling**: Has random outcomes
1386
+ - **reckless**: High power with drawbacks
1387
+ - **reflectable**: Can be reflected
1388
+ - **snatchable**: Can be stolen
1389
+ - **copyable**: Can be copied
1390
+ - **protectable**: Blocked by Protect
1391
+ - **bypassProtect**: Ignores Protect
1392
+
1393
+ ### Available Types
1394
+
1395
+ Types correspond to photographed objects in the real world:
1396
+
1397
+ - **beast** 🐾: Vertebrate wildlife — mammals, birds, reptiles. Raw physicality, instincts, and region-based variants
1398
+ - **bug** 🐛: Arthropods great and small: butterflies, beetles, mantises. Agile swarms, precision strikes, metamorphosis
1399
+ - **aquatic** 🌊: Life that swims, dives, sloshes: fish, octopus, ink-creatures, sentient puddles. Masters of tides and pressure
1400
+ - **flora** 🌿: Plants and fungi captured in bloom or decay. Growth, spores, vines, seasonal shifts
1401
+ - **mineral** 🪨: Stones, crystals, metals shaped by earth's depths. High durability, reflective armor, seismic shocks
1402
+ - **space** ✨: Stars, moon, cosmic objects not of this world. Stellar energy, gravitational effects, void manipulation
1403
+ - **machina** ⚙️: Engineered devices from gadgets to heavy machinery. Gears, circuits, drones, power surges
1404
+ - **structure** 🏛️: Buildings, bridges, monuments, ruins as titans. Fortification, terrain shaping, zone denial
1405
+ - **culture** 🎨: Art, fashion, toys, written symbols. Buffs, debuffs, illusion, story-driven interactions
1406
+ - **cuisine** 🍣: Dishes, drinks, culinary artistry. Flavors, aromas, temperature shifts for support or offense
1407
+ - **normal** 👤: Attack type only (no Piclets are Normal type). Represents mundane, non-specialized attacks
1408
+
1409
+ ### Type Effectiveness Chart
1410
+
1411
+ | ATK \ DEF | 🐾 Beast | 🐛 Bug | 🌊 Aquatic | 🌿 Flora | 🪨 Mineral | ✨Space | ⚙️ Machina | 🏛️ Structure | 🎨 Culture | 🍣 Cuisine |
1412
+ | ----------------- | :------: | :----: | :--------: | :------: | :--------: | :------: | :--------: | :-----------: | :--------: | :--------: |
1413
+ | **🐾 Beast** | 1 | **×2** | 1 | 1 | ×½ | **0** | ×½ | ×½ | **×2** | **×2** |
1414
+ | **🐛 Bug** | **×2** | 1 | 1 | **×2** | ×½ | ×½ | 1 | **0** | ×½ | ×½ |
1415
+ | **🌊 Aquatic** | 1 | 1 | 1 | ×½ | **×2** | **×2** | **×2** | 1 | ×½ | ×½ |
1416
+ | **🌿 Flora** | 1 | **×2** | **×2** | 1 | **×2** | ×½ | **0** | **×2** | 1 | ×½ |
1417
+ | **🪨 Mineral** | **×2** | **×2** | ×½ | ×½ | 1 | ×½ | **×2** | 1 | 1 | **0** |
1418
+ | **✨ Space** | **0** | **×2** | ×½ | **×2** | **×2** | 1 | ×½ | **×2** | ×½ | ×½ |
1419
+ | **⚙️ Machina** | **×2** | ×½ | ×½ | **×2** | ×½ | ×½ | 1 | **×2** | 1 | 1 |
1420
+ | **🏛️ Structure** | ×½ | ×½ | 1 | 1 | 1 | ×½ | **×2** | 1 | **×2** | **×2** |
1421
+ | **🎨 Culture** | ×½ | ×½ | 1 | 1 | **0** | **×2** | **×2** | **×2** | 1 | ×½ |
1422
+ | **🍣 Cuisine** | **×2** | ×½ | ×½ | 1 | **0** | **×2** | 1 | ×½ | **×2** | 1 |
1423
+ | **👤 Normal** | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 1 | 1 |
1424
+
1425
+ **Legend:**
1426
+ - **×2** = Super effective (2x damage)
1427
+ - **×½** = Not very effective (0.5x damage)
1428
+ - **0** = No effect (0x damage)
1429
+ - **1** = Normal effectiveness (1x damage)
1430
+
1431
+ ## JSON Schema
1432
+
1433
+ ```json
1434
+ {
1435
+ "$schema": "http://json-schema.org/draft-07/schema#",
1436
+ "type": "object",
1437
+ "title": "Piclet Definition",
1438
+ "required": ["name", "description", "tier", "primaryType", "baseStats", "nature", "specialAbility", "movepool"],
1439
+ "properties": {
1440
+ "name": {
1441
+ "type": "string",
1442
+ "description": "The name of the Piclet"
1443
+ },
1444
+ "description": {
1445
+ "type": "string",
1446
+ "description": "Flavor text describing the Piclet"
1447
+ },
1448
+ "tier": {
1449
+ "type": "string",
1450
+ "enum": ["low", "medium", "high", "legendary"],
1451
+ "description": "Power tier of the Piclet"
1452
+ },
1453
+ "primaryType": {
1454
+ "type": "string",
1455
+ "enum": ["beast", "bug", "aquatic", "flora", "mineral", "space", "machina", "structure", "culture", "cuisine"],
1456
+ "description": "Primary type of the Piclet"
1457
+ },
1458
+ "secondaryType": {
1459
+ "type": ["string", "null"],
1460
+ "enum": ["beast", "bug", "aquatic", "flora", "mineral", "space", "machina", "structure", "culture", "cuisine", null],
1461
+ "description": "Optional secondary type"
1462
+ },
1463
+ "baseStats": {
1464
+ "type": "object",
1465
+ "required": ["hp", "attack", "defense", "speed"],
1466
+ "properties": {
1467
+ "hp": {"type": "integer", "minimum": 1, "maximum": 255},
1468
+ "attack": {"type": "integer", "minimum": 1, "maximum": 255},
1469
+ "defense": {"type": "integer", "minimum": 1, "maximum": 255},
1470
+ "speed": {"type": "integer", "minimum": 1, "maximum": 255}
1471
+ },
1472
+ "additionalProperties": false
1473
+ },
1474
+ "nature": {
1475
+ "type": "string",
1476
+ "description": "Personality trait affecting stats or behavior"
1477
+ },
1478
+ "specialAbility": {
1479
+ "$ref": "#/definitions/SpecialAbility"
1480
+ },
1481
+ "movepool": {
1482
+ "type": "array",
1483
+ "items": {"$ref": "#/definitions/Move"},
1484
+ "minItems": 1,
1485
+ "maxItems": 8
1486
+ }
1487
+ },
1488
+ "additionalProperties": false,
1489
+ "definitions": {
1490
+ "SpecialAbility": {
1491
+ "type": "object",
1492
+ "required": ["name", "description"],
1493
+ "properties": {
1494
+ "name": {"type": "string"},
1495
+ "description": {"type": "string"},
1496
+ "effects": {
1497
+ "type": "array",
1498
+ "items": {"$ref": "#/definitions/Effect"}
1499
+ },
1500
+ "triggers": {
1501
+ "type": "array",
1502
+ "items": {"$ref": "#/definitions/Trigger"}
1503
+ }
1504
+ },
1505
+ "additionalProperties": false
1506
+ },
1507
+ "Move": {
1508
+ "type": "object",
1509
+ "required": ["name", "type", "power", "accuracy", "pp", "priority", "flags", "effects"],
1510
+ "properties": {
1511
+ "name": {"type": "string"},
1512
+ "type": {
1513
+ "type": "string",
1514
+ "enum": ["beast", "bug", "aquatic", "flora", "mineral", "space", "machina", "structure", "culture", "cuisine", "normal"]
1515
+ },
1516
+ "power": {"type": "integer", "minimum": 0, "maximum": 250},
1517
+ "accuracy": {"type": "integer", "minimum": 0, "maximum": 100},
1518
+ "pp": {"type": "integer", "minimum": 1, "maximum": 50},
1519
+ "priority": {"type": "integer", "minimum": -5, "maximum": 5},
1520
+ "flags": {
1521
+ "type": "array",
1522
+ "items": {
1523
+ "type": "string",
1524
+ "enum": ["contact", "bite", "punch", "sound", "explosive", "draining", "ground", "priority", "lowPriority", "charging", "recharge", "multiHit", "twoTurn", "sacrifice", "gambling", "reckless", "reflectable", "snatchable", "copyable", "protectable", "bypassProtect"]
1525
+ },
1526
+ "uniqueItems": true
1527
+ },
1528
+ "effects": {
1529
+ "type": "array",
1530
+ "items": {"$ref": "#/definitions/Effect"},
1531
+ "minItems": 1
1532
+ }
1533
+ },
1534
+ "additionalProperties": false
1535
+ },
1536
+ "Effect": {
1537
+ "type": "object",
1538
+ "required": ["type"],
1539
+ "properties": {
1540
+ "type": {
1541
+ "type": "string",
1542
+ "enum": ["damage", "modifyStats", "applyStatus", "heal", "manipulatePP", "fieldEffect", "counter", "priority", "removeStatus", "mechanicOverride"]
1543
+ },
1544
+ "target": {
1545
+ "type": "string",
1546
+ "enum": ["self", "opponent", "allies", "all", "attacker", "field", "playerSide", "opponentSide"]
1547
+ },
1548
+ "condition": {
1549
+ "type": "string",
1550
+ "enum": ["always", "onHit", "afterUse", "onCritical", "ifLowHp", "ifHighHp", "thisTurn", "nextTurn", "turnAfterNext", "restOfBattle", "onCharging", "afterCharging", "ifDamagedThisTurn", "ifNotSuperEffective", "ifStatusMove", "ifLucky50", "ifUnlucky50", "whileFrozen"]
1551
+ }
1552
+ },
1553
+ "allOf": [
1554
+ {
1555
+ "if": {"properties": {"type": {"const": "damage"}}},
1556
+ "then": {
1557
+ "required": ["amount"],
1558
+ "properties": {
1559
+ "amount": {
1560
+ "type": "string",
1561
+ "enum": ["weak", "normal", "strong", "extreme"]
1562
+ }
1563
+ }
1564
+ }
1565
+ },
1566
+ {
1567
+ "if": {"properties": {"type": {"const": "modifyStats"}}},
1568
+ "then": {
1569
+ "required": ["stats"],
1570
+ "properties": {
1571
+ "stats": {
1572
+ "type": "object",
1573
+ "properties": {
1574
+ "hp": {"type": "string", "enum": ["increase", "decrease", "greatly_increase", "greatly_decrease"]},
1575
+ "attack": {"type": "string", "enum": ["increase", "decrease", "greatly_increase", "greatly_decrease"]},
1576
+ "defense": {"type": "string", "enum": ["increase", "decrease", "greatly_increase", "greatly_decrease"]},
1577
+ "speed": {"type": "string", "enum": ["increase", "decrease", "greatly_increase", "greatly_decrease"]},
1578
+ "accuracy": {"type": "string", "enum": ["increase", "decrease", "greatly_increase", "greatly_decrease"]}
1579
+ },
1580
+ "additionalProperties": false,
1581
+ "minProperties": 1
1582
+ }
1583
+ }
1584
+ }
1585
+ },
1586
+ {
1587
+ "if": {"properties": {"type": {"const": "applyStatus"}}},
1588
+ "then": {
1589
+ "required": ["status"],
1590
+ "properties": {
1591
+ "status": {
1592
+ "type": "string",
1593
+ "enum": ["burn", "freeze", "paralyze", "poison", "sleep", "confuse"]
1594
+ }
1595
+ }
1596
+ }
1597
+ },
1598
+ {
1599
+ "if": {"properties": {"type": {"const": "heal"}}},
1600
+ "then": {
1601
+ "required": ["amount"],
1602
+ "properties": {
1603
+ "amount": {"type": "string", "enum": ["small", "medium", "large", "full"]}
1604
+ }
1605
+ }
1606
+ },
1607
+ {
1608
+ "if": {"properties": {"type": {"const": "manipulatePP"}}},
1609
+ "then": {
1610
+ "required": ["action", "amount"],
1611
+ "properties": {
1612
+ "action": {"type": "string", "enum": ["drain", "restore", "disable"]},
1613
+ "amount": {"type": "string", "enum": ["small", "medium", "large"]}
1614
+ }
1615
+ }
1616
+ },
1617
+ {
1618
+ "if": {"properties": {"type": {"const": "fieldEffect"}}},
1619
+ "then": {
1620
+ "required": ["effect"],
1621
+ "properties": {
1622
+ "effect": {"type": "string"},
1623
+ "stackable": {"type": "boolean"}
1624
+ }
1625
+ }
1626
+ },
1627
+ {
1628
+ "if": {"properties": {"type": {"const": "counter"}}},
1629
+ "then": {
1630
+ "required": ["counterType", "strength"],
1631
+ "properties": {
1632
+ "counterType": {"type": "string", "enum": ["physical", "special", "any"]},
1633
+ "strength": {"type": "string", "enum": ["weak", "normal", "strong"]}
1634
+ }
1635
+ }
1636
+ },
1637
+ {
1638
+ "if": {"properties": {"type": {"const": "priority"}}},
1639
+ "then": {
1640
+ "required": ["value"],
1641
+ "properties": {
1642
+ "value": {"type": "integer", "minimum": -5, "maximum": 5}
1643
+ }
1644
+ }
1645
+ },
1646
+ {
1647
+ "if": {"properties": {"type": {"const": "removeStatus"}}},
1648
+ "then": {
1649
+ "required": ["status"],
1650
+ "properties": {
1651
+ "status": {
1652
+ "type": "string",
1653
+ "enum": ["burn", "freeze", "paralyze", "poison", "sleep", "confuse"]
1654
+ }
1655
+ }
1656
+ }
1657
+ },
1658
+ {
1659
+ "if": {"properties": {"type": {"const": "mechanicOverride"}}},
1660
+ "then": {
1661
+ "required": ["mechanic", "value"],
1662
+ "properties": {
1663
+ "mechanic": {
1664
+ "type": "string",
1665
+ "enum": ["criticalHits", "statusImmunity", "damageReflection", "damageAbsorption", "damageCalculation", "damageMultiplier", "healingInversion", "healingBlocked", "priorityOverride", "accuracyBypass", "typeImmunity", "typeChange", "contactDamage", "drainInversion", "weatherImmunity", "flagImmunity", "flagWeakness", "flagResistance", "statModification", "targetRedirection", "extraTurn"]
1666
+ },
1667
+ "value": {}
1668
+ }
1669
+ }
1670
+ }
1671
+ ],
1672
+ "additionalProperties": false
1673
+ },
1674
+ "Trigger": {
1675
+ "type": "object",
1676
+ "required": ["event", "effects"],
1677
+ "properties": {
1678
+ "event": {
1679
+ "type": "string",
1680
+ "enum": ["onDamageTaken", "onDamageDealt", "onContactDamage", "onStatusInflicted", "onStatusMove", "onStatusMoveTargeted", "onCriticalHit", "onHPDrained", "onKO", "onSwitchIn", "onSwitchOut", "onWeatherChange", "beforeMoveUse", "afterMoveUse", "onLowHP", "onFullHP", "endOfTurn", "onOpponentContactMove"]
1681
+ },
1682
+ "condition": {
1683
+ "type": "string",
1684
+ "enum": ["always", "onHit", "afterUse", "onCritical", "ifLowHp", "ifHighHp", "thisTurn", "nextTurn", "turnAfterNext", "restOfBattle", "onCharging", "afterCharging", "ifDamagedThisTurn", "ifNotSuperEffective", "ifStatusMove", "ifLucky50", "ifUnlucky50", "whileFrozen"]
1685
+ },
1686
+ "effects": {
1687
+ "type": "array",
1688
+ "items": {"$ref": "#/definitions/Effect"},
1689
+ "minItems": 1
1690
+ }
1691
+ },
1692
+ "additionalProperties": false
1693
+ }
1694
+ }
1695
+ }
1696
+ ```
1697
+
1698
  ## Complete Example: Tempest Wraith
1699
 
1700
  Here's a full example of a Piclet using the complete schema with advanced abilities and dramatic moves:
 
1702
  ```json
1703
  {
1704
  "name": "Tempest Wraith",
1705
+ "description": "A ghostly creature born from violent storms, wielding cosmic energy and shadowy illusions",
1706
  "tier": "high",
1707
+ "primaryType": "space",
1708
+ "secondaryType": "culture",
1709
  "baseStats": {
1710
  "hp": 75,
1711
+ "attack": 95,
1712
  "defense": 45,
 
 
1713
  "speed": 85
1714
  },
1715
  "nature": "timid",
 
1739
  {
1740
  "type": "modifyStats",
1741
  "target": "self",
1742
+ "stats": { "attack": "increase" }
1743
  }
1744
  ]
1745
  }
 
1748
  "movepool": [
1749
  {
1750
  "name": "Shadow Pulse",
1751
+ "type": "culture",
 
1752
  "power": 70,
1753
  "accuracy": 100,
1754
  "pp": 15,
 
1758
  {
1759
  "type": "damage",
1760
  "target": "opponent",
1761
+ "amount": "normal"
1762
  },
1763
  {
1764
  "type": "applyStatus",
1765
  "target": "opponent",
1766
+ "status": "confuse"
 
 
1767
  }
1768
  ]
1769
  },
1770
  {
1771
+ "name": "Cosmic Strike",
1772
+ "type": "space",
 
1773
  "power": 85,
1774
  "accuracy": 90,
1775
  "pp": 10,
 
1779
  {
1780
  "type": "damage",
1781
  "target": "opponent",
1782
+ "amount": "normal"
1783
  },
1784
  {
1785
  "type": "applyStatus",
1786
  "target": "opponent",
1787
+ "status": "paralyze"
 
 
1788
  }
1789
  ]
1790
  },
1791
  {
1792
  "name": "Spectral Drain",
1793
+ "type": "culture",
 
1794
  "power": 60,
1795
  "accuracy": 95,
1796
  "pp": 12,
 
1806
  {
1807
  "type": "heal",
1808
  "target": "self",
1809
+ "amount": "medium"
 
 
1810
  }
1811
  ]
1812
  },
1813
  {
1814
+ "name": "Void Sacrifice",
1815
+ "type": "space",
 
1816
  "power": 130,
1817
  "accuracy": 85,
1818
  "pp": 1,
 
1829
  "type": "damage",
1830
  "target": "self",
1831
  "formula": "percentage",
1832
+ "value": 75
 
1833
  },
1834
  {
1835
  "type": "fieldEffect",
1836
+ "effect": "voidStorm",
1837
  "target": "field",
1838
+ "stackable": false
 
1839
  }
1840
  ]
1841
  }