From 6084d3aaa6b407620a63449b38155a3c4995bca4 Mon Sep 17 00:00:00 2001 From: Flashfyre Date: Tue, 9 Jan 2024 23:34:43 -0500 Subject: [PATCH] Add form change system --- public/audio/bgm/bw/minor_fanfare.mp3 | Bin 0 -> 34586 bytes public/images/items.json | 3946 ++++++++++++----------- public/images/items.png | Bin 32398 -> 34023 bytes public/images/items/adamant_crystal.png | Bin 0 -> 1034 bytes public/images/items/blue_orb.png | Bin 0 -> 306 bytes public/images/items/gracidea.png | Bin 0 -> 403 bytes public/images/items/griseous_core.png | Bin 0 -> 1026 bytes public/images/items/lustrous_globe.png | Bin 0 -> 1054 bytes public/images/items/red_orb.png | Bin 0 -> 335 bytes public/images/pokemon/icons/658-ash.png | Bin 0 -> 599 bytes src/battle-phases.ts | 18 +- src/battle-scene.ts | 65 +- src/data/pokemon-evolutions.ts | 199 +- src/data/pokemon-forms.ts | 462 +++ src/data/pokemon-species.ts | 8 +- src/egg-hatch-phase.ts | 8 - src/evolution-phase.ts | 344 +- src/form-change-phase.ts | 188 ++ src/modifier/modifier-type.ts | 51 +- src/modifier/modifier.ts | 36 +- src/pokemon.ts | 72 +- src/ui/battle-message-ui-handler.ts | 2 +- src/ui/command-ui-handler.ts | 12 +- src/ui/evolution-scene-handler.ts | 123 +- src/ui/party-ui-handler.ts | 80 +- src/ui/ui.ts | 3 +- 26 files changed, 3252 insertions(+), 2365 deletions(-) create mode 100644 public/audio/bgm/bw/minor_fanfare.mp3 create mode 100644 public/images/items/adamant_crystal.png create mode 100644 public/images/items/blue_orb.png create mode 100644 public/images/items/gracidea.png create mode 100644 public/images/items/griseous_core.png create mode 100644 public/images/items/lustrous_globe.png create mode 100644 public/images/items/red_orb.png create mode 100644 public/images/pokemon/icons/658-ash.png create mode 100644 src/data/pokemon-forms.ts create mode 100644 src/form-change-phase.ts diff --git a/public/audio/bgm/bw/minor_fanfare.mp3 b/public/audio/bgm/bw/minor_fanfare.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..464a579a38f9645e9060103f109592bef0580f7c GIT binary patch literal 34586 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

