From 63a774790809299916aa4e9cb4e5be334cc89d37 Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Tue, 27 Aug 2024 09:41:56 -0400 Subject: [PATCH 1/2] balance tweaks to a few MEs, updates to bug superfan --- public/images/items.json | 8853 +++++++++-------- public/images/items.png | Bin 57799 -> 57030 bytes public/images/items/golden_net.png | Bin 0 -> 561 bytes public/images/trainer/bug_type_superfan.json | 1469 +++ public/images/trainer/bug_type_superfan.png | Bin 0 -> 4111 bytes src/battle-scene.ts | 22 +- .../encounters/a-trainers-test-encounter.ts | 2 +- .../encounters/absolute-avarice-encounter.ts | 14 +- .../an-offer-you-cant-refuse-encounter.ts | 2 +- .../encounters/berries-abound-encounter.ts | 18 +- .../encounters/bug-type-superfan-encounter.ts | 654 ++ .../encounters/clowning-around-encounter.ts | 10 +- .../encounters/dancing-lessons-encounter.ts | 2 +- .../encounters/dark-deal-encounter.ts | 2 +- .../encounters/delibirdy-encounter.ts | 10 +- .../department-store-sale-encounter.ts | 2 +- .../encounters/field-trip-encounter.ts | 26 +- .../encounters/fiery-fallout-encounter.ts | 2 +- .../encounters/fight-or-flight-encounter.ts | 2 +- .../encounters/lost-at-sea-encounter.ts | 3 +- .../mysterious-challengers-encounter.ts | 2 +- .../encounters/mysterious-chest-encounter.ts | 2 +- .../encounters/part-timer-encounter.ts | 28 +- .../encounters/safari-zone-encounter.ts | 16 +- .../shady-vitamin-dealer-encounter.ts | 10 +- .../slumbering-snorlax-encounter.ts | 2 +- .../teleporting-hijinks-encounter.ts | 6 +- .../the-pokemon-salesman-encounter.ts | 2 +- .../encounters/the-strong-stuff-encounter.ts | 2 +- .../the-winstrate-challenge-encounter.ts | 2 +- .../encounters/training-session-encounter.ts | 2 +- .../encounters/trash-to-treasure-encounter.ts | 14 +- .../encounters/weird-dream-encounter.ts | 46 +- .../mystery-encounter-requirements.ts | 55 +- .../mystery-encounters/mystery-encounter.ts | 2 + .../mystery-encounters/mystery-encounters.ts | 5 +- .../requirements/requirement-groups.ts | 3 +- .../utils/encounter-phase-utils.ts | 124 +- .../utils/encounter-pokemon-utils.ts | 61 +- src/data/trainer-config.ts | 4 +- src/enums/mystery-encounter-type.ts | 3 +- src/enums/trainer-type.ts | 1 + src/locales/en/dialogue-female.json | 10 +- src/locales/en/dialogue-male.json | 10 +- src/locales/en/modifier-type.json | 5 +- src/locales/en/mystery-encounter.ts | 4 +- .../a-trainers-test-dialogue.json | 20 +- .../absolute-avarice-dialogue.json | 6 +- .../an-offer-you-cant-refuse-dialogue.json | 6 +- .../berries-abound-dialogue.json | 4 +- .../bug-type-superfan-dialogue.json | 37 + .../dancing-lessons-dialogue.json | 4 +- .../dark-deal-dialogue.json | 6 +- .../delibirdy-dialogue.json | 8 +- .../department-store-sale-dialogue.json | 2 +- .../field-trip-dialogue.json | 6 +- .../fiery-fallout-dialogue.json | 8 +- .../fight-or-flight-dialogue.json | 2 +- .../lost-at-sea-dialogue.json | 6 +- .../mysterious-chest-dialogue.json | 2 +- .../part-timer-dialogue.json | 6 +- .../shady-vitamin-dealer-dialogue.json | 10 +- .../slumbering-snorlax-dialogue.json | 6 +- .../teleporting-hijinks-dialogue.json | 8 +- .../the-pokemon-salesman-dialogue.json | 4 +- .../the-strong-stuff-dialogue.json | 2 +- .../the-winstrate-challenge-dialogue.json | 4 +- .../training-session-dialogue.json | 6 +- .../trash-to-treasure-dialogue.json | 2 +- .../weird-dream-dialogue.json | 8 +- src/locales/en/trainer-classes.json | 12 +- src/locales/en/trainer-names.json | 13 +- src/modifier/modifier-type.ts | 3 +- src/modifier/modifier.ts | 35 +- src/overrides.ts | 4 +- src/phases/encounter-phase.ts | 8 +- src/phases/modifier-reward-phase.ts | 2 +- src/phases/mystery-encounter-phases.ts | 36 +- .../encounters/delibirdy-encounter.test.ts | 30 +- .../trash-to-treasure-encounter.test.ts | 4 +- src/ui/modifier-select-ui-handler.ts | 9 +- 81 files changed, 7157 insertions(+), 4686 deletions(-) create mode 100644 public/images/items/golden_net.png create mode 100644 public/images/trainer/bug_type_superfan.json create mode 100644 public/images/trainer/bug_type_superfan.png create mode 100644 src/data/mystery-encounters/encounters/bug-type-superfan-encounter.ts create mode 100644 src/locales/en/mystery-encounters/bug-type-superfan-dialogue.json diff --git a/public/images/items.json b/public/images/items.json index b318f79b0a0..6195350508a 100644 --- a/public/images/items.json +++ b/public/images/items.json @@ -4,8 +4,8 @@ "image": "items.png", "format": "RGBA8888", "size": { - "w": 428, - "h": 428 + "w": 430, + "h": 430 }, "scale": 1, "frames": [ @@ -388,7 +388,7 @@ } }, { - "filename": "mega_bracelet", + "filename": "choice_specs", "rotated": false, "trimmed": true, "sourceSize": { @@ -396,16 +396,16 @@ "h": 32 }, "spriteSourceSize": { - "x": 6, + "x": 4, "y": 8, - "w": 20, - "h": 16 + "w": 24, + "h": 18 }, "frame": { "x": 0, "y": 412, - "w": 20, - "h": 16 + "w": 24, + "h": 18 } }, { @@ -640,7 +640,7 @@ } }, { - "filename": "catching_charm", + "filename": "big_root", "rotated": false, "trimmed": true, "sourceSize": { @@ -648,15 +648,15 @@ "h": 32 }, "spriteSourceSize": { - "x": 5, + "x": 4, "y": 4, - "w": 21, + "w": 23, "h": 24 }, "frame": { "x": 407, "y": 0, - "w": 21, + "w": 23, "h": 24 } }, @@ -786,27 +786,6 @@ "h": 25 } }, - { - "filename": "big_root", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 23, - "h": 24 - }, - "frame": { - "x": 22, - "y": 262, - "w": 23, - "h": 24 - } - }, { "filename": "blank_plate", "rotated": false, @@ -823,7 +802,7 @@ }, "frame": { "x": 22, - "y": 286, + "y": 262, "w": 24, "h": 24 } @@ -844,7 +823,7 @@ }, "frame": { "x": 22, - "y": 310, + "y": 286, "w": 24, "h": 24 } @@ -865,7 +844,7 @@ }, "frame": { "x": 22, - "y": 334, + "y": 310, "w": 24, "h": 24 } @@ -886,7 +865,7 @@ }, "frame": { "x": 22, - "y": 358, + "y": 334, "w": 24, "h": 24 } @@ -907,13 +886,13 @@ }, "frame": { "x": 22, - "y": 382, + "y": 358, "w": 24, "h": 24 } }, { - "filename": "exp_balance", + "filename": "fist_plate", "rotated": false, "trimmed": true, "sourceSize": { @@ -922,15 +901,36 @@ }, "spriteSourceSize": { "x": 4, - "y": 5, + "y": 4, "w": 24, - "h": 22 + "h": 24 }, "frame": { "x": 22, + "y": 382, + "w": 24, + "h": 24 + } + }, + { + "filename": "flame_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 24, "y": 406, "w": 24, - "h": 22 + "h": 24 } }, { @@ -955,7 +955,7 @@ } }, { - "filename": "relic_band", + "filename": "mega_bracelet", "rotated": false, "trimmed": true, "sourceSize": { @@ -963,20 +963,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 7, - "y": 9, - "w": 17, + "x": 6, + "y": 8, + "w": 20, "h": 16 }, "frame": { "x": 28, "y": 70, - "w": 17, + "w": 20, "h": 16 } }, { - "filename": "abomasite", + "filename": "calcium", "rotated": false, "trimmed": true, "sourceSize": { @@ -985,40 +985,19 @@ }, "spriteSourceSize": { "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 45, - "y": 70, - "w": 16, - "h": 16 - } - }, - { - "filename": "fist_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, "y": 4, - "w": 24, + "w": 16, "h": 24 }, "frame": { "x": 39, "y": 86, - "w": 24, + "w": 16, "h": 24 } }, { - "filename": "flame_plate", + "filename": "carbos", "rotated": false, "trimmed": true, "sourceSize": { @@ -1026,20 +1005,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 4, + "x": 8, "y": 4, - "w": 24, + "w": 16, "h": 24 }, "frame": { "x": 39, "y": 110, - "w": 24, + "w": 16, "h": 24 } }, { - "filename": "focus_band", + "filename": "catching_charm", "rotated": false, "trimmed": true, "sourceSize": { @@ -1047,20 +1026,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 4, + "x": 5, "y": 4, - "w": 24, + "w": 21, "h": 24 }, "frame": { "x": 39, "y": 134, - "w": 24, + "w": 21, "h": 24 } }, { - "filename": "golden_punch", + "filename": "focus_band", "rotated": false, "trimmed": true, "sourceSize": { @@ -1081,7 +1060,7 @@ } }, { - "filename": "gracidea", + "filename": "golden_punch", "rotated": false, "trimmed": true, "sourceSize": { @@ -1102,7 +1081,7 @@ } }, { - "filename": "grip_claw", + "filename": "gracidea", "rotated": false, "trimmed": true, "sourceSize": { @@ -1123,7 +1102,7 @@ } }, { - "filename": "icicle_plate", + "filename": "grip_claw", "rotated": false, "trimmed": true, "sourceSize": { @@ -1144,7 +1123,7 @@ } }, { - "filename": "insect_plate", + "filename": "icicle_plate", "rotated": false, "trimmed": true, "sourceSize": { @@ -1158,14 +1137,14 @@ "h": 24 }, "frame": { - "x": 45, + "x": 46, "y": 254, "w": 24, "h": 24 } }, { - "filename": "iron_plate", + "filename": "insect_plate", "rotated": false, "trimmed": true, "sourceSize": { @@ -1186,7 +1165,7 @@ } }, { - "filename": "lucky_punch", + "filename": "iron_plate", "rotated": false, "trimmed": true, "sourceSize": { @@ -1207,7 +1186,7 @@ } }, { - "filename": "lucky_punch_great", + "filename": "lucky_punch", "rotated": false, "trimmed": true, "sourceSize": { @@ -1228,7 +1207,7 @@ } }, { - "filename": "lucky_punch_master", + "filename": "lucky_punch_great", "rotated": false, "trimmed": true, "sourceSize": { @@ -1249,7 +1228,7 @@ } }, { - "filename": "lucky_punch_ultra", + "filename": "lucky_punch_master", "rotated": false, "trimmed": true, "sourceSize": { @@ -1269,6 +1248,174 @@ "h": 24 } }, + { + "filename": "kings_rock", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 23, + "h": 24 + }, + "frame": { + "x": 48, + "y": 398, + "w": 23, + "h": 24 + } + }, + { + "filename": "abomasite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 48, + "y": 70, + "w": 16, + "h": 16 + } + }, + { + "filename": "elixir", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 18, + "h": 24 + }, + "frame": { + "x": 55, + "y": 86, + "w": 18, + "h": 24 + } + }, + { + "filename": "ether", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 18, + "h": 24 + }, + "frame": { + "x": 55, + "y": 110, + "w": 18, + "h": 24 + } + }, + { + "filename": "full_restore", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 18, + "h": 24 + }, + "frame": { + "x": 60, + "y": 134, + "w": 18, + "h": 24 + } + }, + { + "filename": "hp_up", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 63, + "y": 158, + "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": 63, + "y": 182, + "w": 16, + "h": 24 + } + }, + { + "filename": "lucky_punch_ultra", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 68, + "y": 206, + "w": 24, + "h": 24 + } + }, { "filename": "lustrous_globe", "rotated": false, @@ -1284,12 +1431,159 @@ "h": 24 }, "frame": { - "x": 46, - "y": 398, + "x": 68, + "y": 230, "w": 24, "h": 24 } }, + { + "filename": "max_revive", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 22, + "h": 24 + }, + "frame": { + "x": 70, + "y": 254, + "w": 22, + "h": 24 + } + }, + { + "filename": "meadow_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 70, + "y": 278, + "w": 24, + "h": 24 + } + }, + { + "filename": "mind_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 70, + "y": 302, + "w": 24, + "h": 24 + } + }, + { + "filename": "muscle_band", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 70, + "y": 326, + "w": 24, + "h": 24 + } + }, + { + "filename": "pixie_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 70, + "y": 350, + "w": 24, + "h": 24 + } + }, + { + "filename": "salac_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 70, + "y": 374, + "w": 24, + "h": 24 + } + }, + { + "filename": "reveal_glass", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 23, + "h": 24 + }, + "frame": { + "x": 71, + "y": 398, + "w": 23, + "h": 24 + } + }, { "filename": "ability_capsule", "rotated": false, @@ -1312,7 +1606,7 @@ } }, { - "filename": "calcium", + "filename": "lure", "rotated": false, "trimmed": true, "sourceSize": { @@ -1322,18 +1616,18 @@ "spriteSourceSize": { "x": 8, "y": 4, - "w": 16, + "w": 17, "h": 24 }, "frame": { "x": 59, "y": 27, - "w": 16, + "w": 17, "h": 24 } }, { - "filename": "meadow_plate", + "filename": "scanner", "rotated": false, "trimmed": true, "sourceSize": { @@ -1347,14 +1641,14 @@ "h": 24 }, "frame": { - "x": 75, + "x": 76, "y": 26, "w": 24, "h": 24 } }, { - "filename": "mind_plate", + "filename": "silk_scarf", "rotated": false, "trimmed": true, "sourceSize": { @@ -1368,33 +1662,12 @@ "h": 24 }, "frame": { - "x": 99, + "x": 100, "y": 26, "w": 24, "h": 24 } }, - { - "filename": "revive", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 12, - "h": 17 - }, - "frame": { - "x": 123, - "y": 26, - "w": 12, - "h": 17 - } - }, { "filename": "big_mushroom", "rotated": false, @@ -1458,468 +1731,6 @@ "h": 23 } }, - { - "filename": "absolite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 61, - "y": 70, - "w": 16, - "h": 16 - } - }, - { - "filename": "carbos", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 63, - "y": 86, - "w": 16, - "h": 24 - } - }, - { - "filename": "elixir", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 18, - "h": 24 - }, - "frame": { - "x": 63, - "y": 110, - "w": 18, - "h": 24 - } - }, - { - "filename": "ether", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 18, - "h": 24 - }, - "frame": { - "x": 63, - "y": 134, - "w": 18, - "h": 24 - } - }, - { - "filename": "full_restore", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 18, - "h": 24 - }, - "frame": { - "x": 63, - "y": 158, - "w": 18, - "h": 24 - } - }, - { - "filename": "kings_rock", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 23, - "h": 24 - }, - "frame": { - "x": 63, - "y": 182, - "w": 23, - "h": 24 - } - }, - { - "filename": "max_elixir", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 18, - "h": 24 - }, - "frame": { - "x": 68, - "y": 206, - "w": 18, - "h": 24 - } - }, - { - "filename": "max_ether", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 18, - "h": 24 - }, - "frame": { - "x": 68, - "y": 230, - "w": 18, - "h": 24 - } - }, - { - "filename": "lure", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 17, - "h": 24 - }, - "frame": { - "x": 69, - "y": 254, - "w": 17, - "h": 24 - } - }, - { - "filename": "hp_up", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 70, - "y": 278, - "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": 70, - "y": 302, - "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": 70, - "y": 326, - "w": 17, - "h": 24 - } - }, - { - "filename": "max_potion", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 18, - "h": 24 - }, - "frame": { - "x": 70, - "y": 350, - "w": 18, - "h": 24 - } - }, - { - "filename": "max_revive", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 22, - "h": 24 - }, - "frame": { - "x": 70, - "y": 374, - "w": 22, - "h": 24 - } - }, - { - "filename": "muscle_band", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 70, - "y": 398, - "w": 24, - "h": 24 - } - }, - { - "filename": "pixie_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 79, - "y": 73, - "w": 24, - "h": 24 - } - }, - { - "filename": "reveal_glass", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 23, - "h": 24 - }, - "frame": { - "x": 103, - "y": 73, - "w": 23, - "h": 24 - } - }, - { - "filename": "salac_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 81, - "y": 97, - "w": 24, - "h": 24 - } - }, - { - "filename": "scanner", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 81, - "y": 121, - "w": 24, - "h": 24 - } - }, - { - "filename": "silk_scarf", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 81, - "y": 145, - "w": 24, - "h": 24 - } - }, - { - "filename": "oval_charm", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 21, - "h": 24 - }, - "frame": { - "x": 105, - "y": 97, - "w": 21, - "h": 24 - } - }, - { - "filename": "shiny_charm", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 21, - "h": 24 - }, - "frame": { - "x": 105, - "y": 121, - "w": 21, - "h": 24 - } - }, { "filename": "sky_plate", "rotated": false, @@ -1935,8 +1746,8 @@ "h": 24 }, "frame": { - "x": 105, - "y": 145, + "x": 73, + "y": 73, "w": 24, "h": 24 } @@ -1956,8 +1767,8 @@ "h": 24 }, "frame": { - "x": 86, - "y": 169, + "x": 97, + "y": 73, "w": 24, "h": 24 } @@ -1977,8 +1788,8 @@ "h": 24 }, "frame": { - "x": 86, - "y": 193, + "x": 73, + "y": 97, "w": 24, "h": 24 } @@ -1998,8 +1809,8 @@ "h": 24 }, "frame": { - "x": 86, - "y": 217, + "x": 97, + "y": 97, "w": 24, "h": 24 } @@ -2019,12 +1830,33 @@ "h": 24 }, "frame": { - "x": 86, - "y": 241, + "x": 78, + "y": 121, "w": 24, "h": 24 } }, + { + "filename": "oval_charm", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 21, + "h": 24 + }, + "frame": { + "x": 102, + "y": 121, + "w": 21, + "h": 24 + } + }, { "filename": "toxic_plate", "rotated": false, @@ -2040,8 +1872,8 @@ "h": 24 }, "frame": { - "x": 86, - "y": 265, + "x": 79, + "y": 145, "w": 24, "h": 24 } @@ -2061,8 +1893,8 @@ "h": 24 }, "frame": { - "x": 86, - "y": 289, + "x": 79, + "y": 169, "w": 24, "h": 24 } @@ -2082,35 +1914,14 @@ "h": 24 }, "frame": { - "x": 110, - "y": 169, + "x": 103, + "y": 145, "w": 20, "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": 110, - "y": 193, - "w": 22, - "h": 23 - } - }, - { - "filename": "bug_tera_shard", + "filename": "shiny_charm", "rotated": false, "trimmed": true, "sourceSize": { @@ -2120,14 +1931,14 @@ "spriteSourceSize": { "x": 6, "y": 4, - "w": 22, - "h": 23 + "w": 21, + "h": 24 }, "frame": { - "x": 110, - "y": 216, - "w": 22, - "h": 23 + "x": 103, + "y": 169, + "w": 21, + "h": 24 } }, { @@ -2145,8 +1956,8 @@ "h": 23 }, "frame": { - "x": 110, - "y": 239, + "x": 92, + "y": 193, "w": 24, "h": 23 } @@ -2166,8 +1977,8 @@ "h": 23 }, "frame": { - "x": 110, - "y": 262, + "x": 92, + "y": 216, "w": 24, "h": 23 } @@ -2187,14 +1998,14 @@ "h": 23 }, "frame": { - "x": 110, - "y": 285, + "x": 92, + "y": 239, "w": 24, "h": 23 } }, { - "filename": "dynamax_band", + "filename": "silver_powder", "rotated": false, "trimmed": true, "sourceSize": { @@ -2203,19 +2014,40 @@ }, "spriteSourceSize": { "x": 4, + "y": 11, + "w": 24, + "h": 15 + }, + "frame": { + "x": 92, + "y": 262, + "w": 24, + "h": 15 + } + }, + { + "filename": "black_belt", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, "y": 4, - "w": 23, + "w": 22, "h": 23 }, "frame": { - "x": 87, - "y": 313, - "w": 23, + "x": 94, + "y": 277, + "w": 22, "h": 23 } }, { - "filename": "leppa_berry", + "filename": "bug_tera_shard", "rotated": false, "trimmed": true, "sourceSize": { @@ -2223,60 +2055,18 @@ "h": 32 }, "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 24, + "x": 6, + "y": 4, + "w": 22, "h": 23 }, "frame": { - "x": 110, - "y": 308, - "w": 24, + "x": 94, + "y": 300, + "w": 22, "h": 23 } }, - { - "filename": "choice_specs", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 24, - "h": 18 - }, - "frame": { - "x": 135, - "y": 36, - "w": 24, - "h": 18 - } - }, - { - "filename": "coupon", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 23, - "h": 19 - }, - "frame": { - "x": 125, - "y": 54, - "w": 23, - "h": 19 - } - }, { "filename": "dark_tera_shard", "rotated": false, @@ -2292,8 +2082,8 @@ "h": 23 }, "frame": { - "x": 126, - "y": 73, + "x": 94, + "y": 323, "w": 22, "h": 23 } @@ -2313,12 +2103,180 @@ "h": 23 }, "frame": { - "x": 126, - "y": 96, + "x": 94, + "y": 346, "w": 22, "h": 23 } }, + { + "filename": "dynamax_band", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 23, + "h": 23 + }, + "frame": { + "x": 94, + "y": 369, + "w": 23, + "h": 23 + } + }, + { + "filename": "griseous_core", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 23, + "h": 23 + }, + "frame": { + "x": 94, + "y": 392, + "w": 23, + "h": 23 + } + }, + { + "filename": "candy_overlay", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 12, + "w": 16, + "h": 15 + }, + "frame": { + "x": 94, + "y": 415, + "w": 16, + "h": 15 + } + }, + { + "filename": "eviolite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 15, + "h": 15 + }, + "frame": { + "x": 110, + "y": 415, + "w": 15, + "h": 15 + } + }, + { + "filename": "max_elixir", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 18, + "h": 24 + }, + "frame": { + "x": 116, + "y": 193, + "w": 18, + "h": 24 + } + }, + { + "filename": "max_ether", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 18, + "h": 24 + }, + "frame": { + "x": 116, + "y": 217, + "w": 18, + "h": 24 + } + }, + { + "filename": "max_potion", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 18, + "h": 24 + }, + "frame": { + "x": 116, + "y": 241, + "w": 18, + "h": 24 + } + }, + { + "filename": "dragon_fang", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 21, + "h": 23 + }, + "frame": { + "x": 116, + "y": 265, + "w": 21, + "h": 23 + } + }, { "filename": "electric_tera_shard", "rotated": false, @@ -2334,33 +2292,12 @@ "h": 23 }, "frame": { - "x": 126, - "y": 119, + "x": 116, + "y": 288, "w": 22, "h": 23 } }, - { - "filename": "dragon_fang", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 21, - "h": 23 - }, - "frame": { - "x": 129, - "y": 142, - "w": 21, - "h": 23 - } - }, { "filename": "fairy_tera_shard", "rotated": false, @@ -2376,8 +2313,8 @@ "h": 23 }, "frame": { - "x": 130, - "y": 165, + "x": 116, + "y": 311, "w": 22, "h": 23 } @@ -2397,8 +2334,8 @@ "h": 23 }, "frame": { - "x": 132, - "y": 188, + "x": 116, + "y": 334, "w": 22, "h": 23 } @@ -2418,8 +2355,8 @@ "h": 23 }, "frame": { - "x": 132, - "y": 211, + "x": 117, + "y": 357, "w": 22, "h": 23 } @@ -2439,14 +2376,14 @@ "h": 23 }, "frame": { - "x": 134, - "y": 234, + "x": 117, + "y": 380, "w": 22, "h": 23 } }, { - "filename": "flying_tera_shard", + "filename": "max_lure", "rotated": false, "trimmed": true, "sourceSize": { @@ -2454,20 +2391,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 6, + "x": 8, "y": 4, - "w": 22, - "h": 23 + "w": 17, + "h": 24 }, "frame": { - "x": 134, - "y": 257, - "w": 22, - "h": 23 + "x": 121, + "y": 73, + "w": 17, + "h": 24 } }, { - "filename": "focus_sash", + "filename": "super_lure", "rotated": false, "trimmed": true, "sourceSize": { @@ -2475,37 +2412,16 @@ "h": 32 }, "spriteSourceSize": { - "x": 5, + "x": 8, "y": 4, - "w": 22, - "h": 23 + "w": 17, + "h": 24 }, "frame": { - "x": 134, - "y": 280, - "w": 22, - "h": 23 - } - }, - { - "filename": "ghost_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 134, - "y": 303, - "w": 22, - "h": 23 + "x": 121, + "y": 97, + "w": 17, + "h": 24 } }, { @@ -2523,8 +2439,8 @@ "h": 24 }, "frame": { - "x": 148, - "y": 54, + "x": 123, + "y": 121, "w": 16, "h": 24 } @@ -2544,8 +2460,8 @@ "h": 24 }, "frame": { - "x": 148, - "y": 78, + "x": 123, + "y": 145, "w": 16, "h": 24 } @@ -2565,14 +2481,14 @@ "h": 24 }, "frame": { - "x": 148, - "y": 102, + "x": 124, + "y": 169, "w": 16, "h": 24 } }, { - "filename": "aerodactylite", + "filename": "protein", "rotated": false, "trimmed": true, "sourceSize": { @@ -2581,19 +2497,19 @@ }, "spriteSourceSize": { "x": 8, - "y": 8, + "y": 4, "w": 16, - "h": 16 + "h": 24 }, "frame": { - "x": 148, - "y": 126, + "x": 134, + "y": 193, "w": 16, - "h": 16 + "h": 24 } }, { - "filename": "full_heal", + "filename": "repel", "rotated": false, "trimmed": true, "sourceSize": { @@ -2601,15 +2517,99 @@ "h": 32 }, "spriteSourceSize": { - "x": 9, + "x": 8, "y": 4, - "w": 15, + "w": 16, + "h": 24 + }, + "frame": { + "x": 134, + "y": 217, + "w": 16, + "h": 24 + } + }, + { + "filename": "super_repel", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 134, + "y": 241, + "w": 16, + "h": 24 + } + }, + { + "filename": "flying_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, "h": 23 }, "frame": { - "x": 150, - "y": 142, - "w": 15, + "x": 137, + "y": 265, + "w": 22, + "h": 23 + } + }, + { + "filename": "focus_sash", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 138, + "y": 288, + "w": 22, + "h": 23 + } + }, + { + "filename": "ghost_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 138, + "y": 311, + "w": 22, "h": 23 } }, @@ -2628,54 +2628,12 @@ "h": 23 }, "frame": { - "x": 152, - "y": 165, + "x": 138, + "y": 334, "w": 22, "h": 23 } }, - { - "filename": "griseous_core", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 23, - "h": 23 - }, - "frame": { - "x": 154, - "y": 188, - "w": 23, - "h": 23 - } - }, - { - "filename": "leek", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 23, - "h": 23 - }, - "frame": { - "x": 154, - "y": 211, - "w": 23, - "h": 23 - } - }, { "filename": "ground_tera_shard", "rotated": false, @@ -2691,8 +2649,8 @@ "h": 23 }, "frame": { - "x": 156, - "y": 234, + "x": 139, + "y": 357, "w": 22, "h": 23 } @@ -2712,14 +2670,14 @@ "h": 23 }, "frame": { - "x": 156, - "y": 257, + "x": 139, + "y": 380, "w": 22, "h": 23 } }, { - "filename": "macho_brace", + "filename": "leppa_berry", "rotated": false, "trimmed": true, "sourceSize": { @@ -2729,18 +2687,60 @@ "spriteSourceSize": { "x": 4, "y": 5, - "w": 23, + "w": 24, "h": 23 }, "frame": { - "x": 156, - "y": 280, - "w": 23, + "x": 125, + "y": 403, + "w": 24, "h": 23 } }, { - "filename": "rare_candy", + "filename": "full_heal", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 9, + "y": 4, + "w": 15, + "h": 23 + }, + "frame": { + "x": 149, + "y": 403, + "w": 15, + "h": 23 + } + }, + { + "filename": "dragon_scale", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 24, + "h": 18 + }, + "frame": { + "x": 330, + "y": 20, + "w": 24, + "h": 18 + } + }, + { + "filename": "exp_balance", "rotated": false, "trimmed": true, "sourceSize": { @@ -2750,18 +2750,18 @@ "spriteSourceSize": { "x": 4, "y": 5, - "w": 23, - "h": 23 + "w": 24, + "h": 22 }, "frame": { - "x": 156, - "y": 303, - "w": 23, - "h": 23 + "x": 354, + "y": 20, + "w": 24, + "h": 22 } }, { - "filename": "never_melt_ice", + "filename": "exp_share", "rotated": false, "trimmed": true, "sourceSize": { @@ -2769,16 +2769,100 @@ "h": 32 }, "spriteSourceSize": { - "x": 5, + "x": 4, "y": 5, - "w": 22, - "h": 23 + "w": 24, + "h": 22 }, "frame": { - "x": 88, - "y": 336, - "w": 22, - "h": 23 + "x": 378, + "y": 20, + "w": 24, + "h": 22 + } + }, + { + "filename": "golden_net", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 24, + "h": 21 + }, + "frame": { + "x": 402, + "y": 24, + "w": 24, + "h": 21 + } + }, + { + "filename": "icy_reins_of_unity", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 24, + "h": 20 + }, + "frame": { + "x": 162, + "y": 21, + "w": 24, + "h": 20 + } + }, + { + "filename": "metal_powder", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 24, + "h": 20 + }, + "frame": { + "x": 186, + "y": 21, + "w": 24, + "h": 20 + } + }, + { + "filename": "peat_block", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 24, + "h": 22 + }, + "frame": { + "x": 210, + "y": 21, + "w": 24, + "h": 22 } }, { @@ -2796,8 +2880,8 @@ "h": 23 }, "frame": { - "x": 110, - "y": 331, + "x": 234, + "y": 21, "w": 24, "h": 23 } @@ -2817,371 +2901,14 @@ "h": 23 }, "frame": { - "x": 134, - "y": 326, - "w": 24, - "h": 23 - } - }, - { - "filename": "lansat_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 21, - "h": 23 - }, - "frame": { - "x": 158, - "y": 326, - "w": 21, - "h": 23 - } - }, - { - "filename": "silver_powder", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 11, - "w": 24, - "h": 15 - }, - "frame": { - "x": 88, - "y": 359, - "w": 24, - "h": 15 - } - }, - { - "filename": "leaf_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 21, - "h": 23 - }, - "frame": { - "x": 92, - "y": 374, - "w": 21, - "h": 23 - } - }, - { - "filename": "mystic_water", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 20, - "h": 23 - }, - "frame": { - "x": 94, - "y": 397, - "w": 20, - "h": 23 - } - }, - { - "filename": "binding_band", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 23, - "h": 20 - }, - "frame": { - "x": 112, - "y": 354, - "w": 23, - "h": 20 - } - }, - { - "filename": "normal_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 113, - "y": 374, - "w": 22, - "h": 23 - } - }, - { - "filename": "petaya_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 23 - }, - "frame": { - "x": 114, - "y": 397, - "w": 22, - "h": 23 - } - }, - { - "filename": "exp_share", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 24, - "h": 22 - }, - "frame": { - "x": 135, - "y": 349, - "w": 24, - "h": 22 - } - }, - { - "filename": "peat_block", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 24, - "h": 22 - }, - "frame": { - "x": 135, - "y": 371, - "w": 24, - "h": 22 - } - }, - { - "filename": "poison_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 159, - "y": 349, - "w": 22, - "h": 23 - } - }, - { - "filename": "adamant_crystal", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 6, - "w": 23, - "h": 21 - }, - "frame": { - "x": 159, - "y": 372, - "w": 23, - "h": 21 - } - }, - { - "filename": "rarer_candy", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 23, - "h": 23 - }, - "frame": { - "x": 136, - "y": 393, - "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": 159, - "y": 393, - "w": 23, - "h": 22 - } - }, - { - "filename": "protein", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 159, - "y": 22, - "w": 16, - "h": 24 - } - }, - { - "filename": "psychic_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 175, + "x": 258, "y": 21, - "w": 22, + "w": 24, "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": 197, - "y": 21, - "w": 22, - "h": 23 - } - }, - { - "filename": "rock_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 219, - "y": 21, - "w": 22, - "h": 23 - } - }, - { - "filename": "rusted_sword", + "filename": "leek", "rotated": false, "trimmed": true, "sourceSize": { @@ -3192,17 +2919,17 @@ "x": 4, "y": 5, "w": 23, - "h": 22 + "h": 23 }, "frame": { - "x": 241, + "x": 282, "y": 21, "w": 23, - "h": 22 + "h": 23 } }, { - "filename": "amulet_coin", + "filename": "macho_brace", "rotated": false, "trimmed": true, "sourceSize": { @@ -3210,1024 +2937,16 @@ "h": 32 }, "spriteSourceSize": { - "x": 6, + "x": 4, "y": 5, "w": 23, - "h": 21 + "h": 23 }, "frame": { - "x": 264, + "x": 305, "y": 21, "w": 23, - "h": 21 - } - }, - { - "filename": "auspicious_armor", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 23, - "h": 21 - }, - "frame": { - "x": 287, - "y": 21, - "w": 23, - "h": 21 - } - }, - { - "filename": "berry_juice", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 24, "h": 23 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 22, - "h": 21 - }, - "frame": { - "x": 310, - "y": 21, - "w": 22, - "h": 21 - } - }, - { - "filename": "blank_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 332, - "y": 20, - "w": 22, - "h": 22 - } - }, - { - "filename": "bug_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 354, - "y": 20, - "w": 22, - "h": 22 - } - }, - { - "filename": "charcoal", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 376, - "y": 20, - "w": 22, - "h": 22 - } - }, - { - "filename": "dragon_scale", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 24, - "h": 18 - }, - "frame": { - "x": 398, - "y": 24, - "w": 24, - "h": 18 - } - }, - { - "filename": "repel", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 164, - "y": 46, - "w": 16, - "h": 24 - } - }, - { - "filename": "steel_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 180, - "y": 44, - "w": 22, - "h": 23 - } - }, - { - "filename": "stellar_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 202, - "y": 44, - "w": 22, - "h": 23 - } - }, - { - "filename": "hyper_potion", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 17, - "h": 23 - }, - "frame": { - "x": 224, - "y": 44, - "w": 17, - "h": 23 - } - }, - { - "filename": "water_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 241, - "y": 43, - "w": 22, - "h": 23 - } - }, - { - "filename": "super_lure", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 17, - "h": 24 - }, - "frame": { - "x": 164, - "y": 70, - "w": 17, - "h": 24 - } - }, - { - "filename": "wide_lens", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 181, - "y": 67, - "w": 22, - "h": 23 - } - }, - { - "filename": "dark_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 203, - "y": 67, - "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": 164, - "y": 94, - "w": 17, - "h": 23 - } - }, - { - "filename": "dire_hit", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 181, - "y": 90, - "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": 203, - "y": 89, - "w": 22, - "h": 22 - } - }, - { - "filename": "sachet", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 18, - "h": 23 - }, - "frame": { - "x": 164, - "y": 117, - "w": 18, - "h": 23 - } - }, - { - "filename": "super_repel", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 225, - "y": 67, - "w": 16, - "h": 24 - } - }, - { - "filename": "dragon_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 241, - "y": 66, - "w": 22, - "h": 22 - } - }, - { - "filename": "sharp_beak", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 21, - "h": 23 - }, - "frame": { - "x": 182, - "y": 112, - "w": 21, - "h": 23 - } - }, - { - "filename": "electirizer", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 203, - "y": 111, - "w": 22, - "h": 22 - } - }, - { - "filename": "unknown", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 225, - "y": 91, - "w": 16, - "h": 24 - } - }, - { - "filename": "electric_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 241, - "y": 88, - "w": 22, - "h": 22 - } - }, - { - "filename": "super_potion", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 17, - "h": 23 - }, - "frame": { - "x": 165, - "y": 140, - "w": 17, - "h": 23 - } - }, - { - "filename": "whipped_dream", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 21, - "h": 23 - }, - "frame": { - "x": 182, - "y": 135, - "w": 21, - "h": 23 - } - }, - { - "filename": "enigma_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 203, - "y": 133, - "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": 225, - "y": 115, - "w": 16, - "h": 24 - } - }, - { - "filename": "fairy_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 241, - "y": 110, - "w": 22, - "h": 22 - } - }, - { - "filename": "aggronite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 225, - "y": 139, - "w": 16, - "h": 16 - } - }, - { - "filename": "fighting_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 241, - "y": 132, - "w": 22, - "h": 22 - } - }, - { - "filename": "berry_pot", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 18, - "h": 22 - }, - "frame": { - "x": 174, - "y": 163, - "w": 18, - "h": 22 - } - }, - { - "filename": "fire_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 177, - "y": 185, - "w": 22, - "h": 22 - } - }, - { - "filename": "flying_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 177, - "y": 207, - "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": 178, - "y": 229, - "w": 22, - "h": 22 - } - }, - { - "filename": "ghost_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 178, - "y": 251, - "w": 22, - "h": 22 - } - }, - { - "filename": "grass_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 179, - "y": 273, - "w": 22, - "h": 22 - } - }, - { - "filename": "ground_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 179, - "y": 295, - "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": 179, - "y": 317, - "w": 22, - "h": 22 - } - }, - { - "filename": "hard_meteorite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 20, - "h": 22 - }, - "frame": { - "x": 181, - "y": 339, - "w": 20, - "h": 22 - } - }, - { - "filename": "ice_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 182, - "y": 361, - "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": 182, - "y": 383, - "w": 22, - "h": 22 - } - }, - { - "filename": "black_glasses", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 23, - "h": 17 - }, - "frame": { - "x": 182, - "y": 405, - "w": 23, - "h": 17 - } - }, - { - "filename": "leftovers", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 15, - "h": 22 - }, - "frame": { - "x": 192, - "y": 158, - "w": 15, - "h": 22 - } - }, - { - "filename": "icy_reins_of_unity", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 24, - "h": 20 - }, - "frame": { - "x": 207, - "y": 155, - "w": 24, - "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": 231, - "y": 155, - "w": 19, - "h": 20 - } - }, - { - "filename": "dawn_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 21 - }, - "frame": { - "x": 250, - "y": 154, - "w": 20, - "h": 21 - } - }, - { - "filename": "metal_powder", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 6, - "w": 24, - "h": 20 - }, - "frame": { - "x": 207, - "y": 175, - "w": 24, - "h": 20 } }, { @@ -4245,306 +2964,12 @@ "h": 20 }, "frame": { - "x": 231, - "y": 175, + "x": 328, + "y": 38, "w": 24, "h": 20 } }, - { - "filename": "magmarizer", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 199, - "y": 195, - "w": 22, - "h": 22 - } - }, - { - "filename": "mini_black_hole", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 221, - "y": 195, - "w": 22, - "h": 22 - } - }, - { - "filename": "big_nugget", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 255, - "y": 175, - "w": 20, - "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": 243, - "y": 195, - "w": 23, - "h": 21 - } - }, - { - "filename": "n_lunarizer", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 6, - "w": 23, - "h": 21 - }, - "frame": { - "x": 200, - "y": 217, - "w": 23, - "h": 21 - } - }, - { - "filename": "n_solarizer", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 6, - "w": 23, - "h": 21 - }, - "frame": { - "x": 200, - "y": 238, - "w": 23, - "h": 21 - } - }, - { - "filename": "poison_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 223, - "y": 217, - "w": 22, - "h": 22 - } - }, - { - "filename": "deep_sea_scale", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 20 - }, - "frame": { - "x": 223, - "y": 239, - "w": 22, - "h": 20 - } - }, - { - "filename": "protector", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 245, - "y": 216, - "w": 22, - "h": 22 - } - }, - { - "filename": "deep_sea_tooth", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 21 - }, - "frame": { - "x": 245, - "y": 238, - "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": 266, - "y": 195, - "w": 21, - "h": 21 - } - }, - { - "filename": "psychic_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 267, - "y": 216, - "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": 267, - "y": 238, - "w": 22, - "h": 21 - } - }, - { - "filename": "rock_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 201, - "y": 259, - "w": 22, - "h": 22 - } - }, { "filename": "rusted_shield", "rotated": false, @@ -4560,8 +2985,8 @@ "h": 20 }, "frame": { - "x": 223, - "y": 259, + "x": 352, + "y": 42, "w": 24, "h": 20 } @@ -4581,54 +3006,12 @@ "h": 20 }, "frame": { - "x": 247, - "y": 259, + "x": 376, + "y": 42, "w": 24, "h": 20 } }, - { - "filename": "scroll_of_darkness", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 201, - "y": 281, - "w": 22, - "h": 22 - } - }, - { - "filename": "scroll_of_waters", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 223, - "y": 279, - "w": 22, - "h": 22 - } - }, { "filename": "shadow_reins_of_unity", "rotated": false, @@ -4644,12 +3027,1419 @@ "h": 20 }, "frame": { - "x": 245, - "y": 279, + "x": 400, + "y": 45, "w": 24, "h": 20 } }, + { + "filename": "prism_scale", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 9, + "y": 8, + "w": 15, + "h": 15 + }, + "frame": { + "x": 125, + "y": 58, + "w": 15, + "h": 15 + } + }, + { + "filename": "healing_charm", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 23, + "h": 22 + }, + "frame": { + "x": 125, + "y": 36, + "w": 23, + "h": 22 + } + }, + { + "filename": "revive", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 10, + "y": 8, + "w": 12, + "h": 17 + }, + "frame": { + "x": 148, + "y": 36, + "w": 12, + "h": 17 + } + }, + { + "filename": "soft_sand", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 24, + "h": 20 + }, + "frame": { + "x": 160, + "y": 41, + "w": 24, + "h": 20 + } + }, + { + "filename": "adamant_crystal", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 23, + "h": 21 + }, + "frame": { + "x": 184, + "y": 41, + "w": 23, + "h": 21 + } + }, + { + "filename": "amulet_coin", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 5, + "w": 23, + "h": 21 + }, + "frame": { + "x": 207, + "y": 43, + "w": 23, + "h": 21 + } + }, + { + "filename": "auspicious_armor", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 23, + "h": 21 + }, + "frame": { + "x": 230, + "y": 44, + "w": 23, + "h": 21 + } + }, + { + "filename": "moon_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 23, + "h": 21 + }, + "frame": { + "x": 253, + "y": 44, + "w": 23, + "h": 21 + } + }, + { + "filename": "n_lunarizer", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 23, + "h": 21 + }, + "frame": { + "x": 276, + "y": 44, + "w": 23, + "h": 21 + } + }, + { + "filename": "n_solarizer", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 23, + "h": 21 + }, + "frame": { + "x": 299, + "y": 44, + "w": 23, + "h": 21 + } + }, + { + "filename": "big_nugget", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 140, + "y": 58, + "w": 20, + "h": 20 + } + }, + { + "filename": "never_melt_ice", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 23 + }, + "frame": { + "x": 138, + "y": 78, + "w": 22, + "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": 160, + "y": 61, + "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": 183, + "y": 62, + "w": 23, + "h": 23 + } + }, + { + "filename": "binding_band", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 23, + "h": 20 + }, + "frame": { + "x": 138, + "y": 101, + "w": 23, + "h": 20 + } + }, + { + "filename": "normal_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 139, + "y": 121, + "w": 22, + "h": 23 + } + }, + { + "filename": "petaya_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 23 + }, + "frame": { + "x": 139, + "y": 144, + "w": 22, + "h": 23 + } + }, + { + "filename": "rusted_sword", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 23, + "h": 22 + }, + "frame": { + "x": 206, + "y": 64, + "w": 23, + "h": 22 + } + }, + { + "filename": "wellspring_mask", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 23, + "h": 21 + }, + "frame": { + "x": 229, + "y": 65, + "w": 23, + "h": 21 + } + }, + { + "filename": "berry_juice", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 24, + "h": 23 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 22, + "h": 21 + }, + "frame": { + "x": 252, + "y": 65, + "w": 22, + "h": 21 + } + }, + { + "filename": "blank_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 274, + "y": 65, + "w": 22, + "h": 22 + } + }, + { + "filename": "bug_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 296, + "y": 65, + "w": 22, + "h": 22 + } + }, + { + "filename": "black_glasses", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 23, + "h": 17 + }, + "frame": { + "x": 160, + "y": 84, + "w": 23, + "h": 17 + } + }, + { + "filename": "poison_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 161, + "y": 101, + "w": 22, + "h": 23 + } + }, + { + "filename": "psychic_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 183, + "y": 85, + "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": 161, + "y": 124, + "w": 22, + "h": 23 + } + }, + { + "filename": "rock_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 183, + "y": 108, + "w": 22, + "h": 23 + } + }, + { + "filename": "steel_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 205, + "y": 86, + "w": 22, + "h": 23 + } + }, + { + "filename": "stellar_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 227, + "y": 86, + "w": 22, + "h": 23 + } + }, + { + "filename": "water_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 249, + "y": 86, + "w": 22, + "h": 23 + } + }, + { + "filename": "charcoal", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 205, + "y": 109, + "w": 22, + "h": 22 + } + }, + { + "filename": "dark_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 227, + "y": 109, + "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": 249, + "y": 109, + "w": 22, + "h": 22 + } + }, + { + "filename": "deep_sea_scale", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 20 + }, + "frame": { + "x": 161, + "y": 147, + "w": 22, + "h": 20 + } + }, + { + "filename": "wide_lens", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 183, + "y": 131, + "w": 22, + "h": 23 + } + }, + { + "filename": "dna_splicers", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 205, + "y": 131, + "w": 22, + "h": 22 + } + }, + { + "filename": "dragon_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 227, + "y": 131, + "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": 249, + "y": 131, + "w": 22, + "h": 22 + } + }, + { + "filename": "electric_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 140, + "y": 167, + "w": 22, + "h": 22 + } + }, + { + "filename": "enigma_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 162, + "y": 167, + "w": 22, + "h": 22 + } + }, + { + "filename": "fairy_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 271, + "y": 87, + "w": 22, + "h": 22 + } + }, + { + "filename": "fighting_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 271, + "y": 109, + "w": 22, + "h": 22 + } + }, + { + "filename": "fire_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 293, + "y": 87, + "w": 22, + "h": 22 + } + }, + { + "filename": "flying_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 271, + "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": 293, + "y": 109, + "w": 22, + "h": 22 + } + }, + { + "filename": "ghost_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 293, + "y": 131, + "w": 22, + "h": 22 + } + }, + { + "filename": "grass_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 150, + "y": 189, + "w": 22, + "h": 22 + } + }, + { + "filename": "ground_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 150, + "y": 211, + "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": 150, + "y": 233, + "w": 22, + "h": 22 + } + }, + { + "filename": "unknown", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 172, + "y": 189, + "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": 172, + "y": 213, + "w": 16, + "h": 24 + } + }, + { + "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": 237, + "w": 19, + "h": 20 + } + }, + { + "filename": "lansat_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 21, + "h": 23 + }, + "frame": { + "x": 184, + "y": 154, + "w": 21, + "h": 23 + } + }, + { + "filename": "ice_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 205, + "y": 153, + "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": 227, + "y": 153, + "w": 22, + "h": 22 + } + }, + { + "filename": "magmarizer", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 249, + "y": 153, + "w": 22, + "h": 22 + } + }, + { + "filename": "mini_black_hole", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 271, + "y": 153, + "w": 22, + "h": 22 + } + }, + { + "filename": "poison_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 293, + "y": 153, + "w": 22, + "h": 22 + } + }, + { + "filename": "hyper_potion", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 17, + "h": 23 + }, + "frame": { + "x": 188, + "y": 177, + "w": 17, + "h": 23 + } + }, + { + "filename": "leaf_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 21, + "h": 23 + }, + "frame": { + "x": 205, + "y": 175, + "w": 21, + "h": 23 + } + }, + { + "filename": "protector", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 226, + "y": 175, + "w": 22, + "h": 22 + } + }, + { + "filename": "psychic_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 248, + "y": 175, + "w": 22, + "h": 22 + } + }, + { + "filename": "rock_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 270, + "y": 175, + "w": 22, + "h": 22 + } + }, + { + "filename": "scroll_of_darkness", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 292, + "y": 175, + "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": 188, + "y": 200, + "w": 20, + "h": 23 + } + }, + { + "filename": "sachet", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 18, + "h": 23 + }, + "frame": { + "x": 208, + "y": 198, + "w": 18, + "h": 23 + } + }, + { + "filename": "scroll_of_waters", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 226, + "y": 197, + "w": 22, + "h": 22 + } + }, { "filename": "shed_shell", "rotated": false, @@ -4665,8 +4455,8 @@ "h": 22 }, "frame": { - "x": 201, - "y": 303, + "x": 248, + "y": 197, "w": 22, "h": 22 } @@ -4686,33 +4476,12 @@ "h": 22 }, "frame": { - "x": 223, - "y": 301, + "x": 270, + "y": 197, "w": 22, "h": 22 } }, - { - "filename": "soft_sand", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 24, - "h": 20 - }, - "frame": { - "x": 245, - "y": 299, - "w": 24, - "h": 20 - } - }, { "filename": "steel_memory", "rotated": false, @@ -4728,12 +4497,75 @@ "h": 22 }, "frame": { - "x": 201, - "y": 325, + "x": 292, + "y": 197, "w": 22, "h": 22 } }, + { + "filename": "berry_pot", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 5, + "w": 18, + "h": 22 + }, + "frame": { + "x": 318, + "y": 65, + "w": 18, + "h": 22 + } + }, + { + "filename": "sharp_beak", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 21, + "h": 23 + }, + "frame": { + "x": 315, + "y": 87, + "w": 21, + "h": 23 + } + }, + { + "filename": "whipped_dream", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 21, + "h": 23 + }, + "frame": { + "x": 315, + "y": 110, + "w": 21, + "h": 23 + } + }, { "filename": "thick_club", "rotated": false, @@ -4749,12 +4581,33 @@ "h": 22 }, "frame": { - "x": 223, - "y": 323, + "x": 315, + "y": 133, "w": 22, "h": 22 } }, + { + "filename": "deep_sea_tooth", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 21 + }, + "frame": { + "x": 315, + "y": 155, + "w": 22, + "h": 21 + } + }, { "filename": "thunder_stone", "rotated": false, @@ -4770,14 +4623,14 @@ "h": 22 }, "frame": { - "x": 245, - "y": 319, + "x": 314, + "y": 176, "w": 22, "h": 22 } }, { - "filename": "blue_orb", + "filename": "liechi_berry", "rotated": false, "trimmed": true, "sourceSize": { @@ -4785,16 +4638,79 @@ "h": 32 }, "spriteSourceSize": { - "x": 6, + "x": 5, "y": 6, - "w": 20, - "h": 20 + "w": 22, + "h": 21 }, "frame": { - "x": 271, - "y": 259, - "w": 20, - "h": 20 + "x": 314, + "y": 198, + "w": 22, + "h": 21 + } + }, + { + "filename": "mystery_egg", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 18 + }, + "frame": { + "x": 336, + "y": 58, + "w": 16, + "h": 18 + } + }, + { + "filename": "potion", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 17, + "h": 23 + }, + "frame": { + "x": 336, + "y": 76, + "w": 17, + "h": 23 + } + }, + { + "filename": "super_potion", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 17, + "h": 23 + }, + "frame": { + "x": 336, + "y": 99, + "w": 17, + "h": 23 } }, { @@ -4812,159 +4728,12 @@ "h": 22 }, "frame": { - "x": 269, - "y": 279, + "x": 353, + "y": 62, "w": 22, "h": 22 } }, - { - "filename": "black_sludge", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 24, - "h": 24 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 22, - "h": 19 - }, - "frame": { - "x": 269, - "y": 301, - "w": 22, - "h": 19 - } - }, - { - "filename": "wellspring_mask", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 23, - "h": 21 - }, - "frame": { - "x": 267, - "y": 320, - "w": 23, - "h": 21 - } - }, - { - "filename": "burn_drive", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 23, - "h": 17 - }, - "frame": { - "x": 245, - "y": 341, - "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": 268, - "y": 341, - "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": 223, - "y": 345, - "w": 22, - "h": 19 - } - }, - { - "filename": "lock_capsule", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 19, - "h": 22 - }, - "frame": { - "x": 204, - "y": 347, - "w": 19, - "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": 204, - "y": 369, - "w": 19, - "h": 22 - } - }, { "filename": "tm_dark", "rotated": false, @@ -4980,117 +4749,12 @@ "h": 22 }, "frame": { - "x": 223, - "y": 364, + "x": 375, + "y": 62, "w": 22, "h": 22 } }, - { - "filename": "reviver_seed", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 8, - "w": 23, - "h": 20 - }, - "frame": { - "x": 245, - "y": 358, - "w": 23, - "h": 20 - } - }, - { - "filename": "fairy_feather", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 22, - "h": 20 - }, - "frame": { - "x": 268, - "y": 360, - "w": 22, - "h": 20 - } - }, - { - "filename": "chill_drive", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 23, - "h": 17 - }, - "frame": { - "x": 245, - "y": 378, - "w": 23, - "h": 17 - } - }, - { - "filename": "douse_drive", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 23, - "h": 17 - }, - "frame": { - "x": 268, - "y": 380, - "w": 23, - "h": 17 - } - }, - { - "filename": "malicious_armor", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 20 - }, - "frame": { - "x": 223, - "y": 386, - "w": 22, - "h": 20 - } - }, { "filename": "tm_dragon", "rotated": false, @@ -5106,8 +4770,8 @@ "h": 22 }, "frame": { - "x": 205, - "y": 406, + "x": 353, + "y": 84, "w": 22, "h": 22 } @@ -5127,117 +4791,12 @@ "h": 22 }, "frame": { - "x": 227, - "y": 406, + "x": 375, + "y": 84, "w": 22, "h": 22 } }, - { - "filename": "candy_overlay", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 12, - "w": 16, - "h": 15 - }, - "frame": { - "x": 205, - "y": 391, - "w": 16, - "h": 15 - } - }, - { - "filename": "quick_claw", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 19, - "h": 21 - }, - "frame": { - "x": 249, - "y": 395, - "w": 19, - "h": 21 - } - }, - { - "filename": "golden_mystic_ticket", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 23, - "h": 19 - }, - "frame": { - "x": 268, - "y": 397, - "w": 23, - "h": 19 - } - }, - { - "filename": "relic_gold", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 9, - "y": 11, - "w": 15, - "h": 11 - }, - "frame": { - "x": 249, - "y": 416, - "w": 15, - "h": 11 - } - }, - { - "filename": "mystic_ticket", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 23, - "h": 19 - }, - "frame": { - "x": 264, - "y": 42, - "w": 23, - "h": 19 - } - }, { "filename": "tm_fairy", "rotated": false, @@ -5253,12 +4812,159 @@ "h": 22 }, "frame": { - "x": 263, - "y": 61, + "x": 397, + "y": 65, "w": 22, "h": 22 } }, + { + "filename": "black_sludge", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 24, + "h": 24 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 22, + "h": 19 + }, + "frame": { + "x": 397, + "y": 87, + "w": 22, + "h": 19 + } + }, + { + "filename": "burn_drive", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 23, + "h": 17 + }, + "frame": { + "x": 353, + "y": 106, + "w": 23, + "h": 17 + } + }, + { + "filename": "chill_drive", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 23, + "h": 17 + }, + "frame": { + "x": 376, + "y": 106, + "w": 23, + "h": 17 + } + }, + { + "filename": "blue_orb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 399, + "y": 106, + "w": 20, + "h": 20 + } + }, + { + "filename": "relic_gold", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 9, + "y": 11, + "w": 15, + "h": 11 + }, + "frame": { + "x": 336, + "y": 122, + "w": 15, + "h": 11 + } + }, + { + "filename": "hard_meteorite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 5, + "w": 20, + "h": 22 + }, + "frame": { + "x": 337, + "y": 133, + "w": 20, + "h": 22 + } + }, + { + "filename": "dawn_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 21 + }, + "frame": { + "x": 337, + "y": 155, + "w": 20, + "h": 21 + } + }, { "filename": "tm_fighting", "rotated": false, @@ -5274,12 +4980,33 @@ "h": 22 }, "frame": { - "x": 263, - "y": 83, + "x": 336, + "y": 176, "w": 22, "h": 22 } }, + { + "filename": "sweet_apple", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 21 + }, + "frame": { + "x": 336, + "y": 198, + "w": 22, + "h": 21 + } + }, { "filename": "tm_fire", "rotated": false, @@ -5295,12 +5022,33 @@ "h": 22 }, "frame": { - "x": 263, - "y": 105, + "x": 357, + "y": 123, "w": 22, "h": 22 } }, + { + "filename": "sitrus_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 5, + "w": 20, + "h": 22 + }, + "frame": { + "x": 379, + "y": 123, + "w": 20, + "h": 22 + } + }, { "filename": "tm_flying", "rotated": false, @@ -5316,33 +5064,12 @@ "h": 22 }, "frame": { - "x": 263, - "y": 127, + "x": 357, + "y": 145, "w": 22, "h": 22 } }, - { - "filename": "pair_of_tickets", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 23, - "h": 19 - }, - "frame": { - "x": 287, - "y": 42, - "w": 23, - "h": 19 - } - }, { "filename": "tm_ghost", "rotated": false, @@ -5358,12 +5085,33 @@ "h": 22 }, "frame": { - "x": 285, - "y": 61, + "x": 379, + "y": 145, "w": 22, "h": 22 } }, + { + "filename": "blunder_policy", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 19 + }, + "frame": { + "x": 399, + "y": 126, + "w": 22, + "h": 19 + } + }, { "filename": "tm_grass", "rotated": false, @@ -5379,8 +5127,8 @@ "h": 22 }, "frame": { - "x": 285, - "y": 83, + "x": 401, + "y": 145, "w": 22, "h": 22 } @@ -5400,8 +5148,8 @@ "h": 22 }, "frame": { - "x": 285, - "y": 105, + "x": 358, + "y": 167, "w": 22, "h": 22 } @@ -5421,96 +5169,12 @@ "h": 22 }, "frame": { - "x": 285, - "y": 127, + "x": 358, + "y": 189, "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": 310, - "y": 42, - "w": 23, - "h": 20 - } - }, - { - "filename": "sweet_apple", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 21 - }, - "frame": { - "x": 333, - "y": 42, - "w": 22, - "h": 21 - } - }, - { - "filename": "syrupy_apple", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 21 - }, - "frame": { - "x": 355, - "y": 42, - "w": 22, - "h": 21 - } - }, - { - "filename": "tart_apple", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 21 - }, - "frame": { - "x": 377, - "y": 42, - "w": 22, - "h": 21 - } - }, { "filename": "tm_normal", "rotated": false, @@ -5526,8 +5190,8 @@ "h": 22 }, "frame": { - "x": 399, - "y": 42, + "x": 380, + "y": 167, "w": 22, "h": 22 } @@ -5547,8 +5211,8 @@ "h": 22 }, "frame": { - "x": 307, - "y": 62, + "x": 380, + "y": 189, "w": 22, "h": 22 } @@ -5568,8 +5232,8 @@ "h": 22 }, "frame": { - "x": 307, - "y": 84, + "x": 402, + "y": 167, "w": 22, "h": 22 } @@ -5589,12 +5253,432 @@ "h": 22 }, "frame": { - "x": 307, - "y": 106, + "x": 402, + "y": 189, "w": 22, "h": 22 } }, + { + "filename": "coupon", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 23, + "h": 19 + }, + "frame": { + "x": 358, + "y": 211, + "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": 381, + "y": 211, + "w": 23, + "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": 404, + "y": 211, + "w": 22, + "h": 19 + } + }, + { + "filename": "douse_drive", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 23, + "h": 17 + }, + "frame": { + "x": 226, + "y": 219, + "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": 249, + "y": 219, + "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": 272, + "y": 219, + "w": 23, + "h": 19 + } + }, + { + "filename": "reviver_seed", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 8, + "w": 23, + "h": 20 + }, + "frame": { + "x": 295, + "y": 219, + "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": 318, + "y": 219, + "w": 23, + "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": 341, + "y": 219, + "w": 17, + "h": 20 + } + }, + { + "filename": "baton", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 7, + "w": 18, + "h": 18 + }, + "frame": { + "x": 208, + "y": 221, + "w": 18, + "h": 18 + } + }, + { + "filename": "metronome", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 5, + "w": 17, + "h": 22 + }, + "frame": { + "x": 191, + "y": 223, + "w": 17, + "h": 22 + } + }, + { + "filename": "relic_crown", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 23, + "h": 18 + }, + "frame": { + "x": 358, + "y": 230, + "w": 23, + "h": 18 + } + }, + { + "filename": "fairy_feather", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 22, + "h": 20 + }, + "frame": { + "x": 381, + "y": 230, + "w": 22, + "h": 20 + } + }, + { + "filename": "malicious_armor", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 20 + }, + "frame": { + "x": 403, + "y": 230, + "w": 22, + "h": 20 + } + }, + { + "filename": "candy", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 11, + "w": 18, + "h": 18 + }, + "frame": { + "x": 191, + "y": 245, + "w": 18, + "h": 18 + } + }, + { + "filename": "lock_capsule", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 5, + "w": 19, + "h": 22 + }, + "frame": { + "x": 209, + "y": 239, + "w": 19, + "h": 22 + } + }, + { + "filename": "dusk_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 21, + "h": 21 + }, + "frame": { + "x": 228, + "y": 236, + "w": 21, + "h": 21 + } + }, + { + "filename": "syrupy_apple", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 21 + }, + "frame": { + "x": 249, + "y": 238, + "w": 22, + "h": 21 + } + }, + { + "filename": "tart_apple", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 21 + }, + "frame": { + "x": 271, + "y": 238, + "w": 22, + "h": 21 + } + }, + { + "filename": "tera_orb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 20 + }, + "frame": { + "x": 293, + "y": 239, + "w": 22, + "h": 20 + } + }, { "filename": "tm_steel", "rotated": false, @@ -5610,197 +5694,8 @@ "h": 22 }, "frame": { - "x": 307, - "y": 128, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_water", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 329, - "y": 63, - "w": 22, - "h": 22 - } - }, - { - "filename": "water_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 329, - "y": 85, - "w": 22, - "h": 22 - } - }, - { - "filename": "water_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 351, - "y": 63, - "w": 22, - "h": 22 - } - }, - { - "filename": "x_accuracy", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 329, - "y": 107, - "w": 22, - "h": 22 - } - }, - { - "filename": "x_attack", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 351, - "y": 85, - "w": 22, - "h": 22 - } - }, - { - "filename": "x_defense", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 373, - "y": 63, - "w": 22, - "h": 22 - } - }, - { - "filename": "x_sp_atk", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 351, - "y": 107, - "w": 22, - "h": 22 - } - }, - { - "filename": "x_sp_def", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 373, - "y": 85, - "w": 22, - "h": 22 - } - }, - { - "filename": "x_speed", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 373, - "y": 107, + "x": 315, + "y": 239, "w": 22, "h": 22 } @@ -5820,12 +5715,180 @@ "h": 21 }, "frame": { - "x": 329, - "y": 129, + "x": 337, + "y": 239, "w": 21, "h": 21 } }, + { + "filename": "shock_drive", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 23, + "h": 17 + }, + "frame": { + "x": 358, + "y": 248, + "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": 381, + "y": 250, + "w": 23, + "h": 17 + } + }, + { + "filename": "masterpiece_teacup", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 21, + "h": 18 + }, + "frame": { + "x": 404, + "y": 250, + "w": 21, + "h": 18 + } + }, + { + "filename": "metal_alloy", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 7, + "w": 21, + "h": 19 + }, + "frame": { + "x": 228, + "y": 257, + "w": 21, + "h": 19 + } + }, + { + "filename": "tm_water", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 249, + "y": 259, + "w": 22, + "h": 22 + } + }, + { + "filename": "water_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 271, + "y": 259, + "w": 22, + "h": 22 + } + }, + { + "filename": "water_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 293, + "y": 259, + "w": 22, + "h": 22 + } + }, + { + "filename": "x_accuracy", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 315, + "y": 261, + "w": 22, + "h": 22 + } + }, { "filename": "shiny_stone", "rotated": false, @@ -5841,14 +5904,14 @@ "h": 21 }, "frame": { - "x": 350, - "y": 129, + "x": 337, + "y": 260, "w": 21, "h": 21 } }, { - "filename": "tera_orb", + "filename": "upgrade", "rotated": false, "trimmed": true, "sourceSize": { @@ -5857,19 +5920,61 @@ }, "spriteSourceSize": { "x": 5, - "y": 6, + "y": 7, "w": 22, - "h": 20 + "h": 19 }, "frame": { - "x": 371, - "y": 129, + "x": 358, + "y": 265, "w": 22, - "h": 20 + "h": 19 } }, { - "filename": "sitrus_berry", + "filename": "x_attack", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 380, + "y": 267, + "w": 22, + "h": 22 + } + }, + { + "filename": "x_defense", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 402, + "y": 268, + "w": 22, + "h": 22 + } + }, + { + "filename": "candy_jar", "rotated": false, "trimmed": true, "sourceSize": { @@ -5878,14 +5983,98 @@ }, "spriteSourceSize": { "x": 6, + "y": 6, + "w": 19, + "h": 20 + }, + "frame": { + "x": 209, + "y": 261, + "w": 19, + "h": 20 + } + }, + { + "filename": "old_gateau", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 21, + "h": 18 + }, + "frame": { + "x": 228, + "y": 276, + "w": 21, + "h": 18 + } + }, + { + "filename": "x_sp_atk", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, "y": 5, - "w": 20, + "w": 22, "h": 22 }, "frame": { - "x": 395, - "y": 64, - "w": 20, + "x": 249, + "y": 281, + "w": 22, + "h": 22 + } + }, + { + "filename": "x_sp_def", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 271, + "y": 281, + "w": 22, + "h": 22 + } + }, + { + "filename": "x_speed", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 293, + "y": 281, + "w": 22, "h": 22 } }, @@ -5904,222 +6093,12 @@ "h": 21 }, "frame": { - "x": 395, - "y": 86, + "x": 315, + "y": 283, "w": 21, "h": 21 } }, - { - "filename": "gb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 395, - "y": 107, - "w": 20, - "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": 270, - "y": 149, - "w": 23, - "h": 18 - } - }, - { - "filename": "metronome", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 17, - "h": 22 - }, - "frame": { - "x": 275, - "y": 167, - "w": 17, - "h": 22 - } - }, - { - "filename": "shock_drive", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 23, - "h": 17 - }, - "frame": { - "x": 293, - "y": 150, - "w": 23, - "h": 17 - } - }, - { - "filename": "upgrade", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 22, - "h": 19 - }, - "frame": { - "x": 292, - "y": 167, - "w": 22, - "h": 19 - } - }, - { - "filename": "wise_glasses", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 23, - "h": 17 - }, - "frame": { - "x": 316, - "y": 150, - "w": 23, - "h": 17 - } - }, - { - "filename": "metal_alloy", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 7, - "w": 21, - "h": 19 - }, - "frame": { - "x": 314, - "y": 167, - "w": 21, - "h": 19 - } - }, - { - "filename": "masterpiece_teacup", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 21, - "h": 18 - }, - "frame": { - "x": 339, - "y": 150, - "w": 21, - "h": 18 - } - }, - { - "filename": "old_gateau", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 21, - "h": 18 - }, - "frame": { - "x": 335, - "y": 168, - "w": 21, - "h": 18 - } - }, - { - "filename": "baton", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 18, - "h": 18 - }, - "frame": { - "x": 360, - "y": 150, - "w": 18, - "h": 18 - } - }, { "filename": "sharp_meteorite", "rotated": false, @@ -6135,14 +6114,14 @@ "h": 18 }, "frame": { - "x": 356, - "y": 168, + "x": 337, + "y": 281, "w": 21, "h": 18 } }, { - "filename": "candy_jar", + "filename": "unremarkable_teacup", "rotated": false, "trimmed": true, "sourceSize": { @@ -6150,16 +6129,16 @@ "h": 32 }, "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 19, - "h": 20 + "x": 5, + "y": 7, + "w": 21, + "h": 18 }, "frame": { - "x": 378, - "y": 149, - "w": 19, - "h": 20 + "x": 358, + "y": 284, + "w": 21, + "h": 18 } }, { @@ -6177,14 +6156,14 @@ "h": 17 }, "frame": { - "x": 377, - "y": 169, + "x": 379, + "y": 289, "w": 20, "h": 17 } }, { - "filename": "golden_egg", + "filename": "gb", "rotated": false, "trimmed": true, "sourceSize": { @@ -6192,20 +6171,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 7, + "x": 6, "y": 6, - "w": 17, + "w": 20, "h": 20 }, "frame": { - "x": 393, - "y": 129, - "w": 17, + "x": 399, + "y": 290, + "w": 20, "h": 20 } }, { - "filename": "razor_fang", + "filename": "lum_berry", "rotated": false, "trimmed": true, "sourceSize": { @@ -6213,36 +6192,15 @@ "h": 32 }, "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 18, - "h": 20 - }, - "frame": { - "x": 410, - "y": 127, - "w": 18, - "h": 20 - } - }, - { - "filename": "oval_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, + "x": 6, "y": 7, - "w": 18, + "w": 20, "h": 19 }, "frame": { - "x": 410, - "y": 147, - "w": 18, + "x": 336, + "y": 299, + "w": 20, "h": 19 } }, @@ -6261,54 +6219,12 @@ "h": 20 }, "frame": { - "x": 397, - "y": 166, + "x": 356, + "y": 302, "w": 20, "h": 20 } }, - { - "filename": "unremarkable_teacup", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 21, - "h": 18 - }, - "frame": { - "x": 292, - "y": 186, - "w": 21, - "h": 18 - } - }, - { - "filename": "lum_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 7, - "w": 20, - "h": 19 - }, - "frame": { - "x": 313, - "y": 186, - "w": 20, - "h": 19 - } - }, { "filename": "mb", "rotated": false, @@ -6324,8 +6240,8 @@ "h": 20 }, "frame": { - "x": 333, - "y": 186, + "x": 376, + "y": 306, "w": 20, "h": 20 } @@ -6345,56 +6261,14 @@ "h": 20 }, "frame": { - "x": 353, - "y": 186, + "x": 396, + "y": 310, "w": 20, "h": 20 } }, { - "filename": "pb_gold", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 373, - "y": 186, - "w": 20, - "h": 20 - } - }, - { - "filename": "rb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 393, - "y": 186, - "w": 20, - "h": 20 - } - }, - { - "filename": "eviolite", + "filename": "leftovers", "rotated": false, "trimmed": true, "sourceSize": { @@ -6403,19 +6277,19 @@ }, "spriteSourceSize": { "x": 8, - "y": 8, + "y": 5, "w": 15, - "h": 15 + "h": 22 }, "frame": { - "x": 413, - "y": 186, + "x": 160, + "y": 294, "w": 15, - "h": 15 + "h": 22 } }, { - "filename": "prism_scale", + "filename": "metal_coat", "rotated": false, "trimmed": true, "sourceSize": { @@ -6423,20 +6297,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 9, - "y": 8, - "w": 15, - "h": 15 + "x": 6, + "y": 5, + "w": 19, + "h": 22 }, "frame": { - "x": 413, - "y": 201, - "w": 15, - "h": 15 + "x": 160, + "y": 316, + "w": 19, + "h": 22 } }, { - "filename": "smooth_meteorite", + "filename": "miracle_seed", "rotated": false, "trimmed": true, "sourceSize": { @@ -6444,16 +6318,37 @@ "h": 32 }, "spriteSourceSize": { - "x": 7, + "x": 6, + "y": 7, + "w": 19, + "h": 19 + }, + "frame": { + "x": 160, + "y": 338, + "w": 19, + "h": 19 + } + }, + { + "filename": "quick_claw", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, "y": 6, - "w": 20, - "h": 20 + "w": 19, + "h": 21 }, "frame": { - "x": 289, - "y": 204, - "w": 20, - "h": 20 + "x": 161, + "y": 357, + "w": 19, + "h": 21 } }, { @@ -6471,14 +6366,14 @@ "h": 21 }, "frame": { - "x": 289, - "y": 224, + "x": 161, + "y": 378, "w": 19, "h": 21 } }, { - "filename": "power_herb", + "filename": "soothe_bell", "rotated": false, "trimmed": true, "sourceSize": { @@ -6486,20 +6381,83 @@ "h": 32 }, "spriteSourceSize": { - "x": 6, - "y": 7, - "w": 20, - "h": 19 + "x": 8, + "y": 5, + "w": 17, + "h": 22 }, "frame": { - "x": 309, - "y": 205, - "w": 20, - "h": 19 + "x": 164, + "y": 399, + "w": 17, + "h": 22 } }, { - "filename": "strange_ball", + "filename": "absolite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 175, + "y": 257, + "w": 16, + "h": 16 + } + }, + { + "filename": "dark_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 7, + "w": 18, + "h": 18 + }, + "frame": { + "x": 191, + "y": 263, + "w": 18, + "h": 18 + } + }, + { + "filename": "aerodactylite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 159, + "y": 257, + "w": 16, + "h": 16 + } + }, + { + "filename": "pb_gold", "rotated": false, "trimmed": true, "sourceSize": { @@ -6513,50 +6471,8 @@ "h": 20 }, "frame": { - "x": 308, - "y": 224, - "w": 20, - "h": 20 - } - }, - { - "filename": "razor_claw", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 7, - "w": 20, - "h": 19 - }, - "frame": { - "x": 329, - "y": 206, - "w": 20, - "h": 19 - } - }, - { - "filename": "ub", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 349, - "y": 206, + "x": 160, + "y": 273, "w": 20, "h": 20 } @@ -6576,12 +6492,243 @@ "h": 20 }, "frame": { - "x": 369, - "y": 206, + "x": 175, + "y": 293, "w": 19, "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": 179, + "y": 313, + "w": 17, + "h": 20 + } + }, + { + "filename": "razor_fang", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 6, + "w": 18, + "h": 20 + }, + "frame": { + "x": 179, + "y": 333, + "w": 18, + "h": 20 + } + }, + { + "filename": "rb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 180, + "y": 353, + "w": 20, + "h": 20 + } + }, + { + "filename": "smooth_meteorite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 180, + "y": 373, + "w": 20, + "h": 20 + } + }, + { + "filename": "strange_ball", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 181, + "y": 393, + "w": 20, + "h": 20 + } + }, + { + "filename": "ub", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 194, + "y": 281, + "w": 20, + "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": 196, + "y": 301, + "w": 18, + "h": 19 + } + }, + { + "filename": "power_herb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 7, + "w": 20, + "h": 19 + }, + "frame": { + "x": 214, + "y": 294, + "w": 20, + "h": 19 + } + }, + { + "filename": "razor_claw", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 7, + "w": 20, + "h": 19 + }, + "frame": { + "x": 214, + "y": 313, + "w": 20, + "h": 19 + } + }, + { + "filename": "relic_band", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 9, + "w": 17, + "h": 16 + }, + "frame": { + "x": 197, + "y": 320, + "w": 17, + "h": 16 + } + }, + { + "filename": "aggronite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 197, + "y": 336, + "w": 16, + "h": 16 + } + }, { "filename": "white_herb", "rotated": false, @@ -6597,8 +6744,8 @@ "h": 19 }, "frame": { - "x": 388, - "y": 206, + "x": 200, + "y": 352, "w": 20, "h": 19 } @@ -6618,33 +6765,12 @@ "h": 18 }, "frame": { - "x": 408, - "y": 216, + "x": 200, + "y": 371, "w": 20, "h": 18 } }, - { - "filename": "miracle_seed", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 7, - "w": 19, - "h": 19 - }, - "frame": { - "x": 328, - "y": 225, - "w": 19, - "h": 19 - } - }, { "filename": "wl_antidote", "rotated": false, @@ -6660,8 +6786,8 @@ "h": 18 }, "frame": { - "x": 347, - "y": 226, + "x": 201, + "y": 389, "w": 20, "h": 18 } @@ -6681,56 +6807,14 @@ "h": 18 }, "frame": { - "x": 367, - "y": 226, + "x": 201, + "y": 407, "w": 20, "h": 18 } }, { - "filename": "wl_burn_heal", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 388, - "y": 225, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_custom_spliced", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 408, - "y": 234, - "w": 20, - "h": 18 - } - }, - { - "filename": "soothe_bell", + "filename": "alakazite", "rotated": false, "trimmed": true, "sourceSize": { @@ -6739,477 +6823,15 @@ }, "spriteSourceSize": { "x": 8, - "y": 5, - "w": 17, - "h": 22 - }, - "frame": { - "x": 291, - "y": 245, - "w": 17, - "h": 22 - } - }, - { - "filename": "wl_custom_thief", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, "y": 8, - "w": 20, - "h": 18 + "w": 16, + "h": 16 }, "frame": { - "x": 308, - "y": 244, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_elixir", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 328, - "y": 244, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_ether", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 348, - "y": 244, - "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": 291, - "y": 267, - "w": 17, - "h": 20 - } - }, - { - "filename": "wl_full_heal", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 308, - "y": 262, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_full_restore", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 328, - "y": 262, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_guard_spec", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 348, - "y": 262, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_hyper_potion", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 368, - "y": 244, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_ice_heal", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 388, - "y": 243, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_item_drop", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 408, - "y": 252, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_item_urge", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 368, - "y": 262, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_max_elixir", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 388, - "y": 261, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_max_ether", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 408, - "y": 270, - "w": 20, - "h": 18 - } - }, - { - "filename": "candy", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 11, - "w": 18, - "h": 18 - }, - "frame": { - "x": 291, - "y": 287, - "w": 18, - "h": 18 - } - }, - { - "filename": "dark_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 18, - "h": 18 - }, - "frame": { - "x": 291, - "y": 305, - "w": 18, - "h": 18 - } - }, - { - "filename": "wl_max_potion", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 290, - "y": 323, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_max_revive", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 290, - "y": 341, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_paralyze_heal", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 290, - "y": 359, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_potion", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 291, - "y": 377, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_reset_urge", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 291, - "y": 395, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_revive", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 309, - "y": 280, - "w": 20, - "h": 18 - } - }, - { - "filename": "wl_super_potion", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 309, - "y": 298, - "w": 20, - "h": 18 + "x": 213, + "y": 336, + "w": 16, + "h": 16 } }, { @@ -7227,8 +6849,8 @@ "h": 18 }, "frame": { - "x": 329, - "y": 280, + "x": 220, + "y": 352, "w": 18, "h": 18 } @@ -7248,8 +6870,8 @@ "h": 18 }, "frame": { - "x": 329, - "y": 298, + "x": 220, + "y": 370, "w": 18, "h": 18 } @@ -7269,8 +6891,8 @@ "h": 18 }, "frame": { - "x": 347, - "y": 280, + "x": 221, + "y": 388, "w": 18, "h": 18 } @@ -7290,54 +6912,12 @@ "h": 18 }, "frame": { - "x": 347, - "y": 298, + "x": 221, + "y": 406, "w": 18, "h": 18 } }, - { - "filename": "mystery_egg", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 18 - }, - "frame": { - "x": 365, - "y": 280, - "w": 16, - "h": 18 - } - }, - { - "filename": "alakazite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 365, - "y": 298, - "w": 16, - "h": 16 - } - }, { "filename": "altarianite", "rotated": false, @@ -7353,12 +6933,306 @@ "h": 16 }, "frame": { - "x": 310, - "y": 316, + "x": 181, + "y": 413, "w": 16, "h": 16 } }, + { + "filename": "wl_burn_heal", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 234, + "y": 303, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_custom_spliced", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 254, + "y": 303, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_custom_thief", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 274, + "y": 303, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_elixir", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 294, + "y": 303, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_ether", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 314, + "y": 304, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_full_heal", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 234, + "y": 321, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_full_restore", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 254, + "y": 321, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_guard_spec", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 274, + "y": 321, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_hyper_potion", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 294, + "y": 321, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_ice_heal", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 314, + "y": 322, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_item_drop", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 334, + "y": 318, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_item_urge", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 354, + "y": 322, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_max_elixir", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 374, + "y": 326, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_max_ether", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 394, + "y": 330, + "w": 20, + "h": 18 + } + }, { "filename": "ampharosite", "rotated": false, @@ -7374,8 +7248,8 @@ "h": 16 }, "frame": { - "x": 310, - "y": 332, + "x": 414, + "y": 330, "w": 16, "h": 16 } @@ -7395,12 +7269,96 @@ "h": 16 }, "frame": { - "x": 326, - "y": 316, + "x": 414, + "y": 346, "w": 16, "h": 16 } }, + { + "filename": "wl_max_potion", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 334, + "y": 336, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_max_revive", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 354, + "y": 340, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_paralyze_heal", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 374, + "y": 344, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_potion", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 394, + "y": 348, + "w": 20, + "h": 18 + } + }, { "filename": "banettite", "rotated": false, @@ -7416,12 +7374,75 @@ "h": 16 }, "frame": { - "x": 310, - "y": 348, + "x": 414, + "y": 362, "w": 16, "h": 16 } }, + { + "filename": "wl_reset_urge", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 238, + "y": 339, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_revive", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 258, + "y": 339, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_super_potion", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 238, + "y": 357, + "w": 20, + "h": 18 + } + }, { "filename": "beedrillite", "rotated": false, @@ -7437,8 +7458,8 @@ "h": 16 }, "frame": { - "x": 326, - "y": 332, + "x": 278, + "y": 339, "w": 16, "h": 16 } @@ -7458,8 +7479,8 @@ "h": 16 }, "frame": { - "x": 342, - "y": 316, + "x": 258, + "y": 357, "w": 16, "h": 16 } @@ -7479,8 +7500,8 @@ "h": 16 }, "frame": { - "x": 326, - "y": 348, + "x": 294, + "y": 339, "w": 16, "h": 16 } @@ -7500,8 +7521,8 @@ "h": 16 }, "frame": { - "x": 342, - "y": 332, + "x": 310, + "y": 340, "w": 16, "h": 16 } @@ -7521,8 +7542,8 @@ "h": 16 }, "frame": { - "x": 342, - "y": 348, + "x": 274, + "y": 357, "w": 16, "h": 16 } @@ -7542,8 +7563,8 @@ "h": 16 }, "frame": { - "x": 381, - "y": 280, + "x": 290, + "y": 355, "w": 16, "h": 16 } @@ -7563,8 +7584,8 @@ "h": 16 }, "frame": { - "x": 381, - "y": 296, + "x": 306, + "y": 356, "w": 16, "h": 16 } @@ -7584,8 +7605,8 @@ "h": 16 }, "frame": { - "x": 358, - "y": 316, + "x": 322, + "y": 356, "w": 16, "h": 16 } @@ -7605,8 +7626,8 @@ "h": 16 }, "frame": { - "x": 358, - "y": 332, + "x": 338, + "y": 354, "w": 16, "h": 16 } @@ -7626,8 +7647,8 @@ "h": 16 }, "frame": { - "x": 358, - "y": 348, + "x": 354, + "y": 358, "w": 16, "h": 16 } @@ -7647,8 +7668,8 @@ "h": 16 }, "frame": { - "x": 397, - "y": 288, + "x": 370, + "y": 362, "w": 16, "h": 16 } @@ -7668,8 +7689,8 @@ "h": 16 }, "frame": { - "x": 397, - "y": 304, + "x": 338, + "y": 370, "w": 16, "h": 16 } @@ -7689,8 +7710,8 @@ "h": 16 }, "frame": { - "x": 381, - "y": 312, + "x": 354, + "y": 374, "w": 16, "h": 16 } @@ -7710,8 +7731,8 @@ "h": 16 }, "frame": { - "x": 374, - "y": 328, + "x": 370, + "y": 378, "w": 16, "h": 16 } @@ -7731,8 +7752,8 @@ "h": 16 }, "frame": { - "x": 374, - "y": 344, + "x": 386, + "y": 366, "w": 16, "h": 16 } @@ -7752,8 +7773,8 @@ "h": 16 }, "frame": { - "x": 397, - "y": 320, + "x": 386, + "y": 382, "w": 16, "h": 16 } @@ -7773,8 +7794,8 @@ "h": 16 }, "frame": { - "x": 390, - "y": 336, + "x": 402, + "y": 378, "w": 16, "h": 16 } @@ -7794,8 +7815,8 @@ "h": 16 }, "frame": { - "x": 390, - "y": 352, + "x": 402, + "y": 394, "w": 16, "h": 16 } @@ -7815,8 +7836,8 @@ "h": 16 }, "frame": { - "x": 374, - "y": 360, + "x": 290, + "y": 371, "w": 16, "h": 16 } @@ -7836,8 +7857,8 @@ "h": 16 }, "frame": { - "x": 390, - "y": 368, + "x": 306, + "y": 372, "w": 16, "h": 16 } @@ -7857,8 +7878,8 @@ "h": 16 }, "frame": { - "x": 406, - "y": 336, + "x": 322, + "y": 372, "w": 16, "h": 16 } @@ -7878,8 +7899,8 @@ "h": 16 }, "frame": { - "x": 406, - "y": 352, + "x": 338, + "y": 386, "w": 16, "h": 16 } @@ -7899,8 +7920,8 @@ "h": 16 }, "frame": { - "x": 406, - "y": 368, + "x": 354, + "y": 390, "w": 16, "h": 16 } @@ -7920,8 +7941,8 @@ "h": 16 }, "frame": { - "x": 311, - "y": 364, + "x": 370, + "y": 394, "w": 16, "h": 16 } @@ -7941,8 +7962,8 @@ "h": 16 }, "frame": { - "x": 327, - "y": 364, + "x": 386, + "y": 398, "w": 16, "h": 16 } @@ -7962,8 +7983,8 @@ "h": 16 }, "frame": { - "x": 311, - "y": 380, + "x": 239, + "y": 414, "w": 16, "h": 16 } @@ -7983,8 +8004,8 @@ "h": 16 }, "frame": { - "x": 343, - "y": 364, + "x": 255, + "y": 414, "w": 16, "h": 16 } @@ -8004,8 +8025,8 @@ "h": 16 }, "frame": { - "x": 311, - "y": 396, + "x": 271, + "y": 414, "w": 16, "h": 16 } @@ -8025,8 +8046,8 @@ "h": 16 }, "frame": { - "x": 311, - "y": 412, + "x": 287, + "y": 414, "w": 16, "h": 16 } @@ -8046,8 +8067,8 @@ "h": 16 }, "frame": { - "x": 327, - "y": 380, + "x": 303, + "y": 414, "w": 16, "h": 16 } @@ -8067,8 +8088,8 @@ "h": 16 }, "frame": { - "x": 327, - "y": 396, + "x": 319, + "y": 414, "w": 16, "h": 16 } @@ -8088,8 +8109,8 @@ "h": 16 }, "frame": { - "x": 327, - "y": 412, + "x": 335, + "y": 414, "w": 16, "h": 16 } @@ -8109,8 +8130,8 @@ "h": 16 }, "frame": { - "x": 343, - "y": 380, + "x": 351, + "y": 414, "w": 16, "h": 16 } @@ -8130,8 +8151,8 @@ "h": 16 }, "frame": { - "x": 343, - "y": 396, + "x": 367, + "y": 414, "w": 16, "h": 16 } @@ -8151,8 +8172,8 @@ "h": 16 }, "frame": { - "x": 343, - "y": 412, + "x": 383, + "y": 414, "w": 16, "h": 16 } @@ -8172,8 +8193,8 @@ "h": 16 }, "frame": { - "x": 359, - "y": 376, + "x": 399, + "y": 414, "w": 16, "h": 16 } @@ -8193,8 +8214,8 @@ "h": 16 }, "frame": { - "x": 359, - "y": 392, + "x": 239, + "y": 375, "w": 16, "h": 16 } @@ -8214,8 +8235,8 @@ "h": 16 }, "frame": { - "x": 359, - "y": 408, + "x": 239, + "y": 391, "w": 16, "h": 16 } @@ -8235,8 +8256,8 @@ "h": 16 }, "frame": { - "x": 375, - "y": 384, + "x": 255, + "y": 375, "w": 16, "h": 16 } @@ -8256,8 +8277,8 @@ "h": 16 }, "frame": { - "x": 375, - "y": 400, + "x": 255, + "y": 391, "w": 16, "h": 16 } @@ -8277,8 +8298,8 @@ "h": 16 }, "frame": { - "x": 391, - "y": 384, + "x": 271, + "y": 373, "w": 16, "h": 16 } @@ -8298,8 +8319,8 @@ "h": 16 }, "frame": { - "x": 391, - "y": 400, + "x": 271, + "y": 389, "w": 16, "h": 16 } @@ -8310,6 +8331,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:ae06b70c6800597c7ac11beefc1d8aad:b9f30512e12737247c8cb2691252baac:110e074689c9edd2c54833ce2e4d9270$" + "smartupdate": "$TexturePacker:SmartUpdate:d4a093d6c2afb1a689f792d07fc18264:8cc8502bdaaf610b661a1589e1a22f99:110e074689c9edd2c54833ce2e4d9270$" } } diff --git a/public/images/items.png b/public/images/items.png index a031b00ceb0af308f89835efab44d95fc6237b42..932c9b88874654b23919d611b278232d05228d3b 100644 GIT binary patch literal 57030 zcmXtfWmFtZuqf_siv$hsPH=Y!f#56}oB)fvv$%%f?gUvJ7J|D34-kBDcL|=yckjD% zPS;d*&ySj(>hg*H^idHTgB$}64h~ycNlpt64j%H~Ktp_+`Nu|30SAW&_eo7#Ud_(s zZAM8+gN2@%hK7cloBQ9te`gmrZ}9E%^-X<#c${8X9335b-7|^R7Ja_0%*e{9udCD0 z(t50`SzlW>HS>RcUK%vFdU_h!JJ`GBU{{hBpT2#%di)EHi&0Bgn66a`@b!OL5Bx1J zmppK{xO2QUcmqmod_3K0-aDA4^2O{+%kb1xhImn?{zLDU zQr}~~6Y0xd@k6iq<9*Ns>;ZQC7ZwSsow>~~`QhU1{5*r%75K0-uiXX~Oi!=qN_{`e zKv_gVp)Ri4+uOByx4-Ew_Crn9SjXt(uq1Q;<;Ke6vE%Q*rS-$v=-awKp9@Qe2Je$A z8noPR9U@{R70s9&GhX8OqntlKEsR1r*}P#EkqtAu>jNno~Od3lB$*@2iMW_AZW79NOQSu!oz)B%o60%%*S8T zPVQl7pk}ag2r8iCWIa7+{k$RqxlR-k6ZMKE*8%+)yR2F>{R9p37qj|G&FB4e+V`X^ ztj0?o(9(2QOL-YvQ`6$3a4me4Sd$c{ZhG+c^>uL^t^0yt> z93IX6QIZz+^0hSQ`HE<;&hPj~DK z_24F%mR5{1M+J(6U?(naCG)XOeU>G?0IwcT7XOLb;+v`8We*ZqfV+av&dxJDxATT+uK%i?fEIu@x9oR1009o{rm~p%Wt?#BWErm@w_zMI zDzQsRSOd>3Bda=hDj5mSdzNPG>{>tUnP-!KTA!zWeD7oly5yF9I{+B&S|2~d{jbo! zGJF%t|A_xKiw;sUaD#)xHUDqGS4fuI!NJkMDa%P~doQ1KqI+xWwEWGjY&_oaVWlP3 z3g@;A4(~<7CXT|Bqm#A7f~TjIqVc9>hF4as4@1JU!lPG!uXjWdjo2eVzzL30*Zwp; zu2z>V-C;5Jpw?c8R7KW2&(+=&uA467QJ_8@Oo?gdIi$%s1m*8O-mvQa}dG`;}y& zurlG7s}Iu%v4T_~V$G#Zfgu6c{;~UEohL#}{yek?E8>ohhIMYORp$^KU#Ih}PHAel zdGV^8jrHQ!_Q2$nxX>JFV1IxA3YIe=PV447fVBP+nc33P>1O}r@c;*UI<#Cz9rDQj z&roOHCO_54C%L-1`q9J~*ES|Olp+yZuW2mS5)N|S-MuNNHg{3`Tm}bP@~(Fi;(~{u zPwqF7_N4ClpWR{g=uqwe5n#&{J3JZ)oTw&-z|}jK?Uvy|yLhqft%B)gENZ6;OtX+? zMY~NeirT9!LOthbG|wj#ziEeueE5nf*xNR=%-@P^@%Cj>C=2|(;A$Nn!elob66mx! z#O}Gx-r%-i6j1l0Qkxsg-}v`@{Uk6RD+I4Lm!S5C$Gi{cxQ(A%eO$wcB9p{UTo1d< zE~QdPN6)z-Zw0f=ZqRS>WbNmWuM=@bnNIbXK{M;{WC=YBCmcz-b`jY2>X`T>4wDqS zyd48K($6u%%~T0a(@+70)xp>B>F$&RItH(&GoQ+a3fXjH<=jj3iuXq;>48jk1U%_d z27HM&m5*4;rB&Y9{Poh>?L%6>_bz*7JIPTF6Ien5df7wSdYp)#nnPzH4#6^mFWV2g zO1auMI@zeL#C#*s-S(+6F9s7RE8F38>0vQ(a=_#_l*Fv^Y~DfZb}d`*#}R^lu-!Ro zEz!Aghjn}Nh?M6r$AQ8mN46ecg@ir<3+kulMAMv<%gej$n!Axn>DYo!F5m~>JBWJv z!$*uH_}6c{FeEr6Cp#=6FwvxLFf=q@$vHz-+=WQ#vbEi9Tdw{&_&H zv$qu%{u@l&5R;R$c||RUL4c4Y=(IXao$q@#-6vIG8)4Hq{JCh<2I2QFz9@$eVe=8! zUk;<&MYfl?+C34Jb0q@EosO*+)+(2S zc4J_v6%+a7>u=f6bqS;$XKM{sB8V(K&7tkO#%~PbBwvp( z_^=w!J18K|5th{S6%;PTCQH273Rh_lGCm)@?}S!D{s|O{L>cUob!y~uawS>~`0A;@ zwj5>k$bOxPqvQqg1hmo4e*z_csG}nwWQjcI3nb`gkl$|VU~LD&WE~U=!LhQ2rlbUUe<4ON5;!)KA3P6A z4IancV20$|U1jbwCQu0V=U)WH@nzV-y;p-37ZrUn(zHGpqnYDz4N;|^#Cm_ z&r^VO;A?0RP~(QIC)p(_DJYJ6r>{7I$Eru^yYC^$_apu%n5iz%Vk)pm9E^U|r-WNY=* z^Yk@7aNWes@6tj|NWxqG;&Bfb)eUEBe<>%%@2uB-J6;GYL>^g}>AqFN|9U$yWZ~}T z7jfkwBPMRYqK*8d;Ncg-2|ms|f|lr_t~&LicWr2B?AUecMCOC%&ij*U7XanO&cC8ZHX7N7{ z-)#8fwgy)TZnIeIO;U=uGfS>uy3_!Lon}i?;f|e<7;_yKA;!jQ`vsiA&7>j9`_>bWM<+{vSy?BkfT?b{ z2z&+MsL!v_E13aUpBA!hWZ={Dx0cT|@N9r|k%?Qsk!lWMNak@lLv*AUS{)g>;D<*J zQr5pHhAHuXO6K3b?4K)#5uwU`8gKxDa=TBeW73ux-^kb>h`|f75;f-6g z*c%2ThR+CLqh%GN<#Bkr1DGf&L7&cs)6u90CJR#JX4Z@k05Y2vI&2{}@&8l6bg|cPtcFe-duqMU}tnx*bLC@^hY@TZU%j%~E;(TRc{8&B8 z$ylIH+0Xqp?k{ACDwv><20FTY=>Q(!;onrx=Lzia+iVJEE(*^3-7nnsxu;Tdk1t0c zgKX85e)Ls7R`gC1VGNYfhoy`K#M-Y9tEVpf!qp^snh!y>(>ryP>c@)}{Z^;gS?{Py z>;e*afGDh*Gto)<9dMRZrVRt^Om-+0zyF!9Y}q__1WlfUp=)nRdhAVUuCV%p8>Is_?XNrviAPBbw%<-%D| zs$4p*%gV6Q0Ox~5VM9D4V*m5_1-6(M-U+UA#y%QIC0K9cv_)6!fQ&n+`ZBUD;&W^a z`K0<47!4hD6l>A_2QMnrV%$N1JWp)*eN`peX46$Iu@ za+%M}jqGFq%QF!U8}Ewg-!>-NNG_NXf@Ez9Xq4gbJp5`~jsohZKKS+g>T~?6F0yj$ zk#2SlJ_D{F^f>59^4e-}qW{K3f%kvQFfMp)fc(`s4s9wR4?h@M42xglFb7GHmqh7g z`CQCdm1ts}aSb9$APyHlN9ob4P}GL{1% zD+3pS#hJRXSdqqS^7v&|x)vF_t@iUD<#`R;%m4iA4hgXlbpL}E{{#OQ|38>?NT^<% z%2*_@71y)71&#YbD6>(G*M3mJHURTDg?r{>xO0zSZ1^2lRjv+9i3}Wy`J9<={PIxK zZp0J=4 zM}uJq7J{Lnc}A&?m3hKS>T~2?3TjG*OpM5ouey`myQRj*`N^AA$R^~>*pmwjj~`7_ z_S!2e_0_xn)}}Ay>Kh6X+Tynz$a%Xe&0)(MyL(p)?UO|!(DM>_6ARB4?bBX@a^!#5 zSpN;0YNPJY7)J1@ca7M>DPPQ!I2|8>rsca3W2)DaS)*ep(ef2|9_y|-Z#wM#%Ji6R zB2~pCBm|EUnM`EIe(TWWa-XqFu_dVp{V4xUp$Y!E+nGN8r;Ms;I7(>c?E|lW&rwsY zAlOn(sFEb#I1?!F;H|Uvt5gZY!M1fLO6`CiLsMadE_uJlR#O&6XBzlm<$ja?FR`B{ z;e61{xtC_xPJR6_$FsfV&iyO<^woofg9f3J(0zr`Q}xjpagwgOF=aTU-6BahciFM; z#VpNnD>k8Z;5oXG^ONpPx|iIswfK7ED?~xLNwb0Bw!5e#@UmYyCkH-AZVB&7> zIR?hDqtp7Zn_G=!iCvrY&m6JMiT=L6{%p1hT|Amd+*bJamqt{O2?r^2qy_`FUDNe; zt2o@m!C$~_iQQkAX7THCE}ACCwto&4i;<)0KBx&;DVTW7ZDXPzP9>nGWPbUq6O^df z@4Wa*+=l1#v%;3JaoFwrCvGrH_fss_QMuKwylp&97J0JW?Yh=a5$9)nCVWgQRCjSR z;p=gV;8+cjccOxBdo0kPu}yWA7{PcF==8!RhK$#FT}7z1CNgrg{yonQ%J3Q{VFZ_& z(!oal2yc~)LsWX?0uSWHA(St!S1|LcookV;lSHWdU_}#i*%1s~ZnB%}@X^)1W`FJD z)A!~B5|H}bZ$`F${lW3eNIcMkHmj(k=j9hdNHj^LaQK3d0GTs4E~Ga+{B`#7%9T{@*f*@_pzdLK`co%a z`fjhcBVI{6k;GND=V;&A`lcg8r#RpTyP{~Vt_1H)LiOmVZMHU zIo_kI+7XqIk+DR#j*W4QA|lsk+sq~*F9P;F3Y65eMF*}TLCmGl#mu(q%#qih+Or$m zoC=Vr>bh5Q&8WD}mr^QKHSDpthKo5P17R=&f`_&9cOm$*W$JuQ%qy5zEtV$d5aVmt z4MEVFng%X;o0x%PU$zZ6tfdc`Q!7aT*ic=KK)6T};Ucjz1 z;tx#z{9X5_r~3{m>!n5BG`=4EGqbnUyCUD8l1?R7^zaE`s7THz?lXk@rRT<)zQI6_7A&H*SZdbnuIwD4OBv za_&{*@ClLq7Wo7yvn6^iMr8njlBMT6B2!j47Z7br#wLm-l7bND(eN)B`Xd4x^-{SV zG`tLmzt-;2uXsRmsO7F8<3Z_tOQUNz08cs_gQ{Nux%YP9-Z1YWA8{d@#9PVD2`DUg zv$+X3FgK{E*^ARfGjM$oVM3YB;Y?)1;iS5AzfMW&GoFVFdUrN zZC)*GCc_gSUlHeZF^4yC=Z-Q;B8hM_R7~V#DM$m?rLnW<&vplIBFII>!qs-%dmN|L zBrr8_(M#LCT%|pu5=0s8ynZ@DQ9gKK3Z*D*j~p*X!yVT%(y*9~R2kusKPudM)^ zd?aZwn)RT7^SYFiQk9!cCN1bI>2F|tSCcsJctfhmI+r%s<-<73`0Lxd}YkI32v zs-&C+#MGurq>v5|TZNNQJxM$yKqg9)Q^gq~dPucMA@k~+W25Yl`+=vLYzLfVN5ct3 z`Zf|ddbXJakSPm+(yYLWxzJ32#>%_W2Dy^?DaFUaW{xXa1HfeQ%nW7@*kIFq{4n=y zantwNZ!R3gT^C#hwHr0h#-^x-mr_;nveJ%Jt;5u)`dZR%ic-C$Yy1~J){cQ>9Bg9a z?_&6Xi|GX;NxIU~K@qV7wMJypm{t&*gY>J%w0ayB_ej zssIC#ETyRX@G_uTse!EiiEj;#y3d^eoU7GLG~ zkDiJEKPgWTt*zr377ElFJbD`!nqpv}nwBGH9~}E2@9*RHMMD2iw$!VTL~T-Ktgwr# zr1g0Ml({BASEJ_z#!}i90u2Z7n{UD}wumq2PBMF>eDvu8B>qZwAee-EBEh7V)+9r? zJK}(*&bBNpTyTzXB@?0ul1WTaJ*fL{KhPZ|HVwEW zjL)ZJkB2M@aSUOR&4pUXm?%|+LB<`;gW0}a8RD`OwYz$X&8K}MjffzCYj(9VW#bqq zo$DcX-l{AY`w21u3>D0OBOeRb zXzkn1z4Ak8`RqUtt%v>XYSq5L)d>)~k9m>#V){a*#liG7(8v_Nx=@zQaI`IBoYdJP z_WLopoM|J9?4p~)0%p!Qq<27J0Wx3gh@HE!) zY&MSl(OCsG+w5Uu@p|T7knqK9(<|zRxLPu$#PeD2>%!L1CqS*0T#qr?;*bD^N5K14 zSD;jtvuT0A$mr&m9eY{3=6V>ptT|Z+Df`R3-oM@i9KYYxxYoFu@M|XFHXTZ`-8~^` zbCz}~4o&)7#I;T1B;9pB_f`G-xc&QjsHdXnSlEEnJ`fw{SLzKmkbo2>A@-Z4WrWn? z&7Z9e4(2Q(L>%kb0DI>MG*nb#hTTx%j!&a)y*bxkB`KLy&x6x*frEk)~P{U>{cJG5B!`V%6fQw~uuQStEI&WpDNi&QtT$ek? zL{`Jp8~o@i^LlHY&7MlqZ!gW-h~0cdBNjOeS=hSRBuU7IxuX$6`-p&ki*Qx(ek;vJ zjp^G6X1#WYM7sVIWQ%$~|8>CFQUJrZm6U*o8|gX?d{RjZ<}t#$P5YIW({7Y>j|Od3 zWy=+iZFKaBj??^D`Hwp5B7v3~h5p+a;fqh?klMv}c3@4lp|>(xlC~%#*AXVZ9-d+8 zCHxqMnQ|DX3ftG-{C&v7xDzHsPv~mwK+#1?9i;L0?ta)zR|1(Ka~$we3sh$^a+wvV2Xo%15;vqc_f} zm+URKzA=Efcz9+cud3r>XI){$B~@B}CeGl}avVvr<)Xn*Wae6D?Q<2{OsKZWpf+%j zLjJ7oYbIZfU>|!YGpg6WhbdIRyXWiGNEXN%3g;fpFY27PB2hWlXF~!=SHN6(8Cs#=RS7y*_re3>VvA!u&eDQypt}B_xtVNq z*z5@3RkB2k({aJT&hhaS$}gkZ(}5bKj8iXsay4xZ%$$sz16G%NmL#9DZdv+xi_^=w z;8c5&%A7@dzS&{Z;EG!g3UvBUyVsSYV6*ClM`$>2Mm@x;sO}@yfGQzJ%!UIijf&BE z0>imD*-h(#eoMT^mMjD0Lu?E@3&jixH}N+mBNDGi^HmyCazH%>VAdW^drp}wazg7Q zu6TFMmWUWq?w5~$K25N4qWXaGWL^t*Q7xq}SKGdH8NQFj1R0p&r&$JfF>{2lA$xPE z?l=9KMxH7s3EZM30}ukH$>q-B_CWRHRfq=izPsDaK)!wJkUh5_}p!)6gD3t zMOR7KnN1q^HX}<%z*I7$DKsId8uy3gxRbsQbLk9*pUV-r&iZNz z6%Z<=!xXd(FYL50>KSpa5CRzJ*|WG-MLsFtJk^+mzO(NBvb5s$KkSo#rbHyTdaA18F#EH)J)G<9v;GmaUwMjqw-(8Tfw2s> zk(Yr`veuPsp_sZiF+*rFUt82-jbXU_t)m0QS6tu-4flObzpOd8`zwVymDxBnCkuP` zQE>S!5|?a1W}7Pb^-C>3AiDz@lf=wwsl+PaYe941%cDUf)w6q=uo{Y^x;nb52K?Kx zV!x*0NOMRUQ5uUKtE$N)L16f5ig!fLpCXy~fa!u$LG%T%LyiK8_A7dx|M!qjVsdkF znMICjlGoZl+dsSU(X{pCl%3(yvI{T5lq#`>evq1tK(=6h^}Ji;b0idb^50?kpu46? z-jg*Vw8)TK)c@XJKJt2Bz({$(b(r911Xi^7SIJn>=H_#Rnw*?OiAwqR7#y(OYXdn( z?^B%RhwS`_MxkSy0Fm*5a|1z-N+vu(Vg%BQtBfXII+j|(N+CH9TKbEKxy|)o(lW-D zwDAVNh(mvc_b@#s>osrWvxJ#PN*f=ULu$A`Ev_7=m5!&BqHu8tGVm}Ao}0S1toH1l zZ*)tF^j2vgvP+NW{_USYQ8bMso+hspFh4~gYY3VSy!St;j~b3pg1W9F14oYEqwBF3 z?_Li+@}`R6_?+T=WaB`=0__H|IV~jWEe4jseB$BQvvb-m7f~y5zVC&vqQ?PnOYgTj2jbw%LDw) zrh?l@VK%S9#$g@sIzGm!OSQvCi~?j)vS+24b9DZ{UVzf!fK9$BF+Q69EC+8f8dfxe z_tJVW3WG9f0u_L!3Rb#uEG7$KLrev8cGpSdCBRINZQ9k_G2I)qBS6r)86^Np-un}X z1AV@_qGvLkyqan91@BJFiSO{lI7n`h_vOAS3ZI9vl|bQ0HODYczaZEAQq$P36n!&K zMbI6lkVhGl3ih}3g>(`8vaiCujK_hz%fm&yg=I1(3u9JadePX<2YGO~k6DqiX-og@ z$F#n2U(cP9Mw@8uD~5^UY5lMD;MZIN7qaicA2FC}do zcSn*NAhfQjv)@6Q2r%+OT^`1d19EsTd6itl{n#IBuNuv`r55NN<-^*uJ_GkwK0Oug z;@az#{#0)AUa~q}ZmvP*?(crj;tmc&K{uq$AWjJQYaD0#J^j+q%GaNU%k(SzCq!#L z@%X@eSYEi)xZs#H6I5;W>JJ$D2}p**DZG|}PCcHUO^n^=8mFa(0SIAg>Y~KQqO>}V zro*OkLaKGO8xG%_I6ytEO%9sOWhx~nkIM+Nyq#nV9Wm@PtBJQ?%YyHhMd6fIjl#6U zzhm%|O=NOo+$x&s65pxGgMIEASa93=knp7o)!_1+-#xdW1Iv_o^9p9`fMQU+pDbMEqB&!*wl796cKQEzI{@ zY3Z*xjP`cdesdp=TyMB{VW4sv6*#E3kM?BX0#$wFjTH@VOl!!vLYq){3>Aua7V2_x z>feHxpKr&97wACaCT2M*fjqiKyd}^+Sfa$E6JU%Nfp9pnooo z*XqN!$iF`vRVDQ_0{ge4Z%Lby04adOvETCoXq>K`PLXrt?i_~$-PYX*`#tifZm9s; z*lmxO=D`Ivv(8U{eth2i&8RNjroURG8e&@udDm(9#aan@$PC{%%7^n~EDeVs5^Y8w zU)WcP{o=&+mndtBU^XIsbf5>j01_};$l1CBbTLB(s{aFCpPr0$k2{7=yp|hNyldPw zOxir`#!BD9M)&c&bO=@r!VVs-GhrSm_AUQWg5H!-0on^!{bfbr1<#E#{>}>@2lI@q z$+j(Nrtk7fks3b&Qwtk?Q7z=SW&#zLYPEVxCS(RS|FcyfS8|cZNm22qWJelNiuN%K z*QIDQ_}KI38g|?*WWDgOmglVLl)>gLN*t2?<(5r;DRhg$1kT~;YYbag3Ro{7rHh91 z_rf&J%cBSBGU3yvpNQiKjhV81Jgw|6JHkA&!0)m?_2lP&yrPpSCb6)Q4VrDXAtD9f zu;o@9D*v!8)-7l|O0PVc@l2iLa9e^XQBYL+6KM`nBg1GfwLMig55%SRdA>HVdA7d} zxv=>YN1Q)kFcf<6=@p(M%69 zFZesJphIJ1nRwyE(O)|_HprLZ4?NR!L5_+(v>YbUwB0~8pTXhJhR@yKT(*a3xjrnT z>kX+1=((L_E&8y%9@Sh&xsfMweu5p5A?X#rYlV;A{Kjw!Z??z0G+;F?1B?UAA^@#V zLJNq!d=wRl{_gIiaMlC`ogDN(who^!lGYp@*~1N1z;iPh(xPz9 zvWpqQczuK)_=|=$P2l2Qu>X)Llr{%;hG6=LKP@{<(N){z2Q2gmoPn2eMJ7<}3ejh< z-;KC9o~|xMr&loX848?O<fmj(;QJ^b)@#AKJ-@CJ``9<`LX=L>+CooTLk~mFj0nf1 zf#(X+Z5v{PIVm{o*81LR?dlvGC{Yqk8|phew_8szbCopPBrdLe`x8JeiP0o=@6P9; zZ1Umn%c3VQ#6~j?rZUrk0$Cb~QVW2e7=QiSWBl`ziBYST;q}+6zIF&l@_w_4%uu3D z?4$DG{UxLDy}ao^KEZJYaX&t@&SYIbbO1fs_XS~0NC_bi(V~C@N}@r8X~|`teMwV; zv+2&f>Nma9zQsH#L_-aBes5Zc^`@hY>`FL7H5uQ1k^X48Pv`anuX|^)xr|BEXK4Ze zU6J8;5Rc0Y<-mxxZ~nILHa1KESBkdE=i1Z2#0v01Dvex$G&SA{QrLw3Jv@DHceg$= zM6`7CtW;$-(_1(;H3{QM6CS)-}cZKdiHDlOMOJb z3YYs@SAa%kHN;q*ON}#s#gl9fD^+)-neadEbb-s?GYBQ!X@ioz@ELrC8s@)X; zuahMkZo7u@@oVeaBNKLXS--~gp4;11^b6XPCsaZxBX0B+IY!T)157jQ-L1Z7ggjxRLqspzg%D_u^=Fd-M$VMfaLfU# z240tBjv9{`2T*`!60oa-BZ1*!Hqp4M2HA|q2!f6B`B;MT(?lpSqd#GE?#LupN}pW>`337`@rEzRJ%BieJ0`~+i)+yqb(Z{%}*#!%OOep z5!qym`M{3K@=|X4YT1;GwYCsa`1OkV49#Vek!i%?SC7D zT=~D;0+APm6X_u~Enj~Gp=@8ZjHhpZ_2?sHvj3uw5Tx!A9w?1@7CT5q6`^`Q4(d(H zjDQ3@{P<3~Jp221Db`}1pyOS*g-Mh$EmUT&94kNKKjanRJXLMoiq7ooAEmrfomFoU zxjT%uq@@$)h3)c~VrVRxDux%22}kabu@tI+e0pQi@tzkB34iSL^*RM0#N#3TQ!l^77m#dXd4f9 zZVBD6k{rqSXa;~+YzRE71-_YTPWq$WuIy_wq|N_REnSCMJw;arslE=&))EXgb$KYJXC zlU4=j#BlwlSSxZlT{b%|L636S8F4LFR)#gZGNgH@zIDj8`+6KcmL8xXb6k9$knwS8 zEj{VP%4eiRc4oG{3|NGv28v5LwD2jVlut(KRa7-DW|FYUqRZSQEIFYi3QG7tx4D7d z?~1^E1wvn1S7g(Btgwv{7R@SadSjqB9_rA#@HIf1sM0to>q>T!I8~2(YVVa&AVx4) zu+fJLHQ)MzAi0XqXXkb)WC`zgUkwnrWYbjZMOsksPpwPPV^-F5mnDmh+J<@1~5zh^XU2E z8su=%=i^>4%WvoJl{rp))jf$3G1Q$c3!==!V`rQlj=JAxfEmWm zMinkX+l#}`;|>q0uNpdf)Q2{2(z#Cd2BQ8zO@sU-$F65lJjVi9Uh$dexy-1_Y%{9* z`YIOnsKkbZ)fjm(s24C~e~TFf@v{A}B5;T#ad~TFr*~K9Rx}nNe3P~OrETa!G8_+x zjN%^>cDwJH7%FfQk0PLnMLlOs6&%#}HRjmEZhL(GonArhDCSRAG6-pE`o=i~uweLX zIDQUIT^#a0$x?9=u&7avjV;$mBqv^CNc|(D=TU1vJS|{;hQ#6?FD^-fioGw)`R(KE z<|!(a5qTk+W&vhx`Pi}QbG^6Q{uQq{+W;RngKw3f_*AKw>z6ErJ=$)vFkFu*N~a#@ z<{p3o^F<0q4`o0AoHf4ZG*CrxKOFZNTffsJs^Z|@{kB=~sZVdf+@r}a%%4@9jyaZ^lo|I`iC#V#w z(d%}U>u%4-`?liU?XKscdyP>Oa*>H(QFZm#@LSsreD3hH1d+dV_*WK-O_pMYcXTcV zRsorvwpK`{JxJvB8o2mecO$1^hWU&)K$#cTkPUY6x5r3xP@ z3a68_i@`56V@e%91!JX3#FTXAjgn)i0CJIGIV!?PEWc`@UV?yW6A@Xu>IU}JSO_jS z-NA#egVO|xY+<>CR;QU(+#@i^2nAq0_`jQHmwafU7E7YJb3 z<(5L%GfV!6(z)mQ8S`k)21g!%x)4tNQDZQ<=+NFe(+5*IH^~Lr!IBghu}V$rE1gDD z%`>ytQYM=hwA7x5Hc}?VFj;Y5q@7eu>gNhKE`sSTXmHw2yPDzY%5}q#27m*>FgIxI z%?iWj>%)`ag8B)h9i(RAWGv{ufy!Lq{6-ki&s5h{ae-I9K^3?FC;TGVR{aL_xN6jr zTB0b1?e@grm!R1Ec?Ba#{X_Zk@z7CaJ+U^B7zhjrP8dCFcaOpJMhAL3?tLesPb=yI z10N&Se)i&rwhvl=b;doJ8}g%~rXwZd-J+dL~X35p59@A(tQI+aY$sb9H=du}ZjOBxzVc!QfQ z2HzD;$JlOAC8gr)^6zwHv~#nfwjSH-FRB@5%4_ic|dT)`WH9 z`tfBF3a6t_x?5U#JjxUuf{A5-Z4K3}hBDLX(Q9Cb-Ao~gQdun3#>3Tk{KhVOU+IxT z3NdHobWlJE!L);Kz>Z;y%i}?`l@IH)jG|bqhBtiwG3Qf4!oeSW+juxIx=XZ4Ng7)0 zc2Sdwnr||dalK5h`~fdku#PTcOoz5XAE2l}kW9T{+N@InF|8HwUgkS&7u1A0ywc4$}g2a1I0XFw)<6AYvO#RpH=b) zK=pD-+YOADZN5$)aiFrX(5oa8n(RUp&XQ*9$EZVln2cd?burZT+fpn)s{SbSn@Ndc zNNQZ{cXWLVMFtrv^Ey&-a>ye}RKcJ>?Q?!f$pVkuw8hrdzVVgCl)*S^53Mh)xSIQl zi*ZLra<3#;durd%!Hh-6^JWz8Q$Y_3*K-nNn*pjZz?^266aUQPjc?K0{E@1p{Eti9 zP0pIIFoo;wntdLAjbdbEm}pa!>W25ppG>~@>|3*nJA0v`Vs!GHGqFe&d(WHikJ>As z8OI3PZo2-Kzplxf>>XAJ%V+qvRL*04-kdR72p&S4nW4ik%=hhCTUSib&h!fE4mq8@ ziJv>3T7VCNf$ulzrZ&O-f9AvB^q$eI-|5-2>ZIZS3=Ef$m5Ej_YMQOd7We=Q%|K=` zPXMP;8|lQcNsQHAP{eNA{~y9f52 zQ^-7+T74H{#B_2@O0TYo{Gi__@>@+A$47JJZ~vPb@ZvWSxs;Zss@LXHy#vfz>@vX^ zcqiat=yne*90=agYIC1q6MpZuNEjp1J2)^`U)FF&706Q;fZAFTp)JOS>ZeXjLbDsAJ%e;EskLb|_n8Yn{Cav1MR5HlTO{ zI*r+=<3+_%Z1{iv@tjAh`J2nU8I$-c0ZxT2H0dyyZ6pg<#%|{E^Kio6KQ$S{rdJ|- z+Jr|!8em9+%DJiWGJ#Bn=*;%_vEu3qDFs9iEh%N(DXF{sj4K$AC zBFn&9I~GkcQFNTEyTcX!k$7BsdK>Pggsjm3uTsq%CVWaWmT*orA)0yS3sHcNrhy$` z7hK>8{EcN}JI(tg-RAZPl?eDE3>h2a#Ncf4434b=9sQ;u{8rKxjicvu7V-C_>E?K5 z@%pO{P_ceQb1p_iR$x0kii*l+Yt+1y2=e?OdbRs`Uqq{(Q2st7m0ea>(&m^0G?Q!!RR?e3 z`jOvm^YXAP!;HwEbG!Jch80}I=@RF%N=Ooxlt%4{?C#*j)8X8iP&Toh8`8;6B@j_C zLpqCMG-1s!mESLbGC48NwaGrZ$AU4f&ZDrm@!<&=ZT3QUleR;9n3PVvN_OA0o3(ogk)Q_|Puz+3zwV ziLJ+P;o7S88?12&`T2_&q7ah4DC|wg#c|pS<_sApZ%2ZVX&dpq1Jwsm__FdDtw@=y zZOVEH{0a0LR?OaNS3;^!M1v=Rskjypcep^3HG;QgsH0dS{79~2J_^W2E|9N)TA~Zt z!o{-QdXwTh6e)vZQy2VJS`MifRF8w&cSn8nPp&->ffD&Ky?2 zZU;!uNW;UmxBzsA8EmMsF_JyvWryM~V+JYfJSnwf4ZU zaN+mG^X8d=9t4U|zXKz)5S@JCVztlV;LE^hbb6%&`@!}FLxWI&U41t?G>fD?Nf$V* zNF6}r6fb`*&hWV-`nW$=G-M&NfLrf9#UlB}@b5p>H7<+$y=oHuOxqT9d6xBZtR-6d zE;bdJ6s{3qa4DY&;Ymj*tY`{z7Hc+KqQ4Bx*+U%ZcRkR{F)R;-ppDku2ciL$Fq2N* z5582MI1S4y$*8;+DlX36G7P#~8Qa-m*{BTqXXI=S(BP~$WilvjZlM_5eb38Y#+k1H zmBWesar}#HlYph>=BAcO?N8HTR4!nvD4z)MQUdig#|cV*{@NO(=J<0Him;laV7yLK zc-$_0G@A*n=+I{(0uS;>zSZ=X4t0;)YsblWdyR26Jk$`Ld$}K>!S`x(cRYk> zmE!-=^wn`q{ontzz(AS-(n`Z<1VNPUj^P}m1Zg*in4kq$wLkpc>W zNaJts@8|LRZ~NE7S3u6=I09Tf3>^nt$Ib-UZ-koO`#Mv80iohYt*QCKdvLs81$Z^eiu z%HxXY*bJu*#U?><2lE0%=^wZE41!M2q=JSCj9OA(QeiwSW!UGMK55>byE*?!_H z316BI?@Poo`Bb;J<+@+?5hU{Tm+OpMl$ zC#c3~Oy(Y3@OOfQi+N^zkz@nHnq=+rQ!~}iVLZoN`4Wz$QXR~er%q1;2x{HG6M;@# z2p3ZY($Z8l4+!*6jgiTpQq3yzzQ;%&ey4nAQ{6ujyFp;#IR5n$mx?SX1o?Nznl<(o&OFnTD5!=ewnn=d6MF)M8t^Q@5Xp^{^nX}{?wzdL6C1w7V z&;IQAZ&w@S)X9pfiJmNNtagSj*uB?-s^DdijrW*Q_UKyhqVXOvtBtt46obZ(7!c#? z3-f|`GN;=-?0$ZcMKDd9@hJlx4`q+nFQa9@i#@qWq3|;1PPW0bjh5U5p1yH2vvtz> zKkSa7ZMG(n{U4*6-PGULieGZm{7g?xHF{Zgpr!Rx@`En4Tk-BLRp7{=Qp!KiA|27I z6OMXJMdY9z`}Z=NfDlSbUbip+r+lGLBQne+^C~K|`bsZmPcP19ex4l7&DmT@>hxV4 zguSl&c^E!lpo^HexIGeIIrhD-=7n1tn2D@uzSxAl&UJNt@vJ1grcvimx|?ckWhb?| zT~O4D1d>(|(UJV&|8oJvG8f=~kYxQPwkEcA^Amf%941{DZ-!$*9d7%ldeGE`y0w4J z%crW1A45%BqIE{bO%Op0mKjDH;<1rAKoj7|qy|F7sw<}-8{nQ_h*=Fh)w>_-z(U<# zQ7@yH5%7oyV+dxLRY0t5UQM`fg1|&575iB7d z0j)TO@;&07Pm(Dfzh}-0Tx2}iUyvju_##CJoHF*$({%oeJp9xV66^3l0)5K5=%)os zG_prPQYrd*dTrk`gXkDHp z&((R))p$yP*6wU9A^KMM2&67V?1T?WVO)#5Z@7K>)tVqGiGe?s6O^)0Cp3}Aw=fW$ zJbrEN?af{m={L|rjHNZ_Is-J@)^FkM+F^vvC?}aCb)03Mcx;g(iTgq8+fw@8?>E3q z-QhhYGK-w=B7+BFy^a5?2|fysd}e%VVr*vY(Q52dlE&>gnmyg{B_nVl#7M_kpw39b~SK0-#wCn>lztS>W?~JS~#z|=ffS~tVNV^cD@4is9uh=%cg4uSg zup^w0Q?#l=L2&z7^3+(rMQ_c(i;?5lpoZZO_t8l@!d2=A>ieL{|xFlIhSx z8U&a=g_zeA@VKcDJN+h!qku;?SBM-VwPt0P-*n^Nj_2i3dF8aLWW*k0<0Kj*w|;r3 z%^9%ip}KXu54dLP!P4K3WCp)6K+!@AnSPV<-lIk*9A5C0hU?3_NJ$4nd*+7f24WZG z!!#VBG>L@wiI@nH1&;@ZiEwm$yk1W|&xby0KglP$_NFO_TcvIK&j6=M zx+6(R_;j)d`$>^j1e${wIwzR0-?ppa7fev+Hpi+R*$ZzlRq=>yYTf~N$DrWilD4R` zPbcY!@##>wO9{*)zM3ZXCnl(_u)y;{%HP~W{i5rG6K6hG zf{stW1fdY(_RN(e*gid@2}Kn`6ifTSq5ao1U92v^wcJHpMc0jOcYhtfNkvB$&jJD6cXM8}~evIB+q~;Hr8fzPzj%rhOwVd2^k;Oxy zMP(sIMxiwc9?*!tH%~-&sDA0PybYD315&!v;R^WA)bNIEwuiw6@7y=nb0(Js3 zGrL&cJ4J`eU$WgbJvqZWcy+0SQWWvSsg6d`S39!Mv^10fB&kT~5vRDMI|61a`J^(D z3~ocHt4=afZN6+8Kz`ttB{3*8Tl7;J#?lF|#2+S(^2{ylJE8~n6tSIIwm;DwBYL@_ z8?|IyMU(O`)%<@&dMS$jHUBv?OOtRzEOhiwvhJ~DW~RNge*4qIZvtCt{*OHOQ$wt( zx}ejuA9_m$J&6L6qC48g|I11jyduBKPsQjp95%gjRe$|gJUOrFmUzhjX~2TE@gH*! zXqt#fyF_S@n8@dGNfOIFe6JX7jm*&|Trz@oi(Gv5roA)Z!Eo#*xsE33$Bhqj%~M4n z#dm!}mgHy&4jgZNTl;GoOFq@FCB94CL#Qc)ZwFS!Ayhig@J?bPsq6}SOH)vwT!qm_ zDSrU^xI|@WBn<2-+~D>2t4uM#CdIh`O;H+tFNm?cO)yvHic1P!n#I8XCnSo(S7aS6 zR&+q7eW1EX%AlRpJQ30HXGW(26shwulM-xds!Z@N&O-GZ~YSw zY($pHm%k72Dg9gokar2u{U$eX9EtT;y~^ESVWkPZCd`kDGW=UZ+0w#n?e>+R;{sL; ziJOpWZ!0P)x`>Y$m&SPM>K^o>sfQK&zec{GRne3{&lN}#h3XBF?i^Q1SYZ?k?@sjJ3PJKQhYWC)e&|hT3?TD}-WT-{}V!c$})e4i*SWdg8|$ zCZ|HSbq~lPJ82U6c5jG=)6~=EA95+R2{#J0Hqtusg!e&bvRUA{sy<66!TyqUB*R^) zs78nQF5UDDky^K*gu_Sa=sJ=b829NECe`qz^ju$#ot%>j46x%cp>U~ zP5AR!F4-y9kIs}Hex~VC^(*YKcv#PP+O$ue@7b3o6JtV;S9|$i~u-> ziVnC8uG~yMJ^!Y%-=9{)r=bxpufRDOeIXzs_9wDrV_8dcDxsY7dPRDMYxT#D*Ua*c z;!X=i#HEsRcvc9Yk+Q~7brcZkieZr#H7D$%)>7(9b}|FL@G{V)I3_2H952=2h)O`~ zF4%)LJ2HTF@joHKnuO-CF)L5RwV7t zmMTpbxaIyR)}Ef$s}V22WL0{+j%L5*AaW&v6uFX!&PVXhIU;Dr5Fu|_P1fhE(U^{q zbO!K8hv;YtP}GYgT6Lk&1KJsEhp8WatzgS!gMGn#vHUT&R^5f5t?d>3 z6u~kzhF>r~UcYX5*l#_6PNu|<7cv^97G=6e;L}f@r7)gFTwY$Lg2VR-GnQ4oan<4=aW7~7}?CV<9dM1VK5ANsG?oAHh`1kQiEKTv%WUqFU`{*Mm;a51W0Wv3#nK zl)Jy5y7fNzC9|)xKkd-cy5tqPX7nN#W@Zwg$6?C|zkqMOp&M5o)%|7%Aq!2&9fivr zIXstBqqR{vS22egH-{#e>nOs_=8n31`O~xSnqGRO06R?ID<~Iw70>ngo3sV)zweUQ ziR;zlmr>5g1VZ6^YHku+$zbP_V>Jj@truTOOo;NPIMhvqQ$TxH)q zz6ZUG#LS88Tlmmvb@)rG4>8d7(-t@&Q^8CF=pyc7I_Li9V+Z4+$?5NA;XPh98-2*j zoCOErU5>Mf%(pYZ2i$dT`UkUSQL)vr0u+Nh)#C*_HK2j5yn+hAa1kMiMP%_OAOiM@ z65`mSq(+xRh~bx!U| z!_s47n@TVt=0QH(WomIE`>K5Ozxl>`Y;A+?-X;M27((l@cnbj0W1UU6=dj#Q?my!I zXTRFUUHXaHcL;pmzm@5~{?QX>9rA*`5N5Ir)i`koRCyyonF=@Mq*IuHGymJa}$L^|DLB!?=d&a?J-&FyBZAhcYvLs2j6zr1-C^+Ywo3!=Am)Cmlg zrbOu^dXA7wQ$n%KdS%UtnkRi(3eq1jvDv+c-{ht~gxEMlNmJ%AhY1NcfeFYS9aRVq zYfusS zY_!W#K4UXqm(|4skkECz94q^f$- zhTV&iOM>V85r56(IVc$wLreF*xp^V%2J!%OrG=O_h!N_`>mUD>w4puN$-*xpy~wFQ z`&F;vY>B}^4SA1)pc*T(dakqRcYOV_F^{~?EA~k%9XaB%ys+yAEFc`|^2bpVyV-|B z`h(KlpEjN8a69@vC?HO@9*mg~k_qqIx!4yCeR2P>*c!vD-lXcs6m2mx_X!1EO!1bt`R210KP!ti zD#o+eC%#$YE026ez!A&N#wx&odZ$&s`dtU1#az*#mODeXJ-o!Tape;#1kx2{d74#* zyy5n>2wJ`>UG-a45H$hAA=ItZKvmHYwTV*$-|J;Y3ON$mpRER6*C1XJ--bmSj*C73 zFheqRi=kuuNkr1syHIg@PD|r=XI39RM34K^J9?F$DgVf5Rm=TGmgYz#N)lVnq6q-7 z@QZGerw}GHia7dij}QlEr!it7p_yDgCmSfyzxNMr{#}&1NEIM4U7PpQK5M{|Tt4SN z!yVAC^#@8{y|uoNTrqjQj%l6~wxs0hsgjvrEL{b3Ng%%7KX_jK{!Gut)rjwCPc`ma zQZF`Iq3-9s zb^_-MFda$V@}2`sxcm2AFCwwi!eQi;Rx}Nm4oG`isEY8(^P@kA0N#hzn|nXD>x|oB z609woyCl0zw0q$6W-H2W;47VsCz5L{cADk&I)tKUXAKjIQRSt=O1u!ja8feOnq$?{ z@7t>VQ_`8BoFe;y4Nn9$S5_*vhBTk`*1k;Z^fNJLW!2Q#O<)=p*(VaqVy1PHm#@NK z$uoROlO8xHN%?dG88}`O-RqoSP&gm)vfh2tiLMs^wl8~GAZ`+xgzwb|EbRsL}YNMEDstRe>}Wv(w}a; zD=H}HS#j#KbD|6x0jv-`4ih+0*5tVN4O5Z7issJIo-b6d#(LcP_uNGKxK1=(;PYEJOk5r2X3xK`mzGu2C+8w zo~{d*{p!FC?<1sh?!R$Av9fH9IvGyK+k0HUhZCe}QD@{TpL8a3F1P3=b~varD8>am zji7N0TTxM?BQB&in4YBhU;xyzOtzG54d=RehR#*_7dQ)c2!?mY6z&A(?x z?Xy{#{r@BnZi*WO{XQ)k@8-WZ8?}Vt(4Me>VSc$fw#EEAiobl!z{#rk9BOMP{mFk} z1h}=tp$3X_TZK^#DSV0X6?oCpyJjbA1`44a>(vqL7+GQp3%$^KVnMs=f={b<>sa-D z0q=S~hT-&zm&03X@9*RM-kf3hnTZTN`FDQ+&gRw;^%F)}t7JU$mm0Iz3s3$j_~)~i zMmYx2urB6TzCdWb=`2`$*do%0!*7YO3rVAPe4pF^k9z>yY6-j??+A$huJLH_K&>q+ zyvK6U-j_ujqB)-E3Rh#tz1oko+=yt;t?1?}7r>q51-_i<02mD^XIzJ(m}Q-U92qYJj1 zc~7E*4pR*JTrtX7zskdrXmPt`O^T2p1=Pj{m#{djSGCF_ErUX)7FcQ8_(7wO zpfY~b;K&UE2rr0MLnBuW-xN&K(DNZ=wCNFS>uIRYvcQ<{vC(L8*(iun^WDACuY7oM zoo1@J9MD2)lp~)xehh!ey-bn&rqK?hwdNu1F{0ddF_8G<6S~?7R`; zUcF1GwUKP(mw(p3u~a+N;Q>yPj6qurkY$S-@`lZ2>x4F62x)^5cTrJa&l$UPf>6Yq z;%~WKdskn54|)yKt&(voV9L>A4Od#42;>hPCJD?+DnyOLI`C_K@PH-E^o!mxLOe<& z3q{1^!C_csm~DAQ{+($M&1losyV<`qY3b;nhUjBCf9773gO9Cd4O07ZoaHn_+C{>(0mIgk$pu%$zGhcl%D zayho_*>9;@KKK*i+@Qz{D>r;hUvlUyD_aErlP5^YgTyi_VpSZKZA)?uf&I-ow#fZu z0k|0jGXXQnl1ff`xTGqi%ar0}*D|EPdwV1=X_j0`>#Vv`Sh2-{@^~L?7v(a`TTuE} zTpX%~pS$6|JLOFX#HmK4qX3RJZtOTF#R%~H-6b&)_@FW2vw82Hkh)=#I=I(y|l>V({GB6^Bu@=GvqJbkeG3=&4lQmRBfh5DMz+!t7 z;7r)!y%(1y#69G7tR@Sbm1ASJAcM-1n%lXcv%N4nX9ghYvruhM8fZM#js%;;#h1GFHYcbP>Mp!G&zr0w9BDbto>w;xp3f11 zKKEb=+Da3h0%)dU-U|~tvf*ymqbItI7+$`ToYMOJezm&a(ei2toGA@|?YDQw;J6}C zGPWobxy`bc%;AOQ;JodFiv0n6bhsD`jC8pZ!rme->W{==l40%}x)#wRjgvO-FzYnS zSiBciRS$?)%N92@yR#URXc&bs@ccQv9i%pgiIKuoj7IceVN(T$3ABY=o0N%*J)%b@ z>(Bx*$|Y&nYQOl^b<9yQ2O2KOD>bG;qNTndE-RY~%*9c#C}<~upHq0sOlU+ZaGmDI zK;66i{wr@$Po`!Xk73G3)a{T0F41IXPIL%*bBqRuG|$95GgWocTmIr~m^5;(0ZSo9 zi}%v`HJHp@9|dH#Jwk{>tO6U}&>K9C6TZ$@irpapU!h-eVJaTz0TIE|5(?u2Y_RgO zqU`hgIV#<1^TOIn&_Ssd2n6C89XJFG*j6mNP+9r(hKinTIiZQSv)_kK-&$+vMWoAT z6{`97)iX;1`{m}ig}CLU;E3ylZw*Ip6#{b#JG>X{}wPb zQRzTRrm$uZ4%67E7e8$L^>*obeqn#<2RC_EZ$0h)YR4A$TGuMo521{KnH^UM7*4ji z&Cq-y>vYc7<3-BgJ@Tz`1yB7wjDnF2h7(tzLH6bRyf|MQD@T=$v)mKZ)4(^6I`a%asag#PJZ4zoJkyP?BE9jO1pLHM@fQfmU#;^ zL)Q8*ANO96nJ1Ca`+gI!5HQJq1@-o))&@!bT+}>FMKP(eO3){Lr-Ij9TQVUhd0FvC7BPKOP`G0frpZT%x zJIAmrYNMi>{ySIMC8>uvI1`ZxE8u}6BY%ChiwWN(fY=S=9tDq3sr~`VBx}#l-XGsc zTMQ8|hl%3!NjR3zu(T3Z?T&wL5Rr^e$X}O{!4$#+c3?u&PGzi2Af|tw8$wmJtPH=TT;EdP7x9=L^9Vxtfy8j~?QL6_kYMPHAmT05M=|_LRH>cVb*eLoZm7dk z)KcEPrp9f7#6$UM8|8QM%#0?^zY!uCVePFVh6p*B&E8QkxGBdp-IEouF@bn{`uN-K zv72*XzRCmiBO%aLoUF(i$C@2SN710u#uc?S&t_3Q=VQ-y9qn&h_g63Dfy(_N259+y zuOrU3=Ba*17$NwxavK;CwTC~eDTLa-1K+w%u-PnNOXvbbhHEMP* zGRa+bd`)C2{YNyYe9D3ft{gD_@aqoWA4NC+B5ctmakPxTYz79GGt+|~u5xGrL*|J6 zAJ(e0{Cc}b-6o7tBzb>~4@7Nivthi9Rb7;wLen0_go4h(XSHdQ%(X_njNeq@)!+G7 z`6}Y2oUh}xI|ggzsz1hanUi`VsQ+u{Sh=-P0WE9~el7D5q3bn0Hcw4PzRz=oqU>`+ zwzwAR8Sq!^8IpsRU6YFZ)FnEH;oqn8LXHLDko}5<#>v8`o&p%ny2Jn)#Z9MnV-2FX z)(?Me~fmL;Yzf=4g)aLCb<@%Ol2qTD$^_SuYGqo>e`b+r?KAw8m zi@d-lJN07ds^{u7-4t7@xv(VC=c}>7%;kd}>_pWvZpvQVjt#}sHD$V5_aBC(qh$S* zv!69V2_-F*7W@aN{8fON^rwhAE$q|RmDbZZezVD+`8Z;DwvyYk7P9t>kv~#_i>w2)Q)+{|Cas4an{_--m5vRIzc?7)=R(T|o#{re7~8&9)ZTi z?_u#Kt41IV4~_698I-VxZiZVg>%2`EO{)$twCqOvV$<<+`y^W4s6)!Bf#kX)vDPjO z1cWF{5IV6s&OL5?eM27@;$rG?Qt>LpYrTh+crm?(r%=WXAB{7J={Ok>`pJrpw0LnT zqId7%r4{2P?J@0}cn8hc`^m+jC|UB!Xt})xKnQAa;WZN@%g%k`Vjo!$6$47J?#ctE ztju!XvHh=J-5%?#fyrReA z4>!(8kDP+gwKefnLgVq6{W09&gL`q?bn(6W76?5mFS%*|?SFQ^Ci>f}(6|2rKfJp? zsX`(_9Z5~9N;^cPRTQeq)x^o9%lTR5xq4=it_Yacf!2`;6iQyf5Qh64k)|oCM;NR1 zEQA<}6j;1&`oVwJe^Pxh zt350g3jA0lX?UFn4{ZUZaf%UbkLW!3E<3!AfIe*eAy_{Hw|S8NwL2$wuN3JHKQ{=P z$=qf6;uQ5%@$x&L_3p)+zt00g$NBwZ+_-ps;;WS{pQ;Dw6o$d2EmHUnu(sZ;J6|o^ zGCG##d~N2!#z-x9uks}|EHir7M%fCBLG_4z>oggW&8x4s*f=sTCijWBKe^fRw>0a5 zo{qm22z@)FGr6J;-tt1Z@Khiu5Pn@P3R?W&CzApN6q}>)y!lTm-Lp`$SgSAWIeXgV z@j8%;0ymL^xG5lfujL=1s4p1%rrC z3^gi<1~IzP8K&UfV#a%%O(2iXvy##Q%<_GA#;j7@8m@eNkV zl|y6Zy>$BWm4aNgg%2?r|YK5&I}z3p*TL&}>Sf42TED{`&Wca|LP zV#J^o>nH%t7-&aCPsayQu&Y2?p4xt9(grk-n6)XEB!0RuPyP}Gct5iI*V$}y$cfGE z?Kpy`zW{PGolsMF+Ad3i}i6ZEku)GN{^-J`$uq?P5NIB(WX z?6IE44kvoHJQ;X>H*wT`bo10(Jm}xVWObDSMw=ew=2^@UJ}fKJS2|6ORKPjSv2Z;U zl`GxIi6oV~Fi^xs%6FaMzAlJ&Ag?PI;`H-7g&2~smN3ngyEdvOCT`tu*`m&)69whBFhIO%fy z@ZYBhFEVtN72T8T8ChW(?R}Jo2O{#?qgIT1Md+x6GZ^?~&%Og;ce%^B7YS7aj8LQw zI{jR-(S3D=yO{3(yBLfae%6+neY2)FuWxO1C!b1{(W2oqzxosxIK-(Xw`g;J?nnF4 z6XfvVw`R?nPBE`SHY*Xw^5zB)mWR>d45lA_c@bJLWy^~ccodZQMI_(QzYt{bzxkjB z5LtZ|`&L$Vnfy$;(s}wWU;a(*WL1wYs)O4lhf+ma+cG==c-MM786I$+$G=6)C4^F9 zoOCq=XTe@yu;F+DuEEjurZ4W@?z@O~P;;yW4Y1(SiROC$vdy9)O^=j@d%#__cOAe)8%9@4zx-6RFpMrAwA(mNON^J0Sbcf6|IvdS1?4|B^51IJH~ z;NcFII*V03Oj#c8KZY145NbNmJ%E$@v>41s{ruLTW%=aB7-UmX<5; zn_`AoF_wovvg01+xOT}kt^52wCNE8kG#<3c%1JwiKix$hbrw|mD!Wp=DHKy`U#ec* z+1uNj*a5V$Gzatl%1Lai+Qep;X(&c02gDfjy&gaPy(Xtum}3@tC@v*EJ=B9#q&A5g zVfn?NRu$UDjoQ0RYwaRJJA9t;hj(5H&cyIRe=c4eW_tZ!5S@8R-ExjWP3z!Bg{GJo zZ61+Pa_OD+%Qr{J&J#x;86Rcw;duc$^%L9aa%%ISpr!>TN$&mqx%+GjRQ>GSCUr54 zzno{A3g(U3N>yfi!_r;Mo=(~ z4yro-5>fHLefT4eQqj4tS%mw+ZP-kf4-Ex|d7KzXPl+l!t;vB?w3sJ6e8U4#vDuIF zmjm}r@A&e!&OLn9^bV$M9N(WEC|Mo9VtU4@K$+7UDVH5_d+UL<(R*9aC(Z3u@+tD25!(c;OMXai{#y)*ZkRtlL&N=0qiK_ zc!1(kff5rdVo2vn>Hz`7AQ^YiZ-P3i`T@vB!^dV0%g&XuQj5B$uIk5w+sE@pg6*Tqp;(~sj!dLQ<42zErPVwRrDg9_jy>FhA z;o*rX>y!B8CcU8`4B9_$JvZ_}*VAhmm2O=jXQL{|_{?X)cTDT5l_yN`s0iYwJVPAL z?CRm+D$$cAkK))TZW~J^fn`5F-}kBlE7swCCvVcnE4AsDMHjw&7^gQ&CFd5|Br++s z_2ic&0~28fq-}*6R{Sg?_HHCPz88t4gZgdgQS$r@GrLKYbcKA3Ox+#;okP=SnJP=Q z#x3pM&0l|pV64CNA>T3zdvKcbw*`Dyb|l3 zP_2Wi%mJf7cBXIB0gpgQj2629^8X8fKqwkO0DQ&5DLybSl<%uXsRkVo5{iW*-t4(% z$vEfDrSGP9RTGH3+g}KLOfl-TYJG2a_oT0P1}*@5xDbW2?>dfH-hk+(2HQQVYuo$F zkUw~k_tCnSb+b8OKck1)d)n6t)8fesAq50-VQu*vI67 zv*KG^5Xac5$gx-buV+1b(qFHc;de`1?u;P2aVG8d=*Kh%j#sr3qAc|kP$`DURl`BF z{*CGeT-xZaLC3bOZC-1mcE$Z8)K5LDJwa=Cez0dgQ(n194Z|D4z$XNkyBX;)$#BN2 zo1n({EA3sWR_KhxUaOMY8hvV{-B-_jP&=KPHZN}Z%HsR|h4xRqI(b8xd4h;hwyKzP z#&(6bFYsr}dowr8@8R~47i|cM<^GsJrZH+qga(<+6Uf=U3;~`;XvSulF#v(XL%jX` zhEv$hhoQ0ZeSuMyI9yff2gQ3q=s&)4rPc*MCg+&6`QCeat#=0pb$$&}Mark^1omXG z4BeO;9pU_A1aJfL!w8(=!LpOw9y*>ySh1eS*lyi%Ha??zzJF^J!2Xuv3qZl9``Was@WJ{_$Di6NG})3EJxz?H0oFb$ zx*6mWk5#s?I{oxdMrnL&P?rBn_tTi*?_lP-M`}=)0kKx*w=cRHVl5X;?k780^HTj2 zfQhY=Gr!!EvL?1Gb8cb}IBZbUJYYr3!!Vq*Dkbxy2_m4fCNYh;L~D2)Ms=M4JVJL_ z$XjdkDKGsfl8fG)pB*6(tu#_4WMg0aGEv?6-_>HbLX!dpBi`?&{aUs!Gl?o|+}UFY z`bEqU!x=q{00uTTWtJOv^Qhz84`pAN!7TnP;g}ASA`n#^w~f=5OC&4ESq>Zn*q#SG zxA|7ohI~Iu#D%2 z9NgZ2-8*M!x&e6z=DXc(yb0iEZpw>oJyfl)%}KXQ*Tmw~vtpU(Ohw;qZCZiq9OixKBHZi$yhqh7|Z3i-Q0`rzUEYpa#ieK z2mhjt7(&SLC?blY!}{Pu+uB`=7uitHD=OW+Vq764r_Mp#Xp&?b@^F9# zRYW}PvQ%IA3UB;DtM5;?({THBTMXO2k*neM(3#zYC-k?b5C{b8H@i1;^^>q$#3i1# zS||nMFRAbH*A;IuCnAz~E?~cyDxY23RZIlWo{G^*@jNFXc0l@d0)fnX7X0@y#yW(F z2M(zNKD{sE#R(SWa-ywX$qYseu!MMNd!xqJrRZgq|3rM*uI-mv*%uhPR%t|`h$~&+ z+=OjTT z`yRLLzhcQkyv|@DN4CC^74rkh$`9YX;ay9n?$0vW!O?SN1Z-OGC)hL{KADOKSP!24 z`f#+)ZBeX_FHmr{7e*Y{ir5%GU61K!ux0}j5jw@UxZNnUp>^-{KNk`kq)pl>Y2Zn} zPoGxN`Vu;szE6ue97l=9LhY(O`%jcU_QHREb|h~1E9 zeTYWQZLU|fwn>B8YEeJV|E3unb)rhoz1Dxe{Pe32$tY5EEo_AHIQAKtM*L>iUS_vh zaQ z(ilEMTXh=lT=&mJwE;?2SfPSuD&N|6>hI-=TZ0x3_btjuBOz2g%MWiRady#ccb%l+ zzN!DNI<4;Ef2_%SS{vn%kffbh3!@6|(4lv_Dq(`+PkS1vq4{g#34kN9uutK!N5cdb zeaxVXO^)eO;Q^dKaNGRZ#b#oxfj@UXTVgvmg9t0nVp>`%p3rert;VL5=rtr!vHCN& zDt7RZ$OZRPYT&rm_-Ebze;&S8g!3xV-nn-vN37mQ`X`eA>~8QFmjbr8gLt7@FJ-4%3%_SM;^;(OXiTL{VH1{FT{_ zMp4W06+tI-6M++YDaOzj?I6n_l`@wumdYbclAM*`a2{JO8aZGU8V2mL1LP4Qbkuo86u|CR(BSWQjMqj8gla}rN$a8S)|$>VPy+q0lRrG}ofVG{t_ zs@vUk@g}3>OqM6|KAJG;f$awx=OoPBXA)kPni_Q6C4*Kax9S%mwoOKE%;GQ*^rDGB z>;5ApnDsi7nA7^%y{SInb3y;YW~1Z#s5 z4pIpmR+yws2p$f(-ga(f>wxq#yjy=x;czTYNjc5+*1XG$89>1bp()DD1H}Kf0y;Hw zLZ>g}8`YfT3Pj>yPO<+*IMWy0^5-WPPcSwFe=_l{Zztut7mRUaf3X`~foFVt__XA& zi;fB7f){2BSw9w>b7N-$LxIjd{k%(hty=TUe18hkxD~|2djC!K38w-|MQ`Ed2JHy} z^a0mnPmY@9L3lXGI)kpw`nML$bRm&r@%5I<^by;0GkmlJ9SWKqcg#U7uNJj432x$E zYCozPVVF1?QES(FA?M^2%b58z6_WP>OB!$k%q{F0DWLN!_*f}AR*8VC zvoICtaI$*6BJr&Nu=M+Y-6F)L<)e+GcZteD=Q*_re_PGx!Riv>n<4qfB6DCXn(hmh z^>*tBoguVZlL5JpjtJz{Uqk0goDZW__~rVHU+K@air)lKJiyN{JDwB6pKeo@UUL)Y5#vK1rnW=+IScKraNR5A(CSZ- z2UI~{Mo!-Igjk+uC+GikWy-1@vh2lV>E>r9hpywbiaIds>gm|n?Wl?Pmi5}9?xAK? zv<~hQW4d@H;qR_~ly7=MX^bA6zxl>dy6I09B3DleoDc!A#yT-$Ayc{IvG|px&(y3m zF|2-;Vu>)#N>s!oiyU^4fXeE z@x#vZ4$KfYC<(}M%2|tJ%a9(@c*>x@xvE!wiz|wJYZ*!#Tbt~RQBc{-SSC3 z2(~;qee+{MvhTlgKO0jdhu-4|i`|i!d%1$rf_`gSY7RJ;Khn)EgI{{Thx{l8_1L!~ zaOa|f6=p8C(RTVpo>*8%|GQ|MIcCf9%h)XH&eN%N4t4Xp^fuJ=-##k~?( zh%Er}_qN}Jq)Zk=R0sOU_+Q=cfigxt1mWg(#@3|Z%ws?TqXYBcY<}I>wgsQ*L44kN zD$rSaP&Xrg5Ca?QA_igOi!YX-6Rrlxq;4Ndh#y+o#ym;_Um54Q$kvDGgBk?+M?{Dp zV}hPehoNLUYQHlMK{;zRM`#()fq4ZFYoR-60$Zic0O@Ga9ffzSJm;YqwyIxtVB*3c z#ku^)KJIA%ix2Z|QmfU)?Ju-Q&|SK3V?DO!%M*_y1-tjH@ zpmnm8SgkaV_aT#G#-{y0X6<_ScwUO|y%c!~F&~#n4=6hwf;afFE_`dP20wVWT$8Wih9Y5Y}r*^1}M_Yynz4bA{bTF`G0Lh^s*qb+j0o{3%c4Ia- z`%=&IBwr`AD@py>pY_=E7M|$z6acQ2bDcj)pqX7t;o>uOW4j?;ZekGDWe)uNS zeJTmH@)c$KOduy^ywkJOl;f3p%n~*8SMP#IAzTaipl@*jpQ@S|%KB1d7Opn0rUfZC zcuZX@lTs^_!&s%e%McPv_x9-qj*-eU!it&!&h$y5Wb3!b^9&Q(*hcE0AJi#9de5GriLtfcw2qBd6=6A#@Kd&P(dsG`m&yqI; z9eG6hc(&8#C>_1xeqFHSZAs(##{Wux_2u=q@m2nB~o+46=JWGv4kzDG;_ zbYW~;<@xt<04f;PbMUi**SsgIdjvTSUF_909B?1+@@aM;|30;_P1H#OVFfX{Ps%q>WIHEQEr2iT>ET{9$ z&G@(ZBcm7NJ)QVyRsWjW)NUifDQCy$=EWMZs{I7ovXPkzG`ZZW;&kAt$U@TMqD2}Y z$4OV^7BQ9pYHZ28`LC%X8zkDj_VUq58;b6AcDv)xRmx|cSAU2Y4Nt@i%A0mOF`s>o zoEnk;f<1Ndp=lIOp>4FsTBQRFUTwdm;M_2~!SBQv-tZD?pkKdC`r}-xPd1uOMbwx9 z*N#XR&rj}k_RsgmeBJP5hH=e!P(Wor6Y1z7JdZ=;v zo8fn@k(g=tG_SHNV+JQ8RP=BNDP6D`5=TV_Zt^00YuDAi@$1LIf)`BcTgzhY%6Grq zJ}>H;0_zqEazY7Groay$PjcEW3>b7mYKUq@eV%j_wb&y6Oxe7olmZw3eTf@|3tzVV ze>8n}G}~X?KU%6{uhd?(S5aFjYE#q*5!Bwq-iq2v?UWi-dxe^@XY86KR*4w3w+{1{ z@ALegbDSJG{_r{XbMO1U?)$z54+|C1zh(=-vSK<}ld}tdFN<+x8y}r~O^p$@j#m?? zB#N2<&Pc8ki_~$ zwsPbVP!%ZT6GK{CTN1ZPWLBRYmXoAD_C4`i`_WQYXs})$8>^D>7lHrWVvKp9-@8~P zYM*&jy=q(-7#J{dU}IQKj)wdn7r+S@j$cAAw4$<7*k5O*AN1fuT)CiGeVrh|`snDJ z4kZ(r)FsLI)Sle6zS`_04Sv;8z>6<8kg>**vRRv-jZ<`yO>!X%XVEmkf;=YRFML|C zb0H$8oR=p7;?ecEUQ@m26|<*RC2ouZp?~^3yT~rowrRI6QM=Kcu)3hA?E~Bm9Dg*m_Gy~D2))f_hR)dX_uP*E* zM1%r&8~^4AJ{oKUUtAHa-OM^`NSLyCNjG{m{IgGYHF`6wOg9s`CPKY_k+I=)u4u~*L0;6tq1|0SdyA+s5q!2&}39cdLH)5 zHGQV6f@@Hc#=To7#pDQtK*3J*Wx;7ktw!?-4;{Ged6WjhZ8E)3_NRJ2#Y8A?AY1j; z70)8Qoa+MGN@D%%rHog6!aVul)>Z|U=-ZFdQ8S+PuVQEn{zJCgKR`nheQcP~&?}!> zl?W9PhUeh{FS~cptW<~z9sQU_Le!k0w%D82HmH)|Q^$CFiM#}x3ZWF~G1IWd6@tba zq{?FZ!gs$eAVS`>#D}1Vlrdco3>U}STk~Y0xWY)cn(RUMOS7azFJ4e-_fWHSH<1t(O6lzQEVV+1)d@C z5dr-8yZ@S9*{~xtoL%&5XZX3C*C%K+m!%>wz=Ln9?GNAU$O%G~C*NHYJh^<8v>t)H z9aSEZAdy}z?B6?7gw8b%y#T)%xqJ>$Usj$LySEQB{Uq^wuei zb5;O-CB474L_)8D{s`CS)k^)59*Vi0>vCB862niDVY#lV=lBDpqx6!?K5PM1% zLTmE;M%tNbDK{$!WqrAHZfR>m_hfx^XM=Hz7~(!vPu#sT+GW!k+BN^m=|v(@{IOb$ zQ3>IvTaer+BW5#!>NWD#LnnOo?i9Bm9t30Kt^T~bfARj_p!kOoc(frvx`d+1Zj_dC zE{pfC?N~-(+&+s6(1P|0nrs1ITU<%ZE1b5N9?4dmnJ#AIHSB6{@Ii?IrHUc?V)vcd z$7hNRpP*uJ!v^Xy^=Zi4=m3Mjp+z94QWjE#1z)&gFbYD}PKo!apKKSx6T_uPKYQ0!@^OWqlkfC-&1n|2!@b_XktI3Kcje z8B3>Y^YiiyEUZV*zG3Ja*P(@*_Q#mAd-*;ooe79)2$l7Zc`7UnkNe_efL7sxa=tHj zBq}%Xa<%r%Fa&19g`T5qZ|?k8Dd^C$$2c{&m^DyGozeSod1V|TY;%rFH>Qjd=4el4 zAZG=q2Cma@m2$rI^!=WHhWHV#&*9eS2(jo^}p9=+l zvRlk@vpG?+NPRw_W&x$@shjTg{e3V~LJEK8BK#_`;lp0W0d`WXFo=@Cp7;wu;`q(s zB|<5%=LeB&X^rowjgGrmYjViaT02sV2_H(>#60np#xA!An84=!+aKj+{zpF3c%~%u z&+Uj(A|2FHmsqvTI&9>zTR2xOxw~>{GV$VRrD9SF5X>Vn4~@m;_W1|TegMC}UAy1H zM6wEAAm!mT_>iV18X8h~Nt}z*EaJlmx_sa@rHPkj!Z?XIWSusoD8_wR^;YvlvE;{n zcsb8oBhY<+AnX}0u@%~@^oyYw1G1a%LdYR_QO^%y~}f8X)*y(2n4m*7;;WFavEh{dQBlIw2g#T(UR zC(X{MLko9%aDY8Z%M#K3GMb27cI_8z;lr5@B{D$){f4M#OMYr3(WHm~(?ar}ZQz4? zncpGg^2NRfyXdpCdOZ{D$ozh%Ol$zQ-DN4V;svP0boK-SixeSELAwLf@$ zS3*ks)BPvWLx|Wj&%bc7SDu)vu^aHE#`bP(7Vt^Pgi@6jwtnGE1mTk92`l_s9CqsEn>o$tZIY>)WsA@Mb;r)Z|H15={3y5vt{ zoATlpko&})-x9xBGHSml2d@7JaePKh$mU)_h|a1f$7<vY5aHm5*sIZ|O`$bI9- z-n(?YC=d_SVtwp-&7%31cC;r1ESl6xfL1DV4B^LU8X;D&t4ZfHa>@>~_b>B+az6jOzQx_{`(LAG zm%1H1Vd~50&9qoA{s=&TxbKe=MXlH-+xXd7A)6kY(IXj;>X#B9{Sv)ZKEoz=-+{N0 za@tMQ7;cbA`)Yr@2^xLl4J+xT#8ohDJqbQye;of|m2i3Pm4xtTBFS zguWSDCZFiBk=x(k7$}DzQ0R;A4Z?Jotnn%Q_|G@{XlY&hw4v|L%tGX_e$90vQggFi z$Hc?uC-P4ElUYEB@cFLL6}qtd zP+R~DO{9TFx5T@YvVDZ%k~@~N@dS}jgP!8_*!@Qdlh?)r3tHPyT0huNd*KFCVp}HV z4NUDKEgdy{zrQb{!Y^1u*q%+pYf=4G_7}}^XXGv-U}bbdVvfJ^hi7Zbf)EcC0= zuUKGGjFhEI)zBBhnwV!pl`{Xjhf^ylB1>w{t6!4|XyYb%f5Jo~&u}~p%s~)2}dy1pVF@h0_kYu$BvdskNh zc{yY^uiE<6^4eXN{sx*p{H5vOxualqppn8G+J?UVTvV*Xgbxg{FtK4X)D^JxV3}Fg z?^mJ?RSrps>XT0<(b*o0IW`o`UzMN1qo@20OG@{f`%E5hLSgq;Hv6T4!3ib|&_fN1vp&lv+{L~Z^DpK!}X(X+~U zz$X|ylb>YFKaeVMqC3(}+CSiXYNKBf1USN9O9sskMrqKOy(YhVUq1pa*Wp5c5+Hv6 zG)AK->xMfX*GV>Yh{Tb%X+uQf#t6;HeuqpwHb2L&`M1=;))VCaXeMEOPcy)ODA~WW z)~OVLirqNfECywE;YK#8}}EsR&Z#Rb8dlzuaH4s&_%baRucMD3_EhhWxt%ZvG}3b`fEg>c|`q8J@>M z-QH3fFE_s=atNq`xKRZ-FZOr-dWQ3rVud483AnyjjwRA2d55q$G^rJA+YtwJF0<37 zAP2*nElv%9`&MY8#Vyua(0V_q_zR@VrC{22pReQ984E9jPF(!u_#H!E+7V8RA~Daw zz*E5^z?{*Bx@iK0RXE(2gdO(eso2Y?>X)X(o}OR^S7=NN4US-66RxMHiQBTVr^&a^ zlJ~RPf(#6u!LOtT+9^ZCL_pCUl0Kf0me1Q!LK$<$ac0}qayGT$U#-_4lx*!21uwiP z6-}ByJM(HUdd*)=rM@>7aj61kM3pNu$>LRF4Mla1f9eJ(f6+6rk*zDQVTSe+r_5HO zMc;suIP9e1E?iizwgaM58F{~7G=+lXz>d@Fhc(N^h?&{t=A@*bEoA=S65N_fK8_|= z6zSa?8=FX%=l*}|?o}s6_27RZy(QGYbqqXSB^&9bBNyBDqtLeE4#sg853)$mYOiGB zqm8?Wcsc&363B`%W1V%6 z9G-)Bh)SCMy2|}FydWtfYo(MV16Yu0nhZ!Yj!tZHsjlL$IJR2$^*z+wqhyRj-KB*$ zvf2i1(e!O^EP57lDS^@v;i#MKvI;^MuD^Y+bRb(;w^Nk#{wqnc?|BP%A5#FQuHGJa+WLl+&3cD!jb^UZ7WZ3$ z;2BO>&iR4qUlynPfl2<^heF1dWF0|2zA+#AKn|AHyKlD8z3r~o!tYxBPK4#p`fkk& zOO;^$ODG2|+jH2Z{h5uUgEK;AiODjQW~ERF>#{kd|DaaL!ot|OQYF7mSbpRFLRldv z84kTFR3?jFhOEBXDTju8R#&!FiocQbrc(`u>0l?Ii8|rO2f}3+@wg?&-S^BDu6o>W zOS&zwaT&(?ximirVc0g8vnyz3!GyhUt@nM;KD@iG9ge>-N-~hip^OrQywBs^jt{zc zHgM_uud4R-fn&SV`sunSZihhPS5TVwaa}Ak9!M(mN|{V#tx2UdwwmP2?vIKo@9N55 zeEo&>sg}zT(*~Rc!B&zd_nAp7B8M z&+RA2-J6pG-Tqt1ye?5cb7kyBr>03Uysa(h2kqa!Hru&GyztcK9;z!xev5-AeEQKb zS*<@Zv!$nc?GBkJYL^LH_0JZx_I-j!M4?U&^K}(s4tRB@FIc(dDn7Q#C{5)!+Mg62 zAn+*KaX`R#7T;%DRrf~)ogw{!;{KI{5uNwCkBlEGgLsuqu!U1fww#EYLpbZ^HLnao;_|m*Qfcl~`*0w~c|VqgLV`8Wa|DQuAat!k?Qu zdAT;^gq(WCJgE?7igQ!rJtZY#S+izKgmPCrVBqE1ESsMG?9F?5#T`o9ZGJxsJ{y6d@KNg{-F;k0L+BiS-Gs8JKQpt5x1;%~F}Tr}#QpCaZGKfY z^zwI9okK3>b8KVRZS!M`X9v!&z?{|Q?LiK#IH>?9Cb=hZS_j9X+l7%w3@`*9v~$37 z`Xceqc#bKW#35VKY4}~%vx`B7fB#yVgb|P4{yZlLS#J@69!|Cxuq5DExR%N7&lSw) zi05Y;B4n&0C+Ef;3Ve<1p5-zX&u;&ay&&niqP)ar6TJZhk z_{~K=HL-c)G`$TX#&Fm8yA669wecVL&#|y;jZ6q5N|1aQg;(mM{Lf>v#bb^6dI_%v zq5u|r=f1qmDa2xNfW+^!xG2hmJ$g7_t?>-@oJ%LNii+zKNNfn(m6?>^H?&*fa^i)| zORhD$avXg2u(KpyA#+mMjAu&C>K*%;d;X=-rK<~1GGIEnFn|Rtgl*fxdbS>$8y%%i zb>{C?+Z%BW05|=e-ZAu!e(e5Eh6;=ad`116)4_!_VzfH2x8j*!`l>j$e4PvwPy*iduDKT8^H!`oR;Tk@s_r zmgQeD6=i&U&gq+HHQYWLkfSLhJG$ZPRYt+h=$Ws7IJxV;-To$hC8xd05yv0haS6J>G1|1^TWuya-ON>ipTfj*AdUH%7s)w-_!+ zD)yE=mO``;JYmsmWP!>X@2Bdprjj;1F&-+@cNT&8a3MqV`*OavZ&RF)hR?=xpkoV) z!XiFqA#(Kz!aOJ6#lqic(X{0ZluTdUc%$e19=d!kTemJL>8V1>&0D9%B+kv_)h-9u zFAqs0cEW!cMbf_A@F3^gXNcG{I}mmkZ)G`)Ia-BJTlbSgsW@E|=7&EdB>Wm1b4lmp zD~IpLDF3%cTZ*SD^lh#dR|gMih}QS?d)@A)zxN`MG|VtHvtbtB zrqTZGO*r#9!TN0#!x_lT7mh3y8V1daBtja1KpV36-|Pi+F_OA|&_V=PELOBh8ct}6 zD;9$o@R9oemmdR0SQHmdrwmD(uRXK`c|xk(tH7LF(MdA_fBPUC3|dFA+D&rTY;=(!v(KPmfyWu%F@u#2;Y}O=j2j%@Q;P)$~zQL)rx-+DHObjuFeS1`6O9k z=$M!+SixyA895l$Ob)xH zDP0TP1yGBZ01Gc;V_Fw3p}JoOztW5g6y7lxNCL%V`X}|x&;Yga-4jh{Ov!)H?fi$4 z&;NP?zYxP$?wM<EVTBEsK=4YSuIV+TTQyfqJsW6w5N>u;W8zL=T zO{{}j22QagjJ8dwq(<%^{WOiHn@-wo5*_xt;Nm@FUZElIWU1C8?q5t!1G^Z1Ur%QB zx;4a9n(E~JSYp$v*LL?&hXE#MFeeGHK|3{y&3f_rcUG1!8oF+A1yzC#63xw-_9LkR zWEuulT#o;p|AuM+ph%>M;#ks{3IFD!)mQw}ehstw<`1iuz2R$h#RKn}GudjIIp$fb z!~^%%l)!@9Ixmf>xGJjD_kZV4vR66exnJf2F-v3}ZS)Ms>L%%VrX+-ri7@qb0NqT^ zOPx0qz&ojCyRmFpx6kL!Bp%U{;(%Sm4^t%?4waQXLO!ZS98iZ7pHGdL4ukLMNWiwn zmh$g|^IyFbGUCnw&z}zps@|58fUy)^zfHpF1f8kClCtw7m=KuLn8PpXm_FR);nS!S z?#TghGRnTkSTo@{DoUllVy}mg2K|+{Z<#HmiVAfUOTgGCGKZ|ty(UMLx@FsA&T1ZC z=5rdR;(Atn{mrW>Hp-^3i4Zbm@KcO|PZ-6}8DQmI^HXFD^1%{Q^rS?9KvDMXjyD|- zkITRjNiX^WIi52U9nFQn6HdvgdH=|eq}USh$u0?PBdGB}g9_6-wAw>TPJ=a(zL z@@0`*+x90yPKT}InoS>qN1Kp1@S*!pwk#8PHmBvp^uMQIoc%zoE@n}l@_w@usGW{T z_LZoq9Ql4pj`%Mo=WsT`u&7DIg=5TyLDGGb(S`y=K@FP#{Go}+R*1@&vs!u{z%AIV zZ9@X2CHHaT`y zoOX?ow?e*N;7%!k##F~aIf)=8y~0(+6xhi5DPbS{$>P=FIYKukyUfyy&fstU+pC@H z!5Z4+PB%|Eg`T{^6CQ>tnmay9&-s|BPx-O^rCsUi1FJ<+dTjviJfXJ+W&NL6Ci8ej z?r~ny>|GGvn!Z+GACBiwO|hW}LKoo>XFMS3*)#6qYQ3Y1Oq;MM znrGWXEdsAx%(p*-a1m0~MB8&d-h0GJi@kqA&msM6j^F)iS;Pc`W2^H&=A273I-}q} zW8~ticH(xZEDb9+tOd5=?YZ8Rn)I360xpg0cVtNvJkMQUGZ+_s@HE6p6b~N%Xx2W! zt!zy^2thyU&7TP^%%n~KYW4vl?AFm8>;8w~Q1$?Xu?*azncG9H%7z>V>M|w80EXUr zV&Wn~84OhfFnlx!OX6FEa7QntdqfA+-5FET=pM6)Xclud+-1L!!W0+2fOB*3FW zg&X}j`q@77XVj%99))IocIxtgJ3qFc%3)Vt?bF7%3_rx^Wb=ubV+~}H*aFuktcaG6 zluT)w2=v4@ilehm4YLKrETk*Q5f47EVcPI)iT|)y_r&azEd{@+T)1 zf*jyOQsZxk!T;`rS^-ech|?3hc!8pC17B3W_?@V6Ir<(mf6f%QQ5C?miKLCl>1WBt z{^j?Hnus87E;EPnTS`#o2S}UjQ}7P@#FG=yUbm&NjWWJ_SR=Lao}JY5(wv>LYYI!r z!#FcV@!Q_7_u)gMy!@U~ccf=-iygHe%iEj}c7-zht~g};04>1^K@8DK8xGgtPqsMx zMFu~TC)!KIR(_gd_LvzyN58Wl81&0Tz!@_pPS7;T{7$;78#8qB`7PWUQ|x+JMQy&V zQOPVNVgZBX2b~SKP(CdM*WQzvp0{Ods6AnMlsiR*!L>L&)%gK$g(4rK+boA@?qd~j zY6A33cpynR$69t067oHzFA{(=N){8Z3KAgxNC7tAf7<;;hwLj)m$*e?8!dzVna{>16CxASA&7;dkMf$0=x>Fs8^z>#E192@ z7&@RsE+LQrY_O*`B%To%B}4^siN;Emu#Va95b?K!2LlAIp>L063wK_fT~QB}2zXK^ zaYj`Qc+5P89_nqQm9SKzhk??FZ60rEg*zx%N{AZPprSSk$YVRJWH-)}-H>CS4q|wu z|A{GboN%2dVt-n{$UO=uqkQ!EG=<=B;?J?e&SP^t7`Kl!0%J9NNrdPJ{Qi!1_U}`T z$a5Tutkhqi+$FZzIXH+T?2e#)py9L^gn6vmz+?ARAZ>v-XpBx>(*QNAE5@fkJtuA* z)stB?ei~yGGGnNnf2NbhPuqPfK^mw+*q=zE2@!(mz?P!wIR(wtIFrcs2Mq)~cG3{w zN9ag4R5ZxqpK=G&OMdD*zA=~BUtjH-#sD`o3zWS8x%G#>LY*w|pK0^%B*3XrO|IB- zC{sowsSJV{*2oM*ynK_>CMxC&Nz3XndV_~B87TdzV3FNZ#y3SHp>9d2%Rnse`!)JEO5v9YmZEV62HE}r z%|5+zN^V6!z-rpw@Ypxjf)N>o)K6*b$Mpl;GKtZA4~-?>zuoc~aslNx|FzOEr2G3k ziwhjcab)og<6e(UJZ4TE^0bq`eU5z`>@w`*EVCwueQDAde^5{GI`Q0@9I=qmW&d(KU%X#*u^?SLsI2qhX1AQ(T}bk#bm|1@Ca)w1d9|5#UU5!TIa_WCy`K+GLO za_i#ki~~EUK2sR2W7s1>)6-JT(r`BOa&0fOLXzYWGk8j%BHA{z#NYm5Rco{IX@RGh=jICJ7Pl7zcM zz-K{MW5S=0QnV49lj?XDP%WrQx3uypF{{(WQ~}6w;h8|vBLxJn%(mGGKnWIK#e@-6 z0)ee_Ja(L2f0iqOhGW>gSZk0ZBz~o_#`6&m{0fy_E}bu&pN|#WOAO@Bnp?+A1*`2h zKDQwHB%jCcDY9L2HCGxy^Q`RWC@e?3$X^~~ePnHH%{lXtH>Z;-s*0b+{Jq-}HB%=q zHFX;y=mQqBXCD2IPP$+VWkd9(DpI{>Ylj!&G8QgE1a0pzJ-E=Qy~@bwf`?2bsI>5~ zZ*MbS|HAX*r`7A&575T75x7~SiF0mT&-Aydl17w^=A(wGgnGvq+N9vrvxYl+Ryln% zE5C#?OhJztMHQ{u5Jc}z0bh&=i3}Q_3fv6%fS%BTa^@Y`4~>283Ck5l-&)n+t@&=; z9>qZcX4M15MqaZB+nujT;N+6AsksR^<5yG-@Bat1R*60MuS#~4!>7WLvi;YXzGaJ_ zR|3+~t#3St&yM@Hwoq*RRb5^3qM|cKR;wSP1=U&0v~hzN=VdwN`R_>u-^1SRL@s2y z=M2p4eB@uz)-27F_FzUR!w?63@}WIU%qh!p#3oT%Wi$=1nqk`N<&At)l&{j|)Gu&A zU^}~#`2AR^{_R|$hmCvt4a4M5+6$uvX(r<`JqlIHh1RBg0iMwZfh6bKb9PHyg6)$L z@}Xh+jx2gf>E1pjzn=nyMEII1`CMFF1pktSudmU^A!gFh-`?~i7asIoG%CFo+C^pX zHMzt_MJE~vRCOt5)sd#|TG^Ch2bwOLUJ-Glgd(dJdrpM8XGJPZLv#z}MYe=}aM)S*7pR91C;>y@J|{-h7k*a+XEG9qwxw*=7$=4C>E_Z%hI5b2w>S&Pn-5;3 zZ16-&b%(!5m3aPIm`_aS*;646KtShH&rlz*O#dtk6Q%4gFje{djeetg@(--*8g7kw zdp=wHX~4XI_kfWS%M4J$bc!C~=+?4I+CA@QglLxX_I&T)j+)>bmqGJow`9j87IgOp zB6+}QVyaA#&}%e;U|R~2fmq_-I8*X$GWriA1Zgb#4*-zjn%OBp7xUkBJ~3o4PsroP zsitXJhQMHZ6mXL8S}D^>J%s~^hBs^WZ3r<*N#-k zW>JI~t~`oG2B_OnL`PjesCWu!7Z*SxSLpp2M>=(ki-u6EKF74&D&urdrNg*$S)dGZ zE>?GabiRSapjO4OP2ujJinPQ0xbm-fsfklN8(p8Ux7Q{Zz86hu=c=L2-1PePN}JBQ zGSvhE$u-I4c|$S-6uX%CZ&zMw`Blcfv*)~=HC-_#BNR4@_a9s+*T;j2opV7|xXA0& z1BUeMF7Z%eqiEjl{%|VYVDv~5KD|sKZt#5hB~{f^9AKidq2nC_Q&wL=c*qP2hQqV$ zJp3I6Ee`SyaX_E8I``6@$sdqvO>|qU^4$Lb%X<^zp@3=gKvK9xnz8UBl!(Uur}z7f z#lB!P9u~i}-G@QEilz zkw=Dp-)@l(`Rk-R06mln)^uYjtkbF=WgGk_?5D)XQv!Sji4e7z&THU$(??aE9(ztl zX=y6e&;ie%1)qkUraAs}c35PtZQKyGsuc?QBz{QL@*aO0N&^h~Y?(hSQ~2kk zSBVEg_l(T>lwXILodV`nQPFanY|^AP=Tnw*N&&nbx0Wqj5E0L#%U)_BROs zC3!t73g=^7$0uqK-pZBuvfF+s5sH0bPh;lC+0(K8O#hAa18om*PanjrIJ;xsT#VL4 z8+~n~BDb-sw=O!v9O9jRMZ6-ExBfdKG|dOnGuFGc>!Z`?Y#&m-Oq{r3{R*IJ!O2M~ zOiT9o<^{1bt(>9-R)>qthT$@iG(~K$z^jaQ*T=Iv&)j2Rkwv;cugneV8eNF845~H+ zxd<`Hyh5z!{?h&3AM6|iLm=RdurwfpLYQ86*n6m|)`-@zPt8WobSHs)@%NnxT^3Ly zx?;A1*=ao>Q63N|?ZnojNyrB=6B(?99>#M=GI7u3WP`GY`gF@5dWdw{0eHfY5AW8v zJx7=`fy?(@HbZOaomYFu%a+uLE9~hbV*1FH3V8W?!gnt~5hC99fE*#e0Z(ys61O^K zH$Ii1ayg!!RU!n7D@ME6825ZMUl)RGG<{a=SQyWiCQsI}_&}m9tb;;M-CyPIAFOo> z?8d5gZLE`nJ$#=AXC4R=nX~fhm}h4*qMnS5^=1mnnD5)6Xx$8Ep`mso5Uk5#!y$E9 zo>E5;uR*rFW(>vIZ@8kgYWe*W0Rq`QKFIRRMvFhcm&tY1&ItMlNdtC0)U32!opw`{ zeDC%JhK1CgBSAJsIDhdF6>4)6^Kszxpr~@ zhaC9i<+-8v+%cF2{2!mQ|HtqL#wQ~4O+r4uJI??GpL;Y?c)0A+Mv$eX^B|BZn#?=? zOfUtte_|CSEI-$hz;y}j$tya?12@;4Vn3J$_EmE&y-RD&8?pagKzJyCo-8AoX#;!i z*c8d%-+z^r<@^#)w=@0H7$pP|dnk05h$~`-0;0je%&J3p5qwW%PtI&IW3vpX^fS^lDElksw4{M*=kt!{zzEZslB z&p~U3e>#d~+W|r{C$xR0_h0*8{W;C|y|1@TB`;>^{^3MI6*{s}XDt8BXAWFyqdt3q z#QIn8zaE-@oy-&(oJwb2h9x#HEQ((yefjn$RJk}r* z=slfw9^qV(!X|L%j^UtcbT!++$A0`mW+9uqj=S1nf;R3DRllJ~_eTo%e{0_{rFSG_ z?-VM{JiN|?lQhb$z6wjvjXsKjga1@~QL-FP%vq4qGIiZ(n9T0@Ym3v#RTLCk#=V8!GW6vIg2f!0iD6TM<<6<)m z=861aaC;1yd2-jx6U&dVjwxWi2d&`sPGgbUWKEq8`1ig?=iOB@w`&XkN>SoiDr}oX z!*aJobPj#hc0_^FS_?EzcnteevW_>#jkPs1d2!lT3lr4B#u*|-%Grch&W-eYou-R! z{s^B1+6Br!m(BmTk+7XKlJ~kpCrYS9SOf5`V_1BmVfz9NP#llUIN5pL041@eEsm-U zc6?E0x!@NU>N@6(pzGhimc7A;r%u@G!IJ-d8&8Gm zC^01)^q)-iO@==Y+1eV~k`g1B0^~mH(n{n9<`&Khn;z$``0S(snyXul;PAdC?^&FA zegE~P=)Gf8(s;6}s0X~mam$$*;9_f;wd z@+HFnXsUlwfwVWrS)|q}BZ_xq>>}ovCe1FTbBO(78P|jG?wCUm?-J)7vE=&jQZv6x z*{acf^F0Ba9(&yAk9LW65Qp%yI_8~I!(ZSky2N^B*06(%g_wX6e|t~1Hs=Jv#Lr{i zH2+)^dyIq;MK@0gdO;2+3x3VkTnrCvKHS^CVP!*QLo6@%19vn{n+2G#Y)EPB zX{vcXZ3{y91HPgKQ7f~2U!(WHm*MRXCDZ_x-*ck$w4(pp_(Nk6ex7=c&Wc1^SR&v% z3p5^<2)MVup<+LLIX6cQJoWl8^7X+DOuzHY@1>{ozWI4xz;A9VtcKf%49lg(N9Pn` zS!uh4{KFg3hYo))Ognzr5BD|E@K4YLXcguMSjS%TnKk{weFy$td3tt+(TWyM)w)UU zE&!Wjo0qFJGf9iTGX0Yty)~C40zVc00Ybrf^P_R`wL+>U55uvnZJBt0)#)}r;dl>z zM<3>D>Un3^u;&<8jqK6iOe@u)CLPvVx)V0d!nbh;1_%OWTV3ospPQ@teGnmcmueA%Eu?y(R}B8upm3Q%616y-(f=0OS;tqn85h> zVbLyOpe;62vgZZ!)uyZ8X^%>jETlO`4rV@xdndqf>x|7m7r7NI<9gPlp^SMU-n5zy z2xxL2esg3%;5KtE{lA=A?A6dG$KQL%Cf|cvMq@5`%I$Qi4w}%T6q*!Zq;N*)0_V=P zW72s2TK+oXlVno>P5r!Ojs~R7i@KUYrm-!1?XZ*SSw1J17x-crfylxhgYY2yPiv>G zN|pQ2X*#^-9o3e%d!!Fgo{vE5YAm=lN_q<Iz0Q@2=&3gQ^IP)v=jHOeJD}Zd(o6;U z-$5ly7`U2pF}EZL*YjQ-g(4u0s^%aB(P1B*SPzqXy>iP3W1S>2VWFDMLzY)+Eb9nX z-#zG81-xrE#1n=#x2a|*_6o&h_pQywQd3~Bn!sOUeKvS>+PqRc084On{<%aA;t`Vf z;Xpjowd-ws4q*!(ETt2Z=W7ggj6PLlTN8_*sX5)?6rMAUasj+xdzqusC==fH8mIQ| zR@_3e!)yGm%^LYdvHNDZd*9v@QMthdEwb>>`t9RY-@NXXn z6E6`P{X0kkzw*^8iNncPl$5imH(j5ewp zbbJ>pW;}A-J~Xzthz1V7w?WV37H-<{>JB53o_Q~=xx-fP9}Y#={Z&R3 zk}-k^ba#29!{e#=k2=!n5aGc8+tHWTk)+IwOAAue`>e$sPlEqAkSLrVBdUHrEg_Brbe^K^dYR{IBfmgx*YK8Tjwg9wn;wxhIYL)v(7){CaRhX%NZF z;KAszFol1&f7Wy*es{171V7&$8xfNdOvaAr*5e{O3&JpRe1bDd#Q*g|7MlkFj=iV^ z;Pt*`EZjtd8ubQ&HSa{*q46vzfeR8CWVcn%el3}+iPYPdRAR>kVKShzoa^1P2!k!p zAAywP^`D2@*mDW?)jbsoxsC_kT`<4c zJ3jMR5otUd7^l?a;GaZqB30WxNrYyrt#iJ&a&gGu@{5g9l*-a2Pc(=L_kTmPVWPBx4bk9MSaf?$QR z3BLSYzd?jA=x}L0i)#psZQ3=%KGm<$N`R?5|iU7ehp(KINp zM+xb!0m`7NXTCA>Jl+*rNo|qtIcgd8L`30PG5m|K!_G9Iu`!60to13$LIudnLaiAh z*=yc=i*}mU!{uLTNp$J$Uzv_8-)LV|R&R!~=vkE4=H#UA9V!I-?MT#k3gA?^j5p`? zk*iDIofjW=|HV6F553h+*w=L!{HX9glf{`LE%Wt0+CPC`)`v%&ot-BA%@9*xz`iH2 zre|u)(!mjHhGgDS)<25}!J8K|z&@9869=68yddOk%hs$Y^Se{_eNW40MCf(R6Anr5 z-yY8_o6s%4-k!Q6aq8ml^(*MFlOMiy?fkkW*6+TYv}kWN{4Sq3=b!pqBf(v6vi@C%5D zDyyo_89ldtDQo_^=i9;kqe--H!&=)?+PSHlaY>gfdQ(DbZJ^>bJMD#>q&32ih88BKkdR{O=y>7D^B; zRDoP8^Et>8E4-P|JNeszgTp|o@k-Iq1=IIisde+Q(Py>?D9*L1IqgJEO-<)zN!|)a z(+p{KRl8K_&wW-=xs2(@l@Nx!Wo__>&i~idm4`zWzHMvNkfkz}WJ}66QDon7%1|Vf5EW&av1AzxVMvUfF_vPi*_W|q{f^)7yRPrLzWL+KIcKi9&i20V zx!?P_pZhuEwEVk#=b`^Z>)xKy5SxXZll$i2U_qD7T1Tk3-O>I%|IXM08+zcuAwp63 z7Dk!Gz<=#PJ3q!3KWj}CmYiYVkeuQ1x87ekJ)%2|xKD@u^-0@|hG0kT`^-6X)uS`@ z&?h0}X1L!S@y(<)XPb}}O!atwfTv~1)aPl)>S*N>8ZBSKoys|e7vq=S9-Qmy4kkN* zb|AeDe;o8DF;4Mm9&vvk948H^!$CJ7AD;*^JfyJwNZ_*32FuIqoJ?EONK#3~YS|i63@mJ9a-go(SK0KVy1_O}(ckip~jmy^7sR zQ@aTf&K*w5(=TY`_GaA>jV8A1_TS9SZ)?%i4*2=UI_vXi2m5@}$&8voQc?PaT20WT z_EFRiHq57p9i7((dKnuJA3d6AczwesvP_%8qZoYgVWew?z5O8q{{fFD`&0S;g2+;sqSiT{5{}V+aSZ4Ch@7jB$doR%_v)B6+ zdj*+0)g=jTae!5m;{)9Xyb+l@iCn86pfy~o$hpqF(BO7b@D^%Kpv}4ZXYc9S zLEc?S_`Rq25ap_sbv(`Re!o+1?OFJ1<;5QKN+38;vMN8vH&RhiX|ZM9k(fqX^2yQT zf@q3z1KhVpanVUzN*?oGQ-56mzOay-QA>v^Qy*(!Iny}Ln{c%@FMKP$)zXqD{{aW) zz9|%I(7KE00D0Go0si{7pcjBgQPtbPK9(@2Ifp<-?-6+k%B9Q1SeDyaLuSxOTR7kr ze^nfUW#y(Bx~g~yt2$X5;q|!#e-2 zCY(tYqBS*IKD#m`%9ZXhBDGc6$f#vm+2ZImerP(wNcMPDWC5VcU|mE%_nQW{Jlv|> z=0=;dcdJ1Mx=co+nuYZzVR-VjeCS2L&dOJ!cXkwA?Usi4zKl8su?!X zlv*2Q{|+|jH_OCfi$_2=S;-uE`CR~h3)0}L?*jTGFd2XHNj^M1+pV-2na-vdK#^h> z42r~cT(uI!h+FL=gy2O&kS^d9#*JokMgM*8(NTH^8WS!xVr1NsK1?+VRTE3udVG*7 zj+(rM4g~y;$G~1AQjRO5Il4ay03Mm|m2Hq*55zlZu@S(v-4PDUe|Ug66pAp}sII%3tWV?NFy+=8!IfR+Ik9@2FgG;j*|MD}O`@_SFz) z(9?gTzD%_vs>_X)#1}~Yk*QWk)g_N#_bI7m(q0XgF?dS7&F7oH@2513hg*rg3;nrW zY5T)K8rP8aH0eE_wGr{H;L=2RkJ7>$vQp^S(NpHvO?WkI$8hd+yu82LmBJ#A-Q9;)XFrUFPK%h-O$UUFlV5H5P3!4V8YwYZ zH-K{CU#=>W*%hi0g6Vr)7YH+Go8|tv_GO8OLy?|;YI)|LQY2!Kpvh5zDDVOj#w4Cn zO*@=t9>oQW-IcbqYlcw(rW3aweJOW$OWLL#^|&Nt_5BL~tU!3c>(oR?PVjnd^3cf& z7k8VkM3t<>lz$A-fLmW880^lmM+k^aGY_V1d;xY{8iammkZc@2u?hLhJ2sd)yMcrM zcq{ap=RQ9}KtT%XYT;oo^HV|4;IAB=ST%Zm6W#V(k-xrcP4j75Fz7Md(9B`IbHgL! z&Zw&S3#qcg#KEUIFNv>JVpEyx^3Z0vfsFCZVhb~nhqRR^<{{lRyA1&)N7E8k9KXM; z6me{_2#FsS9i^@MBAXaTEz5R9K*tLdufufiTi#iKknt~Z$s*dQZka^?t#NTM!tq}| zMxv3?X#IXBm+=fnv^wyk(40&Q2yY%*YtI;{39DiC&Pu~&?A<;zq1g$D%XsBfUxjRc zL+io5n0WupPTf$QDu4r@l&eqCSsCMTiqWDCzssiG@B9LI$lFu1&q3+>`De-K)R$B~ zi4UoX=r-($5UfK{G>wh?=m$=BCEcf~$~_O0?E z`$2BAlIETK#U*ZoN#i^u(Sm-mPCnXvYvitj+2>S3=i#SMpF&NiYLj)5X$~vPE7fPY zY<_ZH2=ZLIe>nT#Qr)#d3lkHsL=K6iWid^}`X{0pyb&!UJQ1>X7a)CZW}zInl7(%) zO>=It+DM3{Rs#hWWt+FskQ>fDjT~+#=ccHY zb5^)+8c`z4?;nHjZtd#F>%oPVDIlF#NUTe60yAlyEDqCjX%5YxG0>Isd za`8kDF0TySPQfM%ZTfi6x=rsTE@I5;mHvLjbe*b(#$>=g$A+1)F+IlZ;X4s*U*I*D z#Hi+rFl7RHbTq>&aNG(TsIy|S^wAvJ)gy^!pH{SOG>6jrPC#alfa9} zqkW*)4r@#S`4amX85w>pvxC~#)ze=UX?<|sD{(zyk@QicGahQbHj0m^wrvVbHmfBZWbI;HnCdqLA-}DXM8B>HX*Om&eBI@K7b!!hQdSdYYC-4uUN8$ah^G zZtMIK9N^g(74`F{*Jl&(1T!!UD}~}*%qM)~l&K>c=@^KdFKfE=t)GhHv-%vM;DJ`@ ztU{U6vZ8Sx@naTS(!vF@4p3*roR?6NLzP8yZP=^BWeI865g9p1)zRn2#PpKU25V{! zoV}+fVu|XQKS_t!Z1dNm3cyu~cgi;fB4ia{z_mFuTcQMt7mTt=%pazEXeU~t$)!9)GfFsyzF2bIJT&~16pDw!4tSlARF9NDFMf(y#XBLg=Mi>3aQA~9G;f$6M_Z&WVwpNy7!@UQ zP36?gfukKcjyoMxzdMTq^`l$R5f2*blaLu9ze5E{brOifxq2^nATXSe)uASarzgOJ zwGCl#dB6<4buk4hMz~$BL98@^?*+>ohfL?#F(VvQimA+Su996LiGeRwcizJF;I`>6 z0q|$8iT6GjYHXARDDUdIEbbk;Qs|HmFm}G0xiotyaaoHCVWt{%AxQ4E+moH->ek1a z_v3m=E5Whtekzv@S_G0c??mD4B~hu_zC`J-PtSMbejY!$9L<1qPXMHt$)PLKM(9-z zD4#8ii`g4a4=_*u+W%pmq@}%3eJ1lO)*zdYd%QhgLJ*05Sv#5z?xy132<8r3aomh%X6~$U_Rq_V0Pq-D7=o%#_VaJP^2UM{h>I`kkoN# z#a1;d(EI%TF~Dp@I(Q(K#l zeSTh+AM)xYYj>K5c20uF}*ml+6$ zi<||H1Q_OEI*u?_)20xgSxD8nXJN{%uKW@oXIf{Ss(}8aKUBB)2bH&*{E-zq=NabN zW#v_t5~(`O!bBJM&SiR%mGQ#0%Qvo-B|(D;HR0m~Y3YP46&pcRYOB}8>e||buYx?@ zxhFeYDw|s#BR;>qzm9Y-+3TRv47W0&mL9ds(iFvWwT_^#PWkUwVPMiiOt}`8_x8o9 zQPq$0fhP{D2YEZ5r`B#I2dqVR;vmHyPL-957GqYz#<7M;=Gu)cyz)0{vFs%bH{*0b z;m(v<*>`Q{>2KdFs+B>EPpBv>k5AB-PHmK3 zE537jM3o{1r_*DWahZw&lz4uutw&OzZe%i!O6{MCasJ5<$>ed!;5b_|;5J$MPC)FL z|E|Pj;n{=Do)6(au5huf@BO?Qtg_1UHP0k2%o5dwJKVO31k>DgGDj zhYBCzbdeZ!c$YWYWO?ytB+_h|CIYpQOt(5FW z6ox(1H)^2n$rj2#uo||B{1AqswzSmf|K;Ar7pZ! zZuobXDQgZxWD&Re6&?|444nnj43!J3DWLvM-7=J4Prn_;=X7+86~bQAx@5OxVkYN@R3E58~jpqc_()`E!hqzt)k7G9x!#S02Gv^u*UkShUG&0Aasfhlq;~A&1x-VsA z$&-~@t)Vf_2C}kP;iVx~@##f6$M>3|6J}f%158acWG>tMV}zOkSDt_&sv>WtgnFu;Vp$} zaJ#z3n1S0CeAjFfyngZ2pUYnj+??x@5pQnodHt_$rh9#FV|poe=+7nGx;l#R`ohfn zVev5_Z&UaqzQ%*w6ve6!Bgjj95<*F)8LS!>I>e$y^+iZ43);Ka3&svgvKtCL1F{vL zKKdhJs7%^%mPxqxZH(!>lJXZ%aNeuD3euu}l+fbN&z6kmOC)W5OMw<2AE)M44Y1N@ z9-}v7eQZ^xlqrA5i)MW8QMH|Sj#F=!-n0Es4NS8~e#WG2Y|}l;5oZK9pL6j1#rvx& zl{>Z@IT}7e+@>S+Ll^c-GgV^OM(R-ice`|@11;_WH^e{ZjiMjWwv5xC z=L9O)OR_i=TM<~aD+CRUB(u_H7%P;=_bVx_PmlC^GtQ=uHzawC%|Rf$^jPDIL2{2% zge6dpw5NPTzjx|$bpQ?KO}+th>cboL35Y8x*(R6DEqIWWMiAeU@)@-n-{@|RBDjn?))##eJ%JqCvn4ho)Px9d$Nb@ z0Y|vx<$dV)20CDDY$iR{W}OZmUg@IZAZ^K&{)Q8JHmC3&AF0$ElZI!&asmNGm~hZp zc*N;eG=Ma>+5QVRIdPv(R~}M*He$oV_|s^TrFU+B?Wn@(E#&`ew&Z?Tu0d9B7E)Jf zi`fUF0;>6@jFz-mezMr-1%+Kf zNF&MksD=U3_YrM)CVCCPo6@>PJs;*G1b7=C6!ox;|A@F$O-trmDZ%5JgPJxETHUtk zf#_o2wC{b--*I?~_>BCN9_85?dVdp^@2Hgl4+PG~N2oLg1fG+n_$)cf5$v>s_)EmC z4t=kIQ(N<95Xt9M^(^fB1OOm&{ZC5488Z3th*@sj<~g3z4JftXlnlJ8^`x+AJ2hDB zG-fy`c^a^M%-{&@+QxpzX{H#jzs!*k`n>C@Q~i&1a^{>MOa`Kh9M_Nxr}AYkR)WsNod3TGw}gJ+**SdZ_buRSf`|Pu`?2p5p4*GiCdV z0G*Yp#~Oc>n$qy-c9{wsbA9Wv3IBCA;E(kOo}NSKkvri9*MDraQs{VJlrA6HuSfN6 zDyPEL5re7Ky{z@^4TK|vurH1+uz2$j@)AMt*tY&s}xp?#`AO)c@grvA3`H{<65PZ+d)eZ1Upny^69@hSEy? z+2F`pY6gaFd&AE9>dim|)-y4YW#?j@)!~M)Vg9)*wJ-4@=uEmxR_4@^}&4tV^Foxo~$1;^Qo_P2%`zz#S_n^=B;5sqQBvw>;5P7L+`-RleOtI zt)t4{;)Zs9`(=5-h>3{^V%WvM11~k zD+FP%22wDK)cPcRiaq2gdVwFYtC4@B8BoQ_smpY>CTVtd?c8~z!JwR<5$J=>ucB%2 zS0~&5sfns!>+gqq7(A$GA+^@G=GDblsA|fp@=JO8vrW{=;&2sgY(W5*sdc=}v-jh= zYpd&^JUjjJ(-XOHqUZX%f@dp^i;{sG3JMYIzkymRRbq>R!ib_QFQerL}dz+NzRkO4jlxXT1C9ZCHdlw(}haQ z+>c3)C5=&3tv8t}@9#kJwSQn>KJDnTVXnNq4SxBX9mj6fZ}sY?f`y&kFNbCOVB)5- zuG~&fPrCET`AI)x!fSlB%xz-?w!Xfu_BfWD{GzJ$&)bnn2ds>M)a?wB`Gpzyokz#~ zjNsXw@WYefydb^6dECGyjpR1pP5Z6gifE2_FG+ilTawA6hPS`JzfP^TtSkyJB*f2j zz#}Rs6MNGRdD|VCnYYPpdz_Y9H9`?s)qMOQ@e4;W*ww zI(a6TEd)LND$U77di<`umRc$(^Y+~xS*zzEe6Q;J(@KNwPo0!)v<01%%spCUes_<7 z8*+^;ti6>N(V0Ki(RsN&E6h{rCTAXT-LmtAMsj8Csv`S`;K1>5+w!r=r)|h8*4^zx zW*VmP$4_p~kGltA!Zu39LND3##jS_|8WN z-MqeOYeU&LxpH&h>)hMlb`Hcq8r$3?CdHey`-4Om=eq^zgK;X<{QYTYKr$nQ@JiUz z*DA}u&7RRuLvAm#(cWuFc-)soMA&<#?cdj2ybBYXK{x(yM8(NIk{)dT2AtpYxB5-A z9RIeEnx`1u&YbeHSZ${{+~y6w@nW?6ODYZt zT{q42=K1hONGMP`Tk}c70|j35@o;Hq`-JMv>!=^w3p$-;>q~We-_|&2cGOrueGM01 zVT>V#fi^c3__oQJbBnx9HoR)X`nJ#!1tr9DQ#w-Q0$@IL%3NwZq?kuJ4e3uuL?uWX zkRbFc@Ggl)vdu+CADF9x0>Qz-=Kk*yP3idZKy+&*@ak6qH=ZVHVLSKT_|Dy0|Ci<( z6g~1z-nvl*dC86FInMH=FvcF8e40q#om7Eq zKjYqByl8H&vlo`=ThKRa^Xh#&QfVT7W-iy$e$Ug-V|MBe^L zQ{=YgMXpik!iwl6!n@G|9&{T^C94wDvs90P=n>`R%TpdTTQLC?y#BZmo!Q3jc_YG0 zO<`eK;=!aYgm`_%Vcv{aw3+eRG$t87a{+PuKbr?3Y#%Vy{u~g99LX zb??V2A$M(ylB?MgfBGc^PZm-S4$dfAt=oQI1?+uu5ZK4>j@~X^!ZtkBqEBnQ4aOab zOyIHxONQ_E*6GaNRehWITG3MfL<><gtE1UEMq7yoo$rdx|3u7!SutUFn@4)EOWcN^lRbF~Q5 zu7<7BaM8?VB}JoCK<4R`W@p2Dcy{*3ht=%4CzM4-N&2pt$bj=;Toy`dP%1une1lXM zmL;ZlO;#hO(7n|0Nhpe@V8;4q?T!ZzjQ1l$i63uCL2TU^N?Hn z)f9jknW6mVjh2UKk6X6TCuhocpw5e86&&4%JhbOKzrplgZoLCj zln1et&y)X@-*HdS``pX=*IfmdgV4Z)9=PY%PK*WDh5mNf!zIoYThR*!Vf@lb>~H+Pe>#B;_`jYYSP z+wP9s{`s6WB|Y525~qHYuxzNRttjQp3z_CGIjVRi^kw-(3I_|XkT0bx4XgF6 zp6TawQi1oJ?h#iN7X}qo_8yGoVtj=_QxwdzavFTgiElR;-tDC>GO_CtU+eu)Q<)%L z!gN6EI$T==M}%xxZRv>(*Do~0jo_6ax6#qBCbyM)cW<^J-0$WM>XQ4v8iMxzeq+yh zdvh3pm&44v`Rk{KhMF>!sm>36rbri7j%{g(zWNcB;1)~nUSwmkTkf&_ytKhQ%4}$q zs_4~vWPFa4+39-Z_NP`|0GIf`n$IjE;vk2GS5ALWh79&cK|$p2ka6LMDb{ZV?BidI zI;>E9@#8aV^hqVg@Q}M9fRnQD)HA@Cxc-IiU_8D46!_|=vCK-s zKPS08u~2c^X`T;C>~A)1)tyAn7bDm^9)R~uYt1I&X^H&)*FWDlx8pFQ8{;fBaUUO1 zVPz8&xLnMPn-qlczp3LJD9RH5RECy67cUhe_4f5zB96VY<;m~T@PW91N1waPhg${T zu_K^Z=n)BE-q{1vDDslJx9gO7X!2$1@rltuTwfnu3*yI~+kOAZFs49nJ@_Bk7@ar8 zV|~5Y2(#<8vH0}K%tD>UjrSlfyA*bEH)5FDTJ8B!rwy44BuJ@4x?i4{38fXvre&cIN!rkt-Y*fV03-=|fHClY3F? zTj@%~8g{JB{3-so$QIRotnO{SmNV_0X>r(zqRLJCgL--wdMUL_6lGU!Ap5G@1kBzZ|4qW`>|K^W zjj*}BJ?6{*K59=h>z|v8l$=hTKK^TQSir0$v!->qmqs~ZX)Q-h(lr0}k1ZKU$J4>4 z4rlIXOn=+2JUgU+KoD6kYt;lr;Gy9u8*!S8+qSgjs-A4?-b?yVhco&FcQhwVl3z{3 z$X<2>i*UI6VwxCt_9sdOBpfv`)mCDLeVxAJ8(zc)Q(#C%ac- zB&Z}Y!af7~`7pMAX7r2as4I24X-IwP^f&xT`Q1z-XJ_L2+)YvqLUh^J8?r(1mqxO} z7JvNM>h0Cbg)}~+ZHS7>-KEQ+j`l$tjeBvxT^nr9Z;4C;NJYgrnr-R=NpnO7rA(;C zRaKVOB);mh!+2dLM1bkDvP~9uzobvVCuF?bYe7~>p{>DDO~?froF&+6K1m$>w@t99 zfEFnIyBE=g9nm_;@0eqIOmj-`_3Q99rSOSk!q?$V+EUK0)g~{i!frv|lER4tN_SB& z<#$|ntN%806s&kg16HR>cHaJx$y1PRkL#RtK>7<}r;2j95I&N@QEk7e9Q~NRw`ixy zp>DyMmbWo*?B2ec)i06O7qqTS`WPiEOAE#lM-ZbE+i7~ z%|W7j9z(oWCvCh#Ius5%| zcg}ANJ>L-uFGbSr1~VYDO&EPX?IZjC{CWtub*Ml$l+-lHk<6{$$Z#8mfUQ`My*k{w zV+iixG#|s<2TX!c6RlbyXXti)vBDW6AvG($)a(iU>)z|di=}+0Fo{rLIn=` zbh=78%J{#4m7)$jh3^0oulY&G(34k#-_3=fK0cLHR6m9i{q`NXcvyok8|pN8*ymJ8 zmw&Kdc|d4XFUq0rLN|-2haUR`nbn5#D+Er)H_sX){?l8q=(Dm;|501SSAgFCCks_h57#_ooQ`D=fV0ROl>Hp>C(57OqY zV*n9*u3ML2PQIx>6tm0SXg{~c^~BD8dLp#zbcs?)5ZK~83FI}n z9lVC9+ecTv)f}6TZclVKM1GkKt)0_blK1>;qyt{Z#Pvp4(Auo!ddKA^Hq=Wk2g*rV z*J^eLWUOcAa-Ds{V!_2De^RRcP#SG*t52VYPam}6{A};_S55>P3lEePrXc?ov`?Bq z9tl7IK~N_IZ68R@e(k$(E)MwVD7_UIYB25V?UZX{f1Em8(^YOGPH~V>MsYbs_8k}l z_-W%K>C`}lh|K3%eYjeUKbFkl`$Yr%pvNC;9g1a-Y(xg>(XXJIvsJuQRB}>`O0rBz z4y#R=?IFU#>_3}7NlW4W3j7NWQlZ!Lhk8d|)=$6e470+T?6$2Da6WVX89)DFjE=&p zaSdI+Li=IuR})^D6g?E@C)6jFLE12KO^y^r6crIaNz%V}tQ4<>Grfn(0OX0%gAKxY ze_<^NaH}kkT=#W}AvT(sQBuO1Qdcj3^OPn6I_+Y9Fau1=s+AoR z*A$qzQ1KwB6#|3k79=TXF~N9Y6PF`m(n54j9*L<{&5=-&il^4!GmB)n9pt#hKg~Z; zt6Z|5AN%P4_P~`atY}s3rlxa4lPvracbZWeyDNsk(*&X!DM;(cs;b|S!41S%&vcu_?Rw-5vgA-|R`W}!sfXX}vy4OL;v57q-WkQY|B&eZjS@kV=ZEp!X5Rh&-ZJPFG4v0u=y*JOn=gYS_j9)iWI-wu4{+!Jc+a-v^$o zl`>KD6HTs%sBp;YYbFz`NL{L6lOw|nkVn(7u>_>KJ7gEzz8M$pxD4-3n5{I~SZOG_ zt7u^6xn43yOSd1DaL1<2V+DoCHwL9qD@bI18I$l0dN~um8S2i@H5!wx`3@0wih~pX zg~2&A{2K{2uB;x34Q?y*CdKcv*(9Ll)kbQT1ZP@LbX=U%PquDoBDr$Z5+tEPaEMEj zkkg~n8-VE617E$y!b6dG^wvv(=>}gMJD;AhB!6Tg;m+;zm{slNWrJ0t=tH<4I;kr< zGsa=TFYUQOJOrA`4eh>jdq!HuD-DQLq=O)@5YyS4A8x~o##|RjbglD zCP5ZCUW*hLSFC`{BFj6z>jjJWFUL+3SX1Q8hzg^&56|slyQ3N9Bz~&Vce>VYaGbdw z$ECNl!A*>8A!`^Gq6mR(>{J*twt50XpIy|+C1vG|d_u(r64Wv^RD(}DoIfStWpyMPN%S2{zjuhYA)>)6t~^Ypg2z^V`; zxt<0!_t!-spJinSxw<)?t40+7-h0^kq;}&My(YRj2_e``x!47}uAbh;a@V7tS zi0*Skpn&c4%%pa#d18vhwYXer&?dG48)6p-ny(k=Y~D=$`qH@?3gf~qCFC5U3!Nj6 z-oqi>Cnzos2`Z0F#lH22C6YJGq1wOgB5-w@K z*;?G&dx^nKZ=e+_a>B+5(wswEoO+SY77iG;(~t{3yubuT7Nz&#FvGdR!U{z|aIW~o zF6~pc48sg)UH$j2RjL{mkl!FFvbX_zPKh5dXN(O#wn@tg_=i~=xq8ik50Q|mP3J_6 zrC2+N`gunW;kIOW;PA+lTDPVOHrW(Gpj z&^;Zh4E9GO98~?R&jwNedxE#k`w8i3bUa*IPQvu`;=P3M>n8D_ti%;%2|zBBlDM@` zCQLEVF?ox}NKfK9B>^0~r5-o#z{#I3n7d--xUldxlFME)=eJDscl}$!w48TGD?sjj zjRSVW;^*eox?9+&xo0&q&xyaHT{+xsB0I}4;BQnId3tY?JWHQpmI?^@zLV=mocXSb zAC$cEN}vo$obnLh@3gQ;wTB!&oD}h`wVX(XUX%3tQ6;~FEAK5AmN@&kr;?Ol0R#P z3;`kEyq#M7ZO&@9iB_=pV|E9PmHV2zI*OYa=kDpnHZZ1u%p+NS^}JZM>|O}T|>wuym}!|)m9B%^1n zC%=k75M>xQH3RIvdXlkT3K-_`=ZnWU35KU-2b8rZCsp=Q_R^h7}gW6{5LprJy`YC4;TrUsEYH(Ax*e1JWRsxf%*+ocS z^;hCxViE(zX(fmGKu3nRrQ$4_oIC-Y4?6IM;8l3*3%ASs@Qd z@awy7<6?WJW#`IT)SDs@WUtue2dAstjR)dfM<03RAkr}#`9YgRDI<_Top^%l4m$lI z93*L4Lsp3!zYLm9SC&LzXa_4o=N~K_6#jy1-$xj7wW3m6C`P%j)P!mALG`GkhIv@y zOKi?IQaJoorl$!wyeY0gEtV`M^3GiSdz7n5WwBdA7^&aFBMYDP@sSlRH7;61Pf8SOn_*ylEY5&H3%s8wM*0-4_ zj1f%2l}25(-}sxST-&Y6M^={?c^yRfqwNN7sg~rEFJDK-)6!B$M*}HYa>Y~4aP~gt z)$wsbK`4*$QT&BIW1o0tZuo`wHlNqE3NiTeu^4o>YgP5<0eKQq{cTkyH^S(6Kg!eW z$p|OSUdAA%sv+ObE0Ms({eZP#S$3ZO{@BmpXXwv1&Y!sK{#kXm+q(7V zEGE&F> zb9|DkO>RP9ASfnP;`#{)k%n6g`~eYRc$y8oos(sVn->=w3T*q_?E+6r)3maDu@Jay zVL3WHIGDa!ohMfNH~8EW61DgB_B8;QzcrKxrp((}PF8Ok za65I}z8@CP3ds`tR{IODPz0f+dL`qw5LB4eb9>)a^g`?s#?* zOyzsQtf~jovbq-Zp9AH;0+D;uR_eya#vhF{(Hi-_d(s(SI!RmXYR6gek1dpn3{-;siNF{+-5tzj_is9yjL=!8RHv+4Rdk342Pn{mp91J3Z~Pij>#oCox}csV zl#+VJEL|rZohmTJetI)q9qwVi`v(oYohzp&UB!wFd^(efHR44;+?gS-f0!I|Ggd&a zHEn%jbrZmB{%cyES1Vo&qr4o*o-@iTgqibb4J5BT6@(+^j%^!Ui%G!sPepgXA3JH< z+%cAyvL;rjv`UB*(7FwHFcDUd;m2o--`-!X$c#?tIa|?>p5DN`Qc;b+{fAbzBXq4E z>xus&r}JYfS-g%BwnzQl>1BJ68PSM|!{giBF&a6e(l1+d=BltLZ06qPq5DIJnEV5<_wN~bc`(1{XDjk4Aq#7j zAicQlb;?KGm&F(mB+7f?JXXRO!pnvr9Eg%CHL?bJidJTmK|#OsUDul#Qz0Co4wAUO z{u9q_?qjx-F;^b_aS3@&*2nDf#-4_>{oELk?G)^FFRu4@4AWG zDBadSYT@u+jYr&(9-xcD-P6z2DQG|Z0{RAThBeHpTPzGIZTL@~s>YYzW;UKFTxOxr zl35f7R>x$9O~v%1Mv|9j{W|p{#MowfJK&10ODuY&B2z`QYv* z%U9pM{k^sa7_M%18(kAfdU)($_{bZbt5Poa3JEINLApzHEa3`ol z7vJ1f^Y*EIe}Odgm7vRVI9X_|J`r^`-D&N@MU)?+;MpGPK#N?!eSMsLWR-XnnbpE1 z?%`VY$N2F61Kb)ksM!uGo`K_A$^FJ}&DPe|9VgxKeDK=0KVl6Imx5m!J42AE(xYPT z9M~4A0&=$alN(eKpK(_UhFss#)>cb{ITNU&|0F<5F_9cy*G@mZSW1tD*0YX<2#PWO zJQnBx*si~eU6d50Lm>d|5WUf>xqAVz zKG)Wc76qL}s$I2~NhXi&sFthzYVnEya4(^h5XMcifeH@(?as^?+*No2{~qzt&OF!K zp8LynnF1q_s;$H1dJCb_wj^)f>p@BYIj=2h?UwsDIfV8`;@@x0U1IQ} zSb(rMXVH6QW>tyB3YpB_uFx)-or5RsFq?H+>g%3=$I$tGdeWP7cB-9XftD z!)kqYHeRd*CS&u?Jn;Fsq=y1`HZwdbs=^tuz%auhd}LmlG!W&4vTLDsiP?08Kma=h zki-A41+ayRr|6-)iDd9zL%q9x!5VsD@h`ZCmy?5632`NmYA)fpI^9Lhy~u%SxOys& z_D`XkSxRKKrr<9i1+6TyAT;S78}36=O(Q@jXT^f3wjhTAkX$o*vyz0WV|++y0R?ZF zk{SmIXTz3Za$ql)5_;$xu+s}jFsu~?8Hiy#ssdP-IdteTF0@B(D~OYuv8vnue{S06P2Yl>tCIVT%pWZ^{6A1+8}59;ad9{pt3S-95y| zCs7aOLkN-MYMg6~%{P7XkOs;^z3+*Mk$Qjn1RdeN?T^h%=fw?hNN}w?`8+lwM zX=hlMPGL>1gv#@TFy8)$fy|06SfcXjA)uw87l0{)wIPGir+l+SzHMY5m_g;#QsQn~ z@2d!A_p7)ioa;TwyD}vFW;g)g*BEfVgZbqm6`r6zU@pb|sZ}AXUG~v8j|t!Tqsx8D zUh^QlOheY&-R7d`ZzDIinDMmA*r%CPw&QyGc*ZV@y!E!^N`PCd&C`?5%=KwR=}v2< zp6^nBY05U9B-nIqDf5-$sCN1)eN9bcn;3n|tvLp|+$)cc0~cC3>oXy=u0Eg>4 zL;AE5jl6nxlU#wKLO{sMLk*7o9D?(TvZIZrzYRXNom5&&o)xz`upf9NURhxT;TiQs z_ys4&;j%MK`hPVwykPO^$dc!-!7!N85Oy)dH`sIqfABp`u+`HeQnqD+@BS>=9(z$- z*k4+%5CdGHcT^tvU5N%Mc+TOZVE2C%Np$ne6)FTUrs8Kx!nt(|hq|}Fqk3d?+f8-W z(0`^)TE!;?($u>hvnCurtdfA18C!2a3oE86{L36I?sPdRnF#bSC*~oW`?q_tEdvpJ z)wd%dqh9<{YyB5ZuGM90R^5`GwHjn9Kn+5VPTi{xKGL)EQZ+O-Si?Aeb+2!2eC+%3 zDV1=V?J2WFceE$pxk$zRck4}r_)+KL&rEiW%CaW(FN7rUt~`r@2wX6$TRK3M3-5>b zZI$Vih7gazD%QK26GH<=k9;I2{q^Vav&N)q^9l<0Ak*1VtMiV_wNXhv6oKw zUJFG^eM42yrf1uOHuOL-F8Ynmd06REWvAC@bp3nrW^U|w%(ik0Tf#AcSi}^M{EqeO z-DX!m@7DaGx4K^NcNH}JG%T*Jy0L^)Wtv^lOx(Yv`uT0QBQ_WAE*)1DMKL?0QM5_H zp-Na(-Ak|hrVbW&FwN4wP5{7WGv5X=SE?GeeFHN8Xf>>`K`Rz!=L-8y7`t!{t4H$t z7TVK@fos0Xir1bndHH_xfqv-oUN(vU0B`64Jhz@*>GXmI(N(#-!dl>oqN)etw zveLEeq3C9SD7ORM@$!HONQwUiMDP&l)bVg>V~-prjIsIbIoC0L1G^gjhsadK*Q1%Nk~Mw=^K7 z@ZoWj7SBphU-P9l#l!>)R}s3!3Dh1c-yXr0-{<#{VQGBS-{pfmhSDC$+4>C%x4J!6 zl%3FD;9ethmx@YsbRu%?_=@#T;$@hclMJ2EpZtC}g%t2zVeVw{`Pi3jVE*rHEg8LhrtJD{RQFVsie0ql8uj8NKc|K&_~6cmin4DF4DYyqrKoBflRo|J&VfOB!;PB4z7Hv0K$B6kvT7N0&=ssQH*Cx?L4Huk#XQ$EpV4<{@wpN*T8eu()3Y`s*i@x7@VOOhGW81foE;UXIx6~ zp{5qkHm}yO!P9_{%$Pv~OK!|G)-+p%YY+b*V9GoGivpl zYm1)2bb;`PapXs&iPeWtR0j`Fp-Jt%*8pzm*`GU{&}s?4OGcg(v8oDF9)6K>#|2eB zRGypkBWHU~ZfY#idWGJ?5T*<1w#2xh`) z5?oH%jk~4TgvBy)j*e%OA_idsjYmTX5bTDX!~7uxNkC)>!$EBZN2g=+{7Ath=^?1A zoN<{E5}I6=n3zInKT!Z!Loq|wosfDGbStZeQCj(e_GIXa7gm&!3B$aj0JF_nb5?{2 zH$MdiJ4e}x)XDS?h|Rz?EZM}8xW130X7j$wZQE%LZ`)x3i3)k{-=k3M;`--Kri}75 zHX63H$b{&XBe~v$lZ#Go%-NmKIclv^LNi9C9wmQ6fvTp(~abxT}_?_Rk!{I~2|`P_H>kd41LI%W`5M{YoA4 zAY)wBZ?@7&21+q%HyM`@pe(j_4A4rRe`uH#IEbrdfY3Bp!_?AW14t17v6>KrSaUNo zjZ+)bXa7hmi6fQ5kZ7%^`k1D980hT-7DIoma{@FqPf)kOEIdM1Du)9M^BWVP) zJ%UndM#nysZ`Ui;7jYFfCo7K8GUl=Cr$1kt11>IlhY3~XK?R{Wc#y8PoZ#fJS@lcY z)i5N#`NdAx3V9IqtER9L(!pr4jNH15a$|$PLMOqk1voXA%YU^jQ>++k(k}JVv6&vY zN2RxM)hA!1K8qpyakFw~X1^I0>%I(ae0O^l%2J`y*=J-FRIZJU_X}Dm+Q29&--*V} zXov<}_#r=nI4LuPJ+mr#2u#8-cmFl%7in!2LTsW>a2)iY+nbwDm>(gBODiAoe%1a#64QF=zuwXj2*LZK_d7I3*R&1{w;Azs(Pxx* zYa=la&!U(dT+(MEVTNO)pLNRS7vb2W|D{MU9;{@GKsY`ALrZLSdFN>Esu5*YVRYph z38;OW;tydsQi1`bsVOp2>S0+2EiQ}Vhq=}-k6%%g)BR18C8_~4U8>$I=HRIhcs$leW<>F!diF6uSH z{gd@XmW0{P(!xY4!RKXCddnCxoiOd&9O6065}}z8XhYT;PwxqT^$xPDNqH0GM?m|~ zJLpn(EBQ&D_Yt2bXyX|`RR12t{XBfT8Z2v25Lu2b=zWUOZRqegdy$T5Cz;T5`@&#$ zt{jO5F;!%x`iCB)d1`xopY31;19C`VoneI9b1x7(rgIt_O&B8hJ0>A3CQQH9a)Y(d zTXMU+#Np$nRbNYyxSM~b^0rba<(st=yXwf;Msp@q2Gb1&YH#0+0$x2YhSI)!sh)>x zI7Bb~>zAWw?XE=WxxX&WcfK#HgGDraYYFl+!SC|I6DrJz(rntsaWf4lqR7Q9-hu4M z8pdDhN0r`QlL5WL(0~sdzn~AD#E+uL_H1Zyt)@{|7aC9rukOMjf)#;!^vns9K8x%U zUmMc@37XHOG*^2CT~&pw;t`GzSxAcPoO~?CRh?&$1CwAf7U-Vjba$X4IKs$TVNBe6 zHn`s%aQ1H_{yi{_b_U8^h#2u5ls`@y+FIB4R5V@e{#=sqpg@YLLb7-us0*LEQmllc z@lfWm(n77k{Q@ZZhr##?kjsP%EHdy+=NeSl)`ygc76tq{mzN1~d~S1-H~E$@hAM`_ zVo>-lqz|(i4+>`GdYy=(MLOMa`|~YPyI*4xNSvMNSZgKKs}P7^-42ajFG? z=f(gk68)oV>#>|qHKsnWMy0s?FiK8rHHC>XK#jrZr(~zzx+>X~$JIb#~PY)Az>Ztp)4YVOc zF-Zh3shj{H3K&yF$h-(*cG%E$a$F_$cSKt^EwCBhjsLP`vhLS@M^p3eYV%HHPi{(4 z4>cq7)maGIy!7DjiY9TU+*S0?5#8mtcW-a6+cT6QGu+Sf?@?ENr&kBzk>S6wlOEk@ z>psLluyLJJ8i{jq+wU0OEuX$_#W59skjih~y?SlU9pl$k$O0B17A2_+X7!fF#ry8a zOsoT;dmu6>kFF)2JNqjY!b5??FE{e^vk>Fg6pDJFID8Lzy!dfhq@0|L&Rb`GT^ki% za@bIZ7~6kUB^a1V0OL3+S{X5Ne0DBQMV6AdU_u=OqmN68kHa$ z=AlT^HmrZF&Z| z^&69?BolP64Jw*E(^-+%-Rh(f;O;%N2?K`&!!hsdNnhq>UDxUSvL(;u?JbD&AKkxw z>#vkKpTct9B?4pM$AY8kfs-hElUZyCF!Wdzlwls~2M2XLJ}o@<%bz9>qOTfoAfJrY zn~u(;*nXJN)n}GDW$*{v$XIxBRAP-5DV!Sx0pk+#aBNYzpM?fr=vUr*kd;i=!GFYY zTB;jncqVI-aDPI260R)b#<=gq5u|!hg#E|cD_gljxQ|lvWn1o!q?91aK?4U)XztT^ zY;5#94msD=Jlsm4+`fIM6Ry-r+7DZ)AhP_1X5 zY=GF3Rmzr8Tv*on1PpmJ#=AOHs|_xa0m6@cXemIdkrzx^BtUqxIW7~h$OceY6&~8h=kzC59TS8 z%(Upc;13j)NjSv7u}m}buCs!Kg!kB!1sBLKNISb?jft@ogTzvO!No5fSEkQZ)#hJ* z9Y~U8C{1jCH#V^qIU(fl9V4s!4?W>NW-gqV!`}q8HJ8;0cL30+k=RC|)`Fx*7qa&7 z9^8bNRVxB&=ZmFF%^;9{X3RaF<1i2JcjTUKJRlh}H9_3{m``hk5i{%q6cujTb^yy{ z#bjf{RL?PeX+TwMAa1}|(by;=%{pwS`QBcO$pI~rd}LHN;m8%@o{Sg6TSW(~a-zm8 z!~o@S7tX$EE480zmV6Vvk84{*0M}534-|CTRabj6Mb7%(cFzSuQA=|f^NYCc2jbXd zQ-g|}U182Kv!cwO&Zkz#2$~hxp?Ze6_`Vk(gY}Z&o!zUm&@UarpRP~t*F_-$WD4!h zhlU_i>qPR7#}~yeVFw;9$hAE0_?{YlVboGs{284&C5o(eE>{F{%LRtY$O0%g$F`3n zPObKSRicL@{0IYF?2`QrD&ia=sliTNegt zwHAqbK_4R_UnUrw!NMeuhu;YZ#BoB9^zWcPuD1z!*&}okDdY2fC_?)oW+@TkAxAb9b zme8=s2GQ)BY4brZCfisRfE;zLy*Uq_+wm7_)_p#TAp&yZeHNR2l=sllo%wsknSxSx zV%nvgP^Xb#0jn~iQyb)(3riull%^lFU4&=yllbc%*+!^q?s2s#Ns_sTXzTZkGBc{< z!KO;{_gOKlDh}l^ym^)r=jyO-j-VE(={aR4`gM7jBC!uboc=5{! zUvINRsOAuWKD;skT&4YsS@35Fd1^W(4UH-S?HlzT2EwmPHZpTo?N||KwLb#Fl>4fBFdsq8xLS956 z?vL@Kv5h+)Vi1(8*vt}5Qgy=M_)`QUwi@5J-MhsL4Cmk-; z!NEpflK!6qj+k4afPSCT!=3dVe7iJlEH;VaEfP}@P8lpP+gY`eKI}z%Lk}`O&4NV( z-dVNacuBh>+jrd|EJ*IjX;@t-3qOGkfsQ!lP3KE-*KR3L@(Tk7z}$RjsZi5)ZWSFe zJMCFYF{SkLBROyxvenR$ViM4&;GZ2W*SLecyM5t6;g_3Q)z29LTJ#snvAG!L%c|Om zhLUjeFZ+vqGyA)}y^TL$OicD%wt+p!2(8pU>I%1AQg_y*^kZ9{CQ>PS=&TjYWq%;9 zPS7J!vTwkJ)76w?+49i#)6xkb1g8vl=<5vg$|EWrXNMU;JeCrx7d|94#+MBn$lFv{ z+~eTCncXs8y3(pv^Q6=P5uE7^GzO}%grO!DZv zS8`z2cY!t>MIpye!+UJnc^!LfR^P?w_#j$ZBsy1_17k&B^(1J7M(c;TLZMq7oF0j2pS&_?i+SZagI|@r`Zy-Di~S>e;UaUV!VH ziz8HAM(kN|TX9RW?HVAL+uBF~aSH<9oK)l<&lGScg@c>u8)PKLS$H-s+)6mHs z-&@sQVX+Z?C;vHRRZH|>%JJ|B<7X%~sWhHS11;0t#>skBhot{C9WI<9)PCtix`GyUA z56+%W|EciIb2H7AzYTF^L+d)9tZ~4^k_sQHt=LdkY6cjeYWugO=?2`#icOYx&`MA6q4Gh~AM}G@5gI+}Kx9lyv(u0Ul z5z($I_k^&%@64YSv3Dgg%I{OTX}=7B*zWqLgme`39-L=C=nG#&Y=O5bE?EjJLSXKr zcgIyu8^4LjV!$sOrQ8o`{&nO;SrDR{nPJ!jSL>$X2|znhJl~VdB`4_=J52DabJ-WE zK)~eUkr$ol-+|7(SKq2cyB2_EqMvT57R4i%`oF!b3+F6m)lC2CRSP??Ma=K?8NOy* z+9*(KN6!f93-L65qKW*R;&)p-ZEaS3+&pwi5EX-N7>!iV4twnqJ-pYi!F4_GB_FE* zrELwpc8y<37I6?_OR9dZ;ct0tbdCcC7c1bgZ@55+H_wt^1(gU2mQfKj23pZ2{o$bL zqnxN%$>Ak3*li``Spn8A#5r}~f~hKO@q+PmF%9nDWu*|}>BvYI@fz$eU}YZ~);Q52 zm+IuZo7-=TQPOxee?f2{ozX8xFkK7NI6k z{IR*?`u^~Cb2PvHkq zA}WH_eAWYJUu;#H7x^4aUn-JTAP|W6-^br-gTNVzwJx~=sE7iGoo~ps^>6jjMbWqo zV#SK|uAkRxRjuvlps69 zSXj!u>(a^k&j|MS==&V+vVBQ-j$R4s*`lU=CR_Jb2(O6a6sCxiJc|l^?K?p);(I_D z`NneaHanurwl9|Y&G4u25>JZh%brNT;$6PUx8)qGG}0X+&6vQ>8Ah4$)dTcyj{6H*yCc%1@UJ&7sYaUL zJb_=c8EmSBzU8m{^E%@z2b8Je{WIYGKQx_XT$BI%_5m3k0y0v%WTQn&QfZJ7#x}wY z7~M)pcZ&$p9SXvL(Iv5w(jg5}f(QcAsKmYR@Bg|VZF{uOw(E86Jdg7@-lyaTz%6Q{ z=&r3a9pZtvUTYTjpfD5Sf#$_2r79$V0LXD)+V(xouxnxFOM02Q$n3LUjsbmK;Dq<& zl%&4a+oK>IzZ3mu38PwlDrpqK;@#9@R1S9)bS85nY!el`jaq9dMv=n8 zbpm&?hb5EsFyR5s=Ngm`k@~|n+mWj(^%S3&cH&r4C2P4%-XGS*F~-oiD$|BsOccc} z(SFf-|4+-#?tm`V|2K7cTuDIE*`Dtok0#{lUh@wx<;U?SnX?xS&^N~g3{Fu8ZtA|@ z+*afrG3jmiyUC|d4Qav;>(+EZMWN~94>9=3$+O>)x(`^-X>7c678QQUd;mb~9&s5- zzZpicXo-TA_+Eon%4)^wAw(}KVh+qPgBP{h1|@Mu=_fzJX5*i@^gRUt6}*TY`cQQ( z76721XkpsQThw7KqKZ?x0zv||J!8xEu*zeMQGc@BEldi_W5RqNYyJc$=<+|?1=UzI z9*X>c$CF@`ZrS}T^JfC926b;&>%SFdk4o*HJhF5!AXp}Q49e<&}EA4W!X^oWG2qy6sRO_2BEdltpW zH1J)E|IAOzXGk(REbK+FHeQxY9vUAXu}(29wD{w+_>jGP7?*XR#8I{7FRrR|hAYQ`k1zeY2u0pPiGuRhrl)-_NmB`L843fy(9( zN2+7!y{fneI@$6{lFZD7T<1Owe<{Z?z{cZ5fp*6O29k`Z_Lo?%#A~h)bw0Sdd5p zjmV+0d|7d=T=vq@86@2Q-wTlPB19!koc*QhnDAT9D6X`uER^^c9e-7ydsu^=Er%9akTaF8j; z3sG}RT_G27@7>_a;zYfEZfyLSwQ^#%ijcWgIQP4VC$})UuJB&KKgnd?(D&pZ(rV@J zVRFsq={O>M1iNRGYVZz&yw7|5Wte%3LW+{%7*KB3)&h_okN0&Pojxn0v4F<$1#Of|QnG6}^fvUH70kJ6(d%i;I zJ*txVi1G;AUSTeku)fQY&D`}K5olyWi6oNz-?vUGzEIYqEzS2jiBGE#^$&hP3i&}o z@&d78L&SPZTa$YJ;O}8ssrd&e3d;Y~=HC4j3VGG%X2&Zd6XZIU`>ie{)8!cPCrREh z>aD&=Vs+9+9OIw=q=46R(zZqvuWkZq#>K`2F{_b7VD*;cTT(}6Ud@jw*K9o{;DMzh<4p-%`;DO|?wTckj=iyj26kUa-mS!O6rNci;i<6ImS8)%SV! zHUzC(yEn+A1;EXC-JxZ{8Ysf}{hR1tR=3WkIqF?=v;xT&u9|XaU8x#p&O3Cxc@73A zX=IMnBxA(ZT~L@0t61aR=MxofL>92Dq}`86LLhU;ky1TE-K;189o{xX>X>JSMDc)L zg=?BXuajp`$+PQyi%Se5hcSb^+(?P1g#Yh!oD6UgXL%yOd1x@x^R&dcOxeNy)}~OI8OR+{eRAyqA8y@9x=M_Z~%FDHQ~@N~V4L+b4bN zy{h30ZMYyT@?^hWHEc^F>2OsU^nBHCH~uVIFBAIoZ~uLi zKMH0tmUF`TT@`_McAjc9xr-_Bnmgt(dwP2PR1Fex9-v_WzIe@ye4u7eI!MV=^+2%9 zc0P|R_!BPM`$`s5*90AyJAUTsS0%3q?ptbWqyW7a^K~KD-H4a0S5r30twfEh|M24r<|B=HunpPb`+HeUCqoW-RK{!rZg-4z6~-q&|N-K?EUnIVcvC z*D!_tdpG0hopAPc>0?w3Y4BC8oPrBaXt)7O{rqosxU8`~zo*e7A$w^q^mD|nU&8I~ z$K&tjZraZp1X;cWehR(a*cIsaS{-S;4l)GBQcxcVwS}AbU-`8ZMU^Yakm}MFl1j>o zGC>Gk*lj#PXKxOqq_A|^I3h@N(Ny>qE@2;BGa{bJ2_c$$$5aKTM&$80`+Sb7#T_4; zPq3{PyIJ6d1}1Sd8a{P5OQ3D3d$g6>KyI;wwEz8g|_PNw5i%(>rmmzlBN3iG(VgR_1A0hH7GnSE=0pxc; zLziH%>S>u}P*dfRC%^6=L`gZ|32o*R%xRc!@!a}Cl&(f;*hhNe$m{5Krx+Ve)8w+) z;7IwtZ0jh}X4Rl2DM5AdYrC`*47IJa9y+6B3=IH4cKp7bJW~2PozkXy-Kz0ay!+L$ zZFK5PW{aodjAEnWe@T!L6Ijrd&Qeni0op@U#Nn=)2^Y9!YtJXDF5QR5rUvr_R!yt- z9zPd(-KqzNWZ_*N>1_OX73hrJ6+(J{c7y&RaJz}X zu($TLcy4YuRF&nA+?z#T51bh{yjAWLcJzcY@K;l`>~&PLFB;TfY*@5_ZyQveZuRPD zC9Fg=q^O$o3d7h}PKYMsV+kz77D~5l`H|NRp<-x;&Jpo+Z&}Xh2Hb}x=$>H@7u=T~ zyhtuJ+DR@I3E@*W&Gc6)>hOFh$-{>L5$?29bvQIN4`mju^Bu;l-5gY5Kx~kX_ z3w*GOqOkFMs*7A&ei*5XnptxF69wI$_pTD0gPxPD`ETVdQhD!8b`o;qt)L3M{Yo$;Vp@j|;eL3DpJc2t9KP4m;#;PCNi%exZkk z2p~$`@MLBE?qjs7i54aFng~Y`0<0!zulGLumYWue(iuLESpJ8!p4>G*ptTHG(T7uY z##`&z?~qV>$iXH90(wYtjf*LU4}p6uEQeno<($5zmB+^;&Ip1&lwQX0XM|Bvecnu> zBhr2S`d9>SvQf*FJ~^fqh|X$a`wA<<3;_u$0k@Z=Se(m5 zs#X|9qFXRBP5|syb$AcMKIKG_KA?rsOs!hsa_K8KA*?%#Z5({9l%TetQ_a4B5ZOxKKh`JCvwX>+tiLq39i!gmPl=2uF&D|NeKo_FlC9)4x z(c_9O_+iCFRGrq!(QA7fm0>Th!<5B7j!7!4ry^NDC=FoU3A-He`j@fk+iH~R~ z<;0K6|5kCe8k#GsIDx)1shhWR3pROIGV^I7>Ci3`ivPL^FV?SWLUd~cZ4`Ws=~BNq zU2KYVB{uj}HaZ$bQXFI7zvoai?mc*f)uv?n#&@o3lo3X3$a}D(`spdp|KwZKOrZos zETeSna9H}|cr*{b!jH)K(7_cIg`r{tX#tL!Cuxa5+~8t>=D~JMMsbFb)rfRi;SZD?as3-NCAB%8m)6*Yd)NE0@u;euOY1 z&1uO(6bA{^cMq)xO>X}&Y>~{`*L9`#XHCp`w%gLkZ_0A5E>c~L-IH8%$A0MTkISRY zBBwb(LfHF`SY$cQl`RYy(W?%XM&$5S_0> z4I7wytcTZ$n16)D&D3{sfoNm*7VJ@^8os4bvu(}aMAC(N(z_lgbBVmoV{EF~foLT> zLlY)!|LMziIsb>XW}i{M8H!PhKIAj8!?yV@9YloBU{{t#xI;Oz9@i5BI;^sREYVmASE?^Hv`D~$09G3MZ=hw}!(7DS+-e0|EmwPgHA zUql}JbRvRqcy|z0WzJiDAP>qQyg%@s^KD01pUpjAJGA+`nd>W}|2mGFe?{4g*!jr5 z3-_nSp}QRycY!%F?%&3H8W#Xoo5L%lbaU8<_O6F|PytY{Gz>?Szyn{DOny&sewj9- z9}41uSGvKuXJL~bs=G-TLyPHCFHu^9)iZP`ed6lleDW&fo})yiJ{TU0&>2agO-TBf z_K~-0MkPbJEGGh(^8_<*Lo^d$0X>2K9q)*~kQ{ajOCy}xXbQ;Tc9cj+^9UycSxpU1 z;BQBtd+2A~tKE2Hb|j(1EnL>?aL8C2M00rSg2mtN&&pjUm<$3HrGgh*ZGgH%V`KfE z8Dy6NTfZ&Fw|;Z)x8^^C!q{h(Z&b_YU;F_W+_E6HKSnp>WkE^=K2uAGApZ1!SQ+J^rGJI$i(cz0(undLDslmSe$lv>f{afE*Q$tMlJ`>YeXwZiXC@2j70!Go%-) z7m}rCkfJ%V9*EjF(1n6Z`Gkvqn&1LE(BE>8>`1rs8CtLIOGOP)-|bpI`D0=9$y`o$ zjHoP;DhkNMnz2IhFXLy@KT&0{vQ!8k4wv(;g6aDSi-RY>41}&*haAQVq6QW(l2|1R zM!a=ZgRYTqwyQSO`<(MYm2*BRRK!m&3h)4%!dL$N<>k>SK23|b8WnhJFTfYs&og7u zXwUdROItC7=uz1a2KSHh zYUy?J7z87o2s8`BW&0E3pJeo?Ij5)RhMmxvsQWLdl%?2c+4;wq5&`JG2W)C%cd<#o z+X+|FAd9=h?!%1mbco3!qBIQC7ZN@9-w&BrO7l^261HHSJbsg>7*aD%3-X1dhert# z5GUrCvIrV0r2BNm{4s9`p}-|}AeJ|7zzqF1O1xt+HW!_842 zUO(x^G42I_jQuoi487(cDJUcqOdKO#QXY@u);JL5iD-xNpp>TeO(ba#L zJfJSU*yA{9I?P1xJuaHPkZX6$?FZb3f!fRaIRKDiaKcy1N$aPN?4$NI64G?>It^OU zZ7uc&&8JI7`Th*g%Xoe+ieS7@6Uz)Ha)do^l6_EfAw%N#p-q4uVJQ~~V2%>Mq`{PT zsugYw35x>9Cf-`P;wUaCG&5T+kSh#z&7_`i?TBwaEFZO`cxOkkmL{lccS!|wXu8Y& zpF$bj5VGOIP{zqugVy}}OLwa2V6Y_}jl{d=(yHM{96Lkd(uYqyB{12(xN!cS7Erjx zi{V^uo8_XxUoxdP;_Y4lr25oF&sj@uEEAt}@Kw+SpyBIX&7gf%CFfP6U`;mO3I- z)LNcDjq~@xqYHgz?PrF3dH(N&0#NPf?Oc%b6pM%41FD&BKJ~f@ht(9Ebf&i z4KxMfPl@;wxX-$h&*F9@7vx{Nff?Zb*bIiFl_F;&Y2w}zD-R}{D#ifHCp5kd80m9C zw*dFi)DLBay|Q<%zJ=TddD_IS$^_i}T2P8gL-M_73mAGI`AxI|%A`seh{y))@qEUI zKh%TXSb*IfRdIVGFId#U#%52YxSgNe5Q;J-XjhHtb2RGJarfZ}J)AbMgz0Cc zyp#BF{!TOg7IzO4&FwG=P=5T|L(vcCZwOKBX}?2D31uM2h|=j6KAeb;+aGML07GAH z6I6J7&MI(Lluk}B?xBe=lUTdZ~IIaT0S5rviKi=vZw%$V|&oUkusW_G>bKnmC@r)tIR`w@t^ z<jBQ5YKKZlbz3v>sMiu4Opi-D5^#d}l!c$w$Zk?fdpTC_-;$!{c|e9_w1R+Nkn`WikV3)WmN-dY4QqCn*ZAFL+&9q(a>si zy%10?DOI*z(SWhPJ4N|BjE>HY+xhkQR$UtZGFK_EB6^hp!x4}uUFQ5)=S1a0wWMU= z!Im*QrtFU1m z&RBC7(?bMtP|?L-9*MDJOh}P3+Jzw^_!{Zbk|t2am|(9KI6|Mb;`nG7g{Qr2)4GDe zuM+TuGSRG&9d1JaS=6vgT6|>wQnX`k82O+)@&a{#2z!6`!(+1ecI-uuH+14#wqlnt zJ~~j{F1F%rcKA&Ny}a+5DS-Uc=P>&cg1EkKSfqI3tHfB*yqsxT#t+j+J(rO(g+>ai zIieO^5*I_T!Ta4rm_;}-CceoF{$`(|rma@~2^}RO?^D&y@T5~ejNI{^%{vT@lo}&Z zL%CFsliaH1_)Icdch&(uT#>7r1p(r5=xruJ(zu2CUrV)ZQBIsE3{ijuss$YuFS`S|idw1#-@_+DN zvfLp)Y7V0Z@Y#= z1DBBX6dqNzKqk7({Q^cG-+C$gj}tM}>11#Uw16i4bpzJ2&8x#&t$a!Ba(g^OPD4%> z+kPM{=8j|_zk7|)|MLgC%cf^JfUMG;L3kfldz;zX*-=2A^MmcGMM~3NG*G1n#8rFU zGvqhON^xS^nvOBIOt5?U4c|`Jpo8xvya%jlm zCP|Vv%Yjf-?ySkh*~rKURvnsFg*}#T+ElKWnsRa!)22+vB-|?6^xxcRdI42sha^)_ zF2cq~LJgh~ASA2-B2@<~Rq>Oft*!5yr+>HybTnxHAW#55hC{X^rTZ#i=7x5&C6_?d zNXLXjM+B1yy{jnYY#3Yy$^@e%F`{itNKTa&A zVdQYqF?Lxly^NPfHq5?|b2v#Les9 zh40o8(jsZo^h5OJWEn2ZB2dGoZsFonq_OI@kP$Mn67s-oD~NCmS?#?yyI+ft_?Aul z3}2h!qP$3DsZBFPt(YL}>CJS8K@17r@^8|KSdxdvwDk1!*aR+q+A8?CEa2t_SBQ?C zSitl@q@>t`4!VaY8u~Z_?|PUP$VXv5O6udQd}<)yYTn-^d{jS(ls265D?}rrgzfor zEMTa_WlM!}R%MblI+fB>?ekQ|9F6UG{%GgSC~5Nl>$%ZgHnTU0C#YBUt|qRv%cPSY zgc-L|-cGp`d-daPbBOCn=i1%b(PzV{weFmlA%g#(GEWO@Yr#CLvXD#mqh@dM+IpY_ zDy1r8Vx^qD32v3?mNdZ|ggiZujwpeMjzD~BJT`~Y8SU1D_=%Q9LlHCcv8BmOWqmCb z^wYm1bQ7SXWqAQCbrdggUMpMnBoFJFS}r`B%^LbXKEsD-OqcDbXZPjN@FO^fe>ubK z+43-h59F1+96-)U$RnqXez9TiR){($OWN=gXsT-Y)Ty#9tc*V2rYIt7ZV@P;90 z9^;A|!rN8w(km(o(@oA(=FV!<#SMMzCSjWv-6DAxIAyK=#CN3NEoEE6#1_%8cSb?i z?aJZqq?)-_0`daT&0_-Re?vWsr{!Yk_w;BWj_U$>QBiATt~kk|X9XmhnNHOiJ~|Rb z`^C?k=c@Nj-VZPTy?b>g@^GJhjvM?OPUeg!)UiVX13!}wCqkg2M^STc7_n-m(iDcP zz16UYsSVtQoA_v?sR=O#+MPYFv_!wrM%BglbwpHoNNx%k)A(BI?9qY|5^xu3eb{bG({tEG|?q8FA zru*&;GHcdjVc5OM3(>J^aa~FmF)!Bn?W6miBw?Vkw^#k)fufO{h*PZ^l%T?hq)G$t zcqKOxLO-Mg*8crfFW!Zzp4M-`eoV)LXzym+Pcz5Y^tm%ZMMW3fRoHDO^Z&Gd@KmzAvS>_wGyrvs4#`RomS3UUe^9X0SMJE;kY$e#7Np#sv?ss%+kw!SKm zDZ)n*Cx8~~ytJNN-8pl;HJtZJWt<|C?mNarv1ss`rK_Z6%IcY>BO14Tt)mvLhwk-_ z(wMk$C-m&jy8bSoh&gCKESgxE^|8vNAgWLcGNRH05Y9LT(N&vFXZt_s?Tt!5k*zEC z2P6P-;Vu(Y@Jk}5eoE+46Zjq@nbqf6GD<`03dW=-G5iC^vuHxaB0)YuEpiee%I67B zKkIMeaDWDhX+d)jl$TMLhg}p1{WiUedwQWe}6Ax*b4be0eELl z%XnunIawvxyJTO;IT_8G9lAxWD&)G@fOUj%Q|A2lb8w5m!B5er&2E;+E;UnlC`dTI z2Tq2*+&jB*rQ47so8bzxia;f8Rbfww+^xykEaMZY)=8&JF}8CwO(cZrUDXzN9p*+k z7sT7>7uv08E1?BefhLom3*u)C6C9`1a#H`_3ov&1LsgTuTB6DYUh&ehEP5LT@Z%=c zqEHp`(0qsgV)jPUW|qSH&POthTKpuw_aux)OAJK4M#RCu80nPKQA#D`#WKL1M?XNVuk5e$q zrCa%evyEWeqG}F*GKckMb6*DVTS97UK@dJB?&f@)&`N-gLn{A%rM&;cYB9=q%~1G zlhC@CLPcG#dN@hdiP((3{SDF;1BdZ2MrJaywgt#wi3BeVet4O$5tp%WjMvbeRa@@t z0ZBxjUPnUFcyqx(7Bqf@B*6pwrsPM*LRhdeZ_UA-7r~snhgCbYv#N(_plpoaucgVV zC7SJf(7evNbYR`1<(pfHi|t8M(=Qw$W2pTTO|R5tsz?>Plu+^rHRgv%viUbE;)FaT zXM(Cf3Bswk$y6Nybn>C2R6J_DWU{zaS*{^2S?*M|=2+3lG6zsqO&GsxS8(O3c~`|^ z&%(dumu^Ih*Z*dsmcJ)Qeh)lot~meJ=q#360xp)$ZO2yOsQrC4PWChKqo2Qjr_1d7 z0NkRgLm7A_oslh`GT`XerhQCbMvI=e_Q*WV2A}4DR7}DR`l_iISL3Xq2V<#OUY{G2by00rZW6 z&o2*4U;lS!rf>Wn%3S8$7VOjhz=&GhZ7>;Gd{e$w6CXns*SI@L5fxSb5JKj>A*y(q ztqY@75{l;johE({h>51Xf(14I-7pI7TW|R_eb%rm1A3Xh?(?hv!l#gBuF=Yt51l_! z79ZJJY&NgQc*|FlXQba%7s!UpEFfKbJwT%NdDnu1*x-ih|*^O1B!|Ve;X!% zpiu5VsrFIM`T<6|;jzFgWU#l?0VoZLjy@MT5PN$q<+yN$EsHRiQx3ZL`4?u?R{f2V zhMeZL`(RT4MdBV@OwuK%HxN46|Ig}g)AK9%(=+AY+aWia{Fhy~imp7@?tV8$mbn71 z2~unnf2L)-XUYt8?L}SdAC|q~#W*ebp!d7u-{|WygjnZ!0?(}2MNs42w~efwoed2$ z9u{kcHEgr(DTI~jYb1{C`=Yb=z<$?P6fr#`q^3{__?DkSVp?dF=EHRHjOy@0^xt*^ zWkubba8*lyD(rCIfn9PqGut!!ooS4BizKvFhMb}DR?d6(9#5)*-~a`*i&FtIX+8b% znfEk>p|Vr8h<1Xjo6D$nb$>J|EX@bJKS{CG*co%D zk{GRZl~N;s9$VpMwpAV1@rCxlx?NZh za^87vcn@>%p#4XFz))i9K)`vEKPx^uHqq$^m&p$tqK%rR5A(&?Ynp%R&{p~$3f!5kE=NNIhYEi-dFxA z>!ye%8nYjr?94U_JxL>P_^>q3H{wMG91+HFKiSIAyq2SJ@Yf>v8Ul! zfuw?#1VQF*GNM^gG9=wD3GcxMIW$HU4qC%HnkKC-FhI}vpffXRtmvC3qnoq0jnSf* zjH*ZEoV>^_E?%#&-b5ebt3jA2Tv-@8{SZO}zQ+Wp+T9J!xAcGzrOS$HMgZhUXku;h z94-ExcV=*5{emuLbw4yE!jdhaRe0*V&ej3@>{G&oGrKfBRHTG@Ya8+n(ey=s%ZpJ$ z=d1M|NR~B#!z1u;C|@z)?O|MlupC$vP5-0i%t!)HRcl)0v&iB4UrGGowhAEvfaqQ$ z`(A+18ur5mCB_iPRot5>Hr;>c9hRjBRTG3w+3rRoI3o$hL_8QM0s}pa6JN|0LNa>C zhs87$KNA24KQ1wnk~;m3^ay(VLtm%mJ0dh8tA25j}k~ zmR_JCw}Rj7;<#$el`ex1E-rIzF^9S+(lj|xJi$7V7de>?$2sUx40CUFrvlSm@W=ii=Y!KdT0!`Kio$I#a-lf`$RiM-g3M=Us5z7f zluagjG4G`GY+I7XnWvn>urYU#`EwRohz~jbYn4Q}ZYaWJMG$>C^gBORc|Zh@OiGzH z19+?Q6@7`&L%UAom3VG9|9x?$(#=^-NBtr~#w^bgLi#x!SrLN9?@>%vP z(i1`1{PB4%5TG)ZyfUMELlgeC{ve6L{qMkeZgrP3iln0<|F`yL%0p*?rxo;b$Hs zeTfLVPv5>1oBQL0Q!o=}o)8jrXyeB3c*ZBg;2)s^#WQRSYPNuoI3U|%(VYSZ;W)XP zNL1mJ$4|5#{8yA|C1j;5lFbbGkC+&bb1Qgs9x_48(5ao-8U@J6Z%Q#zkKA(n_8GSa z=jteJLj{MZndW^f=#lSaN$WGZ-?dh6ocLcB0r+N_GoJX4wECDK8}l@A5$K(b2vTdA zUJ;>70d2P(ltg+9V^CPWevk&C9@Ff4PcljM1kH3^!1KWk{Y`&}S;DL*`p%)=e9@D{ zO=4I(KJ&hZnVqi4`Jz+S2MN1F>=-q{AWHrK>dOEsM(Kb8Q^mCtdc1UK!t}h3r)}#d zW9J%G{N>6i-ZJhKC_Q^7b6?ZIFI;UF(3NH_22F0e*f)pIH$NQDR7eKBHG;qGuxuEm z5#Qgf3M@1m6vkNIF)R{G!?!n#i}58ZY;_b*iBrM{XX=fU>aD-ubBmi!&SY$u_N;m_ zKD-==^n_F? z8SO)|lbS7w1N*-hm$5TEe`4J|(;6{JR6x@QY`M#b^{V%Bh=S1Z+X8UL7!TA30NFQ6 zh*X(U=FWx<4Job$K;)WyHGP!Om1+SCVKpXuiqFY;#vMrTy8 z#UD(}X!H?kvnPq+>C;Ro!p#T<`y|2})!h9|Nmvpr0DZ?m94Cj9e}ipbz+@}F z_O42J+wFAj^11n{SLZ~rKfC$yLw$8@89G02*2p!f>s&hcp&VvgxeC$m+n^m_MsH`JuC~yJxmGQ zE|$(Kg)as-9%$4pSUy5vL+49=jYPX(1j8z-s}nC%3BZV%THYxh6Dgi$qO{w)xZ(S;@)%%tfr-z9g3w}-Pt3iF^%1I0(`eGD_hz5h1QR(|d6?fpuFEaRiCZ>ME_=-_9j zfU`*RMVw^)aG!f-KMvy-DItBMS=3(er2q4uZ8IzKEH|MS%qO9YB{ATRTJYZ|vnC5! zE7MJt`vPiruxjwj$0aP7?*x>H6*0|Tf=ZQ-OdM#94{Zp#iuLY__WDoLI9CcgFNw5~ z7U1{ok27OdCg$cjf67TJJ3I5I+oB1E+_uZDUZc7Rs=V@1D-u5w#D<1XbUEztEQ62F z6M=OPp2tJmZGkzXt`f))a%n(IXslIC! z1i$T}RsJf&l)m?9N|$szO%r;Dq`W;p4bUJE^zMZ*&QT5*UlhYpm)mMF*YMAj-{Oft z!pqys*RkmP1|oJIP~I3#W_wlq@2en-GhJNEUoM>UYq^6*K)K}2{8o*K_P#Hd0!o0o z7C-;UDDtS$hR&{9UL-wh$T2HVRLit6E9znMq^jBvT zH{$G&*gv=-=_-|ozUMx<{T+6YC(+ATq&FVf(jdf{t4iLll|}7uAS0m%7NQPRU6me< zf!W⪙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 E1JgBQu>b%7 diff --git a/public/images/items/golden_net.png b/public/images/items/golden_net.png new file mode 100644 index 0000000000000000000000000000000000000000..5fea1ee7dba10d0544babfa6de08102cdfe621c2 GIT binary patch literal 561 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 literal 0 HcmV?d00001 diff --git a/src/battle-scene.ts b/src/battle-scene.ts index 50fcad4f417..17c18c3b2fe 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -13,7 +13,18 @@ import { Arena, ArenaBase } from "./field/arena"; import { GameData } from "./system/game-data"; import { addTextObject, getTextColor, TextStyle } from "./ui/text"; import { allMoves } from "./data/move"; -import { ModifierPoolType, getDefaultModifierTypeForTier, getEnemyModifierTypesForWave, getLuckString, getLuckTextTint, getModifierPoolForType, getModifierType, getPartyLuckValue, modifierTypes } from "./modifier/modifier-type"; +import { + ModifierPoolType, + getDefaultModifierTypeForTier, + getEnemyModifierTypesForWave, + getLuckString, + getLuckTextTint, + getModifierPoolForType, + getModifierType, + getPartyLuckValue, + modifierTypes, + PokemonHeldItemModifierType +} from "./modifier/modifier-type"; import AbilityBar from "./ui/ability-bar"; import { BlockItemTheftAbAttr, DoubleBattleChanceAbAttr, ChangeMovePriorityAbAttr, PostBattleInitAbAttr, applyAbAttrs, applyPostBattleInitAbAttrs } from "./data/ability"; import { allAbilities } from "./data/ability"; @@ -38,7 +49,7 @@ import PokemonData from "./system/pokemon-data"; import { Nature } from "./data/nature"; import { SpeciesFormChangeManualTrigger, SpeciesFormChangeTimeOfDayTrigger, SpeciesFormChangeTrigger, pokemonFormChanges, FormChangeItem, SpeciesFormChange } from "./data/pokemon-forms"; import { FormChangePhase } from "./phases/form-change-phase"; -import { getTypeRgb } from "./data/type"; +import { getTypeRgb, Type } from "./data/type"; import PokemonSpriteSparkleHandler from "./field/pokemon-sprite-sparkle-handler"; import CharSprite from "./ui/char-sprite"; import DamageNumberHandler from "./field/damage-number-handler"; @@ -91,6 +102,8 @@ import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { MysteryEncounterMode } from "#enums/mystery-encounter-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; import HeldModifierConfig from "#app/interfaces/held-modifier-config"; +import { generateModifierType } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { applyModifierTypeToPlayerPokemon } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; export const bypassLogin = import.meta.env.VITE_BYPASS_LOGIN === "1"; @@ -1102,6 +1115,11 @@ export default class BattleScene extends SceneBase { const playerField = this.getPlayerField(); + const mod = generateModifierType(this, modifierTypes.ATTACK_TYPE_BOOSTER, [Type.BUG]); + if (mod) { + applyModifierTypeToPlayerPokemon(this, this.getParty()[0], mod as PokemonHeldItemModifierType); + } + if (this.gameMode.isFixedBattle(newWaveIndex) && trainerData === undefined) { battleConfig = this.gameMode.getFixedBattle(newWaveIndex); newDouble = battleConfig.double; diff --git a/src/data/mystery-encounters/encounters/a-trainers-test-encounter.ts b/src/data/mystery-encounters/encounters/a-trainers-test-encounter.ts index 003dcf0cde1..c6de3130ad5 100644 --- a/src/data/mystery-encounters/encounters/a-trainers-test-encounter.ts +++ b/src/data/mystery-encounters/encounters/a-trainers-test-encounter.ts @@ -19,7 +19,7 @@ const namespace = "mysteryEncounter:aTrainersTest"; /** * A Trainer's Test encounter. - * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/115 | GitHub Issue #115} + * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3816 | GitHub Issue #3816} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ export const ATrainersTestEncounter: MysteryEncounter = diff --git a/src/data/mystery-encounters/encounters/absolute-avarice-encounter.ts b/src/data/mystery-encounters/encounters/absolute-avarice-encounter.ts index 29e84355ace..dc554c440f7 100644 --- a/src/data/mystery-encounters/encounters/absolute-avarice-encounter.ts +++ b/src/data/mystery-encounters/encounters/absolute-avarice-encounter.ts @@ -29,7 +29,7 @@ const namespace = "mysteryEncounter:absoluteAvarice"; /** * Absolute Avarice encounter. - * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/58 | GitHub Issue #58} + * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3805 | GitHub Issue #3805} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ export const AbsoluteAvariceEncounter: MysteryEncounter = @@ -249,8 +249,10 @@ export const AbsoluteAvariceEncounter: MysteryEncounter = const givePartyPokemonReviverSeeds = () => { const party = scene.getParty(); party.forEach(p => { - const seedModifier = revSeed.newModifier(p); - scene.addModifier(seedModifier, false, false, false, true); + if (revSeed) { + const seedModifier = revSeed.newModifier(p); + scene.addModifier(seedModifier, false, false, false, true); + } }); queueEncounterMessage(scene, `${namespace}.option.1.food_stash`); }; @@ -349,7 +351,7 @@ function doGreedentSpriteSteal(scene: BattleScene) { const greedentSprites = scene.currentBattle.mysteryEncounter.introVisuals?.getSpriteAtIndex(1); - scene.playSound("Follow Me"); + scene.playSound("battle-anims/Follow Me"); scene.tweens.chain({ targets: greedentSprites, tweens: [ @@ -431,11 +433,11 @@ function doGreedentEatBerries(scene: BattleScene) { y: "-=8", loop: 5, onStart: () => { - scene.playSound("PRSFX- Bug Bite"); + scene.playSound("battle_anims/PRSFX- Bug Bite"); }, onLoop: () => { if (index % 2 === 0) { - scene.playSound("PRSFX- Bug Bite"); + scene.playSound("battle_anims/PRSFX- Bug Bite"); } index++; } diff --git a/src/data/mystery-encounters/encounters/an-offer-you-cant-refuse-encounter.ts b/src/data/mystery-encounters/encounters/an-offer-you-cant-refuse-encounter.ts index 19bc4d98513..94c004b2617 100644 --- a/src/data/mystery-encounters/encounters/an-offer-you-cant-refuse-encounter.ts +++ b/src/data/mystery-encounters/encounters/an-offer-you-cant-refuse-encounter.ts @@ -18,7 +18,7 @@ const namespace = "mysteryEncounter:offerYouCantRefuse"; /** * An Offer You Can't Refuse encounter. - * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/72 | GitHub Issue #72} + * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3808 | GitHub Issue #3808} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ export const AnOfferYouCantRefuseEncounter: MysteryEncounter = diff --git a/src/data/mystery-encounters/encounters/berries-abound-encounter.ts b/src/data/mystery-encounters/encounters/berries-abound-encounter.ts index 7a464a5fd55..68fd7b90f9c 100644 --- a/src/data/mystery-encounters/encounters/berries-abound-encounter.ts +++ b/src/data/mystery-encounters/encounters/berries-abound-encounter.ts @@ -37,7 +37,7 @@ const namespace = "mysteryEncounter:berriesAbound"; /** * Berries Abound encounter. - * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/24 | GitHub Issue #24} + * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3810 | GitHub Issue #3810} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ export const BerriesAboundEncounter: MysteryEncounter = @@ -131,7 +131,7 @@ export const BerriesAboundEncounter: MysteryEncounter = const doBerryRewards = async () => { const berryText = numBerries + " " + i18next.t(`${namespace}.berries`); - scene.playSound("item_fanfare"); + scene.playSound("bgm/item_fanfare"); queueEncounterMessage(scene, i18next.t("battle:rewardGain", { modifierName: berryText })); // Generate a random berry and give it to the first Pokemon with room for it @@ -143,7 +143,10 @@ export const BerriesAboundEncounter: MysteryEncounter = const shopOptions: ModifierTypeOption[] = []; for (let i = 0; i < 5; i++) { // Generate shop berries - shopOptions.push(generateModifierTypeOption(scene, modifierTypes.BERRY)); + const mod = generateModifierTypeOption(scene, modifierTypes.BERRY); + if (mod) { + shopOptions.push(mod); + } } setEncounterRewards(scene, { guaranteedModifierTypeOptions: shopOptions, fillRemaining: false }, undefined, doBerryRewards); @@ -168,7 +171,10 @@ export const BerriesAboundEncounter: MysteryEncounter = const shopOptions: ModifierTypeOption[] = []; for (let i = 0; i < 5; i++) { // Generate shop berries - shopOptions.push(generateModifierTypeOption(scene, modifierTypes.BERRY)); + const mod = generateModifierTypeOption(scene, modifierTypes.BERRY); + if (mod) { + shopOptions.push(mod); + } } if (speedDiff < 1) { @@ -176,7 +182,7 @@ export const BerriesAboundEncounter: MysteryEncounter = const doBerryRewards = async () => { const berryText = numBerries + " " + i18next.t(`${namespace}.berries`); - scene.playSound("item_fanfare"); + scene.playSound("bgm/item_fanfare"); queueEncounterMessage(scene, i18next.t("battle:rewardGain", { modifierName: berryText })); // Generate a random berry and give it to the first Pokemon with room for it @@ -202,7 +208,7 @@ export const BerriesAboundEncounter: MysteryEncounter = const doFasterBerryRewards = async () => { const berryText = numBerriesGrabbed + " " + i18next.t(`${namespace}.berries`); - scene.playSound("item_fanfare"); + scene.playSound("bgm/item_fanfare"); queueEncounterMessage(scene, i18next.t("battle:rewardGain", { modifierName: berryText })); // Generate a random berry and give it to the first Pokemon with room for it (trying to give to fastest first) diff --git a/src/data/mystery-encounters/encounters/bug-type-superfan-encounter.ts b/src/data/mystery-encounters/encounters/bug-type-superfan-encounter.ts new file mode 100644 index 00000000000..9042ea4b8de --- /dev/null +++ b/src/data/mystery-encounters/encounters/bug-type-superfan-encounter.ts @@ -0,0 +1,654 @@ +import { + EnemyPartyConfig, + generateModifierTypeOption, + initBattleWithEnemyConfig, + leaveEncounterWithoutBattle, + selectOptionThenPokemon, + selectPokemonForOption, + setEncounterRewards, + transitionMysteryEncounterIntroVisuals, +} from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { + trainerConfigs, + TrainerPartyCompoundTemplate, + TrainerPartyTemplate, + TrainerSlot, +} from "#app/data/trainer-config"; +import { MysteryEncounterType } from "#enums/mystery-encounter-type"; +import { PartyMemberStrength } from "#enums/party-member-strength"; +import BattleScene from "#app/battle-scene"; +import * as Utils from "#app/utils"; +import { isNullOrUndefined, randSeedInt, randSeedShuffle } from "#app/utils"; +import MysteryEncounter, { MysteryEncounterBuilder } from "../mystery-encounter"; +import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; +import { TrainerType } from "#enums/trainer-type"; +import { Species } from "#enums/species"; +import Pokemon, { EnemyPokemon, PlayerPokemon, PokemonMove } from "#app/field/pokemon"; +import { getPokemonSpecies } from "#app/data/pokemon-species"; +import { getEncounterText, showEncounterDialogue } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; +import { LearnMovePhase } from "#app/phases/learn-move-phase"; +import { Moves } from "#enums/moves"; +import { OptionSelectItem } from "#app/ui/abstact-option-select-ui-handler"; +import { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; +import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; +import { + AttackTypeBoosterHeldItemTypeRequirement, + CombinationPokemonRequirement, + HeldItemRequirement, + TypeRequirement +} from "#app/data/mystery-encounters/mystery-encounter-requirements"; +import { Type } from "#app/data/type"; +import { AttackTypeBoosterModifierType, ModifierTypeOption, modifierTypes } from "#app/modifier/modifier-type"; +import { + AttackTypeBoosterModifier, + BypassSpeedChanceModifier, + ContactHeldItemTransferChanceModifier, + PokemonHeldItemModifier +} from "#app/modifier/modifier"; +import i18next from "i18next"; +import MoveInfoOverlay from "#app/ui/move-info-overlay"; +import { allMoves } from "#app/data/move"; +import { ModifierTier } from "#app/modifier/modifier-tier"; + +/** the i18n namespace for the encounter */ +const namespace = "mysteryEncounter:bugTypeSuperfan"; + +const POOL_1_POKEMON = [ + Species.PARASECT, + Species.VENOMOTH, + Species.LEDIAN, + Species.ARIADOS, + Species.YANMA, + Species.BEAUTIFLY, + Species.DUSTOX, + Species.MASQUERAIN, + Species.NINJASK, + Species.VOLBEAT, + Species.ILLUMISE, + Species.ANORITH, + Species.KRICKETUNE, + Species.WORMADAM, + Species.MOTHIM, + Species.SKORUPI, + Species.JOLTIK, + Species.LARVESTA, + Species.VIVILLON, + Species.CHARJABUG, + Species.RIBOMBEE, + Species.SPIDOPS, + Species.LOKIX +]; + +const POOL_2_POKEMON = [ + Species.SCYTHER, + Species.PINSIR, + Species.HERACROSS, + Species.FORRETRESS, + Species.SCIZOR, + Species.SHUCKLE, + Species.SHEDINJA, + Species.ARMALDO, + Species.VESPIQUEN, + Species.DRAPION, + Species.YANMEGA, + Species.LEAVANNY, + Species.SCOLIPEDE, + Species.CRUSTLE, + Species.ESCAVALIER, + Species.ACCELGOR, + Species.GALVANTULA, + Species.VIKAVOLT, + Species.ARAQUANID, + Species.ORBEETLE, + Species.CENTISKORCH, + Species.FROSMOTH, + Species.KLEAVOR, +]; + +const POOL_3_POKEMON: { species: Species, formIndex?: number }[] = [ + { + species: Species.PINSIR, + formIndex: 1 + }, + { + species: Species.SCIZOR, + formIndex: 1 + }, + { + species: Species.HERACROSS, + formIndex: 1 + }, + { + species: Species.ORBEETLE, + formIndex: 1 + }, + { + species: Species.CENTISKORCH, + formIndex: 1 + }, + { + species: Species.DURANT, + }, + { + species: Species.VOLCARONA, + }, + { + species: Species.GOLISOPOD, + }, +]; + +const POOL_4_POKEMON = [ + Species.GENESECT, + Species.SLITHER_WING, + Species.BUZZWOLE, + Species.PHEROMOSA +]; + +const PHYSICAL_TUTOR_MOVES = [ + Moves.MEGAHORN, + Moves.X_SCISSOR, + Moves.ATTACK_ORDER, + Moves.PIN_MISSILE, + Moves.FIRST_IMPRESSION +]; + +const SPECIAL_TUTOR_MOVES = [ + Moves.SILVER_WIND, + Moves.BUG_BUZZ, + Moves.SIGNAL_BEAM, + Moves.POLLEN_PUFF +]; + +const STATUS_TUTOR_MOVES = [ + Moves.STRING_SHOT, + Moves.STICKY_WEB, + Moves.SILK_TRAP, + Moves.RAGE_POWDER, + Moves.HEAL_ORDER +]; + +const MISC_TUTOR_MOVES = [ + Moves.BUG_BITE, + Moves.LEECH_LIFE, + Moves.DEFEND_ORDER, + Moves.QUIVER_DANCE, + Moves.TAIL_GLOW, + Moves.INFESTATION, + Moves.U_TURN +]; + +/** + * Bug Type Superfan encounter. + * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3810 | GitHub Issue #3810} + * @see For biome requirements check {@linkcode mysteryEncountersByBiome} + */ +export const BugTypeSuperfanEncounter: MysteryEncounter = + MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.BUG_TYPE_SUPERFAN) + .withEncounterTier(MysteryEncounterTier.GREAT) + .withPrimaryPokemonRequirement(new CombinationPokemonRequirement( + // Must have at least 1 Bug type on team, OR have a bug item somewhere on the team + new HeldItemRequirement(["BypassSpeedChanceModifier", "ContactHeldItemTransferChanceModifier"], 1), + new AttackTypeBoosterHeldItemTypeRequirement(Type.BUG, 1), + new TypeRequirement(Type.BUG, false, 1) + )) + .withSceneWaveRangeRequirement(10, 180) // waves 10 to 180 + .withIntroSpriteConfigs([]) // These are set in onInit() + .withAutoHideIntroVisuals(false) + .withIntroDialogue([ + { + text: `${namespace}.intro`, + }, + { + speaker: `${namespace}.speaker`, + text: `${namespace}.intro_dialogue`, + }, + ]) + .withOnInit((scene: BattleScene) => { + const encounter = scene.currentBattle.mysteryEncounter; + // Calculates what trainers are available for battle in the encounter + + // Bug type superfan trainer config + const config = getTrainerConfigForWave(scene.currentBattle.waveIndex); + const spriteKey = config.getSpriteKey(); + encounter.enemyPartyConfigs.push({ + trainerConfig: config, + female: true, + }); + + encounter.spriteConfigs = [ + { + spriteKey: spriteKey, + fileRoot: "trainer", + hasShadow: true, + }, + ]; + + return true; + }) + .withTitle(`${namespace}.title`) + .withDescription(`${namespace}.description`) + .withQuery(`${namespace}.query`) + .withSimpleOption( + { + buttonLabel: `${namespace}.option.1.label`, + buttonTooltip: `${namespace}.option.1.tooltip`, + selected: [ + { + speaker: `${namespace}.speaker`, + text: `${namespace}.option.1.selected`, + }, + ], + secondOptionPrompt: `${namespace}.option.3.select_prompt`, + }, + async (scene: BattleScene) => { + // Select battle the bug trainer + const encounter = scene.currentBattle.mysteryEncounter; + const config: EnemyPartyConfig = encounter.enemyPartyConfigs[0]; + + // Init the moves available for tutor + const moveTutorOptions: PokemonMove[] = []; + moveTutorOptions.push(new PokemonMove(PHYSICAL_TUTOR_MOVES[randSeedInt(PHYSICAL_TUTOR_MOVES.length)])); + moveTutorOptions.push(new PokemonMove(SPECIAL_TUTOR_MOVES[randSeedInt(SPECIAL_TUTOR_MOVES.length)])); + moveTutorOptions.push(new PokemonMove(STATUS_TUTOR_MOVES[randSeedInt(STATUS_TUTOR_MOVES.length)])); + moveTutorOptions.push(new PokemonMove(MISC_TUTOR_MOVES[randSeedInt(MISC_TUTOR_MOVES.length)])); + encounter.misc = { + moveTutorOptions + }; + + // Assigns callback that teaches move before continuing to rewards + encounter.onRewards = doBugTypeMoveTutor; + + setEncounterRewards(scene, { fillRemaining: true }); + await transitionMysteryEncounterIntroVisuals(scene, true, true); + await initBattleWithEnemyConfig(scene, config); + } + ) + .withOption(MysteryEncounterOptionBuilder + .newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT) + .withPrimaryPokemonRequirement(new TypeRequirement(Type.BUG, false, 1)) // Must have 1 Bug type on team + .withDialogue({ + buttonLabel: `${namespace}.option.2.label`, + buttonTooltip: `${namespace}.option.2.tooltip`, + disabledButtonTooltip: `${namespace}.option.2.disabled_tooltip` + }) + .withPreOptionPhase(async (scene: BattleScene) => { + // Player shows off their bug types + const encounter = scene.currentBattle.mysteryEncounter; + + // Player gets different rewards depending on the number of bug types they have + const numBugTypes = scene.getParty().filter(p => p.isOfType(Type.BUG, true)).length; + encounter.setDialogueToken("numBugTypes", numBugTypes.toString()); + + if (numBugTypes < 2) { + setEncounterRewards(scene, { guaranteedModifierTypeFuncs: [modifierTypes.SUPER_LURE, modifierTypes.GREAT_BALL], fillRemaining: false }); + encounter.selectedOption!.dialogue!.selected = [ + { + speaker: `${namespace}.speaker`, + text: `${namespace}.option.2.selected_0_to_1`, + }, + ]; + } else if (numBugTypes < 4) { + setEncounterRewards(scene, { guaranteedModifierTypeFuncs: [modifierTypes.QUICK_CLAW, modifierTypes.MAX_LURE, modifierTypes.ULTRA_BALL], fillRemaining: false }); + encounter.selectedOption!.dialogue!.selected = [ + { + speaker: `${namespace}.speaker`, + text: `${namespace}.option.2.selected_2_to_3`, + }, + ]; + } else if (numBugTypes < 6) { + setEncounterRewards(scene, { guaranteedModifierTypeFuncs: [modifierTypes.GRIP_CLAW, modifierTypes.MAX_LURE, modifierTypes.ROGUE_BALL], fillRemaining: false }); + encounter.selectedOption!.dialogue!.selected = [ + { + speaker: `${namespace}.speaker`, + text: `${namespace}.option.2.selected_4_to_5`, + }, + ]; + } else { + // If player has any evolution/form change items that are valid for their party, will spawn one of those items in addition to a Master Ball + const modifierOptions: ModifierTypeOption[] = [generateModifierTypeOption(scene, modifierTypes.MASTER_BALL)!, generateModifierTypeOption(scene, modifierTypes.MAX_LURE)!]; + const specialOptions: ModifierTypeOption[] = []; + + const nonRareEvolutionModifier = generateModifierTypeOption(scene, modifierTypes.EVOLUTION_ITEM); + if (nonRareEvolutionModifier) { + specialOptions.push(nonRareEvolutionModifier); + } + const rareEvolutionModifier = generateModifierTypeOption(scene, modifierTypes.RARE_EVOLUTION_ITEM); + if (rareEvolutionModifier) { + specialOptions.push(rareEvolutionModifier); + } + const formChangeModifier = generateModifierTypeOption(scene, modifierTypes.FORM_CHANGE_ITEM); + if (formChangeModifier) { + specialOptions.push(formChangeModifier); + } + if (specialOptions.length > 0) { + modifierOptions.push(specialOptions[randSeedInt(specialOptions.length)]); + } + + setEncounterRewards(scene, { guaranteedModifierTypeOptions: modifierOptions, fillRemaining: false }); + encounter.selectedOption!.dialogue!.selected = [ + { + speaker: `${namespace}.speaker`, + text: `${namespace}.option.2.selected_6`, + }, + ]; + } + }) + .withOptionPhase(async (scene: BattleScene) => { + // Player shows off their bug types + leaveEncounterWithoutBattle(scene); + }) + .build()) + .withOption(MysteryEncounterOptionBuilder + .newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT) + .withPrimaryPokemonRequirement(new CombinationPokemonRequirement( + // Meets one or both of the below reqs + new HeldItemRequirement(["BypassSpeedChanceModifier", "ContactHeldItemTransferChanceModifier"], 1), + new AttackTypeBoosterHeldItemTypeRequirement(Type.BUG, 1) + )) + .withDialogue({ + buttonLabel: `${namespace}.option.3.label`, + buttonTooltip: `${namespace}.option.3.tooltip`, + disabledButtonTooltip: `${namespace}.option.3.disabled_tooltip`, + selected: [ + { + text: `${namespace}.option.3.selected`, + }, + { + speaker: `${namespace}.speaker`, + text: `${namespace}.option.3.selected_dialogue`, + }, + ], + secondOptionPrompt: `${namespace}.option.3.select_prompt`, + }) + .withPreOptionPhase(async (scene: BattleScene): Promise => { + const encounter = scene.currentBattle.mysteryEncounter; + const onPokemonSelected = (pokemon: PlayerPokemon) => { + // Get Pokemon held items and filter for valid ones + const validItems = pokemon.getHeldItems().filter(item => { + return item instanceof BypassSpeedChanceModifier || + item instanceof ContactHeldItemTransferChanceModifier || + (item instanceof AttackTypeBoosterModifier && (item.type as AttackTypeBoosterModifierType).moveType === Type.BUG); + }); + + return validItems.map((modifier: PokemonHeldItemModifier) => { + const option: OptionSelectItem = { + label: modifier.type.name, + handler: () => { + // Pokemon and item selected + encounter.setDialogueToken("selectedItem", modifier.type.name); + encounter.misc = { + chosenPokemon: pokemon, + chosenModifier: modifier, + }; + return true; + }, + }; + return option; + }); + }; + + const selectableFilter = (pokemon: Pokemon) => { + // If pokemon has valid item, it can be selected + const hasValidItem = pokemon.getHeldItems().some(item => { + return item instanceof BypassSpeedChanceModifier || + item instanceof ContactHeldItemTransferChanceModifier || + (item instanceof AttackTypeBoosterModifier && (item.type as AttackTypeBoosterModifierType).moveType === Type.BUG); + }); + if (!hasValidItem) { + return getEncounterText(scene, `${namespace}.option.3.invalid_selection`) ?? null; + } + + return null; + }; + + return selectPokemonForOption(scene, onPokemonSelected, undefined, selectableFilter); + }) + .withOptionPhase(async (scene: BattleScene) => { + const encounter = scene.currentBattle.mysteryEncounter; + const modifier = encounter.misc.chosenModifier; + + // Remove the modifier if its stacks go to 0 + modifier.stackCount -= 1; + if (modifier.stackCount === 0) { + scene.removeModifier(modifier); + } + scene.updateModifiers(true, true); + + const bugNet = generateModifierTypeOption(scene, modifierTypes.MYSTERY_ENCOUNTER_GOLDEN_BUG_NET)!; + bugNet.type.tier = ModifierTier.MASTER; + + setEncounterRewards(scene, { guaranteedModifierTypeOptions: [bugNet], guaranteedModifierTypeFuncs: [modifierTypes.REVIVER_SEED], fillRemaining: false }); + leaveEncounterWithoutBattle(scene, true); + }) + .build()) + .withOutroDialogue([ + { + text: `${namespace}.outro`, + }, + ]) + .build(); + +function getTrainerConfigForWave(waveIndex: number) { + // Bug type superfan trainer config + const config = trainerConfigs[TrainerType.BUG_TYPE_SUPERFAN].copy(); + config.name = i18next.t("trainerNames:bug_type_superfan"); + + const pool3Copy = POOL_3_POKEMON.slice(0); + randSeedShuffle(pool3Copy); + const pool3Mon = pool3Copy.pop()!; + + if (waveIndex < 30) { + // Use default template (2 AVG) + config + .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.BEEDRILL ], TrainerSlot.TRAINER, true)) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.BUTTERFREE ], TrainerSlot.TRAINER, true)); + } else if (waveIndex < 50) { + config + .setPartyTemplates(new TrainerPartyTemplate(3, PartyMemberStrength.AVERAGE)) + .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.BEEDRILL ], TrainerSlot.TRAINER, true)) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.BUTTERFREE ], TrainerSlot.TRAINER, true)) + .setPartyMemberFunc(2, getRandomPartyMemberFunc(POOL_1_POKEMON, TrainerSlot.TRAINER, true)); + } else if (waveIndex < 70) { + config + .setPartyTemplates(new TrainerPartyTemplate(4, PartyMemberStrength.AVERAGE)) + .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.BEEDRILL ], TrainerSlot.TRAINER, true)) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.BUTTERFREE ], TrainerSlot.TRAINER, true)) + .setPartyMemberFunc(2, getRandomPartyMemberFunc(POOL_1_POKEMON, TrainerSlot.TRAINER, true)) + .setPartyMemberFunc(3, getRandomPartyMemberFunc(POOL_2_POKEMON, TrainerSlot.TRAINER, true)); + } else if (waveIndex < 100) { + config + .setPartyTemplates(new TrainerPartyTemplate(5, PartyMemberStrength.AVERAGE)) + .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.BEEDRILL ], TrainerSlot.TRAINER, true)) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.BUTTERFREE ], TrainerSlot.TRAINER, true)) + .setPartyMemberFunc(2, getRandomPartyMemberFunc(POOL_1_POKEMON, TrainerSlot.TRAINER, true)) + .setPartyMemberFunc(3, getRandomPartyMemberFunc(POOL_2_POKEMON, TrainerSlot.TRAINER, true)) + .setPartyMemberFunc(4, getRandomPartyMemberFunc(POOL_2_POKEMON, TrainerSlot.TRAINER, true)); + } else if (waveIndex < 120) { + config + .setPartyTemplates(new TrainerPartyTemplate(5, PartyMemberStrength.AVERAGE)) + .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.BEEDRILL ], TrainerSlot.TRAINER, true, p => { + p.formIndex = 1; + p.generateAndPopulateMoveset(); + p.generateName(); + })) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.BUTTERFREE ], TrainerSlot.TRAINER, true, p => { + p.formIndex = 1; + p.generateAndPopulateMoveset(); + p.generateName(); + })) + .setPartyMemberFunc(2, getRandomPartyMemberFunc(POOL_2_POKEMON, TrainerSlot.TRAINER, true)) + .setPartyMemberFunc(3, getRandomPartyMemberFunc(POOL_2_POKEMON, TrainerSlot.TRAINER, true)) + .setPartyMemberFunc(4, getRandomPartyMemberFunc([pool3Mon.species], TrainerSlot.TRAINER, true, p => { + if (!isNullOrUndefined(pool3Mon.formIndex)) { + p.formIndex = pool3Mon.formIndex!; + p.generateAndPopulateMoveset(); + p.generateName(); + } + })); + } else if (waveIndex < 140) { + randSeedShuffle(pool3Copy); + const pool3Mon2 = pool3Copy.pop()!; + config + .setPartyTemplates(new TrainerPartyTemplate(5, PartyMemberStrength.AVERAGE)) + .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.BEEDRILL ], TrainerSlot.TRAINER, true, p => { + p.formIndex = 1; + p.generateAndPopulateMoveset(); + p.generateName(); + })) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.BUTTERFREE ], TrainerSlot.TRAINER, true, p => { + p.formIndex = 1; + p.generateAndPopulateMoveset(); + p.generateName(); + })) + .setPartyMemberFunc(2, getRandomPartyMemberFunc(POOL_2_POKEMON, TrainerSlot.TRAINER, true)) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([pool3Mon.species], TrainerSlot.TRAINER, true, p => { + if (!isNullOrUndefined(pool3Mon.formIndex)) { + p.formIndex = pool3Mon.formIndex!; + p.generateAndPopulateMoveset(); + p.generateName(); + } + })) + .setPartyMemberFunc(4, getRandomPartyMemberFunc([pool3Mon2.species], TrainerSlot.TRAINER, true, p => { + if (!isNullOrUndefined(pool3Mon2.formIndex)) { + p.formIndex = pool3Mon2.formIndex!; + p.generateAndPopulateMoveset(); + p.generateName(); + } + })); + } else if (waveIndex < 160) { + config + .setPartyTemplates(new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(4, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(1, PartyMemberStrength.STRONG))) + .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.BEEDRILL ], TrainerSlot.TRAINER, true, p => { + p.formIndex = 1; + p.generateAndPopulateMoveset(); + p.generateName(); + })) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.BUTTERFREE ], TrainerSlot.TRAINER, true, p => { + p.formIndex = 1; + p.generateAndPopulateMoveset(); + p.generateName(); + })) + .setPartyMemberFunc(2, getRandomPartyMemberFunc(POOL_2_POKEMON, TrainerSlot.TRAINER, true)) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([pool3Mon.species], TrainerSlot.TRAINER, true, p => { + if (!isNullOrUndefined(pool3Mon.formIndex)) { + p.formIndex = pool3Mon.formIndex!; + p.generateAndPopulateMoveset(); + p.generateName(); + } + })) + .setPartyMemberFunc(4, getRandomPartyMemberFunc(POOL_4_POKEMON, TrainerSlot.TRAINER, true)); + } else { + config + .setPartyTemplates(new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(4, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(1, PartyMemberStrength.STRONG))) + .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.BEEDRILL ], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.formIndex = 1; + p.generateAndPopulateMoveset(); + p.generateName(); + })) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.BUTTERFREE ], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.formIndex = 1; + p.generateAndPopulateMoveset(); + p.generateName(); + })) + .setPartyMemberFunc(2, getRandomPartyMemberFunc(POOL_2_POKEMON, TrainerSlot.TRAINER, true)) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([pool3Mon.species], TrainerSlot.TRAINER, true, p => { + if (!isNullOrUndefined(pool3Mon.formIndex)) { + p.formIndex = pool3Mon.formIndex!; + p.generateAndPopulateMoveset(); + p.generateName(); + } + })) + .setPartyMemberFunc(4, getRandomPartyMemberFunc(POOL_4_POKEMON, TrainerSlot.TRAINER, true)); + } + + return config; +} + +function getRandomPartyMemberFunc(speciesPool: Species[], trainerSlot: TrainerSlot = TrainerSlot.TRAINER, ignoreEvolution: boolean = false, postProcess?: (enemyPokemon: EnemyPokemon) => void) { + return (scene: BattleScene, level: integer, strength: PartyMemberStrength) => { + let species = Utils.randSeedItem(speciesPool); + if (!ignoreEvolution) { + species = getPokemonSpecies(species).getTrainerSpeciesForLevel(level, true, strength); + } + return scene.addEnemyPokemon(getPokemonSpecies(species), level, trainerSlot, undefined, undefined, postProcess); + }; +} + +function doBugTypeMoveTutor(scene: BattleScene): Promise { + return new Promise(async resolve => { + const moveOptions = scene.currentBattle.mysteryEncounter.misc.moveTutorOptions; + await showEncounterDialogue(scene, `${namespace}.battle_won`, `${namespace}.speaker`); + + const overlayScale = 1; + const moveInfoOverlay = new MoveInfoOverlay(scene, { + delayVisibility: false, + scale: overlayScale, + onSide: true, + right: true, + x: 1, + y: -MoveInfoOverlay.getHeight(overlayScale, true) - 1, + width: (scene.game.canvas.width / 6) - 2, + }); + scene.ui.add(moveInfoOverlay); + + const optionSelectItems = moveOptions.map((move: PokemonMove) => { + const option: OptionSelectItem = { + label: move.getName(), + handler: () => { + moveInfoOverlay.active = false; + moveInfoOverlay.setVisible(false); + return true; + }, + onHover: () => { + moveInfoOverlay.active = true; + moveInfoOverlay.show(allMoves[move.moveId]); + }, + }; + return option; + }); + + const onHoverOverCancel = () => { + moveInfoOverlay.active = false; + moveInfoOverlay.setVisible(false); + }; + + const result = await selectOptionThenPokemon(scene, optionSelectItems, `${namespace}.option.3.select_prompt`, undefined, onHoverOverCancel); + // let forceExit = !!result; + if (!result) { + moveInfoOverlay.active = false; + moveInfoOverlay.setVisible(false); + } + + // TODO: add menu to confirm player doesn't want to teach a move + // while (!result && !forceExit) { + // // Didn't teach a move, ask the player to confirm they don't want to teach a move + // await showEncounterDialogue(scene, `${namespace}.confirm_no_teach`, `${namespace}.speaker`); + // const confirm = await new Promise(confirmResolve => { + // scene.ui.setMode(Mode.CONFIRM, () => confirmResolve(true), () => confirmResolve(false)); + // }); + // scene.ui.clearText(); + // await scene.ui.setMode(Mode.MESSAGE); + // if (confirm) { + // // No teach, break out of loop + // forceExit = true; + // } else { + // // Re-show learn menu + // result = await selectOptionThenPokemon(scene, optionSelectItems, `${namespace}.option.3.select_prompt`, undefined, onHoverOverCancel); + // if (!result) { + // moveInfoOverlay.active = false; + // moveInfoOverlay.setVisible(false); + // } + // } + // } + + // Option select complete, handle if they are learning a move + if (result && result.selectedOptionIndex < moveOptions.length) { + scene.unshiftPhase(new LearnMovePhase(scene, result.selectedPokemonIndex, moveOptions[result.selectedOptionIndex].moveId)); + } + + // Complete battle and go to rewards + resolve(); + }); +} diff --git a/src/data/mystery-encounters/encounters/clowning-around-encounter.ts b/src/data/mystery-encounters/encounters/clowning-around-encounter.ts index e8a7a238743..4ea978c8c4c 100644 --- a/src/data/mystery-encounters/encounters/clowning-around-encounter.ts +++ b/src/data/mystery-encounters/encounters/clowning-around-encounter.ts @@ -53,7 +53,7 @@ const RANDOM_ABILITY_POOL = [ /** * Clowning Around encounter. - * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/69 | GitHub Issue #69} + * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3807 | GitHub Issue #3807} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ export const ClowningAroundEncounter: MysteryEncounter = @@ -334,13 +334,13 @@ export const ClowningAroundEncounter: MysteryEncounter = randSeedShuffle(priorityTypes); } - let newTypes; + let newTypes: Type[]; if (!originalTypes || originalTypes.length < 1) { - newTypes = priorityTypes?.length > 0 ? [priorityTypes.pop()] : [(randSeedInt(18) as Type)]; + newTypes = priorityTypes && priorityTypes.length > 0 ? [priorityTypes.pop()!] : [(randSeedInt(18) as Type)]; } else { newTypes = originalTypes.map(m => { - if (priorityTypes?.length > 0) { - const ret = priorityTypes.pop(); + if (priorityTypes && priorityTypes.length > 0) { + const ret = priorityTypes.pop()!; randSeedShuffle(priorityTypes); return ret; } diff --git a/src/data/mystery-encounters/encounters/dancing-lessons-encounter.ts b/src/data/mystery-encounters/encounters/dancing-lessons-encounter.ts index d5515ce43cb..5b6cbfa9866 100644 --- a/src/data/mystery-encounters/encounters/dancing-lessons-encounter.ts +++ b/src/data/mystery-encounters/encounters/dancing-lessons-encounter.ts @@ -75,7 +75,7 @@ const SENSU_STYLE_BIOMES = [ /** * Dancing Lessons encounter. - * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/130 | GitHub Issue #130} + * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3823 | GitHub Issue #3823} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ export const DancingLessonsEncounter: MysteryEncounter = diff --git a/src/data/mystery-encounters/encounters/dark-deal-encounter.ts b/src/data/mystery-encounters/encounters/dark-deal-encounter.ts index 4136100b6b8..b8e3ba81101 100644 --- a/src/data/mystery-encounters/encounters/dark-deal-encounter.ts +++ b/src/data/mystery-encounters/encounters/dark-deal-encounter.ts @@ -71,7 +71,7 @@ const excludedBosses = [ /** * Dark Deal encounter. - * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/61 | GitHub Issue #61} + * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3806 | GitHub Issue #3806} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ export const DarkDealEncounter: MysteryEncounter = diff --git a/src/data/mystery-encounters/encounters/delibirdy-encounter.ts b/src/data/mystery-encounters/encounters/delibirdy-encounter.ts index e6ed3641982..ecb8cbeb925 100644 --- a/src/data/mystery-encounters/encounters/delibirdy-encounter.ts +++ b/src/data/mystery-encounters/encounters/delibirdy-encounter.ts @@ -33,7 +33,7 @@ const OPTION_3_DISALLOWED_MODIFIERS = [ /** * Delibird-y encounter. - * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/57 | GitHub Issue #57} + * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3804 | GitHub Issue #3804} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ export const DelibirdyEncounter: MysteryEncounter = @@ -115,7 +115,7 @@ export const DelibirdyEncounter: MysteryEncounter = // At max stacks, give the first party pokemon a Shell Bell instead const shellBell = generateModifierType(scene, modifierTypes.SHELL_BELL) as PokemonHeldItemModifierType; await applyModifierTypeToPlayerPokemon(scene, scene.getParty()[0], shellBell); - scene.playSound("item_fanfare"); + scene.playSound("bgm/item_fanfare"); await showEncounterText(scene, i18next.t("battle:rewardGain", { modifierName: shellBell.name }), undefined, true); } else { scene.unshiftPhase(new ModifierRewardPhase(scene, modifierTypes.ABILITY_CHARM)); @@ -190,7 +190,7 @@ export const DelibirdyEncounter: MysteryEncounter = // At max stacks, give the first party pokemon a Shell Bell instead const shellBell = generateModifierType(scene, modifierTypes.SHELL_BELL) as PokemonHeldItemModifierType; await applyModifierTypeToPlayerPokemon(scene, scene.getParty()[0], shellBell); - scene.playSound("item_fanfare"); + scene.playSound("bgm/item_fanfare"); await showEncounterText(scene, i18next.t("battle:rewardGain", { modifierName: shellBell.name }), undefined, true); } else { scene.unshiftPhase(new ModifierRewardPhase(scene, modifierTypes.CANDY_JAR)); @@ -203,7 +203,7 @@ export const DelibirdyEncounter: MysteryEncounter = // At max stacks, give the first party pokemon a Shell Bell instead const shellBell = generateModifierType(scene, modifierTypes.SHELL_BELL) as PokemonHeldItemModifierType; await applyModifierTypeToPlayerPokemon(scene, scene.getParty()[0], shellBell); - scene.playSound("item_fanfare"); + scene.playSound("bgm/item_fanfare"); await showEncounterText(scene, i18next.t("battle:rewardGain", { modifierName: shellBell.name }), undefined, true); } else { scene.unshiftPhase(new ModifierRewardPhase(scene, modifierTypes.HEALING_CHARM)); @@ -283,7 +283,7 @@ export const DelibirdyEncounter: MysteryEncounter = // At max stacks, give the first party pokemon a Shell Bell instead const shellBell = generateModifierType(scene, modifierTypes.SHELL_BELL) as PokemonHeldItemModifierType; await applyModifierTypeToPlayerPokemon(scene, scene.getParty()[0], shellBell); - scene.playSound("item_fanfare"); + scene.playSound("bgm/item_fanfare"); await showEncounterText(scene, i18next.t("battle:rewardGain", { modifierName: shellBell.name }), undefined, true); } else { scene.unshiftPhase(new ModifierRewardPhase(scene, modifierTypes.BERRY_POUCH)); diff --git a/src/data/mystery-encounters/encounters/department-store-sale-encounter.ts b/src/data/mystery-encounters/encounters/department-store-sale-encounter.ts index 09c991ee4a3..34270892999 100644 --- a/src/data/mystery-encounters/encounters/department-store-sale-encounter.ts +++ b/src/data/mystery-encounters/encounters/department-store-sale-encounter.ts @@ -17,7 +17,7 @@ const namespace = "mysteryEncounter:departmentStoreSale"; /** * Department Store Sale encounter. - * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/33 | GitHub Issue #33} + * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3797 | GitHub Issue #3797} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ export const DepartmentStoreSaleEncounter: MysteryEncounter = diff --git a/src/data/mystery-encounters/encounters/field-trip-encounter.ts b/src/data/mystery-encounters/encounters/field-trip-encounter.ts index ca6f7424dc8..cef0a9cd3fd 100644 --- a/src/data/mystery-encounters/encounters/field-trip-encounter.ts +++ b/src/data/mystery-encounters/encounters/field-trip-encounter.ts @@ -16,7 +16,7 @@ const namespace = "mysteryEncounter:fieldTrip"; /** * Field Trip encounter. - * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/17 | GitHub Issue #17} + * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3794 | GitHub Issue #3794} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ export const FieldTripEncounter: MysteryEncounter = @@ -126,10 +126,10 @@ export const FieldTripEncounter: MysteryEncounter = const encounter = scene.currentBattle.mysteryEncounter; if (encounter.misc.correctMove) { const modifiers = [ - generateModifierTypeOption(scene, modifierTypes.TEMP_STAT_BOOSTER, [TempBattleStat.ATK]), - generateModifierTypeOption(scene, modifierTypes.TEMP_STAT_BOOSTER, [TempBattleStat.DEF]), - generateModifierTypeOption(scene, modifierTypes.TEMP_STAT_BOOSTER, [TempBattleStat.SPD]), - generateModifierTypeOption(scene, modifierTypes.DIRE_HIT), + generateModifierTypeOption(scene, modifierTypes.TEMP_STAT_BOOSTER, [TempBattleStat.ATK])!, + generateModifierTypeOption(scene, modifierTypes.TEMP_STAT_BOOSTER, [TempBattleStat.DEF])!, + generateModifierTypeOption(scene, modifierTypes.TEMP_STAT_BOOSTER, [TempBattleStat.SPD])!, + generateModifierTypeOption(scene, modifierTypes.DIRE_HIT)!, ]; setEncounterRewards(scene, { guaranteedModifierTypeOptions: modifiers, fillRemaining: false }); @@ -218,10 +218,10 @@ export const FieldTripEncounter: MysteryEncounter = const encounter = scene.currentBattle.mysteryEncounter; if (encounter.misc.correctMove) { const modifiers = [ - generateModifierTypeOption(scene, modifierTypes.TEMP_STAT_BOOSTER, [TempBattleStat.SPATK]), - generateModifierTypeOption(scene, modifierTypes.TEMP_STAT_BOOSTER, [TempBattleStat.SPDEF]), - generateModifierTypeOption(scene, modifierTypes.TEMP_STAT_BOOSTER, [TempBattleStat.SPD]), - generateModifierTypeOption(scene, modifierTypes.DIRE_HIT), + generateModifierTypeOption(scene, modifierTypes.TEMP_STAT_BOOSTER, [TempBattleStat.SPATK])!, + generateModifierTypeOption(scene, modifierTypes.TEMP_STAT_BOOSTER, [TempBattleStat.SPDEF])!, + generateModifierTypeOption(scene, modifierTypes.TEMP_STAT_BOOSTER, [TempBattleStat.SPD])!, + generateModifierTypeOption(scene, modifierTypes.DIRE_HIT)!, ]; setEncounterRewards(scene, { guaranteedModifierTypeOptions: modifiers, fillRemaining: false }); @@ -304,10 +304,10 @@ export const FieldTripEncounter: MysteryEncounter = const encounter = scene.currentBattle.mysteryEncounter; if (encounter.misc.correctMove) { const modifiers = [ - generateModifierTypeOption(scene, modifierTypes.TEMP_STAT_BOOSTER, [TempBattleStat.ACC]), - generateModifierTypeOption(scene, modifierTypes.TEMP_STAT_BOOSTER, [TempBattleStat.SPD]), - generateModifierTypeOption(scene, modifierTypes.GREAT_BALL), - generateModifierTypeOption(scene, modifierTypes.IV_SCANNER), + generateModifierTypeOption(scene, modifierTypes.TEMP_STAT_BOOSTER, [TempBattleStat.ACC])!, + generateModifierTypeOption(scene, modifierTypes.TEMP_STAT_BOOSTER, [TempBattleStat.SPD])!, + generateModifierTypeOption(scene, modifierTypes.GREAT_BALL)!, + generateModifierTypeOption(scene, modifierTypes.IV_SCANNER)!, ]; setEncounterRewards(scene, { guaranteedModifierTypeOptions: modifiers, fillRemaining: false }); diff --git a/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts b/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts index fe5cf320401..346158ec6d5 100644 --- a/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts +++ b/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts @@ -33,7 +33,7 @@ const DAMAGE_PERCENTAGE: number = 20; /** * Fiery Fallout encounter. - * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/88 | GitHub Issue #88} + * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3814 | GitHub Issue #3814} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ export const FieryFalloutEncounter: MysteryEncounter = diff --git a/src/data/mystery-encounters/encounters/fight-or-flight-encounter.ts b/src/data/mystery-encounters/encounters/fight-or-flight-encounter.ts index a7aeefe2db5..304f81846b1 100644 --- a/src/data/mystery-encounters/encounters/fight-or-flight-encounter.ts +++ b/src/data/mystery-encounters/encounters/fight-or-flight-encounter.ts @@ -30,7 +30,7 @@ const namespace = "mysteryEncounter:fightOrFlight"; /** * Fight or Flight encounter. - * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/24 | GitHub Issue #24} + * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3795 | GitHub Issue #3795} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ export const FightOrFlightEncounter: MysteryEncounter = diff --git a/src/data/mystery-encounters/encounters/lost-at-sea-encounter.ts b/src/data/mystery-encounters/encounters/lost-at-sea-encounter.ts index db8168e7bd7..a06aa5a404b 100644 --- a/src/data/mystery-encounters/encounters/lost-at-sea-encounter.ts +++ b/src/data/mystery-encounters/encounters/lost-at-sea-encounter.ts @@ -23,7 +23,7 @@ const namespace = "mysteryEncounter:lostAtSea"; /** * Lost at sea encounter. - * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/9 | GitHub Issue #9} + * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3793 | GitHub Issue #3793} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ export const LostAtSeaEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.LOST_AT_SEA) @@ -125,7 +125,6 @@ export const LostAtSeaEncounter: MysteryEncounter = MysteryEncounterBuilder.with * Generic handler for using a guiding pokemon to guide you back. * * @param scene Battle scene - * @param guidePokemon pokemon choosen as a guide */ async function handlePokemonGuidingYouPhase(scene: BattleScene) { const laprasSpecies = getPokemonSpecies(Species.LAPRAS); diff --git a/src/data/mystery-encounters/encounters/mysterious-challengers-encounter.ts b/src/data/mystery-encounters/encounters/mysterious-challengers-encounter.ts index 1695466c1cd..de9132f3493 100644 --- a/src/data/mystery-encounters/encounters/mysterious-challengers-encounter.ts +++ b/src/data/mystery-encounters/encounters/mysterious-challengers-encounter.ts @@ -23,7 +23,7 @@ const namespace = "mysteryEncounter:mysteriousChallengers"; /** * Mysterious Challengers encounter. - * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/41 | GitHub Issue #41} + * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3801 | GitHub Issue #3801} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ export const MysteriousChallengersEncounter: MysteryEncounter = diff --git a/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts b/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts index 303beb57aae..6caef1c36ec 100644 --- a/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts +++ b/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts @@ -15,7 +15,7 @@ const namespace = "mysteryEncounter:mysteriousChest"; /** * Mysterious Chest encounter. - * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/32 | GitHub Issue #32} + * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3796 | GitHub Issue #3796} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ export const MysteriousChestEncounter: MysteryEncounter = diff --git a/src/data/mystery-encounters/encounters/part-timer-encounter.ts b/src/data/mystery-encounters/encounters/part-timer-encounter.ts index a17a47f23fe..bfd977babfd 100644 --- a/src/data/mystery-encounters/encounters/part-timer-encounter.ts +++ b/src/data/mystery-encounters/encounters/part-timer-encounter.ts @@ -17,7 +17,7 @@ const namespace = "mysteryEncounter:partTimer"; /** * Part Timer encounter. - * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/82 | GitHub Issue #82} + * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3813 | GitHub Issue #3813} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ export const PartTimerEncounter: MysteryEncounter = @@ -290,50 +290,50 @@ export const PartTimerEncounter: MysteryEncounter = .build(); function doStrongWorkSfx(scene: BattleScene) { - scene.playSound("PRSFX- Horn Drill1"); - scene.playSound("PRSFX- Horn Drill1"); + scene.playSound("battle_anims/PRSFX- Horn Drill1"); + scene.playSound("battle_anims/PRSFX- Horn Drill1"); scene.time.delayedCall(1000, () => { - scene.playSound("PRSFX- Guillotine2"); + scene.playSound("battle_anims/PRSFX- Guillotine2"); }); scene.time.delayedCall(2000, () => { - scene.playSound("PRSFX- Heavy Slam2"); + scene.playSound("battle_anims/PRSFX- Heavy Slam2"); }); scene.time.delayedCall(2500, () => { - scene.playSound("PRSFX- Guillotine2"); + scene.playSound("battle_anims/PRSFX- Guillotine2"); }); } function doDeliverySfx(scene: BattleScene) { - scene.playSound("PRSFX- Accelerock1"); + scene.playSound("battle_anims/PRSFX- Accelerock1"); scene.time.delayedCall(1500, () => { - scene.playSound("PRSFX- Extremespeed1"); + scene.playSound("battle_anims/PRSFX- Extremespeed1"); }); scene.time.delayedCall(2000, () => { - scene.playSound("PRSFX- Extremespeed1"); + scene.playSound("battle_anims/PRSFX- Extremespeed1"); }); scene.time.delayedCall(2250, () => { - scene.playSound("PRSFX- Agility"); + scene.playSound("battle_anims/PRSFX- Agility"); }); } function doSalesSfx(scene: BattleScene) { - scene.playSound("PRSFX- Captivate"); + scene.playSound("battle_anims/PRSFX- Captivate"); scene.time.delayedCall(1500, () => { - scene.playSound("PRSFX- Attract2"); + scene.playSound("battle_anims/PRSFX- Attract2"); }); scene.time.delayedCall(2000, () => { - scene.playSound("PRSFX- Aurora Veil2"); + scene.playSound("battle_anims/PRSFX- Aurora Veil2"); }); scene.time.delayedCall(3000, () => { - scene.playSound("PRSFX- Attract2"); + scene.playSound("battle_anims/PRSFX- Attract2"); }); } diff --git a/src/data/mystery-encounters/encounters/safari-zone-encounter.ts b/src/data/mystery-encounters/encounters/safari-zone-encounter.ts index a7ac57fff7d..43370fc189c 100644 --- a/src/data/mystery-encounters/encounters/safari-zone-encounter.ts +++ b/src/data/mystery-encounters/encounters/safari-zone-encounter.ts @@ -26,7 +26,7 @@ const TRAINER_THROW_ANIMATION_TIMES = [512, 184, 768]; /** * Safari Zone encounter. - * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/39 | GitHub Issue #39} + * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3800 | GitHub Issue #3800} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ export const SafariZoneEncounter: MysteryEncounter = @@ -322,7 +322,7 @@ async function throwBait(scene: BattleScene, pokemon: EnemyPokemon): Promise { scene.trainer.setTexture(`trainer_${scene.gameData.gender === PlayerGender.FEMALE ? "f" : "m"}_back_pb`); scene.time.delayedCall(TRAINER_THROW_ANIMATION_TIMES[0], () => { - scene.playSound("pb_throw"); + scene.playSound("se/pb_throw"); // Trainer throw frames scene.trainer.setFrame("2"); @@ -351,12 +351,12 @@ async function throwBait(scene: BattleScene, pokemon: EnemyPokemon): Promise { - scene.playSound("PRSFX- Bug Bite"); + scene.playSound("battle-anims/PRSFX- Bug Bite"); bait.setFrame("0002.png"); }, onLoop: () => { if (index % 2 === 0) { - scene.playSound("PRSFX- Bug Bite"); + scene.playSound("battle-anims/PRSFX- Bug Bite"); } if (index === 4) { bait.setFrame("0003.png"); @@ -388,7 +388,7 @@ async function throwMud(scene: BattleScene, pokemon: EnemyPokemon): Promise { scene.trainer.setTexture(`trainer_${scene.gameData.gender === PlayerGender.FEMALE ? "f" : "m"}_back_pb`); scene.time.delayedCall(TRAINER_THROW_ANIMATION_TIMES[0], () => { - scene.playSound("pb_throw"); + scene.playSound("se/pb_throw"); // Trainer throw frames scene.trainer.setFrame("2"); @@ -407,7 +407,7 @@ async function throwMud(scene: BattleScene, pokemon: EnemyPokemon): Promise { // Mud frame 2 - scene.playSound("PRSFX- Sludge Bomb2"); + scene.playSound("battle-anims/PRSFX- Sludge Bomb2"); mud.setFrame("0002.png"); // Mud splat scene.time.delayedCall(200, () => { @@ -433,10 +433,10 @@ async function throwMud(scene: BattleScene, pokemon: EnemyPokemon): Promise { - scene.playSound("PRSFX- Taunt2"); + scene.playSound("battle-anims/PRSFX- Taunt2"); }, onLoop: () => { - scene.playSound("PRSFX- Taunt2"); + scene.playSound("battle-anims/PRSFX- Taunt2"); }, onComplete: () => { resolve(true); diff --git a/src/data/mystery-encounters/encounters/shady-vitamin-dealer-encounter.ts b/src/data/mystery-encounters/encounters/shady-vitamin-dealer-encounter.ts index 2876ce64c8f..1f553624aa7 100644 --- a/src/data/mystery-encounters/encounters/shady-vitamin-dealer-encounter.ts +++ b/src/data/mystery-encounters/encounters/shady-vitamin-dealer-encounter.ts @@ -19,7 +19,7 @@ const namespace = "mysteryEncounter:shadyVitaminDealer"; /** * Shady Vitamin Dealer encounter. - * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/34 | GitHub Issue #34} + * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3798 | GitHub Issue #3798} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ export const ShadyVitaminDealerEncounter: MysteryEncounter = @@ -79,8 +79,8 @@ export const ShadyVitaminDealerEncounter: MysteryEncounter = updatePlayerMoney(scene, -(encounter.options[0].requirements[0] as MoneyRequirement).requiredMoney); // Calculate modifiers and dialogue tokens const modifiers = [ - generateModifierType(scene, modifierTypes.BASE_STAT_BOOSTER), - generateModifierType(scene, modifierTypes.BASE_STAT_BOOSTER), + generateModifierType(scene, modifierTypes.BASE_STAT_BOOSTER)!, + generateModifierType(scene, modifierTypes.BASE_STAT_BOOSTER)!, ]; encounter.setDialogueToken("boost1", modifiers[0].name); encounter.setDialogueToken("boost2", modifiers[1].name); @@ -162,8 +162,8 @@ export const ShadyVitaminDealerEncounter: MysteryEncounter = updatePlayerMoney(scene, -(encounter.options[1].requirements[0] as MoneyRequirement).requiredMoney); // Calculate modifiers and dialogue tokens const modifiers = [ - generateModifierType(scene, modifierTypes.BASE_STAT_BOOSTER), - generateModifierType(scene, modifierTypes.BASE_STAT_BOOSTER), + generateModifierType(scene, modifierTypes.BASE_STAT_BOOSTER)!, + generateModifierType(scene, modifierTypes.BASE_STAT_BOOSTER)!, ]; encounter.setDialogueToken("boost1", modifiers[0].name); encounter.setDialogueToken("boost2", modifiers[1].name); diff --git a/src/data/mystery-encounters/encounters/slumbering-snorlax-encounter.ts b/src/data/mystery-encounters/encounters/slumbering-snorlax-encounter.ts index f819e6cb7e5..47a85edb4f2 100644 --- a/src/data/mystery-encounters/encounters/slumbering-snorlax-encounter.ts +++ b/src/data/mystery-encounters/encounters/slumbering-snorlax-encounter.ts @@ -22,7 +22,7 @@ const namespace = "mysteryEncounter:slumberingSnorlax"; /** * Sleeping Snorlax encounter. - * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/103 | GitHub Issue #103} + * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3815 | GitHub Issue #3815} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ export const SlumberingSnorlaxEncounter: MysteryEncounter = diff --git a/src/data/mystery-encounters/encounters/teleporting-hijinks-encounter.ts b/src/data/mystery-encounters/encounters/teleporting-hijinks-encounter.ts index 63e7674b05a..6ba73357f42 100644 --- a/src/data/mystery-encounters/encounters/teleporting-hijinks-encounter.ts +++ b/src/data/mystery-encounters/encounters/teleporting-hijinks-encounter.ts @@ -29,7 +29,7 @@ const MACHINE_INTERFACING_TYPES = [Type.ELECTRIC, Type.STEEL]; /** * Teleporting Hijinks encounter. - * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/119 | GitHub Issue #119} + * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3817 | GitHub Issue #3817} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ export const TeleportingHijinksEncounter: MysteryEncounter = @@ -140,8 +140,8 @@ export const TeleportingHijinksEncounter: MysteryEncounter = }], }; - const magnet = generateModifierTypeOption(scene, modifierTypes.ATTACK_TYPE_BOOSTER, [Type.STEEL]); - const metalCoat = generateModifierTypeOption(scene, modifierTypes.ATTACK_TYPE_BOOSTER, [Type.ELECTRIC]); + const magnet = generateModifierTypeOption(scene, modifierTypes.ATTACK_TYPE_BOOSTER, [Type.STEEL])!; + const metalCoat = generateModifierTypeOption(scene, modifierTypes.ATTACK_TYPE_BOOSTER, [Type.ELECTRIC])!; setEncounterRewards(scene, { guaranteedModifierTypeOptions: [magnet, metalCoat], fillRemaining: true }); setEncounterExp(scene, encounter.selectedOption!.primaryPokemon!.id, 100); transitionMysteryEncounterIntroVisuals(scene, true, true); diff --git a/src/data/mystery-encounters/encounters/the-pokemon-salesman-encounter.ts b/src/data/mystery-encounters/encounters/the-pokemon-salesman-encounter.ts index 9604783d3ff..cb0d7e486fe 100644 --- a/src/data/mystery-encounters/encounters/the-pokemon-salesman-encounter.ts +++ b/src/data/mystery-encounters/encounters/the-pokemon-salesman-encounter.ts @@ -22,7 +22,7 @@ const MAX_POKEMON_PRICE_MULTIPLIER = 6; /** * Pokemon Salesman encounter. - * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/36 | GitHub Issue #36} + * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3799 | GitHub Issue #3799} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ export const ThePokemonSalesmanEncounter: MysteryEncounter = diff --git a/src/data/mystery-encounters/encounters/the-strong-stuff-encounter.ts b/src/data/mystery-encounters/encounters/the-strong-stuff-encounter.ts index 0b4e60a16e4..ccdfe98d7a9 100644 --- a/src/data/mystery-encounters/encounters/the-strong-stuff-encounter.ts +++ b/src/data/mystery-encounters/encounters/the-strong-stuff-encounter.ts @@ -23,7 +23,7 @@ const namespace = "mysteryEncounter:theStrongStuff"; /** * The Strong Stuff encounter. - * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/54 | GitHub Issue #54} + * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3803 | GitHub Issue #3803} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ export const TheStrongStuffEncounter: MysteryEncounter = diff --git a/src/data/mystery-encounters/encounters/the-winstrate-challenge-encounter.ts b/src/data/mystery-encounters/encounters/the-winstrate-challenge-encounter.ts index 08940818b9b..24c5af39f45 100644 --- a/src/data/mystery-encounters/encounters/the-winstrate-challenge-encounter.ts +++ b/src/data/mystery-encounters/encounters/the-winstrate-challenge-encounter.ts @@ -26,7 +26,7 @@ const namespace = "mysteryEncounter:theWinstrateChallenge"; /** * The Winstrate Challenge encounter. - * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/136 | GitHub Issue #136} + * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3821 | GitHub Issue #3821} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ export const TheWinstrateChallengeEncounter: MysteryEncounter = diff --git a/src/data/mystery-encounters/encounters/training-session-encounter.ts b/src/data/mystery-encounters/encounters/training-session-encounter.ts index 19e8fc50136..d82ca5c704d 100644 --- a/src/data/mystery-encounters/encounters/training-session-encounter.ts +++ b/src/data/mystery-encounters/encounters/training-session-encounter.ts @@ -24,7 +24,7 @@ const namespace = "mysteryEncounter:trainingSession"; /** * Training Session encounter. - * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/43 | GitHub Issue #43} + * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3802 | GitHub Issue #3802} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ export const TrainingSessionEncounter: MysteryEncounter = diff --git a/src/data/mystery-encounters/encounters/trash-to-treasure-encounter.ts b/src/data/mystery-encounters/encounters/trash-to-treasure-encounter.ts index d14f3fe6441..47a214b7fa2 100644 --- a/src/data/mystery-encounters/encounters/trash-to-treasure-encounter.ts +++ b/src/data/mystery-encounters/encounters/trash-to-treasure-encounter.ts @@ -25,7 +25,7 @@ const SOUND_EFFECT_WAIT_TIME = 700; /** * Trash to Treasure encounter. - * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/74 | GitHub Issue #74} + * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3809 | GitHub Issue #3809} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ export const TrashToTreasureEncounter: MysteryEncounter = @@ -177,7 +177,7 @@ async function tryApplyDigRewardItems(scene: BattleScene) { } } - scene.playSound("item_fanfare"); + scene.playSound("bgm/item_fanfare"); await showEncounterText(scene, i18next.t("battle:rewardGain", { modifierName: "2 " + leftovers.name }), undefined, true); // First Shell bell @@ -204,17 +204,17 @@ async function tryApplyDigRewardItems(scene: BattleScene) { } } - scene.playSound("item_fanfare"); + scene.playSound("bgm/item_fanfare"); await showEncounterText(scene, i18next.t("battle:rewardGain", { modifierName: "2 " + shellBell.name }), undefined, true); } async function doGarbageDig(scene: BattleScene) { - scene.playSound("PRSFX- Dig2"); + scene.playSound("battle-anims/PRSFX- Dig2"); scene.time.delayedCall(SOUND_EFFECT_WAIT_TIME, () => { - scene.playSound("PRSFX- Dig2"); - scene.playSound("PRSFX- Venom Drench", { volume: 2 }); + scene.playSound("battle-anims/PRSFX- Dig2"); + scene.playSound("battle-anims/PRSFX- Venom Drench", { volume: 2 }); }); scene.time.delayedCall(SOUND_EFFECT_WAIT_TIME * 2, () => { - scene.playSound("PRSFX- Dig2"); + scene.playSound("battle-anims/PRSFX- Dig2"); }); } diff --git a/src/data/mystery-encounters/encounters/weird-dream-encounter.ts b/src/data/mystery-encounters/encounters/weird-dream-encounter.ts index d4ec3ab3c04..8e79506b4b9 100644 --- a/src/data/mystery-encounters/encounters/weird-dream-encounter.ts +++ b/src/data/mystery-encounters/encounters/weird-dream-encounter.ts @@ -24,8 +24,8 @@ import { getLevelTotalExp } from "#app/data/exp"; /** i18n namespace for encounter */ const namespace = "mysteryEncounter:weirdDream"; -/** Exclude Ultra Beasts (inludes Cosmog/Solgaleo/Lunala/Necrozma), Paradox (includes Miraidon/Koraidon), Eternatus, Urshifu, the Poison Chain trio, Ogerpon */ -const excludedPokemon = [ +/** Exclude Ultra Beasts, Paradox, Eternatus, and all legendary/mythical/trio pokemon that are below 570 BST */ +const EXCLUDED_TRANSFORMATION_SPECIES = [ Species.ETERNATUS, /** UBs */ Species.NIHILEGO, @@ -77,9 +77,18 @@ const excludedPokemon = [ Species.FEZANDIPITI, ]; +const SUPER_LEGENDARY_BST_THRESHOLD = 600; +const NON_LEGENDARY_BST_THRESHOLD = 570; +const GAIN_OLD_GATEAU_ITEM_BST_THRESHOLD = 450; + +/** Value ranges of the resulting species BST transformations after adding values to original species */ + +const HIGH_BST_TRANSFORM_BASE_VALUES = [90, 110]; +const STANDARD_BST_TRANSFORM_BASE_VALUES = [40, 50]; + /** * Weird Dream encounter. - * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/137 | GitHub Issue #137} + * @see {@link https://github.com/pagefaultgames/pokerogue/issues/3822 | GitHub Issue #3822} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ export const WeirdDreamEncounter: MysteryEncounter = @@ -225,9 +234,9 @@ function getTeamTransformations(scene: BattleScene): PokemonTransformation[] { }); // Only 1 Pokemon can be transformed into BST higher than 600 - let hasPokemonBstHigherThan600 = false; + let hasPokemonInSuperLegendaryBstThreshold = false; // Only 1 other Pokemon can be transformed into BST between 570-600 - let hasPokemonBstBetween570And600 = false; + let hasPokemonInLegendaryBstThreshold = false; // First, roll 2 of the party members to new Pokemon at a +90 to +110 BST difference // Then, roll the remainder of the party members at a +40 to +50 BST difference @@ -241,19 +250,19 @@ function getTeamTransformations(scene: BattleScene): PokemonTransformation[] { const bst = getOriginalBst(scene, removed); let newBstRange; if (i < 2) { - newBstRange = [90, 110]; + newBstRange = HIGH_BST_TRANSFORM_BASE_VALUES; } else { - newBstRange = [40, 50]; + newBstRange = STANDARD_BST_TRANSFORM_BASE_VALUES; } - const newSpecies = getTransformedSpecies(bst, newBstRange, hasPokemonBstHigherThan600, hasPokemonBstBetween570And600, alreadyUsedSpecies); + const newSpecies = getTransformedSpecies(bst, newBstRange, hasPokemonInSuperLegendaryBstThreshold, hasPokemonInLegendaryBstThreshold, alreadyUsedSpecies); const newSpeciesBst = newSpecies.getBaseStatTotal(); - if (newSpeciesBst > 600) { - hasPokemonBstHigherThan600 = true; + if (newSpeciesBst > SUPER_LEGENDARY_BST_THRESHOLD) { + hasPokemonInSuperLegendaryBstThreshold = true; } - if (newSpeciesBst <= 600 && newSpeciesBst >= 570) { - hasPokemonBstBetween570And600 = true; + if (newSpeciesBst <= SUPER_LEGENDARY_BST_THRESHOLD && newSpeciesBst >= NON_LEGENDARY_BST_THRESHOLD) { + hasPokemonInLegendaryBstThreshold = true; } @@ -299,9 +308,8 @@ async function doNewTeamPostProcess(scene: BattleScene, transformations: Pokemon return newValue > iv ? newValue : iv; }); - // For pokemon at/below 570 BST or any shiny pokemon, unlock it permanently as if you had caught it - if (newPokemon.getSpeciesForm().getBaseStatTotal() <= 570 || newPokemon.isShiny()) { + if (newPokemon.getSpeciesForm().getBaseStatTotal() <= NON_LEGENDARY_BST_THRESHOLD || newPokemon.isShiny()) { if (newPokemon.getSpeciesForm().abilityHidden && newPokemon.abilityIndex === newPokemon.getSpeciesForm().getAbilityCount() - 1) { scene.validateAchv(achvs.HIDDEN_ABILITY); } @@ -372,8 +380,8 @@ async function doNewTeamPostProcess(scene: BattleScene, transformations: Pokemon scene.addModifier(item, false, false, false, true); } - // Any pokemon that is at or below 450 BST gets +20 permanent BST to 3 stats: HP, lowest of Atk/SpAtk, and lowest of Def/SpDef - if (newPokemon.getSpeciesForm().getBaseStatTotal() <= 450) { + // Any pokemon that is at or below 450 BST gets +20 permanent BST to 3 stats: HP (halved, +10), lowest of Atk/SpAtk, and lowest of Def/SpDef + if (newPokemon.getSpeciesForm().getBaseStatTotal() <= GAIN_OLD_GATEAU_ITEM_BST_THRESHOLD) { const stats: Stat[] = [Stat.HP]; const baseStats = newPokemon.getSpeciesForm().baseStats.slice(0); // Attack or SpAtk @@ -435,9 +443,9 @@ function getTransformedSpecies(originalBst: number, bstSearchRange: [number, num const speciesBst = s.getBaseStatTotal(); const bstInRange = speciesBst >= bstMin && speciesBst <= bstCap; // Checks that a Pokemon has not already been added in the +600 or 570-600 slots; - const validBst = (!hasPokemonBstBetween570And600 || (speciesBst < 570 || speciesBst > 600)) && - (!hasPokemonBstHigherThan600 || speciesBst <= 600); - return bstInRange && validBst && !excludedPokemon.includes(s.speciesId); + const validBst = (!hasPokemonBstBetween570And600 || (speciesBst < NON_LEGENDARY_BST_THRESHOLD || speciesBst > SUPER_LEGENDARY_BST_THRESHOLD)) && + (!hasPokemonBstHigherThan600 || speciesBst <= SUPER_LEGENDARY_BST_THRESHOLD); + return bstInRange && validBst && !EXCLUDED_TRANSFORMATION_SPECIES.includes(s.speciesId); }); // There must be at least 20 species available before it will choose one diff --git a/src/data/mystery-encounters/mystery-encounter-requirements.ts b/src/data/mystery-encounters/mystery-encounter-requirements.ts index 042f967a23d..212982920c8 100644 --- a/src/data/mystery-encounters/mystery-encounter-requirements.ts +++ b/src/data/mystery-encounters/mystery-encounter-requirements.ts @@ -13,6 +13,8 @@ import { StatusEffect } from "../status-effect"; import { Type } from "../type"; import { WeatherType } from "../weather"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; +import { AttackTypeBoosterModifier } from "#app/modifier/modifier"; +import { AttackTypeBoosterModifierType } from "#app/modifier/modifier-type"; export interface EncounterRequirement { meetsRequirement(scene: BattleScene): boolean; // Boolean to see if a requirement is met @@ -420,11 +422,11 @@ export class TypeRequirement extends EncounterPokemonRequirement { meetsRequirement(scene: BattleScene): boolean { let partyPokemon = scene.getParty(); - if (isNullOrUndefined(partyPokemon) || this?.requiredType?.length < 0) { + if (isNullOrUndefined(partyPokemon)) { return false; } - if (!this.excludeFainted) { + if (this.excludeFainted) { partyPokemon = partyPokemon.filter((pokemon) => !pokemon.isFainted()); } @@ -795,7 +797,7 @@ export class HeldItemRequirement extends EncounterPokemonRequirement { meetsRequirement(scene: BattleScene): boolean { const partyPokemon = scene.getParty(); - if (isNullOrUndefined(partyPokemon) || this?.requiredHeldItemModifiers?.length < 0) { + if (isNullOrUndefined(partyPokemon)) { return false; } return this.queryParty(partyPokemon).length >= this.minNumberOfPokemon; @@ -828,6 +830,53 @@ export class HeldItemRequirement extends EncounterPokemonRequirement { } } +export class AttackTypeBoosterHeldItemTypeRequirement extends EncounterPokemonRequirement { + requiredHeldItemTypes: Type[]; + minNumberOfPokemon: number; + invertQuery: boolean; + + constructor(heldItemTypes: Type | Type[], minNumberOfPokemon: number = 1, invertQuery: boolean = false) { + super(); + this.minNumberOfPokemon = minNumberOfPokemon; + this.invertQuery = invertQuery; + this.requiredHeldItemTypes = Array.isArray(heldItemTypes) ? heldItemTypes : [heldItemTypes]; + } + + meetsRequirement(scene: BattleScene): boolean { + const partyPokemon = scene.getParty(); + if (isNullOrUndefined(partyPokemon)) { + return false; + } + return this.queryParty(partyPokemon).length >= this.minNumberOfPokemon; + } + + queryParty(partyPokemon: PlayerPokemon[]): PlayerPokemon[] { + if (!this.invertQuery) { + return partyPokemon.filter((pokemon) => this.requiredHeldItemTypes.some((heldItemType) => { + return pokemon.getHeldItems().some((it) => { + return it instanceof AttackTypeBoosterModifier && (it.type as AttackTypeBoosterModifierType).moveType === heldItemType; + }); + })); + } else { + // for an inverted query, we only want to get the pokemon that have any held items that are NOT in requiredHeldItemModifiers + // E.g. functions as a blacklist + return partyPokemon.filter((pokemon) => pokemon.getHeldItems().filter((it) => { + return !this.requiredHeldItemTypes.some(heldItemType => it instanceof AttackTypeBoosterModifier && (it.type as AttackTypeBoosterModifierType).moveType === heldItemType); + }).length > 0); + } + } + + getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] { + const requiredItems = pokemon?.getHeldItems().filter((it) => { + return this.requiredHeldItemTypes.some(heldItemType => it instanceof AttackTypeBoosterModifier && (it.type as AttackTypeBoosterModifierType).moveType === heldItemType); + }); + if (requiredItems && requiredItems.length > 0) { + return ["heldItem", requiredItems[0].type.name]; + } + return ["heldItem", ""]; + } +} + export class LevelRequirement extends EncounterPokemonRequirement { requiredLevelRange: [number, number]; minNumberOfPokemon: number; diff --git a/src/data/mystery-encounters/mystery-encounter.ts b/src/data/mystery-encounters/mystery-encounter.ts index 3db97bf1f98..8efac442e7c 100644 --- a/src/data/mystery-encounters/mystery-encounter.ts +++ b/src/data/mystery-encounters/mystery-encounter.ts @@ -122,6 +122,8 @@ export default class MysteryEncounter implements IMysteryEncounter { onInit?: (scene: BattleScene) => boolean; /** Event when battlefield visuals have finished sliding in and the encounter dialogue begins */ onVisualsStart?: (scene: BattleScene) => boolean; + /** Event prior to any rewards logic in {@link MysteryEncounterRewardsPhase} */ + onRewards?: (scene: BattleScene) => Promise; /** Will provide the player party EXP before rewards are displayed for that wave */ doEncounterExp?: (scene: BattleScene) => boolean; /** Will provide the player a rewards shop for that wave */ diff --git a/src/data/mystery-encounters/mystery-encounters.ts b/src/data/mystery-encounters/mystery-encounters.ts index 79a3b6ed635..794c2772be1 100644 --- a/src/data/mystery-encounters/mystery-encounters.ts +++ b/src/data/mystery-encounters/mystery-encounters.ts @@ -27,6 +27,7 @@ import { DancingLessonsEncounter } from "#app/data/mystery-encounters/encounters import { WeirdDreamEncounter } from "#app/data/mystery-encounters/encounters/weird-dream-encounter"; import { TheWinstrateChallengeEncounter } from "#app/data/mystery-encounters/encounters/the-winstrate-challenge-encounter"; import { TeleportingHijinksEncounter } from "#app/data/mystery-encounters/encounters/teleporting-hijinks-encounter"; +import { BugTypeSuperfanEncounter } from "#app/data/mystery-encounters/encounters/bug-type-superfan-encounter"; // Spawn chance: (BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT + WIGHT_INCREMENT_ON_SPAWN_MISS * ) / 256 export const BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT = 1; @@ -171,7 +172,8 @@ const anyBiomeEncounters: MysteryEncounterType[] = [ MysteryEncounterType.BERRIES_ABOUND, MysteryEncounterType.CLOWNING_AROUND, MysteryEncounterType.WEIRD_DREAM, - MysteryEncounterType.TELEPORTING_HIJINKS + MysteryEncounterType.TELEPORTING_HIJINKS, + MysteryEncounterType.BUG_TYPE_SUPERFAN ]; /** @@ -276,6 +278,7 @@ export function initMysteryEncounters() { allMysteryEncounters[MysteryEncounterType.WEIRD_DREAM] = WeirdDreamEncounter; allMysteryEncounters[MysteryEncounterType.THE_WINSTRATE_CHALLENGE] = TheWinstrateChallengeEncounter; allMysteryEncounters[MysteryEncounterType.TELEPORTING_HIJINKS] = TeleportingHijinksEncounter; + allMysteryEncounters[MysteryEncounterType.BUG_TYPE_SUPERFAN] = BugTypeSuperfanEncounter; // Add extreme encounters to biome map extremeBiomeEncounters.forEach(encounter => { diff --git a/src/data/mystery-encounters/requirements/requirement-groups.ts b/src/data/mystery-encounters/requirements/requirement-groups.ts index 235c9910ef0..679bd980907 100644 --- a/src/data/mystery-encounters/requirements/requirement-groups.ts +++ b/src/data/mystery-encounters/requirements/requirement-groups.ts @@ -36,8 +36,7 @@ export const DANCING_MOVES = [ Moves.QUIVER_DANCE, Moves.SWORDS_DANCE, Moves.TEETER_DANCE, - Moves.VICTORY_DANCE, - Moves.KNOCK_OFF + Moves.VICTORY_DANCE ]; export const DISTRACTION_MOVES = [ diff --git a/src/data/mystery-encounters/utils/encounter-phase-utils.ts b/src/data/mystery-encounters/utils/encounter-phase-utils.ts index f2ffcb964a0..b4942b01c15 100644 --- a/src/data/mystery-encounters/utils/encounter-phase-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-phase-utils.ts @@ -64,7 +64,7 @@ export function doTrainerExclamation(scene: BattleScene) { } }); - scene.playSound("GEN8- Exclaim", { volume: 0.7 }); + scene.playSound("battle_anims/GEN8- Exclaim", { volume: 0.7 }); } export interface EnemyPokemonConfig { @@ -363,7 +363,7 @@ export function updatePlayerMoney(scene: BattleScene, changeValue: number, playS scene.updateMoneyText(); scene.animateMoneyChanged(false); if (playSound) { - scene.playSound("buy"); + scene.playSound("se/buy"); } if (showMessage) { if (changeValue < 0) { @@ -380,17 +380,20 @@ export function updatePlayerMoney(scene: BattleScene, changeValue: number, playS * @param modifier * @param pregenArgs - can specify BerryType for berries, TM for TMs, AttackBoostType for item, etc. */ -export function generateModifierType(scene: BattleScene, modifier: () => ModifierType, pregenArgs?: any[]): ModifierType { - const modifierId = Object.keys(modifierTypes).find(k => modifierTypes[k] === modifier)!; - let result: ModifierType = modifierTypes[modifierId]?.(); +export function generateModifierType(scene: BattleScene, modifier: () => ModifierType, pregenArgs?: any[]): ModifierType | null { + const modifierId = Object.keys(modifierTypes).find(k => modifierTypes[k] === modifier); + if (!modifierId) { + return null; + } + + let result: ModifierType = modifierTypes[modifierId](); // Populates item id and tier (order matters) result = result .withIdFromFunc(modifierTypes[modifierId]) .withTierFromPool(); - const generatedResult = result instanceof ModifierTypeGenerator ? result.generateType(scene.getParty(), pregenArgs) : result; - return generatedResult ?? result; + return result instanceof ModifierTypeGenerator ? result.generateType(scene.getParty(), pregenArgs) : result; } /** @@ -399,9 +402,12 @@ export function generateModifierType(scene: BattleScene, modifier: () => Modifie * @param modifier * @param pregenArgs - can specify BerryType for berries, TM for TMs, AttackBoostType for item, etc. */ -export function generateModifierTypeOption(scene: BattleScene, modifier: () => ModifierType, pregenArgs?: any[]): ModifierTypeOption { +export function generateModifierTypeOption(scene: BattleScene, modifier: () => ModifierType, pregenArgs?: any[]): ModifierTypeOption | null { const result = generateModifierType(scene, modifier, pregenArgs); - return new ModifierTypeOption(result, 0); + if (result) { + return new ModifierTypeOption(result, 0); + } + return result; } /** @@ -416,7 +422,7 @@ export function selectPokemonForOption(scene: BattleScene, onPokemonSelected: (p return new Promise(resolve => { const modeToSetOnExit = scene.ui.getMode(); - // Open party screen to choose pokemon to train + // Open party screen to choose pokemon scene.ui.setMode(Mode.PARTY, PartyUiMode.SELECT, -1, (slotIndex: integer, option: PartyOption) => { if (slotIndex < scene.getParty().length) { scene.ui.setMode(modeToSetOnExit).then(() => { @@ -446,7 +452,7 @@ export function selectPokemonForOption(scene: BattleScene, onPokemonSelected: (p label: i18next.t("menu:cancel"), handler: () => { scene.ui.clearText(); - scene.ui.setMode(Mode.MYSTERY_ENCOUNTER); + scene.ui.setMode(modeToSetOnExit); resolve(false); return true; }, @@ -461,6 +467,11 @@ export function selectPokemonForOption(scene: BattleScene, onPokemonSelected: (p yOffset: 0, supportHover: true }; + + // Do hover over the starting selection option + if (fullOptions[0].onHover) { + fullOptions[0].onHover(); + } scene.ui.setModeWithoutClear(Mode.OPTION_SELECT, config, null, true); }; @@ -484,6 +495,97 @@ export function selectPokemonForOption(scene: BattleScene, onPokemonSelected: (p }); } +interface PokemonAndOptionSelected { + selectedPokemonIndex: number; + selectedOptionIndex: number; +} + +/** + * This function is intended for use inside onPreOptionPhase() of an encounter option + * @param scene + * If a second option needs to be selected, onPokemonSelected should return a OptionSelectItem[] object + * @param options + * @param optionSelectPromptKey + * @param selectablePokemonFilter + * @param onHoverOverCancelOption + */ +export function selectOptionThenPokemon(scene: BattleScene, options: OptionSelectItem[], optionSelectPromptKey: string, selectablePokemonFilter?: PokemonSelectFilter, onHoverOverCancelOption?: () => void): Promise { + return new Promise(resolve => { + const modeToSetOnExit = scene.ui.getMode(); + + const displayOptions = (config: OptionSelectConfig) => { + scene.ui.setMode(Mode.MESSAGE).then(() => { + if (!optionSelectPromptKey) { + // Do hover over the starting selection option + if (fullOptions[0].onHover) { + fullOptions[0].onHover(); + } + scene.ui.setMode(Mode.OPTION_SELECT, config); + } else { + showEncounterText(scene, optionSelectPromptKey).then(() => { + // Do hover over the starting selection option + if (fullOptions[0].onHover) { + fullOptions[0].onHover(); + } + scene.ui.setMode(Mode.OPTION_SELECT, config); + }); + } + }); + }; + + const selectPokemonAfterOption = (selectedOptionIndex: number) => { + // Open party screen to choose a Pokemon + scene.ui.setMode(Mode.PARTY, PartyUiMode.SELECT, -1, (slotIndex: integer, option: PartyOption) => { + if (slotIndex < scene.getParty().length) { + // Pokemon and option selected + scene.ui.setMode(modeToSetOnExit).then(() => { + const result: PokemonAndOptionSelected = { selectedPokemonIndex: slotIndex, selectedOptionIndex: selectedOptionIndex }; + resolve(result); + }); + } else { + // Back to first option select screen + displayOptions(config); + } + }, selectablePokemonFilter); + }; + + // Always appends a cancel option to bottom of options + const fullOptions = options.map((option, index) => { + // Update handler to resolve promise + const onSelect = option.handler; + option.handler = () => { + onSelect(); + selectPokemonAfterOption(index); + return true; + }; + return option; + }).concat({ + label: i18next.t("menu:cancel"), + handler: () => { + scene.ui.clearText(); + scene.ui.setMode(modeToSetOnExit); + resolve(null); + return true; + }, + onHover: () => { + if (onHoverOverCancelOption) { + onHoverOverCancelOption(); + } + scene.ui.showText(i18next.t("mysteryEncounter:cancel_option")); + } + }); + + const config: OptionSelectConfig = { + options: fullOptions, + maxOptions: 7, + yOffset: 0, + supportHover: true + }; + + displayOptions(config); + }); +} + /** * Will initialize reward phases to follow the mystery encounter * Can have shop displayed or skipped diff --git a/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts b/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts index 7ee670b4828..51e737f9b46 100644 --- a/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts @@ -335,7 +335,7 @@ export function trainerThrowPokeball(scene: BattleScene, pokemon: EnemyPokemon, return new Promise(resolve => { scene.trainer.setTexture(`trainer_${scene.gameData.gender === PlayerGender.FEMALE ? "f" : "m"}_back_pb`); scene.time.delayedCall(512, () => { - scene.playSound("pb_throw"); + scene.playSound("se/pb_throw"); // Trainer throw frames scene.trainer.setFrame("2"); @@ -355,7 +355,7 @@ export function trainerThrowPokeball(scene: BattleScene, pokemon: EnemyPokemon, onComplete: () => { pokeball.setTexture("pb", `${pokeballAtlasKey}_opening`); scene.time.delayedCall(17, () => pokeball.setTexture("pb", `${pokeballAtlasKey}_open`)); - scene.playSound("pb_rel"); + scene.playSound("se/pb_rel"); pokemon.tint(getPokeballTintColor(pokeballType)); addPokeballOpenParticles(scene, pokeball.x, pokeball.y, pokeballType); @@ -369,7 +369,7 @@ export function trainerThrowPokeball(scene: BattleScene, pokemon: EnemyPokemon, onComplete: () => { pokeball.setTexture("pb", `${pokeballAtlasKey}_opening`); pokemon.setVisible(false); - scene.playSound("pb_catch"); + scene.playSound("se/pb_catch"); scene.time.delayedCall(17, () => pokeball.setTexture("pb", `${pokeballAtlasKey}`)); const doShake = () => { @@ -397,13 +397,13 @@ export function trainerThrowPokeball(scene: BattleScene, pokemon: EnemyPokemon, failCatch(scene, pokemon, originalY, pokeball, pokeballType).then(() => resolve(false)); } else if (shakeCount++ < 3) { if (randSeedInt(65536) < ballTwitchRate) { - scene.playSound("pb_move"); + scene.playSound("se/pb_move"); } else { shakeCounter.stop(); failCatch(scene, pokemon, originalY, pokeball, pokeballType).then(() => resolve(false)); } } else { - scene.playSound("pb_lock"); + scene.playSound("se/pb_lock"); addPokeballCaptureStars(scene, pokeball); const pbTint = scene.add.sprite(pokeball.x, pokeball.y, "pb", "pb"); @@ -445,7 +445,7 @@ export function trainerThrowPokeball(scene: BattleScene, pokemon: EnemyPokemon, function failCatch(scene: BattleScene, pokemon: EnemyPokemon, originalY: number, pokeball: Phaser.GameObjects.Sprite, pokeballType: PokeballType) { return new Promise(resolve => { - scene.playSound("pb_rel"); + scene.playSound("se/pb_rel"); pokemon.setY(originalY); if (pokemon.status?.effect !== StatusEffect.SLEEP) { pokemon.cry(pokemon.getHpRatio() > 0.25 ? undefined : { rate: 0.85 }); @@ -591,7 +591,7 @@ function removePb(scene: BattleScene, pokeball: Phaser.GameObjects.Sprite) { export async function doPokemonFlee(scene: BattleScene, pokemon: EnemyPokemon): Promise { await new Promise(resolve => { - scene.playSound("flee"); + scene.playSound("se/flee"); // Ease pokemon out scene.tweens.add({ targets: pokemon, @@ -635,3 +635,50 @@ export function doPlayerFlee(scene: BattleScene, pokemon: EnemyPokemon): Promise }); }); } + +// Bug Species and their corresponding weights +const GOLDEN_BUG_NET_SPECIES_POOL: [Species, number][] = [ + [Species.SCYTHER, 40], + [Species.SCIZOR, 40], + [Species.KLEAVOR, 40], + [Species.PINSIR, 40], + [Species.HERACROSS, 40], + [Species.YANMA, 40], + [Species.YANMEGA, 40], + [Species.SHUCKLE, 40], + [Species.ANORITH, 40], + [Species.ARMALDO, 40], + [Species.ESCAVALIER, 40], + [Species.ACCELGOR, 40], + [Species.JOLTIK, 40], + [Species.GALVANTULA, 40], + [Species.DURANT, 40], + [Species.LARVESTA, 40], + [Species.VOLCARONA, 40], + [Species.DEWPIDER, 40], + [Species.ARAQUANID, 40], + [Species.WIMPOD, 40], + [Species.GOLISOPOD, 40], + [Species.SIZZLIPEDE, 40], + [Species.CENTISKORCH, 40], + [Species.NYMBLE, 40], + [Species.LOKIX, 40], + [Species.BUZZWOLE, 1], + [Species.PHEROMOSA, 1], +]; + +export function getGoldenBugNetSpecies(scene: BattleScene, waveIndex: integer, level: integer): PokemonSpecies { + const totalWeight = GOLDEN_BUG_NET_SPECIES_POOL.reduce((a, b) => a + b[1], 0); + const roll = randSeedInt(totalWeight); + + let w = 0; + for (const species of GOLDEN_BUG_NET_SPECIES_POOL) { + w += species[1]; + if (roll < w) { + return getPokemonSpecies(species); + } + } + + // Defaults to Scyther + return getPokemonSpecies(GOLDEN_BUG_NET_SPECIES_POOL[0][0]); +} diff --git a/src/data/trainer-config.ts b/src/data/trainer-config.ts index 507b7bd5139..892627f8f7e 100644 --- a/src/data/trainer-config.ts +++ b/src/data/trainer-config.ts @@ -2104,5 +2104,7 @@ export const trainerConfigs: TrainerConfigs = { .setPartyTemplates(trainerPartyTemplates.ONE_AVG), [TrainerType.VITO]: new TrainerConfig(++t).setName("Vito").setTitle("The Winstrates") .setMoneyMultiplier(2) - .setPartyTemplates(new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(3, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(2, PartyMemberStrength.STRONG))) + .setPartyTemplates(new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(3, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(2, PartyMemberStrength.STRONG))), + [TrainerType.BUG_TYPE_SUPERFAN]: new TrainerConfig(++t).setMoneyMultiplier(2.25).setEncounterBgm(TrainerType.ACE_TRAINER) + .setPartyTemplates(new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE)) }; diff --git a/src/enums/mystery-encounter-type.ts b/src/enums/mystery-encounter-type.ts index b36a2c4ce41..26a6b591048 100644 --- a/src/enums/mystery-encounter-type.ts +++ b/src/enums/mystery-encounter-type.ts @@ -24,5 +24,6 @@ export enum MysteryEncounterType { DANCING_LESSONS, WEIRD_DREAM, THE_WINSTRATE_CHALLENGE, - TELEPORTING_HIJINKS + TELEPORTING_HIJINKS, + BUG_TYPE_SUPERFAN } diff --git a/src/enums/trainer-type.ts b/src/enums/trainer-type.ts index 37c5bb5f20b..9ca634ae1f2 100644 --- a/src/enums/trainer-type.ts +++ b/src/enums/trainer-type.ts @@ -94,6 +94,7 @@ export enum TrainerType { VIVI, VICKY, VITO, + BUG_TYPE_SUPERFAN, BROCK = 200, MISTY, diff --git a/src/locales/en/dialogue-female.json b/src/locales/en/dialogue-female.json index 2268b7ccebd..6faf53d86e1 100644 --- a/src/locales/en/dialogue-female.json +++ b/src/locales/en/dialogue-female.json @@ -841,7 +841,7 @@ "2": "We're pulling out all the stops to put your Pokémon down." }, "victory": { - "1": "At times we battle, and sometimes we team up...\n $It's great how Trainers can interact." + "1": "At times we battle, and sometimes we team up...$It's great how Trainers can interact." }, "defeat": { "1": "You put up quite the display.\nBetter luck next time." @@ -857,7 +857,7 @@ }, "winstrates_victoria": { "encounter": { - "1": "My goodness! Aren't you young?\n $You must be quite the trainer to beat my husband, though.\n $Now I suppose it's my turn to battle!" + "1": "My goodness! Aren't you young?$You must be quite the trainer to beat my husband, though.$Now I suppose it's my turn to battle!" }, "victory": { "1": "Uwah! Just how strong are you?!" @@ -865,7 +865,7 @@ }, "winstrates_vivi": { "encounter": { - "1": "You're stronger than Mom? Wow!\n $But I'm strong, too!\nReally! Honestly!" + "1": "You're stronger than Mom? Wow!$But I'm strong, too!\nReally! Honestly!" }, "victory": { "1": "Huh? Did I really lose?\nSnivel... Grandmaaa!" @@ -873,7 +873,7 @@ }, "winstrates_vicky": { "encounter": { - "1": "How dare you make my precious\ngranddaughter cry!\n $I see I need to teach you a lesson.\nPrepare to feel the sting of defeat!" + "1": "How dare you make my precious\ngranddaughter cry!$I see I need to teach you a lesson.\nPrepare to feel the sting of defeat!" }, "victory": { "1": "Whoa! So strong!\nMy granddaughter wasn't lying." @@ -881,7 +881,7 @@ }, "winstrates_vito": { "encounter": { - "1": "I trained together with my whole family,\nevery one of us!\n $I'm not losing to anyone!" + "1": "I trained together with my whole family,\nevery one of us!$I'm not losing to anyone!" }, "victory": { "1": "I was better than everyone in my family.\nI've never lost before..." diff --git a/src/locales/en/dialogue-male.json b/src/locales/en/dialogue-male.json index f10fc11fa7c..410cfd9c3cf 100644 --- a/src/locales/en/dialogue-male.json +++ b/src/locales/en/dialogue-male.json @@ -841,7 +841,7 @@ "2": "We're pulling out all the stops to put your Pokémon down." }, "victory": { - "1": "At times we battle, and sometimes we team up...\n $It's great how Trainers can interact." + "1": "At times we battle, and sometimes we team up...$It's great how Trainers can interact." }, "defeat": { "1": "You put up quite the display.\nBetter luck next time." @@ -857,7 +857,7 @@ }, "winstrates_victoria": { "encounter": { - "1": "My goodness! Aren't you young?\n $You must be quite the trainer to beat my husband, though.\n $Now I suppose it's my turn to battle!" + "1": "My goodness! Aren't you young?$You must be quite the trainer to beat my husband, though.$Now I suppose it's my turn to battle!" }, "victory": { "1": "Uwah! Just how strong are you?!" @@ -865,7 +865,7 @@ }, "winstrates_vivi": { "encounter": { - "1": "You're stronger than Mom? Wow!\n $But I'm strong, too!\nReally! Honestly!" + "1": "You're stronger than Mom? Wow!$But I'm strong, too!\nReally! Honestly!" }, "victory": { "1": "Huh? Did I really lose?\nSnivel... Grandmaaa!" @@ -873,7 +873,7 @@ }, "winstrates_vicky": { "encounter": { - "1": "How dare you make my precious\ngranddaughter cry!\n $I see I need to teach you a lesson.\nPrepare to feel the sting of defeat!" + "1": "How dare you make my precious\ngranddaughter cry!$I see I need to teach you a lesson.\nPrepare to feel the sting of defeat!" }, "victory": { "1": "Whoa! So strong!\nMy granddaughter wasn't lying." @@ -881,7 +881,7 @@ }, "winstrates_vito": { "encounter": { - "1": "I trained together with my whole family,\nevery one of us!\n $I'm not losing to anyone!" + "1": "I trained together with my whole family,\nevery one of us!$I'm not losing to anyone!" }, "victory": { "1": "I was better than everyone in my family.\nI've never lost before..." diff --git a/src/locales/en/modifier-type.json b/src/locales/en/modifier-type.json index 886b93a19f9..21a60788bb7 100644 --- a/src/locales/en/modifier-type.json +++ b/src/locales/en/modifier-type.json @@ -259,9 +259,10 @@ "ENEMY_FUSED_CHANCE": { "name": "Fusion Token", "description": "Adds a 1% chance that a wild Pokémon will be a fusion." }, "MYSTERY_ENCOUNTER_SHUCKLE_JUICE": { "name": "Shuckle Juice" }, - "MYSTERY_ENCOUNTER_BLACK_SLUDGE": { "name": "Black Sludge", "description": "The stench is so powerful that healing items are no longer available to purchase in shops." }, + "MYSTERY_ENCOUNTER_BLACK_SLUDGE": { "name": "Black Sludge", "description": "The stench is so powerful that shops will only sell you items at a steep cost increase." }, "MYSTERY_ENCOUNTER_MACHO_BRACE": { "name": "Macho Brace", "description": "Defeating a Pokémon grants the holder a Macho Brace stack. Each stack slightly boosts stats, with an extra bonus at max stacks." }, - "MYSTERY_ENCOUNTER_OLD_GATEAU": { "name": "Old Gateau", "description": "Increases the holder's {{stats}} stats by {{statValue}}." } + "MYSTERY_ENCOUNTER_OLD_GATEAU": { "name": "Old Gateau", "description": "Increases the holder's {{stats}} stats by {{statValue}}." }, + "MYSTERY_ENCOUNTER_GOLDEN_BUG_NET": { "name": "Golden Bug Net", "description": "Imbues the owner with luck to find Bug Type Pokémon more often. Has a strange heft to it." } }, "SpeciesBoosterItem": { "LIGHT_BALL": { "name": "Light Ball", "description": "It's a mysterious orb that boosts Pikachu's Attack and Sp. Atk stats." }, diff --git a/src/locales/en/mystery-encounter.ts b/src/locales/en/mystery-encounter.ts index 7328c2d5b1b..5578cf6fe1b 100644 --- a/src/locales/en/mystery-encounter.ts +++ b/src/locales/en/mystery-encounter.ts @@ -24,6 +24,7 @@ import dancingLessonsDialogue from "#app/locales/en/mystery-encounters/dancing-l import weirdDreamDialogue from "#app/locales/en/mystery-encounters/weird-dream-dialogue.json"; import theWinstrateChallengeDialogue from "#app/locales/en/mystery-encounters/the-winstrate-challenge-dialogue.json"; import teleportingHijinksDialogue from "#app/locales/en/mystery-encounters/teleporting-hijinks-dialogue.json"; +import bugTypeSuperfanDialogue from "#app/locales/en/mystery-encounters/bug-type-superfan-dialogue.json"; /** * Injection patterns that can be used: @@ -75,5 +76,6 @@ export const mysteryEncounter = { dancingLessons: dancingLessonsDialogue, weirdDream: weirdDreamDialogue, theWinstrateChallenge: theWinstrateChallengeDialogue, - teleportingHijinks: teleportingHijinksDialogue + teleportingHijinks: teleportingHijinksDialogue, + bugTypeSuperfan: bugTypeSuperfanDialogue } as const; diff --git a/src/locales/en/mystery-encounters/a-trainers-test-dialogue.json b/src/locales/en/mystery-encounters/a-trainers-test-dialogue.json index a28d31841a3..c96c0d5f327 100644 --- a/src/locales/en/mystery-encounters/a-trainers-test-dialogue.json +++ b/src/locales/en/mystery-encounters/a-trainers-test-dialogue.json @@ -1,29 +1,29 @@ { "intro": "An extremely strong trainer approaches you...", "buck": { - "intro_dialogue": "Yo, trainer! My name's Buck.\n $I have a super awesome proposal\nfor a strong trainer such as yourself!\n $I'm carrying two rare Pokémon Eggs with me,\nbut I'd like someone else to care for one.\n $If you can prove your strength as a trainer to me,\nI'll give you the rarer egg!", + "intro_dialogue": "Yo, trainer! My name's Buck.$I have a super awesome proposal\nfor a strong trainer such as yourself!$I'm carrying two rare Pokémon Eggs with me,\nbut I'd like someone else to care for one.$If you can prove your strength as a trainer to me,\nI'll give you the rarer egg!", "accept": "Whoooo, I'm getting fired up!", - "decline": "Darn, it looks like your\nteam isn't in peak condition.\n $Here, let me help with that." + "decline": "Darn, it looks like your\nteam isn't in peak condition.$Here, let me help with that." }, "cheryl": { - "intro_dialogue": "Hello, my name's Cheryl.\n $I have a particularly interesting request,\nfor a strong trainer such as yourself.\n $I'm carrying two rare Pokémon Eggs with me,\nbut I'd like someone else to care for one.\n $If you can prove your strength as a trainer to me,\nI'll give you the rarer Egg!", + "intro_dialogue": "Hello, my name's Cheryl.$I have a particularly interesting request,\nfor a strong trainer such as yourself.$I'm carrying two rare Pokémon Eggs with me,\nbut I'd like someone else to care for one.$If you can prove your strength as a trainer to me,\nI'll give you the rarer Egg!", "accept": "I hope you're ready!", - "decline": "I understand, it looks like your team\nisn't in the best condition at the moment.\n $Here, let me help with that." + "decline": "I understand, it looks like your team\nisn't in the best condition at the moment.$Here, let me help with that." }, "marley": { - "intro_dialogue": "...@d{64} I'm Marley.\n $I have an offer for you...\n $I'm carrying two Pokémon Eggs with me,\nbut I'd like someone else to care for one.\n $If you're stronger than me,\nI'll give you the rarer Egg.", + "intro_dialogue": "...@d{64} I'm Marley.$I have an offer for you...$I'm carrying two Pokémon Eggs with me,\nbut I'd like someone else to care for one.$If you're stronger than me,\nI'll give you the rarer Egg.", "accept": "... I see.", - "decline": "... I see.\n $Your Pokémon look hurt...\nLet me help." + "decline": "... I see.$Your Pokémon look hurt...\nLet me help." }, "mira": { - "intro_dialogue": "Hi! I'm Mira!\n $Mira has a request\nfor a strong trainer like you!\n $Mira has two rare Pokémon Eggs,\nbut Mira wants someone else to take one!\n $If you show Mira that you're strong,\nMira will give you the rarer Egg!", + "intro_dialogue": "Hi! I'm Mira!$Mira has a request\nfor a strong trainer like you!$Mira has two rare Pokémon Eggs,\nbut Mira wants someone else to take one!$If you show Mira that you're strong,\nMira will give you the rarer Egg!", "accept": "You'll battle Mira?\nYay!", - "decline": "Aww, no battle?\nThat's okay!\n $Here, Mira will heal your team!" + "decline": "Aww, no battle?\nThat's okay!$Here, Mira will heal your team!" }, "riley": { - "intro_dialogue": "I'm Riley.\n $I have an odd proposal\nfor a strong trainer such as yourself.\n $I'm carrying two rare Pokémon Eggs with me,\nbut I'd like to give one to another trainer.\n $If you can prove your strength to me,\nI'll give you the rarer Egg!", + "intro_dialogue": "I'm Riley.$I have an odd proposal\nfor a strong trainer such as yourself.$I'm carrying two rare Pokémon Eggs with me,\nbut I'd like to give one to another trainer.$If you can prove your strength to me,\nI'll give you the rarer Egg!", "accept": "That look you have...\nLet's do this.", - "decline": "I understand, your team looks beat up.\n $Here, let me help with that." + "decline": "I understand, your team looks beat up.$Here, let me help with that." }, "title": "A Trainer's Test", "description": "It seems this trainer is willing to give you an Egg regardless of your decision. However, if you can manage to defeat this strong trainer, you'll receive a much rarer Egg.", diff --git a/src/locales/en/mystery-encounters/absolute-avarice-dialogue.json b/src/locales/en/mystery-encounters/absolute-avarice-dialogue.json index 9e58b3ec8ac..234371c4b4e 100644 --- a/src/locales/en/mystery-encounters/absolute-avarice-dialogue.json +++ b/src/locales/en/mystery-encounters/absolute-avarice-dialogue.json @@ -9,17 +9,17 @@ "tooltip": "(-) Tough Battle\n(+) Rewards from its Berry Hoard", "selected": "The Greedent stuffs its cheeks\nand prepares for battle!", "boss_enraged": "Greedent's fierce love for food has it incensed!", - "food_stash": "It looks like the Greedent was guarding an enormous stash of food!\n $@s{item_fanfare}Each Pokémon in your party gains 1x Reviver Seed!" + "food_stash": "It looks like the Greedent was guarding an enormous stash of food!$@s{item_fanfare}Each Pokémon in your party gains 1x Reviver Seed!" }, "2": { "label": "Reason with It", "tooltip": "(+) Regain Some Lost Berries", - "selected": "Your pleading strikes a chord with the Greedent.\n $It doesn't give all your berries back, but still tosses a few in your direction." + "selected": "Your pleading strikes a chord with the Greedent.$It doesn't give all your berries back, but still tosses a few in your direction." }, "3": { "label": "Let It Have the Food", "tooltip": "(-) Lose All Berries\n(?) The Greedent Will Like You", - "selected": "The Greedent devours the entire\nstash of berries in a flash!\n $Patting its stomach,\nit looks at you appreciatively.\n $Perhaps you could feed it\nmore berries on your adventure...\n $@s{level_up_fanfare}The Greedent wants to join your party!" + "selected": "The Greedent devours the entire\nstash of berries in a flash!$Patting its stomach,\nit looks at you appreciatively.$Perhaps you could feed it\nmore berries on your adventure...$@s{level_up_fanfare}The Greedent wants to join your party!" } } } \ No newline at end of file diff --git a/src/locales/en/mystery-encounters/an-offer-you-cant-refuse-dialogue.json b/src/locales/en/mystery-encounters/an-offer-you-cant-refuse-dialogue.json index 30665fdb5d1..cb3415fefd9 100644 --- a/src/locales/en/mystery-encounters/an-offer-you-cant-refuse-dialogue.json +++ b/src/locales/en/mystery-encounters/an-offer-you-cant-refuse-dialogue.json @@ -1,7 +1,7 @@ { "intro": "You're stopped by a rich looking boy.", "speaker": "Rich Boy", - "intro_dialogue": "Good day to you.\n $I can't help but notice that your\n{{strongestPokemon}} looks positively divine!\n $I've always wanted to have a pet like that!\n $I'd pay you handsomely,\nand also give you this old bauble!", + "intro_dialogue": "Good day to you.$I can't help but notice that your\n{{strongestPokemon}} looks positively divine!$I've always wanted to have a pet like that!$I'd pay you handsomely,\nand also give you this old bauble!", "title": "An Offer You Can't Refuse", "description": "You're being offered a @[TOOLTIP_TITLE]{Shiny Charm} and {{price, money}} for your {{strongestPokemon}}!\n\nIt's an extremely good deal, but can you really bear to part with such a strong team member?", "query": "What will you do?", @@ -9,7 +9,7 @@ "1": { "label": "Accept the Deal", "tooltip": "(-) Lose {{strongestPokemon}}\n(+) Gain a @[TOOLTIP_TITLE]{Shiny Charm}\n(+) Gain {{price, money}}", - "selected": "Wonderful!@d{32} Come along, {{strongestPokemon}}!\n $It's time to show you off to everyone at the yacht club!\n $They'll be so jealous!" + "selected": "Wonderful!@d{32} Come along, {{strongestPokemon}}!$It's time to show you off to everyone at the yacht club!$They'll be so jealous!" }, "2": { "label": "Extort the Kid", @@ -20,7 +20,7 @@ "3": { "label": "Leave", "tooltip": "(-) No Rewards", - "selected": "What a rotten day...\n $Ah, well. Let's return to the yacht club then, Liepard." + "selected": "What a rotten day...$Ah, well. Let's return to the yacht club then, Liepard." } } } \ No newline at end of file diff --git a/src/locales/en/mystery-encounters/berries-abound-dialogue.json b/src/locales/en/mystery-encounters/berries-abound-dialogue.json index 1a6ed26e661..7add02a40a1 100644 --- a/src/locales/en/mystery-encounters/berries-abound-dialogue.json +++ b/src/locales/en/mystery-encounters/berries-abound-dialogue.json @@ -13,8 +13,8 @@ "2": { "label": "Race to the Bush", "tooltip": "(-) {{fastestPokemon}} Uses its Speed\n(+) Gain Berries", - "selected": "Your {{fastestPokemon}} races for the berry bush!\n $It manages to nab {{numBerries}} before the {{enemyPokemon}} can react!\n $You quickly retreat with your newfound prize.", - "selected_bad": "Your {{fastestPokemon}} races for the berry bush!\n $Oh no! The {{enemyPokemon}} was faster and blocked off the approach!", + "selected": "Your {{fastestPokemon}} races for the berry bush!$It manages to nab {{numBerries}} before the {{enemyPokemon}} can react!$You quickly retreat with your newfound prize.", + "selected_bad": "Your {{fastestPokemon}} races for the berry bush!$Oh no! The {{enemyPokemon}} was faster and blocked off the approach!", "boss_enraged": "The opposing {{enemyPokemon}} has become enraged!" }, "3": { diff --git a/src/locales/en/mystery-encounters/bug-type-superfan-dialogue.json b/src/locales/en/mystery-encounters/bug-type-superfan-dialogue.json new file mode 100644 index 00000000000..13087c1d932 --- /dev/null +++ b/src/locales/en/mystery-encounters/bug-type-superfan-dialogue.json @@ -0,0 +1,37 @@ +{ + "intro": "An unusual trainer with all kinds of Bug paraphernalia blocks your way!", + "intro_dialogue": "Hey, trainer! I'm on a mission to find the rarest Bug Pokémon in existence!$You must love Bug Pokémon too, right?\nEveryone loves Bug Pokémon!", + "title": "The Bug-Type Superfan", + "speaker": "Bug-Type Superfan", + "description": "The trainer prattles, not even waiting for a response...\n\nIt seems the only way to get out of this situation is by catching the trainer's attention!", + "query": "What will you do?", + "option": { + "1": { + "label": "Offer to Battle", + "tooltip": "(-) Challenging Battle\n(+) Teach a Pokémon a Bug Type Move", + "selected": "A challenge, eh?\nMy bugs are more than ready for you!" + }, + "2": { + "label": "Show Your Bug Types", + "tooltip": "(+) Receive a Gift Item", + "disabled_tooltip": "You need at least 1 Bug Type Pokémon on your team to select this.", + "selected": "You show the trainer all your Bug Type Pokémon...", + "selected_0_to_1": "Huh? You only have {{numBugTypes}}...$Guess I'm wasting my breath on someone like you...", + "selected_2_3": "Hey, you've got {{numBugTypes}} Bug Types!\nNot bad.$Here, this might help you on your journey to catch more!", + "selected_4_to_5": "What? You have {{numBugTypes}} Bug Types?\nNice!$You're not quite at my level, but I can see shades of myself in you!\n$Take this, my young apprentice!", + "selected_6": "Whoa! {{numBugTypes}} Bug Types!\n$You must love Bug Types almost as much as I do!$Here, take this as a token of our camaraderie!" + }, + "3": { + "label": "Gift a Bug Item", + "tooltip": "(-) Give the trainer a Quick Claw, Grip Claw, or Silver Powder\n(+) Receive a Gift Item", + "disabled_tooltip": "You need to have a Quick Claw, Grip Claw, or Silver Powder to select this.", + "select_prompt": "Select an item to give.", + "invalid_selection": "Pokémon doesn't have that kind of item.", + "selected": "You hand the trainer a {{selectedItem}}.", + "selected_dialogue": "Whoa! A {{selectedItem}}, for me?\nYou're not so bad, kid!$As a token of my appreciation,\nI want you to have this special gift!$It's been passed all through my family, and now I want you to have it!" + } + }, + "battle_won": "Your knowledge and skill were perfect at exploiting our weaknesses!$In exchange for the valuable lesson,\nallow me to teach one of your Pokémon a Bug Type Move!", + "confirm_no_teach": "You sure you don't want to learn one of these great moves?", + "outro": "I see great Bug Pokémon in your future!\nMay our paths cross again!$Bug out!" +} \ No newline at end of file diff --git a/src/locales/en/mystery-encounters/dancing-lessons-dialogue.json b/src/locales/en/mystery-encounters/dancing-lessons-dialogue.json index bd75ab13f24..98f38aac62d 100644 --- a/src/locales/en/mystery-encounters/dancing-lessons-dialogue.json +++ b/src/locales/en/mystery-encounters/dancing-lessons-dialogue.json @@ -13,14 +13,14 @@ "2": { "label": "Learn Its Dance", "tooltip": "(+) Teach a Pokémon Revelation Dance", - "selected": "You watch the Oricorio closely as it performs its dance...\n $@s{level_up_fanfare}Your {{selectedPokemon}} wants to learn Revelation Dance!" + "selected": "You watch the Oricorio closely as it performs its dance...$@s{level_up_fanfare}Your {{selectedPokemon}} wants to learn Revelation Dance!" }, "3": { "label": "Show It a Dance", "tooltip": "(-) Teach the Oricorio a Dance Move\n(+) The Oricorio Will Like You", "disabled_tooltip": "Your Pokémon need to know a Dance move for this.", "select_prompt": "Select a Dance type move to use.", - "selected": "The Oricorio watches in fascination as\n{{selectedPokemon}} shows off {{selectedMove}}!\n $It loves the display!\n $@s{level_up_fanfare}The Oricorio wants to join your party!" + "selected": "The Oricorio watches in fascination as\n{{selectedPokemon}} shows off {{selectedMove}}!$It loves the display!$@s{level_up_fanfare}The Oricorio wants to join your party!" } }, "invalid_selection": "This Pokémon doesn't know a Dance move" diff --git a/src/locales/en/mystery-encounters/dark-deal-dialogue.json b/src/locales/en/mystery-encounters/dark-deal-dialogue.json index d3a94a312d3..3086ebb0f9b 100644 --- a/src/locales/en/mystery-encounters/dark-deal-dialogue.json +++ b/src/locales/en/mystery-encounters/dark-deal-dialogue.json @@ -3,7 +3,7 @@ { "intro": "A strange man in a tattered coat\nstands in your way...", "speaker": "Shady Guy", - "intro_dialogue": "Hey, you!\n $I've been working on a new device\nto bring out a Pokémon's latent power!\n $It completely rebinds the Pokémon's atoms\nat a molecular level into a far more powerful form.\n $Hehe...@d{64} I just need some sac-@d{32}\nErr, test subjects, to prove it works.", + "intro_dialogue": "Hey, you!$I've been working on a new device\nto bring out a Pokémon's latent power!$It completely rebinds the Pokémon's atoms\nat a molecular level into a far more powerful form.$Hehe...@d{64} I just need some sac-@d{32}\nErr, test subjects, to prove it works.", "title": "Dark Deal", "description": "The disturbing fellow holds up some Pokéballs.\n\"I'll make it worth your while! You can have these strong Pokéballs as payment, All I need is a Pokémon from your team! Hehe...\"", "query": "What will you do?", @@ -11,8 +11,8 @@ "1": { "label": "Accept", "tooltip": "(+) 5 Rogue Balls\n(?) Enhance a Random Pokémon", - "selected_dialogue": "Let's see, that {{pokeName}} will do nicely!\n $Remember, I'm not responsible\nif anything bad happens!@d{32} Hehe...", - "selected_message": "The man hands you 5 Rogue Balls.\n ${{pokeName}} hops into the strange machine...\n $Flashing lights and weird noises\nstart coming from the machine!\n $...@d{96} Something emerges\nfrom the device, raging wildly!" + "selected_dialogue": "Let's see, that {{pokeName}} will do nicely!$Remember, I'm not responsible\nif anything bad happens!@d{32} Hehe...", + "selected_message": "The man hands you 5 Rogue Balls.${{pokeName}} hops into the strange machine...$Flashing lights and weird noises\nstart coming from the machine!$...@d{96} Something emerges\nfrom the device, raging wildly!" }, "2": { "label": "Refuse", diff --git a/src/locales/en/mystery-encounters/delibirdy-dialogue.json b/src/locales/en/mystery-encounters/delibirdy-dialogue.json index d5bdf608663..b20e7195659 100644 --- a/src/locales/en/mystery-encounters/delibirdy-dialogue.json +++ b/src/locales/en/mystery-encounters/delibirdy-dialogue.json @@ -10,20 +10,20 @@ "1": { "label": "Give Money", "tooltip": "(-) Give the Delibirds {{money, money}}\n(+) Receive a Gift Item", - "selected": "You toss the money to the Delibirds,\nwho chatter amongst themselves excitedly.\n $They turn back to you and happily give you a present!" + "selected": "You toss the money to the Delibirds,\nwho chatter amongst themselves excitedly.$They turn back to you and happily give you a present!" }, "2": { "label": "Give Food", "tooltip": "(-) Give the Delibirds a Berry or Reviver Seed\n(+) Receive a Gift Item", "select_prompt": "Select an item to give.", - "selected": "You toss the {{chosenItem}} to the Delibirds,\nwho chatter amongst themselves excitedly.\n $They turn back to you and happily give you a present!" + "selected": "You toss the {{chosenItem}} to the Delibirds,\nwho chatter amongst themselves excitedly.$They turn back to you and happily give you a present!" }, "3": { "label": "Give an Item", "tooltip": "(-) Give the Delibirds a Held Item\n(+) Receive a Gift Item", "select_prompt": "Select an item to give.", - "selected": "You toss the {{chosenItem}} to the Delibirds,\nwho chatter amongst themselves excitedly.\n $They turn back to you and happily give you a present!" + "selected": "You toss the {{chosenItem}} to the Delibirds,\nwho chatter amongst themselves excitedly.$They turn back to you and happily give you a present!" } }, - "outro": "The Delibird pack happily waddles off into the distance.\n $What a curious little exchange!" + "outro": "The Delibird pack happily waddles off into the distance.$What a curious little exchange!" } \ No newline at end of file diff --git a/src/locales/en/mystery-encounters/department-store-sale-dialogue.json b/src/locales/en/mystery-encounters/department-store-sale-dialogue.json index d7ef07f7462..d651f32665a 100644 --- a/src/locales/en/mystery-encounters/department-store-sale-dialogue.json +++ b/src/locales/en/mystery-encounters/department-store-sale-dialogue.json @@ -1,7 +1,7 @@ { "intro": "It's a lady with a ton of shopping bags.", "speaker": "Shopper", - "intro_dialogue": "Hello! Are you here for\nthe amazing sales too?\n $There's a special coupon that you can\nredeem for a free item during the sale!\n $I have an extra one. Here you go!", + "intro_dialogue": "Hello! Are you here for\nthe amazing sales too?$There's a special coupon that you can\nredeem for a free item during the sale!$I have an extra one. Here you go!", "title": "Department Store Sale", "description": "There is merchandise in every direction! It looks like there are 4 counters where you can redeem the coupon for various items. The possibilities are endless!", "query": "Which counter will you go to?", diff --git a/src/locales/en/mystery-encounters/field-trip-dialogue.json b/src/locales/en/mystery-encounters/field-trip-dialogue.json index 1bb58be363b..d688fe7af97 100644 --- a/src/locales/en/mystery-encounters/field-trip-dialogue.json +++ b/src/locales/en/mystery-encounters/field-trip-dialogue.json @@ -1,7 +1,7 @@ { "intro": "It's a teacher and some school children!", "speaker": "Teacher", - "intro_dialogue": "Hello, there! Would you be able to\nspare a minute for my students?\n $I'm teaching them about Pokémon moves\nand would love to show them a demonstration.\n $Would you mind showing us one of\nthe moves your Pokémon can use?", + "intro_dialogue": "Hello, there! Would you be able to\nspare a minute for my students?$I'm teaching them about Pokémon moves\nand would love to show them a demonstration.$Would you mind showing us one of\nthe moves your Pokémon can use?", "title": "Field Trip", "description": "A teacher is requesting a move demonstration from a Pokémon. Depending on the move you choose, she might have something useful for you in exchange.", "query": "Which move category will you show off?", @@ -19,8 +19,8 @@ "tooltip": "(+) Status Item Rewards" }, "selected": "{{pokeName}} shows off an awesome display of {{move}}!", - "incorrect": "...\n $That isn't a {{moveCategory}} move!\n $I'm sorry, but I can't give you anything.", - "lesson_learned": "Looks like you learned a valuable lesson?\n $Your Pokémon also gained some knowledge." + "incorrect": "...$That isn't a {{moveCategory}} move!$I'm sorry, but I can't give you anything.", + "lesson_learned": "Looks like you learned a valuable lesson?$Your Pokémon also gained some knowledge." }, "second_option_prompt": "Choose a move for your Pokémon to use.", "outro_good": "Thank you so much for your kindness!\nI hope the items I had were helpful!", diff --git a/src/locales/en/mystery-encounters/fiery-fallout-dialogue.json b/src/locales/en/mystery-encounters/fiery-fallout-dialogue.json index 5c36f3a8b99..ea45ddf4bb8 100644 --- a/src/locales/en/mystery-encounters/fiery-fallout-dialogue.json +++ b/src/locales/en/mystery-encounters/fiery-fallout-dialogue.json @@ -7,20 +7,20 @@ "1": { "label": "Find the Source", "tooltip": "(?) Discover the source\n(-) Hard Battle", - "selected": "You push through the storm, and find two Volcarona in the middle of a mating dance!\n $They don't take kindly to the interruption and attack!" + "selected": "You push through the storm, and find two Volcarona in the middle of a mating dance!$They don't take kindly to the interruption and attack!" }, "2": { "label": "Hunker Down", "tooltip": "(-) Suffer the effects of the weather", - "selected": "The weather effects cause significant\nharm as you struggle to find shelter!\n $Your party takes 20% Max HP damage!", + "selected": "The weather effects cause significant\nharm as you struggle to find shelter!$Your party takes 20% Max HP damage!", "target_burned": "Your {{burnedPokemon}} also became burned!" }, "3": { "label": "Your Fire Types Help", "tooltip": "(+) End the conditions\n(+) Gain a Charcoal", "disabled_tooltip": "You need at least 2 Fire Type Pokémon to choose this", - "selected": "Your {{option3PrimaryName}} and {{option3SecondaryName}} guide you to where two Volcarona are in the middle of a mating dance!\n $Thankfully, your Pokémon are able to calm them,\nand they depart without issue." + "selected": "Your {{option3PrimaryName}} and {{option3SecondaryName}} guide you to where two Volcarona are in the middle of a mating dance!$Thankfully, your Pokémon are able to calm them,\nand they depart without issue." } }, - "found_charcoal": "After the weather clears,\nyour {{leadPokemon}} spots something on the ground.\n $@s{item_fanfare}{{leadPokemon}} gained a Charcoal!" + "found_charcoal": "After the weather clears,\nyour {{leadPokemon}} spots something on the ground.$@s{item_fanfare}{{leadPokemon}} gained a Charcoal!" } \ No newline at end of file diff --git a/src/locales/en/mystery-encounters/fight-or-flight-dialogue.json b/src/locales/en/mystery-encounters/fight-or-flight-dialogue.json index 3ba99b7ba17..2a82287327c 100644 --- a/src/locales/en/mystery-encounters/fight-or-flight-dialogue.json +++ b/src/locales/en/mystery-encounters/fight-or-flight-dialogue.json @@ -13,7 +13,7 @@ "label": "Steal the Item", "disabled_tooltip": "Your Pokémon need to know certain moves to choose this", "tooltip": "(+) {{option2PrimaryName}} uses {{option2PrimaryMove}}", - "selected": ".@d{32}.@d{32}.@d{32}\n $Your {{option2PrimaryName}} helps you out and uses {{option2PrimaryMove}}!\n $You nabbed the item!" + "selected": ".@d{32}.@d{32}.@d{32}$Your {{option2PrimaryName}} helps you out and uses {{option2PrimaryMove}}!$You nabbed the item!" }, "3": { "label": "Leave", diff --git a/src/locales/en/mystery-encounters/lost-at-sea-dialogue.json b/src/locales/en/mystery-encounters/lost-at-sea-dialogue.json index 8e10a39b479..41709c66799 100644 --- a/src/locales/en/mystery-encounters/lost-at-sea-dialogue.json +++ b/src/locales/en/mystery-encounters/lost-at-sea-dialogue.json @@ -9,19 +9,19 @@ "label_disabled": "Can't {{option1RequiredMove}}", "tooltip": "(+) {{option1PrimaryName}} saves you\n(+) {{option1PrimaryName}} gains some EXP", "tooltip_disabled": "You have no Pokémon to {{option1RequiredMove}} on", - "selected": "{{option1PrimaryName}} swims ahead, guiding you back on track.\n ${{option1PrimaryName}} seems to also have gotten stronger in this time of need!" + "selected": "{{option1PrimaryName}} swims ahead, guiding you back on track.${{option1PrimaryName}} seems to also have gotten stronger in this time of need!" }, "2": { "label": "{{option2PrimaryName}} Might Help", "label_disabled": "Can't {{option2RequiredMove}}", "tooltip": "(+) {{option2PrimaryName}} saves you\n(+) {{option2PrimaryName}} gains some EXP", "tooltip_disabled": "You have no Pokémon to {{option2RequiredMove}} with", - "selected": "{{option2PrimaryName}} flies ahead of your boat, guiding you back on track.\n ${{option2PrimaryName}} seems to also have gotten stronger in this time of need!" + "selected": "{{option2PrimaryName}} flies ahead of your boat, guiding you back on track.${{option2PrimaryName}} seems to also have gotten stronger in this time of need!" }, "3": { "label": "Wander Aimlessly", "tooltip": "(-) Each of your Pokémon lose {{damagePercentage}}% of their total HP", - "selected": "You float about in the boat, steering without direction until you finally spot a landmark you remember.\n $You and your Pokémon are fatigued from the whole ordeal." + "selected": "You float about in the boat, steering without direction until you finally spot a landmark you remember.$You and your Pokémon are fatigued from the whole ordeal." } }, "outro": "You are back on track." diff --git a/src/locales/en/mystery-encounters/mysterious-chest-dialogue.json b/src/locales/en/mystery-encounters/mysterious-chest-dialogue.json index cbe5df1cda8..3703ec4d606 100644 --- a/src/locales/en/mystery-encounters/mysterious-chest-dialogue.json +++ b/src/locales/en/mystery-encounters/mysterious-chest-dialogue.json @@ -12,7 +12,7 @@ "good": "Some pretty nice tools and items.", "great": "A couple great tools and items!", "amazing": "Whoa! An amazing item!", - "bad": "Oh no!@d{32}\nThe chest was trapped!\n $Your {{pokeName}} jumps in front of you\nbut is KOed in the process." + "bad": "Oh no!@d{32}\nThe chest was trapped!$Your {{pokeName}} jumps in front of you\nbut is KOed in the process." }, "2": { "label": "Too Risky, Leave", diff --git a/src/locales/en/mystery-encounters/part-timer-dialogue.json b/src/locales/en/mystery-encounters/part-timer-dialogue.json index 918b1fb61b8..614f1818e3f 100644 --- a/src/locales/en/mystery-encounters/part-timer-dialogue.json +++ b/src/locales/en/mystery-encounters/part-timer-dialogue.json @@ -1,7 +1,7 @@ { "intro": "A busy worker flags you down.", "speaker": "Worker", - "intro_dialogue": "You look like someone with lots of capable Pokémon!\n $We can pay you if you're able to help us with some part-time work!", + "intro_dialogue": "You look like someone with lots of capable Pokémon!$We can pay you if you're able to help us with some part-time work!", "title": "Part-Timer", "description": "Looks like there are plenty of tasks that need to be done. Depending how well-suited your Pokémon is to a task, they might earn more or less money.", "query": "Which job will you choose?", @@ -24,8 +24,8 @@ "selected": "Your {{option3PrimaryName}} spends the day using {{option3PrimaryMove}} to attract customers to the business!" } }, - "job_complete_good": "Thanks for the assistance!\nYour {{selectedPokemon}} was incredibly helpful!\n $Here's your check for the day.", - "job_complete_bad": "Your {{selectedPokemon}} helped us out a bit!\n $Here's your check for the day.", + "job_complete_good": "Thanks for the assistance!\nYour {{selectedPokemon}} was incredibly helpful!$Here's your check for the day.", + "job_complete_bad": "Your {{selectedPokemon}} helped us out a bit!$Here's your check for the day.", "pokemon_tired": "Your {{selectedPokemon}} is worn out!\nThe PP of all its moves was reduced to 2!", "outro": "Come back and help out again sometime!" } \ No newline at end of file diff --git a/src/locales/en/mystery-encounters/shady-vitamin-dealer-dialogue.json b/src/locales/en/mystery-encounters/shady-vitamin-dealer-dialogue.json index 94904fbcb12..8d59cd03316 100644 --- a/src/locales/en/mystery-encounters/shady-vitamin-dealer-dialogue.json +++ b/src/locales/en/mystery-encounters/shady-vitamin-dealer-dialogue.json @@ -1,7 +1,7 @@ { "intro": "A man in a dark coat approaches you.", "speaker": "Shady Salesman", - "intro_dialogue": ".@d{16}.@d{16}.@d{16}\n $I've got the goods if you've got the money.\n $Make sure your Pokémon can handle it though.", + "intro_dialogue": ".@d{16}.@d{16}.@d{16}$I've got the goods if you've got the money.$Make sure your Pokémon can handle it though.", "title": "The Vitamin Dealer", "description": "The man opens his jacket to reveal some Pokémon vitamins. The numbers he quotes seem like a really good deal. Almost too good...\nHe offers two package deals to choose from.", "query": "Which deal will choose?", @@ -20,10 +20,10 @@ "tooltip": "(-) No Rewards", "selected": "Heh, wouldn't have figured you for a coward." }, - "selected": "The man hands you two bottles and quickly disappears.\n ${{selectedPokemon}} gained {{boost1}} and {{boost2}} boosts!" + "selected": "The man hands you two bottles and quickly disappears.${{selectedPokemon}} gained {{boost1}} and {{boost2}} boosts!" }, - "damage_only": "But the medicine had some side effects!\n $Your {{selectedPokemon}} takes some damage...", - "bad_poison": "But the medicine had some side effects!\n $Your {{selectedPokemon}} takes some damage\nand becomes badly poisoned...", - "poison": "But the medicine had some side effects!\n $Your {{selectedPokemon}} becomes poisoned...", + "damage_only": "But the medicine had some side effects!$Your {{selectedPokemon}} takes some damage...", + "bad_poison": "But the medicine had some side effects!$Your {{selectedPokemon}} takes some damage\nand becomes badly poisoned...", + "poison": "But the medicine had some side effects!$Your {{selectedPokemon}} becomes poisoned...", "no_bad_effects": "Looks like there were no side-effects this time." } \ No newline at end of file diff --git a/src/locales/en/mystery-encounters/slumbering-snorlax-dialogue.json b/src/locales/en/mystery-encounters/slumbering-snorlax-dialogue.json index 82e202d9367..f6f4da7826a 100644 --- a/src/locales/en/mystery-encounters/slumbering-snorlax-dialogue.json +++ b/src/locales/en/mystery-encounters/slumbering-snorlax-dialogue.json @@ -1,5 +1,5 @@ { - "intro": "As you walk down a narrow pathway, you see a towering silhouette blocking your path.\n $You get closer to see a Snorlax sleeping peacefully.\nIt seems like there's no way around it.", + "intro": "As you walk down a narrow pathway, you see a towering silhouette blocking your path.$You get closer to see a Snorlax sleeping peacefully.\nIt seems like there's no way around it.", "title": "Slumbering Snorlax", "description": "You could attack it to try and get it to move, or simply wait for it to wake up. Who knows how long that could take, though...", "query": "What will you do?", @@ -12,14 +12,14 @@ "2": { "label": "Wait for It to Move", "tooltip": "(-) Wait a Long Time\n(+) Recover Party", - "selected": ".@d{32}.@d{32}.@d{32}\n $You wait for a time, but the Snorlax's yawns make your party sleepy...", + "selected": ".@d{32}.@d{32}.@d{32}$You wait for a time, but the Snorlax's yawns make your party sleepy...", "rest_result": "When you all awaken, the Snorlax is no where to be found -\nbut your Pokémon are all healed!" }, "3": { "label": "Steal Its Item", "tooltip": "(+) {{option3PrimaryName}} uses {{option3PrimaryMove}}\n(+) Special Reward", "disabled_tooltip": "Your Pokémon need to know certain moves to choose this", - "selected": "Your {{option3PrimaryName}} uses {{option3PrimaryMove}}!\n $@s{item_fanfare}It steals Leftovers off the sleeping\nSnorlax and you make out like bandits!" + "selected": "Your {{option3PrimaryName}} uses {{option3PrimaryMove}}!$@s{item_fanfare}It steals Leftovers off the sleeping\nSnorlax and you make out like bandits!" } } } \ No newline at end of file diff --git a/src/locales/en/mystery-encounters/teleporting-hijinks-dialogue.json b/src/locales/en/mystery-encounters/teleporting-hijinks-dialogue.json index a2665686d88..c295867f521 100644 --- a/src/locales/en/mystery-encounters/teleporting-hijinks-dialogue.json +++ b/src/locales/en/mystery-encounters/teleporting-hijinks-dialogue.json @@ -13,15 +13,15 @@ "label": "A Pokémon Helps", "tooltip": "(-) {{option2PrimaryName}} Helps\n(+) {{option2PrimaryName}} gains EXP\n(?) Teleport to New Biome", "disabled_tooltip": "You need a Steel or Electric Type Pokémon to choose this", - "selected": "{{option2PrimaryName}}'s Type allows it to bypass the machine's paywall!\n $The capsule opens, and you step inside..." + "selected": "{{option2PrimaryName}}'s Type allows it to bypass the machine's paywall!$The capsule opens, and you step inside..." }, "3": { "label": "Inspect the Machine", "tooltip": "(-) Pokémon Battle", - "selected": "You are drawn in by the blinking lights\nand strange noises coming from the machine...\n $You don't even notice as a wild\nPokémon sneaks up and ambushes you!" + "selected": "You are drawn in by the blinking lights\nand strange noises coming from the machine...$You don't even notice as a wild\nPokémon sneaks up and ambushes you!" } }, - "transport": "The machine shakes violently,\nmaking all sorts of strange noises!\n $Just as soon as it had started, it quiets once more.", - "attacked": "You step out into a completely new area, startling a wild Pokémon!\n $The wild Pokémon attacks!", + "transport": "The machine shakes violently,\nmaking all sorts of strange noises!$Just as soon as it had started, it quiets once more.", + "attacked": "You step out into a completely new area, startling a wild Pokémon!$The wild Pokémon attacks!", "boss_enraged": "The opposing {{enemyPokemon}} has become enraged!" } \ No newline at end of file diff --git a/src/locales/en/mystery-encounters/the-pokemon-salesman-dialogue.json b/src/locales/en/mystery-encounters/the-pokemon-salesman-dialogue.json index 88e93782062..7e8091bbfff 100644 --- a/src/locales/en/mystery-encounters/the-pokemon-salesman-dialogue.json +++ b/src/locales/en/mystery-encounters/the-pokemon-salesman-dialogue.json @@ -12,12 +12,12 @@ "tooltip": "(-) Pay {{price, money}}\n(+) Gain a {{purchasePokemon}} with its Hidden Ability", "tooltip_shiny": "(-) Pay {{price, money}}\n(+) Gain a shiny {{purchasePokemon}}", "selected_message": "You paid an outrageous sum and bought the {{purchasePokemon}}.", - "selected_dialogue": "Excellent choice!\n $I can see you've a keen eye for business.\n $Oh, yeah...@d{64} Returns not accepted, got that?" + "selected_dialogue": "Excellent choice!$I can see you've a keen eye for business.$Oh, yeah...@d{64} Returns not accepted, got that?" }, "2": { "label": "Refuse", "tooltip": "(-) No Rewards", - "selected": "No?@d{32} You say no?\n $I'm only doing this as a favor to you!" + "selected": "No?@d{32} You say no?$I'm only doing this as a favor to you!" } } } \ No newline at end of file diff --git a/src/locales/en/mystery-encounters/the-strong-stuff-dialogue.json b/src/locales/en/mystery-encounters/the-strong-stuff-dialogue.json index b0174486b29..1cc35267d00 100644 --- a/src/locales/en/mystery-encounters/the-strong-stuff-dialogue.json +++ b/src/locales/en/mystery-encounters/the-strong-stuff-dialogue.json @@ -8,7 +8,7 @@ "label": "Let It Touch You", "tooltip": "(?) Something awful or amazing might happen", "selected": "You black out.", - "selected_2": "@f{150}When you awaken, the Shuckle is gone\nand juice stash completely drained.\n $Your {{highBstPokemon}} feels a\nterrible lethargy come over it!\n $Its base stats were reduced by 20 in each stat!\n $Your remaining Pokémon feel an incredible vigor, though!\n $Their base stats are increased by 10 in each stat!" + "selected_2": "@f{150}When you awaken, the Shuckle is gone\nand juice stash completely drained.$Your {{highBstPokemon}} feels a\nterrible lethargy come over it!$Its base stats were reduced by 20 in each stat!$Your remaining Pokémon feel an incredible vigor, though!$Their base stats are increased by 10 in each stat!" }, "2": { "label": "Battle the Shuckle", diff --git a/src/locales/en/mystery-encounters/the-winstrate-challenge-dialogue.json b/src/locales/en/mystery-encounters/the-winstrate-challenge-dialogue.json index 9f50b6abae1..11829896be4 100644 --- a/src/locales/en/mystery-encounters/the-winstrate-challenge-dialogue.json +++ b/src/locales/en/mystery-encounters/the-winstrate-challenge-dialogue.json @@ -1,7 +1,7 @@ { "intro": "It's a family standing outside their house!", "speaker": "The Winstrates", - "intro_dialogue": "We're the Winstrates!\n $What do you say to taking on our family in a series of Pokémon battles?", + "intro_dialogue": "We're the Winstrates!$What do you say to taking on our family in a series of Pokémon battles?", "title": "The Winstrate Challenge", "description": "The Winstrates are a family of 5 trainers, and they want to battle! If you beat all of them back-to-back, they'll give you a grand prize. But can you handle the heat?", "query": "What will you do?", @@ -17,5 +17,5 @@ "selected": "That's too bad. Say, your team looks worn out, why don't you stay awhile and rest?" } }, - "victory": "Congratulations on beating our challenge!\n $Our family uses this Macho Brace to strengthen our Pokémon more effectively during their training.\n $You may not need it, considering that you beat the whole lot of us, but we hope you'll accept it anyway!" + "victory": "Congratulations on beating our challenge!$Our family uses this Macho Brace to strengthen our Pokémon more effectively during their training.$You may not need it, considering that you beat the whole lot of us, but we hope you'll accept it anyway!" } \ No newline at end of file diff --git a/src/locales/en/mystery-encounters/training-session-dialogue.json b/src/locales/en/mystery-encounters/training-session-dialogue.json index 62e89cd1dae..3cad95d1603 100644 --- a/src/locales/en/mystery-encounters/training-session-dialogue.json +++ b/src/locales/en/mystery-encounters/training-session-dialogue.json @@ -8,19 +8,19 @@ "1": { "label": "Light Training", "tooltip": "(-) Light Battle\n(+) Improve 2 Random IVs of Pokémon", - "finished": "{{selectedPokemon}} returns, feeling\nworn out but accomplished!\n $Its {{stat1}} and {{stat2}} IVs were improved!" + "finished": "{{selectedPokemon}} returns, feeling\nworn out but accomplished!$Its {{stat1}} and {{stat2}} IVs were improved!" }, "2": { "label": "Moderate Training", "tooltip": "(-) Moderate Battle\n(+) Change Pokémon's Nature", "select_prompt": "Select a new nature\nto train your Pokémon in.", - "finished": "{{selectedPokemon}} returns, feeling\nworn out but accomplished!\n $Its nature was changed to {{nature}}!" + "finished": "{{selectedPokemon}} returns, feeling\nworn out but accomplished!$Its nature was changed to {{nature}}!" }, "3": { "label": "Heavy Training", "tooltip": "(-) Harsh Battle\n(+) Change Pokémon's Ability", "select_prompt": "Select a new ability\nto train your Pokémon in.", - "finished": "{{selectedPokemon}} returns, feeling\nworn out but accomplished!\n $Its ability was changed to {{ability}}!" + "finished": "{{selectedPokemon}} returns, feeling\nworn out but accomplished!$Its ability was changed to {{ability}}!" }, "selected": "{{selectedPokemon}} moves across\nthe clearing to face you..." }, diff --git a/src/locales/en/mystery-encounters/trash-to-treasure-dialogue.json b/src/locales/en/mystery-encounters/trash-to-treasure-dialogue.json index 1ec4a7102d7..ae6e63ed800 100644 --- a/src/locales/en/mystery-encounters/trash-to-treasure-dialogue.json +++ b/src/locales/en/mystery-encounters/trash-to-treasure-dialogue.json @@ -7,7 +7,7 @@ "1": { "label": "Dig for Valuables", "tooltip": "(-) Lose Healing Items in Shops\n(+) Gain Amazing Items", - "selected": "You wade through the garbage pile, becoming mired in filth.\n $There's no way any respectable shopkeepers\nwill sell you anything in your grimy state!\n $You'll just have to make do without shop healing items.\n $However, you found some incredible items in the garbage!" + "selected": "You wade through the garbage pile, becoming mired in filth.$There's no way any respectable shopkeepers\nwill sell you anything in your grimy state!$You'll just have to make do without shop healing items.$However, you found some incredible items in the garbage!" }, "2": { "label": "Investigate Further", diff --git a/src/locales/en/mystery-encounters/weird-dream-dialogue.json b/src/locales/en/mystery-encounters/weird-dream-dialogue.json index 254c161d92d..44acde84002 100644 --- a/src/locales/en/mystery-encounters/weird-dream-dialogue.json +++ b/src/locales/en/mystery-encounters/weird-dream-dialogue.json @@ -1,7 +1,7 @@ { "intro": "A shadowy woman blocks your path.\nSomething about her is unsettling...", "speaker": "Woman", - "intro_dialogue": "I have seen your futures, your pasts...\n $Child, do you see them too?", + "intro_dialogue": "I have seen your futures, your pasts...$Child, do you see them too?", "title": "???", "description": "The woman's words echo in your head. It wasn't just a singular voice, but a vast multitude, from all timelines and realities. You begin to feel dizzy, the question lingering on your mind...\n\n@[TOOLTIP_TITLE]{\"I have seen your futures, your pasts... Child, do you see them too?\"}", "query": "What will you do?", @@ -9,14 +9,14 @@ "1": { "label": "\"I See Them\"", "tooltip": "@[SUMMARY_GREEN]{(?) Affects your Pokémon}", - "selected": "Her hand reaches out to touch you,\nand everything goes black.\n $Then...@d{64} You see everything.\nEvery timeline, all your different selves,\n past and future.\n $Everything that has made you,\neverything you will become...@d{64}", + "selected": "Her hand reaches out to touch you,\nand everything goes black.$Then...@d{64} You see everything.\nEvery timeline, all your different selves,\n past and future.$Everything that has made you,\neverything you will become...@d{64}", "cutscene": "You see your Pokémon,@d{32} converging from\nevery reality to become something new...@d{64}", - "dream_complete": "When you awaken, the woman - was it a woman or a ghost? - is gone...\n $.@d{32}.@d{32}.@d{32}\n $Your Pokémon team has changed...\nOr is it the same team you've always had?" + "dream_complete": "When you awaken, the woman - was it a woman or a ghost? - is gone...$.@d{32}.@d{32}.@d{32}$Your Pokémon team has changed...\nOr is it the same team you've always had?" }, "2": { "label": "Quickly Leave", "tooltip": "(-) Affects your Pokémon", - "selected": "You tear your mind from a numbing grip, and hastily depart.\n $When you finally stop to collect yourself, you check the Pokémon in your team.\n $For some reason, all of their levels have decreased!" + "selected": "You tear your mind from a numbing grip, and hastily depart.$When you finally stop to collect yourself, you check the Pokémon in your team.$For some reason, all of their levels have decreased!" } } } \ No newline at end of file diff --git a/src/locales/en/trainer-classes.json b/src/locales/en/trainer-classes.json index f3b81b06acb..1b827281a6a 100644 --- a/src/locales/en/trainer-classes.json +++ b/src/locales/en/trainer-classes.json @@ -117,15 +117,5 @@ "plasma_grunts": "Plasma Grunts", "flare_grunt": "Flare Grunt", "flare_grunt_female": "Flare Grunt", - "flare_grunts": "Flare Grunts", - "buck": "Buck", - "cheryl": "Cheryl", - "marley": "Marley", - "mira": "Mira", - "riley": "Riley", - "victor": "Victor", - "victoria": "Victoria", - "vivi": "Vivi", - "vicky": "Vicky", - "vito": "Vito" + "flare_grunts": "Flare Grunts" } \ No newline at end of file diff --git a/src/locales/en/trainer-names.json b/src/locales/en/trainer-names.json index 1d4cddf3411..077e7068512 100644 --- a/src/locales/en/trainer-names.json +++ b/src/locales/en/trainer-names.json @@ -152,5 +152,16 @@ "alder_iris_double": "Alder & Iris", "iris_alder_double": "Iris & Alder", "marnie_piers_double": "Marnie & Piers", - "piers_marnie_double": "Piers & Marnie" + "piers_marnie_double": "Piers & Marnie", + "buck": "Buck", + "cheryl": "Cheryl", + "marley": "Marley", + "mira": "Mira", + "riley": "Riley", + "victor": "Victor", + "victoria": "Victoria", + "vivi": "Vivi", + "vicky": "Vicky", + "vito": "Vito", + "bug_type_superfan": "Bug-Type Superfan" } \ No newline at end of file diff --git a/src/modifier/modifier-type.ts b/src/modifier/modifier-type.ts index 6a70b4c7737..8322c1ea63d 100644 --- a/src/modifier/modifier-type.ts +++ b/src/modifier/modifier-type.ts @@ -1536,8 +1536,9 @@ export const modifierTypes = { } return new PokemonBaseStatFlatModifierType(Utils.randSeedInt(20), [Stat.HP, Stat.ATK, Stat.DEF]); }), - MYSTERY_ENCOUNTER_BLACK_SLUDGE: () => new ModifierType("modifierType:ModifierType.MYSTERY_ENCOUNTER_BLACK_SLUDGE", "black_sludge", (type, _args) => new Modifiers.RemoveHealShopModifier(type)), + MYSTERY_ENCOUNTER_BLACK_SLUDGE: () => new ModifierType("modifierType:ModifierType.MYSTERY_ENCOUNTER_BLACK_SLUDGE", "black_sludge", (type, _args) => new Modifiers.HealShopCostModifier(type)), MYSTERY_ENCOUNTER_MACHO_BRACE: () => new PokemonHeldItemModifierType("modifierType:ModifierType.MYSTERY_ENCOUNTER_MACHO_BRACE", "macho_brace", (type, args) => new Modifiers.PokemonIncrementingStatModifier(type, (args[0] as Pokemon).id)), + MYSTERY_ENCOUNTER_GOLDEN_BUG_NET: () => new ModifierType("modifierType:ModifierType.MYSTERY_ENCOUNTER_GOLDEN_BUG_NET", "golden_net", (type, _args) => new Modifiers.BoostBugSpawnModifier(type)), }; interface ModifierPool { diff --git a/src/modifier/modifier.ts b/src/modifier/modifier.ts index a2ce1eacc3f..bbc2e31b836 100644 --- a/src/modifier/modifier.ts +++ b/src/modifier/modifier.ts @@ -734,7 +734,8 @@ export class PokemonBaseStatTotalModifier extends PokemonHeldItemModifier { apply(args: any[]): boolean { // Modifies the passed in baseStats[] array args[1].forEach((v, i) => { - const newVal = Math.floor(v + this.statModifier); + // HP is affected by half as much as other stats + const newVal = i === 0 ? Math.floor(v + this.statModifier / 2) : Math.floor(v + this.statModifier); args[1][i] = Math.min(Math.max(newVal, 1), 999999); }); @@ -2366,17 +2367,41 @@ export class LockModifierTiersModifier extends PersistentModifier { } } -export class RemoveHealShopModifier extends PersistentModifier { +export class HealShopCostModifier extends PersistentModifier { constructor(type: ModifierType, stackCount?: integer) { super(type, stackCount); } match(modifier: Modifier): boolean { - return modifier instanceof RemoveHealShopModifier; + return modifier instanceof HealShopCostModifier; } - clone(): RemoveHealShopModifier { - return new RemoveHealShopModifier(this.type, this.stackCount); + clone(): HealShopCostModifier { + return new HealShopCostModifier(this.type, this.stackCount); + } + + apply(args: any[]): boolean { + (args[0] as Utils.IntegerHolder).value *= Math.pow(3, this.getStackCount()); + + return true; + } + + getMaxStackCount(scene: BattleScene): integer { + return 1; + } +} + +export class BoostBugSpawnModifier extends PersistentModifier { + constructor(type: ModifierType, stackCount?: integer) { + super(type, stackCount); + } + + match(modifier: Modifier): boolean { + return modifier instanceof BoostBugSpawnModifier; + } + + clone(): HealShopCostModifier { + return new BoostBugSpawnModifier(this.type, this.stackCount); } apply(args: any[]): boolean { diff --git a/src/overrides.ts b/src/overrides.ts index 1ec9df4b442..41f261b73df 100644 --- a/src/overrides.ts +++ b/src/overrides.ts @@ -131,9 +131,9 @@ class DefaultOverrides { // MYSTERY ENCOUNTER OVERRIDES // ------------------------- // 1 to 256, set to null to ignore - readonly MYSTERY_ENCOUNTER_RATE_OVERRIDE: number | null = null; + readonly MYSTERY_ENCOUNTER_RATE_OVERRIDE: number | null = 256; readonly MYSTERY_ENCOUNTER_TIER_OVERRIDE: MysteryEncounterTier | null = null; - readonly MYSTERY_ENCOUNTER_OVERRIDE: MysteryEncounterType | null = null; + readonly MYSTERY_ENCOUNTER_OVERRIDE: MysteryEncounterType | null = MysteryEncounterType.BUG_TYPE_SUPERFAN; // ------------------------- // MODIFIER / ITEM OVERRIDES diff --git a/src/phases/encounter-phase.ts b/src/phases/encounter-phase.ts index de0262bd70a..ec4a4d8fb62 100644 --- a/src/phases/encounter-phase.ts +++ b/src/phases/encounter-phase.ts @@ -31,6 +31,8 @@ import { MysteryEncounterMode } from "#enums/mystery-encounter-mode"; import { doTrainerExclamation } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { getEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; import { MysteryEncounterPhase } from "#app/phases/mystery-encounter-phases"; +import { randSeedInt } from "#app/utils"; +import { getGoldenBugNetSpecies } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; export class EncounterPhase extends BattlePhase { private loaded: boolean; @@ -89,7 +91,11 @@ export class EncounterPhase extends BattlePhase { if (battle.battleType === BattleType.TRAINER) { battle.enemyParty[e] = battle.trainer?.genPartyMember(e)!; // TODO:: is the bang correct here? } else { - const enemySpecies = this.scene.randomSpecies(battle.waveIndex, level, true); + let enemySpecies = this.scene.randomSpecies(battle.waveIndex, level, true); + // If player has golden bug net, rolls 10% chance to replace with species from the golden bug net bug pool + if (randSeedInt(10) === 0) { + enemySpecies = getGoldenBugNetSpecies(this.scene, battle.waveIndex, level); + } battle.enemyParty[e] = this.scene.addEnemyPokemon(enemySpecies, level, TrainerSlot.NONE, !!this.scene.getEncounterBossSegments(battle.waveIndex, level, enemySpecies)); if (this.scene.currentBattle.battleSpec === BattleSpec.FINAL_BOSS) { battle.enemyParty[e].ivs = new Array(6).fill(31); diff --git a/src/phases/modifier-reward-phase.ts b/src/phases/modifier-reward-phase.ts index 4d083a367a6..87167893e3e 100644 --- a/src/phases/modifier-reward-phase.ts +++ b/src/phases/modifier-reward-phase.ts @@ -22,7 +22,7 @@ export class ModifierRewardPhase extends BattlePhase { return new Promise(resolve => { const newModifier = this.modifierType.newModifier(); this.scene.addModifier(newModifier).then(() => { - this.scene.playSound("item_fanfare"); + this.scene.playSound("bgm/item_fanfare"); this.scene.ui.showText(i18next.t("battle:rewardGain", { modifierName: newModifier?.type.name }), null, () => resolve(), null, true); }); }); diff --git a/src/phases/mystery-encounter-phases.ts b/src/phases/mystery-encounter-phases.ts index 52b4f0163db..92850b3b38e 100644 --- a/src/phases/mystery-encounter-phases.ts +++ b/src/phases/mystery-encounter-phases.ts @@ -418,23 +418,35 @@ export class MysteryEncounterRewardsPhase extends Phase { }); } else { this.scene.executeWithSeedOffset(() => { - if (this.scene.currentBattle.mysteryEncounter.doEncounterExp) { - this.scene.currentBattle.mysteryEncounter.doEncounterExp(this.scene); - } - - if (this.scene.currentBattle.mysteryEncounter.doEncounterRewards) { - this.scene.currentBattle.mysteryEncounter.doEncounterRewards(this.scene); - } else if (this.addHealPhase) { - this.scene.tryRemovePhase(p => p instanceof SelectModifierPhase); - this.scene.unshiftPhase(new SelectModifierPhase(this.scene, 0, undefined, { fillRemaining: false, rerollMultiplier: 0 })); + if (encounter.onRewards) { + encounter.onRewards(this.scene).then(() => { + this.doEncounterRewardsAndContinue(); + }); + } else { + this.doEncounterRewardsAndContinue(); } // Do not use ME's seedOffset for rewards, these should always be consistent with waveIndex (once per wave) }, this.scene.currentBattle.waveIndex * 1000); - - this.scene.pushPhase(new PostMysteryEncounterPhase(this.scene)); - this.end(); } } + + doEncounterRewardsAndContinue() { + const encounter = this.scene.currentBattle.mysteryEncounter; + + if (encounter.doEncounterExp) { + encounter.doEncounterExp(this.scene); + } + + if (encounter.doEncounterRewards) { + encounter.doEncounterRewards(this.scene); + } else if (this.addHealPhase) { + this.scene.tryRemovePhase(p => p instanceof SelectModifierPhase); + this.scene.unshiftPhase(new SelectModifierPhase(this.scene, 0, undefined, { fillRemaining: false, rerollMultiplier: 0 })); + } + + this.scene.pushPhase(new PostMysteryEncounterPhase(this.scene)); + this.end(); + } } /** diff --git a/src/test/mystery-encounter/encounters/delibirdy-encounter.test.ts b/src/test/mystery-encounter/encounters/delibirdy-encounter.test.ts index 136df416ea7..0fe8e27b44f 100644 --- a/src/test/mystery-encounter/encounters/delibirdy-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/delibirdy-encounter.test.ts @@ -137,7 +137,7 @@ describe("Delibird-y - Mystery Encounter", () => { // 5 Healing Charms scene.modifiers = []; - const abilityCharm = generateModifierType(scene, modifierTypes.ABILITY_CHARM).newModifier() as HiddenAbilityRateBoosterModifier; + const abilityCharm = generateModifierType(scene, modifierTypes.ABILITY_CHARM)!.newModifier() as HiddenAbilityRateBoosterModifier; abilityCharm.stackCount = 4; await scene.addModifier(abilityCharm, true, false, false, true); await scene.updateModifiers(true); @@ -206,7 +206,7 @@ describe("Delibird-y - Mystery Encounter", () => { // Set 2 Sitrus berries on party lead scene.modifiers = []; - const sitrus = generateModifierType(scene, modifierTypes.BERRY, [BerryType.SITRUS]); + const sitrus = generateModifierType(scene, modifierTypes.BERRY, [BerryType.SITRUS])!; const sitrusMod = sitrus.newModifier(scene.getParty()[0]) as BerryModifier; sitrusMod.stackCount = 2; await scene.addModifier(sitrusMod, true, false, false, true); @@ -227,7 +227,7 @@ describe("Delibird-y - Mystery Encounter", () => { // Set 1 Reviver Seed on party lead scene.modifiers = []; - const revSeed = generateModifierType(scene, modifierTypes.REVIVER_SEED); + const revSeed = generateModifierType(scene, modifierTypes.REVIVER_SEED)!; const modifier = revSeed.newModifier(scene.getParty()[0]) as PokemonInstantReviveModifier; modifier.stackCount = 1; await scene.addModifier(modifier, true, false, false, true); @@ -248,10 +248,10 @@ describe("Delibird-y - Mystery Encounter", () => { // 99 Candy Jars scene.modifiers = []; - const candyJar = generateModifierType(scene, modifierTypes.CANDY_JAR).newModifier() as LevelIncrementBoosterModifier; + const candyJar = generateModifierType(scene, modifierTypes.CANDY_JAR)!.newModifier() as LevelIncrementBoosterModifier; candyJar.stackCount = 99; await scene.addModifier(candyJar, true, false, false, true); - const sitrus = generateModifierType(scene, modifierTypes.BERRY, [BerryType.SITRUS]); + const sitrus = generateModifierType(scene, modifierTypes.BERRY, [BerryType.SITRUS])!; // Sitrus berries on party const sitrusMod = sitrus.newModifier(scene.getParty()[0]) as BerryModifier; @@ -277,12 +277,12 @@ describe("Delibird-y - Mystery Encounter", () => { // 5 Healing Charms scene.modifiers = []; - const healingCharm = generateModifierType(scene, modifierTypes.HEALING_CHARM).newModifier() as HealingBoosterModifier; + const healingCharm = generateModifierType(scene, modifierTypes.HEALING_CHARM)!.newModifier() as HealingBoosterModifier; healingCharm.stackCount = 5; await scene.addModifier(healingCharm, true, false, false, true); // Set 1 Reviver Seed on party lead - const revSeed = generateModifierType(scene, modifierTypes.REVIVER_SEED); + const revSeed = generateModifierType(scene, modifierTypes.REVIVER_SEED)!; const modifier = revSeed.newModifier(scene.getParty()[0]) as PokemonInstantReviveModifier; modifier.stackCount = 1; await scene.addModifier(modifier, true, false, false, true); @@ -306,7 +306,7 @@ describe("Delibird-y - Mystery Encounter", () => { // Set 1 Soul Dew on party lead scene.modifiers = []; - const soulDew = generateModifierType(scene, modifierTypes.SOUL_DEW); + const soulDew = generateModifierType(scene, modifierTypes.SOUL_DEW)!; const modifier = soulDew.newModifier(scene.getParty()[0]); await scene.addModifier(modifier, true, false, false, true); await scene.updateModifiers(true); @@ -334,7 +334,7 @@ describe("Delibird-y - Mystery Encounter", () => { await game.runToMysteryEncounter(MysteryEncounterType.DELIBIRDY, defaultParty); // Set 1 Reviver Seed on party lead - const revSeed = generateModifierType(scene, modifierTypes.REVIVER_SEED); + const revSeed = generateModifierType(scene, modifierTypes.REVIVER_SEED)!; const modifier = revSeed.newModifier(scene.getParty()[0]) as PokemonInstantReviveModifier; modifier.stackCount = 1; await scene.addModifier(modifier, true, false, false, true); @@ -368,7 +368,7 @@ describe("Delibird-y - Mystery Encounter", () => { // Set 2 Soul Dew on party lead scene.modifiers = []; - const soulDew = generateModifierType(scene, modifierTypes.SOUL_DEW); + const soulDew = generateModifierType(scene, modifierTypes.SOUL_DEW)!; const modifier = soulDew.newModifier(scene.getParty()[0]) as PokemonNatureWeightModifier; modifier.stackCount = 2; await scene.addModifier(modifier, true, false, false, true); @@ -389,7 +389,7 @@ describe("Delibird-y - Mystery Encounter", () => { // Set 1 Soul Dew on party lead scene.modifiers = []; - const soulDew = generateModifierType(scene, modifierTypes.SOUL_DEW); + const soulDew = generateModifierType(scene, modifierTypes.SOUL_DEW)!; const modifier = soulDew.newModifier(scene.getParty()[0]) as PokemonNatureWeightModifier; modifier.stackCount = 1; await scene.addModifier(modifier, true, false, false, true); @@ -410,12 +410,12 @@ describe("Delibird-y - Mystery Encounter", () => { // 5 Healing Charms scene.modifiers = []; - const healingCharm = generateModifierType(scene, modifierTypes.BERRY_POUCH).newModifier() as PreserveBerryModifier; + const healingCharm = generateModifierType(scene, modifierTypes.BERRY_POUCH)!.newModifier() as PreserveBerryModifier; healingCharm.stackCount = 3; await scene.addModifier(healingCharm, true, false, false, true); // Set 1 Soul Dew on party lead - const soulDew = generateModifierType(scene, modifierTypes.SOUL_DEW); + const soulDew = generateModifierType(scene, modifierTypes.SOUL_DEW)!; const modifier = soulDew.newModifier(scene.getParty()[0]) as PokemonNatureWeightModifier; modifier.stackCount = 1; await scene.addModifier(modifier, true, false, false, true); @@ -439,7 +439,7 @@ describe("Delibird-y - Mystery Encounter", () => { // Set 1 Reviver Seed on party lead scene.modifiers = []; - const revSeed = generateModifierType(scene, modifierTypes.REVIVER_SEED); + const revSeed = generateModifierType(scene, modifierTypes.REVIVER_SEED)!; const modifier = revSeed.newModifier(scene.getParty()[0]); await scene.addModifier(modifier, true, false, false, true); await scene.updateModifiers(true); @@ -468,7 +468,7 @@ describe("Delibird-y - Mystery Encounter", () => { // Set 1 Soul Dew on party lead scene.modifiers = []; - const soulDew = generateModifierType(scene, modifierTypes.SOUL_DEW); + const soulDew = generateModifierType(scene, modifierTypes.SOUL_DEW)!; const modifier = soulDew.newModifier(scene.getParty()[0]) as PokemonNatureWeightModifier; modifier.stackCount = 1; await scene.addModifier(modifier, true, false, false, true); diff --git a/src/test/mystery-encounter/encounters/trash-to-treasure-encounter.test.ts b/src/test/mystery-encounter/encounters/trash-to-treasure-encounter.test.ts index 2a60c4686e2..319a5daa38b 100644 --- a/src/test/mystery-encounter/encounters/trash-to-treasure-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/trash-to-treasure-encounter.test.ts @@ -13,7 +13,7 @@ import BattleScene from "#app/battle-scene"; import { PokemonMove } from "#app/field/pokemon"; import { Mode } from "#app/ui/ui"; import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; -import { HitHealModifier, RemoveHealShopModifier, TurnHealModifier } from "#app/modifier/modifier"; +import { HitHealModifier, HealShopCostModifier, TurnHealModifier } from "#app/modifier/modifier"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; @@ -150,7 +150,7 @@ describe("Trash to Treasure - Mystery Encounter", () => { expect(shellBell).toBeDefined(); expect(shellBell?.stackCount).toBe(2); - const blackSludge = scene.findModifier(m => m instanceof RemoveHealShopModifier) as RemoveHealShopModifier; + const blackSludge = scene.findModifier(m => m instanceof HealShopCostModifier) as HealShopCostModifier; expect(blackSludge).toBeDefined(); expect(blackSludge?.stackCount).toBe(1); }); diff --git a/src/ui/modifier-select-ui-handler.ts b/src/ui/modifier-select-ui-handler.ts index 2ea053f47b4..18a4cbba09a 100644 --- a/src/ui/modifier-select-ui-handler.ts +++ b/src/ui/modifier-select-ui-handler.ts @@ -4,7 +4,7 @@ import { getPokeballAtlasKey, PokeballType } from "../data/pokeball"; import { addTextObject, getTextStyleOptions, getModifierTierTextTint, getTextColor, TextStyle } from "./text"; import AwaitableUiHandler from "./awaitable-ui-handler"; import { Mode } from "./ui"; -import { LockModifierTiersModifier, PokemonHeldItemModifier, RemoveHealShopModifier } from "../modifier/modifier"; +import { LockModifierTiersModifier, PokemonHeldItemModifier, HealShopCostModifier } from "../modifier/modifier"; import { handleTutorial, Tutorial } from "../tutorial"; import { Button } from "#enums/buttons"; import MoveInfoOverlay from "./move-info-overlay"; @@ -13,6 +13,7 @@ import * as Utils from "./../utils"; import Overrides from "#app/overrides"; import i18next from "i18next"; import { ShopCursorTarget } from "#app/enums/shop-cursor-target"; +import { IntegerHolder } from "./../utils"; export const SHOP_OPTIONS_ROW_LIMIT = 6; @@ -171,9 +172,11 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { this.updateRerollCostText(); const typeOptions = args[1] as ModifierTypeOption[]; - const removeHealShop = this.scene.gameMode.hasNoShop || !!this.scene.findModifier(m => m instanceof RemoveHealShopModifier); + const removeHealShop = this.scene.gameMode.hasNoShop; + const baseShopCost = new IntegerHolder(this.scene.getWaveMoneyAmount(1)); + this.scene.applyModifier(HealShopCostModifier, true, baseShopCost); const shopTypeOptions = !removeHealShop - ? getPlayerShopModifierTypeOptionsForWave(this.scene.currentBattle.waveIndex, this.scene.getWaveMoneyAmount(1)) + ? getPlayerShopModifierTypeOptionsForWave(this.scene.currentBattle.waveIndex, baseShopCost.value) : []; const optionsYOffset = shopTypeOptions.length >= SHOP_OPTIONS_ROW_LIMIT ? -8 : -24; From a00bc7e8ef137f4455368d2ac566b2660baaf87e Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Tue, 27 Aug 2024 12:43:32 -0400 Subject: [PATCH 2/2] add unit tests for Bug-Type Superfan and clean up dialogue --- src/battle-scene.ts | 12 +- .../encounters/bug-type-superfan-encounter.ts | 13 +- .../encounters/part-timer-encounter.ts | 6 +- .../teleporting-hijinks-encounter.ts | 1 - .../mystery-encounter-option.ts | 6 +- .../mystery-encounters/mystery-encounter.ts | 6 +- .../utils/encounter-phase-utils.ts | 8 +- src/locales/en/config.ts | 4 +- .../en/mystery-encounter-messages.json | 6 + src/locales/en/mystery-encounter.ts | 6 - .../bug-type-superfan-dialogue.json | 1 + src/overrides.ts | 7 +- src/test/final_boss.test.ts | 2 +- ...erTestUtils.ts => encounter-test-utils.ts} | 5 +- .../a-trainers-test-encounter.test.ts | 2 +- .../absolute-avarice-encounter.test.ts | 2 +- ...an-offer-you-cant-refuse-encounter.test.ts | 2 +- .../berries-abound-encounter.test.ts | 2 +- .../bug-type-superfan-encounter.test.ts | 585 ++++++++++++++++++ .../clowning-around-encounter.test.ts | 4 +- .../dancing-lessons-encounter.test.ts | 2 +- .../encounters/delibirdy-encounter.test.ts | 2 +- .../department-store-sale-encounter.test.ts | 2 +- .../fiery-fallout-encounter.test.ts | 2 +- .../fight-or-flight-encounter.test.ts | 2 +- .../encounters/lost-at-sea-encounter.test.ts | 2 +- .../mysterious-challengers-encounter.test.ts | 2 +- .../encounters/part-timer-encounter.test.ts | 2 +- .../teleporting-hijinks-encounter.test.ts | 3 +- .../the-pokemon-salesman-encounter.test.ts | 2 +- .../the-strong-stuff-encounter.test.ts | 9 +- .../the-winstrate-challenge-encounter.test.ts | 2 +- .../trash-to-treasure-encounter.test.ts | 2 +- .../encounters/weird-dream-encounter.test.ts | 2 +- src/ui/mystery-encounter-ui-handler.ts | 2 +- 35 files changed, 652 insertions(+), 66 deletions(-) create mode 100644 src/locales/en/mystery-encounter-messages.json rename src/test/mystery-encounter/{encounterTestUtils.ts => encounter-test-utils.ts} (97%) create mode 100644 src/test/mystery-encounter/encounters/bug-type-superfan-encounter.test.ts diff --git a/src/battle-scene.ts b/src/battle-scene.ts index 17c18c3b2fe..8228bdb54e6 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -22,8 +22,7 @@ import { getModifierPoolForType, getModifierType, getPartyLuckValue, - modifierTypes, - PokemonHeldItemModifierType + modifierTypes } from "./modifier/modifier-type"; import AbilityBar from "./ui/ability-bar"; import { BlockItemTheftAbAttr, DoubleBattleChanceAbAttr, ChangeMovePriorityAbAttr, PostBattleInitAbAttr, applyAbAttrs, applyPostBattleInitAbAttrs } from "./data/ability"; @@ -49,7 +48,7 @@ import PokemonData from "./system/pokemon-data"; import { Nature } from "./data/nature"; import { SpeciesFormChangeManualTrigger, SpeciesFormChangeTimeOfDayTrigger, SpeciesFormChangeTrigger, pokemonFormChanges, FormChangeItem, SpeciesFormChange } from "./data/pokemon-forms"; import { FormChangePhase } from "./phases/form-change-phase"; -import { getTypeRgb, Type } from "./data/type"; +import { getTypeRgb } from "./data/type"; import PokemonSpriteSparkleHandler from "./field/pokemon-sprite-sparkle-handler"; import CharSprite from "./ui/char-sprite"; import DamageNumberHandler from "./field/damage-number-handler"; @@ -102,8 +101,6 @@ import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { MysteryEncounterMode } from "#enums/mystery-encounter-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; import HeldModifierConfig from "#app/interfaces/held-modifier-config"; -import { generateModifierType } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import { applyModifierTypeToPlayerPokemon } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; export const bypassLogin = import.meta.env.VITE_BYPASS_LOGIN === "1"; @@ -1115,11 +1112,6 @@ export default class BattleScene extends SceneBase { const playerField = this.getPlayerField(); - const mod = generateModifierType(this, modifierTypes.ATTACK_TYPE_BOOSTER, [Type.BUG]); - if (mod) { - applyModifierTypeToPlayerPokemon(this, this.getParty()[0], mod as PokemonHeldItemModifierType); - } - if (this.gameMode.isFixedBattle(newWaveIndex) && trainerData === undefined) { battleConfig = this.gameMode.getFixedBattle(newWaveIndex); newDouble = battleConfig.double; diff --git a/src/data/mystery-encounters/encounters/bug-type-superfan-encounter.ts b/src/data/mystery-encounters/encounters/bug-type-superfan-encounter.ts index 9042ea4b8de..227e128fe20 100644 --- a/src/data/mystery-encounters/encounters/bug-type-superfan-encounter.ts +++ b/src/data/mystery-encounters/encounters/bug-type-superfan-encounter.ts @@ -238,7 +238,6 @@ export const BugTypeSuperfanEncounter: MysteryEncounter = text: `${namespace}.option.1.selected`, }, ], - secondOptionPrompt: `${namespace}.option.3.select_prompt`, }, async (scene: BattleScene) => { // Select battle the bug trainer @@ -552,7 +551,13 @@ function getTrainerConfigForWave(waveIndex: number) { p.generateAndPopulateMoveset(); p.generateName(); })) - .setPartyMemberFunc(2, getRandomPartyMemberFunc(POOL_2_POKEMON, TrainerSlot.TRAINER, true)) + .setPartyMemberFunc(2, getRandomPartyMemberFunc([pool3Mon.species], TrainerSlot.TRAINER, true, p => { + if (!isNullOrUndefined(pool3Mon.formIndex)) { + p.formIndex = pool3Mon.formIndex!; + p.generateAndPopulateMoveset(); + p.generateName(); + } + })) .setPartyMemberFunc(3, getRandomPartyMemberFunc([pool3Mon.species], TrainerSlot.TRAINER, true, p => { if (!isNullOrUndefined(pool3Mon.formIndex)) { p.formIndex = pool3Mon.formIndex!; @@ -614,7 +619,7 @@ function doBugTypeMoveTutor(scene: BattleScene): Promise { moveInfoOverlay.setVisible(false); }; - const result = await selectOptionThenPokemon(scene, optionSelectItems, `${namespace}.option.3.select_prompt`, undefined, onHoverOverCancel); + const result = await selectOptionThenPokemon(scene, optionSelectItems, `${namespace}.teach_move_prompt`, undefined, onHoverOverCancel); // let forceExit = !!result; if (!result) { moveInfoOverlay.active = false; @@ -635,7 +640,7 @@ function doBugTypeMoveTutor(scene: BattleScene): Promise { // forceExit = true; // } else { // // Re-show learn menu - // result = await selectOptionThenPokemon(scene, optionSelectItems, `${namespace}.option.3.select_prompt`, undefined, onHoverOverCancel); + // result = await selectOptionThenPokemon(scene, optionSelectItems, `${namespace}.teach_move_prompt`, undefined, onHoverOverCancel); // if (!result) { // moveInfoOverlay.active = false; // moveInfoOverlay.setVisible(false); diff --git a/src/data/mystery-encounters/encounters/part-timer-encounter.ts b/src/data/mystery-encounters/encounters/part-timer-encounter.ts index bfd977babfd..d7797f133ce 100644 --- a/src/data/mystery-encounters/encounters/part-timer-encounter.ts +++ b/src/data/mystery-encounters/encounters/part-timer-encounter.ts @@ -140,7 +140,7 @@ export const PartTimerEncounter: MysteryEncounter = } const moneyChange = scene.getWaveMoneyAmount(moneyMultiplier); updatePlayerMoney(scene, moneyChange, true, false); - await showEncounterText(scene, i18next.t("mysteryEncounter:receive_money", { amount: moneyChange })); + await showEncounterText(scene, i18next.t("mysteryEncounterMessages:receive_money", { amount: moneyChange })); await showEncounterText(scene, `${namespace}.pokemon_tired`); setEncounterRewards(scene, { fillRemaining: true }); @@ -221,7 +221,7 @@ export const PartTimerEncounter: MysteryEncounter = } const moneyChange = scene.getWaveMoneyAmount(moneyMultiplier); updatePlayerMoney(scene, moneyChange, true, false); - await showEncounterText(scene, i18next.t("mysteryEncounter:receive_money", { amount: moneyChange })); + await showEncounterText(scene, i18next.t("mysteryEncounterMessages:receive_money", { amount: moneyChange })); await showEncounterText(scene, `${namespace}.pokemon_tired`); setEncounterRewards(scene, { fillRemaining: true }); @@ -273,7 +273,7 @@ export const PartTimerEncounter: MysteryEncounter = await showEncounterDialogue(scene, `${namespace}.job_complete_good`, `${namespace}.speaker`); const moneyChange = scene.getWaveMoneyAmount(2.5); updatePlayerMoney(scene, moneyChange, true, false); - await showEncounterText(scene, i18next.t("mysteryEncounter:receive_money", { amount: moneyChange })); + await showEncounterText(scene, i18next.t("mysteryEncounterMessages:receive_money", { amount: moneyChange })); await showEncounterText(scene, `${namespace}.pokemon_tired`); setEncounterRewards(scene, { fillRemaining: true }); diff --git a/src/data/mystery-encounters/encounters/teleporting-hijinks-encounter.ts b/src/data/mystery-encounters/encounters/teleporting-hijinks-encounter.ts index 6ba73357f42..a4c4d57daca 100644 --- a/src/data/mystery-encounters/encounters/teleporting-hijinks-encounter.ts +++ b/src/data/mystery-encounters/encounters/teleporting-hijinks-encounter.ts @@ -143,7 +143,6 @@ export const TeleportingHijinksEncounter: MysteryEncounter = const magnet = generateModifierTypeOption(scene, modifierTypes.ATTACK_TYPE_BOOSTER, [Type.STEEL])!; const metalCoat = generateModifierTypeOption(scene, modifierTypes.ATTACK_TYPE_BOOSTER, [Type.ELECTRIC])!; setEncounterRewards(scene, { guaranteedModifierTypeOptions: [magnet, metalCoat], fillRemaining: true }); - setEncounterExp(scene, encounter.selectedOption!.primaryPokemon!.id, 100); transitionMysteryEncounterIntroVisuals(scene, true, true); await initBattleWithEnemyConfig(scene, config); } diff --git a/src/data/mystery-encounters/mystery-encounter-option.ts b/src/data/mystery-encounters/mystery-encounter-option.ts index 086706075e7..aa0e1865a12 100644 --- a/src/data/mystery-encounters/mystery-encounter-option.ts +++ b/src/data/mystery-encounters/mystery-encounter-option.ts @@ -81,7 +81,7 @@ export default class MysteryEncounterOption implements IMysteryEncounterOption { } meetsPrimaryRequirementAndPrimaryPokemonSelected(scene: BattleScene) { - if (!this.primaryPokemonRequirements) { + if (!this.primaryPokemonRequirements || this.primaryPokemonRequirements.length === 0) { return true; } let qualified: PlayerPokemon[] = scene.getParty(); @@ -101,7 +101,7 @@ export default class MysteryEncounterOption implements IMysteryEncounterOption { return false; } - if (this.excludePrimaryFromSecondaryRequirements && this.secondaryPokemon) { + if (this.excludePrimaryFromSecondaryRequirements && this.secondaryPokemon && this.secondaryPokemon.length > 0) { const truePrimaryPool: PlayerPokemon[] = []; const overlap: PlayerPokemon[] = []; for (const qp of qualified) { @@ -135,7 +135,7 @@ export default class MysteryEncounterOption implements IMysteryEncounterOption { } meetsSupportingRequirementAndSupportingPokemonSelected(scene: BattleScene) { - if (!this.secondaryPokemonRequirements) { + if (!this.secondaryPokemonRequirements || this.secondaryPokemonRequirements.length === 0) { this.secondaryPokemon = []; return true; } diff --git a/src/data/mystery-encounters/mystery-encounter.ts b/src/data/mystery-encounters/mystery-encounter.ts index 8efac442e7c..4bbd4bcb1b6 100644 --- a/src/data/mystery-encounters/mystery-encounter.ts +++ b/src/data/mystery-encounters/mystery-encounter.ts @@ -263,7 +263,7 @@ export default class MysteryEncounter implements IMysteryEncounter { } meetsPrimaryRequirementAndPrimaryPokemonSelected(scene: BattleScene): boolean { - if (this.primaryPokemonRequirements.length === 0) { + if (!this.primaryPokemonRequirements || this.primaryPokemonRequirements.length === 0) { const activeMon = scene.getParty().filter(p => p.isActive(true)); if (activeMon.length > 0) { this.primaryPokemon = activeMon[0]; @@ -286,7 +286,7 @@ export default class MysteryEncounter implements IMysteryEncounter { return false; } - if (this.excludePrimaryFromSupportRequirements && this.secondaryPokemon) { + if (this.excludePrimaryFromSupportRequirements && this.secondaryPokemon && this.secondaryPokemon.length > 0) { const truePrimaryPool: PlayerPokemon[] = []; const overlap: PlayerPokemon[] = []; for (const qp of qualified) { @@ -320,7 +320,7 @@ export default class MysteryEncounter implements IMysteryEncounter { } meetsSecondaryRequirementAndSecondaryPokemonSelected(scene: BattleScene): boolean { - if (!this.secondaryPokemonRequirements) { + if (!this.secondaryPokemonRequirements || this.secondaryPokemonRequirements.length === 0) { this.secondaryPokemon = []; return true; } diff --git a/src/data/mystery-encounters/utils/encounter-phase-utils.ts b/src/data/mystery-encounters/utils/encounter-phase-utils.ts index b4942b01c15..dab7cb8c826 100644 --- a/src/data/mystery-encounters/utils/encounter-phase-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-phase-utils.ts @@ -367,9 +367,9 @@ export function updatePlayerMoney(scene: BattleScene, changeValue: number, playS } if (showMessage) { if (changeValue < 0) { - scene.queueMessage(i18next.t("mysteryEncounter:paid_money", { amount: -changeValue }), null, true); + scene.queueMessage(i18next.t("mysteryEncounterMessages:paid_money", { amount: -changeValue }), null, true); } else { - scene.queueMessage(i18next.t("mysteryEncounter:receive_money", { amount: changeValue }), null, true); + scene.queueMessage(i18next.t("mysteryEncounterMessages:receive_money", { amount: changeValue }), null, true); } } } @@ -457,7 +457,7 @@ export function selectPokemonForOption(scene: BattleScene, onPokemonSelected: (p return true; }, onHover: () => { - scene.ui.showText(i18next.t("mysteryEncounter:cancel_option")); + scene.ui.showText(i18next.t("mysteryEncounterMessages:cancel_option")); } }); @@ -571,7 +571,7 @@ export function selectOptionThenPokemon(scene: BattleScene, options: OptionSelec if (onHoverOverCancelOption) { onHoverOverCancelOption(); } - scene.ui.showText(i18next.t("mysteryEncounter:cancel_option")); + scene.ui.showText(i18next.t("mysteryEncounterMessages:cancel_option")); } }); diff --git a/src/locales/en/config.ts b/src/locales/en/config.ts index 0752a393711..bf764801272 100644 --- a/src/locales/en/config.ts +++ b/src/locales/en/config.ts @@ -59,6 +59,7 @@ import modifierSelectUiHandler from "./modifier-select-ui-handler.json"; import moveTriggers from "./move-trigger.json"; import runHistory from "./run-history.json"; import { mysteryEncounter } from "#app/locales/en/mystery-encounter"; +import mysteryEncounterMessages from "./mystery-encounter-messages.json"; export const enConfig = { ability, @@ -121,5 +122,6 @@ export const enConfig = { modifierSelectUiHandler, moveTriggers, runHistory, - mysteryEncounter: mysteryEncounter + mysteryEncounter: mysteryEncounter, + mysteryEncounterMessages }; diff --git a/src/locales/en/mystery-encounter-messages.json b/src/locales/en/mystery-encounter-messages.json new file mode 100644 index 00000000000..4e2ab639192 --- /dev/null +++ b/src/locales/en/mystery-encounter-messages.json @@ -0,0 +1,6 @@ +{ + "paid_money": "You paid ₽{{amount, number}}.", + "receive_money": "You received ₽{{amount, number}}!", + "affects_pokedex": "Affects Pokédex Data", + "cancel_option": "Return to encounter option select." +} diff --git a/src/locales/en/mystery-encounter.ts b/src/locales/en/mystery-encounter.ts index 5578cf6fe1b..8ed2d597523 100644 --- a/src/locales/en/mystery-encounter.ts +++ b/src/locales/en/mystery-encounter.ts @@ -45,12 +45,6 @@ export const mysteryEncounter = { // DO NOT REMOVE "unit_test_dialogue": "{{test}}{{test}} {{test{{test}}}} {{test1}} {{test\}} {{test\\}} {{test\\\}} {test}}", - // General use content - "paid_money": "You paid ₽{{amount, number}}.", - "receive_money": "You received ₽{{amount, number}}!", - "affects_pokedex": "Affects Pokédex Data", - "cancel_option": "Return to encounter option select.", - mysteriousChallengers: mysteriousChallengersDialogue, mysteriousChest: mysteriousChestDialogue, darkDeal: darkDealDialogue, diff --git a/src/locales/en/mystery-encounters/bug-type-superfan-dialogue.json b/src/locales/en/mystery-encounters/bug-type-superfan-dialogue.json index 13087c1d932..58bdf942eb3 100644 --- a/src/locales/en/mystery-encounters/bug-type-superfan-dialogue.json +++ b/src/locales/en/mystery-encounters/bug-type-superfan-dialogue.json @@ -32,6 +32,7 @@ } }, "battle_won": "Your knowledge and skill were perfect at exploiting our weaknesses!$In exchange for the valuable lesson,\nallow me to teach one of your Pokémon a Bug Type Move!", + "teach_move_prompt": "Select a move to teach a Pokémon.", "confirm_no_teach": "You sure you don't want to learn one of these great moves?", "outro": "I see great Bug Pokémon in your future!\nMay our paths cross again!$Bug out!" } \ No newline at end of file diff --git a/src/overrides.ts b/src/overrides.ts index 41f261b73df..cbde74314c6 100644 --- a/src/overrides.ts +++ b/src/overrides.ts @@ -130,10 +130,11 @@ class DefaultOverrides { // ------------------------- // MYSTERY ENCOUNTER OVERRIDES // ------------------------- - // 1 to 256, set to null to ignore - readonly MYSTERY_ENCOUNTER_RATE_OVERRIDE: number | null = 256; + + /** 1 to 256, set to null to ignore */ + readonly MYSTERY_ENCOUNTER_RATE_OVERRIDE: number | null = null; readonly MYSTERY_ENCOUNTER_TIER_OVERRIDE: MysteryEncounterTier | null = null; - readonly MYSTERY_ENCOUNTER_OVERRIDE: MysteryEncounterType | null = MysteryEncounterType.BUG_TYPE_SUPERFAN; + readonly MYSTERY_ENCOUNTER_OVERRIDE: MysteryEncounterType | null = null; // ------------------------- // MODIFIER / ITEM OVERRIDES diff --git a/src/test/final_boss.test.ts b/src/test/final_boss.test.ts index 0f59572619b..c9d9404affa 100644 --- a/src/test/final_boss.test.ts +++ b/src/test/final_boss.test.ts @@ -53,7 +53,7 @@ describe("Final Boss", () => { expect(game.scene.getEnemyPokemon()!.species.speciesId).not.toBe(Species.ETERNATUS); }); - it("should not have passive enabled on Eternatus", async () => { + it("should NOT have passive enabled on Eternatus", async () => { await game.runToFinalBossEncounter(game, [Species.BIDOOF], GameModes.CLASSIC); const eternatus = game.scene.getEnemyPokemon(); diff --git a/src/test/mystery-encounter/encounterTestUtils.ts b/src/test/mystery-encounter/encounter-test-utils.ts similarity index 97% rename from src/test/mystery-encounter/encounterTestUtils.ts rename to src/test/mystery-encounter/encounter-test-utils.ts index a157f87c1ba..9fb6c52cef3 100644 --- a/src/test/mystery-encounter/encounterTestUtils.ts +++ b/src/test/mystery-encounter/encounter-test-utils.ts @@ -150,8 +150,9 @@ async function handleSecondaryOptionSelect(game: GameManager, pokemonNo: number, /** * For any MysteryEncounter that has a battle, can call this to skip battle and proceed to MysteryEncounterRewardsPhase * @param game + * @param runRewardsPhase */ -export async function skipBattleRunMysteryEncounterRewardsPhase(game: GameManager) { +export async function skipBattleRunMysteryEncounterRewardsPhase(game: GameManager, runRewardsPhase: boolean = true) { game.scene.clearPhaseQueue(); game.scene.clearPhaseQueueSplice(); game.scene.getEnemyParty().forEach(p => { @@ -161,5 +162,5 @@ export async function skipBattleRunMysteryEncounterRewardsPhase(game: GameManage }); game.scene.pushPhase(new VictoryPhase(game.scene, 0)); game.phaseInterceptor.superEndPhase(); - await game.phaseInterceptor.to(MysteryEncounterRewardsPhase, true); + await game.phaseInterceptor.to(MysteryEncounterRewardsPhase, runRewardsPhase); } diff --git a/src/test/mystery-encounter/encounters/a-trainers-test-encounter.test.ts b/src/test/mystery-encounter/encounters/a-trainers-test-encounter.test.ts index 6b405b9e5b3..b4cc186864c 100644 --- a/src/test/mystery-encounter/encounters/a-trainers-test-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/a-trainers-test-encounter.test.ts @@ -6,7 +6,7 @@ import { Species } from "#app/enums/species"; import GameManager from "#app/test/utils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import { runMysteryEncounterToEnd, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounterTestUtils"; +import { runMysteryEncounterToEnd, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounter-test-utils"; import BattleScene from "#app/battle-scene"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; diff --git a/src/test/mystery-encounter/encounters/absolute-avarice-encounter.test.ts b/src/test/mystery-encounter/encounters/absolute-avarice-encounter.test.ts index b5999f69897..3bf17b61b2a 100644 --- a/src/test/mystery-encounter/encounters/absolute-avarice-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/absolute-avarice-encounter.test.ts @@ -4,7 +4,7 @@ import { Species } from "#app/enums/species"; import GameManager from "#app/test/utils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import { runMysteryEncounterToEnd, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounterTestUtils"; +import { runMysteryEncounterToEnd, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounter-test-utils"; import BattleScene from "#app/battle-scene"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; diff --git a/src/test/mystery-encounter/encounters/an-offer-you-cant-refuse-encounter.test.ts b/src/test/mystery-encounter/encounters/an-offer-you-cant-refuse-encounter.test.ts index bbc1a968b5c..19aa04b7a7a 100644 --- a/src/test/mystery-encounter/encounters/an-offer-you-cant-refuse-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/an-offer-you-cant-refuse-encounter.test.ts @@ -6,7 +6,7 @@ import { Species } from "#app/enums/species"; import GameManager from "#app/test/utils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import { runMysteryEncounterToEnd } from "#test/mystery-encounter/encounterTestUtils"; +import { runMysteryEncounterToEnd } from "#test/mystery-encounter/encounter-test-utils"; import BattleScene from "#app/battle-scene"; import { PlayerPokemon, PokemonMove } from "#app/field/pokemon"; import { AnOfferYouCantRefuseEncounter } from "#app/data/mystery-encounters/encounters/an-offer-you-cant-refuse-encounter"; diff --git a/src/test/mystery-encounter/encounters/berries-abound-encounter.test.ts b/src/test/mystery-encounter/encounters/berries-abound-encounter.test.ts index 23ec94683ee..3e772c9fb4c 100644 --- a/src/test/mystery-encounter/encounters/berries-abound-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/berries-abound-encounter.test.ts @@ -4,7 +4,7 @@ import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; import GameManager from "#app/test/utils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import { runMysteryEncounterToEnd, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounterTestUtils"; +import { runMysteryEncounterToEnd, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounter-test-utils"; import BattleScene from "#app/battle-scene"; import { Mode } from "#app/ui/ui"; import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; diff --git a/src/test/mystery-encounter/encounters/bug-type-superfan-encounter.test.ts b/src/test/mystery-encounter/encounters/bug-type-superfan-encounter.test.ts new file mode 100644 index 00000000000..70adf93d502 --- /dev/null +++ b/src/test/mystery-encounter/encounters/bug-type-superfan-encounter.test.ts @@ -0,0 +1,585 @@ +import * as MysteryEncounters from "#app/data/mystery-encounters/mystery-encounters"; +import { Biome } from "#app/enums/biome"; +import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; +import { Species } from "#app/enums/species"; +import GameManager from "#app/test/utils/gameManager"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import { runMysteryEncounterToEnd, runSelectMysteryEncounterOption, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounter-test-utils"; +import { Moves } from "#enums/moves"; +import BattleScene from "#app/battle-scene"; +import { PokemonMove } from "#app/field/pokemon"; +import { Mode } from "#app/ui/ui"; +import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; +import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; +import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; +import { TrainerType } from "#enums/trainer-type"; +import { MysteryEncounterPhase, MysteryEncounterRewardsPhase } from "#app/phases/mystery-encounter-phases"; +import { ContactHeldItemTransferChanceModifier } from "#app/modifier/modifier"; +import { CommandPhase } from "#app/phases/command-phase"; +import { BugTypeSuperfanEncounter } from "#app/data/mystery-encounters/encounters/bug-type-superfan-encounter"; +import * as encounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { SelectModifierPhase } from "#app/phases/select-modifier-phase"; +import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; + +const namespace = "mysteryEncounter:bugTypeSuperfan"; +const defaultParty = [Species.LAPRAS, Species.GENGAR, Species.WEEDLE]; +const defaultBiome = Biome.CAVE; +const defaultWave = 24; + +const POOL_1_POKEMON = [ + Species.PARASECT, + Species.VENOMOTH, + Species.LEDIAN, + Species.ARIADOS, + Species.YANMA, + Species.BEAUTIFLY, + Species.DUSTOX, + Species.MASQUERAIN, + Species.NINJASK, + Species.VOLBEAT, + Species.ILLUMISE, + Species.ANORITH, + Species.KRICKETUNE, + Species.WORMADAM, + Species.MOTHIM, + Species.SKORUPI, + Species.JOLTIK, + Species.LARVESTA, + Species.VIVILLON, + Species.CHARJABUG, + Species.RIBOMBEE, + Species.SPIDOPS, + Species.LOKIX +]; + +const POOL_2_POKEMON = [ + Species.SCYTHER, + Species.PINSIR, + Species.HERACROSS, + Species.FORRETRESS, + Species.SCIZOR, + Species.SHUCKLE, + Species.SHEDINJA, + Species.ARMALDO, + Species.VESPIQUEN, + Species.DRAPION, + Species.YANMEGA, + Species.LEAVANNY, + Species.SCOLIPEDE, + Species.CRUSTLE, + Species.ESCAVALIER, + Species.ACCELGOR, + Species.GALVANTULA, + Species.VIKAVOLT, + Species.ARAQUANID, + Species.ORBEETLE, + Species.CENTISKORCH, + Species.FROSMOTH, + Species.KLEAVOR, +]; + +const POOL_3_POKEMON: { species: Species, formIndex?: number }[] = [ + { + species: Species.PINSIR, + formIndex: 1 + }, + { + species: Species.SCIZOR, + formIndex: 1 + }, + { + species: Species.HERACROSS, + formIndex: 1 + }, + { + species: Species.ORBEETLE, + formIndex: 1 + }, + { + species: Species.CENTISKORCH, + formIndex: 1 + }, + { + species: Species.DURANT, + }, + { + species: Species.VOLCARONA, + }, + { + species: Species.GOLISOPOD, + }, +]; + +const POOL_4_POKEMON = [ + Species.GENESECT, + Species.SLITHER_WING, + Species.BUZZWOLE, + Species.PHEROMOSA +]; + +const PHYSICAL_TUTOR_MOVES = [ + Moves.MEGAHORN, + Moves.X_SCISSOR, + Moves.ATTACK_ORDER, + Moves.PIN_MISSILE, + Moves.FIRST_IMPRESSION +]; + +const SPECIAL_TUTOR_MOVES = [ + Moves.SILVER_WIND, + Moves.BUG_BUZZ, + Moves.SIGNAL_BEAM, + Moves.POLLEN_PUFF +]; + +const STATUS_TUTOR_MOVES = [ + Moves.STRING_SHOT, + Moves.STICKY_WEB, + Moves.SILK_TRAP, + Moves.RAGE_POWDER, + Moves.HEAL_ORDER +]; + +const MISC_TUTOR_MOVES = [ + Moves.BUG_BITE, + Moves.LEECH_LIFE, + Moves.DEFEND_ORDER, + Moves.QUIVER_DANCE, + Moves.TAIL_GLOW, + Moves.INFESTATION, + Moves.U_TURN +]; + +describe("Bug-Type Superfan - Mystery Encounter", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + let scene: BattleScene; + + beforeAll(() => { + phaserGame = new Phaser.Game({ type: Phaser.HEADLESS }); + }); + + beforeEach(async () => { + game = new GameManager(phaserGame); + scene = game.scene; + game.override.mysteryEncounterChance(100); + game.override.startingWave(defaultWave); + game.override.startingBiome(defaultBiome); + game.override.disableTrainerWaves(); + + vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue( + new Map([ + [Biome.CAVE, [MysteryEncounterType.BUG_TYPE_SUPERFAN]], + ]) + ); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + vi.clearAllMocks(); + vi.resetAllMocks(); + }); + + it("should have the correct properties", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.BUG_TYPE_SUPERFAN, defaultParty); + + expect(BugTypeSuperfanEncounter.encounterType).toBe(MysteryEncounterType.BUG_TYPE_SUPERFAN); + expect(BugTypeSuperfanEncounter.encounterTier).toBe(MysteryEncounterTier.GREAT); + expect(BugTypeSuperfanEncounter.dialogue).toBeDefined(); + expect(BugTypeSuperfanEncounter.dialogue.intro).toStrictEqual([ + { + text: `${namespace}.intro`, + }, + { + speaker: `${namespace}.speaker`, + text: `${namespace}.intro_dialogue`, + }, + ]); + expect(BugTypeSuperfanEncounter.dialogue.encounterOptionsDialogue?.title).toBe(`${namespace}.title`); + expect(BugTypeSuperfanEncounter.dialogue.encounterOptionsDialogue?.description).toBe(`${namespace}.description`); + expect(BugTypeSuperfanEncounter.dialogue.encounterOptionsDialogue?.query).toBe(`${namespace}.query`); + expect(BugTypeSuperfanEncounter.options.length).toBe(3); + }); + + it("should not run below wave 10", async () => { + game.override.startingWave(9); + + await game.runToMysteryEncounter(); + + expect(scene.currentBattle?.mysteryEncounter?.encounterType).not.toBe(MysteryEncounterType.BUG_TYPE_SUPERFAN); + }); + + it("should not run above wave 179", async () => { + game.override.startingWave(181); + + await game.runToMysteryEncounter(); + + expect(scene.currentBattle.mysteryEncounter).toBeUndefined(); + }); + + it("should initialize fully", async () => { + initSceneWithoutEncounterPhase(scene, defaultParty); + scene.currentBattle.mysteryEncounter = BugTypeSuperfanEncounter; + + const { onInit } = BugTypeSuperfanEncounter; + + expect(BugTypeSuperfanEncounter.onInit).toBeDefined(); + + BugTypeSuperfanEncounter.populateDialogueTokensFromRequirements(scene); + const onInitResult = onInit!(scene); + const config = BugTypeSuperfanEncounter.enemyPartyConfigs[0]; + + expect(config).toBeDefined(); + expect(config.trainerConfig?.trainerType).toBe(TrainerType.BUG_TYPE_SUPERFAN); + expect(config.trainerConfig?.partyTemplates).toBeDefined(); + expect(config.female).toBe(true); + expect(onInitResult).toBe(true); + }); + + describe("Option 1 - Battle the Bug-Type Superfan", () => { + it("should have the correct properties", () => { + const option = BugTypeSuperfanEncounter.options[0]; + expect(option.optionMode).toBe(MysteryEncounterOptionMode.DEFAULT); + expect(option.dialogue).toBeDefined(); + expect(option.dialogue).toStrictEqual({ + buttonLabel: `${namespace}.option.1.label`, + buttonTooltip: `${namespace}.option.1.tooltip`, + selected: [ + { + speaker: `${namespace}.speaker`, + text: `${namespace}.option.1.selected`, + }, + ], + }); + }); + + it("should start battle against the Bug-Type Superfan with wave 30 party template", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.BUG_TYPE_SUPERFAN, defaultParty); + await runMysteryEncounterToEnd(game, 1, undefined, true); + + const enemyParty = scene.getEnemyParty(); + expect(scene.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name); + expect(enemyParty.length).toBe(2); + expect(scene.currentBattle.trainer?.config.trainerType).toBe(TrainerType.BUG_TYPE_SUPERFAN); + expect(enemyParty[0].species.speciesId).toBe(Species.BEEDRILL); + expect(enemyParty[1].species.speciesId).toBe(Species.BUTTERFREE); + }); + + it("should start battle against the Bug-Type Superfan with wave 50 party template", async () => { + game.override.startingWave(43); + await game.runToMysteryEncounter(MysteryEncounterType.BUG_TYPE_SUPERFAN, defaultParty); + await runMysteryEncounterToEnd(game, 1, undefined, true); + + const enemyParty = scene.getEnemyParty(); + expect(scene.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name); + expect(enemyParty.length).toBe(3); + expect(scene.currentBattle.trainer?.config.trainerType).toBe(TrainerType.BUG_TYPE_SUPERFAN); + expect(enemyParty[0].species.speciesId).toBe(Species.BEEDRILL); + expect(enemyParty[1].species.speciesId).toBe(Species.BUTTERFREE); + expect(POOL_1_POKEMON.includes(enemyParty[2].species.speciesId)).toBe(true); + }); + + it("should start battle against the Bug-Type Superfan with wave 70 party template", async () => { + game.override.startingWave(61); + await game.runToMysteryEncounter(MysteryEncounterType.BUG_TYPE_SUPERFAN, defaultParty); + await runMysteryEncounterToEnd(game, 1, undefined, true); + + const enemyParty = scene.getEnemyParty(); + expect(scene.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name); + expect(enemyParty.length).toBe(4); + expect(scene.currentBattle.trainer?.config.trainerType).toBe(TrainerType.BUG_TYPE_SUPERFAN); + expect(enemyParty[0].species.speciesId).toBe(Species.BEEDRILL); + expect(enemyParty[1].species.speciesId).toBe(Species.BUTTERFREE); + expect(POOL_1_POKEMON.includes(enemyParty[2].species.speciesId)).toBe(true); + expect(POOL_2_POKEMON.includes(enemyParty[3].species.speciesId)).toBe(true); + }); + + it("should start battle against the Bug-Type Superfan with wave 100 party template", async () => { + game.override.startingWave(81); + await game.runToMysteryEncounter(MysteryEncounterType.BUG_TYPE_SUPERFAN, defaultParty); + await runMysteryEncounterToEnd(game, 1, undefined, true); + + const enemyParty = scene.getEnemyParty(); + expect(scene.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name); + expect(enemyParty.length).toBe(5); + expect(scene.currentBattle.trainer?.config.trainerType).toBe(TrainerType.BUG_TYPE_SUPERFAN); + expect(enemyParty[0].species.speciesId).toBe(Species.BEEDRILL); + expect(enemyParty[1].species.speciesId).toBe(Species.BUTTERFREE); + expect(POOL_1_POKEMON.includes(enemyParty[2].species.speciesId)).toBe(true); + expect(POOL_2_POKEMON.includes(enemyParty[3].species.speciesId)).toBe(true); + expect(POOL_2_POKEMON.includes(enemyParty[4].species.speciesId)).toBe(true); + }); + + it("should start battle against the Bug-Type Superfan with wave 120 party template", async () => { + game.override.startingWave(111); + await game.runToMysteryEncounter(MysteryEncounterType.BUG_TYPE_SUPERFAN, defaultParty); + await runMysteryEncounterToEnd(game, 1, undefined, true); + + const enemyParty = scene.getEnemyParty(); + expect(scene.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name); + expect(enemyParty.length).toBe(5); + expect(scene.currentBattle.trainer?.config.trainerType).toBe(TrainerType.BUG_TYPE_SUPERFAN); + expect(enemyParty[0].species.speciesId).toBe(Species.BEEDRILL); + expect(enemyParty[0].formIndex).toBe(1); + expect(enemyParty[1].species.speciesId).toBe(Species.BUTTERFREE); + expect(enemyParty[1].formIndex).toBe(1); + expect(POOL_2_POKEMON.includes(enemyParty[2].species.speciesId)).toBe(true); + expect(POOL_2_POKEMON.includes(enemyParty[3].species.speciesId)).toBe(true); + expect(POOL_3_POKEMON.some(config => enemyParty[4].species.speciesId === config.species)).toBe(true); + }); + + it("should start battle against the Bug-Type Superfan with wave 140 party template", async () => { + game.override.startingWave(131); + await game.runToMysteryEncounter(MysteryEncounterType.BUG_TYPE_SUPERFAN, defaultParty); + await runMysteryEncounterToEnd(game, 1, undefined, true); + + const enemyParty = scene.getEnemyParty(); + expect(scene.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name); + expect(enemyParty.length).toBe(5); + expect(scene.currentBattle.trainer?.config.trainerType).toBe(TrainerType.BUG_TYPE_SUPERFAN); + expect(enemyParty[0].species.speciesId).toBe(Species.BEEDRILL); + expect(enemyParty[0].formIndex).toBe(1); + expect(enemyParty[1].species.speciesId).toBe(Species.BUTTERFREE); + expect(enemyParty[1].formIndex).toBe(1); + expect(POOL_2_POKEMON.includes(enemyParty[2].species.speciesId)).toBe(true); + expect(POOL_3_POKEMON.some(config => enemyParty[3].species.speciesId === config.species)).toBe(true); + expect(POOL_3_POKEMON.some(config => enemyParty[4].species.speciesId === config.species)).toBe(true); + }); + + it("should start battle against the Bug-Type Superfan with wave 160 party template", async () => { + game.override.startingWave(151); + await game.runToMysteryEncounter(MysteryEncounterType.BUG_TYPE_SUPERFAN, defaultParty); + await runMysteryEncounterToEnd(game, 1, undefined, true); + + const enemyParty = scene.getEnemyParty(); + expect(scene.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name); + expect(enemyParty.length).toBe(5); + expect(scene.currentBattle.trainer?.config.trainerType).toBe(TrainerType.BUG_TYPE_SUPERFAN); + expect(enemyParty[0].species.speciesId).toBe(Species.BEEDRILL); + expect(enemyParty[0].formIndex).toBe(1); + expect(enemyParty[1].species.speciesId).toBe(Species.BUTTERFREE); + expect(enemyParty[1].formIndex).toBe(1); + expect(POOL_2_POKEMON.includes(enemyParty[2].species.speciesId)).toBe(true); + expect(POOL_3_POKEMON.some(config => enemyParty[3].species.speciesId === config.species)).toBe(true); + expect(POOL_4_POKEMON.includes(enemyParty[4].species.speciesId)).toBe(true); + }); + + it("should start battle against the Bug-Type Superfan with wave 180 party template", async () => { + game.override.startingWave(171); + await game.runToMysteryEncounter(MysteryEncounterType.BUG_TYPE_SUPERFAN, defaultParty); + await runMysteryEncounterToEnd(game, 1, undefined, true); + + const enemyParty = scene.getEnemyParty(); + expect(scene.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name); + expect(enemyParty.length).toBe(5); + expect(scene.currentBattle.trainer?.config.trainerType).toBe(TrainerType.BUG_TYPE_SUPERFAN); + expect(enemyParty[0].species.speciesId).toBe(Species.BEEDRILL); + expect(enemyParty[0].formIndex).toBe(1); + expect(enemyParty[0].isBoss()).toBe(true); + expect(enemyParty[0].bossSegments).toBe(2); + expect(enemyParty[1].species.speciesId).toBe(Species.BUTTERFREE); + expect(enemyParty[1].formIndex).toBe(1); + expect(enemyParty[1].isBoss()).toBe(true); + expect(enemyParty[1].bossSegments).toBe(2); + expect(POOL_3_POKEMON.some(config => enemyParty[2].species.speciesId === config.species)).toBe(true); + expect(POOL_3_POKEMON.some(config => enemyParty[3].species.speciesId === config.species)).toBe(true); + expect(POOL_4_POKEMON.includes(enemyParty[4].species.speciesId)).toBe(true); + }); + + it("should let the player learn a Bug move after battle ends", async () => { + const selectOptionSpy = vi.spyOn(encounterPhaseUtils, "selectOptionThenPokemon"); + await game.runToMysteryEncounter(MysteryEncounterType.BUG_TYPE_SUPERFAN, defaultParty); + await runMysteryEncounterToEnd(game, 1, undefined, true); + await skipBattleRunMysteryEncounterRewardsPhase(game, false); + + expect(scene.getCurrentPhase()?.constructor.name).toBe(MysteryEncounterRewardsPhase.name); + game.phaseInterceptor["prompts"] = []; // Clear out prompt handlers + game.onNextPrompt("MysteryEncounterRewardsPhase", Mode.OPTION_SELECT, () => { + game.phaseInterceptor.superEndPhase(); + }); + await game.phaseInterceptor.run(MysteryEncounterRewardsPhase); + + expect(selectOptionSpy).toHaveBeenCalledTimes(1); + const optionData = selectOptionSpy.mock.calls[0][1]; + expect(PHYSICAL_TUTOR_MOVES.some(move => new PokemonMove(move).getName() === optionData[0].label)).toBe(true); + expect(SPECIAL_TUTOR_MOVES.some(move => new PokemonMove(move).getName() === optionData[1].label)).toBe(true); + expect(STATUS_TUTOR_MOVES.some(move => new PokemonMove(move).getName() === optionData[2].label)).toBe(true); + expect(MISC_TUTOR_MOVES.some(move => new PokemonMove(move).getName() === optionData[3].label)).toBe(true); + }); + }); + + describe("Option 2 - Show off Bug Types", () => { + it("should have the correct properties", () => { + const option = BugTypeSuperfanEncounter.options[1]; + expect(option.optionMode).toBe(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT); + expect(option.dialogue).toBeDefined(); + expect(option.dialogue).toStrictEqual({ + buttonLabel: `${namespace}.option.2.label`, + buttonTooltip: `${namespace}.option.2.tooltip`, + disabledButtonTooltip: `${namespace}.option.2.disabled_tooltip` + }); + }); + + it("should NOT be selectable if the player doesn't have any Bug types", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.BUG_TYPE_SUPERFAN, [Species.ABRA]); + await game.phaseInterceptor.to(MysteryEncounterPhase, false); + + const encounterPhase = scene.getCurrentPhase(); + expect(encounterPhase?.constructor.name).toBe(MysteryEncounterPhase.name); + const mysteryEncounterPhase = encounterPhase as MysteryEncounterPhase; + vi.spyOn(mysteryEncounterPhase, "continueEncounter"); + vi.spyOn(mysteryEncounterPhase, "handleOptionSelect"); + vi.spyOn(scene.ui, "playError"); + + await runSelectMysteryEncounterOption(game, 2); + + expect(scene.getCurrentPhase()?.constructor.name).toBe(MysteryEncounterPhase.name); + expect(scene.ui.playError).not.toHaveBeenCalled(); // No error sfx, option is disabled + expect(mysteryEncounterPhase.handleOptionSelect).not.toHaveBeenCalled(); + expect(mysteryEncounterPhase.continueEncounter).not.toHaveBeenCalled(); + }); + + it("should proceed to rewards screen with 0-1 Bug Types reward options", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.BUG_TYPE_SUPERFAN, defaultParty); + await runMysteryEncounterToEnd(game, 2); + + expect(scene.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name); + await game.phaseInterceptor.run(SelectModifierPhase); + + expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); + const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; + expect(modifierSelectHandler.options.length).toEqual(2); + expect(modifierSelectHandler.options[0].modifierTypeOption.type.id).toBe("SUPER_LURE"); + expect(modifierSelectHandler.options[1].modifierTypeOption.type.id).toBe("GREAT_BALL"); + }); + + it("should proceed to rewards screen with 2-3 Bug Types reward options", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.BUG_TYPE_SUPERFAN, [Species.BUTTERFREE, Species.BEEDRILL]); + await runMysteryEncounterToEnd(game, 2); + + expect(scene.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name); + await game.phaseInterceptor.run(SelectModifierPhase); + + expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); + const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; + expect(modifierSelectHandler.options.length).toEqual(3); + expect(modifierSelectHandler.options[0].modifierTypeOption.type.id).toBe("QUICK_CLAW"); + expect(modifierSelectHandler.options[1].modifierTypeOption.type.id).toBe("MAX_LURE"); + expect(modifierSelectHandler.options[2].modifierTypeOption.type.id).toBe("ULTRA_BALL"); + }); + + it("should proceed to rewards screen with 4-5 Bug Types reward options", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.BUG_TYPE_SUPERFAN, [Species.BUTTERFREE, Species.BEEDRILL, Species.GALVANTULA, Species.VOLCARONA]); + await runMysteryEncounterToEnd(game, 2); + + expect(scene.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name); + await game.phaseInterceptor.run(SelectModifierPhase); + + expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); + const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; + expect(modifierSelectHandler.options.length).toEqual(3); + expect(modifierSelectHandler.options[0].modifierTypeOption.type.id).toBe("GRIP_CLAW"); + expect(modifierSelectHandler.options[1].modifierTypeOption.type.id).toBe("MAX_LURE"); + expect(modifierSelectHandler.options[2].modifierTypeOption.type.id).toBe("ROGUE_BALL"); + }); + + it("should proceed to rewards screen with 6 Bug Types reward options (including form change item)", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.BUG_TYPE_SUPERFAN, [Species.BUTTERFREE, Species.BEEDRILL, Species.GALVANTULA, Species.VOLCARONA, Species.ANORITH, Species.GENESECT]); + await runMysteryEncounterToEnd(game, 2); + + expect(scene.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name); + await game.phaseInterceptor.run(SelectModifierPhase); + + expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); + const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; + expect(modifierSelectHandler.options.length).toEqual(3); + expect(modifierSelectHandler.options[0].modifierTypeOption.type.id).toBe("MASTER_BALL"); + expect(modifierSelectHandler.options[1].modifierTypeOption.type.id).toBe("MAX_LURE"); + expect(modifierSelectHandler.options[2].modifierTypeOption.type.id).toBe("FORM_CHANGE_ITEM"); + }); + + it("should leave encounter without battle", async () => { + const leaveEncounterWithoutBattleSpy = vi.spyOn(encounterPhaseUtils, "leaveEncounterWithoutBattle"); + + await game.runToMysteryEncounter(MysteryEncounterType.BUG_TYPE_SUPERFAN, defaultParty); + await runMysteryEncounterToEnd(game, 2); + + expect(leaveEncounterWithoutBattleSpy).toBeCalled(); + }); + }); + + describe("Option 3 - Give a Bug Item", () => { + it("should have the correct properties", () => { + const option = BugTypeSuperfanEncounter.options[2]; + expect(option.optionMode).toBe(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT); + expect(option.dialogue).toBeDefined(); + expect(option.dialogue).toStrictEqual({ + buttonLabel: `${namespace}.option.3.label`, + buttonTooltip: `${namespace}.option.3.tooltip`, + disabledButtonTooltip: `${namespace}.option.3.disabled_tooltip`, + selected: [ + { + text: `${namespace}.option.3.selected`, + }, + { + speaker: `${namespace}.speaker`, + text: `${namespace}.option.3.selected_dialogue`, + }, + ], + secondOptionPrompt: `${namespace}.option.3.select_prompt`, + }); + }); + + it("should NOT be selectable if the player doesn't have any Bug items", async () => { + game.scene.modifiers = []; + await game.runToMysteryEncounter(MysteryEncounterType.BUG_TYPE_SUPERFAN, defaultParty); + await game.phaseInterceptor.to(MysteryEncounterPhase, false); + + game.scene.modifiers = []; + const encounterPhase = scene.getCurrentPhase(); + expect(encounterPhase?.constructor.name).toBe(MysteryEncounterPhase.name); + const mysteryEncounterPhase = encounterPhase as MysteryEncounterPhase; + vi.spyOn(mysteryEncounterPhase, "continueEncounter"); + vi.spyOn(mysteryEncounterPhase, "handleOptionSelect"); + vi.spyOn(scene.ui, "playError"); + + await runSelectMysteryEncounterOption(game, 3); + + expect(scene.getCurrentPhase()?.constructor.name).toBe(MysteryEncounterPhase.name); + expect(scene.ui.playError).not.toHaveBeenCalled(); // No error sfx, option is disabled + expect(mysteryEncounterPhase.handleOptionSelect).not.toHaveBeenCalled(); + expect(mysteryEncounterPhase.continueEncounter).not.toHaveBeenCalled(); + }); + + it("should remove the gifted item and proceed to rewards screen", async () => { + game.override.startingHeldItems([{name: "GRIP_CLAW", count: 1}]); + await game.runToMysteryEncounter(MysteryEncounterType.BUG_TYPE_SUPERFAN, [Species.BUTTERFREE]); + + const gripClawCountBefore = scene.findModifier(m => m instanceof ContactHeldItemTransferChanceModifier)?.stackCount ?? 0; + + await runMysteryEncounterToEnd(game, 3, { pokemonNo: 1, optionNo: 1 }); + + expect(scene.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name); + await game.phaseInterceptor.run(SelectModifierPhase); + + expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); + const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; + expect(modifierSelectHandler.options.length).toEqual(2); + expect(modifierSelectHandler.options[0].modifierTypeOption.type.id).toBe("MYSTERY_ENCOUNTER_GOLDEN_BUG_NET"); + expect(modifierSelectHandler.options[1].modifierTypeOption.type.id).toBe("REVIVER_SEED"); + + const gripClawCountAfter = scene.findModifier(m => m instanceof ContactHeldItemTransferChanceModifier)?.stackCount ?? 0; + expect(gripClawCountBefore - 1).toBe(gripClawCountAfter); + }); + + it("should leave encounter without battle", async () => { + game.override.startingHeldItems([{name: "GRIP_CLAW", count: 1}]); + const leaveEncounterWithoutBattleSpy = vi.spyOn(encounterPhaseUtils, "leaveEncounterWithoutBattle"); + + await game.runToMysteryEncounter(MysteryEncounterType.BUG_TYPE_SUPERFAN, [Species.BUTTERFREE]); + await runMysteryEncounterToEnd(game, 3, { pokemonNo: 1, optionNo: 1 }); + + expect(leaveEncounterWithoutBattleSpy).toBeCalled(); + }); + }); +}); diff --git a/src/test/mystery-encounter/encounters/clowning-around-encounter.test.ts b/src/test/mystery-encounter/encounters/clowning-around-encounter.test.ts index ebe0a28dd4f..273bb903f15 100644 --- a/src/test/mystery-encounter/encounters/clowning-around-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/clowning-around-encounter.test.ts @@ -8,7 +8,7 @@ import { getPokemonSpecies } from "#app/data/pokemon-species"; import * as BattleAnims from "#app/data/battle-anims"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { generateModifierType } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import { runMysteryEncounterToEnd, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounterTestUtils"; +import { runMysteryEncounterToEnd, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounter-test-utils"; import { Moves } from "#enums/moves"; import BattleScene from "#app/battle-scene"; import Pokemon, { PokemonMove } from "#app/field/pokemon"; @@ -301,7 +301,7 @@ describe("Clowning Around - Mystery Encounter", () => { expect(secondItemsAfter.length).toBe(1); expect(secondItemsAfter[0].type.id).toBe("SOUL_DEW"); expect(secondItemsAfter[0]?.stackCount).toBe(5); - }, 2000000); + }); it("should leave encounter without battle", async () => { const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); diff --git a/src/test/mystery-encounter/encounters/dancing-lessons-encounter.test.ts b/src/test/mystery-encounter/encounters/dancing-lessons-encounter.test.ts index 8e31c6d822d..ac4128e80f9 100644 --- a/src/test/mystery-encounter/encounters/dancing-lessons-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/dancing-lessons-encounter.test.ts @@ -4,7 +4,7 @@ import { Species } from "#app/enums/species"; import GameManager from "#app/test/utils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import { runMysteryEncounterToEnd, runSelectMysteryEncounterOption, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounterTestUtils"; +import { runMysteryEncounterToEnd, runSelectMysteryEncounterOption, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounter-test-utils"; import BattleScene from "#app/battle-scene"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; diff --git a/src/test/mystery-encounter/encounters/delibirdy-encounter.test.ts b/src/test/mystery-encounter/encounters/delibirdy-encounter.test.ts index 0fe8e27b44f..44701f71de8 100644 --- a/src/test/mystery-encounter/encounters/delibirdy-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/delibirdy-encounter.test.ts @@ -4,7 +4,7 @@ import { Species } from "#app/enums/species"; import GameManager from "#app/test/utils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import { runMysteryEncounterToEnd, runSelectMysteryEncounterOption } from "#test/mystery-encounter/encounterTestUtils"; +import { runMysteryEncounterToEnd, runSelectMysteryEncounterOption } from "#test/mystery-encounter/encounter-test-utils"; import BattleScene from "#app/battle-scene"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; diff --git a/src/test/mystery-encounter/encounters/department-store-sale-encounter.test.ts b/src/test/mystery-encounter/encounters/department-store-sale-encounter.test.ts index 2a050d2d835..e7a019e5d8f 100644 --- a/src/test/mystery-encounter/encounters/department-store-sale-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/department-store-sale-encounter.test.ts @@ -5,7 +5,7 @@ import { Species } from "#app/enums/species"; import GameManager from "#app/test/utils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import { runMysteryEncounterToEnd } from "#test/mystery-encounter/encounterTestUtils"; +import { runMysteryEncounterToEnd } from "#test/mystery-encounter/encounter-test-utils"; import BattleScene from "#app/battle-scene"; import { Mode } from "#app/ui/ui"; import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; diff --git a/src/test/mystery-encounter/encounters/fiery-fallout-encounter.test.ts b/src/test/mystery-encounter/encounters/fiery-fallout-encounter.test.ts index ccb4e998486..376c05297b7 100644 --- a/src/test/mystery-encounter/encounters/fiery-fallout-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/fiery-fallout-encounter.test.ts @@ -9,7 +9,7 @@ import { Gender } from "#app/data/gender"; import { getPokemonSpecies } from "#app/data/pokemon-species"; import * as BattleAnims from "#app/data/battle-anims"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import { runMysteryEncounterToEnd, runSelectMysteryEncounterOption, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounterTestUtils"; +import { runMysteryEncounterToEnd, runSelectMysteryEncounterOption, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounter-test-utils"; import { Moves } from "#enums/moves"; import BattleScene from "#app/battle-scene"; import { PokemonHeldItemModifier } from "#app/modifier/modifier"; diff --git a/src/test/mystery-encounter/encounters/fight-or-flight-encounter.test.ts b/src/test/mystery-encounter/encounters/fight-or-flight-encounter.test.ts index fe23be61d26..918e8a60c1e 100644 --- a/src/test/mystery-encounter/encounters/fight-or-flight-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/fight-or-flight-encounter.test.ts @@ -4,7 +4,7 @@ import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; import GameManager from "#app/test/utils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import { runMysteryEncounterToEnd, runSelectMysteryEncounterOption, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounterTestUtils"; +import { runMysteryEncounterToEnd, runSelectMysteryEncounterOption, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounter-test-utils"; import { Moves } from "#enums/moves"; import BattleScene from "#app/battle-scene"; import { PokemonMove } from "#app/field/pokemon"; diff --git a/src/test/mystery-encounter/encounters/lost-at-sea-encounter.test.ts b/src/test/mystery-encounter/encounters/lost-at-sea-encounter.test.ts index f77d9962f01..f2ea020ca88 100644 --- a/src/test/mystery-encounter/encounters/lost-at-sea-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/lost-at-sea-encounter.test.ts @@ -8,7 +8,7 @@ import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; import GameManager from "#app/test/utils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import { runMysteryEncounterToEnd, runSelectMysteryEncounterOption } from "../encounterTestUtils"; +import { runMysteryEncounterToEnd, runSelectMysteryEncounterOption } from "../encounter-test-utils"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; diff --git a/src/test/mystery-encounter/encounters/mysterious-challengers-encounter.test.ts b/src/test/mystery-encounter/encounters/mysterious-challengers-encounter.test.ts index ad596078738..996149046b1 100644 --- a/src/test/mystery-encounter/encounters/mysterious-challengers-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/mysterious-challengers-encounter.test.ts @@ -5,7 +5,7 @@ import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; import GameManager from "#app/test/utils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import { runMysteryEncounterToEnd, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounterTestUtils"; +import { runMysteryEncounterToEnd, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounter-test-utils"; import BattleScene from "#app/battle-scene"; import { Mode } from "#app/ui/ui"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; diff --git a/src/test/mystery-encounter/encounters/part-timer-encounter.test.ts b/src/test/mystery-encounter/encounters/part-timer-encounter.test.ts index 4eb44af5f24..f73c1f437d0 100644 --- a/src/test/mystery-encounter/encounters/part-timer-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/part-timer-encounter.test.ts @@ -5,7 +5,7 @@ import { Species } from "#app/enums/species"; import GameManager from "#app/test/utils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import { runMysteryEncounterToEnd, runSelectMysteryEncounterOption } from "#test/mystery-encounter/encounterTestUtils"; +import { runMysteryEncounterToEnd, runSelectMysteryEncounterOption } from "#test/mystery-encounter/encounter-test-utils"; import BattleScene from "#app/battle-scene"; import { CIVILIZATION_ENCOUNTER_BIOMES } from "#app/data/mystery-encounters/mystery-encounters"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; diff --git a/src/test/mystery-encounter/encounters/teleporting-hijinks-encounter.test.ts b/src/test/mystery-encounter/encounters/teleporting-hijinks-encounter.test.ts index f4a3b41bf1d..9d7f1655c93 100644 --- a/src/test/mystery-encounter/encounters/teleporting-hijinks-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/teleporting-hijinks-encounter.test.ts @@ -4,7 +4,7 @@ import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; import GameManager from "#app/test/utils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import { runMysteryEncounterToEnd, runSelectMysteryEncounterOption, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounterTestUtils"; +import { runMysteryEncounterToEnd, runSelectMysteryEncounterOption, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounter-test-utils"; import BattleScene from "#app/battle-scene"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; @@ -151,7 +151,6 @@ describe("Teleporting Hijinks - Mystery Encounter", () => { it("should NOT be selectable if the player doesn't have enough money", async () => { game.scene.money = 0; await game.runToMysteryEncounter(MysteryEncounterType.TELEPORTING_HIJINKS, defaultParty); - scene.getParty().forEach(p => p.moveset = []); await game.phaseInterceptor.to(MysteryEncounterPhase, false); const encounterPhase = scene.getCurrentPhase(); diff --git a/src/test/mystery-encounter/encounters/the-pokemon-salesman-encounter.test.ts b/src/test/mystery-encounter/encounters/the-pokemon-salesman-encounter.test.ts index 7dcf10669d6..35fbd0b51af 100644 --- a/src/test/mystery-encounter/encounters/the-pokemon-salesman-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/the-pokemon-salesman-encounter.test.ts @@ -5,7 +5,7 @@ import { Species } from "#app/enums/species"; import GameManager from "#app/test/utils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import { runMysteryEncounterToEnd, runSelectMysteryEncounterOption } from "#test/mystery-encounter/encounterTestUtils"; +import { runMysteryEncounterToEnd, runSelectMysteryEncounterOption } from "#test/mystery-encounter/encounter-test-utils"; import BattleScene from "#app/battle-scene"; import { PlayerPokemon } from "#app/field/pokemon"; import { HUMAN_TRANSITABLE_BIOMES } from "#app/data/mystery-encounters/mystery-encounters"; diff --git a/src/test/mystery-encounter/encounters/the-strong-stuff-encounter.test.ts b/src/test/mystery-encounter/encounters/the-strong-stuff-encounter.test.ts index 41554cf10de..a8405ebfbfb 100644 --- a/src/test/mystery-encounter/encounters/the-strong-stuff-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/the-strong-stuff-encounter.test.ts @@ -7,7 +7,7 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vite import { getPokemonSpecies } from "#app/data/pokemon-species"; import * as BattleAnims from "#app/data/battle-anims"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import { runMysteryEncounterToEnd, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounterTestUtils"; +import { runMysteryEncounterToEnd, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounter-test-utils"; import { Moves } from "#enums/moves"; import BattleScene from "#app/battle-scene"; import { TheStrongStuffEncounter } from "#app/data/mystery-encounters/encounters/the-strong-stuff-encounter"; @@ -164,9 +164,10 @@ describe("The Strong Stuff - Mystery Encounter", () => { return baseStats.reduce((a, b) => a + b); }); - expect(bstsAfter[0]).toEqual(bstsPrior[0] - 20 * 6); - expect(bstsAfter[1]).toEqual(bstsPrior[1] + 10 * 6); - expect(bstsAfter[2]).toEqual(bstsPrior[2] + 10 * 6); + // HP stat changes are halved compared to other values + expect(bstsAfter[0]).toEqual(bstsPrior[0] - 20 * 5 - 10); + expect(bstsAfter[1]).toEqual(bstsPrior[1] + 10 * 5 + 5); + expect(bstsAfter[2]).toEqual(bstsPrior[2] + 10 * 5 + 5); }); it("should leave encounter without battle", async () => { diff --git a/src/test/mystery-encounter/encounters/the-winstrate-challenge-encounter.test.ts b/src/test/mystery-encounter/encounters/the-winstrate-challenge-encounter.test.ts index e322c63b3c9..e21bb08f165 100644 --- a/src/test/mystery-encounter/encounters/the-winstrate-challenge-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/the-winstrate-challenge-encounter.test.ts @@ -5,7 +5,7 @@ import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; import GameManager from "#app/test/utils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import { runMysteryEncounterToEnd } from "#test/mystery-encounter/encounterTestUtils"; +import { runMysteryEncounterToEnd } from "#test/mystery-encounter/encounter-test-utils"; import BattleScene from "#app/battle-scene"; import { Mode } from "#app/ui/ui"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; diff --git a/src/test/mystery-encounter/encounters/trash-to-treasure-encounter.test.ts b/src/test/mystery-encounter/encounters/trash-to-treasure-encounter.test.ts index 319a5daa38b..a4bfaea659a 100644 --- a/src/test/mystery-encounter/encounters/trash-to-treasure-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/trash-to-treasure-encounter.test.ts @@ -7,7 +7,7 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vite import { getPokemonSpecies } from "#app/data/pokemon-species"; import * as BattleAnims from "#app/data/battle-anims"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import { runMysteryEncounterToEnd, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounterTestUtils"; +import { runMysteryEncounterToEnd, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounter-test-utils"; import { Moves } from "#enums/moves"; import BattleScene from "#app/battle-scene"; import { PokemonMove } from "#app/field/pokemon"; diff --git a/src/test/mystery-encounter/encounters/weird-dream-encounter.test.ts b/src/test/mystery-encounter/encounters/weird-dream-encounter.test.ts index 99c4b2fdb13..635dac0eaee 100644 --- a/src/test/mystery-encounter/encounters/weird-dream-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/weird-dream-encounter.test.ts @@ -5,7 +5,7 @@ import { Species } from "#app/enums/species"; import GameManager from "#app/test/utils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import { runMysteryEncounterToEnd } from "#test/mystery-encounter/encounterTestUtils"; +import { runMysteryEncounterToEnd } from "#test/mystery-encounter/encounter-test-utils"; import BattleScene from "#app/battle-scene"; import { Mode } from "#app/ui/ui"; import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; diff --git a/src/ui/mystery-encounter-ui-handler.ts b/src/ui/mystery-encounter-ui-handler.ts index 094b8264bb1..a93167c8a96 100644 --- a/src/ui/mystery-encounter-ui-handler.ts +++ b/src/ui/mystery-encounter-ui-handler.ts @@ -554,7 +554,7 @@ export default class MysteryEncounterUiHandler extends UiHandler { duration: 750, onComplete: () => { this.dexProgressContainer.on("pointerover", () => { - (this.scene as BattleScene).ui.showTooltip("", i18next.t("mysteryEncounter:affects_pokedex"), true); + (this.scene as BattleScene).ui.showTooltip("", i18next.t("mysteryEncounterMessages:affects_pokedex"), true); }); this.dexProgressContainer.on("pointerout", () => { (this.scene as BattleScene).ui.hideTooltip();