lN!naMIWW-gxut+fRR8q~X#w0_j% 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 literal 0 HcmV?d00001 diff --git a/public/images/items.json b/public/images/items.json index 9e6ca53c3..6c17c12d9 100644 --- a/public/images/items.json +++ b/public/images/items.json @@ -4,8 +4,8 @@ "image": "items.png", "format": "RGBA8888", "size": { - "w": 321, - "h": 321 + "w": 327, + "h": 327 }, "scale": 1, "frames": [ @@ -199,7 +199,7 @@ } }, { - "filename": "grip_claw", + "filename": "gracidea", "rotated": false, "trimmed": true, "sourceSize": { @@ -220,7 +220,7 @@ } }, { - "filename": "lucky_punch", + "filename": "grip_claw", "rotated": false, "trimmed": true, "sourceSize": { @@ -241,7 +241,7 @@ } }, { - "filename": "lucky_punch_great", + "filename": "lucky_punch", "rotated": false, "trimmed": true, "sourceSize": { @@ -262,7 +262,7 @@ } }, { - "filename": "lucky_punch_master", + "filename": "lucky_punch_great", "rotated": false, "trimmed": true, "sourceSize": { @@ -283,7 +283,7 @@ } }, { - "filename": "lucky_punch_ultra", + "filename": "lucky_punch_master", "rotated": false, "trimmed": true, "sourceSize": { @@ -304,7 +304,7 @@ } }, { - "filename": "muscle_band", + "filename": "lucky_punch_ultra", "rotated": false, "trimmed": true, "sourceSize": { @@ -325,7 +325,7 @@ } }, { - "filename": "salac_berry", + "filename": "lustrous_globe", "rotated": false, "trimmed": true, "sourceSize": { @@ -346,7 +346,7 @@ } }, { - "filename": "scanner", + "filename": "muscle_band", "rotated": false, "trimmed": true, "sourceSize": { @@ -430,7 +430,7 @@ } }, { - "filename": "silk_scarf", + "filename": "salac_berry", "rotated": false, "trimmed": true, "sourceSize": { @@ -451,7 +451,7 @@ } }, { - "filename": "sun_stone", + "filename": "scanner", "rotated": false, "trimmed": true, "sourceSize": { @@ -472,7 +472,7 @@ } }, { - "filename": "clefairy_doll", + "filename": "silk_scarf", "rotated": false, "trimmed": true, "sourceSize": { @@ -481,19 +481,19 @@ }, "spriteSourceSize": { "x": 4, - "y": 5, + "y": 4, "w": 24, - "h": 23 + "h": 24 }, "frame": { "x": 0, "y": 265, "w": 24, - "h": 23 + "h": 24 } }, { - "filename": "coin_case", + "filename": "sun_stone", "rotated": false, "trimmed": true, "sourceSize": { @@ -502,15 +502,36 @@ }, "spriteSourceSize": { "x": 4, - "y": 5, + "y": 4, "w": 24, - "h": 23 + "h": 24 }, "frame": { "x": 0, - "y": 288, + "y": 289, "w": 24, - "h": 23 + "h": 24 + } + }, + { + "filename": "ability_capsule", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 9, + "w": 24, + "h": 14 + }, + "frame": { + "x": 0, + "y": 313, + "w": 24, + "h": 14 } }, { @@ -577,7 +598,7 @@ } }, { - "filename": "amulet_coin", + "filename": "adamant_crystal", "rotated": false, "trimmed": true, "sourceSize": { @@ -585,8 +606,8 @@ "h": 32 }, "spriteSourceSize": { - "x": 6, - "y": 5, + "x": 4, + "y": 6, "w": 23, "h": 21 }, @@ -723,279 +744,6 @@ "h": 24 } }, - { - "filename": "berry_pouch", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 23, - "h": 23 - }, - "frame": { - "x": 24, - "y": 289, - "w": 23, - "h": 23 - } - }, - { - "filename": "ability_capsule", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 9, - "w": 24, - "h": 14 - }, - "frame": { - "x": 27, - "y": 22, - "w": 24, - "h": 14 - } - }, - { - "filename": "mega_bracelet", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 16 - }, - "frame": { - "x": 23, - "y": 36, - "w": 20, - "h": 16 - } - }, - { - "filename": "hp_up", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 33, - "y": 52, - "w": 16, - "h": 24 - } - }, - { - "filename": "iron", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 33, - "y": 76, - "w": 16, - "h": 24 - } - }, - { - "filename": "max_lure", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 17, - "h": 24 - }, - "frame": { - "x": 38, - "y": 100, - "w": 17, - "h": 24 - } - }, - { - "filename": "dawn_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 21 - }, - "frame": { - "x": 40, - "y": 124, - "w": 20, - "h": 21 - } - }, - { - "filename": "max_revive", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 22, - "h": 24 - }, - "frame": { - "x": 41, - "y": 145, - "w": 22, - "h": 24 - } - }, - { - "filename": "black_belt", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 41, - "y": 169, - "w": 22, - "h": 23 - } - }, - { - "filename": "expert_belt", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 23 - }, - "frame": { - "x": 41, - "y": 192, - "w": 24, - "h": 23 - } - }, - { - "filename": "scope-lens", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 24, - "h": 23 - }, - "frame": { - "x": 41, - "y": 215, - "w": 24, - "h": 23 - } - }, - { - "filename": "rare_candy", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 23, - "h": 23 - }, - "frame": { - "x": 42, - "y": 238, - "w": 23, - "h": 23 - } - }, - { - "filename": "rarer_candy", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 23, - "h": 23 - }, - "frame": { - "x": 42, - "y": 261, - "w": 23, - "h": 23 - } - }, { "filename": "max_potion", "rotated": false, @@ -1011,8 +759,8 @@ "h": 24 }, "frame": { - "x": 47, - "y": 284, + "x": 24, + "y": 289, "w": 18, "h": 24 } @@ -1032,14 +780,14 @@ "h": 18 }, "frame": { - "x": 51, - "y": 24, + "x": 27, + "y": 22, "w": 24, "h": 18 } }, { - "filename": "dragon_scale", + "filename": "clefairy_doll", "rotated": false, "trimmed": true, "sourceSize": { @@ -1048,19 +796,40 @@ }, "spriteSourceSize": { "x": 4, - "y": 8, + "y": 5, "w": 24, - "h": 18 + "h": 23 + }, + "frame": { + "x": 51, + "y": 24, + "w": 24, + "h": 23 + } + }, + { + "filename": "coin_case", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 24, + "h": 23 }, "frame": { "x": 75, "y": 24, "w": 24, - "h": 18 + "h": 23 } }, { - "filename": "exp_balance", + "filename": "expert_belt", "rotated": false, "trimmed": true, "sourceSize": { @@ -1069,19 +838,19 @@ }, "spriteSourceSize": { "x": 4, - "y": 5, + "y": 4, "w": 24, - "h": 22 + "h": 23 }, "frame": { "x": 99, "y": 24, "w": 24, - "h": 22 + "h": 23 } }, { - "filename": "exp_share", + "filename": "scope-lens", "rotated": false, "trimmed": true, "sourceSize": { @@ -1092,13 +861,13 @@ "x": 4, "y": 5, "w": 24, - "h": 22 + "h": 23 }, "frame": { "x": 123, "y": 24, "w": 24, - "h": 22 + "h": 23 } }, { @@ -1123,7 +892,7 @@ } }, { - "filename": "stick", + "filename": "berry_pouch", "rotated": false, "trimmed": true, "sourceSize": { @@ -1143,6 +912,258 @@ "h": 23 } }, + { + "filename": "exp_balance", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 24, + "h": 22 + }, + "frame": { + "x": 194, + "y": 24, + "w": 24, + "h": 22 + } + }, + { + "filename": "exp_share", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 24, + "h": 22 + }, + "frame": { + "x": 218, + "y": 24, + "w": 24, + "h": 22 + } + }, + { + "filename": "griseous_core", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 23, + "h": 23 + }, + "frame": { + "x": 242, + "y": 24, + "w": 23, + "h": 23 + } + }, + { + "filename": "rare_candy", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 23, + "h": 23 + }, + "frame": { + "x": 265, + "y": 24, + "w": 23, + "h": 23 + } + }, + { + "filename": "rarer_candy", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 23, + "h": 23 + }, + "frame": { + "x": 288, + "y": 24, + "w": 23, + "h": 23 + } + }, + { + "filename": "hp_up", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 311, + "y": 24, + "w": 16, + "h": 24 + } + }, + { + "filename": "razor_fang", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 6, + "w": 18, + "h": 20 + }, + "frame": { + "x": 33, + "y": 40, + "w": 18, + "h": 20 + } + }, + { + "filename": "max_revive", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 22, + "h": 24 + }, + "frame": { + "x": 33, + "y": 60, + "w": 22, + "h": 24 + } + }, + { + "filename": "mega_bracelet", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 16 + }, + "frame": { + "x": 33, + "y": 84, + "w": 20, + "h": 16 + } + }, + { + "filename": "iron", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 38, + "y": 100, + "w": 16, + "h": 24 + } + }, + { + "filename": "amulet_coin", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 5, + "w": 23, + "h": 21 + }, + "frame": { + "x": 40, + "y": 124, + "w": 23, + "h": 21 + } + }, + { + "filename": "black_belt", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 41, + "y": 145, + "w": 22, + "h": 23 + } + }, { "filename": "fire_stone", "rotated": false, @@ -1158,8 +1179,8 @@ "h": 23 }, "frame": { - "x": 194, - "y": 24, + "x": 41, + "y": 168, "w": 22, "h": 23 } @@ -1179,96 +1200,12 @@ "h": 23 }, "frame": { - "x": 216, - "y": 24, + "x": 41, + "y": 191, "w": 22, "h": 23 } }, - { - "filename": "healing_charm", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 23, - "h": 22 - }, - "frame": { - "x": 238, - "y": 24, - "w": 23, - "h": 22 - } - }, - { - "filename": "charcoal", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 261, - "y": 24, - "w": 22, - "h": 22 - } - }, - { - "filename": "dire_hit", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 283, - "y": 24, - "w": 22, - "h": 22 - } - }, - { - "filename": "pp_max", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 305, - "y": 24, - "w": 16, - "h": 24 - } - }, { "filename": "never_melt_ice", "rotated": false, @@ -1284,8 +1221,8 @@ "h": 23 }, "frame": { - "x": 49, - "y": 42, + "x": 41, + "y": 214, "w": 22, "h": 23 } @@ -1305,369 +1242,12 @@ "h": 24 }, "frame": { - "x": 49, - "y": 65, + "x": 42, + "y": 237, "w": 21, "h": 24 } }, - { - "filename": "petaya_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 23 - }, - "frame": { - "x": 71, - "y": 42, - "w": 22, - "h": 23 - } - }, - { - "filename": "reaper_cloth", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 23 - }, - "frame": { - "x": 70, - "y": 65, - "w": 22, - "h": 23 - } - }, - { - "filename": "sacred_ash", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 24, - "h": 20 - }, - "frame": { - "x": 93, - "y": 46, - "w": 24, - "h": 20 - } - }, - { - "filename": "soft_sand", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 24, - "h": 20 - }, - "frame": { - "x": 117, - "y": 46, - "w": 24, - "h": 20 - } - }, - { - "filename": "dna_splicers", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 92, - "y": 66, - "w": 22, - "h": 22 - } - }, - { - "filename": "electirizer", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 114, - "y": 66, - "w": 22, - "h": 22 - } - }, - { - "filename": "binding_band", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 23, - "h": 20 - }, - "frame": { - "x": 141, - "y": 47, - "w": 23, - "h": 20 - } - }, - { - "filename": "moon_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 6, - "w": 23, - "h": 21 - }, - "frame": { - "x": 164, - "y": 47, - "w": 23, - "h": 21 - } - }, - { - "filename": "deep_sea_tooth", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 21 - }, - "frame": { - "x": 187, - "y": 47, - "w": 22, - "h": 21 - } - }, - { - "filename": "enigma_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 209, - "y": 47, - "w": 22, - "h": 22 - } - }, - { - "filename": "ganlon_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 136, - "y": 67, - "w": 22, - "h": 22 - } - }, - { - "filename": "guard_spec", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 158, - "y": 68, - "w": 22, - "h": 22 - } - }, - { - "filename": "ice_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 180, - "y": 68, - "w": 22, - "h": 22 - } - }, - { - "filename": "liechi_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 21 - }, - "frame": { - "x": 202, - "y": 69, - "w": 22, - "h": 21 - } - }, - { - "filename": "relic_gold", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 9, - "y": 11, - "w": 15, - "h": 11 - }, - "frame": { - "x": 49, - "y": 89, - "w": 15, - "h": 11 - } - }, - { - "filename": "pp_up", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 55, - "y": 100, - "w": 16, - "h": 24 - } - }, - { - "filename": "dusk_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 21, - "h": 21 - }, - "frame": { - "x": 60, - "y": 124, - "w": 21, - "h": 21 - } - }, { "filename": "shiny_charm", "rotated": false, @@ -1683,8 +1263,8 @@ "h": 24 }, "frame": { - "x": 63, - "y": 145, + "x": 42, + "y": 261, "w": 21, "h": 24 } @@ -1704,12 +1284,453 @@ "h": 23 }, "frame": { - "x": 63, - "y": 169, + "x": 42, + "y": 285, "w": 21, "h": 23 } }, + { + "filename": "coupon", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 23, + "h": 19 + }, + "frame": { + "x": 42, + "y": 308, + "w": 23, + "h": 19 + } + }, + { + "filename": "stick", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 23, + "h": 23 + }, + "frame": { + "x": 55, + "y": 47, + "w": 23, + "h": 23 + } + }, + { + "filename": "healing_charm", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 23, + "h": 22 + }, + "frame": { + "x": 78, + "y": 47, + "w": 23, + "h": 22 + } + }, + { + "filename": "charcoal", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 101, + "y": 47, + "w": 22, + "h": 22 + } + }, + { + "filename": "dire_hit", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 123, + "y": 47, + "w": 22, + "h": 22 + } + }, + { + "filename": "dna_splicers", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 145, + "y": 47, + "w": 22, + "h": 22 + } + }, + { + "filename": "electirizer", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 167, + "y": 47, + "w": 22, + "h": 22 + } + }, + { + "filename": "binding_band", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 23, + "h": 20 + }, + "frame": { + "x": 55, + "y": 70, + "w": 23, + "h": 20 + } + }, + { + "filename": "moon_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 23, + "h": 21 + }, + "frame": { + "x": 78, + "y": 69, + "w": 23, + "h": 21 + } + }, + { + "filename": "sacred_ash", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 24, + "h": 20 + }, + "frame": { + "x": 101, + "y": 69, + "w": 24, + "h": 20 + } + }, + { + "filename": "soft_sand", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 24, + "h": 20 + }, + "frame": { + "x": 125, + "y": 69, + "w": 24, + "h": 20 + } + }, + { + "filename": "reviver_seed", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 8, + "w": 23, + "h": 20 + }, + "frame": { + "x": 149, + "y": 69, + "w": 23, + "h": 20 + } + }, + { + "filename": "apicot_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 19, + "h": 20 + }, + "frame": { + "x": 172, + "y": 69, + "w": 19, + "h": 20 + } + }, + { + "filename": "petaya_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 23 + }, + "frame": { + "x": 54, + "y": 90, + "w": 22, + "h": 23 + } + }, + { + "filename": "reaper_cloth", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 23 + }, + "frame": { + "x": 76, + "y": 90, + "w": 22, + "h": 23 + } + }, + { + "filename": "relic_gold", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 9, + "y": 11, + "w": 15, + "h": 11 + }, + "frame": { + "x": 54, + "y": 113, + "w": 15, + "h": 11 + } + }, + { + "filename": "dragon_scale", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 24, + "h": 18 + }, + "frame": { + "x": 69, + "y": 113, + "w": 24, + "h": 18 + } + }, + { + "filename": "enigma_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 63, + "y": 131, + "w": 22, + "h": 22 + } + }, + { + "filename": "ganlon_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 63, + "y": 153, + "w": 22, + "h": 22 + } + }, + { + "filename": "guard_spec", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 63, + "y": 175, + "w": 22, + "h": 22 + } + }, + { + "filename": "ice_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 63, + "y": 197, + "w": 22, + "h": 22 + } + }, { "filename": "lansat_berry", "rotated": false, @@ -1725,8 +1746,8 @@ "h": 23 }, "frame": { - "x": 65, - "y": 192, + "x": 63, + "y": 219, "w": 21, "h": 23 } @@ -1746,12 +1767,201 @@ "h": 23 }, "frame": { - "x": 65, - "y": 215, + "x": 63, + "y": 242, "w": 21, "h": 23 } }, + { + "filename": "red_orb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 20, + "h": 24 + }, + "frame": { + "x": 63, + "y": 265, + "w": 20, + "h": 24 + } + }, + { + "filename": "blunder_policy", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 19 + }, + "frame": { + "x": 63, + "y": 289, + "w": 22, + "h": 19 + } + }, + { + "filename": "golden_mystic_ticket", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 23, + "h": 19 + }, + "frame": { + "x": 65, + "y": 308, + "w": 23, + "h": 19 + } + }, + { + "filename": "max_lure", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 17, + "h": 24 + }, + "frame": { + "x": 85, + "y": 131, + "w": 17, + "h": 24 + } + }, + { + "filename": "super_lure", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 17, + "h": 24 + }, + "frame": { + "x": 85, + "y": 155, + "w": 17, + "h": 24 + } + }, + { + "filename": "hyper_potion", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 17, + "h": 23 + }, + "frame": { + "x": 85, + "y": 179, + "w": 17, + "h": 23 + } + }, + { + "filename": "big_mushroom", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 19, + "h": 19 + }, + "frame": { + "x": 85, + "y": 202, + "w": 19, + "h": 19 + } + }, + { + "filename": "mystic_water", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 5, + "w": 20, + "h": 23 + }, + "frame": { + "x": 84, + "y": 221, + "w": 20, + "h": 23 + } + }, + { + "filename": "dawn_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 21 + }, + "frame": { + "x": 84, + "y": 244, + "w": 20, + "h": 21 + } + }, { "filename": "sharp_beak", "rotated": false, @@ -1767,12 +1977,96 @@ "h": 23 }, "frame": { - "x": 65, - "y": 238, + "x": 83, + "y": 265, "w": 21, "h": 23 } }, + { + "filename": "big_nugget", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 85, + "y": 288, + "w": 20, + "h": 20 + } + }, + { + "filename": "mystic_ticket", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 23, + "h": 19 + }, + "frame": { + "x": 88, + "y": 308, + "w": 23, + "h": 19 + } + }, + { + "filename": "relic_crown", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 23, + "h": 18 + }, + "frame": { + "x": 93, + "y": 113, + "w": 23, + "h": 18 + } + }, + { + "filename": "potion", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 17, + "h": 23 + }, + "frame": { + "x": 98, + "y": 90, + "w": 17, + "h": 23 + } + }, { "filename": "magmarizer", "rotated": false, @@ -1788,8 +2082,8 @@ "h": 22 }, "frame": { - "x": 65, - "y": 261, + "x": 115, + "y": 89, "w": 22, "h": 22 } @@ -1809,54 +2103,12 @@ "h": 22 }, "frame": { - "x": 65, - "y": 283, + "x": 137, + "y": 89, "w": 22, "h": 22 } }, - { - "filename": "abomasite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 65, - "y": 305, - "w": 16, - "h": 16 - } - }, - { - "filename": "absolite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 81, - "y": 305, - "w": 16, - "h": 16 - } - }, { "filename": "protector", "rotated": false, @@ -1872,12 +2124,33 @@ "h": 22 }, "frame": { - "x": 71, - "y": 88, + "x": 159, + "y": 89, "w": 22, "h": 22 } }, + { + "filename": "shell_bell", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 23, + "h": 20 + }, + "frame": { + "x": 116, + "y": 111, + "w": 23, + "h": 20 + } + }, { "filename": "shed_shell", "rotated": false, @@ -1893,159 +2166,12 @@ "h": 22 }, "frame": { - "x": 93, - "y": 88, + "x": 102, + "y": 131, "w": 22, "h": 22 } }, - { - "filename": "poison_barb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 21, - "h": 21 - }, - "frame": { - "x": 115, - "y": 88, - "w": 21, - "h": 21 - } - }, - { - "filename": "deep_sea_scale", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 20 - }, - "frame": { - "x": 136, - "y": 89, - "w": 22, - "h": 20 - } - }, - { - "filename": "coupon", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 23, - "h": 19 - }, - "frame": { - "x": 158, - "y": 90, - "w": 23, - "h": 19 - } - }, - { - "filename": "golden_mystic_ticket", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 23, - "h": 19 - }, - "frame": { - "x": 181, - "y": 90, - "w": 23, - "h": 19 - } - }, - { - "filename": "big_nugget", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 204, - "y": 90, - "w": 20, - "h": 20 - } - }, - { - "filename": "protein", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 224, - "y": 69, - "w": 16, - "h": 24 - } - }, - { - "filename": "leftovers", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 15, - "h": 22 - }, - "frame": { - "x": 231, - "y": 47, - "w": 15, - "h": 22 - } - }, { "filename": "starf_berry", "rotated": false, @@ -2061,8 +2187,8 @@ "h": 22 }, "frame": { - "x": 246, - "y": 46, + "x": 102, + "y": 153, "w": 22, "h": 22 } @@ -2082,14 +2208,14 @@ "h": 22 }, "frame": { - "x": 268, - "y": 46, + "x": 102, + "y": 175, "w": 22, "h": 22 } }, { - "filename": "full_heal", + "filename": "deep_sea_scale", "rotated": false, "trimmed": true, "sourceSize": { @@ -2097,81 +2223,18 @@ "h": 32 }, "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 15, - "h": 23 - }, - "frame": { - "x": 290, - "y": 46, - "w": 15, - "h": 23 - } - }, - { - "filename": "unknown", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 305, - "y": 48, - "w": 16, - "h": 24 - } - }, - { - "filename": "apicot_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, + "x": 5, "y": 6, - "w": 19, + "w": 22, "h": 20 }, "frame": { - "x": 224, - "y": 93, - "w": 19, + "x": 139, + "y": 111, + "w": 22, "h": 20 } }, - { - "filename": "super_lure", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 17, - "h": 24 - }, - "frame": { - "x": 240, - "y": 69, - "w": 17, - "h": 24 - } - }, { "filename": "tm_bug", "rotated": false, @@ -2187,54 +2250,12 @@ "h": 22 }, "frame": { - "x": 257, - "y": 68, + "x": 124, + "y": 131, "w": 22, "h": 22 } }, - { - "filename": "candy_jar", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 19, - "h": 20 - }, - "frame": { - "x": 243, - "y": 93, - "w": 19, - "h": 20 - } - }, - { - "filename": "hyper_potion", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 17, - "h": 23 - }, - "frame": { - "x": 262, - "y": 90, - "w": 17, - "h": 23 - } - }, { "filename": "tm_dark", "rotated": false, @@ -2250,33 +2271,12 @@ "h": 22 }, "frame": { - "x": 279, - "y": 69, + "x": 124, + "y": 153, "w": 22, "h": 22 } }, - { - "filename": "mystic_water", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 20, - "h": 23 - }, - "frame": { - "x": 301, - "y": 72, - "w": 20, - "h": 23 - } - }, { "filename": "tm_dragon", "rotated": false, @@ -2292,14 +2292,14 @@ "h": 22 }, "frame": { - "x": 279, - "y": 91, + "x": 124, + "y": 175, "w": 22, "h": 22 } }, { - "filename": "sitrus_berry", + "filename": "blue_orb", "rotated": false, "trimmed": true, "sourceSize": { @@ -2308,15 +2308,15 @@ }, "spriteSourceSize": { "x": 6, - "y": 5, + "y": 6, "w": 20, - "h": 22 + "h": 20 }, "frame": { - "x": 301, - "y": 95, + "x": 161, + "y": 111, "w": 20, - "h": 22 + "h": 20 } }, { @@ -2334,33 +2334,12 @@ "h": 22 }, "frame": { - "x": 81, - "y": 110, + "x": 146, + "y": 131, "w": 22, "h": 22 } }, - { - "filename": "metal_coat", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 19, - "h": 22 - }, - "frame": { - "x": 103, - "y": 110, - "w": 19, - "h": 22 - } - }, { "filename": "tm_fairy", "rotated": false, @@ -2376,8 +2355,8 @@ "h": 22 }, "frame": { - "x": 122, - "y": 109, + "x": 146, + "y": 153, "w": 22, "h": 22 } @@ -2397,8 +2376,8 @@ "h": 22 }, "frame": { - "x": 144, - "y": 109, + "x": 146, + "y": 175, "w": 22, "h": 22 } @@ -2418,138 +2397,12 @@ "h": 22 }, "frame": { - "x": 166, - "y": 109, + "x": 104, + "y": 197, "w": 22, "h": 22 } }, - { - "filename": "zinc", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 188, - "y": 109, - "w": 16, - "h": 24 - } - }, - { - "filename": "gb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 204, - "y": 110, - "w": 20, - "h": 20 - } - }, - { - "filename": "black_glasses", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 23, - "h": 17 - }, - "frame": { - "x": 224, - "y": 113, - "w": 23, - "h": 17 - } - }, - { - "filename": "mystic_ticket", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 23, - "h": 19 - }, - "frame": { - "x": 247, - "y": 113, - "w": 23, - "h": 19 - } - }, - { - "filename": "pair_of_tickets", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 23, - "h": 19 - }, - "frame": { - "x": 270, - "y": 113, - "w": 23, - "h": 19 - } - }, - { - "filename": "silver_powder", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 11, - "w": 24, - "h": 15 - }, - "frame": { - "x": 293, - "y": 117, - "w": 24, - "h": 15 - } - }, { "filename": "tm_flying", "rotated": false, @@ -2565,8 +2418,8 @@ "h": 22 }, "frame": { - "x": 84, - "y": 132, + "x": 104, + "y": 219, "w": 22, "h": 22 } @@ -2586,33 +2439,12 @@ "h": 22 }, "frame": { - "x": 84, - "y": 154, + "x": 126, + "y": 197, "w": 22, "h": 22 } }, - { - "filename": "potion", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 17, - "h": 23 - }, - "frame": { - "x": 106, - "y": 132, - "w": 17, - "h": 23 - } - }, { "filename": "tm_grass", "rotated": false, @@ -2628,8 +2460,8 @@ "h": 22 }, "frame": { - "x": 123, - "y": 131, + "x": 104, + "y": 241, "w": 22, "h": 22 } @@ -2649,54 +2481,12 @@ "h": 22 }, "frame": { - "x": 145, - "y": 131, + "x": 126, + "y": 219, "w": 22, "h": 22 } }, - { - "filename": "shiny_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 21, - "h": 21 - }, - "frame": { - "x": 167, - "y": 131, - "w": 21, - "h": 21 - } - }, - { - "filename": "metronome", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 17, - "h": 22 - }, - "frame": { - "x": 106, - "y": 155, - "w": 17, - "h": 22 - } - }, { "filename": "tm_ice", "rotated": false, @@ -2712,8 +2502,8 @@ "h": 22 }, "frame": { - "x": 123, - "y": 153, + "x": 104, + "y": 263, "w": 22, "h": 22 } @@ -2733,8 +2523,8 @@ "h": 22 }, "frame": { - "x": 145, - "y": 153, + "x": 126, + "y": 241, "w": 22, "h": 22 } @@ -2754,14 +2544,98 @@ "h": 22 }, "frame": { - "x": 167, - "y": 152, + "x": 126, + "y": 263, "w": 22, "h": 22 } }, { - "filename": "big_mushroom", + "filename": "super_potion", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 17, + "h": 23 + }, + "frame": { + "x": 105, + "y": 285, + "w": 17, + "h": 23 + } + }, + { + "filename": "pair_of_tickets", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 23, + "h": 19 + }, + "frame": { + "x": 111, + "y": 308, + "w": 23, + "h": 19 + } + }, + { + "filename": "full_heal", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 9, + "y": 4, + "w": 15, + "h": 23 + }, + "frame": { + "x": 122, + "y": 285, + "w": 15, + "h": 23 + } + }, + { + "filename": "dubious_disc", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 22, + "h": 19 + }, + "frame": { + "x": 134, + "y": 308, + "w": 22, + "h": 19 + } + }, + { + "filename": "sitrus_berry", "rotated": false, "trimmed": true, "sourceSize": { @@ -2770,15 +2644,15 @@ }, "spriteSourceSize": { "x": 6, - "y": 6, - "w": 19, - "h": 19 + "y": 5, + "w": 20, + "h": 22 }, "frame": { - "x": 188, - "y": 133, - "w": 19, - "h": 19 + "x": 148, + "y": 197, + "w": 20, + "h": 22 } }, { @@ -2796,8 +2670,8 @@ "h": 22 }, "frame": { - "x": 207, - "y": 130, + "x": 148, + "y": 219, "w": 22, "h": 22 } @@ -2817,96 +2691,12 @@ "h": 22 }, "frame": { - "x": 189, - "y": 152, + "x": 148, + "y": 241, "w": 22, "h": 22 } }, - { - "filename": "razor_fang", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 18, - "h": 20 - }, - "frame": { - "x": 229, - "y": 130, - "w": 18, - "h": 20 - } - }, - { - "filename": "relic_crown", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 23, - "h": 18 - }, - "frame": { - "x": 247, - "y": 132, - "w": 23, - "h": 18 - } - }, - { - "filename": "reviver_seed", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 8, - "w": 23, - "h": 20 - }, - "frame": { - "x": 270, - "y": 132, - "w": 23, - "h": 20 - } - }, - { - "filename": "shell_bell", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 23, - "h": 20 - }, - "frame": { - "x": 293, - "y": 132, - "w": 23, - "h": 20 - } - }, { "filename": "tm_steel", "rotated": false, @@ -2922,8 +2712,8 @@ "h": 22 }, "frame": { - "x": 211, - "y": 152, + "x": 148, + "y": 263, "w": 22, "h": 22 } @@ -2943,14 +2733,119 @@ "h": 22 }, "frame": { - "x": 233, - "y": 150, + "x": 137, + "y": 285, "w": 22, "h": 22 } }, { - "filename": "aerodactylite", + "filename": "fairy_feather", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 22, + "h": 20 + }, + "frame": { + "x": 156, + "y": 307, + "w": 22, + "h": 20 + } + }, + { + "filename": "metal_coat", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 5, + "w": 19, + "h": 22 + }, + "frame": { + "x": 159, + "y": 285, + "w": 19, + "h": 22 + } + }, + { + "filename": "pp_max", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 168, + "y": 131, + "w": 16, + "h": 24 + } + }, + { + "filename": "pp_up", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 168, + "y": 155, + "w": 16, + "h": 24 + } + }, + { + "filename": "protein", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 168, + "y": 179, + "w": 16, + "h": 24 + } + }, + { + "filename": "abomasite", "rotated": false, "trimmed": true, "sourceSize": { @@ -2964,14 +2859,77 @@ "h": 16 }, "frame": { - "x": 84, - "y": 176, + "x": 168, + "y": 203, "w": 16, "h": 16 } }, { - "filename": "super_potion", + "filename": "unknown", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 170, + "y": 219, + "w": 16, + "h": 24 + } + }, + { + "filename": "zinc", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 170, + "y": 243, + "w": 16, + "h": 24 + } + }, + { + "filename": "wl_ability_urge", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 170, + "y": 267, + "w": 20, + "h": 18 + } + }, + { + "filename": "leftovers", "rotated": false, "trimmed": true, "sourceSize": { @@ -2981,14 +2939,77 @@ "spriteSourceSize": { "x": 8, "y": 5, - "w": 17, - "h": 23 + "w": 15, + "h": 22 }, "frame": { - "x": 86, - "y": 192, + "x": 178, + "y": 285, + "w": 15, + "h": 22 + } + }, + { + "filename": "gb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 178, + "y": 307, + "w": 20, + "h": 20 + } + }, + { + "filename": "metronome", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 5, "w": 17, - "h": 23 + "h": 22 + }, + "frame": { + "x": 181, + "y": 89, + "w": 17, + "h": 22 + } + }, + { + "filename": "candy_jar", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 19, + "h": 20 + }, + "frame": { + "x": 181, + "y": 111, + "w": 19, + "h": 20 } }, { @@ -3006,8 +3027,8 @@ "h": 22 }, "frame": { - "x": 86, - "y": 215, + "x": 184, + "y": 131, "w": 17, "h": 22 } @@ -3027,8 +3048,8 @@ "h": 22 }, "frame": { - "x": 86, - "y": 237, + "x": 184, + "y": 153, "w": 22, "h": 22 } @@ -3048,8 +3069,8 @@ "h": 22 }, "frame": { - "x": 87, - "y": 259, + "x": 184, + "y": 175, "w": 22, "h": 22 } @@ -3069,138 +3090,12 @@ "h": 22 }, "frame": { - "x": 87, - "y": 281, + "x": 184, + "y": 197, "w": 22, "h": 22 } }, - { - "filename": "wl_ability_urge", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 97, - "y": 303, - "w": 20, - "h": 18 - } - }, - { - "filename": "prism_scale", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 9, - "y": 8, - "w": 15, - "h": 15 - }, - "frame": { - "x": 255, - "y": 150, - "w": 15, - "h": 15 - } - }, - { - "filename": "wise_glasses", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 23, - "h": 17 - }, - "frame": { - "x": 270, - "y": 152, - "w": 23, - "h": 17 - } - }, - { - "filename": "blunder_policy", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 19 - }, - "frame": { - "x": 293, - "y": 152, - "w": 22, - "h": 19 - } - }, - { - "filename": "dubious_disc", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 22, - "h": 19 - }, - "frame": { - "x": 123, - "y": 175, - "w": 22, - "h": 19 - } - }, - { - "filename": "fairy_feather", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 22, - "h": 20 - }, - "frame": { - "x": 145, - "y": 175, - "w": 22, - "h": 20 - } - }, { "filename": "x_defense", "rotated": false, @@ -3216,8 +3111,8 @@ "h": 22 }, "frame": { - "x": 167, - "y": 174, + "x": 186, + "y": 219, "w": 22, "h": 22 } @@ -3237,8 +3132,8 @@ "h": 22 }, "frame": { - "x": 189, - "y": 174, + "x": 186, + "y": 241, "w": 22, "h": 22 } @@ -3258,8 +3153,8 @@ "h": 22 }, "frame": { - "x": 211, - "y": 174, + "x": 190, + "y": 263, "w": 22, "h": 22 } @@ -3279,8 +3174,8 @@ "h": 22 }, "frame": { - "x": 233, - "y": 172, + "x": 193, + "y": 285, "w": 22, "h": 22 } @@ -3300,14 +3195,77 @@ "h": 20 }, "frame": { - "x": 103, - "y": 177, + "x": 198, + "y": 307, "w": 20, "h": 20 } }, { - "filename": "zoom_lens", + "filename": "deep_sea_tooth", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 21 + }, + "frame": { + "x": 189, + "y": 47, + "w": 22, + "h": 21 + } + }, + { + "filename": "dusk_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 21, + "h": 21 + }, + "frame": { + "x": 191, + "y": 68, + "w": 21, + "h": 21 + } + }, + { + "filename": "liechi_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 21 + }, + "frame": { + "x": 211, + "y": 46, + "w": 22, + "h": 21 + } + }, + { + "filename": "poison_barb", "rotated": false, "trimmed": true, "sourceSize": { @@ -3321,14 +3279,14 @@ "h": 21 }, "frame": { - "x": 103, - "y": 197, + "x": 212, + "y": 67, "w": 21, "h": 21 } }, { - "filename": "upgrade", + "filename": "shiny_stone", "rotated": false, "trimmed": true, "sourceSize": { @@ -3337,15 +3295,15 @@ }, "spriteSourceSize": { "x": 5, - "y": 7, - "w": 22, - "h": 19 + "y": 6, + "w": 21, + "h": 21 }, "frame": { - "x": 103, - "y": 218, - "w": 22, - "h": 19 + "x": 198, + "y": 89, + "w": 21, + "h": 21 } }, { @@ -3363,12 +3321,54 @@ "h": 21 }, "frame": { - "x": 108, - "y": 237, + "x": 200, + "y": 110, "w": 19, "h": 21 } }, + { + "filename": "zoom_lens", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 21, + "h": 21 + }, + "frame": { + "x": 201, + "y": 131, + "w": 21, + "h": 21 + } + }, + { + "filename": "golden_egg", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 6, + "w": 17, + "h": 20 + }, + "frame": { + "x": 206, + "y": 152, + "w": 17, + "h": 20 + } + }, { "filename": "hard_stone", "rotated": false, @@ -3384,8 +3384,8 @@ "h": 20 }, "frame": { - "x": 109, - "y": 258, + "x": 206, + "y": 172, "w": 19, "h": 20 } @@ -3405,12 +3405,33 @@ "h": 20 }, "frame": { - "x": 109, - "y": 278, + "x": 206, + "y": 192, "w": 20, "h": 20 } }, + { + "filename": "lucky_egg", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 6, + "w": 17, + "h": 20 + }, + "frame": { + "x": 219, + "y": 88, + "w": 17, + "h": 20 + } + }, { "filename": "pb", "rotated": false, @@ -3426,33 +3447,12 @@ "h": 20 }, "frame": { - "x": 124, - "y": 194, + "x": 219, + "y": 108, "w": 20, "h": 20 } }, - { - "filename": "lum_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 7, - "w": 20, - "h": 19 - }, - "frame": { - "x": 144, - "y": 195, - "w": 20, - "h": 19 - } - }, { "filename": "pb_gold", "rotated": false, @@ -3468,8 +3468,8 @@ "h": 20 }, "frame": { - "x": 125, - "y": 214, + "x": 222, + "y": 128, "w": 20, "h": 20 } @@ -3489,8 +3489,8 @@ "h": 20 }, "frame": { - "x": 145, - "y": 214, + "x": 223, + "y": 148, "w": 20, "h": 20 } @@ -3510,56 +3510,14 @@ "h": 20 }, "frame": { - "x": 127, - "y": 234, + "x": 225, + "y": 168, "w": 20, "h": 20 } }, { - "filename": "golden_egg", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 17, - "h": 20 - }, - "frame": { - "x": 147, - "y": 234, - "w": 17, - "h": 20 - } - }, - { - "filename": "wl_antidote", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 164, - "y": 196, - "w": 20, - "h": 18 - } - }, - { - "filename": "miracle_seed", + "filename": "lum_berry", "rotated": false, "trimmed": true, "sourceSize": { @@ -3569,16 +3527,79 @@ "spriteSourceSize": { "x": 6, "y": 7, - "w": 19, + "w": 20, "h": 19 }, "frame": { - "x": 165, - "y": 214, - "w": 19, + "x": 226, + "y": 188, + "w": 20, "h": 19 } }, + { + "filename": "upgrade", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 22, + "h": 19 + }, + "frame": { + "x": 233, + "y": 47, + "w": 22, + "h": 19 + } + }, + { + "filename": "black_glasses", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 23, + "h": 17 + }, + "frame": { + "x": 255, + "y": 47, + "w": 23, + "h": 17 + } + }, + { + "filename": "wise_glasses", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 23, + "h": 17 + }, + "frame": { + "x": 278, + "y": 47, + "w": 23, + "h": 17 + } + }, { "filename": "razor_claw", "rotated": false, @@ -3594,12 +3615,96 @@ "h": 19 }, "frame": { - "x": 184, - "y": 196, + "x": 233, + "y": 66, "w": 20, "h": 19 } }, + { + "filename": "miracle_seed", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 7, + "w": 19, + "h": 19 + }, + "frame": { + "x": 236, + "y": 85, + "w": 19, + "h": 19 + } + }, + { + "filename": "oval_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 7, + "w": 18, + "h": 19 + }, + "frame": { + "x": 239, + "y": 104, + "w": 18, + "h": 19 + } + }, + { + "filename": "silver_powder", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 11, + "w": 24, + "h": 15 + }, + "frame": { + "x": 301, + "y": 48, + "w": 24, + "h": 15 + } + }, + { + "filename": "wl_antidote", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 208, + "y": 212, + "w": 20, + "h": 18 + } + }, { "filename": "wl_awakening", "rotated": false, @@ -3615,12 +3720,33 @@ "h": 18 }, "frame": { - "x": 184, - "y": 215, + "x": 208, + "y": 230, "w": 20, "h": 18 } }, + { + "filename": "prism_scale", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 9, + "y": 8, + "w": 15, + "h": 15 + }, + "frame": { + "x": 208, + "y": 248, + "w": 15, + "h": 15 + } + }, { "filename": "wl_burn_heal", "rotated": false, @@ -3636,8 +3762,8 @@ "h": 18 }, "frame": { - "x": 204, - "y": 196, + "x": 228, + "y": 207, "w": 20, "h": 18 } @@ -3657,8 +3783,8 @@ "h": 18 }, "frame": { - "x": 204, - "y": 214, + "x": 228, + "y": 225, "w": 20, "h": 18 } @@ -3678,96 +3804,12 @@ "h": 18 }, "frame": { - "x": 128, - "y": 254, + "x": 212, + "y": 263, "w": 20, "h": 18 } }, - { - "filename": "lucky_egg", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 17, - "h": 20 - }, - "frame": { - "x": 148, - "y": 254, - "w": 17, - "h": 20 - } - }, - { - "filename": "oval_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 18, - "h": 19 - }, - "frame": { - "x": 129, - "y": 272, - "w": 18, - "h": 19 - } - }, - { - "filename": "everstone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 17 - }, - "frame": { - "x": 147, - "y": 274, - "w": 20, - "h": 17 - } - }, - { - "filename": "revive", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 12, - "h": 17 - }, - "frame": { - "x": 255, - "y": 165, - "w": 12, - "h": 17 - } - }, { "filename": "wl_full_restore", "rotated": false, @@ -3783,8 +3825,8 @@ "h": 18 }, "frame": { - "x": 267, - "y": 169, + "x": 215, + "y": 281, "w": 20, "h": 18 } @@ -3804,8 +3846,8 @@ "h": 18 }, "frame": { - "x": 287, - "y": 171, + "x": 242, + "y": 123, "w": 20, "h": 18 } @@ -3825,8 +3867,8 @@ "h": 18 }, "frame": { - "x": 224, - "y": 196, + "x": 243, + "y": 141, "w": 20, "h": 18 } @@ -3846,8 +3888,8 @@ "h": 18 }, "frame": { - "x": 224, - "y": 214, + "x": 218, + "y": 299, "w": 20, "h": 18 } @@ -3867,8 +3909,8 @@ "h": 18 }, "frame": { - "x": 129, - "y": 291, + "x": 245, + "y": 159, "w": 20, "h": 18 } @@ -3888,12 +3930,33 @@ "h": 18 }, "frame": { - "x": 149, - "y": 291, + "x": 246, + "y": 177, "w": 20, "h": 18 } }, + { + "filename": "everstone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 17 + }, + "frame": { + "x": 228, + "y": 243, + "w": 20, + "h": 17 + } + }, { "filename": "wl_max_potion", "rotated": false, @@ -3909,8 +3972,8 @@ "h": 18 }, "frame": { - "x": 244, - "y": 194, + "x": 232, + "y": 260, "w": 20, "h": 18 } @@ -3930,8 +3993,8 @@ "h": 18 }, "frame": { - "x": 244, - "y": 212, + "x": 235, + "y": 278, "w": 20, "h": 18 } @@ -3951,8 +4014,8 @@ "h": 18 }, "frame": { - "x": 264, - "y": 187, + "x": 238, + "y": 296, "w": 20, "h": 18 } @@ -3972,8 +4035,8 @@ "h": 18 }, "frame": { - "x": 264, - "y": 205, + "x": 248, + "y": 195, "w": 20, "h": 18 } @@ -3993,8 +4056,8 @@ "h": 18 }, "frame": { - "x": 284, - "y": 189, + "x": 248, + "y": 213, "w": 20, "h": 18 } @@ -4014,8 +4077,8 @@ "h": 18 }, "frame": { - "x": 284, - "y": 207, + "x": 248, + "y": 231, "w": 20, "h": 18 } @@ -4035,12 +4098,75 @@ "h": 18 }, "frame": { - "x": 264, - "y": 223, + "x": 252, + "y": 249, "w": 20, "h": 18 } }, + { + "filename": "absolite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 255, + "y": 267, + "w": 16, + "h": 16 + } + }, + { + "filename": "revive", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 10, + "y": 8, + "w": 12, + "h": 17 + }, + "frame": { + "x": 253, + "y": 66, + "w": 12, + "h": 17 + } + }, + { + "filename": "aerodactylite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 265, + "y": 64, + "w": 16, + "h": 16 + } + }, { "filename": "aggronite", "rotated": false, @@ -4056,8 +4182,8 @@ "h": 16 }, "frame": { - "x": 284, - "y": 225, + "x": 281, + "y": 64, "w": 16, "h": 16 } @@ -4077,8 +4203,8 @@ "h": 16 }, "frame": { - "x": 300, - "y": 225, + "x": 255, + "y": 83, "w": 16, "h": 16 } @@ -4098,8 +4224,8 @@ "h": 16 }, "frame": { - "x": 304, - "y": 189, + "x": 271, + "y": 80, "w": 16, "h": 16 } @@ -4119,8 +4245,8 @@ "h": 16 }, "frame": { - "x": 304, - "y": 205, + "x": 287, + "y": 80, "w": 16, "h": 16 } @@ -4140,8 +4266,8 @@ "h": 16 }, "frame": { - "x": 244, - "y": 230, + "x": 297, + "y": 64, "w": 16, "h": 16 } @@ -4161,8 +4287,8 @@ "h": 16 }, "frame": { - "x": 204, - "y": 232, + "x": 303, + "y": 80, "w": 16, "h": 16 } @@ -4182,8 +4308,8 @@ "h": 16 }, "frame": { - "x": 220, - "y": 232, + "x": 257, + "y": 99, "w": 16, "h": 16 } @@ -4203,8 +4329,8 @@ "h": 16 }, "frame": { - "x": 260, - "y": 241, + "x": 273, + "y": 96, "w": 16, "h": 16 } @@ -4224,8 +4350,8 @@ "h": 16 }, "frame": { - "x": 276, - "y": 241, + "x": 289, + "y": 96, "w": 16, "h": 16 } @@ -4245,8 +4371,8 @@ "h": 16 }, "frame": { - "x": 292, - "y": 241, + "x": 305, + "y": 96, "w": 16, "h": 16 } @@ -4266,8 +4392,8 @@ "h": 16 }, "frame": { - "x": 164, - "y": 234, + "x": 262, + "y": 115, "w": 16, "h": 16 } @@ -4287,8 +4413,8 @@ "h": 16 }, "frame": { - "x": 180, - "y": 233, + "x": 278, + "y": 112, "w": 16, "h": 16 } @@ -4308,8 +4434,8 @@ "h": 16 }, "frame": { - "x": 165, - "y": 250, + "x": 294, + "y": 112, "w": 16, "h": 16 } @@ -4329,8 +4455,8 @@ "h": 16 }, "frame": { - "x": 181, - "y": 249, + "x": 310, + "y": 112, "w": 16, "h": 16 } @@ -4350,8 +4476,8 @@ "h": 16 }, "frame": { - "x": 197, - "y": 248, + "x": 263, + "y": 131, "w": 16, "h": 16 } @@ -4371,8 +4497,8 @@ "h": 16 }, "frame": { - "x": 213, - "y": 248, + "x": 279, + "y": 128, "w": 16, "h": 16 } @@ -4392,8 +4518,8 @@ "h": 16 }, "frame": { - "x": 229, - "y": 248, + "x": 295, + "y": 128, "w": 16, "h": 16 } @@ -4413,8 +4539,8 @@ "h": 16 }, "frame": { - "x": 167, - "y": 266, + "x": 311, + "y": 128, "w": 16, "h": 16 } @@ -4434,8 +4560,8 @@ "h": 16 }, "frame": { - "x": 183, - "y": 265, + "x": 279, + "y": 144, "w": 16, "h": 16 } @@ -4455,8 +4581,8 @@ "h": 16 }, "frame": { - "x": 199, - "y": 264, + "x": 295, + "y": 144, "w": 16, "h": 16 } @@ -4476,8 +4602,8 @@ "h": 16 }, "frame": { - "x": 215, - "y": 264, + "x": 311, + "y": 144, "w": 16, "h": 16 } @@ -4497,8 +4623,8 @@ "h": 16 }, "frame": { - "x": 231, - "y": 264, + "x": 265, + "y": 160, "w": 16, "h": 16 } @@ -4518,8 +4644,8 @@ "h": 16 }, "frame": { - "x": 169, - "y": 282, + "x": 281, + "y": 160, "w": 16, "h": 16 } @@ -4539,8 +4665,8 @@ "h": 16 }, "frame": { - "x": 185, - "y": 281, + "x": 297, + "y": 160, "w": 16, "h": 16 } @@ -4560,8 +4686,8 @@ "h": 16 }, "frame": { - "x": 201, - "y": 280, + "x": 266, + "y": 176, "w": 16, "h": 16 } @@ -4581,8 +4707,8 @@ "h": 16 }, "frame": { - "x": 217, - "y": 280, + "x": 282, + "y": 176, "w": 16, "h": 16 } @@ -4602,8 +4728,8 @@ "h": 16 }, "frame": { - "x": 233, - "y": 280, + "x": 298, + "y": 176, "w": 16, "h": 16 } @@ -4623,8 +4749,8 @@ "h": 16 }, "frame": { - "x": 169, - "y": 298, + "x": 268, + "y": 192, "w": 16, "h": 16 } @@ -4644,8 +4770,8 @@ "h": 16 }, "frame": { - "x": 185, - "y": 297, + "x": 268, + "y": 208, "w": 16, "h": 16 } @@ -4665,8 +4791,8 @@ "h": 16 }, "frame": { - "x": 201, - "y": 296, + "x": 284, + "y": 192, "w": 16, "h": 16 } @@ -4686,8 +4812,8 @@ "h": 16 }, "frame": { - "x": 217, - "y": 296, + "x": 268, + "y": 224, "w": 16, "h": 16 } @@ -4707,8 +4833,8 @@ "h": 16 }, "frame": { - "x": 233, - "y": 296, + "x": 284, + "y": 208, "w": 16, "h": 16 } @@ -4728,8 +4854,8 @@ "h": 16 }, "frame": { - "x": 247, - "y": 257, + "x": 284, + "y": 224, "w": 16, "h": 16 } @@ -4749,8 +4875,8 @@ "h": 16 }, "frame": { - "x": 263, - "y": 257, + "x": 300, + "y": 192, "w": 16, "h": 16 } @@ -4770,8 +4896,8 @@ "h": 16 }, "frame": { - "x": 279, - "y": 257, + "x": 300, + "y": 208, "w": 16, "h": 16 } @@ -4791,8 +4917,8 @@ "h": 16 }, "frame": { - "x": 295, - "y": 257, + "x": 300, + "y": 224, "w": 16, "h": 16 } @@ -4812,8 +4938,8 @@ "h": 16 }, "frame": { - "x": 249, - "y": 273, + "x": 272, + "y": 240, "w": 16, "h": 16 } @@ -4833,8 +4959,8 @@ "h": 16 }, "frame": { - "x": 249, - "y": 289, + "x": 288, + "y": 240, "w": 16, "h": 16 } @@ -4854,8 +4980,8 @@ "h": 16 }, "frame": { - "x": 249, - "y": 305, + "x": 304, + "y": 240, "w": 16, "h": 16 } @@ -4875,8 +5001,8 @@ "h": 16 }, "frame": { - "x": 265, - "y": 273, + "x": 272, + "y": 256, "w": 16, "h": 16 } @@ -4896,8 +5022,8 @@ "h": 16 }, "frame": { - "x": 265, - "y": 289, + "x": 288, + "y": 256, "w": 16, "h": 16 } @@ -4917,8 +5043,8 @@ "h": 16 }, "frame": { - "x": 265, - "y": 305, + "x": 304, + "y": 256, "w": 16, "h": 16 } @@ -4938,8 +5064,8 @@ "h": 16 }, "frame": { - "x": 281, - "y": 273, + "x": 271, + "y": 272, "w": 16, "h": 16 } @@ -4959,8 +5085,8 @@ "h": 16 }, "frame": { - "x": 281, - "y": 289, + "x": 287, + "y": 272, "w": 16, "h": 16 } @@ -4980,8 +5106,8 @@ "h": 16 }, "frame": { - "x": 281, - "y": 305, + "x": 303, + "y": 272, "w": 16, "h": 16 } @@ -5001,8 +5127,8 @@ "h": 16 }, "frame": { - "x": 297, - "y": 273, + "x": 258, + "y": 288, "w": 16, "h": 16 } @@ -5022,8 +5148,8 @@ "h": 16 }, "frame": { - "x": 297, - "y": 289, + "x": 274, + "y": 288, "w": 16, "h": 16 } @@ -5034,6 +5160,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:add9eb8b8733956530a2c48ab73c92b3:e3840500ae12890f9d66a76a719ccd1d:110e074689c9edd2c54833ce2e4d9270$" + "smartupdate": "$TexturePacker:SmartUpdate:6633a2c1c8ba5a849b0ed9650d9ac5a0:c4256b2cc1ff3ba479deffde19dd262a:110e074689c9edd2c54833ce2e4d9270$" } } diff --git a/public/images/items.png b/public/images/items.png index 47807a206c7cc5b60b202e4c74ca0f21f0c58ea4..f4146907be6a02bdd257b6ec1598e02902cc37e7 100644 GIT binary patch literal 34023 zcmYJa1yob-A3u&rhqMeFIa*LaYNX_bNVhaYx=Xs7F*Zs{T0u~dE&<66Dd`Rwoq}}8 zpU?OA`1tobA4!_xlw$UP}W)PQplngM&k^3RTjw{_nWEyF0tRmX($J^Y;vqlzjfz zEh{%W)f7DVRsD9|^7`V(&F`?qKc_3#cfWg2u75%<_SS}1POVHV{onbwW$=Fd{Oy$* z#4#5Buj}Z#tVlygZ*AIe?QARSQ)SQ5triT@fEmpg-MpFoX>Aqg_i5;E=J$1qRKv3u zS_q{N{&)#NlQdMiQ)Pi}6qKK{MA9ihOko#$6}HAITM z{`C5$JaGMIAg1Sv$2IlePVUvI@xZ{l-SrQVp%K3$eHJ|hIwltbT>$ATcc`v^b^TZ2 z4Nd+d6LVDxCQZGj??PH_#5MiS8Y{o_wTh_c?rVFL-%W#?zM^Vp_RI1fBsd$Py&8|I zK^QA5|8DluLdnGr^*6pYF2Wp*hlNvI92?8%NQ1Jyn)S7xF>h}@+E0A`Xe3((19`~)5T2%F|USa;` z&E%V2}jEgkkGw;1Y60_uuF;>>%H#Dx~2jqk4S&;>0j zc08)08&oI#%z({g9V?;+$<(Ejn!!h5J)t6@MX1rao^bG|lgH(sLVL;oyX%iAnytba^o- zLfk@hpAtmgIvTn-_fP!&@gR95k@x-@u{+e*3kQe7>c8_rnOvy@4h}1hs*=2(-`rjs zv7i3>|uXZ-h_*=;K*yV>r zXbT7vf(^X|)g0bbp^MYuN1Uy@ugP5m$VvbhoPDFz07a*tezQsHk2mVer* zKnM9E@$Kq0p~Q0;p}*>#4F7gNd@4r#RXNct>$vSv3Yt-b?BY(18LZwKUCLTi*kPMW_|6!pw|eORt3YN&q}HQlW)xuxSuH-s=A(E zJ@_Z#l(C{}ZQAf9IB-?s-7|Z54|1@dDw8cM6(p!A%nga-jx)0C3_e`w%5?zydpC#ny7)K>Jj+-uXodr5=gNvNJg(MdjV))Y^s0Bty=x7$9paZ2!&rERmMDii$WdPCG&1*8ag}b+@j0MRfke9?K#-wV2DJd45Xyu#mmyU=Zfa-{a`hf>ESg?qV|D#|NI#dK!_$uGn z*q9RLiPslLx7Osr$l>w7ky}WyJT=4;ZX_Ra{((Rh7%pUu54MF9#JhgrDal+EmbzBm zz#zzbjSfq2|2O}Y*P0%UaY67a!q??YrBoeM9_J z^{{ljsCo*&zyd-MC20A0n;w*q&LXB!2g%H7BOiWdt5ezq1;(?3#r#j3cXrfCKz)6k zX)qN_gul-+QLlE7qPB)&v+MZFls}Gr02h_=eU3gl9<=_`hIa(%c6@jcZwKcgBE%{S z0a2ALybt?>==UUi^!q>5{nzcypHrC+0rq!$w25`B(|~WKX%BY;tHj9Ne=8Poa2E0F z|0Vcz`Wfh9^;rA6U?QG_JFS7CQggPTBf{m>sVfTBNDdw)f{$jgxAlGae^Db|#ZsiImYGJG>6s7-V)^mzxjz1KU<0{! z(nWL%oS!xO(|~@FNmZVTzb#`Q{c)K_svivHF_`fck0 zsob6Y5WP?lq-x9FBdA0nmo7eHZL7(fmqdswW{27M($WY>XmldM!c8Q||Bv9?mWKuU z+Xa*5D7GD8VDkKaLDk_z>?(L9&k#f@Z|=r_ zRc~vq=ROw$gEfjwWr8HECmcR~58}#Lws~O};(p2}5ok#H@hx8%W7OubN4b1bulIdDJ>P)uZNqOR;>J9m!pXD)%pqxc(^Ma^l9Mvdv#U=w7%Bsi*z;$e3I9JQH zk?`opQN7bRAa>P`64H`o)lz@7T!I_nqpsw__*3{>@TBjb16Oqq%;=$q>%u8A4w1n2 zxf(P;b?O&eaIxPwIJz6`;k{N)$Z&OjJL5)Ji%_KQ{_Ja$pzJ##kI127Uw(bM2H>Ez z{LV6paV={!Ufb_u-i$F7f9VL<+xhmm!zHZvOLu=MX+d~9bUG*M_e?w2`##&uVnWLo z>msa2#&_~=c2!^yC``{ zj-d8C-yT`!F%PT1ai<`3&Hy|CBzm+lZGCSmsQc$W@%qq5SM)0vOM)Xjxh3|Vmz{P15^FC1ULAFTH1V$_8+Qapi&!I=kh>>2FQ;Qgf&Sn3W~z5RyiRizIh99H7YHV) z_N8CYwp$9zcD{FW$>lENTWaA%i>P0&TfYj2%y=fpzwi-0f2?)$ee(rbA_egc9CQ|V zn-4p(qk~=yNH=u6ET$o2B}+N(ECz(n&7D(XBPrVd1qfud)_gtS7tm=?{kf;|iXmHG zl<#w$uL&rhPe}=igj30jxw&FeR3ZltTX;`y{vr;ap~%&eG|9{MZUv?Tzn8!ayHhwI zm>h0_kz@_pB_)PnZ>x_Vtyb2fBCwH%Y!KYbmK@loqeJfZf-jJS0FX?;OXGwgDxnST z$+N|&_Nw>a(#wk3*^6k=-r?2$e@`|PIaPTMJ3AVH1@*c5KVJU6^lo3Gd3jrw42V?|~G0bZRb zCe!18T;I{h_RGgxTT@>jwe5Om`so`xL@h( zfm9)`$%fA}Q|-4lb?pSuIM$G^y+^yg`)^8~!WCo74NUTx2aX;pB#eGlH&e_%$=jCJ zP+82py83nz|2a-59lWtgLF%Dps_E-}`;Tgud|K8QZac{_$z_(LNnJ^vP`r6kX(^8W z#^LFf#;L2<6@;9)SlNvL`FX76y^yi&+rm>Z`7nsGFw1GDo5#$(K5+7cvxYr-M0$pk3Ho?rGoda@ly@xk9U;7SJ@0Cl{{wfg+oYgLzcO)wSor8MNn z?e#Q^GQ5E~nRB$Hyw)z&k*fF??CL5eaisOKUTIANmzzVniVFVw#$eTp};uxW!74T_5)r z)xRM%8Sj}NXB^-cj>1e;r4^68WfgK$8CjA6i$F-7b93k|QOa6K_g5jom=Ed+rSyTP z<6RQ8jydj#H~}sve6_w3v`e1nBJ+;4_O{{>u$m-u68G=}co$ zQe^QH80Ob(Pc@Tq;%u#G-#QQE*y*RZ49`4fS4JDLHl5}+#ycOkB_Sjy7rL4Y#%L1> z_oRWWfZ?pkjILpx9PlF|>T&p5oC>AxBCuBqKNUtT`WELD<1v;BgUHDTU`B(epMYeA zYe0xF)<)&^4UK~*_@7K#!8(4@_h?QpSr zX4z2zA|$MX!c6rt7nYFstVz${(2n6aS_TkjUs)LmC9rWlW&48Ym+a3Wl;CQhgSg3? zI0RxKu+A3z(`Z(ah+43J@a_FDYdC_eKRF)+wQgX@V6m1I(~7Zz51Xnp#0Z(|0}tCS zmr9{2pJfhx+?C*M0py31q^mcgN9^7mT7LqDpQpg9La$>4 z*w9#dj2{8hJ7CWN)wwNyN+LvGTnNGX3V?RHpHx$}83Qf^O<>tuQs0bU|_RYU*%hyVlltVG;e#uiJSFzLM#2ox@yI)BM zALy{cGfm@|NvMi#%Jo3N-d{~2J)^f>6S^!Fy}vSPEdo#Z=k&QDe5eIr;OWk(!UAat zrcX*RjE~vM=*ANJr)`>dQi8WdB0H&5c;yw4kMG;t#YS8(f&7#5ZhV!EnI$<{9Vadl zHa-Mexhuv^u(|F`+le4a=S;jvKXQ6}^QufVQibD4UK$-+12yY1TA+QHWffre~}Kp7ztWRwmq z5}j3Sk<3L>N9bp+ISs4^casfGiF!&)c12?KPn_itLx*qSL^Y+xu@CKbf9C;OpBo95 z1io{3r#-=gEb3^7eBF5jNzp8{W&8bFC}87CN9t2mt64k{bn_%yczO^~GvMAidI+O9 z{JpqFK25GDoB+S<9$aER-YZ@i-Hqe8mG~s<^W0DdaYhy;gn0>|_pUmj;gA~Kt?KwE zd11J+nzujM!a1&3S50oSKi_yB`m>CvI1!y}1NBlDS_@F&Go4n{QB*iyG_$>KYw1j8 zY7Ll521Tq%F02tz(#Ns}`ahN-eeC^1d>79Fo%=&(cDVng{L(II8%qJoDj69=;E?TV zp09}Q7QUkQd5(Yg9``_i^fAqV^s?^xS;kv7%pHS>v%SOdZr}@|yH;+G0jV`nL!k%+{wN8vBz;@mW+`m8c62eZeQLM;5-h(~fIgu@k$OKrLj_ zcQ-W>;gvPyrX54GZEpe{)l*iUU!G3R?H@0a$6b~Gl79GIShy1O97j`*>5o9;Rn}4B zltIzOteqeBfQigxg|6gbP}46PAzG0>pd?hDAZW1Tr#=B3HT6U3OHn`kDLeauQ+f4G zyeV_r0;kJNi{-AtQ@e^0569C;G;X*><3+)pSG3gs}W5J${ zxK}rW3P=wRQBe~oSt+t?Ya;-=65Ot~rXW14B5AO>x`^KbUNw5lyilv2#`@61CgHpJ zLk*g43R#H|(+E>5Pg)J8ENT}x0Jo&ijT8PEGm66tHc$mC?9R;zrou93euK%AJLciBOf-U+tI*%y(cr17#@RC&p`vxS>0~@?t zk$H$DfL&ocU57iPe28GkO}!IINhg(15i>|P1EeC#nj^_A+iu~5c-xCEJxgo^cM)vF z0V))-6jYp2ZH#8VHqLdlR*nq&=pe|#BS4=RXgNK;T*BqM4nyc4Z~T=xCi+_UR1q%i z!4g!|<~UBtbY_r4%Uwb{^trwZfOT@YL9?D~3Lcz~!Pf)#=9r|x|4>3dFZ`}fwkgcb zJ?01;yzovOZfM%1Ifa#nD9S2Tkl-U^>dpvC-gQQ6l1=ZtUo}N(bb~1JYHwlI4ud?wwQUs_yid?y9{Q|)lWxO>OLo>_htPR+idN)sR(f&I4`W&mN=4+%~ctJ;# zV9`FM=ABFK85!mADj7SN5D5+N6T6`czDm9t1;Ba|-lGqj&caiRd*U?6`9`3k)EMyR z+l|5P(qI~4JcyObGFJ*MttdnXJ1iSaU?m!9l>&DCC>_a)6_l8=^poa4y=VnN5JU*s z{E-c)Kq#|>&h5#9i{iBI!u$7oMm3RwF(fj5{Ik`t_+=n}PO-@5BTDF)oDy|k$G=e{ z|1e-92!huS)C^tuk*NSc6`xSqKq$2nUjmaT-=jtgyJN_o0ANiknGKfmjH%xz`#mUO zK#>ytr-QSKWQeX(x$X-duq_jKtk!O%=Ck*F?Q8efRJw1W8N7~783E~mLN7^g=bPY^ zlxrzGEHx+5MU01Lt8$>x5Sj!S_Ll4$j?l2MXxmQYdkgb=>&XFZju516B(^WJNT|p} zQ8Y4_CjX5~8C5rp=K>`nhF=`hK7?V)qb6GmAmao!RI4!^X5b6+i2{laDEyxQ$wSy*kIf##zkRPbj4TC= z1P2P|=;qNKaFoZ*qYb||F!<}jdx8#Bys!HB_E%MfYSPx!5$WItRD}ShG#;EoD*PD9 z{=zYZDDJkDyPgV6J{ioG^eJznG;;SAH)8!rf7KZ3 z@AW+16Wu2D{fWE^#oO)|hPeQtTAqa$o%{?czGNPr;`4*&G4Ojp#Lv&z8n^}gLb zL1|N_%xSifDIf8rt$u0)<4Fsc-X@`@v>LLbeFBzvq@U&cccVu5o)8jhS)1-I{!70& zpASm)4yfBscH~5E4$>XoVZ%{#)9815_EUpYOxg&_tOyZxIOZM)_KdK_c@5UfSVqUZ zfPj4Mw1Pw=WWP#Ks}xCW!AwYI5;{qM?N z0bGzQ00D-bXNsA_D!5|!_me=?zlsUQz?!kMr#xyEgLw#tyywls>{L*AuFH7>JNmQk!*|H>f9?k_AEEwn;=#PzC1!qE z=8JDr6?_gpoK`zpzrqC6R)3h1>~&UDoJpLwAX{i`ts<|&>2piLvdr9oha2`ZCJ6)s zqBjXLyv^Uw-->uXc&{G+*w*@ujm<@i&yE>)?3Iqr95;8xHIw1J3=pi0M*Px4I5#jm z7-h)6=}RfTlT8#iV+xa|z#NTq4Nw-pWniWHFBHO_4mc8V?B(!FXxJiT%mPX_ses%1 z6J4R|df{e31s}m01;wxS*#VY&a*EFM*+8n2NKk~gyAtw2p8YXFr$@I9$k?3mi=}>=t zBcOg{EwA9|`P$x|%;)mk{c_OX48C@iPlC(`9tmz#Fi`o$yEv3Bt#*Y!hfDz?|Zwd=s?ly`vUtIWvO@0I7qXr8%maVOc;Kl=sCE8Vyn9&HXAy4-tFI6~h31s{MLkhbK;#-~FNS^rL zh6XSCCjn9Sh`Ol>08;+?fSOqmF>)1N@)dX6f(ejHg-vxzW=E42fMxpt3?+(40+k!E z$OIBZN*x)s0gbRxo`RH1gJ@?ZIgOuNgOG%{11O{V=$O7LJ5q%CB3+K(_=}mkfrIUr z$tv;Uy>`K@EGLF8D3Lz=$ULDOXA}e4#&eL)2X%T@Y4PJOnI zx&@4qUI%@x&G}NkMpN@*Bu}Vv`p`O#le2Yav{>%un>p?3Hv%Nmts6fIHid-^e?0T)gS-xG$K*eyHh=#rS`yl-o?-8>x)gnzL(5Dvj;(TduuI@q8Zb^NpCKb~`6rinz>3QK~;OVH4 z%BjLZdrkoJ;h7Ueq;THQ^;;Vb>Gb=x$FFC2h=vErR1nJiP=H9;J5^P;wWb(+;=pqi z0(|AMLHklx(gnE|bQN2j=X`_9s_LKEpIS5}5IOd@+j-#)2-1^`N;jUq*+kDpY{ZWz z%4r!Iw2ANOjWWnnB#OxGkSUUQq#Z4B!x zwN{k+e?>Q?n1C1jNRO2hJx)?0HI5M}zR5;6ha8cL4&xVUr;DL~mi@YO-Nl-Aw`8+> zMI|IKkUkzPpd5&ZvLvPkANMVEMiK;TvZ6rChu_}05rp@snUANE)j$aHOC8<2KO^sdq?>#d*`<%;4y}&%v9a!LJV-eI^9u#LOEb`9_G8Lt0hV z845AAZRY`QAugUb_&IAv@vMr)Gk*y0SH80JtiVCd=s}D3(e=>Xjiv`lS|Z27WkcwX z4`N^KzlPH08Je2j#A)}{*^GZc;)42AaCs%Bc#sjWZ#dwfrWuL^Jk^AoGZTLneANW$ zz$veWAbIC6-BtTXPWB_L^A_JR%Y2IgQI%TbZ57(y3qI3kZV@tcM&}Zo9AT;KIgu1P zw8jrrB?XI`p$b#0y&*uWC6M%rjx+@jKnMM*k^%Cng-ohZ6k(faOdb^PM#nAy9w6Ke6FE9!zg z|8@+cS3YfVT;|I)HWmrL6jl*e?HnbhPS`xHdyR}6t-*svViimf{7{3nk7zz`T;-Hb zTPZ<_i$F;0H^o>u&VE-!#5Y0JF}IuSQ@J&<;nrPNKHIumT`=g04C5I}t z4UM6W5+Zs9GRo>;E%LHUtN&=&(dz+zgUqxfm|dm!NHe(!{3*O|#-%W$n399{c#Lzm z^jzVw>Bp(r$q3f_Tq{Ilr_c6V8^#JD-u7kN2^ON0i=)+(rI%wlxEu=+TsC0wPV0nd z!ydKd%1T!!Pv-%cq6VCi>!7L-iX@ozjoq4UHs6{|p9 z(uc_x-pKBL|0O?9j&yZ(HQ>B22e<0T3DAayMe4=)~jZq5@?y63=D<(o= z)z)SkF+P;>@$sj`(a~b)H2YMW`GyZt;)B{qrA3zAa$F(Lx?CVJXamqCQDujNpkV;* zYJ07fd0kL1P{P{+-)B(w|96uh&3(oBD${szU$s^#d=>AV9j}KihKAEKdE{=ktjcWA zZ~-dUis!F+zI(1GNJ}S+hoo@CvwL~N(pa}A1yv=(4~z`)b=*yz0>z{i09Y(>@tVCg zSvrtD0ms4eeHQ;?o3i5PcMjpx7xmM060!2tlBH5hWPq?kjYGAE3~;I>V2-|r ziHzqBo%MHihPWh5TuH$U4nz;zw4szj#2C@@$382IU}H!TafCTSU072f93rq?Iuvkb z(YcbJmFc#&#^a(j75r&6JQ771$684rr4fWIJO7LO@?~vX*!?EDh8d0n7iA*`q zr>5!I(N_UE*!7*^56@`&hm*W)QljoHDtP{IFY>oe{n}wl;Nd_#A=$B3aj)FXH2|MP z#-k@<9={d%16xGnJTB`T%HZn*=^_Ye2{z%HJq(ph?9}wxu++dUSJ-0_U0{wGAv!xZ zcc*ewD>2Qkym#(-5wu!6OfOcsp`T}6l< z?(|Y^7;jA<^~T+sgSn=!!Nb;D^?= zCW3mxwF0&tAX!qGn*SB(FDxaF8m{X`Q#o<%u}AwsXNdO6s^8`Zr4(j!_q}qkb^Fu< zY938FcA-Afd&;~lTu5E|v?sp1#piEw%re>TS37gw|63R&*rAQAft#D}Gd4D*gt~aY zf4)UfO`NZU_1l1LI3Jj0C{X%%%4Y z$DQSIHyu2kdwAB%UdGG;9u8t|Z2f}{mmYRdU0Zh_uVYKqpJ;AY)Uf`>pp+?Oo8qpx zjF5spjx8haHL3=dYyYBb4uiP+nmt?I`<;Z+s$CP#00}3^0D?HfzbQ7OfX1<7)h>wW z3?F>(QVd7$*%>X1)VrM$314EP+w`OaNLL(d; zlB_50!Qk3O2`(@Ae#cJ18sLw?K8N24$zB*}R6E5IA;xGSU!LGYW#1SzyglfmzNvgK zOo`1Q)44fVQ1INH&jTT?OCp4QMK`ma@mT~mlBy$y$Pvdp^Lq};e50&rx!d^11|v_! zxUESN$X{2+xV6Wdw&y}fjF6NqL6;o3@rQ};*yE%;ZOFrw5FQI4u#ck?Zv6A7GogdO z_|7nsY;0SLr9EfW3B~48GH&&F#>M6CKiD=d$pKi%6^C~ojKc=s=47Q@j^tp#hAYcBKd=2~4*8kxkQJw!v zpE9#2KMzmHkJb%&^%~}!yW;2z9a!97gS(H}FY~0PZ%yB6$LQWYx)kdQqS1Xv@IxR4 zL=|)ZzOrrXvlsQPmlt~3!H}vKD=*#%u5mzIxFu^%gKRVV2)7iOf*qEFXewWlAb6lU zHXnfr?D8q>t-eXAOisGSsKm$MHB9kzCJZ+nL0#;ml_TW4uTh9{k_v?2{(K%*h>{x8 zduS5zeQ1LRYVgjt-DM=i)Pt|tc#|RI1G)S(ct!c`ThAH-;^6j6E@cGm3Ce+46_KyU z;8@kwWm@~mDR&VR-~6e92Gn5tN=>}^74vv49Ryt>Nr3ia+0V_rI7_E3=g`;>~Mh$QI1$~6q!fuH(l|*Fm!FN_9RM;~!{0Qxn;~%Y3 z7I^-?gN*cgy?X^*7OeP{fAOxneI{+B(`(%hKKpdi;U_IO)V``1Bu20QQzfN)_@A1r z?Mryi(R)j>kl-ta9`X$+$Io1Lf*G&zJeh;)Uh%S`Cx?ygW1%Q!n;!d=``S*6Q6@`S zc=I-^uI}uYR_JO{CIPWa2=Cy^1#fmUPwQtI_3z2l8x~K=3?9CEE7qHX#A*;$#}Rc> zsm{^2(QnJYj^WzwAMN*-KmVe{Vq?$s>C+a!&rxZ$IJb~R^dA(Cvu z{fA}hL9C8n=;)u!hlDdGl)a#){Pf)wa1c4(@-b07^_gA5qIW6_M6%tz)x0GY@402$N>@*hD6cx1w2Q>uERnS00ILz@&7O2 z5$E}fag@w&HBw?*Eh!vx0`vgtNT`ROn3oN*xhn~02U)ygOqc?)eyujJJ@wUOz_l~_ zqL#M23j=)Ts7j-P7Xv^iTkwLrZU^w7%Qe?bY^>dzzlw8;7kz&FI)!2SvD~}d>Hj}_ z<%&3l9JI;c-&t6Mi5*UTt`%H}oU2x~W5CXq7@ZEb)xnWF(6U zLe5^kt#Vv-6(*r67;W#>LZA7^CNcK_mH5FHQ&q zA$uTPJ;o#brnBVd%87#ePb%=MVv7)Lk~p;%%1yBEDAc^aBfFXZMXJ%`-|C+_N8by1 zZ48p-uVjX^QhhFHD)W!|5=0B3SGoBj0$q(0i~O%{>92p*J#62d z6I>3}y5>t!YITI^0Y3_%Gk;2Ei^K!RF9OXtrGWh?q1DEf3CBD^7}-wrFN*kP8cr$@hHg_ofLSA{z6&f6eF=iWkQ?IgFK?n^}0 z#iK-F;^Ii`(zM2RH}|M5`=4W$@V@s|L)E}H{Kl6CU)wajJ1m?w=RpBG>D5__i-X$%;D?=jAQ|D_o_2D&#JW%9 zmco%~_xs`S*4JaW*4jMh*OOqKwFjlZ$d%&cke>|_Z41C!<(A5diVCIaN+lTs+*>2G zGG*PKtxxwHRc|JuS&9`R`!!+d$wnsoO{?d})wr9pc1^NnxuY)9teUGss$H)|vx z)i?N5_-xy*vY(AfexqbvudCalmig@cR79T%V7y?%~A#Ax|_+yZEO|LJ@B+pF^@y> znMM2FpTANEO(05$BD{HLc871b!3Cs0)f>m6ME+hQh3wIzK41M7A&X%}1P2tizdW~2 zXDS)My1d+a9(<#aJ&2l&TQ8Z}#Q4F2XMeyLNU|#F&xw^a9(%4WcXrvucpdp%&JSN3 zK5F7_WL6kBCS*u~i^6I;j~=PavO%MJ4NO#4OPaNMd+dXgrRVF zD07t{HRjv`R2AZKXimo@Fa^2|R|!Z6n?6SN_LPC9weEk&{?ypJ3k@hOwvbcpkBa#e zBblnZ$M^1|p-ydZohk|(frN41l?Zz8W(>y+DgJF_5#gP4i=!b6ue;`DeL>T9RX;7f zUqpz9R-ur^DY~FE*{!LGrG;|Dt7rd~lWl*XeKWrtSK@~pn4uo%tqTUTv$2V@``g4> zEDtfcB4(S%Zc4`q!&&>~X5Y7JM-uS1$gUFJ@*KbI9Gz`VQQi1%a~Y(*H82KX2`Jku zjICp#U||Mda=R#;iE8gf0IkUnrjKsDluxf2P5mv9gZu@ zt|!`U7B9nLoP7O9Y%ckZNOLv5%7JPb2`=vB!8W)AO^O${W**S`PHv8?vbFn-KglP)Xmr2qVQhzNEoWa!`?$nPoS83CYi9b2h^W>`bZFqv`~y2TE?e(9}i-rZH}OxGkf$8(3{1>kDjp=mSsnSUm?!{ zwy?S{)c>(!GCx^4A$5uWv0@d8X{~=RW3!O`&CP7YRLuYmDx0`2jBAo*!1>=zBGIpo zT(2z=+vUNmYZpJrc%jkNSt5ejI1wQ0n=2>$w(~UJ`yoFs3JB}$k=Fwc! zQU1NQa~$CN6ztD`k8eJ`>x@r!mS=A=W1S``tt@?7(}zj3_aP>Xm!+!*!0( zrg5(_XVH2%cea*O1&^2-6tNJIb@jN22Yjr1iZ~oHbg1H8CGxL*w9Z?6z3$M-&>Gy? zDLY%I1XniD&RCHUl1?o=keN}YhMMN8-3kv5;CjD$DJJ0U~aFJML!)( z1)hx>lX!)2zZ}kb@oS@LoswlOic%dBhhk=6b41wVc^KqT+Niv7XViK9xBl^bsODfz zLINIU(GLWk+So+Lib|;wew&_}awQQNpy>;}Tz9?iC(utjsW6aJS7an|E&tBn1G)Gh zzS-9E!vQjgG!fzz<4P2-<#%FZP#l+Be{wK<9OC|g2`H~+BRa*e^^u~ahEZ4F4+sUA z)KT820~Hgv8AsUpuM!(eZ?EUt8ZPGBUMgd|q}5cR;=R*UgVIeTQivUG+3PXNE`T{; zhtaQ1Z^TANuNSlRnT1aq7qS|oUPJ+vTc7*K7n@1g|B`zyDaFeDH`mP+Z; zY;AY0mb#cE=?!9SjMVWb5llVl0=g2rm{zU(?#?o-WP2UYQ-ic0l}aX%PT;x2O){^g z@*qLGTKeOMcgPA}Yz5>E6Iki~jiTQeyy^$Ir{XohVCy4G1JoEOA`PLXWtzLp&Y#D- zL64@#b3RAjD|;_&;ddw|hG}*hu^My3vI)pf*7hh%$COrPBeNk;0AZ# zPk0J8cX=oa6ymh>-QT1^ni`)3Ch@TAJ0%OtG&!w`$0@Yp!`CQPge>zN7ufcqouI#bU>~(eW;TeJ-QtyYP@ttxNd1w>l zAtcZ5YHL}dt~qly*QzkOGI+pnw|T~l`=t2Hk@SIYiHrYH>$9pjo7(V>@q5dPpo+1{ z#t_zKXcPs`=<%stg~7na)0m1L56SF}%$WW;b~uBhxqu;ZOQgbp0T@X_vidm+{#;N< zxU+5bI++>zCr@;HS{ci%OZsiwCh12U*=e)kAZo+;#?o^QBoG>VIs&BYr=U`C{29db zFDeDJ!Qk!aN|g~6TC|1%mex8T9O{ZWtOx&m1V6HhQ6?K>cJ(~NQlrO5csfEhPL{%M zld&U%aLLkW_Gzf2!)TXO78Mnf{yPJMR@3}|18ZS*_zd6wZ%#Gxqn`{M~E z|NTN0O;9{Ss4H{7RUi<^%`+)(oGbYNU;i|Sst&<*#?JxiC-|Y~ho+oSiBYWT?Rt{K4)Xg9Sq`pj zDcUAw$aU@03DrzD4kg6a`+(1b%lmCj=D8Q!xgljg#Zv%R2v8xY~Ii zxA*Gm6eQrv*Ez<41M#^KXNfOActE$r+}VIFV&QQ)_-CaJv8x(;S*RLlH*B)?XVhfj z!NMWm8k2TFF0%AZor9^om~W4|e0XN@S3-Nrr57aF7fZn3JCo^d->XyJNbp1X9UBEK z+LI9C*79AQktiB2C7sJsd{xiAX*XTsL~4I(NLOYgAXEiVvFw{yxV0ih)1argfQq9l)9YkKNUPa#{rHG3*JLV7um=( z;Hcyas1|^VrBjLbY<{9DS`D#SQPJxv!MiqqTRbFWNx1_>Rl(3tnxyg%J~maN`6WU} z+ETDHqeb(3C+fkGk-b6bkC?8OyytRYPWU>W(iJaXA>PwLhdgvu<-$_Jx5neNoj*V7 zxRbHEVesP5$cl+5l2`&nz9kVkYj-=LerA8H$k?I(?S^?Eg>@u(pY>%Wxh+j;TGc68 zvZ!Izm^a|qc}bYv^=DeZ{f6D#A28h+`Mre(y!26`h}*4bO9FZ3m=3fEI&z_7N^Fgs zPb%RHl@_sgex#w5Iz8t9dJvwZu5aC-ie#8HNrArzaIAD}?ha26SN_Qg+MClErLmG)OLZk#` z2m%5U5|R=dDFPxPNQ@GY?)>fj`Fy_Tw?AHI+c|sf-fOROU-$LA9?$EpB?C` zA`YSs)*^yNln1JDs4w&5iot`JexRTWTAz4KM1*Ne5t!J9|fcyVgv&ng#$N@fX;eun!9DC=#?k>7RI z>+5hsqBKRZD8yWByJ2E(B*&K7Fx&9lmf5qVt5ezf-OD;T} zK)r~bn)NE5_;3EI+`U{kij9rMSl_jEb#mVidjg3P3{J)~s`>uhV@To%apdWXNvZl0 z%q&5O9Z&zSOH11Nr}t1;|rfy>*6Ael(T|*M83p(`Jwg_w)%3G<8HG9i@#! z_j-lD2uMdMMRMvfOV}w0LLMoWL3Pckk}oJRN$~Uq%iRw8rN@fY28+1NWYz2HC@v!% zxfEXhXPrf*q$PmvYB?Q66?WhY1JXEBE%1+3K@!T?*RPWauxuS)ua!f@)sd)_xi)}H zJT&`vq$wz&F7?lR638I5$KtQgEhDR!OBDX;RvqCtFzH@~eH%W0N&+=#_^oB9V1})A zjd{9dr``Q9VSGD7wvlZ?;21n$<$O8zSnKFnVKh(3u-4T_@QfV`JNzUvk6h(M3b||w z_ti@L{fyc;%*ZPm>a1Hv`eN7e(Q()P>INbOmNW(PPBOLkl)UAq`3h9hC zsIqPTwJP{YyL|!R8}74M(B88<7l6aA%lbm!h)-P_7#Mha7M{P;q*YoviuevZTQRD zd_Pr+QQOabNpRVcd-J-yoYi41O+6XK71q;FieCKoc&U6IAK>L6e_t!D05H!v)3 zFRuFP-<}3MQIs5m=%p8D@n#fHdeHs=K|_9fUNSTt1i+n^bQF{lNGW-t*Zx1=%^Tyg zvu_hTy<|tXN!ff_(AYsDkKv!H59l|c4Z*KCJ{9p$rT$J#>?uy0ot?$UAZSKJbNI*Q z9FuFQpeakvS6_i_Jy|qa3j*?9%g&WmUsHVirWdNAIK{&=ySvNx88<^ zkM^Z)QUa05(mTAkk7Qs@ck2$JAK&(=pDX%8Q|ED+pEftm(rXCSP(mJlG7k@Vnsuv8 zQK$>bPmN+h?P+|#X~A33;4xaZT>P~_Vdxka{ADbo$<*OT!(f^WT^wV&U$f0H9^4gW z8l)q*d&t4dae{jwh=cEiW3(y9@=G&}X&n+kN%1tkkJ4+C3&zbeAwn5nGX$oAI78JD z#9HUA21^}&0fE&0dlFjdA&eaO*iTT|JPacoPrX>83%SS18Gg6pIl3~a*`4*+3j$># zB%G}m+i&+TH`6|Kj+bJ9C%9B^L)5?7!i|F84v-*eF!MvX|$8IAGrkbCGW z&~iMd`0t=vs_~O5$4cwGBsP#0I#oxm-i}PC&HkLErc&^v@3W&OXW&9)tS0-q7Eg>w zEU4|o>g)EN#>|<{a!$eU`)|lDWnPKapS9=0C^FdMBs=dFjsRW!`KNRfeD!?tYVS@s zvTrX5j+$L0m^QL9{Wkp^G0ZB?%kJhmwZHs>rur_7 zlI^KgPn8owJt!&Ekf%xg;(kI}@9rAUJEKg{&6#u{2_UH~zl|Qiy`=7S3` zLMPuJM3#2Edc}&Yrpv@<3Wdcw@Z#>=lke;(p4TPOAvD(j%73y`+|9t(aw=<;M|$yl zq~p=CcPeXRb<6FfW%BB6n}pi`H6G}_OjvT~SHt%7>6y?wG|{G#;qKY#G~OdiK=7O& zN!G$QLiM`b=rNu` z>YJ3*uVJY>9gl_@O;1IqrAFS#IQ8_AFz)m*td{x&cCJ<=36~x+U7Zhw%h%40>c+4T(*8cGL~!nyHR%(kF^#3x8Ob=Q>@(- zeEG#03^|y@)E*w|4u*U}hQXJ-(uj$nU`)0Z{CKookotM1>IM!M&7S}WV0u5Zt+ z(N?hD>K!K&wU#Yun!=NETo84{AwrdO^w@tox4>&FYM`HCGCV384<7DC>i700AhMa@ zH`k|L=GCakP89}j@U|paBV`E|LccDD*ObHM=Z~nycZR1JgzoXE>>d7%g1fJR)sebV z0g&H5$6HqLH+2^U;pe|>yyX;o7TqI?ovcVG;l6d8OITiJ=!fl%LMvo(@86OwFVpm$3#|Tx8QA6zi7xeS+j;){@WI0BwLJ78 z1LSTLF>laedMx#UR?%&hRVS@Gjl^7Grby>xO>&wEOhP(l45PriFvLdEyyidUJNivZ z8>u^LB6}48>7EL7&zIMtisEJGlEr|F-a7w>G^&%aW#hGIl5qFK)k_q}Kfset`^>=4 z)BZ(a1%JXo7AMe-ZHc>Op0Ll^MRRv~5`k=#c*bZvMFFct?EeUFSZW4>!zOn@Z~_J@ zbs$(e0ixiN;$j&b^YAGAjm*+%z5Jz-&!rZDwSOZ*2om(9V@Y_{dT^*y%PWUl3&X6Z zYuUsYRO;NLI9fC2c!2$|n^v|OFnWTlvb1+JHJx`WJKo7w@XksfdD;XTfxPW(d9-fI z$>t0R7l$&?afTXIzB2-<2gy}1I1(Y44RlY(7>YYT#=n|t$v28`dJp|JnwS)lrZ&Jo zK_7hTBOa-V3Z>W6LhN1naY1wfN&5VmfxlnbaolIr`DS#O^Xl9P3A_)smy|5B=|+$> zvzrM`Bmft4#$zdCnOS9Vt^7gkcv}5Q%Y!HBi+dW#4QOfNo<<@^yzil)(=dS&8E@Ux z-Q$n98|h>tgK(G${S=Z~9khR@dKarg7))CH7UPX0VS|u9XEG3_V}Y-s%KP?407q zKE7Oz2dZb~-=e|**m~ZmK2g&bF$DCQb!6D|Rga(vpYWz@DCPL@Q7-uJj~|^Hx?fHC z);t-0;w{rACTc6_{^K=+j5)QU3E3&95@1m|N|~Wz_to+k69mjD(}nq)%i4#2kB{cB z{^hn+JwN<+JhqQ84Y-^)4Js|c}}_FS!7j5-V>gmYkz6~5r(7= z`eKgP#0zIu~xZN&=A58HD?q<^CJvfa1oUNR)tCF#bj?QHK?b z53u{3N(#8MaLfrb(qoky4FnR#B^0bb765u5Hxd_b(MROAU6^B5|5~WJUk%j)2Ffea<3|#q)vOFOv+$!I1)RxKCfN^_<)Pc@Uhz&Hbigp4h{-$@}-tec1U)vhthho zV{h+E+$n$lb;QD2!Eod(HhTmU+TJyaIih@Qz;U`5FaA~`h!rhi-Ub_w-aXbH|J&8o z;E^+97gf9u;KP2GrS{g-Jet-Ec?FVaidc<{;bQOb-;nBLdW=%-_ z_=VMyq+{?hyO_(V(>GXb^{}#RU*2mQeCj+UDk2RydR=tDZN!Wd_A(7g)-U|iy|$?i zEw2MP9Z0Jo*<>SUN0lWUjQ)JLxhGCqTcf(AGe4EVNZ|9;6rn^S9c<0n@Gx#_W5myDne zUiEYbrasZQsg91>8{&i_G;bI=K~tpoPg5k5CdiBbJjwp@_uX;1*W^IiA(CvFkw?)r4ld^Cw50#_t1qUdrztDoUoHvT zlS_7|yFERYmCg??1BfuU&gKHTYU-Mb`_fr*v+$lHLLK4T^1XY?1o1K1h)`1~Wrj&8 zd+kytQ;Z3ycV&s$@L|g&Cr0Gv05VcO{2-m>>^U{Y?6kw5Cj3RiuF)jcj|hy?_QTm{ zOCRRcKn4;wCk0SI-MiLVPKnF4!Cbs5176h=MFo$rK?&4Ts&{?;J1#*W(wk5ZB7w^1 zO#i8p0TQJqrQIay-&cqXAaQXDq?B`iJp{2InNq@K+-CtcNU}a%kTO|8LKJ`>+9Mdi z=8~L_|E}yN#_iz!%VP*Y6736Njm!HhNT$Ag{ZD<5-ymD(6fyQOYV4(@1FauZ?&*?kt z^2*2~S~2*Ick>?-Y4V5iid&Hkh0$}?>9dCS+4Ut^=7JBNE>1o|TW*EAN4%>IiUv6F zCo_X&q|^pZDGpj%e~{kL0O%E;s0b#@6y(0gk@c>#1T9>=+Bul0ZchhBo|SdL4+Rc( zyVvGFJ9KW(QPfV{ekNz)>v5iDTmN-=fF&}mLu6_5mmTNQ)TQcl<7{hThVN8`9fb;4 zu_q`-7pcjf5Df*TsyP*X1AF__b4kjZ%X=sAIy$4OpQf@{Fo2x2GKt9mz{1>bn3oiz z%L#zz8WI{mfw*Uo1{2_7%E8)*O}}@a%X8xtlG@N!#g&yEQ3|l-KQ<;WMa0T#UiIg> zke$~|jo%D5OK&-_T{GNHUrsP3#c2iw^+`$We3@(o?{AY{hQOtowVX46Owzpe!{M(X zU6;3qYN!#i%a%MiGQ#4?Pov42_@v$PaRQC%^#-I}SQC?p0Zs0IC_A{1dvms zL~-JFG?1~S{!--O)B;J38#;Z3Qe`_W|GZ*NWwk;hS(jl``*u2HY$J|fEqt)`6umyry zxC{fFqy*5DedTt%VDZ5wfWiK%i<$^dznk?=mP$}6?zj8G@fJy}lx;kec?r;6vzYQg z|E+37V)+Yh*iU>Uam#7+oGS;umUiF zni@`j8z8k5M?gXI?#vit{7?Yej)MYJ*hzx53(rVR+}wurKz68qB99N=bA~-X!~}}uJ@Bpjp*~tMqC#{p z8qOqLhhxNk;~AvKiRZgeV9L8D1fM)S#XLgQXZfUhFvLZCScds3<+A;?_E92Gmvl_9 z%YO%n_}jYUD-^W|0$)^gc`k7kKq9{7`}_Z#1^;;re(exP>Ed~rAM94PX$z;zSQynQ4dG|1a;HMe)>w-pe zmn2mi9>1}Cg@{s`ma#oD%mhy|K2k1_ta8HM{Z%~=useB2sDrkYZ*Nsi;tWw(w)BVcl9ET> zL~KtCzdS6hj^u)3!CASJ$J9mph+7{3T_5jX&1&%3temFY+2&5Hsu4HkgKMF_)}1S* zD;<6Agq>MWc{N%vX-g5kcb8#){~r1xoq1Pf7fXX!N@$29fS|6=viJ!})+n}24;1m} z^>V>)q8v)UOWr@ZK2H2PpyY1^^6DeKv#-uyAN0W*7ws2SQSADBnhtX;@UJ2a6=4Lp zDFS!7$J2(L|1Bk)cKI}&KzO#75(;@@%zgKUrTR9PHPFn@ZERBZ&auoyqSkRb4~mFW z(g@#uqMHqp+z+4!s9t3zEo-{Pf&Kc1mGwYraB_Mmon+r%r(k}+Jn0n>fsvV0B6c=3 z8S#!uC<&$g;nMzn{ATse(nFNvObqD#jWSbIw7}=sIQ^#5j%T04&S$uvSATFP!2FYb z0~3P?dq?&2!~1A4OLSxx=466)$|IO4|M3H49?AaA)bV+blzAR<>zPzuh9X=8AuQU_vBS6?W9542lP z7g9g<6K$kt{}avVEg z;;FRRhTYWl+aYa)b@dR127{5~)55W*y`ju%&lL|g5?LU&HVtmn!P4(=w-XYiWbb1) zc%d{5^D&e}yb%_mvf74Q<8(sF)~TwV1LREcfKz`U0p<2PWB3hc0)s0XZ*O(j#zlYAd z+`Kip$8zCrg;!VOQ8JX$sllBGG|D`^3Nrv}&m8h}xH#WS8ANybK@sYKN<~LY`*;C5 zk@to91|r`-k=N-b^@n$rOHCPBZc$wT=j(Tp;YTd?Rvq?KW2&Wr?Jjbfz{jw$l~UC< zVn)v+ybXG3Lo9Vo+1qE!$Cty?xP%rnQZgE@AQ|eTQN>L%e~_(8&NfJxEwoeI zDfjWVLB#pcQ%k+I(=e&7pm3;k zXxtvego(P(eXVY{Wn}`D2A;$ZvMqJhs7`PVg&ak14!1Jq{p9IyRsFEtt+2z8iv@I@jhZ-(Y1`n=Q}D=f6z7=G_eRNrw+|Y>kI(KjdL&2Li{&o$+2ygc2{&=T zE?5#}j@N%A`VY_SO;pf&+J@TRM!k>MI_cMTtl-ho3sGycXfq9&~eTeMGTOlRUX02v;={xG$@w5d%=A z2iB27Nv!Oz&(^%TdpRCw0ZL=8-wIM?k>TuFLe04~WFhkS*9YVbMg3BxmF^x!9g?v| zAJf#TZZ-ywHalqUG{uq|4Y|mSm1J{&XZB3aa(SthoW+utnK`eq6`26on{QKhA~eTW zU)?L5m_6vOK7JoBsPs$u5Iyx*jGLQiky~dq0YnNtbXkG{-n6=G)Ra#Yl4M5urHJKf7YADOp+H45_6lonOGL5s0MeS4Y_>Qo(AK#xjA@# zCf0s|Gys;%IU-xF%l0ZH^hS30^(a{({y(zZbzlPC(|YFB;QfN$yWR~VkYjVu71-FX zm^9NF_fH?O6!_1by{z>>YM**!YcMdZ!co* z)6)+h2(PF#yPC!atZKS|Hiv|cf?IW7%IdZ^ulGbwfldyNJVGJ&bd}3Fjeg+MH>>lN}D69?gj!?B@Mw& z6$#*8WS30x!t!|OwYj0^wCV7Hrxl9-j|Fgut*KsuG56Mj!>XD$ygzY?9_Y6FjyN&% zMGxKl;2n8KlM46fSz@?hug<1FW{o<0?DO=Yk+{0F&Nl|(&yr8o-B7adPDZiKT_Y@E z0Oy~&Dp#pAr4pyg&6=1nn0Oituj3^nY0%GQuz&sj<|v#6w_st<061&O_vj?ad$ohQ z#-0biQlO+kjZ#>iGR~vtTPEw! zX!(<-e6c0+jpy?Nc;bzEoNCncyk+&pJxK3V$X$GgN!4B_?BeY^clb1Zvf|{(Mike` z-fgMk)%cT#LS3WRN0tF}Qw1LD1DzaBrqxsg(&)uIrn7SjFK8D!8`qpPPTlh5T{ z;09r5VXZ;)5ESW(PTr4idvPg3r@n{mQhX>33wAV}H?m&u=;ROUG1ra6Ohn9Rs^iV^ zZGLRRu?@wc`jdt~9T9fDH}ikaI<>+)gYq5Y`mg>PzK)<`54fw2JvaU2$W2d7_K5h! zd$|Od6bf)7YM{%`L{VgDnZ+t)DioFbWGuIp{DP6+%Yz*e_AlvP;V-wloAN!Xp2wa{ zVLHQ3=f`a^O0{eG7i$3#9cRP0+%|tZrw)Ks;~ZCI=6y%n*8YTSry75n&7uylTu95d zv>TQhtGsMt(U!X*AYw|@$@rAAr;X1fuQ08jg+!P?4`?ZK6AL|Ru&-r&yw(QwEl0yaXD8GUD z_{{D<4V90Lx5h+D`10jx?(jX4{hvefXAlE#9lD1~$-Pjy;xIEyA-dJkYUw0!EBF>n zC%@h`F!9~O)Y4CwZqQ*|$aXHA5uis`s2pk2^&#gFS9eF{z5zEO&g0o z!gZUF=Z7q_S;K_BCc(c=Onyh=vPc`9z(D86%yo{P zBT4^hDPbTf`X*R(5~y72O6xRq8@1?uz=LH@!yU0|mETGMe%oe(ePa-fBlu;Xd?AsJ z!QVx?lR$o|W;$iStxYm2End2Mi=f_NH!E)AH^L&r25P2d_yQl3_lIBD+?u8|*4_EJ zN{yJo{@XvZZ4afQBTz4*divseRTgy#oko_;3Ws&YrE5=v8XOM~muI&q2h$K@;v$`@ zB_Iy2T=eb^WATEe7@;>4gwa_LcYV!0sz!tr({hf6y+7K8mFgMxmOcvZbOK4 z_+eeo07QIDfZNWl)t>F>yB}IW#`k!tdy9H%SLZ&oRMsW@P@&2I3=ZCQ_NN>CUgJY! z=Sk3Vo^q2ybcp&xDJk9Q`Fxgf-viq=8Gt^;7jL;jcfA9-!2WR?Qn4AP0L12=%(TLc z)C?F!N<`?!4Y_X(BU2FrtF#>ro7^Xi;CJZz&V(}Njon^B)Q6UTbqT(MlY6R8yzbYl z_Ptv(vqz#ywnfkLER7q=1h==33+K5#U}UHTxqEu_Ot6Br;#z=$ktOJ+UCAH&I8jvm z?uk13W8c@W-+v&YM{qBnL_{R^P)z1_E(K+e{)RsN))zgrp+Ab)$<8koF zi90{QWKF=DFz1o>W`2@a02bW$?|y}Zzc*K_@Ee~__-oX@u6%Y6V3njhZ((xfqmIue zXLC1t#gUOsU0N>{;Fz^INo0qj5lR&Pp-9-%2w(hfD#vKB>2uwI#@lh^FEJV(dE{)- z-Xo@`&$-wJb&6*=d&jtzXvpb0H(o}lRrh? zC*9nT6aesGw+a|zo)x^M0uoxO^{D6Cywa}5aS7vy2Xxg{T!q~zRKz<^Rgb^Rs|v9K z^BPl|)-JIrEe!@_gmf7V_zzz2)=7sM#cbO5z<4#n+JEHj;CVIZOMZ(~7nvL|I1bgo zC(bG3>ioC!KlpA%O4<>D^iVf`e+k{d-iQKkJKxrEOPmNs-$tz>&=P$Jx8$NQ=LavB z>@F}^`uQVV>Y@lq&Mi6_14`Zp-x$>P>!`-Z#SUVDytI^d;s?Sw7_j0fvAE7hv#Gy^ zTqE5lG}$AZx5DQ<+`lZQP~HzkuI_Tcm(Nq-M06DF+HPZGvU zfC09*peTk=>nD8be|R1)y(!flzU}YN-u@k(qYmm9vaTX}m>_eUSR70Wvro8p7-*u% zm;;V;^7Gg3d?48=H6|93_ieuSd%-_CGP9%2Njwwd_a?I=_nq5K4jV_c^e9@u2ZuLt zkMo3ZWZ`i5lr-vLvMsvLumL3jZ>JYg+X&7C{d*Pn_$OFjB&8kS`4T6iW^S$E^HM&P zNT>UU+W#HC?vT{Z3nhvqK2HmH!mDG*gOp7h1(PYN8kGLgk?y2naj%6q0AIPehO^7_TI#NQ; zgzFB@ep|fzdEpbl_S)?QW9i1}UzOv!eNv~&mK+54?6*~VLQMIDR%^G6sEeET3U7A} z3ZJKqh;nRdf3;GY#`A{vPr1~)BEek3K2${{Lg2eFbQJ!AaXAS&dwB_BdrOy-=@>C` z@-g@Q)rRq#krg|I70Ng_|Hl!7z6O;k&idAFJ=s->B0)`OM)W1Y}X^GSuHx4aX`b28!GZW({+j~5q*z<`G_78S!#NX<$ z-fvKm|FzqHrheZd{iy#-iXbl3r39o|DAdPd^}q(pR@HaHG%L*YDp8b*7mC%YdLmWF zStjS6g<iq}cJdJ2#O` zsy8cis;8lKvq_rFuWm#ExI%C=34wSHfg*mQ1YCdfLpuX^I86YgP_FOm28+`#M|a{& zIe?kK3(iL!;ZrzB6os5}`K$gPC9hqG`*(IGUGmPL334KTEY5I#py~6qUBDs>oS&;O zmFpsKiR9(w3SHd-{&S>r2KYgXmBZzA@hAhIlj+L6gFoD8AjT@yPcgDb_`}I|Sq1Kd z306q=bNyF&rc?SKB-wqV-8a2FI;uX&D@W(&LmwCkcYKYNlgBTJ)At{MS|vyS<0}RC zYeetG`PJc}Dr;<+efBbM@;lg$)1)bIQhN2wl^VN;5J1NmO?VG!qS+QkVMfEO*CJ7^ zXdR`zOYL0Z~GoVmGaa&q#z>yssqktbHuC9&^jYo%{Wr2CCnii7nK zL)B%AfWPKfmp{%9;?klHjwM?46XA#A8uR+dy)&=b4hlfc3(L^CbI}ZUft-dt!VZK2 zmOEc+YDTxc5D0J2Od#9+i~0UQoV-KA3)#l`-})Ac3M9}@3Q*g{-;ITL3lspTj&R>k zw(LMo)|ZE`r3&YlDF_oBj5>2_>@qhwnZ35PH8*s6nMg-C{u$|6zA_sVhE8&3rRnti z#o*ITr;(Y5GQ+fh_Xw@uaN<{azz1F=S$>!72$JN6GmYiI)WjDNl=Lr9_6i?pLnkC4 z=EN%3xh2J5Y*YU8KM5ljm zO%0J@3&Bs*0qaIbyIjZGrufv1j8D!D zU!*p9HK#hXmE;KFxNYI>QECHE;>gQ499@b)7`2WL0uQz$dAiS!NLJZ`2d)gDxqN}6j z*Jl4F^tD8b9DVbh3{$`M@!4rYeWGV<+@E& zZa+5qP$jUR<>D-wmyJH5D?Ehgv$cgee+p#$4Mot+ zV3jM(tK2+dByJ&7KhR4#U7~Spw##bo6}qJz0_i*;I_@+R3lpjtNusl-uY#paqb&|9 zd{-~^VtWJ+`+ih>V86=yDIp=TlL5LI804+eyvIHh1*(ZHo+t8LQI`bull)&W@gcMg zdEc#x>@oZ&!-wlldYE*4%%Gr@(N(%9-ouLK?b#rZ$jb@H(9OzIx=j^X$bEHIrS66f zda3*OPN=AbEFBWlG$k4bT?6y-ge)bPEXu^=4S9pXgnPBURy_v%apcKs_q&iVg&vmX zF8bM*cuDf-ixeO+;O$})YiEZ0C%570Y0k*yr=DCj-QB-(PYRWu$NXY|U@H|~JVGu5 z@PG??@cz63pp33+gq2YTIPeZ6(O+@Fz?(t=C;I>#rV{uOt7V6RpD}AO|1L~O2XaUa44Z7F zs4!NG#Zj#xG4Thr(mhR-B+WlmS9-GG(qyiWZ$4|+$8RkNti`Y0dx<>Fh>qg5K8A}UV!T9eXvYCunR4gYk3Dt7#=P%y4uv(aKsDle z_i|C|J0g}4MmaM;nvkV+_97ba7XyT>RN^s1eN%JE{pEw+@4P3QCIi(%ijk^L14dgC zJz#htn=J~yiLMa$c;;ad6q~^yz1RK#Vbj#F%8~ruCf4&xJu8s&3k5KKgb8}m)8kFZ zoQh?=c6S#kNhpEQC}7Rm{+TRfKc8(!b)WG>PL8&%#3bZcE%5fBtQ5ARcaU@g;DEi> zuwRT3EPwM5&@I|jQ`!^h#A@*2h3B~XhH6G&`1RS@!MEmK)K|)?zFM09lA|5Mwj%`Y zZ$dLCl?H-Lc1%=|UJs*22@imsl7odVs5L{x7wKRbG6inyM>Fz6+x{>9+Qe!?3f9)B zC{Q4nsk2oM3?BtDN(N%sXf^))E0r^e%1>tg{xJoI;tAfwtwKLvcJ)Gb? zWED0jHVv;;=)Z`rFMFCK=IQuc|JC7UdcJX5JH1UT;s=Lg(x&f<5CERmV!ari^Q}bR zBTfnKFYgj@_?R=b)aFK)mOQMT+1IZBz2=n7Bi)#YtfzYt@1uSUrbp2XGxM<)&kEBp zU!2?bn=cAM^nJgx2;Jvn{)@LOKK(qHiTo1>dchINhZ7W9dZXnFd8DtuP8nJS@l7s< zASqo?&1w%3#bRCAkEo}GFR38r2F)Vl3O)yEd_|!2?I8-b%vz#++C8j`HDt31x-F15XZyp89%) z${UF?il}`h)n>xu(s`dO54O=-2^ve?>dcm-0z&Kj&@cB+5rKxj*m)m7|VytaGm-u$e&CzHW_z}zrpoqrkH*y5SS1nbPUeGI%fS2+qTzt;H8 zBqqg9X0iNIkg?Z)NGwr8+Jf(eYG_lX!5jFUs9AJ+EjPcQ0Q0o;+amQh*c1dXCntOu zWkC>0S}C!NKE!IzYpPsb4d@)i&q`JQ9qzs^`EC8KYpC` zMN%GLmw8KCR@O@{S;hu}GbmeGjkwK+a6VXC4?A#rL45fxqq$S++bm}vBrD*>>jR&Z zAari(gHVqgL+3%CCtay*o(y+5BA!Aq2w3*G|IU^)Y;O~a$V@tz(CZE zBnSLn9TlTc!R^LXM{F8zUVJRm9U~>9$mG;ihej{ldGlEH4HH;nD|AY4^blVE&QpUS zdjsh5PW3&96bbNQ%B>7;Xij{1u~pC8u1*HgjQ`ZGLZ&`81$o&NGc&W;ShEUqmsc~^ z+n4ev2Em5EGU-Q32iD%m(0?Y5=BQf1^72F~j=~qda;OM8prgmA-j$DTG4T828UsOg zUHr%MPZVRb6#cmr&ZHlWKc;nd+_(}T0il~ z07kz5I9QlJv;weCrPcrwVYhge1RJih0s_3FBMQX#-E9R3R+Pjr;w5Pymg2GOr9N=9 zI?pg=;ny2Gj}jq-`PdJ7HFRf9%xZv$2$V20e|jQ=gF)55FbCK6Kxnfupk(PEpQkFH zkm+PQbK`u1L!+q-#S@qS5M0sL){9OAIlA~_Ze?ZV$I)L#-~*2-dfji&JaY_}5pgQ5 zS~uL}D4I4xbqJjIH6Z<|%_%K`M}8_l0PbcvJJVfhDkqf+rhq4{UwmHGPWm{m8F4mB zfFspvAqFdzy(A;Qykd2qnPZ8j zAyojCPk)C`Gx^~g5qhUySxKT!J7=T~JtZScPL35%K@Fil#n~E*%o+vYTcyprgKp;; z8ko2nR@IaFvz2F#^eV-m<-4rJ?+y}a`p4toR?LPC}*NhtYT$w_q5!9BTYIZi|6M2$Kz^d8ok zoWFfIUdWudGx8->&RIKj$Ti3}+dI~;@71pzKA+wR(lphQlhS|!t#vxHzy3*sGe2I; zi0L!Z6I4I~Rgoly>;hO)++YGj+tgvUjMk%IB+@f6VOq1~vazwDrrE4u(aFHOS93q?MJ(LWXRHXKB{=`m zK<0_dKxKK9lt!wMx^Ma}dcJFqUX?pwR_!4wReJQ_qA^LPeDW5JpfvIE@XYyxTvx5lAC<#P_HhoUx$F1mZrKl`|4ZlzyJ_f6R|z$g z5Bo?)Uz(e#(*c7~X0S}UjcR++biK(cZk+shHFwvuj(qH7ZvUR#uVhY;n7C!<(22J7 zG5}-wW?^cMjJVs`#wll?n`*2ll2Stj99=xp8C zyXhWg=H}*(Eb?g{qh_+UZ_UPkWl8A!msO^GX`fm52>B|YXsse4(e7y#IPC7$7b!r& z0QRpFq6KHxEEzWGhGl!Yg1T1*nm}pz5Jr56#A{ww7j6nhzns_n4ovRuOu$H|a2e{8 z;O-M`D+ZTssonEegMOqV2cb-r>4b8-OLyNVNroVL333IjHx_Wv1xD>8WU z;JcvVv*$wfZJ$;tm^r8gpil`*`hR{9Kym>#L-KebS(EycAgA)|iZ?U)jL5o4{GIM}=w8>Gh(MWh-#;sm*y6aP}i25T6YYacO&b68z zdmPQBr~e4$_D}(ro#!6qcj$<7`%qnS+qJE2+YmiE$^&8WY-tVfmSpCG_x5H9FfjKY z1_Z9$a^h3`n!Y^sC){UD65RK5Xh`=CZx(;&?^&42Q21!_{Y$x^7n3c~+RQ%5ybK6e^F>}qlYEdt4=@{}wpfV~2Zi6C~gmv=CWn|)A@Ckqw zO5Ycz?lIihTNnLd*&JCR+xz#g6;-)lI`0yUd-zvx89#s3m{b?IotGqS{j3H9|JCeE z!AQ~^p&H4Tc##;}FK`jrz5UOV@CYErn(Lw0M-T4yEV4g)6h4BF(n|gF8$m0n2lt;NFt9K0~mL0uBS)OY8#l#+jA60t7jiflz29Z_-9buv~!t0*g=2 zhlfF5;T>nI8f)q1oeUqQ#KBP@%BFrP)Y!aQ+VV$m!T%R20@nRQjvz?7%n;*+3qq3n zip7%v$J-Y#9y@mIP6vKH)?spN1%$v+8_6sIknkcvk7&b76i32%^=jZ1aWpL^=DY7c zd-HHcI6)%9_IKOc(XV@@Y$?RdQXJ(QrVukrag>)?@uFW{_*Jn~q#S$P*?#-jF%V+& zMZ($fwbnjfxw7)87VH^*ngvF|5~PU#mmCGg{=h47Ym?$H?jpzUzMG0;O-+qik_kC3 zplQ}w*fg55fgl6z00Bu!L_t(Gac|$g{dTk9c=6cn zufG=YI{M1VlP8ZJwe&sN+e?-}bFhTl+q{btz~ngF^5)h4{#Su9iv2=Syel{^3|Fd- zwSpAeA;h>XO(^g4V7#`BqIsVOW}w18`|PeT#5jL`q*e00ZkrZ4 zF{?+b%T|xJ2-11m5P0|38b!ePh4bqum@g<6OsjU_Pc+c`OxVN(P>k3Q@9lN^ezX%s za%`u|%$cGfsZm6X(cvCgKo%nEz?N6J*JRq`!XGE;818$~VV)p-9yjX$V&eY)P1*kf XwaZacsbO+?00000NkvXXu0mjfgc?8* literal 32398 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 diff --git a/public/images/items/adamant_crystal.png b/public/images/items/adamant_crystal.png new file mode 100644 index 0000000000000000000000000000000000000000..d729c40ce254c593f739e79642bb977fe68e0801 GIT binary patch literal 1034 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabRA=0U}gyL32_B-|NsBLCw>H0 zuWeXyO{HpiKV7|B9QuX-9?FTy)ngzrA1~%dzcD5_xd&Ex{b4dOZ+prE4Q=YDVF6*2U FngB)Wg;)Rp literal 0 HcmV?d00001 diff --git a/public/images/items/blue_orb.png b/public/images/items/blue_orb.png new file mode 100644 index 0000000000000000000000000000000000000000..91094d821471a9b467a7e746201125d4b9e0f366 GIT binary patch literal 306 zcmV-20nPr2P)+8Jeb6 zty=$BZQEKdr-5$|vtdlr4{KQw47{$kB`4rTioua--j{$ts6-CVK!U*WWm_)&Ggd+c z2-Z?K!IU^GfC2DYF;hh0JofNV33fcQe1UIEmmmj6x^CJe!UYg*w%L9q052vmTM7eQ zuMr+5pgoYAEzj{BfZ+muZMErm%yR%$;;;ZEI50cggLMy3iLiY@XQvyDe>2y+CC`NJ zhF(I~8qxd3z6XSOxJnd(s|2zqaQc72=|3d3YSk)HA3Eibd<=w|Z2$lO07*qoM6N<$ Ef@fEHZ2$lO literal 0 HcmV?d00001 diff --git a/public/images/items/gracidea.png b/public/images/items/gracidea.png new file mode 100644 index 0000000000000000000000000000000000000000..0552d11b01bfaea693489813e8fea9bbb44c1958 GIT binary patch literal 403 zcmV;E0c`$>P) zvqVuro*$>JbFA@6u!Kf+Kji1E1-Sg|>j;8Il~`krBcZ_TOvt}$Ns`V6*?_ZlKx%*M z;*@=|IbgGfq8>#6Cp(Hbh5!$wM$>5-Y!BFB)LRKVZUGW& z$bcA?0%{DJhQSchC=!b^XiyfKj69w}qBnt<2Sdn6&SN`9BFX)4C!=jXTe{@`2Tk`w xn|jF!bp3>MDVc->E}%*O1N$^-w%B5Gwl9yW7X*op)b{`Y002ovPDHLkV1n?WvtR%K literal 0 HcmV?d00001 diff --git a/public/images/items/griseous_core.png b/public/images/items/griseous_core.png new file mode 100644 index 0000000000000000000000000000000000000000..fa131cccfdab3d0c832926cd01e5363cfb3228ee GIT binary patch literal 1026 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabRA=0U}gyL32_B-|NsAgZmZ_KW0v2a z_snTg+&f3JI$6=s&=4pNlpO`5Aux?qW1z{4DzbMn{!?(A0QAl5~A$2BapWrG!26q?k=VIZChuJE(1RPM}kX(K#kUOf{N4ZAe zbKSbOBsY!e9L0M-`#pPFw{>!X?Xq;{uQf6gW?S;=ThIA?HO+4`x1r*;J*{$2T6WLg s@Sv#t$}_$AaJ7fuW?!06_ujpVX?F_S&Q`ttZ=iVcboFyt=akR{0CkUbdjJ3c literal 0 HcmV?d00001 diff --git a/public/images/items/lustrous_globe.png b/public/images/items/lustrous_globe.png new file mode 100644 index 0000000000000000000000000000000000000000..a16cf80c3507713747ddb325c7756182ed504b41 GIT binary patch literal 1054 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabRA=0U}gyL32_B-|NsC0Aai= z^a*20kY6x^!?PP{K+YLY7sn8b(^n@Q6lzxBagjZ9sX^l3|NPwzw-^hna=#x+l%FlI zN$0=XW}lh1Hzo6y%X|_!d1LPPP3s<&J?Zqf4q%^@UbjR_$w-Lp*X@0-OPM&?rI`ej zq}MdK3DvSNbIjp<749gX$k%a7%!JJ-j-l{cxWjIlZ41_Om6+N&cz)2>#mK&}y`EjE zW-I@GcCX1(zE9^>k)9VRdh4KCyXRH47pueSQyt{oYg4=LJiB7I`mSzLqsi}clV|)& sO$>5Avh?PmEmOU(Ts~DBf9w8LX^UR&*ETyBg@dBY)78&qol`;+00s?|mH+?% literal 0 HcmV?d00001 diff --git a/public/images/items/red_orb.png b/public/images/items/red_orb.png new file mode 100644 index 0000000000000000000000000000000000000000..b982649c9b3791b3e395d05c4adff80f2aadd4ae GIT binary patch literal 335 zcmV-V0kHmwP) zy$!=45QRNPN?MQLGHpgknH4gE%d{CKYh(q=tU_Xdbe6A zSY_|^@MfrL0H4g=?d06+vdHgq2wGJj7$Ef7O15N5Km)Xs*%%0g!Ag{9-l}ovE861YR)T0MyM(5G8=B=D#3t-{eiegE>yC3#aMR hObmB@nD*$Q5pR4gj=uqTxn2MO002ovPDHLkV1fX!iemr( literal 0 HcmV?d00001 diff --git a/public/images/pokemon/icons/658-ash.png b/public/images/pokemon/icons/658-ash.png new file mode 100644 index 0000000000000000000000000000000000000000..bc3aa93ebc256fe07fe84e314b42513063449b1d GIT binary patch literal 599 zcmV-d0;v6oP)X00066NkluOzBm1_z|V@*|5<`UfVa(4!I36MN3 zFMiV;AmQ|?=^jnkLpdAbyDRFMvpbZs{@m9yH$j~y3nU=zeq;jsw zb8ud`QK4y~5;R6hAbk&w5mz}pIf7&jV!0OjE>9tT9yA*QlP0W?UMSBA1-Qz4iM!xD zWMTaF_di&r1j8H4d@ckeU$U2T-?e>4@fM}Ya=ki20r# { pokemon.setVisible(false); this.scene.field.remove(pokemon); + this.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeActiveTrigger, true); this.scene.time.delayedCall(750, () => this.switchAndSummon()); } }); @@ -974,6 +979,8 @@ export class SwitchSummonPhase extends SummonPhase { pokemon.transferSummon(this.lastPokemon); this.lastPokemon?.resetSummonData(); + + this.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeActiveTrigger, true); } queuePostSummon(): void { @@ -997,6 +1004,8 @@ export class ReturnPhase extends SwitchSummonPhase { pokemon.resetTurnData(); pokemon.resetSummonData(); + + this.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeActiveTrigger); } } @@ -1844,6 +1853,8 @@ export class MoveEffectPhase extends PokemonPhase { const hitResult = !isProtected ? target.apply(user, this.move) : HitResult.NO_EFFECT; + this.scene.triggerPokemonFormChange(user, SpeciesFormChangeMoveUsedTrigger); + applyAttrs.push(new Promise(resolve => { applyFilteredMoveAttrs((attr: MoveAttr) => attr instanceof MoveEffectAttr && (attr as MoveEffectAttr).trigger === MoveEffectTrigger.PRE_APPLY, user, target, this.move.getMove()).then(() => { @@ -2806,7 +2817,7 @@ export class LevelUpPhase extends PlayerPartyMemberPokemonPhase { if (!pokemon.pauseEvolutions) { const evolution = pokemon.getEvolution(); if (evolution) - this.scene.unshiftPhase(new EvolutionPhase(this.scene, this.partyMemberIndex, evolution, this.lastLevel)); + this.scene.unshiftPhase(new EvolutionPhase(this.scene, pokemon as PlayerPokemon, evolution, this.lastLevel)); } } } @@ -2846,7 +2857,10 @@ export class LearnMovePhase extends PlayerPartyMemberPokemonPhase { .then(() => { this.scene.ui.setMode(messageMode).then(() => { this.scene.playSoundWithoutBgm('level_up_fanfare', 1500); - this.scene.ui.showText(`${pokemon.name} learned\n${move.name}!`, null, () => this.end(), messageMode === Mode.EVOLUTION_SCENE ? 1000 : null, true); + this.scene.ui.showText(`${pokemon.name} learned\n${move.name}!`, null, () => { + this.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeMoveLearnedTrigger, true); + this.end(); + }, messageMode === Mode.EVOLUTION_SCENE ? 1000 : null, true); }); }); }); diff --git a/src/battle-scene.ts b/src/battle-scene.ts index b135a0064..7f8bca88c 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -5,7 +5,7 @@ import { EncounterPhase, SummonPhase, NextEncounterPhase, NewBiomeEncounterPhase import Pokemon, { PlayerPokemon, EnemyPokemon } from './pokemon'; import PokemonSpecies, { PokemonSpeciesFilter, allSpecies, getPokemonSpecies, initSpecies, speciesStarters } from './data/pokemon-species'; import * as Utils from './utils'; -import { Modifier, ModifierBar, ConsumablePokemonModifier, ConsumableModifier, PokemonHpRestoreModifier, HealingBoosterModifier, PersistentModifier, PokemonHeldItemModifier, ModifierPredicate, DoubleBattleChanceBoosterModifier, FusePokemonModifier } from './modifier/modifier'; +import { Modifier, ModifierBar, ConsumablePokemonModifier, ConsumableModifier, PokemonHpRestoreModifier, HealingBoosterModifier, PersistentModifier, PokemonHeldItemModifier, ModifierPredicate, DoubleBattleChanceBoosterModifier, FusePokemonModifier, PokemonFormChangeItemModifier } from './modifier/modifier'; import { PokeballType } from './data/pokeball'; import { initAutoPlay } from './system/auto-play'; import { initCommonAnims, initMoveAnim, loadCommonAnimAssets, loadMoveAnimAssets, populateAnims } from './data/battle-anims'; @@ -43,6 +43,8 @@ import UIPlugin from 'phaser3-rex-plugins/templates/ui/ui-plugin'; import { WindowVariant, getWindowVariantSuffix } from './ui/window'; import PokemonData from './system/pokemon-data'; import { Nature } from './data/nature'; +import { SpeciesFormChangeTimeOfDayTrigger, SpeciesFormChangeTrigger, getSpeciesFormChangeMessage, pokemonFormChanges } from './data/pokemon-forms'; +import { FormChangePhase, QuietFormChangePhase } from './form-change-phase'; const enableAuto = true; const quickStart = false; @@ -99,6 +101,7 @@ export default class BattleScene extends Phaser.Scene { private phaseQueuePrepend: BattlePhase[]; private phaseQueuePrependSpliceIndex: integer; private currentPhase: BattlePhase; + private standbyPhase: BattlePhase; public field: Phaser.GameObjects.Container; public fieldUI: Phaser.GameObjects.Container; public pbTray: PokeballTray; @@ -381,6 +384,7 @@ export default class BattleScene extends Phaser.Scene { this.loadBgm('level_up_fanfare', 'bw/level_up_fanfare.mp3'); this.loadBgm('item_fanfare', 'bw/item_fanfare.mp3'); + this.loadBgm('minor_fanfare', 'bw/minor_fanfare.mp3'); this.loadBgm('heal', 'bw/heal.mp3'); this.loadBgm('victory_trainer', 'bw/victory_trainer.mp3'); this.loadBgm('victory_gym', 'bw/victory_gym.mp3'); @@ -806,9 +810,12 @@ export default class BattleScene extends Phaser.Scene { this.arena.removeAllTags(); playerField.forEach((_, p) => this.unshiftPhase(new ReturnPhase(this, p))); this.unshiftPhase(new ShowTrainerPhase(this)); - for (let pokemon of this.getParty()) { - if (pokemon) + } + for (let pokemon of this.getParty()) { + if (pokemon) { + if (resetArenaState) pokemon.resetBattleData(); + this.triggerPokemonFormChange(pokemon, SpeciesFormChangeTimeOfDayTrigger); } } if (this.gameMode === GameMode.CLASSIC && !isNewBiome) @@ -843,7 +850,7 @@ export default class BattleScene extends Phaser.Scene { return this.arena; } - getSpeciesFormIndex(species: PokemonSpecies, gender?: Gender, ignoreArena?: boolean): integer { + getSpeciesFormIndex(species: PokemonSpecies, gender?: Gender, nature?: Nature, ignoreArena?: boolean): integer { if (!species.forms?.length) return 0; @@ -856,6 +863,11 @@ export default class BattleScene extends Phaser.Scene { case Species.MEOWSTIC: case Species.INDEEDEE: return gender === Gender.FEMALE ? 1 : 0; + case Species.TOXTRICITY: + const lowkeyNatures = [ Nature.LONELY, Nature.BOLD, Nature.RELAXED, Nature.TIMID, Nature.SERIOUS, Nature.MODEST, Nature.MILD, Nature.QUIET, Nature.BASHFUL, Nature.CALM, Nature.GENTLE, Nature.CAREFUL ]; + if (nature !== undefined && lowkeyNatures.indexOf(nature) > -1) + return 1; + return 0; } if (ignoreArena) { @@ -1292,6 +1304,10 @@ export default class BattleScene extends Phaser.Scene { return this.currentPhase; } + getStandbyPhase(): BattlePhase { + return this.standbyPhase; + } + pushPhase(phase: BattlePhase): void { this.phaseQueue.push(phase); } @@ -1316,6 +1332,12 @@ export default class BattleScene extends Phaser.Scene { } shiftPhase(): void { + if (this.standbyPhase) { + this.currentPhase = this.standbyPhase; + this.standbyPhase = null; + return; + } + if (this.phaseQueuePrependSpliceIndex > -1) this.clearPhaseQueueSplice(); if (this.phaseQueuePrepend.length) { @@ -1327,6 +1349,17 @@ export default class BattleScene extends Phaser.Scene { this.currentPhase = this.phaseQueue.shift(); this.currentPhase.start(); } + + overridePhase(phase: BattlePhase): boolean { + if (this.standbyPhase) + return false; + + this.standbyPhase = this.currentPhase; + this.currentPhase = phase; + phase.start(); + + return true; + } queueMessage(message: string, callbackDelay?: integer, prompt?: boolean, promptDelay?: integer, defer?: boolean) { const phase = new MessagePhase(this, message, callbackDelay, prompt, promptDelay); @@ -1346,6 +1379,8 @@ export default class BattleScene extends Phaser.Scene { this.validateAchvs(ModifierAchv, modifier); if (modifier instanceof PersistentModifier) { if ((modifier as PersistentModifier).add(this.modifiers, !!virtual, this)) { + if (modifier instanceof PokemonFormChangeItemModifier) + modifier.apply([ this.getPokemonById(modifier.pokemonId) ]); if (playSound && !this.sound.get(soundName)) this.playSound(soundName); } else if (!virtual) { @@ -1587,6 +1622,28 @@ export default class BattleScene extends Phaser.Scene { return null; } + triggerPokemonFormChange(pokemon: Pokemon, formChangeTriggerType: { new(...args: any[]): SpeciesFormChangeTrigger }, delayed: boolean = false, modal: boolean = false): boolean { + if (pokemonFormChanges.hasOwnProperty(pokemon.species.speciesId)) { + const matchingFormChange = pokemonFormChanges[pokemon.species.speciesId].find(fc => fc.findTrigger(formChangeTriggerType) && fc.canChange(pokemon)); + if (matchingFormChange) { + let phase: BattlePhase; + if (pokemon instanceof PlayerPokemon && !matchingFormChange.quiet) + phase = new FormChangePhase(this, pokemon, matchingFormChange, modal); + else + phase = new QuietFormChangePhase(this, pokemon, matchingFormChange); + if (!matchingFormChange.quiet && modal) + this.overridePhase(phase); + else if (delayed) + this.pushPhase(phase); + else + this.unshiftPhase(phase); + return true; + } + } + + return false; + } + validateAchvs(achvType: { new(...args: any[]): Achv }, ...args: any[]): void { const filteredAchvs = Object.values(achvs).filter(a => a instanceof achvType); for (let achv of filteredAchvs) diff --git a/src/data/pokemon-evolutions.ts b/src/data/pokemon-evolutions.ts index cdd2d07b3..99418619b 100644 --- a/src/data/pokemon-evolutions.ts +++ b/src/data/pokemon-evolutions.ts @@ -12,14 +12,14 @@ import { SpeciesFormKey } from "./pokemon-species"; import { WeatherType } from "./weather"; import { Biome } from "./biome"; import { TimeOfDay } from "../arena"; +import { Nature } from "./nature"; export enum SpeciesWildEvolutionDelay { NONE, SHORT, MEDIUM, LONG, - VERY_LONG, - MEGA + VERY_LONG } export enum EvolutionItem { @@ -34,56 +34,7 @@ export enum EvolutionItem { ICE_STONE, DUSK_STONE, DAWN_STONE, - SHINY_STONE, - - ABOMASITE = 100, - ABSOLITE, - AERODACTYLITE, - AGGRONITE, - ALAKAZITE, - ALTARIANITE, - AMPHAROSITE, - AUDINITE, - BANETTITE, - BEEDRILLITE, - BLASTOISINITE, - BLAZIKENITE, - CAMERUPTITE, - CHARIZARDITE_X, - CHARIZARDITE_Y, - DIANCITE, - GALLADITE, - GARCHOMPITE, - GARDEVOIRITE, - GENGARITE, - GLALITITE, - GYARADOSITE, - HERACRONITE, - HOUNDOOMINITE, - KANGASKHANITE, - LATIASITE, - LATIOSITE, - LOPUNNITE, - LUCARIONITE, - MANECTITE, - MAWILITE, - MEDICHAMITE, - METAGROSSITE, - MEWTWONITE_X, - MEWTWONITE_Y, - PIDGEOTITE, - PINSIRITE, - RAYQUAZITE, - SABLENITE, - SALAMENCITE, - SCEPTILITE, - SCIZORITE, - SHARPEDONITE, - SLOWBRONITE, - STEELIXITE, - SWAMPERTITE, - TYRANITARITE, - VENUSAURITE, + SHINY_STONE } export type EvolutionConditionPredicate = (p: Pokemon) => boolean; @@ -1068,7 +1019,9 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.BARRASKEWDA, 26, null, null) ], [Species.TOXEL]: [ - new SpeciesEvolution(Species.TOXTRICITY, 30, null, null) + new SpeciesFormEvolution(Species.TOXTRICITY, '', 'lowkey', 30, null, + new SpeciesEvolutionCondition(p => [ Nature.LONELY, Nature.BOLD, Nature.RELAXED, Nature.TIMID, Nature.SERIOUS, Nature.MODEST, Nature.MILD, Nature.QUIET, Nature.BASHFUL, Nature.CALM, Nature.GENTLE, Nature.CAREFUL ].indexOf(p.nature) > -1)), + new SpeciesFormEvolution(Species.TOXTRICITY, '', 'amped', 30, null, null) ], [Species.SIZZLIPEDE]: [ new SpeciesEvolution(Species.CENTISKORCH, 28, null, null) @@ -1618,146 +1571,6 @@ export const pokemonEvolutions: PokemonEvolutions = { ], [Species.GIMMIGHOUL]: [ new SpeciesEvolution(Species.GHOLDENGO, 1, null, new SpeciesFriendshipEvolutionCondition(70), SpeciesWildEvolutionDelay.VERY_LONG) - ], - [Species.VENUSAUR]: [ - new SpeciesFormEvolution(Species.VENUSAUR, '', SpeciesFormKey.MEGA, 1, EvolutionItem.VENUSAURITE, null, SpeciesWildEvolutionDelay.MEGA) - ], - [Species.BLASTOISE]: [ - new SpeciesFormEvolution(Species.BLASTOISE, '', SpeciesFormKey.MEGA, 1, EvolutionItem.BLASTOISINITE, null, SpeciesWildEvolutionDelay.MEGA) - ], - [Species.CHARIZARD]: [ - new SpeciesFormEvolution(Species.CHARIZARD, '', SpeciesFormKey.MEGA_X, 1, EvolutionItem.CHARIZARDITE_X, null, SpeciesWildEvolutionDelay.MEGA), - new SpeciesFormEvolution(Species.CHARIZARD, '', SpeciesFormKey.MEGA_Y, 1, EvolutionItem.CHARIZARDITE_Y, null, SpeciesWildEvolutionDelay.MEGA) - ], - [Species.BEEDRILL]: [ - new SpeciesFormEvolution(Species.BEEDRILL, '', SpeciesFormKey.MEGA, 1, EvolutionItem.BEEDRILLITE, null, SpeciesWildEvolutionDelay.MEGA) - ], - [Species.PIDGEOT]: [ - new SpeciesFormEvolution(Species.PIDGEOT, '', SpeciesFormKey.MEGA, 1, EvolutionItem.PIDGEOTITE, null, SpeciesWildEvolutionDelay.MEGA) - ], - [Species.ALAKAZAM]: [ - new SpeciesFormEvolution(Species.ALAKAZAM, '', SpeciesFormKey.MEGA, 1, EvolutionItem.ALAKAZITE, null, SpeciesWildEvolutionDelay.MEGA) - ], - [Species.SLOWBRO]: [ - new SpeciesFormEvolution(Species.SLOWBRO, '', SpeciesFormKey.MEGA, 1, EvolutionItem.SLOWBRONITE, null, SpeciesWildEvolutionDelay.MEGA) - ], - [Species.GENGAR]: [ - new SpeciesFormEvolution(Species.GENGAR, '', SpeciesFormKey.MEGA, 1, EvolutionItem.GENGARITE, null, SpeciesWildEvolutionDelay.MEGA) - ], - [Species.KANGASKHAN]: [ - new SpeciesFormEvolution(Species.KANGASKHAN, '', SpeciesFormKey.MEGA, 1, EvolutionItem.KANGASKHANITE, null, SpeciesWildEvolutionDelay.MEGA) - ], - [Species.PINSIR]: [ - new SpeciesFormEvolution(Species.PINSIR, '', SpeciesFormKey.MEGA, 1, EvolutionItem.PINSIRITE, null, SpeciesWildEvolutionDelay.MEGA) - ], - [Species.GYARADOS]: [ - new SpeciesFormEvolution(Species.GYARADOS, '', SpeciesFormKey.MEGA, 1, EvolutionItem.GYARADOSITE, null, SpeciesWildEvolutionDelay.MEGA) - ], - [Species.AERODACTYL]: [ - new SpeciesFormEvolution(Species.AERODACTYL, '', SpeciesFormKey.MEGA, 1, EvolutionItem.AERODACTYLITE, null, SpeciesWildEvolutionDelay.MEGA) - ], - [Species.MEWTWO]: [ - new SpeciesFormEvolution(Species.MEWTWO, '', SpeciesFormKey.MEGA_X, 1, EvolutionItem.MEWTWONITE_X, null, SpeciesWildEvolutionDelay.MEGA), - new SpeciesFormEvolution(Species.MEWTWO, '', SpeciesFormKey.MEGA_Y, 1, EvolutionItem.MEWTWONITE_Y, null, SpeciesWildEvolutionDelay.MEGA) - ], - [Species.AMPHAROS]: [ - new SpeciesFormEvolution(Species.AMPHAROS, '', SpeciesFormKey.MEGA, 1, EvolutionItem.AMPHAROSITE, null, SpeciesWildEvolutionDelay.MEGA) - ], - [Species.STEELIX]: [ - new SpeciesFormEvolution(Species.STEELIX, '', SpeciesFormKey.MEGA, 1, EvolutionItem.STEELIXITE, null, SpeciesWildEvolutionDelay.MEGA) - ], - [Species.SCIZOR]: [ - new SpeciesFormEvolution(Species.SCIZOR, '', SpeciesFormKey.MEGA, 1, EvolutionItem.SCIZORITE, null, SpeciesWildEvolutionDelay.MEGA) - ], - [Species.HERACROSS]: [ - new SpeciesFormEvolution(Species.HERACROSS, '', SpeciesFormKey.MEGA, 1, EvolutionItem.HERACRONITE, null, SpeciesWildEvolutionDelay.MEGA) - ], - [Species.HOUNDOOM]: [ - new SpeciesFormEvolution(Species.HOUNDOOM, '', SpeciesFormKey.MEGA, 1, EvolutionItem.HOUNDOOMINITE, null, SpeciesWildEvolutionDelay.MEGA) - ], - [Species.TYRANITAR]: [ - new SpeciesFormEvolution(Species.TYRANITAR, '', SpeciesFormKey.MEGA, 1, EvolutionItem.TYRANITARITE, null, SpeciesWildEvolutionDelay.MEGA) - ], - [Species.SCEPTILE]: [ - new SpeciesFormEvolution(Species.SCEPTILE, '', SpeciesFormKey.MEGA, 1, EvolutionItem.SCEPTILITE, null, SpeciesWildEvolutionDelay.MEGA) - ], - [Species.BLAZIKEN]: [ - new SpeciesFormEvolution(Species.BLAZIKEN, '', SpeciesFormKey.MEGA, 1, EvolutionItem.BLAZIKENITE, null, SpeciesWildEvolutionDelay.MEGA) - ], - [Species.SWAMPERT]: [ - new SpeciesFormEvolution(Species.SWAMPERT, '', SpeciesFormKey.MEGA, 1, EvolutionItem.SWAMPERTITE, null, SpeciesWildEvolutionDelay.MEGA) - ], - [Species.GARDEVOIR]: [ - new SpeciesFormEvolution(Species.GARDEVOIR, '', SpeciesFormKey.MEGA, 1, EvolutionItem.GARDEVOIRITE, null, SpeciesWildEvolutionDelay.MEGA) - ], - [Species.SABLEYE]: [ - new SpeciesFormEvolution(Species.SABLEYE, '', SpeciesFormKey.MEGA, 1, EvolutionItem.SABLENITE, null, SpeciesWildEvolutionDelay.MEGA) - ], - [Species.MAWILE]: [ - new SpeciesFormEvolution(Species.MAWILE, '', SpeciesFormKey.MEGA, 1, EvolutionItem.MAWILITE, null, SpeciesWildEvolutionDelay.MEGA) - ], - [Species.AGGRON]: [ - new SpeciesFormEvolution(Species.AGGRON, '', SpeciesFormKey.MEGA, 1, EvolutionItem.AGGRONITE, null, SpeciesWildEvolutionDelay.MEGA) - ], - [Species.MEDICHAM]: [ - new SpeciesFormEvolution(Species.MEDICHAM, '', SpeciesFormKey.MEGA, 1, EvolutionItem.MEDICHAMITE, null, SpeciesWildEvolutionDelay.MEGA) - ], - [Species.MANECTRIC]: [ - new SpeciesFormEvolution(Species.MANECTRIC, '', SpeciesFormKey.MEGA, 1, EvolutionItem.MANECTITE, null, SpeciesWildEvolutionDelay.MEGA) - ], - [Species.SHARPEDO]: [ - new SpeciesFormEvolution(Species.SHARPEDO, '', SpeciesFormKey.MEGA, 1, EvolutionItem.SHARPEDONITE, null, SpeciesWildEvolutionDelay.MEGA) - ], - [Species.CAMERUPT]: [ - new SpeciesFormEvolution(Species.CAMERUPT, '', SpeciesFormKey.MEGA, 1, EvolutionItem.CAMERUPTITE, null, SpeciesWildEvolutionDelay.MEGA) - ], - [Species.ALTARIA]: [ - new SpeciesFormEvolution(Species.ALTARIA, '', SpeciesFormKey.MEGA, 1, EvolutionItem.ALTARIANITE, null, SpeciesWildEvolutionDelay.MEGA) - ], - [Species.BANETTE]: [ - new SpeciesFormEvolution(Species.BANETTE, '', SpeciesFormKey.MEGA, 1, EvolutionItem.BANETTITE, null, SpeciesWildEvolutionDelay.MEGA) - ], - [Species.ABSOL]: [ - new SpeciesFormEvolution(Species.ABSOL, '', SpeciesFormKey.MEGA, 1, EvolutionItem.ABSOLITE, null, SpeciesWildEvolutionDelay.MEGA) - ], - [Species.GLALIE]: [ - new SpeciesFormEvolution(Species.GLALIE, '', SpeciesFormKey.MEGA, 1, EvolutionItem.GLALITITE, null, SpeciesWildEvolutionDelay.MEGA) - ], - [Species.SALAMENCE]: [ - new SpeciesFormEvolution(Species.SALAMENCE, '', SpeciesFormKey.MEGA, 1, EvolutionItem.SALAMENCITE, null, SpeciesWildEvolutionDelay.MEGA) - ], - [Species.METAGROSS]: [ - new SpeciesFormEvolution(Species.METAGROSS, '', SpeciesFormKey.MEGA, 1, EvolutionItem.METAGROSSITE, null, SpeciesWildEvolutionDelay.MEGA) - ], - [Species.LATIAS]: [ - new SpeciesFormEvolution(Species.LATIAS, '', SpeciesFormKey.MEGA, 1, EvolutionItem.LATIASITE, null, SpeciesWildEvolutionDelay.MEGA) - ], - [Species.LATIOS]: [ - new SpeciesFormEvolution(Species.LATIOS, '', SpeciesFormKey.MEGA, 1, EvolutionItem.LATIOSITE, null, SpeciesWildEvolutionDelay.MEGA) - ], - [Species.RAYQUAZA]: [ - new SpeciesFormEvolution(Species.RAYQUAZA, '', SpeciesFormKey.MEGA, 1, EvolutionItem.RAYQUAZITE, new SpeciesEvolutionCondition(p => p.moveset.filter(m => m.moveId === Moves.DRAGON_ASCENT).length > 0), SpeciesWildEvolutionDelay.MEGA) - ], - [Species.LOPUNNY]: [ - new SpeciesFormEvolution(Species.LOPUNNY, '', SpeciesFormKey.MEGA, 1, EvolutionItem.LOPUNNITE, null, SpeciesWildEvolutionDelay.MEGA) - ], - [Species.GARCHOMP]: [ - new SpeciesFormEvolution(Species.GARCHOMP, '', SpeciesFormKey.MEGA, 1, EvolutionItem.GARCHOMPITE, null, SpeciesWildEvolutionDelay.MEGA) - ], - [Species.LUCARIO]: [ - new SpeciesFormEvolution(Species.LUCARIO, '', SpeciesFormKey.MEGA, 1, EvolutionItem.LUCARIONITE, null, SpeciesWildEvolutionDelay.MEGA) - ], - [Species.ABOMASNOW]: [ - new SpeciesFormEvolution(Species.ABOMASNOW, '', SpeciesFormKey.MEGA, 1, EvolutionItem.ABOMASITE, null, SpeciesWildEvolutionDelay.MEGA) - ], - [Species.GALLADE]: [ - new SpeciesFormEvolution(Species.GALLADE, '', SpeciesFormKey.MEGA, 1, EvolutionItem.GALLADITE, null, SpeciesWildEvolutionDelay.MEGA) - ], - [Species.AUDINO]: [ - new SpeciesFormEvolution(Species.AUDINO, '', SpeciesFormKey.MEGA, 1, EvolutionItem.AUDINITE, null, SpeciesWildEvolutionDelay.MEGA) - ], - [Species.DIANCIE]: [ - new SpeciesFormEvolution(Species.DIANCIE, '', SpeciesFormKey.MEGA, 1, EvolutionItem.DIANCITE, null, SpeciesWildEvolutionDelay.MEGA) ] }; diff --git a/src/data/pokemon-forms.ts b/src/data/pokemon-forms.ts new file mode 100644 index 000000000..d9cf5bd3f --- /dev/null +++ b/src/data/pokemon-forms.ts @@ -0,0 +1,462 @@ +import { TimeOfDay } from "../arena"; +import { PokemonFormChangeItemModifier } from "../modifier/modifier"; +import Pokemon from "../pokemon"; +import { Moves } from "./move"; +import { SpeciesFormKey } from "./pokemon-species"; +import { Species } from "./species"; +import { StatusEffect } from "./status-effect"; + +export enum FormChangeItem { + NONE, + + ABOMASITE, + ABSOLITE, + AERODACTYLITE, + AGGRONITE, + ALAKAZITE, + ALTARIANITE, + AMPHAROSITE, + AUDINITE, + BANETTITE, + BEEDRILLITE, + BLASTOISINITE, + BLAZIKENITE, + CAMERUPTITE, + CHARIZARDITE_X, + CHARIZARDITE_Y, + DIANCITE, + GALLADITE, + GARCHOMPITE, + GARDEVOIRITE, + GENGARITE, + GLALITITE, + GYARADOSITE, + HERACRONITE, + HOUNDOOMINITE, + KANGASKHANITE, + LATIASITE, + LATIOSITE, + LOPUNNITE, + LUCARIONITE, + MANECTITE, + MAWILITE, + MEDICHAMITE, + METAGROSSITE, + MEWTWONITE_X, + MEWTWONITE_Y, + PIDGEOTITE, + PINSIRITE, + RAYQUAZITE, + SABLENITE, + SALAMENCITE, + SCEPTILITE, + SCIZORITE, + SHARPEDONITE, + SLOWBRONITE, + STEELIXITE, + SWAMPERTITE, + TYRANITARITE, + VENUSAURITE, + + BLUE_ORB = 50, + RED_ORB, + ADAMANT_CRYSTAL, + LUSTROUS_ORB, + GRISEOUS_CORE, + REVEAL_GLASS, + GRACIDEA +} + +export type SpeciesFormChangeConditionPredicate = (p: Pokemon) => boolean; +export type SpeciesFormChangeConditionEnforceFunc = (p: Pokemon) => void; + +export class SpeciesFormChange { + public speciesId: Species; + public preFormKey: string; + public formKey: string; + public trigger: SpeciesFormChangeTrigger; + public quiet: boolean; + + constructor(speciesId: Species, preFormKey: string, evoFormKey: string, trigger: SpeciesFormChangeTrigger, quiet: boolean = false) { + this.speciesId = speciesId; + this.preFormKey = preFormKey; + this.formKey = evoFormKey; + this.trigger = trigger; + this.quiet = quiet; + } + + canChange(pokemon: Pokemon): boolean { + if (pokemon.species.speciesId !== this.speciesId) + return false; + + if (!pokemon.species.forms.length) + return false; + + const formKeys = pokemon.species.forms.map(f => f.formKey); + if (formKeys[pokemon.formIndex] !== this.preFormKey) + return false; + + if (formKeys[pokemon.formIndex] === this.formKey) + return false; + + if (!this.trigger.canChange(pokemon)) + return false; + + return true; + } + + findTrigger(triggerType: { new(...args: any[]): SpeciesFormChangeTrigger }): SpeciesFormChangeTrigger { + if (!this.trigger.hasTriggerType(triggerType)) + return null; + + let trigger = this.trigger; + + if (trigger instanceof SpeciesFormChangeCompoundTrigger) + return trigger.triggers.find(t => t.hasTriggerType(triggerType)); + + return trigger; + } +} + +export class SpeciesFormChangeCondition { + public predicate: SpeciesFormChangeConditionPredicate; + public enforceFunc: SpeciesFormChangeConditionEnforceFunc; + + constructor(predicate: SpeciesFormChangeConditionPredicate, enforceFunc?: SpeciesFormChangeConditionEnforceFunc) { + this.predicate = predicate; + this.enforceFunc = enforceFunc; + } +} + +export abstract class SpeciesFormChangeTrigger { + canChange(pokemon: Pokemon): boolean { + return true; + } + + hasTriggerType(triggerType: { new(...args: any[]): SpeciesFormChangeTrigger }): boolean { + return this instanceof triggerType; + } +} + +export class SpeciesFormChangeCompoundTrigger { + public triggers: SpeciesFormChangeTrigger[]; + + constructor(...triggers: SpeciesFormChangeTrigger[]) { + this.triggers = triggers; + } + + canChange(pokemon: Pokemon): boolean { + for (let trigger of this.triggers) { + if (!trigger.canChange(pokemon)) + return false; + } + + return true; + } + + hasTriggerType(triggerType: { new(...args: any[]): SpeciesFormChangeTrigger }): boolean { + return !!this.triggers.find(t => t.hasTriggerType(triggerType)); + } +} + +export class SpeciesFormChangeItemTrigger extends SpeciesFormChangeTrigger { + public item: FormChangeItem; + public active: boolean; + + constructor(item: FormChangeItem, active: boolean = true) { + super(); + this.item = item; + this.active = active; + } + + canChange(pokemon: Pokemon): boolean { + return !!pokemon.scene.findModifier(m => m instanceof PokemonFormChangeItemModifier && m.pokemonId === pokemon.id && m.formChangeItem === this.item && m.active === this.active && (!pokemon.formIndex === this.active)); + } +} + +export class SpeciesFormChangeTimeOfDayTrigger extends SpeciesFormChangeTrigger { + public timesOfDay: TimeOfDay[]; + + constructor(...timesOfDay: TimeOfDay[]) { + super(); + this.timesOfDay = timesOfDay; + } + + canChange(pokemon: Pokemon): boolean { + return this.timesOfDay.indexOf(pokemon.scene.arena.getTimeOfDay()) > -1; + } +} + +export class SpeciesFormChangeActiveTrigger extends SpeciesFormChangeTrigger { + public active: boolean; + + constructor(active: boolean = false) { + super(); + this.active = active; + } + + canChange(pokemon: Pokemon): boolean { + return pokemon.isActive(true) === this.active; + } +} + +export class SpeciesFormChangeStatusEffectTrigger extends SpeciesFormChangeTrigger { + public statusEffects: StatusEffect[]; + public invert: boolean; + + constructor(statusEffects: StatusEffect | StatusEffect[], invert: boolean = false) { + super(); + if (!Array.isArray(statusEffects)) + statusEffects = [ statusEffects ]; + this.statusEffects = statusEffects; + this.invert = invert; + } + + canChange(pokemon: Pokemon): boolean { + return (this.statusEffects.indexOf(pokemon.status?.effect || StatusEffect.NONE) > -1) !== this.invert; + } +} + +export class SpeciesFormChangeMoveLearnedTrigger extends SpeciesFormChangeTrigger { + public move: Moves; + public known: boolean; + + constructor(move: Moves, known: boolean = true) { + super(); + this.move = move; + this.known = known; + } + + canChange(pokemon: Pokemon): boolean { + return (!!pokemon.moveset.filter(m => m.moveId === this.move).length) === this.known; + } +} + +export class SpeciesFormChangeMoveUsedTrigger extends SpeciesFormChangeTrigger { + public move: Moves; + public used: boolean; + + constructor(move: Moves, used: boolean = true) { + super(); + this.move = move; + this.used = used; + } + + canChange(pokemon: Pokemon): boolean { + return pokemon.summonData && !!pokemon.getLastXMoves(1).filter(m => m.move === this.move).length === this.used; + } +} + +export function getSpeciesFormChangeMessage(pokemon: Pokemon, formChange: SpeciesFormChange, preName: string): string { + const isMega = formChange.formKey.indexOf(SpeciesFormKey.MEGA) > -1; + const isRevert = !isMega && formChange.formKey === pokemon.species.forms[0].formKey; + const prefix = !pokemon.isPlayer() ? pokemon.hasTrainer() ? 'Foe ' : 'Wild ' : 'Your '; + if (isMega) + return `${prefix}${preName} mega-evolved\ninto ${pokemon.name}!`; + if (isRevert) + return `${prefix}${pokemon.name} reverted\nto its original form!`; + return `${prefix}${preName} changed form!`; +} + +interface PokemonFormChanges { + [key: string]: SpeciesFormChange[] +} + +export const pokemonFormChanges: PokemonFormChanges = { + [Species.VENUSAUR]: [ + new SpeciesFormChange(Species.VENUSAUR, '', SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.VENUSAURITE)) + ], + [Species.BLASTOISE]: [ + new SpeciesFormChange(Species.BLASTOISE, '', SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.BLASTOISINITE)) + ], + [Species.CHARIZARD]: [ + new SpeciesFormChange(Species.CHARIZARD, '', SpeciesFormKey.MEGA_X, new SpeciesFormChangeItemTrigger(FormChangeItem.CHARIZARDITE_X)), + new SpeciesFormChange(Species.CHARIZARD, '', SpeciesFormKey.MEGA_Y, new SpeciesFormChangeItemTrigger(FormChangeItem.CHARIZARDITE_Y)) + ], + [Species.BEEDRILL]: [ + new SpeciesFormChange(Species.BEEDRILL, '', SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.BEEDRILLITE)) + ], + [Species.PIDGEOT]: [ + new SpeciesFormChange(Species.PIDGEOT, '', SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.PIDGEOTITE)) + ], + [Species.ALAKAZAM]: [ + new SpeciesFormChange(Species.ALAKAZAM, '', SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.ALAKAZITE)) + ], + [Species.SLOWBRO]: [ + new SpeciesFormChange(Species.SLOWBRO, '', SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.SLOWBRONITE)) + ], + [Species.GENGAR]: [ + new SpeciesFormChange(Species.GENGAR, '', SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.GENGARITE)) + ], + [Species.KANGASKHAN]: [ + new SpeciesFormChange(Species.KANGASKHAN, '', SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.KANGASKHANITE)) + ], + [Species.PINSIR]: [ + new SpeciesFormChange(Species.PINSIR, '', SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.PINSIRITE)) + ], + [Species.GYARADOS]: [ + new SpeciesFormChange(Species.GYARADOS, '', SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.GYARADOSITE)) + ], + [Species.AERODACTYL]: [ + new SpeciesFormChange(Species.AERODACTYL, '', SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.AERODACTYLITE)) + ], + [Species.MEWTWO]: [ + new SpeciesFormChange(Species.MEWTWO, '', SpeciesFormKey.MEGA_X, new SpeciesFormChangeItemTrigger(FormChangeItem.MEWTWONITE_X)), + new SpeciesFormChange(Species.MEWTWO, '', SpeciesFormKey.MEGA_Y, new SpeciesFormChangeItemTrigger(FormChangeItem.MEWTWONITE_Y)) + ], + [Species.AMPHAROS]: [ + new SpeciesFormChange(Species.AMPHAROS, '', SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.AMPHAROSITE)) + ], + [Species.STEELIX]: [ + new SpeciesFormChange(Species.STEELIX, '', SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.STEELIXITE)) + ], + [Species.SCIZOR]: [ + new SpeciesFormChange(Species.SCIZOR, '', SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.SCIZORITE)) + ], + [Species.HERACROSS]: [ + new SpeciesFormChange(Species.HERACROSS, '', SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.HERACRONITE)) + ], + [Species.HOUNDOOM]: [ + new SpeciesFormChange(Species.HOUNDOOM, '', SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.HOUNDOOMINITE)) + ], + [Species.TYRANITAR]: [ + new SpeciesFormChange(Species.TYRANITAR, '', SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.TYRANITARITE)) + ], + [Species.SCEPTILE]: [ + new SpeciesFormChange(Species.SCEPTILE, '', SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.SCEPTILITE)) + ], + [Species.BLAZIKEN]: [ + new SpeciesFormChange(Species.BLAZIKEN, '', SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.BLAZIKENITE)) + ], + [Species.SWAMPERT]: [ + new SpeciesFormChange(Species.SWAMPERT, '', SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.SWAMPERTITE)) + ], + [Species.GARDEVOIR]: [ + new SpeciesFormChange(Species.GARDEVOIR, '', SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.GARDEVOIRITE)) + ], + [Species.SABLEYE]: [ + new SpeciesFormChange(Species.SABLEYE, '', SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.SABLENITE)) + ], + [Species.MAWILE]: [ + new SpeciesFormChange(Species.MAWILE, '', SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.MAWILITE)) + ], + [Species.AGGRON]: [ + new SpeciesFormChange(Species.AGGRON, '', SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.AGGRONITE)) + ], + [Species.MEDICHAM]: [ + new SpeciesFormChange(Species.MEDICHAM, '', SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.MEDICHAMITE)) + ], + [Species.MANECTRIC]: [ + new SpeciesFormChange(Species.MANECTRIC, '', SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.MANECTITE)) + ], + [Species.SHARPEDO]: [ + new SpeciesFormChange(Species.SHARPEDO, '', SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.SHARPEDONITE)) + ], + [Species.CAMERUPT]: [ + new SpeciesFormChange(Species.CAMERUPT, '', SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.CAMERUPTITE)) + ], + [Species.ALTARIA]: [ + new SpeciesFormChange(Species.ALTARIA, '', SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.ALTARIANITE)) + ], + [Species.BANETTE]: [ + new SpeciesFormChange(Species.BANETTE, '', SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.BANETTITE)) + ], + [Species.ABSOL]: [ + new SpeciesFormChange(Species.ABSOL, '', SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.ABSOLITE)) + ], + [Species.GLALIE]: [ + new SpeciesFormChange(Species.GLALIE, '', SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.GLALITITE)) + ], + [Species.SALAMENCE]: [ + new SpeciesFormChange(Species.SALAMENCE, '', SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.SALAMENCITE)) + ], + [Species.METAGROSS]: [ + new SpeciesFormChange(Species.METAGROSS, '', SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.METAGROSSITE)) + ], + [Species.LATIAS]: [ + new SpeciesFormChange(Species.LATIAS, '', SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.LATIASITE)) + ], + [Species.LATIOS]: [ + new SpeciesFormChange(Species.LATIOS, '', SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.LATIOSITE)) + ], + [Species.KYOGRE]: [ + new SpeciesFormChange(Species.KYOGRE, '', SpeciesFormKey.PRIMAL, new SpeciesFormChangeItemTrigger(FormChangeItem.BLUE_ORB)) + ], + [Species.GROUDON]: [ + new SpeciesFormChange(Species.GROUDON, '', SpeciesFormKey.PRIMAL, new SpeciesFormChangeItemTrigger(FormChangeItem.RED_ORB)) + ], + [Species.RAYQUAZA]: [ + new SpeciesFormChange(Species.RAYQUAZA, '', SpeciesFormKey.MEGA, new SpeciesFormChangeCompoundTrigger(new SpeciesFormChangeItemTrigger(FormChangeItem.RAYQUAZITE), new SpeciesFormChangeMoveLearnedTrigger(Moves.DRAGON_ASCENT))) + ], + [Species.LOPUNNY]: [ + new SpeciesFormChange(Species.LOPUNNY, '', SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.LOPUNNITE)) + ], + [Species.GARCHOMP]: [ + new SpeciesFormChange(Species.GARCHOMP, '', SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.GARCHOMPITE)) + ], + [Species.LUCARIO]: [ + new SpeciesFormChange(Species.LUCARIO, '', SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.LUCARIONITE)) + ], + [Species.ABOMASNOW]: [ + new SpeciesFormChange(Species.ABOMASNOW, '', SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.ABOMASITE)) + ], + [Species.GALLADE]: [ + new SpeciesFormChange(Species.GALLADE, '', SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.GALLADITE)) + ], + [Species.AUDINO]: [ + new SpeciesFormChange(Species.AUDINO, '', SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.AUDINITE)) + ], + [Species.DIALGA]: [ + new SpeciesFormChange(Species.DIALGA, '', SpeciesFormKey.ORIGIN, new SpeciesFormChangeItemTrigger(FormChangeItem.ADAMANT_CRYSTAL)) + ], + [Species.PALKIA]: [ + new SpeciesFormChange(Species.PALKIA, '', SpeciesFormKey.ORIGIN, new SpeciesFormChangeItemTrigger(FormChangeItem.LUSTROUS_ORB)) + ], + [Species.GIRATINA]: [ + new SpeciesFormChange(Species.GIRATINA, '', SpeciesFormKey.ORIGIN, new SpeciesFormChangeItemTrigger(FormChangeItem.GRISEOUS_CORE)) + ], + [Species.SHAYMIN]: [ + new SpeciesFormChange(Species.SHAYMIN, 'land', 'sky', new SpeciesFormChangeCompoundTrigger(new SpeciesFormChangeTimeOfDayTrigger(TimeOfDay.DAY, TimeOfDay.DUSK), + new SpeciesFormChangeItemTrigger(FormChangeItem.GRACIDEA), new SpeciesFormChangeStatusEffectTrigger(StatusEffect.FREEZE, true))), + new SpeciesFormChange(Species.SHAYMIN, 'sky', 'land', new SpeciesFormChangeTimeOfDayTrigger(TimeOfDay.DAWN, TimeOfDay.NIGHT)), + new SpeciesFormChange(Species.SHAYMIN, 'sky', 'land', new SpeciesFormChangeStatusEffectTrigger(StatusEffect.FREEZE)) + ], + [Species.TORNADUS]: [ + new SpeciesFormChange(Species.TORNADUS, SpeciesFormKey.INCARNATE, SpeciesFormKey.THERIAN, new SpeciesFormChangeItemTrigger(FormChangeItem.REVEAL_GLASS)) + ], + [Species.THUNDURUS]: [ + new SpeciesFormChange(Species.THUNDURUS, SpeciesFormKey.INCARNATE, SpeciesFormKey.THERIAN, new SpeciesFormChangeItemTrigger(FormChangeItem.REVEAL_GLASS)) + ], + [Species.LANDORUS]: [ + new SpeciesFormChange(Species.LANDORUS, SpeciesFormKey.INCARNATE, SpeciesFormKey.THERIAN, new SpeciesFormChangeItemTrigger(FormChangeItem.REVEAL_GLASS)) + ], + [Species.KELDEO]: [ + new SpeciesFormChange(Species.KELDEO, 'ordinary', 'resolute', new SpeciesFormChangeMoveLearnedTrigger(Moves.SACRED_SWORD)), + new SpeciesFormChange(Species.KELDEO, 'resolute', 'ordinary', new SpeciesFormChangeMoveLearnedTrigger(Moves.SACRED_SWORD, false)) + ], + [Species.MELOETTA]: [ + new SpeciesFormChange(Species.MELOETTA, 'aria', 'pirouette', new SpeciesFormChangeMoveUsedTrigger(Moves.RELIC_SONG), true), + new SpeciesFormChange(Species.MELOETTA, 'pirouette', 'aria', new SpeciesFormChangeMoveUsedTrigger(Moves.RELIC_SONG), true), + new SpeciesFormChange(Species.MELOETTA, 'pirouette', 'aria', new SpeciesFormChangeActiveTrigger(false), true) + ], + [Species.DIANCIE]: [ + new SpeciesFormChange(Species.DIANCIE, '', SpeciesFormKey.MEGA, new SpeciesFormChangeItemTrigger(FormChangeItem.DIANCITE)) + ], + [Species.ENAMORUS]: [ + new SpeciesFormChange(Species.ENAMORUS, SpeciesFormKey.INCARNATE, SpeciesFormKey.THERIAN, new SpeciesFormChangeItemTrigger(FormChangeItem.REVEAL_GLASS)) + ] +}; + +{ + const formChangeKeys = Object.keys(pokemonFormChanges); + formChangeKeys.forEach(pk => { + const formChanges = pokemonFormChanges[pk]; + let newFormChanges: SpeciesFormChange[] = []; + for (let fc of formChanges) { + const itemTrigger = fc.findTrigger(SpeciesFormChangeItemTrigger) as SpeciesFormChangeItemTrigger; + if (itemTrigger && !formChanges.find(c => fc.formKey === c.preFormKey && fc.preFormKey === c.formKey)) + newFormChanges.push(new SpeciesFormChange(fc.speciesId, fc.formKey, fc.preFormKey, new SpeciesFormChangeItemTrigger(itemTrigger.item, false))); + } + formChanges.push(...newFormChanges); + }); +} \ No newline at end of file diff --git a/src/data/pokemon-species.ts b/src/data/pokemon-species.ts index f996dd259..bd39d5503 100644 --- a/src/data/pokemon-species.ts +++ b/src/data/pokemon-species.ts @@ -510,7 +510,11 @@ export class PokemonForm extends PokemonSpeciesForm { export enum SpeciesFormKey { MEGA = "mega", MEGA_X = "mega-x", - MEGA_Y = "mega-y" + MEGA_Y = "mega-y", + PRIMAL = "primal", + ORIGIN = "origin", + INCARNATE = "incarnate", + THERIAN = "therian" } export const allSpecies: PokemonSpecies[] = []; @@ -1711,7 +1715,7 @@ export function initSpecies() { new PokemonSpecies(Species.SANDYGAST, "Sandygast", 7, false, false, false, "Sand Heap Pokémon", Type.GHOST, Type.GROUND, 0.5, 70, Abilities.WATER_COMPACTION, Abilities.NONE, Abilities.SAND_VEIL, 320, 55, 55, 80, 70, 45, 15, 140, 50, 64, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.PALOSSAND, "Palossand", 7, false, false, false, "Sand Castle Pokémon", Type.GHOST, Type.GROUND, 1.3, 250, Abilities.WATER_COMPACTION, Abilities.NONE, Abilities.SAND_VEIL, 480, 85, 75, 110, 100, 75, 35, 60, 50, 168, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.PYUKUMUKU, "Pyukumuku", 7, false, false, false, "Sea Cucumber Pokémon", Type.WATER, null, 0.3, 1.2, Abilities.INNARDS_OUT, Abilities.NONE, Abilities.UNAWARE, 410, 55, 60, 130, 30, 130, 5, 60, 50, 144, GrowthRate.FAST, 50, false), - new PokemonSpecies(Species.TYPE_NULL, "Type: Null", 7, false, false, false, "Synthetic Pokémon", Type.NORMAL, null, 1.9, 120.5, Abilities.BATTLE_ARMOR, Abilities.NONE, Abilities.NONE, 534, 95, 95, 95, 95, 95, 59, 3, 0, 107, GrowthRate.SLOW, null, false), + new PokemonSpecies(Species.TYPE_NULL, "Type: Null", 7, true, false, false, "Synthetic Pokémon", Type.NORMAL, null, 1.9, 120.5, Abilities.BATTLE_ARMOR, Abilities.NONE, Abilities.NONE, 534, 95, 95, 95, 95, 95, 59, 3, 0, 107, GrowthRate.SLOW, null, false), new PokemonSpecies(Species.SILVALLY, "Silvally", 7, true, false, false, "Synthetic Pokémon", Type.NORMAL, null, 2.3, 100.5, Abilities.RKS_SYSTEM, Abilities.NONE, Abilities.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285, GrowthRate.SLOW, null, false, false, new PokemonForm("Type: Normal", "normal", Type.NORMAL, null, 2.3, 100.5, Abilities.RKS_SYSTEM, Abilities.NONE, Abilities.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285, false, ""), new PokemonForm("Type: Fighting", "fighting", Type.FIGHTING, null, 2.3, 100.5, Abilities.RKS_SYSTEM, Abilities.NONE, Abilities.NONE, 570, 95, 95, 95, 95, 95, 95, 3, 0, 285), diff --git a/src/egg-hatch-phase.ts b/src/egg-hatch-phase.ts index 8cc57ac6c..f047a6a72 100644 --- a/src/egg-hatch-phase.ts +++ b/src/egg-hatch-phase.ts @@ -444,12 +444,4 @@ export class EggHatchPhase extends BattlePhase { return ret; } -} - -export class EndEvolutionPhase extends BattlePhase { - start() { - super.start(); - - this.scene.ui.setModeForceTransition(Mode.MESSAGE).then(() => this.end()); - } } \ No newline at end of file diff --git a/src/evolution-phase.ts b/src/evolution-phase.ts index 69f7d3fc5..3e5c0bdc0 100644 --- a/src/evolution-phase.ts +++ b/src/evolution-phase.ts @@ -6,39 +6,47 @@ import EvolutionSceneHandler from "./ui/evolution-scene-handler"; import * as Utils from "./utils"; import { Mode } from "./ui/ui"; import { LearnMovePhase } from "./battle-phases"; -import { SpeciesFormKey } from "./data/pokemon-species"; -import { achvs } from "./system/achv"; import { cos, sin } from "./anims"; +import { PlayerPokemon } from "./pokemon"; export class EvolutionPhase extends BattlePhase { - private partyMemberIndex: integer; + protected pokemon: PlayerPokemon; + protected lastLevel: integer; + private evolution: SpeciesEvolution; - private lastLevel: integer; - private evolutionContainer: Phaser.GameObjects.Container; - private evolutionBaseBg: Phaser.GameObjects.Image; - private evolutionBg: Phaser.GameObjects.Video; - private evolutionBgOverlay: Phaser.GameObjects.Rectangle; - private evolutionOverlay: Phaser.GameObjects.Rectangle; - private pokemonSprite: Phaser.GameObjects.Sprite; - private pokemonTintSprite: Phaser.GameObjects.Sprite; - private pokemonEvoSprite: Phaser.GameObjects.Sprite; - private pokemonEvoTintSprite: Phaser.GameObjects.Sprite; + protected evolutionContainer: Phaser.GameObjects.Container; + protected evolutionBaseBg: Phaser.GameObjects.Image; + protected evolutionBg: Phaser.GameObjects.Video; + protected evolutionBgOverlay: Phaser.GameObjects.Rectangle; + protected evolutionOverlay: Phaser.GameObjects.Rectangle; + protected pokemonSprite: Phaser.GameObjects.Sprite; + protected pokemonTintSprite: Phaser.GameObjects.Sprite; + protected pokemonEvoSprite: Phaser.GameObjects.Sprite; + protected pokemonEvoTintSprite: Phaser.GameObjects.Sprite; - constructor(scene: BattleScene, partyMemberIndex: integer, evolution: SpeciesEvolution, lastLevel: integer) { + constructor(scene: BattleScene, pokemon: PlayerPokemon, evolution: SpeciesEvolution, lastLevel: integer) { super(scene); - this.partyMemberIndex = partyMemberIndex; + this.pokemon = pokemon; this.evolution = evolution; this.lastLevel = lastLevel; } + validate(): boolean { + return !!this.evolution; + } + + setMode(): Promise { + return this.scene.ui.setModeForceTransition(Mode.EVOLUTION_SCENE); + } + start() { super.start(); - this.scene.ui.setModeForceTransition(Mode.EVOLUTION_SCENE).then(() => { + this.setMode().then(() => { - if (!this.evolution) + if (!this.validate()) return this.end(); this.scene.fadeOutBgm(null, false); @@ -75,181 +83,183 @@ export class EvolutionPhase extends BattlePhase { this.pokemonEvoTintSprite.setVisible(false); this.pokemonEvoTintSprite.setTintFill(0xFFFFFF); - this.evolutionOverlay = this.scene.add.rectangle(0, -this.scene.game.canvas.height / 6, this.scene.game.canvas.width / 6, this.scene.game.canvas.height / 6, 0xFFFFFF); + this.evolutionOverlay = this.scene.add.rectangle(0, -this.scene.game.canvas.height / 6, this.scene.game.canvas.width / 6, (this.scene.game.canvas.height / 6) - 48, 0xFFFFFF); this.evolutionOverlay.setOrigin(0, 0); this.evolutionOverlay.setAlpha(0); - this.scene.fieldUI.add(this.evolutionOverlay); - - const pokemon = this.scene.getParty()[this.partyMemberIndex]; - const preName = pokemon.name; + this.scene.ui.add(this.evolutionOverlay); [ this.pokemonSprite, this.pokemonTintSprite, this.pokemonEvoSprite, this.pokemonEvoTintSprite ].map(sprite => { - sprite.play(pokemon.getSpriteKey(true)); + sprite.play(this.pokemon.getSpriteKey(true)); sprite.setPipeline(this.scene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], hasShadow: false }); sprite.pipelineData['ignoreTimeTint'] = true; [ 'spriteColors', 'fusionSpriteColors' ].map(k => { - if (pokemon.summonData?.speciesForm) + if (this.pokemon.summonData?.speciesForm) k += 'Base'; - sprite.pipelineData[k] = pokemon.getSprite().pipelineData[k]; + sprite.pipelineData[k] = this.pokemon.getSprite().pipelineData[k]; }); }); - this.scene.ui.showText(`What?\n${preName} is evolving!`, null, () => { - pokemon.cry(); + this.doEvolution(); + }); + } - pokemon.getPossibleEvolution(this.evolution).then(evolvedPokemon => { + doEvolution(): void { + const evolutionHandler = this.scene.ui.getHandler() as EvolutionSceneHandler; + const preName = this.pokemon.name; + + this.scene.ui.showText(`What?\n${preName} is evolving!`, null, () => { + this.pokemon.cry(); - [ this.pokemonEvoSprite, this.pokemonEvoTintSprite ].map(sprite => { - sprite.play(evolvedPokemon.getSpriteKey(true)); - sprite.pipelineData['ignoreTimeTint'] = true; - [ 'spriteColors', 'fusionSpriteColors' ].map(k => { - if (evolvedPokemon.summonData?.speciesForm) - k += 'Base'; - sprite.pipelineData[k] = evolvedPokemon.getSprite().pipelineData[k]; - }); + this.pokemon.getPossibleEvolution(this.evolution).then(evolvedPokemon => { + + [ this.pokemonEvoSprite, this.pokemonEvoTintSprite ].map(sprite => { + sprite.play(evolvedPokemon.getSpriteKey(true)); + sprite.pipelineData['ignoreTimeTint'] = true; + [ 'spriteColors', 'fusionSpriteColors' ].map(k => { + if (evolvedPokemon.summonData?.speciesForm) + k += 'Base'; + sprite.pipelineData[k] = evolvedPokemon.getSprite().pipelineData[k]; }); + }); - this.scene.time.delayedCall(1000, () => { - const evolutionBgm = this.scene.playSoundWithoutBgm('evolution'); - this.scene.tweens.add({ - targets: this.evolutionBgOverlay, - alpha: 1, - delay: 500, - duration: 1500, - ease: 'Sine.easeOut', - onComplete: () => { - this.scene.time.delayedCall(1000, () => { - this.scene.tweens.add({ - targets: this.evolutionBgOverlay, - alpha: 0, - duration: 250 - }); - this.evolutionBg.setVisible(true); - this.evolutionBg.play(); + this.scene.time.delayedCall(1000, () => { + const evolutionBgm = this.scene.playSoundWithoutBgm('evolution'); + this.scene.tweens.add({ + targets: this.evolutionBgOverlay, + alpha: 1, + delay: 500, + duration: 1500, + ease: 'Sine.easeOut', + onComplete: () => { + this.scene.time.delayedCall(1000, () => { + this.scene.tweens.add({ + targets: this.evolutionBgOverlay, + alpha: 0, + duration: 250 }); - this.scene.playSound('charge'); - this.doSpiralUpward(); - this.scene.tweens.addCounter({ - from: 0, - to: 1, - duration: 2000, - onUpdate: t => { - this.pokemonTintSprite.setAlpha(t.getValue()); - }, - onComplete: () => { - this.pokemonSprite.setVisible(false); - this.scene.time.delayedCall(1100, () => { - this.scene.playSound('beam'); - this.doArcDownward(); - this.scene.time.delayedCall(1500, () => { - this.pokemonEvoTintSprite.setScale(0.25); - this.pokemonEvoTintSprite.setVisible(true); - evolutionHandler.canCancel = true; - this.doCycle(1).then(success => { - if (!success) { + this.evolutionBg.setVisible(true); + this.evolutionBg.play(); + }); + this.scene.playSound('charge'); + this.doSpiralUpward(); + this.scene.tweens.addCounter({ + from: 0, + to: 1, + duration: 2000, + onUpdate: t => { + this.pokemonTintSprite.setAlpha(t.getValue()); + }, + onComplete: () => { + this.pokemonSprite.setVisible(false); + this.scene.time.delayedCall(1100, () => { + this.scene.playSound('beam'); + this.doArcDownward(); + this.scene.time.delayedCall(1500, () => { + this.pokemonEvoTintSprite.setScale(0.25); + this.pokemonEvoTintSprite.setVisible(true); + evolutionHandler.canCancel = true; + this.doCycle(1).then(success => { + if (!success) { - this.pokemonSprite.setVisible(true); - this.pokemonTintSprite.setScale(1); - this.scene.tweens.add({ - targets: [ this.evolutionBg, this.pokemonTintSprite, this.pokemonEvoSprite, this.pokemonEvoTintSprite ], - alpha: 0, - duration: 250, - onComplete: () => { - this.evolutionBg.setVisible(false); - } + this.pokemonSprite.setVisible(true); + this.pokemonTintSprite.setScale(1); + this.scene.tweens.add({ + targets: [ this.evolutionBg, this.pokemonTintSprite, this.pokemonEvoSprite, this.pokemonEvoTintSprite ], + alpha: 0, + duration: 250, + onComplete: () => { + this.evolutionBg.setVisible(false); + } + }); + + SoundFade.fadeOut(this.scene, evolutionBgm, 100); + + this.scene.unshiftPhase(new EndEvolutionPhase(this.scene)); + + this.scene.ui.showText(`${preName} stopped evolving.`, null, () => { + this.scene.ui.showText(`Would you like to pause evolutions for ${preName}?\nEvolutions can be re-enabled from the party screen.`, null, () => { + const end = () => { + this.scene.ui.showText(null, 0); + this.scene.playBgm(); + evolvedPokemon.destroy(); + this.end(); + }; + this.scene.ui.setOverlayMode(Mode.CONFIRM, () => { + this.scene.ui.revertMode(); + this.pokemon.pauseEvolutions = true; + this.scene.ui.showText(`Evolutions have been paused for ${preName}.`, null, end, 3000); + }, () => { + this.scene.ui.revertMode(); + this.scene.time.delayedCall(3000, end); + }); }); + }, null, true); + return; + } + + this.scene.playSound('sparkle'); + this.pokemonEvoSprite.setVisible(true); + this.doCircleInward(); + this.scene.time.delayedCall(900, () => { + evolutionHandler.canCancel = false; - SoundFade.fadeOut(this.scene, evolutionBgm, 100); - + this.pokemon.evolve(this.evolution).then(() => { + const levelMoves = this.pokemon.getLevelMoves(this.lastLevel + 1, true); + for (let lm of levelMoves) + this.scene.unshiftPhase(new LearnMovePhase(this.scene, this.scene.getParty().indexOf(this.pokemon), lm)); this.scene.unshiftPhase(new EndEvolutionPhase(this.scene)); - this.scene.ui.showText(`${preName} stopped evolving.`, null, () => { - this.scene.ui.showText(`Would you like to pause evolutions for ${preName}?\nEvolutions can be re-enabled from the party screen.`, null, () => { - const end = () => { - this.scene.ui.showText(null, 0); - this.scene.playBgm(); - evolvedPokemon.destroy(); - this.end(); - }; - this.scene.ui.setOverlayMode(Mode.CONFIRM, () => { - this.scene.ui.revertMode(); - pokemon.pauseEvolutions = true; - this.scene.ui.showText(`Evolutions have been paused for ${preName}.`, null, end, 3000); - }, () => { - this.scene.ui.revertMode(); - this.scene.time.delayedCall(3000, end); - }); - }); - }, null, true); - return; - } - - this.scene.playSound('sparkle'); - this.pokemonEvoSprite.setVisible(true); - this.doCircleInward(); - this.scene.time.delayedCall(900, () => { - evolutionHandler.canCancel = false; - - pokemon.evolve(this.evolution).then(() => { - const levelMoves = pokemon.getLevelMoves(this.lastLevel + 1, true); - for (let lm of levelMoves) - this.scene.unshiftPhase(new LearnMovePhase(this.scene, this.partyMemberIndex, lm)); - this.scene.unshiftPhase(new EndEvolutionPhase(this.scene)); - - this.scene.playSound('shine'); - this.doSpray(); - this.scene.tweens.add({ - targets: this.evolutionOverlay, - alpha: 1, - duration: 250, - easing: 'Sine.easeIn', - onComplete: () => { - this.evolutionBgOverlay.setAlpha(1); - this.evolutionBg.setVisible(false); - this.scene.tweens.add({ - targets: [ this.evolutionOverlay, this.pokemonEvoTintSprite ], - alpha: 0, - duration: 2000, - delay: 150, - easing: 'Sine.easeIn', - onComplete: () => { - this.scene.tweens.add({ - targets: this.evolutionBgOverlay, - alpha: 0, - duration: 250, - onComplete: () => { - SoundFade.fadeOut(this.scene, evolutionBgm, 100); - this.scene.time.delayedCall(250, () => { - pokemon.cry(); - this.scene.time.delayedCall(1250, () => { - this.scene.playSoundWithoutBgm('evolution_fanfare'); - if (this.evolution.evoFormKey && this.evolution.evoFormKey.indexOf(SpeciesFormKey.MEGA) > -1) - this.scene.validateAchv(achvs.MEGA_EVOLVE); - - evolvedPokemon.destroy(); - this.scene.ui.showText(`Congratulations! Your ${preName}\nevolved into ${pokemon.name}!`, null, () => this.end(), null, true, 3000); - this.scene.time.delayedCall(Utils.fixedInt(4250), () => this.scene.playBgm()); - }); + this.scene.playSound('shine'); + this.doSpray(); + this.scene.tweens.add({ + targets: this.evolutionOverlay, + alpha: 1, + duration: 250, + easing: 'Sine.easeIn', + onComplete: () => { + this.evolutionBgOverlay.setAlpha(1); + this.evolutionBg.setVisible(false); + this.scene.tweens.add({ + targets: [ this.evolutionOverlay, this.pokemonEvoTintSprite ], + alpha: 0, + duration: 2000, + delay: 150, + easing: 'Sine.easeIn', + onComplete: () => { + this.scene.tweens.add({ + targets: this.evolutionBgOverlay, + alpha: 0, + duration: 250, + onComplete: () => { + SoundFade.fadeOut(this.scene, evolutionBgm, 100); + this.scene.time.delayedCall(250, () => { + this.pokemon.cry(); + this.scene.time.delayedCall(1250, () => { + this.scene.playSoundWithoutBgm('evolution_fanfare'); + + evolvedPokemon.destroy(); + this.scene.ui.showText(`Congratulations! Your ${preName}\nevolved into ${this.pokemon.name}!`, null, () => this.end(), null, true, Utils.fixedInt(4000)); + this.scene.time.delayedCall(Utils.fixedInt(4250), () => this.scene.playBgm()); }); - } - }); - } - }); - } - }); + }); + } + }); + } + }); + } }); }); }); }); }); - } - }) - } - }); + }); + } + }) + } }); }); - }, 1000); - }); + }); + }, 1000); } doSpiralUpward() { @@ -288,10 +298,10 @@ export class EvolutionPhase extends BattlePhase { }); } - doCycle(l: number): Promise { + doCycle(l: number, lastCycle: integer = 15): Promise { return new Promise(resolve => { const evolutionHandler = this.scene.ui.getHandler() as EvolutionSceneHandler; - const isLastCycle = l === 15; + const isLastCycle = l === lastCycle; this.scene.tweens.add({ targets: this.pokemonTintSprite, scale: 0.25, @@ -308,8 +318,8 @@ export class EvolutionPhase extends BattlePhase { onComplete: () => { if (evolutionHandler.cancelled) return resolve(false); - if (l < 15) - this.doCycle(l + 0.5).then(success => resolve(success)); + if (l < lastCycle) + this.doCycle(l + 0.5, lastCycle).then(success => resolve(success)); else { this.pokemonTintSprite.setVisible(false); resolve(true); diff --git a/src/form-change-phase.ts b/src/form-change-phase.ts new file mode 100644 index 000000000..73886da5a --- /dev/null +++ b/src/form-change-phase.ts @@ -0,0 +1,188 @@ +import BattleScene from "./battle-scene"; +import * as Utils from "./utils"; +import { SpeciesFormKey } from "./data/pokemon-species"; +import { achvs } from "./system/achv"; +import { SpeciesFormChange, getSpeciesFormChangeMessage } from "./data/pokemon-forms"; +import { EndEvolutionPhase, EvolutionPhase } from "./evolution-phase"; +import Pokemon, { PlayerPokemon } from "./pokemon"; +import { Mode } from "./ui/ui"; +import PartyUiHandler from "./ui/party-ui-handler"; +import { BattlePhase } from "./battle-phase"; + +export class FormChangePhase extends EvolutionPhase { + private formChange: SpeciesFormChange; + private modal: boolean; + + constructor(scene: BattleScene, pokemon: PlayerPokemon, formChange: SpeciesFormChange, modal: boolean) { + super(scene, pokemon, null, 0); + + this.formChange = formChange; + this.modal = modal; + } + + validate(): boolean { + return !!this.formChange; + } + + setMode(): Promise { + if (!this.modal) + return super.setMode(); + return this.scene.ui.setOverlayMode(Mode.EVOLUTION_SCENE); + } + + doEvolution(): void { + const preName = this.pokemon.name; + + this.pokemon.getPossibleForm(this.formChange).then(transformedPokemon => { + + [ this.pokemonEvoSprite, this.pokemonEvoTintSprite ].map(sprite => { + sprite.play(transformedPokemon.getSpriteKey(true)); + sprite.pipelineData['ignoreTimeTint'] = true; + [ 'spriteColors', 'fusionSpriteColors' ].map(k => { + if (transformedPokemon.summonData?.speciesForm) + k += 'Base'; + sprite.pipelineData[k] = transformedPokemon.getSprite().pipelineData[k]; + }); + }); + + this.scene.time.delayedCall(250, () => { + this.scene.tweens.add({ + targets: this.evolutionBgOverlay, + alpha: 1, + delay: 500, + duration: 1500, + ease: 'Sine.easeOut', + onComplete: () => { + this.scene.time.delayedCall(1000, () => { + this.scene.tweens.add({ + targets: this.evolutionBgOverlay, + alpha: 0, + duration: 250 + }); + this.evolutionBg.setVisible(true); + this.evolutionBg.play(); + }); + this.scene.playSound('charge'); + this.doSpiralUpward(); + this.scene.tweens.addCounter({ + from: 0, + to: 1, + duration: 2000, + onUpdate: t => { + this.pokemonTintSprite.setAlpha(t.getValue()); + }, + onComplete: () => { + this.pokemonSprite.setVisible(false); + this.scene.time.delayedCall(1100, () => { + this.scene.playSound('beam'); + this.doArcDownward(); + this.scene.time.delayedCall(1000, () => { + this.pokemonEvoTintSprite.setScale(0.25); + this.pokemonEvoTintSprite.setVisible(true); + this.doCycle(1, 1).then(_success => { + this.scene.playSound('sparkle'); + this.pokemonEvoSprite.setVisible(true); + this.doCircleInward(); + this.scene.time.delayedCall(900, () => { + this.pokemon.changeForm(this.formChange).then(() => { + if (!this.modal) + this.scene.unshiftPhase(new EndEvolutionPhase(this.scene)); + + this.scene.playSound('shine'); + this.doSpray(); + this.scene.tweens.add({ + targets: this.evolutionOverlay, + alpha: 1, + duration: 250, + easing: 'Sine.easeIn', + onComplete: () => { + this.evolutionBgOverlay.setAlpha(1); + this.evolutionBg.setVisible(false); + this.scene.tweens.add({ + targets: [ this.evolutionOverlay, this.pokemonEvoTintSprite ], + alpha: 0, + duration: 2000, + delay: 150, + easing: 'Sine.easeIn', + onComplete: () => { + this.scene.tweens.add({ + targets: this.evolutionBgOverlay, + alpha: 0, + duration: 250, + onComplete: () => { + this.scene.time.delayedCall(250, () => { + this.pokemon.cry(); + this.scene.time.delayedCall(1250, () => { + const isMega = this.formChange.formKey.indexOf(SpeciesFormKey.MEGA) > -1; + const isRevert = !isMega && this.formChange.formKey === this.pokemon.species.forms[0].formKey; + let playEvolutionFanfare = false; + if (isMega) { + this.scene.validateAchv(achvs.MEGA_EVOLVE); + playEvolutionFanfare = true; + } + + const delay = playEvolutionFanfare ? 4000 : 1750; + this.scene.playSoundWithoutBgm(playEvolutionFanfare ? 'evolution_fanfare' : 'minor_fanfare'); + + transformedPokemon.destroy(); + this.scene.ui.showText(getSpeciesFormChangeMessage(this.pokemon, this.formChange, preName), null, () => this.end(), null, true, Utils.fixedInt(delay)); + this.scene.time.delayedCall(Utils.fixedInt(delay + 250), () => this.scene.playBgm()); + }); + }); + } + }); + } + }); + } + }); + }); + }); + }); + }); + }); + } + }) + } + }); + }); + }); + } + + end(): void { + if (this.modal) { + this.scene.ui.revertMode().then(() => { + if (this.scene.ui.getMode() === Mode.PARTY) { + const partyUiHandler = this.scene.ui.getHandler() as PartyUiHandler; + partyUiHandler.clearPartySlots(); + partyUiHandler.populatePartySlots(); + } + + super.end(); + }); + } else + super.end(); + } +} + +export class QuietFormChangePhase extends BattlePhase { + protected pokemon: Pokemon; + protected formChange: SpeciesFormChange; + + constructor(scene: BattleScene, pokemon: Pokemon, formChange: SpeciesFormChange) { + super(scene); + this.pokemon = pokemon; + this.formChange = formChange; + } + + start(): void { + super.start(); + + if (this.pokemon.formIndex === this.pokemon.species.forms.findIndex(f => f.formKey === this.formChange.formKey)) + return this.end(); + + const preName = this.pokemon.name; + this.pokemon.changeForm(this.formChange).then(() => { + this.scene.ui.showText(getSpeciesFormChangeMessage(this.pokemon, this.formChange, preName), null, () => this.end(), Utils.fixedInt(1500)); + }); + } +} \ No newline at end of file diff --git a/src/modifier/modifier-type.ts b/src/modifier/modifier-type.ts index 4a05eb85f..0fd086e72 100644 --- a/src/modifier/modifier-type.ts +++ b/src/modifier/modifier-type.ts @@ -16,6 +16,7 @@ import { StatusEffect, getStatusEffectDescriptor } from '../data/status-effect'; import { SpeciesFormKey } from '../data/pokemon-species'; import BattleScene from '../battle-scene'; import { VoucherType, getVoucherTypeIcon, getVoucherTypeName } from '../system/voucher'; +import { FormChangeItem, SpeciesFormChangeItemTrigger, pokemonFormChanges } from '../data/pokemon-forms'; type Modifier = Modifiers.Modifier; @@ -446,6 +447,26 @@ export class EvolutionItemModifierType extends PokemonModifierType implements Ge } } +export class FormChangeItemModifierType extends PokemonModifierType implements GeneratedPersistentModifierType { + public formChangeItem: FormChangeItem; + + constructor(formChangeItem: FormChangeItem) { + super(Utils.toReadableString(FormChangeItem[formChangeItem]), `Causes certain Pokémon to change form`, (_type, args) => new Modifiers.PokemonFormChangeItemModifier(this, (args[0] as PlayerPokemon).id, formChangeItem, true), + (pokemon: PlayerPokemon) => { + if (pokemonFormChanges.hasOwnProperty(pokemon.species.speciesId) && !!pokemonFormChanges[pokemon.species.speciesId].find(fc => fc.trigger.hasTriggerType(SpeciesFormChangeItemTrigger))) + return null; + + return PartyUiHandler.NoEffectMessage; + }, FormChangeItem[formChangeItem].toLowerCase()); + + this.formChangeItem = formChangeItem; + } + + getPregenArgs(): any[] { + return [ this.formChangeItem ]; + } +} + export class FusePokemonModifierType extends PokemonModifierType { constructor(name: string, iconImage?: string) { super(name, 'Combines two Pokémon (transfers ability, splits base stats and types, shares move pool)', (_type, args) => new Modifiers.FusePokemonModifier(this, (args[0] as PlayerPokemon).id, (args[1] as PlayerPokemon).id), @@ -524,7 +545,7 @@ class TmModifierTypeGenerator extends ModifierTypeGenerator { } class EvolutionItemModifierTypeGenerator extends ModifierTypeGenerator { - constructor(mega: boolean) { + constructor() { super((party: Pokemon[], pregenArgs?: any[]) => { if (pregenArgs) return new EvolutionItemModifierType(pregenArgs[0] as EvolutionItem); @@ -532,7 +553,7 @@ class EvolutionItemModifierTypeGenerator extends ModifierTypeGenerator { const evolutionItemPool = party.filter(p => pokemonEvolutions.hasOwnProperty(p.species.speciesId)).map(p => { const evolutions = pokemonEvolutions[p.species.speciesId]; return evolutions.filter(e => e.item !== EvolutionItem.NONE && (e.evoFormKey === null || (e.preFormKey || '') === p.getFormKey()) && (!e.condition || e.condition.predicate(p))); - }).flat().filter(e => (e.item >= 100) === mega).flatMap(e => e.item); + }).flat().flatMap(e => e.item); if (!evolutionItemPool.length) return null; @@ -542,6 +563,26 @@ class EvolutionItemModifierTypeGenerator extends ModifierTypeGenerator { } } +class FormChangeItemModifierTypeGenerator extends ModifierTypeGenerator { + constructor() { + super((party: Pokemon[], pregenArgs?: any[]) => { + if (pregenArgs) + return new FormChangeItemModifierType(pregenArgs[0] as FormChangeItem); + + const formChangeItemPool = party.filter(p => pokemonFormChanges.hasOwnProperty(p.species.speciesId)).map(p => { + const formChanges = pokemonFormChanges[p.species.speciesId]; + return formChanges.filter(fc => fc.formKey.indexOf(SpeciesFormKey.MEGA) === -1 || party[0].scene.getModifiers(Modifiers.MegaEvolutionAccessModifier).length) + .map(fc => fc.findTrigger(SpeciesFormChangeItemTrigger) as SpeciesFormChangeItemTrigger).filter(t => t && t.active); + }).flat().flatMap(fc => fc.item); + + if (!formChangeItemPool.length) + return null; + + return new FormChangeItemModifierType(formChangeItemPool[Utils.randSeedInt(formChangeItemPool.length)]); + }); + } +} + export class ContactHeldItemTransferChanceModifierType extends PokemonHeldItemModifierType { constructor(name: string, chancePercent: integer, iconImage?: string, group?: string, soundName?: string) { super(name, `Upon attacking, there is a ${chancePercent}% chance the foe's held item will be stolen`, (type, args) => new Modifiers.ContactHeldItemTransferChanceModifier(type, (args[0] as Pokemon).id, chancePercent), iconImage, group, soundName); @@ -593,8 +634,8 @@ export const modifierTypes = { RARE_CANDY: () => new PokemonLevelIncrementModifierType('Rare Candy'), RARER_CANDY: () => new AllPokemonLevelIncrementModifierType('Rarer Candy'), - EVOLUTION_ITEM: () => new EvolutionItemModifierTypeGenerator(false), - MEGA_EVOLUTION_ITEM: () => new EvolutionItemModifierTypeGenerator(true), + EVOLUTION_ITEM: () => new EvolutionItemModifierTypeGenerator(), + FORM_CHANGE_ITEM: () => new FormChangeItemModifierTypeGenerator(), MEGA_BRACELET: () => new ModifierType('Mega Bracelet', 'Mega stones become available', (type, _args) => new Modifiers.MegaEvolutionAccessModifier(type)), @@ -838,7 +879,7 @@ const modifierPool = { new WeightedModifierType(modifierTypes.ABILITY_CHARM, 2), new WeightedModifierType(modifierTypes.IV_SCANNER, 2), new WeightedModifierType(modifierTypes.EXP_BALANCE, 1), - new WeightedModifierType(modifierTypes.MEGA_EVOLUTION_ITEM, (party: Pokemon[]) => party[0].scene.getModifiers(Modifiers.MegaEvolutionAccessModifier).length && !party.filter(p => p.getFormKey().indexOf(SpeciesFormKey.MEGA) > -1).length ? 1 : 0), + new WeightedModifierType(modifierTypes.FORM_CHANGE_ITEM, 1), new WeightedModifierType(modifierTypes.REVERSE_DNA_SPLICERS, (party: Pokemon[]) => party[0].scene.gameMode !== GameMode.SPLICED_ENDLESS && party.filter(p => p.fusionSpecies).length ? 3 : 0), ].map(m => { m.setTier(ModifierTier.ULTRA); return m; }), [ModifierTier.MASTER]: [ diff --git a/src/modifier/modifier.ts b/src/modifier/modifier.ts index 043fb66dd..00075b2b6 100644 --- a/src/modifier/modifier.ts +++ b/src/modifier/modifier.ts @@ -17,6 +17,7 @@ import { StatusEffect, getStatusEffectDescriptor } from '../data/status-effect'; import { MoneyAchv } from '../system/achv'; import { VoucherType } from '../system/voucher'; import { PreventBerryUseAbAttr, applyAbAttrs } from '../data/ability'; +import { FormChangeItem, SpeciesFormChangeItemTrigger } from '../data/pokemon-forms'; type ModifierType = ModifierTypes.ModifierType; export type ModifierPredicate = (modifier: Modifier) => boolean; @@ -990,7 +991,7 @@ export class EvolutionItemModifier extends ConsumablePokemonModifier { && (!e.condition || e.condition.predicate(pokemon))); if (matchingEvolution) { - pokemon.scene.unshiftPhase(new EvolutionPhase(pokemon.scene, pokemon.scene.getParty().indexOf(pokemon), matchingEvolution, pokemon.level - 1)); + pokemon.scene.unshiftPhase(new EvolutionPhase(pokemon.scene, pokemon, matchingEvolution, pokemon.level - 1)); return true; } @@ -1260,6 +1261,39 @@ export class PokemonNatureWeightModifier extends PokemonHeldItemModifier { } } +export class PokemonFormChangeItemModifier extends PokemonHeldItemModifier { + public formChangeItem: FormChangeItem; + public active: boolean; + + constructor(type: ModifierTypes.FormChangeItemModifierType, pokemonId: integer, formChangeItem: FormChangeItem, active: boolean, stackCount?: integer) { + super(type, pokemonId, stackCount); + this.formChangeItem = formChangeItem; + this.active = active; + } + + matchType(modifier: Modifier): boolean { + return modifier instanceof PokemonFormChangeItemModifier && modifier.formChangeItem === this.formChangeItem; + } + + clone(): PersistentModifier { + return new PokemonFormChangeItemModifier(this.type as ModifierTypes.FormChangeItemModifierType, this.pokemonId, this.formChangeItem, this.active, this.stackCount); + } + + getArgs(): any[] { + return super.getArgs().concat(this.formChangeItem, this.active); + } + + apply(args: any[]): boolean { + const pokemon = args[0] as Pokemon; + + return pokemon.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeItemTrigger); + } + + getMaxHeldItemCount(pokemon: Pokemon): integer { + return 1; + } +} + export class MoneyMultiplierModifier extends PersistentModifier { constructor(type: ModifierType, stackCount?: integer) { super(type, stackCount); diff --git a/src/pokemon.ts b/src/pokemon.ts index 0eb7ba7de..7594b1424 100644 --- a/src/pokemon.ts +++ b/src/pokemon.ts @@ -34,6 +34,7 @@ import { DamageAchv, achvs } from './system/achv'; import { DexAttr } from './system/game-data'; import { QuantizerCelebi, argbFromRgba, rgbaFromArgb } from '@material/material-color-utilities'; import { Nature, getNatureStatMultiplier } from './data/nature'; +import { SpeciesFormChange, SpeciesFormChangeMoveUsedTrigger, SpeciesFormChangeStatusEffectTrigger } from './data/pokemon-forms'; export enum FieldPosition { CENTER, @@ -145,10 +146,6 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { Utils.binToDec(Utils.decToBin(this.id).substring(20, 25)), Utils.binToDec(Utils.decToBin(this.id).substring(25, 30)) ]; - - this.nature = nature !== undefined - ? nature - : Utils.randSeedInt(25) as Nature; if (this.gender === undefined) { if (this.species.malePercent === null) @@ -163,11 +160,16 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } if (this.formIndex === undefined) - this.formIndex = this.scene.getSpeciesFormIndex(species, this.gender, this.isPlayer()); + this.formIndex = this.scene.getSpeciesFormIndex(species, this.gender, this.nature, this.isPlayer()); if (this.shiny === undefined) this.trySetShiny(); + if (nature !== undefined) + this.setNature(nature); + else + this.generateNature(); + this.friendship = species.baseFriendship; this.metLevel = level; this.metBiome = scene.currentBattle ? scene.arena.biomeType : -1; @@ -544,6 +546,13 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.calculateStats(); } + generateNature(naturePool?: Nature[]): void { + if (naturePool === undefined) + naturePool = Utils.getEnumValues(Nature); + const nature = naturePool[Utils.randSeedInt(naturePool.length)]; + this.setNature(nature); + } + getMaxHp(): integer { return this.getStat(Stat.HP); } @@ -796,7 +805,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.fusionGender = Gender.FEMALE; } - this.fusionFormIndex = this.scene.getSpeciesFormIndex(this.fusionSpecies, this.fusionGender, true); + this.fusionFormIndex = this.scene.getSpeciesFormIndex(this.fusionSpecies, this.fusionGender, this.nature, true); this.generateName(); } @@ -1227,6 +1236,22 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return this.summonData.moveQueue; } + changeForm(formChange: SpeciesFormChange): Promise { + return new Promise(resolve => { + this.formIndex = Math.max(this.species.forms.findIndex(f => f.formKey === formChange.formKey), 0); + this.generateName(); + const abilityCount = this.getSpeciesForm().getAbilityCount(); + if (this.abilityIndex >= abilityCount) // Shouldn't happen + this.abilityIndex = abilityCount - 1; + this.scene.gameData.setPokemonSeen(this, true); + this.loadAssets().then(() => { + this.calculateStats(); + this.scene.updateModifiers(this.isPlayer(), true); + this.updateInfo().then(() => resolve()); + }); + }); + } + cry(soundConfig?: Phaser.Types.Sound.SoundConfig): AnySound { const cry = this.getSpeciesForm().cry(this.scene, soundConfig); let duration = cry.totalDuration * 1000; @@ -1430,6 +1455,10 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } this.status = new Status(effect, 0, cureTurn); + + if (effect !== StatusEffect.FAINT) + this.scene.triggerPokemonFormChange(this, SpeciesFormChangeStatusEffectTrigger, true); + return true; } @@ -1462,6 +1491,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.battleSummonData = new PokemonBattleSummonData(); if (this.getTag(BattlerTagType.SEEDED)) this.lapseTag(BattlerTagType.SEEDED); + this.scene.triggerPokemonFormChange(this, SpeciesFormChangeMoveUsedTrigger, true); } resetTurnData(): void { @@ -1876,6 +1906,33 @@ export class PlayerPokemon extends Pokemon { } } + getPossibleForm(formChange: SpeciesFormChange): Promise { + return new Promise(resolve => { + const formIndex = Math.max(this.species.forms.findIndex(f => f.formKey === formChange.formKey), 0); + const ret = this.scene.addPlayerPokemon(this.species, this.level, this.abilityIndex, formIndex, this.gender, this.shiny, this.ivs, this.nature, this); + ret.loadAssets().then(() => resolve(ret)); + }); + } + + changeForm(formChange: SpeciesFormChange): Promise { + return new Promise(resolve => { + this.formIndex = Math.max(this.species.forms.findIndex(f => f.formKey === formChange.formKey), 0); + this.generateName(); + const abilityCount = this.getSpeciesForm().getAbilityCount(); + if (this.abilityIndex >= abilityCount) // Shouldn't happen + this.abilityIndex = abilityCount - 1; + this.compatibleTms.splice(0, this.compatibleTms.length); + this.generateCompatibleTms(); + this.scene.gameData.setPokemonSeen(this, false); + this.scene.gameData.setPokemonCaught(this, false); + this.loadAssets().then(() => { + this.calculateStats(); + this.scene.updateModifiers(true, true); + this.updateInfo().then(() => resolve()); + }); + }); + } + isFusion(): boolean { return !!(this.fusionSpecies || (this.species.speciesId === Species.KYUREM && this.formIndex)); } @@ -2160,8 +2217,6 @@ export class EnemyPokemon extends Pokemon { if (this.isFainted()) return 0; - let clearedSegment = false; - if (!ignoreSegments && this.isBoss()) { const segmentSize = this.getMaxHp() / this.bossSegments; for (let s = this.bossSegments - 1; s > 0; s--) { @@ -2169,7 +2224,6 @@ export class EnemyPokemon extends Pokemon { if (this.hp > hpThreshold) { if (this.hp - damage < hpThreshold) { damage = this.hp - hpThreshold; - clearedSegment = true; this.handleBossSegmentCleared(s); } break; diff --git a/src/ui/battle-message-ui-handler.ts b/src/ui/battle-message-ui-handler.ts index 4cabd1723..d50f66a0f 100644 --- a/src/ui/battle-message-ui-handler.ts +++ b/src/ui/battle-message-ui-handler.ts @@ -1,6 +1,6 @@ import BattleScene, { Button } from "../battle-scene"; import { addTextObject, TextStyle } from "./text"; -import UI, { Mode } from "./ui"; +import { Mode } from "./ui"; import * as Utils from "../utils"; import MessageUiHandler from "./message-ui-handler"; import { getStatName, Stat } from "../data/pokemon-stat"; diff --git a/src/ui/command-ui-handler.ts b/src/ui/command-ui-handler.ts index ce8d73699..b08a96a79 100644 --- a/src/ui/command-ui-handler.ts +++ b/src/ui/command-ui-handler.ts @@ -44,11 +44,18 @@ export default class CommandUiHandler extends UiHandler { this.commandsContainer.setVisible(true); + let commandPhase: CommandPhase; + let currentPhase = this.scene.getCurrentPhase(); + if (currentPhase instanceof CommandPhase) + commandPhase = currentPhase; + else + commandPhase = this.scene.getStandbyPhase() as CommandPhase; + const messageHandler = this.getUi().getMessageHandler(); messageHandler.commandWindow.setVisible(true); messageHandler.movesWindowContainer.setVisible(false); messageHandler.message.setWordWrapWidth(1110); - messageHandler.showText(`What will\n${(this.scene.getCurrentPhase() as CommandPhase).getPokemon().name} do?`, 0); + messageHandler.showText(`What will\n${commandPhase.getPokemon().name} do?`, 0); this.setCursor(this.getCursor()); return true; @@ -118,8 +125,6 @@ export default class CommandUiHandler extends UiHandler { } setCursor(cursor: integer): boolean { - const ui = this.getUi(); - const changed = this.getCursor() !== cursor; if (changed) { if (!this.fieldIndex) @@ -140,6 +145,7 @@ export default class CommandUiHandler extends UiHandler { clear(): void { super.clear(); + this.getUi().getMessageHandler().commandWindow.setVisible(false); this.commandsContainer.setVisible(false); this.getUi().getMessageHandler().clearText(); this.eraseCursor(); diff --git a/src/ui/evolution-scene-handler.ts b/src/ui/evolution-scene-handler.ts index baebdf752..6aa517770 100644 --- a/src/ui/evolution-scene-handler.ts +++ b/src/ui/evolution-scene-handler.ts @@ -1,48 +1,99 @@ import BattleScene, { Button } from "../battle-scene"; +import MessageUiHandler from "./message-ui-handler"; +import { TextStyle, addTextObject } from "./text"; import { Mode } from "./ui"; -import UiHandler from "./ui-handler"; -export default class EvolutionSceneHandler extends UiHandler { - public evolutionContainer: Phaser.GameObjects.Container; - public canCancel: boolean; - public cancelled: boolean; +export default class EvolutionSceneHandler extends MessageUiHandler { + public evolutionContainer: Phaser.GameObjects.Container; + public messageBg: Phaser.GameObjects.Image; + public messageContainer: Phaser.GameObjects.Container; + public canCancel: boolean; + public cancelled: boolean; - constructor(scene: BattleScene) { - super(scene, Mode.EVOLUTION_SCENE); - } - - setup() { - this.canCancel = false; - this.cancelled = false; + constructor(scene: BattleScene) { + super(scene, Mode.EVOLUTION_SCENE); + } - this.evolutionContainer = this.scene.add.container(0, -this.scene.game.canvas.height / 6); - this.scene.fieldUI.add(this.evolutionContainer); - } + setup() { + this.canCancel = false; + this.cancelled = false; - show(_args: any[]): boolean { - super.show(_args); - - this.scene.fieldUI.bringToTop(this.evolutionContainer); + const ui = this.getUi(); + this.evolutionContainer = this.scene.add.container(0, -this.scene.game.canvas.height / 6); + ui.add(this.evolutionContainer); + + const messageBg = this.scene.add.image(0, 0, 'bg'); + messageBg.setOrigin(0, 1); + messageBg.setVisible(false); + ui.add(messageBg); + + this.messageBg = messageBg; + + this.messageContainer = this.scene.add.container(12, -39); + this.messageContainer.setVisible(false); + ui.add(this.messageContainer); + + const message = addTextObject(this.scene, 0, 0, '', TextStyle.MESSAGE, { + maxLines: 2, + wordWrap: { + width: 1780 + } + }); + this.messageContainer.add(message); + + this.message = message; + + const prompt = this.scene.add.sprite(0, 0, 'prompt'); + prompt.setVisible(false); + prompt.setOrigin(0, 0); + this.messageContainer.add(prompt); + + this.prompt = prompt; + } + + show(_args: any[]): boolean { + super.show(_args); + + this.scene.ui.bringToTop(this.evolutionContainer); + this.scene.ui.bringToTop(this.messageBg); + this.scene.ui.bringToTop(this.messageContainer); + this.messageBg.setVisible(true); + this.messageContainer.setVisible(true); + + return true; + } + + processInput(button: Button): boolean { + if (this.canCancel && !this.cancelled && button === Button.CANCEL) { + this.cancelled = true; return true; } - - processInput(button: Button): boolean { - if (this.canCancel && !this.cancelled && button === Button.CANCEL) { - this.cancelled = true; - return true; + + const ui = this.getUi(); + if (this.awaitingActionInput) { + if (button === Button.CANCEL || button === Button.ACTION) { + if (this.onActionInput) { + ui.playSelect(); + const originalOnActionInput = this.onActionInput; + this.onActionInput = null; + originalOnActionInput(); + return true; + } } + } + } - return this.scene.ui.getMessageHandler().processInput(button); - } - - setCursor(_cursor: integer): boolean { - return false; - } + setCursor(_cursor: integer): boolean { + return false; + } - clear() { - this.canCancel = false; - this.cancelled = false; - this.evolutionContainer.removeAll(true); - } - } \ No newline at end of file + clear() { + this.clearText(); + this.canCancel = false; + this.cancelled = false; + this.evolutionContainer.removeAll(true); + this.messageContainer.setVisible(false); + this.messageBg.setVisible(false); + } +} \ No newline at end of file diff --git a/src/ui/party-ui-handler.ts b/src/ui/party-ui-handler.ts index e40f5a76b..1ebbf6df8 100644 --- a/src/ui/party-ui-handler.ts +++ b/src/ui/party-ui-handler.ts @@ -6,13 +6,14 @@ import { Command } from "./command-ui-handler"; import MessageUiHandler from "./message-ui-handler"; import { Mode } from "./ui"; import * as Utils from "../utils"; -import { PokemonHeldItemModifier, SwitchEffectTransferModifier } from "../modifier/modifier"; +import { PokemonFormChangeItemModifier, PokemonHeldItemModifier, SwitchEffectTransferModifier } from "../modifier/modifier"; import { Moves, allMoves } from "../data/move"; import { getGenderColor, getGenderSymbol } from "../data/gender"; import { StatusEffect } from "../data/status-effect"; import PokemonIconAnimHandler, { PokemonIconAnimMode } from "./pokemon-icon-anim-handler"; import { pokemonEvolutions } from "../data/pokemon-evolutions"; import { addWindow } from "./window"; +import { SpeciesFormChangeItemTrigger } from "../data/pokemon-forms"; const defaultMessage = 'Choose a Pokémon.'; @@ -38,11 +39,12 @@ export enum PartyOption { TRANSFER, SPLICE, SUMMARY, - UNPAUSE_EVO, + UNPAUSE_EVOLUTION, RELEASE, SCROLL_UP = 1000, SCROLL_DOWN = 1001, - MOVE_1 = 2000, + FORM_CHANGE_ITEM = 2000, + MOVE_1 = 3000, MOVE_2, MOVE_3, MOVE_4 @@ -72,6 +74,7 @@ export default class PartyUiHandler extends MessageUiHandler { private optionsScrollCursor: integer = 0; private optionsScrollTotal: integer = 0; private optionsContainer: Phaser.GameObjects.Container; + private optionsBg: Phaser.GameObjects.NineSlice; private optionsCursorObj: Phaser.GameObjects.Image; private options: integer[]; @@ -228,7 +231,7 @@ export default class PartyUiHandler extends MessageUiHandler { } ui.playSelect(); return true; - } else if ((option !== PartyOption.SUMMARY && option !== PartyOption.UNPAUSE_EVO && option !== PartyOption.RELEASE && option !== PartyOption.CANCEL) + } else if ((option !== PartyOption.SUMMARY && option !== PartyOption.UNPAUSE_EVOLUTION && option !== PartyOption.RELEASE && option !== PartyOption.CANCEL) || (option === PartyOption.RELEASE && this.partyUiMode === PartyUiMode.RELEASE)) { let filterResult: string; if (option !== PartyOption.TRANSFER && option !== PartyOption.SPLICE) { @@ -262,8 +265,23 @@ export default class PartyUiHandler extends MessageUiHandler { this.selectCallback = null; selectCallback(this.cursor, option); } - } else if (this.cursor) - (this.scene.getCurrentPhase() as CommandPhase).handleCommand(Command.POKEMON, this.cursor, option === PartyOption.PASS_BATON); + } else { + if (option >= PartyOption.FORM_CHANGE_ITEM && this.scene.getCurrentPhase() instanceof CommandPhase) { + switch (this.partyUiMode) { + case PartyUiMode.SWITCH: + case PartyUiMode.FAINT_SWITCH: + case PartyUiMode.POST_BATTLE_SWITCH: + let formChangeItemModifiers = this.scene.findModifiers(m => m instanceof PokemonFormChangeItemModifier && m.pokemonId === pokemon.id) as PokemonFormChangeItemModifier[]; + if (formChangeItemModifiers.find(m => m.active)) + formChangeItemModifiers = formChangeItemModifiers.filter(m => m.active); + const modifier = formChangeItemModifiers[option - PartyOption.FORM_CHANGE_ITEM]; + modifier.active = !modifier.active; + this.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeItemTrigger, false, true); + break; + } + } else if (this.cursor) + (this.scene.getCurrentPhase() as CommandPhase).handleCommand(Command.POKEMON, this.cursor, option === PartyOption.PASS_BATON); + } if (this.partyUiMode !== PartyUiMode.MODIFIER && this.partyUiMode !== PartyUiMode.TM_MODIFIER && this.partyUiMode !== PartyUiMode.MOVE_MODIFIER) ui.playSelect(); return true; @@ -275,7 +293,7 @@ export default class PartyUiHandler extends MessageUiHandler { ui.playSelect(); ui.setModeWithoutClear(Mode.SUMMARY, pokemon).then(() => this.clearOptions()); return true; - } else if (option === PartyOption.UNPAUSE_EVO) { + } else if (option === PartyOption.UNPAUSE_EVOLUTION) { this.clearOptions(); ui.playSelect(); pokemon.pauseEvolutions = false; @@ -356,7 +374,7 @@ export default class PartyUiHandler extends MessageUiHandler { break; case Button.RIGHT: const battlerCount = this.scene.currentBattle.getBattlerCount(); - if (slotCount && this.cursor < battlerCount) + if (slotCount > battlerCount && this.cursor < battlerCount) success = this.setCursor(this.lastCursor < 6 ? this.lastCursor || battlerCount : battlerCount); break; } @@ -423,8 +441,7 @@ export default class PartyUiHandler extends MessageUiHandler { this.optionsCursorObj.setOrigin(0, 0); this.optionsContainer.add(this.optionsCursorObj); } - const wideOptions = this.partyUiMode === PartyUiMode.MODIFIER_TRANSFER; - this.optionsCursorObj.setPosition(-86 - (wideOptions ? 50 : 0), -19 - (16 * ((this.options.length - 1) - this.optionsCursor))); + this.optionsCursorObj.setPosition(8 - this.optionsBg.displayWidth, -19 - (16 * ((this.options.length - 1) - this.optionsCursor))); } else { changed = this.cursor !== cursor; if (changed) { @@ -485,9 +502,7 @@ export default class PartyUiHandler extends MessageUiHandler { this.updateOptions(); - const wideOptions = this.partyUiMode === PartyUiMode.MODIFIER_TRANSFER; - - this.partyMessageBox.setSize(262 - (wideOptions ? 88 : 38), 30); + this.partyMessageBox.setSize(262 - Math.max(this.optionsBg.displayWidth - 56, 0), 30); this.setCursor(0); } @@ -512,6 +527,8 @@ export default class PartyUiHandler extends MessageUiHandler { this.eraseOptionsCursor(); } + let formChangeItemModifiers: PokemonFormChangeItemModifier[]; + if (this.partyUiMode !== PartyUiMode.MOVE_MODIFIER && this.partyUiMode !== PartyUiMode.REMEMBER_MOVE_MODIFIER && (this.transferMode || this.partyUiMode !== PartyUiMode.MODIFIER_TRANSFER)) { switch (this.partyUiMode) { case PartyUiMode.SWITCH: @@ -524,6 +541,13 @@ export default class PartyUiHandler extends MessageUiHandler { && (m as SwitchEffectTransferModifier).pokemonId === this.scene.getPlayerField()[this.fieldIndex].id)) this.options.push(PartyOption.PASS_BATON); } + if (this.scene.getCurrentPhase() instanceof CommandPhase) { + formChangeItemModifiers = this.scene.findModifiers(m => m instanceof PokemonFormChangeItemModifier && m.pokemonId === pokemon.id) as PokemonFormChangeItemModifier[]; + if (formChangeItemModifiers.find(m => m.active)) + formChangeItemModifiers = formChangeItemModifiers.filter(m => m.active); + for (let i = 0; i < formChangeItemModifiers.length; i++) + this.options.push(PartyOption.FORM_CHANGE_ITEM + i); + } break; case PartyUiMode.MODIFIER: this.options.push(PartyOption.APPLY); @@ -549,7 +573,7 @@ export default class PartyUiHandler extends MessageUiHandler { this.options.push(PartyOption.SUMMARY); if (pokemon.pauseEvolutions && pokemonEvolutions.hasOwnProperty(pokemon.species.speciesId)) - this.options.push(PartyOption.UNPAUSE_EVO); + this.options.push(PartyOption.UNPAUSE_EVOLUTION); if (this.partyUiMode === PartyUiMode.SWITCH) this.options.push(PartyOption.RELEASE); @@ -582,14 +606,17 @@ export default class PartyUiHandler extends MessageUiHandler { this.options.push(PartyOption.CANCEL); - const optionBg = addWindow(this.scene, 0, 0, wideOptions ? 144 : 94, 16 * this.options.length + 13); - optionBg.setOrigin(1, 1); + this.optionsBg = addWindow(this.scene, 0, 0, 0, 16 * this.options.length + 13); + this.optionsBg.setOrigin(1, 1); - this.optionsContainer.add(optionBg); + this.optionsContainer.add(this.optionsBg); optionStartIndex = 0; optionEndIndex = this.options.length; + let widestOptionWidth = 0; + let optionTexts: Phaser.GameObjects.Text[] = []; + for (let o = optionStartIndex; o < optionEndIndex; o++) { const option = this.options[this.options.length - (o + 1)]; let altText = false; @@ -602,11 +629,12 @@ export default class PartyUiHandler extends MessageUiHandler { case PartyOption.MOVE_4: optionName = pokemon.moveset[option - PartyOption.MOVE_1].getName(); break; - case PartyOption.UNPAUSE_EVO: - optionName = 'Unpause Evo.'; - break; default: - optionName = Utils.toReadableString(PartyOption[option]); + if (formChangeItemModifiers && option >= PartyOption.FORM_CHANGE_ITEM) { + const modifier = formChangeItemModifiers[option - PartyOption.FORM_CHANGE_ITEM]; + optionName = `${modifier.active ? 'Deactivate' : 'Activate'} ${modifier.type.name}`; + } else + optionName = Utils.toReadableString(PartyOption[option]); break; } } else if (option === PartyOption.SCROLL_UP) @@ -625,15 +653,23 @@ export default class PartyUiHandler extends MessageUiHandler { } const yCoord = -6 - 16 * o; - const optionText = addTextObject(this.scene, -79 - (wideOptions ? 50 : 0), yCoord - 16, optionName, TextStyle.WINDOW); + const optionText = addTextObject(this.scene, 0, yCoord - 16, optionName, TextStyle.WINDOW); if (altText) { optionText.setColor('#40c8f8'); optionText.setShadowColor('#006090') } optionText.setOrigin(0, 0); + optionTexts.push(optionText); + + widestOptionWidth = Math.max(optionText.displayWidth, widestOptionWidth); + this.optionsContainer.add(optionText); } + + this.optionsBg.width = Math.max(widestOptionWidth + 24, 94); + for (let optionText of optionTexts) + optionText.x = 15 - this.optionsBg.width; } startTransfer(): void { diff --git a/src/ui/ui.ts b/src/ui/ui.ts index 9ab20669f..9a6e66eb9 100644 --- a/src/ui/ui.ts +++ b/src/ui/ui.ts @@ -345,6 +345,7 @@ export default class UI extends Phaser.GameObjects.Container { const touchControls = document.getElementById('touchControls'); if (touchControls) touchControls.dataset.uiMode = Mode[this.mode]; + resolve(true); }; if (noTransitionModes.indexOf(lastMode) === -1) { @@ -356,8 +357,6 @@ export default class UI extends Phaser.GameObjects.Container { }); } else doRevertMode(); - - resolve(true); }); }