From 860e875587bfcae0957fa1e519f8c20f672f37e8 Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Fri, 5 Jul 2024 16:01:57 -0400 Subject: [PATCH 001/270] rebase encounters branch with pokerogue/main --- MEs-Roadmap-Documentation.md | 198 ++++ .../images/mystery-encounters/chest_blue.json | 41 + .../images/mystery-encounters/chest_blue.png | Bin 0 -> 2723 bytes .../images/mystery-encounters/chest_red.json | 41 + .../images/mystery-encounters/chest_red.png | Bin 0 -> 2727 bytes .../mystery-encounters/dark_deal_porygon.json | 41 + .../mystery-encounters/dark_deal_porygon.png | Bin 0 -> 1209 bytes .../mystery-encounters/mad_scientist_m.json | 41 + .../mystery-encounters/mad_scientist_m.png | Bin 0 -> 13992 bytes .../mystery-encounters/training_gear.json | 41 + .../mystery-encounters/training_gear.png | Bin 0 -> 1515 bytes src/battle-scene.ts | 246 ++++- src/battle.ts | 37 +- src/data/battler-tags.ts | 36 +- src/data/mystery-encounter-flags.ts | 16 + src/data/mystery-encounter-option.ts | 158 +++ src/data/mystery-encounter-requirements.ts | 913 ++++++++++++++++++ src/data/mystery-encounter.ts | 481 +++++++++ src/data/mystery-encounters/dark-deal.ts | 134 +++ .../dialogue/dark-deal-dialogue.ts | 48 + .../dialogue/fight-or-flight-dialogue.ts | 38 + .../mysterious-challengers-dialogue.ts | 57 ++ .../dialogue/mysterious-chest-dialogue.ts | 34 + .../dialogue/mystery-encounter-dialogue.ts | 94 ++ .../dialogue/sleeping-snorlax-dialogue.ts | 39 + .../dialogue/training-session-dialogue.ts | 50 + .../mystery-encounters/fight-or-flight.ts | 116 +++ .../mysterious-challengers.ts | 151 +++ .../mystery-encounters/mysterious-chest.ts | 95 ++ .../mystery-encounter-utils.ts | 701 ++++++++++++++ .../mystery-encounters/mystery-encounters.ts | 143 +++ .../mystery-encounters/sleeping-snorlax.ts | 109 +++ .../mystery-encounters/training-session.ts | 306 ++++++ src/data/trainer-config.ts | 57 ++ src/enums/battler-tag-type.ts | 3 +- src/enums/mystery-encounter-type.ts | 8 + src/field/arena.ts | 20 +- src/field/mystery-encounter-intro.ts | 311 ++++++ src/field/pokemon.ts | 1 + src/field/trainer.ts | 7 +- src/form-change-phase.ts | 3 +- src/game-mode.ts | 6 +- src/loading-scene.ts | 4 + src/locales/en/battle.ts | 4 +- src/locales/en/config.ts | 2 + src/locales/en/mystery-encounter.ts | 125 +++ src/locales/en/party-ui-handler.ts | 1 + src/modifier/modifier-type.ts | 80 +- src/overrides.ts | 11 + src/phases.ts | 224 ++++- src/phases/battle-phase.ts | 47 + src/phases/mystery-encounter-phase.ts | 474 +++++++++ src/phases/select-modifier-phase.ts | 259 +++++ src/pipelines/sprite.ts | 5 +- src/system/game-data.ts | 25 +- src/test/battle/battle.test.ts | 2 +- src/test/lokalisation/battle-stat.test.ts | 208 ++++ src/test/lokalisation/french.test.ts | 42 + src/test/lokalisation/status-effect.test.ts | 300 ++++++ .../mystery-encounter.test.ts | 46 + src/test/phases/select-modifier-phase.test.ts | 224 +++++ src/test/utils/gameManagerUtils.ts | 21 + src/test/utils/phaseInterceptor.ts | 14 +- src/test/vitest.setup.ts | 15 +- src/ui/modifier-select-ui-handler.ts | 44 +- src/ui/mystery-encounter-ui-handler.ts | 475 +++++++++ src/ui/party-ui-handler.ts | 14 +- src/ui/ui.ts | 7 +- src/utils.ts | 4 +- 69 files changed, 7374 insertions(+), 124 deletions(-) create mode 100644 MEs-Roadmap-Documentation.md create mode 100644 public/images/mystery-encounters/chest_blue.json create mode 100644 public/images/mystery-encounters/chest_blue.png create mode 100644 public/images/mystery-encounters/chest_red.json create mode 100644 public/images/mystery-encounters/chest_red.png create mode 100644 public/images/mystery-encounters/dark_deal_porygon.json create mode 100644 public/images/mystery-encounters/dark_deal_porygon.png create mode 100644 public/images/mystery-encounters/mad_scientist_m.json create mode 100644 public/images/mystery-encounters/mad_scientist_m.png create mode 100644 public/images/mystery-encounters/training_gear.json create mode 100644 public/images/mystery-encounters/training_gear.png create mode 100644 src/data/mystery-encounter-flags.ts create mode 100644 src/data/mystery-encounter-option.ts create mode 100644 src/data/mystery-encounter-requirements.ts create mode 100644 src/data/mystery-encounter.ts create mode 100644 src/data/mystery-encounters/dark-deal.ts create mode 100644 src/data/mystery-encounters/dialogue/dark-deal-dialogue.ts create mode 100644 src/data/mystery-encounters/dialogue/fight-or-flight-dialogue.ts create mode 100644 src/data/mystery-encounters/dialogue/mysterious-challengers-dialogue.ts create mode 100644 src/data/mystery-encounters/dialogue/mysterious-chest-dialogue.ts create mode 100644 src/data/mystery-encounters/dialogue/mystery-encounter-dialogue.ts create mode 100644 src/data/mystery-encounters/dialogue/sleeping-snorlax-dialogue.ts create mode 100644 src/data/mystery-encounters/dialogue/training-session-dialogue.ts create mode 100644 src/data/mystery-encounters/fight-or-flight.ts create mode 100644 src/data/mystery-encounters/mysterious-challengers.ts create mode 100644 src/data/mystery-encounters/mysterious-chest.ts create mode 100644 src/data/mystery-encounters/mystery-encounter-utils.ts create mode 100644 src/data/mystery-encounters/mystery-encounters.ts create mode 100644 src/data/mystery-encounters/sleeping-snorlax.ts create mode 100644 src/data/mystery-encounters/training-session.ts create mode 100644 src/enums/mystery-encounter-type.ts create mode 100644 src/field/mystery-encounter-intro.ts create mode 100644 src/locales/en/mystery-encounter.ts create mode 100644 src/phases/battle-phase.ts create mode 100644 src/phases/mystery-encounter-phase.ts create mode 100644 src/phases/select-modifier-phase.ts create mode 100644 src/test/lokalisation/battle-stat.test.ts create mode 100644 src/test/lokalisation/french.test.ts create mode 100644 src/test/lokalisation/status-effect.test.ts create mode 100644 src/test/mystery-encounter/mystery-encounter.test.ts create mode 100644 src/test/phases/select-modifier-phase.test.ts create mode 100644 src/ui/mystery-encounter-ui-handler.ts diff --git a/MEs-Roadmap-Documentation.md b/MEs-Roadmap-Documentation.md new file mode 100644 index 00000000000..7e5aa1b069e --- /dev/null +++ b/MEs-Roadmap-Documentation.md @@ -0,0 +1,198 @@ +# 📝 Most immediate things to-do list + +- ### High priority + - 🐛 Intimidate and other ETB abilities proc twice at the start of wild MEs (fight or flight, dark deal) + - ⚙️ Add a tag system so MEs don't show where they shouldn't and bricking Challenge runs: + - noChallenge (cant be spawned in challenge runs) + - allChallenge (can spawn in all challenge modes) + - (typespecific)Challenge: + - Example: fireOnly (can only spawn in fire related challenges) + +- ### Medium priority + +- ### Low priority + - 🐛 Mysterious Challengers can spawn two trainers (or three) of the same type [Dev comment: not a bug] + - 🐛 Fight or Flight intro visuals may show different gender from the actual spawned pokemon + +# 📝 Things to be done before Mystery Encounters ("MEs/Events") MVP is finished: + All the things on this list should be done before an MVP (Minimum Viable Product) can be playtested. + +- ## Bugless implementation of the MVP MEs + - Establish placeholder waves for MEs to happen ✔️ + - ⚪ Bug-free implementation of Common ME 1 ('Mysterious Chest')✔️ + - ⚪ Bug-free implementation of Common ME 2 ('Fight or Flight')✔️ + - 🔵 Bug-free implementation of Rare ME 1 ('Mysterious Challenger')✔️ + - 🔵 Bug-free implementation of Rare ME 2 ('Sleeping Snorlax') 🛠️ + - 🟣 Bug-free implementation of Epic ME 1 ('Training Session') 🛠️ + - 🟡 Bug-free implementation of Legendary ME 1 ('Dark Deal') ✔️ + +- ## First round of playtesting (Alpha) + - First round of feedback on bugs for more slippery bugs 🛠️ + - First round of balance feedback on odds and power-level 🛠️ + - Tweak difficulty/rewards balance in MEs 🛠️ + + ## Translation of MEs after playtest/balance + - First round of translators feedback to avoid potential issues 🛠️ + - EN localisation 🛠️ + - ES localisation 🛠️ + +# 📝 Things to be done before Mystery Encounters ("MEs/Events") goes __live__: + All the things on this list should be done before the merge to main. + +- ## Bugless implementation of the MVP MEs + - Bugless implementation of about 55-60 MEs + - 20 non-biome-dependant: + - ⚪ 9 Common Events + - 🔵 5 Rare Events + - 🟣 4 Epic Events + - 🟡 2 Legendary Events + - 35-40 biome-dependant Events, at least one for each biome + +- ## Second round of playtesting (Beta) + - Second round of feedback for bugs ❌ + - Second round of balance feedback ❌ + - Final decisions on balance, powerlevel, odds and design choices before live feedback ❌ + + ## Translation of MEs after playtest/balance + - de localisation 🛠️ + - en localisation 🛠️ + - es-ES localisation 🛠️ + - es-MX localisation 🛠️ + - fr localisation 🛠️ + - it localisation 🛠️ + - ko localisation 🛠️ + - pt-BR localisation 🛠️ + - zh-CN localisation 🛠️ + - zh-TW localisation 🛠️ + + +# 🧬 Deep dive into Events and what has been done so far + +Events (referred to as 'Mysterious Encounters, MEs' in the code) aim to be an addition to PokeRogue that will fundamentally shift the way PokéRogue feels. It looks to improve the bet of the game into the RogueLike genre without touching the core gameplay loop of Pokémon battles/collection that we know and love already in this game. Below there are some specifications that clarify what's being worked on for ease of access for the devs, balance team, artists and others who may be interested. Beware of spoilers! + +## An Event __**always has**__: + ### #️⃣ A wave index where they're happening -- each ME takes up a whole wave (means you miss a combat!). + + ### 💬 Dialogue: + - Dialogue/Message content populated in relevant locales files (namely locales/mystery-encounter.ts) + - An associated EncounterTypeDialogue object populated in allMysteryEncounterDialogue (see data/mystery-ecounter-dialogue.ts) + - This will require certain content, such as encounter description window text and option button labels, while some other fields will be optional + - Key content to be aware of when writing encounter dialogue: + - Intro dialogue or messages (shown before anything appears on screen) + - A title (shown in description box) + - A description (shown in description box) + - A prompt/query to the player, to choose the options (shown in description box) + - An option panel at the bottom, taking the space of what usually is the game dialogs + controls + - Containing at least two options, and up to four. + - ❗❗ To view what dialogue content is __**mandatory**__ for encounters, check the schema in data/mystery-ecounter-dialogue.ts + + ### 🕺 Intro Visuals: + - One or multiple sprites may be used. They will slide onto the field when the encounter starts + - 📚 This could be anything from a group of trainers, to a Pokemon, to a static sprite of an inanimate object + - ❗❗ To populate an encounter with intro visuals, see "Encounter Class Extending MysteryEncounterWrapper" section + - 📚 Technically, the encounter will still work if Intro Visuals are not provided, but your encounter will look very strange when an empty field slides onto the screen + + ### 📋 Encounter Class Implementing MysteryEncounterWrapper + - ❗❗ All encounters should have their own class files organized in the src/data/mystery-encounters folder + - ❗❗ Encounter classes can be named anything, but **must implement MysteryEncounterWrapper** + - Refer to existing MEs for examples + - ❗❗ As part of MysteryEncounterWrapper, they should implement their own get() function + - 📚 The get() function should return an object that is some concrete extension of class MysteryEncounter + - Example: can return a new OptionSelectMysteryEncounter() + - ❗❗ **This MysteryEncounter type class will be where all encounter functional/business logic will reside** + - 📚 That includes things like, what intro visuals to display, what each option does (is it a battle, getting items, skipping the encounter, etc.) + - 📚 It will also serve as the way to pull data from the encounter class when starting the game + - ❗❗ A new instance of this encounter class should be added to the initMysteryEncounters() function inside data/mystery-encounter.ts + + ### 🌟 **Rarity** tier of the ME, common by default. + - ⚪ Common pool + - 🔵 Rare pool + - 🟣 Epic pool + - 🟡 Legendary pool + + ### **Optional Requirements** for Mystery Encounters. + - 🛠️ They give granular control over whether encounters will spawn in certain situations + - Requirements might include: + - Being within a wave range + - Being a range of wave X-Y + - Having X amount of $$$ + - Having X-Y party members (similar to catching logic?) ✔️/❌ (PARTIALLY COMPLETE) + + ### **MysteryEncounterOptions** + When selected, execute the custom logic passed in the **onSelect** function. Some **MysteryEncounterOptions** could be as simple as giving the player a pokéball, and others could be a few functions chained together, like "fight a battle, and get an item if you win" + + ### **Functions/ Helper functions** defined in __/utils/mystery-encounter-utils.ts__ for ME to happen, if applicable. They can be: + - Giving the player X item ✔️ + - Giving the player X item from a certain tier ✔️ + - Letting the player choose from items ✔️ + - Letting the player choose from X items from a certain tier ✔️ + - Start a combat encounter with a trainer ✔️ + - Start a combat encounter with a wild pokémon (from biome) ✔️ + - Start a combat encounter with a boss wild pokémon ✔️ + - XP to the whole party ✔️ + - Remove a PKMN from the player's party ✔️ + - Steal from player ❌ + +# 📝 Known bugs (squash 'em all!): + - ## 🔴 __**Really bad ones**__ + - 🐛 Picking up certain items in Fight or Flight is still broken. Workaround is leave encounter. + - 🐛 Modifiers that are applied to pokemon get skipped in Fight or Flight. + + - ## 🟡 __**Bad ones under certain circumstances**__ + - 🐛 Needs further replication : At wave 51, wild PKMN encounter caused a freezed after pressing "ESC" key upon being asked to switch PKMNs + - 🐛 Wave seed generates different encounter data if you roll to a new wave, see the spawned stuff, and refresh the app + - 🐛 Type-buffing items (like Silk Scarf) get swapped around when offered as a reward in Fight or Flight + + - ## 🟢 __**Non-game breaking**__ + - Both of these bugs seem to have in common that they don't "forget" their last passed string: + - 🐛 Scientist will remember the first PKMN it "did the thing on" and never ever forget it, even in future runs. Only affects dialogue. + - 🐛 Tooltip bug in Events. When showing the tooltip of the 2nd or later Event you've found, the tooltip for the first option will match whatever option you selected in the previous Event. This wrong tooltip gets overriden once you move the cursor. + +# 🗿 Other cool things/functionalities that won't make it in the MVP but are planned to accomodate future MEs: + +### QoL improvements +- Dialogue references to __**good**__ outcomes will be colored 🟢, __**bad**__ ones in 🔴 and __**ambiguous**__ or __**mixed**__, in 🟡 + - Helps with quick glances when 5x speed + +#### More requirements (with helper functions) +- Having X item +- Having Y amount of X item +- Being in a specific Biome +- A Pokémon X in player's party can learn Y move +- A Pokémon X in player's party knows Y move +- A Pokémon X in player's party has Y ability +- A Pokémon X in player's party belongs to a pre-defined pool (ie. "Ultrabeasts") + +#### More outcomes (with helper functions) +- Status one or many Pokémon if your party -- if they can be statused +- Damage one or many Pokémon in your party +- Set a hazard (ally or foe side) +- Set a weather +- Give the player a Pokémon from a pool (useful for reg. professors/traders) +- XP to a Pokémon (similar to rare candy?) +- Add logic for choosing a Pokémon from party for some effect (trades, sacrifices, etc) +- Add logic for awarding exp to the party (outside of a normal combat) +- Encounter/pull a PKMN from a pre-defined pool (ie. "Ultrabeasts") + + +# Log Documentation + +## 12th-13th June +- The 🐛 "Opening the chest simply moves you to a wild battle against nothingness, which you can escape after you get bored of it." is fixed. +- The 🐛 "PKMN Sprites and their HP/lvl bar doesn't get properly recalled when finding an ME or when meeting Rival." is fixed. +- The 🐛 "Weaker trainers from Mysterious Challenger crashes the game when the reward screen should come out" is fixed. +- The 🐛 "If a ME spawns on the first floor of a new biome (NewBiomeEncounterPhase), intro visuals do not spawn properly" is fixed. +- The 🐛 "Any ME that procs at wave (?)(?)(1) has its sprite removed. Only the sprite is affected." is fixed. +- The 🐛 "Picking a double battle trainer (ie Twins) as your challenge results in a game over, including loss of save." should be fixed. +- Allowed catch in "Fight or Flight" -- it was counterintuitive to not allow it as it __is__ a wild PKMN fight. +- More minor 🐛 squashed. +- Pushed Dark Deal ME to a higher wave requirement (+30) as it seems to be functioning (mostly) bugless. + +## 27-29th June +- The 🐛 "Picking up certain items in Fight or Flight works poorly" has been squashed. +- The 🐛 "Modifiers that are applied to pokemon get skipped in Fight or Flight" has been squashed. +- ⚙️ Added "Omniboost" functionality (Fight or Flight ME) +- The 🐛 "Wave seed generates different encounter data if you roll to a new wave, see the spawned stuff, and refresh the app" has been squashed. +- The 🐛 "Type-buffing items (like Silk Scarf) get swapped around when offered as a reward in Fight or Flight" has been squashed. +- ⚖️ Adjusted Dark Deal odds to show 6-7 cost PKMNs at a much higher rate (70%) than 8-cost (20%) or 9-cost (10%), to avoid box legendaries being overly present. +- The 🐛 about "Tooltips being remembered from the previous ME choice until you hovered a different option" is squashed. diff --git a/public/images/mystery-encounters/chest_blue.json b/public/images/mystery-encounters/chest_blue.json new file mode 100644 index 00000000000..fb8f4ec9c8e --- /dev/null +++ b/public/images/mystery-encounters/chest_blue.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "training_gear.png", + "format": "RGBA8888", + "size": { + "w": 76, + "h": 57 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 76, + "h": 57 + }, + "spriteSourceSize": { + "x": 10, + "y": 3, + "w": 56, + "h": 54 + }, + "frame": { + "x": 8, + "y": 0, + "w": 56, + "h": 54 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:895f0a79b89fa0fb44167f4584fd9a22:357b46953b7e17c6b2f43a62d52855d8:cc1ed0e4f90aaa9dcf1b39a0af1283b0$" + } +} diff --git a/public/images/mystery-encounters/chest_blue.png b/public/images/mystery-encounters/chest_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..0097346e845a2a21d52fb840704f7566b2f23921 GIT binary patch literal 2723 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 literal 0 HcmV?d00001 diff --git a/public/images/mystery-encounters/chest_red.json b/public/images/mystery-encounters/chest_red.json new file mode 100644 index 00000000000..fb8f4ec9c8e --- /dev/null +++ b/public/images/mystery-encounters/chest_red.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "training_gear.png", + "format": "RGBA8888", + "size": { + "w": 76, + "h": 57 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 76, + "h": 57 + }, + "spriteSourceSize": { + "x": 10, + "y": 3, + "w": 56, + "h": 54 + }, + "frame": { + "x": 8, + "y": 0, + "w": 56, + "h": 54 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:895f0a79b89fa0fb44167f4584fd9a22:357b46953b7e17c6b2f43a62d52855d8:cc1ed0e4f90aaa9dcf1b39a0af1283b0$" + } +} diff --git a/public/images/mystery-encounters/chest_red.png b/public/images/mystery-encounters/chest_red.png new file mode 100644 index 0000000000000000000000000000000000000000..e9ccfa2cfc6ae6f4aad2c6cec29c80d8f8667ee2 GIT binary patch literal 2727 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 Wa1R4%@8P&-?=7~LPPlq=67_#WQVs?H literal 0 HcmV?d00001 diff --git a/public/images/mystery-encounters/dark_deal_porygon.json b/public/images/mystery-encounters/dark_deal_porygon.json new file mode 100644 index 00000000000..5a48d95c18d --- /dev/null +++ b/public/images/mystery-encounters/dark_deal_porygon.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "dark_deal_porygon.png", + "format": "RGBA8888", + "size": { + "w": 36, + "h": 45 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 36, + "h": 45 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 44, + "h": 44 + }, + "frame": { + "x": 0, + "y": 0, + "w": 36, + "h": 45 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:895f0a79b89fa0fb44167f4584fd9a22:357b46953b7e17c6b2f43a62d52855d8:cc1ed0e4f90aaa9dcf1b39a0af1283b0$" + } +} diff --git a/public/images/mystery-encounters/dark_deal_porygon.png b/public/images/mystery-encounters/dark_deal_porygon.png new file mode 100644 index 0000000000000000000000000000000000000000..168999fb0f46792b5926afd668d9b5d884710075 GIT binary patch literal 1209 zcmV;q1V;ObP)YAX9X8WNB|8RBvx=!KdMT000Ck zNkl?Dl)Fnd(7>KxR$6{c@?si*`t=_n> z;BL0s!EE(L%0L|?BwL}%-I#942AjRT4)%MzJKtY$lKv+D!M+c__kQp9I~zg>ibQ|S z3Vq<&-))0AhEW96U$aE@bU*akVAq=~E;lF+6OF;HNALC%u77TPR!|-cz&Hq4=)J}1 ze<*}1TMYp)YX53vg7RVjO3mNY6a}5#-9a#X94Ly51NDOuYyA#F2qP;yKr*NZ zW?|EwJlNfx!2p>cnH~H=@}|xUQWzOil*A-~lCmR&NCr9GUl<2Le$0JUhMvz2q*qrK z$S@3q5cKOY!~of#>A9hU*7_X) zwNxw9#+!yp1OcMd_0pq?lO>CuQwjv& zRu*y2df*RW%MR@$Jv$PjZ{8>b+ zRfzqh1c2uqp%;h*Nk|?{Xj3axx5c>AoLtl&Fzz%bh_27(!osBg$mq6U%f@~)n;jjZ zgVHcFWp5aUDDBk2tTJ{i@WcK9u41<8GX-+;H4YR8L$;=GtsL(Vhmq$bC zpi!^M$qzqKt8Ft30-m|8&{D_7bX-l`LrHOP;E2}k_&!ThRDC$4Y1xcEyrCbAc=zfB ztLw`OGgFxbP?;dlJEGL}L*-s?w|M^K8}IQrKP7FUS6yHQg;qQ z7=VrM7Gp6FLFEDg3Ka!qVq7Qpb-tkbc_k?Y%?@Vd%~HQJA#xBMl@`auk)Pdfd!ZBr|ab zWF{!CE9<>4)PS=vS}V$ZQtKeOM6ti;Oeae)v|kE=48stqO;Dc@WTTCO zGWyn|e`8EUMKM#z!1pt|`&>cM2|>$g3iDCrjGi-SDx=)n*f{{e3S@7%(Vz7qfd01jnXNoGw=04e|g00;m8 X000000Mb*F00000NkvXXu0mjfd%rW! literal 0 HcmV?d00001 diff --git a/public/images/mystery-encounters/mad_scientist_m.json b/public/images/mystery-encounters/mad_scientist_m.json new file mode 100644 index 00000000000..0cb3f904cb0 --- /dev/null +++ b/public/images/mystery-encounters/mad_scientist_m.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "mad_scientist_m.png", + "format": "RGBA8888", + "size": { + "w": 44, + "h": 74 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 44, + "h": 74 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 44, + "h": 74 + }, + "frame": { + "x": 0, + "y": 0, + "w": 44, + "h": 74 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:895f0a79b89fa0fb44167f4584fd9a22:357b46953b7e17c6b2f43a62d52855d8:cc1ed0e4f90aaa9dcf1b39a0af1283b0$" + } +} diff --git a/public/images/mystery-encounters/mad_scientist_m.png b/public/images/mystery-encounters/mad_scientist_m.png new file mode 100644 index 0000000000000000000000000000000000000000..84349b46c8a9ab6a3dcf29de3b67f42631c38547 GIT binary patch literal 13992 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 180 || newWaveIndex < 10))) { + const roll = Utils.randSeedInt(256); + + // Base spawn weight is 3/256, and increases by 1/256 for each missed attempt at spawning an encounter on a valid floor + const sessionEncounterRate = !isNullOrUndefined(this.mysteryEncounterFlags?.encounterSpawnChance) ? this.mysteryEncounterFlags.encounterSpawnChance : BASE_MYSTYERY_ENCOUNTER_WEIGHT; + + // If total number of encounters is lower than expected for the run, slightly favor a new encounter spawn + // Do the reverse as well + // Reduces occurrence of runs with very few (<6) and a ton (>10) of encounters + const expectedEncountersByFloor = 8 / (180 - 10) * newWaveIndex; + const currentRunDiffFromAvg = expectedEncountersByFloor - (this.mysteryEncounterFlags?.encounteredEvents?.length || 0); + const favoredEncounterRate = sessionEncounterRate + currentRunDiffFromAvg * 5; + + const successRate = Utils.isNullOrUndefined(Overrides.MYSTERY_ENCOUNTER_RATE_OVERRIDE) ? favoredEncounterRate : Overrides.MYSTERY_ENCOUNTER_RATE_OVERRIDE; + + if (roll < successRate) { + newBattleType = BattleType.MYSTERY_ENCOUNTER; + // Reset base spawn weight + this.mysteryEncounterFlags.encounterSpawnChance = BASE_MYSTYERY_ENCOUNTER_WEIGHT; + } else { + this.mysteryEncounterFlags.encounterSpawnChance = sessionEncounterRate + 1; + } + } } if (double === undefined && newWaveIndex > 1) { @@ -1082,12 +1153,19 @@ export default class BattleScene extends SceneBase { const maxExpLevel = this.getMaxExpLevel(); this.lastEnemyTrainer = lastBattle?.trainer ?? null; + this.lastMysteryEncounter = lastBattle?.mysteryEncounter ?? null; this.executeWithSeedOffset(() => { this.currentBattle = new Battle(this.gameMode, newWaveIndex, newBattleType, newTrainer, newDouble); }, newWaveIndex << 3, this.waveSeed); this.currentBattle.incrementTurn(this); + if (newBattleType === BattleType.MYSTERY_ENCOUNTER) { + // Disable double battle on mystery encounters (it may be re-enabled as part of encounter) + this.currentBattle.double = false; + this.currentBattle.mysteryEncounter = this.getMysteryEncounter(mysteryEncounter); + } + //this.pushPhase(new TrainerMessageTestPhase(this, TrainerType.RIVAL, TrainerType.RIVAL_2, TrainerType.RIVAL_3, TrainerType.RIVAL_4, TrainerType.RIVAL_5, TrainerType.RIVAL_6)); if (!waveIndex && lastBattle) { @@ -1112,7 +1190,9 @@ export default class BattleScene extends SceneBase { isNewBiome = !Utils.randSeedInt(6 - biomeWaves); }, lastBattle.waveIndex << 4); } - const resetArenaState = isNewBiome || this.currentBattle.battleType === BattleType.TRAINER || this.currentBattle.battleSpec === BattleSpec.FINAL_BOSS; + + + const resetArenaState = isNewBiome || this.currentBattle.battleType === BattleType.TRAINER || this.currentBattle.battleType === BattleType.MYSTERY_ENCOUNTER || this.currentBattle.battleSpec === BattleSpec.FINAL_BOSS; this.getEnemyParty().forEach(enemyPokemon => enemyPokemon.destroy()); this.trySpreadPokerus(); if (!isNewBiome && (newWaveIndex % 10) === 5) { @@ -1120,20 +1200,24 @@ export default class BattleScene extends SceneBase { } if (resetArenaState) { this.arena.removeAllTags(); - playerField.forEach((_, p) => this.unshiftPhase(new ReturnPhase(this, p))); - for (const pokemon of this.getParty()) { - // Only trigger form change when Eiscue is in Noice form - // Hardcoded Eiscue for now in case it is fused with another pokemon - if (pokemon.species.speciesId === Species.EISCUE && pokemon.hasAbility(Abilities.ICE_FACE) && pokemon.formIndex === 1) { - this.triggerPokemonFormChange(pokemon, SpeciesFormChangeManualTrigger); + // If last battle was mystery encounter and no battle occurred, skip return phases + if (lastBattle?.mysteryEncounter?.encounterVariant !== MysteryEncounterVariant.NO_BATTLE) { + playerField.forEach((_, p) => this.unshiftPhase(new ReturnPhase(this, p))); + + for (const pokemon of this.getParty()) { + // Only trigger form change when Eiscue is in Noice form + // Hardcoded Eiscue for now in case it is fused with another pokemon + if (pokemon.species.speciesId === Species.EISCUE && pokemon.hasAbility(Abilities.ICE_FACE) && pokemon.formIndex === 1) { + this.triggerPokemonFormChange(pokemon, SpeciesFormChangeManualTrigger); + } + + pokemon.resetBattleData(); + applyPostBattleInitAbAttrs(PostBattleInitAbAttr, pokemon); } - pokemon.resetBattleData(); - applyPostBattleInitAbAttrs(PostBattleInitAbAttr, pokemon); + this.unshiftPhase(new ShowTrainerPhase(this)); } - - this.unshiftPhase(new ShowTrainerPhase(this)); } for (const pokemon of this.getParty()) { @@ -2276,7 +2360,7 @@ export default class BattleScene extends SceneBase { }); } - generateEnemyModifiers(): Promise { + generateEnemyModifiers(customHeldModifiers?: PokemonHeldItemModifierType[][]): Promise { return new Promise(resolve => { if (this.currentBattle.battleSpec === BattleSpec.FINAL_BOSS) { return resolve(); @@ -2298,29 +2382,33 @@ export default class BattleScene extends SceneBase { } party.forEach((enemyPokemon: EnemyPokemon, i: integer) => { - const isBoss = enemyPokemon.isBoss() || (this.currentBattle.battleType === BattleType.TRAINER && this.currentBattle.trainer.config.isBoss); - let upgradeChance = 32; - if (isBoss) { - upgradeChance /= 2; - } - if (isFinalBoss) { - upgradeChance /= 8; - } - const modifierChance = this.gameMode.getEnemyModifierChance(isBoss); - let pokemonModifierChance = modifierChance; - if (this.currentBattle.battleType === BattleType.TRAINER) - pokemonModifierChance = Math.ceil(pokemonModifierChance * this.currentBattle.trainer.getPartyMemberModifierChanceMultiplier(i)); // eslint-disable-line - let count = 0; - for (let c = 0; c < chances; c++) { - if (!Utils.randSeedInt(modifierChance)) { - count++; + if (customHeldModifiers && i < customHeldModifiers.length && customHeldModifiers[i].length > 0) { + customHeldModifiers[i].forEach(mt => mt.newModifier(enemyPokemon).add(this.enemyModifiers, false, this)); + } else { + const isBoss = enemyPokemon.isBoss() || (this.currentBattle.battleType === BattleType.TRAINER && this.currentBattle.trainer.config.isBoss); + let upgradeChance = 32; + if (isBoss) { + upgradeChance /= 2; } + if (isFinalBoss) { + upgradeChance /= 8; + } + const modifierChance = this.gameMode.getEnemyModifierChance(isBoss); + let pokemonModifierChance = modifierChance; + if (this.currentBattle.battleType === BattleType.TRAINER) + pokemonModifierChance = Math.ceil(pokemonModifierChance * this.currentBattle.trainer.getPartyMemberModifierChanceMultiplier(i)); // eslint-disable-line + let count = 0; + for (let c = 0; c < chances; c++) { + if (!Utils.randSeedInt(modifierChance)) { + count++; + } + } + if (isBoss) { + count = Math.max(count, Math.floor(chances / 2)); + } + getEnemyModifierTypesForWave(difficultyWaveIndex, count, [ enemyPokemon ], this.currentBattle.battleType === BattleType.TRAINER ? ModifierPoolType.TRAINER : ModifierPoolType.WILD, upgradeChance) + .map(mt => mt.newModifier(enemyPokemon).add(this.enemyModifiers, false, this)); } - if (isBoss) { - count = Math.max(count, Math.floor(chances / 2)); - } - getEnemyModifierTypesForWave(difficultyWaveIndex, count, [ enemyPokemon ], this.currentBattle.battleType === BattleType.TRAINER ? ModifierPoolType.TRAINER : ModifierPoolType.WILD, upgradeChance) - .map(mt => mt.newModifier(enemyPokemon).add(this.enemyModifiers, false, this)); }); this.updateModifiers(false).then(() => resolve()); @@ -2542,4 +2630,88 @@ export default class BattleScene extends SceneBase { }; (window as any).gameInfo = gameInfo; } + + /** + * Loads or generates a mystery encounter + * @param override - used to load session encounter when restarting game, etc. + * @returns + */ + getMysteryEncounter(override: MysteryEncounter): MysteryEncounter { + // Loading override or session encounter + let encounter: MysteryEncounter; + if (!Utils.isNullOrUndefined(Overrides.MYSTERY_ENCOUNTER_OVERRIDE) && allMysteryEncounters.hasOwnProperty(Overrides.MYSTERY_ENCOUNTER_OVERRIDE)) { + encounter = allMysteryEncounters[Overrides.MYSTERY_ENCOUNTER_OVERRIDE]; + } else { + encounter = override?.encounterType >= 0 ? allMysteryEncounters[override?.encounterType] : null; + } + + // Check for queued encounters first + if (!encounter && this.mysteryEncounterFlags?.nextEncounterQueue?.length > 0) { + let i = 0; + while (i < this.mysteryEncounterFlags.nextEncounterQueue.length && !!encounter) { + const candidate = this.mysteryEncounterFlags.nextEncounterQueue[i]; + const forcedChance = candidate[1]; + if (Utils.randSeedInt(100) < forcedChance) { + encounter = allMysteryEncounters[candidate[0]]; + } + + i++; + } + } + + if (encounter) { + encounter = new MysteryEncounter(encounter); + encounter.meetsRequirements(this); + return encounter; + } + + // Common / Uncommon / Rare / Super Rare + const tierWeights = [61, 40, 21, 6]; + + // Adjust tier weights by previously encountered events to lower odds of only common/uncommons in run + this.mysteryEncounterFlags.encounteredEvents.forEach(val => { + const tier = val[1]; + if (tier === MysteryEncounterTier.COMMON) { + tierWeights[0] = tierWeights[0] - 6; + } else if (tier === MysteryEncounterTier.UNCOMMON) { + tierWeights[1] = tierWeights[1] - 4; + } + }); + + const totalWeight = tierWeights.reduce((a, b) => a + b); + const tierValue = Utils.randSeedInt(totalWeight); + const commonThreshold = totalWeight - tierWeights[0]; + const uncommonThreshold = totalWeight - tierWeights[0] - tierWeights[1]; + const rareThreshold = totalWeight - tierWeights[0] - tierWeights[1] - tierWeights[2]; + let tier = tierValue > commonThreshold ? MysteryEncounterTier.COMMON : tierValue > uncommonThreshold ? MysteryEncounterTier.UNCOMMON : tierValue > rareThreshold ? MysteryEncounterTier.RARE : MysteryEncounterTier.SUPER_RARE; + + if (!Utils.isNullOrUndefined(Overrides.MYSTERY_ENCOUNTER_TIER_OVERRIDE)) { + tier = Overrides.MYSTERY_ENCOUNTER_TIER_OVERRIDE; + } + + let availableEncounters = []; + // New encounter will never be the same as the most recent encounter + const previousEncounter = this.mysteryEncounterFlags.encounteredEvents?.length > 0 ? this.mysteryEncounterFlags.encounteredEvents[this.mysteryEncounterFlags.encounteredEvents.length - 1][0] : null; + const biomeMysteryEncounters = mysteryEncountersByBiome.get(this.arena.biomeType); + // If no valid encounters exist at tier, checks next tier down, continuing until there are some encounters available + while (availableEncounters.length === 0 && tier >= 0) { + availableEncounters = biomeMysteryEncounters + .filter((encounterType) => + allMysteryEncounters[encounterType]?.meetsRequirements(this) && + allMysteryEncounters[encounterType].encounterTier === tier && + (isNullOrUndefined(previousEncounter) || encounterType !== previousEncounter)) + .map((m) => (allMysteryEncounters[m])); + tier--; + } + + // If absolutely no encounters are available, spawn 0th encounter + if (availableEncounters.length === 0) { + return allMysteryEncounters[MysteryEncounterType.MYSTERIOUS_CHALLENGERS]; + } + encounter = availableEncounters[Utils.randSeedInt(availableEncounters.length)]; + // New encounter object to not dirty flags + encounter = new MysteryEncounter(encounter); + encounter.meetsRequirements(this); + return encounter; + } } diff --git a/src/battle.ts b/src/battle.ts index 3f2519df3e8..e1a20c18ebf 100644 --- a/src/battle.ts +++ b/src/battle.ts @@ -14,32 +14,34 @@ import { PlayerGender } from "#enums/player-gender"; import { Species } from "#enums/species"; import { TrainerType } from "#enums/trainer-type"; import i18next from "#app/plugins/i18n"; +import MysteryEncounter, { MysteryEncounterVariant } from "./data/mystery-encounter"; export enum BattleType { - WILD, - TRAINER, - CLEAR + WILD, + TRAINER, + CLEAR, + MYSTERY_ENCOUNTER } export enum BattlerIndex { - ATTACKER = -1, - PLAYER, - PLAYER_2, - ENEMY, - ENEMY_2 + ATTACKER = -1, + PLAYER, + PLAYER_2, + ENEMY, + ENEMY_2 } export interface TurnCommand { - command: Command; - cursor?: integer; - move?: QueuedMove; - targets?: BattlerIndex[]; - skip?: boolean; - args?: any[]; + command: Command; + cursor?: integer; + move?: QueuedMove; + targets?: BattlerIndex[]; + skip?: boolean; + args?: any[]; } interface TurnCommands { - [key: integer]: TurnCommand + [key: integer]: TurnCommand } export default class Battle { @@ -67,6 +69,7 @@ export default class Battle { public lastUsedPokeball: PokeballType; public playerFaints: number; // The amount of times pokemon on the players side have fainted public enemyFaints: number; // The amount of times pokemon on the enemies side have fainted + public mysteryEncounter: MysteryEncounter; private rngCounter: integer = 0; @@ -105,7 +108,7 @@ export default class Battle { this.battleSpec = spec; } - private getLevelForWave(): integer { + public getLevelForWave(): integer { const levelWaveIndex = this.gameMode.getWaveForDifficulty(this.waveIndex); const baseLevel = 1 + levelWaveIndex / 2 + Math.pow(levelWaveIndex / 25, 2); const bossMultiplier = 1.2; @@ -202,7 +205,7 @@ export default class Battle { getBgmOverride(scene: BattleScene): string { const battlers = this.enemyParty.slice(0, this.getBattlerCount()); - if (this.battleType === BattleType.TRAINER) { + if (this.battleType === BattleType.TRAINER || this.mysteryEncounter?.encounterVariant === MysteryEncounterVariant.TRAINER_BATTLE) { if (!this.started && this.trainer.config.encounterBgm && this.trainer.getEncounterMessages()?.length) { return `encounter_${this.trainer.getEncounterBgm()}`; } diff --git a/src/data/battler-tags.ts b/src/data/battler-tags.ts index 41b6f73ec28..e78977b56ba 100644 --- a/src/data/battler-tags.ts +++ b/src/data/battler-tags.ts @@ -7,7 +7,7 @@ import { StatusEffect } from "./status-effect"; import * as Utils from "../utils"; import { ChargeAttr, MoveFlags, allMoves } from "./move"; import { Type } from "./type"; -import { BlockNonDirectDamageAbAttr, FlinchEffectAbAttr, ReverseDrainAbAttr, applyAbAttrs } from "./ability"; +import { BlockNonDirectDamageAbAttr, FlinchEffectAbAttr, ReverseDrainAbAttr, applyAbAttrs, ProtectStatAbAttr } from "./ability"; import { TerrainType } from "./terrain"; import { WeatherType } from "./weather"; import { BattleStat } from "./battle-stat"; @@ -1537,6 +1537,38 @@ export class IceFaceTag extends BattlerTag { } } +export class MysteryEncounterPostSummonTag extends BattlerTag { + constructor(sourceMove: Moves) { + super(BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON, BattlerTagLapseType.CUSTOM, 1, sourceMove); + } + + onAdd(pokemon: Pokemon): void { + super.onAdd(pokemon); + } + + lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { + const ret = super.lapse(pokemon, lapseType); + + if (lapseType === BattlerTagLapseType.CUSTOM) { + // Give pokemon +1 stats for battle + const cancelled = new Utils.BooleanHolder(false); + applyAbAttrs(ProtectStatAbAttr, pokemon, cancelled); + if (!cancelled.value) { + const mysteryEncounterBattleEffects = pokemon.summonData.mysteryEncounterBattleEffects; + if (mysteryEncounterBattleEffects) { + mysteryEncounterBattleEffects(pokemon); + } + } + } + + return ret; + } + + onRemove(pokemon: Pokemon): void { + super.onRemove(pokemon); + } +} + export function getBattlerTag(tagType: BattlerTagType, turnCount: integer, sourceMove: Moves, sourceId: integer): BattlerTag { switch (tagType) { case BattlerTagType.RECHARGING: @@ -1654,6 +1686,8 @@ export function getBattlerTag(tagType: BattlerTagType, turnCount: integer, sourc return new DestinyBondTag(sourceMove, sourceId); case BattlerTagType.ICE_FACE: return new IceFaceTag(sourceMove); + case BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON: + return new MysteryEncounterPostSummonTag(sourceMove); case BattlerTagType.NONE: default: return new BattlerTag(tagType, BattlerTagLapseType.CUSTOM, turnCount, sourceMove, sourceId); diff --git a/src/data/mystery-encounter-flags.ts b/src/data/mystery-encounter-flags.ts new file mode 100644 index 00000000000..339a171ccb9 --- /dev/null +++ b/src/data/mystery-encounter-flags.ts @@ -0,0 +1,16 @@ +import * as Utils from "../utils"; +import {MysteryEncounterTier} from "#app/data/mystery-encounter"; +import {MysteryEncounterType} from "#enums/mystery-encounter-type"; +import {BASE_MYSTYERY_ENCOUNTER_WEIGHT} from "#app/data/mystery-encounters/mystery-encounters"; + +export class MysteryEncounterFlags { + encounteredEvents: [MysteryEncounterType, MysteryEncounterTier][] = []; + encounterSpawnChance: number = BASE_MYSTYERY_ENCOUNTER_WEIGHT; + nextEncounterQueue: [MysteryEncounterType, integer][] = []; + + constructor(flags: MysteryEncounterFlags) { + if (!Utils.isNullOrUndefined(flags)) { + Object.assign(this, flags); + } + } +} diff --git a/src/data/mystery-encounter-option.ts b/src/data/mystery-encounter-option.ts new file mode 100644 index 00000000000..9f23a94e3f3 --- /dev/null +++ b/src/data/mystery-encounter-option.ts @@ -0,0 +1,158 @@ +import { PlayerPokemon } from "#app/field/pokemon"; +import * as Utils from "../utils"; +import BattleScene from "../battle-scene"; +import { EncounterPokemonRequirement, EncounterSceneRequirement } from "./mystery-encounter-requirements"; +import {OptionTextDisplay} from "#app/data/mystery-encounters/dialogue/mystery-encounter-dialogue"; + +export default interface MysteryEncounterOption { + requirements?: EncounterSceneRequirement[]; + primaryPokemonRequirements?: EncounterPokemonRequirement[]; + secondaryPokemonRequirements ?: EncounterPokemonRequirement[]; + primaryPokemon?: PlayerPokemon; + secondaryPokemon?: PlayerPokemon[]; + excludePrimaryFromSecondaryRequirements?: boolean; + + /** + * Dialogue object containing all the dialogue, messages, tooltips, etc. for this option + * Will be populated on MysteryEncounter initialization + */ + dialogue?: OptionTextDisplay; + + // Executes before any following dialogue or business logic from option. Usually this will be for calculating dialogueTokens or performing scene/data updates + onPreOptionPhase?: (scene: BattleScene) => Promise; + // Business logic for option + onOptionPhase?: (scene: BattleScene) => Promise; + // Executes after the encounter is over. Usually this will be for calculating dialogueTokens or performing data updates + onPostOptionPhase?: (scene: BattleScene) => Promise; +} + +export default class MysteryEncounterOption implements MysteryEncounterOption { + constructor(option: MysteryEncounterOption) { + Object.assign(this, option); + this.requirements = this.requirements ? this.requirements : []; + } + + meetsRequirements?(scene: BattleScene) { + return !this.requirements.some(requirement => !requirement.meetsRequirement(scene)) && + this.meetsPrimaryRequirementAndPrimaryPokemonSelected(scene) && + this.meetsSupportingRequirementAndSupportingPokemonSelected(scene); + } + meetsPrimaryRequirementAndPrimaryPokemonSelected?(scene: BattleScene) { + if (!this.primaryPokemonRequirements) { + return true; + } + let qualified:PlayerPokemon[] = scene.getParty(); + for (const req of this.primaryPokemonRequirements) { + console.log(req); + if (req.meetsRequirement(scene)) { + if (req instanceof EncounterPokemonRequirement) { + qualified = qualified.filter(pkmn => req.queryParty(scene.getParty()).includes(pkmn)); + } + } else { + this.primaryPokemon = null; + return false; + } + } + + if (qualified.length === 0) { + return false; + } + + if (this.excludePrimaryFromSecondaryRequirements && this.secondaryPokemon) { + const truePrimaryPool = []; + const overlap = []; + for (const qp of qualified) { + if (!this.secondaryPokemon.includes(qp)) { + truePrimaryPool.push(qp); + } else { + overlap.push(qp); + } + + } + if (truePrimaryPool.length > 0) { + // always choose from the non-overlapping pokemon first + this.primaryPokemon = truePrimaryPool[Utils.randSeedInt(truePrimaryPool.length, 0)]; + return true; + } else { + // if there are multiple overlapping pokemon, we're okay - just choose one and take it out of the supporting pokemon pool + if (overlap.length > 1 || (this.secondaryPokemon.length - overlap.length >= 1)) { + // is this working? + this.primaryPokemon = overlap[Utils.randSeedInt(overlap.length, 0)]; + this.secondaryPokemon = this.secondaryPokemon.filter((supp)=> supp !== this.primaryPokemon); + return true; + } + console.log("Mystery Encounter Edge Case: Requirement not met due to primay pokemon overlapping with support pokemon. There's no valid primary pokemon left."); + return false; + } + } else { + // this means we CAN have the same pokemon be a primary and secondary pokemon, so just choose any qualifying one randomly. + this.primaryPokemon = qualified[Utils.randSeedInt(qualified.length, 0)]; + return true; + } + } + + meetsSupportingRequirementAndSupportingPokemonSelected?(scene: BattleScene) { + if (!this.secondaryPokemonRequirements) { + this.secondaryPokemon = []; + return true; + } + + let qualified:PlayerPokemon[] = scene.getParty(); + for (const req of this.secondaryPokemonRequirements) { + if (req.meetsRequirement(scene)) { + if (req instanceof EncounterPokemonRequirement) { + qualified = qualified.filter(pkmn => req.queryParty(scene.getParty()).includes(pkmn)); + + } + } else { + this.secondaryPokemon = []; + return false; + } + } + this.secondaryPokemon = qualified; + return true; + } +} + + +export class MysteryEncounterOptionBuilder implements Partial { + requirements?: EncounterSceneRequirement[] = []; + primaryPokemonRequirements?: EncounterPokemonRequirement[] = []; + secondaryPokemonRequirements ?: EncounterPokemonRequirement[] = []; + excludePrimaryFromSecondaryRequirements?: boolean; + onPreOptionPhase?: (scene: BattleScene) => Promise; + onOptionPhase?: (scene: BattleScene) => Promise; + onPostOptionPhase?: (scene: BattleScene) => Promise; + + withSceneRequirement(requirement: EncounterSceneRequirement): this & Required> { + this.requirements.push(requirement); + return Object.assign(this, { requirements: this.requirements }); + } + + withPreOptionPhase(onPreOptionPhase: (scene: BattleScene) => Promise): this & Required> { + return Object.assign(this, { onPreOptionPhase: onPreOptionPhase }); + } + + withOptionPhase(onOptionPhase: (scene: BattleScene) => Promise): this & Required> { + return Object.assign(this, { onOptionPhase: onOptionPhase }); + } + + withPostOptionPhase(onPostOptionPhase: (scene: BattleScene) => Promise): this & Required> { + return Object.assign(this, { onPostOptionPhase: onPostOptionPhase }); + } + + build(this: MysteryEncounterOption) { + return new MysteryEncounterOption(this); + } + + withPrimaryPokemonRequirement(requirement: EncounterPokemonRequirement): this & Required> { + this.primaryPokemonRequirements.push(requirement); + return Object.assign(this, { primaryPokemonRequirements: this.primaryPokemonRequirements }); + } + + withSecondaryPokemonRequirement(requirement: EncounterPokemonRequirement, excludePrimaryFromSecondaryRequirements?: boolean): this & Required> { + this.secondaryPokemonRequirements.push(requirement); + this.excludePrimaryFromSecondaryRequirements = excludePrimaryFromSecondaryRequirements; + return Object.assign(this, { secondaryPokemonRequirements: this.secondaryPokemonRequirements }); + } +} diff --git a/src/data/mystery-encounter-requirements.ts b/src/data/mystery-encounter-requirements.ts new file mode 100644 index 00000000000..b791e1ef1df --- /dev/null +++ b/src/data/mystery-encounter-requirements.ts @@ -0,0 +1,913 @@ +import { PlayerPokemon } from "#app/field/pokemon"; +import { ModifierType, PokemonHeldItemModifierType } from "#app/modifier/modifier-type"; +import BattleScene from "../battle-scene"; +import { isNullOrUndefined } from "../utils"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { TimeOfDay } from "#enums/time-of-day"; +import { Nature } from "./nature"; +import { EvolutionItem, pokemonEvolutions } from "./pokemon-evolutions"; +import { FormChangeItem, SpeciesFormChangeItemTrigger, pokemonFormChanges } from "./pokemon-forms"; +import { SpeciesFormKey } from "./pokemon-species"; +import { StatusEffect } from "./status-effect"; +import { Type } from "./type"; +import { WeatherType } from "./weather"; +import {MysteryEncounterType} from "#enums/mystery-encounter-type"; + +export interface EncounterRequirement { + meetsRequirement(scene: BattleScene): boolean; // Boolean to see if a requirement is met +} + +export abstract class EncounterSceneRequirement implements EncounterRequirement { + meetsRequirement(scene: BattleScene): boolean { + throw new Error("Method not implemented."); + } + + getMatchingDialogueToken(scene:BattleScene): [RegExp, string] { + return [(/@/gi), ""]; + } +} + +export abstract class EncounterPokemonRequirement implements EncounterRequirement { + minNumberOfPokemon: number; + invertQuery: boolean; + + meetsRequirement(scene: BattleScene): boolean { + throw new Error("Method not implemented."); + } + + // Returns all party members that are compatible with this requirement. For non pokemon related requirements, the entire party is returned.. + queryParty(partyPokemon: PlayerPokemon[]) { + return []; + } + + // Doesn't require the "@ec" as prefix, just the string; populates the token with the attribute + // ex. @ec{primarySpecies} if strPrefix is simply "primary" + getMatchingDialogueToken(strPrefix:string, pokemon: PlayerPokemon): [RegExp, string] { + return [(/@/gi), ""]; + } +} + +export class PreviousEncounterRequirement extends EncounterSceneRequirement { + previousEncounterRequirement: MysteryEncounterType; + + /** + * Used for specifying an encounter that must be seen before this encounter can spawn + * @param previousEncounterRequirement + */ + constructor(previousEncounterRequirement) { + super(); + this.previousEncounterRequirement = previousEncounterRequirement; + } + + meetsRequirement(scene: BattleScene): boolean { + return scene.mysteryEncounterFlags.encounteredEvents.some(e => e[0] === this.previousEncounterRequirement); + } + + getMatchingDialogueToken(scene:BattleScene): [RegExp, string] { + return [new RegExp("@ec\{previousEncounter\\}", "gi"), scene.mysteryEncounterFlags.encounteredEvents.find(e => e[0] === this.previousEncounterRequirement)[0].toString()]; + } +} + +export class WaveCountRequirement extends EncounterSceneRequirement { + waveRange: [number, number]; + + /** + * Used for specifying a unique wave or wave range requirement + * If minWaveIndex and maxWaveIndex are equivalent, will check for exact wave number + * @param waveRange - [min, max] + */ + constructor(waveRange: [number, number]) { + super(); + this.waveRange = waveRange; + } + + meetsRequirement(scene: BattleScene): boolean { + if (!isNullOrUndefined(this?.waveRange) && this.waveRange?.[0] <= this.waveRange?.[1]) { + const waveIndex = scene.currentBattle.waveIndex; + if (waveIndex >= 0 && (this?.waveRange?.[0] >= 0 && this.waveRange?.[0] > waveIndex) || (this?.waveRange?.[1] >= 0 && this.waveRange?.[1] < waveIndex)) { + return false; + } + } + return true; + } + + getMatchingDialogueToken(scene:BattleScene): [RegExp, string] { + return [new RegExp("@ec\{waveCount\\}", "gi"), scene.currentBattle.waveIndex.toString()]; + } +} + +export class TimeOfDayRequirement extends EncounterSceneRequirement { + requiredTimeOfDay?: TimeOfDay[]; + + constructor(timeOfDay: TimeOfDay | TimeOfDay[]) { + super(); + if (timeOfDay instanceof Array) { + this.requiredTimeOfDay = timeOfDay; + } else { + this.requiredTimeOfDay = []; + this.requiredTimeOfDay.push(timeOfDay); + } + } + + meetsRequirement(scene: BattleScene): boolean { + const timeOfDay = scene.arena?.getTimeOfDay(); + if (!isNullOrUndefined(timeOfDay) && this?.requiredTimeOfDay?.length > 0 && !this.requiredTimeOfDay.includes(timeOfDay)) { + return false; + } + + return true; + } + + getMatchingDialogueToken(scene:BattleScene): [RegExp, string] { + return [new RegExp("@ec\{timeOfDay\\}", "gi"), TimeOfDay[scene.arena.getTimeOfDay()].toLocaleLowerCase()]; + } +} + +export class WeatherRequirement extends EncounterSceneRequirement { + requiredWeather?: WeatherType[]; + + constructor(weather: WeatherType | WeatherType[]) { + super(); + if (weather instanceof Array) { + this.requiredWeather = weather; + } else { + this.requiredWeather = []; + this.requiredWeather.push(weather); + } + } + + meetsRequirement(scene: BattleScene): boolean { + const currentWeather = scene.arena?.weather?.weatherType; + if (!isNullOrUndefined(currentWeather) && this?.requiredWeather?.length > 0 && !this.requiredWeather.includes(currentWeather)) { + return false; + } + + return true; + } + getMatchingDialogueToken(scene:BattleScene): [RegExp, string] { + return [new RegExp("@ec\{weather\\}", "gi"), WeatherType[scene.arena?.weather?.weatherType].replace("_", " ").toLocaleLowerCase()]; + } +} + +export class PartySizeRequirement extends EncounterSceneRequirement { + partySizeRange: [number, number]; + + /** + * Used for specifying a party size requirement + * If min and max are equivalent, will check for exact size + * @param partySizeRange - [min, max] + */ + constructor(partySizeRange: [number, number]) { + super(); + this.partySizeRange = partySizeRange; + } + + meetsRequirement(scene: BattleScene): boolean { + if (!isNullOrUndefined(this?.partySizeRange) && this.partySizeRange?.[0] <= this.partySizeRange?.[1]) { + const partySize = scene.getParty().length; + if (partySize >= 0 && (this?.partySizeRange?.[0] >= 0 && this.partySizeRange?.[0] > partySize) || (this?.partySizeRange?.[1] >= 0 && this.partySizeRange?.[1] < partySize)) { + return false; + } + } + + return true; + } + + getMatchingDialogueToken(scene:BattleScene): [RegExp, string] { + return [new RegExp("@ec\{partySize\\}", "gi"), scene.getParty().length.toString()]; + } +} + +export class PersistentModifierRequirement extends EncounterSceneRequirement { + requiredItems?: ModifierType[]; // TODO: not implemented + constructor(item: ModifierType | ModifierType[]) { + super(); + if (item instanceof Array) { + this.requiredItems = item; + } else { + this.requiredItems = []; + this.requiredItems.push(item); + } + } + + meetsRequirement(scene: BattleScene): boolean { + const items = scene.modifiers; + + if (!isNullOrUndefined(items) && this?.requiredItems.length > 0 && this.requiredItems.filter((searchingMod) => + items.filter((itemInScene) => itemInScene.type.id === searchingMod.id).length > 0).length === 0) { + return false; + } + return true; + } + + getMatchingDialogueToken(scene:BattleScene): [RegExp, string] { + const requiredItemsInInventory = this.requiredItems.filter((a) => { + scene.modifiers.filter((itemInScene) => itemInScene.type.id === a.id).length > 0; + }); + if (requiredItemsInInventory.length > 0) { + return [new RegExp("@ec\{requiredItem\\}", "gi"), requiredItemsInInventory[0].name]; + } + return null; + } +} + +export class MoneyRequirement extends EncounterSceneRequirement { + requiredMoney: number; + + constructor(requiredMoney: number) { + super(); + this.requiredMoney = requiredMoney; + } + + meetsRequirement(scene: BattleScene): boolean { + const money = scene.money; + if (!isNullOrUndefined(money) && this?.requiredMoney > 0 && this.requiredMoney > money) { + return false; + } + return true; + } + + getMatchingDialogueToken(scene:BattleScene): [RegExp, string] { + return [new RegExp("@ec\{money\\}", "gi"), "₽" + scene.money.toString()]; + } +} + +export class SpeciesRequirement extends EncounterPokemonRequirement { + requiredSpecies: Species[]; + minNumberOfPokemon:number; + invertQuery:boolean; + + constructor(species: Species | Species[], minNumberOfPokemon: number = 1, invertQuery: boolean = false) { + super(); + this.minNumberOfPokemon = minNumberOfPokemon; + this.invertQuery = invertQuery; + if (species instanceof Array) { + this.requiredSpecies = species; + } else { + this.requiredSpecies = []; + this.requiredSpecies.push(species); + } + } + + meetsRequirement(scene: BattleScene): boolean { + const partyPokemon = scene.getParty(); + if (isNullOrUndefined(partyPokemon) || this?.requiredSpecies?.length < 0) { + return false; + } + return this.queryParty(partyPokemon).length >= this.minNumberOfPokemon; + } + + queryParty(partyPokemon: PlayerPokemon[]): PlayerPokemon[] { + if (!this.invertQuery) { + return partyPokemon.filter((pokemon) => this.requiredSpecies.filter((species) => pokemon.species.speciesId === species).length > 0); + } else { + // for an inverted query, we only want to get the pokemon that don't have ANY of the listed speciess + return partyPokemon.filter((pokemon) => this.requiredSpecies.filter((species) => pokemon.species.speciesId === species).length === 0); + } + } + + getMatchingDialogueToken(str:string, pokemon: PlayerPokemon): [RegExp, string] { + if (this.requiredSpecies.includes(pokemon.species.speciesId)) { + return [new RegExp("@ec\{" + str + "Species\\}", "gi"), Species[pokemon.species.speciesId]]; + } + return null; + } +} + + +export class NatureRequirement extends EncounterPokemonRequirement { + requiredNature: Nature[]; + minNumberOfPokemon:number; + invertQuery:boolean; + + constructor(nature: Nature | Nature[], minNumberOfPokemon: number = 1, invertQuery: boolean = false) { + super(); + this.minNumberOfPokemon = minNumberOfPokemon; + this.invertQuery = invertQuery; + if (nature instanceof Array) { + this.requiredNature = nature; + } else { + this.requiredNature = []; + this.requiredNature.push(nature); + } + } + + meetsRequirement(scene: BattleScene): boolean { + const partyPokemon = scene.getParty(); + if (isNullOrUndefined(partyPokemon) || this?.requiredNature?.length < 0) { + return false; + } + return this.queryParty(partyPokemon).length >= this.minNumberOfPokemon; + } + + queryParty(partyPokemon: PlayerPokemon[]): PlayerPokemon[] { + if (!this.invertQuery) { + return partyPokemon.filter((pokemon) => this.requiredNature.filter((nature) => pokemon.nature === nature).length > 0); + } else { + // for an inverted query, we only want to get the pokemon that don't have ANY of the listed natures + return partyPokemon.filter((pokemon) => this.requiredNature.filter((nature) => pokemon.nature === nature).length === 0); + } + } + + getMatchingDialogueToken(str:string, pokemon: PlayerPokemon): [RegExp, string] { + if (this.requiredNature.includes(pokemon.nature)) { + return [new RegExp("@ec\{" + str + "Nature\\}", "gi"), Nature[pokemon.nature]]; + } + return null; + } +} + +export class TypeRequirement extends EncounterPokemonRequirement { + requiredType: Type[]; + minNumberOfPokemon:number; + invertQuery:boolean; + + constructor(type: Type | Type[], minNumberOfPokemon: number = 1, invertQuery: boolean = false) { + super(); + this.minNumberOfPokemon = minNumberOfPokemon; + this.invertQuery = invertQuery; + if (type instanceof Array) { + this.requiredType = type; + } else { + this.requiredType = []; + this.requiredType.push(type); + } + } + + meetsRequirement(scene: BattleScene): boolean { + const partyPokemon = scene.getParty(); + if (isNullOrUndefined(partyPokemon) || this?.requiredType?.length < 0) { + return false; + } + return this.queryParty(partyPokemon).length >= this.minNumberOfPokemon; + } + + queryParty(partyPokemon: PlayerPokemon[]): PlayerPokemon[] { + if (!this.invertQuery) { + return partyPokemon.filter((pokemon) => this.requiredType.filter((type) => pokemon.getTypes().includes(type)).length > 0); + } else { + // for an inverted query, we only want to get the pokemon that don't have ANY of the listed types + return partyPokemon.filter((pokemon) => this.requiredType.filter((type) => pokemon.getTypes().includes(type)).length === 0); + } + } + + getMatchingDialogueToken(str:string, pokemon: PlayerPokemon): [RegExp, string] { + const includedTypes = this.requiredType.filter((ty) => pokemon.getTypes().includes(ty)); + if (includedTypes.length > 0) { + return [new RegExp("@ec\{" + str + "Type\\}", "gi"), Type[includedTypes[0]]]; + } + return null; + } +} + + +export class MoveRequirement extends EncounterPokemonRequirement { + requiredMoves: Moves[] = []; + minNumberOfPokemon:number; + invertQuery:boolean; + + constructor(moves: Moves | Moves[], minNumberOfPokemon: number = 1, invertQuery: boolean = false) { + super(); + this.minNumberOfPokemon = minNumberOfPokemon; + this.invertQuery = invertQuery; + if (moves instanceof Array) { + this.requiredMoves = moves; + } else { + this.requiredMoves = []; + this.requiredMoves.push(moves); + } + } + + meetsRequirement(scene: BattleScene): boolean { + const partyPokemon = scene.getParty(); + if (isNullOrUndefined(partyPokemon) || this?.requiredMoves?.length < 0) { + return false; + } + return this.queryParty(partyPokemon).length >= this.minNumberOfPokemon; + } + + queryParty(partyPokemon: PlayerPokemon[]): PlayerPokemon[] { + if (!this.invertQuery) { + return partyPokemon.filter((pokemon) => this.requiredMoves.filter((reqMove) => pokemon.moveset.filter((move) => move.moveId === reqMove).length > 0).length > 0); + } else { + // for an inverted query, we only want to get the pokemon that don't have ANY of the listed moves + return partyPokemon.filter((pokemon) => this.requiredMoves.filter((reqMove) => pokemon.moveset.filter((move) => move.moveId === reqMove).length === 0).length === 0); + } + } + + getMatchingDialogueToken(str:string, pokemon: PlayerPokemon): [RegExp, string] { + const includedMoves = this.requiredMoves.filter((reqMove) => pokemon.moveset.filter((move) => move.moveId === reqMove).length > 0); + if (includedMoves.length > 0) { + return [new RegExp("@ec\{" + str + "Move\\}", "gi"), Moves[includedMoves[0]].replace("_", " ")]; + } + return null; + } + +} + +/** + * Find out if Pokemon in the party are able to learn one of many specific moves by TM. + * NOTE: Egg moves are not included as learnable. + * NOTE: If the Pokemon already knows the move, this requirement will fail, since it's not technically learnable. + */ +export class CompatibleMoveRequirement extends EncounterPokemonRequirement { + requiredMoves: Moves[]; + minNumberOfPokemon:number; + invertQuery:boolean; + + constructor(learnableMove: Moves | Moves[], minNumberOfPokemon: number = 1, invertQuery: boolean = false) { + super(); + this.minNumberOfPokemon = minNumberOfPokemon; + this.invertQuery = invertQuery; + if (learnableMove instanceof Array) { + this.requiredMoves = learnableMove; + } else { + this.requiredMoves = []; + this.requiredMoves.push(learnableMove); + } + } + + meetsRequirement(scene: BattleScene): boolean { + const partyPokemon = scene.getParty(); + if (isNullOrUndefined(partyPokemon) || this?.requiredMoves?.length < 0) { + return false; + } + return this.queryParty(partyPokemon).length >= this.minNumberOfPokemon; + } + + queryParty(partyPokemon: PlayerPokemon[]): PlayerPokemon[] { + if (!this.invertQuery) { + return partyPokemon.filter((pokemon) => this.requiredMoves.filter((learnableMove) => pokemon.compatibleTms.filter(tm => !pokemon.moveset.find(m => m.moveId === tm)).includes(learnableMove)).length > 0); + } else { + // for an inverted query, we only want to get the pokemon that don't have ANY of the listed learnableMoves + return partyPokemon.filter((pokemon) => this.requiredMoves.filter((learnableMove) => pokemon.compatibleTms.filter(tm => !pokemon.moveset.find(m => m.moveId === tm)).includes(learnableMove)).length === 0); + } + } + + getMatchingDialogueToken(str:string, pokemon: PlayerPokemon): [RegExp, string] { + const includedCompatMoves = this.requiredMoves.filter((reqMove) => pokemon.compatibleTms.filter((tm) => !pokemon.moveset.find(m => m.moveId === tm)).includes(reqMove)); + if (includedCompatMoves.length > 0) { + return [new RegExp("@ec\{" + str + "CompatibleMove\\}", "gi"), Moves[includedCompatMoves[0]]]; + } + return null; + } + +} + +/* +export class EvolutionTargetSpeciesRequirement extends EncounterPokemonRequirement { + requiredEvolutionTargetSpecies: Species[]; + minNumberOfPokemon:number; + invertQuery:boolean; + + constructor(evolutionTargetSpecies: Species | Species[], minNumberOfPokemon: number = 1, invertQuery: boolean = false) { + super(); + this.minNumberOfPokemon = minNumberOfPokemon; + this.invertQuery = invertQuery; + if (evolutionTargetSpecies instanceof Array) { + this.requiredEvolutionTargetSpecies = evolutionTargetSpecies; + } else { + this.requiredEvolutionTargetSpecies = []; + this.requiredEvolutionTargetSpecies.push(evolutionTargetSpecies); + } + } + + meetsRequirement(scene: BattleScene): boolean { + const partyPokemon = scene.getParty(); + if (isNullOrUndefined(partyPokemon) || this?.requiredEvolutionTargetSpecies?.length < 0) { + return false; + } + return this.queryParty(partyPokemon).length >= this.minNumberOfPokemon; + } + + queryParty(partyPokemon: PlayerPokemon[]): PlayerPokemon[] { + if (!this.invertQuery) { + return partyPokemon.filter((pokemon) => this.requiredEvolutionTargetSpecies.filter((evolutionTargetSpecies) => pokemon.getEvolution()?.speciesId === evolutionTargetSpecies).length > 0); + } else { + // for an inverted query, we only want to get the pokemon that don't have ANY of the listed evolutionTargetSpeciess + return partyPokemon.filter((pokemon) => this.requiredEvolutionTargetSpecies.filter((evolutionTargetSpecies) => pokemon.getEvolution()?.speciesId === evolutionTargetSpecies).length === 0); + } + } + + getMatchingDialogueToken(str:string, pokemon: PlayerPokemon): [RegExp, string] { + const evos = this.requiredEvolutionTargetSpecies.filter((evolutionTargetSpecies) => pokemon.getEvolution().speciesId === evolutionTargetSpecies); + if (evos.length > 0) { + return [new RegExp("@ec\{" + str + "Evolution\\}", "gi"), Species[evos[0]]]; + } + return null; + } + +}*/ + +export class AbilityRequirement extends EncounterPokemonRequirement { + requiredAbilities: Abilities[]; + minNumberOfPokemon:number; + invertQuery:boolean; + + constructor(abilities: Abilities | Abilities[], minNumberOfPokemon: number = 1, invertQuery: boolean = false) { + super(); + this.minNumberOfPokemon = minNumberOfPokemon; + this.invertQuery = invertQuery; + if (abilities instanceof Array) { + this.requiredAbilities = abilities; + } else { + this.requiredAbilities = []; + this.requiredAbilities.push(abilities); + } + } + + meetsRequirement(scene: BattleScene): boolean { + const partyPokemon = scene.getParty(); + if (isNullOrUndefined(partyPokemon) || this?.requiredAbilities?.length < 0) { + return false; + } + return this.queryParty(partyPokemon).length >= this.minNumberOfPokemon; + } + + queryParty(partyPokemon: PlayerPokemon[]): PlayerPokemon[] { + if (!this.invertQuery) { + return partyPokemon.filter((pokemon) => this.requiredAbilities.filter((abilities) => pokemon.hasAbility(abilities)).length > 0); + } else { + // for an inverted query, we only want to get the pokemon that don't have ANY of the listed abilitiess + return partyPokemon.filter((pokemon) => this.requiredAbilities.filter((abilities) => pokemon.hasAbility(abilities)).length === 0); + } + } + + getMatchingDialogueToken(str:string, pokemon: PlayerPokemon): [RegExp, string] { + const reqAbilities = this.requiredAbilities.filter((a) => { + pokemon.hasAbility(a); + }); + if (reqAbilities.length > 0) { + return [new RegExp("@ec\{" + str + "Ability\\}", "gi"), Abilities[reqAbilities[0]]]; + } + return null; + } +} + +export class StatusEffectRequirement extends EncounterPokemonRequirement { + requiredStatusEffect: StatusEffect[]; + minNumberOfPokemon:number; + invertQuery:boolean; + + constructor(StatusEffect: StatusEffect | StatusEffect[], minNumberOfPokemon: number = 1, invertQuery: boolean = false) { + super(); + this.minNumberOfPokemon = minNumberOfPokemon; + this.invertQuery = invertQuery; + if (StatusEffect instanceof Array) { + this.requiredStatusEffect = StatusEffect; + } else { + this.requiredStatusEffect = []; + this.requiredStatusEffect.push(StatusEffect); + } + } + + meetsRequirement(scene: BattleScene): boolean { + const partyPokemon = scene.getParty(); + if (isNullOrUndefined(partyPokemon) || this?.requiredStatusEffect?.length < 0) { + return false; + } + const x = this.queryParty(partyPokemon).length >= this.minNumberOfPokemon; + console.log(x); + return x; + } + + queryParty(partyPokemon: PlayerPokemon[]): PlayerPokemon[] { + if (!this.invertQuery) { + return partyPokemon.filter((pokemon) => this.requiredStatusEffect.filter((StatusEffect) => pokemon.status?.effect === StatusEffect).length > 0); + } else { + // for an inverted query, we only want to get the pokemon that don't have ANY of the listed StatusEffects + return partyPokemon.filter((pokemon) => this.requiredStatusEffect.filter((StatusEffect) => pokemon.status?.effect === StatusEffect).length === 0); + } + } + + getMatchingDialogueToken(str:string, pokemon: PlayerPokemon): [RegExp, string] { + const reqStatus = this.requiredStatusEffect.filter((a) => { + pokemon.status?.effect ===(a); + }); + if (reqStatus.length > 0) { + return [new RegExp("@ec\{" + str + "Status\\}", "gi"), StatusEffect[reqStatus[0]]]; + } + return null; + } + +} + +/** + * Finds if there are pokemon that can form change with a given item. + * Notice that we mean specific items, like Charizardite, not the Mega Bracelet. + * If you want to trigger the event based on the form change enabler, use PersistentModifierRequirement. + */ +export class CanFormChangeWithItemRequirement extends EncounterPokemonRequirement { + requiredFormChangeItem: FormChangeItem[]; + minNumberOfPokemon:number; + invertQuery:boolean; + + constructor(formChangeItem: FormChangeItem | FormChangeItem[], minNumberOfPokemon: number = 1, invertQuery: boolean = false) { + super(); + this.minNumberOfPokemon = minNumberOfPokemon; + this.invertQuery = invertQuery; + if (formChangeItem instanceof Array) { + this.requiredFormChangeItem = formChangeItem; + } else { + this.requiredFormChangeItem = []; + this.requiredFormChangeItem.push(formChangeItem); + } + } + + meetsRequirement(scene: BattleScene): boolean { + const partyPokemon = scene.getParty(); + if (isNullOrUndefined(partyPokemon) || this?.requiredFormChangeItem?.length < 0) { + return false; + } + return this.queryParty(partyPokemon).length >= this.minNumberOfPokemon; + } + filterByForm(pokemon, formChangeItem) { + if (pokemonFormChanges.hasOwnProperty(pokemon.species.speciesId) + // Get all form changes for this species with an item trigger, including any compound triggers + && pokemonFormChanges[pokemon.species.speciesId].filter(fc => fc.trigger.hasTriggerType(SpeciesFormChangeItemTrigger)) + // Returns true if any form changes match this item + .map(fc => fc.findTrigger(SpeciesFormChangeItemTrigger) as SpeciesFormChangeItemTrigger) + .flat().flatMap(fc => fc.item).includes(formChangeItem)) { + return true; + } else { + return false; + } + } + + queryParty(partyPokemon: PlayerPokemon[]): PlayerPokemon[] { + if (!this.invertQuery) { + return partyPokemon.filter((pokemon) => this.requiredFormChangeItem.filter((formChangeItem) => this.filterByForm(pokemon, formChangeItem)).length > 0); + } else { + // for an inverted query, we only want to get the pokemon that don't have ANY of the listed formChangeItems + return partyPokemon.filter((pokemon) => this.requiredFormChangeItem.filter((formChangeItem) => this.filterByForm(pokemon, formChangeItem)).length === 0); + } + } + + getMatchingDialogueToken(str:string, pokemon: PlayerPokemon): [RegExp, string] { + const requiredItems = this.requiredFormChangeItem.filter((formChangeItem) => this.filterByForm(pokemon, formChangeItem)); + if (requiredItems.length > 0) { + return [new RegExp("@ec\{" + str + "FormChangeItem\\}", "gi"), FormChangeItem[requiredItems[0]]]; + } + return null; + } + +} + +export class CanEvolveWithItemRequirement extends EncounterPokemonRequirement { + requiredEvolutionItem: EvolutionItem[]; + minNumberOfPokemon:number; + invertQuery:boolean; + + constructor(evolutionItems: EvolutionItem | EvolutionItem[], minNumberOfPokemon: number = 1, invertQuery: boolean = false) { + super(); + this.minNumberOfPokemon = minNumberOfPokemon; + this.invertQuery = invertQuery; + if (evolutionItems instanceof Array) { + this.requiredEvolutionItem = evolutionItems; + } else { + this.requiredEvolutionItem = []; + this.requiredEvolutionItem.push(evolutionItems); + } + } + + meetsRequirement(scene: BattleScene): boolean { + const partyPokemon = scene.getParty(); + if (isNullOrUndefined(partyPokemon) || this?.requiredEvolutionItem?.length < 0) { + return false; + } + return this.queryParty(partyPokemon).length >= this.minNumberOfPokemon; + } + + filterByEvo(pokemon, evolutionItem) { + if (pokemonEvolutions.hasOwnProperty(pokemon.species.speciesId) && pokemonEvolutions[pokemon.species.speciesId].filter(e => e.item === evolutionItem + && (!e.condition || e.condition.predicate(pokemon))).length && (pokemon.getFormKey() !== SpeciesFormKey.GIGANTAMAX)) { + return true; + } else if (pokemon.isFusion() && pokemonEvolutions.hasOwnProperty(pokemon.fusionSpecies.speciesId) && pokemonEvolutions[pokemon.fusionSpecies.speciesId].filter(e => e.item === evolutionItem + && (!e.condition || e.condition.predicate(pokemon))).length && (pokemon.getFusionFormKey() !== SpeciesFormKey.GIGANTAMAX)) { + return true; + } + return false; + } + + queryParty(partyPokemon: PlayerPokemon[]): PlayerPokemon[] { + if (!this.invertQuery) { + return partyPokemon.filter((pokemon) => this.requiredEvolutionItem.filter((evolutionItem) => this.filterByEvo(pokemon, evolutionItem)).length > 0); + } else { + // for an inverted query, we only want to get the pokemon that don't have ANY of the listed evolutionItemss + return partyPokemon.filter((pokemon) => this.requiredEvolutionItem.filter((evolutionItems) => this.filterByEvo(pokemon, evolutionItems)).length === 0); + } + } + + getMatchingDialogueToken(str:string, pokemon: PlayerPokemon): [RegExp, string] { + const requiredItems = this.requiredEvolutionItem.filter((evoItem) => this.filterByEvo(pokemon, evoItem)); + if (requiredItems.length > 0) { + return [new RegExp("@ec\{" + str + "EvolutionItem\\}", "gi"), EvolutionItem[requiredItems[0]]]; + } + return null; + } +} + +export class HeldItemRequirement extends EncounterPokemonRequirement { + requiredHeldItemModifier: PokemonHeldItemModifierType[]; + minNumberOfPokemon:number; + invertQuery:boolean; + + constructor(heldItem: PokemonHeldItemModifierType | PokemonHeldItemModifierType[], minNumberOfPokemon: number = 1, invertQuery: boolean = false) { + super(); + this.minNumberOfPokemon = minNumberOfPokemon; + this.invertQuery = invertQuery; + if (heldItem instanceof Array) { + this.requiredHeldItemModifier = heldItem; + } else { + this.requiredHeldItemModifier = []; + this.requiredHeldItemModifier.push(heldItem); + } + } + + meetsRequirement(scene: BattleScene): boolean { + const partyPokemon = scene.getParty(); + if (isNullOrUndefined(partyPokemon) || this?.requiredHeldItemModifier?.length < 0) { + return false; + } + return this.queryParty(partyPokemon).length >= this.minNumberOfPokemon; + } + + queryParty(partyPokemon: PlayerPokemon[]): PlayerPokemon[] { + if (!this.invertQuery) { + return partyPokemon.filter((pokemon) => this.requiredHeldItemModifier.filter((heldItem) => pokemon.getHeldItems().filter((it) => it.type.id === heldItem.id).length > 0).length > 0); + } else { + // for an inverted query, we only want to get the pokemon that don't have ANY of the listed heldItems + return partyPokemon.filter((pokemon) => this.requiredHeldItemModifier.filter((heldItem) => pokemon.getHeldItems().filter((it) => it.type.id === heldItem.id).length === 0).length === 0); + } + } + + getMatchingDialogueToken(str:string, pokemon: PlayerPokemon): [RegExp, string] { + const requiredItems = this.requiredHeldItemModifier.filter((a) => { + pokemon.getHeldItems().filter((it) => it.type.id === a.id ).length > 0; + }); + if (requiredItems.length > 0) { + return [new RegExp("@ec\{" + str + "HeldItem\\}", "gi"), requiredItems[0].name]; + } + return null; + } + +} + + +export class LevelRequirement extends EncounterPokemonRequirement { + requiredLevelRange?: [number, number]; + minNumberOfPokemon:number; + invertQuery:boolean; + + constructor(requiredLevelRange: [number, number], minNumberOfPokemon: number = 1, invertQuery: boolean = false) { + super(); + this.minNumberOfPokemon = minNumberOfPokemon; + this.invertQuery = invertQuery; + this.requiredLevelRange = requiredLevelRange; + + } + + meetsRequirement(scene: BattleScene): boolean { + // Party Pokemon inside required level range + if (!isNullOrUndefined(this?.requiredLevelRange) && this.requiredLevelRange?.[0] <= this.requiredLevelRange?.[1]) { + const partyPokemon = scene.getParty(); + const pokemonInRange = this.queryParty(partyPokemon); + if (pokemonInRange.length < this.minNumberOfPokemon) { + return false; + } + } + return true; + } + + queryParty(partyPokemon: PlayerPokemon[]): PlayerPokemon[] { + if (!this.invertQuery) { + return partyPokemon.filter((pokemon) => pokemon.level >= this.requiredLevelRange[0] && pokemon.level <= this.requiredLevelRange[1]); + } else { + // for an inverted query, we only want to get the pokemon that don't have ANY of the listed requiredLevelRanges + return partyPokemon.filter((pokemon) => pokemon.level < this.requiredLevelRange[0] || pokemon.level > this.requiredLevelRange[1]); + } + } + getMatchingDialogueToken(str:string, pokemon: PlayerPokemon): [RegExp, string] { + return [new RegExp("@ec\{" + str + "Level\\}", "gi"), pokemon.level.toString()]; + } +} + +export class FriendshipRequirement extends EncounterPokemonRequirement { + requiredFriendshipRange?: [number, number]; + minNumberOfPokemon:number; + invertQuery:boolean; + + constructor(requiredFriendshipRange: [number, number], minNumberOfPokemon: number = 1, invertQuery: boolean = false) { + super(); + this.minNumberOfPokemon = minNumberOfPokemon; + this.invertQuery = invertQuery; + this.requiredFriendshipRange = requiredFriendshipRange; + } + + meetsRequirement(scene: BattleScene): boolean { + // Party Pokemon inside required friendship range + if (!isNullOrUndefined(this?.requiredFriendshipRange) && this.requiredFriendshipRange?.[0] <= this.requiredFriendshipRange?.[1]) { + const partyPokemon = scene.getParty(); + const pokemonInRange = this.queryParty(partyPokemon); + if (pokemonInRange.length < this.minNumberOfPokemon) { + return false; + } + } + return true; + } + + queryParty(partyPokemon: PlayerPokemon[]): PlayerPokemon[] { + if (!this.invertQuery) { + return partyPokemon.filter((pokemon) => pokemon.friendship >= this.requiredFriendshipRange[0] && pokemon.friendship <= this.requiredFriendshipRange[1]); + } else { + // for an inverted query, we only want to get the pokemon that don't have ANY of the listed requiredFriendshipRanges + return partyPokemon.filter((pokemon) => pokemon.friendship < this.requiredFriendshipRange[0] || pokemon.friendship > this.requiredFriendshipRange[1]); + } + } + + getMatchingDialogueToken(str:string, pokemon: PlayerPokemon): [RegExp, string] { + return [new RegExp("@ec\{" + str + "Friendship\\}", "gi"), pokemon.friendship.toString()]; + } +} + +/** + * .1 -> 10% hp + * .5 -> 50% hp + * 1 -> 100% hp + */ +export class HealthRatioRequirement extends EncounterPokemonRequirement { + requiredHealthRange?: [number, number]; + minNumberOfPokemon:number; + invertQuery:boolean; + + constructor(requiredHealthRange: [number, number], minNumberOfPokemon: number = 1, invertQuery: boolean = false) { + super(); + this.minNumberOfPokemon = minNumberOfPokemon; + this.invertQuery = invertQuery; + this.requiredHealthRange = requiredHealthRange; + } + + meetsRequirement(scene: BattleScene): boolean { + // Party Pokemon inside required level range + if (!isNullOrUndefined(this?.requiredHealthRange) && this.requiredHealthRange?.[0] <= this.requiredHealthRange?.[1]) { + const partyPokemon = scene.getParty(); + const pokemonInRange = this.queryParty(partyPokemon); + if (pokemonInRange.length < this.minNumberOfPokemon) { + return false; + } + } + return true; + } + + queryParty(partyPokemon: PlayerPokemon[]): PlayerPokemon[] { + if (!this.invertQuery) { + return partyPokemon.filter((pokemon) => pokemon.getHpRatio() >= this.requiredHealthRange[0] && pokemon.getHpRatio() <= this.requiredHealthRange[1]); + } else { + // for an inverted query, we only want to get the pokemon that don't have ANY of the listed requiredHealthRanges + return partyPokemon.filter((pokemon) => pokemon.getHpRatio() < this.requiredHealthRange[0] || pokemon.getHpRatio() > this.requiredHealthRange[1]); + } + } + + getMatchingDialogueToken(str:string, pokemon: PlayerPokemon): [RegExp, string] { + return [new RegExp("@ec\{" + str + "HealthRatio\\}", "gi"), Math.floor(pokemon.getHpRatio()*100).toString() + "%"]; + } +} + +export class WeightRequirement extends EncounterPokemonRequirement { + requiredWeightRange?: [number, number]; + minNumberOfPokemon:number; + invertQuery:boolean; + + constructor(requiredWeightRange: [number, number], minNumberOfPokemon: number = 1, invertQuery: boolean = false) { + super(); + this.minNumberOfPokemon = minNumberOfPokemon; + this.invertQuery = invertQuery; + this.requiredWeightRange = requiredWeightRange; + } + + meetsRequirement(scene: BattleScene): boolean { + // Party Pokemon inside required friendship range + if (!isNullOrUndefined(this?.requiredWeightRange) && this.requiredWeightRange?.[0] <= this.requiredWeightRange?.[1]) { + const partyPokemon = scene.getParty(); + const pokemonInRange = this.queryParty(partyPokemon); + if (pokemonInRange.length < this.minNumberOfPokemon) { + return false; + } + } + return true; + } + + queryParty(partyPokemon: PlayerPokemon[]): PlayerPokemon[] { + if (!this.invertQuery) { + return partyPokemon.filter((pokemon) => pokemon.getWeight() >= this.requiredWeightRange[0] && pokemon.getWeight() <= this.requiredWeightRange[1]); + } else { + // for an inverted query, we only want to get the pokemon that don't have ANY of the listed requiredWeightRanges + return partyPokemon.filter((pokemon) => pokemon.getWeight() < this.requiredWeightRange[0] || pokemon.getWeight() > this.requiredWeightRange[1]); + } + } + getMatchingDialogueToken(str:string, pokemon: PlayerPokemon): [RegExp, string] { + return [new RegExp("@ec\{" + str + "Weight\\}", "gi"), pokemon.getWeight().toString()]; + } +} diff --git a/src/data/mystery-encounter.ts b/src/data/mystery-encounter.ts new file mode 100644 index 00000000000..74364013046 --- /dev/null +++ b/src/data/mystery-encounter.ts @@ -0,0 +1,481 @@ +import BattleScene from "../battle-scene"; +import MysteryEncounterIntroVisuals, { MysteryEncounterSpriteConfig } from "../field/mystery-encounter-intro"; +import { MysteryEncounterType } from "#enums/mystery-encounter-type"; +import MysteryEncounterDialogue, { + allMysteryEncounterDialogue +} from "./mystery-encounters/dialogue/mystery-encounter-dialogue"; +import MysteryEncounterOption from "./mystery-encounter-option"; +import { EncounterPokemonRequirement, EncounterSceneRequirement } from "./mystery-encounter-requirements"; +import * as Utils from "../utils"; +import {EnemyPartyConfig} from "#app/data/mystery-encounters/mystery-encounter-utils"; +import { PlayerPokemon } from "#app/field/pokemon"; +import {isNullOrUndefined} from "../utils"; + +export enum MysteryEncounterVariant { + DEFAULT, + TRAINER_BATTLE, + WILD_BATTLE, + BOSS_BATTLE, + NO_BATTLE +} + +export enum MysteryEncounterTier { + COMMON, + UNCOMMON, + RARE, + SUPER_RARE, + ULTRA_RARE // Not currently used +} + +export default interface MysteryEncounter { + /** + * Required params + */ + encounterType: MysteryEncounterType; + options: [MysteryEncounterOption, MysteryEncounterOption, ...MysteryEncounterOption[]]; + spriteConfigs: MysteryEncounterSpriteConfig[]; + /** + * Optional params + */ + encounterTier?: MysteryEncounterTier; + hideBattleIntroMessage?: boolean; + hideIntroVisuals?: boolean; + catchAllowed?: boolean; + doEncounterRewards?: (scene: BattleScene) => boolean; + onInit?: (scene: BattleScene) => boolean; + + /** + * Requirements + */ + requirements?: EncounterSceneRequirement[]; + primaryPokemonRequirements?: EncounterPokemonRequirement[]; + secondaryPokemonRequirements ?: EncounterPokemonRequirement[]; // A list of requirements that must ALL be met by a subset of pokemon to trigger the event + excludePrimaryFromSupportRequirements?: boolean; + // Primary Pokemon is a single pokemon randomly selected from a set of pokemon that meet ALL primary pokemon requirements + primaryPokemon?: PlayerPokemon; + // Support Pokemon are pokemon that meet ALL support pokemon requirements. + // Note that an individual requirement may require multiple pokemon, but the resulting pokemon after all secondary requirements are met may be lower than expected + // If the primary pokemon and supporting pokemon are the same and ExcludePrimaryFromSupportRequirements flag is true, primary pokemon may be promoted from secondary pool + secondaryPokemon?: PlayerPokemon[]; + + /** + * Post-construct / Auto-populated params + */ + + /** + * Dialogue object containing all the dialogue, messages, tooltips, etc. for an encounter + */ + dialogue?: MysteryEncounterDialogue; + /** + * Data used for setting up/initializing enemy party in battles + * Can store multiple configs so that one can be chosen based on option selected + */ + enemyPartyConfigs?: EnemyPartyConfig[]; + /** + * Object instance containing sprite data for an encounter when it is being spawned + * Otherwise, will be undefined + * You probably shouldn't do anything with this unless you have a very specific need + */ + introVisuals?: MysteryEncounterIntroVisuals; + + /** + * Flags + */ + + /** + * Can be set for uses programatic dialogue during an encounter (storing the name of one of the party's pokemon, etc.) + * Example use: see MYSTERIOUS_CHEST + */ + dialogueTokens?: Map; + /** + * Should be set depending upon option selected as part of an encounter + * For example, if there is no battle as part of the encounter/selected option, should be set to NO_BATTLE + * Defaults to DEFAULT + */ + encounterVariant?: MysteryEncounterVariant; + /** + * Flag for checking if it's the first time a shop is being shown for an encounter. + * Defaults to true so that the first shop does not override the specified rewards. + * Will be set to false after a shop is shown (so can't reroll same rarity items for free) + */ + lockEncounterRewardTiers?: boolean; + /** + * Will be set by option select handlers automatically, and can be used to refer to which option was chosen by later phases + */ + selectedOption?: MysteryEncounterOption; + /** + * Can be set higher or lower based on the type of battle or exp gained for an option/encounter + * Defaults to 1 + */ + expMultiplier?: number; + + /** + * Generic property to set any custom data required for the encounter + */ + misc?: any; +} + +/** + * MysteryEncounter class that defines the logic for a single encounter + * These objects will be saved as part of session data any time the player is on a floor with an encounter + * Unless you know what you're doing, you should use MysteryEncounterBuilder to create an instance for this class + */ +export default class MysteryEncounter implements MysteryEncounter { + constructor(encounter: MysteryEncounter) { + if (!Utils.isNullOrUndefined(encounter)) { + Object.assign(this, encounter); + } + this.encounterTier = this.encounterTier ? this.encounterTier : MysteryEncounterTier.COMMON; + this.dialogue = allMysteryEncounterDialogue[this.encounterType]; + this.encounterVariant = MysteryEncounterVariant.DEFAULT; + this.requirements = this.requirements ? this.requirements : []; + this.hideBattleIntroMessage = !isNullOrUndefined(this.hideBattleIntroMessage) ? this.hideBattleIntroMessage : false; + this.hideIntroVisuals = !isNullOrUndefined(this.hideIntroVisuals) ? this.hideIntroVisuals : true; + + // Populate options with respective dialogue + if (this.dialogue) { + this.options.forEach((o, i) => o.dialogue = this.dialogue.encounterOptionsDialogue.options[i]); + } + + // Reset any dirty flags or encounter data + this.lockEncounterRewardTiers = true; + this.dialogueTokens = new Map; + this.enemyPartyConfigs = []; + this.introVisuals = null; + this.misc = null; + this.expMultiplier = 1; + } + + /** + * Checks if the current scene state meets the requirements for the MysteryEncounter to spawn + * This is used to filter the pool of encounters down to only the ones with all requirements met + * @param scene + * @returns + */ + meetsRequirements?(scene: BattleScene) { + const sceneReq = !this.requirements.some(requirement => !requirement.meetsRequirement(scene)); + const secReqs = this.meetsSecondaryRequirementAndSecondaryPokemonSelected(scene); // secondary is checked first to handle cases of primary overlapping with secondary + const priReqs = this.meetsPrimaryRequirementAndPrimaryPokemonSelected(scene); + + console.log("-------" + MysteryEncounterType[this.encounterType] + " Encounter Check -------"); + console.log(this); + console.log( "sceneCheck: " + sceneReq); + console.log( "primaryCheck: " + priReqs); + console.log( "secondaryCheck: " + secReqs); + console.log(MysteryEncounterTier[this.encounterTier]); + + return sceneReq && secReqs && priReqs; + } + + private meetsPrimaryRequirementAndPrimaryPokemonSelected?(scene: BattleScene) { + if (this.primaryPokemonRequirements.length === 0) { + const activeMon = scene.getParty().filter(p => p.isActive(true)); + if (activeMon.length > 0) { + this.primaryPokemon = activeMon[0]; + } else { + this.primaryPokemon = scene.getParty().filter(p => !p.isFainted())[0]; + } + return true; + } + let qualified:PlayerPokemon[] = scene.getParty(); + for (const req of this.primaryPokemonRequirements) { + console.log(req); + if (req.meetsRequirement(scene)) { + if (req instanceof EncounterPokemonRequirement) { + qualified = qualified.filter(pkmn => req.queryParty(scene.getParty()).includes(pkmn)); + } + } else { + this.primaryPokemon = null; + return false; + } + } + + if (qualified.length === 0) { + return false; + } + + if (this.excludePrimaryFromSupportRequirements && this.secondaryPokemon) { + const truePrimaryPool = []; + const overlap = []; + for (const qp of qualified) { + if (!this.secondaryPokemon.includes(qp)) { + truePrimaryPool.push(qp); + } else { + overlap.push(qp); + } + + } + if (truePrimaryPool.length > 0) { + // always choose from the non-overlapping pokemon first + this.primaryPokemon = truePrimaryPool[Utils.randSeedInt(truePrimaryPool.length, 0)]; + return true; + } else { + // if there are multiple overlapping pokemon, we're okay - just choose one and take it out of the primary pokemon pool + if (overlap.length > 1 || (this.secondaryPokemon.length - overlap.length >= 1)) { + // is this working? + this.primaryPokemon = overlap[Utils.randSeedInt(overlap.length, 0)]; + this.secondaryPokemon = this.secondaryPokemon.filter((supp)=> supp !== this.primaryPokemon); + return true; + } + console.log("Mystery Encounter Edge Case: Requirement not met due to primary pokemon overlapping with secondary pokemon. There's no valid primary pokemon left."); + return false; + } + } else { + // this means we CAN have the same pokemon be a primary and secondary pokemon, so just choose any qualifying one randomly. + this.primaryPokemon = qualified[Utils.randSeedInt(qualified.length, 0)]; + return true; + } + } + + private meetsSecondaryRequirementAndSecondaryPokemonSelected?(scene: BattleScene) { + if (!this.secondaryPokemonRequirements) { + this.secondaryPokemon = []; + return true; + } + + let qualified:PlayerPokemon[] = scene.getParty(); + for (const req of this.secondaryPokemonRequirements) { + if (req.meetsRequirement(scene)) { + if (req instanceof EncounterPokemonRequirement) { + qualified = qualified.filter(pkmn => req.queryParty(scene.getParty()).includes(pkmn)); + + } + } else { + this.secondaryPokemon = []; + return false; + } + } + this.secondaryPokemon = qualified; + return true; + } + + /** + * Initializes encounter intro sprites based on the sprite configs defined in spriteConfigs + * @param scene + */ + initIntroVisuals?(scene: BattleScene) { + this.introVisuals = new MysteryEncounterIntroVisuals(scene, this); + } + + /** + * Auto-pushes dialogue tokens from the encounter (and option) requirements. + * Will use the first support pokemon in list + * For multiple support pokemon in the dialogue token, it will have to be overridden. + */ + populateDialogueTokensFromRequirements?() { + if (this.primaryPokemon?.length > 0) { + this.dialogueTokens.set(/@ec\{primaryName\}/gi, this.primaryPokemon.name); + for (const req of this.primaryPokemonRequirements) { + if (!req.invertQuery) { + const entry: [RegExp, string] = req.getMatchingDialogueToken("primary", this.primaryPokemon); + this.dialogueTokens.set(entry[0], entry[1]); + } + } + } + if (this.secondaryPokemonRequirements?.length > 0 && this.secondaryPokemon?.length > 0) { + this.dialogueTokens.set(/@ec\{secondaryName\}/gi, this.secondaryPokemon[0].name); + for (const req of this.secondaryPokemonRequirements) { + if (!req.invertQuery) { + const entry: [RegExp, string] = req.getMatchingDialogueToken("secondary", this.secondaryPokemon[0]); + this.dialogueTokens.set(entry[0], entry[1]); + } + } + } + for (let i = 0; i < this.options.length; i++) { + const opt = this.options[i]; + const j = i + 1; + if (opt.primaryPokemonRequirements?.length > 0 && opt.primaryPokemon?.length > 0) { + this.dialogueTokens.set(new RegExp("@ec\{option" + j + "PrimaryName\\}", "gi"), opt.primaryPokemon.name); + for (const req of opt.primaryPokemonRequirements) { + if (!req.invertQuery) { + const entry: [RegExp, string] = req.getMatchingDialogueToken("option" + j + "Primary", opt.primaryPokemon); + this.dialogueTokens.set(entry[0], entry[1]); + } + } + } + if (opt.secondaryPokemonRequirements?.length > 0 && opt.secondaryPokemon?.length > 0) { + this.dialogueTokens.set(new RegExp("@ec\{option" + j + "SecondaryName\\}", "gi"), opt.secondaryPokemon[0].name); + for (const req of opt.secondaryPokemonRequirements) { + if (!req.invertQuery) { + const entry: [RegExp, string] = req.getMatchingDialogueToken("option" + j + "Secondary", opt.secondaryPokemon[0]); + this.dialogueTokens.set(entry[0], entry[1]); + } + } + } + } + } +} + +export class MysteryEncounterBuilder implements Partial { + encounterType?: MysteryEncounterType; + options?: [MysteryEncounterOption, MysteryEncounterOption, ...MysteryEncounterOption[]] = [null, null]; + spriteConfigs?: MysteryEncounterSpriteConfig[]; + + dialogue?: MysteryEncounterDialogue; + encounterTier?: MysteryEncounterTier; + requirements?: EncounterSceneRequirement[] = []; + primaryPokemonRequirements?: EncounterPokemonRequirement[] = []; + secondaryPokemonRequirements ?: EncounterPokemonRequirement[] = []; + excludePrimaryFromSupportRequirements?: boolean; + dialogueTokens?: Map; + doEncounterRewards?: (scene: BattleScene) => boolean; + onInit?: (scene: BattleScene) => boolean; + hideBattleIntroMessage?: boolean; + hideIntroVisuals?: boolean; + enemyPartyConfigs?: EnemyPartyConfig[] = []; + + /** + * REQUIRED + */ + + /** + * Defines the type of encounter which is used as an identifier, should be tied to a unique MysteryEncounterType + * @param encounterType + * @returns this + */ + withEncounterType(encounterType: MysteryEncounterType): this & Pick { + return Object.assign(this, { encounterType: encounterType }); + } + + /** + * Defines an option for the encounter + * There should be at least 2 options defined and no more than 4 + * @param option - MysteryEncounterOption to add, can use MysteryEncounterOptionBuilder to create instance + * @returns + */ + withOption(option: MysteryEncounterOption): this & Pick { + if (this.options[0] === null) { + return Object.assign(this, { options: [ option, this.options[0] ] }); + } else if (this.options[1] === null) { + return Object.assign(this, { options: [this.options[0], option ] }); + } else { + this.options.push(option); + return Object.assign(this, { options: this.options }); + } + } + + /** + * Defines the sprites that will be shown on the enemy field when the encounter spawns + * Can be one or more sprites, recommended not to exceed 4 + * @param spriteConfigs + * @returns + */ + withIntroSpriteConfigs(spriteConfigs: MysteryEncounterSpriteConfig[]): this & Pick { + return Object.assign(this, { spriteConfigs: spriteConfigs }); + } + + /** + * OPTIONAL + */ + + /** + * Sets the rarity tier for an encounter + * If not specified, defaults to COMMON + * Tiers are: + * COMMON 32/64 odds + * UNCOMMON 16/64 odds + * RARE 10/64 odds + * SUPER_RARE 6/64 odds + * ULTRA_RARE Not currently used + * @param encounterTier + * @returns + */ + withEncounterTier(encounterTier: MysteryEncounterTier): this & Required> { + return Object.assign(this, { encounterTier: encounterTier }); + } + + /** + * Specifies a requirement for an encounter + * For example, passing requirement as "new WaveCountRequirement([2, 180])" would create a requirement that the encounter can only be spawned between waves 2 and 180 + * Existing Requirement objects are defined in mystery-encounter-requirements.ts, and more can always be created to meet a requirement need + * @param requirement + * @returns + */ + withSceneRequirement(requirement: EncounterSceneRequirement): this & Required> { + if (requirement instanceof EncounterPokemonRequirement) { + Error("Incorrectly added pokemon requirement as scene requirement."); + } + this.requirements.push(requirement); + return Object.assign(this, { requirements: this.requirements }); + } + + withPrimaryPokemonRequirement(requirement: EncounterPokemonRequirement): this & Required> { + this.primaryPokemonRequirements.push(requirement); + return Object.assign(this, { primaryPokemonRequirements: this.primaryPokemonRequirements }); + } + + // TODO: Maybe add an optional parameter for excluding primary pokemon from the support cast? + // ex. if your only grass type pokemon, a snivy, is chosen as primary, if the support pokemon requires a grass type, the event won't trigger because + // it's already been + withSecondaryPokemonRequirement(requirement: EncounterPokemonRequirement, excludePrimaryFromSecondaryRequirements:boolean = false): this & Required> { + this.secondaryPokemonRequirements.push(requirement); + this.excludePrimaryFromSupportRequirements = excludePrimaryFromSecondaryRequirements; + return Object.assign(this, { excludePrimaryFromSecondaryRequirements: this.excludePrimaryFromSupportRequirements, secondaryPokemonRequirements: this.secondaryPokemonRequirements }); + } + + /** + * Can set custom encounter rewards via this callback function + * If rewards are always deterministic for an encounter, this is a good way to set them + * + * NOTE: If rewards are dependent on options selected, runtime data, etc., + * It may be better to programmatically set doEncounterRewards elsewhere. + * For instance, doEncounterRewards could instead be set inside the onOptionPhase() callback function for a MysteryEncounterOption + * Check other existing mystery encounters for examples on how to use this + * @param doEncounterRewards - synchronous callback function to perform during rewards phase of the encounter + * @returns + */ + withRewards(doEncounterRewards: (scene: BattleScene) => boolean): this & Required> { + return Object.assign(this, { doEncounterRewards: doEncounterRewards }); + } + + /** + * Can be used to perform init logic before intro visuals are shown and before the MysteryEncounterPhase begins + * Useful for performing things like procedural generation of intro sprites, etc. + * + * @param onInit - synchronous callback function to perform as soon as the encounter is selected for the next phase + * @returns + */ + withOnInit(onInit: (scene: BattleScene) => boolean): this & Required> { + return Object.assign(this, { onInit: onInit }); + } + + /** + * Defines any enemies to use for a battle from the mystery encounter + * @param enemyPartyConfig + * @returns + */ + withEnemyPartyConfig(enemyPartyConfig: EnemyPartyConfig): this & Required> { + this.enemyPartyConfigs.push(enemyPartyConfig); + return Object.assign(this, { enemyPartyConfigs: this.enemyPartyConfigs }); + } + + /** + * Can set whether catching is allowed or not on the encounter + * This flag can also be programmatically set inside option event functions or elsewhere + * @param catchAllowed - if true, allows enemy pokemon to be caught during the encounter + * @returns + */ + withCatchAllowed(catchAllowed: boolean): this & Required> { + return Object.assign(this, { catchAllowed: catchAllowed }); + } + + /** + * @param hideBattleIntroMessage - if true, will not show the trainerAppeared/wildAppeared/bossAppeared message for an encounter + * @returns + */ + withHideWildIntroMessage(hideBattleIntroMessage: boolean): this & Required> { + return Object.assign(this, { hideBattleIntroMessage: hideBattleIntroMessage }); + } + + /** + * @param hideIntroVisuals - if false, will not hide the intro visuals that are displayed at the beginning of encounter + * @returns + */ + withHideIntroVisuals(hideIntroVisuals: boolean): this & Required> { + return Object.assign(this, { hideIntroVisuals: hideIntroVisuals }); + } + + build(this: MysteryEncounter) { + return new MysteryEncounter(this); + } +} diff --git a/src/data/mystery-encounters/dark-deal.ts b/src/data/mystery-encounters/dark-deal.ts new file mode 100644 index 00000000000..bf75a10f661 --- /dev/null +++ b/src/data/mystery-encounters/dark-deal.ts @@ -0,0 +1,134 @@ +import BattleScene from "../../battle-scene"; +import {AddPokeballModifierType} from "../../modifier/modifier-type"; +import { + EnemyPartyConfig, EnemyPokemonConfig, + getRandomPlayerPokemon, + getRandomSpeciesByStarterTier, + initBattleWithEnemyConfig, + leaveEncounterWithoutBattle +} from "./mystery-encounter-utils"; +import MysteryEncounter, {MysteryEncounterBuilder, MysteryEncounterTier} from "../mystery-encounter"; +import {ModifierRewardPhase} from "#app/phases"; +import {getPokemonSpecies} from "../pokemon-species"; +import {MysteryEncounterType} from "#enums/mystery-encounter-type"; +import {PokeballType} from "../pokeball"; +import {PartySizeRequirement, WaveCountRequirement} from "../mystery-encounter-requirements"; +import {MysteryEncounterOptionBuilder} from "../mystery-encounter-option"; +import {Type} from "#app/data/type"; +import {Species} from "#enums/species"; +import {isNullOrUndefined, randSeedInt} from "#app/utils"; + +// Exclude Ultra Beasts, Paradox, Necrozma, Eternatus, and egg-locked mythicals +const excludedBosses = [ + Species.NECROZMA, + Species.ETERNATUS, + Species.NIHILEGO, + Species.BUZZWOLE, + Species.PHEROMOSA, + Species.XURKITREE, + Species.CELESTEELA, + Species.KARTANA, + Species.GUZZLORD, + Species.POIPOLE, + Species.NAGANADEL, + Species.STAKATAKA, + Species.BLACEPHALON, + Species.GREAT_TUSK, + Species.SCREAM_TAIL, + Species.BRUTE_BONNET, + Species.FLUTTER_MANE, + Species.SLITHER_WING, + Species.SANDY_SHOCKS, + Species.ROARING_MOON, + Species.KORAIDON, + Species.WALKING_WAKE, + Species.GOUGING_FIRE, + Species.RAGING_BOLT, + Species.IRON_TREADS, + Species.IRON_BUNDLE, + Species.IRON_HANDS, + Species.IRON_JUGULIS, + Species.IRON_MOTH, + Species.IRON_THORNS, + Species.IRON_VALIANT, + Species.MIRAIDON, + Species.IRON_LEAVES, + Species.IRON_BOULDER, + Species.IRON_CROWN, + Species.MEW, + Species.CELEBI, + Species.DEOXYS, + Species.JIRACHI, + Species.PHIONE, + Species.MANAPHY, + Species.ARCEUS, + Species.VICTINI, + Species.MELTAN, + Species.PECHARUNT +]; + +export const DarkDealEncounter: MysteryEncounter = new MysteryEncounterBuilder() + .withEncounterType(MysteryEncounterType.DARK_DEAL) + .withEncounterTier(MysteryEncounterTier.ULTRA_RARE) + .withIntroSpriteConfigs([ + { + spriteKey: "mad_scientist_m", + fileRoot: "mystery-encounters", + hasShadow: true + }, + { + spriteKey: "dark_deal_porygon", + fileRoot: "mystery-encounters", + hasShadow: true, + repeat: true + } + ]) + .withSceneRequirement(new WaveCountRequirement([30, 180])) // waves 30 to 180 + .withSceneRequirement(new PartySizeRequirement([2, 6])) // Must have at least 2 pokemon in party + .withCatchAllowed(true) + .withOption(new MysteryEncounterOptionBuilder() + .withPreOptionPhase(async (scene: BattleScene) => { + // Removes random pokemon (including fainted) from party and adds name to dialogue data tokens + // Will never return last battle able mon and instead pick fainted/unable to battle + const removedPokemon = getRandomPlayerPokemon(scene, false, true); + scene.removePokemonFromPlayerParty(removedPokemon); + scene.currentBattle.mysteryEncounter.dialogueTokens.set( /@ec\{pokeName\}/gi, removedPokemon.name); + + // Store removed pokemon types + scene.currentBattle.mysteryEncounter.misc = [removedPokemon.species.type1]; + if (removedPokemon.species.type2) { + scene.currentBattle.mysteryEncounter.misc.push(removedPokemon.species.type2); + } + }) + .withOptionPhase(async (scene: BattleScene) => { + // Give the player 5 Rogue Balls + scene.unshiftPhase(new ModifierRewardPhase(scene, () => new AddPokeballModifierType("rb", PokeballType.ROGUE_BALL, 5))); + + // Start encounter with random legendary (7-10 starter strength) that has level additive + const bossTypes = scene.currentBattle.mysteryEncounter.misc as Type[]; + // Starter egg tier, 35/50/10/5 %odds for tiers 6/7/8/9+ + const roll = randSeedInt(100); + const starterTier: number | [number, number] = roll > 65 ? 6 : roll > 15 ? 7 : roll > 5 ? 8 : [9, 10]; + const bossSpecies = getPokemonSpecies(getRandomSpeciesByStarterTier(starterTier, excludedBosses, bossTypes)); + const pokemonConfig: EnemyPokemonConfig = { + species: bossSpecies, + isBoss: true + }; + if (!isNullOrUndefined(bossSpecies.forms) && bossSpecies.forms.length > 0) { + pokemonConfig.formIndex = 0; + } + const config: EnemyPartyConfig = { + levelAdditiveMultiplier: 0.75, + pokemonConfigs: [pokemonConfig] + }; + return initBattleWithEnemyConfig(scene, config); + }) + .build()) + .withOption(new MysteryEncounterOptionBuilder() + .withOptionPhase(async (scene: BattleScene) => { + // Leave encounter with no rewards or exp + leaveEncounterWithoutBattle(scene, true); + return true; + }) + .build()) + .build(); diff --git a/src/data/mystery-encounters/dialogue/dark-deal-dialogue.ts b/src/data/mystery-encounters/dialogue/dark-deal-dialogue.ts new file mode 100644 index 00000000000..2fe86b04640 --- /dev/null +++ b/src/data/mystery-encounters/dialogue/dark-deal-dialogue.ts @@ -0,0 +1,48 @@ +import MysteryEncounterDialogue from "#app/data/mystery-encounters/dialogue/mystery-encounter-dialogue"; + +export const DarkDealDialogue: MysteryEncounterDialogue = { + intro: [ + { + text: "mysteryEncounter:dark_deal_intro_message" + }, + { + speaker: "mysteryEncounter:dark_deal_speaker", + text: "mysteryEncounter:dark_deal_intro_dialogue" + } + ], + encounterOptionsDialogue: { + title: "mysteryEncounter:dark_deal_title", + description: "mysteryEncounter:dark_deal_description", + query: "mysteryEncounter:dark_deal_query", + options: [ + { + buttonLabel: "mysteryEncounter:dark_deal_option_1_label", + buttonTooltip: "mysteryEncounter:dark_deal_option_1_tooltip", + selected: [ + { + speaker: "mysteryEncounter:dark_deal_speaker", + text: "mysteryEncounter:dark_deal_option_1_selected" + }, + { + text: "mysteryEncounter:dark_deal_option_1_selected_message" + } + ] + }, + { + buttonLabel: "mysteryEncounter:dark_deal_option_2_label", + buttonTooltip: "mysteryEncounter:dark_deal_option_2_tooltip", + selected: [ + { + speaker: "mysteryEncounter:dark_deal_speaker", + text: "mysteryEncounter:dark_deal_option_2_selected" + } + ] + } + ] + }, + outro: [ + { + text: "mysteryEncounter:dark_deal_outro" + } + ] +}; diff --git a/src/data/mystery-encounters/dialogue/fight-or-flight-dialogue.ts b/src/data/mystery-encounters/dialogue/fight-or-flight-dialogue.ts new file mode 100644 index 00000000000..300f6c45992 --- /dev/null +++ b/src/data/mystery-encounters/dialogue/fight-or-flight-dialogue.ts @@ -0,0 +1,38 @@ +import MysteryEncounterDialogue from "#app/data/mystery-encounters/dialogue/mystery-encounter-dialogue"; + +export const FightOrFlightDialogue: MysteryEncounterDialogue = { + intro: [ + { + text: "mysteryEncounter:fight_or_flight_intro_message" + } + ], + encounterOptionsDialogue: { + title: "mysteryEncounter:fight_or_flight_title", + description: "mysteryEncounter:fight_or_flight_description", + query: "mysteryEncounter:fight_or_flight_query", + options: [ + { + buttonLabel: "mysteryEncounter:fight_or_flight_option_1_label", + buttonTooltip: "mysteryEncounter:fight_or_flight_option_1_tooltip", + selected: [ + { + text: "mysteryEncounter:fight_or_flight_option_1_selected_message" + } + ] + }, + { + buttonLabel: "mysteryEncounter:fight_or_flight_option_2_label", + buttonTooltip: "mysteryEncounter:fight_or_flight_option_2_tooltip" + }, + { + buttonLabel: "mysteryEncounter:fight_or_flight_option_3_label", + buttonTooltip: "mysteryEncounter:fight_or_flight_option_3_tooltip", + selected: [ + { + text: "mysteryEncounter:fight_or_flight_option_3_selected" + } + ] + } + ] + } +}; diff --git a/src/data/mystery-encounters/dialogue/mysterious-challengers-dialogue.ts b/src/data/mystery-encounters/dialogue/mysterious-challengers-dialogue.ts new file mode 100644 index 00000000000..a5699736a36 --- /dev/null +++ b/src/data/mystery-encounters/dialogue/mysterious-challengers-dialogue.ts @@ -0,0 +1,57 @@ +import MysteryEncounterDialogue from "#app/data/mystery-encounters/dialogue/mystery-encounter-dialogue"; + +export const MysteriousChallengersDialogue: MysteryEncounterDialogue = { + intro: [ + { + text: "mysteryEncounter:mysterious_challengers_intro_message" + } + ], + encounterOptionsDialogue: { + title: "mysteryEncounter:mysterious_challengers_title", + description: "mysteryEncounter:mysterious_challengers_description", + query: "mysteryEncounter:mysterious_challengers_query", + options: [ + { + buttonLabel: "mysteryEncounter:mysterious_challengers_option_1_label", + buttonTooltip: "mysteryEncounter:mysterious_challengers_option_1_tooltip", + selected: [ + { + text: "mysteryEncounter:mysterious_challengers_option_selected_message" + } + ] + }, + { + buttonLabel: "mysteryEncounter:mysterious_challengers_option_2_label", + buttonTooltip: "mysteryEncounter:mysterious_challengers_option_2_tooltip", + selected: [ + { + text: "mysteryEncounter:mysterious_challengers_option_selected_message" + } + ] + }, + { + buttonLabel: "mysteryEncounter:mysterious_challengers_option_3_label", + buttonTooltip: "mysteryEncounter:mysterious_challengers_option_3_tooltip", + selected: [ + { + text: "mysteryEncounter:mysterious_challengers_option_selected_message" + } + ] + }, + { + buttonLabel: "mysteryEncounter:mysterious_challengers_option_4_label", + buttonTooltip: "mysteryEncounter:mysterious_challengers_option_4_tooltip", + selected: [ + { + text: "mysteryEncounter:mysterious_challengers_option_4_selected_message" + } + ] + } + ] + }, + outro: [ + { + text: "mysteryEncounter:mysterious_challengers_outro_win" + } + ] +}; diff --git a/src/data/mystery-encounters/dialogue/mysterious-chest-dialogue.ts b/src/data/mystery-encounters/dialogue/mysterious-chest-dialogue.ts new file mode 100644 index 00000000000..cc14670d5b4 --- /dev/null +++ b/src/data/mystery-encounters/dialogue/mysterious-chest-dialogue.ts @@ -0,0 +1,34 @@ +import MysteryEncounterDialogue from "#app/data/mystery-encounters/dialogue/mystery-encounter-dialogue"; + +export const MysteriousChestDialogue: MysteryEncounterDialogue = { + intro: [ + { + text: "mysteryEncounter:mysterious_chest_intro_message" + } + ], + encounterOptionsDialogue: { + title: "mysteryEncounter:mysterious_chest_title", + description: "mysteryEncounter:mysterious_chest_description", + query: "mysteryEncounter:mysterious_chest_query", + options: [ + { + buttonLabel: "mysteryEncounter:mysterious_chest_option_1_label", + buttonTooltip: "mysteryEncounter:mysterious_chest_option_1_tooltip", + selected: [ + { + text: "mysteryEncounter:mysterious_chest_option_1_selected_message" + } + ] + }, + { + buttonLabel: "mysteryEncounter:mysterious_chest_option_2_label", + buttonTooltip: "mysteryEncounter:mysterious_chest_option_2_tooltip", + selected: [ + { + text: "mysteryEncounter:mysterious_chest_option_2_selected_message" + } + ] + } + ] + } +}; diff --git a/src/data/mystery-encounters/dialogue/mystery-encounter-dialogue.ts b/src/data/mystery-encounters/dialogue/mystery-encounter-dialogue.ts new file mode 100644 index 00000000000..e390b0e706a --- /dev/null +++ b/src/data/mystery-encounters/dialogue/mystery-encounter-dialogue.ts @@ -0,0 +1,94 @@ +import {MysteryEncounterType} from "#enums/mystery-encounter-type"; +import {MysteriousChallengersDialogue} from "#app/data/mystery-encounters/dialogue/mysterious-challengers-dialogue"; +import {MysteriousChestDialogue} from "#app/data/mystery-encounters/dialogue/mysterious-chest-dialogue"; +import {DarkDealDialogue} from "#app/data/mystery-encounters/dialogue/dark-deal-dialogue"; +import {FightOrFlightDialogue} from "#app/data/mystery-encounters/dialogue/fight-or-flight-dialogue"; +import {TrainingSessionDialogue} from "#app/data/mystery-encounters/dialogue/training-session-dialogue"; +import { SleepingSnorlaxDialogue } from "./sleeping-snorlax-dialogue"; + +export class TextDisplay { + speaker?: TemplateStringsArray | `mysteryEncounter:${string}`; + text: TemplateStringsArray | `mysteryEncounter:${string}`; +} + +export class OptionTextDisplay { + buttonLabel: TemplateStringsArray | `mysteryEncounter:${string}`; + buttonTooltip?: TemplateStringsArray | `mysteryEncounter:${string}`; + disabledTooltip?: TemplateStringsArray | `mysteryEncounter:${string}`; + secondOptionPrompt?: TemplateStringsArray | `mysteryEncounter:${string}`; + selected?: TextDisplay[]; +} + +export class EncounterOptionsDialogue { + title: TemplateStringsArray | `mysteryEncounter:${string}`; + description: TemplateStringsArray | `mysteryEncounter:${string}`; + query?: TemplateStringsArray | `mysteryEncounter:${string}`; + options: [OptionTextDisplay, OptionTextDisplay, ...OptionTextDisplay[]]; // Options array with minimum 2 options +} + +export default class MysteryEncounterDialogue { + intro?: TextDisplay[]; + encounterOptionsDialogue: EncounterOptionsDialogue; + outro?: TextDisplay[]; +} + +export interface EncounterTypeDialogue { + [key: integer]: MysteryEncounterDialogue +} + + +/** + * Example MysteryEncounterDialogue object: + * + { + intro: [ + { + text: "this is a rendered as a message window (no title display)" + }, + { + speaker: "John" + text: "this is a rendered as a dialogue window (title "John" is displayed above text)" + } + ], + encounterOptionsDialogue: { + title: "This is the title displayed at top of encounter description box", + description: "This is the description in the middle of encounter description box", + query: "This is an optional question displayed at the bottom of the description box (keep it short)", + options: [ + { + buttonLabel: "Option #1 button label (keep these short)", + selected: [ // Optional dialogue windows displayed when specific option is selected and before functional logic for the option is executed + { + text: "You chose option #1 message" + }, + { + speaker: "John" + text: "So, you've chosen option #1! It's time to d-d-d-duel!" + } + ] + }, + { + buttonLabel: "Option #2" + } + ], + }, + outro: [ + { + text: "This message will be displayed at the very end of the encounter (i.e. post battle, post reward, etc.)" + } + ], + } + * + */ + + +export const allMysteryEncounterDialogue: EncounterTypeDialogue = {}; + +export function initMysteryEncounterDialogue() { + allMysteryEncounterDialogue[MysteryEncounterType.MYSTERIOUS_CHALLENGERS] = MysteriousChallengersDialogue; + allMysteryEncounterDialogue[MysteryEncounterType.MYSTERIOUS_CHEST] = MysteriousChestDialogue; + allMysteryEncounterDialogue[MysteryEncounterType.DARK_DEAL] = DarkDealDialogue; + allMysteryEncounterDialogue[MysteryEncounterType.FIGHT_OR_FLIGHT] = FightOrFlightDialogue; + allMysteryEncounterDialogue[MysteryEncounterType.TRAINING_SESSION] = TrainingSessionDialogue; + allMysteryEncounterDialogue[MysteryEncounterType.SLEEPING_SNORLAX] = SleepingSnorlaxDialogue; +} diff --git a/src/data/mystery-encounters/dialogue/sleeping-snorlax-dialogue.ts b/src/data/mystery-encounters/dialogue/sleeping-snorlax-dialogue.ts new file mode 100644 index 00000000000..0d9381d8278 --- /dev/null +++ b/src/data/mystery-encounters/dialogue/sleeping-snorlax-dialogue.ts @@ -0,0 +1,39 @@ +import MysteryEncounterDialogue from "#app/data/mystery-encounters/dialogue/mystery-encounter-dialogue"; + +export const SleepingSnorlaxDialogue: MysteryEncounterDialogue = { + intro: [ + { + text: "mysteryEncounter:sleeping_snorlax_intro_message" + } + ], + encounterOptionsDialogue: { + title: "mysteryEncounter:sleeping_snorlax_title", + description: "mysteryEncounter:sleeping_snorlax_description", + query: "mysteryEncounter:sleeping_snorlax_query", + options: [ + { + buttonLabel: "mysteryEncounter:sleeping_snorlax_option_1_label", + buttonTooltip: "mysteryEncounter:sleeping_snorlax_option_1_tooltip", + selected: [ + { + text: "mysteryEncounter:sleeping_snorlax_option_1_selected_message" + } + ] + }, + { + buttonLabel: "mysteryEncounter:sleeping_snorlax_option_2_label", + buttonTooltip: "mysteryEncounter:sleeping_snorlax_option_2_tooltip", + selected: [ + { + text: "mysteryEncounter:sleeping_snorlax_option_2_selected_message" + } + ] + }, + { + buttonLabel: "mysteryEncounter:sleeping_snorlax_option_3_label", + buttonTooltip: "mysteryEncounter:sleeping_snorlax_option_3_tooltip", + disabledTooltip: "mysteryEncounter:sleeping_snorlax_option_3_disabled_tooltip" + } + ] + } +}; diff --git a/src/data/mystery-encounters/dialogue/training-session-dialogue.ts b/src/data/mystery-encounters/dialogue/training-session-dialogue.ts new file mode 100644 index 00000000000..9f49fc389b6 --- /dev/null +++ b/src/data/mystery-encounters/dialogue/training-session-dialogue.ts @@ -0,0 +1,50 @@ +import MysteryEncounterDialogue from "#app/data/mystery-encounters/dialogue/mystery-encounter-dialogue"; + +export const TrainingSessionDialogue: MysteryEncounterDialogue = { + intro: [ + { + text: "mysteryEncounter:training_session_intro_message" + } + ], + encounterOptionsDialogue: { + title: "mysteryEncounter:training_session_title", + description: "mysteryEncounter:training_session_description", + query: "mysteryEncounter:training_session_query", + options: [ + { + buttonLabel: "mysteryEncounter:training_session_option_1_label", + buttonTooltip: "mysteryEncounter:training_session_option_1_tooltip", + selected: [ + { + text: "mysteryEncounter:training_session_option_selected_message" + } + ] + }, + { + buttonLabel: "mysteryEncounter:training_session_option_2_label", + buttonTooltip: "mysteryEncounter:training_session_option_2_tooltip", + secondOptionPrompt: "mysteryEncounter:training_session_option_2_select_prompt", + selected: [ + { + text: "mysteryEncounter:training_session_option_selected_message" + } + ] + }, + { + buttonLabel: "mysteryEncounter:training_session_option_3_label", + buttonTooltip: "mysteryEncounter:training_session_option_3_tooltip", + secondOptionPrompt: "mysteryEncounter:training_session_option_3_select_prompt", + selected: [ + { + text: "mysteryEncounter:training_session_option_selected_message" + } + ] + } + ] + }, + outro: [ + { + text: "mysteryEncounter:training_session_outro_win" + } + ] +}; diff --git a/src/data/mystery-encounters/fight-or-flight.ts b/src/data/mystery-encounters/fight-or-flight.ts new file mode 100644 index 00000000000..f447e77134e --- /dev/null +++ b/src/data/mystery-encounters/fight-or-flight.ts @@ -0,0 +1,116 @@ +import BattleScene from "../../battle-scene"; +import {ModifierTier} from "#app/modifier/modifier-tier"; +import { + EnemyPartyConfig, + initBattleWithEnemyConfig, + leaveEncounterWithoutBattle, queueEncounterMessage, + setCustomEncounterRewards, + showEncounterText +} from "#app/data/mystery-encounters/mystery-encounter-utils"; +import MysteryEncounter, {MysteryEncounterBuilder, MysteryEncounterTier} from "../mystery-encounter"; +import {MysteryEncounterType} from "#enums/mystery-encounter-type"; +import {WaveCountRequirement} from "../mystery-encounter-requirements"; +import {MysteryEncounterOptionBuilder} from "../mystery-encounter-option"; +import { + getPartyLuckValue, + getPlayerModifierTypeOptions, + ModifierPoolType, + ModifierTypeOption, + regenerateModifierPoolThresholds +} from "#app/modifier/modifier-type"; +import {BattlerTagType} from "#enums/battler-tag-type"; +import {StatChangePhase} from "#app/phases"; +import {BattleStat} from "#app/data/battle-stat"; +import Pokemon from "#app/field/pokemon"; +import {randSeedInt} from "#app/utils"; + +export const FightOrFlightEncounter: MysteryEncounter = new MysteryEncounterBuilder() + .withEncounterType(MysteryEncounterType.FIGHT_OR_FLIGHT) + .withEncounterTier(MysteryEncounterTier.COMMON) + .withIntroSpriteConfigs([]) // Set in onInit() + .withSceneRequirement(new WaveCountRequirement([10, 180])) // waves 10 to 180 + .withCatchAllowed(true) + .withHideWildIntroMessage(true) + .withOnInit((scene: BattleScene) => { + const instance = scene.currentBattle.mysteryEncounter; + + // Calculate boss mon + const bossSpecies = scene.arena.randomSpecies(scene.currentBattle.waveIndex, scene.currentBattle.waveIndex, 0, getPartyLuckValue(scene.getParty()), true); + const config: EnemyPartyConfig = { + levelAdditiveMultiplier: 1, + pokemonConfigs: [{species: bossSpecies, isBoss: true}] + }; + instance.enemyPartyConfigs = [config]; + + // Calculate item + // 10-60 GREAT, 60-110 ULTRA, 110-160 ROGUE, 160-180 MASTER + const tier = scene.currentBattle.waveIndex > 160 ? ModifierTier.MASTER : scene.currentBattle.waveIndex > 110 ? ModifierTier.ROGUE : scene.currentBattle.waveIndex > 60 ? ModifierTier.ULTRA : ModifierTier.GREAT; + regenerateModifierPoolThresholds(scene.getParty(), ModifierPoolType.PLAYER, 0); // refresh player item pool + const item = getPlayerModifierTypeOptions(1, scene.getParty(), [], { guaranteedModifierTiers: [tier]})[0]; + scene.currentBattle.mysteryEncounter.dialogueTokens.set(/@ec\{itemName\}/gi, item.type.name); + scene.currentBattle.mysteryEncounter.misc = item; + + instance.spriteConfigs = [ + { + spriteKey: item.type.iconImage, + fileRoot: "items", + hasShadow: false, + x: 35, + y: -5, + scale: 0.75, + isItem: true + }, + { + spriteKey: bossSpecies.speciesId.toString(), + fileRoot: "pokemon", + hasShadow: true, + tint: 0.25, + x: -5, + repeat: true + } + ]; + + return true; + }) + .withOption(new MysteryEncounterOptionBuilder() + .withOptionPhase(async (scene: BattleScene) => { + // Pick battle + const item = scene.currentBattle.mysteryEncounter.misc as ModifierTypeOption; + setCustomEncounterRewards(scene, { guaranteedModifierTypeOptions: [item], fillRemaining: false}); + await initBattleWithEnemyConfig(scene, scene.currentBattle.mysteryEncounter.enemyPartyConfigs[0]); + }) + .build()) + .withOption(new MysteryEncounterOptionBuilder() + .withOptionPhase(async (scene: BattleScene) => { + // Pick steal + const item = scene.currentBattle.mysteryEncounter.misc as ModifierTypeOption; + setCustomEncounterRewards(scene, { guaranteedModifierTypeOptions: [item], fillRemaining: false}); + + const roll = randSeedInt(16); + if (roll > 6) { + // Noticed and attacked by boss, gets +1 to all stats at start of fight (62.5%) + const config = scene.currentBattle.mysteryEncounter.enemyPartyConfigs[0]; + config.pokemonConfigs[0].tags = [BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON]; + config.pokemonConfigs[0].mysteryEncounterBattleEffects = (pokemon: Pokemon) => { + pokemon.scene.currentBattle.mysteryEncounter.dialogueTokens.set(/@ec\{enemyPokemon\}/gi, pokemon.name); + queueEncounterMessage(pokemon.scene, "mysteryEncounter:fight_or_flight_boss_enraged"); + pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [BattleStat.ATK, BattleStat.DEF, BattleStat.SPATK, BattleStat.SPDEF, BattleStat.SPD], 1)); + }; + await showEncounterText(scene, "mysteryEncounter:fight_or_flight_option_2_bad_result"); + await initBattleWithEnemyConfig(scene, config); + } else { + // Steal item (37.5%) + // Display result message then proceed to rewards + await showEncounterText(scene, "mysteryEncounter:fight_or_flight_option_2_good_result") + .then(() => leaveEncounterWithoutBattle(scene)); + } + }) + .build()) + .withOption(new MysteryEncounterOptionBuilder() + .withOptionPhase(async (scene: BattleScene) => { + // Leave encounter with no rewards or exp + leaveEncounterWithoutBattle(scene, true); + return true; + }) + .build()) + .build(); diff --git a/src/data/mystery-encounters/mysterious-challengers.ts b/src/data/mystery-encounters/mysterious-challengers.ts new file mode 100644 index 00000000000..165e26519ce --- /dev/null +++ b/src/data/mystery-encounters/mysterious-challengers.ts @@ -0,0 +1,151 @@ +import BattleScene from "../../battle-scene"; +import { ModifierTier } from "#app/modifier/modifier-tier"; +import {modifierTypes} from "#app/modifier/modifier-type"; +import { EnemyPartyConfig, initBattleWithEnemyConfig, setCustomEncounterRewards } from "#app/data/mystery-encounters/mystery-encounter-utils"; +import { MysteryEncounterType } from "#enums/mystery-encounter-type"; +import MysteryEncounter, {MysteryEncounterBuilder, MysteryEncounterTier} from "../mystery-encounter"; +import { MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; +import { WaveCountRequirement } from "../mystery-encounter-requirements"; +import { + trainerConfigs, + TrainerPartyCompoundTemplate, + TrainerPartyTemplate, + trainerPartyTemplates +} from "#app/data/trainer-config"; +import * as Utils from "../../utils"; +import {PartyMemberStrength} from "#enums/party-member-strength"; + +export const MysteriousChallengersEncounter: MysteryEncounter = new MysteryEncounterBuilder() + .withEncounterType(MysteryEncounterType.MYSTERIOUS_CHALLENGERS) + .withEncounterTier(MysteryEncounterTier.UNCOMMON) + .withIntroSpriteConfigs([]) // These are set in onInit() + .withSceneRequirement(new WaveCountRequirement([10, 180])) // waves 10 to 180 + .withOnInit((scene: BattleScene) => { + const instance = scene.currentBattle.mysteryEncounter; + // Calculates what trainers are available for battle in the encounter + + // Normal difficulty trainer is randomly pulled from biome + const normalTrainerType = scene.arena.randomTrainerType(scene.currentBattle.waveIndex); + const normalConfig = trainerConfigs[normalTrainerType].copy(); + let female = false; + if (normalConfig.hasGenders) { + female = !!(Utils.randSeedInt(2)); + } + const normalSpriteKey = normalConfig.getSpriteKey(female, normalConfig.doubleOnly); + instance.enemyPartyConfigs.push({ + trainerConfig: normalConfig, + female: female + }); + + // Hard difficulty trainer is another random trainer, but with AVERAGE_BALANCED config + // Number of mons is based off wave: 1-20 is 2, 20-40 is 3, etc. capping at 6 after wave 100 + const hardTrainerType = scene.arena.randomTrainerType(scene.currentBattle.waveIndex); + const hardTemplate = new TrainerPartyCompoundTemplate( + new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER, false, true), + new TrainerPartyTemplate(Math.min(Math.ceil(scene.currentBattle.waveIndex / 20), 5), PartyMemberStrength.AVERAGE, false, true)); + const hardConfig = trainerConfigs[hardTrainerType].copy(); + hardConfig.setPartyTemplates(hardTemplate); + female = false; + if (hardConfig.hasGenders) { + female = !!(Utils.randSeedInt(2)); + } + const hardSpriteKey = hardConfig.getSpriteKey(female, hardConfig.doubleOnly); + instance.enemyPartyConfigs.push({ + trainerConfig: hardConfig, + levelAdditiveMultiplier: 0.5, + female: female, + }); + + // Brutal trainer is pulled from pool of boss trainers (gym leaders) for the biome + // They are given an E4 template team, so will be stronger than usual boss encounter and always have 6 mons + const brutalTrainerType = scene.arena.randomTrainerType(scene.currentBattle.waveIndex, true); + const e4Template = trainerPartyTemplates.ELITE_FOUR; + const brutalConfig = trainerConfigs[brutalTrainerType].copy(); + brutalConfig.setPartyTemplates(e4Template); + brutalConfig.partyTemplateFunc = null; // Overrides gym leader party template func + female = false; + if (brutalConfig.hasGenders) { + female = !!(Utils.randSeedInt(2)); + } + const brutalSpriteKey = brutalConfig.getSpriteKey(female, brutalConfig.doubleOnly); + instance.enemyPartyConfigs.push({ + trainerConfig: brutalConfig, + levelAdditiveMultiplier: 1.1, + female: female + }); + + instance.spriteConfigs = [ + { + spriteKey: normalSpriteKey, + fileRoot: "trainer", + hasShadow: true, + tint: 1 + }, + { + spriteKey: hardSpriteKey, + fileRoot: "trainer", + hasShadow: true, + tint: 1 + }, + { + spriteKey: brutalSpriteKey, + fileRoot: "trainer", + hasShadow: true, + tint: 1 + } + ]; + + return true; + }) + .withOption(new MysteryEncounterOptionBuilder() + .withOptionPhase(async (scene: BattleScene) => { + const encounter = scene.currentBattle.mysteryEncounter; + // Spawn standard trainer battle with memory mushroom reward + const config: EnemyPartyConfig = encounter.enemyPartyConfigs[0]; + + setCustomEncounterRewards(scene, { guaranteedModifierTypeFuncs: [modifierTypes.TM_COMMON, modifierTypes.TM_GREAT, modifierTypes.MEMORY_MUSHROOM], fillRemaining: true }); + + // Seed offsets to remove possibility of different trainers having exact same teams + let ret; + scene.executeWithSeedOffset(() => { + ret = initBattleWithEnemyConfig(scene, config); + }, scene.currentBattle.waveIndex * 10); + return ret; + }) + .build()) + .withOption(new MysteryEncounterOptionBuilder() + .withOptionPhase(async (scene: BattleScene) => { + const encounter = scene.currentBattle.mysteryEncounter; + // Spawn hard fight with ULTRA/GREAT reward (can improve with luck) + const config: EnemyPartyConfig = encounter.enemyPartyConfigs[1]; + + setCustomEncounterRewards(scene, { guaranteedModifierTiers: [ModifierTier.ULTRA, ModifierTier.GREAT, ModifierTier.GREAT], fillRemaining: true }); + + // Seed offsets to remove possibility of different trainers having exact same teams + let ret; + scene.executeWithSeedOffset(() => { + ret = initBattleWithEnemyConfig(scene, config); + }, scene.currentBattle.waveIndex * 100); + return ret; + }) + .build()) + .withOption(new MysteryEncounterOptionBuilder() + .withOptionPhase(async (scene: BattleScene) => { + const encounter = scene.currentBattle.mysteryEncounter; + // Spawn brutal fight with ROGUE/ULTRA/GREAT reward (can improve with luck) + const config: EnemyPartyConfig = encounter.enemyPartyConfigs[2]; + + // To avoid player level snowballing from picking this option + encounter.expMultiplier = 0.9; + + setCustomEncounterRewards(scene, { guaranteedModifierTiers: [ModifierTier.ROGUE, ModifierTier.ULTRA, ModifierTier.GREAT], fillRemaining: true }); + + // Seed offsets to remove possibility of different trainers having exact same teams + let ret; + scene.executeWithSeedOffset(() => { + ret = initBattleWithEnemyConfig(scene, config); + }, scene.currentBattle.waveIndex * 1000); + return ret; + }) + .build()) + .build(); diff --git a/src/data/mystery-encounters/mysterious-chest.ts b/src/data/mystery-encounters/mysterious-chest.ts new file mode 100644 index 00000000000..8e31a433313 --- /dev/null +++ b/src/data/mystery-encounters/mysterious-chest.ts @@ -0,0 +1,95 @@ +import BattleScene from "../../battle-scene"; +import { ModifierTier } from "#app/modifier/modifier-tier"; +import { + getHighestLevelPlayerPokemon, + koPlayerPokemon, + leaveEncounterWithoutBattle, + queueEncounterMessage, + setCustomEncounterRewards, + showEncounterText +} from "#app/data/mystery-encounters/mystery-encounter-utils"; +import MysteryEncounter, {MysteryEncounterBuilder, MysteryEncounterTier} from "../mystery-encounter"; +import { MysteryEncounterType } from "#enums/mystery-encounter-type"; +import {WaveCountRequirement} from "../mystery-encounter-requirements"; +import { MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; +import {GameOverPhase} from "#app/phases"; +import {randSeedInt} from "#app/utils"; + +export const MysteriousChestEncounter: MysteryEncounter = new MysteryEncounterBuilder() + .withEncounterType(MysteryEncounterType.MYSTERIOUS_CHEST) + .withEncounterTier(MysteryEncounterTier.COMMON) + .withIntroSpriteConfigs([ + { + spriteKey: "chest_blue", + fileRoot: "mystery-encounters", + hasShadow: true, + x: 4, + y: 8, + disableAnimation: true // Re-enabled after option select + } + ]) + .withHideIntroVisuals(false) + .withSceneRequirement(new WaveCountRequirement([10, 180])) // waves 2 to 180 + .withOption(new MysteryEncounterOptionBuilder() + .withPreOptionPhase(async (scene: BattleScene) => { + // Play animation + const introVisuals = scene.currentBattle.mysteryEncounter.introVisuals; + introVisuals.spriteConfigs[0].disableAnimation = false; + introVisuals.playAnim(); + }) + .withOptionPhase(async (scene: BattleScene) => { + // Open the chest + const roll = randSeedInt(100); + if (roll > 60) { + // Choose between 2 COMMON / 2 GREAT tier items (40%) + setCustomEncounterRewards(scene, { guaranteedModifierTiers: [ModifierTier.COMMON, ModifierTier.COMMON, ModifierTier.GREAT, ModifierTier.GREAT]}); + // Display result message then proceed to rewards + queueEncounterMessage(scene, "mysteryEncounter:mysterious_chest_option_1_normal_result"); + leaveEncounterWithoutBattle(scene); + } else if (roll > 40) { + // Choose between 3 ULTRA tier items (20%) + setCustomEncounterRewards(scene, { guaranteedModifierTiers: [ModifierTier.ULTRA, ModifierTier.ULTRA, ModifierTier.ULTRA]}); + // Display result message then proceed to rewards + queueEncounterMessage(scene, "mysteryEncounter:mysterious_chest_option_1_good_result"); + leaveEncounterWithoutBattle(scene); + } else if (roll > 36) { + // Choose between 2 ROGUE tier items (4%) + setCustomEncounterRewards(scene, { guaranteedModifierTiers: [ModifierTier.ROGUE, ModifierTier.ROGUE]}); + // Display result message then proceed to rewards + queueEncounterMessage(scene, "mysteryEncounter:mysterious_chest_option_1_great_result"); + leaveEncounterWithoutBattle(scene); + } else if (roll > 35) { + // Choose 1 MASTER tier item (1%) + setCustomEncounterRewards(scene, { guaranteedModifierTiers: [ModifierTier.MASTER]}); + // Display result message then proceed to rewards + queueEncounterMessage(scene, "mysteryEncounter:mysterious_chest_option_1_amazing_result"); + leaveEncounterWithoutBattle(scene); + } else { + // Your highest level unfainted Pok�mon gets OHKO. Progress with no rewards (35%) + const highestLevelPokemon = getHighestLevelPlayerPokemon(scene, true); + koPlayerPokemon(highestLevelPokemon); + + scene.currentBattle.mysteryEncounter.dialogueTokens.set(/@ec\{pokeName\}/gi, highestLevelPokemon.name); + // Show which Pokemon was KOed, then leave encounter with no rewards + // Does this synchronously so that game over doesn't happen over result message + await showEncounterText(scene, "mysteryEncounter:mysterious_chest_option_1_bad_result") + .then(() => { + if (scene.getParty().filter(p => p.isAllowedInBattle()).length === 0) { + // All pokemon fainted, game over + scene.clearPhaseQueue(); + scene.unshiftPhase(new GameOverPhase(scene)); + } else { + leaveEncounterWithoutBattle(scene); + } + }); + } + }) + .build()) + .withOption(new MysteryEncounterOptionBuilder() + .withOptionPhase(async (scene: BattleScene) => { + // Leave encounter with no rewards or exp + leaveEncounterWithoutBattle(scene, true); + return true; + }) + .build()) + .build(); diff --git a/src/data/mystery-encounters/mystery-encounter-utils.ts b/src/data/mystery-encounters/mystery-encounter-utils.ts new file mode 100644 index 00000000000..74d8f0423d5 --- /dev/null +++ b/src/data/mystery-encounters/mystery-encounter-utils.ts @@ -0,0 +1,701 @@ +import i18next from "i18next"; +import {BattleType} from "#app/battle"; +import BattleScene from "../../battle-scene"; +import PokemonSpecies, {getPokemonSpecies, speciesStarters} from "../pokemon-species"; +import {MysteryEncounterVariant} from "../mystery-encounter"; +import {Status, StatusEffect} from "../status-effect"; +import {TrainerConfig, trainerConfigs, TrainerSlot} from "../trainer-config"; +import Pokemon, {FieldPosition, PlayerPokemon} from "#app/field/pokemon"; +import Trainer, {TrainerVariant} from "../../field/trainer"; +import {PokemonExpBoosterModifier} from "#app/modifier/modifier"; +import { + CustomModifierSettings, + ModifierPoolType, + ModifierTypeFunc, + PokemonHeldItemModifierType, + regenerateModifierPoolThresholds +} from "#app/modifier/modifier-type"; +import {BattleEndPhase, EggLapsePhase, ModifierRewardPhase, TrainerVictoryPhase} from "#app/phases"; +import {MysteryEncounterBattlePhase, MysteryEncounterRewardsPhase} from "#app/phases/mystery-encounter-phase"; +import * as Utils from "../../utils"; +import {isNullOrUndefined} from "#app/utils"; +import {SelectModifierPhase} from "#app/phases/select-modifier-phase"; +import {TrainerType} from "#enums/trainer-type"; +import {Species} from "#enums/species"; +import {Type} from "#app/data/type"; +import {BattlerTagType} from "#enums/battler-tag-type"; +import PokemonData from "#app/system/pokemon-data"; +import {Biome} from "#enums/biome"; +import {biomeLinks} from "#app/data/biomes"; +import {EncounterSceneRequirement} from "#app/data/mystery-encounter-requirements"; +import {Mode} from "#app/ui/ui"; +import {PartyOption, PartyUiMode} from "#app/ui/party-ui-handler"; +import {OptionSelectConfig, OptionSelectItem} from "#app/ui/abstact-option-select-ui-handler"; + +/** + * + * Will never remove the player's last non-fainted Pokemon (if they only have 1) + * Otherwise, picks a Pokemon completely at random and removes from the party + * @param scene + * @param isAllowedInBattle - default false. If true, only picks from unfainted mons. If there is only 1 unfainted mon left and doNotReturnLastAbleMon is also true, will return fainted mon + * @param doNotReturnLastAbleMon - If true, will never return the last unfainted pokemon in the party. Useful when this function is being used to determine what Pokemon to remove from the party (Don't want to remove last unfainted) + * @returns + */ +export function getRandomPlayerPokemon(scene: BattleScene, isAllowedInBattle: boolean = false, doNotReturnLastAbleMon: boolean = false): PlayerPokemon { + const party = scene.getParty(); + let chosenIndex: number; + let chosenPokemon: PlayerPokemon; + const unfaintedMons = party.filter(p => p.isAllowedInBattle()); + const faintedMons = party.filter(p => !p.isAllowedInBattle()); + + if (doNotReturnLastAbleMon && unfaintedMons.length === 1) { + chosenIndex = Utils.randSeedInt(faintedMons.length); + chosenPokemon = faintedMons.at(chosenIndex); + } else if (isAllowedInBattle) { + chosenIndex = Utils.randSeedInt(unfaintedMons.length); + chosenPokemon = unfaintedMons.at(chosenIndex); + } else { + chosenIndex = Utils.randSeedInt(party.length); + chosenPokemon = party.at(chosenIndex); + } + + return chosenPokemon; +} + + +export function getTokensFromScene(scene: BattleScene, reqs: EncounterSceneRequirement[]): Array<[RegExp, String]> { + const arr = []; + if (scene) { + for (const req of reqs) { + req.getMatchingDialogueToken(scene); + } + } + return arr; +} + +/** + * Ties are broken by whatever mon is closer to the front of the party + * @param scene + * @param unfainted - default false. If true, only picks from unfainted mons. + * @returns + */ +export function getHighestLevelPlayerPokemon(scene: BattleScene, unfainted: boolean = false): PlayerPokemon { + const party = scene.getParty(); + let pokemon: PlayerPokemon; + party.every(p => { + if (unfainted && p.isFainted()) { + return true; + } + + pokemon = pokemon ? pokemon?.level < p?.level ? p : pokemon : p; + return true; + }); + + return pokemon; +} + +/** + * Ties are broken by whatever mon is closer to the front of the party + * @param scene + * @param unfainted - default false. If true, only picks from unfainted mons. + * @returns + */ +export function getLowestLevelPlayerPokemon(scene: BattleScene, unfainted: boolean = false): PlayerPokemon { + const party = scene.getParty(); + let pokemon: PlayerPokemon; + party.every(p => { + if (unfainted && p.isFainted()) { + return true; + } + + pokemon = pokemon ? pokemon?.level > p?.level ? p : pokemon : p; + return true; + }); + + return pokemon; +} + +export function koPlayerPokemon(pokemon: PlayerPokemon) { + pokemon.hp = 0; + pokemon.trySetStatus(StatusEffect.FAINT); + pokemon.updateInfo(); +} + +export function getTextWithEncounterDialogueTokens(scene: BattleScene, textKey: TemplateStringsArray | `mysteryEncounter:${string}`): string { + if (isNullOrUndefined(textKey)) { + return null; + } + + let textString: string = i18next.t(textKey); + + const dialogueTokens = scene.currentBattle?.mysteryEncounter?.dialogueTokens; + + if (dialogueTokens) { + dialogueTokens.forEach((value, key) => { + textString = textString.replace(key, value); + }); + } + + return textString; +} + +/** + * Will queue a message in UI with injected encounter data tokens + * @param scene + * @param contentKey + */ +export function queueEncounterMessage(scene: BattleScene, contentKey: TemplateStringsArray | `mysteryEncounter:${string}`): void { + const text: string = getTextWithEncounterDialogueTokens(scene, contentKey); + scene.queueMessage(text, null, true); +} + +/** + * Will display a message in UI with injected encounter data tokens + * @param scene + * @param contentKey + */ +export function showEncounterText(scene: BattleScene, contentKey: TemplateStringsArray | `mysteryEncounter:${string}`): Promise { + return new Promise(resolve => { + const text: string = getTextWithEncounterDialogueTokens(scene, contentKey); + scene.ui.showText(text, null, () => resolve(), 0, true); + }); +} + +/** + * Will display a dialogue (with speaker title) in UI with injected encounter data tokens + * @param scene + * @param textContentKey + * @param speakerContentKey + * @param callback + */ +export function showEncounterDialogue(scene: BattleScene, textContentKey: TemplateStringsArray | `mysteryEncounter:${string}`, speakerContentKey: TemplateStringsArray | `mysteryEncounter:${string}`, callback?: Function) { + const text: string = getTextWithEncounterDialogueTokens(scene, textContentKey); + const speaker: string = getTextWithEncounterDialogueTokens(scene, speakerContentKey); + scene.ui.showDialogue(text, speaker, null, callback, 0, 0); +} + +/** + * + * NOTE: This returns ANY random species, including those locked behind eggs, etc. + * @param starterTiers + * @param excludedSpecies + * @param types + * @returns + */ +export function getRandomSpeciesByStarterTier(starterTiers: number | [number, number], excludedSpecies?: Species[], types?: Type[]): Species { + let min = starterTiers instanceof Array ? starterTiers[0] : starterTiers; + let max = starterTiers instanceof Array ? starterTiers[1] : starterTiers; + + let filteredSpecies = Object.entries(speciesStarters) + .map(s => parseInt(s[0])) + .filter(s => getPokemonSpecies(s) && !excludedSpecies.includes(s)); + + if (!isNullOrUndefined(types) && types.length > 0) { + filteredSpecies = filteredSpecies.filter(s => { + const species = getPokemonSpecies(s); + return types.includes(species.type1) || types.includes(species.type2); + }); + } + + // If no filtered mons exist at specified starter tiers, will expand starter search range until there are + // Starts by decrementing starter tier min until it is 0, then increments tier max up to 10 + let tryFilterStarterTiers = filteredSpecies.filter(s => s[1] >= min && s[1] <= max); + while (tryFilterStarterTiers.length === 0 || !(min === 0 && max === 10)) { + if (min > 0) { + min--; + } else { + max++; + } + + tryFilterStarterTiers = filteredSpecies.filter(s => s[1] >= min && s[1] <= max); + } + + if (tryFilterStarterTiers.length > 0) { + const index = Utils.randSeedInt(tryFilterStarterTiers.length); + return Phaser.Math.RND.shuffle(tryFilterStarterTiers)[index]; + } + + return Species.BULBASAUR; +} + +export class EnemyPokemonConfig { + species: PokemonSpecies; + isBoss: boolean = false; + bossSegments?: number; + bossSegmentModifier?: number; // Additive to the determined segment number + formIndex?: number; + level?: number; + modifierTypes?: PokemonHeldItemModifierType[]; + dataSource?: PokemonData; + tags?: BattlerTagType[]; + mysteryEncounterBattleEffects?: (pokemon: Pokemon) => void; + status?: StatusEffect; +} + +export class EnemyPartyConfig { + levelAdditiveMultiplier?: number = 0; // Formula for enemy: level += waveIndex / 10 * levelAdditive + doubleBattle?: boolean = false; + trainerType?: TrainerType; // Generates trainer battle solely off trainer type + trainerConfig?: TrainerConfig; // More customizable option for configuring trainer battle + pokemonConfigs?: EnemyPokemonConfig[]; + female?: boolean; // True for female trainer, false for male +} + +/** + * Generates an enemy party for a mystery encounter battle + * This will override and replace any standard encounter generation logic + * Useful for tailoring specific battles to mystery encounters + * @param scene - Battle Scene + * @param partyConfig - Can pass various customizable attributes for the enemy party, see EnemyPartyConfig + */ +export async function initBattleWithEnemyConfig(scene: BattleScene, partyConfig: EnemyPartyConfig): Promise { + const loaded = false; + const loadEnemyAssets = []; + + const battle = scene.currentBattle; + + let doubleBattle = partyConfig?.doubleBattle; + + // Trainer + const trainerType = partyConfig?.trainerType; + let trainerConfig = partyConfig?.trainerConfig; + if (trainerType || trainerConfig) { + scene.currentBattle.mysteryEncounter.encounterVariant = MysteryEncounterVariant.TRAINER_BATTLE; + if (scene.currentBattle.trainer) { + scene.currentBattle.trainer.setVisible(false); + scene.currentBattle.trainer.destroy(); + } + + trainerConfig = partyConfig?.trainerConfig ? partyConfig?.trainerConfig : trainerConfigs[trainerType]; + + const doubleTrainer = trainerConfig.doubleOnly || (trainerConfig.hasDouble && partyConfig.doubleBattle); + doubleBattle = doubleTrainer; + const trainerFemale = isNullOrUndefined(partyConfig.female) ? !!(Utils.randSeedInt(2)) : partyConfig.female; + const newTrainer = new Trainer(scene, trainerConfig.trainerType, doubleTrainer ? TrainerVariant.DOUBLE : trainerFemale ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT, null, null, null, trainerConfig); + newTrainer.x += 300; + newTrainer.setVisible(false); + scene.field.add(newTrainer); + scene.currentBattle.trainer = newTrainer; + loadEnemyAssets.push(newTrainer.loadAssets()); + + battle.enemyLevels = scene.currentBattle.trainer.getPartyLevels(scene.currentBattle.waveIndex); + } else { + // Wild + scene.currentBattle.mysteryEncounter.encounterVariant = MysteryEncounterVariant.WILD_BATTLE; + battle.enemyLevels = new Array(partyConfig?.pokemonConfigs?.length > 0 ? partyConfig?.pokemonConfigs?.length : doubleBattle ? 2 : 1).fill(null).map(() => scene.currentBattle.getLevelForWave()); + } + + scene.getEnemyParty().forEach(enemyPokemon => enemyPokemon.destroy()); + battle.enemyParty = []; + battle.double = doubleBattle; + + // ME levels are modified by an additive value that scales with wave index + // Base scaling: Every 10 waves, modifier gets +1 level + // This can be amplified or counteracted by setting levelAdditiveMultiplier in config + // levelAdditiveMultiplier value of 0.5 will halve the modifier scaling, 2 will double it, etc. + // Leaving null/undefined will disable level scaling + const mult = !isNullOrUndefined(partyConfig.levelAdditiveMultiplier) ? partyConfig.levelAdditiveMultiplier : 0; + const additive = Math.max(Math.round((scene.currentBattle.waveIndex / 10) * mult), 0); + battle.enemyLevels = battle.enemyLevels.map(level => level + additive); + + battle.enemyLevels.forEach((level, e) => { + let enemySpecies; + let dataSource; + let isBoss = false; + if (!loaded) { + if (trainerType || trainerConfig) { + battle.enemyParty[e] = battle.trainer.genPartyMember(e); + } else { + if (e < partyConfig?.pokemonConfigs?.length) { + const config = partyConfig?.pokemonConfigs?.[e]; + level = config.level ? config.level : level; + dataSource = config.dataSource; + enemySpecies = config.species; + isBoss = config.isBoss; + if (isBoss) { + scene.currentBattle.mysteryEncounter.encounterVariant = MysteryEncounterVariant.BOSS_BATTLE; + } + } else { + enemySpecies = scene.randomSpecies(battle.waveIndex, level, true); + } + + battle.enemyParty[e] = scene.addEnemyPokemon(enemySpecies, level, TrainerSlot.NONE, isBoss, dataSource); + } + } + + const enemyPokemon = scene.getEnemyParty()[e]; + + if (e < (doubleBattle ? 2 : 1)) { + enemyPokemon.setX(-66 + enemyPokemon.getFieldPositionOffset()[0]); + enemyPokemon.resetSummonData(); + } + + if (!loaded) { + scene.gameData.setPokemonSeen(enemyPokemon, true, !!(trainerType || trainerConfig)); + } + + if (e < partyConfig?.pokemonConfigs?.length) { + const config = partyConfig?.pokemonConfigs?.[e]; + + // Generate new id in case using data source + if (config.dataSource) { + enemyPokemon.id = Utils.randSeedInt(4294967296); + } + + // Set form + if (!isNullOrUndefined(config.formIndex)) { + enemyPokemon.formIndex = config.formIndex; + } + + // Set Boss + if (config.isBoss) { + let segments = !isNullOrUndefined(config.bossSegments) ? config.bossSegments : scene.getEncounterBossSegments(scene.currentBattle.waveIndex, level, enemySpecies, true); + if (!isNullOrUndefined(config.bossSegmentModifier)) { + segments += config.bossSegmentModifier; + } + enemyPokemon.setBoss(true, segments); + } + + // Set Status + if (partyConfig.pokemonConfigs[e].status) { + // Default to cureturn 3 for sleep + const cureTurn = partyConfig.pokemonConfigs[e].status === StatusEffect.SLEEP ? 3: null; + enemyPokemon.status = new Status(partyConfig.pokemonConfigs[e].status, 0, cureTurn); + } + + // Set tags + if (config.tags?.length > 0) { + const tags = config.tags; + tags.forEach(tag => enemyPokemon.addTag(tag)); + // mysteryEncounterBattleEffects can be used IFF MYSTERY_ENCOUNTER_POST_SUMMON tag is applied + enemyPokemon.summonData.mysteryEncounterBattleEffects = config.mysteryEncounterBattleEffects; + + // Requires re-priming summon data so that tags are not cleared on SummonPhase + enemyPokemon.primeSummonData(enemyPokemon.summonData); + } + + enemyPokemon.initBattleInfo(); + } + + loadEnemyAssets.push(enemyPokemon.loadAssets()); + + console.log(enemyPokemon.name, enemyPokemon.species.speciesId, enemyPokemon.stats); + }); + + scene.pushPhase(new MysteryEncounterBattlePhase(scene)); + + await Promise.all(loadEnemyAssets); + battle.enemyParty.forEach((enemyPokemon_2, e_1) => { + if (e_1 < (doubleBattle ? 2 : 1)) { + enemyPokemon_2.setVisible(false); + if (battle.double) { + enemyPokemon_2.setFieldPosition(e_1 ? FieldPosition.RIGHT : FieldPosition.LEFT); + } + // Spawns at current visible field instead of on "next encounter" field (off screen to the left) + enemyPokemon_2.x += 300; + } + }); + if (!loaded) { + regenerateModifierPoolThresholds(scene.getEnemyField(), battle.battleType === BattleType.TRAINER ? ModifierPoolType.TRAINER : ModifierPoolType.WILD); + const customModifiers = partyConfig?.pokemonConfigs?.map(config => config?.modifierTypes); + scene.generateEnemyModifiers(customModifiers); + } +} + +/** + * Will initialize reward phases to follow the mystery encounter + * Can have shop displayed or skipped + * @param scene - Battle Scene + * @param customShopRewards - adds a shop phase with the specified rewards / reward tiers + * @param nonShopRewards - will add a non-shop reward phase for each specified item/modifier (can happen in addition to a shop) + * @param preRewardsCallback - can execute an arbitrary callback before the new phases if necessary (useful for updating items/party/injecting new phases before MysteryEncounterRewardsPhase) + */ +export function setCustomEncounterRewards(scene: BattleScene, customShopRewards?: CustomModifierSettings, nonShopRewards?: ModifierTypeFunc[], preRewardsCallback?: Function) { + scene.currentBattle.mysteryEncounter.doEncounterRewards = (scene: BattleScene) => { + if (preRewardsCallback) { + preRewardsCallback(); + } + + if (customShopRewards) { + scene.unshiftPhase(new SelectModifierPhase(scene, 0, null, customShopRewards)); + } else { + scene.tryRemovePhase(p => p instanceof SelectModifierPhase); + } + + if (nonShopRewards?.length > 0) { + nonShopRewards.forEach((reward) => { + scene.unshiftPhase(new ModifierRewardPhase(scene, reward)); + }); + } else { + while (!Utils.isNullOrUndefined(scene.findPhase(p => p instanceof ModifierRewardPhase))) { + scene.tryRemovePhase(p => p instanceof ModifierRewardPhase); + } + } + + return true; + }; +} + +/** + * + * @param scene + * @param onPokemonSelected - Any logic that needs to be performed when Pokemon is chosen + * If a second option needs to be selected, onPokemonSelected should return a OptionSelectItem[] object + * @param onPokemonNotSelected - Any logic that needs to be performed if no Pokemon is chosen + */ +export function selectPokemonForOption(scene: BattleScene, onPokemonSelected: (pokemon: PlayerPokemon) => void | OptionSelectItem[], onPokemonNotSelected?: () => void): Promise { + return new Promise(resolve => { + // Open party screen to choose pokemon to train + scene.ui.setMode(Mode.PARTY, PartyUiMode.SELECT, -1, (slotIndex: integer, option: PartyOption) => { + if (slotIndex < scene.getParty().length) { + scene.ui.setMode(Mode.MYSTERY_ENCOUNTER).then(() => { + const pokemon = scene.getParty()[slotIndex]; + const secondaryOptions = onPokemonSelected(pokemon); + if (!secondaryOptions) { + scene.currentBattle.mysteryEncounter.dialogueTokens.set(/@ec\{selectedPokemon\}/gi, pokemon.name); + resolve(true); + return; + } + + // There is a second option to choose after selecting the Pokemon + scene.ui.setMode(Mode.MESSAGE).then(() => { + const displayOptions = () => { + // Always appends a cancel option to bottom of options + const fullOptions = secondaryOptions.map(option => { + // Update handler to resolve promise + const onSelect = option.handler; + option.handler = () => { + onSelect(); + scene.currentBattle.mysteryEncounter.dialogueTokens.set(/@ec\{selectedPokemon\}/gi, pokemon.name); + resolve(true); + return true; + }; + return option; + }).concat({ + label: i18next.t("menu:cancel"), + handler: () => { + scene.ui.clearText(); + scene.ui.setMode(Mode.MYSTERY_ENCOUNTER); + resolve(false); + return true; + }, + onHover: () => { + scene.ui.showText("Return to encounter option select."); + } + }); + + const config: OptionSelectConfig = { + options: fullOptions, + maxOptions: 7, + yOffset: 0, + supportHover: true + }; + scene.ui.setModeWithoutClear(Mode.OPTION_SELECT, config, null, true); + }; + + const textPromptKey = scene.currentBattle.mysteryEncounter.selectedOption.dialogue.secondOptionPrompt; + if (!textPromptKey) { + displayOptions(); + } else { + const secondOptionSelectPrompt = getTextWithEncounterDialogueTokens(scene, textPromptKey); + scene.ui.showText(secondOptionSelectPrompt, null, displayOptions, null, true); + } + }); + }); + } else { + scene.ui.setMode(Mode.MYSTERY_ENCOUNTER).then(() => { + if (onPokemonNotSelected) { + onPokemonNotSelected(); + } + resolve(false); + }); + } + }); + }); +} + +/** + * Will initialize exp phases to follow the mystery encounter (in addition to any combat or other exp earned) + * Exp earned will be a simple function that linearly scales with wave index, that can be increased or decreased by the expMultiplier + * Exp Share will have no effect (so no accounting for what mon is "on the field") + * Exp Balance will still function as normal + * @param scene - Battle Scene + * @param expMultiplier - default is 100, can be increased or decreased as desired + */ +export function setEncounterExp(scene: BattleScene, expMultiplier: number = 100) { + //const expBalanceModifier = scene.findModifier(m => m instanceof ExpBalanceModifier) as ExpBalanceModifier; + const expVal = scene.currentBattle.waveIndex * expMultiplier; + const pokemonExp = new Utils.NumberHolder(expVal); + const partyMemberExp = []; + + const party = scene.getParty(); + party.forEach(pokemon => { + scene.applyModifiers(PokemonExpBoosterModifier, true, pokemon, pokemonExp); + partyMemberExp.push(Math.floor(pokemonExp.value)); + }); + + // TODO + //if (expBalanceModifier) { + // let totalLevel = 0; + // let totalExp = 0; + // expPartyMembers.forEach((expPartyMember, epm) => { + // totalExp += partyMemberExp[epm]; + // totalLevel += expPartyMember.level; + // }); + + // const medianLevel = Math.floor(totalLevel / expPartyMembers.length); + + // const recipientExpPartyMemberIndexes = []; + // expPartyMembers.forEach((expPartyMember, epm) => { + // if (expPartyMember.level <= medianLevel) { + // recipientExpPartyMemberIndexes.push(epm); + // } + // }); + + // const splitExp = Math.floor(totalExp / recipientExpPartyMemberIndexes.length); + + // expPartyMembers.forEach((_partyMember, pm) => { + // partyMemberExp[pm] = Phaser.Math.Linear(partyMemberExp[pm], recipientExpPartyMemberIndexes.indexOf(pm) > -1 ? splitExp : 0, 0.2 * expBalanceModifier.getStackCount()); + // }); + //} +} + +/** + * Can be used to exit an encounter without any battles or followup + * Will skip any shops and rewards, and queue the next encounter phase as normal + * @param scene + * @param addHealPhase - when true, will add a shop phase to end of encounter with 0 rewards but healing items are available + */ +export function leaveEncounterWithoutBattle(scene: BattleScene, addHealPhase: boolean = false) { + scene.currentBattle.mysteryEncounter.encounterVariant = MysteryEncounterVariant.NO_BATTLE; + scene.clearPhaseQueue(); + scene.clearPhaseQueueSplice(); + handleMysteryEncounterVictory(scene, addHealPhase); +} + +export function handleMysteryEncounterVictory(scene: BattleScene, addHealPhase: boolean = false) { + if (scene.currentBattle.mysteryEncounter.encounterVariant === MysteryEncounterVariant.NO_BATTLE) { + scene.pushPhase(new EggLapsePhase(scene)); + scene.pushPhase(new MysteryEncounterRewardsPhase(scene, addHealPhase)); + } else if (!scene.getEnemyParty().find(p => scene.currentBattle.mysteryEncounter.encounterVariant !== MysteryEncounterVariant.TRAINER_BATTLE ? p.isOnField() : !p?.isFainted(true))) { + scene.pushPhase(new BattleEndPhase(scene)); + if (scene.currentBattle.mysteryEncounter.encounterVariant === MysteryEncounterVariant.TRAINER_BATTLE) { + scene.pushPhase(new TrainerVictoryPhase(scene)); + } + if (scene.gameMode.isEndless || !scene.gameMode.isWaveFinal(scene.currentBattle.waveIndex)) { + scene.pushPhase(new EggLapsePhase(scene)); + scene.pushPhase(new MysteryEncounterRewardsPhase(scene, addHealPhase)); + } + } +} + +/** + * TODO: remove once encounter spawn rate is finalized + * Just a helper function to calculate aggregate stats for MEs in a Classic run + * @param scene + * @param baseSpawnWeight + */ +export function calculateMEAggregateStats(scene: BattleScene, baseSpawnWeight: number) { + const numRuns = 1000; + let run = 0; + + const calculateNumEncounters = (): number[] => { + let encounterRate = baseSpawnWeight; + const numEncounters = [0, 0, 0, 0]; + let currentBiome = Biome.TOWN; + let currentArena = scene.newArena(currentBiome); + for (let i = 10; i < 180; i++) { + // Boss + if (i % 10 === 0) { + continue; + } + + // New biome + if (i % 10 === 1) { + if (Array.isArray(biomeLinks[currentBiome])) { + let biomes: Biome[]; + scene.executeWithSeedOffset(() => { + biomes = (biomeLinks[currentBiome] as (Biome | [Biome, integer])[]) + .filter(b => !Array.isArray(b) || !Utils.randSeedInt(b[1])) + .map(b => !Array.isArray(b) ? b : b[0]); + }, i); + currentBiome = biomes[Utils.randSeedInt(biomes.length)]; + } else if (biomeLinks.hasOwnProperty(currentBiome)) { + currentBiome = (biomeLinks[currentBiome] as Biome); + } else { + if (!(i % 50)) { + currentBiome = Biome.END; + } else { + currentBiome = scene.generateRandomBiome(i); + } + } + + currentArena = scene.newArena(currentBiome); + } + + // Fixed battle + if (scene.gameMode.isFixedBattle(i)) { + continue; + } + + // Trainer + if (scene.gameMode.isWaveTrainer(i, currentArena)) { + continue; + } + + // Otherwise, roll encounter + + const roll = Utils.randSeedInt(256); + + // If total number of encounters is lower than expected for the run, slightly favor a new encounter + // Do the reverse as well + const expectedEncountersByFloor = 8 / (180 - 10) * i; + const currentRunDiffFromAvg = expectedEncountersByFloor - numEncounters.reduce((a, b) => a + b); + const favoredEncounterRate = encounterRate + currentRunDiffFromAvg * 5; + + if (roll < favoredEncounterRate) { + encounterRate = baseSpawnWeight; + + // Calculate encounter rarity + // Common / Uncommon / Rare / Super Rare (base is out of 128) + const tierWeights = [61, 40, 21, 6]; + + // Adjust tier weights by currently encountered events (pity system that lowers odds of multiple common/uncommons) + tierWeights[0] = tierWeights[0] - 6 * numEncounters[0]; + tierWeights[1] = tierWeights[1] - 4 * numEncounters[1]; + + const totalWeight = tierWeights.reduce((a, b) => a + b); + const tierValue = Utils.randSeedInt(totalWeight); + const commonThreshold = totalWeight - tierWeights[0]; // 64 - 32 = 32 + const uncommonThreshold = totalWeight - tierWeights[0] - tierWeights[1]; // 64 - 32 - 16 = 16 + const rareThreshold = totalWeight - tierWeights[0] - tierWeights[1] - tierWeights[2]; // 64 - 32 - 16 - 10 = 6 + + tierValue > commonThreshold ? ++numEncounters[0] : tierValue > uncommonThreshold ? ++numEncounters[1] : tierValue > rareThreshold ? ++numEncounters[2] : ++numEncounters[3]; + } else { + encounterRate++; + } + } + + return numEncounters; + }; + + const runs = []; + while (run < numRuns) { + scene.executeWithSeedOffset(() => { + const numEncounters = calculateNumEncounters(); + runs.push(numEncounters); + }, 1000 * run); + run++; + } + + const n = runs.length; + const totalEncountersInRun = runs.map(run => run.reduce((a, b) => a + b)); + const totalMean = totalEncountersInRun.reduce((a, b) => a + b) / n; + const totalStd = Math.sqrt(totalEncountersInRun.map(x => Math.pow(x - totalMean, 2)).reduce((a, b) => a + b) / n); + const commonMean = runs.reduce((a, b) => a + b[0], 0) / n; + const uncommonMean = runs.reduce((a, b) => a + b[1], 0) / n; + const rareMean = runs.reduce((a, b) => a + b[2], 0) / n; + const superRareMean = runs.reduce((a, b) => a + b[3], 0) / n; + + console.log(`Starting weight: ${baseSpawnWeight}\nAverage MEs per run: ${totalMean}\nStandard Deviation: ${totalStd}\nAvg Commons: ${commonMean}\nAvg Uncommons: ${uncommonMean}\nAvg Rares: ${rareMean}\nAvg Super Rares: ${superRareMean}`); +} diff --git a/src/data/mystery-encounters/mystery-encounters.ts b/src/data/mystery-encounters/mystery-encounters.ts new file mode 100644 index 00000000000..81d69c808d3 --- /dev/null +++ b/src/data/mystery-encounters/mystery-encounters.ts @@ -0,0 +1,143 @@ +import MysteryEncounter from "../mystery-encounter"; +import {DarkDealEncounter} from "./dark-deal"; +import {MysteriousChallengersEncounter} from "./mysterious-challengers"; +import {MysteriousChestEncounter} from "./mysterious-chest"; +import {FightOrFlightEncounter} from "#app/data/mystery-encounters/fight-or-flight"; +import {TrainingSessionEncounter} from "#app/data/mystery-encounters/training-session"; +import { Biome } from "#app/enums/biome"; +import { SleepingSnorlaxEncounter } from "./sleeping-snorlax"; +import { MysteryEncounterType } from "#enums/mystery-encounter-type"; + +export const BASE_MYSTYERY_ENCOUNTER_WEIGHT = 3; + +export const allMysteryEncounters : {[encounterType:string]: MysteryEncounter} = {}; + +// Add MysteryEncounterType to biomes to enable it exclusively for those biomes +// To enable an encounter in all biomes, do not add to this map +export const mysteryEncountersByBiome = new Map([ + [Biome.TOWN, [ + ]], + [Biome.PLAINS,[ + + ]], + [Biome.GRASS, [ + MysteryEncounterType.SLEEPING_SNORLAX + ]], + [Biome.TALL_GRASS, [ + + ]], + [Biome.METROPOLIS, [ + + ]], + [Biome.FOREST, [ + MysteryEncounterType.SLEEPING_SNORLAX + ]], + + [Biome.SEA, [ + + ]], + [Biome.SWAMP, [ + + ]], + [Biome.BEACH, [ + + ]], + [Biome.LAKE, [ + + ]], + [Biome.SEABED, [ + + ]], + [Biome.MOUNTAIN, [ + MysteryEncounterType.SLEEPING_SNORLAX + ]], + [Biome.BADLANDS, [ + + ]], + [Biome.CAVE, [ + MysteryEncounterType.SLEEPING_SNORLAX + ]], + [Biome.DESERT, [ + + ]], + [Biome.ICE_CAVE, [ + + ]], + [Biome.MEADOW, [ + + ]], + [Biome.POWER_PLANT, [ + + ]], + [Biome.VOLCANO, [ + + ]], + [Biome.GRAVEYARD, [ + + ]], + [Biome.DOJO, [ + + ]], + [Biome.FACTORY, [ + + ]], + [Biome.RUINS, [ + + ]], + [Biome.WASTELAND, [ + + ]], + [Biome.ABYSS, [ + + ]], + [Biome.SPACE, [ + + ]], + [Biome.CONSTRUCTION_SITE, [ + + ]], + [Biome.JUNGLE, [ + + ]], + [Biome.FAIRY_CAVE, [ + + ]], + [Biome.TEMPLE, [ + + ]], + [Biome.SLUM, [ + + ]], + [Biome.SNOWY_FOREST, [ + + ]], + [Biome.ISLAND, [ + + ]], + [Biome.LABORATORY, [ + + ]] +]); + +// Only add your MysterEncounter here if you want it to be in every biome. +// We recommend designing biome-specific encounters for better flavor and variance +export function initMysteryEncounters() { + allMysteryEncounters[MysteryEncounterType.MYSTERIOUS_CHALLENGERS] = MysteriousChallengersEncounter; + allMysteryEncounters[MysteryEncounterType.MYSTERIOUS_CHEST] = MysteriousChestEncounter; + allMysteryEncounters[MysteryEncounterType.DARK_DEAL] = DarkDealEncounter; + allMysteryEncounters[MysteryEncounterType.FIGHT_OR_FLIGHT] = FightOrFlightEncounter; + allMysteryEncounters[MysteryEncounterType.TRAINING_SESSION] = TrainingSessionEncounter; + allMysteryEncounters[MysteryEncounterType.SLEEPING_SNORLAX] = SleepingSnorlaxEncounter; + + // Append encounters that can occur in any biome to biome map + const anyBiomeEncounters: MysteryEncounterType[] = Object.keys(MysteryEncounterType).filter(e => !isNaN(Number(e))).map(k => Number(k) as MysteryEncounterType); + mysteryEncountersByBiome.forEach(biomeEncounters => { + biomeEncounters.forEach(e => { + if (anyBiomeEncounters.includes(e)) { + anyBiomeEncounters.splice(anyBiomeEncounters.indexOf(e), 1); + } + }); + }); + + mysteryEncountersByBiome.forEach(biomeEncounters => biomeEncounters.push(...anyBiomeEncounters)); +} diff --git a/src/data/mystery-encounters/sleeping-snorlax.ts b/src/data/mystery-encounters/sleeping-snorlax.ts new file mode 100644 index 00000000000..fde9750a029 --- /dev/null +++ b/src/data/mystery-encounters/sleeping-snorlax.ts @@ -0,0 +1,109 @@ +import BattleScene from "../../battle-scene"; +import { + EnemyPartyConfig, + EnemyPokemonConfig, + initBattleWithEnemyConfig, + leaveEncounterWithoutBattle, queueEncounterMessage, + setCustomEncounterRewards +} from "./mystery-encounter-utils"; +import MysteryEncounter, {MysteryEncounterBuilder, MysteryEncounterTier} from "../mystery-encounter"; +import * as Utils from "../../utils"; +import {MysteryEncounterType} from "#enums/mystery-encounter-type"; +import {MoveRequirement, WaveCountRequirement} from "../mystery-encounter-requirements"; +import {MysteryEncounterOptionBuilder} from "../mystery-encounter-option"; +import { + ModifierTypeGenerator, + ModifierTypeOption, + modifierTypes +} from "#app/modifier/modifier-type"; +import { getPokemonSpecies } from "../pokemon-species"; +import { Species } from "#enums/species"; +import { Status, StatusEffect } from "../status-effect"; +import { Moves } from "#enums/moves"; +import { BerryType } from "#enums/berry-type"; + +export const SleepingSnorlaxEncounter: MysteryEncounter = new MysteryEncounterBuilder() + .withEncounterType(MysteryEncounterType.SLEEPING_SNORLAX) + .withEncounterTier(MysteryEncounterTier.RARE) + .withIntroSpriteConfigs([ + { + spriteKey: Species.SNORLAX.toString(), + fileRoot: "pokemon", + hasShadow: true, + tint: 0.25, + repeat: true + } + ]) + .withSceneRequirement(new WaveCountRequirement([10, 180])) // waves 10 to 180 + .withCatchAllowed(true) + .withHideWildIntroMessage(true) + .withOnInit((scene: BattleScene) => { + const instance = scene.currentBattle.mysteryEncounter; + console.log(instance); + + // Calculate boss mon + const bossSpecies = getPokemonSpecies(Species.SNORLAX); + const pokemonConfig: EnemyPokemonConfig = { + species: bossSpecies, + isBoss: true, + status: StatusEffect.SLEEP + }; + const config: EnemyPartyConfig = { + levelAdditiveMultiplier: 2, + pokemonConfigs: [pokemonConfig] + }; + instance.enemyPartyConfigs = [config]; + return true; + }) + .withOption(new MysteryEncounterOptionBuilder() + .withOptionPhase(async (scene: BattleScene) => { + // Pick battle + // TODO: do we want special rewards for this? + // setCustomEncounterRewards(scene, { guaranteedModifierTypeFuncs: [modifierTypes.LEFTOVERS], fillRemaining: true}); + await initBattleWithEnemyConfig(scene, scene.currentBattle.mysteryEncounter.enemyPartyConfigs[0]); + }) + .build()) + .withOption(new MysteryEncounterOptionBuilder() + .withOptionPhase(async (scene: BattleScene) => { + const instance = scene.currentBattle.mysteryEncounter; + let roll:integer; + scene.executeWithSeedOffset(() => { + roll = Utils.randSeedInt(16, 0); + }, scene.currentBattle.waveIndex); + console.log(roll); + if (roll > 4) { + // Fall asleep and get a sitrus berry (75%) + const p = instance.primaryPokemon; + p.status = new Status(StatusEffect.SLEEP, 0, 3); + p.updateInfo(true); + const sitrus = (modifierTypes.BERRY?.() as ModifierTypeGenerator).generateType(scene.getParty(), [BerryType.SITRUS]); + + setCustomEncounterRewards(scene, { guaranteedModifierTypeOptions: [new ModifierTypeOption(sitrus, 0)], fillRemaining: false}); + queueEncounterMessage(scene, "mysteryEncounter:sleeping_snorlax_option_2_bad_result"); + leaveEncounterWithoutBattle(scene); + } else { + // Heal to full (25%) + for (const pokemon of scene.getParty()) { + pokemon.hp = pokemon.getMaxHp(); + pokemon.resetStatus(); + for (const move of pokemon.moveset) { + move.ppUsed = 0; + } + pokemon.updateInfo(true); + } + + queueEncounterMessage(scene, "mysteryEncounter:sleeping_snorlax_option_2_good_result"); + leaveEncounterWithoutBattle(scene); + } + }) + .build()) + .withOption(new MysteryEncounterOptionBuilder() + .withPrimaryPokemonRequirement(new MoveRequirement([Moves.PLUCK, Moves.COVET, Moves.KNOCK_OFF, Moves.THIEF, Moves.TRICK, Moves.SWITCHEROO])) + .withOptionPhase(async (scene: BattleScene) => { + // Leave encounter with no rewards or exp + setCustomEncounterRewards(scene, { guaranteedModifierTypeFuncs: [modifierTypes.LEFTOVERS], fillRemaining: false}); + queueEncounterMessage(scene, "mysteryEncounter:sleeping_snorlax_option_3_good_result"); + leaveEncounterWithoutBattle(scene); + }) + .build()) + .build(); diff --git a/src/data/mystery-encounters/training-session.ts b/src/data/mystery-encounters/training-session.ts new file mode 100644 index 00000000000..8fb0fcde3ec --- /dev/null +++ b/src/data/mystery-encounters/training-session.ts @@ -0,0 +1,306 @@ +import BattleScene from "../../battle-scene"; +import { + EnemyPartyConfig, + getTextWithEncounterDialogueTokens, + initBattleWithEnemyConfig, + selectPokemonForOption, + setCustomEncounterRewards +} from "#app/data/mystery-encounters/mystery-encounter-utils"; +import {MysteryEncounterType} from "#enums/mystery-encounter-type"; +import MysteryEncounter, {MysteryEncounterBuilder, MysteryEncounterTier} from "../mystery-encounter"; +import {MysteryEncounterOptionBuilder} from "../mystery-encounter-option"; +import {WaveCountRequirement} from "../mystery-encounter-requirements"; +import {PlayerPokemon} from "#app/field/pokemon"; +import PokemonData from "#app/system/pokemon-data"; +import {randSeedShuffle} from "#app/utils"; +import {getNatureName, Nature} from "#app/data/nature"; +import {BattlerTagType} from "#enums/battler-tag-type"; +import {OptionSelectItem} from "#app/ui/abstact-option-select-ui-handler"; +import {PokemonHeldItemModifier} from "#app/modifier/modifier"; +import {PokemonHeldItemModifierType} from "#app/modifier/modifier-type"; +import {Ability, allAbilities} from "#app/data/ability"; +import {speciesStarters} from "#app/data/pokemon-species"; +import {AbilityAttr} from "#app/system/game-data"; +import {Stat} from "#app/data/pokemon-stat"; +import {pokemonInfo} from "#app/locales/en/pokemon-info"; + +export const TrainingSessionEncounter: MysteryEncounter = new MysteryEncounterBuilder() + .withEncounterType(MysteryEncounterType.TRAINING_SESSION) + .withEncounterTier(MysteryEncounterTier.RARE) + .withIntroSpriteConfigs([ + { + spriteKey: "training_gear", + fileRoot: "mystery-encounters", + hasShadow: true, + y: 3 + } + ]) + .withSceneRequirement(new WaveCountRequirement([10, 180])) // waves 10 to 180 + .withHideWildIntroMessage(true) + .withOption(new MysteryEncounterOptionBuilder() + .withPreOptionPhase(async (scene: BattleScene): Promise => { + const encounter = scene.currentBattle.mysteryEncounter; + const onPokemonSelected = (pokemon: PlayerPokemon) => { + encounter.misc = { + playerPokemon: pokemon + }; + }; + + return selectPokemonForOption(scene, onPokemonSelected); + }) + .withOptionPhase(async (scene: BattleScene) => { + const encounter = scene.currentBattle.mysteryEncounter; + const playerPokemon: PlayerPokemon = encounter.misc.playerPokemon; + + // Spawn light training session with chosen pokemon + // Every 50 waves, add +1 boss segment, capping at 5 + const segments = Math.min(2 + Math.floor(scene.currentBattle.waveIndex / 50), 5); + const modifiers = new ModifiersHolder(); + const config = getEnemyConfig(scene, playerPokemon, segments, modifiers); + scene.removePokemonFromPlayerParty(playerPokemon, false); + + const getIvName = (index: number) => { + switch (index) { + case Stat.HP: + return pokemonInfo.Stat["HPshortened"]; + case Stat.ATK: + return pokemonInfo.Stat["ATKshortened"]; + case Stat.DEF: + return pokemonInfo.Stat["DEFshortened"]; + case Stat.SPATK: + return pokemonInfo.Stat["SPATKshortened"]; + case Stat.SPDEF: + return pokemonInfo.Stat["SPDEFshortened"]; + case Stat.SPD: + return pokemonInfo.Stat["SPDshortened"]; + } + }; + + const onBeforeRewardsPhase = () => { + encounter.dialogueTokens.set(/@ec\{stat1\}/gi, "-"); + encounter.dialogueTokens.set(/@ec\{stat2\}/gi, "-"); + // Add the pokemon back to party with IV boost + const ivIndexes = []; + playerPokemon.ivs.forEach((iv, index) => { + if (iv < 31) { + ivIndexes.push({iv: iv, index: index}); + } + }); + + // Improves 2 random non-maxed IVs + // +10 if IV is < 10, +5 if between 10-20, and +3 if > 20 + // A 0-4 starting IV will cap in 6 encounters (assuming you always rolled that IV) + // 5-14 starting IV caps in 5 encounters + // 15-19 starting IV caps in 4 encounters + // 20-24 starting IV caps in 3 encounters + // 25-27 starting IV caps in 2 encounters + let improvedCount = 0; + while (ivIndexes.length > 0 && improvedCount < 2) { + randSeedShuffle(ivIndexes); + const ivToChange = ivIndexes.pop(); + let newVal = ivToChange.iv; + if (improvedCount === 0) { + encounter.dialogueTokens.set(/@ec\{stat1\}/gi, getIvName(ivToChange.index)); + } else { + encounter.dialogueTokens.set(/@ec\{stat2\}/gi, getIvName(ivToChange.index)); + } + + // Corrects required encounter breakpoints to be continuous for all IV values + if (ivToChange.iv <= 21 && ivToChange.iv - 1 % 5 === 0) { + newVal += 1; + } + + newVal += ivToChange.iv <= 10 ? 10 : ivToChange.iv <= 20 ? 5 : 3; + newVal = Math.min(newVal, 31); + playerPokemon.ivs[ivToChange.index] = newVal; + improvedCount++; + } + + if (improvedCount > 0) { + playerPokemon.calculateStats(); + scene.gameData.updateSpeciesDexIvs(playerPokemon.species.getRootSpeciesId(true), playerPokemon.ivs); + scene.gameData.setPokemonCaught(playerPokemon, false); + } + + // Add pokemon and mods back + scene.getParty().push(playerPokemon); + for (const mod of modifiers.value) { + scene.addModifier(mod, true, false, false, true); + } + scene.updateModifiers(true); + scene.queueMessage(getTextWithEncounterDialogueTokens(scene, "mysteryEncounter:training_session_battle_finished_1"), null, true); + }; + + setCustomEncounterRewards(scene, { fillRemaining: true }, null, onBeforeRewardsPhase); + + return initBattleWithEnemyConfig(scene, config); + }) + .build()) + .withOption(new MysteryEncounterOptionBuilder() + .withPreOptionPhase(async (scene: BattleScene): Promise => { + // Open menu for selecting pokemon and Nature + const encounter = scene.currentBattle.mysteryEncounter; + const natures = new Array(25).fill(null).map((val, i) => i as Nature); + const onPokemonSelected = (pokemon: PlayerPokemon) => { + // Return the options for nature selection + return natures.map((nature: Nature) => { + const option: OptionSelectItem = { + label: getNatureName(nature, true, true, true, scene.uiTheme), + handler: () => { + // Pokemon and second option selected + encounter.dialogueTokens.set(/@ec\{nature\}/gi, getNatureName(nature)); + encounter.misc = { + playerPokemon: pokemon, + chosenNature: nature + }; + return true; + } + }; + return option; + }); + }; + + return selectPokemonForOption(scene, onPokemonSelected); + }) + .withOptionPhase(async (scene: BattleScene) => { + const encounter = scene.currentBattle.mysteryEncounter; + const playerPokemon: PlayerPokemon = encounter.misc.playerPokemon; + + // Spawn medium training session with chosen pokemon + // Every 40 waves, add +1 boss segment, capping at 6 + const segments = Math.min(2 + Math.floor(scene.currentBattle.waveIndex / 40), 6); + const modifiers = new ModifiersHolder(); + const config = getEnemyConfig(scene, playerPokemon, segments, modifiers); + scene.removePokemonFromPlayerParty(playerPokemon, false); + + const onBeforeRewardsPhase = () => { + scene.queueMessage(getTextWithEncounterDialogueTokens(scene, "mysteryEncounter:training_session_battle_finished_2"), null, true); + // Add the pokemon back to party with Nature change + playerPokemon.setNature(encounter.misc.chosenNature); + scene.gameData.setPokemonCaught(playerPokemon, false); + + // Add pokemon and mods back + scene.getParty().push(playerPokemon); + for (const mod of modifiers.value) { + scene.addModifier(mod, true, false, false, true); + } + scene.updateModifiers(true); + }; + + setCustomEncounterRewards(scene, { fillRemaining: true }, null, onBeforeRewardsPhase); + + return initBattleWithEnemyConfig(scene, config); + }) + .build()) + .withOption(new MysteryEncounterOptionBuilder() + .withPreOptionPhase(async (scene: BattleScene): Promise => { + // Open menu for selecting pokemon and ability to learn + const encounter = scene.currentBattle.mysteryEncounter; + const onPokemonSelected = (pokemon: PlayerPokemon) => { + // Return the options for ability selection + const speciesForm = !!pokemon.getFusionSpeciesForm() ? pokemon.getFusionSpeciesForm() : pokemon.getSpeciesForm(); + const abilityCount = speciesForm.getAbilityCount(); + const abilities = new Array(abilityCount).fill(null).map((val, i) => allAbilities[speciesForm.getAbility(i)]); + return abilities.map((ability: Ability) => { + const option: OptionSelectItem = { + label: ability.name, + handler: () => { + // Pokemon and ability selected + encounter.dialogueTokens.set(/@ec\{ability\}/gi, ability.name); + encounter.misc = { + playerPokemon: pokemon, + abilityIndex: ability + }; + return true; + }, + onHover: () => { + scene.ui.showText(ability.description); + } + }; + return option; + }); + }; + + return selectPokemonForOption(scene, onPokemonSelected); + }) + .withOptionPhase(async (scene: BattleScene) => { + const encounter = scene.currentBattle.mysteryEncounter; + const playerPokemon: PlayerPokemon = encounter.misc.playerPokemon; + + // Spawn hard training session with chosen pokemon + // Every 30 waves, add +1 boss segment, capping at 6 + // Also starts with +1 to all stats + const segments = Math.min(2 + Math.floor(scene.currentBattle.waveIndex / 30), 6); + const modifiers = new ModifiersHolder(); + const config = getEnemyConfig(scene, playerPokemon, segments, modifiers); + config.pokemonConfigs[0].tags = [BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON]; + scene.removePokemonFromPlayerParty(playerPokemon, false); + + const onBeforeRewardsPhase = () => { + scene.queueMessage(getTextWithEncounterDialogueTokens(scene, "mysteryEncounter:training_session_battle_finished_3"), null, true); + // Add the pokemon back to party with ability change + const abilityIndex = encounter.misc.abilityIndex; + if (!!playerPokemon.getFusionSpeciesForm()) { + playerPokemon.fusionAbilityIndex = abilityIndex; + if (speciesStarters.hasOwnProperty(playerPokemon.fusionSpecies.speciesId)) { + scene.gameData.starterData[playerPokemon.fusionSpecies.speciesId].abilityAttr |= abilityIndex !== 1 || playerPokemon.fusionSpecies.ability2 + ? Math.pow(2, playerPokemon.fusionAbilityIndex) + : AbilityAttr.ABILITY_HIDDEN; + } + } else { + playerPokemon.abilityIndex = abilityIndex; + if (speciesStarters.hasOwnProperty(playerPokemon.species.speciesId)) { + scene.gameData.starterData[playerPokemon.species.speciesId].abilityAttr |= abilityIndex !== 1 || playerPokemon.species.ability2 + ? Math.pow(2, playerPokemon.abilityIndex) + : AbilityAttr.ABILITY_HIDDEN; + } + } + + playerPokemon.getAbility(); + playerPokemon.calculateStats(); + scene.gameData.setPokemonCaught(playerPokemon, false); + + // Add pokemon and mods back + scene.getParty().push(playerPokemon); + for (const mod of modifiers.value) { + scene.addModifier(mod, true, false, false, true); + } + scene.updateModifiers(true); + }; + + setCustomEncounterRewards(scene, { fillRemaining: true }, null, onBeforeRewardsPhase); + + return initBattleWithEnemyConfig(scene, config); + }) + .build()) + .build(); + +function getEnemyConfig(scene: BattleScene, playerPokemon: PlayerPokemon, segments: number, modifiers: ModifiersHolder): EnemyPartyConfig { + playerPokemon.resetSummonData(); + + // Passes modifiers by reference + modifiers.value = scene.findModifiers(m => m instanceof PokemonHeldItemModifier + && (m as PokemonHeldItemModifier).pokemonId === playerPokemon.id) as PokemonHeldItemModifier[]; + const modifierTypes = modifiers.value.map(mod => mod.type) as PokemonHeldItemModifierType[]; + + const data = new PokemonData(playerPokemon); + return { + pokemonConfigs: [ + { + species: playerPokemon.species, + isBoss: true, + bossSegments: segments, + formIndex: playerPokemon.formIndex, + level: playerPokemon.level, + dataSource: data, + modifierTypes: modifierTypes + } + ] + }; +} + +class ModifiersHolder { + public value: PokemonHeldItemModifier[] = []; + + constructor() {} +} diff --git a/src/data/trainer-config.ts b/src/data/trainer-config.ts index 8a25406fc5a..fa9d0fdd55a 100644 --- a/src/data/trainer-config.ts +++ b/src/data/trainer-config.ts @@ -810,6 +810,63 @@ export class TrainerConfig { } }); } + + copy(): TrainerConfig { + let copy = new TrainerConfig(this.trainerType); + copy = this.trainerTypeDouble ? copy.setDoubleTrainerType(this.trainerTypeDouble) : copy; + copy = this.name ? copy.setName(this.name) : copy; + copy = this.hasGenders ? copy.setHasGenders(this.nameFemale, this.femaleEncounterBgm) : copy; + copy = this.hasDouble ? copy.setHasDouble(this.nameDouble, this.doubleEncounterBgm) : copy; + copy = this.title ? copy.setTitle(this.title) : copy; + copy = this.titleDouble ? copy.setDoubleTitle(this.titleDouble) : copy; + copy = this.hasCharSprite ? copy.setHasCharSprite() : copy; + copy = this.doubleOnly ? copy.setDoubleOnly() : copy; + copy = this.moneyMultiplier ? copy.setMoneyMultiplier(this.moneyMultiplier) : copy; + copy = this.isBoss ? copy.setBoss() : copy; + copy = this.hasStaticParty ? copy.setStaticParty() : copy; + copy = this.useSameSeedForAllMembers ? copy.setUseSameSeedForAllMembers() : copy; + copy = this.battleBgm ? copy.setBattleBgm(this.battleBgm) : copy; + copy = this.encounterBgm ? copy.setEncounterBgm(this.encounterBgm) : copy; + copy = this.victoryBgm ? copy.setVictoryBgm(this.victoryBgm) : copy; + copy = this.genModifiersFunc ? copy.setGenModifiersFunc(this.genModifiersFunc) : copy; + + if (this.modifierRewardFuncs) { + // Clones array instead of passing ref + copy.modifierRewardFuncs = this.modifierRewardFuncs.slice(0); + } + + if (this.partyTemplates) { + copy.partyTemplates = this.partyTemplates.slice(0); + } + + copy = this.partyTemplateFunc ? copy.setPartyTemplateFunc(this.partyTemplateFunc) : copy; + + if (this.partyMemberFuncs) { + Object.keys(this.partyMemberFuncs).forEach((index) => { + copy = copy.setPartyMemberFunc(parseInt(index, 10), this.partyMemberFuncs[index]); + }); + } + + copy = this.speciesPools ? copy.setSpeciesPools(this.speciesPools) : copy; + copy = this.speciesFilter ? copy.setSpeciesFilter(this.speciesFilter) : copy; + if (this.specialtyTypes) { + copy.specialtyTypes = this.specialtyTypes.slice(0); + } + + copy.encounterMessages = this.encounterMessages?.slice(0); + copy.victoryMessages = this.victoryMessages?.slice(0); + copy.defeatMessages = this.defeatMessages?.slice(0); + + copy.femaleEncounterMessages = this.femaleEncounterMessages?.slice(0); + copy.femaleVictoryMessages = this.femaleVictoryMessages?.slice(0); + copy.femaleDefeatMessages = this.femaleDefeatMessages?.slice(0); + + copy.doubleEncounterMessages = this.doubleEncounterMessages?.slice(0); + copy.doubleVictoryMessages = this.doubleVictoryMessages?.slice(0); + copy.doubleDefeatMessages = this.doubleDefeatMessages?.slice(0); + + return copy; + } } let t = 0; diff --git a/src/enums/battler-tag-type.ts b/src/enums/battler-tag-type.ts index 5cdabfe78c2..ffbb5f1511c 100644 --- a/src/enums/battler-tag-type.ts +++ b/src/enums/battler-tag-type.ts @@ -59,5 +59,6 @@ export enum BattlerTagType { MINIMIZED = "MINIMIZED", DESTINY_BOND = "DESTINY_BOND", CENTER_OF_ATTENTION = "CENTER_OF_ATTENTION", - ICE_FACE = "ICE_FACE" + ICE_FACE = "ICE_FACE", + MYSTERY_ENCOUNTER_POST_SUMMON = "MYSTERY_ENCOUNTER_POST_SUMMON" // Provides effects on post-summon for MEs } diff --git a/src/enums/mystery-encounter-type.ts b/src/enums/mystery-encounter-type.ts new file mode 100644 index 00000000000..a29a409103d --- /dev/null +++ b/src/enums/mystery-encounter-type.ts @@ -0,0 +1,8 @@ +export enum MysteryEncounterType { + MYSTERIOUS_CHALLENGERS, + MYSTERIOUS_CHEST, + DARK_DEAL, + FIGHT_OR_FLIGHT, + SLEEPING_SNORLAX, + TRAINING_SESSION +} diff --git a/src/field/arena.ts b/src/field/arena.ts index ddb3499b3ae..b4c474ce474 100644 --- a/src/field/arena.ts +++ b/src/field/arena.ts @@ -73,21 +73,21 @@ export class Arena { } } - randomSpecies(waveIndex: integer, level: integer, attempt?: integer, luckValue?: integer): PokemonSpecies { + randomSpecies(waveIndex: integer, level: integer, attempt?: integer, luckValue?: integer, isBoss?: boolean): PokemonSpecies { const overrideSpecies = this.scene.gameMode.getOverrideSpecies(waveIndex); if (overrideSpecies) { return overrideSpecies; } - const isBoss = !!this.scene.getEncounterBossSegments(waveIndex, level) && !!this.pokemonPool[BiomePoolTier.BOSS].length + const isBossSpecies = !!this.scene.getEncounterBossSegments(waveIndex, level) && !!this.pokemonPool[BiomePoolTier.BOSS].length && (this.biomeType !== Biome.END || this.scene.gameMode.isClassic || this.scene.gameMode.isWaveFinal(waveIndex)); - const randVal = isBoss ? 64 : 512; + const randVal = isBossSpecies ? 64 : 512; // luck influences encounter rarity let luckModifier = 0; if (typeof luckValue !== "undefined") { - luckModifier = luckValue * (isBoss ? 0.5 : 2); + luckModifier = luckValue * (isBossSpecies ? 0.5 : 2); } const tierValue = Utils.randSeedInt(randVal - luckModifier); - let tier = !isBoss + let tier = !isBossSpecies ? tierValue >= 156 ? BiomePoolTier.COMMON : tierValue >= 32 ? BiomePoolTier.UNCOMMON : tierValue >= 6 ? BiomePoolTier.RARE : tierValue >= 1 ? BiomePoolTier.SUPER_RARE : BiomePoolTier.ULTRA_RARE : tierValue >= 20 ? BiomePoolTier.BOSS : tierValue >= 6 ? BiomePoolTier.BOSS_RARE : tierValue >= 1 ? BiomePoolTier.BOSS_SUPER_RARE : BiomePoolTier.BOSS_ULTRA_RARE; console.log(BiomePoolTier[tier]); @@ -154,12 +154,12 @@ export class Arena { return ret; } - randomTrainerType(waveIndex: integer): TrainerType { - const isBoss = !!this.trainerPool[BiomePoolTier.BOSS].length - && this.scene.gameMode.isTrainerBoss(waveIndex, this.biomeType, this.scene.offsetGym); + randomTrainerType(waveIndex: integer, isBoss: boolean = false): TrainerType { + const isTrainerBoss = !!this.trainerPool[BiomePoolTier.BOSS].length + && (this.scene.gameMode.isTrainerBoss(waveIndex, this.biomeType, this.scene.offsetGym) || isBoss); console.log(isBoss, this.trainerPool); - const tierValue = Utils.randSeedInt(!isBoss ? 512 : 64); - let tier = !isBoss + const tierValue = Utils.randSeedInt(!isTrainerBoss ? 512 : 64); + let tier = !isTrainerBoss ? tierValue >= 156 ? BiomePoolTier.COMMON : tierValue >= 32 ? BiomePoolTier.UNCOMMON : tierValue >= 6 ? BiomePoolTier.RARE : tierValue >= 1 ? BiomePoolTier.SUPER_RARE : BiomePoolTier.ULTRA_RARE : tierValue >= 20 ? BiomePoolTier.BOSS : tierValue >= 6 ? BiomePoolTier.BOSS_RARE : tierValue >= 1 ? BiomePoolTier.BOSS_SUPER_RARE : BiomePoolTier.BOSS_ULTRA_RARE; console.log(BiomePoolTier[tier]); diff --git a/src/field/mystery-encounter-intro.ts b/src/field/mystery-encounter-intro.ts new file mode 100644 index 00000000000..82e9bb49f89 --- /dev/null +++ b/src/field/mystery-encounter-intro.ts @@ -0,0 +1,311 @@ +import { GameObjects } from "phaser"; +import BattleScene from "../battle-scene"; +import MysteryEncounter from "../data/mystery-encounter"; + +export class MysteryEncounterSpriteConfig { + spriteKey: string; // e.g. "ace_trainer_f" + fileRoot: string; // "trainer" for trainer sprites, "pokemon" for pokemon, etc. Refer to /public/images directory for the folder name + hasShadow?: boolean = false; // Spawns shadow underneath sprite + disableAnimation?: boolean = false; // Animates frames or not + repeat?: boolean = false; // Cycles animation + tint?: number; + x?: number; // X offset + y?: number; // Y offset + scale?: number; + isItem?: boolean; // For item sprites, set to true +} + +/** + * When a mystery encounter spawns, there are visuals (mainly sprites) tied to the field for the new encounter to inform the player of the type of encounter + * These slide in with the field as part of standard field change cycle, and will typically be hidden after the player has selected an option for the encounter + * Note: intro visuals are not "Trainers" or any other specific game object, though they may contain trainer sprites + */ +export default class MysteryEncounterIntroVisuals extends Phaser.GameObjects.Container { + public encounter: MysteryEncounter; + public spriteConfigs: MysteryEncounterSpriteConfig[]; + + constructor(scene: BattleScene, encounter: MysteryEncounter) { + super(scene, -72, 76); + this.encounter = encounter; + // Shallow copy configs to allow visual config updates at runtime without dirtying master copy of Encounter + this.spriteConfigs = encounter.spriteConfigs.map(config => { + return { + ...config + }; + }); + if (!this.spriteConfigs) { + return; + } + + const getSprite = (spriteKey: string, hasShadow?: boolean) => { + const ret = this.scene.addFieldSprite(0, 0, spriteKey); + ret.setOrigin(0.5, 1); + ret.setPipeline(this.scene.spritePipeline, {tone: [0.0, 0.0, 0.0, 0.0], hasShadow: !!hasShadow}); + return ret; + }; + + const getItemSprite = (spriteKey: string) => { + const icon = this.scene.add.sprite(-19, 2, "items", spriteKey); + icon.setOrigin(0.5, 1); + return icon; + }; + + // Depending on number of sprites added, should space them to be on the circular field sprite + const minX = -40; + const maxX = 40; + const origin = 4; + let n = 0; + // Sprites with custom X or Y defined will not count for normal spacing requirements + const spacingValue = Math.round((maxX - minX) / Math.max(this.spriteConfigs.filter(s => !s.x && !s.y).length, 1)); + + this.spriteConfigs?.forEach((config) => { + let sprite: GameObjects.Sprite; + let tintSprite: GameObjects.Sprite; + if (!config.isItem) { + sprite = getSprite(config.spriteKey, config.hasShadow); + tintSprite = getSprite(config.spriteKey); + } else { + sprite = getItemSprite(config.spriteKey); + tintSprite = getItemSprite(config.spriteKey); + } + + tintSprite.setVisible(false); + + if (config.scale) { + sprite.setScale(config.scale); + tintSprite.setScale(config.scale); + } + + // Sprite offset from origin + if (config.x || config.y) { + if (config.x) { + sprite.x = origin + config.x; + tintSprite.x = origin + config.x; + } + if (config.y) { + sprite.y = origin + config.y; + tintSprite.y = origin + config.y; + } + } else { + // Single sprite + if (this.spriteConfigs.length === 1) { + sprite.x = origin; + tintSprite.x = origin; + } else { + // Do standard sprite spacing (not including offset sprites) + sprite.x = minX + (n + 0.5) * spacingValue + origin; + tintSprite.x = minX + (n + 0.5) * spacingValue + origin; + n++; + } + } + + this.add(sprite); + this.add(tintSprite); + }); + } + + loadAssets(): Promise { + return new Promise(resolve => { + if (!this.spriteConfigs) { + resolve(); + } + + this.spriteConfigs.forEach((config) => { + if (!config.isItem) { + this.scene.loadAtlas(config.spriteKey, config.fileRoot); + } else { + this.scene.loadAtlas("items", ""); + } + }); + + this.scene.load.once(Phaser.Loader.Events.COMPLETE, () => { + this.spriteConfigs.every((config) => { + if (config.isItem) { + return true; + } + + const originalWarn = console.warn; + + // Ignore warnings for missing frames, because there will be a lot + console.warn = () => { + }; + const frameNames = this.scene.anims.generateFrameNames(config.spriteKey, { zeroPad: 4, suffix: ".png", start: 1, end: 128 }); + + console.warn = originalWarn; + if (!(this.scene.anims.exists(config.spriteKey))) { + this.scene.anims.create({ + key: config.spriteKey, + frames: frameNames, + frameRate: 12, + repeat: -1 + }); + } + + return true; + }); + + resolve(); + }); + + if (!this.scene.load.isLoading()) { + this.scene.load.start(); + } + }); + } + + initSprite(): void { + if (!this.spriteConfigs) { + return; + } + + this.getSprites().map((sprite, i) => { + if (!this.spriteConfigs[i].isItem) { + sprite.setTexture(this.spriteConfigs[i].spriteKey).setFrame(0); + } + }); + this.getTintSprites().map((tintSprite, i) => { + if (!this.spriteConfigs[i].isItem) { + tintSprite.setTexture(this.spriteConfigs[i].spriteKey).setFrame(0); + } + }); + + this.spriteConfigs.every((config, i) => { + if (!config.tint) { + return true; + } + + const tintSprite = this.getAt(i * 2 + 1); + this.tint(tintSprite, 0, config.tint); + + return true; + }); + } + + /** + * Attempts to animate a given set of {@linkcode Phaser.GameObjects.Sprite} + * @see {@linkcode Phaser.GameObjects.Sprite.play} + * @param sprite {@linkcode Phaser.GameObjects.Sprite} to animate + * @param tintSprite {@linkcode Phaser.GameObjects.Sprite} placed on top of the sprite to add a color tint + * @param animConfig {@linkcode Phaser.Types.Animations.PlayAnimationConfig} to pass to {@linkcode Phaser.GameObjects.Sprite.play} + * @returns true if the sprite was able to be animated + */ + tryPlaySprite(sprite: Phaser.GameObjects.Sprite, tintSprite: Phaser.GameObjects.Sprite, animConfig: Phaser.Types.Animations.PlayAnimationConfig): boolean { + // Show an error in the console if there isn't a texture loaded + if (sprite.texture.key === "__MISSING") { + console.error(`No texture found for '${animConfig.key}'!`); + + return false; + } + // Don't try to play an animation when there isn't one + if (sprite.texture.frameTotal <= 1) { + console.warn(`No animation found for '${animConfig.key}'. Is this intentional?`); + + return false; + } + + sprite.play(animConfig); + tintSprite.play(animConfig); + + return true; + } + + playAnim(): void { + if (!this.spriteConfigs) { + return; + } + + const sprites = this.getSprites(); + const tintSprites = this.getTintSprites(); + this.spriteConfigs.forEach((config, i) => { + if (!config.disableAnimation) { + const trainerAnimConfig = { + key: config.spriteKey, + repeat: config?.repeat ? -1 : 0, + startFrame: 0 + }; + + this.tryPlaySprite(sprites[i], tintSprites[i], trainerAnimConfig); + } + }); + } + + getSprites(): Phaser.GameObjects.Sprite[] { + if (!this.spriteConfigs) { + return; + } + + const ret: Phaser.GameObjects.Sprite[] = []; + this.spriteConfigs.forEach((config, i) => { + ret.push(this.getAt(i * 2)); + }); + return ret; + } + + getTintSprites(): Phaser.GameObjects.Sprite[] { + if (!this.spriteConfigs) { + return; + } + + const ret: Phaser.GameObjects.Sprite[] = []; + this.spriteConfigs.forEach((config, i) => { + ret.push(this.getAt(i * 2 + 1)); + }); + + return ret; + } + + tint(sprite, color: number, alpha?: number, duration?: integer, ease?: string): void { + // const tintSprites = this.getTintSprites(); + sprite.setTintFill(color); + sprite.setVisible(true); + + if (duration) { + sprite.setAlpha(0); + + this.scene.tweens.add({ + targets: sprite, + alpha: alpha || 1, + duration: duration, + ease: ease || "Linear" + }); + } else { + sprite.setAlpha(alpha); + } + } + + tintAll(color: number, alpha?: number, duration?: integer, ease?: string): void { + const tintSprites = this.getTintSprites(); + tintSprites.map(tintSprite => { + this.tint(tintSprite, color, alpha, duration, ease); + }); + } + + untint(sprite, duration: integer, ease?: string): void { + if (duration) { + this.scene.tweens.add({ + targets: sprite, + alpha: 0, + duration: duration, + ease: ease || "Linear", + onComplete: () => { + sprite.setVisible(false); + sprite.setAlpha(1); + } + }); + } else { + sprite.setVisible(false); + sprite.setAlpha(1); + } + } + + untintAll(duration: integer, ease?: string): void { + const tintSprites = this.getTintSprites(); + tintSprites.map(tintSprite => { + this.untint(tintSprite, duration, ease); + }); + } +} + +export default interface MysteryEncounterIntroVisuals { + scene: BattleScene +} diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 0fb74d51304..08119931084 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -3913,6 +3913,7 @@ export class PokemonSummonData { public moveset: PokemonMove[]; // If not initialized this value will not be populated from save data. public types: Type[] = null; + public mysteryEncounterBattleEffects: (pokemon: Pokemon) => void = null; } export class PokemonBattleData { diff --git a/src/field/trainer.ts b/src/field/trainer.ts index 3e78afeae83..d43a2025723 100644 --- a/src/field/trainer.ts +++ b/src/field/trainer.ts @@ -35,11 +35,16 @@ export default class Trainer extends Phaser.GameObjects.Container { public name: string; public partnerName: string; - constructor(scene: BattleScene, trainerType: TrainerType, variant: TrainerVariant, partyTemplateIndex?: integer, name?: string, partnerName?: string) { + constructor(scene: BattleScene, trainerType: TrainerType, variant: TrainerVariant, partyTemplateIndex?: integer, name?: string, partnerName?: string, trainerConfigOverride?: TrainerConfig) { super(scene, -72, 80); this.config = trainerConfigs.hasOwnProperty(trainerType) ? trainerConfigs[trainerType] : trainerConfigs[TrainerType.ACE_TRAINER]; + + if (trainerConfigOverride) { + this.config = trainerConfigOverride; + } + this.variant = variant; this.partyTemplateIndex = Math.min(partyTemplateIndex !== undefined ? partyTemplateIndex : Utils.randSeedWeightedItem(this.config.partyTemplates.map((_, i) => i)), this.config.partyTemplates.length - 1); diff --git a/src/form-change-phase.ts b/src/form-change-phase.ts index ebf91c635fd..42d49dc0147 100644 --- a/src/form-change-phase.ts +++ b/src/form-change-phase.ts @@ -8,8 +8,9 @@ import Pokemon, { EnemyPokemon, PlayerPokemon } from "./field/pokemon"; import { Mode } from "./ui/ui"; import PartyUiHandler from "./ui/party-ui-handler"; import { BattleSpec } from "#enums/battle-spec"; -import { BattlePhase, MovePhase, PokemonHealPhase } from "./phases"; +import { MovePhase, PokemonHealPhase } from "./phases"; import { getTypeRgb } from "./data/type"; +import { BattlePhase } from "#app/phases/battle-phase"; export class FormChangePhase extends EvolutionPhase { private formChange: SpeciesFormChange; diff --git a/src/game-mode.ts b/src/game-mode.ts index dd22e69d719..11bedd9a791 100644 --- a/src/game-mode.ts +++ b/src/game-mode.ts @@ -28,6 +28,7 @@ interface GameModeConfig { hasRandomBosses?: boolean; isSplicedOnly?: boolean; isChallenge?: boolean; + hasMysteryEncounters?: boolean; } export class GameMode implements GameModeConfig { @@ -44,6 +45,7 @@ export class GameMode implements GameModeConfig { public isChallenge: boolean; public challenges: Challenge[]; public battleConfig: FixedBattleConfigs; + public hasMysteryEncounters: boolean; constructor(modeId: GameModes, config: GameModeConfig, battleConfig?: FixedBattleConfigs) { this.modeId = modeId; @@ -316,7 +318,7 @@ export class GameMode implements GameModeConfig { export function getGameMode(gameMode: GameModes): GameMode { switch (gameMode) { case GameModes.CLASSIC: - return new GameMode(GameModes.CLASSIC, { isClassic: true, hasTrainers: true }, classicFixedBattles); + return new GameMode(GameModes.CLASSIC, { isClassic: true, hasTrainers: true, hasMysteryEncounters: true }, classicFixedBattles); case GameModes.ENDLESS: return new GameMode(GameModes.ENDLESS, { isEndless: true, hasShortBiomes: true, hasRandomBosses: true }); case GameModes.SPLICED_ENDLESS: @@ -324,6 +326,6 @@ export function getGameMode(gameMode: GameModes): GameMode { case GameModes.DAILY: return new GameMode(GameModes.DAILY, { isDaily: true, hasTrainers: true, hasNoShop: true }); case GameModes.CHALLENGE: - return new GameMode(GameModes.CHALLENGE, { isClassic: true, hasTrainers: true, isChallenge: true }, classicFixedBattles); + return new GameMode(GameModes.CHALLENGE, { isClassic: true, hasTrainers: true, isChallenge: true, hasMysteryEncounters: true }, classicFixedBattles); } } diff --git a/src/loading-scene.ts b/src/loading-scene.ts index 15cd295d23c..fdb9f5f6610 100644 --- a/src/loading-scene.ts +++ b/src/loading-scene.ts @@ -22,6 +22,8 @@ import { initStatsKeys } from "./ui/game-stats-ui-handler"; import { initVouchers } from "./system/voucher"; import { Biome } from "#enums/biome"; import { TrainerType } from "#enums/trainer-type"; +import {initMysteryEncounterDialogue} from "#app/data/mystery-encounters/dialogue/mystery-encounter-dialogue"; +import {initMysteryEncounters} from "#app/data/mystery-encounters/mystery-encounters"; export class LoadingScene extends SceneBase { readonly LOAD_EVENTS = Phaser.Loader.Events; @@ -344,6 +346,8 @@ export class LoadingScene extends SceneBase { initMoves(); initAbilities(); initChallenges(); + initMysteryEncounterDialogue(); + initMysteryEncounters(); } loadLoadingScreen() { diff --git a/src/locales/en/battle.ts b/src/locales/en/battle.ts index c7e2ef96be4..b10e5507b3b 100644 --- a/src/locales/en/battle.ts +++ b/src/locales/en/battle.ts @@ -49,6 +49,7 @@ export const battle: SimpleTranslationEntries = { "noPokeballTrainer": "You can't catch\nanother trainer's Pokémon!", "noPokeballMulti": "You can only throw a Poké Ball\nwhen there is one Pokémon remaining!", "noPokeballStrong": "The target Pokémon is too strong to be caught!\nYou need to weaken it first!", + "noPokeballMysteryEncounter": "You aren't able to\ncatch this Pokémon!", "noEscapeForce": "An unseen force\nprevents escape.", "noEscapeTrainer": "You can't run\nfrom a trainer battle!", "noEscapePokemon": "{{pokemonName}}'s {{moveName}}\nprevents {{escapeVerb}}!", @@ -134,5 +135,6 @@ export const battle: SimpleTranslationEntries = { "battlerTagsSaltCuredOnAdd": "{{pokemonNameWithAffix}} is being salt cured!", "battlerTagsSaltCuredLapse": "{{pokemonNameWithAffix}} is hurt by {{moveName}}!", "battlerTagsCursedOnAdd": "{{pokemonNameWithAffix}} cut its own HP and put a curse on the {{pokemonName}}!", - "battlerTagsCursedLapse": "{{pokemonNameWithAffix}} is afflicted by the Curse!" + "battlerTagsCursedLapse": "{{pokemonNameWithAffix}} is afflicted by the Curse!", + "mysteryEncounterAppeared": "What's this?" } as const; diff --git a/src/locales/en/config.ts b/src/locales/en/config.ts index 1c5449a2e88..1aa7a8d06ba 100644 --- a/src/locales/en/config.ts +++ b/src/locales/en/config.ts @@ -30,6 +30,7 @@ import { menuUiHandler } from "./menu-ui-handler"; import { modifier } from "./modifier"; import { modifierType } from "./modifier-type"; import { move } from "./move"; +import { mysteryEncounter } from "./mystery-encounter"; import { nature } from "./nature"; import { partyUiHandler } from "./party-ui-handler"; import { pokeball } from "./pokeball"; @@ -77,6 +78,7 @@ export const enConfig = { modifier: modifier, modifierType: modifierType, move: move, + mysteryEncounter: mysteryEncounter, nature: nature, pokeball: pokeball, pokemon: pokemon, diff --git a/src/locales/en/mystery-encounter.ts b/src/locales/en/mystery-encounter.ts new file mode 100644 index 00000000000..9d5fe50aece --- /dev/null +++ b/src/locales/en/mystery-encounter.ts @@ -0,0 +1,125 @@ +import {SimpleTranslationEntries} from "#app/interfaces/locales"; + +export const mysteryEncounter: SimpleTranslationEntries = { + + // Mysterious Encounters -- Common Tier + + "mysterious_chest_intro_message": "You found...@d{32} a chest?", + "mysterious_chest_title": "The Mysterious Chest", + "mysterious_chest_description": "A beautifully ornamented chest stands on the ground. There must be something good inside... right?", + "mysterious_chest_query": "Will you open it?", + "mysterious_chest_option_1_label": "Open it", + "mysterious_chest_option_1_tooltip": "(35%) Something terrible\n(40%) Okay Rewards\n(20%) Good Rewards\n(4%) Great Rewards\n(1%) Amazing Rewards", + "mysterious_chest_option_2_label": "It's too risky, leave", + "mysterious_chest_option_2_tooltip": "(-) No Rewards", + "mysterious_chest_option_1_selected_message": "You open the chest to find...", + "mysterious_chest_option_2_selected_message": "You hurry along your way,\nwith a slight feeling of regret.", + "mysterious_chest_option_1_normal_result": "Just some normal tools and items.", + "mysterious_chest_option_1_good_result": "Some pretty nice tools and items.", + "mysterious_chest_option_1_great_result": "A couple great tools and items!", + "mysterious_chest_option_1_amazing_result": "Whoa! An amazing item!", + "mysterious_chest_option_1_bad_result": `Oh no!@d{32}\nThe chest was trapped! + $Your @ec{pokeName} jumps in front of you\nbut is KOed in the process.`, + + "fight_or_flight_intro_message": "Something shiny is sparkling\non the ground near that Pokémon!", + "fight_or_flight_title": "Fight or Flight", + "fight_or_flight_description": "It looks like there's a strong Pokémon guarding an item. Battling is the straightforward approach, but this Pokémon looks strong. You could also try to sneak around, though the Pokémon might catch you.", + "fight_or_flight_query": "What will you do?", + "fight_or_flight_option_1_label": "Battle it", + "fight_or_flight_option_1_tooltip": "(+) Hard Battle\n(+) New Item", + "fight_or_flight_option_2_label": "Sneak around", + "fight_or_flight_option_2_tooltip": "(35%) Steal Item\n(65%) Harder Battle", + "fight_or_flight_option_3_label": "Leave", + "fight_or_flight_option_3_tooltip": "(-) No Rewards", + "fight_or_flight_option_1_selected_message": "You approach the\nPokémon without fear.", + "fight_or_flight_option_2_good_result": `.@d{32}.@d{32}.@d{32} + $You manage to sneak your way\npast and grab the item!`, + "fight_or_flight_option_2_bad_result": `.@d{32}.@d{32}.@d{32} + $The Pokémon catches you\nas you try to sneak around!`, + "fight_or_flight_boss_enraged": "The opposing @ec{enemyPokemon} has become enraged!", + "fight_or_flight_option_3_selected": "You leave the strong Pokémon\nwith its prize and continue on.", + + // Mysterious Encounters -- Uncommon Tier + + "mysterious_challengers_intro_message": "Mysterious challengers have appeared!", + "mysterious_challengers_title": "Mysterious Challengers", + "mysterious_challengers_description": "If you defeat a challenger, you might impress them enough to receive a boon. But some look tough, are you up to the challenge?", + "mysterious_challengers_query": "Who will you battle?", + "mysterious_challengers_option_1_label": "A clever, mindful foe", + "mysterious_challengers_option_1_tooltip": "(+) Standard Battle\n(+) Move Item Rewards", + "mysterious_challengers_option_2_label": "A strong foe", + "mysterious_challengers_option_2_tooltip": "(+) Hard Battle\n(+) Good Rewards", + "mysterious_challengers_option_3_label": "The mightiest foe", + "mysterious_challengers_option_3_tooltip": "(+) Brutal Battle\n(+) Great Rewards", + "mysterious_challengers_option_selected_message": "The trainer steps forward...", + "mysterious_challengers_outro_win": "The mysterious challenger was defeated!", + + // Mysterious Encounters -- Rare Tier + "training_session_intro_message": "You've come across a some\ntraining tools and supplies.", + "training_session_title": "Training Session", + "training_session_description": "These supplies look like they could be used to train a member of your party! There are a few ways you could train your Pokémon, by battling against it with the rest of your team.", + "training_session_query": "How should you train?", + "training_session_option_1_label": "Light Training", + "training_session_option_1_tooltip": "(-) Light Battle\n(+) Improve 2 Random IVs of Pokémon", + "training_session_option_2_label": "Moderate Training", + "training_session_option_2_tooltip": "(-) Moderate Battle\n(+) Change Pokémon's Nature", + "training_session_option_2_select_prompt": "Select a new nature\nto train your Pokémon in.", + "training_session_option_3_label": "Heavy Training", + "training_session_option_3_tooltip": "(-) Harsh Battle\n(+) Change Pokémon's Ability", + "training_session_option_3_select_prompt": "Select a new ability\nto train your Pokémon in.", + "training_session_option_selected_message": "@ec{selectedPokemon} moves across\nthe clearing to face you...", + "training_session_battle_finished_1": `@ec{selectedPokemon} returns, feeling\nworn out but accomplished! + $Its @ec{stat1} and @ec{stat2}IVs were improved!`, + "training_session_battle_finished_2": `@ec{selectedPokemon} returns, feeling\nworn out but accomplished! + $Its nature was changed to @ec{nature}!`, + "training_session_battle_finished_3": `@ec{selectedPokemon} returns, feeling\nworn out but accomplished! + $Its ability was changed to @ec{ability}!`, + "training_session_outro_win": "That was a successful training session!", + + // Mysterious Encounters -- Super Rare Tier + + "dark_deal_intro_message": "A strange man in a tattered coat\nstands in your way...", + "dark_deal_speaker": "Shady Guy", + "dark_deal_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.`, + "dark_deal_title": "Dark Deal", + "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...\"", + "dark_deal_query": "What will you do?", + "dark_deal_option_1_label": "Accept", // Give player 10 rogue balls. Remove a random Pokémon from player's party. Fight a legendary Pokémon as a boss + "dark_deal_option_1_tooltip": "(+) 5 Rogue Balls\n(?) Enhance a Random Pokémon", // Give player 10 rogue balls. Remove a random Pokémon from player's party. Fight a legendary Pokémon as a boss + "dark_deal_option_2_label": "Refuse", + "dark_deal_option_2_tooltip": "(-) No Rewards", + "dark_deal_option_1_selected": `Let's see, that @ec{pokeName} will do nicely! + $Remember, I'm not responsible\nif anything bad happens!@d{32} Hehe...`, + "dark_deal_option_1_selected_message": `The man hands you 5 Rogue Balls. + $@ec{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!`, + "dark_deal_option_2_selected": "Not gonna help a poor fellow out?\nPah!", + "dark_deal_outro": "After the harrowing encounter,\nyou collect yourself and depart.", + + "sleeping_snorlax_intro_message": `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.`, + "sleeping_snorlax_title": "Sleeping Snorlax", + "sleeping_snorlax_description": "You could attack it to try and get it to move, or simply wait for it to wake up.", + "sleeping_snorlax_query": "What will you do?", + "sleeping_snorlax_option_1_label": "Fight it", + "sleeping_snorlax_option_1_tooltip": "(+) Fight Sleeping Snorlax", + "sleeping_snorlax_option_2_label": "Wait for it to move", + "sleeping_snorlax_option_2_tooltip": "(75%) Wait a short time\n(25%) Wait a long time", + "sleeping_snorlax_option_3_label": "Steal", + "sleeping_snorlax_option_3_tooltip": "(+) Leftovers", + "sleeping_snorlax_option_3_disabled_tooltip": "Your Pokémon need to know certain moves to choose this", + "sleeping_snorlax_option_1_selected_message": "You approach the\nPokémon without fear.", + "sleeping_snorlax_option_2_selected_message": `.@d{32}.@d{32}.@d{32} + $You wait for a time, but the Snorlax's yawns make your party sleepy.`, + "sleeping_snorlax_option_2_good_result": "When you all awaken, the Snorlax is no where to be found - but your Pokémon are all healed!", + "sleeping_snorlax_option_2_bad_result": `Your @ec{primaryName} is still asleep... + $But on the bright side, the Snorlax left something behind... + $@s{item_fanfare}You gained a Berry!`, + "sleeping_snorlax_option_3_good_result": "Your @ec{option3PrimaryName} uses @ec{option3PrimaryMove}! @s{item_fanfare}It steals Leftovers off the sleeping Snorlax and you make out like bandits!", + // "sleeping_snorlax_outro_win": "The mysterious challengers were defeated!", + +} as const; diff --git a/src/locales/en/party-ui-handler.ts b/src/locales/en/party-ui-handler.ts index 78fdcc14dbe..37343cfa892 100644 --- a/src/locales/en/party-ui-handler.ts +++ b/src/locales/en/party-ui-handler.ts @@ -16,6 +16,7 @@ export const partyUiHandler: SimpleTranslationEntries = { "PASS_BATON": "Pass Baton", "UNPAUSE_EVOLUTION": "Unpause Evolution", "REVIVE": "Revive", + "SELECT": "Select", "choosePokemon": "Choose a Pokémon.", "doWhatWithThisPokemon": "Do what with this Pokémon?", diff --git a/src/modifier/modifier-type.ts b/src/modifier/modifier-type.ts index d8ec0072bd4..308b08b34cb 100644 --- a/src/modifier/modifier-type.ts +++ b/src/modifier/modifier-type.ts @@ -143,7 +143,7 @@ export interface GeneratedPersistentModifierType { getPregenArgs(): any[]; } -class AddPokeballModifierType extends ModifierType { +export class AddPokeballModifierType extends ModifierType { private pokeballType: PokeballType; private count: integer; @@ -1801,21 +1801,74 @@ export function regenerateModifierPoolThresholds(party: Pokemon[], poolType: Mod } } +export interface CustomModifierSettings { + guaranteedModifierTiers?: ModifierTier[]; + guaranteedModifierTypeOptions?: ModifierTypeOption[]; + guaranteedModifierTypeFuncs?: ModifierTypeFunc[]; + fillRemaining?: boolean; + rerollMultiplier?: number; +} + export function getModifierTypeFuncById(id: string): ModifierTypeFunc { return modifierTypes[id]; } -export function getPlayerModifierTypeOptions(count: integer, party: PlayerPokemon[], modifierTiers?: ModifierTier[]): ModifierTypeOption[] { +export function getPlayerModifierTypeOptions(count: integer, party: PlayerPokemon[], modifierTiers?: ModifierTier[], customModifierSettings?: CustomModifierSettings): ModifierTypeOption[] { const options: ModifierTypeOption[] = []; const retryCount = Math.min(count * 5, 50); - new Array(count).fill(0).map((_, i) => { - let candidate = getNewModifierTypeOption(party, ModifierPoolType.PLAYER, modifierTiers?.length > i ? modifierTiers[i] : undefined); - let r = 0; - while (options.length && ++r < retryCount && options.filter(o => o.type.name === candidate.type.name || o.type.group === candidate.type.group).length) { - candidate = getNewModifierTypeOption(party, ModifierPoolType.PLAYER, candidate.type.tier, candidate.upgradeCount); + if (!customModifierSettings) { + new Array(count).fill(0).map((_, i) => { + options.push(getModifierTypeOptionWithLuckUpgrades(options, retryCount, party, modifierTiers?.length > i ? modifierTiers[i] : undefined)); + }); + } else { + // Guaranteed mods first + if (customModifierSettings?.guaranteedModifierTypeOptions?.length) { + customModifierSettings?.guaranteedModifierTypeOptions.forEach((option) => { + options.push(option); + }); } - options.push(candidate); - }); + + // Guaranteed mod funcs second + if (customModifierSettings?.guaranteedModifierTypeFuncs?.length) { + customModifierSettings?.guaranteedModifierTypeFuncs.forEach((mod, i) => { + const modifierId = Object.keys(modifierTypes).find(k => modifierTypes[k] === mod); + let guaranteedMod: ModifierType = modifierTypes[modifierId]?.(); + + // Gets tier of item by checking player item pool + Object.keys(modifierPool).every(modifierTier => { + const modType = modifierPool[modifierTier].find(m => { + if (m.modifierType.id === modifierId) { + return m; + } + }); + if (modType) { + guaranteedMod = modType.modifierType; + return false; + } + return true; + }); + + const modType = guaranteedMod instanceof ModifierTypeGenerator ? guaranteedMod.generateType(party) : guaranteedMod; + const option = new ModifierTypeOption(modType, 0); + options.push(option); + }); + } + + // Guaranteed tiers third + if (customModifierSettings?.guaranteedModifierTiers?.length) { + customModifierSettings?.guaranteedModifierTiers.forEach((tier) => { + options.push(getModifierTypeOptionWithLuckUpgrades(options, retryCount, party, tier)); + }); + } + + // Fill remaining + if (options.length < count && customModifierSettings.fillRemaining) { + while (options.length < count) { + options.push(getModifierTypeOptionWithLuckUpgrades(options, retryCount, party, undefined)); + } + } + } + // OVERRIDE IF NECESSARY if (Overrides.ITEM_REWARD_OVERRIDE?.length) { options.forEach((mod, i) => { @@ -1827,6 +1880,15 @@ export function getPlayerModifierTypeOptions(count: integer, party: PlayerPokemo return options; } +function getModifierTypeOptionWithLuckUpgrades(existingOptions: ModifierTypeOption[], retryCount: integer, party: PlayerPokemon[], tier?: ModifierTier): ModifierTypeOption { + let candidate = getNewModifierTypeOption(party, ModifierPoolType.PLAYER, modifierTiers?.length > i ? modifierTiers[i] : undefined); + let r = 0; + while (options.length && ++r < retryCount && options.filter(o => o.type.name === candidate.type.name || o.type.group === candidate.type.group).length) { + candidate = getNewModifierTypeOption(party, ModifierPoolType.PLAYER, candidate.type.tier, candidate.upgradeCount); + } + return candidate; +} + export function getPlayerShopModifierTypeOptionsForWave(waveIndex: integer, baseCost: integer): ModifierTypeOption[] { if (!(waveIndex % 10)) { return []; diff --git a/src/overrides.ts b/src/overrides.ts index 3e894967893..22a341f6d15 100644 --- a/src/overrides.ts +++ b/src/overrides.ts @@ -18,6 +18,8 @@ import { Biome } from "#enums/biome"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { TimeOfDay } from "#enums/time-of-day"; +import {MysteryEncounterType} from "#enums/mystery-encounter-type"; // eslint-disable-line @typescript-eslint/no-unused-vars +import {MysteryEncounterTier} from "#app/data/mystery-encounter"; // eslint-disable-line @typescript-eslint/no-unused-vars /** * Overrides for testing different in game situations @@ -111,6 +113,15 @@ export const EGG_VARIANT_OVERRIDE: VariantTier = null; export const EGG_FREE_GACHA_PULLS_OVERRIDE: boolean = false; export const EGG_GACHA_PULL_COUNT_OVERRIDE: number = 0; +/** + * MYSTERY ENCOUNTER OVERRIDES + */ + +// 1 to 256, set to null to ignore +export const MYSTERY_ENCOUNTER_RATE_OVERRIDE: number = 256; +export const MYSTERY_ENCOUNTER_TIER_OVERRIDE: MysteryEncounterTier = null; +export const MYSTERY_ENCOUNTER_OVERRIDE: MysteryEncounterType = MysteryEncounterType.FIGHT_OR_FLIGHT; + /** * MODIFIER / ITEM OVERRIDES * if count is not provided, it will default to 1 diff --git a/src/phases.ts b/src/phases.ts index 51391971308..b05ab41edc5 100644 --- a/src/phases.ts +++ b/src/phases.ts @@ -17,7 +17,7 @@ import { Phase } from "./phase"; import { BattleStat, getBattleStatLevelChangeDescription, getBattleStatName } from "./data/battle-stat"; import { biomeLinks, getBiomeName } from "./data/biomes"; import { ModifierTier } from "./modifier/modifier-tier"; -import { FusePokemonModifierType, ModifierPoolType, ModifierType, ModifierTypeFunc, ModifierTypeOption, PokemonModifierType, PokemonMoveModifierType, PokemonPpRestoreModifierType, PokemonPpUpModifierType, RememberMoveModifierType, TmModifierType, getDailyRunStarterModifiers, getEnemyBuffModifierForWave, getModifierType, getPlayerModifierTypeOptions, getPlayerShopModifierTypeOptionsForWave, modifierTypes, regenerateModifierPoolThresholds } from "./modifier/modifier-type"; +import { ModifierPoolType, ModifierType, ModifierTypeFunc, getDailyRunStarterModifiers, getEnemyBuffModifierForWave, getModifierType, modifierTypes, regenerateModifierPoolThresholds } from "./modifier/modifier-type"; import SoundFade from "phaser3-rex-plugins/plugins/soundfade"; import { BattlerTagLapseType, CenterOfAttentionTag, EncoreTag, ProtectedTag, SemiInvulnerableTag, TrappedTag } from "./data/battler-tags"; import { getPokemonMessage, getPokemonNameWithAffix } from "./messages"; @@ -65,6 +65,11 @@ import { Moves } from "#enums/moves"; import { PlayerGender } from "#enums/player-gender"; import { Species } from "#enums/species"; import { TrainerType } from "#enums/trainer-type"; +import { BattlePhase } from "#app/phases/battle-phase"; +import { MysteryEncounterVariant } from "#app/data/mystery-encounter"; +import { MysteryEncounterPhase } from "#app/phases/mystery-encounter-phase"; +import { handleMysteryEncounterVictory } from "#app/data/mystery-encounters/mystery-encounter-utils"; +import { SelectModifierPhase } from "#app/phases/select-modifier-phase"; const { t } = i18next; @@ -291,6 +296,14 @@ export class TitlePhase extends Phase { }, keepOpen: true }, + { + label: i18next.t("menu:settings"), + handler: () => { + this.scene.ui.setOverlayMode(Mode.SETTINGS); + return true; + }, + keepOpen: true + }, { label: i18next.t("menu:settings"), handler: () => { @@ -667,17 +680,6 @@ export class BattlePhase extends Phase { duration: 750 }); } - - hideEnemyTrainer(): void { - this.scene.tweens.add({ - targets: this.scene.currentBattle.trainer, - x: "+=16", - y: "-=16", - alpha: 0, - ease: "Sine.easeInOut", - duration: 750 - }); - } } type PokemonFunc = (pokemon: Pokemon) => void; @@ -814,6 +816,24 @@ export class EncounterPhase extends BattlePhase { const battle = this.scene.currentBattle; + // Init Mystery Encounter if there is one + const mysteryEncounter = battle.mysteryEncounter; + if (mysteryEncounter) { + // If ME has an onInit() function, call it + // Usually used for calculating rand data before initializing anything visual + // Also prepopulates any dialogue tokens from encounter/option requirements + this.scene.executeWithSeedOffset(() => { + if (mysteryEncounter.onInit) { + mysteryEncounter.onInit(this.scene); + } + mysteryEncounter.populateDialogueTokensFromRequirements(); + }, this.scene.currentBattle.waveIndex); + + // Add intro visuals for mystery encounter + mysteryEncounter.initIntroVisuals(this.scene); + this.scene.field.add(mysteryEncounter.introVisuals); + } + let totalBst = 0; battle.enemyLevels.forEach((level, e) => { @@ -838,7 +858,7 @@ export class EncounterPhase extends BattlePhase { } if (!this.loaded) { - this.scene.gameData.setPokemonSeen(enemyPokemon, true, battle.battleType === BattleType.TRAINER); + this.scene.gameData.setPokemonSeen(enemyPokemon, true, battle.battleType === BattleType.TRAINER || battle?.mysteryEncounter?.encounterVariant === MysteryEncounterVariant.TRAINER_BATTLE); } if (enemyPokemon.species.speciesId === Species.ETERNATUS) { @@ -867,6 +887,12 @@ export class EncounterPhase extends BattlePhase { if (battle.battleType === BattleType.TRAINER) { loadEnemyAssets.push(battle.trainer.loadAssets().then(() => battle.trainer.initSprite())); + } else if (battle.battleType === BattleType.MYSTERY_ENCOUNTER) { + if (!battle.mysteryEncounter) { + const newEncounter = this.scene.getMysteryEncounter(mysteryEncounter); + battle.mysteryEncounter = newEncounter; + } + loadEnemyAssets.push(battle.mysteryEncounter.introVisuals.loadAssets().then(() => battle.mysteryEncounter.introVisuals.initSprite())); } else { // This block only applies for double battles to init the boss segments (idk why it's split up like this) if (battle.enemyParty.filter(p => p.isBoss()).length > 1) { @@ -894,6 +920,9 @@ export class EncounterPhase extends BattlePhase { } else if (battle.battleType === BattleType.TRAINER) { enemyPokemon.setVisible(false); this.scene.currentBattle.trainer.tint(0, 0.5); + } else if (battle.battleType === BattleType.MYSTERY_ENCOUNTER) { + enemyPokemon.setVisible(false); + this.scene.currentBattle?.trainer?.tint(0, 0.5); } if (battle.double) { enemyPokemon.setFieldPosition(e ? FieldPosition.RIGHT : FieldPosition.LEFT); @@ -945,8 +974,8 @@ export class EncounterPhase extends BattlePhase { const enemyField = this.scene.getEnemyField(); this.scene.tweens.add({ - targets: [this.scene.arenaEnemy, this.scene.currentBattle.trainer, enemyField, this.scene.arenaPlayer, this.scene.trainer].flat(), - x: (_target, _key, value, fieldIndex: integer) => fieldIndex < 2 + (enemyField.length) ? value + 300 : value - 300, + targets: [this.scene.arenaEnemy, this.scene.currentBattle.trainer, enemyField, this.scene.currentBattle?.mysteryEncounter?.introVisuals, this.scene.arenaPlayer, this.scene.trainer].flat(), + x: (_target, _key, value, fieldIndex: integer) => fieldIndex < 3 + (enemyField.length) ? value + 300 : value - 300, duration: 2000, onComplete: () => { if (!this.tryOverrideForBattleSpec()) { @@ -1040,6 +1069,54 @@ export class EncounterPhase extends BattlePhase { showDialogueAndSummon(); } } + } else if (this.scene.currentBattle.battleType === BattleType.MYSTERY_ENCOUNTER) { + const introVisuals = this.scene.currentBattle.mysteryEncounter.introVisuals; + introVisuals.playAnim(); + + const doEncounter = () => { + this.scene.playBgm(undefined); + + const doShowEncounterOptions = () => { + this.scene.ui.clearText(); + this.scene.ui.getMessageHandler().hideNameText(); + this.scene.unshiftPhase(new MysteryEncounterPhase(this.scene)); + + this.end(); + }; + + if (showEncounterMessage) { + const introDialogue = this.scene.currentBattle.mysteryEncounter.dialogue.intro; + let i = 0; + const showNextDialogue = () => { + const nextAction = i === introDialogue.length - 1 ? doShowEncounterOptions : showNextDialogue; + const dialogue = introDialogue[i]; + const title = dialogue.speaker; + const text = dialogue.text; + if (title) { + this.scene.ui.showDialogue(i18next.t(text), i18next.t(title), null, nextAction, 0, i === 0 ? 750 : 0); + } else { + this.scene.ui.showText(i18next.t(text), null, nextAction, i === 0 ? 750 : 0, true); + } + i++; + }; + + if (introDialogue.length > 0) { + showNextDialogue(); + } + } else { + doShowEncounterOptions(); + } + }; + + const encounterMessage = i18next.t("battle:mysteryEncounterAppeared"); + + if (!encounterMessage) { + doEncounter(); + } else { + this.scene.ui.showDialogue(encounterMessage, "???", null, () => { + this.scene.charSprite.hide().then(() => this.scene.hideFieldOverlay(250).then(() => doEncounter())); + }); + } } } @@ -1052,7 +1129,7 @@ export class EncounterPhase extends BattlePhase { } }); - if (this.scene.currentBattle.battleType !== BattleType.TRAINER) { + if (this.scene.currentBattle.battleType !== BattleType.TRAINER && this.scene.currentBattle.battleType !== BattleType.MYSTERY_ENCOUNTER) { enemyField.map(p => this.scene.pushConditionalPhase(new PostSummonPhase(this.scene, p.getBattlerIndex()), () => { // if there is not a player party, we can't continue if (!this.scene.getParty()?.length) { @@ -1146,8 +1223,17 @@ export class NextEncounterPhase extends EncounterPhase { this.scene.arenaNextEnemy.setVisible(true); const enemyField = this.scene.getEnemyField(); + const moveTargets: any[] = [this.scene.arenaEnemy, this.scene.arenaNextEnemy, this.scene.currentBattle.trainer, enemyField, this.scene.lastEnemyTrainer]; + const lastEncounterVisuals = this.scene?.lastMysteryEncounter?.introVisuals; + if (lastEncounterVisuals) { + moveTargets.push(lastEncounterVisuals); + } + const nextEncounterVisuals = this.scene.currentBattle?.mysteryEncounter?.introVisuals; + if (nextEncounterVisuals) { + moveTargets.push(nextEncounterVisuals); + } this.scene.tweens.add({ - targets: [this.scene.arenaEnemy, this.scene.arenaNextEnemy, this.scene.currentBattle.trainer, enemyField, this.scene.lastEnemyTrainer].flat(), + targets: moveTargets.flat(), x: "+=300", duration: 2000, onComplete: () => { @@ -1159,6 +1245,11 @@ export class NextEncounterPhase extends EncounterPhase { if (this.scene.lastEnemyTrainer) { this.scene.lastEnemyTrainer.destroy(); } + if (lastEncounterVisuals) { + this.scene.field.remove(lastEncounterVisuals); + lastEncounterVisuals.destroy(); + this.scene.lastMysteryEncounter.introVisuals = null; + } if (!this.tryOverrideForBattleSpec()) { this.doEncounterCommon(); @@ -1189,8 +1280,14 @@ export class NewBiomeEncounterPhase extends NextEncounterPhase { } const enemyField = this.scene.getEnemyField(); + const moveTargets: any[] = [this.scene.arenaEnemy, enemyField]; + const mysteryEncounter = this.scene.currentBattle?.mysteryEncounter?.introVisuals; + if (mysteryEncounter) { + moveTargets.push(mysteryEncounter); + } + this.scene.tweens.add({ - targets: [this.scene.arenaEnemy, enemyField].flat(), + targets: moveTargets.flat(), x: "+=300", duration: 2000, onComplete: () => { @@ -1216,6 +1313,12 @@ export class PostSummonPhase extends PokemonPhase { pokemon.status.turnCount = 0; } this.scene.arena.applyTags(ArenaTrapTag, pokemon); + + // If this is fight or flight mystery encounter and is enemy pokemon summon phase, add enraged tag + if (pokemon.findTags(t => t instanceof MysteryEncounterPostSummonTag)) { + pokemon.lapseTag(BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON); + } + applyPostSummonAbAttrs(PostSummonAbAttr, pokemon).then(() => this.end()); } } @@ -1376,7 +1479,7 @@ export class SummonPhase extends PartyMemberPokemonPhase { preSummon(): void { const partyMember = this.getPokemon(); // If the Pokemon about to be sent out is fainted or illegal under a challenge, switch to the first non-fainted legal Pokemon - if (!partyMember.isAllowedInBattle()) { + if (!partyMember.isAllowedInBattle() || (this.player && isNullOrUndefined(this.getParty().find(p => p.id === partyMember.id)))) { console.warn("The Pokemon about to be sent out is fainted or illegal under a challenge. Attempting to resolve..."); // First check if they're somehow still in play, if so remove them. @@ -1424,13 +1527,16 @@ export class SummonPhase extends PartyMemberPokemonPhase { onComplete: () => this.scene.trainer.setVisible(false) }); this.scene.time.delayedCall(750, () => this.summon()); - } else { + } else if (this.scene.currentBattle.battleType === BattleType.TRAINER || this.scene?.currentBattle?.mysteryEncounter?.encounterVariant === MysteryEncounterVariant.TRAINER_BATTLE) { const trainerName = this.scene.currentBattle.trainer.getName(!(this.fieldIndex % 2) ? TrainerSlot.TRAINER : TrainerSlot.TRAINER_PARTNER); const pokemonName = this.getPokemon().name; const message = i18next.t("battle:trainerSendOut", { trainerName, pokemonName }); this.scene.pbTrayEnemy.hide(); this.scene.ui.showText(message, null, () => this.summon()); + } else if (this.scene.currentBattle.battleType === BattleType.MYSTERY_ENCOUNTER) { + this.scene.pbTrayEnemy.hide(); + this.summonWild(); } } @@ -1512,6 +1618,57 @@ export class SummonPhase extends PartyMemberPokemonPhase { }); } + summonWild(): void { + const pokemon = this.getPokemon(); + + if (this.fieldIndex === 1) { + pokemon.setFieldPosition(FieldPosition.RIGHT, 0); + } else { + const availablePartyMembers = this.getParty().filter(p => !p.isFainted()).length; + pokemon.setFieldPosition(!this.scene.currentBattle.double || availablePartyMembers === 1 ? FieldPosition.CENTER : FieldPosition.LEFT); + } + + this.scene.add.existing(pokemon); + this.scene.field.add(pokemon); + if (!this.player) { + const playerPokemon = this.scene.getPlayerPokemon() as Pokemon; + if (playerPokemon?.visible) { + this.scene.field.moveBelow(pokemon, playerPokemon); + } + this.scene.currentBattle.seenEnemyPartyMemberIds.add(pokemon.id); + } + this.scene.updateModifiers(this.player); + this.scene.updateFieldScale(); + pokemon.showInfo(); + pokemon.playAnim(); + pokemon.setVisible(true); + pokemon.getSprite().setVisible(true); + pokemon.setScale(0.75); + pokemon.tint(getPokeballTintColor(pokemon.pokeball)); + pokemon.untint(250, "Sine.easeIn"); + this.scene.updateFieldScale(); + pokemon.x += 16; + pokemon.y -= 16; + pokemon.alpha = 0; + + // Ease pokemon in + this.scene.tweens.add({ + targets: pokemon, + x: "-=16", + y: "+=16", + alpha: 1, + duration: 1000, + ease: "Sine.easeIn", + scale: pokemon.getSpriteScale(), + onComplete: () => { + pokemon.cry(pokemon.getHpRatio() > 0.25 ? undefined : { rate: 0.85 }); + pokemon.getSprite().clearTint(); + pokemon.resetSummonData(); + this.scene.time.delayedCall(1000, () => this.end()); + } + }); + } + onEnd(): void { const pokemon = this.getPokemon(); @@ -1521,7 +1678,7 @@ export class SummonPhase extends PartyMemberPokemonPhase { pokemon.resetTurnData(); - if (!this.loaded || this.scene.currentBattle.battleType === BattleType.TRAINER || (this.scene.currentBattle.waveIndex % 10) === 1) { + if (!this.loaded || this.scene.currentBattle.battleType === BattleType.TRAINER || this.scene.currentBattle.battleType === BattleType.MYSTERY_ENCOUNTER || (this.scene.currentBattle.waveIndex % 10) === 1) { this.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeActiveTrigger, true); this.queuePostSummon(); } @@ -1583,6 +1740,11 @@ export class SwitchSummonPhase extends SummonPhase { (this.player ? this.scene.getEnemyField() : this.scene.getPlayerField()).forEach(enemyPokemon => enemyPokemon.removeTagsBySourceId(pokemon.id)); } + // TODO: maybe remove this? Not sure if still necessary + if (!pokemon.isActive() || !pokemon.isOnField()) { + this.switchAndSummon(); + } + this.scene.ui.showText(this.player ? i18next.t("battle:playerComeBack", { pokemonName: pokemon.name }) : i18next.t("battle:trainerComeBack", { @@ -2001,6 +2163,13 @@ export class CommandPhase extends FieldPhase { this.scene.ui.showText(null, 0); this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); }, null, true); + } else if (this.scene.currentBattle.battleType === BattleType.MYSTERY_ENCOUNTER && !this.scene.currentBattle.mysteryEncounter.catchAllowed) { + this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); + this.scene.ui.setMode(Mode.MESSAGE); + this.scene.ui.showText(i18next.t("battle:noPokeballMysteryEncounter"), null, () => { + this.scene.ui.showText(null, 0); + this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); + }, null, true); } else { const targets = this.scene.getEnemyField().filter(p => p.isActive(true)).map(p => p.getBattlerIndex()); if (targets.length > 1) { @@ -3774,7 +3943,7 @@ export class FaintPhase extends PokemonPhase { } } else { this.scene.unshiftPhase(new VictoryPhase(this.scene, this.battlerIndex)); - if (this.scene.currentBattle.battleType === BattleType.TRAINER) { + if (this.scene.currentBattle.battleType === BattleType.TRAINER || this.scene.currentBattle.battleType === BattleType.MYSTERY_ENCOUNTER) { const hasReservePartyMember = !!this.scene.getEnemyParty().filter(p => p.isActive() && !p.isOnField() && p.trainerSlot === (pokemon as EnemyPokemon).trainerSlot).length; if (hasReservePartyMember) { this.scene.pushPhase(new SwitchSummonPhase(this.scene, this.fieldIndex, -1, false, false, false)); @@ -3870,6 +4039,8 @@ export class VictoryPhase extends PokemonPhase { let expValue = this.getPokemon().getExpValue(); if (this.scene.currentBattle.battleType === BattleType.TRAINER) { expValue = Math.floor(expValue * 1.5); + } else if (this.scene.currentBattle.battleType === BattleType.MYSTERY_ENCOUNTER) { + expValue = Math.floor(expValue * this.scene.currentBattle.mysteryEncounter.expMultiplier); } for (const partyMember of nonFaintedPartyMembers) { const pId = partyMember.id; @@ -3938,7 +4109,13 @@ export class VictoryPhase extends PokemonPhase { } } - if (!this.scene.getEnemyParty().find(p => this.scene.currentBattle.battleType ? !p?.isFainted(true) : p.isOnField())) { + if (this.scene.currentBattle.battleType === BattleType.MYSTERY_ENCOUNTER) { + handleMysteryEncounterVictory(this.scene); + this.end(); + return; + } + + if (!this.scene.getEnemyParty().find(p => this.scene.currentBattle.battleType === BattleType.WILD ? p.isOnField() : !p?.isFainted(true))) { this.scene.pushPhase(new BattleEndPhase(this.scene)); if (this.scene.currentBattle.battleType === BattleType.TRAINER) { this.scene.pushPhase(new TrainerVictoryPhase(this.scene)); @@ -3968,6 +4145,7 @@ export class VictoryPhase extends PokemonPhase { this.scene.pushPhase(new AddEnemyBuffModifierPhase(this.scene)); } } + this.scene.pushPhase(new NewBattlePhase(this.scene)); } else { this.scene.currentBattle.battleType = BattleType.CLEAR; diff --git a/src/phases/battle-phase.ts b/src/phases/battle-phase.ts new file mode 100644 index 00000000000..62c35403f3f --- /dev/null +++ b/src/phases/battle-phase.ts @@ -0,0 +1,47 @@ +import {Phase} from "#app/phase"; +import BattleScene from "#app/battle-scene"; +import {TrainerSlot} from "#app/data/trainer-config"; + +export class BattlePhase extends Phase { + constructor(scene: BattleScene) { + super(scene); + } + + showEnemyTrainer(trainerSlot: TrainerSlot = TrainerSlot.NONE): void { + const sprites = this.scene.currentBattle.trainer.getSprites(); + const tintSprites = this.scene.currentBattle.trainer.getTintSprites(); + for (let i = 0; i < sprites.length; i++) { + const visible = !trainerSlot || !i === (trainerSlot === TrainerSlot.TRAINER) || sprites.length < 2; + [sprites[i], tintSprites[i]].map(sprite => { + if (visible) { + sprite.x = trainerSlot || sprites.length < 2 ? 0 : i ? 16 : -16; + } + sprite.setVisible(visible); + sprite.clearTint(); + }); + sprites[i].setVisible(visible); + tintSprites[i].setVisible(visible); + sprites[i].clearTint(); + tintSprites[i].clearTint(); + } + this.scene.tweens.add({ + targets: this.scene.currentBattle.trainer, + x: "-=16", + y: "+=16", + alpha: 1, + ease: "Sine.easeInOut", + duration: 750 + }); + } + + hideEnemyTrainer(): void { + this.scene.tweens.add({ + targets: this.scene.currentBattle.trainer, + x: "+=16", + y: "-=16", + alpha: 0, + ease: "Sine.easeInOut", + duration: 750 + }); + } +} diff --git a/src/phases/mystery-encounter-phase.ts b/src/phases/mystery-encounter-phase.ts new file mode 100644 index 00000000000..4e8fbd4c127 --- /dev/null +++ b/src/phases/mystery-encounter-phase.ts @@ -0,0 +1,474 @@ +import i18next from "i18next"; +import BattleScene from "../battle-scene"; +import { Phase } from "../phase"; +import { Mode } from "../ui/ui"; +import { + getTextWithEncounterDialogueTokens +} from "../data/mystery-encounters/mystery-encounter-utils"; +import { CheckSwitchPhase, NewBattlePhase, PostSummonPhase, ReturnPhase, ScanIvsPhase, SummonPhase, ToggleDoublePositionPhase } from "../phases"; +import MysteryEncounterOption from "../data/mystery-encounter-option"; +import { MysteryEncounterVariant } from "../data/mystery-encounter"; +import { getCharVariantFromDialogue } from "../data/dialogue"; +import { TrainerSlot } from "../data/trainer-config"; +import { BattleSpec } from "../enums/battle-spec"; +import { Tutorial, handleTutorial } from "../tutorial"; +import { IvScannerModifier } from "../modifier/modifier"; +import * as Utils from "../utils"; +import {SelectModifierPhase} from "#app/phases/select-modifier-phase"; +import {isNullOrUndefined} from "../utils"; + +/** + * Will handle (in order): + * - Clearing of phase queues to enter the Mystery Encounter game state + * - Management of session data related to MEs + * - Initialization of ME option select menu and UI + * - Execute onPreOptionPhase() logic if it exists for the selected option + * - Display any OptionTextDisplay.selected type dialogue that is set in the MysteryEncounterDialogue dialogue tree for selected option + * - Queuing of the MysteryEncounterOptionSelectedPhase + */ +export class MysteryEncounterPhase extends Phase { + constructor(scene: BattleScene) { + super(scene); + } + + start() { + super.start(); + + // Clears out queued phases that are part of standard battle + this.scene.ui.clearText(); + this.scene.clearPhaseQueue(); + this.scene.clearPhaseQueueSplice(); + + // Sets flag that ME was encountered + // Can be used in later MEs to check for requirements to spawn, etc. + this.scene.mysteryEncounterFlags.encounteredEvents.push([this.scene.currentBattle.mysteryEncounter.encounterType, this.scene.currentBattle.mysteryEncounter.encounterTier]); + + // Initiates encounter dialogue window and option select + this.scene.ui.setMode(Mode.MYSTERY_ENCOUNTER); + } + + handleOptionSelect(option: MysteryEncounterOption, index: number): boolean { + // Set option selected flag + this.scene.currentBattle.mysteryEncounter.selectedOption = option; + + if (!option.onOptionPhase) { + return false; + } + + // Populate dialogue tokens for option requirements + this.scene.currentBattle.mysteryEncounter.populateDialogueTokensFromRequirements(); + + if (option.onPreOptionPhase) { + this.scene.executeWithSeedOffset(async () => { + return await option.onPreOptionPhase(this.scene) + .then((result) => { + if (isNullOrUndefined(result) || result) { + this.continueEncounter(index); + } + }); + }, this.scene.currentBattle.waveIndex * 1000); + } else { + this.continueEncounter(index); + } + + return true; + } + + continueEncounter(optionIndex: number) { + const endDialogueAndContinueEncounter = () => { + this.scene.pushPhase(new MysteryEncounterOptionSelectedPhase(this.scene)); + this.end(); + }; + + const optionSelectDialogue = this.scene.currentBattle?.mysteryEncounter?.dialogue?.encounterOptionsDialogue?.options?.[optionIndex]; + if (optionSelectDialogue?.selected?.length > 0) { + // Handle intermediate dialogue (between player selection event and the onOptionSelect logic) + this.scene.ui.setMode(Mode.MESSAGE); + const selectedDialogue = optionSelectDialogue.selected; + let i = 0; + const showNextDialogue = () => { + const nextAction = i === selectedDialogue.length - 1 ? endDialogueAndContinueEncounter : showNextDialogue; + const dialogue = selectedDialogue[i]; + let title: string = null; + const text: string = getTextWithEncounterDialogueTokens(this.scene, dialogue.text); + if (dialogue.speaker) { + title = getTextWithEncounterDialogueTokens(this.scene, dialogue.speaker); + } + + if (title) { + this.scene.ui.showDialogue(text, title, null, nextAction, 0, i === 0 ? 750 : 0); + } else { + this.scene.ui.showText(text, null, nextAction, i === 0 ? 750 : 0, true); + } + i++; + }; + + showNextDialogue(); + } else { + endDialogueAndContinueEncounter(); + } + } + + cancel() { + this.end(); + } + + end() { + this.scene.ui.setMode(Mode.MESSAGE).then(() => super.end()); + } +} + +/** + * Will handle (in order): + * - Execute onOptionSelect() logic if it exists for the selected option + * + * It is important to point out that no phases are directly queued by any logic within this phase + * Any phase that is meant to follow this one MUST be queued via the onOptionSelect() logic of the selected option + */ +export class MysteryEncounterOptionSelectedPhase extends Phase { + onOptionSelect: (scene: BattleScene) => Promise; + + constructor(scene: BattleScene) { + super(scene); + this.onOptionSelect = this.scene.currentBattle.mysteryEncounter.selectedOption.onOptionPhase; + } + + start() { + super.start(); + if (this.scene.currentBattle.mysteryEncounter.hideIntroVisuals) { + this.hideMysteryEncounterIntroVisuals().then(() => { + this.scene.executeWithSeedOffset(() => { + this.onOptionSelect(this.scene).finally(() => { + this.end(); + }); + }, this.scene.currentBattle.waveIndex * 1000); + }); + } else { + this.scene.executeWithSeedOffset(() => { + this.onOptionSelect(this.scene).finally(() => { + this.end(); + }); + }, this.scene.currentBattle.waveIndex * 1000); + } + } + + hideMysteryEncounterIntroVisuals(): Promise { + return new Promise(resolve => { + const introVisuals = this.scene.currentBattle.mysteryEncounter.introVisuals; + if (introVisuals) { + // Hide + this.scene.tweens.add({ + targets: introVisuals, + x: "+=16", + y: "-=16", + alpha: 0, + ease: "Sine.easeInOut", + duration: 750, + onComplete: () => { + this.scene.field.remove(introVisuals); + introVisuals.setVisible(false); + introVisuals.destroy(); + this.scene.currentBattle.mysteryEncounter.introVisuals = null; + resolve(true); + } + }); + } else { + resolve(true); + } + }); + } +} + +/** + * Will handle (in order): + * - Setting BGM + * - Showing intro dialogue for an enemy trainer or wild Pokemon + * - Sliding in the visuals for enemy trainer or wild Pokemon, as well as handling summoning animations + * - Queue the SummonPhases, PostSummonPhases, etc., required to initialize the phase queue for a battle + */ +export class MysteryEncounterBattlePhase extends Phase { + constructor(scene: BattleScene) { + super(scene); + } + + start() { + super.start(); + + this.doMysteryEncounterBattle(this.scene); + } + + getBattleMessage(scene: BattleScene): string { + const enemyField = scene.getEnemyField(); + const encounterVariant = scene.currentBattle.mysteryEncounter.encounterVariant; + + if (scene.currentBattle.battleSpec === BattleSpec.FINAL_BOSS) { + return i18next.t("battle:bossAppeared", { bossName: enemyField[0].name }); + } + + if (encounterVariant === MysteryEncounterVariant.TRAINER_BATTLE) { + if (scene.currentBattle.double) { + return i18next.t("battle:trainerAppearedDouble", { trainerName: scene.currentBattle.trainer.getName(TrainerSlot.NONE, true) }); + + } else { + return i18next.t("battle:trainerAppeared", { trainerName: scene.currentBattle.trainer.getName(TrainerSlot.NONE, true) }); + } + } + + return enemyField.length === 1 + ? i18next.t("battle:singleWildAppeared", { pokemonName: enemyField[0].name }) + : i18next.t("battle:multiWildAppeared", { pokemonName1: enemyField[0].name, pokemonName2: enemyField[1].name }); + } + + doMysteryEncounterBattle(scene: BattleScene) { + const encounterVariant = scene.currentBattle.mysteryEncounter.encounterVariant; + if (encounterVariant === MysteryEncounterVariant.WILD_BATTLE || encounterVariant === MysteryEncounterVariant.BOSS_BATTLE) { + // Summons the wild/boss Pokemon + if (encounterVariant === MysteryEncounterVariant.BOSS_BATTLE) { + scene.playBgm(undefined); + } + const availablePartyMembers = scene.getEnemyParty().filter(p => !p.isFainted()).length; + scene.unshiftPhase(new SummonPhase(scene, 0, false)); + if (scene.currentBattle.double && availablePartyMembers > 1) { + scene.unshiftPhase(new SummonPhase(scene, 1, false)); + } + + if (!scene.currentBattle.mysteryEncounter.hideBattleIntroMessage) { + scene.ui.showText(this.getBattleMessage(scene), null, () => this.endBattleSetup(scene), 1500); + } else { + this.endBattleSetup(scene); + } + } else if (encounterVariant === MysteryEncounterVariant.TRAINER_BATTLE) { + this.showEnemyTrainer(); + const doSummon = () => { + scene.currentBattle.started = true; + scene.playBgm(undefined); + scene.pbTray.showPbTray(scene.getParty()); + scene.pbTrayEnemy.showPbTray(scene.getEnemyParty()); + const doTrainerSummon = () => { + this.hideEnemyTrainer(); + const availablePartyMembers = scene.getEnemyParty().filter(p => !p.isFainted()).length; + scene.unshiftPhase(new SummonPhase(scene, 0, false)); + if (scene.currentBattle.double && availablePartyMembers > 1) { + scene.unshiftPhase(new SummonPhase(scene, 1, false)); + } + this.endBattleSetup(scene); + }; + if (!scene.currentBattle.mysteryEncounter.hideBattleIntroMessage) { + scene.ui.showText(this.getBattleMessage(scene), null, doTrainerSummon, 1500, true); + } else { + doTrainerSummon(); + } + }; + + const encounterMessages = scene.currentBattle.trainer.getEncounterMessages(); + + if (!encounterMessages?.length) { + doSummon(); + } else { + const trainer = this.scene.currentBattle.trainer; + let message: string; + scene.executeWithSeedOffset(() => message = Utils.randSeedItem(encounterMessages), scene.currentBattle.waveIndex * 1000); + + const showDialogueAndSummon = () => { + scene.ui.showDialogue(message, trainer.getName(TrainerSlot.NONE, true), null, () => { + scene.charSprite.hide().then(() => scene.hideFieldOverlay(250).then(() => doSummon())); + }); + }; + if (scene.currentBattle.trainer.config.hasCharSprite && !scene.ui.shouldSkipDialogue(message)) { + scene.showFieldOverlay(500).then(() => scene.charSprite.showCharacter(trainer.getKey(), getCharVariantFromDialogue(encounterMessages[0])).then(() => showDialogueAndSummon())); + } else { + showDialogueAndSummon(); + } + } + } + } + + endBattleSetup(scene: BattleScene) { + const enemyField = scene.getEnemyField(); + const encounterVariant = scene.currentBattle.mysteryEncounter.encounterVariant; + + if (encounterVariant !== MysteryEncounterVariant.TRAINER_BATTLE) { + enemyField.map(p => this.scene.pushConditionalPhase(new PostSummonPhase(this.scene, p.getBattlerIndex()), () => { + // if there is not a player party, we can't continue + if (!this.scene.getParty()?.length) { + return false; + } + // how many player pokemon are on the field ? + const pokemonsOnFieldCount = this.scene.getParty().filter(p => p.isOnField()).length; + // if it's a 2vs1, there will never be a 2nd pokemon on our field even + const requiredPokemonsOnField = Math.min(this.scene.getParty().filter((p) => !p.isFainted()).length, 2); + // if it's a double, there should be 2, otherwise 1 + if (this.scene.currentBattle.double) { + return pokemonsOnFieldCount === requiredPokemonsOnField; + } + return pokemonsOnFieldCount === 1; + })); + const ivScannerModifier = this.scene.findModifier(m => m instanceof IvScannerModifier); + if (ivScannerModifier) { + enemyField.map(p => this.scene.pushPhase(new ScanIvsPhase(this.scene, p.getBattlerIndex(), Math.min(ivScannerModifier.getStackCount() * 2, 6)))); + } + } + + const availablePartyMembers = scene.getParty().filter(p => !p.isFainted()); + + if (!availablePartyMembers[0].isOnField()) { + scene.pushPhase(new SummonPhase(scene, 0)); + } + + if (scene.currentBattle.double) { + if (availablePartyMembers.length > 1) { + scene.pushPhase(new ToggleDoublePositionPhase(scene, true)); + if (!availablePartyMembers[1].isOnField()) { + scene.pushPhase(new SummonPhase(scene, 1)); + } + } + } else { + if (availablePartyMembers.length > 1 && availablePartyMembers[1].isOnField()) { + scene.pushPhase(new ReturnPhase(scene, 1)); + } + scene.pushPhase(new ToggleDoublePositionPhase(scene, false)); + } + + if (encounterVariant !== MysteryEncounterVariant.TRAINER_BATTLE && (scene.currentBattle.waveIndex > 1 || !scene.gameMode.isDaily)) { + const minPartySize = scene.currentBattle.double ? 2 : 1; + if (availablePartyMembers.length > minPartySize) { + scene.pushPhase(new CheckSwitchPhase(scene, 0, scene.currentBattle.double)); + if (scene.currentBattle.double) { + scene.pushPhase(new CheckSwitchPhase(scene, 1, scene.currentBattle.double)); + } + } + } + + // TODO: remove? + handleTutorial(this.scene, Tutorial.Access_Menu).then(() => super.end()); + } + + showEnemyTrainer(): void { + // Show enemy trainer + const trainer = this.scene.currentBattle.trainer; + trainer.alpha = 0; + trainer.x += 16; + trainer.y -= 16; + trainer.setVisible(true); + this.scene.tweens.add({ + targets: trainer, + x: "-=16", + y: "+=16", + alpha: 1, + ease: "Sine.easeInOut", + duration: 750, + onComplete: () => { + trainer.untint(100, "Sine.easeOut"); + trainer.playAnim(); + } + }); + } + + hideEnemyTrainer(): void { + this.scene.tweens.add({ + targets: this.scene.currentBattle.trainer, + x: "+=16", + y: "-=16", + alpha: 0, + ease: "Sine.easeInOut", + duration: 750 + }); + } +} + +/** + * Will handle (in order): + * - Any encounter reward logic that is set within MysteryEncounter doEncounterRewards + * - Otherwise, can add a no-reward-item shop with only Potions, etc. if addHealPhase is true + * - Queuing of the PostMysteryEncounterPhase + */ +export class MysteryEncounterRewardsPhase extends Phase { + addHealPhase: boolean; + + constructor(scene: BattleScene, addHealPhase: boolean = false) { + super(scene); + this.addHealPhase = addHealPhase; + } + + start() { + super.start(); + + this.scene.executeWithSeedOffset(() => { + 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, null, { fillRemaining: false, rerollMultiplier: 0})); + } + }, this.scene.currentBattle.waveIndex * 1000); + + this.scene.pushPhase(new PostMysteryEncounterPhase(this.scene)); + this.end(); + } +} + +/** + * Will handle (in order): + * - onPostOptionSelect logic (based on an option that was selected) + * - Showing any outro dialogue messages + * - Cleanup of any leftover intro visuals + * - Queuing of the next wave + */ +export class PostMysteryEncounterPhase extends Phase { + onPostOptionSelect: (scene: BattleScene) => Promise; + + constructor(scene: BattleScene) { + super(scene); + this.onPostOptionSelect = this.scene.currentBattle.mysteryEncounter.selectedOption.onPostOptionPhase; + } + + start() { + super.start(); + + if (this.onPostOptionSelect) { + this.scene.executeWithSeedOffset(async () => { + return await this.onPostOptionSelect(this.scene) + .then((result) => { + if (isNullOrUndefined(result) || result) { + this.continueEncounter(); + } + }); + }, this.scene.currentBattle.waveIndex * 1000); + } else { + this.continueEncounter(); + } + } + + continueEncounter() { + const endPhase = () => { + this.scene.pushPhase(new NewBattlePhase(this.scene)); + this.end(); + }; + + const outroDialogue = this.scene.currentBattle?.mysteryEncounter?.dialogue?.outro; + if (outroDialogue?.length > 0) { + let i = 0; + const showNextDialogue = () => { + const nextAction = i === outroDialogue.length - 1 ? endPhase : showNextDialogue; + const dialogue = outroDialogue[i]; + let title: string = null; + const text: string = getTextWithEncounterDialogueTokens(this.scene, dialogue.text); + if (dialogue.speaker) { + title = getTextWithEncounterDialogueTokens(this.scene, dialogue.speaker); + } + + this.scene.ui.setMode(Mode.MESSAGE); + if (title) { + this.scene.ui.showDialogue(text, title, null, nextAction, 0, i === 0 ? 750 : 0); + } else { + this.scene.ui.showText(text, null, nextAction, i === 0 ? 750 : 0, true); + } + i++; + }; + + showNextDialogue(); + } else { + endPhase(); + } + } +} diff --git a/src/phases/select-modifier-phase.ts b/src/phases/select-modifier-phase.ts new file mode 100644 index 00000000000..5e53281ba84 --- /dev/null +++ b/src/phases/select-modifier-phase.ts @@ -0,0 +1,259 @@ +import {ModifierTier} from "#app/modifier/modifier-tier"; +import { + CustomModifierSettings, + FusePokemonModifierType, getPlayerModifierTypeOptions, + getPlayerShopModifierTypeOptionsForWave, ModifierPoolType, + ModifierType, + ModifierTypeOption, + PokemonModifierType, + PokemonMoveModifierType, + PokemonPpRestoreModifierType, + PokemonPpUpModifierType, + regenerateModifierPoolThresholds, + RememberMoveModifierType, + TmModifierType +} from "#app/modifier/modifier-type"; +import BattleScene from "#app/battle-scene"; +import * as Utils from "#app/utils"; +import {ExtraModifierModifier, Modifier, PokemonHeldItemModifier} from "#app/modifier/modifier"; +import i18next from "#app/plugins/i18n"; +import {Mode} from "#app/ui/ui"; +import PartyUiHandler, {PartyOption, PartyUiMode} from "#app/ui/party-ui-handler"; +import ModifierSelectUiHandler, {SHOP_OPTIONS_ROW_LIMIT} from "#app/ui/modifier-select-ui-handler"; +import {BattlePhase} from "#app/phases/battle-phase"; +import {isNullOrUndefined} from "#app/utils"; + +export class SelectModifierPhase extends BattlePhase { + private rerollCount: integer; + private modifierTiers: ModifierTier[]; + private customModifierSettings: CustomModifierSettings; + + constructor(scene: BattleScene, rerollCount: integer = 0, modifierTiers?: ModifierTier[], customModifierSettings?: CustomModifierSettings) { + super(scene); + + this.rerollCount = rerollCount; + this.modifierTiers = modifierTiers; + this.customModifierSettings = customModifierSettings; + } + + start() { + super.start(); + + if (!this.rerollCount) { + this.updateSeed(); + } else { + this.scene.reroll = false; + } + + const party = this.scene.getParty(); + regenerateModifierPoolThresholds(party, this.getPoolType(), this.rerollCount); + const modifierCount = new Utils.IntegerHolder(3); + if (this.isPlayer()) { + this.scene.applyModifiers(ExtraModifierModifier, true, modifierCount); + } + + // If custom modifiers are specified, overrides default item count + if (!!this.customModifierSettings) { + const newItemCount = (this.customModifierSettings.guaranteedModifierTiers?.length || 0) + + (this.customModifierSettings.guaranteedModifierTypeOptions?.length || 0) + + (this.customModifierSettings.guaranteedModifierTypeFuncs?.length || 0); + if (this.customModifierSettings.fillRemaining) { + const originalCount = modifierCount.value; + modifierCount.value = originalCount > newItemCount ? originalCount : newItemCount; + } else { + modifierCount.value = newItemCount; + } + } + + const typeOptions: ModifierTypeOption[] = this.getModifierTypeOptions(modifierCount.value); + + const modifierSelectCallback = (rowCursor: integer, cursor: integer) => { + if (rowCursor < 0 || cursor < 0) { + this.scene.ui.showText(i18next.t("battle:skipItemQuestion"), null, () => { + this.scene.ui.setOverlayMode(Mode.CONFIRM, () => { + this.scene.ui.revertMode(); + this.scene.ui.setMode(Mode.MESSAGE); + super.end(); + }, () => this.scene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer(), typeOptions, modifierSelectCallback, this.getRerollCost(typeOptions, this.scene.lockModifierTiers))); + }); + return false; + } + let modifierType: ModifierType; + let cost: integer; + switch (rowCursor) { + case 0: + switch (cursor) { + case 0: + const rerollCost = this.getRerollCost(typeOptions, this.scene.lockModifierTiers); + if (rerollCost === 0 || this.scene.money < rerollCost) { + this.scene.ui.playError(); + return false; + } else { + this.scene.reroll = true; + this.scene.unshiftPhase(new SelectModifierPhase(this.scene, this.rerollCount + 1, typeOptions.map(o => o.type.tier))); + this.scene.ui.clearText(); + this.scene.ui.setMode(Mode.MESSAGE).then(() => super.end()); + this.scene.money -= rerollCost; + this.scene.updateMoneyText(); + this.scene.animateMoneyChanged(false); + this.scene.playSound("buy"); + } + break; + case 1: + this.scene.ui.setModeWithoutClear(Mode.PARTY, PartyUiMode.MODIFIER_TRANSFER, -1, (fromSlotIndex: integer, itemIndex: integer, itemQuantity: integer, toSlotIndex: integer) => { + if (toSlotIndex !== undefined && fromSlotIndex < 6 && toSlotIndex < 6 && fromSlotIndex !== toSlotIndex && itemIndex > -1) { + const itemModifiers = this.scene.findModifiers(m => m instanceof PokemonHeldItemModifier + && (m as PokemonHeldItemModifier).getTransferrable(true) && (m as PokemonHeldItemModifier).pokemonId === party[fromSlotIndex].id) as PokemonHeldItemModifier[]; + const itemModifier = itemModifiers[itemIndex]; + this.scene.tryTransferHeldItemModifier(itemModifier, party[toSlotIndex], true, itemQuantity); + } else { + this.scene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer(), typeOptions, modifierSelectCallback, this.getRerollCost(typeOptions, this.scene.lockModifierTiers)); + } + }, PartyUiHandler.FilterItemMaxStacks); + break; + case 2: + this.scene.ui.setModeWithoutClear(Mode.PARTY, PartyUiMode.CHECK, -1, () => { + this.scene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer(), typeOptions, modifierSelectCallback, this.getRerollCost(typeOptions, this.scene.lockModifierTiers)); + }); + break; + case 3: + this.scene.lockModifierTiers = !this.scene.lockModifierTiers; + const uiHandler = this.scene.ui.getHandler() as ModifierSelectUiHandler; + uiHandler.setRerollCost(this.getRerollCost(typeOptions, this.scene.lockModifierTiers)); + uiHandler.updateLockRaritiesText(); + uiHandler.updateRerollCostText(); + return false; + } + return true; + case 1: + if (typeOptions.length === 0) { + this.scene.ui.revertMode(); + this.scene.ui.setMode(Mode.MESSAGE); + super.end(); + } + modifierType = typeOptions[cursor].type; + break; + default: + const shopOptions = getPlayerShopModifierTypeOptionsForWave(this.scene.currentBattle.waveIndex, this.scene.getWaveMoneyAmount(1)); + const shopOption = shopOptions[rowCursor > 2 || shopOptions.length <= SHOP_OPTIONS_ROW_LIMIT ? cursor : cursor + SHOP_OPTIONS_ROW_LIMIT]; + modifierType = shopOption.type; + cost = shopOption.cost; + break; + } + + if (cost && this.scene.money < cost) { + this.scene.ui.playError(); + return false; + } + + const applyModifier = (modifier: Modifier, playSound: boolean = false) => { + const result = this.scene.addModifier(modifier, false, playSound); + if (cost) { + result.then(success => { + if (success) { + this.scene.money -= cost; + this.scene.updateMoneyText(); + this.scene.animateMoneyChanged(false); + this.scene.playSound("buy"); + (this.scene.ui.getHandler() as ModifierSelectUiHandler).updateCostText(); + } else { + this.scene.ui.playError(); + } + }); + } else { + const doEnd = () => { + this.scene.ui.clearText(); + this.scene.ui.setMode(Mode.MESSAGE); + super.end(); + }; + if (result instanceof Promise) { + result.then(() => doEnd()); + } else { + doEnd(); + } + } + }; + + if (modifierType instanceof PokemonModifierType) { + if (modifierType instanceof FusePokemonModifierType) { + this.scene.ui.setModeWithoutClear(Mode.PARTY, PartyUiMode.SPLICE, -1, (fromSlotIndex: integer, spliceSlotIndex: integer) => { + if (spliceSlotIndex !== undefined && fromSlotIndex < 6 && spliceSlotIndex < 6 && fromSlotIndex !== spliceSlotIndex) { + this.scene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer()).then(() => { + const modifier = modifierType.newModifier(party[fromSlotIndex], party[spliceSlotIndex]); + applyModifier(modifier, true); + }); + } else { + this.scene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer(), typeOptions, modifierSelectCallback, this.getRerollCost(typeOptions, this.scene.lockModifierTiers)); + } + }, modifierType.selectFilter); + } else { + const pokemonModifierType = modifierType as PokemonModifierType; + const isMoveModifier = modifierType instanceof PokemonMoveModifierType; + const isTmModifier = modifierType instanceof TmModifierType; + const isRememberMoveModifier = modifierType instanceof RememberMoveModifierType; + const isPpRestoreModifier = (modifierType instanceof PokemonPpRestoreModifierType || modifierType instanceof PokemonPpUpModifierType); + const partyUiMode = isMoveModifier ? PartyUiMode.MOVE_MODIFIER + : isTmModifier ? PartyUiMode.TM_MODIFIER + : isRememberMoveModifier ? PartyUiMode.REMEMBER_MOVE_MODIFIER + : PartyUiMode.MODIFIER; + const tmMoveId = isTmModifier + ? (modifierType as TmModifierType).moveId + : undefined; + this.scene.ui.setModeWithoutClear(Mode.PARTY, partyUiMode, -1, (slotIndex: integer, option: PartyOption) => { + if (slotIndex < 6) { + this.scene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer()).then(() => { + const modifier = !isMoveModifier + ? !isRememberMoveModifier + ? modifierType.newModifier(party[slotIndex]) + : modifierType.newModifier(party[slotIndex], option as integer) + : modifierType.newModifier(party[slotIndex], option - PartyOption.MOVE_1); + applyModifier(modifier, true); + }); + } else { + this.scene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer(), typeOptions, modifierSelectCallback, this.getRerollCost(typeOptions, this.scene.lockModifierTiers)); + } + }, pokemonModifierType.selectFilter, modifierType instanceof PokemonMoveModifierType ? (modifierType as PokemonMoveModifierType).moveSelectFilter : undefined, tmMoveId, isPpRestoreModifier); + } + } else { + applyModifier(modifierType.newModifier()); + } + + return !cost; + }; + this.scene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer(), typeOptions, modifierSelectCallback, this.getRerollCost(typeOptions, this.scene.lockModifierTiers)); + } + + updateSeed(): void { + this.scene.resetSeed(); + } + + isPlayer(): boolean { + return true; + } + + getRerollCost(typeOptions: ModifierTypeOption[], lockRarities: boolean): integer { + let baseValue = 0; + if (lockRarities) { + const tierValues = [50, 125, 300, 750, 2000]; + for (const opt of typeOptions) { + baseValue += tierValues[opt.type.tier]; + } + } else { + baseValue = 250; + } + const multiplier = !isNullOrUndefined(this.customModifierSettings?.rerollMultiplier) ? this.customModifierSettings.rerollMultiplier : 1; + return Math.min(Math.ceil(this.scene.currentBattle.waveIndex / 10) * baseValue * Math.pow(2, this.rerollCount) * multiplier, Number.MAX_SAFE_INTEGER); + } + + getPoolType(): ModifierPoolType { + return ModifierPoolType.PLAYER; + } + + getModifierTypeOptions(modifierCount: integer): ModifierTypeOption[] { + return getPlayerModifierTypeOptions(modifierCount, this.scene.getParty(), this.scene.lockModifierTiers ? this.modifierTiers : undefined, this.customModifierSettings); + } + + addModifier(modifier: Modifier): Promise { + return this.scene.addModifier(modifier, false, true); + } +} diff --git a/src/pipelines/sprite.ts b/src/pipelines/sprite.ts index 741c31183d4..a61d321c765 100644 --- a/src/pipelines/sprite.ts +++ b/src/pipelines/sprite.ts @@ -4,6 +4,7 @@ import Pokemon from "../field/pokemon"; import Trainer from "../field/trainer"; import FieldSpritePipeline from "./field-sprite"; import * as Utils from "../utils"; +import MysteryEncounterIntroVisuals from "../field/mystery-encounter-intro"; const spriteFragShader = ` #ifdef GL_FRAGMENT_PRECISION_HIGH @@ -353,7 +354,7 @@ export default class SpritePipeline extends FieldSpritePipeline { const ignoreFieldPos = data["ignoreFieldPos"] as boolean; const ignoreOverride = data["ignoreOverride"] as boolean; - const isEntityObj = sprite.parentContainer instanceof Pokemon || sprite.parentContainer instanceof Trainer; + const isEntityObj = sprite.parentContainer instanceof Pokemon || sprite.parentContainer instanceof Trainer || sprite.parentContainer instanceof MysteryEncounterIntroVisuals; const field = isEntityObj ? sprite.parentContainer.parentContainer : sprite.parentContainer; const position = isEntityObj ? [ sprite.parentContainer.x, sprite.parentContainer.y ] @@ -448,7 +449,7 @@ export default class SpritePipeline extends FieldSpritePipeline { const hasShadow = sprite.pipelineData["hasShadow"] as boolean; if (hasShadow) { - const isEntityObj = sprite.parentContainer instanceof Pokemon || sprite.parentContainer instanceof Trainer; + const isEntityObj = sprite.parentContainer instanceof Pokemon || sprite.parentContainer instanceof Trainer || sprite.parentContainer instanceof MysteryEncounterIntroVisuals; const field = isEntityObj ? sprite.parentContainer.parentContainer : sprite.parentContainer; const fieldScaleRatio = field.scale / 6; const baseY = (isEntityObj diff --git a/src/system/game-data.ts b/src/system/game-data.ts index ac54c942fc7..14e80623060 100644 --- a/src/system/game-data.ts +++ b/src/system/game-data.ts @@ -40,6 +40,8 @@ import { GameDataType } from "#enums/game-data-type"; import { Moves } from "#enums/moves"; import { PlayerGender } from "#enums/player-gender"; import { Species } from "#enums/species"; +import { MysteryEncounterFlags } from "../data/mystery-encounter-flags"; +import MysteryEncounter from "../data/mystery-encounter"; export const defaultStarterSpecies: Species[] = [ Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE, @@ -76,13 +78,13 @@ export function getDataTypeKey(dataType: GameDataType, slotId: integer = 0): str export function encrypt(data: string, bypassLogin: boolean): string { return (bypassLogin - ? (data: string) => btoa(data) + ? (data: string) => btoa(encodeURIComponent(data)) : (data: string) => AES.encrypt(data, saveKey))(data); } export function decrypt(data: string, bypassLogin: boolean): string { return (bypassLogin - ? (data: string) => atob(data) + ? (data: string) => decodeURIComponent(atob(data)) : (data: string) => AES.decrypt(data, saveKey).toString(enc.Utf8))(data); } @@ -122,6 +124,8 @@ export interface SessionSaveData { gameVersion: string; timestamp: integer; challenges: ChallengeData[]; + mysteryEncounter: MysteryEncounter; + mysteryEncounterFlags: MysteryEncounterFlags; } interface Unlocks { @@ -836,7 +840,9 @@ export class GameData { trainer: scene.currentBattle.battleType === BattleType.TRAINER ? new TrainerData(scene.currentBattle.trainer) : null, gameVersion: scene.game.config.gameVersion, timestamp: new Date().getTime(), - challenges: scene.gameMode.challenges.map(c => new ChallengeData(c)) + challenges: scene.gameMode.challenges.map(c => new ChallengeData(c)), + mysteryEncounter: scene.currentBattle.mysteryEncounter, + mysteryEncounterFlags: scene.mysteryEncounterFlags } as SessionSaveData; } @@ -927,11 +933,14 @@ export class GameData { scene.score = sessionData.score; scene.updateScoreText(); + scene.mysteryEncounterFlags = sessionData?.mysteryEncounterFlags ? sessionData?.mysteryEncounterFlags : new MysteryEncounterFlags(null); + scene.newArena(sessionData.arena.biome); const battleType = sessionData.battleType || 0; const trainerConfig = sessionData.trainer ? trainerConfigs[sessionData.trainer.trainerType] : null; - const battle = scene.newBattle(sessionData.waveIndex, battleType, sessionData.trainer, battleType === BattleType.TRAINER ? trainerConfig?.doubleOnly || sessionData.trainer?.variant === TrainerVariant.DOUBLE : sessionData.enemyParty.length > 1); + const mysteryEncounterConfig = sessionData?.mysteryEncounter; + const battle = scene.newBattle(sessionData.waveIndex, battleType, sessionData.trainer, battleType === BattleType.TRAINER ? trainerConfig?.doubleOnly || sessionData.trainer?.variant === TrainerVariant.DOUBLE : sessionData.enemyParty.length > 1, mysteryEncounterConfig); battle.enemyLevels = sessionData.enemyParty.map(p => p.level); scene.arena.init(); @@ -1145,6 +1154,14 @@ export class GameData { return ret; } + if (k === "mysteryEncounter") { + return new MysteryEncounter(v); + } + + if (k === "mysteryEncounterFlags") { + return new MysteryEncounterFlags(v); + } + return v; }) as SessionSaveData; } diff --git a/src/test/battle/battle.test.ts b/src/test/battle/battle.test.ts index 87949be70a8..fb498fe2b1d 100644 --- a/src/test/battle/battle.test.ts +++ b/src/test/battle/battle.test.ts @@ -10,7 +10,6 @@ import { EnemyCommandPhase, LoginPhase, SelectGenderPhase, - SelectModifierPhase, SelectStarterPhase, SummonPhase, TitlePhase, @@ -24,6 +23,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { PlayerGender } from "#enums/player-gender"; import { Species } from "#enums/species"; +import {SelectModifierPhase} from "#app/phases/select-modifier-phase"; describe("Test Battle Phase", () => { let phaserGame: Phaser.Game; diff --git a/src/test/lokalisation/battle-stat.test.ts b/src/test/lokalisation/battle-stat.test.ts new file mode 100644 index 00000000000..d894d705947 --- /dev/null +++ b/src/test/lokalisation/battle-stat.test.ts @@ -0,0 +1,208 @@ +import {beforeAll, describe, expect, it} from "vitest"; +import { getBattleStatName, getBattleStatLevelChangeDescription } from "#app/data/battle-stat.js"; +import { BattleStat } from "#app/data/battle-stat.js"; +import { pokemonInfo as enPokemonInfo } from "#app/locales/en/pokemon-info.js"; +import { battle as enBattleStat } from "#app/locales/en/battle.js"; +import { pokemonInfo as dePokemonInfo } from "#app/locales/de/pokemon-info.js"; +import { battle as deBattleStat } from "#app/locales/de/battle.js"; +import { pokemonInfo as esPokemonInfo } from "#app/locales/es/pokemon-info.js"; +import { battle as esBattleStat } from "#app/locales/es/battle.js"; +import { pokemonInfo as frPokemonInfo } from "#app/locales/fr/pokemon-info.js"; +import { battle as frBattleStat } from "#app/locales/fr/battle.js"; +import { pokemonInfo as itPokemonInfo } from "#app/locales/it/pokemon-info.js"; +import { battle as itBattleStat } from "#app/locales/it/battle.js"; +import { pokemonInfo as koPokemonInfo } from "#app/locales/ko/pokemon-info.js"; +import { battle as koBattleStat } from "#app/locales/ko/battle.js"; +import { pokemonInfo as ptBrPokemonInfo } from "#app/locales/pt_BR/pokemon-info.js"; +import { battle as ptBrBattleStat } from "#app/locales/pt_BR/battle.js"; +import { pokemonInfo as zhCnPokemonInfo } from "#app/locales/zh_CN/pokemon-info.js"; +import { battle as zhCnBattleStat } from "#app/locales/zh_CN/battle.js"; +import { pokemonInfo as zhTwPokemonInfo } from "#app/locales/zh_TW/pokemon-info.js"; +import { battle as zhTwBattleStat } from "#app/locales/zh_TW/battle.js"; + +import i18next, {initI18n} from "#app/plugins/i18n"; +import { KoreanPostpositionProcessor } from "i18next-korean-postposition-processor"; + +interface BattleStatTestUnit { + stat: BattleStat, + key: string +} + +interface BattleStatLevelTestUnit { + levels: integer, + up: boolean, + key: string +} + +function testBattleStatName(stat: BattleStat, expectMessage: string) { + const message = getBattleStatName(stat); + console.log(`message ${message}, expected ${expectMessage}`); + expect(message).toBe(expectMessage); +} + +function testBattleStatLevelChangeDescription(levels: integer, up: boolean, expectMessage: string) { + const message = getBattleStatLevelChangeDescription("{{pokemonNameWithAffix}}", "{{stats}}", levels, up); + console.log(`message ${message}, expected ${expectMessage}`); + expect(message).toBe(expectMessage); +} + +describe("Test for BattleStat Localization", () => { + const battleStatUnits: BattleStatTestUnit[] = []; + const battleStatLevelUnits: BattleStatLevelTestUnit[] = []; + + beforeAll(() => { + initI18n(); + + battleStatUnits.push({ stat: BattleStat.ATK, key: "Stat.ATK" }); + battleStatUnits.push({ stat: BattleStat.DEF, key: "Stat.DEF" }); + battleStatUnits.push({ stat: BattleStat.SPATK, key: "Stat.SPATK" }); + battleStatUnits.push({ stat: BattleStat.SPDEF, key: "Stat.SPDEF" }); + battleStatUnits.push({ stat: BattleStat.SPD, key: "Stat.SPD" }); + battleStatUnits.push({ stat: BattleStat.ACC, key: "Stat.ACC" }); + battleStatUnits.push({ stat: BattleStat.EVA, key: "Stat.EVA" }); + + battleStatLevelUnits.push({ levels: 1, up: true, key: "statRose" }); + battleStatLevelUnits.push({ levels: 2, up: true, key: "statSharplyRose" }); + battleStatLevelUnits.push({ levels: 3, up: true, key: "statRoseDrastically" }); + battleStatLevelUnits.push({ levels: 4, up: true, key: "statRoseDrastically" }); + battleStatLevelUnits.push({ levels: 5, up: true, key: "statRoseDrastically" }); + battleStatLevelUnits.push({ levels: 6, up: true, key: "statRoseDrastically" }); + battleStatLevelUnits.push({ levels: 7, up: true, key: "statWontGoAnyHigher" }); + battleStatLevelUnits.push({ levels: 1, up: false, key: "statFell" }); + battleStatLevelUnits.push({ levels: 2, up: false, key: "statHarshlyFell" }); + battleStatLevelUnits.push({ levels: 3, up: false, key: "statSeverelyFell" }); + battleStatLevelUnits.push({ levels: 4, up: false, key: "statSeverelyFell" }); + battleStatLevelUnits.push({ levels: 5, up: false, key: "statSeverelyFell" }); + battleStatLevelUnits.push({ levels: 6, up: false, key: "statSeverelyFell" }); + battleStatLevelUnits.push({ levels: 7, up: false, key: "statWontGoAnyLower" }); + }); + + it("Test getBattleStatName() in English", async () => { + i18next.changeLanguage("en"); + battleStatUnits.forEach(unit => { + testBattleStatName(unit.stat, enPokemonInfo[unit.key.split(".")[0]][unit.key.split(".")[1]]); + }); + }); + + it("Test getBattleStatLevelChangeDescription() in English", async () => { + i18next.changeLanguage("en"); + battleStatLevelUnits.forEach(unit => { + testBattleStatLevelChangeDescription(unit.levels, unit.up, enBattleStat[unit.key]); + }); + }); + + it("Test getBattleStatName() in Español", async () => { + i18next.changeLanguage("es"); + battleStatUnits.forEach(unit => { + testBattleStatName(unit.stat, esPokemonInfo[unit.key.split(".")[0]][unit.key.split(".")[1]]); + }); + }); + + it("Test getBattleStatLevelChangeDescription() in Español", async () => { + i18next.changeLanguage("es"); + battleStatLevelUnits.forEach(unit => { + testBattleStatLevelChangeDescription(unit.levels, unit.up, esBattleStat[unit.key]); + }); + }); + + it("Test getBattleStatName() in Italiano", async () => { + i18next.changeLanguage("it"); + battleStatUnits.forEach(unit => { + testBattleStatName(unit.stat, itPokemonInfo[unit.key.split(".")[0]][unit.key.split(".")[1]]); + }); + }); + + it("Test getBattleStatLevelChangeDescription() in Italiano", async () => { + i18next.changeLanguage("it"); + battleStatLevelUnits.forEach(unit => { + testBattleStatLevelChangeDescription(unit.levels, unit.up, itBattleStat[unit.key]); + }); + }); + + it("Test getBattleStatName() in Français", async () => { + i18next.changeLanguage("fr"); + battleStatUnits.forEach(unit => { + testBattleStatName(unit.stat, frPokemonInfo[unit.key.split(".")[0]][unit.key.split(".")[1]]); + }); + }); + + it("Test getBattleStatLevelChangeDescription() in Français", async () => { + i18next.changeLanguage("fr"); + battleStatLevelUnits.forEach(unit => { + testBattleStatLevelChangeDescription(unit.levels, unit.up, frBattleStat[unit.key]); + }); + }); + + it("Test getBattleStatName() in Deutsch", async () => { + i18next.changeLanguage("de"); + battleStatUnits.forEach(unit => { + testBattleStatName(unit.stat, dePokemonInfo[unit.key.split(".")[0]][unit.key.split(".")[1]]); + }); + }); + + it("Test getBattleStatLevelChangeDescription() in Deutsch", async () => { + i18next.changeLanguage("de"); + battleStatLevelUnits.forEach(unit => { + testBattleStatLevelChangeDescription(unit.levels, unit.up, deBattleStat[unit.key]); + }); + }); + + it("Test getBattleStatName() in Português (BR)", async () => { + i18next.changeLanguage("pt-BR"); + battleStatUnits.forEach(unit => { + testBattleStatName(unit.stat, ptBrPokemonInfo[unit.key.split(".")[0]][unit.key.split(".")[1]]); + }); + }); + + it("Test getBattleStatLevelChangeDescription() in Português (BR)", async () => { + i18next.changeLanguage("pt-BR"); + battleStatLevelUnits.forEach(unit => { + testBattleStatLevelChangeDescription(unit.levels, unit.up, ptBrBattleStat[unit.key]); + }); + }); + + it("Test getBattleStatName() in 简体中文", async () => { + i18next.changeLanguage("zh-CN"); + battleStatUnits.forEach(unit => { + testBattleStatName(unit.stat, zhCnPokemonInfo[unit.key.split(".")[0]][unit.key.split(".")[1]]); + }); + }); + + it("Test getBattleStatLevelChangeDescription() in 简体中文", async () => { + i18next.changeLanguage("zh-CN"); + battleStatLevelUnits.forEach(unit => { + testBattleStatLevelChangeDescription(unit.levels, unit.up, zhCnBattleStat[unit.key]); + }); + }); + + it("Test getBattleStatName() in 繁體中文", async () => { + i18next.changeLanguage("zh-TW"); + battleStatUnits.forEach(unit => { + testBattleStatName(unit.stat, zhTwPokemonInfo[unit.key.split(".")[0]][unit.key.split(".")[1]]); + }); + }); + + it("Test getBattleStatLevelChangeDescription() in 繁體中文", async () => { + i18next.changeLanguage("zh-TW"); + battleStatLevelUnits.forEach(unit => { + testBattleStatLevelChangeDescription(unit.levels, unit.up, zhTwBattleStat[unit.key]); + }); + }); + + it("Test getBattleStatName() in 한국어", async () => { + await i18next.changeLanguage("ko"); + battleStatUnits.forEach(unit => { + testBattleStatName(unit.stat, koPokemonInfo[unit.key.split(".")[0]][unit.key.split(".")[1]]); + }); + }); + + it("Test getBattleStatLevelChangeDescription() in 한국어", async () => { + i18next.changeLanguage("ko", () => { + battleStatLevelUnits.forEach(unit => { + const processor = new KoreanPostpositionProcessor(); + const message = processor.process(koBattleStat[unit.key]); + testBattleStatLevelChangeDescription(unit.levels, unit.up, message); + }); + }); + }); +}); diff --git a/src/test/lokalisation/french.test.ts b/src/test/lokalisation/french.test.ts new file mode 100644 index 00000000000..45429b1b157 --- /dev/null +++ b/src/test/lokalisation/french.test.ts @@ -0,0 +1,42 @@ +import {afterEach, beforeAll, describe, expect, it} from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import {Species} from "#enums/species"; +import i18next from "i18next"; +import {initI18n} from "#app/plugins/i18n"; + +describe("Lokalization - french", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + initI18n(); + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + it("test bulbasaur name english", async () => { + game = new GameManager(phaserGame); + await game.startBattle([ + Species.BULBASAUR, + ]); + expect(game.scene.getParty()[0].name).toBe("Bulbasaur"); + }, 20000); + + it("test bulbasaure name french", async () => { + const locale = "fr"; + i18next.changeLanguage(locale); + localStorage.setItem("prLang", locale); + game = new GameManager(phaserGame); + + await game.startBattle([ + Species.BULBASAUR, + ]); + expect(game.scene.getParty()[0].name).toBe("Bulbizarre"); + }, 20000); +}); diff --git a/src/test/lokalisation/status-effect.test.ts b/src/test/lokalisation/status-effect.test.ts new file mode 100644 index 00000000000..ad33a59a675 --- /dev/null +++ b/src/test/lokalisation/status-effect.test.ts @@ -0,0 +1,300 @@ +import { beforeAll, describe, afterEach, expect, it, vi } from "vitest"; +import { + StatusEffect, + getStatusEffectActivationText, + getStatusEffectDescriptor, + getStatusEffectHealText, + getStatusEffectObtainText, + getStatusEffectOverlapText, +} from "#app/data/status-effect"; +import i18next from "i18next"; +import { mockI18next } from "../utils/testUtils"; + +const pokemonName = "PKM"; +const sourceText = "SOURCE"; + +describe("status-effect", () => { + beforeAll(() => { + i18next.init(); + }); + + describe("NONE", () => { + const statusEffect = StatusEffect.NONE; + + it("should return the obtain text", () => { + mockI18next(); + + const text = getStatusEffectObtainText(statusEffect, pokemonName); + expect(text).toBe("statusEffect:none.obtain"); + + const emptySourceText = getStatusEffectObtainText(statusEffect, pokemonName, ""); + expect(emptySourceText).toBe("statusEffect:none.obtain"); + }); + + it("should return the source-obtain text", () => { + mockI18next(); + + const text = getStatusEffectObtainText(statusEffect, pokemonName, sourceText); + expect(text).toBe("statusEffect:none.obtainSource"); + + const emptySourceText = getStatusEffectObtainText(statusEffect, pokemonName, ""); + expect(emptySourceText).not.toBe("statusEffect:none.obtainSource"); + }); + + it("should return the activation text", () => { + mockI18next(); + const text = getStatusEffectActivationText(statusEffect, pokemonName); + expect(text).toBe("statusEffect:none.activation"); + }); + + it("should return the overlap text", () => { + mockI18next(); + const text = getStatusEffectOverlapText(statusEffect, pokemonName); + expect(text).toBe("statusEffect:none.overlap"); + }); + + it("should return the heal text", () => { + mockI18next(); + const text = getStatusEffectHealText(statusEffect, pokemonName); + expect(text).toBe("statusEffect:none.heal"); + }); + + it("should return the descriptor", () => { + mockI18next(); + const text = getStatusEffectDescriptor(statusEffect); + expect(text).toBe("statusEffect:none.description"); + }); + }); + + describe("POISON", () => { + const statusEffect = StatusEffect.POISON; + + it("should return the obtain text", () => { + mockI18next(); + + const text = getStatusEffectObtainText(statusEffect, pokemonName); + expect(text).toBe("statusEffect:poison.obtain"); + + const emptySourceText = getStatusEffectObtainText(statusEffect, pokemonName, ""); + expect(emptySourceText).toBe("statusEffect:poison.obtain"); + }); + + it("should return the activation text", () => { + mockI18next(); + const text = getStatusEffectActivationText(statusEffect, pokemonName); + expect(text).toBe("statusEffect:poison.activation"); + }); + + it("should return the descriptor", () => { + mockI18next(); + const text = getStatusEffectDescriptor(statusEffect); + expect(text).toBe("statusEffect:poison.description"); + }); + + it("should return the heal text", () => { + mockI18next(); + const text = getStatusEffectHealText(statusEffect, pokemonName); + expect(text).toBe("statusEffect:poison.heal"); + }); + + it("should return the overlap text", () => { + mockI18next(); + const text = getStatusEffectOverlapText(statusEffect, pokemonName); + expect(text).toBe("statusEffect:poison.overlap"); + }); + }); + + describe("TOXIC", () => { + const statusEffect = StatusEffect.TOXIC; + + it("should return the obtain text", () => { + mockI18next(); + + const text = getStatusEffectObtainText(statusEffect, pokemonName); + expect(text).toBe("statusEffect:toxic.obtain"); + + const emptySourceText = getStatusEffectObtainText(statusEffect, pokemonName, ""); + expect(emptySourceText).toBe("statusEffect:toxic.obtain"); + }); + + it("should return the activation text", () => { + mockI18next(); + const text = getStatusEffectActivationText(statusEffect, pokemonName); + expect(text).toBe("statusEffect:toxic.activation"); + }); + + it("should return the descriptor", () => { + mockI18next(); + const text = getStatusEffectDescriptor(statusEffect); + expect(text).toBe("statusEffect:toxic.description"); + }); + + it("should return the heal text", () => { + mockI18next(); + const text = getStatusEffectHealText(statusEffect, pokemonName); + expect(text).toBe("statusEffect:toxic.heal"); + }); + + it("should return the overlap text", () => { + mockI18next(); + const text = getStatusEffectOverlapText(statusEffect, pokemonName); + expect(text).toBe("statusEffect:toxic.overlap"); + }); + }); + + describe("PARALYSIS", () => { + const statusEffect = StatusEffect.PARALYSIS; + + it("should return the obtain text", () => { + mockI18next(); + + const text = getStatusEffectObtainText(statusEffect, pokemonName); + expect(text).toBe("statusEffect:paralysis.obtain"); + + const emptySourceText = getStatusEffectObtainText(statusEffect, pokemonName, ""); + expect(emptySourceText).toBe("statusEffect:paralysis.obtain"); + }); + + it("should return the activation text", () => { + mockI18next(); + const text = getStatusEffectActivationText(statusEffect, pokemonName); + expect(text).toBe("statusEffect:paralysis.activation"); + }); + + it("should return the descriptor", () => { + mockI18next(); + const text = getStatusEffectDescriptor(statusEffect); + expect(text).toBe("statusEffect:paralysis.description"); + }); + + it("should return the heal text", () => { + mockI18next(); + const text = getStatusEffectHealText(statusEffect, pokemonName); + expect(text).toBe("statusEffect:paralysis.heal"); + }); + + it("should return the overlap text", () => { + mockI18next(); + const text = getStatusEffectOverlapText(statusEffect, pokemonName); + expect(text).toBe("statusEffect:paralysis.overlap"); + }); + }); + + describe("SLEEP", () => { + const statusEffect = StatusEffect.SLEEP; + + it("should return the obtain text", () => { + mockI18next(); + + const text = getStatusEffectObtainText(statusEffect, pokemonName); + expect(text).toBe("statusEffect:sleep.obtain"); + + const emptySourceText = getStatusEffectObtainText(statusEffect, pokemonName, ""); + expect(emptySourceText).toBe("statusEffect:sleep.obtain"); + }); + + it("should return the activation text", () => { + mockI18next(); + const text = getStatusEffectActivationText(statusEffect, pokemonName); + expect(text).toBe("statusEffect:sleep.activation"); + }); + + it("should return the descriptor", () => { + mockI18next(); + const text = getStatusEffectDescriptor(statusEffect); + expect(text).toBe("statusEffect:sleep.description"); + }); + + it("should return the heal text", () => { + mockI18next(); + const text = getStatusEffectHealText(statusEffect, pokemonName); + expect(text).toBe("statusEffect:sleep.heal"); + }); + + it("should return the overlap text", () => { + mockI18next(); + const text = getStatusEffectOverlapText(statusEffect, pokemonName); + expect(text).toBe("statusEffect:sleep.overlap"); + }); + }); + + describe("FREEZE", () => { + const statusEffect = StatusEffect.FREEZE; + + it("should return the obtain text", () => { + mockI18next(); + + const text = getStatusEffectObtainText(statusEffect, pokemonName); + expect(text).toBe("statusEffect:freeze.obtain"); + + const emptySourceText = getStatusEffectObtainText(statusEffect, pokemonName, ""); + expect(emptySourceText).toBe("statusEffect:freeze.obtain"); + }); + + it("should return the activation text", () => { + mockI18next(); + const text = getStatusEffectActivationText(statusEffect, pokemonName); + expect(text).toBe("statusEffect:freeze.activation"); + }); + + it("should return the descriptor", () => { + mockI18next(); + const text = getStatusEffectDescriptor(statusEffect); + expect(text).toBe("statusEffect:freeze.description"); + }); + + it("should return the heal text", () => { + mockI18next(); + const text = getStatusEffectHealText(statusEffect, pokemonName); + expect(text).toBe("statusEffect:freeze.heal"); + }); + + it("should return the overlap text", () => { + mockI18next(); + const text = getStatusEffectOverlapText(statusEffect, pokemonName); + expect(text).toBe("statusEffect:freeze.overlap"); + }); + }); + + describe("BURN", () => { + const statusEffect = StatusEffect.BURN; + + it("should return the obtain text", () => { + mockI18next(); + + const text = getStatusEffectObtainText(statusEffect, pokemonName); + expect(text).toBe("statusEffect:burn.obtain"); + + const emptySourceText = getStatusEffectObtainText(statusEffect, pokemonName, ""); + expect(emptySourceText).toBe("statusEffect:burn.obtain"); + }); + + it("should return the activation text", () => { + mockI18next(); + const text = getStatusEffectActivationText(statusEffect, pokemonName); + expect(text).toBe("statusEffect:burn.activation"); + }); + + it("should return the descriptor", () => { + mockI18next(); + const text = getStatusEffectDescriptor(statusEffect); + expect(text).toBe("statusEffect:burn.description"); + }); + + it("should return the heal text", () => { + mockI18next(); + const text = getStatusEffectHealText(statusEffect, pokemonName); + expect(text).toBe("statusEffect:burn.heal"); + }); + + it("should return the overlap text", () => { + mockI18next(); + const text = getStatusEffectOverlapText(statusEffect, pokemonName); + expect(text).toBe("statusEffect:burn.overlap"); + }); + }); + + afterEach(() => { + vi.resetAllMocks(); + }); +}); diff --git a/src/test/mystery-encounter/mystery-encounter.test.ts b/src/test/mystery-encounter/mystery-encounter.test.ts new file mode 100644 index 00000000000..b8f50070011 --- /dev/null +++ b/src/test/mystery-encounter/mystery-encounter.test.ts @@ -0,0 +1,46 @@ +import {afterEach, beforeAll, beforeEach, describe, it, vi} from "vitest"; +import * as overrides from "../../overrides"; +import GameManager from "#app/test/utils/gameManager"; +import Phaser from "phaser"; + +describe("Mystery Encounter", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + vi.spyOn(overrides, "MYSTERY_ENCOUNTER_RATE_OVERRIDE", "get").mockReturnValue(64); + vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(3); + }); + + it("spawns a mystery encounter", async() => { + // await game.runToSummon([ + // Species.CHARIZARD, + // Species.VOLCARONA + // ]); + // expect(game.scene.getCurrentPhase().constructor.name).toBe(EncounterPhase.name); + }, 100000); + + it("spawns mysterious challengers encounter", async() => { + }); + + it("spawns mysterious chest encounter", async() => { + }); + + it("spawns dark deal encounter", async() => { + }); + + it("spawns fight or flight encounter", async() => { + }); +}); + diff --git a/src/test/phases/select-modifier-phase.test.ts b/src/test/phases/select-modifier-phase.test.ts new file mode 100644 index 00000000000..e58198da0cb --- /dev/null +++ b/src/test/phases/select-modifier-phase.test.ts @@ -0,0 +1,224 @@ +import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; +import Phaser from "phaser"; +import GameManager from "#app/test/utils/gameManager"; +import {initSceneWithoutEncounterPhase} from "#app/test/utils/gameManagerUtils"; +import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; +import {ModifierTier} from "#app/modifier/modifier-tier"; +import * as Utils from "#app/utils"; +import {CustomModifierSettings, ModifierTypeOption, modifierTypes} from "#app/modifier/modifier-type"; +import BattleScene from "#app/battle-scene"; +import {SelectModifierPhase} from "#app/phases/select-modifier-phase"; +import {Species} from "#enums/species"; +import {Mode} from "#app/ui/ui"; +import {PlayerPokemon} from "#app/field/pokemon"; +import {getPokemonSpecies} from "#app/data/pokemon-species"; + +describe("SelectModifierPhase", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + let scene: BattleScene; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + scene = game.scene; + + vi.spyOn(scene, "resetSeed").mockImplementation(() => { + scene.waveSeed = "test"; + Phaser.Math.RND.sow([ scene.waveSeed ]); + scene.rngCounter = 0; + }); + + initSceneWithoutEncounterPhase(scene, [Species.ABRA, Species.VOLCARONA]); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + + vi.clearAllMocks(); + }); + + it("should start a select modifier phase", async () => { + const selectModifierPhase = new SelectModifierPhase(scene); + scene.pushPhase(selectModifierPhase); + await game.phaseInterceptor.run(SelectModifierPhase); + + expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); + }, 20000); + + it("should generate random modifiers", async () => { + const selectModifierPhase = new SelectModifierPhase(scene); + scene.pushPhase(selectModifierPhase); + 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).toEqual("TEMP_STAT_BOOSTER"); + expect(modifierSelectHandler.options[1].modifierTypeOption.type.id).toEqual("POKEBALL"); + expect(modifierSelectHandler.options[2].modifierTypeOption.type.id).toEqual("BERRY"); + }, 5000); + + it("should modify reroll cost", async () => { + const options = [ + new ModifierTypeOption(modifierTypes.POTION(), 0, 100), + new ModifierTypeOption(modifierTypes.ETHER(), 0, 400), + new ModifierTypeOption(modifierTypes.REVIVE(), 0, 1000) + ]; + + const selectModifierPhase1 = new SelectModifierPhase(scene); + const selectModifierPhase2 = new SelectModifierPhase(scene, 0, null, { rerollMultiplier: 2}); + + const cost1 = selectModifierPhase1.getRerollCost(options, false); + const cost2 = selectModifierPhase2.getRerollCost(options, false); + expect(cost2).toEqual(cost1 * 2); + }, 5000); + + it("should generate random modifiers from reroll", async () => { + let selectModifierPhase = new SelectModifierPhase(scene); + scene.pushPhase(selectModifierPhase); + 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).toEqual("TEMP_STAT_BOOSTER"); + expect(modifierSelectHandler.options[1].modifierTypeOption.type.id).toEqual("POKEBALL"); + expect(modifierSelectHandler.options[2].modifierTypeOption.type.id).toEqual("BERRY"); + + // Simulate selecting reroll + selectModifierPhase = new SelectModifierPhase(scene, 1, [ModifierTier.COMMON, ModifierTier.COMMON, ModifierTier.COMMON]); + scene.unshiftPhase(selectModifierPhase); + scene.ui.setMode(Mode.MESSAGE).then(() => game.endPhase()); + await game.phaseInterceptor.run(SelectModifierPhase); + + expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); + expect(modifierSelectHandler.options.length).toEqual(3); + expect(modifierSelectHandler.options[0].modifierTypeOption.type.id).toEqual("TM_COMMON"); + expect(modifierSelectHandler.options[1].modifierTypeOption.type.id).toEqual("LURE"); + expect(modifierSelectHandler.options[2].modifierTypeOption.type.id).toEqual("PP_UP"); + }, 5000); + + it("should generate random modifiers of same tier for reroll with reroll lock", async () => { + // Just use fully random seed for this test + vi.spyOn(scene, "resetSeed").mockImplementation(() => { + scene.waveSeed = Utils.shiftCharCodes(scene.seed, 5); + Phaser.Math.RND.sow([ scene.waveSeed ]); + console.log("Wave Seed:", scene.waveSeed, 5); + scene.rngCounter = 0; + }); + + let selectModifierPhase = new SelectModifierPhase(scene); + scene.pushPhase(selectModifierPhase); + 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); + const firstRollTiers: ModifierTier[] = modifierSelectHandler.options.map(o => o.modifierTypeOption.type.tier); + + // Simulate selecting reroll with lock + scene.lockModifierTiers = true; + scene.reroll = true; + selectModifierPhase = new SelectModifierPhase(scene, 1, firstRollTiers); + scene.unshiftPhase(selectModifierPhase); + scene.ui.setMode(Mode.MESSAGE).then(() => game.endPhase()); + await game.phaseInterceptor.run(SelectModifierPhase); + + expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); + expect(modifierSelectHandler.options.length).toEqual(3); + // Reroll with lock can still upgrade + expect(modifierSelectHandler.options[0].modifierTypeOption.type.tier - modifierSelectHandler.options[0].modifierTypeOption.upgradeCount).toEqual(firstRollTiers[0]); + expect(modifierSelectHandler.options[1].modifierTypeOption.type.tier - modifierSelectHandler.options[1].modifierTypeOption.upgradeCount).toEqual(firstRollTiers[1]); + expect(modifierSelectHandler.options[2].modifierTypeOption.type.tier - modifierSelectHandler.options[2].modifierTypeOption.upgradeCount).toEqual(firstRollTiers[2]); + }, 5000); + + it("should generate custom modifiers", async () => { + const customModifiers: CustomModifierSettings = { + guaranteedModifierTypeFuncs: [modifierTypes.MEMORY_MUSHROOM, modifierTypes.TM_ULTRA, modifierTypes.LEFTOVERS, modifierTypes.AMULET_COIN, modifierTypes.GOLDEN_PUNCH] + }; + const selectModifierPhase = new SelectModifierPhase(scene, 0, null, customModifiers); + scene.pushPhase(selectModifierPhase); + 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(5); + expect(modifierSelectHandler.options[0].modifierTypeOption.type.id).toEqual("MEMORY_MUSHROOM"); + expect(modifierSelectHandler.options[1].modifierTypeOption.type.id).toEqual("TM_ULTRA"); + expect(modifierSelectHandler.options[2].modifierTypeOption.type.id).toEqual("LEFTOVERS"); + expect(modifierSelectHandler.options[3].modifierTypeOption.type.id).toEqual("AMULET_COIN"); + expect(modifierSelectHandler.options[4].modifierTypeOption.type.id).toEqual("GOLDEN_PUNCH"); + }, 5000); + + it("should generate custom modifier tiers that can upgrade from luck", async () => { + const customModifiers: CustomModifierSettings = { + guaranteedModifierTiers: [ModifierTier.COMMON, ModifierTier.GREAT, ModifierTier.ULTRA, ModifierTier.ROGUE, ModifierTier.MASTER] + }; + const pokemon = new PlayerPokemon(scene, getPokemonSpecies(Species.BULBASAUR), 10, undefined, 0, undefined, true, 2, undefined, undefined, undefined); + + // Fill party with max shinies + while (scene.getParty().length > 0) { + scene.getParty().pop(); + } + scene.getParty().push(pokemon, pokemon, pokemon, pokemon, pokemon, pokemon); + + const selectModifierPhase = new SelectModifierPhase(scene, 0, null, customModifiers); + scene.pushPhase(selectModifierPhase); + 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(5); + expect(modifierSelectHandler.options[0].modifierTypeOption.type.tier - modifierSelectHandler.options[0].modifierTypeOption.upgradeCount).toEqual(ModifierTier.COMMON); + expect(modifierSelectHandler.options[1].modifierTypeOption.type.tier - modifierSelectHandler.options[1].modifierTypeOption.upgradeCount).toEqual(ModifierTier.GREAT); + expect(modifierSelectHandler.options[2].modifierTypeOption.type.tier - modifierSelectHandler.options[2].modifierTypeOption.upgradeCount).toEqual(ModifierTier.ULTRA); + expect(modifierSelectHandler.options[3].modifierTypeOption.type.tier - modifierSelectHandler.options[3].modifierTypeOption.upgradeCount).toEqual(ModifierTier.ROGUE); + expect(modifierSelectHandler.options[4].modifierTypeOption.type.tier - modifierSelectHandler.options[4].modifierTypeOption.upgradeCount).toEqual(ModifierTier.MASTER); + }, 5000); + + it("should generate custom modifiers and modifier tiers together", async () => { + const customModifiers: CustomModifierSettings = { + guaranteedModifierTypeFuncs: [modifierTypes.MEMORY_MUSHROOM, modifierTypes.TM_COMMON], + guaranteedModifierTiers: [ModifierTier.MASTER, ModifierTier.MASTER] + }; + const selectModifierPhase = new SelectModifierPhase(scene, 0, null, customModifiers); + scene.pushPhase(selectModifierPhase); + 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(4); + expect(modifierSelectHandler.options[0].modifierTypeOption.type.id).toEqual("MEMORY_MUSHROOM"); + expect(modifierSelectHandler.options[1].modifierTypeOption.type.id).toEqual("TM_COMMON"); + expect(modifierSelectHandler.options[2].modifierTypeOption.type.tier).toEqual(ModifierTier.MASTER); + expect(modifierSelectHandler.options[3].modifierTypeOption.type.tier).toEqual(ModifierTier.MASTER); + }, 5000); + + it("should fill remaining modifiers if fillRemaining is true with custom modifiers", async () => { + const customModifiers: CustomModifierSettings = { + guaranteedModifierTypeFuncs: [modifierTypes.MEMORY_MUSHROOM], + guaranteedModifierTiers: [ModifierTier.MASTER], + fillRemaining: true + }; + const selectModifierPhase = new SelectModifierPhase(scene, 0, null, customModifiers); + scene.pushPhase(selectModifierPhase); + 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).toEqual("MEMORY_MUSHROOM"); + expect(modifierSelectHandler.options[1].modifierTypeOption.type.tier).toEqual(ModifierTier.MASTER); + }, 5000); +}); diff --git a/src/test/utils/gameManagerUtils.ts b/src/test/utils/gameManagerUtils.ts index db9ba7174a9..0cd576cd106 100644 --- a/src/test/utils/gameManagerUtils.ts +++ b/src/test/utils/gameManagerUtils.ts @@ -6,6 +6,7 @@ import {Starter} from "#app/ui/starter-select-ui-handler"; import {GameModes, getGameMode} from "#app/game-mode"; import {getPokemonSpecies, getPokemonSpeciesForm} from "#app/data/pokemon-species"; import {PlayerPokemon} from "#app/field/pokemon"; +import Battle, {BattleType} from "#app/battle"; export function blobToString(blob) { return new Promise((resolve, reject) => { @@ -85,3 +86,23 @@ export function getMovePosition(scene, pokemonIndex, moveIndex) { const index = moveSet.findIndex((move) => move.moveId === moveIndex); return index; } + +/** + * Useful for populating party, wave index, etc. without having to spin up and run through an entire EncounterPhase + * @param scene + * @param species + */ +export function initSceneWithoutEncounterPhase(scene, species?: Species[]) { + const starters = generateStarter(scene, species); + starters.forEach((starter) => { + const starterProps = scene.gameData.getSpeciesDexAttrProps(starter.species, starter.dexAttr); + const starterFormIndex = Math.min(starterProps.formIndex, Math.max(starter.species.forms.length - 1, 0)); + const starterGender = Gender.MALE; + const starterIvs = scene.gameData.dexData[starter.species.speciesId].ivs.slice(0); + const starterPokemon = scene.addPlayerPokemon(starter.species, scene.gameMode.getStartingLevel(), starter.abilityIndex, starterFormIndex, starterGender, starterProps.shiny, starterProps.variant, starterIvs, starter.nature); + starterPokemon.tryPopulateMoveset(starter.moveset); + scene.getParty().push(starterPokemon); + }); + + scene.currentBattle = new Battle(getGameMode(GameModes.CLASSIC), 5, BattleType.WILD, null, false); +} diff --git a/src/test/utils/phaseInterceptor.ts b/src/test/utils/phaseInterceptor.ts index e8cec7c9989..e99adce1550 100644 --- a/src/test/utils/phaseInterceptor.ts +++ b/src/test/utils/phaseInterceptor.ts @@ -17,7 +17,6 @@ import { NextEncounterPhase, PostSummonPhase, SelectGenderPhase, - SelectModifierPhase, SelectStarterPhase, SelectTargetPhase, ShinySparklePhase, @@ -38,6 +37,13 @@ import UI, {Mode} from "#app/ui/ui"; import {Phase} from "#app/phase"; import ErrorInterceptor from "#app/test/utils/errorInterceptor"; import {QuietFormChangePhase} from "#app/form-change-phase"; +import {SelectModifierPhase} from "#app/phases/select-modifier-phase"; +import { + MysteryEncounterBattlePhase, + MysteryEncounterOptionSelectedPhase, + MysteryEncounterPhase, + PostMysteryEncounterPhase +} from "#app/phases/mystery-encounter-phase"; export default class PhaseInterceptor { public scene; @@ -92,10 +98,14 @@ export default class PhaseInterceptor { [QuietFormChangePhase, this.startPhase], [SwitchPhase, this.startPhase], [SwitchSummonPhase, this.startPhase], + [MysteryEncounterPhase, this.startPhase], + [MysteryEncounterOptionSelectedPhase, this.startPhase], + [MysteryEncounterBattlePhase, this.startPhase], + [PostMysteryEncounterPhase, this.startPhase] ]; private endBySetMode = [ - TitlePhase, SelectGenderPhase, CommandPhase + TitlePhase, SelectGenderPhase, CommandPhase, SelectModifierPhase ]; /** diff --git a/src/test/vitest.setup.ts b/src/test/vitest.setup.ts index 2caa82289d9..2b2be3bb42b 100644 --- a/src/test/vitest.setup.ts +++ b/src/test/vitest.setup.ts @@ -12,11 +12,11 @@ import { initSpecies } from "#app/data/pokemon-species"; import { initAchievements } from "#app/system/achv.js"; import { initVouchers } from "#app/system/voucher.js"; import { initStatsKeys } from "#app/ui/game-stats-ui-handler"; +import { beforeAll, beforeEach, vi } from "vitest"; +import * as overrides from "#app/overrides"; +import {initMysteryEncounterDialogue} from "#app/data/mystery-encounters/dialogue/mystery-encounter-dialogue"; +import {initMysteryEncounters} from "#app/data/mystery-encounters/mystery-encounters"; -import { beforeAll } from "vitest"; - -initVouchers(); -initAchievements(); initStatsKeys(); initPokemonPrevolutions(); initBiomes(); @@ -26,6 +26,8 @@ initSpecies(); initMoves(); initAbilities(); initLoggedInUser(); +initMysteryEncounterDialogue(); +initMysteryEncounters(); global.testFailed = false; @@ -37,3 +39,8 @@ beforeAll(() => { } }); }); + +// Disables Mystery Encounters on all tests (can be overridden at test level) +beforeEach( () => { + vi.spyOn(overrides, "MYSTERY_ENCOUNTER_RATE_OVERRIDE", "get").mockReturnValue(0); +}); diff --git a/src/ui/modifier-select-ui-handler.ts b/src/ui/modifier-select-ui-handler.ts index 3cfd103b4e2..e9fc495a847 100644 --- a/src/ui/modifier-select-ui-handler.ts +++ b/src/ui/modifier-select-ui-handler.ts @@ -20,6 +20,7 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { private lockRarityButtonContainer: Phaser.GameObjects.Container; private transferButtonContainer: Phaser.GameObjects.Container; private checkButtonContainer: Phaser.GameObjects.Container; + private continueButtonContainer: Phaser.GameObjects.Container; private rerollCostText: Phaser.GameObjects.Text; private lockRarityButtonText: Phaser.GameObjects.Text; private moveInfoOverlay : MoveInfoOverlay; @@ -100,6 +101,10 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { this.lockRarityButtonText.setOrigin(0, 0); this.lockRarityButtonContainer.add(this.lockRarityButtonText); + this.continueButtonContainer = this.scene.add.container((this.scene.game.canvas.width / 12), -(this.scene.game.canvas.height / 12)); + this.continueButtonContainer.setVisible(false); + ui.add(this.continueButtonContainer); + // prepare move overlay const overlayScale = 1; this.moveInfoOverlay = new MoveInfoOverlay(this.scene, { @@ -126,7 +131,7 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { return false; } - if (args.length !== 4 || !(args[1] instanceof Array) || !args[1].length || !(args[2] instanceof Function)) { + if (args.length !== 4 || !(args[1] instanceof Array) || !(args[2] instanceof Function)) { return false; } @@ -151,6 +156,9 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { this.lockRarityButtonContainer.setVisible(false); this.lockRarityButtonContainer.setAlpha(0); + this.continueButtonContainer.setVisible(false); + this.continueButtonContainer.setAlpha(0); + this.rerollButtonContainer.setPositionRelative(this.lockRarityButtonContainer, 0, canLockRarities ? -12 : 0); this.rerollCost = args[3] as integer; @@ -172,6 +180,13 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { this.options.push(option); } + // Add continue button + if (this.options.length === 0) { + const continueButtonText = addTextObject(this.scene, -24, optionsYOffset - 5, "Continue", TextStyle.MESSAGE); + continueButtonText.setName("text-continue-btn"); + this.continueButtonContainer.add(continueButtonText); + } + for (let m = 0; m < shopTypeOptions.length; m++) { const row = m < SHOP_OPTIONS_ROW_LIMIT ? 0 : 1; const col = m < SHOP_OPTIONS_ROW_LIMIT ? m : m - SHOP_OPTIONS_ROW_LIMIT; @@ -235,16 +250,24 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { this.rerollButtonContainer.setAlpha(0); this.checkButtonContainer.setAlpha(0); this.lockRarityButtonContainer.setAlpha(0); + this.continueButtonContainer.setAlpha(0); this.rerollButtonContainer.setVisible(true); this.checkButtonContainer.setVisible(true); + this.continueButtonContainer.setVisible(this.rerollCost === 0); this.lockRarityButtonContainer.setVisible(canLockRarities); this.scene.tweens.add({ - targets: [ this.rerollButtonContainer, this.lockRarityButtonContainer, this.checkButtonContainer ], + targets: [ this.lockRarityButtonContainer, this.checkButtonContainer, this.continueButtonContainer ], alpha: 1, duration: 250 }); + this.scene.tweens.add({ + targets: [this.rerollButtonContainer], + alpha: this.rerollCost === 0 ? 0.5 : 1, + duration: 250 + }); + this.setCursor(0); this.setRowCursor(1); @@ -385,6 +408,14 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { // the modifier selection has been updated, always hide the overlay this.moveInfoOverlay.clear(); if (this.rowCursor) { + if (this.rowCursor === 1 && options.length === 0) { + // Continue button when no shop items + this.cursorObj.setScale(1.25); + this.cursorObj.setPosition((this.scene.game.canvas.width / 18) + 23, (-this.scene.game.canvas.height / 12) - (this.shopOptionsRows.length > 1 ? 6 : 22)); + ui.showText("Continue to the next wave."); + return ret; + } + const sliceWidth = (this.scene.game.canvas.width / 6) / (options.length + 2); if (this.rowCursor < 2) { this.cursorObj.setPosition(sliceWidth * (cursor + 1) + (sliceWidth * 0.5) - 20, (-this.scene.game.canvas.height / 12) - (this.shopOptionsRows.length > 1 ? 6 : 22)); @@ -421,7 +452,14 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { if (rowCursor !== lastRowCursor) { this.rowCursor = rowCursor; let newCursor = Math.round(this.cursor / Math.max(this.getRowItems(lastRowCursor) - 1, 1) * (this.getRowItems(rowCursor) - 1)); + if (rowCursor === 1 && this.options.length === 0) { + // Handle empty shop + newCursor = 0; + } if (rowCursor === 0) { + if (this.options.length === 0) { + newCursor = 1; + } if (newCursor === 0 && !this.rerollButtonContainer.visible) { newCursor = 1; } @@ -506,7 +544,7 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { onComplete: () => options.forEach(o => o.destroy()) }); - [ this.rerollButtonContainer, this.checkButtonContainer, this.transferButtonContainer, this.lockRarityButtonContainer ].forEach(container => { + [ this.rerollButtonContainer, this.checkButtonContainer, this.transferButtonContainer, this.lockRarityButtonContainer, this.continueButtonContainer ].forEach(container => { if (container.visible) { this.scene.tweens.add({ targets: container, diff --git a/src/ui/mystery-encounter-ui-handler.ts b/src/ui/mystery-encounter-ui-handler.ts new file mode 100644 index 00000000000..426bc7d82c0 --- /dev/null +++ b/src/ui/mystery-encounter-ui-handler.ts @@ -0,0 +1,475 @@ +import BattleScene from "../battle-scene"; +import { addTextObject, TextStyle } from "./text"; +import { Mode } from "./ui"; +import UiHandler from "./ui-handler"; +import { Button } from "#enums/buttons"; +import { addWindow, WindowVariant } from "./ui-theme"; +import i18next from "i18next"; +import { MysteryEncounterPhase } from "../phases/mystery-encounter-phase"; +import { PartyUiMode } from "./party-ui-handler"; +import MysteryEncounterOption from "../data/mystery-encounter-option"; +import * as Utils from "../utils"; +import { getPokeballAtlasKey } from "../data/pokeball"; + +export default class MysteryEncounterUiHandler extends UiHandler { + private cursorContainer: Phaser.GameObjects.Container; + private cursorObj: Phaser.GameObjects.Image; + + private optionsContainer: Phaser.GameObjects.Container; + + private tooltipWindow: Phaser.GameObjects.NineSlice; + private tooltipContainer: Phaser.GameObjects.Container; + private tooltipScrollTween: Phaser.Tweens.Tween; + + private descriptionWindow: Phaser.GameObjects.NineSlice; + private descriptionContainer: Phaser.GameObjects.Container; + private descriptionScrollTween: Phaser.Tweens.Tween; + private rarityBall: Phaser.GameObjects.Sprite; + + private filteredEncounterOptions: MysteryEncounterOption[] = []; + private optionsMeetsReqs: boolean[]; + + protected viewPartyIndex: integer = 0; + + protected blockInput: boolean = true; + + constructor(scene: BattleScene) { + super(scene, Mode.MYSTERY_ENCOUNTER); + } + + setup() { + const ui = this.getUi(); + + this.cursorContainer = this.scene.add.container(18, -38.7); + this.cursorContainer.setVisible(false); + ui.add(this.cursorContainer); + this.optionsContainer = this.scene.add.container(12, -38.7); + this.optionsContainer.setVisible(false); + ui.add(this.optionsContainer); + this.descriptionContainer = this.scene.add.container(0, -152); + this.descriptionContainer.setVisible(false); + ui.add(this.descriptionContainer); + this.tooltipContainer = this.scene.add.container(210, -48); + this.tooltipContainer.setVisible(false); + ui.add(this.tooltipContainer); + + this.setCursor(this.getCursor()); + + this.descriptionWindow = addWindow(this.scene, 0, 0, 150, 105, false, false, 0, 0, WindowVariant.THIN); + this.descriptionContainer.add(this.descriptionWindow); + + this.tooltipWindow = addWindow(this.scene, 0, 0, 110, 48, false, false, 0, 0, WindowVariant.THIN); + this.tooltipContainer.add(this.tooltipWindow); + + this.rarityBall = this.scene.add.sprite(141, 9, "pb"); + this.rarityBall.setScale(0.75); + this.descriptionContainer.add(this.rarityBall); + } + + show(args: any[]): boolean { + super.show(args); + + this.cursorContainer.setVisible(true); + this.descriptionContainer.setVisible(true); + this.optionsContainer.setVisible(true); + this.displayEncounterOptions(!(args[0] as boolean || false)); + const cursor = this.getCursor(); + if (cursor === (this?.optionsContainer?.length || 0) - 1) { + // Always resets cursor on view party button if it was last there + this.setCursor(cursor); + } else { + this.setCursor(0); + } + if (this.blockInput) { + setTimeout(() => { + this.unblockInput(); + }, 1500); + } + this.displayOptionTooltip(); + + return true; + } + + processInput(button: Button): boolean { + const ui = this.getUi(); + + let success = false; + + const cursor = this.getCursor(); + + if (button === Button.CANCEL || button === Button.ACTION) { + if (button === Button.ACTION) { + if (cursor === this.viewPartyIndex) { + // Handle view party + success = true; + this.clear(); + this.scene.ui.setMode(Mode.PARTY, PartyUiMode.CHECK, -1, () => { + this.scene.ui.setMode(Mode.MYSTERY_ENCOUNTER, true); + setTimeout(() => { + this.setCursor(this.viewPartyIndex); + this.unblockInput(); + }, 300); + }); + } else if (this.blockInput || !this.optionsMeetsReqs[cursor]) { + success = false; + } else { + const selected = this.filteredEncounterOptions[cursor]; + if ((this.scene.getCurrentPhase() as MysteryEncounterPhase).handleOptionSelect(selected, cursor)) { + this.clear(); + success = true; + } else { + ui.playError(); + } + } + } else { + // TODO: If we need to handle cancel option? Maybe default logic to leave/run from encounter idk + } + } else { + switch (this.optionsContainer.length) { + case 3: + success = this.handleTwoOptionMoveInput(button); + break; + case 4: + success = this.handleThreeOptionMoveInput(button); + break; + case 5: + success = this.handleFourOptionMoveInput(button); + break; + } + + this.displayOptionTooltip(); + } + + if (success) { + ui.playSelect(); + } + + return success; + } + + handleTwoOptionMoveInput(button: Button): boolean { + let success = false; + const cursor = this.getCursor(); + switch (button) { + case Button.UP: + if (cursor < this.viewPartyIndex) { + success = this.setCursor(this.viewPartyIndex); + } + break; + case Button.DOWN: + if (cursor === this.viewPartyIndex) { + success = this.setCursor(1); + } + break; + case Button.LEFT: + if (cursor > 0) { + success = this.setCursor(cursor - 1); + } + break; + case Button.RIGHT: + if (cursor < this.viewPartyIndex) { + success = this.setCursor(cursor + 1); + } + break; + } + + return success; + } + + handleThreeOptionMoveInput(button: Button): boolean { + let success = false; + const cursor = this.getCursor(); + switch (button) { + case Button.UP: + if (cursor === 2) { + success = this.setCursor(cursor - 2); + } else { + success = this.setCursor(this.viewPartyIndex); + } + break; + case Button.DOWN: + if (cursor === this.viewPartyIndex) { + success = this.setCursor(1); + } else { + success = this.setCursor(2); + } + break; + case Button.LEFT: + if (cursor === this.viewPartyIndex) { + success = this.setCursor(1); + } else if (cursor === 1) { + success = this.setCursor(cursor - 1); + } + break; + case Button.RIGHT: + if (cursor === 1) { + success = this.setCursor(this.viewPartyIndex); + } else if (cursor < 1) { + success = this.setCursor(cursor + 1); + } + break; + } + + return success; + } + + handleFourOptionMoveInput(button: Button): boolean { + let success = false; + const cursor = this.getCursor(); + switch (button) { + case Button.UP: + if (cursor >= 2 && cursor !== this.viewPartyIndex) { + success = this.setCursor(cursor - 2); + } else { + success = this.setCursor(this.viewPartyIndex); + } + break; + case Button.DOWN: + if (cursor <= 1) { + success = this.setCursor(cursor + 2); + } else if (cursor === this.viewPartyIndex) { + success = this.setCursor(1); + } + break; + case Button.LEFT: + if (cursor === this.viewPartyIndex) { + success = this.setCursor(1); + } else if (cursor % 2 === 1) { + success = this.setCursor(cursor - 1); + } + break; + case Button.RIGHT: + if (cursor === 1) { + success = this.setCursor(this.viewPartyIndex); + } else if (cursor % 2 === 0 && cursor !== this.viewPartyIndex) { + success = this.setCursor(cursor + 1); + } + break; + } + + return success; + } + + unblockInput() { + if (this.blockInput) { + this.blockInput = false; + for (let i = 0; i < this.optionsContainer.length - 1; i++) { + if (!this.optionsMeetsReqs[i]) { + continue; + } + (this.optionsContainer.getAt(i) as Phaser.GameObjects.Text).setAlpha(1); + } + } + } + + getCursor(): integer { + return this.cursor ? this.cursor : 0; + } + + setCursor(cursor: integer): boolean { + const prevCursor = this.getCursor(); + const changed = prevCursor !== cursor; + if (changed) { + this.cursor = cursor; + } + + this.viewPartyIndex = this.optionsContainer.length - 1; + + if (!this.cursorObj) { + this.cursorObj = this.scene.add.image(0, 0, "cursor"); + this.cursorContainer.add(this.cursorObj); + } + + if (cursor === this.viewPartyIndex) { + this.cursorObj.setPosition(246, -17); + } else if (this.optionsContainer.length === 3) { // 2 Options + this.cursorObj.setPosition(-10.5 + (cursor % 2 === 1 ? 100 : 0), 15); + } else if (this.optionsContainer.length === 4) { // 3 Options + this.cursorObj.setPosition(-10.5 + (cursor % 2 === 1 ? 100 : 0), 7 + (cursor > 1 ? 16 : 0)); + } else if (this.optionsContainer.length === 5) { // 4 Options + this.cursorObj.setPosition(-10.5 + (cursor % 2 === 1 ? 100 : 0), 7 + (cursor > 1 ? 16 : 0)); + } + + return changed; + } + + displayEncounterOptions(slideInDescription: boolean = true): void { + const mysteryEncounter = this.scene.currentBattle.mysteryEncounter; + this.filteredEncounterOptions = mysteryEncounter.options; + this.optionsMeetsReqs = []; + + const titleText: string = i18next.t(mysteryEncounter.dialogue.encounterOptionsDialogue.title); + const descriptionText: string = i18next.t(mysteryEncounter.dialogue.encounterOptionsDialogue.description); + const queryText: string = i18next.t(mysteryEncounter.dialogue.encounterOptionsDialogue.query); + + // Clear options container (except cursor) + this.optionsContainer.removeAll(); + + // Options Window + for (let i = 0; i < this.filteredEncounterOptions.length; i++) { + let optionText; + switch (this.filteredEncounterOptions.length) { + case 2: + optionText = addTextObject(this.scene, i % 2 === 0 ? 0 : 100, 8, "-", TextStyle.WINDOW, { wordWrap: { width: 558 }, fontSize: "80px", lineSpacing: -8 }); + break; + case 3: + optionText = addTextObject(this.scene, i % 2 === 0 ? 0 : 100, i < 2 ? 0 : 16, "-", TextStyle.WINDOW, { wordWrap: { width: 558 }, fontSize: "80px", lineSpacing: -8 }); + break; + case 4: + optionText = addTextObject(this.scene, i % 2 === 0 ? 0 : 100, i < 2 ? 0 : 16, "-", TextStyle.WINDOW, { wordWrap: { width: 558 }, fontSize: "80px", lineSpacing: -8 }); + break; + } + const text = i18next.t(mysteryEncounter.dialogue.encounterOptionsDialogue.options[i].buttonLabel); + if (text) { + optionText.setText(text); + } + + this.optionsMeetsReqs.push(this.filteredEncounterOptions[i].meetsRequirements(this.scene)); + + if (!this.optionsMeetsReqs[i]) { + optionText.setAlpha(0.5); + } + if (this.blockInput) { + optionText.setAlpha(0.5); + } + this.optionsContainer.add(optionText); + } + + // View Party Button + const viewPartyText = addTextObject(this.scene, 256, -24, "View Party", TextStyle.PARTY); + this.optionsContainer.add(viewPartyText); + + // Description Window + const titleTextObject = addTextObject(this.scene, 0, 0, titleText, TextStyle.TOOLTIP_TITLE, { wordWrap: { width: 750 }, align: "center", lineSpacing: -8 }); + this.descriptionContainer.add(titleTextObject); + titleTextObject.setPosition(72 - titleTextObject.displayWidth / 2, 5.5); + + // Rarity of encounter + const ballType = getPokeballAtlasKey(mysteryEncounter.encounterTier as number); + this.rarityBall.setTexture("pb", ballType); + + const descriptionTextObject = addTextObject(this.scene, 6, 25, descriptionText, TextStyle.TOOLTIP_CONTENT, { wordWrap: { width: 830 } }); + + // Sets up the mask that hides the description text to give an illusion of scrolling + const descriptionTextMaskRect = this.scene.make.graphics({}); + descriptionTextMaskRect.setScale(6); + descriptionTextMaskRect.fillStyle(0xFFFFFF); + descriptionTextMaskRect.beginPath(); + descriptionTextMaskRect.fillRect(6, 54, 206, 60); + + const abilityDescriptionTextMask = descriptionTextMaskRect.createGeometryMask(); + + descriptionTextObject.setMask(abilityDescriptionTextMask); + + const descriptionLineCount = Math.floor(descriptionTextObject.displayHeight / 10); + + if (this.descriptionScrollTween) { + this.descriptionScrollTween.remove(); + this.descriptionScrollTween = null; + } + + // Animates the description text moving upwards + if (descriptionLineCount > 6) { + this.descriptionScrollTween = this.scene.tweens.add({ + targets: descriptionTextObject, + delay: Utils.fixedInt(2000), + loop: -1, + hold: Utils.fixedInt(2000), + duration: Utils.fixedInt((descriptionLineCount - 6) * 2000), + y: `-=${10 * (descriptionLineCount - 6)}` + }); + } + + this.descriptionContainer.add(descriptionTextObject); + + const queryTextObject = addTextObject(this.scene, 65 - (queryText.length), 90, queryText, TextStyle.TOOLTIP_CONTENT, { wordWrap: { width: 830 } }); + this.descriptionContainer.add(queryTextObject); + + // Slide in description container + if (slideInDescription) { + this.descriptionContainer.x -= 150; + this.scene.tweens.add({ + targets: this.descriptionContainer, + x: "+=150", + ease: "Sine.easeInOut", + duration: 1000 + }); + } + } + + displayOptionTooltip() { + const cursor = this.getCursor(); + // Clear tooltip box + if (this.tooltipContainer.length > 1) { + this.tooltipContainer.removeBetween(1, this.tooltipContainer.length, true); + } + this.tooltipContainer.setVisible(true); + + if (Utils.isNullOrUndefined(cursor) || cursor > this.optionsContainer.length - 2) { + // Ignore hovers on view party button + return; + } + + const mysteryEncounter = this.scene.currentBattle.mysteryEncounter; + let text; + if (!this.optionsMeetsReqs[cursor] && mysteryEncounter.dialogue.encounterOptionsDialogue.options[cursor].disabledTooltip) { + text = i18next.t(mysteryEncounter.dialogue.encounterOptionsDialogue.options[cursor].disabledTooltip); + } else { + text = i18next.t(mysteryEncounter.dialogue.encounterOptionsDialogue.options[cursor].buttonTooltip); + } + + + if (text) { + const tooltipTextObject = addTextObject(this.scene, 6, 7, text, TextStyle.TOOLTIP_CONTENT, { wordWrap: { width: 600 }, fontSize: "72px" }); + this.tooltipContainer.add(tooltipTextObject); + + // Sets up the mask that hides the description text to give an illusion of scrolling + const tooltipTextMaskRect = this.scene.make.graphics({}); + tooltipTextMaskRect.setScale(6); + tooltipTextMaskRect.fillStyle(0xFFFFFF); + tooltipTextMaskRect.beginPath(); + tooltipTextMaskRect.fillRect(this.tooltipContainer.x, this.tooltipContainer.y + 188.5, 150, 32); + + const textMask = tooltipTextMaskRect.createGeometryMask(); + tooltipTextObject.setMask(textMask); + + const tooltipLineCount = Math.floor(tooltipTextObject.displayHeight / 11.2); + + if (this.tooltipScrollTween) { + this.tooltipScrollTween.remove(); + this.tooltipScrollTween = null; + } + + // Animates the tooltip text moving upwards + if (tooltipLineCount > 3) { + this.tooltipScrollTween = this.scene.tweens.add({ + targets: tooltipTextObject, + delay: Utils.fixedInt(1200), + loop: -1, + hold: Utils.fixedInt(1200), + duration: Utils.fixedInt((tooltipLineCount - 3) * 1200), + y: `-=${11.2 * (tooltipLineCount - 3)}` + }); + } + } + } + + clear(): void { + super.clear(); + this.optionsContainer.setVisible(false); + this.optionsContainer.removeAll(true); + this.descriptionContainer.setVisible(false); + this.tooltipContainer.setVisible(false); + // Keeps container background and pokeball + this.descriptionContainer.removeBetween(2, this.descriptionContainer.length, true); + this.getUi().getMessageHandler().clearText(); + this.eraseCursor(); + } + + eraseCursor(): void { + if (this.cursorObj) { + this.cursorObj.destroy(); + } + this.cursorObj = null; + } +} diff --git a/src/ui/party-ui-handler.ts b/src/ui/party-ui-handler.ts index e820c8cb0d2..194a4461cd2 100644 --- a/src/ui/party-ui-handler.ts +++ b/src/ui/party-ui-handler.ts @@ -21,6 +21,7 @@ import MoveInfoOverlay from "./move-info-overlay"; import i18next from "i18next"; import BBCodeText from "phaser3-rex-plugins/plugins/bbcodetext"; import { Moves } from "#enums/moves"; +import { SelectModifierPhase } from "#app/phases/select-modifier-phase"; const defaultMessage = i18next.t("partyUiHandler:choosePokemon"); @@ -36,7 +37,8 @@ export enum PartyUiMode { MODIFIER_TRANSFER, SPLICE, RELEASE, - CHECK + CHECK, + SELECT } export enum PartyOption { @@ -52,6 +54,7 @@ export enum PartyOption { SPLICE, UNSPLICE, RELEASE, + SELECT, SCROLL_UP = 1000, SCROLL_DOWN = 1001, FORM_CHANGE_ITEM = 2000, @@ -153,7 +156,7 @@ export default class PartyUiHandler extends MessageUiHandler { public static NoEffectMessage = i18next.t("partyUiHandler:anyEffect"); - private localizedOptions = [PartyOption.SEND_OUT, PartyOption.SUMMARY, PartyOption.CANCEL, PartyOption.APPLY, PartyOption.RELEASE, PartyOption.TEACH, PartyOption.SPLICE, PartyOption.UNSPLICE, PartyOption.REVIVE, PartyOption.TRANSFER, PartyOption.UNPAUSE_EVOLUTION, PartyOption.PASS_BATON]; + private localizedOptions = [PartyOption.SEND_OUT, PartyOption.SUMMARY, PartyOption.CANCEL, PartyOption.APPLY, PartyOption.RELEASE, PartyOption.TEACH, PartyOption.SPLICE, PartyOption.UNSPLICE, PartyOption.REVIVE, PartyOption.TRANSFER, PartyOption.UNPAUSE_EVOLUTION, PartyOption.PASS_BATON, PartyOption.SELECT]; constructor(scene: BattleScene) { super(scene, Mode.PARTY); @@ -418,6 +421,10 @@ export default class PartyUiHandler extends MessageUiHandler { return true; } else if (option === PartyOption.CANCEL) { return this.processInput(Button.CANCEL); + } else if (option === PartyOption.SELECT) { + ui.playSelect(); + // ui.setModeWithoutClear(Mode.SUMMARY, pokemon).then(() => this.clearOptions()); + return true; } } else if (button === Button.CANCEL) { this.clearOptions(); @@ -759,6 +766,9 @@ export default class PartyUiHandler extends MessageUiHandler { } } break; + case PartyUiMode.SELECT: + this.options.push(PartyOption.SELECT); + break; } this.options.push(PartyOption.SUMMARY); diff --git a/src/ui/ui.ts b/src/ui/ui.ts index ce834a83645..fa7dc9fad9f 100644 --- a/src/ui/ui.ts +++ b/src/ui/ui.ts @@ -46,6 +46,7 @@ import SettingsDisplayUiHandler from "./settings/settings-display-ui-handler"; import SettingsAudioUiHandler from "./settings/settings-audio-ui-handler"; import { PlayerGender } from "#enums/player-gender"; import BgmBar from "#app/ui/bgm-bar"; +import MysteryEncounterUiHandler from "./mystery-encounter-ui-handler"; export enum Mode { MESSAGE, @@ -83,7 +84,8 @@ export enum Mode { SESSION_RELOAD, UNAVAILABLE, OUTDATED, - CHALLENGE_SELECT + CHALLENGE_SELECT, + MYSTERY_ENCOUNTER } const transitionModes = [ @@ -180,7 +182,8 @@ export default class UI extends Phaser.GameObjects.Container { new SessionReloadModalUiHandler(scene), new UnavailableModalUiHandler(scene), new OutdatedModalUiHandler(scene), - new GameChallengesUiHandler(scene) + new GameChallengesUiHandler(scene), + new MysteryEncounterUiHandler(scene) ]; } diff --git a/src/utils.ts b/src/utils.ts index 5aa558bae3a..c9fe319ce41 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -527,4 +527,6 @@ export function reverseValueToKeySetting(input) { return capitalizedWords.join("_"); } - +export function isNullOrUndefined(object: any): boolean { + return null === object || undefined === object; +} From 69f574b908490b2b4de5aeecaf0581cf2252be0c Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Fri, 5 Jul 2024 16:03:05 -0400 Subject: [PATCH 002/270] add chest sprites --- .../images/mystery-encounters/chest_blue.json | 171 ++++++++++++++++-- .../images/mystery-encounters/chest_red.json | 2 +- 2 files changed, 160 insertions(+), 13 deletions(-) diff --git a/public/images/mystery-encounters/chest_blue.json b/public/images/mystery-encounters/chest_blue.json index fb8f4ec9c8e..88aadda845a 100644 --- a/public/images/mystery-encounters/chest_blue.json +++ b/public/images/mystery-encounters/chest_blue.json @@ -1,11 +1,11 @@ { "textures": [ { - "image": "training_gear.png", + "image": "chest_blue.png", "format": "RGBA8888", "size": { - "w": 76, - "h": 57 + "w": 300, + "h": 75 }, "scale": 1, "frames": [ @@ -14,20 +14,167 @@ "rotated": false, "trimmed": false, "sourceSize": { - "w": 76, - "h": 57 + "w": 75, + "h": 75 }, "spriteSourceSize": { - "x": 10, - "y": 3, - "w": 56, - "h": 54 + "x": 0, + "y": 0, + "w": 75, + "h": 75 }, "frame": { - "x": 8, + "x": -15, "y": 0, - "w": 56, - "h": 54 + "w": 75, + "h": 75 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 75, + "h": 75 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 75, + "h": 75 + }, + "frame": { + "x": -15, + "y": 0, + "w": 75, + "h": 75 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 75, + "h": 75 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 75, + "h": 75 + }, + "frame": { + "x": 57, + "y": 0, + "w": 75, + "h": 75 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 75, + "h": 75 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 75, + "h": 75 + }, + "frame": { + "x": 57, + "y": 0, + "w": 75, + "h": 75 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 75, + "h": 75 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 75, + "h": 75 + }, + "frame": { + "x": 129, + "y": 0, + "w": 75, + "h": 75 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 75, + "h": 75 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 75, + "h": 75 + }, + "frame": { + "x": 129, + "y": 0, + "w": 75, + "h": 75 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 75, + "h": 75 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 75, + "h": 75 + }, + "frame": { + "x": 201, + "y": 0, + "w": 75, + "h": 75 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 75, + "h": 75 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 75, + "h": 75 + }, + "frame": { + "x": 201, + "y": 0, + "w": 75, + "h": 75 } } ] diff --git a/public/images/mystery-encounters/chest_red.json b/public/images/mystery-encounters/chest_red.json index fb8f4ec9c8e..d808652a162 100644 --- a/public/images/mystery-encounters/chest_red.json +++ b/public/images/mystery-encounters/chest_red.json @@ -1,7 +1,7 @@ { "textures": [ { - "image": "training_gear.png", + "image": "chest_red.png", "format": "RGBA8888", "size": { "w": 76, From 666ec135ba8c50f716867fe3cdf9ee8e369b22dc Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Fri, 5 Jul 2024 18:09:32 -0400 Subject: [PATCH 003/270] bug fixes, cleanup, and tests --- src/battle-scene.ts | 8 +++---- src/data/mystery-encounter-flags.ts | 4 ++-- src/data/mystery-encounter.ts | 2 +- .../mystery-encounter-utils.ts | 21 ++++++++----------- src/overrides.ts | 4 ++-- src/phases/mystery-encounter-phase.ts | 1 - src/test/ui/transfer-item.test.ts | 2 +- src/ui/mystery-encounter-ui-handler.ts | 4 +++- src/ui/party-ui-handler.ts | 2 +- 9 files changed, 23 insertions(+), 25 deletions(-) diff --git a/src/battle-scene.ts b/src/battle-scene.ts index 723bf0ef4ab..609a3f9153d 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -1098,7 +1098,7 @@ export default class BattleScene extends SceneBase { // Check for mystery encounter // Can only occur in place of a standard wild battle, waves 10-180 - if (this.gameMode.hasMysteryEncounters && newBattleType === BattleType.WILD && !this.gameMode.isBoss(newWaveIndex) && !(this.gameMode.isClassic && (newWaveIndex > 180 || newWaveIndex < 10))) { + if (this.gameMode.hasMysteryEncounters && newBattleType === BattleType.WILD && !this.gameMode.isBoss(newWaveIndex) && newWaveIndex < 180 && newWaveIndex > 10) { const roll = Utils.randSeedInt(256); // Base spawn weight is 3/256, and increases by 1/256 for each missed attempt at spawning an encounter on a valid floor @@ -1111,7 +1111,7 @@ export default class BattleScene extends SceneBase { const currentRunDiffFromAvg = expectedEncountersByFloor - (this.mysteryEncounterFlags?.encounteredEvents?.length || 0); const favoredEncounterRate = sessionEncounterRate + currentRunDiffFromAvg * 5; - const successRate = Utils.isNullOrUndefined(Overrides.MYSTERY_ENCOUNTER_RATE_OVERRIDE) ? favoredEncounterRate : Overrides.MYSTERY_ENCOUNTER_RATE_OVERRIDE; + const successRate = isNullOrUndefined(Overrides.MYSTERY_ENCOUNTER_RATE_OVERRIDE) ? favoredEncounterRate : Overrides.MYSTERY_ENCOUNTER_RATE_OVERRIDE; if (roll < successRate) { newBattleType = BattleType.MYSTERY_ENCOUNTER; @@ -2639,7 +2639,7 @@ export default class BattleScene extends SceneBase { getMysteryEncounter(override: MysteryEncounter): MysteryEncounter { // Loading override or session encounter let encounter: MysteryEncounter; - if (!Utils.isNullOrUndefined(Overrides.MYSTERY_ENCOUNTER_OVERRIDE) && allMysteryEncounters.hasOwnProperty(Overrides.MYSTERY_ENCOUNTER_OVERRIDE)) { + if (!isNullOrUndefined(Overrides.MYSTERY_ENCOUNTER_OVERRIDE) && allMysteryEncounters.hasOwnProperty(Overrides.MYSTERY_ENCOUNTER_OVERRIDE)) { encounter = allMysteryEncounters[Overrides.MYSTERY_ENCOUNTER_OVERRIDE]; } else { encounter = override?.encounterType >= 0 ? allMysteryEncounters[override?.encounterType] : null; @@ -2685,7 +2685,7 @@ export default class BattleScene extends SceneBase { const rareThreshold = totalWeight - tierWeights[0] - tierWeights[1] - tierWeights[2]; let tier = tierValue > commonThreshold ? MysteryEncounterTier.COMMON : tierValue > uncommonThreshold ? MysteryEncounterTier.UNCOMMON : tierValue > rareThreshold ? MysteryEncounterTier.RARE : MysteryEncounterTier.SUPER_RARE; - if (!Utils.isNullOrUndefined(Overrides.MYSTERY_ENCOUNTER_TIER_OVERRIDE)) { + if (!isNullOrUndefined(Overrides.MYSTERY_ENCOUNTER_TIER_OVERRIDE)) { tier = Overrides.MYSTERY_ENCOUNTER_TIER_OVERRIDE; } diff --git a/src/data/mystery-encounter-flags.ts b/src/data/mystery-encounter-flags.ts index 339a171ccb9..8e7bce7a291 100644 --- a/src/data/mystery-encounter-flags.ts +++ b/src/data/mystery-encounter-flags.ts @@ -1,7 +1,7 @@ -import * as Utils from "../utils"; import {MysteryEncounterTier} from "#app/data/mystery-encounter"; import {MysteryEncounterType} from "#enums/mystery-encounter-type"; import {BASE_MYSTYERY_ENCOUNTER_WEIGHT} from "#app/data/mystery-encounters/mystery-encounters"; +import {isNullOrUndefined} from "../utils"; export class MysteryEncounterFlags { encounteredEvents: [MysteryEncounterType, MysteryEncounterTier][] = []; @@ -9,7 +9,7 @@ export class MysteryEncounterFlags { nextEncounterQueue: [MysteryEncounterType, integer][] = []; constructor(flags: MysteryEncounterFlags) { - if (!Utils.isNullOrUndefined(flags)) { + if (!isNullOrUndefined(flags)) { Object.assign(this, flags); } } diff --git a/src/data/mystery-encounter.ts b/src/data/mystery-encounter.ts index 74364013046..c85c44a3973 100644 --- a/src/data/mystery-encounter.ts +++ b/src/data/mystery-encounter.ts @@ -122,7 +122,7 @@ export default interface MysteryEncounter { */ export default class MysteryEncounter implements MysteryEncounter { constructor(encounter: MysteryEncounter) { - if (!Utils.isNullOrUndefined(encounter)) { + if (!isNullOrUndefined(encounter)) { Object.assign(this, encounter); } this.encounterTier = this.encounterTier ? this.encounterTier : MysteryEncounterTier.COMMON; diff --git a/src/data/mystery-encounters/mystery-encounter-utils.ts b/src/data/mystery-encounters/mystery-encounter-utils.ts index 74d8f0423d5..9cdb6607752 100644 --- a/src/data/mystery-encounters/mystery-encounter-utils.ts +++ b/src/data/mystery-encounters/mystery-encounter-utils.ts @@ -186,21 +186,19 @@ export function getRandomSpeciesByStarterTier(starterTiers: number | [number, nu let min = starterTiers instanceof Array ? starterTiers[0] : starterTiers; let max = starterTiers instanceof Array ? starterTiers[1] : starterTiers; - let filteredSpecies = Object.entries(speciesStarters) - .map(s => parseInt(s[0])) - .filter(s => getPokemonSpecies(s) && !excludedSpecies.includes(s)); + let filteredSpecies: [PokemonSpecies, number][] = Object.keys(speciesStarters) + .map(s => [parseInt(s) as Species, speciesStarters[s] as number]) + .filter(s => getPokemonSpecies(s[0]) && !excludedSpecies.includes(s[0])) + .map(s => [getPokemonSpecies(s[0]), s[1]]); if (!isNullOrUndefined(types) && types.length > 0) { - filteredSpecies = filteredSpecies.filter(s => { - const species = getPokemonSpecies(s); - return types.includes(species.type1) || types.includes(species.type2); - }); + filteredSpecies = filteredSpecies.filter(s => types.includes(s[0].type1) || types.includes(s[0].type2)); } // If no filtered mons exist at specified starter tiers, will expand starter search range until there are // Starts by decrementing starter tier min until it is 0, then increments tier max up to 10 - let tryFilterStarterTiers = filteredSpecies.filter(s => s[1] >= min && s[1] <= max); - while (tryFilterStarterTiers.length === 0 || !(min === 0 && max === 10)) { + let tryFilterStarterTiers: [PokemonSpecies, number][] = filteredSpecies.filter(s => (s[1] >= min && s[1] <= max)); + while (tryFilterStarterTiers.length === 0 && (min !== 0 && max !== 10)) { if (min > 0) { min--; } else { @@ -212,7 +210,7 @@ export function getRandomSpeciesByStarterTier(starterTiers: number | [number, nu if (tryFilterStarterTiers.length > 0) { const index = Utils.randSeedInt(tryFilterStarterTiers.length); - return Phaser.Math.RND.shuffle(tryFilterStarterTiers)[index]; + return Phaser.Math.RND.shuffle(tryFilterStarterTiers)[index][0].speciesId; } return Species.BULBASAUR; @@ -427,7 +425,7 @@ export function setCustomEncounterRewards(scene: BattleScene, customShopRewards? scene.unshiftPhase(new ModifierRewardPhase(scene, reward)); }); } else { - while (!Utils.isNullOrUndefined(scene.findPhase(p => p instanceof ModifierRewardPhase))) { + while (!isNullOrUndefined(scene.findPhase(p => p instanceof ModifierRewardPhase))) { scene.tryRemovePhase(p => p instanceof ModifierRewardPhase); } } @@ -474,7 +472,6 @@ export function selectPokemonForOption(scene: BattleScene, onPokemonSelected: (p }).concat({ label: i18next.t("menu:cancel"), handler: () => { - scene.ui.clearText(); scene.ui.setMode(Mode.MYSTERY_ENCOUNTER); resolve(false); return true; diff --git a/src/overrides.ts b/src/overrides.ts index 22a341f6d15..6634ca32788 100644 --- a/src/overrides.ts +++ b/src/overrides.ts @@ -118,9 +118,9 @@ export const EGG_GACHA_PULL_COUNT_OVERRIDE: number = 0; */ // 1 to 256, set to null to ignore -export const MYSTERY_ENCOUNTER_RATE_OVERRIDE: number = 256; +export const MYSTERY_ENCOUNTER_RATE_OVERRIDE: number = null; export const MYSTERY_ENCOUNTER_TIER_OVERRIDE: MysteryEncounterTier = null; -export const MYSTERY_ENCOUNTER_OVERRIDE: MysteryEncounterType = MysteryEncounterType.FIGHT_OR_FLIGHT; +export const MYSTERY_ENCOUNTER_OVERRIDE: MysteryEncounterType = null; /** * MODIFIER / ITEM OVERRIDES diff --git a/src/phases/mystery-encounter-phase.ts b/src/phases/mystery-encounter-phase.ts index 4e8fbd4c127..2700ec32ae1 100644 --- a/src/phases/mystery-encounter-phase.ts +++ b/src/phases/mystery-encounter-phase.ts @@ -35,7 +35,6 @@ export class MysteryEncounterPhase extends Phase { super.start(); // Clears out queued phases that are part of standard battle - this.scene.ui.clearText(); this.scene.clearPhaseQueue(); this.scene.clearPhaseQueueSplice(); diff --git a/src/test/ui/transfer-item.test.ts b/src/test/ui/transfer-item.test.ts index 336e5bccd26..90a1eb242a1 100644 --- a/src/test/ui/transfer-item.test.ts +++ b/src/test/ui/transfer-item.test.ts @@ -5,7 +5,6 @@ import { Button } from "#app/enums/buttons"; import * as overrides from "#app/overrides"; import { BattleEndPhase, - SelectModifierPhase } from "#app/phases"; import GameManager from "#app/test/utils/gameManager"; import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; @@ -15,6 +14,7 @@ import Phaser from "phaser"; import BBCodeText from "phaser3-rex-plugins/plugins/bbcodetext"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { getMovePosition } from "../utils/gameManagerUtils"; +import {SelectModifierPhase} from "#app/phases/select-modifier-phase"; describe("UI - Transfer Items", () => { diff --git a/src/ui/mystery-encounter-ui-handler.ts b/src/ui/mystery-encounter-ui-handler.ts index 426bc7d82c0..232d916be57 100644 --- a/src/ui/mystery-encounter-ui-handler.ts +++ b/src/ui/mystery-encounter-ui-handler.ts @@ -10,6 +10,7 @@ import { PartyUiMode } from "./party-ui-handler"; import MysteryEncounterOption from "../data/mystery-encounter-option"; import * as Utils from "../utils"; import { getPokeballAtlasKey } from "../data/pokeball"; +import {isNullOrUndefined} from "../utils"; export default class MysteryEncounterUiHandler extends UiHandler { private cursorContainer: Phaser.GameObjects.Container; @@ -294,6 +295,7 @@ export default class MysteryEncounterUiHandler extends UiHandler { } displayEncounterOptions(slideInDescription: boolean = true): void { + this.getUi().clearText(); const mysteryEncounter = this.scene.currentBattle.mysteryEncounter; this.filteredEncounterOptions = mysteryEncounter.options; this.optionsMeetsReqs = []; @@ -405,7 +407,7 @@ export default class MysteryEncounterUiHandler extends UiHandler { } this.tooltipContainer.setVisible(true); - if (Utils.isNullOrUndefined(cursor) || cursor > this.optionsContainer.length - 2) { + if (isNullOrUndefined(cursor) || cursor > this.optionsContainer.length - 2) { // Ignore hovers on view party button return; } diff --git a/src/ui/party-ui-handler.ts b/src/ui/party-ui-handler.ts index 194a4461cd2..467d35bdb2c 100644 --- a/src/ui/party-ui-handler.ts +++ b/src/ui/party-ui-handler.ts @@ -1,4 +1,4 @@ -import { CommandPhase, SelectModifierPhase } from "../phases"; +import { CommandPhase } from "../phases"; import BattleScene from "../battle-scene"; import { PlayerPokemon, PokemonMove } from "../field/pokemon"; import { addBBCodeTextObject, addTextObject, getTextColor, TextStyle } from "./text"; From b3aa562bc639afebb00f737269ab7a644e71c18d Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Fri, 5 Jul 2024 20:42:25 -0400 Subject: [PATCH 004/270] small fixes --- src/battle-scene.ts | 11 ++++++++--- src/data/mystery-encounter-flags.ts | 4 ++-- src/data/mystery-encounters/mystery-encounters.ts | 2 +- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/battle-scene.ts b/src/battle-scene.ts index 609a3f9153d..e127bfeb31f 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -93,7 +93,7 @@ import { UiTheme } from "#enums/ui-theme"; import { TimedEventManager } from "#app/timed-event-manager.js"; import i18next from "i18next"; import MysteryEncounter, { MysteryEncounterTier, MysteryEncounterVariant } from "./data/mystery-encounter"; -import {mysteryEncountersByBiome, allMysteryEncounters, BASE_MYSTYERY_ENCOUNTER_WEIGHT} from "./data/mystery-encounters/mystery-encounters"; +import {mysteryEncountersByBiome, allMysteryEncounters, BASE_MYSTERY_ENCOUNTER_WEIGHT} from "./data/mystery-encounters/mystery-encounters"; import {MysteryEncounterFlags} from "#app/data/mystery-encounter-flags"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; @@ -1098,11 +1098,16 @@ export default class BattleScene extends SceneBase { // Check for mystery encounter // Can only occur in place of a standard wild battle, waves 10-180 + // let testStartingWeight = 40; + // while (testStartingWeight < 60) { + // calculateMEAggregateStats(this, testStartingWeight); + // testStartingWeight += 2; + // } if (this.gameMode.hasMysteryEncounters && newBattleType === BattleType.WILD && !this.gameMode.isBoss(newWaveIndex) && newWaveIndex < 180 && newWaveIndex > 10) { const roll = Utils.randSeedInt(256); // Base spawn weight is 3/256, and increases by 1/256 for each missed attempt at spawning an encounter on a valid floor - const sessionEncounterRate = !isNullOrUndefined(this.mysteryEncounterFlags?.encounterSpawnChance) ? this.mysteryEncounterFlags.encounterSpawnChance : BASE_MYSTYERY_ENCOUNTER_WEIGHT; + const sessionEncounterRate = !isNullOrUndefined(this.mysteryEncounterFlags?.encounterSpawnChance) ? this.mysteryEncounterFlags.encounterSpawnChance : BASE_MYSTERY_ENCOUNTER_WEIGHT; // If total number of encounters is lower than expected for the run, slightly favor a new encounter spawn // Do the reverse as well @@ -1116,7 +1121,7 @@ export default class BattleScene extends SceneBase { if (roll < successRate) { newBattleType = BattleType.MYSTERY_ENCOUNTER; // Reset base spawn weight - this.mysteryEncounterFlags.encounterSpawnChance = BASE_MYSTYERY_ENCOUNTER_WEIGHT; + this.mysteryEncounterFlags.encounterSpawnChance = BASE_MYSTERY_ENCOUNTER_WEIGHT; } else { this.mysteryEncounterFlags.encounterSpawnChance = sessionEncounterRate + 1; } diff --git a/src/data/mystery-encounter-flags.ts b/src/data/mystery-encounter-flags.ts index 8e7bce7a291..33ef84e2d1d 100644 --- a/src/data/mystery-encounter-flags.ts +++ b/src/data/mystery-encounter-flags.ts @@ -1,11 +1,11 @@ import {MysteryEncounterTier} from "#app/data/mystery-encounter"; import {MysteryEncounterType} from "#enums/mystery-encounter-type"; -import {BASE_MYSTYERY_ENCOUNTER_WEIGHT} from "#app/data/mystery-encounters/mystery-encounters"; +import {BASE_MYSTERY_ENCOUNTER_WEIGHT} from "#app/data/mystery-encounters/mystery-encounters"; import {isNullOrUndefined} from "../utils"; export class MysteryEncounterFlags { encounteredEvents: [MysteryEncounterType, MysteryEncounterTier][] = []; - encounterSpawnChance: number = BASE_MYSTYERY_ENCOUNTER_WEIGHT; + encounterSpawnChance: number = BASE_MYSTERY_ENCOUNTER_WEIGHT; nextEncounterQueue: [MysteryEncounterType, integer][] = []; constructor(flags: MysteryEncounterFlags) { diff --git a/src/data/mystery-encounters/mystery-encounters.ts b/src/data/mystery-encounters/mystery-encounters.ts index 81d69c808d3..2f4f7828d46 100644 --- a/src/data/mystery-encounters/mystery-encounters.ts +++ b/src/data/mystery-encounters/mystery-encounters.ts @@ -8,7 +8,7 @@ import { Biome } from "#app/enums/biome"; import { SleepingSnorlaxEncounter } from "./sleeping-snorlax"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; -export const BASE_MYSTYERY_ENCOUNTER_WEIGHT = 3; +export const BASE_MYSTERY_ENCOUNTER_WEIGHT = 50; export const allMysteryEncounters : {[encounterType:string]: MysteryEncounter} = {}; From 1d0109a386458ed1ade0194f237792bb9659d349 Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Fri, 5 Jul 2024 21:03:18 -0400 Subject: [PATCH 005/270] small fixes --- src/battle-scene.ts | 13 +++++++++---- src/data/mystery-encounter.ts | 12 ++++++------ .../mystery-encounters/mystery-encounter-utils.ts | 3 ++- src/data/mystery-encounters/mystery-encounters.ts | 3 ++- src/locales/en/mystery-encounter.ts | 2 +- src/phases.ts | 8 -------- 6 files changed, 20 insertions(+), 21 deletions(-) diff --git a/src/battle-scene.ts b/src/battle-scene.ts index e127bfeb31f..3fe0d6765db 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -93,7 +93,12 @@ import { UiTheme } from "#enums/ui-theme"; import { TimedEventManager } from "#app/timed-event-manager.js"; import i18next from "i18next"; import MysteryEncounter, { MysteryEncounterTier, MysteryEncounterVariant } from "./data/mystery-encounter"; -import {mysteryEncountersByBiome, allMysteryEncounters, BASE_MYSTERY_ENCOUNTER_WEIGHT} from "./data/mystery-encounters/mystery-encounters"; +import { + mysteryEncountersByBiome, + allMysteryEncounters, + BASE_MYSTERY_ENCOUNTER_WEIGHT, + AVERAGE_ENCOUNTERS_PER_RUN_TARGET +} from "./data/mystery-encounters/mystery-encounters"; import {MysteryEncounterFlags} from "#app/data/mystery-encounter-flags"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; @@ -1098,8 +1103,8 @@ export default class BattleScene extends SceneBase { // Check for mystery encounter // Can only occur in place of a standard wild battle, waves 10-180 - // let testStartingWeight = 40; - // while (testStartingWeight < 60) { + // let testStartingWeight = 10; + // while (testStartingWeight < 30) { // calculateMEAggregateStats(this, testStartingWeight); // testStartingWeight += 2; // } @@ -1112,7 +1117,7 @@ export default class BattleScene extends SceneBase { // If total number of encounters is lower than expected for the run, slightly favor a new encounter spawn // Do the reverse as well // Reduces occurrence of runs with very few (<6) and a ton (>10) of encounters - const expectedEncountersByFloor = 8 / (180 - 10) * newWaveIndex; + const expectedEncountersByFloor = AVERAGE_ENCOUNTERS_PER_RUN_TARGET / (180 - 10) * newWaveIndex; const currentRunDiffFromAvg = expectedEncountersByFloor - (this.mysteryEncounterFlags?.encounteredEvents?.length || 0); const favoredEncounterRate = sessionEncounterRate + currentRunDiffFromAvg * 5; diff --git a/src/data/mystery-encounter.ts b/src/data/mystery-encounter.ts index c85c44a3973..6a81e473724 100644 --- a/src/data/mystery-encounter.ts +++ b/src/data/mystery-encounter.ts @@ -157,12 +157,12 @@ export default class MysteryEncounter implements MysteryEncounter { const secReqs = this.meetsSecondaryRequirementAndSecondaryPokemonSelected(scene); // secondary is checked first to handle cases of primary overlapping with secondary const priReqs = this.meetsPrimaryRequirementAndPrimaryPokemonSelected(scene); - console.log("-------" + MysteryEncounterType[this.encounterType] + " Encounter Check -------"); - console.log(this); - console.log( "sceneCheck: " + sceneReq); - console.log( "primaryCheck: " + priReqs); - console.log( "secondaryCheck: " + secReqs); - console.log(MysteryEncounterTier[this.encounterTier]); + // console.log("-------" + MysteryEncounterType[this.encounterType] + " Encounter Check -------"); + // console.log(this); + // console.log( "sceneCheck: " + sceneReq); + // console.log( "primaryCheck: " + priReqs); + // console.log( "secondaryCheck: " + secReqs); + // console.log(MysteryEncounterTier[this.encounterTier]); return sceneReq && secReqs && priReqs; } diff --git a/src/data/mystery-encounters/mystery-encounter-utils.ts b/src/data/mystery-encounters/mystery-encounter-utils.ts index 9cdb6607752..3c9ee48c9ba 100644 --- a/src/data/mystery-encounters/mystery-encounter-utils.ts +++ b/src/data/mystery-encounters/mystery-encounter-utils.ts @@ -595,6 +595,7 @@ export function handleMysteryEncounterVictory(scene: BattleScene, addHealPhase: export function calculateMEAggregateStats(scene: BattleScene, baseSpawnWeight: number) { const numRuns = 1000; let run = 0; + const targetEncountersPerRun = 15; const calculateNumEncounters = (): number[] => { let encounterRate = baseSpawnWeight; @@ -646,7 +647,7 @@ export function calculateMEAggregateStats(scene: BattleScene, baseSpawnWeight: n // If total number of encounters is lower than expected for the run, slightly favor a new encounter // Do the reverse as well - const expectedEncountersByFloor = 8 / (180 - 10) * i; + const expectedEncountersByFloor = targetEncountersPerRun / (180 - 10) * i; const currentRunDiffFromAvg = expectedEncountersByFloor - numEncounters.reduce((a, b) => a + b); const favoredEncounterRate = encounterRate + currentRunDiffFromAvg * 5; diff --git a/src/data/mystery-encounters/mystery-encounters.ts b/src/data/mystery-encounters/mystery-encounters.ts index 2f4f7828d46..1a0f6f2a1ce 100644 --- a/src/data/mystery-encounters/mystery-encounters.ts +++ b/src/data/mystery-encounters/mystery-encounters.ts @@ -8,7 +8,8 @@ import { Biome } from "#app/enums/biome"; import { SleepingSnorlaxEncounter } from "./sleeping-snorlax"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; -export const BASE_MYSTERY_ENCOUNTER_WEIGHT = 50; +export const BASE_MYSTERY_ENCOUNTER_WEIGHT = 19; +export const AVERAGE_ENCOUNTERS_PER_RUN_TARGET = 15; export const allMysteryEncounters : {[encounterType:string]: MysteryEncounter} = {}; diff --git a/src/locales/en/mystery-encounter.ts b/src/locales/en/mystery-encounter.ts index 9d5fe50aece..849782256e7 100644 --- a/src/locales/en/mystery-encounter.ts +++ b/src/locales/en/mystery-encounter.ts @@ -55,7 +55,7 @@ export const mysteryEncounter: SimpleTranslationEntries = { "mysterious_challengers_outro_win": "The mysterious challenger was defeated!", // Mysterious Encounters -- Rare Tier - "training_session_intro_message": "You've come across a some\ntraining tools and supplies.", + "training_session_intro_message": "You've come across some\ntraining tools and supplies.", "training_session_title": "Training Session", "training_session_description": "These supplies look like they could be used to train a member of your party! There are a few ways you could train your Pokémon, by battling against it with the rest of your team.", "training_session_query": "How should you train?", diff --git a/src/phases.ts b/src/phases.ts index b05ab41edc5..db060d8fe2d 100644 --- a/src/phases.ts +++ b/src/phases.ts @@ -296,14 +296,6 @@ export class TitlePhase extends Phase { }, keepOpen: true }, - { - label: i18next.t("menu:settings"), - handler: () => { - this.scene.ui.setOverlayMode(Mode.SETTINGS); - return true; - }, - keepOpen: true - }, { label: i18next.t("menu:settings"), handler: () => { From 1e1c67cd4092a30b6585309eb474dc37f767582e Mon Sep 17 00:00:00 2001 From: Frederico Santos Date: Sat, 6 Jul 2024 01:28:57 +0100 Subject: [PATCH 006/270] chore: Update deploy-beta.yml to include beta branch in SSH setup and deployment --- .github/workflows/deploy-beta.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/deploy-beta.yml b/.github/workflows/deploy-beta.yml index d954d9bb865..34fd3175cac 100644 --- a/.github/workflows/deploy-beta.yml +++ b/.github/workflows/deploy-beta.yml @@ -20,7 +20,7 @@ jobs: env: NODE_ENV: production - name: Set up SSH - if: github.event_name == 'push' && github.ref_name == github.event.repository.default_branch + if: github.event_name == 'push' && (github.ref_name == github.event.repository.default_branch || github.ref_name == 'refs/heads/beta') run: | mkdir ~/.ssh echo "${{ secrets.BETA_SSH_PUBLIC_KEY }}" > ~/.ssh/id_ed25519.pub @@ -28,6 +28,6 @@ jobs: chmod 600 ~/.ssh/* ssh-keyscan -H ${{ secrets.BETA_SSH_HOST }} >> ~/.ssh/known_hosts - name: Deploy build on server - if: github.event_name == 'push' && github.ref_name == github.event.repository.default_branch + if: github.event_name == 'push' && (github.ref_name == github.event.repository.default_branch || github.ref_name == 'refs/heads/beta') run: | rsync --del --no-times --checksum -vrm dist/* ${{ secrets.BETA_SSH_USER }}@${{ secrets.BETA_SSH_HOST }}:${{ secrets.BETA_DESTINATION_DIR }} \ No newline at end of file From 7fc8d103e44a8deab0e3b618cbe660df763be31b Mon Sep 17 00:00:00 2001 From: Frederico Santos Date: Sat, 6 Jul 2024 01:30:28 +0100 Subject: [PATCH 007/270] chore: Update deploy-beta.yml to include beta branch in SSH setup and deployment --- .github/workflows/deploy-beta.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/deploy-beta.yml b/.github/workflows/deploy-beta.yml index 34fd3175cac..d55a34b95f1 100644 --- a/.github/workflows/deploy-beta.yml +++ b/.github/workflows/deploy-beta.yml @@ -20,7 +20,7 @@ jobs: env: NODE_ENV: production - name: Set up SSH - if: github.event_name == 'push' && (github.ref_name == github.event.repository.default_branch || github.ref_name == 'refs/heads/beta') + if: github.event_name == 'push' && (github.ref_name == github.event.repository.default_branch || github.ref_name == 'beta') run: | mkdir ~/.ssh echo "${{ secrets.BETA_SSH_PUBLIC_KEY }}" > ~/.ssh/id_ed25519.pub @@ -28,6 +28,6 @@ jobs: chmod 600 ~/.ssh/* ssh-keyscan -H ${{ secrets.BETA_SSH_HOST }} >> ~/.ssh/known_hosts - name: Deploy build on server - if: github.event_name == 'push' && (github.ref_name == github.event.repository.default_branch || github.ref_name == 'refs/heads/beta') + if: github.event_name == 'push' && (github.ref_name == github.event.repository.default_branch || github.ref_name == 'beta') run: | rsync --del --no-times --checksum -vrm dist/* ${{ secrets.BETA_SSH_USER }}@${{ secrets.BETA_SSH_HOST }}:${{ secrets.BETA_DESTINATION_DIR }} \ No newline at end of file From 2318d86cb1dcf1f2dde338313d5ac25546d39b4c Mon Sep 17 00:00:00 2001 From: ImperialSympathizer <110984302+ben-lear@users.noreply.github.com> Date: Fri, 5 Jul 2024 20:43:53 -0400 Subject: [PATCH 008/270] Mystery Encounters (#2824) * squash commits to clean up PR * add chest sprites * bug fixes, cleanup, and tests * small fixes --------- Co-authored-by: ImperialSympathizer --- src/battle-scene.ts | 10 +- src/modifier/modifier-type.ts | 12 +- src/phases.ts | 279 ++++++++-------------------------- src/test/vitest.setup.ts | 6 +- 4 files changed, 75 insertions(+), 232 deletions(-) diff --git a/src/battle-scene.ts b/src/battle-scene.ts index 3fe0d6765db..0515800e53f 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -93,13 +93,8 @@ import { UiTheme } from "#enums/ui-theme"; import { TimedEventManager } from "#app/timed-event-manager.js"; import i18next from "i18next"; import MysteryEncounter, { MysteryEncounterTier, MysteryEncounterVariant } from "./data/mystery-encounter"; -import { - mysteryEncountersByBiome, - allMysteryEncounters, - BASE_MYSTERY_ENCOUNTER_WEIGHT, - AVERAGE_ENCOUNTERS_PER_RUN_TARGET -} from "./data/mystery-encounters/mystery-encounters"; -import {MysteryEncounterFlags} from "#app/data/mystery-encounter-flags"; +import { mysteryEncountersByBiome, allMysteryEncounters, BASE_MYSTERY_ENCOUNTER_WEIGHT, AVERAGE_ENCOUNTERS_PER_RUN_TARGET } from "./data/mystery-encounters/mystery-encounters"; +import { MysteryEncounterFlags } from "#app/data/mystery-encounter-flags"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; export const bypassLogin = import.meta.env.VITE_BYPASS_LOGIN === "1"; @@ -1225,6 +1220,7 @@ export default class BattleScene extends SceneBase { pokemon.resetBattleData(); applyPostBattleInitAbAttrs(PostBattleInitAbAttr, pokemon); } + } this.unshiftPhase(new ShowTrainerPhase(this)); } diff --git a/src/modifier/modifier-type.ts b/src/modifier/modifier-type.ts index 308b08b34cb..250b2953fdf 100644 --- a/src/modifier/modifier-type.ts +++ b/src/modifier/modifier-type.ts @@ -1818,7 +1818,7 @@ export function getPlayerModifierTypeOptions(count: integer, party: PlayerPokemo const retryCount = Math.min(count * 5, 50); if (!customModifierSettings) { new Array(count).fill(0).map((_, i) => { - options.push(getModifierTypeOptionWithLuckUpgrades(options, retryCount, party, modifierTiers?.length > i ? modifierTiers[i] : undefined)); + options.push(getModifierTypeOptionWithRetry(options, retryCount, party, modifierTiers?.length > i ? modifierTiers[i] : undefined)); }); } else { // Guaranteed mods first @@ -1857,14 +1857,14 @@ export function getPlayerModifierTypeOptions(count: integer, party: PlayerPokemo // Guaranteed tiers third if (customModifierSettings?.guaranteedModifierTiers?.length) { customModifierSettings?.guaranteedModifierTiers.forEach((tier) => { - options.push(getModifierTypeOptionWithLuckUpgrades(options, retryCount, party, tier)); + options.push(getModifierTypeOptionWithRetry(options, retryCount, party, tier)); }); } // Fill remaining if (options.length < count && customModifierSettings.fillRemaining) { while (options.length < count) { - options.push(getModifierTypeOptionWithLuckUpgrades(options, retryCount, party, undefined)); + options.push(getModifierTypeOptionWithRetry(options, retryCount, party, undefined)); } } } @@ -1880,10 +1880,10 @@ export function getPlayerModifierTypeOptions(count: integer, party: PlayerPokemo return options; } -function getModifierTypeOptionWithLuckUpgrades(existingOptions: ModifierTypeOption[], retryCount: integer, party: PlayerPokemon[], tier?: ModifierTier): ModifierTypeOption { - let candidate = getNewModifierTypeOption(party, ModifierPoolType.PLAYER, modifierTiers?.length > i ? modifierTiers[i] : undefined); +function getModifierTypeOptionWithRetry(existingOptions: ModifierTypeOption[], retryCount: integer, party: PlayerPokemon[], tier?: ModifierTier): ModifierTypeOption { + let candidate = getNewModifierTypeOption(party, ModifierPoolType.PLAYER, tier); let r = 0; - while (options.length && ++r < retryCount && options.filter(o => o.type.name === candidate.type.name || o.type.group === candidate.type.group).length) { + while (existingOptions.length && ++r < retryCount && existingOptions.filter(o => o.type.name === candidate.type.name || o.type.group === candidate.type.group).length) { candidate = getNewModifierTypeOption(party, ModifierPoolType.PLAYER, candidate.type.tier, candidate.upgradeCount); } return candidate; diff --git a/src/phases.ts b/src/phases.ts index db060d8fe2d..c6cda964e18 100644 --- a/src/phases.ts +++ b/src/phases.ts @@ -5,7 +5,7 @@ import { allMoves, applyMoveAttrs, BypassSleepAttr, ChargeAttr, applyFilteredMov import { Mode } from "./ui/ui"; import { Command } from "./ui/command-ui-handler"; import { Stat } from "./data/pokemon-stat"; -import { BerryModifier, ContactHeldItemTransferChanceModifier, EnemyAttackStatusEffectChanceModifier, EnemyPersistentModifier, EnemyStatusEffectHealChanceModifier, EnemyTurnHealModifier, ExpBalanceModifier, ExpBoosterModifier, ExpShareModifier, ExtraModifierModifier, FlinchChanceModifier, HealingBoosterModifier, HitHealModifier, LapsingPersistentModifier, MapModifier, Modifier, MultipleParticipantExpBonusModifier, PersistentModifier, PokemonExpBoosterModifier, PokemonHeldItemModifier, PokemonInstantReviveModifier, SwitchEffectTransferModifier, TempBattleStatBoosterModifier, TurnHealModifier, TurnHeldItemTransferModifier, MoneyMultiplierModifier, MoneyInterestModifier, IvScannerModifier, LapsingPokemonHeldItemModifier, PokemonMultiHitModifier, PokemonMoveAccuracyBoosterModifier, overrideModifiers, overrideHeldItems, BypassSpeedChanceModifier, TurnStatusEffectModifier } from "./modifier/modifier"; +import { BerryModifier, ContactHeldItemTransferChanceModifier, EnemyAttackStatusEffectChanceModifier, EnemyPersistentModifier, EnemyStatusEffectHealChanceModifier, EnemyTurnHealModifier, ExpBalanceModifier, ExpBoosterModifier, ExpShareModifier, FlinchChanceModifier, HealingBoosterModifier, HitHealModifier, LapsingPersistentModifier, MapModifier, Modifier, MultipleParticipantExpBonusModifier, PersistentModifier, PokemonExpBoosterModifier, PokemonHeldItemModifier, PokemonInstantReviveModifier, SwitchEffectTransferModifier, TempBattleStatBoosterModifier, TurnHealModifier, TurnHeldItemTransferModifier, MoneyMultiplierModifier, MoneyInterestModifier, IvScannerModifier, LapsingPokemonHeldItemModifier, PokemonMultiHitModifier, PokemonMoveAccuracyBoosterModifier, overrideModifiers, overrideHeldItems, BypassSpeedChanceModifier, TurnStatusEffectModifier } from "./modifier/modifier"; import PartyUiHandler, { PartyOption, PartyUiMode } from "./ui/party-ui-handler"; import { doPokeballBounceAnim, getPokeballAtlasKey, getPokeballCatchMultiplier, getPokeballTintColor, PokeballType } from "./data/pokeball"; import { CommonAnim, CommonBattleAnim, MoveAnim, initMoveAnim, loadMoveAnimAssets } from "./data/battle-anims"; @@ -19,7 +19,7 @@ import { biomeLinks, getBiomeName } from "./data/biomes"; import { ModifierTier } from "./modifier/modifier-tier"; import { ModifierPoolType, ModifierType, ModifierTypeFunc, getDailyRunStarterModifiers, getEnemyBuffModifierForWave, getModifierType, modifierTypes, regenerateModifierPoolThresholds } from "./modifier/modifier-type"; import SoundFade from "phaser3-rex-plugins/plugins/soundfade"; -import { BattlerTagLapseType, CenterOfAttentionTag, EncoreTag, ProtectedTag, SemiInvulnerableTag, TrappedTag } from "./data/battler-tags"; +import { BattlerTagLapseType, CenterOfAttentionTag, EncoreTag, ProtectedTag, SemiInvulnerableTag, TrappedTag, MysteryEncounterPostSummonTag } from "./data/battler-tags"; import { getPokemonMessage, getPokemonNameWithAffix } from "./messages"; import { Starter } from "./ui/starter-select-ui-handler"; import { Gender } from "./data/gender"; @@ -40,7 +40,6 @@ import { SessionSaveData } from "./system/game-data"; import { addPokeballCaptureStars, addPokeballOpenParticles } from "./field/anims"; import { SpeciesFormChangeActiveTrigger, SpeciesFormChangeManualTrigger, SpeciesFormChangeMoveLearnedTrigger, SpeciesFormChangePostMoveTrigger, SpeciesFormChangePreMoveTrigger } from "./data/pokemon-forms"; import { battleSpecDialogue, getCharVariantFromDialogue, miscDialogue } from "./data/dialogue"; -import ModifierSelectUiHandler, { SHOP_OPTIONS_ROW_LIMIT } from "./ui/modifier-select-ui-handler"; import { SettingKeys } from "./system/settings/settings"; import { Tutorial, handleTutorial } from "./tutorial"; import { TerrainType } from "./data/terrain"; @@ -296,6 +295,14 @@ export class TitlePhase extends Phase { }, keepOpen: true }, + { + label: i18next.t("menu:settings"), + handler: () => { + this.scene.ui.setOverlayMode(Mode.SETTINGS); + return true; + }, + keepOpen: true + }, { label: i18next.t("menu:settings"), handler: () => { @@ -1471,7 +1478,7 @@ export class SummonPhase extends PartyMemberPokemonPhase { preSummon(): void { const partyMember = this.getPokemon(); // If the Pokemon about to be sent out is fainted or illegal under a challenge, switch to the first non-fainted legal Pokemon - if (!partyMember.isAllowedInBattle() || (this.player && isNullOrUndefined(this.getParty().find(p => p.id === partyMember.id)))) { + if (!partyMember.isAllowedInBattle() || (this.player && !this.getParty().some(p => p.id === partyMember.id))) { console.warn("The Pokemon about to be sent out is fainted or illegal under a challenge. Attempting to resolve..."); // First check if they're somehow still in play, if so remove them. @@ -1661,6 +1668,57 @@ export class SummonPhase extends PartyMemberPokemonPhase { }); } + summonWild(): void { + const pokemon = this.getPokemon(); + + if (this.fieldIndex === 1) { + pokemon.setFieldPosition(FieldPosition.RIGHT, 0); + } else { + const availablePartyMembers = this.getParty().filter(p => !p.isFainted()).length; + pokemon.setFieldPosition(!this.scene.currentBattle.double || availablePartyMembers === 1 ? FieldPosition.CENTER : FieldPosition.LEFT); + } + + this.scene.add.existing(pokemon); + this.scene.field.add(pokemon); + if (!this.player) { + const playerPokemon = this.scene.getPlayerPokemon() as Pokemon; + if (playerPokemon?.visible) { + this.scene.field.moveBelow(pokemon, playerPokemon); + } + this.scene.currentBattle.seenEnemyPartyMemberIds.add(pokemon.id); + } + this.scene.updateModifiers(this.player); + this.scene.updateFieldScale(); + pokemon.showInfo(); + pokemon.playAnim(); + pokemon.setVisible(true); + pokemon.getSprite().setVisible(true); + pokemon.setScale(0.75); + pokemon.tint(getPokeballTintColor(pokemon.pokeball)); + pokemon.untint(250, "Sine.easeIn"); + this.scene.updateFieldScale(); + pokemon.x += 16; + pokemon.y -= 16; + pokemon.alpha = 0; + + // Ease pokemon in + this.scene.tweens.add({ + targets: pokemon, + x: "-=16", + y: "+=16", + alpha: 1, + duration: 1000, + ease: "Sine.easeIn", + scale: pokemon.getSpriteScale(), + onComplete: () => { + pokemon.cry(pokemon.getHpRatio() > 0.25 ? undefined : { rate: 0.85 }); + pokemon.getSprite().clearTint(); + pokemon.resetSummonData(); + this.scene.time.delayedCall(1000, () => this.end()); + } + }); + } + onEnd(): void { const pokemon = this.getPokemon(); @@ -5246,219 +5304,6 @@ export class AttemptRunPhase extends PokemonPhase { } } -export class SelectModifierPhase extends BattlePhase { - private rerollCount: integer; - private modifierTiers: ModifierTier[]; - - constructor(scene: BattleScene, rerollCount: integer = 0, modifierTiers?: ModifierTier[]) { - super(scene); - - this.rerollCount = rerollCount; - this.modifierTiers = modifierTiers; - } - - start() { - super.start(); - - if (!this.rerollCount) { - this.updateSeed(); - } else { - this.scene.reroll = false; - } - - const party = this.scene.getParty(); - regenerateModifierPoolThresholds(party, this.getPoolType(), this.rerollCount); - const modifierCount = new Utils.IntegerHolder(3); - if (this.isPlayer()) { - this.scene.applyModifiers(ExtraModifierModifier, true, modifierCount); - } - const typeOptions: ModifierTypeOption[] = this.getModifierTypeOptions(modifierCount.value); - - const modifierSelectCallback = (rowCursor: integer, cursor: integer) => { - if (rowCursor < 0 || cursor < 0) { - this.scene.ui.showText(i18next.t("battle:skipItemQuestion"), null, () => { - this.scene.ui.setOverlayMode(Mode.CONFIRM, () => { - this.scene.ui.revertMode(); - this.scene.ui.setMode(Mode.MESSAGE); - super.end(); - }, () => this.scene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer(), typeOptions, modifierSelectCallback, this.getRerollCost(typeOptions, this.scene.lockModifierTiers))); - }); - return false; - } - let modifierType: ModifierType; - let cost: integer; - switch (rowCursor) { - case 0: - switch (cursor) { - case 0: - const rerollCost = this.getRerollCost(typeOptions, this.scene.lockModifierTiers); - if (this.scene.money < rerollCost) { - this.scene.ui.playError(); - return false; - } else { - this.scene.reroll = true; - this.scene.unshiftPhase(new SelectModifierPhase(this.scene, this.rerollCount + 1, typeOptions.map(o => o.type.tier))); - this.scene.ui.clearText(); - this.scene.ui.setMode(Mode.MESSAGE).then(() => super.end()); - this.scene.money -= rerollCost; - this.scene.updateMoneyText(); - this.scene.animateMoneyChanged(false); - this.scene.playSound("buy"); - } - break; - case 1: - this.scene.ui.setModeWithoutClear(Mode.PARTY, PartyUiMode.MODIFIER_TRANSFER, -1, (fromSlotIndex: integer, itemIndex: integer, itemQuantity: integer, toSlotIndex: integer) => { - if (toSlotIndex !== undefined && fromSlotIndex < 6 && toSlotIndex < 6 && fromSlotIndex !== toSlotIndex && itemIndex > -1) { - const itemModifiers = this.scene.findModifiers(m => m instanceof PokemonHeldItemModifier - && (m as PokemonHeldItemModifier).getTransferrable(true) && (m as PokemonHeldItemModifier).pokemonId === party[fromSlotIndex].id) as PokemonHeldItemModifier[]; - const itemModifier = itemModifiers[itemIndex]; - this.scene.tryTransferHeldItemModifier(itemModifier, party[toSlotIndex], true, itemQuantity); - } else { - this.scene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer(), typeOptions, modifierSelectCallback, this.getRerollCost(typeOptions, this.scene.lockModifierTiers)); - } - }, PartyUiHandler.FilterItemMaxStacks); - break; - case 2: - this.scene.ui.setModeWithoutClear(Mode.PARTY, PartyUiMode.CHECK, -1, () => { - this.scene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer(), typeOptions, modifierSelectCallback, this.getRerollCost(typeOptions, this.scene.lockModifierTiers)); - }); - break; - case 3: - this.scene.lockModifierTiers = !this.scene.lockModifierTiers; - const uiHandler = this.scene.ui.getHandler() as ModifierSelectUiHandler; - uiHandler.setRerollCost(this.getRerollCost(typeOptions, this.scene.lockModifierTiers)); - uiHandler.updateLockRaritiesText(); - uiHandler.updateRerollCostText(); - return false; - } - return true; - case 1: - modifierType = typeOptions[cursor].type; - break; - default: - const shopOptions = getPlayerShopModifierTypeOptionsForWave(this.scene.currentBattle.waveIndex, this.scene.getWaveMoneyAmount(1)); - const shopOption = shopOptions[rowCursor > 2 || shopOptions.length <= SHOP_OPTIONS_ROW_LIMIT ? cursor : cursor + SHOP_OPTIONS_ROW_LIMIT]; - modifierType = shopOption.type; - cost = shopOption.cost; - break; - } - - if (cost && this.scene.money < cost) { - this.scene.ui.playError(); - return false; - } - - const applyModifier = (modifier: Modifier, playSound: boolean = false) => { - const result = this.scene.addModifier(modifier, false, playSound); - if (cost) { - result.then(success => { - if (success) { - this.scene.money -= cost; - this.scene.updateMoneyText(); - this.scene.animateMoneyChanged(false); - this.scene.playSound("buy"); - (this.scene.ui.getHandler() as ModifierSelectUiHandler).updateCostText(); - } else { - this.scene.ui.playError(); - } - }); - } else { - const doEnd = () => { - this.scene.ui.clearText(); - this.scene.ui.setMode(Mode.MESSAGE); - super.end(); - }; - if (result instanceof Promise) { - result.then(() => doEnd()); - } else { - doEnd(); - } - } - }; - - if (modifierType instanceof PokemonModifierType) { - if (modifierType instanceof FusePokemonModifierType) { - this.scene.ui.setModeWithoutClear(Mode.PARTY, PartyUiMode.SPLICE, -1, (fromSlotIndex: integer, spliceSlotIndex: integer) => { - if (spliceSlotIndex !== undefined && fromSlotIndex < 6 && spliceSlotIndex < 6 && fromSlotIndex !== spliceSlotIndex) { - this.scene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer()).then(() => { - const modifier = modifierType.newModifier(party[fromSlotIndex], party[spliceSlotIndex]); - applyModifier(modifier, true); - }); - } else { - this.scene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer(), typeOptions, modifierSelectCallback, this.getRerollCost(typeOptions, this.scene.lockModifierTiers)); - } - }, modifierType.selectFilter); - } else { - const pokemonModifierType = modifierType as PokemonModifierType; - const isMoveModifier = modifierType instanceof PokemonMoveModifierType; - const isTmModifier = modifierType instanceof TmModifierType; - const isRememberMoveModifier = modifierType instanceof RememberMoveModifierType; - const isPpRestoreModifier = (modifierType instanceof PokemonPpRestoreModifierType || modifierType instanceof PokemonPpUpModifierType); - const partyUiMode = isMoveModifier ? PartyUiMode.MOVE_MODIFIER - : isTmModifier ? PartyUiMode.TM_MODIFIER - : isRememberMoveModifier ? PartyUiMode.REMEMBER_MOVE_MODIFIER - : PartyUiMode.MODIFIER; - const tmMoveId = isTmModifier - ? (modifierType as TmModifierType).moveId - : undefined; - this.scene.ui.setModeWithoutClear(Mode.PARTY, partyUiMode, -1, (slotIndex: integer, option: PartyOption) => { - if (slotIndex < 6) { - this.scene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer()).then(() => { - const modifier = !isMoveModifier - ? !isRememberMoveModifier - ? modifierType.newModifier(party[slotIndex]) - : modifierType.newModifier(party[slotIndex], option as integer) - : modifierType.newModifier(party[slotIndex], option - PartyOption.MOVE_1); - applyModifier(modifier, true); - }); - } else { - this.scene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer(), typeOptions, modifierSelectCallback, this.getRerollCost(typeOptions, this.scene.lockModifierTiers)); - } - }, pokemonModifierType.selectFilter, modifierType instanceof PokemonMoveModifierType ? (modifierType as PokemonMoveModifierType).moveSelectFilter : undefined, tmMoveId, isPpRestoreModifier); - } - } else { - applyModifier(modifierType.newModifier()); - } - - return !cost; - }; - this.scene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer(), typeOptions, modifierSelectCallback, this.getRerollCost(typeOptions, this.scene.lockModifierTiers)); - } - - updateSeed(): void { - this.scene.resetSeed(); - } - - isPlayer(): boolean { - return true; - } - - getRerollCost(typeOptions: ModifierTypeOption[], lockRarities: boolean): integer { - let baseValue = 0; - if (lockRarities) { - const tierValues = [50, 125, 300, 750, 2000]; - for (const opt of typeOptions) { - baseValue += tierValues[opt.type.tier]; - } - } else { - baseValue = 250; - } - return Math.min(Math.ceil(this.scene.currentBattle.waveIndex / 10) * baseValue * Math.pow(2, this.rerollCount), Number.MAX_SAFE_INTEGER); - } - - getPoolType(): ModifierPoolType { - return ModifierPoolType.PLAYER; - } - - getModifierTypeOptions(modifierCount: integer): ModifierTypeOption[] { - return getPlayerModifierTypeOptions(modifierCount, this.scene.getParty(), this.scene.lockModifierTiers ? this.modifierTiers : undefined); - } - - addModifier(modifier: Modifier): Promise { - return this.scene.addModifier(modifier, false, true); - } -} - export class EggLapsePhase extends Phase { constructor(scene: BattleScene) { super(scene); diff --git a/src/test/vitest.setup.ts b/src/test/vitest.setup.ts index 2b2be3bb42b..3615ca7d27e 100644 --- a/src/test/vitest.setup.ts +++ b/src/test/vitest.setup.ts @@ -14,9 +14,11 @@ import { initVouchers } from "#app/system/voucher.js"; import { initStatsKeys } from "#app/ui/game-stats-ui-handler"; import { beforeAll, beforeEach, vi } from "vitest"; import * as overrides from "#app/overrides"; -import {initMysteryEncounterDialogue} from "#app/data/mystery-encounters/dialogue/mystery-encounter-dialogue"; -import {initMysteryEncounters} from "#app/data/mystery-encounters/mystery-encounters"; +import { initMysteryEncounterDialogue } from "#app/data/mystery-encounters/dialogue/mystery-encounter-dialogue"; +import { initMysteryEncounters } from "#app/data/mystery-encounters/mystery-encounters"; +initVouchers(); +initAchievements(); initStatsKeys(); initPokemonPrevolutions(); initBiomes(); From 8e84e40e3552052f4cc650293d774468099eff94 Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Fri, 5 Jul 2024 23:30:33 -0400 Subject: [PATCH 009/270] beta bug fixes --- src/data/mystery-encounter.ts | 22 +++++++++---------- src/data/mystery-encounters/dark-deal.ts | 2 +- .../mystery-encounters/fight-or-flight.ts | 4 ++-- .../mystery-encounters/mysterious-chest.ts | 2 +- .../mystery-encounter-utils.ts | 8 +++---- .../mystery-encounters/training-session.ts | 16 +++++++------- src/phases.ts | 8 ------- 7 files changed, 27 insertions(+), 35 deletions(-) diff --git a/src/data/mystery-encounter.ts b/src/data/mystery-encounter.ts index 6a81e473724..51f3eb4f662 100644 --- a/src/data/mystery-encounter.ts +++ b/src/data/mystery-encounter.ts @@ -86,7 +86,7 @@ export default interface MysteryEncounter { * Can be set for uses programatic dialogue during an encounter (storing the name of one of the party's pokemon, etc.) * Example use: see MYSTERIOUS_CHEST */ - dialogueTokens?: Map; + dialogueTokens?: Map; /** * Should be set depending upon option selected as part of an encounter * For example, if there is no battle as part of the encounter/selected option, should be set to NO_BATTLE @@ -139,7 +139,7 @@ export default class MysteryEncounter implements MysteryEncounter { // Reset any dirty flags or encounter data this.lockEncounterRewardTiers = true; - this.dialogueTokens = new Map; + this.dialogueTokens = new Map; this.enemyPartyConfigs = []; this.introVisuals = null; this.misc = null; @@ -264,20 +264,20 @@ export default class MysteryEncounter implements MysteryEncounter { */ populateDialogueTokensFromRequirements?() { if (this.primaryPokemon?.length > 0) { - this.dialogueTokens.set(/@ec\{primaryName\}/gi, this.primaryPokemon.name); + this.dialogueTokens.set("primaryName", [/@ec\{primaryName\}/gi, this.primaryPokemon.name]); for (const req of this.primaryPokemonRequirements) { if (!req.invertQuery) { const entry: [RegExp, string] = req.getMatchingDialogueToken("primary", this.primaryPokemon); - this.dialogueTokens.set(entry[0], entry[1]); + this.dialogueTokens.set("primary", entry); } } } if (this.secondaryPokemonRequirements?.length > 0 && this.secondaryPokemon?.length > 0) { - this.dialogueTokens.set(/@ec\{secondaryName\}/gi, this.secondaryPokemon[0].name); + this.dialogueTokens.set("secondaryName", [/@ec\{secondaryName\}/gi, this.secondaryPokemon[0].name]); for (const req of this.secondaryPokemonRequirements) { if (!req.invertQuery) { const entry: [RegExp, string] = req.getMatchingDialogueToken("secondary", this.secondaryPokemon[0]); - this.dialogueTokens.set(entry[0], entry[1]); + this.dialogueTokens.set("secondary", entry); } } } @@ -285,20 +285,20 @@ export default class MysteryEncounter implements MysteryEncounter { const opt = this.options[i]; const j = i + 1; if (opt.primaryPokemonRequirements?.length > 0 && opt.primaryPokemon?.length > 0) { - this.dialogueTokens.set(new RegExp("@ec\{option" + j + "PrimaryName\\}", "gi"), opt.primaryPokemon.name); + this.dialogueTokens.set("option" + j + "PrimaryName", [new RegExp("@ec\{option" + j + "PrimaryName\\}", "gi"), opt.primaryPokemon.name]); for (const req of opt.primaryPokemonRequirements) { if (!req.invertQuery) { const entry: [RegExp, string] = req.getMatchingDialogueToken("option" + j + "Primary", opt.primaryPokemon); - this.dialogueTokens.set(entry[0], entry[1]); + this.dialogueTokens.set("option" + j + "Primary", entry); } } } if (opt.secondaryPokemonRequirements?.length > 0 && opt.secondaryPokemon?.length > 0) { - this.dialogueTokens.set(new RegExp("@ec\{option" + j + "SecondaryName\\}", "gi"), opt.secondaryPokemon[0].name); + this.dialogueTokens.set("option" + j + "SecondaryName", [new RegExp("@ec\{option" + j + "SecondaryName\\}", "gi"), opt.secondaryPokemon[0].name]); for (const req of opt.secondaryPokemonRequirements) { if (!req.invertQuery) { const entry: [RegExp, string] = req.getMatchingDialogueToken("option" + j + "Secondary", opt.secondaryPokemon[0]); - this.dialogueTokens.set(entry[0], entry[1]); + this.dialogueTokens.set("option" + j + "Secondary", entry); } } } @@ -317,7 +317,7 @@ export class MysteryEncounterBuilder implements Partial { primaryPokemonRequirements?: EncounterPokemonRequirement[] = []; secondaryPokemonRequirements ?: EncounterPokemonRequirement[] = []; excludePrimaryFromSupportRequirements?: boolean; - dialogueTokens?: Map; + dialogueTokens?: Map; doEncounterRewards?: (scene: BattleScene) => boolean; onInit?: (scene: BattleScene) => boolean; hideBattleIntroMessage?: boolean; diff --git a/src/data/mystery-encounters/dark-deal.ts b/src/data/mystery-encounters/dark-deal.ts index bf75a10f661..5b99a128f3e 100644 --- a/src/data/mystery-encounters/dark-deal.ts +++ b/src/data/mystery-encounters/dark-deal.ts @@ -92,7 +92,7 @@ export const DarkDealEncounter: MysteryEncounter = new MysteryEncounterBuilder() // Will never return last battle able mon and instead pick fainted/unable to battle const removedPokemon = getRandomPlayerPokemon(scene, false, true); scene.removePokemonFromPlayerParty(removedPokemon); - scene.currentBattle.mysteryEncounter.dialogueTokens.set( /@ec\{pokeName\}/gi, removedPokemon.name); + scene.currentBattle.mysteryEncounter.dialogueTokens.set("pokeName", [/@ec\{pokeName\}/gi, removedPokemon.name]); // Store removed pokemon types scene.currentBattle.mysteryEncounter.misc = [removedPokemon.species.type1]; diff --git a/src/data/mystery-encounters/fight-or-flight.ts b/src/data/mystery-encounters/fight-or-flight.ts index f447e77134e..8290604d207 100644 --- a/src/data/mystery-encounters/fight-or-flight.ts +++ b/src/data/mystery-encounters/fight-or-flight.ts @@ -47,7 +47,7 @@ export const FightOrFlightEncounter: MysteryEncounter = new MysteryEncounterBuil const tier = scene.currentBattle.waveIndex > 160 ? ModifierTier.MASTER : scene.currentBattle.waveIndex > 110 ? ModifierTier.ROGUE : scene.currentBattle.waveIndex > 60 ? ModifierTier.ULTRA : ModifierTier.GREAT; regenerateModifierPoolThresholds(scene.getParty(), ModifierPoolType.PLAYER, 0); // refresh player item pool const item = getPlayerModifierTypeOptions(1, scene.getParty(), [], { guaranteedModifierTiers: [tier]})[0]; - scene.currentBattle.mysteryEncounter.dialogueTokens.set(/@ec\{itemName\}/gi, item.type.name); + scene.currentBattle.mysteryEncounter.dialogueTokens.set("itemName", [/@ec\{itemName\}/gi, item.type.name]); scene.currentBattle.mysteryEncounter.misc = item; instance.spriteConfigs = [ @@ -92,7 +92,7 @@ export const FightOrFlightEncounter: MysteryEncounter = new MysteryEncounterBuil const config = scene.currentBattle.mysteryEncounter.enemyPartyConfigs[0]; config.pokemonConfigs[0].tags = [BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON]; config.pokemonConfigs[0].mysteryEncounterBattleEffects = (pokemon: Pokemon) => { - pokemon.scene.currentBattle.mysteryEncounter.dialogueTokens.set(/@ec\{enemyPokemon\}/gi, pokemon.name); + pokemon.scene.currentBattle.mysteryEncounter.dialogueTokens.set("enemyPokemon", [/@ec\{enemyPokemon\}/gi, pokemon.name]); queueEncounterMessage(pokemon.scene, "mysteryEncounter:fight_or_flight_boss_enraged"); pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [BattleStat.ATK, BattleStat.DEF, BattleStat.SPATK, BattleStat.SPDEF, BattleStat.SPD], 1)); }; diff --git a/src/data/mystery-encounters/mysterious-chest.ts b/src/data/mystery-encounters/mysterious-chest.ts index 8e31a433313..68fae514b22 100644 --- a/src/data/mystery-encounters/mysterious-chest.ts +++ b/src/data/mystery-encounters/mysterious-chest.ts @@ -69,7 +69,7 @@ export const MysteriousChestEncounter: MysteryEncounter = new MysteryEncounterBu const highestLevelPokemon = getHighestLevelPlayerPokemon(scene, true); koPlayerPokemon(highestLevelPokemon); - scene.currentBattle.mysteryEncounter.dialogueTokens.set(/@ec\{pokeName\}/gi, highestLevelPokemon.name); + scene.currentBattle.mysteryEncounter.dialogueTokens.set("pokeName", [/@ec\{pokeName\}/gi, highestLevelPokemon.name]); // Show which Pokemon was KOed, then leave encounter with no rewards // Does this synchronously so that game over doesn't happen over result message await showEncounterText(scene, "mysteryEncounter:mysterious_chest_option_1_bad_result") diff --git a/src/data/mystery-encounters/mystery-encounter-utils.ts b/src/data/mystery-encounters/mystery-encounter-utils.ts index 3c9ee48c9ba..912db218c42 100644 --- a/src/data/mystery-encounters/mystery-encounter-utils.ts +++ b/src/data/mystery-encounters/mystery-encounter-utils.ts @@ -131,8 +131,8 @@ export function getTextWithEncounterDialogueTokens(scene: BattleScene, textKey: const dialogueTokens = scene.currentBattle?.mysteryEncounter?.dialogueTokens; if (dialogueTokens) { - dialogueTokens.forEach((value, key) => { - textString = textString.replace(key, value); + dialogueTokens.forEach((value) => { + textString = textString.replace(value[0], value[1]); }); } @@ -450,7 +450,7 @@ export function selectPokemonForOption(scene: BattleScene, onPokemonSelected: (p const pokemon = scene.getParty()[slotIndex]; const secondaryOptions = onPokemonSelected(pokemon); if (!secondaryOptions) { - scene.currentBattle.mysteryEncounter.dialogueTokens.set(/@ec\{selectedPokemon\}/gi, pokemon.name); + scene.currentBattle.mysteryEncounter.dialogueTokens.set("selectedPokemon", [/@ec\{selectedPokemon\}/gi, pokemon.name]); resolve(true); return; } @@ -464,7 +464,7 @@ export function selectPokemonForOption(scene: BattleScene, onPokemonSelected: (p const onSelect = option.handler; option.handler = () => { onSelect(); - scene.currentBattle.mysteryEncounter.dialogueTokens.set(/@ec\{selectedPokemon\}/gi, pokemon.name); + scene.currentBattle.mysteryEncounter.dialogueTokens.set("selectedPokemon", [/@ec\{selectedPokemon\}/gi, pokemon.name]); resolve(true); return true; }; diff --git a/src/data/mystery-encounters/training-session.ts b/src/data/mystery-encounters/training-session.ts index 8fb0fcde3ec..105de4415a1 100644 --- a/src/data/mystery-encounters/training-session.ts +++ b/src/data/mystery-encounters/training-session.ts @@ -77,8 +77,8 @@ export const TrainingSessionEncounter: MysteryEncounter = new MysteryEncounterBu }; const onBeforeRewardsPhase = () => { - encounter.dialogueTokens.set(/@ec\{stat1\}/gi, "-"); - encounter.dialogueTokens.set(/@ec\{stat2\}/gi, "-"); + encounter.dialogueTokens.set("stat1", [/@ec\{stat1\}/gi, "-"]); + encounter.dialogueTokens.set("stat2", [/@ec\{stat2\}/gi, "-"]); // Add the pokemon back to party with IV boost const ivIndexes = []; playerPokemon.ivs.forEach((iv, index) => { @@ -100,9 +100,9 @@ export const TrainingSessionEncounter: MysteryEncounter = new MysteryEncounterBu const ivToChange = ivIndexes.pop(); let newVal = ivToChange.iv; if (improvedCount === 0) { - encounter.dialogueTokens.set(/@ec\{stat1\}/gi, getIvName(ivToChange.index)); + encounter.dialogueTokens.set("stat1", [/@ec\{stat1\}/gi, getIvName(ivToChange.index)]); } else { - encounter.dialogueTokens.set(/@ec\{stat2\}/gi, getIvName(ivToChange.index)); + encounter.dialogueTokens.set("stat2", [/@ec\{stat2\}/gi, getIvName(ivToChange.index)]); } // Corrects required encounter breakpoints to be continuous for all IV values @@ -148,7 +148,7 @@ export const TrainingSessionEncounter: MysteryEncounter = new MysteryEncounterBu label: getNatureName(nature, true, true, true, scene.uiTheme), handler: () => { // Pokemon and second option selected - encounter.dialogueTokens.set(/@ec\{nature\}/gi, getNatureName(nature)); + encounter.dialogueTokens.set("nature", [/@ec\{nature\}/gi, getNatureName(nature)]); encounter.misc = { playerPokemon: pokemon, chosenNature: nature @@ -201,15 +201,15 @@ export const TrainingSessionEncounter: MysteryEncounter = new MysteryEncounterBu const speciesForm = !!pokemon.getFusionSpeciesForm() ? pokemon.getFusionSpeciesForm() : pokemon.getSpeciesForm(); const abilityCount = speciesForm.getAbilityCount(); const abilities = new Array(abilityCount).fill(null).map((val, i) => allAbilities[speciesForm.getAbility(i)]); - return abilities.map((ability: Ability) => { + return abilities.map((ability: Ability, index) => { const option: OptionSelectItem = { label: ability.name, handler: () => { // Pokemon and ability selected - encounter.dialogueTokens.set(/@ec\{ability\}/gi, ability.name); + encounter.dialogueTokens.set("ability", [/@ec\{ability\}/gi, ability.name]); encounter.misc = { playerPokemon: pokemon, - abilityIndex: ability + abilityIndex: index }; return true; }, diff --git a/src/phases.ts b/src/phases.ts index c6cda964e18..ffd9c0b609a 100644 --- a/src/phases.ts +++ b/src/phases.ts @@ -295,14 +295,6 @@ export class TitlePhase extends Phase { }, keepOpen: true }, - { - label: i18next.t("menu:settings"), - handler: () => { - this.scene.ui.setOverlayMode(Mode.SETTINGS); - return true; - }, - keepOpen: true - }, { label: i18next.t("menu:settings"), handler: () => { From 7fb1506a97f99b6a5e28385d2d208d9f3645959b Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Sat, 6 Jul 2024 00:14:18 -0400 Subject: [PATCH 010/270] clean up data token logic --- src/data/mystery-encounter-requirements.ts | 99 ++++++++++--------- src/data/mystery-encounter.ts | 34 ++++--- src/data/mystery-encounters/dark-deal.ts | 3 +- .../mystery-encounters/fight-or-flight.ts | 12 +-- .../mysterious-challengers.ts | 10 +- .../mystery-encounters/mysterious-chest.ts | 2 +- .../mystery-encounter-utils.ts | 7 +- .../mystery-encounters/sleeping-snorlax.ts | 6 +- .../mystery-encounters/training-session.ts | 12 +-- 9 files changed, 97 insertions(+), 88 deletions(-) diff --git a/src/data/mystery-encounter-requirements.ts b/src/data/mystery-encounter-requirements.ts index b791e1ef1df..d88ec530a74 100644 --- a/src/data/mystery-encounter-requirements.ts +++ b/src/data/mystery-encounter-requirements.ts @@ -17,6 +17,7 @@ import {MysteryEncounterType} from "#enums/mystery-encounter-type"; export interface EncounterRequirement { meetsRequirement(scene: BattleScene): boolean; // Boolean to see if a requirement is met + getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string]; } export abstract class EncounterSceneRequirement implements EncounterRequirement { @@ -24,8 +25,8 @@ export abstract class EncounterSceneRequirement implements EncounterRequirement throw new Error("Method not implemented."); } - getMatchingDialogueToken(scene:BattleScene): [RegExp, string] { - return [(/@/gi), ""]; + getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] { + return ["", ""]; } } @@ -44,8 +45,8 @@ export abstract class EncounterPokemonRequirement implements EncounterRequiremen // Doesn't require the "@ec" as prefix, just the string; populates the token with the attribute // ex. @ec{primarySpecies} if strPrefix is simply "primary" - getMatchingDialogueToken(strPrefix:string, pokemon: PlayerPokemon): [RegExp, string] { - return [(/@/gi), ""]; + getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] { + return ["", ""]; } } @@ -65,8 +66,8 @@ export class PreviousEncounterRequirement extends EncounterSceneRequirement { return scene.mysteryEncounterFlags.encounteredEvents.some(e => e[0] === this.previousEncounterRequirement); } - getMatchingDialogueToken(scene:BattleScene): [RegExp, string] { - return [new RegExp("@ec\{previousEncounter\\}", "gi"), scene.mysteryEncounterFlags.encounteredEvents.find(e => e[0] === this.previousEncounterRequirement)[0].toString()]; + getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] { + return ["previousEncounter", scene.mysteryEncounterFlags.encounteredEvents.find(e => e[0] === this.previousEncounterRequirement)[0].toString()]; } } @@ -93,8 +94,8 @@ export class WaveCountRequirement extends EncounterSceneRequirement { return true; } - getMatchingDialogueToken(scene:BattleScene): [RegExp, string] { - return [new RegExp("@ec\{waveCount\\}", "gi"), scene.currentBattle.waveIndex.toString()]; + getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] { + return ["waveCount", scene.currentBattle.waveIndex.toString()]; } } @@ -120,8 +121,8 @@ export class TimeOfDayRequirement extends EncounterSceneRequirement { return true; } - getMatchingDialogueToken(scene:BattleScene): [RegExp, string] { - return [new RegExp("@ec\{timeOfDay\\}", "gi"), TimeOfDay[scene.arena.getTimeOfDay()].toLocaleLowerCase()]; + getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] { + return ["timeOfDay", TimeOfDay[scene.arena.getTimeOfDay()].toLocaleLowerCase()]; } } @@ -146,8 +147,8 @@ export class WeatherRequirement extends EncounterSceneRequirement { return true; } - getMatchingDialogueToken(scene:BattleScene): [RegExp, string] { - return [new RegExp("@ec\{weather\\}", "gi"), WeatherType[scene.arena?.weather?.weatherType].replace("_", " ").toLocaleLowerCase()]; + getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] { + return ["weather", WeatherType[scene.arena?.weather?.weatherType].replace("_", " ").toLocaleLowerCase()]; } } @@ -175,8 +176,8 @@ export class PartySizeRequirement extends EncounterSceneRequirement { return true; } - getMatchingDialogueToken(scene:BattleScene): [RegExp, string] { - return [new RegExp("@ec\{partySize\\}", "gi"), scene.getParty().length.toString()]; + getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] { + return ["partySize", scene.getParty().length.toString()]; } } @@ -202,12 +203,12 @@ export class PersistentModifierRequirement extends EncounterSceneRequirement { return true; } - getMatchingDialogueToken(scene:BattleScene): [RegExp, string] { + getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] { const requiredItemsInInventory = this.requiredItems.filter((a) => { scene.modifiers.filter((itemInScene) => itemInScene.type.id === a.id).length > 0; }); if (requiredItemsInInventory.length > 0) { - return [new RegExp("@ec\{requiredItem\\}", "gi"), requiredItemsInInventory[0].name]; + return ["requiredItem", requiredItemsInInventory[0].name]; } return null; } @@ -229,8 +230,8 @@ export class MoneyRequirement extends EncounterSceneRequirement { return true; } - getMatchingDialogueToken(scene:BattleScene): [RegExp, string] { - return [new RegExp("@ec\{money\\}", "gi"), "₽" + scene.money.toString()]; + getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] { + return ["money", "₽" + scene.money.toString()]; } } @@ -268,9 +269,9 @@ export class SpeciesRequirement extends EncounterPokemonRequirement { } } - getMatchingDialogueToken(str:string, pokemon: PlayerPokemon): [RegExp, string] { + getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] { if (this.requiredSpecies.includes(pokemon.species.speciesId)) { - return [new RegExp("@ec\{" + str + "Species\\}", "gi"), Species[pokemon.species.speciesId]]; + return ["species", Species[pokemon.species.speciesId]]; } return null; } @@ -311,9 +312,9 @@ export class NatureRequirement extends EncounterPokemonRequirement { } } - getMatchingDialogueToken(str:string, pokemon: PlayerPokemon): [RegExp, string] { + getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] { if (this.requiredNature.includes(pokemon.nature)) { - return [new RegExp("@ec\{" + str + "Nature\\}", "gi"), Nature[pokemon.nature]]; + return ["nature", Nature[pokemon.nature]]; } return null; } @@ -353,10 +354,10 @@ export class TypeRequirement extends EncounterPokemonRequirement { } } - getMatchingDialogueToken(str:string, pokemon: PlayerPokemon): [RegExp, string] { + getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] { const includedTypes = this.requiredType.filter((ty) => pokemon.getTypes().includes(ty)); if (includedTypes.length > 0) { - return [new RegExp("@ec\{" + str + "Type\\}", "gi"), Type[includedTypes[0]]]; + return ["type", Type[includedTypes[0]]]; } return null; } @@ -397,10 +398,10 @@ export class MoveRequirement extends EncounterPokemonRequirement { } } - getMatchingDialogueToken(str:string, pokemon: PlayerPokemon): [RegExp, string] { + getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] { const includedMoves = this.requiredMoves.filter((reqMove) => pokemon.moveset.filter((move) => move.moveId === reqMove).length > 0); if (includedMoves.length > 0) { - return [new RegExp("@ec\{" + str + "Move\\}", "gi"), Moves[includedMoves[0]].replace("_", " ")]; + return ["move", Moves[includedMoves[0]].replace("_", " ")]; } return null; } @@ -446,10 +447,10 @@ export class CompatibleMoveRequirement extends EncounterPokemonRequirement { } } - getMatchingDialogueToken(str:string, pokemon: PlayerPokemon): [RegExp, string] { + getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] { const includedCompatMoves = this.requiredMoves.filter((reqMove) => pokemon.compatibleTms.filter((tm) => !pokemon.moveset.find(m => m.moveId === tm)).includes(reqMove)); if (includedCompatMoves.length > 0) { - return [new RegExp("@ec\{" + str + "CompatibleMove\\}", "gi"), Moves[includedCompatMoves[0]]]; + return ["compatibleMove", Moves[includedCompatMoves[0]]]; } return null; } @@ -494,7 +495,7 @@ export class EvolutionTargetSpeciesRequirement extends EncounterPokemonRequireme getMatchingDialogueToken(str:string, pokemon: PlayerPokemon): [RegExp, string] { const evos = this.requiredEvolutionTargetSpecies.filter((evolutionTargetSpecies) => pokemon.getEvolution().speciesId === evolutionTargetSpecies); if (evos.length > 0) { - return [new RegExp("@ec\{" + str + "Evolution\\}", "gi"), Species[evos[0]]]; + return ["Evolution", Species[evos[0]]]; } return null; } @@ -535,12 +536,12 @@ export class AbilityRequirement extends EncounterPokemonRequirement { } } - getMatchingDialogueToken(str:string, pokemon: PlayerPokemon): [RegExp, string] { + getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] { const reqAbilities = this.requiredAbilities.filter((a) => { pokemon.hasAbility(a); }); if (reqAbilities.length > 0) { - return [new RegExp("@ec\{" + str + "Ability\\}", "gi"), Abilities[reqAbilities[0]]]; + return ["ability", Abilities[reqAbilities[0]]]; } return null; } @@ -582,12 +583,12 @@ export class StatusEffectRequirement extends EncounterPokemonRequirement { } } - getMatchingDialogueToken(str:string, pokemon: PlayerPokemon): [RegExp, string] { + getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] { const reqStatus = this.requiredStatusEffect.filter((a) => { pokemon.status?.effect ===(a); }); if (reqStatus.length > 0) { - return [new RegExp("@ec\{" + str + "Status\\}", "gi"), StatusEffect[reqStatus[0]]]; + return ["status", StatusEffect[reqStatus[0]]]; } return null; } @@ -645,10 +646,10 @@ export class CanFormChangeWithItemRequirement extends EncounterPokemonRequiremen } } - getMatchingDialogueToken(str:string, pokemon: PlayerPokemon): [RegExp, string] { + getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] { const requiredItems = this.requiredFormChangeItem.filter((formChangeItem) => this.filterByForm(pokemon, formChangeItem)); if (requiredItems.length > 0) { - return [new RegExp("@ec\{" + str + "FormChangeItem\\}", "gi"), FormChangeItem[requiredItems[0]]]; + return ["formChangeItem", FormChangeItem[requiredItems[0]]]; } return null; } @@ -700,10 +701,10 @@ export class CanEvolveWithItemRequirement extends EncounterPokemonRequirement { } } - getMatchingDialogueToken(str:string, pokemon: PlayerPokemon): [RegExp, string] { + getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] { const requiredItems = this.requiredEvolutionItem.filter((evoItem) => this.filterByEvo(pokemon, evoItem)); if (requiredItems.length > 0) { - return [new RegExp("@ec\{" + str + "EvolutionItem\\}", "gi"), EvolutionItem[requiredItems[0]]]; + return ["evolutionItem", EvolutionItem[requiredItems[0]]]; } return null; } @@ -743,19 +744,17 @@ export class HeldItemRequirement extends EncounterPokemonRequirement { } } - getMatchingDialogueToken(str:string, pokemon: PlayerPokemon): [RegExp, string] { + getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] { const requiredItems = this.requiredHeldItemModifier.filter((a) => { pokemon.getHeldItems().filter((it) => it.type.id === a.id ).length > 0; }); if (requiredItems.length > 0) { - return [new RegExp("@ec\{" + str + "HeldItem\\}", "gi"), requiredItems[0].name]; + return ["heldItem", requiredItems[0].name]; } return null; } - } - export class LevelRequirement extends EncounterPokemonRequirement { requiredLevelRange?: [number, number]; minNumberOfPokemon:number; @@ -789,8 +788,9 @@ export class LevelRequirement extends EncounterPokemonRequirement { return partyPokemon.filter((pokemon) => pokemon.level < this.requiredLevelRange[0] || pokemon.level > this.requiredLevelRange[1]); } } - getMatchingDialogueToken(str:string, pokemon: PlayerPokemon): [RegExp, string] { - return [new RegExp("@ec\{" + str + "Level\\}", "gi"), pokemon.level.toString()]; + + getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] { + return ["level", pokemon.level.toString()]; } } @@ -827,8 +827,8 @@ export class FriendshipRequirement extends EncounterPokemonRequirement { } } - getMatchingDialogueToken(str:string, pokemon: PlayerPokemon): [RegExp, string] { - return [new RegExp("@ec\{" + str + "Friendship\\}", "gi"), pokemon.friendship.toString()]; + getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] { + return ["friendship", pokemon.friendship.toString()]; } } @@ -870,8 +870,8 @@ export class HealthRatioRequirement extends EncounterPokemonRequirement { } } - getMatchingDialogueToken(str:string, pokemon: PlayerPokemon): [RegExp, string] { - return [new RegExp("@ec\{" + str + "HealthRatio\\}", "gi"), Math.floor(pokemon.getHpRatio()*100).toString() + "%"]; + getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] { + return ["healthRatio", Math.floor(pokemon.getHpRatio()*100).toString() + "%"]; } } @@ -907,7 +907,8 @@ export class WeightRequirement extends EncounterPokemonRequirement { return partyPokemon.filter((pokemon) => pokemon.getWeight() < this.requiredWeightRange[0] || pokemon.getWeight() > this.requiredWeightRange[1]); } } - getMatchingDialogueToken(str:string, pokemon: PlayerPokemon): [RegExp, string] { - return [new RegExp("@ec\{" + str + "Weight\\}", "gi"), pokemon.getWeight().toString()]; + + getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] { + return ["weight", pokemon.getWeight().toString()]; } } diff --git a/src/data/mystery-encounter.ts b/src/data/mystery-encounter.ts index 51f3eb4f662..92e5ada3c3c 100644 --- a/src/data/mystery-encounter.ts +++ b/src/data/mystery-encounter.ts @@ -262,22 +262,22 @@ export default class MysteryEncounter implements MysteryEncounter { * Will use the first support pokemon in list * For multiple support pokemon in the dialogue token, it will have to be overridden. */ - populateDialogueTokensFromRequirements?() { + populateDialogueTokensFromRequirements?(scene: BattleScene) { if (this.primaryPokemon?.length > 0) { - this.dialogueTokens.set("primaryName", [/@ec\{primaryName\}/gi, this.primaryPokemon.name]); + this.setDialogueToken("primaryName", this.primaryPokemon.name); for (const req of this.primaryPokemonRequirements) { if (!req.invertQuery) { - const entry: [RegExp, string] = req.getMatchingDialogueToken("primary", this.primaryPokemon); - this.dialogueTokens.set("primary", entry); + const value = req.getDialogueToken(scene, this.primaryPokemon); + this.setDialogueToken("primary" + this.capitalizeFirstLetter(value[0]), value[1]); } } } if (this.secondaryPokemonRequirements?.length > 0 && this.secondaryPokemon?.length > 0) { - this.dialogueTokens.set("secondaryName", [/@ec\{secondaryName\}/gi, this.secondaryPokemon[0].name]); + this.setDialogueToken("secondaryName", this.secondaryPokemon[0].name); for (const req of this.secondaryPokemonRequirements) { if (!req.invertQuery) { - const entry: [RegExp, string] = req.getMatchingDialogueToken("secondary", this.secondaryPokemon[0]); - this.dialogueTokens.set("secondary", entry); + const value = req.getDialogueToken(scene, this.secondaryPokemon[0]); + this.setDialogueToken("secondary" + this.capitalizeFirstLetter(value[0]), value[1]); } } } @@ -285,25 +285,33 @@ export default class MysteryEncounter implements MysteryEncounter { const opt = this.options[i]; const j = i + 1; if (opt.primaryPokemonRequirements?.length > 0 && opt.primaryPokemon?.length > 0) { - this.dialogueTokens.set("option" + j + "PrimaryName", [new RegExp("@ec\{option" + j + "PrimaryName\\}", "gi"), opt.primaryPokemon.name]); + this.setDialogueToken("option" + j + "PrimaryName", opt.primaryPokemon.name); for (const req of opt.primaryPokemonRequirements) { if (!req.invertQuery) { - const entry: [RegExp, string] = req.getMatchingDialogueToken("option" + j + "Primary", opt.primaryPokemon); - this.dialogueTokens.set("option" + j + "Primary", entry); + const value = req.getDialogueToken(scene, opt.primaryPokemon); + this.setDialogueToken("option" + j + "Primary", value[1]); } } } if (opt.secondaryPokemonRequirements?.length > 0 && opt.secondaryPokemon?.length > 0) { - this.dialogueTokens.set("option" + j + "SecondaryName", [new RegExp("@ec\{option" + j + "SecondaryName\\}", "gi"), opt.secondaryPokemon[0].name]); + this.setDialogueToken("option" + j + "SecondaryName", opt.secondaryPokemon[0].name); for (const req of opt.secondaryPokemonRequirements) { if (!req.invertQuery) { - const entry: [RegExp, string] = req.getMatchingDialogueToken("option" + j + "Secondary", opt.secondaryPokemon[0]); - this.dialogueTokens.set("option" + j + "Secondary", entry); + const value = req.getDialogueToken(scene, opt.secondaryPokemon[0]); + this.setDialogueToken("option" + j + "Secondary", value[1]); } } } } } + + setDialogueToken?(key: string, value: string) { + this.dialogueTokens.set(key, [new RegExp("@ec\{" + value + "\\}", "gi"), value]); + } + + private capitalizeFirstLetter?(str: string) { + return str.charAt(0).toUpperCase() + str.slice(1); + } } export class MysteryEncounterBuilder implements Partial { diff --git a/src/data/mystery-encounters/dark-deal.ts b/src/data/mystery-encounters/dark-deal.ts index 5b99a128f3e..170e9ac01b7 100644 --- a/src/data/mystery-encounters/dark-deal.ts +++ b/src/data/mystery-encounters/dark-deal.ts @@ -92,7 +92,8 @@ export const DarkDealEncounter: MysteryEncounter = new MysteryEncounterBuilder() // Will never return last battle able mon and instead pick fainted/unable to battle const removedPokemon = getRandomPlayerPokemon(scene, false, true); scene.removePokemonFromPlayerParty(removedPokemon); - scene.currentBattle.mysteryEncounter.dialogueTokens.set("pokeName", [/@ec\{pokeName\}/gi, removedPokemon.name]); + + scene.currentBattle.mysteryEncounter.setDialogueToken("pokeName", removedPokemon.name); // Store removed pokemon types scene.currentBattle.mysteryEncounter.misc = [removedPokemon.species.type1]; diff --git a/src/data/mystery-encounters/fight-or-flight.ts b/src/data/mystery-encounters/fight-or-flight.ts index 8290604d207..90cc57bbc13 100644 --- a/src/data/mystery-encounters/fight-or-flight.ts +++ b/src/data/mystery-encounters/fight-or-flight.ts @@ -32,7 +32,7 @@ export const FightOrFlightEncounter: MysteryEncounter = new MysteryEncounterBuil .withCatchAllowed(true) .withHideWildIntroMessage(true) .withOnInit((scene: BattleScene) => { - const instance = scene.currentBattle.mysteryEncounter; + const encounter = scene.currentBattle.mysteryEncounter; // Calculate boss mon const bossSpecies = scene.arena.randomSpecies(scene.currentBattle.waveIndex, scene.currentBattle.waveIndex, 0, getPartyLuckValue(scene.getParty()), true); @@ -40,17 +40,17 @@ export const FightOrFlightEncounter: MysteryEncounter = new MysteryEncounterBuil levelAdditiveMultiplier: 1, pokemonConfigs: [{species: bossSpecies, isBoss: true}] }; - instance.enemyPartyConfigs = [config]; + encounter.enemyPartyConfigs = [config]; // Calculate item // 10-60 GREAT, 60-110 ULTRA, 110-160 ROGUE, 160-180 MASTER const tier = scene.currentBattle.waveIndex > 160 ? ModifierTier.MASTER : scene.currentBattle.waveIndex > 110 ? ModifierTier.ROGUE : scene.currentBattle.waveIndex > 60 ? ModifierTier.ULTRA : ModifierTier.GREAT; regenerateModifierPoolThresholds(scene.getParty(), ModifierPoolType.PLAYER, 0); // refresh player item pool const item = getPlayerModifierTypeOptions(1, scene.getParty(), [], { guaranteedModifierTiers: [tier]})[0]; - scene.currentBattle.mysteryEncounter.dialogueTokens.set("itemName", [/@ec\{itemName\}/gi, item.type.name]); - scene.currentBattle.mysteryEncounter.misc = item; + encounter.setDialogueToken("itemName", item.type.name); + encounter.misc = item; - instance.spriteConfigs = [ + encounter.spriteConfigs = [ { spriteKey: item.type.iconImage, fileRoot: "items", @@ -92,7 +92,7 @@ export const FightOrFlightEncounter: MysteryEncounter = new MysteryEncounterBuil const config = scene.currentBattle.mysteryEncounter.enemyPartyConfigs[0]; config.pokemonConfigs[0].tags = [BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON]; config.pokemonConfigs[0].mysteryEncounterBattleEffects = (pokemon: Pokemon) => { - pokemon.scene.currentBattle.mysteryEncounter.dialogueTokens.set("enemyPokemon", [/@ec\{enemyPokemon\}/gi, pokemon.name]); + pokemon.scene.currentBattle.mysteryEncounter.setDialogueToken("enemyPokemon", pokemon.name); queueEncounterMessage(pokemon.scene, "mysteryEncounter:fight_or_flight_boss_enraged"); pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [BattleStat.ATK, BattleStat.DEF, BattleStat.SPATK, BattleStat.SPDEF, BattleStat.SPD], 1)); }; diff --git a/src/data/mystery-encounters/mysterious-challengers.ts b/src/data/mystery-encounters/mysterious-challengers.ts index 165e26519ce..eaaeffec9d0 100644 --- a/src/data/mystery-encounters/mysterious-challengers.ts +++ b/src/data/mystery-encounters/mysterious-challengers.ts @@ -21,7 +21,7 @@ export const MysteriousChallengersEncounter: MysteryEncounter = new MysteryEncou .withIntroSpriteConfigs([]) // These are set in onInit() .withSceneRequirement(new WaveCountRequirement([10, 180])) // waves 10 to 180 .withOnInit((scene: BattleScene) => { - const instance = scene.currentBattle.mysteryEncounter; + const encounter = scene.currentBattle.mysteryEncounter; // Calculates what trainers are available for battle in the encounter // Normal difficulty trainer is randomly pulled from biome @@ -32,7 +32,7 @@ export const MysteriousChallengersEncounter: MysteryEncounter = new MysteryEncou female = !!(Utils.randSeedInt(2)); } const normalSpriteKey = normalConfig.getSpriteKey(female, normalConfig.doubleOnly); - instance.enemyPartyConfigs.push({ + encounter.enemyPartyConfigs.push({ trainerConfig: normalConfig, female: female }); @@ -50,7 +50,7 @@ export const MysteriousChallengersEncounter: MysteryEncounter = new MysteryEncou female = !!(Utils.randSeedInt(2)); } const hardSpriteKey = hardConfig.getSpriteKey(female, hardConfig.doubleOnly); - instance.enemyPartyConfigs.push({ + encounter.enemyPartyConfigs.push({ trainerConfig: hardConfig, levelAdditiveMultiplier: 0.5, female: female, @@ -68,13 +68,13 @@ export const MysteriousChallengersEncounter: MysteryEncounter = new MysteryEncou female = !!(Utils.randSeedInt(2)); } const brutalSpriteKey = brutalConfig.getSpriteKey(female, brutalConfig.doubleOnly); - instance.enemyPartyConfigs.push({ + encounter.enemyPartyConfigs.push({ trainerConfig: brutalConfig, levelAdditiveMultiplier: 1.1, female: female }); - instance.spriteConfigs = [ + encounter.spriteConfigs = [ { spriteKey: normalSpriteKey, fileRoot: "trainer", diff --git a/src/data/mystery-encounters/mysterious-chest.ts b/src/data/mystery-encounters/mysterious-chest.ts index 68fae514b22..25abcf1fe74 100644 --- a/src/data/mystery-encounters/mysterious-chest.ts +++ b/src/data/mystery-encounters/mysterious-chest.ts @@ -69,7 +69,7 @@ export const MysteriousChestEncounter: MysteryEncounter = new MysteryEncounterBu const highestLevelPokemon = getHighestLevelPlayerPokemon(scene, true); koPlayerPokemon(highestLevelPokemon); - scene.currentBattle.mysteryEncounter.dialogueTokens.set("pokeName", [/@ec\{pokeName\}/gi, highestLevelPokemon.name]); + scene.currentBattle.mysteryEncounter.setDialogueToken("pokeName", highestLevelPokemon.name); // Show which Pokemon was KOed, then leave encounter with no rewards // Does this synchronously so that game over doesn't happen over result message await showEncounterText(scene, "mysteryEncounter:mysterious_chest_option_1_bad_result") diff --git a/src/data/mystery-encounters/mystery-encounter-utils.ts b/src/data/mystery-encounters/mystery-encounter-utils.ts index 912db218c42..2a69becf1ef 100644 --- a/src/data/mystery-encounters/mystery-encounter-utils.ts +++ b/src/data/mystery-encounters/mystery-encounter-utils.ts @@ -62,12 +62,11 @@ export function getRandomPlayerPokemon(scene: BattleScene, isAllowedInBattle: bo return chosenPokemon; } - export function getTokensFromScene(scene: BattleScene, reqs: EncounterSceneRequirement[]): Array<[RegExp, String]> { const arr = []; if (scene) { for (const req of reqs) { - req.getMatchingDialogueToken(scene); + req.getDialogueToken(scene); } } return arr; @@ -450,7 +449,7 @@ export function selectPokemonForOption(scene: BattleScene, onPokemonSelected: (p const pokemon = scene.getParty()[slotIndex]; const secondaryOptions = onPokemonSelected(pokemon); if (!secondaryOptions) { - scene.currentBattle.mysteryEncounter.dialogueTokens.set("selectedPokemon", [/@ec\{selectedPokemon\}/gi, pokemon.name]); + scene.currentBattle.mysteryEncounter.setDialogueToken("selectedPokemon", pokemon.name); resolve(true); return; } @@ -464,7 +463,7 @@ export function selectPokemonForOption(scene: BattleScene, onPokemonSelected: (p const onSelect = option.handler; option.handler = () => { onSelect(); - scene.currentBattle.mysteryEncounter.dialogueTokens.set("selectedPokemon", [/@ec\{selectedPokemon\}/gi, pokemon.name]); + scene.currentBattle.mysteryEncounter.setDialogueToken("selectedPokemon", pokemon.name); resolve(true); return true; }; diff --git a/src/data/mystery-encounters/sleeping-snorlax.ts b/src/data/mystery-encounters/sleeping-snorlax.ts index fde9750a029..56baa4ea1e7 100644 --- a/src/data/mystery-encounters/sleeping-snorlax.ts +++ b/src/data/mystery-encounters/sleeping-snorlax.ts @@ -38,8 +38,8 @@ export const SleepingSnorlaxEncounter: MysteryEncounter = new MysteryEncounterBu .withCatchAllowed(true) .withHideWildIntroMessage(true) .withOnInit((scene: BattleScene) => { - const instance = scene.currentBattle.mysteryEncounter; - console.log(instance); + const encounter = scene.currentBattle.mysteryEncounter; + console.log(encounter); // Calculate boss mon const bossSpecies = getPokemonSpecies(Species.SNORLAX); @@ -52,7 +52,7 @@ export const SleepingSnorlaxEncounter: MysteryEncounter = new MysteryEncounterBu levelAdditiveMultiplier: 2, pokemonConfigs: [pokemonConfig] }; - instance.enemyPartyConfigs = [config]; + encounter.enemyPartyConfigs = [config]; return true; }) .withOption(new MysteryEncounterOptionBuilder() diff --git a/src/data/mystery-encounters/training-session.ts b/src/data/mystery-encounters/training-session.ts index 105de4415a1..9866a2785a1 100644 --- a/src/data/mystery-encounters/training-session.ts +++ b/src/data/mystery-encounters/training-session.ts @@ -77,8 +77,8 @@ export const TrainingSessionEncounter: MysteryEncounter = new MysteryEncounterBu }; const onBeforeRewardsPhase = () => { - encounter.dialogueTokens.set("stat1", [/@ec\{stat1\}/gi, "-"]); - encounter.dialogueTokens.set("stat2", [/@ec\{stat2\}/gi, "-"]); + encounter.setDialogueToken("stat1", "-"); + encounter.setDialogueToken("stat2", "-"); // Add the pokemon back to party with IV boost const ivIndexes = []; playerPokemon.ivs.forEach((iv, index) => { @@ -100,9 +100,9 @@ export const TrainingSessionEncounter: MysteryEncounter = new MysteryEncounterBu const ivToChange = ivIndexes.pop(); let newVal = ivToChange.iv; if (improvedCount === 0) { - encounter.dialogueTokens.set("stat1", [/@ec\{stat1\}/gi, getIvName(ivToChange.index)]); + encounter.setDialogueToken("stat1", getIvName(ivToChange.index)); } else { - encounter.dialogueTokens.set("stat2", [/@ec\{stat2\}/gi, getIvName(ivToChange.index)]); + encounter.setDialogueToken("stat2", getIvName(ivToChange.index)); } // Corrects required encounter breakpoints to be continuous for all IV values @@ -148,7 +148,7 @@ export const TrainingSessionEncounter: MysteryEncounter = new MysteryEncounterBu label: getNatureName(nature, true, true, true, scene.uiTheme), handler: () => { // Pokemon and second option selected - encounter.dialogueTokens.set("nature", [/@ec\{nature\}/gi, getNatureName(nature)]); + encounter.setDialogueToken("nature", getNatureName(nature)); encounter.misc = { playerPokemon: pokemon, chosenNature: nature @@ -206,7 +206,7 @@ export const TrainingSessionEncounter: MysteryEncounter = new MysteryEncounterBu label: ability.name, handler: () => { // Pokemon and ability selected - encounter.dialogueTokens.set("ability", [/@ec\{ability\}/gi, ability.name]); + encounter.setDialogueToken("ability", ability.name); encounter.misc = { playerPokemon: pokemon, abilityIndex: index From 07ffe1ca645cd0686056030d937562ea45412290 Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Sat, 6 Jul 2024 12:11:39 -0400 Subject: [PATCH 011/270] re-enable dialogue tokens --- src/data/mystery-encounter.ts | 2 +- src/locales/en/mystery-encounter.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/data/mystery-encounter.ts b/src/data/mystery-encounter.ts index 92e5ada3c3c..8325a26d29d 100644 --- a/src/data/mystery-encounter.ts +++ b/src/data/mystery-encounter.ts @@ -306,7 +306,7 @@ export default class MysteryEncounter implements MysteryEncounter { } setDialogueToken?(key: string, value: string) { - this.dialogueTokens.set(key, [new RegExp("@ec\{" + value + "\\}", "gi"), value]); + this.dialogueTokens.set(key, [new RegExp("@ec\{" + key + "\\}", "gi"), value]); } private capitalizeFirstLetter?(str: string) { diff --git a/src/locales/en/mystery-encounter.ts b/src/locales/en/mystery-encounter.ts index 849782256e7..b928fa38f54 100644 --- a/src/locales/en/mystery-encounter.ts +++ b/src/locales/en/mystery-encounter.ts @@ -69,7 +69,7 @@ export const mysteryEncounter: SimpleTranslationEntries = { "training_session_option_3_select_prompt": "Select a new ability\nto train your Pokémon in.", "training_session_option_selected_message": "@ec{selectedPokemon} moves across\nthe clearing to face you...", "training_session_battle_finished_1": `@ec{selectedPokemon} returns, feeling\nworn out but accomplished! - $Its @ec{stat1} and @ec{stat2}IVs were improved!`, + $Its @ec{stat1} and @ec{stat2} IVs were improved!`, "training_session_battle_finished_2": `@ec{selectedPokemon} returns, feeling\nworn out but accomplished! $Its nature was changed to @ec{nature}!`, "training_session_battle_finished_3": `@ec{selectedPokemon} returns, feeling\nworn out but accomplished! From f803de6b2381632891acb02dd8288e1c59b75edc Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Sun, 7 Jul 2024 00:46:26 -0400 Subject: [PATCH 012/270] start adding unit tests --- MEs-Roadmap-Documentation.md | 14 +- src/battle-scene.ts | 32 +- ...ter-flags.ts => mystery-encounter-data.ts} | 8 +- src/data/mystery-encounter-requirements.ts | 4 +- .../mystery-encounter-utils.ts | 110 +++--- .../mystery-encounters/mystery-encounters.ts | 4 +- src/locales/en/mystery-encounter.ts | 2 + src/phases.ts | 2 +- src/phases/mystery-encounter-phase.ts | 4 +- src/system/game-data.ts | 10 +- .../mystery-encounter-utils.test.ts | 366 ++++++++++++++++++ .../mystery-encounter.test.ts | 36 +- .../phases/mystery-encounter-phase.test.ts | 159 ++++++++ src/test/utils/gameManager.ts | 25 ++ .../mocks/mocksContainer/mockContainer.ts | 4 + .../utils/mocks/mocksContainer/mockSprite.ts | 1 + src/ui/mystery-encounter-ui-handler.ts | 4 +- 17 files changed, 678 insertions(+), 107 deletions(-) rename src/data/{mystery-encounter-flags.ts => mystery-encounter-data.ts} (61%) create mode 100644 src/test/mystery-encounter/mystery-encounter-utils.test.ts create mode 100644 src/test/phases/mystery-encounter-phase.test.ts diff --git a/MEs-Roadmap-Documentation.md b/MEs-Roadmap-Documentation.md index 7e5aa1b069e..97e61e0513a 100644 --- a/MEs-Roadmap-Documentation.md +++ b/MEs-Roadmap-Documentation.md @@ -1,14 +1,14 @@ # 📝 Most immediate things to-do list - ### High priority - - 🐛 Intimidate and other ETB abilities proc twice at the start of wild MEs (fight or flight, dark deal) - - ⚙️ Add a tag system so MEs don't show where they shouldn't and bricking Challenge runs: + - ⚙️ Add a tag system so MEs to filter or change spawn rates in Challenge runs: - noChallenge (cant be spawned in challenge runs) - allChallenge (can spawn in all challenge modes) - (typespecific)Challenge: - Example: fireOnly (can only spawn in fire related challenges) - ### Medium priority + - ⚙️ Update Chest visuals for Mysterious Chest (with animated chest) - ### Low priority - 🐛 Mysterious Challengers can spawn two trainers (or three) of the same type [Dev comment: not a bug] @@ -106,9 +106,9 @@ Events (referred to as 'Mysterious Encounters, MEs' in the code) aim to be an ad ### 🌟 **Rarity** tier of the ME, common by default. - ⚪ Common pool - - 🔵 Rare pool - - 🟣 Epic pool - - 🟡 Legendary pool + - 🔵 Uncommon pool + - 🟣 Rare pool + - 🟡 Super Rare pool ### **Optional Requirements** for Mystery Encounters. - 🛠️ They give granular control over whether encounters will spawn in certain situations @@ -135,13 +135,10 @@ Events (referred to as 'Mysterious Encounters, MEs' in the code) aim to be an ad # 📝 Known bugs (squash 'em all!): - ## 🔴 __**Really bad ones**__ - - 🐛 Picking up certain items in Fight or Flight is still broken. Workaround is leave encounter. - - 🐛 Modifiers that are applied to pokemon get skipped in Fight or Flight. - ## 🟡 __**Bad ones under certain circumstances**__ - 🐛 Needs further replication : At wave 51, wild PKMN encounter caused a freezed after pressing "ESC" key upon being asked to switch PKMNs - 🐛 Wave seed generates different encounter data if you roll to a new wave, see the spawned stuff, and refresh the app - - 🐛 Type-buffing items (like Silk Scarf) get swapped around when offered as a reward in Fight or Flight - ## 🟢 __**Non-game breaking**__ - Both of these bugs seem to have in common that they don't "forget" their last passed string: @@ -157,7 +154,6 @@ Events (referred to as 'Mysterious Encounters, MEs' in the code) aim to be an ad #### More requirements (with helper functions) - Having X item - Having Y amount of X item -- Being in a specific Biome - A Pokémon X in player's party can learn Y move - A Pokémon X in player's party knows Y move - A Pokémon X in player's party has Y ability diff --git a/src/battle-scene.ts b/src/battle-scene.ts index 0515800e53f..fe3023cbc22 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -93,7 +93,7 @@ import { UiTheme } from "#enums/ui-theme"; import { TimedEventManager } from "#app/timed-event-manager.js"; import i18next from "i18next"; import MysteryEncounter, { MysteryEncounterTier, MysteryEncounterVariant } from "./data/mystery-encounter"; -import { mysteryEncountersByBiome, allMysteryEncounters, BASE_MYSTERY_ENCOUNTER_WEIGHT, AVERAGE_ENCOUNTERS_PER_RUN_TARGET } from "./data/mystery-encounters/mystery-encounters"; +import { mysteryEncountersByBiome, allMysteryEncounters, BASE_MYSTERY_ENCOUNTER_WEIGHT, AVERAGE_ENCOUNTERS_PER_RUN_TARGET, WIGHT_INCREMENT_ON_SPAWN_MISS } from "./data/mystery-encounters/mystery-encounters"; import { MysteryEncounterFlags } from "#app/data/mystery-encounter-flags"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; @@ -1098,22 +1098,22 @@ export default class BattleScene extends SceneBase { // Check for mystery encounter // Can only occur in place of a standard wild battle, waves 10-180 - // let testStartingWeight = 10; - // while (testStartingWeight < 30) { + // let testStartingWeight = 0; + // while (testStartingWeight < 20) { // calculateMEAggregateStats(this, testStartingWeight); - // testStartingWeight += 2; + // testStartingWeight += 1; // } if (this.gameMode.hasMysteryEncounters && newBattleType === BattleType.WILD && !this.gameMode.isBoss(newWaveIndex) && newWaveIndex < 180 && newWaveIndex > 10) { const roll = Utils.randSeedInt(256); - // Base spawn weight is 3/256, and increases by 1/256 for each missed attempt at spawning an encounter on a valid floor - const sessionEncounterRate = !isNullOrUndefined(this.mysteryEncounterFlags?.encounterSpawnChance) ? this.mysteryEncounterFlags.encounterSpawnChance : BASE_MYSTERY_ENCOUNTER_WEIGHT; + // Base spawn weight is 1/256, and increases by 5/256 for each missed attempt at spawning an encounter on a valid floor + const sessionEncounterRate = !isNullOrUndefined(this.mysteryEncounterData?.encounterSpawnChance) ? this.mysteryEncounterData.encounterSpawnChance : BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT; // If total number of encounters is lower than expected for the run, slightly favor a new encounter spawn // Do the reverse as well // Reduces occurrence of runs with very few (<6) and a ton (>10) of encounters const expectedEncountersByFloor = AVERAGE_ENCOUNTERS_PER_RUN_TARGET / (180 - 10) * newWaveIndex; - const currentRunDiffFromAvg = expectedEncountersByFloor - (this.mysteryEncounterFlags?.encounteredEvents?.length || 0); + const currentRunDiffFromAvg = expectedEncountersByFloor - (this.mysteryEncounterData?.encounteredEvents?.length || 0); const favoredEncounterRate = sessionEncounterRate + currentRunDiffFromAvg * 5; const successRate = isNullOrUndefined(Overrides.MYSTERY_ENCOUNTER_RATE_OVERRIDE) ? favoredEncounterRate : Overrides.MYSTERY_ENCOUNTER_RATE_OVERRIDE; @@ -1121,9 +1121,9 @@ export default class BattleScene extends SceneBase { if (roll < successRate) { newBattleType = BattleType.MYSTERY_ENCOUNTER; // Reset base spawn weight - this.mysteryEncounterFlags.encounterSpawnChance = BASE_MYSTERY_ENCOUNTER_WEIGHT; + this.mysteryEncounterData.encounterSpawnChance = BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT; } else { - this.mysteryEncounterFlags.encounterSpawnChance = sessionEncounterRate + 1; + this.mysteryEncounterData.encounterSpawnChance = sessionEncounterRate + WIGHT_INCREMENT_ON_SPAWN_MISS; } } } @@ -1168,7 +1168,9 @@ export default class BattleScene extends SceneBase { if (newBattleType === BattleType.MYSTERY_ENCOUNTER) { // Disable double battle on mystery encounters (it may be re-enabled as part of encounter) this.currentBattle.double = false; - this.currentBattle.mysteryEncounter = this.getMysteryEncounter(mysteryEncounter); + this.executeWithSeedOffset(() => { + this.currentBattle.mysteryEncounter = this.getMysteryEncounter(mysteryEncounter); + }, this.currentBattle.waveIndex << 4); } //this.pushPhase(new TrainerMessageTestPhase(this, TrainerType.RIVAL, TrainerType.RIVAL_2, TrainerType.RIVAL_3, TrainerType.RIVAL_4, TrainerType.RIVAL_5, TrainerType.RIVAL_6)); @@ -2652,10 +2654,10 @@ export default class BattleScene extends SceneBase { } // Check for queued encounters first - if (!encounter && this.mysteryEncounterFlags?.nextEncounterQueue?.length > 0) { + if (!encounter && this.mysteryEncounterData?.nextEncounterQueue?.length > 0) { let i = 0; - while (i < this.mysteryEncounterFlags.nextEncounterQueue.length && !!encounter) { - const candidate = this.mysteryEncounterFlags.nextEncounterQueue[i]; + while (i < this.mysteryEncounterData.nextEncounterQueue.length && !!encounter) { + const candidate = this.mysteryEncounterData.nextEncounterQueue[i]; const forcedChance = candidate[1]; if (Utils.randSeedInt(100) < forcedChance) { encounter = allMysteryEncounters[candidate[0]]; @@ -2675,7 +2677,7 @@ export default class BattleScene extends SceneBase { const tierWeights = [61, 40, 21, 6]; // Adjust tier weights by previously encountered events to lower odds of only common/uncommons in run - this.mysteryEncounterFlags.encounteredEvents.forEach(val => { + this.mysteryEncounterData.encounteredEvents.forEach(val => { const tier = val[1]; if (tier === MysteryEncounterTier.COMMON) { tierWeights[0] = tierWeights[0] - 6; @@ -2697,7 +2699,7 @@ export default class BattleScene extends SceneBase { let availableEncounters = []; // New encounter will never be the same as the most recent encounter - const previousEncounter = this.mysteryEncounterFlags.encounteredEvents?.length > 0 ? this.mysteryEncounterFlags.encounteredEvents[this.mysteryEncounterFlags.encounteredEvents.length - 1][0] : null; + const previousEncounter = this.mysteryEncounterData.encounteredEvents?.length > 0 ? this.mysteryEncounterData.encounteredEvents[this.mysteryEncounterData.encounteredEvents.length - 1][0] : null; const biomeMysteryEncounters = mysteryEncountersByBiome.get(this.arena.biomeType); // If no valid encounters exist at tier, checks next tier down, continuing until there are some encounters available while (availableEncounters.length === 0 && tier >= 0) { diff --git a/src/data/mystery-encounter-flags.ts b/src/data/mystery-encounter-data.ts similarity index 61% rename from src/data/mystery-encounter-flags.ts rename to src/data/mystery-encounter-data.ts index 33ef84e2d1d..922bc30cbc3 100644 --- a/src/data/mystery-encounter-flags.ts +++ b/src/data/mystery-encounter-data.ts @@ -1,14 +1,14 @@ import {MysteryEncounterTier} from "#app/data/mystery-encounter"; import {MysteryEncounterType} from "#enums/mystery-encounter-type"; -import {BASE_MYSTERY_ENCOUNTER_WEIGHT} from "#app/data/mystery-encounters/mystery-encounters"; +import {BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT} from "#app/data/mystery-encounters/mystery-encounters"; import {isNullOrUndefined} from "../utils"; -export class MysteryEncounterFlags { +export class MysteryEncounterData { encounteredEvents: [MysteryEncounterType, MysteryEncounterTier][] = []; - encounterSpawnChance: number = BASE_MYSTERY_ENCOUNTER_WEIGHT; + encounterSpawnChance: number = BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT; nextEncounterQueue: [MysteryEncounterType, integer][] = []; - constructor(flags: MysteryEncounterFlags) { + constructor(flags: MysteryEncounterData) { if (!isNullOrUndefined(flags)) { Object.assign(this, flags); } diff --git a/src/data/mystery-encounter-requirements.ts b/src/data/mystery-encounter-requirements.ts index d88ec530a74..1a105f2f83b 100644 --- a/src/data/mystery-encounter-requirements.ts +++ b/src/data/mystery-encounter-requirements.ts @@ -63,11 +63,11 @@ export class PreviousEncounterRequirement extends EncounterSceneRequirement { } meetsRequirement(scene: BattleScene): boolean { - return scene.mysteryEncounterFlags.encounteredEvents.some(e => e[0] === this.previousEncounterRequirement); + return scene.mysteryEncounterData.encounteredEvents.some(e => e[0] === this.previousEncounterRequirement); } getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] { - return ["previousEncounter", scene.mysteryEncounterFlags.encounteredEvents.find(e => e[0] === this.previousEncounterRequirement)[0].toString()]; + return ["previousEncounter", scene.mysteryEncounterData.encounteredEvents.find(e => e[0] === this.previousEncounterRequirement)[0].toString()]; } } diff --git a/src/data/mystery-encounters/mystery-encounter-utils.ts b/src/data/mystery-encounters/mystery-encounter-utils.ts index 2a69becf1ef..8cd4963daa1 100644 --- a/src/data/mystery-encounters/mystery-encounter-utils.ts +++ b/src/data/mystery-encounters/mystery-encounter-utils.ts @@ -27,10 +27,10 @@ import {BattlerTagType} from "#enums/battler-tag-type"; import PokemonData from "#app/system/pokemon-data"; import {Biome} from "#enums/biome"; import {biomeLinks} from "#app/data/biomes"; -import {EncounterSceneRequirement} from "#app/data/mystery-encounter-requirements"; import {Mode} from "#app/ui/ui"; import {PartyOption, PartyUiMode} from "#app/ui/party-ui-handler"; import {OptionSelectConfig, OptionSelectItem} from "#app/ui/abstact-option-select-ui-handler"; +import {WIGHT_INCREMENT_ON_SPAWN_MISS} from "#app/data/mystery-encounters/mystery-encounters"; /** * @@ -62,15 +62,15 @@ export function getRandomPlayerPokemon(scene: BattleScene, isAllowedInBattle: bo return chosenPokemon; } -export function getTokensFromScene(scene: BattleScene, reqs: EncounterSceneRequirement[]): Array<[RegExp, String]> { - const arr = []; - if (scene) { - for (const req of reqs) { - req.getDialogueToken(scene); - } - } - return arr; -} +// export function getTokensFromScene(scene: BattleScene, reqs: EncounterSceneRequirement[]): Array<[RegExp, String]> { +// const arr = []; +// if (scene) { +// for (const req of reqs) { +// req.getDialogueToken(scene); +// } +// } +// return arr; +// } /** * Ties are broken by whatever mon is closer to the front of the party @@ -114,6 +114,48 @@ export function getLowestLevelPlayerPokemon(scene: BattleScene, unfainted: boole return pokemon; } +/** + * + * NOTE: This returns ANY random species, including those locked behind eggs, etc. + * @param starterTiers + * @param excludedSpecies + * @param types + * @returns + */ +export function getRandomSpeciesByStarterTier(starterTiers: number | [number, number], excludedSpecies?: Species[], types?: Type[]): Species { + let min = starterTiers instanceof Array ? starterTiers[0] : starterTiers; + let max = starterTiers instanceof Array ? starterTiers[1] : starterTiers; + + let filteredSpecies: [PokemonSpecies, number][] = Object.keys(speciesStarters) + .map(s => [parseInt(s) as Species, speciesStarters[s] as number]) + .filter(s => getPokemonSpecies(s[0]) && (!excludedSpecies || !excludedSpecies.includes(s[0]))) + .map(s => [getPokemonSpecies(s[0]), s[1]]); + + if (!isNullOrUndefined(types) && types.length > 0) { + filteredSpecies = filteredSpecies.filter(s => types.includes(s[0].type1) || types.includes(s[0].type2)); + } + + // If no filtered mons exist at specified starter tiers, will expand starter search range until there are + // Starts by decrementing starter tier min until it is 0, then increments tier max up to 10 + let tryFilterStarterTiers: [PokemonSpecies, number][] = filteredSpecies.filter(s => (s[1] >= min && s[1] <= max)); + while (tryFilterStarterTiers.length === 0 && (min !== 0 && max !== 10)) { + if (min > 0) { + min--; + } else { + max++; + } + + tryFilterStarterTiers = filteredSpecies.filter(s => s[1] >= min && s[1] <= max); + } + + if (tryFilterStarterTiers.length > 0) { + const index = Utils.randSeedInt(tryFilterStarterTiers.length); + return Phaser.Math.RND.shuffle(tryFilterStarterTiers)[index][0].speciesId; + } + + return Species.BULBASAUR; +} + export function koPlayerPokemon(pokemon: PlayerPokemon) { pokemon.hp = 0; pokemon.trySetStatus(StatusEffect.FAINT); @@ -173,48 +215,6 @@ export function showEncounterDialogue(scene: BattleScene, textContentKey: Templa scene.ui.showDialogue(text, speaker, null, callback, 0, 0); } -/** - * - * NOTE: This returns ANY random species, including those locked behind eggs, etc. - * @param starterTiers - * @param excludedSpecies - * @param types - * @returns - */ -export function getRandomSpeciesByStarterTier(starterTiers: number | [number, number], excludedSpecies?: Species[], types?: Type[]): Species { - let min = starterTiers instanceof Array ? starterTiers[0] : starterTiers; - let max = starterTiers instanceof Array ? starterTiers[1] : starterTiers; - - let filteredSpecies: [PokemonSpecies, number][] = Object.keys(speciesStarters) - .map(s => [parseInt(s) as Species, speciesStarters[s] as number]) - .filter(s => getPokemonSpecies(s[0]) && !excludedSpecies.includes(s[0])) - .map(s => [getPokemonSpecies(s[0]), s[1]]); - - if (!isNullOrUndefined(types) && types.length > 0) { - filteredSpecies = filteredSpecies.filter(s => types.includes(s[0].type1) || types.includes(s[0].type2)); - } - - // If no filtered mons exist at specified starter tiers, will expand starter search range until there are - // Starts by decrementing starter tier min until it is 0, then increments tier max up to 10 - let tryFilterStarterTiers: [PokemonSpecies, number][] = filteredSpecies.filter(s => (s[1] >= min && s[1] <= max)); - while (tryFilterStarterTiers.length === 0 && (min !== 0 && max !== 10)) { - if (min > 0) { - min--; - } else { - max++; - } - - tryFilterStarterTiers = filteredSpecies.filter(s => s[1] >= min && s[1] <= max); - } - - if (tryFilterStarterTiers.length > 0) { - const index = Utils.randSeedInt(tryFilterStarterTiers.length); - return Phaser.Math.RND.shuffle(tryFilterStarterTiers)[index][0].speciesId; - } - - return Species.BULBASAUR; -} - export class EnemyPokemonConfig { species: PokemonSpecies; isBoss: boolean = false; @@ -594,10 +594,10 @@ export function handleMysteryEncounterVictory(scene: BattleScene, addHealPhase: export function calculateMEAggregateStats(scene: BattleScene, baseSpawnWeight: number) { const numRuns = 1000; let run = 0; - const targetEncountersPerRun = 15; + const targetEncountersPerRun = 15; // AVERAGE_ENCOUNTERS_PER_RUN_TARGET const calculateNumEncounters = (): number[] => { - let encounterRate = baseSpawnWeight; + let encounterRate = baseSpawnWeight; // BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT const numEncounters = [0, 0, 0, 0]; let currentBiome = Biome.TOWN; let currentArena = scene.newArena(currentBiome); @@ -669,7 +669,7 @@ export function calculateMEAggregateStats(scene: BattleScene, baseSpawnWeight: n tierValue > commonThreshold ? ++numEncounters[0] : tierValue > uncommonThreshold ? ++numEncounters[1] : tierValue > rareThreshold ? ++numEncounters[2] : ++numEncounters[3]; } else { - encounterRate++; + encounterRate += WIGHT_INCREMENT_ON_SPAWN_MISS; } } diff --git a/src/data/mystery-encounters/mystery-encounters.ts b/src/data/mystery-encounters/mystery-encounters.ts index 1a0f6f2a1ce..918868d3d2c 100644 --- a/src/data/mystery-encounters/mystery-encounters.ts +++ b/src/data/mystery-encounters/mystery-encounters.ts @@ -8,7 +8,9 @@ import { Biome } from "#app/enums/biome"; import { SleepingSnorlaxEncounter } from "./sleeping-snorlax"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; -export const BASE_MYSTERY_ENCOUNTER_WEIGHT = 19; +// Spawn chance: (BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT + WIGHT_INCREMENT_ON_SPAWN_MISS * ) / 256 +export const BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT = 1; +export const WIGHT_INCREMENT_ON_SPAWN_MISS = 5; export const AVERAGE_ENCOUNTERS_PER_RUN_TARGET = 15; export const allMysteryEncounters : {[encounterType:string]: MysteryEncounter} = {}; diff --git a/src/locales/en/mystery-encounter.ts b/src/locales/en/mystery-encounter.ts index b928fa38f54..f6b3a80e0ec 100644 --- a/src/locales/en/mystery-encounter.ts +++ b/src/locales/en/mystery-encounter.ts @@ -1,6 +1,8 @@ import {SimpleTranslationEntries} from "#app/interfaces/locales"; export const mysteryEncounter: SimpleTranslationEntries = { + // DO NOT REMOVE + "unit_test_dialogue": "@ec{test}@ec{test} @ec{test@ec{test}} @ec{test1} @ec{test\} @ec{test\\} @ec{test\\\} {test}", // Mysterious Encounters -- Common Tier diff --git a/src/phases.ts b/src/phases.ts index ffd9c0b609a..6bbc5f2d6d6 100644 --- a/src/phases.ts +++ b/src/phases.ts @@ -817,7 +817,7 @@ export class EncounterPhase extends BattlePhase { if (mysteryEncounter.onInit) { mysteryEncounter.onInit(this.scene); } - mysteryEncounter.populateDialogueTokensFromRequirements(); + mysteryEncounter.populateDialogueTokensFromRequirements(this.scene); }, this.scene.currentBattle.waveIndex); // Add intro visuals for mystery encounter diff --git a/src/phases/mystery-encounter-phase.ts b/src/phases/mystery-encounter-phase.ts index 2700ec32ae1..1cd04339b84 100644 --- a/src/phases/mystery-encounter-phase.ts +++ b/src/phases/mystery-encounter-phase.ts @@ -40,7 +40,7 @@ export class MysteryEncounterPhase extends Phase { // Sets flag that ME was encountered // Can be used in later MEs to check for requirements to spawn, etc. - this.scene.mysteryEncounterFlags.encounteredEvents.push([this.scene.currentBattle.mysteryEncounter.encounterType, this.scene.currentBattle.mysteryEncounter.encounterTier]); + this.scene.mysteryEncounterData.encounteredEvents.push([this.scene.currentBattle.mysteryEncounter.encounterType, this.scene.currentBattle.mysteryEncounter.encounterTier]); // Initiates encounter dialogue window and option select this.scene.ui.setMode(Mode.MYSTERY_ENCOUNTER); @@ -55,7 +55,7 @@ export class MysteryEncounterPhase extends Phase { } // Populate dialogue tokens for option requirements - this.scene.currentBattle.mysteryEncounter.populateDialogueTokensFromRequirements(); + this.scene.currentBattle.mysteryEncounter.populateDialogueTokensFromRequirements(this.scene); if (option.onPreOptionPhase) { this.scene.executeWithSeedOffset(async () => { diff --git a/src/system/game-data.ts b/src/system/game-data.ts index 14e80623060..07ecfc74f0a 100644 --- a/src/system/game-data.ts +++ b/src/system/game-data.ts @@ -40,7 +40,7 @@ import { GameDataType } from "#enums/game-data-type"; import { Moves } from "#enums/moves"; import { PlayerGender } from "#enums/player-gender"; import { Species } from "#enums/species"; -import { MysteryEncounterFlags } from "../data/mystery-encounter-flags"; +import { MysteryEncounterData } from "../data/mystery-encounter-data"; import MysteryEncounter from "../data/mystery-encounter"; export const defaultStarterSpecies: Species[] = [ @@ -125,7 +125,7 @@ export interface SessionSaveData { timestamp: integer; challenges: ChallengeData[]; mysteryEncounter: MysteryEncounter; - mysteryEncounterFlags: MysteryEncounterFlags; + mysteryEncounterFlags: MysteryEncounterData; } interface Unlocks { @@ -842,7 +842,7 @@ export class GameData { timestamp: new Date().getTime(), challenges: scene.gameMode.challenges.map(c => new ChallengeData(c)), mysteryEncounter: scene.currentBattle.mysteryEncounter, - mysteryEncounterFlags: scene.mysteryEncounterFlags + mysteryEncounterFlags: scene.mysteryEncounterData } as SessionSaveData; } @@ -933,7 +933,7 @@ export class GameData { scene.score = sessionData.score; scene.updateScoreText(); - scene.mysteryEncounterFlags = sessionData?.mysteryEncounterFlags ? sessionData?.mysteryEncounterFlags : new MysteryEncounterFlags(null); + scene.mysteryEncounterData = sessionData?.mysteryEncounterFlags ? sessionData?.mysteryEncounterFlags : new MysteryEncounterData(null); scene.newArena(sessionData.arena.biome); @@ -1159,7 +1159,7 @@ export class GameData { } if (k === "mysteryEncounterFlags") { - return new MysteryEncounterFlags(v); + return new MysteryEncounterData(v); } return v; diff --git a/src/test/mystery-encounter/mystery-encounter-utils.test.ts b/src/test/mystery-encounter/mystery-encounter-utils.test.ts new file mode 100644 index 00000000000..4b514b13e01 --- /dev/null +++ b/src/test/mystery-encounter/mystery-encounter-utils.test.ts @@ -0,0 +1,366 @@ +import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; +import GameManager from "#app/test/utils/gameManager"; +import Phaser from "phaser"; +import { + getHighestLevelPlayerPokemon, getLowestLevelPlayerPokemon, + getRandomPlayerPokemon, getRandomSpeciesByStarterTier, getTextWithEncounterDialogueTokens, + koPlayerPokemon, queueEncounterMessage, showEncounterDialogue, showEncounterText, +} from "#app/data/mystery-encounters/mystery-encounter-utils"; +import {initSceneWithoutEncounterPhase} from "#test/utils/gameManagerUtils"; +import {Species} from "#enums/species"; +import BattleScene from "#app/battle-scene"; +import {StatusEffect} from "#app/data/status-effect"; +import MysteryEncounter from "#app/data/mystery-encounter"; +import {MessagePhase} from "#app/phases"; +import {getPokemonSpecies, speciesStarters} from "#app/data/pokemon-species"; +import {Type} from "#app/data/type"; + +describe("Mystery Encounter Utils", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + let scene: BattleScene; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + scene = game.scene; + initSceneWithoutEncounterPhase(game.scene, [Species.ARCEUS, Species.MANAPHY]); + // vi.spyOn(overrides, "MYSTERY_ENCOUNTER_RATE_OVERRIDE", "get").mockReturnValue(256); + // vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(11); + }); + + describe("getRandomPlayerPokemon", () => { + it("gets a random pokemon from player party", () => { + // Seeds are calculated to return index 0 first, 1 second (if both pokemon are legal) + scene.waveSeed = "random"; + Phaser.Math.RND.sow([ scene.waveSeed ]); + scene.rngCounter = 0; + + let result = getRandomPlayerPokemon(scene); + expect(result.species.speciesId).toBe(Species.MANAPHY); + + scene.waveSeed = "random2"; + Phaser.Math.RND.sow([ scene.waveSeed ]); + scene.rngCounter = 0; + + result = getRandomPlayerPokemon(scene); + expect(result.species.speciesId).toBe(Species.ARCEUS); + }); + + it("gets a fainted pokemon from player party if isAllowedInBattle is false", () => { + // Both pokemon fainted + scene.getParty().forEach(p => { + p.hp = 0; + p.trySetStatus(StatusEffect.FAINT); + p.updateInfo(); + }); + + // Seeds are calculated to return index 0 first, 1 second (if both pokemon are legal) + scene.waveSeed = "random"; + Phaser.Math.RND.sow([ scene.waveSeed ]); + scene.rngCounter = 0; + + let result = getRandomPlayerPokemon(scene); + expect(result.species.speciesId).toBe(Species.MANAPHY); + + scene.waveSeed = "random2"; + Phaser.Math.RND.sow([ scene.waveSeed ]); + scene.rngCounter = 0; + + result = getRandomPlayerPokemon(scene); + expect(result.species.speciesId).toBe(Species.ARCEUS); + }); + + it("gets an unfainted pokemon from player party if isAllowedInBattle is true", () => { + // Only faint 1st pokemon + const party = scene.getParty(); + party[0].hp = 0; + party[0].trySetStatus(StatusEffect.FAINT); + party[0].updateInfo(); + + // Seeds are calculated to return index 0 first, 1 second (if both pokemon are legal) + scene.waveSeed = "random"; + Phaser.Math.RND.sow([ scene.waveSeed ]); + scene.rngCounter = 0; + + let result = getRandomPlayerPokemon(scene, true); + expect(result.species.speciesId).toBe(Species.MANAPHY); + + scene.waveSeed = "random2"; + Phaser.Math.RND.sow([ scene.waveSeed ]); + scene.rngCounter = 0; + + result = getRandomPlayerPokemon(scene, true); + expect(result.species.speciesId).toBe(Species.MANAPHY); + }); + + it("returns last unfainted pokemon if doNotReturnLastAbleMon is false", () => { + // Only faint 1st pokemon + const party = scene.getParty(); + party[0].hp = 0; + party[0].trySetStatus(StatusEffect.FAINT); + party[0].updateInfo(); + + // Seeds are calculated to return index 0 first, 1 second (if both pokemon are legal) + scene.waveSeed = "random"; + Phaser.Math.RND.sow([ scene.waveSeed ]); + scene.rngCounter = 0; + + let result = getRandomPlayerPokemon(scene, true, false); + expect(result.species.speciesId).toBe(Species.MANAPHY); + + scene.waveSeed = "random2"; + Phaser.Math.RND.sow([ scene.waveSeed ]); + scene.rngCounter = 0; + + result = getRandomPlayerPokemon(scene, true, false); + expect(result.species.speciesId).toBe(Species.MANAPHY); + }); + + it("never returns last unfainted pokemon if doNotReturnLastAbleMon is true", () => { + // Only faint 1st pokemon + const party = scene.getParty(); + party[0].hp = 0; + party[0].trySetStatus(StatusEffect.FAINT); + party[0].updateInfo(); + + // Seeds are calculated to return index 0 first, 1 second (if both pokemon are legal) + scene.waveSeed = "random"; + Phaser.Math.RND.sow([ scene.waveSeed ]); + scene.rngCounter = 0; + + let result = getRandomPlayerPokemon(scene, true, true); + expect(result.species.speciesId).toBe(Species.ARCEUS); + + scene.waveSeed = "random2"; + Phaser.Math.RND.sow([ scene.waveSeed ]); + scene.rngCounter = 0; + + result = getRandomPlayerPokemon(scene, true, true); + expect(result.species.speciesId).toBe(Species.ARCEUS); + }); + }); + + describe("getHighestLevelPlayerPokemon", () => { + it("gets highest level pokemon", () => { + const party = scene.getParty(); + party[0].level = 100; + + const result = getHighestLevelPlayerPokemon(scene); + expect(result.species.speciesId).toBe(Species.ARCEUS); + }); + + it("gets highest level pokemon at different index", () => { + const party = scene.getParty(); + party[1].level = 100; + + const result = getHighestLevelPlayerPokemon(scene); + expect(result.species.speciesId).toBe(Species.MANAPHY); + }); + + it("breaks ties by getting returning lower index", () => { + const party = scene.getParty(); + party[0].level = 100; + party[1].level = 100; + + const result = getHighestLevelPlayerPokemon(scene); + expect(result.species.speciesId).toBe(Species.ARCEUS); + }); + + it("returns highest level unfainted if unfainted is true", () => { + const party = scene.getParty(); + party[0].level = 100; + party[0].hp = 0; + party[0].trySetStatus(StatusEffect.FAINT); + party[0].updateInfo(); + party[1].level = 10; + + const result = getHighestLevelPlayerPokemon(scene, true); + expect(result.species.speciesId).toBe(Species.MANAPHY); + }); + }); + + describe("getLowestLevelPokemon", () => { + it("gets lowest level pokemon", () => { + const party = scene.getParty(); + party[0].level = 100; + + const result = getLowestLevelPlayerPokemon(scene); + expect(result.species.speciesId).toBe(Species.MANAPHY); + }); + + it("gets lowest level pokemon at different index", () => { + const party = scene.getParty(); + party[1].level = 100; + + const result = getLowestLevelPlayerPokemon(scene); + expect(result.species.speciesId).toBe(Species.ARCEUS); + }); + + it("breaks ties by getting returning lower index", () => { + const party = scene.getParty(); + party[0].level = 100; + party[1].level = 100; + + const result = getLowestLevelPlayerPokemon(scene); + expect(result.species.speciesId).toBe(Species.ARCEUS); + }); + + it("returns lowest level unfainted if unfainted is true", () => { + const party = scene.getParty(); + party[0].level = 10; + party[0].hp = 0; + party[0].trySetStatus(StatusEffect.FAINT); + party[0].updateInfo(); + party[1].level = 100; + + const result = getLowestLevelPlayerPokemon(scene, true); + expect(result.species.speciesId).toBe(Species.MANAPHY); + }); + }); + + describe("getRandomSpeciesByStarterTier", () => { + it("gets species for a starter tier", () => { + const result = getRandomSpeciesByStarterTier(5); + const pokeSpecies = getPokemonSpecies(result); + + expect(pokeSpecies.speciesId).toBe(result); + expect(speciesStarters[result]).toBe(5); + }); + + it("gets species for a starter tier range", () => { + const result = getRandomSpeciesByStarterTier([5, 8]); + const pokeSpecies = getPokemonSpecies(result); + + expect(pokeSpecies.speciesId).toBe(result); + expect(speciesStarters[result]).toBeGreaterThanOrEqual(5); + expect(speciesStarters[result]).toBeLessThanOrEqual(8); + }); + + it("excludes species from search", () => { + // Only 9 tiers are: Koraidon, Miraidon, Arceus, Rayquaza, Kyogre, Groudon, Zacian + const result = getRandomSpeciesByStarterTier(9, [Species.KORAIDON, Species.MIRAIDON, Species.ARCEUS, Species.RAYQUAZA, Species.KYOGRE, Species.GROUDON]); + const pokeSpecies = getPokemonSpecies(result); + expect(pokeSpecies.speciesId).toBe(Species.ZACIAN); + }); + + it("gets species of specified types", () => { + // Only 9 tiers are: Koraidon, Miraidon, Arceus, Rayquaza, Kyogre, Groudon, Zacian + const result = getRandomSpeciesByStarterTier(9, null, [Type.GROUND]); + const pokeSpecies = getPokemonSpecies(result); + expect(pokeSpecies.speciesId).toBe(Species.GROUDON); + }); + }); + + describe("koPlayerPokemon", () => { + it("KOs a pokemon", () => { + const party = scene.getParty(); + const arceus = party[0]; + arceus.hp = 100; + expect(arceus.isAllowedInBattle()).toBe(true); + + koPlayerPokemon(arceus); + expect(arceus.isAllowedInBattle()).toBe(false); + }); + }); + + describe("getTextWithEncounterDialogueTokens", () => { + it("injects dialogue tokens", () => { + scene.currentBattle.mysteryEncounter = new MysteryEncounter(null); + scene.currentBattle.mysteryEncounter.setDialogueToken("test", "value"); + + const result = getTextWithEncounterDialogueTokens(scene, "mysteryEncounter:unit_test_dialogue"); + expect(result).toEqual("valuevalue @ec{testvalue} @ec{test1} value @ec{test\\} @ec{test\\} {test}"); + }); + + it("can perform nested dialogue token injection", () => { + scene.currentBattle.mysteryEncounter = new MysteryEncounter(null); + scene.currentBattle.mysteryEncounter.setDialogueToken("test", "value"); + scene.currentBattle.mysteryEncounter.setDialogueToken("testvalue", "new"); + + const result = getTextWithEncounterDialogueTokens(scene, "mysteryEncounter:unit_test_dialogue"); + expect(result).toEqual("valuevalue new @ec{test1} value @ec{test\\} @ec{test\\} {test}"); + }); + }); + + describe("queueEncounterMessage", () => { + it("queues a message with encounter dialogue tokens", async () => { + scene.currentBattle.mysteryEncounter = new MysteryEncounter(null); + scene.currentBattle.mysteryEncounter.setDialogueToken("test", "value"); + const spy = vi.spyOn(game.scene, "queueMessage"); + const phaseSpy = vi.spyOn(game.scene, "unshiftPhase"); + + queueEncounterMessage(scene, "mysteryEncounter:unit_test_dialogue"); + expect(spy).toHaveBeenCalledWith("valuevalue @ec{testvalue} @ec{test1} value @ec{test\\} @ec{test\\} {test}", null, true); + expect(phaseSpy).toHaveBeenCalledWith(expect.any(MessagePhase)); + }); + }); + + describe("showEncounterText", () => { + it("showText with dialogue tokens", async () => { + scene.currentBattle.mysteryEncounter = new MysteryEncounter(null); + scene.currentBattle.mysteryEncounter.setDialogueToken("test", "value"); + const spy = vi.spyOn(game.scene.ui, "showText"); + + showEncounterText(scene, "mysteryEncounter:unit_test_dialogue"); + expect(spy).toHaveBeenCalledWith("valuevalue @ec{testvalue} @ec{test1} value @ec{test\\} @ec{test\\} {test}", null, expect.any(Function), 0, true); + }); + }); + + describe("showEncounterDialogue", () => { + it("showText with dialogue tokens", async () => { + scene.currentBattle.mysteryEncounter = new MysteryEncounter(null); + scene.currentBattle.mysteryEncounter.setDialogueToken("test", "value"); + const spy = vi.spyOn(game.scene.ui, "showDialogue"); + + showEncounterDialogue(scene, "mysteryEncounter:unit_test_dialogue", "mysteryEncounter:unit_test_dialogue"); + expect(spy).toHaveBeenCalledWith("valuevalue @ec{testvalue} @ec{test1} value @ec{test\\} @ec{test\\} {test}", "valuevalue @ec{testvalue} @ec{test1} value @ec{test\\} @ec{test\\} {test}", null, undefined, 0, 0); + }); + }); + + describe("initBattleWithEnemyConfig", () => { + it("", () => { + + }); + }); + + describe("setCustomEncounterRewards", () => { + it("", () => { + + }); + }); + + describe("selectPokemonForOption", () => { + it("", () => { + + }); + }); + + describe("setEncounterExp", () => { + it("", () => { + + }); + }); + + describe("leaveEncounterWithoutBattle", () => { + it("", () => { + + }); + }); + + describe("handleMysteryEncounterVictory", () => { + it("", () => { + + }); + }); +}); + diff --git a/src/test/mystery-encounter/mystery-encounter.test.ts b/src/test/mystery-encounter/mystery-encounter.test.ts index b8f50070011..2645fbc68ce 100644 --- a/src/test/mystery-encounter/mystery-encounter.test.ts +++ b/src/test/mystery-encounter/mystery-encounter.test.ts @@ -1,9 +1,11 @@ -import {afterEach, beforeAll, beforeEach, describe, it, vi} from "vitest"; +import {afterEach, beforeAll, beforeEach, expect, describe, it, vi} from "vitest"; import * as overrides from "../../overrides"; import GameManager from "#app/test/utils/gameManager"; import Phaser from "phaser"; +import {Species} from "#enums/species"; +import {MysteryEncounterPhase} from "#app/phases/mystery-encounter-phase"; -describe("Mystery Encounter", () => { +describe("Mystery Encounters", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -19,17 +21,29 @@ describe("Mystery Encounter", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "MYSTERY_ENCOUNTER_RATE_OVERRIDE", "get").mockReturnValue(64); - vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(3); + vi.spyOn(overrides, "MYSTERY_ENCOUNTER_RATE_OVERRIDE", "get").mockReturnValue(256); + vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(11); }); - it("spawns a mystery encounter", async() => { - // await game.runToSummon([ - // Species.CHARIZARD, - // Species.VOLCARONA - // ]); - // expect(game.scene.getCurrentPhase().constructor.name).toBe(EncounterPhase.name); - }, 100000); + it("Spawns a mystery encounter", async() => { + await game.runToMysteryEncounter([ + Species.CHARIZARD, + Species.VOLCARONA + ]); + + await game.phaseInterceptor.to(MysteryEncounterPhase, false); + expect(game.scene.getCurrentPhase().constructor.name).toBe(MysteryEncounterPhase.name); + }); + + it("", async() => { + await game.runToMysteryEncounter([ + Species.CHARIZARD, + Species.VOLCARONA + ]); + + await game.phaseInterceptor.to(MysteryEncounterPhase, false); + expect(game.scene.getCurrentPhase().constructor.name).toBe(MysteryEncounterPhase.name); + }); it("spawns mysterious challengers encounter", async() => { }); diff --git a/src/test/phases/mystery-encounter-phase.test.ts b/src/test/phases/mystery-encounter-phase.test.ts new file mode 100644 index 00000000000..8d8bac79b5a --- /dev/null +++ b/src/test/phases/mystery-encounter-phase.test.ts @@ -0,0 +1,159 @@ +import {afterEach, beforeAll, beforeEach, expect, describe, it, vi} from "vitest"; +import * as overrides from "../../overrides"; +import GameManager from "#app/test/utils/gameManager"; +import Phaser from "phaser"; +import {Species} from "#enums/species"; +import {MysteryEncounterOptionSelectedPhase, MysteryEncounterPhase} from "#app/phases/mystery-encounter-phase"; +import {Mode} from "#app/ui/ui"; +import {Button} from "#enums/buttons"; +import MysteryEncounterUiHandler from "#app/ui/mystery-encounter-ui-handler"; +import {MysteryEncounterType} from "#enums/mystery-encounter-type"; +import {MysteryEncounterTier} from "#app/data/mystery-encounter"; + +describe("Mystery Encounter Phases", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + vi.spyOn(overrides, "MYSTERY_ENCOUNTER_RATE_OVERRIDE", "get").mockReturnValue(256); + vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(11); + }); + + describe("MysteryEncounterPhase", () => { + it("Runs to MysteryEncounterPhase", async() => { + await game.runToMysteryEncounter([ + Species.CHARIZARD, + Species.VOLCARONA + ]); + + await game.phaseInterceptor.to(MysteryEncounterPhase, false); + expect(game.scene.getCurrentPhase().constructor.name).toBe(MysteryEncounterPhase.name); + }); + + it("Runs MysteryEncounterPhase", async() => { + vi.spyOn(overrides, "MYSTERY_ENCOUNTER_OVERRIDE", "get").mockReturnValue(MysteryEncounterType.MYSTERIOUS_CHALLENGERS); + await game.runToMysteryEncounter([ + Species.CHARIZARD, + Species.VOLCARONA + ]); + + game.onNextPrompt("MysteryEncounterPhase", Mode.MYSTERY_ENCOUNTER, () => { + // End phase early for test + game.phaseInterceptor.superEndPhase(); + }); + await game.phaseInterceptor.run(MysteryEncounterPhase); + + expect(game.scene.mysteryEncounterData.encounteredEvents.length).toBeGreaterThan(0); + expect(game.scene.mysteryEncounterData.encounteredEvents[0][0]).toEqual(MysteryEncounterType.MYSTERIOUS_CHALLENGERS); + expect(game.scene.mysteryEncounterData.encounteredEvents[0][1]).toEqual(MysteryEncounterTier.UNCOMMON); + expect(game.scene.ui.getMode()).toBe(Mode.MYSTERY_ENCOUNTER); + }); + + it("Selects an option for MysteryEncounterPhase", async() => { + vi.spyOn(overrides, "MYSTERY_ENCOUNTER_OVERRIDE", "get").mockReturnValue(MysteryEncounterType.MYSTERIOUS_CHALLENGERS); + const dialogueSpy = vi.spyOn(game.scene.ui, "showDialogue"); + const messageSpy = vi.spyOn(game.scene.ui, "showText"); + await game.runToMysteryEncounter([ + Species.CHARIZARD, + Species.VOLCARONA + ]); + + game.onNextPrompt("MysteryEncounterPhase", Mode.MYSTERY_ENCOUNTER, () => { + // Select option 1 for encounter + const handler = game.scene.ui.getHandler() as MysteryEncounterUiHandler; + handler.unblockInput(); + handler.processInput(Button.ACTION); + }); + await game.phaseInterceptor.run(MysteryEncounterPhase); + + // After option selected + expect(game.scene.getCurrentPhase().constructor.name).toBe(MysteryEncounterOptionSelectedPhase.name); + expect(game.scene.ui.getMode()).toBe(Mode.MESSAGE); + expect(dialogueSpy).toHaveBeenCalledTimes(1); + expect(messageSpy).toHaveBeenCalledTimes(2); + expect(dialogueSpy).toHaveBeenCalledWith("What's this?", "???", null, expect.any(Function)); + expect(messageSpy).toHaveBeenCalledWith("Mysterious challengers have appeared!", null, expect.any(Function), 750, true); + expect(messageSpy).toHaveBeenCalledWith("The trainer steps forward...", null, expect.any(Function), 750, true); + }); + }); + + describe("MysteryEncounterOptionSelectedPhase", () => { + it("runs phase", () => { + + }); + + it("handles onOptionSelect execution", () => { + + }); + + it("hides intro visuals", () => { + + }); + + it("does not hide intro visuals if option disabled", () => { + + }); + }); + + describe("MysteryEncounterBattlePhase", () => { + it("runs phase", () => { + + }); + + it("handles TRAINER_BATTLE variant", () => { + + }); + + it("handles BOSS_BATTLE variant", () => { + + }); + + it("handles WILD_BATTLE variant", () => { + + }); + + it("handles double battle", () => { + + }); + }); + + describe("MysteryEncounterRewardsPhase", () => { + it("runs phase", () => { + + }); + + it("handles doEncounterRewards", () => { + + }); + + it("handles heal phase if enabled", () => { + + }); + }); + + describe("PostMysteryEncounterPhase", () => { + it("runs phase", () => { + + }); + + it("handles onPostOptionSelect execution", () => { + + }); + + it("runs to next EncounterPhase", () => { + + }); + }); +}); + diff --git a/src/test/utils/gameManager.ts b/src/test/utils/gameManager.ts index 84d39024dc9..bfe13ee127c 100644 --- a/src/test/utils/gameManager.ts +++ b/src/test/utils/gameManager.ts @@ -33,6 +33,7 @@ import { Species } from "#enums/species"; import { Button } from "#enums/buttons"; import { BattlerIndex } from "#app/battle.js"; import TargetSelectUiHandler from "#app/ui/target-select-ui-handler.js"; +import BattleMessageUiHandler from "#app/ui/battle-message-ui-handler"; /** * Class to manage the game state and transitions between phases. @@ -137,6 +138,30 @@ export default class GameManager { await this.phaseInterceptor.run(EncounterPhase); } + /** + * Runs the game to a mystery encounter phase. + * @param species - Optional array of species for party. + * @returns A promise that resolves when the EncounterPhase ends. + */ + async runToMysteryEncounter(species?: Species[]) { + await this.runToTitle(); + + this.onNextPrompt("TitlePhase", Mode.TITLE, () => { + this.scene.gameMode = getGameMode(GameModes.CLASSIC); + const starters = generateStarter(this.scene, species); + const selectStarterPhase = new SelectStarterPhase(this.scene); + this.scene.pushPhase(new EncounterPhase(this.scene, false)); + selectStarterPhase.initBattle(starters); + }); + + this.onNextPrompt("EncounterPhase", Mode.MESSAGE, () => { + const handler = this.scene.ui.getHandler() as BattleMessageUiHandler; + handler.processInput(Button.ACTION); + }, null, true); + + await this.phaseInterceptor.run(EncounterPhase); + } + /** * Transitions to the start of a battle. * @param species - Optional array of species to start the battle with. diff --git a/src/test/utils/mocks/mocksContainer/mockContainer.ts b/src/test/utils/mocks/mocksContainer/mockContainer.ts index 2e2b9567796..4f8a58f7251 100644 --- a/src/test/utils/mocks/mocksContainer/mockContainer.ts +++ b/src/test/utils/mocks/mocksContainer/mockContainer.ts @@ -33,6 +33,10 @@ export default class MockContainer { // same as remove or destroy } + removeBetween(startIndex, endIndex, destroyChild) { + // Removes multiple children across an index range + } + addedToScene() { // This callback is invoked when this Game Object is added to a Scene. } diff --git a/src/test/utils/mocks/mocksContainer/mockSprite.ts b/src/test/utils/mocks/mocksContainer/mockSprite.ts index 2eb77f81302..ab61f88605b 100644 --- a/src/test/utils/mocks/mocksContainer/mockSprite.ts +++ b/src/test/utils/mocks/mocksContainer/mockSprite.ts @@ -31,6 +31,7 @@ export default class MockSprite { }; this.anims = { pause: () => null, + stop: () => null, }; } diff --git a/src/ui/mystery-encounter-ui-handler.ts b/src/ui/mystery-encounter-ui-handler.ts index 232d916be57..d8981f7da0d 100644 --- a/src/ui/mystery-encounter-ui-handler.ts +++ b/src/ui/mystery-encounter-ui-handler.ts @@ -103,7 +103,7 @@ export default class MysteryEncounterUiHandler extends UiHandler { if (cursor === this.viewPartyIndex) { // Handle view party success = true; - this.clear(); + // this.clear(); this.scene.ui.setMode(Mode.PARTY, PartyUiMode.CHECK, -1, () => { this.scene.ui.setMode(Mode.MYSTERY_ENCOUNTER, true); setTimeout(() => { @@ -116,7 +116,7 @@ export default class MysteryEncounterUiHandler extends UiHandler { } else { const selected = this.filteredEncounterOptions[cursor]; if ((this.scene.getCurrentPhase() as MysteryEncounterPhase).handleOptionSelect(selected, cursor)) { - this.clear(); + // this.clear(); success = true; } else { ui.playError(); From 872242c44fa7ef9b4da191c6fa3e343597893b25 Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Sun, 7 Jul 2024 10:49:22 -0400 Subject: [PATCH 013/270] remove commented code --- src/test/mystery-encounter/mystery-encounter-utils.test.ts | 2 -- src/ui/mystery-encounter-ui-handler.ts | 2 -- 2 files changed, 4 deletions(-) diff --git a/src/test/mystery-encounter/mystery-encounter-utils.test.ts b/src/test/mystery-encounter/mystery-encounter-utils.test.ts index 4b514b13e01..6f1bccd359c 100644 --- a/src/test/mystery-encounter/mystery-encounter-utils.test.ts +++ b/src/test/mystery-encounter/mystery-encounter-utils.test.ts @@ -34,8 +34,6 @@ describe("Mystery Encounter Utils", () => { game = new GameManager(phaserGame); scene = game.scene; initSceneWithoutEncounterPhase(game.scene, [Species.ARCEUS, Species.MANAPHY]); - // vi.spyOn(overrides, "MYSTERY_ENCOUNTER_RATE_OVERRIDE", "get").mockReturnValue(256); - // vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(11); }); describe("getRandomPlayerPokemon", () => { diff --git a/src/ui/mystery-encounter-ui-handler.ts b/src/ui/mystery-encounter-ui-handler.ts index d8981f7da0d..ce49a9f280d 100644 --- a/src/ui/mystery-encounter-ui-handler.ts +++ b/src/ui/mystery-encounter-ui-handler.ts @@ -103,7 +103,6 @@ export default class MysteryEncounterUiHandler extends UiHandler { if (cursor === this.viewPartyIndex) { // Handle view party success = true; - // this.clear(); this.scene.ui.setMode(Mode.PARTY, PartyUiMode.CHECK, -1, () => { this.scene.ui.setMode(Mode.MYSTERY_ENCOUNTER, true); setTimeout(() => { @@ -116,7 +115,6 @@ export default class MysteryEncounterUiHandler extends UiHandler { } else { const selected = this.filteredEncounterOptions[cursor]; if ((this.scene.getCurrentPhase() as MysteryEncounterPhase).handleOptionSelect(selected, cursor)) { - // this.clear(); success = true; } else { ui.playError(); From 7b35efe95eecec42f9b5dcd827f990a45b38f07b Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Mon, 8 Jul 2024 17:30:24 -0400 Subject: [PATCH 014/270] adds 2 new encounters and colorable text options --- .../images/mystery-encounters/b2w2_lady.json | 734 ++++++++++++++++ .../images/mystery-encounters/b2w2_lady.png | Bin 0 -> 23208 bytes .../mystery-encounters/b2w2_veteran_m.json | 797 ++++++++++++++++++ .../mystery-encounters/b2w2_veteran_m.png | Bin 0 -> 19744 bytes src/data/mystery-encounter-requirements.ts | 92 +- src/data/mystery-encounter.ts | 25 +- .../department-store-sale.ts | 120 +++ .../department-store-sale-dialogue.ts | 36 + .../dialogue/mystery-encounter-dialogue.ts | 7 + .../dialogue/shady-vitamin-dealer.ts | 42 + .../mystery-encounters/fight-or-flight.ts | 47 +- .../mystery-encounter-utils.ts | 82 +- .../mystery-encounters/mystery-encounters.ts | 26 +- .../shady-vitamin-dealer.ts | 148 ++++ .../mystery-encounters/sleeping-snorlax.ts | 6 +- .../mystery-encounters/training-session.ts | 8 +- src/enums/mystery-encounter-type.ts | 4 +- src/field/mystery-encounter-intro.ts | 8 +- src/locales/en/mystery-encounter.ts | 87 +- src/overrides.ts | 4 +- src/phases/mystery-encounter-phase.ts | 10 +- .../mystery-encounter-utils.test.ts | 18 +- .../phases/mystery-encounter-phase.test.ts | 2 +- src/ui/mystery-encounter-ui-handler.ts | 53 +- 24 files changed, 2235 insertions(+), 121 deletions(-) create mode 100644 public/images/mystery-encounters/b2w2_lady.json create mode 100644 public/images/mystery-encounters/b2w2_lady.png create mode 100644 public/images/mystery-encounters/b2w2_veteran_m.json create mode 100644 public/images/mystery-encounters/b2w2_veteran_m.png create mode 100644 src/data/mystery-encounters/department-store-sale.ts create mode 100644 src/data/mystery-encounters/dialogue/department-store-sale-dialogue.ts create mode 100644 src/data/mystery-encounters/dialogue/shady-vitamin-dealer.ts create mode 100644 src/data/mystery-encounters/shady-vitamin-dealer.ts diff --git a/public/images/mystery-encounters/b2w2_lady.json b/public/images/mystery-encounters/b2w2_lady.json new file mode 100644 index 00000000000..e143086e157 --- /dev/null +++ b/public/images/mystery-encounters/b2w2_lady.json @@ -0,0 +1,734 @@ +{ + "textures": [ + { + "image": "b2w2_lady.png", + "format": "RGBA8888", + "size": { + "w": 399, + "h": 360 + }, + "scale": 1, + "frames": [ + { + "filename": "0000.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 56, + "h": 72 + }, + "frame": { + "x": 0, + "y": 0, + "w": 56, + "h": 72 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 56, + "h": 72 + }, + "frame": { + "x": 57, + "y": 0, + "w": 56, + "h": 72 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 56, + "h": 72 + }, + "frame": { + "x": 114, + "y": 0, + "w": 56, + "h": 72 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 9, + "y": 8, + "w": 55, + "h": 72 + }, + "frame": { + "x": 171, + "y": 0, + "w": 55, + "h": 72 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 11, + "y": 8, + "w": 54, + "h": 72 + }, + "frame": { + "x": 228, + "y": 0, + "w": 54, + "h": 72 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 11, + "y": 8, + "w": 54, + "h": 72 + }, + "frame": { + "x": 285, + "y": 0, + "w": 54, + "h": 72 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 14, + "y": 8, + "w": 52, + "h": 72 + }, + "frame": { + "x": 342, + "y": 0, + "w": 52, + "h": 72 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 20, + "y": 8, + "w": 48, + "h": 72 + }, + "frame": { + "x": 0, + "y": 72, + "w": 48, + "h": 72 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 22, + "y": 8, + "w": 47, + "h": 72 + }, + "frame": { + "x": 57, + "y": 72, + "w": 47, + "h": 72 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 22, + "y": 8, + "w": 47, + "h": 72 + }, + "frame": { + "x": 114, + "y": 72, + "w": 47, + "h": 72 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 22, + "y": 8, + "w": 48, + "h": 72 + }, + "frame": { + "x": 171, + "y": 72, + "w": 48, + "h": 72 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 22, + "y": 8, + "w": 48, + "h": 72 + }, + "frame": { + "x": 228, + "y": 72, + "w": 48, + "h": 72 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 22, + "y": 8, + "w": 48, + "h": 72 + }, + "frame": { + "x": 285, + "y": 72, + "w": 48, + "h": 72 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 22, + "y": 8, + "w": 48, + "h": 72 + }, + "frame": { + "x": 342, + "y": 72, + "w": 48, + "h": 72 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 22, + "y": 8, + "w": 49, + "h": 72 + }, + "frame": { + "x": 0, + "y": 144, + "w": 49, + "h": 72 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 22, + "y": 8, + "w": 49, + "h": 72 + }, + "frame": { + "x": 57, + "y": 144, + "w": 49, + "h": 72 + } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 22, + "y": 8, + "w": 49, + "h": 72 + }, + "frame": { + "x": 114, + "y": 144, + "w": 49, + "h": 72 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 22, + "y": 8, + "w": 49, + "h": 72 + }, + "frame": { + "x": 171, + "y": 144, + "w": 49, + "h": 72 + } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 22, + "y": 8, + "w": 48, + "h": 72 + }, + "frame": { + "x": 228, + "y": 144, + "w": 48, + "h": 72 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 22, + "y": 8, + "w": 48, + "h": 72 + }, + "frame": { + "x": 285, + "y": 144, + "w": 48, + "h": 72 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 22, + "y": 8, + "w": 48, + "h": 72 + }, + "frame": { + "x": 342, + "y": 144, + "w": 48, + "h": 72 + } + }, + { + "filename": "0021.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 22, + "y": 8, + "w": 48, + "h": 72 + }, + "frame": { + "x": 0, + "y": 216, + "w": 48, + "h": 72 + } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 20, + "y": 8, + "w": 50, + "h": 72 + }, + "frame": { + "x": 57, + "y": 216, + "w": 50, + "h": 72 + } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 18, + "y": 8, + "w": 51, + "h": 72 + }, + "frame": { + "x": 114, + "y": 216, + "w": 51, + "h": 72 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 18, + "y": 8, + "w": 51, + "h": 72 + }, + "frame": { + "x": 171, + "y": 216, + "w": 51, + "h": 72 + } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 15, + "y": 8, + "w": 53, + "h": 72 + }, + "frame": { + "x": 228, + "y": 216, + "w": 53, + "h": 72 + } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 10, + "y": 8, + "w": 57, + "h": 72 + }, + "frame": { + "x": 285, + "y": 216, + "w": 57, + "h": 72 + } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 10, + "y": 8, + "w": 56, + "h": 72 + }, + "frame": { + "x": 342, + "y": 216, + "w": 56, + "h": 72 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 10, + "y": 8, + "w": 56, + "h": 72 + }, + "frame": { + "x": 0, + "y": 288, + "w": 56, + "h": 72 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 9, + "y": 8, + "w": 55, + "h": 72 + }, + "frame": { + "x": 57, + "y": 288, + "w": 55, + "h": 72 + } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 56, + "h": 72 + }, + "frame": { + "x": 114, + "y": 288, + "w": 56, + "h": 72 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 56, + "h": 72 + }, + "frame": { + "x": 171, + "y": 288, + "w": 56, + "h": 72 + } + }, + { + "filename": "0032.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 56, + "h": 72 + }, + "frame": { + "x": 228, + "y": 288, + "w": 56, + "h": 72 + } + }, + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 56, + "h": 72 + }, + "frame": { + "x": 285, + "y": 288, + "w": 56, + "h": 72 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:e7f062304401dbd7b3ec79512f0ff4cb:0136dac01331f88892a3df26aeab78f5:1ed1e22abb9b55d76337a5a599835c06$" + } +} diff --git a/public/images/mystery-encounters/b2w2_lady.png b/public/images/mystery-encounters/b2w2_lady.png new file mode 100644 index 0000000000000000000000000000000000000000..9dcc1281c9ebe1a378503fb54ee4e25447413cd3 GIT binary patch literal 23208 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 0 && this.requiredMoney > money) { + if (isNullOrUndefined(money)) { return false; } - return true; + + if (this?.scalingMultiplier > 0) { + this.requiredMoney = scene.getWaveMoneyAmount(this.scalingMultiplier); + } + return !(this?.requiredMoney > 0 && this.requiredMoney > money); } getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] { - return ["money", "₽" + scene.money.toString()]; + const value = this?.scalingMultiplier > 0 ? scene.getWaveMoneyAmount(this.scalingMultiplier).toString() : this.requiredMoney.toString(); + // Colors money text + return ["money", "@ecCol[MONEY]{₽" + value + "}"]; } } @@ -399,9 +407,9 @@ export class MoveRequirement extends EncounterPokemonRequirement { } getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] { - const includedMoves = this.requiredMoves.filter((reqMove) => pokemon.moveset.filter((move) => move.moveId === reqMove).length > 0); + const includedMoves = pokemon.moveset.filter((move) => this.requiredMoves.includes(move.moveId)); if (includedMoves.length > 0) { - return ["move", Moves[includedMoves[0]].replace("_", " ")]; + return ["move", includedMoves[0].getName()]; } return null; } @@ -552,15 +560,15 @@ export class StatusEffectRequirement extends EncounterPokemonRequirement { minNumberOfPokemon:number; invertQuery:boolean; - constructor(StatusEffect: StatusEffect | StatusEffect[], minNumberOfPokemon: number = 1, invertQuery: boolean = false) { + constructor(statusEffect: StatusEffect | StatusEffect[], minNumberOfPokemon: number = 1, invertQuery: boolean = false) { super(); this.minNumberOfPokemon = minNumberOfPokemon; this.invertQuery = invertQuery; - if (StatusEffect instanceof Array) { - this.requiredStatusEffect = StatusEffect; + if (statusEffect instanceof Array) { + this.requiredStatusEffect = statusEffect; } else { this.requiredStatusEffect = []; - this.requiredStatusEffect.push(StatusEffect); + this.requiredStatusEffect.push(statusEffect); } } @@ -576,16 +584,38 @@ export class StatusEffectRequirement extends EncounterPokemonRequirement { queryParty(partyPokemon: PlayerPokemon[]): PlayerPokemon[] { if (!this.invertQuery) { - return partyPokemon.filter((pokemon) => this.requiredStatusEffect.filter((StatusEffect) => pokemon.status?.effect === StatusEffect).length > 0); + return partyPokemon.filter((pokemon) => { + return this.requiredStatusEffect.some((statusEffect) => { + if (statusEffect === StatusEffect.NONE) { + // StatusEffect.NONE also checks for null or undefined status + return isNullOrUndefined(pokemon.status) || isNullOrUndefined(pokemon.status.effect) || pokemon.status?.effect === statusEffect; + } else { + return pokemon.status?.effect === statusEffect; + } + }); + }); } else { // for an inverted query, we only want to get the pokemon that don't have ANY of the listed StatusEffects - return partyPokemon.filter((pokemon) => this.requiredStatusEffect.filter((StatusEffect) => pokemon.status?.effect === StatusEffect).length === 0); + // return partyPokemon.filter((pokemon) => this.requiredStatusEffect.filter((statusEffect) => pokemon.status?.effect === statusEffect).length === 0); + return partyPokemon.filter((pokemon) => { + return !this.requiredStatusEffect.some((statusEffect) => { + if (statusEffect === StatusEffect.NONE) { + // StatusEffect.NONE also checks for null or undefined status + return isNullOrUndefined(pokemon.status) || isNullOrUndefined(pokemon.status.effect) || pokemon.status?.effect === statusEffect; + } else { + return pokemon.status?.effect === statusEffect; + } + }); + }); } } getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] { const reqStatus = this.requiredStatusEffect.filter((a) => { - pokemon.status?.effect ===(a); + if (a === StatusEffect.NONE) { + return isNullOrUndefined(pokemon.status) || isNullOrUndefined(pokemon.status.effect) || pokemon.status?.effect === a; + } + return pokemon.status?.effect === a; }); if (reqStatus.length > 0) { return ["status", StatusEffect[reqStatus[0]]]; @@ -863,7 +893,9 @@ export class HealthRatioRequirement extends EncounterPokemonRequirement { queryParty(partyPokemon: PlayerPokemon[]): PlayerPokemon[] { if (!this.invertQuery) { - return partyPokemon.filter((pokemon) => pokemon.getHpRatio() >= this.requiredHealthRange[0] && pokemon.getHpRatio() <= this.requiredHealthRange[1]); + return partyPokemon.filter((pokemon) => { + return pokemon.getHpRatio() >= this.requiredHealthRange[0] && pokemon.getHpRatio() <= this.requiredHealthRange[1]; + }); } else { // for an inverted query, we only want to get the pokemon that don't have ANY of the listed requiredHealthRanges return partyPokemon.filter((pokemon) => pokemon.getHpRatio() < this.requiredHealthRange[0] || pokemon.getHpRatio() > this.requiredHealthRange[1]); diff --git a/src/data/mystery-encounter.ts b/src/data/mystery-encounter.ts index 8325a26d29d..d768a672632 100644 --- a/src/data/mystery-encounter.ts +++ b/src/data/mystery-encounter.ts @@ -5,10 +5,13 @@ import MysteryEncounterDialogue, { allMysteryEncounterDialogue } from "./mystery-encounters/dialogue/mystery-encounter-dialogue"; import MysteryEncounterOption from "./mystery-encounter-option"; -import { EncounterPokemonRequirement, EncounterSceneRequirement } from "./mystery-encounter-requirements"; +import { + EncounterPokemonRequirement, + EncounterSceneRequirement +} from "./mystery-encounter-requirements"; import * as Utils from "../utils"; import {EnemyPartyConfig} from "#app/data/mystery-encounters/mystery-encounter-utils"; -import { PlayerPokemon } from "#app/field/pokemon"; +import Pokemon, { PlayerPokemon } from "#app/field/pokemon"; import {isNullOrUndefined} from "../utils"; export enum MysteryEncounterVariant { @@ -167,6 +170,10 @@ export default class MysteryEncounter implements MysteryEncounter { return sceneReq && secReqs && priReqs; } + pokemonMeetsPrimaryRequirements?(scene: BattleScene, pokemon: Pokemon) { + return !this.primaryPokemonRequirements.some(req => !req.queryParty(scene.getParty()).map(p => p.id).includes(pokemon.id)); + } + private meetsPrimaryRequirementAndPrimaryPokemonSelected?(scene: BattleScene) { if (this.primaryPokemonRequirements.length === 0) { const activeMon = scene.getParty().filter(p => p.isActive(true)); @@ -263,6 +270,12 @@ export default class MysteryEncounter implements MysteryEncounter { * For multiple support pokemon in the dialogue token, it will have to be overridden. */ populateDialogueTokensFromRequirements?(scene: BattleScene) { + if (this.requirements?.length > 0) { + for (const req of this.requirements) { + const dialogueToken = req.getDialogueToken(scene); + this.setDialogueToken(...dialogueToken); + } + } if (this.primaryPokemon?.length > 0) { this.setDialogueToken("primaryName", this.primaryPokemon.name); for (const req of this.primaryPokemonRequirements) { @@ -281,9 +294,17 @@ export default class MysteryEncounter implements MysteryEncounter { } } } + + // Dialogue tokens for options for (let i = 0; i < this.options.length; i++) { const opt = this.options[i]; const j = i + 1; + if (opt.requirements?.length > 0) { + for (const req of opt.requirements) { + const dialogueToken = req.getDialogueToken(scene); + this.setDialogueToken("option" + j + this.capitalizeFirstLetter(dialogueToken[0]), dialogueToken[1]); + } + } if (opt.primaryPokemonRequirements?.length > 0 && opt.primaryPokemon?.length > 0) { this.setDialogueToken("option" + j + "PrimaryName", opt.primaryPokemon.name); for (const req of opt.primaryPokemonRequirements) { diff --git a/src/data/mystery-encounters/department-store-sale.ts b/src/data/mystery-encounters/department-store-sale.ts new file mode 100644 index 00000000000..3837e94af60 --- /dev/null +++ b/src/data/mystery-encounters/department-store-sale.ts @@ -0,0 +1,120 @@ +import BattleScene from "../../battle-scene"; +import { + leaveEncounterWithoutBattle, + setCustomEncounterRewards, +} from "#app/data/mystery-encounters/mystery-encounter-utils"; +import MysteryEncounter, {MysteryEncounterBuilder, MysteryEncounterTier} from "../mystery-encounter"; +import { MysteryEncounterType } from "#enums/mystery-encounter-type"; +import {WaveCountRequirement} from "../mystery-encounter-requirements"; +import { MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; +import {modifierTypes} from "#app/modifier/modifier-type"; +import {Species} from "#enums/species"; +import {randSeedInt} from "#app/utils"; + +export const DepartmentStoreSaleEncounter: MysteryEncounter = new MysteryEncounterBuilder() + .withEncounterType(MysteryEncounterType.DEPARTMENT_STORE_SALE) + .withEncounterTier(MysteryEncounterTier.COMMON) + .withIntroSpriteConfigs([ + { + spriteKey: "b2w2_lady", + fileRoot: "mystery-encounters", + hasShadow: true, + x: -20 + }, + { + spriteKey: Species.FURFROU.toString(), + fileRoot: "pokemon", + hasShadow: true, + repeat: true, + x: 30 + } + ]) + // .withHideIntroVisuals(false) + .withSceneRequirement(new WaveCountRequirement([10, 100])) + .withOption(new MysteryEncounterOptionBuilder() + .withOptionPhase(async (scene: BattleScene) => { + // Choose TMs + const modifiers = []; + let i = 0; + while (i < 4) { + // 2/2/1 weight on TM rarity + const roll = randSeedInt(5); + if (roll < 2) { + modifiers.push(modifierTypes.TM_COMMON); + } else if (roll < 4) { + modifiers.push(modifierTypes.TM_GREAT); + } else { + modifiers.push(modifierTypes.TM_ULTRA); + } + i++; + } + + setCustomEncounterRewards(scene, { guaranteedModifierTypeFuncs: modifiers, fillRemaining: false}); + leaveEncounterWithoutBattle(scene); + }) + .build()) + .withOption(new MysteryEncounterOptionBuilder() + .withOptionPhase(async (scene: BattleScene) => { + // Choose Vitamins + const modifiers = []; + let i = 0; + while (i < 3) { + // 2/1 weight on base stat booster vs PP Up + const roll = randSeedInt(3); + if (roll === 0) { + modifiers.push(modifierTypes.PP_UP); + } else { + modifiers.push(modifierTypes.BASE_STAT_BOOSTER); + } + i++; + } + + setCustomEncounterRewards(scene, { guaranteedModifierTypeFuncs: modifiers, fillRemaining: false}); + leaveEncounterWithoutBattle(scene); + }) + .build()) + .withOption(new MysteryEncounterOptionBuilder() + .withOptionPhase(async (scene: BattleScene) => { + // Choose X Items + const modifiers = []; + let i = 0; + while (i < 5) { + // 4/1 weight on base stat booster vs Dire Hit + const roll = randSeedInt(5); + if (roll === 0) { + modifiers.push(modifierTypes.DIRE_HIT); + } else { + modifiers.push(modifierTypes.TEMP_STAT_BOOSTER); + } + i++; + } + + setCustomEncounterRewards(scene, { guaranteedModifierTypeFuncs: modifiers, fillRemaining: false}); + leaveEncounterWithoutBattle(scene); + }) + .build()) + .withOption(new MysteryEncounterOptionBuilder() + .withOptionPhase(async (scene: BattleScene) => { + // Choose Pokeballs + const modifiers = []; + let i = 0; + while (i < 4) { + // 10/30/20/5 weight on pokeballs + const roll = randSeedInt(65); + if (roll < 10) { + modifiers.push(modifierTypes.POKEBALL); + } else if (roll < 40) { + modifiers.push(modifierTypes.GREAT_BALL); + } else if (roll < 60) { + modifiers.push(modifierTypes.ULTRA_BALL); + } else { + modifiers.push(modifierTypes.ROGUE_BALL); + } + i++; + } + + setCustomEncounterRewards(scene, { guaranteedModifierTypeFuncs: modifiers, fillRemaining: false}); + leaveEncounterWithoutBattle(scene); + }) + .build()) + .build(); diff --git a/src/data/mystery-encounters/dialogue/department-store-sale-dialogue.ts b/src/data/mystery-encounters/dialogue/department-store-sale-dialogue.ts new file mode 100644 index 00000000000..3a9b75b9f83 --- /dev/null +++ b/src/data/mystery-encounters/dialogue/department-store-sale-dialogue.ts @@ -0,0 +1,36 @@ +import MysteryEncounterDialogue from "#app/data/mystery-encounters/dialogue/mystery-encounter-dialogue"; + +export const DepartmentStoreSaleDialogue: MysteryEncounterDialogue = { + intro: [ + { + text: "mysteryEncounter:department_store_sale_intro_message" + }, + { + text: "mysteryEncounter:department_store_sale_intro_dialogue", + speaker: "mysteryEncounter:department_store_sale_speaker" + } + ], + encounterOptionsDialogue: { + title: "mysteryEncounter:department_store_sale_title", + description: "mysteryEncounter:department_store_sale_description", + query: "mysteryEncounter:department_store_sale_query", + options: [ + { + buttonLabel: "mysteryEncounter:department_store_sale_option_1_label", + buttonTooltip: "mysteryEncounter:department_store_sale_option_1_tooltip" + }, + { + buttonLabel: "mysteryEncounter:department_store_sale_option_2_label", + buttonTooltip: "mysteryEncounter:department_store_sale_option_2_tooltip" + }, + { + buttonLabel: "mysteryEncounter:department_store_sale_option_3_label", + buttonTooltip: "mysteryEncounter:department_store_sale_option_3_tooltip" + }, + { + buttonLabel: "mysteryEncounter:department_store_sale_option_4_label", + buttonTooltip: "mysteryEncounter:department_store_sale_option_4_tooltip" + } + ] + } +}; diff --git a/src/data/mystery-encounters/dialogue/mystery-encounter-dialogue.ts b/src/data/mystery-encounters/dialogue/mystery-encounter-dialogue.ts index e390b0e706a..c64d9627388 100644 --- a/src/data/mystery-encounters/dialogue/mystery-encounter-dialogue.ts +++ b/src/data/mystery-encounters/dialogue/mystery-encounter-dialogue.ts @@ -5,10 +5,14 @@ import {DarkDealDialogue} from "#app/data/mystery-encounters/dialogue/dark-deal- import {FightOrFlightDialogue} from "#app/data/mystery-encounters/dialogue/fight-or-flight-dialogue"; import {TrainingSessionDialogue} from "#app/data/mystery-encounters/dialogue/training-session-dialogue"; import { SleepingSnorlaxDialogue } from "./sleeping-snorlax-dialogue"; +import {DepartmentStoreSaleDialogue} from "#app/data/mystery-encounters/dialogue/department-store-sale-dialogue"; +import {ShadyVitaminDealerDialogue} from "#app/data/mystery-encounters/dialogue/shady-vitamin-dealer"; +import {TextStyle} from "#app/ui/text"; export class TextDisplay { speaker?: TemplateStringsArray | `mysteryEncounter:${string}`; text: TemplateStringsArray | `mysteryEncounter:${string}`; + style?: TextStyle; } export class OptionTextDisplay { @@ -17,6 +21,7 @@ export class OptionTextDisplay { disabledTooltip?: TemplateStringsArray | `mysteryEncounter:${string}`; secondOptionPrompt?: TemplateStringsArray | `mysteryEncounter:${string}`; selected?: TextDisplay[]; + style?: TextStyle; } export class EncounterOptionsDialogue { @@ -91,4 +96,6 @@ export function initMysteryEncounterDialogue() { allMysteryEncounterDialogue[MysteryEncounterType.FIGHT_OR_FLIGHT] = FightOrFlightDialogue; allMysteryEncounterDialogue[MysteryEncounterType.TRAINING_SESSION] = TrainingSessionDialogue; allMysteryEncounterDialogue[MysteryEncounterType.SLEEPING_SNORLAX] = SleepingSnorlaxDialogue; + allMysteryEncounterDialogue[MysteryEncounterType.DEPARTMENT_STORE_SALE] = DepartmentStoreSaleDialogue; + allMysteryEncounterDialogue[MysteryEncounterType.SHADY_VITAMIN_DEALER] = ShadyVitaminDealerDialogue; } diff --git a/src/data/mystery-encounters/dialogue/shady-vitamin-dealer.ts b/src/data/mystery-encounters/dialogue/shady-vitamin-dealer.ts new file mode 100644 index 00000000000..4a9d48913c5 --- /dev/null +++ b/src/data/mystery-encounters/dialogue/shady-vitamin-dealer.ts @@ -0,0 +1,42 @@ +import MysteryEncounterDialogue from "#app/data/mystery-encounters/dialogue/mystery-encounter-dialogue"; + +export const ShadyVitaminDealerDialogue: MysteryEncounterDialogue = { + intro: [ + { + text: "mysteryEncounter:shady_vitamin_dealer_intro_message" + }, + { + text: "mysteryEncounter:shady_vitamin_dealer_intro_dialogue", + speaker: "mysteryEncounter:shady_vitamin_dealer_speaker" + } + ], + encounterOptionsDialogue: { + title: "mysteryEncounter:shady_vitamin_dealer_title", + description: "mysteryEncounter:shady_vitamin_dealer_description", + query: "mysteryEncounter:shady_vitamin_dealer_query", + options: [ + { + buttonLabel: "mysteryEncounter:shady_vitamin_dealer_option_1_label", + buttonTooltip: "mysteryEncounter:shady_vitamin_dealer_option_1_tooltip", + selected: [ + { + text: "mysteryEncounter:shady_vitamin_dealer_option_selected" + }, + ] + }, + { + buttonLabel: "mysteryEncounter:shady_vitamin_dealer_option_2_label", + buttonTooltip: "mysteryEncounter:shady_vitamin_dealer_option_2_tooltip", + selected: [ + { + text: "mysteryEncounter:shady_vitamin_dealer_option_selected" + }, + ] + }, + { + buttonLabel: "mysteryEncounter:shady_vitamin_dealer_option_3_label", + buttonTooltip: "mysteryEncounter:shady_vitamin_dealer_option_3_tooltip" + } + ] + } +}; diff --git a/src/data/mystery-encounters/fight-or-flight.ts b/src/data/mystery-encounters/fight-or-flight.ts index 90cc57bbc13..9ee4166662e 100644 --- a/src/data/mystery-encounters/fight-or-flight.ts +++ b/src/data/mystery-encounters/fight-or-flight.ts @@ -9,7 +9,7 @@ import { } from "#app/data/mystery-encounters/mystery-encounter-utils"; import MysteryEncounter, {MysteryEncounterBuilder, MysteryEncounterTier} from "../mystery-encounter"; import {MysteryEncounterType} from "#enums/mystery-encounter-type"; -import {WaveCountRequirement} from "../mystery-encounter-requirements"; +import {MoveRequirement, WaveCountRequirement} from "../mystery-encounter-requirements"; import {MysteryEncounterOptionBuilder} from "../mystery-encounter-option"; import { getPartyLuckValue, @@ -23,6 +23,18 @@ import {StatChangePhase} from "#app/phases"; import {BattleStat} from "#app/data/battle-stat"; import Pokemon from "#app/field/pokemon"; import {randSeedInt} from "#app/utils"; +import {Moves} from "#enums/moves"; +import {TextStyle} from "#app/ui/text"; + +const validMovesForSteal = [ + Moves.PLUCK, + Moves.COVET, + Moves.FAKE_OUT, + Moves.THIEF, + Moves.TRICK, + Moves.SWITCHEROO, + Moves.GIGA_DRAIN +]; export const FightOrFlightEncounter: MysteryEncounter = new MysteryEncounterBuilder() .withEncounterType(MysteryEncounterType.FIGHT_OR_FLIGHT) @@ -70,6 +82,21 @@ export const FightOrFlightEncounter: MysteryEncounter = new MysteryEncounterBuil } ]; + // If player has a stealing move, they succeed automatically + const moveRequirement = new MoveRequirement(validMovesForSteal); + const validPokemon = moveRequirement.queryParty(scene.getParty()); + if (validPokemon?.length > 0) { + // Use first valid pokemon to execute the theivery + const pokemon = validPokemon[0]; + encounter.setDialogueToken("thiefPokemon", pokemon.name); + encounter.setDialogueToken(...moveRequirement.getDialogueToken(scene, pokemon)); + encounter.dialogue.encounterOptionsDialogue.options[1].buttonTooltip = "mysteryEncounter:fight_or_flight_option_2_steal_tooltip"; + encounter.dialogue.encounterOptionsDialogue.options[1].style = TextStyle.SUMMARY_GREEN; + } else { + encounter.dialogue.encounterOptionsDialogue.options[1].buttonTooltip = "mysteryEncounter:fight_or_flight_option_2_tooltip"; + encounter.dialogue.encounterOptionsDialogue.options[1].style = null; + } + return true; }) .withOption(new MysteryEncounterOptionBuilder() @@ -83,9 +110,23 @@ export const FightOrFlightEncounter: MysteryEncounter = new MysteryEncounterBuil .withOption(new MysteryEncounterOptionBuilder() .withOptionPhase(async (scene: BattleScene) => { // Pick steal + const encounter = scene.currentBattle.mysteryEncounter; const item = scene.currentBattle.mysteryEncounter.misc as ModifierTypeOption; setCustomEncounterRewards(scene, { guaranteedModifierTypeOptions: [item], fillRemaining: false}); + // If player has a stealing move, they succeed automatically + const moveRequirement = new MoveRequirement(validMovesForSteal); + const validPokemon = moveRequirement.queryParty(scene.getParty()); + if (validPokemon?.length > 0) { + // Use first valid pokemon to execute the theivery + const pokemon = validPokemon[0]; + encounter.setDialogueToken("thiefPokemon", pokemon.name); + encounter.setDialogueToken(...moveRequirement.getDialogueToken(scene, pokemon)); + await showEncounterText(scene, "mysteryEncounter:fight_or_flight_option_2_steal_result"); + leaveEncounterWithoutBattle(scene); + return; + } + const roll = randSeedInt(16); if (roll > 6) { // Noticed and attacked by boss, gets +1 to all stats at start of fight (62.5%) @@ -101,8 +142,8 @@ export const FightOrFlightEncounter: MysteryEncounter = new MysteryEncounterBuil } else { // Steal item (37.5%) // Display result message then proceed to rewards - await showEncounterText(scene, "mysteryEncounter:fight_or_flight_option_2_good_result") - .then(() => leaveEncounterWithoutBattle(scene)); + await showEncounterText(scene, "mysteryEncounter:fight_or_flight_option_2_good_result"); + leaveEncounterWithoutBattle(scene); } }) .build()) diff --git a/src/data/mystery-encounters/mystery-encounter-utils.ts b/src/data/mystery-encounters/mystery-encounter-utils.ts index 8cd4963daa1..dcbcc753d32 100644 --- a/src/data/mystery-encounters/mystery-encounter-utils.ts +++ b/src/data/mystery-encounters/mystery-encounter-utils.ts @@ -10,8 +10,12 @@ import Trainer, {TrainerVariant} from "../../field/trainer"; import {PokemonExpBoosterModifier} from "#app/modifier/modifier"; import { CustomModifierSettings, + getModifierPoolForType, ModifierPoolType, + ModifierType, ModifierTypeFunc, + ModifierTypeGenerator, + modifierTypes, PokemonHeldItemModifierType, regenerateModifierPoolThresholds } from "#app/modifier/modifier-type"; @@ -31,6 +35,7 @@ import {Mode} from "#app/ui/ui"; import {PartyOption, PartyUiMode} from "#app/ui/party-ui-handler"; import {OptionSelectConfig, OptionSelectItem} from "#app/ui/abstact-option-select-ui-handler"; import {WIGHT_INCREMENT_ON_SPAWN_MISS} from "#app/data/mystery-encounters/mystery-encounters"; +import {getBBCodeFrag, TextStyle} from "#app/ui/text"; /** * @@ -162,21 +167,35 @@ export function koPlayerPokemon(pokemon: PlayerPokemon) { pokemon.updateInfo(); } -export function getTextWithEncounterDialogueTokens(scene: BattleScene, textKey: TemplateStringsArray | `mysteryEncounter:${string}`): string { +export function getTextWithEncounterDialogueTokensAndColor(scene: BattleScene, textKey: TemplateStringsArray | `mysteryEncounter:${string}`, primaryStyle: TextStyle = TextStyle.MESSAGE): string { if (isNullOrUndefined(textKey)) { return null; } let textString: string = i18next.t(textKey); - const dialogueTokens = scene.currentBattle?.mysteryEncounter?.dialogueTokens; + // Apply primary styling before anything else, if it exists + textString = getBBCodeFrag(textString, primaryStyle) + "[/color][/shadow]"; + const primaryStyleString = [...textString.match(new RegExp(/\[color=[^\[]*\]\[shadow=[^\[]*\]/i))][0]; + // Apply dialogue tokens + const dialogueTokens = scene.currentBattle?.mysteryEncounter?.dialogueTokens; if (dialogueTokens) { dialogueTokens.forEach((value) => { textString = textString.replace(value[0], value[1]); }); } + // Set custom colors + // Looks for any pattern like this: @ecCol[SUMMARY_BLUE]{my text to color} + // Resulting in: "my text to color" string with TextStyle.SUMMARY_BLUE + textString = textString.replace(/@ecCol\[([^{]*)\]{([^}]*)}/gi, (substring, textStyle: string, textToColor: string) => { + return "[/color][/shadow]" + getBBCodeFrag(textToColor, TextStyle[textStyle]) + "[/color][/shadow]" + primaryStyleString; + }); + + // Remove extra style block at the end + textString = textString.replace(/\[color=[^\[]*\]\[shadow=[^\[]*\]\[\/color\]\[\/shadow\]/gi, ""); + return textString; } @@ -186,7 +205,7 @@ export function getTextWithEncounterDialogueTokens(scene: BattleScene, textKey: * @param contentKey */ export function queueEncounterMessage(scene: BattleScene, contentKey: TemplateStringsArray | `mysteryEncounter:${string}`): void { - const text: string = getTextWithEncounterDialogueTokens(scene, contentKey); + const text: string = getTextWithEncounterDialogueTokensAndColor(scene, contentKey, TextStyle.MESSAGE); scene.queueMessage(text, null, true); } @@ -197,7 +216,7 @@ export function queueEncounterMessage(scene: BattleScene, contentKey: TemplateSt */ export function showEncounterText(scene: BattleScene, contentKey: TemplateStringsArray | `mysteryEncounter:${string}`): Promise { return new Promise(resolve => { - const text: string = getTextWithEncounterDialogueTokens(scene, contentKey); + const text: string = getTextWithEncounterDialogueTokensAndColor(scene, contentKey, TextStyle.MESSAGE); scene.ui.showText(text, null, () => resolve(), 0, true); }); } @@ -210,8 +229,8 @@ export function showEncounterText(scene: BattleScene, contentKey: TemplateString * @param callback */ export function showEncounterDialogue(scene: BattleScene, textContentKey: TemplateStringsArray | `mysteryEncounter:${string}`, speakerContentKey: TemplateStringsArray | `mysteryEncounter:${string}`, callback?: Function) { - const text: string = getTextWithEncounterDialogueTokens(scene, textContentKey); - const speaker: string = getTextWithEncounterDialogueTokens(scene, speakerContentKey); + const text: string = getTextWithEncounterDialogueTokensAndColor(scene, textContentKey, TextStyle.MESSAGE); + const speaker: string = getTextWithEncounterDialogueTokensAndColor(scene, speakerContentKey); scene.ui.showDialogue(text, speaker, null, callback, 0, 0); } @@ -399,6 +418,50 @@ export async function initBattleWithEnemyConfig(scene: BattleScene, partyConfig: } } +/** + * Will update player money, and animate change (sound optional) + * @param scene - Battle Scene + * @param changeValue + * @param playSound + */ +export function updatePlayerMoney(scene: BattleScene, changeValue: number, playSound: boolean = true) { + scene.money += changeValue; + scene.updateMoneyText(); + scene.animateMoneyChanged(false); + if (playSound) { + scene.playSound("buy"); + } +} + +/** + * Converts modifier bullshit to an actual item + * @param scene - Battle Scene + * @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]?.(); + + // Gets tier of item by checking player item pool + const modifierPool = getModifierPoolForType(ModifierPoolType.PLAYER); + Object.keys(modifierPool).every(modifierTier => { + const modType = modifierPool[modifierTier].find(m => { + if (m.modifierType.id === modifierId) { + return m; + } + }); + if (modType) { + result = modType.modifierType; + return false; + } + return true; + }); + + result = result instanceof ModifierTypeGenerator ? result.generateType(scene.getParty(), pregenArgs) : result; + return result; +} + /** * Will initialize reward phases to follow the mystery encounter * Can have shop displayed or skipped @@ -439,8 +502,9 @@ export function setCustomEncounterRewards(scene: BattleScene, customShopRewards? * @param onPokemonSelected - Any logic that needs to be performed when Pokemon is chosen * If a second option needs to be selected, onPokemonSelected should return a OptionSelectItem[] object * @param onPokemonNotSelected - Any logic that needs to be performed if no Pokemon is chosen + * @param selectablePokemonFilter */ -export function selectPokemonForOption(scene: BattleScene, onPokemonSelected: (pokemon: PlayerPokemon) => void | OptionSelectItem[], onPokemonNotSelected?: () => void): Promise { +export function selectPokemonForOption(scene: BattleScene, onPokemonSelected: (pokemon: PlayerPokemon) => void | OptionSelectItem[], onPokemonNotSelected?: () => void, selectablePokemonFilter?: (pokemon: PlayerPokemon) => string): Promise { return new Promise(resolve => { // Open party screen to choose pokemon to train scene.ui.setMode(Mode.PARTY, PartyUiMode.SELECT, -1, (slotIndex: integer, option: PartyOption) => { @@ -493,7 +557,7 @@ export function selectPokemonForOption(scene: BattleScene, onPokemonSelected: (p if (!textPromptKey) { displayOptions(); } else { - const secondOptionSelectPrompt = getTextWithEncounterDialogueTokens(scene, textPromptKey); + const secondOptionSelectPrompt = getTextWithEncounterDialogueTokensAndColor(scene, textPromptKey, TextStyle.MESSAGE); scene.ui.showText(secondOptionSelectPrompt, null, displayOptions, null, true); } }); @@ -506,7 +570,7 @@ export function selectPokemonForOption(scene: BattleScene, onPokemonSelected: (p resolve(false); }); } - }); + }, selectablePokemonFilter); }); } diff --git a/src/data/mystery-encounters/mystery-encounters.ts b/src/data/mystery-encounters/mystery-encounters.ts index 918868d3d2c..003b544ce50 100644 --- a/src/data/mystery-encounters/mystery-encounters.ts +++ b/src/data/mystery-encounters/mystery-encounters.ts @@ -7,6 +7,8 @@ import {TrainingSessionEncounter} from "#app/data/mystery-encounters/training-se import { Biome } from "#app/enums/biome"; import { SleepingSnorlaxEncounter } from "./sleeping-snorlax"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; +import {DepartmentStoreSaleEncounter} from "#app/data/mystery-encounters/department-store-sale"; +import {ShadyVitaminDealerEncounter} from "#app/data/mystery-encounters/shady-vitamin-dealer"; // Spawn chance: (BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT + WIGHT_INCREMENT_ON_SPAWN_MISS * ) / 256 export const BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT = 1; @@ -19,18 +21,20 @@ export const allMysteryEncounters : {[encounterType:string]: MysteryEncounter} = // To enable an encounter in all biomes, do not add to this map export const mysteryEncountersByBiome = new Map([ [Biome.TOWN, [ + MysteryEncounterType.DEPARTMENT_STORE_SALE ]], [Biome.PLAINS,[ - + MysteryEncounterType.DEPARTMENT_STORE_SALE ]], [Biome.GRASS, [ - MysteryEncounterType.SLEEPING_SNORLAX + MysteryEncounterType.SLEEPING_SNORLAX, + MysteryEncounterType.DEPARTMENT_STORE_SALE ]], [Biome.TALL_GRASS, [ - + MysteryEncounterType.DEPARTMENT_STORE_SALE ]], [Biome.METROPOLIS, [ - + MysteryEncounterType.DEPARTMENT_STORE_SALE ]], [Biome.FOREST, [ MysteryEncounterType.SLEEPING_SNORLAX @@ -43,7 +47,7 @@ export const mysteryEncountersByBiome = new Map([ ]], [Biome.BEACH, [ - + MysteryEncounterType.DEPARTMENT_STORE_SALE ]], [Biome.LAKE, [ @@ -67,10 +71,10 @@ export const mysteryEncountersByBiome = new Map([ ]], [Biome.MEADOW, [ - + MysteryEncounterType.DEPARTMENT_STORE_SALE ]], [Biome.POWER_PLANT, [ - + MysteryEncounterType.DEPARTMENT_STORE_SALE ]], [Biome.VOLCANO, [ @@ -82,7 +86,7 @@ export const mysteryEncountersByBiome = new Map([ ]], [Biome.FACTORY, [ - + MysteryEncounterType.DEPARTMENT_STORE_SALE ]], [Biome.RUINS, [ @@ -97,7 +101,7 @@ export const mysteryEncountersByBiome = new Map([ ]], [Biome.CONSTRUCTION_SITE, [ - + MysteryEncounterType.DEPARTMENT_STORE_SALE ]], [Biome.JUNGLE, [ @@ -109,7 +113,7 @@ export const mysteryEncountersByBiome = new Map([ ]], [Biome.SLUM, [ - + MysteryEncounterType.DEPARTMENT_STORE_SALE ]], [Biome.SNOWY_FOREST, [ @@ -131,6 +135,8 @@ export function initMysteryEncounters() { allMysteryEncounters[MysteryEncounterType.FIGHT_OR_FLIGHT] = FightOrFlightEncounter; allMysteryEncounters[MysteryEncounterType.TRAINING_SESSION] = TrainingSessionEncounter; allMysteryEncounters[MysteryEncounterType.SLEEPING_SNORLAX] = SleepingSnorlaxEncounter; + allMysteryEncounters[MysteryEncounterType.DEPARTMENT_STORE_SALE] = DepartmentStoreSaleEncounter; + allMysteryEncounters[MysteryEncounterType.SHADY_VITAMIN_DEALER] = ShadyVitaminDealerEncounter; // Append encounters that can occur in any biome to biome map const anyBiomeEncounters: MysteryEncounterType[] = Object.keys(MysteryEncounterType).filter(e => !isNaN(Number(e))).map(k => Number(k) as MysteryEncounterType); diff --git a/src/data/mystery-encounters/shady-vitamin-dealer.ts b/src/data/mystery-encounters/shady-vitamin-dealer.ts new file mode 100644 index 00000000000..bd2e6094748 --- /dev/null +++ b/src/data/mystery-encounters/shady-vitamin-dealer.ts @@ -0,0 +1,148 @@ +import BattleScene from "../../battle-scene"; +import { + generateModifierType, + leaveEncounterWithoutBattle, + queueEncounterMessage, + selectPokemonForOption, + setCustomEncounterRewards, + updatePlayerMoney, +} from "#app/data/mystery-encounters/mystery-encounter-utils"; +import MysteryEncounter, {MysteryEncounterBuilder, MysteryEncounterTier} from "../mystery-encounter"; +import {MysteryEncounterType} from "#enums/mystery-encounter-type"; +import { + HealthRatioRequirement, + MoneyRequirement, + StatusEffectRequirement, + WaveCountRequirement +} from "../mystery-encounter-requirements"; +import {MysteryEncounterOptionBuilder} from "../mystery-encounter-option"; +import {modifierTypes} from "#app/modifier/modifier-type"; +import {Species} from "#enums/species"; +import {randSeedInt} from "#app/utils"; +import Pokemon, {PlayerPokemon} from "#app/field/pokemon"; +import {StatusEffect} from "#app/data/status-effect"; + +export const ShadyVitaminDealerEncounter: MysteryEncounter = new MysteryEncounterBuilder() + .withEncounterType(MysteryEncounterType.SHADY_VITAMIN_DEALER) + .withEncounterTier(MysteryEncounterTier.COMMON) + .withIntroSpriteConfigs([ + { + spriteKey: Species.KROOKODILE.toString(), + fileRoot: "pokemon", + hasShadow: true, + repeat: true, + x: 10, + y: -1 + }, + { + spriteKey: "b2w2_veteran_m", + fileRoot: "mystery-encounters", + hasShadow: true, + x: -10, + y: 2 + } + ]) + .withSceneRequirement(new WaveCountRequirement([10, 180])) + .withPrimaryPokemonRequirement(new StatusEffectRequirement([StatusEffect.NONE])) // Pokemon must not have status + .withPrimaryPokemonRequirement(new HealthRatioRequirement([0.34, 1])) // Pokemon must have above 1/3rd HP + .withOption(new MysteryEncounterOptionBuilder() + .withSceneRequirement(new MoneyRequirement(0, 2)) // Wave scaling multiplier of 2 for cost + .withPreOptionPhase(async (scene: BattleScene): Promise => { + const encounter = scene.currentBattle.mysteryEncounter; + const onPokemonSelected = (pokemon: PlayerPokemon) => { + // Update money + 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) + ]; + encounter.setDialogueToken("boost1", modifiers[0].name); + encounter.setDialogueToken("boost2", modifiers[1].name); + encounter.misc = { + chosenPokemon: pokemon, + modifiers: modifiers + }; + }; + + // Only Pokemon that can gain benefits are unfainted with no status + const selectableFilter = (pokemon: Pokemon) => { + // If pokemon meets primary pokemon reqs, it can be selected + const meetsReqs = encounter.pokemonMeetsPrimaryRequirements(scene, pokemon); + if (!meetsReqs) { + return "Pokémon must be healthy enough."; + } + + return null; + }; + + return selectPokemonForOption(scene, onPokemonSelected, null, selectableFilter); + }) + .withOptionPhase(async (scene: BattleScene) => { + // Choose Cheap Option + const encounter = scene.currentBattle.mysteryEncounter; + const chosenPokemon = encounter.misc.chosenPokemon; + const modifiers = encounter.misc.modifiers; + + for (const modType of modifiers) { + const modifier = modType.newModifier(chosenPokemon); + await scene.addModifier(modifier, true, false, false, true); + } + scene.updateModifiers(true); + + leaveEncounterWithoutBattle(scene); + }) + .withPostOptionPhase(async (scene: BattleScene) => { + // Damage and status applied after dealer leaves (to make thematic sense) + const encounter = scene.currentBattle.mysteryEncounter; + const chosenPokemon = encounter.misc.chosenPokemon; + + // Pokemon takes 1/3 max HP damage + const damage = Math.round(chosenPokemon.getMaxHp() / 3); + chosenPokemon.hp = Math.max(chosenPokemon.hp - damage, 0); + + // Roll for poison (80%) + if (randSeedInt(10) < 10) { + if (chosenPokemon.trySetStatus(StatusEffect.TOXIC)) { + // Toxic applied + queueEncounterMessage(scene, "mysteryEncounter:shady_vitamin_dealer_bad_poison"); + } else { + // Pokemon immune or something else prevents status + queueEncounterMessage(scene, "mysteryEncounter:shady_vitamin_dealer_damage_only"); + } + } else { + queueEncounterMessage(scene, "mysteryEncounter:shady_vitamin_dealer_damage_only"); + } + + chosenPokemon.updateInfo(); + }) + .build()) + .withOption(new MysteryEncounterOptionBuilder() + .withSceneRequirement(new MoneyRequirement(0, 5)) // Wave scaling multiplier of 2 for cost + .withOptionPhase(async (scene: BattleScene) => { + // Choose Expensive Option + const modifiers = []; + let i = 0; + while (i < 3) { + // 2/1 weight on base stat booster vs PP Up + const roll = randSeedInt(3); + if (roll === 0) { + modifiers.push(modifierTypes.PP_UP); + } else { + + } + i++; + } + + setCustomEncounterRewards(scene, { guaranteedModifierTypeFuncs: modifiers, fillRemaining: false}); + leaveEncounterWithoutBattle(scene); + }) + .build()) + .withOption(new MysteryEncounterOptionBuilder() + .withOptionPhase(async (scene: BattleScene) => { + // Leave encounter with no rewards or exp + leaveEncounterWithoutBattle(scene, true); + return true; + }) + .build()) + .build(); diff --git a/src/data/mystery-encounters/sleeping-snorlax.ts b/src/data/mystery-encounters/sleeping-snorlax.ts index 56baa4ea1e7..bf53ad72593 100644 --- a/src/data/mystery-encounters/sleeping-snorlax.ts +++ b/src/data/mystery-encounters/sleeping-snorlax.ts @@ -1,7 +1,7 @@ import BattleScene from "../../battle-scene"; import { EnemyPartyConfig, - EnemyPokemonConfig, + EnemyPokemonConfig, generateModifierType, initBattleWithEnemyConfig, leaveEncounterWithoutBattle, queueEncounterMessage, setCustomEncounterRewards @@ -12,7 +12,6 @@ import {MysteryEncounterType} from "#enums/mystery-encounter-type"; import {MoveRequirement, WaveCountRequirement} from "../mystery-encounter-requirements"; import {MysteryEncounterOptionBuilder} from "../mystery-encounter-option"; import { - ModifierTypeGenerator, ModifierTypeOption, modifierTypes } from "#app/modifier/modifier-type"; @@ -76,7 +75,8 @@ export const SleepingSnorlaxEncounter: MysteryEncounter = new MysteryEncounterBu const p = instance.primaryPokemon; p.status = new Status(StatusEffect.SLEEP, 0, 3); p.updateInfo(true); - const sitrus = (modifierTypes.BERRY?.() as ModifierTypeGenerator).generateType(scene.getParty(), [BerryType.SITRUS]); + // const sitrus = (modifierTypes.BERRY?.() as ModifierTypeGenerator).generateType(scene.getParty(), [BerryType.SITRUS]); + const sitrus = generateModifierType(scene, modifierTypes.BERRY, [BerryType.SITRUS]); setCustomEncounterRewards(scene, { guaranteedModifierTypeOptions: [new ModifierTypeOption(sitrus, 0)], fillRemaining: false}); queueEncounterMessage(scene, "mysteryEncounter:sleeping_snorlax_option_2_bad_result"); diff --git a/src/data/mystery-encounters/training-session.ts b/src/data/mystery-encounters/training-session.ts index 9866a2785a1..c833c37c06f 100644 --- a/src/data/mystery-encounters/training-session.ts +++ b/src/data/mystery-encounters/training-session.ts @@ -1,7 +1,7 @@ import BattleScene from "../../battle-scene"; import { EnemyPartyConfig, - getTextWithEncounterDialogueTokens, + getTextWithEncounterDialogueTokensAndColor, initBattleWithEnemyConfig, selectPokemonForOption, setCustomEncounterRewards @@ -128,7 +128,7 @@ export const TrainingSessionEncounter: MysteryEncounter = new MysteryEncounterBu scene.addModifier(mod, true, false, false, true); } scene.updateModifiers(true); - scene.queueMessage(getTextWithEncounterDialogueTokens(scene, "mysteryEncounter:training_session_battle_finished_1"), null, true); + scene.queueMessage(getTextWithEncounterDialogueTokensAndColor(scene, "mysteryEncounter:training_session_battle_finished_1"), null, true); }; setCustomEncounterRewards(scene, { fillRemaining: true }, null, onBeforeRewardsPhase); @@ -174,7 +174,7 @@ export const TrainingSessionEncounter: MysteryEncounter = new MysteryEncounterBu scene.removePokemonFromPlayerParty(playerPokemon, false); const onBeforeRewardsPhase = () => { - scene.queueMessage(getTextWithEncounterDialogueTokens(scene, "mysteryEncounter:training_session_battle_finished_2"), null, true); + scene.queueMessage(getTextWithEncounterDialogueTokensAndColor(scene, "mysteryEncounter:training_session_battle_finished_2"), null, true); // Add the pokemon back to party with Nature change playerPokemon.setNature(encounter.misc.chosenNature); scene.gameData.setPokemonCaught(playerPokemon, false); @@ -237,7 +237,7 @@ export const TrainingSessionEncounter: MysteryEncounter = new MysteryEncounterBu scene.removePokemonFromPlayerParty(playerPokemon, false); const onBeforeRewardsPhase = () => { - scene.queueMessage(getTextWithEncounterDialogueTokens(scene, "mysteryEncounter:training_session_battle_finished_3"), null, true); + scene.queueMessage(getTextWithEncounterDialogueTokensAndColor(scene, "mysteryEncounter:training_session_battle_finished_3"), null, true); // Add the pokemon back to party with ability change const abilityIndex = encounter.misc.abilityIndex; if (!!playerPokemon.getFusionSpeciesForm()) { diff --git a/src/enums/mystery-encounter-type.ts b/src/enums/mystery-encounter-type.ts index a29a409103d..6e2815babca 100644 --- a/src/enums/mystery-encounter-type.ts +++ b/src/enums/mystery-encounter-type.ts @@ -4,5 +4,7 @@ export enum MysteryEncounterType { DARK_DEAL, FIGHT_OR_FLIGHT, SLEEPING_SNORLAX, - TRAINING_SESSION + TRAINING_SESSION, + DEPARTMENT_STORE_SALE, + SHADY_VITAMIN_DEALER } diff --git a/src/field/mystery-encounter-intro.ts b/src/field/mystery-encounter-intro.ts index 82e9bb49f89..8fdbd27ac9b 100644 --- a/src/field/mystery-encounter-intro.ts +++ b/src/field/mystery-encounter-intro.ts @@ -79,12 +79,12 @@ export default class MysteryEncounterIntroVisuals extends Phaser.GameObjects.Con // Sprite offset from origin if (config.x || config.y) { if (config.x) { - sprite.x = origin + config.x; - tintSprite.x = origin + config.x; + sprite.setPosition(origin + config.x, sprite.y); + tintSprite.setPosition(origin + config.x, tintSprite.y); } if (config.y) { - sprite.y = origin + config.y; - tintSprite.y = origin + config.y; + sprite.setPosition(sprite.x, config.y); + tintSprite.setPosition(tintSprite.x, config.y); } } else { // Single sprite diff --git a/src/locales/en/mystery-encounter.ts b/src/locales/en/mystery-encounter.ts index f6b3a80e0ec..9fe63b33f58 100644 --- a/src/locales/en/mystery-encounter.ts +++ b/src/locales/en/mystery-encounter.ts @@ -1,17 +1,28 @@ import {SimpleTranslationEntries} from "#app/interfaces/locales"; +/** + * Patterns that can be used: + * '$' will be treated as a new line for Message and Dialogue strings + * '@d{}' will add a time delay to text animation for Message and Dialogue strings + * + * '@ec{}' will auto-inject the matching token value for the specified Encounter + * + * '@ecCol[]{}' will auto-color the given text to a specified TextStyle (e.g. TextStyle.SUMMARY_GREEN) + * + * Any '(+)' or '(-)' type of tooltip will auto-color to green/blue respectively. THIS ONLY OCCURS FOR OPTION TOOLTIPS, NOWHERE ELSE + * Other types of '(...)' tooltips will have to specify the text color manually by using '@ecCol[SUMMARY_GREEN]{}' pattern + */ export const mysteryEncounter: SimpleTranslationEntries = { // DO NOT REMOVE "unit_test_dialogue": "@ec{test}@ec{test} @ec{test@ec{test}} @ec{test1} @ec{test\} @ec{test\\} @ec{test\\\} {test}", - // Mysterious Encounters -- Common Tier - + // Mystery Encounters -- Common Tier "mysterious_chest_intro_message": "You found...@d{32} a chest?", "mysterious_chest_title": "The Mysterious Chest", "mysterious_chest_description": "A beautifully ornamented chest stands on the ground. There must be something good inside... right?", "mysterious_chest_query": "Will you open it?", "mysterious_chest_option_1_label": "Open it", - "mysterious_chest_option_1_tooltip": "(35%) Something terrible\n(40%) Okay Rewards\n(20%) Good Rewards\n(4%) Great Rewards\n(1%) Amazing Rewards", + "mysterious_chest_option_1_tooltip": "@ecCol[SUMMARY_BLUE]{(35%) Something terrible}\n@ecCol[SUMMARY_GREEN]{(40%) Okay Rewards}\n@ecCol[SUMMARY_GREEN]{(20%) Good Rewards}\n@ecCol[SUMMARY_GREEN]{(4%) Great Rewards}\n@ecCol[SUMMARY_GREEN]{(1%) Amazing Rewards}", "mysterious_chest_option_2_label": "It's too risky, leave", "mysterious_chest_option_2_tooltip": "(-) No Rewards", "mysterious_chest_option_1_selected_message": "You open the chest to find...", @@ -27,36 +38,82 @@ export const mysteryEncounter: SimpleTranslationEntries = { "fight_or_flight_title": "Fight or Flight", "fight_or_flight_description": "It looks like there's a strong Pokémon guarding an item. Battling is the straightforward approach, but this Pokémon looks strong. You could also try to sneak around, though the Pokémon might catch you.", "fight_or_flight_query": "What will you do?", - "fight_or_flight_option_1_label": "Battle it", - "fight_or_flight_option_1_tooltip": "(+) Hard Battle\n(+) New Item", - "fight_or_flight_option_2_label": "Sneak around", - "fight_or_flight_option_2_tooltip": "(35%) Steal Item\n(65%) Harder Battle", + "fight_or_flight_option_1_label": "Battle the Pokémon", + "fight_or_flight_option_1_tooltip": "(-) Hard Battle\n(+) New Item", + "fight_or_flight_option_2_label": "Steal the item", + "fight_or_flight_option_2_tooltip": "@ecCol[SUMMARY_GREEN]{(35%) Steal Item}\n@ecCol[SUMMARY_BLUE]{(65%) Harder Battle}", + "fight_or_flight_option_2_steal_tooltip": "@ecCol[SUMMARY_GREEN]{(?) Use a Pokémon Move}", "fight_or_flight_option_3_label": "Leave", "fight_or_flight_option_3_tooltip": "(-) No Rewards", "fight_or_flight_option_1_selected_message": "You approach the\nPokémon without fear.", "fight_or_flight_option_2_good_result": `.@d{32}.@d{32}.@d{32} $You manage to sneak your way\npast and grab the item!`, + "fight_or_flight_option_2_steal_result": `.@d{32}.@d{32}.@d{32} + $Your @ec{thiefPokemon} helps you out and uses @ec{move}! + $ You nabbed the item!`, "fight_or_flight_option_2_bad_result": `.@d{32}.@d{32}.@d{32} $The Pokémon catches you\nas you try to sneak around!`, "fight_or_flight_boss_enraged": "The opposing @ec{enemyPokemon} has become enraged!", "fight_or_flight_option_3_selected": "You leave the strong Pokémon\nwith its prize and continue on.", - // Mysterious Encounters -- Uncommon Tier + "department_store_sale_intro_message": "It's a lady with a ton of shopping bags.", + "department_store_sale_speaker": "Shopper", + "department_store_sale_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!`, + "department_store_sale_title": "Department Store Sale", + "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!", + "department_store_sale_query": "Which counter will you go to?", + "department_store_sale_option_1_label": "TM Counter", + "department_store_sale_option_1_tooltip": "(+) TM Shop", + "department_store_sale_option_2_label": "Vitamin Counter", + "department_store_sale_option_2_tooltip": "(+) Vitamin Shop", + "department_store_sale_option_3_label": "Battle Item Counter", + "department_store_sale_option_3_tooltip": "(+) X Item Shop", + "department_store_sale_option_4_label": "Pokéball Counter", + "department_store_sale_option_4_tooltip": "(+) Pokéball Shop", + "department_store_sale_outro": "What a deal! You should shop there more often.", + + "shady_vitamin_dealer_intro_message": "A man in a dark coat approaches you.", + "shady_vitamin_dealer_speaker": "Shady Salesman", + "shady_vitamin_dealer_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.`, + "shady_vitamin_dealer_title": "The Vitamin Dealer", + "shady_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.", + "shady_vitamin_dealer_query": "Which deal will choose?", + "shady_vitamin_dealer_option_1_label": "The Cheap Deal", + "shady_vitamin_dealer_option_1_tooltip": "(-) Pay @ec{option1Money}\n(-) Side Effects?\n(+) Chosen Pokémon Gains 2 Random Vitamins", + "shady_vitamin_dealer_option_2_label": "The Pricey Deal", + "shady_vitamin_dealer_option_2_tooltip": "(-) Pay @ec{option2Money}\n(-) Side Effects?\n(+) Chosen Pokémon Gains 2 Random Vitamins", + "shady_vitamin_dealer_option_selected": `The man hands you two bottles and quickly disappears. + $@ec{selectedPokemon} gained @ec{boost1} and @ec{boost2} boosts!`, + "shady_vitamin_dealer_damage_only": `But the medicine had some side effects! + $Your @ec{selectedPokemon} takes some damage...`, + "shady_vitamin_dealer_bad_poison": `But the medicine had some side effects! + $Your @ec{selectedPokemon} takes some damage\nand becomes badly poisoned...`, + "shady_vitamin_dealer_poison": `But the medicine had some side effects! + $Your @ec{selectedPokemon} becomes poisoned...`, + "shady_vitamin_dealer_option_3_label": "Leave", + "shady_vitamin_dealer_option_3_tooltip": "(-) No Rewards", + "shady_vitamin_dealer_outro_good": "Looks like there were no side-effects this time.", + + // Mystery Encounters -- Uncommon Tier "mysterious_challengers_intro_message": "Mysterious challengers have appeared!", "mysterious_challengers_title": "Mysterious Challengers", "mysterious_challengers_description": "If you defeat a challenger, you might impress them enough to receive a boon. But some look tough, are you up to the challenge?", "mysterious_challengers_query": "Who will you battle?", "mysterious_challengers_option_1_label": "A clever, mindful foe", - "mysterious_challengers_option_1_tooltip": "(+) Standard Battle\n(+) Move Item Rewards", + "mysterious_challengers_option_1_tooltip": "(-) Standard Battle\n(+) Move Item Rewards", "mysterious_challengers_option_2_label": "A strong foe", - "mysterious_challengers_option_2_tooltip": "(+) Hard Battle\n(+) Good Rewards", + "mysterious_challengers_option_2_tooltip": "(-) Hard Battle\n(+) Good Rewards", "mysterious_challengers_option_3_label": "The mightiest foe", - "mysterious_challengers_option_3_tooltip": "(+) Brutal Battle\n(+) Great Rewards", + "mysterious_challengers_option_3_tooltip": "(-) Brutal Battle\n(+) Great Rewards", "mysterious_challengers_option_selected_message": "The trainer steps forward...", "mysterious_challengers_outro_win": "The mysterious challenger was defeated!", - // Mysterious Encounters -- Rare Tier + // Mystery Encounters -- Rare Tier "training_session_intro_message": "You've come across some\ntraining tools and supplies.", "training_session_title": "Training Session", "training_session_description": "These supplies look like they could be used to train a member of your party! There are a few ways you could train your Pokémon, by battling against it with the rest of your team.", @@ -78,7 +135,7 @@ export const mysteryEncounter: SimpleTranslationEntries = { $Its ability was changed to @ec{ability}!`, "training_session_outro_win": "That was a successful training session!", - // Mysterious Encounters -- Super Rare Tier + // Mystery Encounters -- Super Rare Tier "dark_deal_intro_message": "A strange man in a tattered coat\nstands in your way...", "dark_deal_speaker": "Shady Guy", @@ -108,9 +165,9 @@ export const mysteryEncounter: SimpleTranslationEntries = { "sleeping_snorlax_description": "You could attack it to try and get it to move, or simply wait for it to wake up.", "sleeping_snorlax_query": "What will you do?", "sleeping_snorlax_option_1_label": "Fight it", - "sleeping_snorlax_option_1_tooltip": "(+) Fight Sleeping Snorlax", + "sleeping_snorlax_option_1_tooltip": "(-) Fight Sleeping Snorlax", "sleeping_snorlax_option_2_label": "Wait for it to move", - "sleeping_snorlax_option_2_tooltip": "(75%) Wait a short time\n(25%) Wait a long time", + "sleeping_snorlax_option_2_tooltip": "@ecCol[SUMMARY_BLUE]{(75%) Wait a short time}\n@ecCol[SUMMARY_BLUE]{(25%) Wait a long time}", "sleeping_snorlax_option_3_label": "Steal", "sleeping_snorlax_option_3_tooltip": "(+) Leftovers", "sleeping_snorlax_option_3_disabled_tooltip": "Your Pokémon need to know certain moves to choose this", diff --git a/src/overrides.ts b/src/overrides.ts index 6634ca32788..f3ac35e2075 100644 --- a/src/overrides.ts +++ b/src/overrides.ts @@ -118,9 +118,9 @@ export const EGG_GACHA_PULL_COUNT_OVERRIDE: number = 0; */ // 1 to 256, set to null to ignore -export const MYSTERY_ENCOUNTER_RATE_OVERRIDE: number = null; +export const MYSTERY_ENCOUNTER_RATE_OVERRIDE: number = 256; export const MYSTERY_ENCOUNTER_TIER_OVERRIDE: MysteryEncounterTier = null; -export const MYSTERY_ENCOUNTER_OVERRIDE: MysteryEncounterType = null; +export const MYSTERY_ENCOUNTER_OVERRIDE: MysteryEncounterType = MysteryEncounterType.SHADY_VITAMIN_DEALER; /** * MODIFIER / ITEM OVERRIDES diff --git a/src/phases/mystery-encounter-phase.ts b/src/phases/mystery-encounter-phase.ts index 1cd04339b84..b928d98834c 100644 --- a/src/phases/mystery-encounter-phase.ts +++ b/src/phases/mystery-encounter-phase.ts @@ -3,7 +3,7 @@ import BattleScene from "../battle-scene"; import { Phase } from "../phase"; import { Mode } from "../ui/ui"; import { - getTextWithEncounterDialogueTokens + getTextWithEncounterDialogueTokensAndColor } from "../data/mystery-encounters/mystery-encounter-utils"; import { CheckSwitchPhase, NewBattlePhase, PostSummonPhase, ReturnPhase, ScanIvsPhase, SummonPhase, ToggleDoublePositionPhase } from "../phases"; import MysteryEncounterOption from "../data/mystery-encounter-option"; @@ -89,9 +89,9 @@ export class MysteryEncounterPhase extends Phase { const nextAction = i === selectedDialogue.length - 1 ? endDialogueAndContinueEncounter : showNextDialogue; const dialogue = selectedDialogue[i]; let title: string = null; - const text: string = getTextWithEncounterDialogueTokens(this.scene, dialogue.text); + const text: string = getTextWithEncounterDialogueTokensAndColor(this.scene, dialogue.text); if (dialogue.speaker) { - title = getTextWithEncounterDialogueTokens(this.scene, dialogue.speaker); + title = getTextWithEncounterDialogueTokensAndColor(this.scene, dialogue.speaker); } if (title) { @@ -451,9 +451,9 @@ export class PostMysteryEncounterPhase extends Phase { const nextAction = i === outroDialogue.length - 1 ? endPhase : showNextDialogue; const dialogue = outroDialogue[i]; let title: string = null; - const text: string = getTextWithEncounterDialogueTokens(this.scene, dialogue.text); + const text: string = getTextWithEncounterDialogueTokensAndColor(this.scene, dialogue.text); if (dialogue.speaker) { - title = getTextWithEncounterDialogueTokens(this.scene, dialogue.speaker); + title = getTextWithEncounterDialogueTokensAndColor(this.scene, dialogue.speaker); } this.scene.ui.setMode(Mode.MESSAGE); diff --git a/src/test/mystery-encounter/mystery-encounter-utils.test.ts b/src/test/mystery-encounter/mystery-encounter-utils.test.ts index 6f1bccd359c..63cbd83d975 100644 --- a/src/test/mystery-encounter/mystery-encounter-utils.test.ts +++ b/src/test/mystery-encounter/mystery-encounter-utils.test.ts @@ -3,7 +3,7 @@ import GameManager from "#app/test/utils/gameManager"; import Phaser from "phaser"; import { getHighestLevelPlayerPokemon, getLowestLevelPlayerPokemon, - getRandomPlayerPokemon, getRandomSpeciesByStarterTier, getTextWithEncounterDialogueTokens, + getRandomPlayerPokemon, getRandomSpeciesByStarterTier, getTextWithEncounterDialogueTokensAndColor, koPlayerPokemon, queueEncounterMessage, showEncounterDialogue, showEncounterText, } from "#app/data/mystery-encounters/mystery-encounter-utils"; import {initSceneWithoutEncounterPhase} from "#test/utils/gameManagerUtils"; @@ -272,12 +272,12 @@ describe("Mystery Encounter Utils", () => { }); describe("getTextWithEncounterDialogueTokens", () => { - it("injects dialogue tokens", () => { + it("injects dialogue tokens and color styling", () => { scene.currentBattle.mysteryEncounter = new MysteryEncounter(null); scene.currentBattle.mysteryEncounter.setDialogueToken("test", "value"); - const result = getTextWithEncounterDialogueTokens(scene, "mysteryEncounter:unit_test_dialogue"); - expect(result).toEqual("valuevalue @ec{testvalue} @ec{test1} value @ec{test\\} @ec{test\\} {test}"); + const result = getTextWithEncounterDialogueTokensAndColor(scene, "mysteryEncounter:unit_test_dialogue"); + expect(result).toEqual("[color=#f8f8f8][shadow=#6b5a73]valuevalue @ec{testvalue} @ec{test1} value @ec{test\\} @ec{test\\} {test}[/color][/shadow]"); }); it("can perform nested dialogue token injection", () => { @@ -285,8 +285,8 @@ describe("Mystery Encounter Utils", () => { scene.currentBattle.mysteryEncounter.setDialogueToken("test", "value"); scene.currentBattle.mysteryEncounter.setDialogueToken("testvalue", "new"); - const result = getTextWithEncounterDialogueTokens(scene, "mysteryEncounter:unit_test_dialogue"); - expect(result).toEqual("valuevalue new @ec{test1} value @ec{test\\} @ec{test\\} {test}"); + const result = getTextWithEncounterDialogueTokensAndColor(scene, "mysteryEncounter:unit_test_dialogue"); + expect(result).toEqual("[color=#f8f8f8][shadow=#6b5a73]valuevalue new @ec{test1} value @ec{test\\} @ec{test\\} {test}[/color][/shadow]"); }); }); @@ -298,7 +298,7 @@ describe("Mystery Encounter Utils", () => { const phaseSpy = vi.spyOn(game.scene, "unshiftPhase"); queueEncounterMessage(scene, "mysteryEncounter:unit_test_dialogue"); - expect(spy).toHaveBeenCalledWith("valuevalue @ec{testvalue} @ec{test1} value @ec{test\\} @ec{test\\} {test}", null, true); + expect(spy).toHaveBeenCalledWith("[color=#f8f8f8][shadow=#6b5a73]valuevalue @ec{testvalue} @ec{test1} value @ec{test\\} @ec{test\\} {test}[/color][/shadow]", null, true); expect(phaseSpy).toHaveBeenCalledWith(expect.any(MessagePhase)); }); }); @@ -310,7 +310,7 @@ describe("Mystery Encounter Utils", () => { const spy = vi.spyOn(game.scene.ui, "showText"); showEncounterText(scene, "mysteryEncounter:unit_test_dialogue"); - expect(spy).toHaveBeenCalledWith("valuevalue @ec{testvalue} @ec{test1} value @ec{test\\} @ec{test\\} {test}", null, expect.any(Function), 0, true); + expect(spy).toHaveBeenCalledWith("[color=#f8f8f8][shadow=#6b5a73]valuevalue @ec{testvalue} @ec{test1} value @ec{test\\} @ec{test\\} {test}[/color][/shadow]", null, expect.any(Function), 0, true); }); }); @@ -321,7 +321,7 @@ describe("Mystery Encounter Utils", () => { const spy = vi.spyOn(game.scene.ui, "showDialogue"); showEncounterDialogue(scene, "mysteryEncounter:unit_test_dialogue", "mysteryEncounter:unit_test_dialogue"); - expect(spy).toHaveBeenCalledWith("valuevalue @ec{testvalue} @ec{test1} value @ec{test\\} @ec{test\\} {test}", "valuevalue @ec{testvalue} @ec{test1} value @ec{test\\} @ec{test\\} {test}", null, undefined, 0, 0); + expect(spy).toHaveBeenCalledWith("[color=#f8f8f8][shadow=#6b5a73]valuevalue @ec{testvalue} @ec{test1} value @ec{test\\} @ec{test\\} {test}[/color][/shadow]", "[color=#f8f8f8][shadow=#6b5a73]valuevalue @ec{testvalue} @ec{test1} value @ec{test\\} @ec{test\\} {test}[/color][/shadow]", null, undefined, 0, 0); }); }); diff --git a/src/test/phases/mystery-encounter-phase.test.ts b/src/test/phases/mystery-encounter-phase.test.ts index 8d8bac79b5a..4374fc60bd6 100644 --- a/src/test/phases/mystery-encounter-phase.test.ts +++ b/src/test/phases/mystery-encounter-phase.test.ts @@ -84,7 +84,7 @@ describe("Mystery Encounter Phases", () => { expect(messageSpy).toHaveBeenCalledTimes(2); expect(dialogueSpy).toHaveBeenCalledWith("What's this?", "???", null, expect.any(Function)); expect(messageSpy).toHaveBeenCalledWith("Mysterious challengers have appeared!", null, expect.any(Function), 750, true); - expect(messageSpy).toHaveBeenCalledWith("The trainer steps forward...", null, expect.any(Function), 750, true); + expect(messageSpy).toHaveBeenCalledWith("[color=#f8f8f8][shadow=#6b5a73]The trainer steps forward...[/color][/shadow]", null, expect.any(Function), 750, true); }); }); diff --git a/src/ui/mystery-encounter-ui-handler.ts b/src/ui/mystery-encounter-ui-handler.ts index ce49a9f280d..862fa155bf4 100644 --- a/src/ui/mystery-encounter-ui-handler.ts +++ b/src/ui/mystery-encounter-ui-handler.ts @@ -1,16 +1,16 @@ import BattleScene from "../battle-scene"; -import { addTextObject, TextStyle } from "./text"; -import { Mode } from "./ui"; +import {addBBCodeTextObject, getBBCodeFrag, TextStyle} from "./text"; +import {Mode} from "./ui"; import UiHandler from "./ui-handler"; -import { Button } from "#enums/buttons"; -import { addWindow, WindowVariant } from "./ui-theme"; -import i18next from "i18next"; -import { MysteryEncounterPhase } from "../phases/mystery-encounter-phase"; -import { PartyUiMode } from "./party-ui-handler"; +import {Button} from "#enums/buttons"; +import {addWindow, WindowVariant} from "./ui-theme"; +import {MysteryEncounterPhase} from "../phases/mystery-encounter-phase"; +import {PartyUiMode} from "./party-ui-handler"; import MysteryEncounterOption from "../data/mystery-encounter-option"; import * as Utils from "../utils"; -import { getPokeballAtlasKey } from "../data/pokeball"; import {isNullOrUndefined} from "../utils"; +import {getPokeballAtlasKey} from "../data/pokeball"; +import {getTextWithEncounterDialogueTokensAndColor} from "#app/data/mystery-encounters/mystery-encounter-utils"; export default class MysteryEncounterUiHandler extends UiHandler { private cursorContainer: Phaser.GameObjects.Container; @@ -298,9 +298,9 @@ export default class MysteryEncounterUiHandler extends UiHandler { this.filteredEncounterOptions = mysteryEncounter.options; this.optionsMeetsReqs = []; - const titleText: string = i18next.t(mysteryEncounter.dialogue.encounterOptionsDialogue.title); - const descriptionText: string = i18next.t(mysteryEncounter.dialogue.encounterOptionsDialogue.description); - const queryText: string = i18next.t(mysteryEncounter.dialogue.encounterOptionsDialogue.query); + const titleText: string = getTextWithEncounterDialogueTokensAndColor(this.scene, mysteryEncounter.dialogue.encounterOptionsDialogue.title, TextStyle.TOOLTIP_TITLE); + const descriptionText: string = getTextWithEncounterDialogueTokensAndColor(this.scene, mysteryEncounter.dialogue.encounterOptionsDialogue.description, TextStyle.TOOLTIP_CONTENT); + const queryText: string = getTextWithEncounterDialogueTokensAndColor(this.scene, mysteryEncounter.dialogue.encounterOptionsDialogue.query, TextStyle.TOOLTIP_CONTENT); // Clear options container (except cursor) this.optionsContainer.removeAll(); @@ -310,16 +310,17 @@ export default class MysteryEncounterUiHandler extends UiHandler { let optionText; switch (this.filteredEncounterOptions.length) { case 2: - optionText = addTextObject(this.scene, i % 2 === 0 ? 0 : 100, 8, "-", TextStyle.WINDOW, { wordWrap: { width: 558 }, fontSize: "80px", lineSpacing: -8 }); + optionText = addBBCodeTextObject(this.scene, i % 2 === 0 ? 0 : 100, 8, "-", TextStyle.WINDOW, { wordWrap: { width: 558 }, fontSize: "80px", lineSpacing: -8 }); break; case 3: - optionText = addTextObject(this.scene, i % 2 === 0 ? 0 : 100, i < 2 ? 0 : 16, "-", TextStyle.WINDOW, { wordWrap: { width: 558 }, fontSize: "80px", lineSpacing: -8 }); + optionText = addBBCodeTextObject(this.scene, i % 2 === 0 ? 0 : 100, i < 2 ? 0 : 16, "-", TextStyle.WINDOW, { wordWrap: { width: 558 }, fontSize: "80px", lineSpacing: -8 }); break; case 4: - optionText = addTextObject(this.scene, i % 2 === 0 ? 0 : 100, i < 2 ? 0 : 16, "-", TextStyle.WINDOW, { wordWrap: { width: 558 }, fontSize: "80px", lineSpacing: -8 }); + optionText = addBBCodeTextObject(this.scene, i % 2 === 0 ? 0 : 100, i < 2 ? 0 : 16, "-", TextStyle.WINDOW, { wordWrap: { width: 558 }, fontSize: "80px", lineSpacing: -8 }); break; } - const text = i18next.t(mysteryEncounter.dialogue.encounterOptionsDialogue.options[i].buttonLabel); + const option = mysteryEncounter.dialogue.encounterOptionsDialogue.options[i]; + const text = getTextWithEncounterDialogueTokensAndColor(this.scene, option.buttonLabel, option.style ? option.style : TextStyle.WINDOW); if (text) { optionText.setText(text); } @@ -336,11 +337,11 @@ export default class MysteryEncounterUiHandler extends UiHandler { } // View Party Button - const viewPartyText = addTextObject(this.scene, 256, -24, "View Party", TextStyle.PARTY); + const viewPartyText = addBBCodeTextObject(this.scene, 256, -24, getBBCodeFrag("View Party", TextStyle.PARTY), TextStyle.PARTY); this.optionsContainer.add(viewPartyText); // Description Window - const titleTextObject = addTextObject(this.scene, 0, 0, titleText, TextStyle.TOOLTIP_TITLE, { wordWrap: { width: 750 }, align: "center", lineSpacing: -8 }); + const titleTextObject = addBBCodeTextObject(this.scene, 0, 0, titleText, TextStyle.TOOLTIP_TITLE, { wordWrap: { width: 750 }, align: "center", lineSpacing: -8 }); this.descriptionContainer.add(titleTextObject); titleTextObject.setPosition(72 - titleTextObject.displayWidth / 2, 5.5); @@ -348,7 +349,7 @@ export default class MysteryEncounterUiHandler extends UiHandler { const ballType = getPokeballAtlasKey(mysteryEncounter.encounterTier as number); this.rarityBall.setTexture("pb", ballType); - const descriptionTextObject = addTextObject(this.scene, 6, 25, descriptionText, TextStyle.TOOLTIP_CONTENT, { wordWrap: { width: 830 } }); + const descriptionTextObject = addBBCodeTextObject(this.scene, 6, 25, descriptionText, TextStyle.TOOLTIP_CONTENT, { wordWrap: { width: 830 } }); // Sets up the mask that hides the description text to give an illusion of scrolling const descriptionTextMaskRect = this.scene.make.graphics({}); @@ -382,8 +383,9 @@ export default class MysteryEncounterUiHandler extends UiHandler { this.descriptionContainer.add(descriptionTextObject); - const queryTextObject = addTextObject(this.scene, 65 - (queryText.length), 90, queryText, TextStyle.TOOLTIP_CONTENT, { wordWrap: { width: 830 } }); + const queryTextObject = addBBCodeTextObject(this.scene, 0, 0, queryText, TextStyle.TOOLTIP_CONTENT, { wordWrap: { width: 830 } }); this.descriptionContainer.add(queryTextObject); + queryTextObject.setPosition(75 - queryTextObject.displayWidth / 2, 90); // Slide in description container if (slideInDescription) { @@ -412,15 +414,20 @@ export default class MysteryEncounterUiHandler extends UiHandler { const mysteryEncounter = this.scene.currentBattle.mysteryEncounter; let text; - if (!this.optionsMeetsReqs[cursor] && mysteryEncounter.dialogue.encounterOptionsDialogue.options[cursor].disabledTooltip) { - text = i18next.t(mysteryEncounter.dialogue.encounterOptionsDialogue.options[cursor].disabledTooltip); + const option = mysteryEncounter.dialogue.encounterOptionsDialogue.options[cursor]; + if (!this.optionsMeetsReqs[cursor] && option.disabledTooltip) { + text = getTextWithEncounterDialogueTokensAndColor(this.scene, option.disabledTooltip, TextStyle.TOOLTIP_CONTENT); } else { - text = i18next.t(mysteryEncounter.dialogue.encounterOptionsDialogue.options[cursor].buttonTooltip); + text = getTextWithEncounterDialogueTokensAndColor(this.scene, option.buttonTooltip, TextStyle.TOOLTIP_CONTENT); } + // Auto-color options green/blue for good/bad by looking for (+)/(-) + const primaryStyleString = [...text.match(new RegExp(/\[color=[^\[]*\]\[shadow=[^\[]*\]/i))][0]; + text = text.replace(/(\([^\(]*\+\)[^\(\[]*)/gi, substring => "[/color][/shadow]" + getBBCodeFrag(substring, TextStyle.SUMMARY_GREEN) + "[/color][/shadow]" + primaryStyleString); + text = text.replace(/(\([^\(]*\-\)[^\(\[]*)/gi, substring => "[/color][/shadow]" + getBBCodeFrag(substring, TextStyle.SUMMARY_BLUE) + "[/color][/shadow]" + primaryStyleString); if (text) { - const tooltipTextObject = addTextObject(this.scene, 6, 7, text, TextStyle.TOOLTIP_CONTENT, { wordWrap: { width: 600 }, fontSize: "72px" }); + const tooltipTextObject = addBBCodeTextObject(this.scene, 6, 7, text, TextStyle.TOOLTIP_CONTENT, { wordWrap: { width: 600 }, fontSize: "72px" }); this.tooltipContainer.add(tooltipTextObject); // Sets up the mask that hides the description text to give an illusion of scrolling From cf43589260ecb2030784820d0ad4add5a6b6b10b Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Mon, 8 Jul 2024 18:09:38 -0400 Subject: [PATCH 015/270] fix unit tests --- src/overrides.ts | 4 ++-- src/phases.ts | 10 +++++----- .../mystery-encounter/mystery-encounter.test.ts | 9 +++++++++ src/test/phases/mystery-encounter-phase.test.ts | 14 ++++++++++---- src/test/utils/gameManager.ts | 5 +++-- src/test/utils/phaseInterceptor.ts | 3 ++- 6 files changed, 31 insertions(+), 14 deletions(-) diff --git a/src/overrides.ts b/src/overrides.ts index f3ac35e2075..6634ca32788 100644 --- a/src/overrides.ts +++ b/src/overrides.ts @@ -118,9 +118,9 @@ export const EGG_GACHA_PULL_COUNT_OVERRIDE: number = 0; */ // 1 to 256, set to null to ignore -export const MYSTERY_ENCOUNTER_RATE_OVERRIDE: number = 256; +export const MYSTERY_ENCOUNTER_RATE_OVERRIDE: number = null; export const MYSTERY_ENCOUNTER_TIER_OVERRIDE: MysteryEncounterTier = null; -export const MYSTERY_ENCOUNTER_OVERRIDE: MysteryEncounterType = MysteryEncounterType.SHADY_VITAMIN_DEALER; +export const MYSTERY_ENCOUNTER_OVERRIDE: MysteryEncounterType = null; /** * MODIFIER / ITEM OVERRIDES diff --git a/src/phases.ts b/src/phases.ts index 6bbc5f2d6d6..4b918008978 100644 --- a/src/phases.ts +++ b/src/phases.ts @@ -67,7 +67,7 @@ import { TrainerType } from "#enums/trainer-type"; import { BattlePhase } from "#app/phases/battle-phase"; import { MysteryEncounterVariant } from "#app/data/mystery-encounter"; import { MysteryEncounterPhase } from "#app/phases/mystery-encounter-phase"; -import { handleMysteryEncounterVictory } from "#app/data/mystery-encounters/mystery-encounter-utils"; +import { getTextWithEncounterDialogueTokensAndColor, handleMysteryEncounterVictory } from "#app/data/mystery-encounters/mystery-encounter-utils"; import { SelectModifierPhase } from "#app/phases/select-modifier-phase"; const { t } = i18next; @@ -1081,12 +1081,12 @@ export class EncounterPhase extends BattlePhase { const showNextDialogue = () => { const nextAction = i === introDialogue.length - 1 ? doShowEncounterOptions : showNextDialogue; const dialogue = introDialogue[i]; - const title = dialogue.speaker; - const text = dialogue.text; + const title = getTextWithEncounterDialogueTokensAndColor(this.scene, dialogue.speaker); + const text = getTextWithEncounterDialogueTokensAndColor(this.scene, dialogue.text); if (title) { - this.scene.ui.showDialogue(i18next.t(text), i18next.t(title), null, nextAction, 0, i === 0 ? 750 : 0); + this.scene.ui.showDialogue(text, title, null, nextAction, 0, i === 0 ? 750 : 0); } else { - this.scene.ui.showText(i18next.t(text), null, nextAction, i === 0 ? 750 : 0, true); + this.scene.ui.showText(text, null, nextAction, i === 0 ? 750 : 0, true); } i++; }; diff --git a/src/test/mystery-encounter/mystery-encounter.test.ts b/src/test/mystery-encounter/mystery-encounter.test.ts index 2645fbc68ce..49754a70876 100644 --- a/src/test/mystery-encounter/mystery-encounter.test.ts +++ b/src/test/mystery-encounter/mystery-encounter.test.ts @@ -4,6 +4,7 @@ import GameManager from "#app/test/utils/gameManager"; import Phaser from "phaser"; import {Species} from "#enums/species"; import {MysteryEncounterPhase} from "#app/phases/mystery-encounter-phase"; +import {MysteryEncounterType} from "#enums/mystery-encounter-type"; describe("Mystery Encounters", () => { let phaserGame: Phaser.Game; @@ -23,6 +24,14 @@ describe("Mystery Encounters", () => { game = new GameManager(phaserGame); vi.spyOn(overrides, "MYSTERY_ENCOUNTER_RATE_OVERRIDE", "get").mockReturnValue(256); vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(11); + vi.spyOn(overrides, "MYSTERY_ENCOUNTER_OVERRIDE", "get").mockReturnValue(MysteryEncounterType.MYSTERIOUS_CHALLENGERS); + + // Seed guarantees wild encounter to be replaced by ME + vi.spyOn(game.scene, "resetSeed").mockImplementation(() => { + game.scene.waveSeed = "test"; + Phaser.Math.RND.sow([ game.scene.waveSeed ]); + game.scene.rngCounter = 0; + }); }); it("Spawns a mystery encounter", async() => { diff --git a/src/test/phases/mystery-encounter-phase.test.ts b/src/test/phases/mystery-encounter-phase.test.ts index 4374fc60bd6..0e9cce09f12 100644 --- a/src/test/phases/mystery-encounter-phase.test.ts +++ b/src/test/phases/mystery-encounter-phase.test.ts @@ -28,6 +28,14 @@ describe("Mystery Encounter Phases", () => { game = new GameManager(phaserGame); vi.spyOn(overrides, "MYSTERY_ENCOUNTER_RATE_OVERRIDE", "get").mockReturnValue(256); vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(11); + vi.spyOn(overrides, "MYSTERY_ENCOUNTER_OVERRIDE", "get").mockReturnValue(MysteryEncounterType.MYSTERIOUS_CHALLENGERS); + + // Seed guarantees wild encounter to be replaced by ME + vi.spyOn(game.scene, "resetSeed").mockImplementation(() => { + game.scene.waveSeed = "test"; + Phaser.Math.RND.sow([ game.scene.waveSeed ]); + game.scene.rngCounter = 0; + }); }); describe("MysteryEncounterPhase", () => { @@ -42,7 +50,6 @@ describe("Mystery Encounter Phases", () => { }); it("Runs MysteryEncounterPhase", async() => { - vi.spyOn(overrides, "MYSTERY_ENCOUNTER_OVERRIDE", "get").mockReturnValue(MysteryEncounterType.MYSTERIOUS_CHALLENGERS); await game.runToMysteryEncounter([ Species.CHARIZARD, Species.VOLCARONA @@ -61,7 +68,6 @@ describe("Mystery Encounter Phases", () => { }); it("Selects an option for MysteryEncounterPhase", async() => { - vi.spyOn(overrides, "MYSTERY_ENCOUNTER_OVERRIDE", "get").mockReturnValue(MysteryEncounterType.MYSTERIOUS_CHALLENGERS); const dialogueSpy = vi.spyOn(game.scene.ui, "showDialogue"); const messageSpy = vi.spyOn(game.scene.ui, "showText"); await game.runToMysteryEncounter([ @@ -74,7 +80,7 @@ describe("Mystery Encounter Phases", () => { const handler = game.scene.ui.getHandler() as MysteryEncounterUiHandler; handler.unblockInput(); handler.processInput(Button.ACTION); - }); + }, () => !game.isCurrentPhase(MysteryEncounterPhase)); await game.phaseInterceptor.run(MysteryEncounterPhase); // After option selected @@ -83,7 +89,7 @@ describe("Mystery Encounter Phases", () => { expect(dialogueSpy).toHaveBeenCalledTimes(1); expect(messageSpy).toHaveBeenCalledTimes(2); expect(dialogueSpy).toHaveBeenCalledWith("What's this?", "???", null, expect.any(Function)); - expect(messageSpy).toHaveBeenCalledWith("Mysterious challengers have appeared!", null, expect.any(Function), 750, true); + expect(messageSpy).toHaveBeenCalledWith("[color=#f8f8f8][shadow=#6b5a73]Mysterious challengers have appeared![/color][/shadow]", null, expect.any(Function), 750, true); expect(messageSpy).toHaveBeenCalledWith("[color=#f8f8f8][shadow=#6b5a73]The trainer steps forward...[/color][/shadow]", null, expect.any(Function), 750, true); }); }); diff --git a/src/test/utils/gameManager.ts b/src/test/utils/gameManager.ts index bfe13ee127c..4550891dcf9 100644 --- a/src/test/utils/gameManager.ts +++ b/src/test/utils/gameManager.ts @@ -34,6 +34,7 @@ import { Button } from "#enums/buttons"; import { BattlerIndex } from "#app/battle.js"; import TargetSelectUiHandler from "#app/ui/target-select-ui-handler.js"; import BattleMessageUiHandler from "#app/ui/battle-message-ui-handler"; +import {MysteryEncounterPhase} from "#app/phases/mystery-encounter-phase"; /** * Class to manage the game state and transitions between phases. @@ -152,12 +153,12 @@ export default class GameManager { const selectStarterPhase = new SelectStarterPhase(this.scene); this.scene.pushPhase(new EncounterPhase(this.scene, false)); selectStarterPhase.initBattle(starters); - }); + }, () => this.isCurrentPhase(EncounterPhase)); this.onNextPrompt("EncounterPhase", Mode.MESSAGE, () => { const handler = this.scene.ui.getHandler() as BattleMessageUiHandler; handler.processInput(Button.ACTION); - }, null, true); + }, () => this.isCurrentPhase(MysteryEncounterPhase), true); await this.phaseInterceptor.run(EncounterPhase); } diff --git a/src/test/utils/phaseInterceptor.ts b/src/test/utils/phaseInterceptor.ts index e99adce1550..7591b958dbf 100644 --- a/src/test/utils/phaseInterceptor.ts +++ b/src/test/utils/phaseInterceptor.ts @@ -290,7 +290,8 @@ export default class PhaseInterceptor { * @param phase - The phase to start. */ setMode(mode: Mode, ...args: any[]): Promise { - const currentPhase = this.scene.getCurrentPhase(); + const currentPhase = this. + scene.getCurrentPhase(); const instance = this.scene.ui; console.log("setMode", mode, args); const ret = this.originalSetMode.apply(instance, [mode, ...args]); From deb1e95e3489e8e5349e921a78bbbb501ce9c1c6 Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Tue, 9 Jul 2024 21:26:24 -0400 Subject: [PATCH 016/270] add encounter exp utility and small cleanups/refactors --- src/battle-scene.ts | 4 +- src/data/mystery-encounter-requirements.ts | 2 +- src/data/mystery-encounter.ts | 27 +- src/data/mystery-encounters/dark-deal.ts | 2 +- .../department-store-sale.ts | 13 +- .../mystery-encounters/fight-or-flight.ts | 6 +- .../mysterious-challengers.ts | 10 +- .../mystery-encounters/mysterious-chest.ts | 10 +- .../mystery-encounter-utils.ts | 270 ++++++++++++------ .../shady-vitamin-dealer.ts | 4 +- .../mystery-encounters/sleeping-snorlax.ts | 8 +- .../mystery-encounters/training-session.ts | 18 +- src/locales/en/mystery-encounter.ts | 12 +- src/phases.ts | 6 +- src/phases/mystery-encounter-phase.ts | 15 +- .../mystery-encounter-utils.test.ts | 6 +- .../phases/mystery-encounter-phase.test.ts | 2 +- src/ui/mystery-encounter-ui-handler.ts | 18 +- src/ui/text.ts | 28 ++ 19 files changed, 297 insertions(+), 164 deletions(-) diff --git a/src/battle-scene.ts b/src/battle-scene.ts index fe3023cbc22..c8ef8aef3b2 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -2681,7 +2681,7 @@ export default class BattleScene extends SceneBase { const tier = val[1]; if (tier === MysteryEncounterTier.COMMON) { tierWeights[0] = tierWeights[0] - 6; - } else if (tier === MysteryEncounterTier.UNCOMMON) { + } else if (tier === MysteryEncounterTier.GREAT) { tierWeights[1] = tierWeights[1] - 4; } }); @@ -2691,7 +2691,7 @@ export default class BattleScene extends SceneBase { const commonThreshold = totalWeight - tierWeights[0]; const uncommonThreshold = totalWeight - tierWeights[0] - tierWeights[1]; const rareThreshold = totalWeight - tierWeights[0] - tierWeights[1] - tierWeights[2]; - let tier = tierValue > commonThreshold ? MysteryEncounterTier.COMMON : tierValue > uncommonThreshold ? MysteryEncounterTier.UNCOMMON : tierValue > rareThreshold ? MysteryEncounterTier.RARE : MysteryEncounterTier.SUPER_RARE; + let tier = tierValue > commonThreshold ? MysteryEncounterTier.COMMON : tierValue > uncommonThreshold ? MysteryEncounterTier.GREAT : tierValue > rareThreshold ? MysteryEncounterTier.ULTRA : MysteryEncounterTier.ROGUE; if (!isNullOrUndefined(Overrides.MYSTERY_ENCOUNTER_TIER_OVERRIDE)) { tier = Overrides.MYSTERY_ENCOUNTER_TIER_OVERRIDE; diff --git a/src/data/mystery-encounter-requirements.ts b/src/data/mystery-encounter-requirements.ts index f55319d881b..26ca5163fe5 100644 --- a/src/data/mystery-encounter-requirements.ts +++ b/src/data/mystery-encounter-requirements.ts @@ -239,7 +239,7 @@ export class MoneyRequirement extends EncounterSceneRequirement { getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] { const value = this?.scalingMultiplier > 0 ? scene.getWaveMoneyAmount(this.scalingMultiplier).toString() : this.requiredMoney.toString(); // Colors money text - return ["money", "@ecCol[MONEY]{₽" + value + "}"]; + return ["money", "@[MONEY]{₽" + value + "}"]; } } diff --git a/src/data/mystery-encounter.ts b/src/data/mystery-encounter.ts index d768a672632..090a9aa6ded 100644 --- a/src/data/mystery-encounter.ts +++ b/src/data/mystery-encounter.ts @@ -24,10 +24,10 @@ export enum MysteryEncounterVariant { export enum MysteryEncounterTier { COMMON, - UNCOMMON, - RARE, - SUPER_RARE, - ULTRA_RARE // Not currently used + GREAT, + ULTRA, + ROGUE, + MASTER // Not currently used } export default interface MysteryEncounter { @@ -44,6 +44,7 @@ export default interface MysteryEncounter { hideBattleIntroMessage?: boolean; hideIntroVisuals?: boolean; catchAllowed?: boolean; + doEncounterExp?: (scene: BattleScene) => boolean; doEncounterRewards?: (scene: BattleScene) => boolean; onInit?: (scene: BattleScene) => boolean; @@ -347,6 +348,7 @@ export class MysteryEncounterBuilder implements Partial { secondaryPokemonRequirements ?: EncounterPokemonRequirement[] = []; excludePrimaryFromSupportRequirements?: boolean; dialogueTokens?: Map; + doEncounterExp?: (scene: BattleScene) => boolean; doEncounterRewards?: (scene: BattleScene) => boolean; onInit?: (scene: BattleScene) => boolean; hideBattleIntroMessage?: boolean; @@ -448,8 +450,7 @@ export class MysteryEncounterBuilder implements Partial { * * NOTE: If rewards are dependent on options selected, runtime data, etc., * It may be better to programmatically set doEncounterRewards elsewhere. - * For instance, doEncounterRewards could instead be set inside the onOptionPhase() callback function for a MysteryEncounterOption - * Check other existing mystery encounters for examples on how to use this + * There is a helper function in mystery-encounter utils, setEncounterRewards(), which can be called programmatically to set rewards * @param doEncounterRewards - synchronous callback function to perform during rewards phase of the encounter * @returns */ @@ -457,6 +458,20 @@ export class MysteryEncounterBuilder implements Partial { return Object.assign(this, { doEncounterRewards: doEncounterRewards }); } + /** + * Can set custom encounter exp via this callback function + * If exp always deterministic for an encounter, this is a good way to set them + * + * NOTE: If rewards are dependent on options selected, runtime data, etc., + * It may be better to programmatically set doEncounterExp elsewhere. + * There is a helper function in mystery-encounter utils, setEncounterExp(), which can be called programmatically to set rewards + * @param doEncounterExp - synchronous callback function to perform during rewards phase of the encounter + * @returns + */ + withExp(doEncounterExp: (scene: BattleScene) => boolean): this & Required> { + return Object.assign(this, { doEncounterExp: doEncounterExp }); + } + /** * Can be used to perform init logic before intro visuals are shown and before the MysteryEncounterPhase begins * Useful for performing things like procedural generation of intro sprites, etc. diff --git a/src/data/mystery-encounters/dark-deal.ts b/src/data/mystery-encounters/dark-deal.ts index 170e9ac01b7..a092613b612 100644 --- a/src/data/mystery-encounters/dark-deal.ts +++ b/src/data/mystery-encounters/dark-deal.ts @@ -69,7 +69,7 @@ const excludedBosses = [ export const DarkDealEncounter: MysteryEncounter = new MysteryEncounterBuilder() .withEncounterType(MysteryEncounterType.DARK_DEAL) - .withEncounterTier(MysteryEncounterTier.ULTRA_RARE) + .withEncounterTier(MysteryEncounterTier.ROGUE) .withIntroSpriteConfigs([ { spriteKey: "mad_scientist_m", diff --git a/src/data/mystery-encounters/department-store-sale.ts b/src/data/mystery-encounters/department-store-sale.ts index 3837e94af60..6ed4bce5262 100644 --- a/src/data/mystery-encounters/department-store-sale.ts +++ b/src/data/mystery-encounters/department-store-sale.ts @@ -1,7 +1,7 @@ import BattleScene from "../../battle-scene"; import { - leaveEncounterWithoutBattle, - setCustomEncounterRewards, + leaveEncounterWithoutBattle, setEncounterExp, + setEncounterRewards, } from "#app/data/mystery-encounters/mystery-encounter-utils"; import MysteryEncounter, {MysteryEncounterBuilder, MysteryEncounterTier} from "../mystery-encounter"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; @@ -49,7 +49,8 @@ export const DepartmentStoreSaleEncounter: MysteryEncounter = new MysteryEncount i++; } - setCustomEncounterRewards(scene, { guaranteedModifierTypeFuncs: modifiers, fillRemaining: false}); + setEncounterExp(scene, scene.getParty().map(p => p.id), 300); + setEncounterRewards(scene, { guaranteedModifierTypeFuncs: modifiers, fillRemaining: false}); leaveEncounterWithoutBattle(scene); }) .build()) @@ -69,7 +70,7 @@ export const DepartmentStoreSaleEncounter: MysteryEncounter = new MysteryEncount i++; } - setCustomEncounterRewards(scene, { guaranteedModifierTypeFuncs: modifiers, fillRemaining: false}); + setEncounterRewards(scene, { guaranteedModifierTypeFuncs: modifiers, fillRemaining: false}); leaveEncounterWithoutBattle(scene); }) .build()) @@ -89,7 +90,7 @@ export const DepartmentStoreSaleEncounter: MysteryEncounter = new MysteryEncount i++; } - setCustomEncounterRewards(scene, { guaranteedModifierTypeFuncs: modifiers, fillRemaining: false}); + setEncounterRewards(scene, { guaranteedModifierTypeFuncs: modifiers, fillRemaining: false}); leaveEncounterWithoutBattle(scene); }) .build()) @@ -113,7 +114,7 @@ export const DepartmentStoreSaleEncounter: MysteryEncounter = new MysteryEncount i++; } - setCustomEncounterRewards(scene, { guaranteedModifierTypeFuncs: modifiers, fillRemaining: false}); + setEncounterRewards(scene, { guaranteedModifierTypeFuncs: modifiers, fillRemaining: false}); leaveEncounterWithoutBattle(scene); }) .build()) diff --git a/src/data/mystery-encounters/fight-or-flight.ts b/src/data/mystery-encounters/fight-or-flight.ts index 9ee4166662e..1deb26149ee 100644 --- a/src/data/mystery-encounters/fight-or-flight.ts +++ b/src/data/mystery-encounters/fight-or-flight.ts @@ -4,7 +4,7 @@ import { EnemyPartyConfig, initBattleWithEnemyConfig, leaveEncounterWithoutBattle, queueEncounterMessage, - setCustomEncounterRewards, + setEncounterRewards, showEncounterText } from "#app/data/mystery-encounters/mystery-encounter-utils"; import MysteryEncounter, {MysteryEncounterBuilder, MysteryEncounterTier} from "../mystery-encounter"; @@ -103,7 +103,7 @@ export const FightOrFlightEncounter: MysteryEncounter = new MysteryEncounterBuil .withOptionPhase(async (scene: BattleScene) => { // Pick battle const item = scene.currentBattle.mysteryEncounter.misc as ModifierTypeOption; - setCustomEncounterRewards(scene, { guaranteedModifierTypeOptions: [item], fillRemaining: false}); + setEncounterRewards(scene, { guaranteedModifierTypeOptions: [item], fillRemaining: false}); await initBattleWithEnemyConfig(scene, scene.currentBattle.mysteryEncounter.enemyPartyConfigs[0]); }) .build()) @@ -112,7 +112,7 @@ export const FightOrFlightEncounter: MysteryEncounter = new MysteryEncounterBuil // Pick steal const encounter = scene.currentBattle.mysteryEncounter; const item = scene.currentBattle.mysteryEncounter.misc as ModifierTypeOption; - setCustomEncounterRewards(scene, { guaranteedModifierTypeOptions: [item], fillRemaining: false}); + setEncounterRewards(scene, { guaranteedModifierTypeOptions: [item], fillRemaining: false}); // If player has a stealing move, they succeed automatically const moveRequirement = new MoveRequirement(validMovesForSteal); diff --git a/src/data/mystery-encounters/mysterious-challengers.ts b/src/data/mystery-encounters/mysterious-challengers.ts index eaaeffec9d0..6986b738b4c 100644 --- a/src/data/mystery-encounters/mysterious-challengers.ts +++ b/src/data/mystery-encounters/mysterious-challengers.ts @@ -1,7 +1,7 @@ import BattleScene from "../../battle-scene"; import { ModifierTier } from "#app/modifier/modifier-tier"; import {modifierTypes} from "#app/modifier/modifier-type"; -import { EnemyPartyConfig, initBattleWithEnemyConfig, setCustomEncounterRewards } from "#app/data/mystery-encounters/mystery-encounter-utils"; +import { EnemyPartyConfig, initBattleWithEnemyConfig, setEncounterRewards } from "#app/data/mystery-encounters/mystery-encounter-utils"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import MysteryEncounter, {MysteryEncounterBuilder, MysteryEncounterTier} from "../mystery-encounter"; import { MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; @@ -17,7 +17,7 @@ import {PartyMemberStrength} from "#enums/party-member-strength"; export const MysteriousChallengersEncounter: MysteryEncounter = new MysteryEncounterBuilder() .withEncounterType(MysteryEncounterType.MYSTERIOUS_CHALLENGERS) - .withEncounterTier(MysteryEncounterTier.UNCOMMON) + .withEncounterTier(MysteryEncounterTier.GREAT) .withIntroSpriteConfigs([]) // These are set in onInit() .withSceneRequirement(new WaveCountRequirement([10, 180])) // waves 10 to 180 .withOnInit((scene: BattleScene) => { @@ -103,7 +103,7 @@ export const MysteriousChallengersEncounter: MysteryEncounter = new MysteryEncou // Spawn standard trainer battle with memory mushroom reward const config: EnemyPartyConfig = encounter.enemyPartyConfigs[0]; - setCustomEncounterRewards(scene, { guaranteedModifierTypeFuncs: [modifierTypes.TM_COMMON, modifierTypes.TM_GREAT, modifierTypes.MEMORY_MUSHROOM], fillRemaining: true }); + setEncounterRewards(scene, { guaranteedModifierTypeFuncs: [modifierTypes.TM_COMMON, modifierTypes.TM_GREAT, modifierTypes.MEMORY_MUSHROOM], fillRemaining: true }); // Seed offsets to remove possibility of different trainers having exact same teams let ret; @@ -119,7 +119,7 @@ export const MysteriousChallengersEncounter: MysteryEncounter = new MysteryEncou // Spawn hard fight with ULTRA/GREAT reward (can improve with luck) const config: EnemyPartyConfig = encounter.enemyPartyConfigs[1]; - setCustomEncounterRewards(scene, { guaranteedModifierTiers: [ModifierTier.ULTRA, ModifierTier.GREAT, ModifierTier.GREAT], fillRemaining: true }); + setEncounterRewards(scene, { guaranteedModifierTiers: [ModifierTier.ULTRA, ModifierTier.GREAT, ModifierTier.GREAT], fillRemaining: true }); // Seed offsets to remove possibility of different trainers having exact same teams let ret; @@ -138,7 +138,7 @@ export const MysteriousChallengersEncounter: MysteryEncounter = new MysteryEncou // To avoid player level snowballing from picking this option encounter.expMultiplier = 0.9; - setCustomEncounterRewards(scene, { guaranteedModifierTiers: [ModifierTier.ROGUE, ModifierTier.ULTRA, ModifierTier.GREAT], fillRemaining: true }); + setEncounterRewards(scene, { guaranteedModifierTiers: [ModifierTier.ROGUE, ModifierTier.ULTRA, ModifierTier.GREAT], fillRemaining: true }); // Seed offsets to remove possibility of different trainers having exact same teams let ret; diff --git a/src/data/mystery-encounters/mysterious-chest.ts b/src/data/mystery-encounters/mysterious-chest.ts index 25abcf1fe74..7e221424650 100644 --- a/src/data/mystery-encounters/mysterious-chest.ts +++ b/src/data/mystery-encounters/mysterious-chest.ts @@ -5,7 +5,7 @@ import { koPlayerPokemon, leaveEncounterWithoutBattle, queueEncounterMessage, - setCustomEncounterRewards, + setEncounterRewards, showEncounterText } from "#app/data/mystery-encounters/mystery-encounter-utils"; import MysteryEncounter, {MysteryEncounterBuilder, MysteryEncounterTier} from "../mystery-encounter"; @@ -42,25 +42,25 @@ export const MysteriousChestEncounter: MysteryEncounter = new MysteryEncounterBu const roll = randSeedInt(100); if (roll > 60) { // Choose between 2 COMMON / 2 GREAT tier items (40%) - setCustomEncounterRewards(scene, { guaranteedModifierTiers: [ModifierTier.COMMON, ModifierTier.COMMON, ModifierTier.GREAT, ModifierTier.GREAT]}); + setEncounterRewards(scene, { guaranteedModifierTiers: [ModifierTier.COMMON, ModifierTier.COMMON, ModifierTier.GREAT, ModifierTier.GREAT]}); // Display result message then proceed to rewards queueEncounterMessage(scene, "mysteryEncounter:mysterious_chest_option_1_normal_result"); leaveEncounterWithoutBattle(scene); } else if (roll > 40) { // Choose between 3 ULTRA tier items (20%) - setCustomEncounterRewards(scene, { guaranteedModifierTiers: [ModifierTier.ULTRA, ModifierTier.ULTRA, ModifierTier.ULTRA]}); + setEncounterRewards(scene, { guaranteedModifierTiers: [ModifierTier.ULTRA, ModifierTier.ULTRA, ModifierTier.ULTRA]}); // Display result message then proceed to rewards queueEncounterMessage(scene, "mysteryEncounter:mysterious_chest_option_1_good_result"); leaveEncounterWithoutBattle(scene); } else if (roll > 36) { // Choose between 2 ROGUE tier items (4%) - setCustomEncounterRewards(scene, { guaranteedModifierTiers: [ModifierTier.ROGUE, ModifierTier.ROGUE]}); + setEncounterRewards(scene, { guaranteedModifierTiers: [ModifierTier.ROGUE, ModifierTier.ROGUE]}); // Display result message then proceed to rewards queueEncounterMessage(scene, "mysteryEncounter:mysterious_chest_option_1_great_result"); leaveEncounterWithoutBattle(scene); } else if (roll > 35) { // Choose 1 MASTER tier item (1%) - setCustomEncounterRewards(scene, { guaranteedModifierTiers: [ModifierTier.MASTER]}); + setEncounterRewards(scene, { guaranteedModifierTiers: [ModifierTier.MASTER]}); // Display result message then proceed to rewards queueEncounterMessage(scene, "mysteryEncounter:mysterious_chest_option_1_amazing_result"); leaveEncounterWithoutBattle(scene); diff --git a/src/data/mystery-encounters/mystery-encounter-utils.ts b/src/data/mystery-encounters/mystery-encounter-utils.ts index dcbcc753d32..89e497d22f9 100644 --- a/src/data/mystery-encounters/mystery-encounter-utils.ts +++ b/src/data/mystery-encounters/mystery-encounter-utils.ts @@ -7,7 +7,12 @@ import {Status, StatusEffect} from "../status-effect"; import {TrainerConfig, trainerConfigs, TrainerSlot} from "../trainer-config"; import Pokemon, {FieldPosition, PlayerPokemon} from "#app/field/pokemon"; import Trainer, {TrainerVariant} from "../../field/trainer"; -import {PokemonExpBoosterModifier} from "#app/modifier/modifier"; +import { + ExpBalanceModifier, + ExpShareModifier, + MultipleParticipantExpBonusModifier, + PokemonExpBoosterModifier +} from "#app/modifier/modifier"; import { CustomModifierSettings, getModifierPoolForType, @@ -19,7 +24,14 @@ import { PokemonHeldItemModifierType, regenerateModifierPoolThresholds } from "#app/modifier/modifier-type"; -import {BattleEndPhase, EggLapsePhase, ModifierRewardPhase, TrainerVictoryPhase} from "#app/phases"; +import { + BattleEndPhase, + EggLapsePhase, + ExpPhase, + ModifierRewardPhase, + ShowPartyExpBarPhase, + TrainerVictoryPhase +} from "#app/phases"; import {MysteryEncounterBattlePhase, MysteryEncounterRewardsPhase} from "#app/phases/mystery-encounter-phase"; import * as Utils from "../../utils"; import {isNullOrUndefined} from "#app/utils"; @@ -35,7 +47,9 @@ import {Mode} from "#app/ui/ui"; import {PartyOption, PartyUiMode} from "#app/ui/party-ui-handler"; import {OptionSelectConfig, OptionSelectItem} from "#app/ui/abstact-option-select-ui-handler"; import {WIGHT_INCREMENT_ON_SPAWN_MISS} from "#app/data/mystery-encounters/mystery-encounters"; -import {getBBCodeFrag, TextStyle} from "#app/ui/text"; +import {getTextWithColors, TextStyle} from "#app/ui/text"; +import * as Overrides from "#app/overrides"; +import {UiTheme} from "#enums/ui-theme"; /** * @@ -167,17 +181,29 @@ export function koPlayerPokemon(pokemon: PlayerPokemon) { pokemon.updateInfo(); } -export function getTextWithEncounterDialogueTokensAndColor(scene: BattleScene, textKey: TemplateStringsArray | `mysteryEncounter:${string}`, primaryStyle: TextStyle = TextStyle.MESSAGE): string { +export function getEncounterText(scene: BattleScene, textKey: TemplateStringsArray | `mysteryEncounter:${string}`, primaryStyle?: TextStyle, uiTheme: UiTheme = UiTheme.DEFAULT): string { + if (isNullOrUndefined(textKey)) { + return null; + } + + let textString: string = getTextWithDialogueTokens(scene, textKey); + + // Can only color the text if a Primary Style is defined + // primaryStyle is applied to all text that does not have its own specified style + if (primaryStyle) { + textString = getTextWithColors(textString, primaryStyle, uiTheme); + } + + return textString; +} + +function getTextWithDialogueTokens(scene: BattleScene, textKey: TemplateStringsArray | `mysteryEncounter:${string}`): string { if (isNullOrUndefined(textKey)) { return null; } let textString: string = i18next.t(textKey); - // Apply primary styling before anything else, if it exists - textString = getBBCodeFrag(textString, primaryStyle) + "[/color][/shadow]"; - const primaryStyleString = [...textString.match(new RegExp(/\[color=[^\[]*\]\[shadow=[^\[]*\]/i))][0]; - // Apply dialogue tokens const dialogueTokens = scene.currentBattle?.mysteryEncounter?.dialogueTokens; if (dialogueTokens) { @@ -186,16 +212,6 @@ export function getTextWithEncounterDialogueTokensAndColor(scene: BattleScene, t }); } - // Set custom colors - // Looks for any pattern like this: @ecCol[SUMMARY_BLUE]{my text to color} - // Resulting in: "my text to color" string with TextStyle.SUMMARY_BLUE - textString = textString.replace(/@ecCol\[([^{]*)\]{([^}]*)}/gi, (substring, textStyle: string, textToColor: string) => { - return "[/color][/shadow]" + getBBCodeFrag(textToColor, TextStyle[textStyle]) + "[/color][/shadow]" + primaryStyleString; - }); - - // Remove extra style block at the end - textString = textString.replace(/\[color=[^\[]*\]\[shadow=[^\[]*\]\[\/color\]\[\/shadow\]/gi, ""); - return textString; } @@ -205,7 +221,7 @@ export function getTextWithEncounterDialogueTokensAndColor(scene: BattleScene, t * @param contentKey */ export function queueEncounterMessage(scene: BattleScene, contentKey: TemplateStringsArray | `mysteryEncounter:${string}`): void { - const text: string = getTextWithEncounterDialogueTokensAndColor(scene, contentKey, TextStyle.MESSAGE); + const text: string = getEncounterText(scene, contentKey); scene.queueMessage(text, null, true); } @@ -216,7 +232,7 @@ export function queueEncounterMessage(scene: BattleScene, contentKey: TemplateSt */ export function showEncounterText(scene: BattleScene, contentKey: TemplateStringsArray | `mysteryEncounter:${string}`): Promise { return new Promise(resolve => { - const text: string = getTextWithEncounterDialogueTokensAndColor(scene, contentKey, TextStyle.MESSAGE); + const text: string = getEncounterText(scene, contentKey); scene.ui.showText(text, null, () => resolve(), 0, true); }); } @@ -229,8 +245,8 @@ export function showEncounterText(scene: BattleScene, contentKey: TemplateString * @param callback */ export function showEncounterDialogue(scene: BattleScene, textContentKey: TemplateStringsArray | `mysteryEncounter:${string}`, speakerContentKey: TemplateStringsArray | `mysteryEncounter:${string}`, callback?: Function) { - const text: string = getTextWithEncounterDialogueTokensAndColor(scene, textContentKey, TextStyle.MESSAGE); - const speaker: string = getTextWithEncounterDialogueTokensAndColor(scene, speakerContentKey); + const text: string = getEncounterText(scene, textContentKey); + const speaker: string = getEncounterText(scene, speakerContentKey); scene.ui.showDialogue(text, speaker, null, callback, 0, 0); } @@ -246,6 +262,7 @@ export class EnemyPokemonConfig { tags?: BattlerTagType[]; mysteryEncounterBattleEffects?: (pokemon: Pokemon) => void; status?: StatusEffect; + passive?: boolean; } export class EnemyPartyConfig { @@ -341,6 +358,11 @@ export async function initBattleWithEnemyConfig(scene: BattleScene, partyConfig: const enemyPokemon = scene.getEnemyParty()[e]; + // Make sure basic data is clean + enemyPokemon.hp = enemyPokemon.getMaxHp(); + enemyPokemon.status = null; + enemyPokemon.passive = false; + if (e < (doubleBattle ? 2 : 1)) { enemyPokemon.setX(-66 + enemyPokemon.getFieldPositionOffset()[0]); enemyPokemon.resetSummonData(); @@ -353,7 +375,7 @@ export async function initBattleWithEnemyConfig(scene: BattleScene, partyConfig: if (e < partyConfig?.pokemonConfigs?.length) { const config = partyConfig?.pokemonConfigs?.[e]; - // Generate new id in case using data source + // Generate new id, reset status and HP in case using data source if (config.dataSource) { enemyPokemon.id = Utils.randSeedInt(4294967296); } @@ -372,6 +394,11 @@ export async function initBattleWithEnemyConfig(scene: BattleScene, partyConfig: enemyPokemon.setBoss(true, segments); } + // Set Passive + if (partyConfig.pokemonConfigs[e].passive) { + enemyPokemon.passive = true; + } + // Set Status if (partyConfig.pokemonConfigs[e].status) { // Default to cureturn 3 for sleep @@ -462,40 +489,6 @@ export function generateModifierType(scene: BattleScene, modifier: () => Modifie return result; } -/** - * Will initialize reward phases to follow the mystery encounter - * Can have shop displayed or skipped - * @param scene - Battle Scene - * @param customShopRewards - adds a shop phase with the specified rewards / reward tiers - * @param nonShopRewards - will add a non-shop reward phase for each specified item/modifier (can happen in addition to a shop) - * @param preRewardsCallback - can execute an arbitrary callback before the new phases if necessary (useful for updating items/party/injecting new phases before MysteryEncounterRewardsPhase) - */ -export function setCustomEncounterRewards(scene: BattleScene, customShopRewards?: CustomModifierSettings, nonShopRewards?: ModifierTypeFunc[], preRewardsCallback?: Function) { - scene.currentBattle.mysteryEncounter.doEncounterRewards = (scene: BattleScene) => { - if (preRewardsCallback) { - preRewardsCallback(); - } - - if (customShopRewards) { - scene.unshiftPhase(new SelectModifierPhase(scene, 0, null, customShopRewards)); - } else { - scene.tryRemovePhase(p => p instanceof SelectModifierPhase); - } - - if (nonShopRewards?.length > 0) { - nonShopRewards.forEach((reward) => { - scene.unshiftPhase(new ModifierRewardPhase(scene, reward)); - }); - } else { - while (!isNullOrUndefined(scene.findPhase(p => p instanceof ModifierRewardPhase))) { - scene.tryRemovePhase(p => p instanceof ModifierRewardPhase); - } - } - - return true; - }; -} - /** * * @param scene @@ -557,7 +550,7 @@ export function selectPokemonForOption(scene: BattleScene, onPokemonSelected: (p if (!textPromptKey) { displayOptions(); } else { - const secondOptionSelectPrompt = getTextWithEncounterDialogueTokensAndColor(scene, textPromptKey, TextStyle.MESSAGE); + const secondOptionSelectPrompt = getEncounterText(scene, textPromptKey, TextStyle.MESSAGE); scene.ui.showText(secondOptionSelectPrompt, null, displayOptions, null, true); } }); @@ -575,49 +568,140 @@ export function selectPokemonForOption(scene: BattleScene, onPokemonSelected: (p } /** - * Will initialize exp phases to follow the mystery encounter (in addition to any combat or other exp earned) - * Exp earned will be a simple function that linearly scales with wave index, that can be increased or decreased by the expMultiplier - * Exp Share will have no effect (so no accounting for what mon is "on the field") - * Exp Balance will still function as normal + * Will initialize reward phases to follow the mystery encounter + * Can have shop displayed or skipped * @param scene - Battle Scene - * @param expMultiplier - default is 100, can be increased or decreased as desired + * @param customShopRewards - adds a shop phase with the specified rewards / reward tiers + * @param nonShopRewards - will add a non-shop reward phase for each specified item/modifier (can happen in addition to a shop) + * @param preRewardsCallback - can execute an arbitrary callback before the new phases if necessary (useful for updating items/party/injecting new phases before MysteryEncounterRewardsPhase) */ -export function setEncounterExp(scene: BattleScene, expMultiplier: number = 100) { - //const expBalanceModifier = scene.findModifier(m => m instanceof ExpBalanceModifier) as ExpBalanceModifier; - const expVal = scene.currentBattle.waveIndex * expMultiplier; - const pokemonExp = new Utils.NumberHolder(expVal); - const partyMemberExp = []; +export function setEncounterRewards(scene: BattleScene, customShopRewards?: CustomModifierSettings, nonShopRewards?: ModifierTypeFunc[], preRewardsCallback?: Function) { + scene.currentBattle.mysteryEncounter.doEncounterRewards = (scene: BattleScene) => { + if (preRewardsCallback) { + preRewardsCallback(); + } - const party = scene.getParty(); - party.forEach(pokemon => { - scene.applyModifiers(PokemonExpBoosterModifier, true, pokemon, pokemonExp); - partyMemberExp.push(Math.floor(pokemonExp.value)); - }); + if (customShopRewards) { + scene.unshiftPhase(new SelectModifierPhase(scene, 0, null, customShopRewards)); + } else { + scene.tryRemovePhase(p => p instanceof SelectModifierPhase); + } - // TODO - //if (expBalanceModifier) { - // let totalLevel = 0; - // let totalExp = 0; - // expPartyMembers.forEach((expPartyMember, epm) => { - // totalExp += partyMemberExp[epm]; - // totalLevel += expPartyMember.level; - // }); + if (nonShopRewards?.length > 0) { + nonShopRewards.forEach((reward) => { + scene.unshiftPhase(new ModifierRewardPhase(scene, reward)); + }); + } else { + while (!isNullOrUndefined(scene.findPhase(p => p instanceof ModifierRewardPhase))) { + scene.tryRemovePhase(p => p instanceof ModifierRewardPhase); + } + } - // const medianLevel = Math.floor(totalLevel / expPartyMembers.length); + return true; + }; +} - // const recipientExpPartyMemberIndexes = []; - // expPartyMembers.forEach((expPartyMember, epm) => { - // if (expPartyMember.level <= medianLevel) { - // recipientExpPartyMemberIndexes.push(epm); - // } - // }); +/** + * Will initialize exp phases into the phase queue (these are in addition to any combat or other exp earned) + * Exp Share and Exp Balance will still function as normal + * @param scene - Battle Scene + * @param participantIds - ids of party pokemon that get full exp value. Other party members will receive Exp Share amounts + * @param baseExpValue - gives exp equivalent to a pokemon of the wave index's level. + * Guidelines: + * 36 - Sunkern (lowest in game) + * 62-64 - regional starter base evos + * 100 - Scyther + * 170 - Spiritomb + * 250 - Gengar + * 290 - trio legendaries + * 340 - box legendaries + * 608 - Blissey (highest in game) + * @param useWaveIndex - set to false when directly passing the the full exp value instead of baseExpValue + */ +export function setEncounterExp(scene: BattleScene, participantIds: integer[], baseExpValue: number, useWaveIndex: boolean = true) { + scene.currentBattle.mysteryEncounter.doEncounterExp = (scene: BattleScene) => { + const party = scene.getParty(); + const expShareModifier = scene.findModifier(m => m instanceof ExpShareModifier) as ExpShareModifier; + const expBalanceModifier = scene.findModifier(m => m instanceof ExpBalanceModifier) as ExpBalanceModifier; + const multipleParticipantExpBonusModifier = scene.findModifier(m => m instanceof MultipleParticipantExpBonusModifier) as MultipleParticipantExpBonusModifier; + const nonFaintedPartyMembers = party.filter(p => p.hp); + const expPartyMembers = nonFaintedPartyMembers.filter(p => p.level < scene.getMaxExpLevel()); + const partyMemberExp = []; + let expValue = baseExpValue * (useWaveIndex ? scene.currentBattle.waveIndex : 1); - // const splitExp = Math.floor(totalExp / recipientExpPartyMemberIndexes.length); + if (participantIds?.length > 0) { + if (scene.currentBattle.mysteryEncounter.encounterVariant === MysteryEncounterVariant.TRAINER_BATTLE) { + expValue = Math.floor(expValue * 1.5); + } + for (const partyMember of nonFaintedPartyMembers) { + const pId = partyMember.id; + const participated = participantIds.includes(pId); + if (participated) { + partyMember.addFriendship(2); + } + if (!expPartyMembers.includes(partyMember)) { + continue; + } + if (!participated && !expShareModifier) { + partyMemberExp.push(0); + continue; + } + let expMultiplier = 0; + if (participated) { + expMultiplier += (1 / participantIds.length); + if (participantIds.length > 1 && multipleParticipantExpBonusModifier) { + expMultiplier += multipleParticipantExpBonusModifier.getStackCount() * 0.2; + } + } else if (expShareModifier) { + expMultiplier += (expShareModifier.getStackCount() * 0.2) / participantIds.length; + } + if (partyMember.pokerus) { + expMultiplier *= 1.5; + } + if (Overrides.XP_MULTIPLIER_OVERRIDE !== null) { + expMultiplier = Overrides.XP_MULTIPLIER_OVERRIDE; + } + const pokemonExp = new Utils.NumberHolder(expValue * expMultiplier); + scene.applyModifiers(PokemonExpBoosterModifier, true, partyMember, pokemonExp); + partyMemberExp.push(Math.floor(pokemonExp.value)); + } - // expPartyMembers.forEach((_partyMember, pm) => { - // partyMemberExp[pm] = Phaser.Math.Linear(partyMemberExp[pm], recipientExpPartyMemberIndexes.indexOf(pm) > -1 ? splitExp : 0, 0.2 * expBalanceModifier.getStackCount()); - // }); - //} + if (expBalanceModifier) { + let totalLevel = 0; + let totalExp = 0; + expPartyMembers.forEach((expPartyMember, epm) => { + totalExp += partyMemberExp[epm]; + totalLevel += expPartyMember.level; + }); + + const medianLevel = Math.floor(totalLevel / expPartyMembers.length); + + const recipientExpPartyMemberIndexes = []; + expPartyMembers.forEach((expPartyMember, epm) => { + if (expPartyMember.level <= medianLevel) { + recipientExpPartyMemberIndexes.push(epm); + } + }); + + const splitExp = Math.floor(totalExp / recipientExpPartyMemberIndexes.length); + + expPartyMembers.forEach((_partyMember, pm) => { + partyMemberExp[pm] = Phaser.Math.Linear(partyMemberExp[pm], recipientExpPartyMemberIndexes.indexOf(pm) > -1 ? splitExp : 0, 0.2 * expBalanceModifier.getStackCount()); + }); + } + + for (let pm = 0; pm < expPartyMembers.length; pm++) { + const exp = partyMemberExp[pm]; + + if (exp) { + const partyMemberIndex = party.indexOf(expPartyMembers[pm]); + scene.unshiftPhase(expPartyMembers[pm].isOnField() ? new ExpPhase(scene, partyMemberIndex, exp) : new ShowPartyExpBarPhase(scene, partyMemberIndex, exp)); + } + } + } + + return true; + }; } /** diff --git a/src/data/mystery-encounters/shady-vitamin-dealer.ts b/src/data/mystery-encounters/shady-vitamin-dealer.ts index bd2e6094748..b6ac5eacd22 100644 --- a/src/data/mystery-encounters/shady-vitamin-dealer.ts +++ b/src/data/mystery-encounters/shady-vitamin-dealer.ts @@ -4,7 +4,7 @@ import { leaveEncounterWithoutBattle, queueEncounterMessage, selectPokemonForOption, - setCustomEncounterRewards, + setEncounterRewards, updatePlayerMoney, } from "#app/data/mystery-encounters/mystery-encounter-utils"; import MysteryEncounter, {MysteryEncounterBuilder, MysteryEncounterTier} from "../mystery-encounter"; @@ -134,7 +134,7 @@ export const ShadyVitaminDealerEncounter: MysteryEncounter = new MysteryEncounte i++; } - setCustomEncounterRewards(scene, { guaranteedModifierTypeFuncs: modifiers, fillRemaining: false}); + setEncounterRewards(scene, { guaranteedModifierTypeFuncs: modifiers, fillRemaining: false}); leaveEncounterWithoutBattle(scene); }) .build()) diff --git a/src/data/mystery-encounters/sleeping-snorlax.ts b/src/data/mystery-encounters/sleeping-snorlax.ts index bf53ad72593..410a9081db3 100644 --- a/src/data/mystery-encounters/sleeping-snorlax.ts +++ b/src/data/mystery-encounters/sleeping-snorlax.ts @@ -4,7 +4,7 @@ import { EnemyPokemonConfig, generateModifierType, initBattleWithEnemyConfig, leaveEncounterWithoutBattle, queueEncounterMessage, - setCustomEncounterRewards + setEncounterRewards } from "./mystery-encounter-utils"; import MysteryEncounter, {MysteryEncounterBuilder, MysteryEncounterTier} from "../mystery-encounter"; import * as Utils from "../../utils"; @@ -23,7 +23,7 @@ import { BerryType } from "#enums/berry-type"; export const SleepingSnorlaxEncounter: MysteryEncounter = new MysteryEncounterBuilder() .withEncounterType(MysteryEncounterType.SLEEPING_SNORLAX) - .withEncounterTier(MysteryEncounterTier.RARE) + .withEncounterTier(MysteryEncounterTier.ULTRA) .withIntroSpriteConfigs([ { spriteKey: Species.SNORLAX.toString(), @@ -78,7 +78,7 @@ export const SleepingSnorlaxEncounter: MysteryEncounter = new MysteryEncounterBu // const sitrus = (modifierTypes.BERRY?.() as ModifierTypeGenerator).generateType(scene.getParty(), [BerryType.SITRUS]); const sitrus = generateModifierType(scene, modifierTypes.BERRY, [BerryType.SITRUS]); - setCustomEncounterRewards(scene, { guaranteedModifierTypeOptions: [new ModifierTypeOption(sitrus, 0)], fillRemaining: false}); + setEncounterRewards(scene, { guaranteedModifierTypeOptions: [new ModifierTypeOption(sitrus, 0)], fillRemaining: false}); queueEncounterMessage(scene, "mysteryEncounter:sleeping_snorlax_option_2_bad_result"); leaveEncounterWithoutBattle(scene); } else { @@ -101,7 +101,7 @@ export const SleepingSnorlaxEncounter: MysteryEncounter = new MysteryEncounterBu .withPrimaryPokemonRequirement(new MoveRequirement([Moves.PLUCK, Moves.COVET, Moves.KNOCK_OFF, Moves.THIEF, Moves.TRICK, Moves.SWITCHEROO])) .withOptionPhase(async (scene: BattleScene) => { // Leave encounter with no rewards or exp - setCustomEncounterRewards(scene, { guaranteedModifierTypeFuncs: [modifierTypes.LEFTOVERS], fillRemaining: false}); + setEncounterRewards(scene, { guaranteedModifierTypeFuncs: [modifierTypes.LEFTOVERS], fillRemaining: false}); queueEncounterMessage(scene, "mysteryEncounter:sleeping_snorlax_option_3_good_result"); leaveEncounterWithoutBattle(scene); }) diff --git a/src/data/mystery-encounters/training-session.ts b/src/data/mystery-encounters/training-session.ts index c833c37c06f..ab1bacc71f9 100644 --- a/src/data/mystery-encounters/training-session.ts +++ b/src/data/mystery-encounters/training-session.ts @@ -1,10 +1,10 @@ import BattleScene from "../../battle-scene"; import { EnemyPartyConfig, - getTextWithEncounterDialogueTokensAndColor, + getEncounterText, initBattleWithEnemyConfig, selectPokemonForOption, - setCustomEncounterRewards + setEncounterRewards } from "#app/data/mystery-encounters/mystery-encounter-utils"; import {MysteryEncounterType} from "#enums/mystery-encounter-type"; import MysteryEncounter, {MysteryEncounterBuilder, MysteryEncounterTier} from "../mystery-encounter"; @@ -26,7 +26,7 @@ import {pokemonInfo} from "#app/locales/en/pokemon-info"; export const TrainingSessionEncounter: MysteryEncounter = new MysteryEncounterBuilder() .withEncounterType(MysteryEncounterType.TRAINING_SESSION) - .withEncounterTier(MysteryEncounterTier.RARE) + .withEncounterTier(MysteryEncounterTier.ULTRA) .withIntroSpriteConfigs([ { spriteKey: "training_gear", @@ -128,10 +128,10 @@ export const TrainingSessionEncounter: MysteryEncounter = new MysteryEncounterBu scene.addModifier(mod, true, false, false, true); } scene.updateModifiers(true); - scene.queueMessage(getTextWithEncounterDialogueTokensAndColor(scene, "mysteryEncounter:training_session_battle_finished_1"), null, true); + scene.queueMessage(getEncounterText(scene, "mysteryEncounter:training_session_battle_finished_1"), null, true); }; - setCustomEncounterRewards(scene, { fillRemaining: true }, null, onBeforeRewardsPhase); + setEncounterRewards(scene, { fillRemaining: true }, null, onBeforeRewardsPhase); return initBattleWithEnemyConfig(scene, config); }) @@ -174,7 +174,7 @@ export const TrainingSessionEncounter: MysteryEncounter = new MysteryEncounterBu scene.removePokemonFromPlayerParty(playerPokemon, false); const onBeforeRewardsPhase = () => { - scene.queueMessage(getTextWithEncounterDialogueTokensAndColor(scene, "mysteryEncounter:training_session_battle_finished_2"), null, true); + scene.queueMessage(getEncounterText(scene, "mysteryEncounter:training_session_battle_finished_2"), null, true); // Add the pokemon back to party with Nature change playerPokemon.setNature(encounter.misc.chosenNature); scene.gameData.setPokemonCaught(playerPokemon, false); @@ -187,7 +187,7 @@ export const TrainingSessionEncounter: MysteryEncounter = new MysteryEncounterBu scene.updateModifiers(true); }; - setCustomEncounterRewards(scene, { fillRemaining: true }, null, onBeforeRewardsPhase); + setEncounterRewards(scene, { fillRemaining: true }, null, onBeforeRewardsPhase); return initBattleWithEnemyConfig(scene, config); }) @@ -237,7 +237,7 @@ export const TrainingSessionEncounter: MysteryEncounter = new MysteryEncounterBu scene.removePokemonFromPlayerParty(playerPokemon, false); const onBeforeRewardsPhase = () => { - scene.queueMessage(getTextWithEncounterDialogueTokensAndColor(scene, "mysteryEncounter:training_session_battle_finished_3"), null, true); + scene.queueMessage(getEncounterText(scene, "mysteryEncounter:training_session_battle_finished_3"), null, true); // Add the pokemon back to party with ability change const abilityIndex = encounter.misc.abilityIndex; if (!!playerPokemon.getFusionSpeciesForm()) { @@ -268,7 +268,7 @@ export const TrainingSessionEncounter: MysteryEncounter = new MysteryEncounterBu scene.updateModifiers(true); }; - setCustomEncounterRewards(scene, { fillRemaining: true }, null, onBeforeRewardsPhase); + setEncounterRewards(scene, { fillRemaining: true }, null, onBeforeRewardsPhase); return initBattleWithEnemyConfig(scene, config); }) diff --git a/src/locales/en/mystery-encounter.ts b/src/locales/en/mystery-encounter.ts index 9fe63b33f58..8bcf5df76d9 100644 --- a/src/locales/en/mystery-encounter.ts +++ b/src/locales/en/mystery-encounter.ts @@ -7,10 +7,10 @@ import {SimpleTranslationEntries} from "#app/interfaces/locales"; * * '@ec{}' will auto-inject the matching token value for the specified Encounter * - * '@ecCol[]{}' will auto-color the given text to a specified TextStyle (e.g. TextStyle.SUMMARY_GREEN) + * '@[]{}' will auto-color the given text to a specified TextStyle (e.g. TextStyle.SUMMARY_GREEN) * * Any '(+)' or '(-)' type of tooltip will auto-color to green/blue respectively. THIS ONLY OCCURS FOR OPTION TOOLTIPS, NOWHERE ELSE - * Other types of '(...)' tooltips will have to specify the text color manually by using '@ecCol[SUMMARY_GREEN]{}' pattern + * Other types of '(...)' tooltips will have to specify the text color manually by using '@[SUMMARY_GREEN]{}' pattern */ export const mysteryEncounter: SimpleTranslationEntries = { // DO NOT REMOVE @@ -22,7 +22,7 @@ export const mysteryEncounter: SimpleTranslationEntries = { "mysterious_chest_description": "A beautifully ornamented chest stands on the ground. There must be something good inside... right?", "mysterious_chest_query": "Will you open it?", "mysterious_chest_option_1_label": "Open it", - "mysterious_chest_option_1_tooltip": "@ecCol[SUMMARY_BLUE]{(35%) Something terrible}\n@ecCol[SUMMARY_GREEN]{(40%) Okay Rewards}\n@ecCol[SUMMARY_GREEN]{(20%) Good Rewards}\n@ecCol[SUMMARY_GREEN]{(4%) Great Rewards}\n@ecCol[SUMMARY_GREEN]{(1%) Amazing Rewards}", + "mysterious_chest_option_1_tooltip": "@[SUMMARY_BLUE]{(35%) Something terrible}\n@[SUMMARY_GREEN]{(40%) Okay Rewards}\n@[SUMMARY_GREEN]{(20%) Good Rewards}\n@[SUMMARY_GREEN]{(4%) Great Rewards}\n@[SUMMARY_GREEN]{(1%) Amazing Rewards}", "mysterious_chest_option_2_label": "It's too risky, leave", "mysterious_chest_option_2_tooltip": "(-) No Rewards", "mysterious_chest_option_1_selected_message": "You open the chest to find...", @@ -41,8 +41,8 @@ export const mysteryEncounter: SimpleTranslationEntries = { "fight_or_flight_option_1_label": "Battle the Pokémon", "fight_or_flight_option_1_tooltip": "(-) Hard Battle\n(+) New Item", "fight_or_flight_option_2_label": "Steal the item", - "fight_or_flight_option_2_tooltip": "@ecCol[SUMMARY_GREEN]{(35%) Steal Item}\n@ecCol[SUMMARY_BLUE]{(65%) Harder Battle}", - "fight_or_flight_option_2_steal_tooltip": "@ecCol[SUMMARY_GREEN]{(?) Use a Pokémon Move}", + "fight_or_flight_option_2_tooltip": "@[SUMMARY_GREEN]{(35%) Steal Item}\n@[SUMMARY_BLUE]{(65%) Harder Battle}", + "fight_or_flight_option_2_steal_tooltip": "@[SUMMARY_GREEN]{(?) Use a Pokémon Move}", "fight_or_flight_option_3_label": "Leave", "fight_or_flight_option_3_tooltip": "(-) No Rewards", "fight_or_flight_option_1_selected_message": "You approach the\nPokémon without fear.", @@ -167,7 +167,7 @@ export const mysteryEncounter: SimpleTranslationEntries = { "sleeping_snorlax_option_1_label": "Fight it", "sleeping_snorlax_option_1_tooltip": "(-) Fight Sleeping Snorlax", "sleeping_snorlax_option_2_label": "Wait for it to move", - "sleeping_snorlax_option_2_tooltip": "@ecCol[SUMMARY_BLUE]{(75%) Wait a short time}\n@ecCol[SUMMARY_BLUE]{(25%) Wait a long time}", + "sleeping_snorlax_option_2_tooltip": "@[SUMMARY_BLUE]{(75%) Wait a short time}\n@[SUMMARY_BLUE]{(25%) Wait a long time}", "sleeping_snorlax_option_3_label": "Steal", "sleeping_snorlax_option_3_tooltip": "(+) Leftovers", "sleeping_snorlax_option_3_disabled_tooltip": "Your Pokémon need to know certain moves to choose this", diff --git a/src/phases.ts b/src/phases.ts index 4b918008978..730797c3d2f 100644 --- a/src/phases.ts +++ b/src/phases.ts @@ -67,7 +67,7 @@ import { TrainerType } from "#enums/trainer-type"; import { BattlePhase } from "#app/phases/battle-phase"; import { MysteryEncounterVariant } from "#app/data/mystery-encounter"; import { MysteryEncounterPhase } from "#app/phases/mystery-encounter-phase"; -import { getTextWithEncounterDialogueTokensAndColor, handleMysteryEncounterVictory } from "#app/data/mystery-encounters/mystery-encounter-utils"; +import { getEncounterText, handleMysteryEncounterVictory } from "#app/data/mystery-encounters/mystery-encounter-utils"; import { SelectModifierPhase } from "#app/phases/select-modifier-phase"; const { t } = i18next; @@ -1081,8 +1081,8 @@ export class EncounterPhase extends BattlePhase { const showNextDialogue = () => { const nextAction = i === introDialogue.length - 1 ? doShowEncounterOptions : showNextDialogue; const dialogue = introDialogue[i]; - const title = getTextWithEncounterDialogueTokensAndColor(this.scene, dialogue.speaker); - const text = getTextWithEncounterDialogueTokensAndColor(this.scene, dialogue.text); + const title = getEncounterText(this.scene, dialogue.speaker); + const text = getEncounterText(this.scene, dialogue.text); if (title) { this.scene.ui.showDialogue(text, title, null, nextAction, 0, i === 0 ? 750 : 0); } else { diff --git a/src/phases/mystery-encounter-phase.ts b/src/phases/mystery-encounter-phase.ts index b928d98834c..f4a6d955fb6 100644 --- a/src/phases/mystery-encounter-phase.ts +++ b/src/phases/mystery-encounter-phase.ts @@ -3,7 +3,7 @@ import BattleScene from "../battle-scene"; import { Phase } from "../phase"; import { Mode } from "../ui/ui"; import { - getTextWithEncounterDialogueTokensAndColor + getEncounterText } from "../data/mystery-encounters/mystery-encounter-utils"; import { CheckSwitchPhase, NewBattlePhase, PostSummonPhase, ReturnPhase, ScanIvsPhase, SummonPhase, ToggleDoublePositionPhase } from "../phases"; import MysteryEncounterOption from "../data/mystery-encounter-option"; @@ -89,9 +89,9 @@ export class MysteryEncounterPhase extends Phase { const nextAction = i === selectedDialogue.length - 1 ? endDialogueAndContinueEncounter : showNextDialogue; const dialogue = selectedDialogue[i]; let title: string = null; - const text: string = getTextWithEncounterDialogueTokensAndColor(this.scene, dialogue.text); + const text: string = getEncounterText(this.scene, dialogue.text); if (dialogue.speaker) { - title = getTextWithEncounterDialogueTokensAndColor(this.scene, dialogue.speaker); + title = getEncounterText(this.scene, dialogue.speaker); } if (title) { @@ -377,6 +377,7 @@ export class MysteryEncounterBattlePhase extends Phase { /** * Will handle (in order): + * - Any encounter reward logic that is set within MysteryEncounter doEncounterExp * - Any encounter reward logic that is set within MysteryEncounter doEncounterRewards * - Otherwise, can add a no-reward-item shop with only Potions, etc. if addHealPhase is true * - Queuing of the PostMysteryEncounterPhase @@ -393,6 +394,10 @@ export class MysteryEncounterRewardsPhase extends Phase { super.start(); 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) { @@ -451,9 +456,9 @@ export class PostMysteryEncounterPhase extends Phase { const nextAction = i === outroDialogue.length - 1 ? endPhase : showNextDialogue; const dialogue = outroDialogue[i]; let title: string = null; - const text: string = getTextWithEncounterDialogueTokensAndColor(this.scene, dialogue.text); + const text: string = getEncounterText(this.scene, dialogue.text); if (dialogue.speaker) { - title = getTextWithEncounterDialogueTokensAndColor(this.scene, dialogue.speaker); + title = getEncounterText(this.scene, dialogue.speaker); } this.scene.ui.setMode(Mode.MESSAGE); diff --git a/src/test/mystery-encounter/mystery-encounter-utils.test.ts b/src/test/mystery-encounter/mystery-encounter-utils.test.ts index 63cbd83d975..cd03033ae3b 100644 --- a/src/test/mystery-encounter/mystery-encounter-utils.test.ts +++ b/src/test/mystery-encounter/mystery-encounter-utils.test.ts @@ -3,7 +3,7 @@ import GameManager from "#app/test/utils/gameManager"; import Phaser from "phaser"; import { getHighestLevelPlayerPokemon, getLowestLevelPlayerPokemon, - getRandomPlayerPokemon, getRandomSpeciesByStarterTier, getTextWithEncounterDialogueTokensAndColor, + getRandomPlayerPokemon, getRandomSpeciesByStarterTier, getEncounterText, koPlayerPokemon, queueEncounterMessage, showEncounterDialogue, showEncounterText, } from "#app/data/mystery-encounters/mystery-encounter-utils"; import {initSceneWithoutEncounterPhase} from "#test/utils/gameManagerUtils"; @@ -276,7 +276,7 @@ describe("Mystery Encounter Utils", () => { scene.currentBattle.mysteryEncounter = new MysteryEncounter(null); scene.currentBattle.mysteryEncounter.setDialogueToken("test", "value"); - const result = getTextWithEncounterDialogueTokensAndColor(scene, "mysteryEncounter:unit_test_dialogue"); + const result = getEncounterText(scene, "mysteryEncounter:unit_test_dialogue"); expect(result).toEqual("[color=#f8f8f8][shadow=#6b5a73]valuevalue @ec{testvalue} @ec{test1} value @ec{test\\} @ec{test\\} {test}[/color][/shadow]"); }); @@ -285,7 +285,7 @@ describe("Mystery Encounter Utils", () => { scene.currentBattle.mysteryEncounter.setDialogueToken("test", "value"); scene.currentBattle.mysteryEncounter.setDialogueToken("testvalue", "new"); - const result = getTextWithEncounterDialogueTokensAndColor(scene, "mysteryEncounter:unit_test_dialogue"); + const result = getEncounterText(scene, "mysteryEncounter:unit_test_dialogue"); expect(result).toEqual("[color=#f8f8f8][shadow=#6b5a73]valuevalue new @ec{test1} value @ec{test\\} @ec{test\\} {test}[/color][/shadow]"); }); }); diff --git a/src/test/phases/mystery-encounter-phase.test.ts b/src/test/phases/mystery-encounter-phase.test.ts index 0e9cce09f12..efe7dab810a 100644 --- a/src/test/phases/mystery-encounter-phase.test.ts +++ b/src/test/phases/mystery-encounter-phase.test.ts @@ -63,7 +63,7 @@ describe("Mystery Encounter Phases", () => { expect(game.scene.mysteryEncounterData.encounteredEvents.length).toBeGreaterThan(0); expect(game.scene.mysteryEncounterData.encounteredEvents[0][0]).toEqual(MysteryEncounterType.MYSTERIOUS_CHALLENGERS); - expect(game.scene.mysteryEncounterData.encounteredEvents[0][1]).toEqual(MysteryEncounterTier.UNCOMMON); + expect(game.scene.mysteryEncounterData.encounteredEvents[0][1]).toEqual(MysteryEncounterTier.GREAT); expect(game.scene.ui.getMode()).toBe(Mode.MYSTERY_ENCOUNTER); }); diff --git a/src/ui/mystery-encounter-ui-handler.ts b/src/ui/mystery-encounter-ui-handler.ts index 862fa155bf4..7714f280197 100644 --- a/src/ui/mystery-encounter-ui-handler.ts +++ b/src/ui/mystery-encounter-ui-handler.ts @@ -10,7 +10,7 @@ import MysteryEncounterOption from "../data/mystery-encounter-option"; import * as Utils from "../utils"; import {isNullOrUndefined} from "../utils"; import {getPokeballAtlasKey} from "../data/pokeball"; -import {getTextWithEncounterDialogueTokensAndColor} from "#app/data/mystery-encounters/mystery-encounter-utils"; +import {getEncounterText} from "#app/data/mystery-encounters/mystery-encounter-utils"; export default class MysteryEncounterUiHandler extends UiHandler { private cursorContainer: Phaser.GameObjects.Container; @@ -298,9 +298,9 @@ export default class MysteryEncounterUiHandler extends UiHandler { this.filteredEncounterOptions = mysteryEncounter.options; this.optionsMeetsReqs = []; - const titleText: string = getTextWithEncounterDialogueTokensAndColor(this.scene, mysteryEncounter.dialogue.encounterOptionsDialogue.title, TextStyle.TOOLTIP_TITLE); - const descriptionText: string = getTextWithEncounterDialogueTokensAndColor(this.scene, mysteryEncounter.dialogue.encounterOptionsDialogue.description, TextStyle.TOOLTIP_CONTENT); - const queryText: string = getTextWithEncounterDialogueTokensAndColor(this.scene, mysteryEncounter.dialogue.encounterOptionsDialogue.query, TextStyle.TOOLTIP_CONTENT); + const titleText: string = getEncounterText(this.scene, mysteryEncounter.dialogue.encounterOptionsDialogue.title, TextStyle.TOOLTIP_TITLE); + const descriptionText: string = getEncounterText(this.scene, mysteryEncounter.dialogue.encounterOptionsDialogue.description, TextStyle.TOOLTIP_CONTENT); + const queryText: string = getEncounterText(this.scene, mysteryEncounter.dialogue.encounterOptionsDialogue.query, TextStyle.TOOLTIP_CONTENT); // Clear options container (except cursor) this.optionsContainer.removeAll(); @@ -320,7 +320,7 @@ export default class MysteryEncounterUiHandler extends UiHandler { break; } const option = mysteryEncounter.dialogue.encounterOptionsDialogue.options[i]; - const text = getTextWithEncounterDialogueTokensAndColor(this.scene, option.buttonLabel, option.style ? option.style : TextStyle.WINDOW); + const text = getEncounterText(this.scene, option.buttonLabel, option.style ? option.style : TextStyle.WINDOW); if (text) { optionText.setText(text); } @@ -416,15 +416,15 @@ export default class MysteryEncounterUiHandler extends UiHandler { let text; const option = mysteryEncounter.dialogue.encounterOptionsDialogue.options[cursor]; if (!this.optionsMeetsReqs[cursor] && option.disabledTooltip) { - text = getTextWithEncounterDialogueTokensAndColor(this.scene, option.disabledTooltip, TextStyle.TOOLTIP_CONTENT); + text = getEncounterText(this.scene, option.disabledTooltip, TextStyle.TOOLTIP_CONTENT); } else { - text = getTextWithEncounterDialogueTokensAndColor(this.scene, option.buttonTooltip, TextStyle.TOOLTIP_CONTENT); + text = getEncounterText(this.scene, option.buttonTooltip, TextStyle.TOOLTIP_CONTENT); } // Auto-color options green/blue for good/bad by looking for (+)/(-) const primaryStyleString = [...text.match(new RegExp(/\[color=[^\[]*\]\[shadow=[^\[]*\]/i))][0]; - text = text.replace(/(\([^\(]*\+\)[^\(\[]*)/gi, substring => "[/color][/shadow]" + getBBCodeFrag(substring, TextStyle.SUMMARY_GREEN) + "[/color][/shadow]" + primaryStyleString); - text = text.replace(/(\([^\(]*\-\)[^\(\[]*)/gi, substring => "[/color][/shadow]" + getBBCodeFrag(substring, TextStyle.SUMMARY_BLUE) + "[/color][/shadow]" + primaryStyleString); + text = text.replace(/(\(\+\)[^\(\[]*)/gi, substring => "[/color][/shadow]" + getBBCodeFrag(substring, TextStyle.SUMMARY_GREEN) + "[/color][/shadow]" + primaryStyleString); + text = text.replace(/(\(\-\)[^\(\[]*)/gi, substring => "[/color][/shadow]" + getBBCodeFrag(substring, TextStyle.SUMMARY_BLUE) + "[/color][/shadow]" + primaryStyleString); if (text) { const tooltipTextObject = addBBCodeTextObject(this.scene, 6, 7, text, TextStyle.TOOLTIP_CONTENT, { wordWrap: { width: 600 }, fontSize: "72px" }); diff --git a/src/ui/text.ts b/src/ui/text.ts index 2a12e883deb..482e01ea29a 100644 --- a/src/ui/text.ts +++ b/src/ui/text.ts @@ -171,6 +171,34 @@ export function getBBCodeFrag(content: string, textStyle: TextStyle, uiTheme: Ui return `[color=${getTextColor(textStyle, false, uiTheme)}][shadow=${getTextColor(textStyle, true, uiTheme)}]${content}`; } +/** + * Should only be used with BBCodeText (see addBBCodeTextObject()) + * This does NOT work with UI showText() or showDialogue() methods. + * Method will do pattern match/replace and apply BBCode color/shadow styling to substrings within the content: + * @[]{} + * + * Example: passing a content string of "@[SUMMARY_BLUE]{blue text} primaryStyle text @[SUMMARY_RED]{red text}" will result in: + * - "blue text" with TextStyle.SUMMARY_BLUE applied + * - " primaryStyle text " with primaryStyle TextStyle applied + * - "red text" with TextStyle.SUMMARY_RED applied + * @param content - string with styling that need to be applied for BBCodeTextObject + * @param primaryStyle - primary style is required in order to escape BBCode styling properly. + * @param uiTheme + */ +export function getTextWithColors(content: string, primaryStyle: TextStyle, uiTheme: UiTheme = UiTheme.DEFAULT): string { + // Apply primary styling before anything else + let text = getBBCodeFrag(content, primaryStyle, uiTheme) + "[/color][/shadow]"; + const primaryStyleString = [...text.match(new RegExp(/\[color=[^\[]*\]\[shadow=[^\[]*\]/i))][0]; + + // Set custom colors + text = text.replace(/@\[([^{]*)\]{([^}]*)}/gi, (substring, textStyle: string, textToColor: string) => { + return "[/color][/shadow]" + getBBCodeFrag(textToColor, TextStyle[textStyle], uiTheme) + "[/color][/shadow]" + primaryStyleString; + }); + + // Remove extra style block at the end + return text.replace(/\[color=[^\[]*\]\[shadow=[^\[]*\]\[\/color\]\[\/shadow\]/gi, ""); +} + export function getTextColor(textStyle: TextStyle, shadow?: boolean, uiTheme: UiTheme = UiTheme.DEFAULT): string { switch (textStyle) { case TextStyle.MESSAGE: From e7c101dda137d8fb090d4c5d89b56a2d157b55c2 Mon Sep 17 00:00:00 2001 From: InnocentGameDev Date: Wed, 10 Jul 2024 00:59:15 +0200 Subject: [PATCH 017/270] Big Roadmap update, leading to Projects migration. Refactors in the Readme. --- MEs-Roadmap-Documentation.md | 142 +++++++++++++---------------------- 1 file changed, 54 insertions(+), 88 deletions(-) diff --git a/MEs-Roadmap-Documentation.md b/MEs-Roadmap-Documentation.md index 97e61e0513a..7d8b31538c5 100644 --- a/MEs-Roadmap-Documentation.md +++ b/MEs-Roadmap-Documentation.md @@ -1,59 +1,48 @@ -# 📝 Most immediate things to-do list +# 📝 Things to be done before Mystery Encounters ("MEs/Events") goes __live__: -- ### High priority - - ⚙️ Add a tag system so MEs to filter or change spawn rates in Challenge runs: - - noChallenge (cant be spawned in challenge runs) - - allChallenge (can spawn in all challenge modes) - - (typespecific)Challenge: - - Example: fireOnly (can only spawn in fire related challenges) - -- ### Medium priority - - ⚙️ Update Chest visuals for Mysterious Chest (with animated chest) - -- ### Low priority - - 🐛 Mysterious Challengers can spawn two trainers (or three) of the same type [Dev comment: not a bug] - - 🐛 Fight or Flight intro visuals may show different gender from the actual spawned pokemon - -# 📝 Things to be done before Mystery Encounters ("MEs/Events") MVP is finished: - All the things on this list should be done before an MVP (Minimum Viable Product) can be playtested. - -- ## Bugless implementation of the MVP MEs - - Establish placeholder waves for MEs to happen ✔️ - - ⚪ Bug-free implementation of Common ME 1 ('Mysterious Chest')✔️ - - ⚪ Bug-free implementation of Common ME 2 ('Fight or Flight')✔️ - - 🔵 Bug-free implementation of Rare ME 1 ('Mysterious Challenger')✔️ - - 🔵 Bug-free implementation of Rare ME 2 ('Sleeping Snorlax') 🛠️ - - 🟣 Bug-free implementation of Epic ME 1 ('Training Session') 🛠️ - - 🟡 Bug-free implementation of Legendary ME 1 ('Dark Deal') ✔️ - -- ## First round of playtesting (Alpha) +- ## 1: First round of playtesting (Beta PokéRogue) - First round of feedback on bugs for more slippery bugs 🛠️ - First round of balance feedback on odds and power-level 🛠️ - Tweak difficulty/rewards balance in MEs 🛠️ - ## Translation of MEs after playtest/balance - - First round of translators feedback to avoid potential issues 🛠️ - - EN localisation 🛠️ - - ES localisation 🛠️ +- ## 2.1: More requirements (with helper functions) + - Having X item 🛠️ + - Having Y amount of X item 🛠️ + - A Pokémon X in player's party can learn Y move 🛠️ + - A Pokémon X in player's party knows Y move ✔️ + - A Pokémon X in player's party has Y ability 🛠️ + - A Pokémon X in player's party belongs to a pre-defined pool (ie. "Ultrabeasts") 🛠️ -# 📝 Things to be done before Mystery Encounters ("MEs/Events") goes __live__: - All the things on this list should be done before the merge to main. +- ## 2.2: More outcomes (with helper functions) + - Status one or many Pokémon if your party -- if they can be statused ✔️ + - Damage one or many Pokémon in your party ✔️ + - Set a hazard (ally or foe side) 🛠️ + - Set a weather 🛠️ + - Give the player a Pokémon from a pool 🛠️ + - XP to a Pokémon ✔️ + - Add logic for choosing a Pokémon from party for some effect ✔️ + - Add logic for awarding exp to the party ✔️ + - Encounter/pull a PKMN from a pre-defined pool (ie. "Ultrabeasts") ✔️ -- ## Bugless implementation of the MVP MEs +- ## 2.3: Other wanted utils + - IV changes visuals for improving starter IVs in Events 🛠️ + +- ## 2.4: Bugless implementation of the MVP MEs - Bugless implementation of about 55-60 MEs - 20 non-biome-dependant: - ⚪ 9 Common Events - - 🔵 5 Rare Events - - 🟣 4 Epic Events - - 🟡 2 Legendary Events - - 35-40 biome-dependant Events, at least one for each biome + - 🔵 5 Great Events + - 🟡 4 Ultra Events + - 🔴 2 Rogue Events + - ⚪/🔵/🟡 35-40 biome-dependant Events, at least one for each biome -- ## Second round of playtesting (Beta) - - Second round of feedback for bugs ❌ - - Second round of balance feedback ❌ - - Final decisions on balance, powerlevel, odds and design choices before live feedback ❌ +- ## 3.0: Continuous playtesting (Beta PokéRogue) + - More rounds of feedback on bugs for more slippery bugs 🛠️ + - More rounds of balance feedback on odds and power-level 🛠️ + - Tweak difficulty/rewards balance in MEs 🛠️ - ## Translation of MEs after playtest/balance +- ## Translation of MEs after playtest/balance + - First round of translators feedback to avoid potential issues 🛠️ - de localisation 🛠️ - en localisation 🛠️ - es-ES localisation 🛠️ @@ -66,9 +55,10 @@ - zh-TW localisation 🛠️ -# 🧬 Deep dive into Events and what has been done so far +# So, __what__ are Events? 🧬 +## (A deep dive into Events and what has been done so far) -Events (referred to as 'Mysterious Encounters, MEs' in the code) aim to be an addition to PokeRogue that will fundamentally shift the way PokéRogue feels. It looks to improve the bet of the game into the RogueLike genre without touching the core gameplay loop of Pokémon battles/collection that we know and love already in this game. Below there are some specifications that clarify what's being worked on for ease of access for the devs, balance team, artists and others who may be interested. Beware of spoilers! +Events (referred to as '__Mysterious Encounters, MEs__' in the code) aim to be an addition to PokeRogue that will fundamentally shift the way PokéRogue feels. It looks to improve the bet of the game into the RogueLike genre without touching the core gameplay loop of Pokémon battles/collection that we know and love already in this game. Below there are some specifications that clarify what's being worked on for ease of access for the devs, balance team, wiki editors, artists and others who may be interested. Beware of spoilers! ## An Event __**always has**__: ### #️⃣ A wave index where they're happening -- each ME takes up a whole wave (means you miss a combat!). @@ -106,9 +96,9 @@ Events (referred to as 'Mysterious Encounters, MEs' in the code) aim to be an ad ### 🌟 **Rarity** tier of the ME, common by default. - ⚪ Common pool - - 🔵 Uncommon pool - - 🟣 Rare pool - - 🟡 Super Rare pool + - 🔵 Great pool + - 🟡 Ultra pool + - 🔴 Rogue pool ### **Optional Requirements** for Mystery Encounters. - 🛠️ They give granular control over whether encounters will spawn in certain situations @@ -133,44 +123,6 @@ Events (referred to as 'Mysterious Encounters, MEs' in the code) aim to be an ad - Remove a PKMN from the player's party ✔️ - Steal from player ❌ -# 📝 Known bugs (squash 'em all!): - - ## 🔴 __**Really bad ones**__ - - - ## 🟡 __**Bad ones under certain circumstances**__ - - 🐛 Needs further replication : At wave 51, wild PKMN encounter caused a freezed after pressing "ESC" key upon being asked to switch PKMNs - - 🐛 Wave seed generates different encounter data if you roll to a new wave, see the spawned stuff, and refresh the app - - - ## 🟢 __**Non-game breaking**__ - - Both of these bugs seem to have in common that they don't "forget" their last passed string: - - 🐛 Scientist will remember the first PKMN it "did the thing on" and never ever forget it, even in future runs. Only affects dialogue. - - 🐛 Tooltip bug in Events. When showing the tooltip of the 2nd or later Event you've found, the tooltip for the first option will match whatever option you selected in the previous Event. This wrong tooltip gets overriden once you move the cursor. - -# 🗿 Other cool things/functionalities that won't make it in the MVP but are planned to accomodate future MEs: - -### QoL improvements -- Dialogue references to __**good**__ outcomes will be colored 🟢, __**bad**__ ones in 🔴 and __**ambiguous**__ or __**mixed**__, in 🟡 - - Helps with quick glances when 5x speed - -#### More requirements (with helper functions) -- Having X item -- Having Y amount of X item -- A Pokémon X in player's party can learn Y move -- A Pokémon X in player's party knows Y move -- A Pokémon X in player's party has Y ability -- A Pokémon X in player's party belongs to a pre-defined pool (ie. "Ultrabeasts") - -#### More outcomes (with helper functions) -- Status one or many Pokémon if your party -- if they can be statused -- Damage one or many Pokémon in your party -- Set a hazard (ally or foe side) -- Set a weather -- Give the player a Pokémon from a pool (useful for reg. professors/traders) -- XP to a Pokémon (similar to rare candy?) -- Add logic for choosing a Pokémon from party for some effect (trades, sacrifices, etc) -- Add logic for awarding exp to the party (outside of a normal combat) -- Encounter/pull a PKMN from a pre-defined pool (ie. "Ultrabeasts") - - # Log Documentation ## 12th-13th June @@ -188,7 +140,21 @@ Events (referred to as 'Mysterious Encounters, MEs' in the code) aim to be an ad - The 🐛 "Picking up certain items in Fight or Flight works poorly" has been squashed. - The 🐛 "Modifiers that are applied to pokemon get skipped in Fight or Flight" has been squashed. - ⚙️ Added "Omniboost" functionality (Fight or Flight ME) -- The 🐛 "Wave seed generates different encounter data if you roll to a new wave, see the spawned stuff, and refresh the app" has been squashed. +- The 🐛 "Wave seed generates different encounter data if you roll to a new wave, see the spawned stuff, and refresh the app" has been squashed. But we are still watching this one just in case 🕵️ - The 🐛 "Type-buffing items (like Silk Scarf) get swapped around when offered as a reward in Fight or Flight" has been squashed. - ⚖️ Adjusted Dark Deal odds to show 6-7 cost PKMNs at a much higher rate (70%) than 8-cost (20%) or 9-cost (10%), to avoid box legendaries being overly present. - The 🐛 about "Tooltips being remembered from the previous ME choice until you hovered a different option" is squashed. + +## 01st-10th June; MVP ready! +- MVP threshold reached! Whoop whoop! Here's what we had set up to do and accomplished: + - ### Bugless implementation of the MVP MEs + - The framework for Events and all the helper functions. 💖 + Literally this didn't exist and is the backbone for any Event to to happen! 😅 + - ⚪ Bug-free implementation of Common ME 1 ('Mysterious Chest')✔️ + - ⚪ Bug-free implementation of Common ME 2 ('Fight or Flight')✔️ + - 🔵 Bug-free implementation of Great ME 1 ('Mysterious Challenger')✔️ + - 🟡 Bug-free implementation of Ultra ME 1 ('Training Session') ✔️ + - 🔴 Bug-free implementation of Rogue ME 1 ('Dark Deal') ✔️ +- Lots of QoL added. +- Refactor the rarity of Events +- Scrapped much of the Readme to keep it simpler, as we prepare to move onto GitHub Projects for better organization From 521788a7fb4707dd3e5648d94a5e1a4a914a47ae Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Tue, 9 Jul 2024 16:22:05 -0700 Subject: [PATCH 018/270] add mystery_event.yml issue form --- .github/ISSUE_TEMPLATE/mystery_event.yml | 93 ++++++++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/mystery_event.yml diff --git a/.github/ISSUE_TEMPLATE/mystery_event.yml b/.github/ISSUE_TEMPLATE/mystery_event.yml new file mode 100644 index 00000000000..b199186edb5 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/mystery_event.yml @@ -0,0 +1,93 @@ +name: Mystery Event +description: Propose a new mystery event +title: "[Event]: " +body: + - type: dropdown + id: rarity + attributes: + label: Rarity + multiple: false + options: + - Common (~4/8) + - Uncommon (~2/8) + - Rare + - Epic + - Legendary (~0.5/8 or 1 per 2 Classic runs) + - Other (please specify) + validations: + required: true + - type: input + id: floors + attributes: + label: Floors + placeholder: 1-200 + validations: + required: true + - type: textarea + id: description + attributes: + label: What is it? + validations: + required: true + - type: dropdown + id: biomes + attributes: + label: Biomes + multiple: true + options: + - any (no need to select all) + - TOWN + - PLAINS + - GRASS + - TALL_GRASS + - METROPOLIS + - FOREST + - SEA + - SWAMP + - BEACH + - LAKE + - SEABED + - MOUNTAIN + - BADLANDS + - CAVE + - DESERT + - ICE_CAVE + - MEADOW + - POWER_PLANT + - VOLCANO + - GRAVEYARD + - DOJO + - FACTORY + - RUINS + - WASTELAND + - ABYSS + - SPACE + - CONSTRUCTION_SITE + - JUNGLE + - FAIRY_CAVE + - TEMPLE + - SLUM + - SNOWY_FOREST + - ISLAND + - LABORATORY + - END + validations: + required: truea + - type: textarea + id: options + attributes: + label: Options offered + validations: + required: true + - type: textarea + id: design-notes + attributes: + label: Notes on Design + validations: + required: false + - type: textarea + id: dev-notes + attributes: + label: Notes to Devs + validations: + required: false From 2229d4df3f6b7b7ddd726b0c977db92ca170c709 Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Tue, 9 Jul 2024 16:23:16 -0700 Subject: [PATCH 019/270] remove typo in mystery_event.yml --- .github/ISSUE_TEMPLATE/mystery_event.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/mystery_event.yml b/.github/ISSUE_TEMPLATE/mystery_event.yml index b199186edb5..381dcd25252 100644 --- a/.github/ISSUE_TEMPLATE/mystery_event.yml +++ b/.github/ISSUE_TEMPLATE/mystery_event.yml @@ -72,7 +72,7 @@ body: - LABORATORY - END validations: - required: truea + required: true - type: textarea id: options attributes: From 7c318fdfbdd1f2ed3744959e37cbf4c803c756de Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Tue, 9 Jul 2024 16:27:35 -0700 Subject: [PATCH 020/270] exampel commit --- .github/ISSUE_TEMPLATE/mystery_event.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/ISSUE_TEMPLATE/mystery_event.yml b/.github/ISSUE_TEMPLATE/mystery_event.yml index 381dcd25252..b2735c3f534 100644 --- a/.github/ISSUE_TEMPLATE/mystery_event.yml +++ b/.github/ISSUE_TEMPLATE/mystery_event.yml @@ -27,6 +27,7 @@ body: id: description attributes: label: What is it? + placeholder: Describe the event you are proposing validations: required: true - type: dropdown From fc25c3b55e3e2509d0f020409269234b233bf05a Mon Sep 17 00:00:00 2001 From: InnocentGameDev Date: Wed, 10 Jul 2024 01:39:04 +0200 Subject: [PATCH 021/270] Modified Event Proposal Issue template --- .github/ISSUE_TEMPLATE/mystery_event.yml | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/mystery_event.yml b/.github/ISSUE_TEMPLATE/mystery_event.yml index b2735c3f534..fd6456d2f81 100644 --- a/.github/ISSUE_TEMPLATE/mystery_event.yml +++ b/.github/ISSUE_TEMPLATE/mystery_event.yml @@ -1,6 +1,6 @@ name: Mystery Event description: Propose a new mystery event -title: "[Event]: " +title: "[Event Proposal]: " body: - type: dropdown id: rarity @@ -8,19 +8,18 @@ body: label: Rarity multiple: false options: - - Common (~4/8) - - Uncommon (~2/8) - - Rare - - Epic - - Legendary (~0.5/8 or 1 per 2 Classic runs) + - Common + - Great + - Ultra + - Rogue - Other (please specify) validations: required: true - type: input - id: floors + id: waves attributes: - label: Floors - placeholder: 1-200 + label: Waves + placeholder: 1-200 (currently only 11-179 exist) validations: required: true - type: textarea @@ -37,6 +36,7 @@ body: multiple: true options: - any (no need to select all) + - non-extreme (almost all except Space, Seabed, etc...) - TOWN - PLAINS - GRASS @@ -78,17 +78,20 @@ body: id: options attributes: label: Options offered + placeholder: Only four options can be displayed at a time validations: required: true - type: textarea id: design-notes attributes: label: Notes on Design + placeholder: (If any needed) validations: required: false - type: textarea id: dev-notes attributes: label: Notes to Devs + placeholder: (If any needed) validations: required: false From efb00553c9de1ee4dc455f50394e3d05691d0110 Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Tue, 9 Jul 2024 23:19:44 -0400 Subject: [PATCH 022/270] styling and text coloring fixes --- .../dialogue/dark-deal-dialogue.ts | 2 +- .../department-store-sale-dialogue.ts | 2 +- .../dialogue/fight-or-flight-dialogue.ts | 2 +- .../mysterious-challengers-dialogue.ts | 2 +- .../dialogue/mysterious-chest-dialogue.ts | 2 +- .../dialogue/shady-vitamin-dealer.ts | 2 +- .../dialogue/sleeping-snorlax-dialogue.ts | 2 +- .../dialogue/training-session-dialogue.ts | 2 +- .../{ => encounters}/dark-deal.ts | 26 ++--- .../{ => encounters}/department-store-sale.ts | 22 ++-- .../{ => encounters}/fight-or-flight.ts | 32 ++--- .../mysterious-challengers.ts | 10 +- .../{ => encounters}/mysterious-chest.ts | 18 +-- .../{ => encounters}/mystery-encounters.ts | 102 +++++----------- .../{ => encounters}/shady-vitamin-dealer.ts | 20 ++-- .../{ => encounters}/sleeping-snorlax.ts | 26 ++--- .../{ => encounters}/training-session.ts | 39 ++++--- .../mystery-encounter-data.ts | 8 +- .../mystery-encounter-dialogue.ts | 22 ++-- .../mystery-encounter-option.ts | 23 ++-- .../mystery-encounter-requirements.ts | 110 +++++++++--------- .../mystery-encounter-utils.ts | 46 ++++---- .../mystery-encounter.ts | 36 +++--- src/field/mystery-encounter-intro.ts | 4 +- src/loading-scene.ts | 4 +- src/locales/en/mystery-encounter.ts | 2 +- src/overrides.ts | 2 +- src/phases.ts | 2 +- src/phases/battle-phase.ts | 4 +- src/phases/mystery-encounter-phase.ts | 10 +- src/phases/select-modifier-phase.ts | 18 +-- src/system/game-data.ts | 4 +- .../mystery-encounter-utils.test.ts | 12 +- .../phases/mystery-encounter-phase.test.ts | 6 +- src/ui/modifier-select-ui-handler.ts | 14 +-- src/ui/mystery-encounter-ui-handler.ts | 2 +- 36 files changed, 302 insertions(+), 338 deletions(-) rename src/data/mystery-encounters/{ => encounters}/dark-deal.ts (83%) rename src/data/mystery-encounters/{ => encounters}/department-store-sale.ts (86%) rename src/data/mystery-encounters/{ => encounters}/fight-or-flight.ts (87%) rename src/data/mystery-encounters/{ => encounters}/mysterious-challengers.ts (95%) rename src/data/mystery-encounters/{ => encounters}/mysterious-chest.ts (89%) rename src/data/mystery-encounters/{ => encounters}/mystery-encounters.ts (70%) rename src/data/mystery-encounters/{ => encounters}/shady-vitamin-dealer.ts (89%) rename src/data/mystery-encounters/{ => encounters}/sleeping-snorlax.ts (82%) rename src/data/mystery-encounters/{ => encounters}/training-session.ts (90%) rename src/data/{ => mystery-encounters}/mystery-encounter-data.ts (53%) rename src/data/mystery-encounters/{dialogue => }/mystery-encounter-dialogue.ts (78%) rename src/data/{ => mystery-encounters}/mystery-encounter-option.ts (89%) rename src/data/{ => mystery-encounters}/mystery-encounter-requirements.ts (93%) rename src/data/{ => mystery-encounters}/mystery-encounter.ts (94%) diff --git a/src/data/mystery-encounters/dialogue/dark-deal-dialogue.ts b/src/data/mystery-encounters/dialogue/dark-deal-dialogue.ts index 2fe86b04640..25b31f79a50 100644 --- a/src/data/mystery-encounters/dialogue/dark-deal-dialogue.ts +++ b/src/data/mystery-encounters/dialogue/dark-deal-dialogue.ts @@ -1,4 +1,4 @@ -import MysteryEncounterDialogue from "#app/data/mystery-encounters/dialogue/mystery-encounter-dialogue"; +import MysteryEncounterDialogue from "#app/data/mystery-encounters/mystery-encounter-dialogue"; export const DarkDealDialogue: MysteryEncounterDialogue = { intro: [ diff --git a/src/data/mystery-encounters/dialogue/department-store-sale-dialogue.ts b/src/data/mystery-encounters/dialogue/department-store-sale-dialogue.ts index 3a9b75b9f83..87cd8dbda55 100644 --- a/src/data/mystery-encounters/dialogue/department-store-sale-dialogue.ts +++ b/src/data/mystery-encounters/dialogue/department-store-sale-dialogue.ts @@ -1,4 +1,4 @@ -import MysteryEncounterDialogue from "#app/data/mystery-encounters/dialogue/mystery-encounter-dialogue"; +import MysteryEncounterDialogue from "#app/data/mystery-encounters/mystery-encounter-dialogue"; export const DepartmentStoreSaleDialogue: MysteryEncounterDialogue = { intro: [ diff --git a/src/data/mystery-encounters/dialogue/fight-or-flight-dialogue.ts b/src/data/mystery-encounters/dialogue/fight-or-flight-dialogue.ts index 300f6c45992..93d46548d7f 100644 --- a/src/data/mystery-encounters/dialogue/fight-or-flight-dialogue.ts +++ b/src/data/mystery-encounters/dialogue/fight-or-flight-dialogue.ts @@ -1,4 +1,4 @@ -import MysteryEncounterDialogue from "#app/data/mystery-encounters/dialogue/mystery-encounter-dialogue"; +import MysteryEncounterDialogue from "#app/data/mystery-encounters/mystery-encounter-dialogue"; export const FightOrFlightDialogue: MysteryEncounterDialogue = { intro: [ diff --git a/src/data/mystery-encounters/dialogue/mysterious-challengers-dialogue.ts b/src/data/mystery-encounters/dialogue/mysterious-challengers-dialogue.ts index a5699736a36..065cfceb1b7 100644 --- a/src/data/mystery-encounters/dialogue/mysterious-challengers-dialogue.ts +++ b/src/data/mystery-encounters/dialogue/mysterious-challengers-dialogue.ts @@ -1,4 +1,4 @@ -import MysteryEncounterDialogue from "#app/data/mystery-encounters/dialogue/mystery-encounter-dialogue"; +import MysteryEncounterDialogue from "#app/data/mystery-encounters/mystery-encounter-dialogue"; export const MysteriousChallengersDialogue: MysteryEncounterDialogue = { intro: [ diff --git a/src/data/mystery-encounters/dialogue/mysterious-chest-dialogue.ts b/src/data/mystery-encounters/dialogue/mysterious-chest-dialogue.ts index cc14670d5b4..ba8dafc6826 100644 --- a/src/data/mystery-encounters/dialogue/mysterious-chest-dialogue.ts +++ b/src/data/mystery-encounters/dialogue/mysterious-chest-dialogue.ts @@ -1,4 +1,4 @@ -import MysteryEncounterDialogue from "#app/data/mystery-encounters/dialogue/mystery-encounter-dialogue"; +import MysteryEncounterDialogue from "#app/data/mystery-encounters/mystery-encounter-dialogue"; export const MysteriousChestDialogue: MysteryEncounterDialogue = { intro: [ diff --git a/src/data/mystery-encounters/dialogue/shady-vitamin-dealer.ts b/src/data/mystery-encounters/dialogue/shady-vitamin-dealer.ts index 4a9d48913c5..cb0c5ac130e 100644 --- a/src/data/mystery-encounters/dialogue/shady-vitamin-dealer.ts +++ b/src/data/mystery-encounters/dialogue/shady-vitamin-dealer.ts @@ -1,4 +1,4 @@ -import MysteryEncounterDialogue from "#app/data/mystery-encounters/dialogue/mystery-encounter-dialogue"; +import MysteryEncounterDialogue from "#app/data/mystery-encounters/mystery-encounter-dialogue"; export const ShadyVitaminDealerDialogue: MysteryEncounterDialogue = { intro: [ diff --git a/src/data/mystery-encounters/dialogue/sleeping-snorlax-dialogue.ts b/src/data/mystery-encounters/dialogue/sleeping-snorlax-dialogue.ts index 0d9381d8278..c10835f728e 100644 --- a/src/data/mystery-encounters/dialogue/sleeping-snorlax-dialogue.ts +++ b/src/data/mystery-encounters/dialogue/sleeping-snorlax-dialogue.ts @@ -1,4 +1,4 @@ -import MysteryEncounterDialogue from "#app/data/mystery-encounters/dialogue/mystery-encounter-dialogue"; +import MysteryEncounterDialogue from "#app/data/mystery-encounters/mystery-encounter-dialogue"; export const SleepingSnorlaxDialogue: MysteryEncounterDialogue = { intro: [ diff --git a/src/data/mystery-encounters/dialogue/training-session-dialogue.ts b/src/data/mystery-encounters/dialogue/training-session-dialogue.ts index 9f49fc389b6..87f30ca14c2 100644 --- a/src/data/mystery-encounters/dialogue/training-session-dialogue.ts +++ b/src/data/mystery-encounters/dialogue/training-session-dialogue.ts @@ -1,4 +1,4 @@ -import MysteryEncounterDialogue from "#app/data/mystery-encounters/dialogue/mystery-encounter-dialogue"; +import MysteryEncounterDialogue from "#app/data/mystery-encounters/mystery-encounter-dialogue"; export const TrainingSessionDialogue: MysteryEncounterDialogue = { intro: [ diff --git a/src/data/mystery-encounters/dark-deal.ts b/src/data/mystery-encounters/encounters/dark-deal.ts similarity index 83% rename from src/data/mystery-encounters/dark-deal.ts rename to src/data/mystery-encounters/encounters/dark-deal.ts index a092613b612..a78144347af 100644 --- a/src/data/mystery-encounters/dark-deal.ts +++ b/src/data/mystery-encounters/encounters/dark-deal.ts @@ -1,22 +1,22 @@ -import BattleScene from "../../battle-scene"; -import {AddPokeballModifierType} from "../../modifier/modifier-type"; +import BattleScene from "../../../battle-scene"; +import { AddPokeballModifierType } from "../../../modifier/modifier-type"; import { EnemyPartyConfig, EnemyPokemonConfig, getRandomPlayerPokemon, getRandomSpeciesByStarterTier, initBattleWithEnemyConfig, leaveEncounterWithoutBattle -} from "./mystery-encounter-utils"; -import MysteryEncounter, {MysteryEncounterBuilder, MysteryEncounterTier} from "../mystery-encounter"; -import {ModifierRewardPhase} from "#app/phases"; -import {getPokemonSpecies} from "../pokemon-species"; -import {MysteryEncounterType} from "#enums/mystery-encounter-type"; -import {PokeballType} from "../pokeball"; -import {PartySizeRequirement, WaveCountRequirement} from "../mystery-encounter-requirements"; -import {MysteryEncounterOptionBuilder} from "../mystery-encounter-option"; -import {Type} from "#app/data/type"; -import {Species} from "#enums/species"; -import {isNullOrUndefined, randSeedInt} from "#app/utils"; +} from "../mystery-encounter-utils"; +import MysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier } from "../mystery-encounter"; +import { ModifierRewardPhase } from "#app/phases"; +import { getPokemonSpecies } from "../../pokemon-species"; +import { MysteryEncounterType } from "#enums/mystery-encounter-type"; +import { PokeballType } from "../../pokeball"; +import { PartySizeRequirement, WaveCountRequirement } from "../mystery-encounter-requirements"; +import { MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; +import { Type } from "#app/data/type"; +import { Species } from "#enums/species"; +import { isNullOrUndefined, randSeedInt } from "#app/utils"; // Exclude Ultra Beasts, Paradox, Necrozma, Eternatus, and egg-locked mythicals const excludedBosses = [ diff --git a/src/data/mystery-encounters/department-store-sale.ts b/src/data/mystery-encounters/encounters/department-store-sale.ts similarity index 86% rename from src/data/mystery-encounters/department-store-sale.ts rename to src/data/mystery-encounters/encounters/department-store-sale.ts index 6ed4bce5262..935ed635f9e 100644 --- a/src/data/mystery-encounters/department-store-sale.ts +++ b/src/data/mystery-encounters/encounters/department-store-sale.ts @@ -1,15 +1,15 @@ -import BattleScene from "../../battle-scene"; +import BattleScene from "../../../battle-scene"; import { leaveEncounterWithoutBattle, setEncounterExp, setEncounterRewards, } from "#app/data/mystery-encounters/mystery-encounter-utils"; -import MysteryEncounter, {MysteryEncounterBuilder, MysteryEncounterTier} from "../mystery-encounter"; +import MysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier } from "../mystery-encounter"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; -import {WaveCountRequirement} from "../mystery-encounter-requirements"; +import { WaveCountRequirement } from "../mystery-encounter-requirements"; import { MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; -import {modifierTypes} from "#app/modifier/modifier-type"; -import {Species} from "#enums/species"; -import {randSeedInt} from "#app/utils"; +import { modifierTypes } from "#app/modifier/modifier-type"; +import { Species } from "#enums/species"; +import { randSeedInt } from "#app/utils"; export const DepartmentStoreSaleEncounter: MysteryEncounter = new MysteryEncounterBuilder() .withEncounterType(MysteryEncounterType.DEPARTMENT_STORE_SALE) @@ -50,7 +50,7 @@ export const DepartmentStoreSaleEncounter: MysteryEncounter = new MysteryEncount } setEncounterExp(scene, scene.getParty().map(p => p.id), 300); - setEncounterRewards(scene, { guaranteedModifierTypeFuncs: modifiers, fillRemaining: false}); + setEncounterRewards(scene, { guaranteedModifierTypeFuncs: modifiers, fillRemaining: false }); leaveEncounterWithoutBattle(scene); }) .build()) @@ -70,7 +70,7 @@ export const DepartmentStoreSaleEncounter: MysteryEncounter = new MysteryEncount i++; } - setEncounterRewards(scene, { guaranteedModifierTypeFuncs: modifiers, fillRemaining: false}); + setEncounterRewards(scene, { guaranteedModifierTypeFuncs: modifiers, fillRemaining: false }); leaveEncounterWithoutBattle(scene); }) .build()) @@ -90,7 +90,7 @@ export const DepartmentStoreSaleEncounter: MysteryEncounter = new MysteryEncount i++; } - setEncounterRewards(scene, { guaranteedModifierTypeFuncs: modifiers, fillRemaining: false}); + setEncounterRewards(scene, { guaranteedModifierTypeFuncs: modifiers, fillRemaining: false }); leaveEncounterWithoutBattle(scene); }) .build()) @@ -108,13 +108,13 @@ export const DepartmentStoreSaleEncounter: MysteryEncounter = new MysteryEncount modifiers.push(modifierTypes.GREAT_BALL); } else if (roll < 60) { modifiers.push(modifierTypes.ULTRA_BALL); - } else { + } else { modifiers.push(modifierTypes.ROGUE_BALL); } i++; } - setEncounterRewards(scene, { guaranteedModifierTypeFuncs: modifiers, fillRemaining: false}); + setEncounterRewards(scene, { guaranteedModifierTypeFuncs: modifiers, fillRemaining: false }); leaveEncounterWithoutBattle(scene); }) .build()) diff --git a/src/data/mystery-encounters/fight-or-flight.ts b/src/data/mystery-encounters/encounters/fight-or-flight.ts similarity index 87% rename from src/data/mystery-encounters/fight-or-flight.ts rename to src/data/mystery-encounters/encounters/fight-or-flight.ts index 1deb26149ee..8669f6259fe 100644 --- a/src/data/mystery-encounters/fight-or-flight.ts +++ b/src/data/mystery-encounters/encounters/fight-or-flight.ts @@ -1,5 +1,5 @@ -import BattleScene from "../../battle-scene"; -import {ModifierTier} from "#app/modifier/modifier-tier"; +import BattleScene from "../../../battle-scene"; +import { ModifierTier } from "#app/modifier/modifier-tier"; import { EnemyPartyConfig, initBattleWithEnemyConfig, @@ -7,10 +7,10 @@ import { setEncounterRewards, showEncounterText } from "#app/data/mystery-encounters/mystery-encounter-utils"; -import MysteryEncounter, {MysteryEncounterBuilder, MysteryEncounterTier} from "../mystery-encounter"; -import {MysteryEncounterType} from "#enums/mystery-encounter-type"; -import {MoveRequirement, WaveCountRequirement} from "../mystery-encounter-requirements"; -import {MysteryEncounterOptionBuilder} from "../mystery-encounter-option"; +import MysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier } from "../mystery-encounter"; +import { MysteryEncounterType } from "#enums/mystery-encounter-type"; +import { MoveRequirement, WaveCountRequirement } from "../mystery-encounter-requirements"; +import { MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; import { getPartyLuckValue, getPlayerModifierTypeOptions, @@ -18,13 +18,13 @@ import { ModifierTypeOption, regenerateModifierPoolThresholds } from "#app/modifier/modifier-type"; -import {BattlerTagType} from "#enums/battler-tag-type"; -import {StatChangePhase} from "#app/phases"; -import {BattleStat} from "#app/data/battle-stat"; +import { BattlerTagType } from "#enums/battler-tag-type"; +import { StatChangePhase } from "#app/phases"; +import { BattleStat } from "#app/data/battle-stat"; import Pokemon from "#app/field/pokemon"; -import {randSeedInt} from "#app/utils"; -import {Moves} from "#enums/moves"; -import {TextStyle} from "#app/ui/text"; +import { randSeedInt } from "#app/utils"; +import { Moves } from "#enums/moves"; +import { TextStyle } from "#app/ui/text"; const validMovesForSteal = [ Moves.PLUCK, @@ -50,7 +50,7 @@ export const FightOrFlightEncounter: MysteryEncounter = new MysteryEncounterBuil const bossSpecies = scene.arena.randomSpecies(scene.currentBattle.waveIndex, scene.currentBattle.waveIndex, 0, getPartyLuckValue(scene.getParty()), true); const config: EnemyPartyConfig = { levelAdditiveMultiplier: 1, - pokemonConfigs: [{species: bossSpecies, isBoss: true}] + pokemonConfigs: [{ species: bossSpecies, isBoss: true }] }; encounter.enemyPartyConfigs = [config]; @@ -58,7 +58,7 @@ export const FightOrFlightEncounter: MysteryEncounter = new MysteryEncounterBuil // 10-60 GREAT, 60-110 ULTRA, 110-160 ROGUE, 160-180 MASTER const tier = scene.currentBattle.waveIndex > 160 ? ModifierTier.MASTER : scene.currentBattle.waveIndex > 110 ? ModifierTier.ROGUE : scene.currentBattle.waveIndex > 60 ? ModifierTier.ULTRA : ModifierTier.GREAT; regenerateModifierPoolThresholds(scene.getParty(), ModifierPoolType.PLAYER, 0); // refresh player item pool - const item = getPlayerModifierTypeOptions(1, scene.getParty(), [], { guaranteedModifierTiers: [tier]})[0]; + const item = getPlayerModifierTypeOptions(1, scene.getParty(), [], { guaranteedModifierTiers: [tier] })[0]; encounter.setDialogueToken("itemName", item.type.name); encounter.misc = item; @@ -103,7 +103,7 @@ export const FightOrFlightEncounter: MysteryEncounter = new MysteryEncounterBuil .withOptionPhase(async (scene: BattleScene) => { // Pick battle const item = scene.currentBattle.mysteryEncounter.misc as ModifierTypeOption; - setEncounterRewards(scene, { guaranteedModifierTypeOptions: [item], fillRemaining: false}); + setEncounterRewards(scene, { guaranteedModifierTypeOptions: [item], fillRemaining: false }); await initBattleWithEnemyConfig(scene, scene.currentBattle.mysteryEncounter.enemyPartyConfigs[0]); }) .build()) @@ -112,7 +112,7 @@ export const FightOrFlightEncounter: MysteryEncounter = new MysteryEncounterBuil // Pick steal const encounter = scene.currentBattle.mysteryEncounter; const item = scene.currentBattle.mysteryEncounter.misc as ModifierTypeOption; - setEncounterRewards(scene, { guaranteedModifierTypeOptions: [item], fillRemaining: false}); + setEncounterRewards(scene, { guaranteedModifierTypeOptions: [item], fillRemaining: false }); // If player has a stealing move, they succeed automatically const moveRequirement = new MoveRequirement(validMovesForSteal); diff --git a/src/data/mystery-encounters/mysterious-challengers.ts b/src/data/mystery-encounters/encounters/mysterious-challengers.ts similarity index 95% rename from src/data/mystery-encounters/mysterious-challengers.ts rename to src/data/mystery-encounters/encounters/mysterious-challengers.ts index 6986b738b4c..d3e753cc91b 100644 --- a/src/data/mystery-encounters/mysterious-challengers.ts +++ b/src/data/mystery-encounters/encounters/mysterious-challengers.ts @@ -1,9 +1,9 @@ -import BattleScene from "../../battle-scene"; +import BattleScene from "../../../battle-scene"; import { ModifierTier } from "#app/modifier/modifier-tier"; -import {modifierTypes} from "#app/modifier/modifier-type"; +import { modifierTypes } from "#app/modifier/modifier-type"; import { EnemyPartyConfig, initBattleWithEnemyConfig, setEncounterRewards } from "#app/data/mystery-encounters/mystery-encounter-utils"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; -import MysteryEncounter, {MysteryEncounterBuilder, MysteryEncounterTier} from "../mystery-encounter"; +import MysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier } from "../mystery-encounter"; import { MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; import { WaveCountRequirement } from "../mystery-encounter-requirements"; import { @@ -12,8 +12,8 @@ import { TrainerPartyTemplate, trainerPartyTemplates } from "#app/data/trainer-config"; -import * as Utils from "../../utils"; -import {PartyMemberStrength} from "#enums/party-member-strength"; +import * as Utils from "../../../utils"; +import { PartyMemberStrength } from "#enums/party-member-strength"; export const MysteriousChallengersEncounter: MysteryEncounter = new MysteryEncounterBuilder() .withEncounterType(MysteryEncounterType.MYSTERIOUS_CHALLENGERS) diff --git a/src/data/mystery-encounters/mysterious-chest.ts b/src/data/mystery-encounters/encounters/mysterious-chest.ts similarity index 89% rename from src/data/mystery-encounters/mysterious-chest.ts rename to src/data/mystery-encounters/encounters/mysterious-chest.ts index 7e221424650..9f8faf278fa 100644 --- a/src/data/mystery-encounters/mysterious-chest.ts +++ b/src/data/mystery-encounters/encounters/mysterious-chest.ts @@ -1,4 +1,4 @@ -import BattleScene from "../../battle-scene"; +import BattleScene from "../../../battle-scene"; import { ModifierTier } from "#app/modifier/modifier-tier"; import { getHighestLevelPlayerPokemon, @@ -8,12 +8,12 @@ import { setEncounterRewards, showEncounterText } from "#app/data/mystery-encounters/mystery-encounter-utils"; -import MysteryEncounter, {MysteryEncounterBuilder, MysteryEncounterTier} from "../mystery-encounter"; +import MysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier } from "../mystery-encounter"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; -import {WaveCountRequirement} from "../mystery-encounter-requirements"; +import { WaveCountRequirement } from "../mystery-encounter-requirements"; import { MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; -import {GameOverPhase} from "#app/phases"; -import {randSeedInt} from "#app/utils"; +import { GameOverPhase } from "#app/phases"; +import { randSeedInt } from "#app/utils"; export const MysteriousChestEncounter: MysteryEncounter = new MysteryEncounterBuilder() .withEncounterType(MysteryEncounterType.MYSTERIOUS_CHEST) @@ -42,25 +42,25 @@ export const MysteriousChestEncounter: MysteryEncounter = new MysteryEncounterBu const roll = randSeedInt(100); if (roll > 60) { // Choose between 2 COMMON / 2 GREAT tier items (40%) - setEncounterRewards(scene, { guaranteedModifierTiers: [ModifierTier.COMMON, ModifierTier.COMMON, ModifierTier.GREAT, ModifierTier.GREAT]}); + setEncounterRewards(scene, { guaranteedModifierTiers: [ModifierTier.COMMON, ModifierTier.COMMON, ModifierTier.GREAT, ModifierTier.GREAT] }); // Display result message then proceed to rewards queueEncounterMessage(scene, "mysteryEncounter:mysterious_chest_option_1_normal_result"); leaveEncounterWithoutBattle(scene); } else if (roll > 40) { // Choose between 3 ULTRA tier items (20%) - setEncounterRewards(scene, { guaranteedModifierTiers: [ModifierTier.ULTRA, ModifierTier.ULTRA, ModifierTier.ULTRA]}); + setEncounterRewards(scene, { guaranteedModifierTiers: [ModifierTier.ULTRA, ModifierTier.ULTRA, ModifierTier.ULTRA] }); // Display result message then proceed to rewards queueEncounterMessage(scene, "mysteryEncounter:mysterious_chest_option_1_good_result"); leaveEncounterWithoutBattle(scene); } else if (roll > 36) { // Choose between 2 ROGUE tier items (4%) - setEncounterRewards(scene, { guaranteedModifierTiers: [ModifierTier.ROGUE, ModifierTier.ROGUE]}); + setEncounterRewards(scene, { guaranteedModifierTiers: [ModifierTier.ROGUE, ModifierTier.ROGUE] }); // Display result message then proceed to rewards queueEncounterMessage(scene, "mysteryEncounter:mysterious_chest_option_1_great_result"); leaveEncounterWithoutBattle(scene); } else if (roll > 35) { // Choose 1 MASTER tier item (1%) - setEncounterRewards(scene, { guaranteedModifierTiers: [ModifierTier.MASTER]}); + setEncounterRewards(scene, { guaranteedModifierTiers: [ModifierTier.MASTER] }); // Display result message then proceed to rewards queueEncounterMessage(scene, "mysteryEncounter:mysterious_chest_option_1_amazing_result"); leaveEncounterWithoutBattle(scene); diff --git a/src/data/mystery-encounters/mystery-encounters.ts b/src/data/mystery-encounters/encounters/mystery-encounters.ts similarity index 70% rename from src/data/mystery-encounters/mystery-encounters.ts rename to src/data/mystery-encounters/encounters/mystery-encounters.ts index 003b544ce50..b9966d3891a 100644 --- a/src/data/mystery-encounters/mystery-encounters.ts +++ b/src/data/mystery-encounters/encounters/mystery-encounters.ts @@ -1,21 +1,21 @@ import MysteryEncounter from "../mystery-encounter"; -import {DarkDealEncounter} from "./dark-deal"; -import {MysteriousChallengersEncounter} from "./mysterious-challengers"; -import {MysteriousChestEncounter} from "./mysterious-chest"; -import {FightOrFlightEncounter} from "#app/data/mystery-encounters/fight-or-flight"; -import {TrainingSessionEncounter} from "#app/data/mystery-encounters/training-session"; -import { Biome } from "#app/enums/biome"; +import { DarkDealEncounter } from "./dark-deal"; +import { MysteriousChallengersEncounter } from "./mysterious-challengers"; +import { MysteriousChestEncounter } from "./mysterious-chest"; +import { FightOrFlightEncounter } from "#app/data/mystery-encounters/encounters/fight-or-flight"; +import { TrainingSessionEncounter } from "#app/data/mystery-encounters/encounters/training-session"; +import { Biome } from "#enums/biome"; import { SleepingSnorlaxEncounter } from "./sleeping-snorlax"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; -import {DepartmentStoreSaleEncounter} from "#app/data/mystery-encounters/department-store-sale"; -import {ShadyVitaminDealerEncounter} from "#app/data/mystery-encounters/shady-vitamin-dealer"; +import { DepartmentStoreSaleEncounter } from "#app/data/mystery-encounters/encounters/department-store-sale"; +import { ShadyVitaminDealerEncounter } from "#app/data/mystery-encounters/encounters/shady-vitamin-dealer"; // Spawn chance: (BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT + WIGHT_INCREMENT_ON_SPAWN_MISS * ) / 256 export const BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT = 1; export const WIGHT_INCREMENT_ON_SPAWN_MISS = 5; export const AVERAGE_ENCOUNTERS_PER_RUN_TARGET = 15; -export const allMysteryEncounters : {[encounterType:string]: MysteryEncounter} = {}; +export const allMysteryEncounters: { [encounterType: string]: MysteryEncounter } = {}; // Add MysteryEncounterType to biomes to enable it exclusively for those biomes // To enable an encounter in all biomes, do not add to this map @@ -23,7 +23,7 @@ export const mysteryEncountersByBiome = new Map([ [Biome.TOWN, [ MysteryEncounterType.DEPARTMENT_STORE_SALE ]], - [Biome.PLAINS,[ + [Biome.PLAINS, [ MysteryEncounterType.DEPARTMENT_STORE_SALE ]], [Biome.GRASS, [ @@ -40,90 +40,50 @@ export const mysteryEncountersByBiome = new Map([ MysteryEncounterType.SLEEPING_SNORLAX ]], - [Biome.SEA, [ - - ]], - [Biome.SWAMP, [ - - ]], + [Biome.SEA, []], + [Biome.SWAMP, []], [Biome.BEACH, [ MysteryEncounterType.DEPARTMENT_STORE_SALE ]], - [Biome.LAKE, [ - - ]], - [Biome.SEABED, [ - - ]], + [Biome.LAKE, []], + [Biome.SEABED, []], [Biome.MOUNTAIN, [ MysteryEncounterType.SLEEPING_SNORLAX ]], - [Biome.BADLANDS, [ - - ]], + [Biome.BADLANDS, []], [Biome.CAVE, [ MysteryEncounterType.SLEEPING_SNORLAX ]], - [Biome.DESERT, [ - - ]], - [Biome.ICE_CAVE, [ - - ]], + [Biome.DESERT, []], + [Biome.ICE_CAVE, []], [Biome.MEADOW, [ MysteryEncounterType.DEPARTMENT_STORE_SALE ]], [Biome.POWER_PLANT, [ MysteryEncounterType.DEPARTMENT_STORE_SALE ]], - [Biome.VOLCANO, [ - - ]], - [Biome.GRAVEYARD, [ - - ]], - [Biome.DOJO, [ - - ]], + [Biome.VOLCANO, []], + [Biome.GRAVEYARD, []], + [Biome.DOJO, []], [Biome.FACTORY, [ MysteryEncounterType.DEPARTMENT_STORE_SALE ]], - [Biome.RUINS, [ - - ]], - [Biome.WASTELAND, [ - - ]], - [Biome.ABYSS, [ - - ]], - [Biome.SPACE, [ - - ]], + [Biome.RUINS, []], + [Biome.WASTELAND, []], + [Biome.ABYSS, []], + [Biome.SPACE, []], [Biome.CONSTRUCTION_SITE, [ MysteryEncounterType.DEPARTMENT_STORE_SALE ]], - [Biome.JUNGLE, [ - - ]], - [Biome.FAIRY_CAVE, [ - - ]], - [Biome.TEMPLE, [ - - ]], + [Biome.JUNGLE, []], + [Biome.FAIRY_CAVE, []], + [Biome.TEMPLE, []], [Biome.SLUM, [ MysteryEncounterType.DEPARTMENT_STORE_SALE ]], - [Biome.SNOWY_FOREST, [ - - ]], - [Biome.ISLAND, [ - - ]], - [Biome.LABORATORY, [ - - ]] + [Biome.SNOWY_FOREST, []], + [Biome.ISLAND, []], + [Biome.LABORATORY, []] ]); // Only add your MysterEncounter here if you want it to be in every biome. @@ -131,7 +91,7 @@ export const mysteryEncountersByBiome = new Map([ export function initMysteryEncounters() { allMysteryEncounters[MysteryEncounterType.MYSTERIOUS_CHALLENGERS] = MysteriousChallengersEncounter; allMysteryEncounters[MysteryEncounterType.MYSTERIOUS_CHEST] = MysteriousChestEncounter; - allMysteryEncounters[MysteryEncounterType.DARK_DEAL] = DarkDealEncounter; + allMysteryEncounters[MysteryEncounterType.DARK_DEAL] = DarkDealEncounter; allMysteryEncounters[MysteryEncounterType.FIGHT_OR_FLIGHT] = FightOrFlightEncounter; allMysteryEncounters[MysteryEncounterType.TRAINING_SESSION] = TrainingSessionEncounter; allMysteryEncounters[MysteryEncounterType.SLEEPING_SNORLAX] = SleepingSnorlaxEncounter; diff --git a/src/data/mystery-encounters/shady-vitamin-dealer.ts b/src/data/mystery-encounters/encounters/shady-vitamin-dealer.ts similarity index 89% rename from src/data/mystery-encounters/shady-vitamin-dealer.ts rename to src/data/mystery-encounters/encounters/shady-vitamin-dealer.ts index b6ac5eacd22..06cdfbff4c8 100644 --- a/src/data/mystery-encounters/shady-vitamin-dealer.ts +++ b/src/data/mystery-encounters/encounters/shady-vitamin-dealer.ts @@ -1,4 +1,4 @@ -import BattleScene from "../../battle-scene"; +import BattleScene from "../../../battle-scene"; import { generateModifierType, leaveEncounterWithoutBattle, @@ -7,20 +7,20 @@ import { setEncounterRewards, updatePlayerMoney, } from "#app/data/mystery-encounters/mystery-encounter-utils"; -import MysteryEncounter, {MysteryEncounterBuilder, MysteryEncounterTier} from "../mystery-encounter"; -import {MysteryEncounterType} from "#enums/mystery-encounter-type"; +import MysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier } from "../mystery-encounter"; +import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { HealthRatioRequirement, MoneyRequirement, StatusEffectRequirement, WaveCountRequirement } from "../mystery-encounter-requirements"; -import {MysteryEncounterOptionBuilder} from "../mystery-encounter-option"; -import {modifierTypes} from "#app/modifier/modifier-type"; -import {Species} from "#enums/species"; -import {randSeedInt} from "#app/utils"; -import Pokemon, {PlayerPokemon} from "#app/field/pokemon"; -import {StatusEffect} from "#app/data/status-effect"; +import { MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; +import { modifierTypes } from "#app/modifier/modifier-type"; +import { Species } from "#enums/species"; +import { randSeedInt } from "#app/utils"; +import Pokemon, { PlayerPokemon } from "#app/field/pokemon"; +import { StatusEffect } from "#app/data/status-effect"; export const ShadyVitaminDealerEncounter: MysteryEncounter = new MysteryEncounterBuilder() .withEncounterType(MysteryEncounterType.SHADY_VITAMIN_DEALER) @@ -134,7 +134,7 @@ export const ShadyVitaminDealerEncounter: MysteryEncounter = new MysteryEncounte i++; } - setEncounterRewards(scene, { guaranteedModifierTypeFuncs: modifiers, fillRemaining: false}); + setEncounterRewards(scene, { guaranteedModifierTypeFuncs: modifiers, fillRemaining: false }); leaveEncounterWithoutBattle(scene); }) .build()) diff --git a/src/data/mystery-encounters/sleeping-snorlax.ts b/src/data/mystery-encounters/encounters/sleeping-snorlax.ts similarity index 82% rename from src/data/mystery-encounters/sleeping-snorlax.ts rename to src/data/mystery-encounters/encounters/sleeping-snorlax.ts index 410a9081db3..b75787ad566 100644 --- a/src/data/mystery-encounters/sleeping-snorlax.ts +++ b/src/data/mystery-encounters/encounters/sleeping-snorlax.ts @@ -1,23 +1,23 @@ -import BattleScene from "../../battle-scene"; +import BattleScene from "../../../battle-scene"; import { EnemyPartyConfig, EnemyPokemonConfig, generateModifierType, initBattleWithEnemyConfig, leaveEncounterWithoutBattle, queueEncounterMessage, setEncounterRewards -} from "./mystery-encounter-utils"; -import MysteryEncounter, {MysteryEncounterBuilder, MysteryEncounterTier} from "../mystery-encounter"; -import * as Utils from "../../utils"; -import {MysteryEncounterType} from "#enums/mystery-encounter-type"; -import {MoveRequirement, WaveCountRequirement} from "../mystery-encounter-requirements"; -import {MysteryEncounterOptionBuilder} from "../mystery-encounter-option"; +} from "../mystery-encounter-utils"; +import MysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier } from "../mystery-encounter"; +import * as Utils from "../../../utils"; +import { MysteryEncounterType } from "#enums/mystery-encounter-type"; +import { MoveRequirement, WaveCountRequirement } from "../mystery-encounter-requirements"; +import { MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; import { ModifierTypeOption, modifierTypes } from "#app/modifier/modifier-type"; -import { getPokemonSpecies } from "../pokemon-species"; +import { getPokemonSpecies } from "../../pokemon-species"; import { Species } from "#enums/species"; -import { Status, StatusEffect } from "../status-effect"; +import { Status, StatusEffect } from "../../status-effect"; import { Moves } from "#enums/moves"; import { BerryType } from "#enums/berry-type"; @@ -65,7 +65,7 @@ export const SleepingSnorlaxEncounter: MysteryEncounter = new MysteryEncounterBu .withOption(new MysteryEncounterOptionBuilder() .withOptionPhase(async (scene: BattleScene) => { const instance = scene.currentBattle.mysteryEncounter; - let roll:integer; + let roll: integer; scene.executeWithSeedOffset(() => { roll = Utils.randSeedInt(16, 0); }, scene.currentBattle.waveIndex); @@ -73,12 +73,12 @@ export const SleepingSnorlaxEncounter: MysteryEncounter = new MysteryEncounterBu if (roll > 4) { // Fall asleep and get a sitrus berry (75%) const p = instance.primaryPokemon; - p.status = new Status(StatusEffect.SLEEP, 0, 3); + p.status = new Status(StatusEffect.SLEEP, 0, 3); p.updateInfo(true); // const sitrus = (modifierTypes.BERRY?.() as ModifierTypeGenerator).generateType(scene.getParty(), [BerryType.SITRUS]); const sitrus = generateModifierType(scene, modifierTypes.BERRY, [BerryType.SITRUS]); - setEncounterRewards(scene, { guaranteedModifierTypeOptions: [new ModifierTypeOption(sitrus, 0)], fillRemaining: false}); + setEncounterRewards(scene, { guaranteedModifierTypeOptions: [new ModifierTypeOption(sitrus, 0)], fillRemaining: false }); queueEncounterMessage(scene, "mysteryEncounter:sleeping_snorlax_option_2_bad_result"); leaveEncounterWithoutBattle(scene); } else { @@ -101,7 +101,7 @@ export const SleepingSnorlaxEncounter: MysteryEncounter = new MysteryEncounterBu .withPrimaryPokemonRequirement(new MoveRequirement([Moves.PLUCK, Moves.COVET, Moves.KNOCK_OFF, Moves.THIEF, Moves.TRICK, Moves.SWITCHEROO])) .withOptionPhase(async (scene: BattleScene) => { // Leave encounter with no rewards or exp - setEncounterRewards(scene, { guaranteedModifierTypeFuncs: [modifierTypes.LEFTOVERS], fillRemaining: false}); + setEncounterRewards(scene, { guaranteedModifierTypeFuncs: [modifierTypes.LEFTOVERS], fillRemaining: false }); queueEncounterMessage(scene, "mysteryEncounter:sleeping_snorlax_option_3_good_result"); leaveEncounterWithoutBattle(scene); }) diff --git a/src/data/mystery-encounters/training-session.ts b/src/data/mystery-encounters/encounters/training-session.ts similarity index 90% rename from src/data/mystery-encounters/training-session.ts rename to src/data/mystery-encounters/encounters/training-session.ts index ab1bacc71f9..6c50209e4ca 100644 --- a/src/data/mystery-encounters/training-session.ts +++ b/src/data/mystery-encounters/encounters/training-session.ts @@ -1,4 +1,4 @@ -import BattleScene from "../../battle-scene"; +import BattleScene from "../../../battle-scene"; import { EnemyPartyConfig, getEncounterText, @@ -6,23 +6,23 @@ import { selectPokemonForOption, setEncounterRewards } from "#app/data/mystery-encounters/mystery-encounter-utils"; -import {MysteryEncounterType} from "#enums/mystery-encounter-type"; -import MysteryEncounter, {MysteryEncounterBuilder, MysteryEncounterTier} from "../mystery-encounter"; -import {MysteryEncounterOptionBuilder} from "../mystery-encounter-option"; -import {WaveCountRequirement} from "../mystery-encounter-requirements"; -import {PlayerPokemon} from "#app/field/pokemon"; +import { MysteryEncounterType } from "#enums/mystery-encounter-type"; +import MysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier } from "../mystery-encounter"; +import { MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; +import { WaveCountRequirement } from "../mystery-encounter-requirements"; +import { PlayerPokemon } from "#app/field/pokemon"; import PokemonData from "#app/system/pokemon-data"; -import {randSeedShuffle} from "#app/utils"; -import {getNatureName, Nature} from "#app/data/nature"; -import {BattlerTagType} from "#enums/battler-tag-type"; -import {OptionSelectItem} from "#app/ui/abstact-option-select-ui-handler"; -import {PokemonHeldItemModifier} from "#app/modifier/modifier"; -import {PokemonHeldItemModifierType} from "#app/modifier/modifier-type"; -import {Ability, allAbilities} from "#app/data/ability"; -import {speciesStarters} from "#app/data/pokemon-species"; -import {AbilityAttr} from "#app/system/game-data"; -import {Stat} from "#app/data/pokemon-stat"; -import {pokemonInfo} from "#app/locales/en/pokemon-info"; +import { randSeedShuffle } from "#app/utils"; +import { getNatureName, Nature } from "#app/data/nature"; +import { BattlerTagType } from "#enums/battler-tag-type"; +import { OptionSelectItem } from "#app/ui/abstact-option-select-ui-handler"; +import { PokemonHeldItemModifier } from "#app/modifier/modifier"; +import { PokemonHeldItemModifierType } from "#app/modifier/modifier-type"; +import { Ability, allAbilities } from "#app/data/ability"; +import { speciesStarters } from "#app/data/pokemon-species"; +import { AbilityAttr } from "#app/system/game-data"; +import { Stat } from "#app/data/pokemon-stat"; +import { pokemonInfo } from "#app/locales/en/pokemon-info"; export const TrainingSessionEncounter: MysteryEncounter = new MysteryEncounterBuilder() .withEncounterType(MysteryEncounterType.TRAINING_SESSION) @@ -83,7 +83,7 @@ export const TrainingSessionEncounter: MysteryEncounter = new MysteryEncounterBu const ivIndexes = []; playerPokemon.ivs.forEach((iv, index) => { if (iv < 31) { - ivIndexes.push({iv: iv, index: index}); + ivIndexes.push({ iv: iv, index: index }); } }); @@ -302,5 +302,6 @@ function getEnemyConfig(scene: BattleScene, playerPokemon: PlayerPokemon, segmen class ModifiersHolder { public value: PokemonHeldItemModifier[] = []; - constructor() {} + constructor() { + } } diff --git a/src/data/mystery-encounter-data.ts b/src/data/mystery-encounters/mystery-encounter-data.ts similarity index 53% rename from src/data/mystery-encounter-data.ts rename to src/data/mystery-encounters/mystery-encounter-data.ts index 922bc30cbc3..ae58d5249b3 100644 --- a/src/data/mystery-encounter-data.ts +++ b/src/data/mystery-encounters/mystery-encounter-data.ts @@ -1,7 +1,7 @@ -import {MysteryEncounterTier} from "#app/data/mystery-encounter"; -import {MysteryEncounterType} from "#enums/mystery-encounter-type"; -import {BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT} from "#app/data/mystery-encounters/mystery-encounters"; -import {isNullOrUndefined} from "../utils"; +import { MysteryEncounterTier } from "#app/data/mystery-encounters/mystery-encounter"; +import { MysteryEncounterType } from "#enums/mystery-encounter-type"; +import { BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT } from "#app/data/mystery-encounters/encounters/mystery-encounters"; +import { isNullOrUndefined } from "#app/utils"; export class MysteryEncounterData { encounteredEvents: [MysteryEncounterType, MysteryEncounterTier][] = []; diff --git a/src/data/mystery-encounters/dialogue/mystery-encounter-dialogue.ts b/src/data/mystery-encounters/mystery-encounter-dialogue.ts similarity index 78% rename from src/data/mystery-encounters/dialogue/mystery-encounter-dialogue.ts rename to src/data/mystery-encounters/mystery-encounter-dialogue.ts index c64d9627388..0a5387639c7 100644 --- a/src/data/mystery-encounters/dialogue/mystery-encounter-dialogue.ts +++ b/src/data/mystery-encounters/mystery-encounter-dialogue.ts @@ -1,13 +1,13 @@ -import {MysteryEncounterType} from "#enums/mystery-encounter-type"; -import {MysteriousChallengersDialogue} from "#app/data/mystery-encounters/dialogue/mysterious-challengers-dialogue"; -import {MysteriousChestDialogue} from "#app/data/mystery-encounters/dialogue/mysterious-chest-dialogue"; -import {DarkDealDialogue} from "#app/data/mystery-encounters/dialogue/dark-deal-dialogue"; -import {FightOrFlightDialogue} from "#app/data/mystery-encounters/dialogue/fight-or-flight-dialogue"; -import {TrainingSessionDialogue} from "#app/data/mystery-encounters/dialogue/training-session-dialogue"; -import { SleepingSnorlaxDialogue } from "./sleeping-snorlax-dialogue"; -import {DepartmentStoreSaleDialogue} from "#app/data/mystery-encounters/dialogue/department-store-sale-dialogue"; -import {ShadyVitaminDealerDialogue} from "#app/data/mystery-encounters/dialogue/shady-vitamin-dealer"; -import {TextStyle} from "#app/ui/text"; +import { MysteryEncounterType } from "#enums/mystery-encounter-type"; +import { MysteriousChallengersDialogue } from "#app/data/mystery-encounters/dialogue/mysterious-challengers-dialogue"; +import { MysteriousChestDialogue } from "#app/data/mystery-encounters/dialogue/mysterious-chest-dialogue"; +import { DarkDealDialogue } from "#app/data/mystery-encounters/dialogue/dark-deal-dialogue"; +import { FightOrFlightDialogue } from "#app/data/mystery-encounters/dialogue/fight-or-flight-dialogue"; +import { TrainingSessionDialogue } from "#app/data/mystery-encounters/dialogue/training-session-dialogue"; +import { SleepingSnorlaxDialogue } from "./dialogue/sleeping-snorlax-dialogue"; +import { DepartmentStoreSaleDialogue } from "#app/data/mystery-encounters/dialogue/department-store-sale-dialogue"; +import { ShadyVitaminDealerDialogue } from "#app/data/mystery-encounters/dialogue/shady-vitamin-dealer"; +import { TextStyle } from "#app/ui/text"; export class TextDisplay { speaker?: TemplateStringsArray | `mysteryEncounter:${string}`; @@ -87,7 +87,7 @@ export interface EncounterTypeDialogue { */ -export const allMysteryEncounterDialogue: EncounterTypeDialogue = {}; +export const allMysteryEncounterDialogue: EncounterTypeDialogue = {}; export function initMysteryEncounterDialogue() { allMysteryEncounterDialogue[MysteryEncounterType.MYSTERIOUS_CHALLENGERS] = MysteriousChallengersDialogue; diff --git a/src/data/mystery-encounter-option.ts b/src/data/mystery-encounters/mystery-encounter-option.ts similarity index 89% rename from src/data/mystery-encounter-option.ts rename to src/data/mystery-encounters/mystery-encounter-option.ts index 9f23a94e3f3..995b10f2714 100644 --- a/src/data/mystery-encounter-option.ts +++ b/src/data/mystery-encounters/mystery-encounter-option.ts @@ -1,13 +1,13 @@ import { PlayerPokemon } from "#app/field/pokemon"; -import * as Utils from "../utils"; -import BattleScene from "../battle-scene"; +import * as Utils from "../../utils"; +import BattleScene from "../../battle-scene"; import { EncounterPokemonRequirement, EncounterSceneRequirement } from "./mystery-encounter-requirements"; -import {OptionTextDisplay} from "#app/data/mystery-encounters/dialogue/mystery-encounter-dialogue"; +import { OptionTextDisplay } from "#app/data/mystery-encounters/mystery-encounter-dialogue"; export default interface MysteryEncounterOption { requirements?: EncounterSceneRequirement[]; primaryPokemonRequirements?: EncounterPokemonRequirement[]; - secondaryPokemonRequirements ?: EncounterPokemonRequirement[]; + secondaryPokemonRequirements?: EncounterPokemonRequirement[]; primaryPokemon?: PlayerPokemon; secondaryPokemon?: PlayerPokemon[]; excludePrimaryFromSecondaryRequirements?: boolean; @@ -37,15 +37,16 @@ export default class MysteryEncounterOption implements MysteryEncounterOption { this.meetsPrimaryRequirementAndPrimaryPokemonSelected(scene) && this.meetsSupportingRequirementAndSupportingPokemonSelected(scene); } + meetsPrimaryRequirementAndPrimaryPokemonSelected?(scene: BattleScene) { if (!this.primaryPokemonRequirements) { return true; } - let qualified:PlayerPokemon[] = scene.getParty(); + let qualified: PlayerPokemon[] = scene.getParty(); for (const req of this.primaryPokemonRequirements) { console.log(req); if (req.meetsRequirement(scene)) { - if (req instanceof EncounterPokemonRequirement) { + if (req instanceof EncounterPokemonRequirement) { qualified = qualified.filter(pkmn => req.queryParty(scene.getParty()).includes(pkmn)); } } else { @@ -71,14 +72,14 @@ export default class MysteryEncounterOption implements MysteryEncounterOption { } if (truePrimaryPool.length > 0) { // always choose from the non-overlapping pokemon first - this.primaryPokemon = truePrimaryPool[Utils.randSeedInt(truePrimaryPool.length, 0)]; + this.primaryPokemon = truePrimaryPool[Utils.randSeedInt(truePrimaryPool.length, 0)]; return true; } else { // if there are multiple overlapping pokemon, we're okay - just choose one and take it out of the supporting pokemon pool if (overlap.length > 1 || (this.secondaryPokemon.length - overlap.length >= 1)) { // is this working? this.primaryPokemon = overlap[Utils.randSeedInt(overlap.length, 0)]; - this.secondaryPokemon = this.secondaryPokemon.filter((supp)=> supp !== this.primaryPokemon); + this.secondaryPokemon = this.secondaryPokemon.filter((supp) => supp !== this.primaryPokemon); return true; } console.log("Mystery Encounter Edge Case: Requirement not met due to primay pokemon overlapping with support pokemon. There's no valid primary pokemon left."); @@ -97,10 +98,10 @@ export default class MysteryEncounterOption implements MysteryEncounterOption { return true; } - let qualified:PlayerPokemon[] = scene.getParty(); + let qualified: PlayerPokemon[] = scene.getParty(); for (const req of this.secondaryPokemonRequirements) { if (req.meetsRequirement(scene)) { - if (req instanceof EncounterPokemonRequirement) { + if (req instanceof EncounterPokemonRequirement) { qualified = qualified.filter(pkmn => req.queryParty(scene.getParty()).includes(pkmn)); } @@ -150,7 +151,7 @@ export class MysteryEncounterOptionBuilder implements Partial> { + withSecondaryPokemonRequirement(requirement: EncounterPokemonRequirement, excludePrimaryFromSecondaryRequirements?: boolean): this & Required> { this.secondaryPokemonRequirements.push(requirement); this.excludePrimaryFromSecondaryRequirements = excludePrimaryFromSecondaryRequirements; return Object.assign(this, { secondaryPokemonRequirements: this.secondaryPokemonRequirements }); diff --git a/src/data/mystery-encounter-requirements.ts b/src/data/mystery-encounters/mystery-encounter-requirements.ts similarity index 93% rename from src/data/mystery-encounter-requirements.ts rename to src/data/mystery-encounters/mystery-encounter-requirements.ts index 26ca5163fe5..9e530e451c6 100644 --- a/src/data/mystery-encounter-requirements.ts +++ b/src/data/mystery-encounters/mystery-encounter-requirements.ts @@ -1,19 +1,19 @@ -import {PlayerPokemon} from "#app/field/pokemon"; -import {ModifierType, PokemonHeldItemModifierType} from "#app/modifier/modifier-type"; -import BattleScene from "../battle-scene"; -import {isNullOrUndefined} from "../utils"; -import {Abilities} from "#enums/abilities"; -import {Moves} from "#enums/moves"; -import {Species} from "#enums/species"; -import {TimeOfDay} from "#enums/time-of-day"; -import {Nature} from "./nature"; -import {EvolutionItem, pokemonEvolutions} from "./pokemon-evolutions"; -import {FormChangeItem, pokemonFormChanges, SpeciesFormChangeItemTrigger} from "./pokemon-forms"; -import {SpeciesFormKey} from "./pokemon-species"; -import {StatusEffect} from "./status-effect"; -import {Type} from "./type"; -import {WeatherType} from "./weather"; -import {MysteryEncounterType} from "#enums/mystery-encounter-type"; +import { PlayerPokemon } from "#app/field/pokemon"; +import { ModifierType, PokemonHeldItemModifierType } from "#app/modifier/modifier-type"; +import BattleScene from "../../battle-scene"; +import { isNullOrUndefined } from "#app/utils"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { TimeOfDay } from "#enums/time-of-day"; +import { Nature } from "../nature"; +import { EvolutionItem, pokemonEvolutions } from "../pokemon-evolutions"; +import { FormChangeItem, pokemonFormChanges, SpeciesFormChangeItemTrigger } from "../pokemon-forms"; +import { SpeciesFormKey } from "../pokemon-species"; +import { StatusEffect } from "../status-effect"; +import { Type } from "../type"; +import { WeatherType } from "../weather"; +import { MysteryEncounterType } from "#enums/mystery-encounter-type"; export interface EncounterRequirement { meetsRequirement(scene: BattleScene): boolean; // Boolean to see if a requirement is met @@ -147,6 +147,7 @@ export class WeatherRequirement extends EncounterSceneRequirement { return true; } + getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] { return ["weather", WeatherType[scene.arena?.weather?.weatherType].replace("_", " ").toLocaleLowerCase()]; } @@ -205,7 +206,7 @@ export class PersistentModifierRequirement extends EncounterSceneRequirement { getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] { const requiredItemsInInventory = this.requiredItems.filter((a) => { - scene.modifiers.filter((itemInScene) => itemInScene.type.id === a.id).length > 0; + scene.modifiers.filter((itemInScene) => itemInScene.type.id === a.id).length > 0; }); if (requiredItemsInInventory.length > 0) { return ["requiredItem", requiredItemsInInventory[0].name]; @@ -245,8 +246,8 @@ export class MoneyRequirement extends EncounterSceneRequirement { export class SpeciesRequirement extends EncounterPokemonRequirement { requiredSpecies: Species[]; - minNumberOfPokemon:number; - invertQuery:boolean; + minNumberOfPokemon: number; + invertQuery: boolean; constructor(species: Species | Species[], minNumberOfPokemon: number = 1, invertQuery: boolean = false) { super(); @@ -288,8 +289,8 @@ export class SpeciesRequirement extends EncounterPokemonRequirement { export class NatureRequirement extends EncounterPokemonRequirement { requiredNature: Nature[]; - minNumberOfPokemon:number; - invertQuery:boolean; + minNumberOfPokemon: number; + invertQuery: boolean; constructor(nature: Nature | Nature[], minNumberOfPokemon: number = 1, invertQuery: boolean = false) { super(); @@ -330,8 +331,8 @@ export class NatureRequirement extends EncounterPokemonRequirement { export class TypeRequirement extends EncounterPokemonRequirement { requiredType: Type[]; - minNumberOfPokemon:number; - invertQuery:boolean; + minNumberOfPokemon: number; + invertQuery: boolean; constructor(type: Type | Type[], minNumberOfPokemon: number = 1, invertQuery: boolean = false) { super(); @@ -374,8 +375,8 @@ export class TypeRequirement extends EncounterPokemonRequirement { export class MoveRequirement extends EncounterPokemonRequirement { requiredMoves: Moves[] = []; - minNumberOfPokemon:number; - invertQuery:boolean; + minNumberOfPokemon: number; + invertQuery: boolean; constructor(moves: Moves | Moves[], minNumberOfPokemon: number = 1, invertQuery: boolean = false) { super(); @@ -423,8 +424,8 @@ export class MoveRequirement extends EncounterPokemonRequirement { */ export class CompatibleMoveRequirement extends EncounterPokemonRequirement { requiredMoves: Moves[]; - minNumberOfPokemon:number; - invertQuery:boolean; + minNumberOfPokemon: number; + invertQuery: boolean; constructor(learnableMove: Moves | Moves[], minNumberOfPokemon: number = 1, invertQuery: boolean = false) { super(); @@ -512,8 +513,8 @@ export class EvolutionTargetSpeciesRequirement extends EncounterPokemonRequireme export class AbilityRequirement extends EncounterPokemonRequirement { requiredAbilities: Abilities[]; - minNumberOfPokemon:number; - invertQuery:boolean; + minNumberOfPokemon: number; + invertQuery: boolean; constructor(abilities: Abilities | Abilities[], minNumberOfPokemon: number = 1, invertQuery: boolean = false) { super(); @@ -557,8 +558,8 @@ export class AbilityRequirement extends EncounterPokemonRequirement { export class StatusEffectRequirement extends EncounterPokemonRequirement { requiredStatusEffect: StatusEffect[]; - minNumberOfPokemon:number; - invertQuery:boolean; + minNumberOfPokemon: number; + invertQuery: boolean; constructor(statusEffect: StatusEffect | StatusEffect[], minNumberOfPokemon: number = 1, invertQuery: boolean = false) { super(); @@ -632,8 +633,8 @@ export class StatusEffectRequirement extends EncounterPokemonRequirement { */ export class CanFormChangeWithItemRequirement extends EncounterPokemonRequirement { requiredFormChangeItem: FormChangeItem[]; - minNumberOfPokemon:number; - invertQuery:boolean; + minNumberOfPokemon: number; + invertQuery: boolean; constructor(formChangeItem: FormChangeItem | FormChangeItem[], minNumberOfPokemon: number = 1, invertQuery: boolean = false) { super(); @@ -654,13 +655,14 @@ export class CanFormChangeWithItemRequirement extends EncounterPokemonRequiremen } return this.queryParty(partyPokemon).length >= this.minNumberOfPokemon; } - filterByForm(pokemon, formChangeItem) { + + filterByForm(pokemon, formChangeItem) { if (pokemonFormChanges.hasOwnProperty(pokemon.species.speciesId) - // Get all form changes for this species with an item trigger, including any compound triggers - && pokemonFormChanges[pokemon.species.speciesId].filter(fc => fc.trigger.hasTriggerType(SpeciesFormChangeItemTrigger)) - // Returns true if any form changes match this item - .map(fc => fc.findTrigger(SpeciesFormChangeItemTrigger) as SpeciesFormChangeItemTrigger) - .flat().flatMap(fc => fc.item).includes(formChangeItem)) { + // Get all form changes for this species with an item trigger, including any compound triggers + && pokemonFormChanges[pokemon.species.speciesId].filter(fc => fc.trigger.hasTriggerType(SpeciesFormChangeItemTrigger)) + // Returns true if any form changes match this item + .map(fc => fc.findTrigger(SpeciesFormChangeItemTrigger) as SpeciesFormChangeItemTrigger) + .flat().flatMap(fc => fc.item).includes(formChangeItem)) { return true; } else { return false; @@ -688,8 +690,8 @@ export class CanFormChangeWithItemRequirement extends EncounterPokemonRequiremen export class CanEvolveWithItemRequirement extends EncounterPokemonRequirement { requiredEvolutionItem: EvolutionItem[]; - minNumberOfPokemon:number; - invertQuery:boolean; + minNumberOfPokemon: number; + invertQuery: boolean; constructor(evolutionItems: EvolutionItem | EvolutionItem[], minNumberOfPokemon: number = 1, invertQuery: boolean = false) { super(); @@ -716,7 +718,7 @@ export class CanEvolveWithItemRequirement extends EncounterPokemonRequirement { && (!e.condition || e.condition.predicate(pokemon))).length && (pokemon.getFormKey() !== SpeciesFormKey.GIGANTAMAX)) { return true; } else if (pokemon.isFusion() && pokemonEvolutions.hasOwnProperty(pokemon.fusionSpecies.speciesId) && pokemonEvolutions[pokemon.fusionSpecies.speciesId].filter(e => e.item === evolutionItem - && (!e.condition || e.condition.predicate(pokemon))).length && (pokemon.getFusionFormKey() !== SpeciesFormKey.GIGANTAMAX)) { + && (!e.condition || e.condition.predicate(pokemon))).length && (pokemon.getFusionFormKey() !== SpeciesFormKey.GIGANTAMAX)) { return true; } return false; @@ -742,8 +744,8 @@ export class CanEvolveWithItemRequirement extends EncounterPokemonRequirement { export class HeldItemRequirement extends EncounterPokemonRequirement { requiredHeldItemModifier: PokemonHeldItemModifierType[]; - minNumberOfPokemon:number; - invertQuery:boolean; + minNumberOfPokemon: number; + invertQuery: boolean; constructor(heldItem: PokemonHeldItemModifierType | PokemonHeldItemModifierType[], minNumberOfPokemon: number = 1, invertQuery: boolean = false) { super(); @@ -776,7 +778,7 @@ export class HeldItemRequirement extends EncounterPokemonRequirement { getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] { const requiredItems = this.requiredHeldItemModifier.filter((a) => { - pokemon.getHeldItems().filter((it) => it.type.id === a.id ).length > 0; + pokemon.getHeldItems().filter((it) => it.type.id === a.id).length > 0; }); if (requiredItems.length > 0) { return ["heldItem", requiredItems[0].name]; @@ -787,8 +789,8 @@ export class HeldItemRequirement extends EncounterPokemonRequirement { export class LevelRequirement extends EncounterPokemonRequirement { requiredLevelRange?: [number, number]; - minNumberOfPokemon:number; - invertQuery:boolean; + minNumberOfPokemon: number; + invertQuery: boolean; constructor(requiredLevelRange: [number, number], minNumberOfPokemon: number = 1, invertQuery: boolean = false) { super(); @@ -826,8 +828,8 @@ export class LevelRequirement extends EncounterPokemonRequirement { export class FriendshipRequirement extends EncounterPokemonRequirement { requiredFriendshipRange?: [number, number]; - minNumberOfPokemon:number; - invertQuery:boolean; + minNumberOfPokemon: number; + invertQuery: boolean; constructor(requiredFriendshipRange: [number, number], minNumberOfPokemon: number = 1, invertQuery: boolean = false) { super(); @@ -869,8 +871,8 @@ export class FriendshipRequirement extends EncounterPokemonRequirement { */ export class HealthRatioRequirement extends EncounterPokemonRequirement { requiredHealthRange?: [number, number]; - minNumberOfPokemon:number; - invertQuery:boolean; + minNumberOfPokemon: number; + invertQuery: boolean; constructor(requiredHealthRange: [number, number], minNumberOfPokemon: number = 1, invertQuery: boolean = false) { super(); @@ -903,14 +905,14 @@ export class HealthRatioRequirement extends EncounterPokemonRequirement { } getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] { - return ["healthRatio", Math.floor(pokemon.getHpRatio()*100).toString() + "%"]; + return ["healthRatio", Math.floor(pokemon.getHpRatio() * 100).toString() + "%"]; } } export class WeightRequirement extends EncounterPokemonRequirement { requiredWeightRange?: [number, number]; - minNumberOfPokemon:number; - invertQuery:boolean; + minNumberOfPokemon: number; + invertQuery: boolean; constructor(requiredWeightRange: [number, number], minNumberOfPokemon: number = 1, invertQuery: boolean = false) { super(); diff --git a/src/data/mystery-encounters/mystery-encounter-utils.ts b/src/data/mystery-encounters/mystery-encounter-utils.ts index 89e497d22f9..4b898478fa3 100644 --- a/src/data/mystery-encounters/mystery-encounter-utils.ts +++ b/src/data/mystery-encounters/mystery-encounter-utils.ts @@ -1,12 +1,12 @@ import i18next from "i18next"; -import {BattleType} from "#app/battle"; +import { BattleType } from "#app/battle"; import BattleScene from "../../battle-scene"; -import PokemonSpecies, {getPokemonSpecies, speciesStarters} from "../pokemon-species"; -import {MysteryEncounterVariant} from "../mystery-encounter"; -import {Status, StatusEffect} from "../status-effect"; -import {TrainerConfig, trainerConfigs, TrainerSlot} from "../trainer-config"; -import Pokemon, {FieldPosition, PlayerPokemon} from "#app/field/pokemon"; -import Trainer, {TrainerVariant} from "../../field/trainer"; +import PokemonSpecies, { getPokemonSpecies, speciesStarters } from "../pokemon-species"; +import { MysteryEncounterVariant } from "./mystery-encounter"; +import { Status, StatusEffect } from "../status-effect"; +import { TrainerConfig, trainerConfigs, TrainerSlot } from "../trainer-config"; +import Pokemon, { FieldPosition, PlayerPokemon } from "#app/field/pokemon"; +import Trainer, { TrainerVariant } from "../../field/trainer"; import { ExpBalanceModifier, ExpShareModifier, @@ -32,24 +32,24 @@ import { ShowPartyExpBarPhase, TrainerVictoryPhase } from "#app/phases"; -import {MysteryEncounterBattlePhase, MysteryEncounterRewardsPhase} from "#app/phases/mystery-encounter-phase"; +import { MysteryEncounterBattlePhase, MysteryEncounterRewardsPhase } from "#app/phases/mystery-encounter-phase"; import * as Utils from "../../utils"; -import {isNullOrUndefined} from "#app/utils"; -import {SelectModifierPhase} from "#app/phases/select-modifier-phase"; -import {TrainerType} from "#enums/trainer-type"; -import {Species} from "#enums/species"; -import {Type} from "#app/data/type"; -import {BattlerTagType} from "#enums/battler-tag-type"; +import { isNullOrUndefined } from "#app/utils"; +import { SelectModifierPhase } from "#app/phases/select-modifier-phase"; +import { TrainerType } from "#enums/trainer-type"; +import { Species } from "#enums/species"; +import { Type } from "#app/data/type"; +import { BattlerTagType } from "#enums/battler-tag-type"; import PokemonData from "#app/system/pokemon-data"; -import {Biome} from "#enums/biome"; -import {biomeLinks} from "#app/data/biomes"; -import {Mode} from "#app/ui/ui"; -import {PartyOption, PartyUiMode} from "#app/ui/party-ui-handler"; -import {OptionSelectConfig, OptionSelectItem} from "#app/ui/abstact-option-select-ui-handler"; -import {WIGHT_INCREMENT_ON_SPAWN_MISS} from "#app/data/mystery-encounters/mystery-encounters"; -import {getTextWithColors, TextStyle} from "#app/ui/text"; +import { Biome } from "#enums/biome"; +import { biomeLinks } from "#app/data/biomes"; +import { Mode } from "#app/ui/ui"; +import { PartyOption, PartyUiMode } from "#app/ui/party-ui-handler"; +import { OptionSelectConfig, OptionSelectItem } from "#app/ui/abstact-option-select-ui-handler"; +import { WIGHT_INCREMENT_ON_SPAWN_MISS } from "#app/data/mystery-encounters/encounters/mystery-encounters"; +import { getTextWithColors, TextStyle } from "#app/ui/text"; import * as Overrides from "#app/overrides"; -import {UiTheme} from "#enums/ui-theme"; +import { UiTheme } from "#enums/ui-theme"; /** * @@ -402,7 +402,7 @@ export async function initBattleWithEnemyConfig(scene: BattleScene, partyConfig: // Set Status if (partyConfig.pokemonConfigs[e].status) { // Default to cureturn 3 for sleep - const cureTurn = partyConfig.pokemonConfigs[e].status === StatusEffect.SLEEP ? 3: null; + const cureTurn = partyConfig.pokemonConfigs[e].status === StatusEffect.SLEEP ? 3 : null; enemyPokemon.status = new Status(partyConfig.pokemonConfigs[e].status, 0, cureTurn); } diff --git a/src/data/mystery-encounter.ts b/src/data/mystery-encounters/mystery-encounter.ts similarity index 94% rename from src/data/mystery-encounter.ts rename to src/data/mystery-encounters/mystery-encounter.ts index 090a9aa6ded..9e956e6050f 100644 --- a/src/data/mystery-encounter.ts +++ b/src/data/mystery-encounters/mystery-encounter.ts @@ -1,18 +1,18 @@ -import BattleScene from "../battle-scene"; -import MysteryEncounterIntroVisuals, { MysteryEncounterSpriteConfig } from "../field/mystery-encounter-intro"; +import BattleScene from "../../battle-scene"; +import MysteryEncounterIntroVisuals, { MysteryEncounterSpriteConfig } from "../../field/mystery-encounter-intro"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import MysteryEncounterDialogue, { allMysteryEncounterDialogue -} from "./mystery-encounters/dialogue/mystery-encounter-dialogue"; +} from "./mystery-encounter-dialogue"; import MysteryEncounterOption from "./mystery-encounter-option"; import { EncounterPokemonRequirement, EncounterSceneRequirement } from "./mystery-encounter-requirements"; -import * as Utils from "../utils"; -import {EnemyPartyConfig} from "#app/data/mystery-encounters/mystery-encounter-utils"; +import * as Utils from "../../utils"; +import { EnemyPartyConfig } from "#app/data/mystery-encounters/mystery-encounter-utils"; import Pokemon, { PlayerPokemon } from "#app/field/pokemon"; -import {isNullOrUndefined} from "../utils"; +import { isNullOrUndefined } from "#app/utils"; export enum MysteryEncounterVariant { DEFAULT, @@ -53,7 +53,7 @@ export default interface MysteryEncounter { */ requirements?: EncounterSceneRequirement[]; primaryPokemonRequirements?: EncounterPokemonRequirement[]; - secondaryPokemonRequirements ?: EncounterPokemonRequirement[]; // A list of requirements that must ALL be met by a subset of pokemon to trigger the event + secondaryPokemonRequirements?: EncounterPokemonRequirement[]; // A list of requirements that must ALL be met by a subset of pokemon to trigger the event excludePrimaryFromSupportRequirements?: boolean; // Primary Pokemon is a single pokemon randomly selected from a set of pokemon that meet ALL primary pokemon requirements primaryPokemon?: PlayerPokemon; @@ -157,7 +157,7 @@ export default class MysteryEncounter implements MysteryEncounter { * @returns */ meetsRequirements?(scene: BattleScene) { - const sceneReq = !this.requirements.some(requirement => !requirement.meetsRequirement(scene)); + const sceneReq = !this.requirements.some(requirement => !requirement.meetsRequirement(scene)); const secReqs = this.meetsSecondaryRequirementAndSecondaryPokemonSelected(scene); // secondary is checked first to handle cases of primary overlapping with secondary const priReqs = this.meetsPrimaryRequirementAndPrimaryPokemonSelected(scene); @@ -179,17 +179,17 @@ export default class MysteryEncounter implements MysteryEncounter { if (this.primaryPokemonRequirements.length === 0) { const activeMon = scene.getParty().filter(p => p.isActive(true)); if (activeMon.length > 0) { - this.primaryPokemon = activeMon[0]; + this.primaryPokemon = activeMon[0]; } else { this.primaryPokemon = scene.getParty().filter(p => !p.isFainted())[0]; } return true; } - let qualified:PlayerPokemon[] = scene.getParty(); + let qualified: PlayerPokemon[] = scene.getParty(); for (const req of this.primaryPokemonRequirements) { console.log(req); if (req.meetsRequirement(scene)) { - if (req instanceof EncounterPokemonRequirement) { + if (req instanceof EncounterPokemonRequirement) { qualified = qualified.filter(pkmn => req.queryParty(scene.getParty()).includes(pkmn)); } } else { @@ -215,14 +215,14 @@ export default class MysteryEncounter implements MysteryEncounter { } if (truePrimaryPool.length > 0) { // always choose from the non-overlapping pokemon first - this.primaryPokemon = truePrimaryPool[Utils.randSeedInt(truePrimaryPool.length, 0)]; + this.primaryPokemon = truePrimaryPool[Utils.randSeedInt(truePrimaryPool.length, 0)]; return true; } else { // if there are multiple overlapping pokemon, we're okay - just choose one and take it out of the primary pokemon pool if (overlap.length > 1 || (this.secondaryPokemon.length - overlap.length >= 1)) { // is this working? this.primaryPokemon = overlap[Utils.randSeedInt(overlap.length, 0)]; - this.secondaryPokemon = this.secondaryPokemon.filter((supp)=> supp !== this.primaryPokemon); + this.secondaryPokemon = this.secondaryPokemon.filter((supp) => supp !== this.primaryPokemon); return true; } console.log("Mystery Encounter Edge Case: Requirement not met due to primary pokemon overlapping with secondary pokemon. There's no valid primary pokemon left."); @@ -241,10 +241,10 @@ export default class MysteryEncounter implements MysteryEncounter { return true; } - let qualified:PlayerPokemon[] = scene.getParty(); + let qualified: PlayerPokemon[] = scene.getParty(); for (const req of this.secondaryPokemonRequirements) { if (req.meetsRequirement(scene)) { - if (req instanceof EncounterPokemonRequirement) { + if (req instanceof EncounterPokemonRequirement) { qualified = qualified.filter(pkmn => req.queryParty(scene.getParty()).includes(pkmn)); } @@ -376,9 +376,9 @@ export class MysteryEncounterBuilder implements Partial { */ withOption(option: MysteryEncounterOption): this & Pick { if (this.options[0] === null) { - return Object.assign(this, { options: [ option, this.options[0] ] }); + return Object.assign(this, { options: [option, this.options[0]] }); } else if (this.options[1] === null) { - return Object.assign(this, { options: [this.options[0], option ] }); + return Object.assign(this, { options: [this.options[0], option] }); } else { this.options.push(option); return Object.assign(this, { options: this.options }); @@ -438,7 +438,7 @@ export class MysteryEncounterBuilder implements Partial { // TODO: Maybe add an optional parameter for excluding primary pokemon from the support cast? // ex. if your only grass type pokemon, a snivy, is chosen as primary, if the support pokemon requires a grass type, the event won't trigger because // it's already been - withSecondaryPokemonRequirement(requirement: EncounterPokemonRequirement, excludePrimaryFromSecondaryRequirements:boolean = false): this & Required> { + withSecondaryPokemonRequirement(requirement: EncounterPokemonRequirement, excludePrimaryFromSecondaryRequirements: boolean = false): this & Required> { this.secondaryPokemonRequirements.push(requirement); this.excludePrimaryFromSupportRequirements = excludePrimaryFromSecondaryRequirements; return Object.assign(this, { excludePrimaryFromSecondaryRequirements: this.excludePrimaryFromSupportRequirements, secondaryPokemonRequirements: this.secondaryPokemonRequirements }); diff --git a/src/field/mystery-encounter-intro.ts b/src/field/mystery-encounter-intro.ts index 8fdbd27ac9b..adb700b4854 100644 --- a/src/field/mystery-encounter-intro.ts +++ b/src/field/mystery-encounter-intro.ts @@ -1,6 +1,6 @@ import { GameObjects } from "phaser"; import BattleScene from "../battle-scene"; -import MysteryEncounter from "../data/mystery-encounter"; +import MysteryEncounter from "../data/mystery-encounters/mystery-encounter"; export class MysteryEncounterSpriteConfig { spriteKey: string; // e.g. "ace_trainer_f" @@ -40,7 +40,7 @@ export default class MysteryEncounterIntroVisuals extends Phaser.GameObjects.Con const getSprite = (spriteKey: string, hasShadow?: boolean) => { const ret = this.scene.addFieldSprite(0, 0, spriteKey); ret.setOrigin(0.5, 1); - ret.setPipeline(this.scene.spritePipeline, {tone: [0.0, 0.0, 0.0, 0.0], hasShadow: !!hasShadow}); + ret.setPipeline(this.scene.spritePipeline, { tone: [0.0, 0.0, 0.0, 0.0], hasShadow: !!hasShadow }); return ret; }; diff --git a/src/loading-scene.ts b/src/loading-scene.ts index fdb9f5f6610..5407f7d9417 100644 --- a/src/loading-scene.ts +++ b/src/loading-scene.ts @@ -22,8 +22,8 @@ import { initStatsKeys } from "./ui/game-stats-ui-handler"; import { initVouchers } from "./system/voucher"; import { Biome } from "#enums/biome"; import { TrainerType } from "#enums/trainer-type"; -import {initMysteryEncounterDialogue} from "#app/data/mystery-encounters/dialogue/mystery-encounter-dialogue"; -import {initMysteryEncounters} from "#app/data/mystery-encounters/mystery-encounters"; +import {initMysteryEncounterDialogue} from "#app/data/mystery-encounters/mystery-encounter-dialogue"; +import {initMysteryEncounters} from "#app/data/mystery-encounters/encounters/mystery-encounters"; export class LoadingScene extends SceneBase { readonly LOAD_EVENTS = Phaser.Loader.Events; diff --git a/src/locales/en/mystery-encounter.ts b/src/locales/en/mystery-encounter.ts index 8bcf5df76d9..ac04eed2688 100644 --- a/src/locales/en/mystery-encounter.ts +++ b/src/locales/en/mystery-encounter.ts @@ -1,4 +1,4 @@ -import {SimpleTranslationEntries} from "#app/interfaces/locales"; +import { SimpleTranslationEntries } from "#app/interfaces/locales"; /** * Patterns that can be used: diff --git a/src/overrides.ts b/src/overrides.ts index 6634ca32788..ce706173691 100644 --- a/src/overrides.ts +++ b/src/overrides.ts @@ -19,7 +19,7 @@ import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { TimeOfDay } from "#enums/time-of-day"; import {MysteryEncounterType} from "#enums/mystery-encounter-type"; // eslint-disable-line @typescript-eslint/no-unused-vars -import {MysteryEncounterTier} from "#app/data/mystery-encounter"; // eslint-disable-line @typescript-eslint/no-unused-vars +import {MysteryEncounterTier} from "#app/data/mystery-encounters/mystery-encounter"; // eslint-disable-line @typescript-eslint/no-unused-vars /** * Overrides for testing different in game situations diff --git a/src/phases.ts b/src/phases.ts index 730797c3d2f..015897afb50 100644 --- a/src/phases.ts +++ b/src/phases.ts @@ -65,7 +65,7 @@ import { PlayerGender } from "#enums/player-gender"; import { Species } from "#enums/species"; import { TrainerType } from "#enums/trainer-type"; import { BattlePhase } from "#app/phases/battle-phase"; -import { MysteryEncounterVariant } from "#app/data/mystery-encounter"; +import { MysteryEncounterVariant } from "#app/data/mystery-encounters/mystery-encounter"; import { MysteryEncounterPhase } from "#app/phases/mystery-encounter-phase"; import { getEncounterText, handleMysteryEncounterVictory } from "#app/data/mystery-encounters/mystery-encounter-utils"; import { SelectModifierPhase } from "#app/phases/select-modifier-phase"; diff --git a/src/phases/battle-phase.ts b/src/phases/battle-phase.ts index 62c35403f3f..110ecb615e8 100644 --- a/src/phases/battle-phase.ts +++ b/src/phases/battle-phase.ts @@ -1,6 +1,6 @@ -import {Phase} from "#app/phase"; +import { Phase } from "#app/phase"; import BattleScene from "#app/battle-scene"; -import {TrainerSlot} from "#app/data/trainer-config"; +import { TrainerSlot } from "#app/data/trainer-config"; export class BattlePhase extends Phase { constructor(scene: BattleScene) { diff --git a/src/phases/mystery-encounter-phase.ts b/src/phases/mystery-encounter-phase.ts index f4a6d955fb6..6af4c42ed4d 100644 --- a/src/phases/mystery-encounter-phase.ts +++ b/src/phases/mystery-encounter-phase.ts @@ -6,16 +6,16 @@ import { getEncounterText } from "../data/mystery-encounters/mystery-encounter-utils"; import { CheckSwitchPhase, NewBattlePhase, PostSummonPhase, ReturnPhase, ScanIvsPhase, SummonPhase, ToggleDoublePositionPhase } from "../phases"; -import MysteryEncounterOption from "../data/mystery-encounter-option"; -import { MysteryEncounterVariant } from "../data/mystery-encounter"; +import MysteryEncounterOption from "../data/mystery-encounters/mystery-encounter-option"; +import { MysteryEncounterVariant } from "../data/mystery-encounters/mystery-encounter"; import { getCharVariantFromDialogue } from "../data/dialogue"; import { TrainerSlot } from "../data/trainer-config"; import { BattleSpec } from "../enums/battle-spec"; import { Tutorial, handleTutorial } from "../tutorial"; import { IvScannerModifier } from "../modifier/modifier"; import * as Utils from "../utils"; -import {SelectModifierPhase} from "#app/phases/select-modifier-phase"; -import {isNullOrUndefined} from "../utils"; +import { SelectModifierPhase } from "#app/phases/select-modifier-phase"; +import { isNullOrUndefined } from "../utils"; /** * Will handle (in order): @@ -402,7 +402,7 @@ export class MysteryEncounterRewardsPhase extends Phase { 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, null, { fillRemaining: false, rerollMultiplier: 0})); + this.scene.unshiftPhase(new SelectModifierPhase(this.scene, 0, null, { fillRemaining: false, rerollMultiplier: 0 })); } }, this.scene.currentBattle.waveIndex * 1000); diff --git a/src/phases/select-modifier-phase.ts b/src/phases/select-modifier-phase.ts index 5e53281ba84..0e17d9562fb 100644 --- a/src/phases/select-modifier-phase.ts +++ b/src/phases/select-modifier-phase.ts @@ -1,4 +1,4 @@ -import {ModifierTier} from "#app/modifier/modifier-tier"; +import { ModifierTier } from "#app/modifier/modifier-tier"; import { CustomModifierSettings, FusePokemonModifierType, getPlayerModifierTypeOptions, @@ -15,13 +15,13 @@ import { } from "#app/modifier/modifier-type"; import BattleScene from "#app/battle-scene"; import * as Utils from "#app/utils"; -import {ExtraModifierModifier, Modifier, PokemonHeldItemModifier} from "#app/modifier/modifier"; +import { ExtraModifierModifier, Modifier, PokemonHeldItemModifier } from "#app/modifier/modifier"; import i18next from "#app/plugins/i18n"; -import {Mode} from "#app/ui/ui"; -import PartyUiHandler, {PartyOption, PartyUiMode} from "#app/ui/party-ui-handler"; -import ModifierSelectUiHandler, {SHOP_OPTIONS_ROW_LIMIT} from "#app/ui/modifier-select-ui-handler"; -import {BattlePhase} from "#app/phases/battle-phase"; -import {isNullOrUndefined} from "#app/utils"; +import { Mode } from "#app/ui/ui"; +import PartyUiHandler, { PartyOption, PartyUiMode } from "#app/ui/party-ui-handler"; +import ModifierSelectUiHandler, { SHOP_OPTIONS_ROW_LIMIT } from "#app/ui/modifier-select-ui-handler"; +import { BattlePhase } from "#app/phases/battle-phase"; +import { isNullOrUndefined } from "#app/utils"; export class SelectModifierPhase extends BattlePhase { private rerollCount: integer; @@ -47,7 +47,7 @@ export class SelectModifierPhase extends BattlePhase { const party = this.scene.getParty(); regenerateModifierPoolThresholds(party, this.getPoolType(), this.rerollCount); - const modifierCount = new Utils.IntegerHolder(3); + const modifierCount = new Utils.IntegerHolder(3); if (this.isPlayer()) { this.scene.applyModifiers(ExtraModifierModifier, true, modifierCount); } @@ -241,7 +241,7 @@ export class SelectModifierPhase extends BattlePhase { } else { baseValue = 250; } - const multiplier = !isNullOrUndefined(this.customModifierSettings?.rerollMultiplier) ? this.customModifierSettings.rerollMultiplier : 1; + const multiplier = !isNullOrUndefined(this.customModifierSettings?.rerollMultiplier) ? this.customModifierSettings.rerollMultiplier : 1; return Math.min(Math.ceil(this.scene.currentBattle.waveIndex / 10) * baseValue * Math.pow(2, this.rerollCount) * multiplier, Number.MAX_SAFE_INTEGER); } diff --git a/src/system/game-data.ts b/src/system/game-data.ts index 07ecfc74f0a..6c578ac4160 100644 --- a/src/system/game-data.ts +++ b/src/system/game-data.ts @@ -40,8 +40,8 @@ import { GameDataType } from "#enums/game-data-type"; import { Moves } from "#enums/moves"; import { PlayerGender } from "#enums/player-gender"; import { Species } from "#enums/species"; -import { MysteryEncounterData } from "../data/mystery-encounter-data"; -import MysteryEncounter from "../data/mystery-encounter"; +import { MysteryEncounterData } from "../data/mystery-encounters/mystery-encounter-data"; +import MysteryEncounter from "../data/mystery-encounters/mystery-encounter"; export const defaultStarterSpecies: Species[] = [ Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE, diff --git a/src/test/mystery-encounter/mystery-encounter-utils.test.ts b/src/test/mystery-encounter/mystery-encounter-utils.test.ts index cd03033ae3b..424da4d1aff 100644 --- a/src/test/mystery-encounter/mystery-encounter-utils.test.ts +++ b/src/test/mystery-encounter/mystery-encounter-utils.test.ts @@ -10,7 +10,7 @@ import {initSceneWithoutEncounterPhase} from "#test/utils/gameManagerUtils"; import {Species} from "#enums/species"; import BattleScene from "#app/battle-scene"; import {StatusEffect} from "#app/data/status-effect"; -import MysteryEncounter from "#app/data/mystery-encounter"; +import MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter"; import {MessagePhase} from "#app/phases"; import {getPokemonSpecies, speciesStarters} from "#app/data/pokemon-species"; import {Type} from "#app/data/type"; @@ -277,7 +277,7 @@ describe("Mystery Encounter Utils", () => { scene.currentBattle.mysteryEncounter.setDialogueToken("test", "value"); const result = getEncounterText(scene, "mysteryEncounter:unit_test_dialogue"); - expect(result).toEqual("[color=#f8f8f8][shadow=#6b5a73]valuevalue @ec{testvalue} @ec{test1} value @ec{test\\} @ec{test\\} {test}[/color][/shadow]"); + expect(result).toEqual("valuevalue @ec{testvalue} @ec{test1} value @ec{test\\} @ec{test\\} {test}"); }); it("can perform nested dialogue token injection", () => { @@ -286,7 +286,7 @@ describe("Mystery Encounter Utils", () => { scene.currentBattle.mysteryEncounter.setDialogueToken("testvalue", "new"); const result = getEncounterText(scene, "mysteryEncounter:unit_test_dialogue"); - expect(result).toEqual("[color=#f8f8f8][shadow=#6b5a73]valuevalue new @ec{test1} value @ec{test\\} @ec{test\\} {test}[/color][/shadow]"); + expect(result).toEqual("valuevalue new @ec{test1} value @ec{test\\} @ec{test\\} {test}"); }); }); @@ -298,7 +298,7 @@ describe("Mystery Encounter Utils", () => { const phaseSpy = vi.spyOn(game.scene, "unshiftPhase"); queueEncounterMessage(scene, "mysteryEncounter:unit_test_dialogue"); - expect(spy).toHaveBeenCalledWith("[color=#f8f8f8][shadow=#6b5a73]valuevalue @ec{testvalue} @ec{test1} value @ec{test\\} @ec{test\\} {test}[/color][/shadow]", null, true); + expect(spy).toHaveBeenCalledWith("valuevalue @ec{testvalue} @ec{test1} value @ec{test\\} @ec{test\\} {test}", null, true); expect(phaseSpy).toHaveBeenCalledWith(expect.any(MessagePhase)); }); }); @@ -310,7 +310,7 @@ describe("Mystery Encounter Utils", () => { const spy = vi.spyOn(game.scene.ui, "showText"); showEncounterText(scene, "mysteryEncounter:unit_test_dialogue"); - expect(spy).toHaveBeenCalledWith("[color=#f8f8f8][shadow=#6b5a73]valuevalue @ec{testvalue} @ec{test1} value @ec{test\\} @ec{test\\} {test}[/color][/shadow]", null, expect.any(Function), 0, true); + expect(spy).toHaveBeenCalledWith("valuevalue @ec{testvalue} @ec{test1} value @ec{test\\} @ec{test\\} {test}", null, expect.any(Function), 0, true); }); }); @@ -321,7 +321,7 @@ describe("Mystery Encounter Utils", () => { const spy = vi.spyOn(game.scene.ui, "showDialogue"); showEncounterDialogue(scene, "mysteryEncounter:unit_test_dialogue", "mysteryEncounter:unit_test_dialogue"); - expect(spy).toHaveBeenCalledWith("[color=#f8f8f8][shadow=#6b5a73]valuevalue @ec{testvalue} @ec{test1} value @ec{test\\} @ec{test\\} {test}[/color][/shadow]", "[color=#f8f8f8][shadow=#6b5a73]valuevalue @ec{testvalue} @ec{test1} value @ec{test\\} @ec{test\\} {test}[/color][/shadow]", null, undefined, 0, 0); + expect(spy).toHaveBeenCalledWith("valuevalue @ec{testvalue} @ec{test1} value @ec{test\\} @ec{test\\} {test}", "valuevalue @ec{testvalue} @ec{test1} value @ec{test\\} @ec{test\\} {test}", null, undefined, 0, 0); }); }); diff --git a/src/test/phases/mystery-encounter-phase.test.ts b/src/test/phases/mystery-encounter-phase.test.ts index efe7dab810a..0ae9ad35ed7 100644 --- a/src/test/phases/mystery-encounter-phase.test.ts +++ b/src/test/phases/mystery-encounter-phase.test.ts @@ -8,7 +8,7 @@ import {Mode} from "#app/ui/ui"; import {Button} from "#enums/buttons"; import MysteryEncounterUiHandler from "#app/ui/mystery-encounter-ui-handler"; import {MysteryEncounterType} from "#enums/mystery-encounter-type"; -import {MysteryEncounterTier} from "#app/data/mystery-encounter"; +import {MysteryEncounterTier} from "#app/data/mystery-encounters/mystery-encounter"; describe("Mystery Encounter Phases", () => { let phaserGame: Phaser.Game; @@ -89,8 +89,8 @@ describe("Mystery Encounter Phases", () => { expect(dialogueSpy).toHaveBeenCalledTimes(1); expect(messageSpy).toHaveBeenCalledTimes(2); expect(dialogueSpy).toHaveBeenCalledWith("What's this?", "???", null, expect.any(Function)); - expect(messageSpy).toHaveBeenCalledWith("[color=#f8f8f8][shadow=#6b5a73]Mysterious challengers have appeared![/color][/shadow]", null, expect.any(Function), 750, true); - expect(messageSpy).toHaveBeenCalledWith("[color=#f8f8f8][shadow=#6b5a73]The trainer steps forward...[/color][/shadow]", null, expect.any(Function), 750, true); + expect(messageSpy).toHaveBeenCalledWith("Mysterious challengers have appeared!", null, expect.any(Function), 750, true); + expect(messageSpy).toHaveBeenCalledWith("The trainer steps forward...", null, expect.any(Function), 750, true); }); }); diff --git a/src/ui/modifier-select-ui-handler.ts b/src/ui/modifier-select-ui-handler.ts index e9fc495a847..c5c3f94b75d 100644 --- a/src/ui/modifier-select-ui-handler.ts +++ b/src/ui/modifier-select-ui-handler.ts @@ -6,7 +6,7 @@ import AwaitableUiHandler from "./awaitable-ui-handler"; import { Mode } from "./ui"; import { LockModifierTiersModifier, PokemonHeldItemModifier } from "../modifier/modifier"; import { handleTutorial, Tutorial } from "../tutorial"; -import {Button} from "#enums/buttons"; +import { Button } from "#enums/buttons"; import MoveInfoOverlay from "./move-info-overlay"; import { allMoves } from "../data/move"; import * as Utils from "./../utils"; @@ -23,8 +23,8 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { private continueButtonContainer: Phaser.GameObjects.Container; private rerollCostText: Phaser.GameObjects.Text; private lockRarityButtonText: Phaser.GameObjects.Text; - private moveInfoOverlay : MoveInfoOverlay; - private moveInfoOverlayActive : boolean = false; + private moveInfoOverlay: MoveInfoOverlay; + private moveInfoOverlayActive: boolean = false; private rowCursor: integer = 0; private player: boolean; @@ -52,7 +52,7 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { const canvas = document.createElement("canvas"); const context = canvas.getContext("2d"); - const [ , styleOptions, , , ] = getTextStyleOptions(TextStyle.PARTY, (this.scene as BattleScene).uiTheme); + const [, styleOptions, , ,] = getTextStyleOptions(TextStyle.PARTY, (this.scene as BattleScene).uiTheme); context.font = styleOptions.fontSize + "px " + styleOptions.fontFamily; this.transferButtonWidth = context.measureText(i18next.t("modifierSelectUiHandler:transfer")).width; this.checkButtonWidth = context.measureText(i18next.t("modifierSelectUiHandler:checkTeam")).width; @@ -113,7 +113,7 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { onSide: true, right: true, x: 1, - y: -MoveInfoOverlay.getHeight(overlayScale, true) -1, + y: -MoveInfoOverlay.getHeight(overlayScale, true) - 1, width: (this.scene.game.canvas.width / 6) - 2, }); ui.add(this.moveInfoOverlay); @@ -433,10 +433,10 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { this.cursorObj.setPosition(6, this.lockRarityButtonContainer.visible ? -72 : -60); ui.showText(i18next.t("modifierSelectUiHandler:rerollDesc")); } else if (cursor === 1) { - this.cursorObj.setPosition((this.scene.game.canvas.width - this.transferButtonWidth - this.checkButtonWidth)/6 - 30, -60); + this.cursorObj.setPosition((this.scene.game.canvas.width - this.transferButtonWidth - this.checkButtonWidth) / 6 - 30, -60); ui.showText(i18next.t("modifierSelectUiHandler:transferDesc")); } else if (cursor === 2) { - this.cursorObj.setPosition((this.scene.game.canvas.width - this.checkButtonWidth)/6 - 10, -60); + this.cursorObj.setPosition((this.scene.game.canvas.width - this.checkButtonWidth) / 6 - 10, -60); ui.showText(i18next.t("modifierSelectUiHandler:checkTeamDesc")); } else { this.cursorObj.setPosition(6, -60); diff --git a/src/ui/mystery-encounter-ui-handler.ts b/src/ui/mystery-encounter-ui-handler.ts index 7714f280197..163d79784f8 100644 --- a/src/ui/mystery-encounter-ui-handler.ts +++ b/src/ui/mystery-encounter-ui-handler.ts @@ -6,7 +6,7 @@ import {Button} from "#enums/buttons"; import {addWindow, WindowVariant} from "./ui-theme"; import {MysteryEncounterPhase} from "../phases/mystery-encounter-phase"; import {PartyUiMode} from "./party-ui-handler"; -import MysteryEncounterOption from "../data/mystery-encounter-option"; +import MysteryEncounterOption from "../data/mystery-encounters/mystery-encounter-option"; import * as Utils from "../utils"; import {isNullOrUndefined} from "../utils"; import {getPokeballAtlasKey} from "../data/pokeball"; From 1e39a89af56c30f438599884c21b17e6267fcad6 Mon Sep 17 00:00:00 2001 From: InnocentGameDev Date: Wed, 10 Jul 2024 13:57:07 +0200 Subject: [PATCH 023/270] Modified Event Proposal Issue template again to adjust for Project migration --- .github/ISSUE_TEMPLATE/mystery_event.yml | 26 ++++++++++++++++-------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/mystery_event.yml b/.github/ISSUE_TEMPLATE/mystery_event.yml index fd6456d2f81..df8fd7b7b78 100644 --- a/.github/ISSUE_TEMPLATE/mystery_event.yml +++ b/.github/ISSUE_TEMPLATE/mystery_event.yml @@ -2,17 +2,23 @@ name: Mystery Event description: Propose a new mystery event title: "[Event Proposal]: " body: + - type: input + id: name + attributes: + label: Event Name + description: Name of the event + placeholder: "Fight or Flight" - type: dropdown id: rarity attributes: - label: Rarity + label: Rarity Tier multiple: false options: - Common - Great - Ultra - Rogue - - Other (please specify) + - Other or unsure (please specify) validations: required: true - type: input @@ -35,8 +41,8 @@ body: label: Biomes multiple: true options: - - any (no need to select all) - - non-extreme (almost all except Space, Seabed, etc...) + - ANY (no need to select all) + - NON-EXTREME (almost all except Space, Seabed, etc...) - TOWN - PLAINS - GRASS @@ -72,22 +78,24 @@ body: - ISLAND - LABORATORY - END + - OTHER (please specify) + validations: required: true - type: textarea id: options attributes: - label: Options offered - placeholder: Only four options can be displayed at a time + label: Options offered to the player + placeholder: Remember that only four options can be displayed at a time validations: required: true - type: textarea id: design-notes attributes: - label: Notes on Design - placeholder: (If any needed) + label: Explanation/Notes on Design + placeholder: Explain why you think this design is right and what this Event brings to the table validations: - required: false + required: true - type: textarea id: dev-notes attributes: From 5a5806185ff990aebddb6e49e3c3ac627ed1dcae Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Tue, 9 Jul 2024 22:21:43 -0700 Subject: [PATCH 024/270] make `MysteryEncounterBuilder.withEncounterType()` static --- src/data/mystery-encounters/encounters/dark-deal.ts | 2 +- .../mystery-encounters/encounters/department-store-sale.ts | 2 +- src/data/mystery-encounters/encounters/fight-or-flight.ts | 2 +- .../mystery-encounters/encounters/mysterious-challengers.ts | 2 +- src/data/mystery-encounters/encounters/mysterious-chest.ts | 2 +- .../mystery-encounters/encounters/shady-vitamin-dealer.ts | 2 +- src/data/mystery-encounters/encounters/sleeping-snorlax.ts | 2 +- src/data/mystery-encounters/encounters/training-session.ts | 2 +- src/data/mystery-encounters/mystery-encounter.ts | 6 +++--- 9 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/data/mystery-encounters/encounters/dark-deal.ts b/src/data/mystery-encounters/encounters/dark-deal.ts index a78144347af..7bdbac2a42f 100644 --- a/src/data/mystery-encounters/encounters/dark-deal.ts +++ b/src/data/mystery-encounters/encounters/dark-deal.ts @@ -67,7 +67,7 @@ const excludedBosses = [ Species.PECHARUNT ]; -export const DarkDealEncounter: MysteryEncounter = new MysteryEncounterBuilder() +export const DarkDealEncounter: MysteryEncounter = MysteryEncounterBuilder .withEncounterType(MysteryEncounterType.DARK_DEAL) .withEncounterTier(MysteryEncounterTier.ROGUE) .withIntroSpriteConfigs([ diff --git a/src/data/mystery-encounters/encounters/department-store-sale.ts b/src/data/mystery-encounters/encounters/department-store-sale.ts index 935ed635f9e..a60b6dfa4bf 100644 --- a/src/data/mystery-encounters/encounters/department-store-sale.ts +++ b/src/data/mystery-encounters/encounters/department-store-sale.ts @@ -11,7 +11,7 @@ import { modifierTypes } from "#app/modifier/modifier-type"; import { Species } from "#enums/species"; import { randSeedInt } from "#app/utils"; -export const DepartmentStoreSaleEncounter: MysteryEncounter = new MysteryEncounterBuilder() +export const DepartmentStoreSaleEncounter: MysteryEncounter = MysteryEncounterBuilder .withEncounterType(MysteryEncounterType.DEPARTMENT_STORE_SALE) .withEncounterTier(MysteryEncounterTier.COMMON) .withIntroSpriteConfigs([ diff --git a/src/data/mystery-encounters/encounters/fight-or-flight.ts b/src/data/mystery-encounters/encounters/fight-or-flight.ts index 8669f6259fe..6b852ea7512 100644 --- a/src/data/mystery-encounters/encounters/fight-or-flight.ts +++ b/src/data/mystery-encounters/encounters/fight-or-flight.ts @@ -36,7 +36,7 @@ const validMovesForSteal = [ Moves.GIGA_DRAIN ]; -export const FightOrFlightEncounter: MysteryEncounter = new MysteryEncounterBuilder() +export const FightOrFlightEncounter: MysteryEncounter = MysteryEncounterBuilder .withEncounterType(MysteryEncounterType.FIGHT_OR_FLIGHT) .withEncounterTier(MysteryEncounterTier.COMMON) .withIntroSpriteConfigs([]) // Set in onInit() diff --git a/src/data/mystery-encounters/encounters/mysterious-challengers.ts b/src/data/mystery-encounters/encounters/mysterious-challengers.ts index d3e753cc91b..25b39b0667a 100644 --- a/src/data/mystery-encounters/encounters/mysterious-challengers.ts +++ b/src/data/mystery-encounters/encounters/mysterious-challengers.ts @@ -15,7 +15,7 @@ import { import * as Utils from "../../../utils"; import { PartyMemberStrength } from "#enums/party-member-strength"; -export const MysteriousChallengersEncounter: MysteryEncounter = new MysteryEncounterBuilder() +export const MysteriousChallengersEncounter: MysteryEncounter = MysteryEncounterBuilder .withEncounterType(MysteryEncounterType.MYSTERIOUS_CHALLENGERS) .withEncounterTier(MysteryEncounterTier.GREAT) .withIntroSpriteConfigs([]) // These are set in onInit() diff --git a/src/data/mystery-encounters/encounters/mysterious-chest.ts b/src/data/mystery-encounters/encounters/mysterious-chest.ts index 9f8faf278fa..8ad0a5adb52 100644 --- a/src/data/mystery-encounters/encounters/mysterious-chest.ts +++ b/src/data/mystery-encounters/encounters/mysterious-chest.ts @@ -15,7 +15,7 @@ import { MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; import { GameOverPhase } from "#app/phases"; import { randSeedInt } from "#app/utils"; -export const MysteriousChestEncounter: MysteryEncounter = new MysteryEncounterBuilder() +export const MysteriousChestEncounter: MysteryEncounter = MysteryEncounterBuilder .withEncounterType(MysteryEncounterType.MYSTERIOUS_CHEST) .withEncounterTier(MysteryEncounterTier.COMMON) .withIntroSpriteConfigs([ diff --git a/src/data/mystery-encounters/encounters/shady-vitamin-dealer.ts b/src/data/mystery-encounters/encounters/shady-vitamin-dealer.ts index 06cdfbff4c8..866b63f7533 100644 --- a/src/data/mystery-encounters/encounters/shady-vitamin-dealer.ts +++ b/src/data/mystery-encounters/encounters/shady-vitamin-dealer.ts @@ -22,7 +22,7 @@ import { randSeedInt } from "#app/utils"; import Pokemon, { PlayerPokemon } from "#app/field/pokemon"; import { StatusEffect } from "#app/data/status-effect"; -export const ShadyVitaminDealerEncounter: MysteryEncounter = new MysteryEncounterBuilder() +export const ShadyVitaminDealerEncounter: MysteryEncounter = MysteryEncounterBuilder .withEncounterType(MysteryEncounterType.SHADY_VITAMIN_DEALER) .withEncounterTier(MysteryEncounterTier.COMMON) .withIntroSpriteConfigs([ diff --git a/src/data/mystery-encounters/encounters/sleeping-snorlax.ts b/src/data/mystery-encounters/encounters/sleeping-snorlax.ts index b75787ad566..3c94da5129b 100644 --- a/src/data/mystery-encounters/encounters/sleeping-snorlax.ts +++ b/src/data/mystery-encounters/encounters/sleeping-snorlax.ts @@ -21,7 +21,7 @@ import { Status, StatusEffect } from "../../status-effect"; import { Moves } from "#enums/moves"; import { BerryType } from "#enums/berry-type"; -export const SleepingSnorlaxEncounter: MysteryEncounter = new MysteryEncounterBuilder() +export const SleepingSnorlaxEncounter: MysteryEncounter = MysteryEncounterBuilder .withEncounterType(MysteryEncounterType.SLEEPING_SNORLAX) .withEncounterTier(MysteryEncounterTier.ULTRA) .withIntroSpriteConfigs([ diff --git a/src/data/mystery-encounters/encounters/training-session.ts b/src/data/mystery-encounters/encounters/training-session.ts index 6c50209e4ca..ad5da7ded36 100644 --- a/src/data/mystery-encounters/encounters/training-session.ts +++ b/src/data/mystery-encounters/encounters/training-session.ts @@ -24,7 +24,7 @@ import { AbilityAttr } from "#app/system/game-data"; import { Stat } from "#app/data/pokemon-stat"; import { pokemonInfo } from "#app/locales/en/pokemon-info"; -export const TrainingSessionEncounter: MysteryEncounter = new MysteryEncounterBuilder() +export const TrainingSessionEncounter: MysteryEncounter = MysteryEncounterBuilder .withEncounterType(MysteryEncounterType.TRAINING_SESSION) .withEncounterTier(MysteryEncounterTier.ULTRA) .withIntroSpriteConfigs([ diff --git a/src/data/mystery-encounters/mystery-encounter.ts b/src/data/mystery-encounters/mystery-encounter.ts index 9e956e6050f..8071dc81c8f 100644 --- a/src/data/mystery-encounters/mystery-encounter.ts +++ b/src/data/mystery-encounters/mystery-encounter.ts @@ -360,12 +360,12 @@ export class MysteryEncounterBuilder implements Partial { */ /** - * Defines the type of encounter which is used as an identifier, should be tied to a unique MysteryEncounterType + * @statif Defines the type of encounter which is used as an identifier, should be tied to a unique MysteryEncounterType * @param encounterType * @returns this */ - withEncounterType(encounterType: MysteryEncounterType): this & Pick { - return Object.assign(this, { encounterType: encounterType }); + static withEncounterType(encounterType: MysteryEncounterType): MysteryEncounterBuilder & Pick { + return Object.assign(new MysteryEncounterBuilder(), { encounterType: encounterType }); } /** From 25d0bd39ee640229a30f8a3b65dbe3da7828b30c Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Tue, 9 Jul 2024 22:27:13 -0700 Subject: [PATCH 025/270] add `MysteryEncounterBuilder.withSceneWaveRangeRequirement()` --- .../encounters/dark-deal.ts | 22 +++++++------- .../encounters/department-store-sale.ts | 13 ++++---- .../encounters/fight-or-flight.ts | 24 +++++++-------- .../encounters/mysterious-challengers.ts | 17 +++++------ .../encounters/mysterious-chest.ts | 13 ++++---- .../encounters/shady-vitamin-dealer.ts | 21 +++++++------ .../encounters/sleeping-snorlax.ts | 30 +++++++++---------- .../encounters/training-session.ts | 29 +++++++++--------- .../mystery-encounter-requirements.ts | 2 +- .../mystery-encounters/mystery-encounter.ts | 14 ++++++++- 10 files changed, 96 insertions(+), 89 deletions(-) diff --git a/src/data/mystery-encounters/encounters/dark-deal.ts b/src/data/mystery-encounters/encounters/dark-deal.ts index 7bdbac2a42f..95757c901ab 100644 --- a/src/data/mystery-encounters/encounters/dark-deal.ts +++ b/src/data/mystery-encounters/encounters/dark-deal.ts @@ -1,5 +1,15 @@ +import { Type } from "#app/data/type"; +import { ModifierRewardPhase } from "#app/phases"; +import { isNullOrUndefined, randSeedInt } from "#app/utils"; +import { MysteryEncounterType } from "#enums/mystery-encounter-type"; +import { Species } from "#enums/species"; import BattleScene from "../../../battle-scene"; import { AddPokeballModifierType } from "../../../modifier/modifier-type"; +import { PokeballType } from "../../pokeball"; +import { getPokemonSpecies } from "../../pokemon-species"; +import MysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier } from "../mystery-encounter"; +import { MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; +import { PartySizeRequirement } from "../mystery-encounter-requirements"; import { EnemyPartyConfig, EnemyPokemonConfig, getRandomPlayerPokemon, @@ -7,16 +17,6 @@ import { initBattleWithEnemyConfig, leaveEncounterWithoutBattle } from "../mystery-encounter-utils"; -import MysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier } from "../mystery-encounter"; -import { ModifierRewardPhase } from "#app/phases"; -import { getPokemonSpecies } from "../../pokemon-species"; -import { MysteryEncounterType } from "#enums/mystery-encounter-type"; -import { PokeballType } from "../../pokeball"; -import { PartySizeRequirement, WaveCountRequirement } from "../mystery-encounter-requirements"; -import { MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; -import { Type } from "#app/data/type"; -import { Species } from "#enums/species"; -import { isNullOrUndefined, randSeedInt } from "#app/utils"; // Exclude Ultra Beasts, Paradox, Necrozma, Eternatus, and egg-locked mythicals const excludedBosses = [ @@ -83,7 +83,7 @@ export const DarkDealEncounter: MysteryEncounter = MysteryEncounterBuilder repeat: true } ]) - .withSceneRequirement(new WaveCountRequirement([30, 180])) // waves 30 to 180 + .withSceneWaveRangeRequirement(30, 180) // waves 30 to 180 .withSceneRequirement(new PartySizeRequirement([2, 6])) // Must have at least 2 pokemon in party .withCatchAllowed(true) .withOption(new MysteryEncounterOptionBuilder() diff --git a/src/data/mystery-encounters/encounters/department-store-sale.ts b/src/data/mystery-encounters/encounters/department-store-sale.ts index a60b6dfa4bf..38b599c5390 100644 --- a/src/data/mystery-encounters/encounters/department-store-sale.ts +++ b/src/data/mystery-encounters/encounters/department-store-sale.ts @@ -1,15 +1,14 @@ -import BattleScene from "../../../battle-scene"; import { leaveEncounterWithoutBattle, setEncounterExp, setEncounterRewards, } from "#app/data/mystery-encounters/mystery-encounter-utils"; -import MysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier } from "../mystery-encounter"; -import { MysteryEncounterType } from "#enums/mystery-encounter-type"; -import { WaveCountRequirement } from "../mystery-encounter-requirements"; -import { MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; import { modifierTypes } from "#app/modifier/modifier-type"; -import { Species } from "#enums/species"; import { randSeedInt } from "#app/utils"; +import { MysteryEncounterType } from "#enums/mystery-encounter-type"; +import { Species } from "#enums/species"; +import BattleScene from "../../../battle-scene"; +import MysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier } from "../mystery-encounter"; +import { MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; export const DepartmentStoreSaleEncounter: MysteryEncounter = MysteryEncounterBuilder .withEncounterType(MysteryEncounterType.DEPARTMENT_STORE_SALE) @@ -30,7 +29,7 @@ export const DepartmentStoreSaleEncounter: MysteryEncounter = MysteryEncounterBu } ]) // .withHideIntroVisuals(false) - .withSceneRequirement(new WaveCountRequirement([10, 100])) + .withSceneWaveRangeRequirement(10, 100) .withOption(new MysteryEncounterOptionBuilder() .withOptionPhase(async (scene: BattleScene) => { // Choose TMs diff --git a/src/data/mystery-encounters/encounters/fight-or-flight.ts b/src/data/mystery-encounters/encounters/fight-or-flight.ts index 6b852ea7512..e5f58cb7cda 100644 --- a/src/data/mystery-encounters/encounters/fight-or-flight.ts +++ b/src/data/mystery-encounters/encounters/fight-or-flight.ts @@ -1,5 +1,4 @@ -import BattleScene from "../../../battle-scene"; -import { ModifierTier } from "#app/modifier/modifier-tier"; +import { BattleStat } from "#app/data/battle-stat"; import { EnemyPartyConfig, initBattleWithEnemyConfig, @@ -7,10 +6,8 @@ import { setEncounterRewards, showEncounterText } from "#app/data/mystery-encounters/mystery-encounter-utils"; -import MysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier } from "../mystery-encounter"; -import { MysteryEncounterType } from "#enums/mystery-encounter-type"; -import { MoveRequirement, WaveCountRequirement } from "../mystery-encounter-requirements"; -import { MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; +import Pokemon from "#app/field/pokemon"; +import { ModifierTier } from "#app/modifier/modifier-tier"; import { getPartyLuckValue, getPlayerModifierTypeOptions, @@ -18,13 +15,16 @@ import { ModifierTypeOption, regenerateModifierPoolThresholds } from "#app/modifier/modifier-type"; -import { BattlerTagType } from "#enums/battler-tag-type"; import { StatChangePhase } from "#app/phases"; -import { BattleStat } from "#app/data/battle-stat"; -import Pokemon from "#app/field/pokemon"; -import { randSeedInt } from "#app/utils"; -import { Moves } from "#enums/moves"; import { TextStyle } from "#app/ui/text"; +import { randSeedInt } from "#app/utils"; +import { BattlerTagType } from "#enums/battler-tag-type"; +import { Moves } from "#enums/moves"; +import { MysteryEncounterType } from "#enums/mystery-encounter-type"; +import BattleScene from "../../../battle-scene"; +import MysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier } from "../mystery-encounter"; +import { MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; +import { MoveRequirement } from "../mystery-encounter-requirements"; const validMovesForSteal = [ Moves.PLUCK, @@ -40,7 +40,7 @@ export const FightOrFlightEncounter: MysteryEncounter = MysteryEncounterBuilder .withEncounterType(MysteryEncounterType.FIGHT_OR_FLIGHT) .withEncounterTier(MysteryEncounterTier.COMMON) .withIntroSpriteConfigs([]) // Set in onInit() - .withSceneRequirement(new WaveCountRequirement([10, 180])) // waves 10 to 180 + .withSceneWaveRangeRequirement(10, 180) // waves 10 to 180 .withCatchAllowed(true) .withHideWildIntroMessage(true) .withOnInit((scene: BattleScene) => { diff --git a/src/data/mystery-encounters/encounters/mysterious-challengers.ts b/src/data/mystery-encounters/encounters/mysterious-challengers.ts index 25b39b0667a..df363e89c2d 100644 --- a/src/data/mystery-encounters/encounters/mysterious-challengers.ts +++ b/src/data/mystery-encounters/encounters/mysterious-challengers.ts @@ -1,25 +1,24 @@ -import BattleScene from "../../../battle-scene"; -import { ModifierTier } from "#app/modifier/modifier-tier"; -import { modifierTypes } from "#app/modifier/modifier-type"; import { EnemyPartyConfig, initBattleWithEnemyConfig, setEncounterRewards } from "#app/data/mystery-encounters/mystery-encounter-utils"; -import { MysteryEncounterType } from "#enums/mystery-encounter-type"; -import MysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier } from "../mystery-encounter"; -import { MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; -import { WaveCountRequirement } from "../mystery-encounter-requirements"; import { trainerConfigs, TrainerPartyCompoundTemplate, TrainerPartyTemplate, trainerPartyTemplates } from "#app/data/trainer-config"; -import * as Utils from "../../../utils"; +import { ModifierTier } from "#app/modifier/modifier-tier"; +import { modifierTypes } from "#app/modifier/modifier-type"; +import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { PartyMemberStrength } from "#enums/party-member-strength"; +import BattleScene from "../../../battle-scene"; +import * as Utils from "../../../utils"; +import MysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier } from "../mystery-encounter"; +import { MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; export const MysteriousChallengersEncounter: MysteryEncounter = MysteryEncounterBuilder .withEncounterType(MysteryEncounterType.MYSTERIOUS_CHALLENGERS) .withEncounterTier(MysteryEncounterTier.GREAT) .withIntroSpriteConfigs([]) // These are set in onInit() - .withSceneRequirement(new WaveCountRequirement([10, 180])) // waves 10 to 180 + .withSceneWaveRangeRequirement(10, 180) // waves 10 to 180 .withOnInit((scene: BattleScene) => { const encounter = scene.currentBattle.mysteryEncounter; // Calculates what trainers are available for battle in the encounter diff --git a/src/data/mystery-encounters/encounters/mysterious-chest.ts b/src/data/mystery-encounters/encounters/mysterious-chest.ts index 8ad0a5adb52..9068c8521a5 100644 --- a/src/data/mystery-encounters/encounters/mysterious-chest.ts +++ b/src/data/mystery-encounters/encounters/mysterious-chest.ts @@ -1,5 +1,3 @@ -import BattleScene from "../../../battle-scene"; -import { ModifierTier } from "#app/modifier/modifier-tier"; import { getHighestLevelPlayerPokemon, koPlayerPokemon, @@ -8,12 +6,13 @@ import { setEncounterRewards, showEncounterText } from "#app/data/mystery-encounters/mystery-encounter-utils"; -import MysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier } from "../mystery-encounter"; -import { MysteryEncounterType } from "#enums/mystery-encounter-type"; -import { WaveCountRequirement } from "../mystery-encounter-requirements"; -import { MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; +import { ModifierTier } from "#app/modifier/modifier-tier"; import { GameOverPhase } from "#app/phases"; import { randSeedInt } from "#app/utils"; +import { MysteryEncounterType } from "#enums/mystery-encounter-type"; +import BattleScene from "../../../battle-scene"; +import MysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier } from "../mystery-encounter"; +import { MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; export const MysteriousChestEncounter: MysteryEncounter = MysteryEncounterBuilder .withEncounterType(MysteryEncounterType.MYSTERIOUS_CHEST) @@ -29,7 +28,7 @@ export const MysteriousChestEncounter: MysteryEncounter = MysteryEncounterBuilde } ]) .withHideIntroVisuals(false) - .withSceneRequirement(new WaveCountRequirement([10, 180])) // waves 2 to 180 + .withSceneWaveRangeRequirement(10, 180) // waves 2 to 180 .withOption(new MysteryEncounterOptionBuilder() .withPreOptionPhase(async (scene: BattleScene) => { // Play animation diff --git a/src/data/mystery-encounters/encounters/shady-vitamin-dealer.ts b/src/data/mystery-encounters/encounters/shady-vitamin-dealer.ts index 866b63f7533..1cdfdfa00e0 100644 --- a/src/data/mystery-encounters/encounters/shady-vitamin-dealer.ts +++ b/src/data/mystery-encounters/encounters/shady-vitamin-dealer.ts @@ -1,4 +1,3 @@ -import BattleScene from "../../../battle-scene"; import { generateModifierType, leaveEncounterWithoutBattle, @@ -7,20 +6,20 @@ import { setEncounterRewards, updatePlayerMoney, } from "#app/data/mystery-encounters/mystery-encounter-utils"; -import MysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier } from "../mystery-encounter"; +import { StatusEffect } from "#app/data/status-effect"; +import Pokemon, { PlayerPokemon } from "#app/field/pokemon"; +import { modifierTypes } from "#app/modifier/modifier-type"; +import { randSeedInt } from "#app/utils"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; +import { Species } from "#enums/species"; +import BattleScene from "../../../battle-scene"; +import MysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier } from "../mystery-encounter"; +import { MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; import { HealthRatioRequirement, MoneyRequirement, - StatusEffectRequirement, - WaveCountRequirement + StatusEffectRequirement } from "../mystery-encounter-requirements"; -import { MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; -import { modifierTypes } from "#app/modifier/modifier-type"; -import { Species } from "#enums/species"; -import { randSeedInt } from "#app/utils"; -import Pokemon, { PlayerPokemon } from "#app/field/pokemon"; -import { StatusEffect } from "#app/data/status-effect"; export const ShadyVitaminDealerEncounter: MysteryEncounter = MysteryEncounterBuilder .withEncounterType(MysteryEncounterType.SHADY_VITAMIN_DEALER) @@ -42,7 +41,7 @@ export const ShadyVitaminDealerEncounter: MysteryEncounter = MysteryEncounterBui y: 2 } ]) - .withSceneRequirement(new WaveCountRequirement([10, 180])) + .withSceneWaveRangeRequirement(10, 180) .withPrimaryPokemonRequirement(new StatusEffectRequirement([StatusEffect.NONE])) // Pokemon must not have status .withPrimaryPokemonRequirement(new HealthRatioRequirement([0.34, 1])) // Pokemon must have above 1/3rd HP .withOption(new MysteryEncounterOptionBuilder() diff --git a/src/data/mystery-encounters/encounters/sleeping-snorlax.ts b/src/data/mystery-encounters/encounters/sleeping-snorlax.ts index 3c94da5129b..9931ff1c16d 100644 --- a/src/data/mystery-encounters/encounters/sleeping-snorlax.ts +++ b/src/data/mystery-encounters/encounters/sleeping-snorlax.ts @@ -1,4 +1,18 @@ +import { + ModifierTypeOption, + modifierTypes +} from "#app/modifier/modifier-type"; +import { BerryType } from "#enums/berry-type"; +import { Moves } from "#enums/moves"; +import { MysteryEncounterType } from "#enums/mystery-encounter-type"; +import { Species } from "#enums/species"; import BattleScene from "../../../battle-scene"; +import * as Utils from "../../../utils"; +import { getPokemonSpecies } from "../../pokemon-species"; +import { Status, StatusEffect } from "../../status-effect"; +import MysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier } from "../mystery-encounter"; +import { MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; +import { MoveRequirement } from "../mystery-encounter-requirements"; import { EnemyPartyConfig, EnemyPokemonConfig, generateModifierType, @@ -6,20 +20,6 @@ import { leaveEncounterWithoutBattle, queueEncounterMessage, setEncounterRewards } from "../mystery-encounter-utils"; -import MysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier } from "../mystery-encounter"; -import * as Utils from "../../../utils"; -import { MysteryEncounterType } from "#enums/mystery-encounter-type"; -import { MoveRequirement, WaveCountRequirement } from "../mystery-encounter-requirements"; -import { MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; -import { - ModifierTypeOption, - modifierTypes -} from "#app/modifier/modifier-type"; -import { getPokemonSpecies } from "../../pokemon-species"; -import { Species } from "#enums/species"; -import { Status, StatusEffect } from "../../status-effect"; -import { Moves } from "#enums/moves"; -import { BerryType } from "#enums/berry-type"; export const SleepingSnorlaxEncounter: MysteryEncounter = MysteryEncounterBuilder .withEncounterType(MysteryEncounterType.SLEEPING_SNORLAX) @@ -33,7 +33,7 @@ export const SleepingSnorlaxEncounter: MysteryEncounter = MysteryEncounterBuilde repeat: true } ]) - .withSceneRequirement(new WaveCountRequirement([10, 180])) // waves 10 to 180 + .withSceneWaveRangeRequirement(10, 180) // waves 10 to 180 .withCatchAllowed(true) .withHideWildIntroMessage(true) .withOnInit((scene: BattleScene) => { diff --git a/src/data/mystery-encounters/encounters/training-session.ts b/src/data/mystery-encounters/encounters/training-session.ts index ad5da7ded36..e6167171036 100644 --- a/src/data/mystery-encounters/encounters/training-session.ts +++ b/src/data/mystery-encounters/encounters/training-session.ts @@ -1,4 +1,4 @@ -import BattleScene from "../../../battle-scene"; +import { Ability, allAbilities } from "#app/data/ability"; import { EnemyPartyConfig, getEncounterText, @@ -6,23 +6,22 @@ import { selectPokemonForOption, setEncounterRewards } from "#app/data/mystery-encounters/mystery-encounter-utils"; -import { MysteryEncounterType } from "#enums/mystery-encounter-type"; -import MysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier } from "../mystery-encounter"; -import { MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; -import { WaveCountRequirement } from "../mystery-encounter-requirements"; -import { PlayerPokemon } from "#app/field/pokemon"; -import PokemonData from "#app/system/pokemon-data"; -import { randSeedShuffle } from "#app/utils"; import { getNatureName, Nature } from "#app/data/nature"; -import { BattlerTagType } from "#enums/battler-tag-type"; -import { OptionSelectItem } from "#app/ui/abstact-option-select-ui-handler"; +import { speciesStarters } from "#app/data/pokemon-species"; +import { Stat } from "#app/data/pokemon-stat"; +import { PlayerPokemon } from "#app/field/pokemon"; +import { pokemonInfo } from "#app/locales/en/pokemon-info"; import { PokemonHeldItemModifier } from "#app/modifier/modifier"; import { PokemonHeldItemModifierType } from "#app/modifier/modifier-type"; -import { Ability, allAbilities } from "#app/data/ability"; -import { speciesStarters } from "#app/data/pokemon-species"; import { AbilityAttr } from "#app/system/game-data"; -import { Stat } from "#app/data/pokemon-stat"; -import { pokemonInfo } from "#app/locales/en/pokemon-info"; +import PokemonData from "#app/system/pokemon-data"; +import { OptionSelectItem } from "#app/ui/abstact-option-select-ui-handler"; +import { randSeedShuffle } from "#app/utils"; +import { BattlerTagType } from "#enums/battler-tag-type"; +import { MysteryEncounterType } from "#enums/mystery-encounter-type"; +import BattleScene from "../../../battle-scene"; +import MysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier } from "../mystery-encounter"; +import { MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; export const TrainingSessionEncounter: MysteryEncounter = MysteryEncounterBuilder .withEncounterType(MysteryEncounterType.TRAINING_SESSION) @@ -35,7 +34,7 @@ export const TrainingSessionEncounter: MysteryEncounter = MysteryEncounterBuilde y: 3 } ]) - .withSceneRequirement(new WaveCountRequirement([10, 180])) // waves 10 to 180 + .withSceneWaveRangeRequirement(10, 180) // waves 10 to 180 .withHideWildIntroMessage(true) .withOption(new MysteryEncounterOptionBuilder() .withPreOptionPhase(async (scene: BattleScene): Promise => { diff --git a/src/data/mystery-encounters/mystery-encounter-requirements.ts b/src/data/mystery-encounters/mystery-encounter-requirements.ts index 9e530e451c6..8781e5a4cdc 100644 --- a/src/data/mystery-encounters/mystery-encounter-requirements.ts +++ b/src/data/mystery-encounters/mystery-encounter-requirements.ts @@ -71,7 +71,7 @@ export class PreviousEncounterRequirement extends EncounterSceneRequirement { } } -export class WaveCountRequirement extends EncounterSceneRequirement { +export class WaveRangeRequirement extends EncounterSceneRequirement { waveRange: [number, number]; /** diff --git a/src/data/mystery-encounters/mystery-encounter.ts b/src/data/mystery-encounters/mystery-encounter.ts index 8071dc81c8f..37038af684c 100644 --- a/src/data/mystery-encounters/mystery-encounter.ts +++ b/src/data/mystery-encounters/mystery-encounter.ts @@ -7,7 +7,8 @@ import MysteryEncounterDialogue, { import MysteryEncounterOption from "./mystery-encounter-option"; import { EncounterPokemonRequirement, - EncounterSceneRequirement + EncounterSceneRequirement, + WaveRangeRequirement } from "./mystery-encounter-requirements"; import * as Utils from "../../utils"; import { EnemyPartyConfig } from "#app/data/mystery-encounters/mystery-encounter-utils"; @@ -430,6 +431,17 @@ export class MysteryEncounterBuilder implements Partial { return Object.assign(this, { requirements: this.requirements }); } + /** + * Specifies a wave range requirement for an encounter. + * + * @param min min wave (or exact wave if only min is given) + * @param max optional max wave. If not given, defaults to min => exact wave + * @returns + */ + withSceneWaveRangeRequirement(min: number, max?: number) { + return this.withSceneRequirement(new WaveRangeRequirement([min, max ?? min])); + } + withPrimaryPokemonRequirement(requirement: EncounterPokemonRequirement): this & Required> { this.primaryPokemonRequirements.push(requirement); return Object.assign(this, { primaryPokemonRequirements: this.primaryPokemonRequirements }); From adf52bf6041a7b6ccf44e4016f20e452929560a4 Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Tue, 9 Jul 2024 22:28:36 -0700 Subject: [PATCH 026/270] add `MysteryEncounterBuilder.withScenePartySizeRequirement` --- src/data/mystery-encounters/encounters/dark-deal.ts | 3 +-- src/data/mystery-encounters/mystery-encounter.ts | 12 ++++++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/data/mystery-encounters/encounters/dark-deal.ts b/src/data/mystery-encounters/encounters/dark-deal.ts index 95757c901ab..3a6d3ec273a 100644 --- a/src/data/mystery-encounters/encounters/dark-deal.ts +++ b/src/data/mystery-encounters/encounters/dark-deal.ts @@ -9,7 +9,6 @@ import { PokeballType } from "../../pokeball"; import { getPokemonSpecies } from "../../pokemon-species"; import MysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier } from "../mystery-encounter"; import { MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; -import { PartySizeRequirement } from "../mystery-encounter-requirements"; import { EnemyPartyConfig, EnemyPokemonConfig, getRandomPlayerPokemon, @@ -84,7 +83,7 @@ export const DarkDealEncounter: MysteryEncounter = MysteryEncounterBuilder } ]) .withSceneWaveRangeRequirement(30, 180) // waves 30 to 180 - .withSceneRequirement(new PartySizeRequirement([2, 6])) // Must have at least 2 pokemon in party + .withScenePartySizeRequirement(2, 6) // Must have at least 2 pokemon in party .withCatchAllowed(true) .withOption(new MysteryEncounterOptionBuilder() .withPreOptionPhase(async (scene: BattleScene) => { diff --git a/src/data/mystery-encounters/mystery-encounter.ts b/src/data/mystery-encounters/mystery-encounter.ts index 37038af684c..0f2cd05870e 100644 --- a/src/data/mystery-encounters/mystery-encounter.ts +++ b/src/data/mystery-encounters/mystery-encounter.ts @@ -8,6 +8,7 @@ import MysteryEncounterOption from "./mystery-encounter-option"; import { EncounterPokemonRequirement, EncounterSceneRequirement, + PartySizeRequirement, WaveRangeRequirement } from "./mystery-encounter-requirements"; import * as Utils from "../../utils"; @@ -442,6 +443,17 @@ export class MysteryEncounterBuilder implements Partial { return this.withSceneRequirement(new WaveRangeRequirement([min, max ?? min])); } + /** + * Specifies a party size requirement for an encounter. + * + * @param min min wave (or exact size if only min is given) + * @param max optional max size. If not given, defaults to min => exact wave + * @returns + */ + withScenePartySizeRequirement(min: number, max?: number) { + return this.withSceneRequirement(new PartySizeRequirement([min, max ?? min])); + } + withPrimaryPokemonRequirement(requirement: EncounterPokemonRequirement): this & Required> { this.primaryPokemonRequirements.push(requirement); return Object.assign(this, { primaryPokemonRequirements: this.primaryPokemonRequirements }); From a8be171305bbcb6f071c86607ac44cbec76d5e97 Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Tue, 9 Jul 2024 22:34:53 -0700 Subject: [PATCH 027/270] add `MysterEncounterBuilder.withOptionPhase()` --- .../encounters/dark-deal.ts | 15 +- .../encounters/department-store-sale.ts | 151 ++++++++---------- .../encounters/fight-or-flight.ts | 101 ++++++------ .../encounters/mysterious-challengers.ts | 83 +++++----- .../encounters/mysterious-chest.ts | 15 +- .../encounters/shady-vitamin-dealer.ts | 16 +- .../encounters/sleeping-snorlax.ts | 79 +++++---- .../encounters/training-session.ts | 9 +- .../mystery-encounter-option.ts | 21 +-- .../mystery-encounters/mystery-encounter.ts | 13 +- 10 files changed, 246 insertions(+), 257 deletions(-) diff --git a/src/data/mystery-encounters/encounters/dark-deal.ts b/src/data/mystery-encounters/encounters/dark-deal.ts index 3a6d3ec273a..1985ffcf8dd 100644 --- a/src/data/mystery-encounters/encounters/dark-deal.ts +++ b/src/data/mystery-encounters/encounters/dark-deal.ts @@ -123,12 +123,11 @@ export const DarkDealEncounter: MysteryEncounter = MysteryEncounterBuilder }; return initBattleWithEnemyConfig(scene, config); }) - .build()) - .withOption(new MysteryEncounterOptionBuilder() - .withOptionPhase(async (scene: BattleScene) => { - // Leave encounter with no rewards or exp - leaveEncounterWithoutBattle(scene, true); - return true; - }) - .build()) + .build() + ) + .withOptionPhase(async (scene: BattleScene) => { + // Leave encounter with no rewards or exp + leaveEncounterWithoutBattle(scene, true); + return true; + }) .build(); diff --git a/src/data/mystery-encounters/encounters/department-store-sale.ts b/src/data/mystery-encounters/encounters/department-store-sale.ts index 38b599c5390..1d44c2b3af8 100644 --- a/src/data/mystery-encounters/encounters/department-store-sale.ts +++ b/src/data/mystery-encounters/encounters/department-store-sale.ts @@ -8,7 +8,6 @@ import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { Species } from "#enums/species"; import BattleScene from "../../../battle-scene"; import MysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier } from "../mystery-encounter"; -import { MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; export const DepartmentStoreSaleEncounter: MysteryEncounter = MysteryEncounterBuilder .withEncounterType(MysteryEncounterType.DEPARTMENT_STORE_SALE) @@ -30,91 +29,83 @@ export const DepartmentStoreSaleEncounter: MysteryEncounter = MysteryEncounterBu ]) // .withHideIntroVisuals(false) .withSceneWaveRangeRequirement(10, 100) - .withOption(new MysteryEncounterOptionBuilder() - .withOptionPhase(async (scene: BattleScene) => { - // Choose TMs - const modifiers = []; - let i = 0; - while (i < 4) { - // 2/2/1 weight on TM rarity - const roll = randSeedInt(5); - if (roll < 2) { - modifiers.push(modifierTypes.TM_COMMON); - } else if (roll < 4) { - modifiers.push(modifierTypes.TM_GREAT); - } else { - modifiers.push(modifierTypes.TM_ULTRA); - } - i++; + .withOptionPhase(async (scene: BattleScene) => { + // Choose TMs + const modifiers = []; + let i = 0; + while (i < 4) { + // 2/2/1 weight on TM rarity + const roll = randSeedInt(5); + if (roll < 2) { + modifiers.push(modifierTypes.TM_COMMON); + } else if (roll < 4) { + modifiers.push(modifierTypes.TM_GREAT); + } else { + modifiers.push(modifierTypes.TM_ULTRA); } + i++; + } - setEncounterExp(scene, scene.getParty().map(p => p.id), 300); - setEncounterRewards(scene, { guaranteedModifierTypeFuncs: modifiers, fillRemaining: false }); - leaveEncounterWithoutBattle(scene); - }) - .build()) - .withOption(new MysteryEncounterOptionBuilder() - .withOptionPhase(async (scene: BattleScene) => { - // Choose Vitamins - const modifiers = []; - let i = 0; - while (i < 3) { - // 2/1 weight on base stat booster vs PP Up - const roll = randSeedInt(3); - if (roll === 0) { - modifiers.push(modifierTypes.PP_UP); - } else { - modifiers.push(modifierTypes.BASE_STAT_BOOSTER); - } - i++; + setEncounterExp(scene, scene.getParty().map(p => p.id), 300); + setEncounterRewards(scene, { guaranteedModifierTypeFuncs: modifiers, fillRemaining: false }); + leaveEncounterWithoutBattle(scene); + }) + .withOptionPhase(async (scene: BattleScene) => { + // Choose Vitamins + const modifiers = []; + let i = 0; + while (i < 3) { + // 2/1 weight on base stat booster vs PP Up + const roll = randSeedInt(3); + if (roll === 0) { + modifiers.push(modifierTypes.PP_UP); + } else { + modifiers.push(modifierTypes.BASE_STAT_BOOSTER); } + i++; + } - setEncounterRewards(scene, { guaranteedModifierTypeFuncs: modifiers, fillRemaining: false }); - leaveEncounterWithoutBattle(scene); - }) - .build()) - .withOption(new MysteryEncounterOptionBuilder() - .withOptionPhase(async (scene: BattleScene) => { - // Choose X Items - const modifiers = []; - let i = 0; - while (i < 5) { - // 4/1 weight on base stat booster vs Dire Hit - const roll = randSeedInt(5); - if (roll === 0) { - modifiers.push(modifierTypes.DIRE_HIT); - } else { - modifiers.push(modifierTypes.TEMP_STAT_BOOSTER); - } - i++; + setEncounterRewards(scene, { guaranteedModifierTypeFuncs: modifiers, fillRemaining: false }); + leaveEncounterWithoutBattle(scene); + }) + .withOptionPhase(async (scene: BattleScene) => { + // Choose X Items + const modifiers = []; + let i = 0; + while (i < 5) { + // 4/1 weight on base stat booster vs Dire Hit + const roll = randSeedInt(5); + if (roll === 0) { + modifiers.push(modifierTypes.DIRE_HIT); + } else { + modifiers.push(modifierTypes.TEMP_STAT_BOOSTER); } + i++; + } - setEncounterRewards(scene, { guaranteedModifierTypeFuncs: modifiers, fillRemaining: false }); - leaveEncounterWithoutBattle(scene); - }) - .build()) - .withOption(new MysteryEncounterOptionBuilder() - .withOptionPhase(async (scene: BattleScene) => { - // Choose Pokeballs - const modifiers = []; - let i = 0; - while (i < 4) { - // 10/30/20/5 weight on pokeballs - const roll = randSeedInt(65); - if (roll < 10) { - modifiers.push(modifierTypes.POKEBALL); - } else if (roll < 40) { - modifiers.push(modifierTypes.GREAT_BALL); - } else if (roll < 60) { - modifiers.push(modifierTypes.ULTRA_BALL); - } else { - modifiers.push(modifierTypes.ROGUE_BALL); - } - i++; + setEncounterRewards(scene, { guaranteedModifierTypeFuncs: modifiers, fillRemaining: false }); + leaveEncounterWithoutBattle(scene); + }) + .withOptionPhase(async (scene: BattleScene) => { + // Choose Pokeballs + const modifiers = []; + let i = 0; + while (i < 4) { + // 10/30/20/5 weight on pokeballs + const roll = randSeedInt(65); + if (roll < 10) { + modifiers.push(modifierTypes.POKEBALL); + } else if (roll < 40) { + modifiers.push(modifierTypes.GREAT_BALL); + } else if (roll < 60) { + modifiers.push(modifierTypes.ULTRA_BALL); + } else { + modifiers.push(modifierTypes.ROGUE_BALL); } + i++; + } - setEncounterRewards(scene, { guaranteedModifierTypeFuncs: modifiers, fillRemaining: false }); - leaveEncounterWithoutBattle(scene); - }) - .build()) + setEncounterRewards(scene, { guaranteedModifierTypeFuncs: modifiers, fillRemaining: false }); + leaveEncounterWithoutBattle(scene); + }) .build(); diff --git a/src/data/mystery-encounters/encounters/fight-or-flight.ts b/src/data/mystery-encounters/encounters/fight-or-flight.ts index e5f58cb7cda..506b450aa98 100644 --- a/src/data/mystery-encounters/encounters/fight-or-flight.ts +++ b/src/data/mystery-encounters/encounters/fight-or-flight.ts @@ -23,7 +23,6 @@ import { Moves } from "#enums/moves"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import BattleScene from "../../../battle-scene"; import MysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier } from "../mystery-encounter"; -import { MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; import { MoveRequirement } from "../mystery-encounter-requirements"; const validMovesForSteal = [ @@ -99,59 +98,53 @@ export const FightOrFlightEncounter: MysteryEncounter = MysteryEncounterBuilder return true; }) - .withOption(new MysteryEncounterOptionBuilder() - .withOptionPhase(async (scene: BattleScene) => { - // Pick battle - const item = scene.currentBattle.mysteryEncounter.misc as ModifierTypeOption; - setEncounterRewards(scene, { guaranteedModifierTypeOptions: [item], fillRemaining: false }); - await initBattleWithEnemyConfig(scene, scene.currentBattle.mysteryEncounter.enemyPartyConfigs[0]); - }) - .build()) - .withOption(new MysteryEncounterOptionBuilder() - .withOptionPhase(async (scene: BattleScene) => { - // Pick steal - const encounter = scene.currentBattle.mysteryEncounter; - const item = scene.currentBattle.mysteryEncounter.misc as ModifierTypeOption; - setEncounterRewards(scene, { guaranteedModifierTypeOptions: [item], fillRemaining: false }); + .withOptionPhase(async (scene: BattleScene) => { + // Pick battle + const item = scene.currentBattle.mysteryEncounter.misc as ModifierTypeOption; + setEncounterRewards(scene, { guaranteedModifierTypeOptions: [item], fillRemaining: false }); + await initBattleWithEnemyConfig(scene, scene.currentBattle.mysteryEncounter.enemyPartyConfigs[0]); + }) + .withOptionPhase(async (scene: BattleScene) => { + // Pick steal + const encounter = scene.currentBattle.mysteryEncounter; + const item = scene.currentBattle.mysteryEncounter.misc as ModifierTypeOption; + setEncounterRewards(scene, { guaranteedModifierTypeOptions: [item], fillRemaining: false }); - // If player has a stealing move, they succeed automatically - const moveRequirement = new MoveRequirement(validMovesForSteal); - const validPokemon = moveRequirement.queryParty(scene.getParty()); - if (validPokemon?.length > 0) { - // Use first valid pokemon to execute the theivery - const pokemon = validPokemon[0]; - encounter.setDialogueToken("thiefPokemon", pokemon.name); - encounter.setDialogueToken(...moveRequirement.getDialogueToken(scene, pokemon)); - await showEncounterText(scene, "mysteryEncounter:fight_or_flight_option_2_steal_result"); - leaveEncounterWithoutBattle(scene); - return; - } + // If player has a stealing move, they succeed automatically + const moveRequirement = new MoveRequirement(validMovesForSteal); + const validPokemon = moveRequirement.queryParty(scene.getParty()); + if (validPokemon?.length > 0) { + // Use first valid pokemon to execute the theivery + const pokemon = validPokemon[0]; + encounter.setDialogueToken("thiefPokemon", pokemon.name); + encounter.setDialogueToken(...moveRequirement.getDialogueToken(scene, pokemon)); + await showEncounterText(scene, "mysteryEncounter:fight_or_flight_option_2_steal_result"); + leaveEncounterWithoutBattle(scene); + return; + } - const roll = randSeedInt(16); - if (roll > 6) { - // Noticed and attacked by boss, gets +1 to all stats at start of fight (62.5%) - const config = scene.currentBattle.mysteryEncounter.enemyPartyConfigs[0]; - config.pokemonConfigs[0].tags = [BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON]; - config.pokemonConfigs[0].mysteryEncounterBattleEffects = (pokemon: Pokemon) => { - pokemon.scene.currentBattle.mysteryEncounter.setDialogueToken("enemyPokemon", pokemon.name); - queueEncounterMessage(pokemon.scene, "mysteryEncounter:fight_or_flight_boss_enraged"); - pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [BattleStat.ATK, BattleStat.DEF, BattleStat.SPATK, BattleStat.SPDEF, BattleStat.SPD], 1)); - }; - await showEncounterText(scene, "mysteryEncounter:fight_or_flight_option_2_bad_result"); - await initBattleWithEnemyConfig(scene, config); - } else { - // Steal item (37.5%) - // Display result message then proceed to rewards - await showEncounterText(scene, "mysteryEncounter:fight_or_flight_option_2_good_result"); - leaveEncounterWithoutBattle(scene); - } - }) - .build()) - .withOption(new MysteryEncounterOptionBuilder() - .withOptionPhase(async (scene: BattleScene) => { - // Leave encounter with no rewards or exp - leaveEncounterWithoutBattle(scene, true); - return true; - }) - .build()) + const roll = randSeedInt(16); + if (roll > 6) { + // Noticed and attacked by boss, gets +1 to all stats at start of fight (62.5%) + const config = scene.currentBattle.mysteryEncounter.enemyPartyConfigs[0]; + config.pokemonConfigs[0].tags = [BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON]; + config.pokemonConfigs[0].mysteryEncounterBattleEffects = (pokemon: Pokemon) => { + pokemon.scene.currentBattle.mysteryEncounter.setDialogueToken("enemyPokemon", pokemon.name); + queueEncounterMessage(pokemon.scene, "mysteryEncounter:fight_or_flight_boss_enraged"); + pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [BattleStat.ATK, BattleStat.DEF, BattleStat.SPATK, BattleStat.SPDEF, BattleStat.SPD], 1)); + }; + await showEncounterText(scene, "mysteryEncounter:fight_or_flight_option_2_bad_result"); + await initBattleWithEnemyConfig(scene, config); + } else { + // Steal item (37.5%) + // Display result message then proceed to rewards + await showEncounterText(scene, "mysteryEncounter:fight_or_flight_option_2_good_result"); + leaveEncounterWithoutBattle(scene); + } + }) + .withOptionPhase(async (scene: BattleScene) => { + // Leave encounter with no rewards or exp + leaveEncounterWithoutBattle(scene, true); + return true; + }) .build(); diff --git a/src/data/mystery-encounters/encounters/mysterious-challengers.ts b/src/data/mystery-encounters/encounters/mysterious-challengers.ts index df363e89c2d..880c7be4ca2 100644 --- a/src/data/mystery-encounters/encounters/mysterious-challengers.ts +++ b/src/data/mystery-encounters/encounters/mysterious-challengers.ts @@ -12,7 +12,6 @@ import { PartyMemberStrength } from "#enums/party-member-strength"; import BattleScene from "../../../battle-scene"; import * as Utils from "../../../utils"; import MysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier } from "../mystery-encounter"; -import { MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; export const MysteriousChallengersEncounter: MysteryEncounter = MysteryEncounterBuilder .withEncounterType(MysteryEncounterType.MYSTERIOUS_CHALLENGERS) @@ -96,55 +95,49 @@ export const MysteriousChallengersEncounter: MysteryEncounter = MysteryEncounter return true; }) - .withOption(new MysteryEncounterOptionBuilder() - .withOptionPhase(async (scene: BattleScene) => { - const encounter = scene.currentBattle.mysteryEncounter; - // Spawn standard trainer battle with memory mushroom reward - const config: EnemyPartyConfig = encounter.enemyPartyConfigs[0]; + .withOptionPhase(async (scene: BattleScene) => { + const encounter = scene.currentBattle.mysteryEncounter; + // Spawn standard trainer battle with memory mushroom reward + const config: EnemyPartyConfig = encounter.enemyPartyConfigs[0]; - setEncounterRewards(scene, { guaranteedModifierTypeFuncs: [modifierTypes.TM_COMMON, modifierTypes.TM_GREAT, modifierTypes.MEMORY_MUSHROOM], fillRemaining: true }); + setEncounterRewards(scene, { guaranteedModifierTypeFuncs: [modifierTypes.TM_COMMON, modifierTypes.TM_GREAT, modifierTypes.MEMORY_MUSHROOM], fillRemaining: true }); - // Seed offsets to remove possibility of different trainers having exact same teams - let ret; - scene.executeWithSeedOffset(() => { - ret = initBattleWithEnemyConfig(scene, config); - }, scene.currentBattle.waveIndex * 10); - return ret; - }) - .build()) - .withOption(new MysteryEncounterOptionBuilder() - .withOptionPhase(async (scene: BattleScene) => { - const encounter = scene.currentBattle.mysteryEncounter; - // Spawn hard fight with ULTRA/GREAT reward (can improve with luck) - const config: EnemyPartyConfig = encounter.enemyPartyConfigs[1]; + // Seed offsets to remove possibility of different trainers having exact same teams + let ret; + scene.executeWithSeedOffset(() => { + ret = initBattleWithEnemyConfig(scene, config); + }, scene.currentBattle.waveIndex * 10); + return ret; + }) + .withOptionPhase(async (scene: BattleScene) => { + const encounter = scene.currentBattle.mysteryEncounter; + // Spawn hard fight with ULTRA/GREAT reward (can improve with luck) + const config: EnemyPartyConfig = encounter.enemyPartyConfigs[1]; - setEncounterRewards(scene, { guaranteedModifierTiers: [ModifierTier.ULTRA, ModifierTier.GREAT, ModifierTier.GREAT], fillRemaining: true }); + setEncounterRewards(scene, { guaranteedModifierTiers: [ModifierTier.ULTRA, ModifierTier.GREAT, ModifierTier.GREAT], fillRemaining: true }); - // Seed offsets to remove possibility of different trainers having exact same teams - let ret; - scene.executeWithSeedOffset(() => { - ret = initBattleWithEnemyConfig(scene, config); - }, scene.currentBattle.waveIndex * 100); - return ret; - }) - .build()) - .withOption(new MysteryEncounterOptionBuilder() - .withOptionPhase(async (scene: BattleScene) => { - const encounter = scene.currentBattle.mysteryEncounter; - // Spawn brutal fight with ROGUE/ULTRA/GREAT reward (can improve with luck) - const config: EnemyPartyConfig = encounter.enemyPartyConfigs[2]; + // Seed offsets to remove possibility of different trainers having exact same teams + let ret; + scene.executeWithSeedOffset(() => { + ret = initBattleWithEnemyConfig(scene, config); + }, scene.currentBattle.waveIndex * 100); + return ret; + }) + .withOptionPhase(async (scene: BattleScene) => { + const encounter = scene.currentBattle.mysteryEncounter; + // Spawn brutal fight with ROGUE/ULTRA/GREAT reward (can improve with luck) + const config: EnemyPartyConfig = encounter.enemyPartyConfigs[2]; - // To avoid player level snowballing from picking this option - encounter.expMultiplier = 0.9; + // To avoid player level snowballing from picking this option + encounter.expMultiplier = 0.9; - setEncounterRewards(scene, { guaranteedModifierTiers: [ModifierTier.ROGUE, ModifierTier.ULTRA, ModifierTier.GREAT], fillRemaining: true }); + setEncounterRewards(scene, { guaranteedModifierTiers: [ModifierTier.ROGUE, ModifierTier.ULTRA, ModifierTier.GREAT], fillRemaining: true }); - // Seed offsets to remove possibility of different trainers having exact same teams - let ret; - scene.executeWithSeedOffset(() => { - ret = initBattleWithEnemyConfig(scene, config); - }, scene.currentBattle.waveIndex * 1000); - return ret; - }) - .build()) + // Seed offsets to remove possibility of different trainers having exact same teams + let ret; + scene.executeWithSeedOffset(() => { + ret = initBattleWithEnemyConfig(scene, config); + }, scene.currentBattle.waveIndex * 1000); + return ret; + }) .build(); diff --git a/src/data/mystery-encounters/encounters/mysterious-chest.ts b/src/data/mystery-encounters/encounters/mysterious-chest.ts index 9068c8521a5..5e572131562 100644 --- a/src/data/mystery-encounters/encounters/mysterious-chest.ts +++ b/src/data/mystery-encounters/encounters/mysterious-chest.ts @@ -83,12 +83,11 @@ export const MysteriousChestEncounter: MysteryEncounter = MysteryEncounterBuilde }); } }) - .build()) - .withOption(new MysteryEncounterOptionBuilder() - .withOptionPhase(async (scene: BattleScene) => { - // Leave encounter with no rewards or exp - leaveEncounterWithoutBattle(scene, true); - return true; - }) - .build()) + .build() + ) + .withOptionPhase(async (scene: BattleScene) => { + // Leave encounter with no rewards or exp + leaveEncounterWithoutBattle(scene, true); + return true; + }) .build(); diff --git a/src/data/mystery-encounters/encounters/shady-vitamin-dealer.ts b/src/data/mystery-encounters/encounters/shady-vitamin-dealer.ts index 1cdfdfa00e0..4c99bfb3d96 100644 --- a/src/data/mystery-encounters/encounters/shady-vitamin-dealer.ts +++ b/src/data/mystery-encounters/encounters/shady-vitamin-dealer.ts @@ -116,6 +116,7 @@ export const ShadyVitaminDealerEncounter: MysteryEncounter = MysteryEncounterBui chosenPokemon.updateInfo(); }) .build()) + .withOption(new MysteryEncounterOptionBuilder() .withSceneRequirement(new MoneyRequirement(0, 5)) // Wave scaling multiplier of 2 for cost .withOptionPhase(async (scene: BattleScene) => { @@ -136,12 +137,11 @@ export const ShadyVitaminDealerEncounter: MysteryEncounter = MysteryEncounterBui setEncounterRewards(scene, { guaranteedModifierTypeFuncs: modifiers, fillRemaining: false }); leaveEncounterWithoutBattle(scene); }) - .build()) - .withOption(new MysteryEncounterOptionBuilder() - .withOptionPhase(async (scene: BattleScene) => { - // Leave encounter with no rewards or exp - leaveEncounterWithoutBattle(scene, true); - return true; - }) - .build()) + .build() + ) + .withOptionPhase(async (scene: BattleScene) => { + // Leave encounter with no rewards or exp + leaveEncounterWithoutBattle(scene, true); + return true; + }) .build(); diff --git a/src/data/mystery-encounters/encounters/sleeping-snorlax.ts b/src/data/mystery-encounters/encounters/sleeping-snorlax.ts index 9931ff1c16d..1a011bb05a0 100644 --- a/src/data/mystery-encounters/encounters/sleeping-snorlax.ts +++ b/src/data/mystery-encounters/encounters/sleeping-snorlax.ts @@ -54,49 +54,45 @@ export const SleepingSnorlaxEncounter: MysteryEncounter = MysteryEncounterBuilde encounter.enemyPartyConfigs = [config]; return true; }) - .withOption(new MysteryEncounterOptionBuilder() - .withOptionPhase(async (scene: BattleScene) => { - // Pick battle - // TODO: do we want special rewards for this? - // setCustomEncounterRewards(scene, { guaranteedModifierTypeFuncs: [modifierTypes.LEFTOVERS], fillRemaining: true}); - await initBattleWithEnemyConfig(scene, scene.currentBattle.mysteryEncounter.enemyPartyConfigs[0]); - }) - .build()) - .withOption(new MysteryEncounterOptionBuilder() - .withOptionPhase(async (scene: BattleScene) => { - const instance = scene.currentBattle.mysteryEncounter; - let roll: integer; - scene.executeWithSeedOffset(() => { - roll = Utils.randSeedInt(16, 0); - }, scene.currentBattle.waveIndex); - console.log(roll); - if (roll > 4) { - // Fall asleep and get a sitrus berry (75%) - const p = instance.primaryPokemon; - p.status = new Status(StatusEffect.SLEEP, 0, 3); - p.updateInfo(true); - // const sitrus = (modifierTypes.BERRY?.() as ModifierTypeGenerator).generateType(scene.getParty(), [BerryType.SITRUS]); - const sitrus = generateModifierType(scene, modifierTypes.BERRY, [BerryType.SITRUS]); + .withOptionPhase(async (scene: BattleScene) => { + // Pick battle + // TODO: do we want special rewards for this? + // setCustomEncounterRewards(scene, { guaranteedModifierTypeFuncs: [modifierTypes.LEFTOVERS], fillRemaining: true}); + await initBattleWithEnemyConfig(scene, scene.currentBattle.mysteryEncounter.enemyPartyConfigs[0]); + }) + .withOptionPhase(async (scene: BattleScene) => { + const instance = scene.currentBattle.mysteryEncounter; + let roll: integer; + scene.executeWithSeedOffset(() => { + roll = Utils.randSeedInt(16, 0); + }, scene.currentBattle.waveIndex); + console.log(roll); + if (roll > 4) { + // Fall asleep and get a sitrus berry (75%) + const p = instance.primaryPokemon; + p.status = new Status(StatusEffect.SLEEP, 0, 3); + p.updateInfo(true); + // const sitrus = (modifierTypes.BERRY?.() as ModifierTypeGenerator).generateType(scene.getParty(), [BerryType.SITRUS]); + const sitrus = generateModifierType(scene, modifierTypes.BERRY, [BerryType.SITRUS]); - setEncounterRewards(scene, { guaranteedModifierTypeOptions: [new ModifierTypeOption(sitrus, 0)], fillRemaining: false }); - queueEncounterMessage(scene, "mysteryEncounter:sleeping_snorlax_option_2_bad_result"); - leaveEncounterWithoutBattle(scene); - } else { - // Heal to full (25%) - for (const pokemon of scene.getParty()) { - pokemon.hp = pokemon.getMaxHp(); - pokemon.resetStatus(); - for (const move of pokemon.moveset) { - move.ppUsed = 0; - } - pokemon.updateInfo(true); + setEncounterRewards(scene, { guaranteedModifierTypeOptions: [new ModifierTypeOption(sitrus, 0)], fillRemaining: false }); + queueEncounterMessage(scene, "mysteryEncounter:sleeping_snorlax_option_2_bad_result"); + leaveEncounterWithoutBattle(scene); + } else { + // Heal to full (25%) + for (const pokemon of scene.getParty()) { + pokemon.hp = pokemon.getMaxHp(); + pokemon.resetStatus(); + for (const move of pokemon.moveset) { + move.ppUsed = 0; } - - queueEncounterMessage(scene, "mysteryEncounter:sleeping_snorlax_option_2_good_result"); - leaveEncounterWithoutBattle(scene); + pokemon.updateInfo(true); } - }) - .build()) + + queueEncounterMessage(scene, "mysteryEncounter:sleeping_snorlax_option_2_good_result"); + leaveEncounterWithoutBattle(scene); + } + }) .withOption(new MysteryEncounterOptionBuilder() .withPrimaryPokemonRequirement(new MoveRequirement([Moves.PLUCK, Moves.COVET, Moves.KNOCK_OFF, Moves.THIEF, Moves.TRICK, Moves.SWITCHEROO])) .withOptionPhase(async (scene: BattleScene) => { @@ -105,5 +101,6 @@ export const SleepingSnorlaxEncounter: MysteryEncounter = MysteryEncounterBuilde queueEncounterMessage(scene, "mysteryEncounter:sleeping_snorlax_option_3_good_result"); leaveEncounterWithoutBattle(scene); }) - .build()) + .build() + ) .build(); diff --git a/src/data/mystery-encounters/encounters/training-session.ts b/src/data/mystery-encounters/encounters/training-session.ts index e6167171036..8030cbaf850 100644 --- a/src/data/mystery-encounters/encounters/training-session.ts +++ b/src/data/mystery-encounters/encounters/training-session.ts @@ -134,7 +134,8 @@ export const TrainingSessionEncounter: MysteryEncounter = MysteryEncounterBuilde return initBattleWithEnemyConfig(scene, config); }) - .build()) + .build() + ) .withOption(new MysteryEncounterOptionBuilder() .withPreOptionPhase(async (scene: BattleScene): Promise => { // Open menu for selecting pokemon and Nature @@ -190,7 +191,8 @@ export const TrainingSessionEncounter: MysteryEncounter = MysteryEncounterBuilde return initBattleWithEnemyConfig(scene, config); }) - .build()) + .build() + ) .withOption(new MysteryEncounterOptionBuilder() .withPreOptionPhase(async (scene: BattleScene): Promise => { // Open menu for selecting pokemon and ability to learn @@ -271,7 +273,8 @@ export const TrainingSessionEncounter: MysteryEncounter = MysteryEncounterBuilde return initBattleWithEnemyConfig(scene, config); }) - .build()) + .build() + ) .build(); function getEnemyConfig(scene: BattleScene, playerPokemon: PlayerPokemon, segments: number, modifiers: ModifiersHolder): EnemyPartyConfig { diff --git a/src/data/mystery-encounters/mystery-encounter-option.ts b/src/data/mystery-encounters/mystery-encounter-option.ts index 995b10f2714..5c42bfdd4ce 100644 --- a/src/data/mystery-encounters/mystery-encounter-option.ts +++ b/src/data/mystery-encounters/mystery-encounter-option.ts @@ -4,6 +4,9 @@ import BattleScene from "../../battle-scene"; import { EncounterPokemonRequirement, EncounterSceneRequirement } from "./mystery-encounter-requirements"; import { OptionTextDisplay } from "#app/data/mystery-encounters/mystery-encounter-dialogue"; + +export type OptionPhaseCallback = (scene: BattleScene) => Promise; + export default interface MysteryEncounterOption { requirements?: EncounterSceneRequirement[]; primaryPokemonRequirements?: EncounterPokemonRequirement[]; @@ -19,11 +22,11 @@ export default interface MysteryEncounterOption { dialogue?: OptionTextDisplay; // Executes before any following dialogue or business logic from option. Usually this will be for calculating dialogueTokens or performing scene/data updates - onPreOptionPhase?: (scene: BattleScene) => Promise; + onPreOptionPhase?: OptionPhaseCallback; // Business logic for option - onOptionPhase?: (scene: BattleScene) => Promise; + onOptionPhase?: OptionPhaseCallback; // Executes after the encounter is over. Usually this will be for calculating dialogueTokens or performing data updates - onPostOptionPhase?: (scene: BattleScene) => Promise; + onPostOptionPhase?: OptionPhaseCallback; } export default class MysteryEncounterOption implements MysteryEncounterOption { @@ -121,24 +124,24 @@ export class MysteryEncounterOptionBuilder implements Partial Promise; - onOptionPhase?: (scene: BattleScene) => Promise; - onPostOptionPhase?: (scene: BattleScene) => Promise; + onPreOptionPhase?: OptionPhaseCallback; + onOptionPhase?: OptionPhaseCallback; + onPostOptionPhase?: OptionPhaseCallback; withSceneRequirement(requirement: EncounterSceneRequirement): this & Required> { this.requirements.push(requirement); return Object.assign(this, { requirements: this.requirements }); } - withPreOptionPhase(onPreOptionPhase: (scene: BattleScene) => Promise): this & Required> { + withPreOptionPhase(onPreOptionPhase: OptionPhaseCallback): this & Required> { return Object.assign(this, { onPreOptionPhase: onPreOptionPhase }); } - withOptionPhase(onOptionPhase: (scene: BattleScene) => Promise): this & Required> { + withOptionPhase(onOptionPhase: OptionPhaseCallback): this & Required> { return Object.assign(this, { onOptionPhase: onOptionPhase }); } - withPostOptionPhase(onPostOptionPhase: (scene: BattleScene) => Promise): this & Required> { + withPostOptionPhase(onPostOptionPhase: OptionPhaseCallback): this & Required> { return Object.assign(this, { onPostOptionPhase: onPostOptionPhase }); } diff --git a/src/data/mystery-encounters/mystery-encounter.ts b/src/data/mystery-encounters/mystery-encounter.ts index 0f2cd05870e..99e58b7e3a1 100644 --- a/src/data/mystery-encounters/mystery-encounter.ts +++ b/src/data/mystery-encounters/mystery-encounter.ts @@ -4,7 +4,7 @@ import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import MysteryEncounterDialogue, { allMysteryEncounterDialogue } from "./mystery-encounter-dialogue"; -import MysteryEncounterOption from "./mystery-encounter-option"; +import MysteryEncounterOption, { MysteryEncounterOptionBuilder, OptionPhaseCallback } from "./mystery-encounter-option"; import { EncounterPokemonRequirement, EncounterSceneRequirement, @@ -387,6 +387,17 @@ export class MysteryEncounterBuilder implements Partial { } } + /** + * Adds a streamlined option phase. + * Only use if no pre-/post-options or condtions necessary. + * + * @param callback - OptionPhaseCallback + * @returns + */ + withOptionPhase(callback: OptionPhaseCallback) { + return this.withOption(new MysteryEncounterOptionBuilder().withOptionPhase(callback).build()); + } + /** * Defines the sprites that will be shown on the enemy field when the encounter spawns * Can be one or more sprites, recommended not to exceed 4 From 434104f9ee86dade9645bcce51774ac8f1579c87 Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Tue, 9 Jul 2024 22:37:14 -0700 Subject: [PATCH 028/270] add 2 new MysteryEncounterBuilder methods: - `.withPrimaryPokemonStatusEffectRequirement()` - `.withPrimaryPokemonHealthRatioRequirement` --- .../encounters/shady-vitamin-dealer.ts | 8 +++---- .../mystery-encounters/mystery-encounter.ts | 21 ++++++++++++++----- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/src/data/mystery-encounters/encounters/shady-vitamin-dealer.ts b/src/data/mystery-encounters/encounters/shady-vitamin-dealer.ts index 4c99bfb3d96..83d6da4a616 100644 --- a/src/data/mystery-encounters/encounters/shady-vitamin-dealer.ts +++ b/src/data/mystery-encounters/encounters/shady-vitamin-dealer.ts @@ -16,9 +16,7 @@ import BattleScene from "../../../battle-scene"; import MysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier } from "../mystery-encounter"; import { MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; import { - HealthRatioRequirement, - MoneyRequirement, - StatusEffectRequirement + MoneyRequirement } from "../mystery-encounter-requirements"; export const ShadyVitaminDealerEncounter: MysteryEncounter = MysteryEncounterBuilder @@ -42,8 +40,8 @@ export const ShadyVitaminDealerEncounter: MysteryEncounter = MysteryEncounterBui } ]) .withSceneWaveRangeRequirement(10, 180) - .withPrimaryPokemonRequirement(new StatusEffectRequirement([StatusEffect.NONE])) // Pokemon must not have status - .withPrimaryPokemonRequirement(new HealthRatioRequirement([0.34, 1])) // Pokemon must have above 1/3rd HP + .withPrimaryPokemonStatusEffectRequirement([StatusEffect.NONE]) // Pokemon must not have status + .withPrimaryPokemonHealthRatioRequirement([0.34, 1]) // Pokemon must have above 1/3rd HP .withOption(new MysteryEncounterOptionBuilder() .withSceneRequirement(new MoneyRequirement(0, 2)) // Wave scaling multiplier of 2 for cost .withPreOptionPhase(async (scene: BattleScene): Promise => { diff --git a/src/data/mystery-encounters/mystery-encounter.ts b/src/data/mystery-encounters/mystery-encounter.ts index 99e58b7e3a1..87b80aba321 100644 --- a/src/data/mystery-encounters/mystery-encounter.ts +++ b/src/data/mystery-encounters/mystery-encounter.ts @@ -1,6 +1,11 @@ +import { EnemyPartyConfig } from "#app/data/mystery-encounters/mystery-encounter-utils"; +import Pokemon, { PlayerPokemon } from "#app/field/pokemon"; +import { isNullOrUndefined } from "#app/utils"; +import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import BattleScene from "../../battle-scene"; import MysteryEncounterIntroVisuals, { MysteryEncounterSpriteConfig } from "../../field/mystery-encounter-intro"; -import { MysteryEncounterType } from "#enums/mystery-encounter-type"; +import * as Utils from "../../utils"; +import { StatusEffect } from "../status-effect"; import MysteryEncounterDialogue, { allMysteryEncounterDialogue } from "./mystery-encounter-dialogue"; @@ -8,13 +13,11 @@ import MysteryEncounterOption, { MysteryEncounterOptionBuilder, OptionPhaseCallb import { EncounterPokemonRequirement, EncounterSceneRequirement, + HealthRatioRequirement, PartySizeRequirement, + StatusEffectRequirement, WaveRangeRequirement } from "./mystery-encounter-requirements"; -import * as Utils from "../../utils"; -import { EnemyPartyConfig } from "#app/data/mystery-encounters/mystery-encounter-utils"; -import Pokemon, { PlayerPokemon } from "#app/field/pokemon"; -import { isNullOrUndefined } from "#app/utils"; export enum MysteryEncounterVariant { DEFAULT, @@ -470,6 +473,14 @@ export class MysteryEncounterBuilder implements Partial { return Object.assign(this, { primaryPokemonRequirements: this.primaryPokemonRequirements }); } + withPrimaryPokemonStatusEffectRequirement(statusEffect: StatusEffect | StatusEffect[], minNumberOfPokemon: number = 1, invertQuery: boolean = false): this & Required> { + return this.withPrimaryPokemonRequirement(new StatusEffectRequirement(statusEffect, minNumberOfPokemon, invertQuery)); + } + + withPrimaryPokemonHealthRatioRequirement(requiredHealthRange: [number, number], minNumberOfPokemon: number = 1, invertQuery: boolean = false): this & Required> { + return this.withPrimaryPokemonRequirement(new HealthRatioRequirement(requiredHealthRange, minNumberOfPokemon, invertQuery)); + } + // TODO: Maybe add an optional parameter for excluding primary pokemon from the support cast? // ex. if your only grass type pokemon, a snivy, is chosen as primary, if the support pokemon requires a grass type, the event won't trigger because // it's already been From f1b074755e377cfb78853f12551f91c9dfd2ae02 Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Tue, 9 Jul 2024 22:38:58 -0700 Subject: [PATCH 029/270] add `MysteryEncounterOptionBuilder.withSceneMoneyRequirement()` --- .../encounters/shady-vitamin-dealer.ts | 4 ++-- .../mystery-encounters/mystery-encounter-option.ts | 12 ++++++++---- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/data/mystery-encounters/encounters/shady-vitamin-dealer.ts b/src/data/mystery-encounters/encounters/shady-vitamin-dealer.ts index 83d6da4a616..d58bc44daf7 100644 --- a/src/data/mystery-encounters/encounters/shady-vitamin-dealer.ts +++ b/src/data/mystery-encounters/encounters/shady-vitamin-dealer.ts @@ -43,7 +43,7 @@ export const ShadyVitaminDealerEncounter: MysteryEncounter = MysteryEncounterBui .withPrimaryPokemonStatusEffectRequirement([StatusEffect.NONE]) // Pokemon must not have status .withPrimaryPokemonHealthRatioRequirement([0.34, 1]) // Pokemon must have above 1/3rd HP .withOption(new MysteryEncounterOptionBuilder() - .withSceneRequirement(new MoneyRequirement(0, 2)) // Wave scaling multiplier of 2 for cost + .withSceneMoneyRequirement(0, 2) // Wave scaling multiplier of 2 for cost .withPreOptionPhase(async (scene: BattleScene): Promise => { const encounter = scene.currentBattle.mysteryEncounter; const onPokemonSelected = (pokemon: PlayerPokemon) => { @@ -116,7 +116,7 @@ export const ShadyVitaminDealerEncounter: MysteryEncounter = MysteryEncounterBui .build()) .withOption(new MysteryEncounterOptionBuilder() - .withSceneRequirement(new MoneyRequirement(0, 5)) // Wave scaling multiplier of 2 for cost + .withSceneMoneyRequirement(0, 5) // Wave scaling multiplier of 2 for cost .withOptionPhase(async (scene: BattleScene) => { // Choose Expensive Option const modifiers = []; diff --git a/src/data/mystery-encounters/mystery-encounter-option.ts b/src/data/mystery-encounters/mystery-encounter-option.ts index 5c42bfdd4ce..f1316ff64f1 100644 --- a/src/data/mystery-encounters/mystery-encounter-option.ts +++ b/src/data/mystery-encounters/mystery-encounter-option.ts @@ -1,8 +1,8 @@ -import { PlayerPokemon } from "#app/field/pokemon"; -import * as Utils from "../../utils"; -import BattleScene from "../../battle-scene"; -import { EncounterPokemonRequirement, EncounterSceneRequirement } from "./mystery-encounter-requirements"; import { OptionTextDisplay } from "#app/data/mystery-encounters/mystery-encounter-dialogue"; +import { PlayerPokemon } from "#app/field/pokemon"; +import BattleScene from "../../battle-scene"; +import * as Utils from "../../utils"; +import { EncounterPokemonRequirement, EncounterSceneRequirement, MoneyRequirement } from "./mystery-encounter-requirements"; export type OptionPhaseCallback = (scene: BattleScene) => Promise; @@ -133,6 +133,10 @@ export class MysteryEncounterOptionBuilder implements Partial> { return Object.assign(this, { onPreOptionPhase: onPreOptionPhase }); } From faca81e690512ede2913ccb89030f7f1862305d1 Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Wed, 10 Jul 2024 08:08:11 -0700 Subject: [PATCH 030/270] add default label + project to mystery_event.yml --- .github/ISSUE_TEMPLATE/mystery_event.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/ISSUE_TEMPLATE/mystery_event.yml b/.github/ISSUE_TEMPLATE/mystery_event.yml index df8fd7b7b78..a7f4f4be84c 100644 --- a/.github/ISSUE_TEMPLATE/mystery_event.yml +++ b/.github/ISSUE_TEMPLATE/mystery_event.yml @@ -1,6 +1,8 @@ name: Mystery Event description: Propose a new mystery event title: "[Event Proposal]: " +labels: ["event proposal"] +projects: ["AsdarDevelops/1"] body: - type: input id: name From a62811fb66d2afff1fea2dd7cd0469893886d2ff Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Wed, 10 Jul 2024 08:19:04 -0700 Subject: [PATCH 031/270] clean up mystery_event.yml --- .github/ISSUE_TEMPLATE/mystery_event.yml | 31 +++++++++++++++++------- 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/mystery_event.yml b/.github/ISSUE_TEMPLATE/mystery_event.yml index a7f4f4be84c..9ab2ba50573 100644 --- a/.github/ISSUE_TEMPLATE/mystery_event.yml +++ b/.github/ISSUE_TEMPLATE/mystery_event.yml @@ -9,7 +9,7 @@ body: attributes: label: Event Name description: Name of the event - placeholder: "Fight or Flight" + placeholder: e.g Fight or Flight - type: dropdown id: rarity attributes: @@ -18,7 +18,7 @@ body: options: - Common - Great - - Ultra + - Ultra - Rogue - Other or unsure (please specify) validations: @@ -27,20 +27,23 @@ body: id: waves attributes: label: Waves - placeholder: 1-200 (currently only 11-179 exist) + description: Classic/Challenge is 1 -209. Currently only 11-179 is supported. + palceholder: 1-200 validations: required: true - type: textarea id: description attributes: - label: What is it? - placeholder: Describe the event you are proposing + label: Description + description: Describe the event you are proposing + placeholder: What is it? validations: required: true - type: dropdown id: biomes attributes: label: Biomes + description: Select all biomes where the event can occur multiple: true options: - ANY (no need to select all) @@ -81,27 +84,37 @@ body: - LABORATORY - END - OTHER (please specify) - validations: required: true - type: textarea id: options attributes: label: Options offered to the player - placeholder: Remember that only four options can be displayed at a time + description: A maximum of four options can be displayed at a time + placeholder: Remember that only a maximum of up to four options can be displayed at a time validations: required: true - type: textarea id: design-notes attributes: label: Explanation/Notes on Design + description: Explain why you think this design is right and what this Event brings to the table placeholder: Explain why you think this design is right and what this Event brings to the table + value: | + - [ ] _OPTION-1 Label + - _OPTION-1 description._ + - [ ] _OPTION-2 Label + - _OPTION-2 description._ + - [ ] _OPTION-3 Label + - _OPTION-3 description._ + - [ ] _OPTION-4 Label + - _OPTION-4 description._ validations: required: true - type: textarea id: dev-notes attributes: - label: Notes to Devs - placeholder: (If any needed) + label: Notes to Developers + placeholder: If necessary validations: required: false From b194f55d57052df6afdde107be54d62cc81891be Mon Sep 17 00:00:00 2001 From: flx-sta <50131232+flx-sta@users.noreply.github.com> Date: Wed, 10 Jul 2024 08:26:34 -0700 Subject: [PATCH 032/270] mystery_event.yml: fix typo Co-authored-by: Asdar --- .github/ISSUE_TEMPLATE/mystery_event.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/mystery_event.yml b/.github/ISSUE_TEMPLATE/mystery_event.yml index 9ab2ba50573..e502f287acf 100644 --- a/.github/ISSUE_TEMPLATE/mystery_event.yml +++ b/.github/ISSUE_TEMPLATE/mystery_event.yml @@ -27,8 +27,8 @@ body: id: waves attributes: label: Waves - description: Classic/Challenge is 1 -209. Currently only 11-179 is supported. - palceholder: 1-200 + description: Classic/Challenge is 1 -200. Currently only 11-179 is supported. + placeholder: 1-200 validations: required: true - type: textarea From 2a76e9e1f40eca44c49b765317ac7fc3cebfdd71 Mon Sep 17 00:00:00 2001 From: flx-sta <50131232+flx-sta@users.noreply.github.com> Date: Wed, 10 Jul 2024 08:26:58 -0700 Subject: [PATCH 033/270] mystery_event.yml: fix options placeholder Co-authored-by: Asdar --- .github/ISSUE_TEMPLATE/mystery_event.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/mystery_event.yml b/.github/ISSUE_TEMPLATE/mystery_event.yml index e502f287acf..7718c8c2995 100644 --- a/.github/ISSUE_TEMPLATE/mystery_event.yml +++ b/.github/ISSUE_TEMPLATE/mystery_event.yml @@ -91,7 +91,7 @@ body: attributes: label: Options offered to the player description: A maximum of four options can be displayed at a time - placeholder: Remember that only a maximum of up to four options can be displayed at a time + placeholder: Remember that only up to four options can be displayed at a time validations: required: true - type: textarea From 94ccb911743f6938d9ba571dbfc0c32004550b9b Mon Sep 17 00:00:00 2001 From: flx-sta <50131232+flx-sta@users.noreply.github.com> Date: Wed, 10 Jul 2024 08:35:28 -0700 Subject: [PATCH 034/270] Update mystery_event.yml fix options value being inside options textarea --- .github/ISSUE_TEMPLATE/mystery_event.yml | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/mystery_event.yml b/.github/ISSUE_TEMPLATE/mystery_event.yml index 7718c8c2995..5bf88d74951 100644 --- a/.github/ISSUE_TEMPLATE/mystery_event.yml +++ b/.github/ISSUE_TEMPLATE/mystery_event.yml @@ -92,6 +92,15 @@ body: label: Options offered to the player description: A maximum of four options can be displayed at a time placeholder: Remember that only up to four options can be displayed at a time + value: | + - [ ] OPTION-1 Label + - _OPTION-1 description._ + - [ ] OPTION-2 Label + - _OPTION-2 description._ + - [ ] OPTION-3 Label + - _OPTION-3 description._ + - [ ] OPTION-4 Label + - _OPTION-4 description._ validations: required: true - type: textarea @@ -100,15 +109,6 @@ body: label: Explanation/Notes on Design description: Explain why you think this design is right and what this Event brings to the table placeholder: Explain why you think this design is right and what this Event brings to the table - value: | - - [ ] _OPTION-1 Label - - _OPTION-1 description._ - - [ ] _OPTION-2 Label - - _OPTION-2 description._ - - [ ] _OPTION-3 Label - - _OPTION-3 description._ - - [ ] _OPTION-4 Label - - _OPTION-4 description._ validations: required: true - type: textarea From 3842d9c8fa5be18a7f2c1c33d9edc8880fb759aa Mon Sep 17 00:00:00 2001 From: flx-sta <50131232+flx-sta@users.noreply.github.com> Date: Wed, 10 Jul 2024 09:29:10 -0700 Subject: [PATCH 035/270] Update mystery_event.yml See if separators work --- .github/ISSUE_TEMPLATE/mystery_event.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/ISSUE_TEMPLATE/mystery_event.yml b/.github/ISSUE_TEMPLATE/mystery_event.yml index 5bf88d74951..d091e9fb994 100644 --- a/.github/ISSUE_TEMPLATE/mystery_event.yml +++ b/.github/ISSUE_TEMPLATE/mystery_event.yml @@ -10,6 +10,10 @@ body: label: Event Name description: Name of the event placeholder: e.g Fight or Flight + - type: markdown + attributes: + value: | + --- - type: dropdown id: rarity attributes: From ca443708e0b7d17bc2a374a6e9de2070146be7e1 Mon Sep 17 00:00:00 2001 From: flx-sta <50131232+flx-sta@users.noreply.github.com> Date: Wed, 10 Jul 2024 09:30:57 -0700 Subject: [PATCH 036/270] Update mystery_event.yml add more separators --- .github/ISSUE_TEMPLATE/mystery_event.yml | 26 +++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/mystery_event.yml b/.github/ISSUE_TEMPLATE/mystery_event.yml index d091e9fb994..d751d8317e0 100644 --- a/.github/ISSUE_TEMPLATE/mystery_event.yml +++ b/.github/ISSUE_TEMPLATE/mystery_event.yml @@ -10,7 +10,7 @@ body: label: Event Name description: Name of the event placeholder: e.g Fight or Flight - - type: markdown + - type: markdown # SEPARATOR attributes: value: | --- @@ -27,6 +27,10 @@ body: - Other or unsure (please specify) validations: required: true + - type: markdown # SEPARATOR + attributes: + value: | + --- - type: input id: waves attributes: @@ -35,6 +39,10 @@ body: placeholder: 1-200 validations: required: true + - type: markdown # SEPARATOR + attributes: + value: | + --- - type: textarea id: description attributes: @@ -43,6 +51,10 @@ body: placeholder: What is it? validations: required: true + - type: markdown # SEPARATOR + attributes: + value: | + --- - type: dropdown id: biomes attributes: @@ -90,6 +102,10 @@ body: - OTHER (please specify) validations: required: true + - type: markdown # SEPARATOR + attributes: + value: | + --- - type: textarea id: options attributes: @@ -107,6 +123,10 @@ body: - _OPTION-4 description._ validations: required: true + - type: markdown # SEPARATOR + attributes: + value: | + --- - type: textarea id: design-notes attributes: @@ -115,6 +135,10 @@ body: placeholder: Explain why you think this design is right and what this Event brings to the table validations: required: true + - type: markdown # SEPARATOR + attributes: + value: | + --- - type: textarea id: dev-notes attributes: From 7bbebb32e29c72336078589a8423485a58fe0158 Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Wed, 10 Jul 2024 12:42:09 -0400 Subject: [PATCH 037/270] undo broken load changes --- src/battle-scene.ts | 6 +++--- .../mystery-encounters/mystery-encounter-data.ts | 2 +- .../mystery-encounter-dialogue.ts | 8 +------- .../mystery-encounters/mystery-encounter-utils.ts | 2 +- .../{encounters => }/mystery-encounters.ts | 14 ++++++-------- src/loading-scene.ts | 2 +- 6 files changed, 13 insertions(+), 21 deletions(-) rename src/data/mystery-encounters/{encounters => }/mystery-encounters.ts (88%) diff --git a/src/battle-scene.ts b/src/battle-scene.ts index c8ef8aef3b2..870862ec08c 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -92,9 +92,9 @@ import { Species } from "#enums/species"; import { UiTheme } from "#enums/ui-theme"; import { TimedEventManager } from "#app/timed-event-manager.js"; import i18next from "i18next"; -import MysteryEncounter, { MysteryEncounterTier, MysteryEncounterVariant } from "./data/mystery-encounter"; -import { mysteryEncountersByBiome, allMysteryEncounters, BASE_MYSTERY_ENCOUNTER_WEIGHT, AVERAGE_ENCOUNTERS_PER_RUN_TARGET, WIGHT_INCREMENT_ON_SPAWN_MISS } from "./data/mystery-encounters/mystery-encounters"; -import { MysteryEncounterFlags } from "#app/data/mystery-encounter-flags"; +import MysteryEncounter, { MysteryEncounterTier, MysteryEncounterVariant } from "./data/mystery-encounters/mystery-encounter"; +import { mysteryEncountersByBiome, allMysteryEncounters, BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT, AVERAGE_ENCOUNTERS_PER_RUN_TARGET, WIGHT_INCREMENT_ON_SPAWN_MISS } from "./data/mystery-encounters/mystery-encounters"; +import { MysteryEncounterData } from "#app/data/mystery-encounters/mystery-encounter-data"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; export const bypassLogin = import.meta.env.VITE_BYPASS_LOGIN === "1"; diff --git a/src/data/mystery-encounters/mystery-encounter-data.ts b/src/data/mystery-encounters/mystery-encounter-data.ts index ae58d5249b3..7162450bfc5 100644 --- a/src/data/mystery-encounters/mystery-encounter-data.ts +++ b/src/data/mystery-encounters/mystery-encounter-data.ts @@ -1,6 +1,6 @@ import { MysteryEncounterTier } from "#app/data/mystery-encounters/mystery-encounter"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; -import { BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT } from "#app/data/mystery-encounters/encounters/mystery-encounters"; +import { BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT } from "#app/data/mystery-encounters/mystery-encounters"; import { isNullOrUndefined } from "#app/utils"; export class MysteryEncounterData { diff --git a/src/data/mystery-encounters/mystery-encounter-dialogue.ts b/src/data/mystery-encounters/mystery-encounter-dialogue.ts index 0a5387639c7..1e2dfe85045 100644 --- a/src/data/mystery-encounters/mystery-encounter-dialogue.ts +++ b/src/data/mystery-encounters/mystery-encounter-dialogue.ts @@ -37,11 +37,6 @@ export default class MysteryEncounterDialogue { outro?: TextDisplay[]; } -export interface EncounterTypeDialogue { - [key: integer]: MysteryEncounterDialogue -} - - /** * Example MysteryEncounterDialogue object: * @@ -86,8 +81,7 @@ export interface EncounterTypeDialogue { * */ - -export const allMysteryEncounterDialogue: EncounterTypeDialogue = {}; +export const allMysteryEncounterDialogue: { [encounterType: number]: MysteryEncounterDialogue } = {}; export function initMysteryEncounterDialogue() { allMysteryEncounterDialogue[MysteryEncounterType.MYSTERIOUS_CHALLENGERS] = MysteriousChallengersDialogue; diff --git a/src/data/mystery-encounters/mystery-encounter-utils.ts b/src/data/mystery-encounters/mystery-encounter-utils.ts index 4b898478fa3..cb3d1400443 100644 --- a/src/data/mystery-encounters/mystery-encounter-utils.ts +++ b/src/data/mystery-encounters/mystery-encounter-utils.ts @@ -46,7 +46,7 @@ import { biomeLinks } from "#app/data/biomes"; import { Mode } from "#app/ui/ui"; import { PartyOption, PartyUiMode } from "#app/ui/party-ui-handler"; import { OptionSelectConfig, OptionSelectItem } from "#app/ui/abstact-option-select-ui-handler"; -import { WIGHT_INCREMENT_ON_SPAWN_MISS } from "#app/data/mystery-encounters/encounters/mystery-encounters"; +import { WIGHT_INCREMENT_ON_SPAWN_MISS } from "#app/data/mystery-encounters/mystery-encounters"; import { getTextWithColors, TextStyle } from "#app/ui/text"; import * as Overrides from "#app/overrides"; import { UiTheme } from "#enums/ui-theme"; diff --git a/src/data/mystery-encounters/encounters/mystery-encounters.ts b/src/data/mystery-encounters/mystery-encounters.ts similarity index 88% rename from src/data/mystery-encounters/encounters/mystery-encounters.ts rename to src/data/mystery-encounters/mystery-encounters.ts index b9966d3891a..e4a748d3a23 100644 --- a/src/data/mystery-encounters/encounters/mystery-encounters.ts +++ b/src/data/mystery-encounters/mystery-encounters.ts @@ -1,11 +1,11 @@ -import MysteryEncounter from "../mystery-encounter"; -import { DarkDealEncounter } from "./dark-deal"; -import { MysteriousChallengersEncounter } from "./mysterious-challengers"; -import { MysteriousChestEncounter } from "./mysterious-chest"; +import MysteryEncounter from "./mystery-encounter"; +import { DarkDealEncounter } from "./encounters/dark-deal"; +import { MysteriousChallengersEncounter } from "./encounters/mysterious-challengers"; +import { MysteriousChestEncounter } from "./encounters/mysterious-chest"; import { FightOrFlightEncounter } from "#app/data/mystery-encounters/encounters/fight-or-flight"; import { TrainingSessionEncounter } from "#app/data/mystery-encounters/encounters/training-session"; import { Biome } from "#enums/biome"; -import { SleepingSnorlaxEncounter } from "./sleeping-snorlax"; +import { SleepingSnorlaxEncounter } from "./encounters/sleeping-snorlax"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { DepartmentStoreSaleEncounter } from "#app/data/mystery-encounters/encounters/department-store-sale"; import { ShadyVitaminDealerEncounter } from "#app/data/mystery-encounters/encounters/shady-vitamin-dealer"; @@ -15,7 +15,7 @@ export const BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT = 1; export const WIGHT_INCREMENT_ON_SPAWN_MISS = 5; export const AVERAGE_ENCOUNTERS_PER_RUN_TARGET = 15; -export const allMysteryEncounters: { [encounterType: string]: MysteryEncounter } = {}; +export const allMysteryEncounters: { [encounterType: number]: MysteryEncounter } = {}; // Add MysteryEncounterType to biomes to enable it exclusively for those biomes // To enable an encounter in all biomes, do not add to this map @@ -86,8 +86,6 @@ export const mysteryEncountersByBiome = new Map([ [Biome.LABORATORY, []] ]); -// Only add your MysterEncounter here if you want it to be in every biome. -// We recommend designing biome-specific encounters for better flavor and variance export function initMysteryEncounters() { allMysteryEncounters[MysteryEncounterType.MYSTERIOUS_CHALLENGERS] = MysteriousChallengersEncounter; allMysteryEncounters[MysteryEncounterType.MYSTERIOUS_CHEST] = MysteriousChestEncounter; diff --git a/src/loading-scene.ts b/src/loading-scene.ts index 5407f7d9417..096986ebcc8 100644 --- a/src/loading-scene.ts +++ b/src/loading-scene.ts @@ -23,7 +23,7 @@ import { initVouchers } from "./system/voucher"; import { Biome } from "#enums/biome"; import { TrainerType } from "#enums/trainer-type"; import {initMysteryEncounterDialogue} from "#app/data/mystery-encounters/mystery-encounter-dialogue"; -import {initMysteryEncounters} from "#app/data/mystery-encounters/encounters/mystery-encounters"; +import {initMysteryEncounters} from "#app/data/mystery-encounters/mystery-encounters"; export class LoadingScene extends SceneBase { readonly LOAD_EVENTS = Phaser.Loader.Events; From 8907073b6e52aeb465bda8a9139ba1eb05e043d6 Mon Sep 17 00:00:00 2001 From: flx-sta <50131232+flx-sta@users.noreply.github.com> Date: Wed, 10 Jul 2024 09:34:23 -0700 Subject: [PATCH 038/270] Update mystery_event.yml - make event name required - change title to `[Event] ` (from ~~`[Event Proposal]: `~~) --- .github/ISSUE_TEMPLATE/mystery_event.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/mystery_event.yml b/.github/ISSUE_TEMPLATE/mystery_event.yml index d751d8317e0..5e3b6a585f7 100644 --- a/.github/ISSUE_TEMPLATE/mystery_event.yml +++ b/.github/ISSUE_TEMPLATE/mystery_event.yml @@ -1,6 +1,6 @@ name: Mystery Event description: Propose a new mystery event -title: "[Event Proposal]: " +title: "[Event] " labels: ["event proposal"] projects: ["AsdarDevelops/1"] body: @@ -10,6 +10,8 @@ body: label: Event Name description: Name of the event placeholder: e.g Fight or Flight + validations: + required: true - type: markdown # SEPARATOR attributes: value: | From ce55c13c12b800f81cb9b2b85724d917b9aa786d Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Wed, 10 Jul 2024 15:31:03 -0400 Subject: [PATCH 039/270] resolve conflicts, import issues, and cleanup from rebase --- src/battle-scene.ts | 3 +- src/battle.ts | 2 +- .../mystery-encounter-utils.ts | 29 +- src/form-change-phase.ts | 3 +- src/phases.ts | 305 ++++++++++++++---- src/phases/battle-phase.ts | 47 --- src/phases/mystery-encounter-phase.ts | 5 +- src/phases/select-modifier-phase.ts | 259 --------------- src/system/game-data.ts | 8 +- src/test/battle/battle.test.ts | 3 +- .../mystery-encounter-utils.test.ts | 34 +- .../mystery-encounter.test.ts | 22 +- src/test/phases/select-modifier-phase.test.ts | 24 +- src/test/ui/transfer-item.test.ts | 3 +- src/test/utils/phaseInterceptor.ts | 9 +- src/test/vitest.setup.ts | 6 +- src/ui/party-ui-handler.ts | 3 +- 17 files changed, 312 insertions(+), 453 deletions(-) delete mode 100644 src/phases/battle-phase.ts delete mode 100644 src/phases/select-modifier-phase.ts diff --git a/src/battle-scene.ts b/src/battle-scene.ts index 870862ec08c..a7bb5946601 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -240,7 +240,7 @@ export default class BattleScene extends SceneBase { public money: integer; public pokemonInfoContainer: PokemonInfoContainer; private party: PlayerPokemon[]; - public mysteryEncounterFlags: MysteryEncounterFlags = new MysteryEncounterFlags(null); + public mysteryEncounterData: MysteryEncounterData = new MysteryEncounterData(null); public lastMysteryEncounter: MysteryEncounter; /** Combined Biome and Wave count text */ private biomeWaveText: Phaser.GameObjects.Text; @@ -1222,7 +1222,6 @@ export default class BattleScene extends SceneBase { pokemon.resetBattleData(); applyPostBattleInitAbAttrs(PostBattleInitAbAttr, pokemon); } - } this.unshiftPhase(new ShowTrainerPhase(this)); } diff --git a/src/battle.ts b/src/battle.ts index e1a20c18ebf..30543933f49 100644 --- a/src/battle.ts +++ b/src/battle.ts @@ -14,7 +14,7 @@ import { PlayerGender } from "#enums/player-gender"; import { Species } from "#enums/species"; import { TrainerType } from "#enums/trainer-type"; import i18next from "#app/plugins/i18n"; -import MysteryEncounter, { MysteryEncounterVariant } from "./data/mystery-encounter"; +import MysteryEncounter, { MysteryEncounterVariant } from "./data/mystery-encounters/mystery-encounter"; export enum BattleType { WILD, diff --git a/src/data/mystery-encounters/mystery-encounter-utils.ts b/src/data/mystery-encounters/mystery-encounter-utils.ts index cb3d1400443..2d8d7bfbf66 100644 --- a/src/data/mystery-encounters/mystery-encounter-utils.ts +++ b/src/data/mystery-encounters/mystery-encounter-utils.ts @@ -7,35 +7,12 @@ import { Status, StatusEffect } from "../status-effect"; import { TrainerConfig, trainerConfigs, TrainerSlot } from "../trainer-config"; import Pokemon, { FieldPosition, PlayerPokemon } from "#app/field/pokemon"; import Trainer, { TrainerVariant } from "../../field/trainer"; -import { - ExpBalanceModifier, - ExpShareModifier, - MultipleParticipantExpBonusModifier, - PokemonExpBoosterModifier -} from "#app/modifier/modifier"; -import { - CustomModifierSettings, - getModifierPoolForType, - ModifierPoolType, - ModifierType, - ModifierTypeFunc, - ModifierTypeGenerator, - modifierTypes, - PokemonHeldItemModifierType, - regenerateModifierPoolThresholds -} from "#app/modifier/modifier-type"; -import { - BattleEndPhase, - EggLapsePhase, - ExpPhase, - ModifierRewardPhase, - ShowPartyExpBarPhase, - TrainerVictoryPhase -} from "#app/phases"; +import { ExpBalanceModifier, ExpShareModifier, MultipleParticipantExpBonusModifier, PokemonExpBoosterModifier } from "#app/modifier/modifier"; +import { CustomModifierSettings, getModifierPoolForType, ModifierPoolType, ModifierType, ModifierTypeFunc, ModifierTypeGenerator, modifierTypes, PokemonHeldItemModifierType, regenerateModifierPoolThresholds } from "#app/modifier/modifier-type"; +import { BattleEndPhase, EggLapsePhase, ExpPhase, ModifierRewardPhase, SelectModifierPhase, ShowPartyExpBarPhase, TrainerVictoryPhase } from "#app/phases"; import { MysteryEncounterBattlePhase, MysteryEncounterRewardsPhase } from "#app/phases/mystery-encounter-phase"; import * as Utils from "../../utils"; import { isNullOrUndefined } from "#app/utils"; -import { SelectModifierPhase } from "#app/phases/select-modifier-phase"; import { TrainerType } from "#enums/trainer-type"; import { Species } from "#enums/species"; import { Type } from "#app/data/type"; diff --git a/src/form-change-phase.ts b/src/form-change-phase.ts index 42d49dc0147..ebf91c635fd 100644 --- a/src/form-change-phase.ts +++ b/src/form-change-phase.ts @@ -8,9 +8,8 @@ import Pokemon, { EnemyPokemon, PlayerPokemon } from "./field/pokemon"; import { Mode } from "./ui/ui"; import PartyUiHandler from "./ui/party-ui-handler"; import { BattleSpec } from "#enums/battle-spec"; -import { MovePhase, PokemonHealPhase } from "./phases"; +import { BattlePhase, MovePhase, PokemonHealPhase } from "./phases"; import { getTypeRgb } from "./data/type"; -import { BattlePhase } from "#app/phases/battle-phase"; export class FormChangePhase extends EvolutionPhase { private formChange: SpeciesFormChange; diff --git a/src/phases.ts b/src/phases.ts index 015897afb50..878a3ef9d60 100644 --- a/src/phases.ts +++ b/src/phases.ts @@ -5,7 +5,7 @@ import { allMoves, applyMoveAttrs, BypassSleepAttr, ChargeAttr, applyFilteredMov import { Mode } from "./ui/ui"; import { Command } from "./ui/command-ui-handler"; import { Stat } from "./data/pokemon-stat"; -import { BerryModifier, ContactHeldItemTransferChanceModifier, EnemyAttackStatusEffectChanceModifier, EnemyPersistentModifier, EnemyStatusEffectHealChanceModifier, EnemyTurnHealModifier, ExpBalanceModifier, ExpBoosterModifier, ExpShareModifier, FlinchChanceModifier, HealingBoosterModifier, HitHealModifier, LapsingPersistentModifier, MapModifier, Modifier, MultipleParticipantExpBonusModifier, PersistentModifier, PokemonExpBoosterModifier, PokemonHeldItemModifier, PokemonInstantReviveModifier, SwitchEffectTransferModifier, TempBattleStatBoosterModifier, TurnHealModifier, TurnHeldItemTransferModifier, MoneyMultiplierModifier, MoneyInterestModifier, IvScannerModifier, LapsingPokemonHeldItemModifier, PokemonMultiHitModifier, PokemonMoveAccuracyBoosterModifier, overrideModifiers, overrideHeldItems, BypassSpeedChanceModifier, TurnStatusEffectModifier } from "./modifier/modifier"; +import { BerryModifier, ContactHeldItemTransferChanceModifier, EnemyAttackStatusEffectChanceModifier, EnemyPersistentModifier, EnemyStatusEffectHealChanceModifier, EnemyTurnHealModifier, ExpBalanceModifier, ExpBoosterModifier, ExpShareModifier, FlinchChanceModifier, HealingBoosterModifier, HitHealModifier, LapsingPersistentModifier, MapModifier, Modifier, MultipleParticipantExpBonusModifier, PersistentModifier, PokemonExpBoosterModifier, PokemonHeldItemModifier, PokemonInstantReviveModifier, SwitchEffectTransferModifier, TempBattleStatBoosterModifier, TurnHealModifier, TurnHeldItemTransferModifier, MoneyMultiplierModifier, MoneyInterestModifier, IvScannerModifier, LapsingPokemonHeldItemModifier, PokemonMultiHitModifier, PokemonMoveAccuracyBoosterModifier, overrideModifiers, overrideHeldItems, BypassSpeedChanceModifier, TurnStatusEffectModifier, ExtraModifierModifier } from "./modifier/modifier"; import PartyUiHandler, { PartyOption, PartyUiMode } from "./ui/party-ui-handler"; import { doPokeballBounceAnim, getPokeballAtlasKey, getPokeballCatchMultiplier, getPokeballTintColor, PokeballType } from "./data/pokeball"; import { CommonAnim, CommonBattleAnim, MoveAnim, initMoveAnim, loadMoveAnimAssets } from "./data/battle-anims"; @@ -17,7 +17,7 @@ import { Phase } from "./phase"; import { BattleStat, getBattleStatLevelChangeDescription, getBattleStatName } from "./data/battle-stat"; import { biomeLinks, getBiomeName } from "./data/biomes"; import { ModifierTier } from "./modifier/modifier-tier"; -import { ModifierPoolType, ModifierType, ModifierTypeFunc, getDailyRunStarterModifiers, getEnemyBuffModifierForWave, getModifierType, modifierTypes, regenerateModifierPoolThresholds } from "./modifier/modifier-type"; +import { ModifierPoolType, ModifierType, ModifierTypeFunc, getDailyRunStarterModifiers, getEnemyBuffModifierForWave, getModifierType, modifierTypes, regenerateModifierPoolThresholds, CustomModifierSettings, ModifierTypeOption, getPlayerShopModifierTypeOptionsForWave, PokemonModifierType, FusePokemonModifierType, PokemonMoveModifierType, TmModifierType, RememberMoveModifierType, PokemonPpRestoreModifierType, PokemonPpUpModifierType, getPlayerModifierTypeOptions } from "./modifier/modifier-type"; import SoundFade from "phaser3-rex-plugins/plugins/soundfade"; import { BattlerTagLapseType, CenterOfAttentionTag, EncoreTag, ProtectedTag, SemiInvulnerableTag, TrappedTag, MysteryEncounterPostSummonTag } from "./data/battler-tags"; import { getPokemonMessage, getPokemonNameWithAffix } from "./messages"; @@ -64,11 +64,11 @@ import { Moves } from "#enums/moves"; import { PlayerGender } from "#enums/player-gender"; import { Species } from "#enums/species"; import { TrainerType } from "#enums/trainer-type"; -import { BattlePhase } from "#app/phases/battle-phase"; import { MysteryEncounterVariant } from "#app/data/mystery-encounters/mystery-encounter"; import { MysteryEncounterPhase } from "#app/phases/mystery-encounter-phase"; import { getEncounterText, handleMysteryEncounterVictory } from "#app/data/mystery-encounters/mystery-encounter-utils"; -import { SelectModifierPhase } from "#app/phases/select-modifier-phase"; +import ModifierSelectUiHandler, { SHOP_OPTIONS_ROW_LIMIT } from "#app/ui/modifier-select-ui-handler"; +import { isNullOrUndefined } from "./utils"; const { t } = i18next; @@ -671,6 +671,17 @@ export class BattlePhase extends Phase { duration: 750 }); } + + hideEnemyTrainer(): void { + this.scene.tweens.add({ + targets: this.scene.currentBattle.trainer, + x: "+=16", + y: "-=16", + alpha: 0, + ease: "Sine.easeInOut", + duration: 750 + }); + } } type PokemonFunc = (pokemon: Pokemon) => void; @@ -1660,57 +1671,6 @@ export class SummonPhase extends PartyMemberPokemonPhase { }); } - summonWild(): void { - const pokemon = this.getPokemon(); - - if (this.fieldIndex === 1) { - pokemon.setFieldPosition(FieldPosition.RIGHT, 0); - } else { - const availablePartyMembers = this.getParty().filter(p => !p.isFainted()).length; - pokemon.setFieldPosition(!this.scene.currentBattle.double || availablePartyMembers === 1 ? FieldPosition.CENTER : FieldPosition.LEFT); - } - - this.scene.add.existing(pokemon); - this.scene.field.add(pokemon); - if (!this.player) { - const playerPokemon = this.scene.getPlayerPokemon() as Pokemon; - if (playerPokemon?.visible) { - this.scene.field.moveBelow(pokemon, playerPokemon); - } - this.scene.currentBattle.seenEnemyPartyMemberIds.add(pokemon.id); - } - this.scene.updateModifiers(this.player); - this.scene.updateFieldScale(); - pokemon.showInfo(); - pokemon.playAnim(); - pokemon.setVisible(true); - pokemon.getSprite().setVisible(true); - pokemon.setScale(0.75); - pokemon.tint(getPokeballTintColor(pokemon.pokeball)); - pokemon.untint(250, "Sine.easeIn"); - this.scene.updateFieldScale(); - pokemon.x += 16; - pokemon.y -= 16; - pokemon.alpha = 0; - - // Ease pokemon in - this.scene.tweens.add({ - targets: pokemon, - x: "-=16", - y: "+=16", - alpha: 1, - duration: 1000, - ease: "Sine.easeIn", - scale: pokemon.getSpriteScale(), - onComplete: () => { - pokemon.cry(pokemon.getHpRatio() > 0.25 ? undefined : { rate: 0.85 }); - pokemon.getSprite().clearTint(); - pokemon.resetSummonData(); - this.scene.time.delayedCall(1000, () => this.end()); - } - }); - } - onEnd(): void { const pokemon = this.getPokemon(); @@ -5296,6 +5256,241 @@ export class AttemptRunPhase extends PokemonPhase { } } +export class SelectModifierPhase extends BattlePhase { + private rerollCount: integer; + private modifierTiers: ModifierTier[]; + private customModifierSettings: CustomModifierSettings; + + constructor(scene: BattleScene, rerollCount: integer = 0, modifierTiers?: ModifierTier[], customModifierSettings?: CustomModifierSettings) { + super(scene); + + this.rerollCount = rerollCount; + this.modifierTiers = modifierTiers; + this.customModifierSettings = customModifierSettings; + } + + start() { + super.start(); + + if (!this.rerollCount) { + this.updateSeed(); + } else { + this.scene.reroll = false; + } + + const party = this.scene.getParty(); + regenerateModifierPoolThresholds(party, this.getPoolType(), this.rerollCount); + const modifierCount = new Utils.IntegerHolder(3); + if (this.isPlayer()) { + this.scene.applyModifiers(ExtraModifierModifier, true, modifierCount); + } + + // If custom modifiers are specified, overrides default item count + if (!!this.customModifierSettings) { + const newItemCount = (this.customModifierSettings.guaranteedModifierTiers?.length || 0) + + (this.customModifierSettings.guaranteedModifierTypeOptions?.length || 0) + + (this.customModifierSettings.guaranteedModifierTypeFuncs?.length || 0); + if (this.customModifierSettings.fillRemaining) { + const originalCount = modifierCount.value; + modifierCount.value = originalCount > newItemCount ? originalCount : newItemCount; + } else { + modifierCount.value = newItemCount; + } + } + + const typeOptions: ModifierTypeOption[] = this.getModifierTypeOptions(modifierCount.value); + + const modifierSelectCallback = (rowCursor: integer, cursor: integer) => { + if (rowCursor < 0 || cursor < 0) { + this.scene.ui.showText(i18next.t("battle:skipItemQuestion"), null, () => { + this.scene.ui.setOverlayMode(Mode.CONFIRM, () => { + this.scene.ui.revertMode(); + this.scene.ui.setMode(Mode.MESSAGE); + super.end(); + }, () => this.scene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer(), typeOptions, modifierSelectCallback, this.getRerollCost(typeOptions, this.scene.lockModifierTiers))); + }); + return false; + } + let modifierType: ModifierType; + let cost: integer; + switch (rowCursor) { + case 0: + switch (cursor) { + case 0: + const rerollCost = this.getRerollCost(typeOptions, this.scene.lockModifierTiers); + if (rerollCost === 0 || this.scene.money < rerollCost) { + this.scene.ui.playError(); + return false; + } else { + this.scene.reroll = true; + this.scene.unshiftPhase(new SelectModifierPhase(this.scene, this.rerollCount + 1, typeOptions.map(o => o.type.tier))); + this.scene.ui.clearText(); + this.scene.ui.setMode(Mode.MESSAGE).then(() => super.end()); + this.scene.money -= rerollCost; + this.scene.updateMoneyText(); + this.scene.animateMoneyChanged(false); + this.scene.playSound("buy"); + } + break; + case 1: + this.scene.ui.setModeWithoutClear(Mode.PARTY, PartyUiMode.MODIFIER_TRANSFER, -1, (fromSlotIndex: integer, itemIndex: integer, itemQuantity: integer, toSlotIndex: integer) => { + if (toSlotIndex !== undefined && fromSlotIndex < 6 && toSlotIndex < 6 && fromSlotIndex !== toSlotIndex && itemIndex > -1) { + const itemModifiers = this.scene.findModifiers(m => m instanceof PokemonHeldItemModifier + && (m as PokemonHeldItemModifier).getTransferrable(true) && (m as PokemonHeldItemModifier).pokemonId === party[fromSlotIndex].id) as PokemonHeldItemModifier[]; + const itemModifier = itemModifiers[itemIndex]; + this.scene.tryTransferHeldItemModifier(itemModifier, party[toSlotIndex], true, itemQuantity); + } else { + this.scene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer(), typeOptions, modifierSelectCallback, this.getRerollCost(typeOptions, this.scene.lockModifierTiers)); + } + }, PartyUiHandler.FilterItemMaxStacks); + break; + case 2: + this.scene.ui.setModeWithoutClear(Mode.PARTY, PartyUiMode.CHECK, -1, () => { + this.scene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer(), typeOptions, modifierSelectCallback, this.getRerollCost(typeOptions, this.scene.lockModifierTiers)); + }); + break; + case 3: + this.scene.lockModifierTiers = !this.scene.lockModifierTiers; + const uiHandler = this.scene.ui.getHandler() as ModifierSelectUiHandler; + uiHandler.setRerollCost(this.getRerollCost(typeOptions, this.scene.lockModifierTiers)); + uiHandler.updateLockRaritiesText(); + uiHandler.updateRerollCostText(); + return false; + } + return true; + case 1: + if (typeOptions.length === 0) { + this.scene.ui.revertMode(); + this.scene.ui.setMode(Mode.MESSAGE); + super.end(); + } + modifierType = typeOptions[cursor].type; + break; + default: + const shopOptions = getPlayerShopModifierTypeOptionsForWave(this.scene.currentBattle.waveIndex, this.scene.getWaveMoneyAmount(1)); + const shopOption = shopOptions[rowCursor > 2 || shopOptions.length <= SHOP_OPTIONS_ROW_LIMIT ? cursor : cursor + SHOP_OPTIONS_ROW_LIMIT]; + modifierType = shopOption.type; + cost = shopOption.cost; + break; + } + + if (cost && this.scene.money < cost) { + this.scene.ui.playError(); + return false; + } + + const applyModifier = (modifier: Modifier, playSound: boolean = false) => { + const result = this.scene.addModifier(modifier, false, playSound); + if (cost) { + result.then(success => { + if (success) { + this.scene.money -= cost; + this.scene.updateMoneyText(); + this.scene.animateMoneyChanged(false); + this.scene.playSound("buy"); + (this.scene.ui.getHandler() as ModifierSelectUiHandler).updateCostText(); + } else { + this.scene.ui.playError(); + } + }); + } else { + const doEnd = () => { + this.scene.ui.clearText(); + this.scene.ui.setMode(Mode.MESSAGE); + super.end(); + }; + if (result instanceof Promise) { + result.then(() => doEnd()); + } else { + doEnd(); + } + } + }; + + if (modifierType instanceof PokemonModifierType) { + if (modifierType instanceof FusePokemonModifierType) { + this.scene.ui.setModeWithoutClear(Mode.PARTY, PartyUiMode.SPLICE, -1, (fromSlotIndex: integer, spliceSlotIndex: integer) => { + if (spliceSlotIndex !== undefined && fromSlotIndex < 6 && spliceSlotIndex < 6 && fromSlotIndex !== spliceSlotIndex) { + this.scene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer()).then(() => { + const modifier = modifierType.newModifier(party[fromSlotIndex], party[spliceSlotIndex]); + applyModifier(modifier, true); + }); + } else { + this.scene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer(), typeOptions, modifierSelectCallback, this.getRerollCost(typeOptions, this.scene.lockModifierTiers)); + } + }, modifierType.selectFilter); + } else { + const pokemonModifierType = modifierType as PokemonModifierType; + const isMoveModifier = modifierType instanceof PokemonMoveModifierType; + const isTmModifier = modifierType instanceof TmModifierType; + const isRememberMoveModifier = modifierType instanceof RememberMoveModifierType; + const isPpRestoreModifier = (modifierType instanceof PokemonPpRestoreModifierType || modifierType instanceof PokemonPpUpModifierType); + const partyUiMode = isMoveModifier ? PartyUiMode.MOVE_MODIFIER + : isTmModifier ? PartyUiMode.TM_MODIFIER + : isRememberMoveModifier ? PartyUiMode.REMEMBER_MOVE_MODIFIER + : PartyUiMode.MODIFIER; + const tmMoveId = isTmModifier + ? (modifierType as TmModifierType).moveId + : undefined; + this.scene.ui.setModeWithoutClear(Mode.PARTY, partyUiMode, -1, (slotIndex: integer, option: PartyOption) => { + if (slotIndex < 6) { + this.scene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer()).then(() => { + const modifier = !isMoveModifier + ? !isRememberMoveModifier + ? modifierType.newModifier(party[slotIndex]) + : modifierType.newModifier(party[slotIndex], option as integer) + : modifierType.newModifier(party[slotIndex], option - PartyOption.MOVE_1); + applyModifier(modifier, true); + }); + } else { + this.scene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer(), typeOptions, modifierSelectCallback, this.getRerollCost(typeOptions, this.scene.lockModifierTiers)); + } + }, pokemonModifierType.selectFilter, modifierType instanceof PokemonMoveModifierType ? (modifierType as PokemonMoveModifierType).moveSelectFilter : undefined, tmMoveId, isPpRestoreModifier); + } + } else { + applyModifier(modifierType.newModifier()); + } + + return !cost; + }; + this.scene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer(), typeOptions, modifierSelectCallback, this.getRerollCost(typeOptions, this.scene.lockModifierTiers)); + } + + updateSeed(): void { + this.scene.resetSeed(); + } + + isPlayer(): boolean { + return true; + } + + getRerollCost(typeOptions: ModifierTypeOption[], lockRarities: boolean): integer { + let baseValue = 0; + if (lockRarities) { + const tierValues = [50, 125, 300, 750, 2000]; + for (const opt of typeOptions) { + baseValue += tierValues[opt.type.tier]; + } + } else { + baseValue = 250; + } + const multiplier = !isNullOrUndefined(this.customModifierSettings?.rerollMultiplier) ? this.customModifierSettings.rerollMultiplier : 1; + return Math.min(Math.ceil(this.scene.currentBattle.waveIndex / 10) * baseValue * Math.pow(2, this.rerollCount) * multiplier, Number.MAX_SAFE_INTEGER); + } + + getPoolType(): ModifierPoolType { + return ModifierPoolType.PLAYER; + } + + getModifierTypeOptions(modifierCount: integer): ModifierTypeOption[] { + return getPlayerModifierTypeOptions(modifierCount, this.scene.getParty(), this.scene.lockModifierTiers ? this.modifierTiers : undefined, this.customModifierSettings); + } + + addModifier(modifier: Modifier): Promise { + return this.scene.addModifier(modifier, false, true); + } +} + export class EggLapsePhase extends Phase { constructor(scene: BattleScene) { super(scene); diff --git a/src/phases/battle-phase.ts b/src/phases/battle-phase.ts deleted file mode 100644 index 110ecb615e8..00000000000 --- a/src/phases/battle-phase.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { Phase } from "#app/phase"; -import BattleScene from "#app/battle-scene"; -import { TrainerSlot } from "#app/data/trainer-config"; - -export class BattlePhase extends Phase { - constructor(scene: BattleScene) { - super(scene); - } - - showEnemyTrainer(trainerSlot: TrainerSlot = TrainerSlot.NONE): void { - const sprites = this.scene.currentBattle.trainer.getSprites(); - const tintSprites = this.scene.currentBattle.trainer.getTintSprites(); - for (let i = 0; i < sprites.length; i++) { - const visible = !trainerSlot || !i === (trainerSlot === TrainerSlot.TRAINER) || sprites.length < 2; - [sprites[i], tintSprites[i]].map(sprite => { - if (visible) { - sprite.x = trainerSlot || sprites.length < 2 ? 0 : i ? 16 : -16; - } - sprite.setVisible(visible); - sprite.clearTint(); - }); - sprites[i].setVisible(visible); - tintSprites[i].setVisible(visible); - sprites[i].clearTint(); - tintSprites[i].clearTint(); - } - this.scene.tweens.add({ - targets: this.scene.currentBattle.trainer, - x: "-=16", - y: "+=16", - alpha: 1, - ease: "Sine.easeInOut", - duration: 750 - }); - } - - hideEnemyTrainer(): void { - this.scene.tweens.add({ - targets: this.scene.currentBattle.trainer, - x: "+=16", - y: "-=16", - alpha: 0, - ease: "Sine.easeInOut", - duration: 750 - }); - } -} diff --git a/src/phases/mystery-encounter-phase.ts b/src/phases/mystery-encounter-phase.ts index 6af4c42ed4d..d84a5eb6b2f 100644 --- a/src/phases/mystery-encounter-phase.ts +++ b/src/phases/mystery-encounter-phase.ts @@ -5,16 +5,15 @@ import { Mode } from "../ui/ui"; import { getEncounterText } from "../data/mystery-encounters/mystery-encounter-utils"; -import { CheckSwitchPhase, NewBattlePhase, PostSummonPhase, ReturnPhase, ScanIvsPhase, SummonPhase, ToggleDoublePositionPhase } from "../phases"; +import { CheckSwitchPhase, NewBattlePhase, PostSummonPhase, ReturnPhase, ScanIvsPhase, SelectModifierPhase, SummonPhase, ToggleDoublePositionPhase } from "../phases"; import MysteryEncounterOption from "../data/mystery-encounters/mystery-encounter-option"; import { MysteryEncounterVariant } from "../data/mystery-encounters/mystery-encounter"; import { getCharVariantFromDialogue } from "../data/dialogue"; import { TrainerSlot } from "../data/trainer-config"; -import { BattleSpec } from "../enums/battle-spec"; +import { BattleSpec } from "#enums/battle-spec"; import { Tutorial, handleTutorial } from "../tutorial"; import { IvScannerModifier } from "../modifier/modifier"; import * as Utils from "../utils"; -import { SelectModifierPhase } from "#app/phases/select-modifier-phase"; import { isNullOrUndefined } from "../utils"; /** diff --git a/src/phases/select-modifier-phase.ts b/src/phases/select-modifier-phase.ts deleted file mode 100644 index 0e17d9562fb..00000000000 --- a/src/phases/select-modifier-phase.ts +++ /dev/null @@ -1,259 +0,0 @@ -import { ModifierTier } from "#app/modifier/modifier-tier"; -import { - CustomModifierSettings, - FusePokemonModifierType, getPlayerModifierTypeOptions, - getPlayerShopModifierTypeOptionsForWave, ModifierPoolType, - ModifierType, - ModifierTypeOption, - PokemonModifierType, - PokemonMoveModifierType, - PokemonPpRestoreModifierType, - PokemonPpUpModifierType, - regenerateModifierPoolThresholds, - RememberMoveModifierType, - TmModifierType -} from "#app/modifier/modifier-type"; -import BattleScene from "#app/battle-scene"; -import * as Utils from "#app/utils"; -import { ExtraModifierModifier, Modifier, PokemonHeldItemModifier } from "#app/modifier/modifier"; -import i18next from "#app/plugins/i18n"; -import { Mode } from "#app/ui/ui"; -import PartyUiHandler, { PartyOption, PartyUiMode } from "#app/ui/party-ui-handler"; -import ModifierSelectUiHandler, { SHOP_OPTIONS_ROW_LIMIT } from "#app/ui/modifier-select-ui-handler"; -import { BattlePhase } from "#app/phases/battle-phase"; -import { isNullOrUndefined } from "#app/utils"; - -export class SelectModifierPhase extends BattlePhase { - private rerollCount: integer; - private modifierTiers: ModifierTier[]; - private customModifierSettings: CustomModifierSettings; - - constructor(scene: BattleScene, rerollCount: integer = 0, modifierTiers?: ModifierTier[], customModifierSettings?: CustomModifierSettings) { - super(scene); - - this.rerollCount = rerollCount; - this.modifierTiers = modifierTiers; - this.customModifierSettings = customModifierSettings; - } - - start() { - super.start(); - - if (!this.rerollCount) { - this.updateSeed(); - } else { - this.scene.reroll = false; - } - - const party = this.scene.getParty(); - regenerateModifierPoolThresholds(party, this.getPoolType(), this.rerollCount); - const modifierCount = new Utils.IntegerHolder(3); - if (this.isPlayer()) { - this.scene.applyModifiers(ExtraModifierModifier, true, modifierCount); - } - - // If custom modifiers are specified, overrides default item count - if (!!this.customModifierSettings) { - const newItemCount = (this.customModifierSettings.guaranteedModifierTiers?.length || 0) + - (this.customModifierSettings.guaranteedModifierTypeOptions?.length || 0) + - (this.customModifierSettings.guaranteedModifierTypeFuncs?.length || 0); - if (this.customModifierSettings.fillRemaining) { - const originalCount = modifierCount.value; - modifierCount.value = originalCount > newItemCount ? originalCount : newItemCount; - } else { - modifierCount.value = newItemCount; - } - } - - const typeOptions: ModifierTypeOption[] = this.getModifierTypeOptions(modifierCount.value); - - const modifierSelectCallback = (rowCursor: integer, cursor: integer) => { - if (rowCursor < 0 || cursor < 0) { - this.scene.ui.showText(i18next.t("battle:skipItemQuestion"), null, () => { - this.scene.ui.setOverlayMode(Mode.CONFIRM, () => { - this.scene.ui.revertMode(); - this.scene.ui.setMode(Mode.MESSAGE); - super.end(); - }, () => this.scene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer(), typeOptions, modifierSelectCallback, this.getRerollCost(typeOptions, this.scene.lockModifierTiers))); - }); - return false; - } - let modifierType: ModifierType; - let cost: integer; - switch (rowCursor) { - case 0: - switch (cursor) { - case 0: - const rerollCost = this.getRerollCost(typeOptions, this.scene.lockModifierTiers); - if (rerollCost === 0 || this.scene.money < rerollCost) { - this.scene.ui.playError(); - return false; - } else { - this.scene.reroll = true; - this.scene.unshiftPhase(new SelectModifierPhase(this.scene, this.rerollCount + 1, typeOptions.map(o => o.type.tier))); - this.scene.ui.clearText(); - this.scene.ui.setMode(Mode.MESSAGE).then(() => super.end()); - this.scene.money -= rerollCost; - this.scene.updateMoneyText(); - this.scene.animateMoneyChanged(false); - this.scene.playSound("buy"); - } - break; - case 1: - this.scene.ui.setModeWithoutClear(Mode.PARTY, PartyUiMode.MODIFIER_TRANSFER, -1, (fromSlotIndex: integer, itemIndex: integer, itemQuantity: integer, toSlotIndex: integer) => { - if (toSlotIndex !== undefined && fromSlotIndex < 6 && toSlotIndex < 6 && fromSlotIndex !== toSlotIndex && itemIndex > -1) { - const itemModifiers = this.scene.findModifiers(m => m instanceof PokemonHeldItemModifier - && (m as PokemonHeldItemModifier).getTransferrable(true) && (m as PokemonHeldItemModifier).pokemonId === party[fromSlotIndex].id) as PokemonHeldItemModifier[]; - const itemModifier = itemModifiers[itemIndex]; - this.scene.tryTransferHeldItemModifier(itemModifier, party[toSlotIndex], true, itemQuantity); - } else { - this.scene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer(), typeOptions, modifierSelectCallback, this.getRerollCost(typeOptions, this.scene.lockModifierTiers)); - } - }, PartyUiHandler.FilterItemMaxStacks); - break; - case 2: - this.scene.ui.setModeWithoutClear(Mode.PARTY, PartyUiMode.CHECK, -1, () => { - this.scene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer(), typeOptions, modifierSelectCallback, this.getRerollCost(typeOptions, this.scene.lockModifierTiers)); - }); - break; - case 3: - this.scene.lockModifierTiers = !this.scene.lockModifierTiers; - const uiHandler = this.scene.ui.getHandler() as ModifierSelectUiHandler; - uiHandler.setRerollCost(this.getRerollCost(typeOptions, this.scene.lockModifierTiers)); - uiHandler.updateLockRaritiesText(); - uiHandler.updateRerollCostText(); - return false; - } - return true; - case 1: - if (typeOptions.length === 0) { - this.scene.ui.revertMode(); - this.scene.ui.setMode(Mode.MESSAGE); - super.end(); - } - modifierType = typeOptions[cursor].type; - break; - default: - const shopOptions = getPlayerShopModifierTypeOptionsForWave(this.scene.currentBattle.waveIndex, this.scene.getWaveMoneyAmount(1)); - const shopOption = shopOptions[rowCursor > 2 || shopOptions.length <= SHOP_OPTIONS_ROW_LIMIT ? cursor : cursor + SHOP_OPTIONS_ROW_LIMIT]; - modifierType = shopOption.type; - cost = shopOption.cost; - break; - } - - if (cost && this.scene.money < cost) { - this.scene.ui.playError(); - return false; - } - - const applyModifier = (modifier: Modifier, playSound: boolean = false) => { - const result = this.scene.addModifier(modifier, false, playSound); - if (cost) { - result.then(success => { - if (success) { - this.scene.money -= cost; - this.scene.updateMoneyText(); - this.scene.animateMoneyChanged(false); - this.scene.playSound("buy"); - (this.scene.ui.getHandler() as ModifierSelectUiHandler).updateCostText(); - } else { - this.scene.ui.playError(); - } - }); - } else { - const doEnd = () => { - this.scene.ui.clearText(); - this.scene.ui.setMode(Mode.MESSAGE); - super.end(); - }; - if (result instanceof Promise) { - result.then(() => doEnd()); - } else { - doEnd(); - } - } - }; - - if (modifierType instanceof PokemonModifierType) { - if (modifierType instanceof FusePokemonModifierType) { - this.scene.ui.setModeWithoutClear(Mode.PARTY, PartyUiMode.SPLICE, -1, (fromSlotIndex: integer, spliceSlotIndex: integer) => { - if (spliceSlotIndex !== undefined && fromSlotIndex < 6 && spliceSlotIndex < 6 && fromSlotIndex !== spliceSlotIndex) { - this.scene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer()).then(() => { - const modifier = modifierType.newModifier(party[fromSlotIndex], party[spliceSlotIndex]); - applyModifier(modifier, true); - }); - } else { - this.scene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer(), typeOptions, modifierSelectCallback, this.getRerollCost(typeOptions, this.scene.lockModifierTiers)); - } - }, modifierType.selectFilter); - } else { - const pokemonModifierType = modifierType as PokemonModifierType; - const isMoveModifier = modifierType instanceof PokemonMoveModifierType; - const isTmModifier = modifierType instanceof TmModifierType; - const isRememberMoveModifier = modifierType instanceof RememberMoveModifierType; - const isPpRestoreModifier = (modifierType instanceof PokemonPpRestoreModifierType || modifierType instanceof PokemonPpUpModifierType); - const partyUiMode = isMoveModifier ? PartyUiMode.MOVE_MODIFIER - : isTmModifier ? PartyUiMode.TM_MODIFIER - : isRememberMoveModifier ? PartyUiMode.REMEMBER_MOVE_MODIFIER - : PartyUiMode.MODIFIER; - const tmMoveId = isTmModifier - ? (modifierType as TmModifierType).moveId - : undefined; - this.scene.ui.setModeWithoutClear(Mode.PARTY, partyUiMode, -1, (slotIndex: integer, option: PartyOption) => { - if (slotIndex < 6) { - this.scene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer()).then(() => { - const modifier = !isMoveModifier - ? !isRememberMoveModifier - ? modifierType.newModifier(party[slotIndex]) - : modifierType.newModifier(party[slotIndex], option as integer) - : modifierType.newModifier(party[slotIndex], option - PartyOption.MOVE_1); - applyModifier(modifier, true); - }); - } else { - this.scene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer(), typeOptions, modifierSelectCallback, this.getRerollCost(typeOptions, this.scene.lockModifierTiers)); - } - }, pokemonModifierType.selectFilter, modifierType instanceof PokemonMoveModifierType ? (modifierType as PokemonMoveModifierType).moveSelectFilter : undefined, tmMoveId, isPpRestoreModifier); - } - } else { - applyModifier(modifierType.newModifier()); - } - - return !cost; - }; - this.scene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer(), typeOptions, modifierSelectCallback, this.getRerollCost(typeOptions, this.scene.lockModifierTiers)); - } - - updateSeed(): void { - this.scene.resetSeed(); - } - - isPlayer(): boolean { - return true; - } - - getRerollCost(typeOptions: ModifierTypeOption[], lockRarities: boolean): integer { - let baseValue = 0; - if (lockRarities) { - const tierValues = [50, 125, 300, 750, 2000]; - for (const opt of typeOptions) { - baseValue += tierValues[opt.type.tier]; - } - } else { - baseValue = 250; - } - const multiplier = !isNullOrUndefined(this.customModifierSettings?.rerollMultiplier) ? this.customModifierSettings.rerollMultiplier : 1; - return Math.min(Math.ceil(this.scene.currentBattle.waveIndex / 10) * baseValue * Math.pow(2, this.rerollCount) * multiplier, Number.MAX_SAFE_INTEGER); - } - - getPoolType(): ModifierPoolType { - return ModifierPoolType.PLAYER; - } - - getModifierTypeOptions(modifierCount: integer): ModifierTypeOption[] { - return getPlayerModifierTypeOptions(modifierCount, this.scene.getParty(), this.scene.lockModifierTiers ? this.modifierTiers : undefined, this.customModifierSettings); - } - - addModifier(modifier: Modifier): Promise { - return this.scene.addModifier(modifier, false, true); - } -} diff --git a/src/system/game-data.ts b/src/system/game-data.ts index 6c578ac4160..871e2458bbd 100644 --- a/src/system/game-data.ts +++ b/src/system/game-data.ts @@ -125,7 +125,7 @@ export interface SessionSaveData { timestamp: integer; challenges: ChallengeData[]; mysteryEncounter: MysteryEncounter; - mysteryEncounterFlags: MysteryEncounterData; + mysteryEncounterData: MysteryEncounterData; } interface Unlocks { @@ -842,7 +842,7 @@ export class GameData { timestamp: new Date().getTime(), challenges: scene.gameMode.challenges.map(c => new ChallengeData(c)), mysteryEncounter: scene.currentBattle.mysteryEncounter, - mysteryEncounterFlags: scene.mysteryEncounterData + mysteryEncounterData: scene.mysteryEncounterData } as SessionSaveData; } @@ -933,7 +933,7 @@ export class GameData { scene.score = sessionData.score; scene.updateScoreText(); - scene.mysteryEncounterData = sessionData?.mysteryEncounterFlags ? sessionData?.mysteryEncounterFlags : new MysteryEncounterData(null); + scene.mysteryEncounterData = sessionData?.mysteryEncounterData ? sessionData?.mysteryEncounterData : new MysteryEncounterData(null); scene.newArena(sessionData.arena.biome); @@ -1158,7 +1158,7 @@ export class GameData { return new MysteryEncounter(v); } - if (k === "mysteryEncounterFlags") { + if (k === "mysteryEncounterData") { return new MysteryEncounterData(v); } diff --git a/src/test/battle/battle.test.ts b/src/test/battle/battle.test.ts index fb498fe2b1d..8eb9b9b87d9 100644 --- a/src/test/battle/battle.test.ts +++ b/src/test/battle/battle.test.ts @@ -9,7 +9,7 @@ import { EncounterPhase, EnemyCommandPhase, LoginPhase, - SelectGenderPhase, + SelectGenderPhase, SelectModifierPhase, SelectStarterPhase, SummonPhase, TitlePhase, @@ -23,7 +23,6 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { PlayerGender } from "#enums/player-gender"; import { Species } from "#enums/species"; -import {SelectModifierPhase} from "#app/phases/select-modifier-phase"; describe("Test Battle Phase", () => { let phaserGame: Phaser.Game; diff --git a/src/test/mystery-encounter/mystery-encounter-utils.test.ts b/src/test/mystery-encounter/mystery-encounter-utils.test.ts index 424da4d1aff..e558fe7a95c 100644 --- a/src/test/mystery-encounter/mystery-encounter-utils.test.ts +++ b/src/test/mystery-encounter/mystery-encounter-utils.test.ts @@ -1,4 +1,4 @@ -import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import GameManager from "#app/test/utils/gameManager"; import Phaser from "phaser"; import { @@ -6,14 +6,14 @@ import { getRandomPlayerPokemon, getRandomSpeciesByStarterTier, getEncounterText, koPlayerPokemon, queueEncounterMessage, showEncounterDialogue, showEncounterText, } from "#app/data/mystery-encounters/mystery-encounter-utils"; -import {initSceneWithoutEncounterPhase} from "#test/utils/gameManagerUtils"; -import {Species} from "#enums/species"; +import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; +import { Species } from "#enums/species"; import BattleScene from "#app/battle-scene"; -import {StatusEffect} from "#app/data/status-effect"; +import { StatusEffect } from "#app/data/status-effect"; import MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter"; -import {MessagePhase} from "#app/phases"; -import {getPokemonSpecies, speciesStarters} from "#app/data/pokemon-species"; -import {Type} from "#app/data/type"; +import { MessagePhase } from "#app/phases"; +import { getPokemonSpecies, speciesStarters } from "#app/data/pokemon-species"; +import { Type } from "#app/data/type"; describe("Mystery Encounter Utils", () => { let phaserGame: Phaser.Game; @@ -40,14 +40,14 @@ describe("Mystery Encounter Utils", () => { it("gets a random pokemon from player party", () => { // Seeds are calculated to return index 0 first, 1 second (if both pokemon are legal) scene.waveSeed = "random"; - Phaser.Math.RND.sow([ scene.waveSeed ]); + Phaser.Math.RND.sow([scene.waveSeed]); scene.rngCounter = 0; let result = getRandomPlayerPokemon(scene); expect(result.species.speciesId).toBe(Species.MANAPHY); scene.waveSeed = "random2"; - Phaser.Math.RND.sow([ scene.waveSeed ]); + Phaser.Math.RND.sow([scene.waveSeed]); scene.rngCounter = 0; result = getRandomPlayerPokemon(scene); @@ -64,14 +64,14 @@ describe("Mystery Encounter Utils", () => { // Seeds are calculated to return index 0 first, 1 second (if both pokemon are legal) scene.waveSeed = "random"; - Phaser.Math.RND.sow([ scene.waveSeed ]); + Phaser.Math.RND.sow([scene.waveSeed]); scene.rngCounter = 0; let result = getRandomPlayerPokemon(scene); expect(result.species.speciesId).toBe(Species.MANAPHY); scene.waveSeed = "random2"; - Phaser.Math.RND.sow([ scene.waveSeed ]); + Phaser.Math.RND.sow([scene.waveSeed]); scene.rngCounter = 0; result = getRandomPlayerPokemon(scene); @@ -87,14 +87,14 @@ describe("Mystery Encounter Utils", () => { // Seeds are calculated to return index 0 first, 1 second (if both pokemon are legal) scene.waveSeed = "random"; - Phaser.Math.RND.sow([ scene.waveSeed ]); + Phaser.Math.RND.sow([scene.waveSeed]); scene.rngCounter = 0; let result = getRandomPlayerPokemon(scene, true); expect(result.species.speciesId).toBe(Species.MANAPHY); scene.waveSeed = "random2"; - Phaser.Math.RND.sow([ scene.waveSeed ]); + Phaser.Math.RND.sow([scene.waveSeed]); scene.rngCounter = 0; result = getRandomPlayerPokemon(scene, true); @@ -110,14 +110,14 @@ describe("Mystery Encounter Utils", () => { // Seeds are calculated to return index 0 first, 1 second (if both pokemon are legal) scene.waveSeed = "random"; - Phaser.Math.RND.sow([ scene.waveSeed ]); + Phaser.Math.RND.sow([scene.waveSeed]); scene.rngCounter = 0; let result = getRandomPlayerPokemon(scene, true, false); expect(result.species.speciesId).toBe(Species.MANAPHY); scene.waveSeed = "random2"; - Phaser.Math.RND.sow([ scene.waveSeed ]); + Phaser.Math.RND.sow([scene.waveSeed]); scene.rngCounter = 0; result = getRandomPlayerPokemon(scene, true, false); @@ -133,14 +133,14 @@ describe("Mystery Encounter Utils", () => { // Seeds are calculated to return index 0 first, 1 second (if both pokemon are legal) scene.waveSeed = "random"; - Phaser.Math.RND.sow([ scene.waveSeed ]); + Phaser.Math.RND.sow([scene.waveSeed]); scene.rngCounter = 0; let result = getRandomPlayerPokemon(scene, true, true); expect(result.species.speciesId).toBe(Species.ARCEUS); scene.waveSeed = "random2"; - Phaser.Math.RND.sow([ scene.waveSeed ]); + Phaser.Math.RND.sow([scene.waveSeed]); scene.rngCounter = 0; result = getRandomPlayerPokemon(scene, true, true); diff --git a/src/test/mystery-encounter/mystery-encounter.test.ts b/src/test/mystery-encounter/mystery-encounter.test.ts index 49754a70876..f4a083c06d4 100644 --- a/src/test/mystery-encounter/mystery-encounter.test.ts +++ b/src/test/mystery-encounter/mystery-encounter.test.ts @@ -1,10 +1,10 @@ -import {afterEach, beforeAll, beforeEach, expect, describe, it, vi} from "vitest"; +import { afterEach, beforeAll, beforeEach, expect, describe, it, vi } from "vitest"; import * as overrides from "../../overrides"; import GameManager from "#app/test/utils/gameManager"; import Phaser from "phaser"; -import {Species} from "#enums/species"; -import {MysteryEncounterPhase} from "#app/phases/mystery-encounter-phase"; -import {MysteryEncounterType} from "#enums/mystery-encounter-type"; +import { Species } from "#enums/species"; +import { MysteryEncounterPhase } from "#app/phases/mystery-encounter-phase"; +import { MysteryEncounterType } from "#enums/mystery-encounter-type"; describe("Mystery Encounters", () => { let phaserGame: Phaser.Game; @@ -29,12 +29,12 @@ describe("Mystery Encounters", () => { // Seed guarantees wild encounter to be replaced by ME vi.spyOn(game.scene, "resetSeed").mockImplementation(() => { game.scene.waveSeed = "test"; - Phaser.Math.RND.sow([ game.scene.waveSeed ]); + Phaser.Math.RND.sow([game.scene.waveSeed]); game.scene.rngCounter = 0; }); }); - it("Spawns a mystery encounter", async() => { + it("Spawns a mystery encounter", async () => { await game.runToMysteryEncounter([ Species.CHARIZARD, Species.VOLCARONA @@ -44,7 +44,7 @@ describe("Mystery Encounters", () => { expect(game.scene.getCurrentPhase().constructor.name).toBe(MysteryEncounterPhase.name); }); - it("", async() => { + it("", async () => { await game.runToMysteryEncounter([ Species.CHARIZARD, Species.VOLCARONA @@ -54,16 +54,16 @@ describe("Mystery Encounters", () => { expect(game.scene.getCurrentPhase().constructor.name).toBe(MysteryEncounterPhase.name); }); - it("spawns mysterious challengers encounter", async() => { + it("spawns mysterious challengers encounter", async () => { }); - it("spawns mysterious chest encounter", async() => { + it("spawns mysterious chest encounter", async () => { }); - it("spawns dark deal encounter", async() => { + it("spawns dark deal encounter", async () => { }); - it("spawns fight or flight encounter", async() => { + it("spawns fight or flight encounter", async () => { }); }); diff --git a/src/test/phases/select-modifier-phase.test.ts b/src/test/phases/select-modifier-phase.test.ts index e58198da0cb..7efcf47ac03 100644 --- a/src/test/phases/select-modifier-phase.test.ts +++ b/src/test/phases/select-modifier-phase.test.ts @@ -1,17 +1,17 @@ -import {afterEach, beforeAll, beforeEach, describe, expect, it, vi} from "vitest"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import Phaser from "phaser"; import GameManager from "#app/test/utils/gameManager"; -import {initSceneWithoutEncounterPhase} from "#app/test/utils/gameManagerUtils"; +import { initSceneWithoutEncounterPhase } from "#app/test/utils/gameManagerUtils"; import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; -import {ModifierTier} from "#app/modifier/modifier-tier"; +import { ModifierTier } from "#app/modifier/modifier-tier"; import * as Utils from "#app/utils"; -import {CustomModifierSettings, ModifierTypeOption, modifierTypes} from "#app/modifier/modifier-type"; +import { CustomModifierSettings, ModifierTypeOption, modifierTypes } from "#app/modifier/modifier-type"; import BattleScene from "#app/battle-scene"; -import {SelectModifierPhase} from "#app/phases/select-modifier-phase"; -import {Species} from "#enums/species"; -import {Mode} from "#app/ui/ui"; -import {PlayerPokemon} from "#app/field/pokemon"; -import {getPokemonSpecies} from "#app/data/pokemon-species"; +import { Species } from "#enums/species"; +import { Mode } from "#app/ui/ui"; +import { PlayerPokemon } from "#app/field/pokemon"; +import { getPokemonSpecies } from "#app/data/pokemon-species"; +import { SelectModifierPhase } from "#app/phases"; describe("SelectModifierPhase", () => { let phaserGame: Phaser.Game; @@ -30,7 +30,7 @@ describe("SelectModifierPhase", () => { vi.spyOn(scene, "resetSeed").mockImplementation(() => { scene.waveSeed = "test"; - Phaser.Math.RND.sow([ scene.waveSeed ]); + Phaser.Math.RND.sow([scene.waveSeed]); scene.rngCounter = 0; }); @@ -73,7 +73,7 @@ describe("SelectModifierPhase", () => { ]; const selectModifierPhase1 = new SelectModifierPhase(scene); - const selectModifierPhase2 = new SelectModifierPhase(scene, 0, null, { rerollMultiplier: 2}); + const selectModifierPhase2 = new SelectModifierPhase(scene, 0, null, { rerollMultiplier: 2 }); const cost1 = selectModifierPhase1.getRerollCost(options, false); const cost2 = selectModifierPhase2.getRerollCost(options, false); @@ -109,7 +109,7 @@ describe("SelectModifierPhase", () => { // Just use fully random seed for this test vi.spyOn(scene, "resetSeed").mockImplementation(() => { scene.waveSeed = Utils.shiftCharCodes(scene.seed, 5); - Phaser.Math.RND.sow([ scene.waveSeed ]); + Phaser.Math.RND.sow([scene.waveSeed]); console.log("Wave Seed:", scene.waveSeed, 5); scene.rngCounter = 0; }); diff --git a/src/test/ui/transfer-item.test.ts b/src/test/ui/transfer-item.test.ts index 90a1eb242a1..e0cf1819be3 100644 --- a/src/test/ui/transfer-item.test.ts +++ b/src/test/ui/transfer-item.test.ts @@ -4,7 +4,7 @@ import { Species } from "#app/enums/species"; import { Button } from "#app/enums/buttons"; import * as overrides from "#app/overrides"; import { - BattleEndPhase, + BattleEndPhase, SelectModifierPhase, } from "#app/phases"; import GameManager from "#app/test/utils/gameManager"; import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; @@ -14,7 +14,6 @@ import Phaser from "phaser"; import BBCodeText from "phaser3-rex-plugins/plugins/bbcodetext"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { getMovePosition } from "../utils/gameManagerUtils"; -import {SelectModifierPhase} from "#app/phases/select-modifier-phase"; describe("UI - Transfer Items", () => { diff --git a/src/test/utils/phaseInterceptor.ts b/src/test/utils/phaseInterceptor.ts index 7591b958dbf..09e3df4dac8 100644 --- a/src/test/utils/phaseInterceptor.ts +++ b/src/test/utils/phaseInterceptor.ts @@ -16,7 +16,7 @@ import { NewBattlePhase, NextEncounterPhase, PostSummonPhase, - SelectGenderPhase, + SelectGenderPhase, SelectModifierPhase, SelectStarterPhase, SelectTargetPhase, ShinySparklePhase, @@ -33,11 +33,10 @@ import { UnavailablePhase, VictoryPhase } from "#app/phases"; -import UI, {Mode} from "#app/ui/ui"; -import {Phase} from "#app/phase"; +import UI, { Mode } from "#app/ui/ui"; +import { Phase } from "#app/phase"; import ErrorInterceptor from "#app/test/utils/errorInterceptor"; -import {QuietFormChangePhase} from "#app/form-change-phase"; -import {SelectModifierPhase} from "#app/phases/select-modifier-phase"; +import { QuietFormChangePhase } from "#app/form-change-phase"; import { MysteryEncounterBattlePhase, MysteryEncounterOptionSelectedPhase, diff --git a/src/test/vitest.setup.ts b/src/test/vitest.setup.ts index 3615ca7d27e..fb0fdb5fa98 100644 --- a/src/test/vitest.setup.ts +++ b/src/test/vitest.setup.ts @@ -9,13 +9,13 @@ import { initMoves } from "#app/data/move"; import { initPokemonPrevolutions } from "#app/data/pokemon-evolutions"; import { initPokemonForms } from "#app/data/pokemon-forms"; import { initSpecies } from "#app/data/pokemon-species"; -import { initAchievements } from "#app/system/achv.js"; -import { initVouchers } from "#app/system/voucher.js"; import { initStatsKeys } from "#app/ui/game-stats-ui-handler"; import { beforeAll, beforeEach, vi } from "vitest"; import * as overrides from "#app/overrides"; -import { initMysteryEncounterDialogue } from "#app/data/mystery-encounters/dialogue/mystery-encounter-dialogue"; import { initMysteryEncounters } from "#app/data/mystery-encounters/mystery-encounters"; +import { initMysteryEncounterDialogue } from "#app/data/mystery-encounters/mystery-encounter-dialogue"; +import { initVouchers } from "#app/system/voucher"; +import { initAchievements } from "#app/system/achv"; initVouchers(); initAchievements(); diff --git a/src/ui/party-ui-handler.ts b/src/ui/party-ui-handler.ts index 467d35bdb2c..69bad0ff4d7 100644 --- a/src/ui/party-ui-handler.ts +++ b/src/ui/party-ui-handler.ts @@ -1,4 +1,4 @@ -import { CommandPhase } from "../phases"; +import { CommandPhase, SelectModifierPhase } from "../phases"; import BattleScene from "../battle-scene"; import { PlayerPokemon, PokemonMove } from "../field/pokemon"; import { addBBCodeTextObject, addTextObject, getTextColor, TextStyle } from "./text"; @@ -21,7 +21,6 @@ import MoveInfoOverlay from "./move-info-overlay"; import i18next from "i18next"; import BBCodeText from "phaser3-rex-plugins/plugins/bbcodetext"; import { Moves } from "#enums/moves"; -import { SelectModifierPhase } from "#app/phases/select-modifier-phase"; const defaultMessage = i18next.t("partyUiHandler:choosePokemon"); From e47eba0e31730fce6a5269dfd2ea365a02078b43 Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Wed, 10 Jul 2024 15:58:16 -0400 Subject: [PATCH 040/270] undo accidental beta branch change --- .github/workflows/deploy-beta.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/deploy-beta.yml b/.github/workflows/deploy-beta.yml index d55a34b95f1..d954d9bb865 100644 --- a/.github/workflows/deploy-beta.yml +++ b/.github/workflows/deploy-beta.yml @@ -20,7 +20,7 @@ jobs: env: NODE_ENV: production - name: Set up SSH - if: github.event_name == 'push' && (github.ref_name == github.event.repository.default_branch || github.ref_name == 'beta') + if: github.event_name == 'push' && github.ref_name == github.event.repository.default_branch run: | mkdir ~/.ssh echo "${{ secrets.BETA_SSH_PUBLIC_KEY }}" > ~/.ssh/id_ed25519.pub @@ -28,6 +28,6 @@ jobs: chmod 600 ~/.ssh/* ssh-keyscan -H ${{ secrets.BETA_SSH_HOST }} >> ~/.ssh/known_hosts - name: Deploy build on server - if: github.event_name == 'push' && (github.ref_name == github.event.repository.default_branch || github.ref_name == 'beta') + if: github.event_name == 'push' && github.ref_name == github.event.repository.default_branch run: | rsync --del --no-times --checksum -vrm dist/* ${{ secrets.BETA_SSH_USER }}@${{ secrets.BETA_SSH_HOST }}:${{ secrets.BETA_DESTINATION_DIR }} \ No newline at end of file From 253447136a930406b6d163d20e3fe72ab05c7dc3 Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Wed, 10 Jul 2024 16:32:24 -0400 Subject: [PATCH 041/270] some more small cleanup --- src/battle-scene.ts | 82 +++++++++++++++------------------------- src/phases.ts | 4 +- src/test/vitest.setup.ts | 10 ++--- 3 files changed, 37 insertions(+), 59 deletions(-) diff --git a/src/battle-scene.ts b/src/battle-scene.ts index a7bb5946601..f67adce1e02 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -5,23 +5,7 @@ import Pokemon, { PlayerPokemon, EnemyPokemon } from "./field/pokemon"; import PokemonSpecies, { PokemonSpeciesFilter, allSpecies, getPokemonSpecies } from "./data/pokemon-species"; import {Constructor, isNullOrUndefined} from "#app/utils"; import * as Utils from "./utils"; -import { - Modifier, - ModifierBar, - ConsumablePokemonModifier, - ConsumableModifier, - PokemonHpRestoreModifier, - HealingBoosterModifier, - PersistentModifier, - PokemonHeldItemModifier, - ModifierPredicate, - DoubleBattleChanceBoosterModifier, - FusePokemonModifier, - PokemonFormChangeItemModifier, - TerastallizeModifier, - overrideModifiers, - overrideHeldItems -} from "./modifier/modifier"; +import { Modifier, ModifierBar, ConsumablePokemonModifier, ConsumableModifier, PokemonHpRestoreModifier, HealingBoosterModifier, PersistentModifier, PokemonHeldItemModifier, ModifierPredicate, DoubleBattleChanceBoosterModifier, FusePokemonModifier, PokemonFormChangeItemModifier, TerastallizeModifier, overrideModifiers, overrideHeldItems } from "./modifier/modifier"; import { PokeballType } from "./data/pokeball"; import { initCommonAnims, initMoveAnim, loadCommonAnimAssets, loadMoveAnimAssets, populateAnims } from "./data/battle-anims"; import { Phase } from "./phase"; @@ -30,16 +14,7 @@ import { Arena, ArenaBase } from "./field/arena"; import { GameData } from "./system/game-data"; import { TextStyle, addTextObject, getTextColor } from "./ui/text"; import { allMoves } from "./data/move"; -import { - ModifierPoolType, - getDefaultModifierTypeForTier, - getEnemyModifierTypesForWave, - getLuckString, - getLuckTextTint, - getModifierPoolForType, - getPartyLuckValue, - PokemonHeldItemModifierType -} from "./modifier/modifier-type"; +import { ModifierPoolType, getDefaultModifierTypeForTier, getEnemyModifierTypesForWave, getLuckString, getLuckTextTint, getModifierPoolForType, getPartyLuckValue, PokemonHeldItemModifierType } from "./modifier/modifier-type"; import AbilityBar from "./ui/ability-bar"; import { BlockItemTheftAbAttr, DoubleBattleChanceAbAttr, IncrementMovePriorityAbAttr, PostBattleInitAbAttr, applyAbAttrs, applyPostBattleInitAbAttrs } from "./data/ability"; import { allAbilities } from "./data/ability"; @@ -2388,34 +2363,37 @@ export default class BattleScene extends SceneBase { } } - party.forEach((enemyPokemon: EnemyPokemon, i: integer) => { + party.every((enemyPokemon: EnemyPokemon, i: integer) => { if (customHeldModifiers && i < customHeldModifiers.length && customHeldModifiers[i].length > 0) { customHeldModifiers[i].forEach(mt => mt.newModifier(enemyPokemon).add(this.enemyModifiers, false, this)); - } else { - const isBoss = enemyPokemon.isBoss() || (this.currentBattle.battleType === BattleType.TRAINER && this.currentBattle.trainer.config.isBoss); - let upgradeChance = 32; - if (isBoss) { - upgradeChance /= 2; - } - if (isFinalBoss) { - upgradeChance /= 8; - } - const modifierChance = this.gameMode.getEnemyModifierChance(isBoss); - let pokemonModifierChance = modifierChance; - if (this.currentBattle.battleType === BattleType.TRAINER) - pokemonModifierChance = Math.ceil(pokemonModifierChance * this.currentBattle.trainer.getPartyMemberModifierChanceMultiplier(i)); // eslint-disable-line - let count = 0; - for (let c = 0; c < chances; c++) { - if (!Utils.randSeedInt(modifierChance)) { - count++; - } - } - if (isBoss) { - count = Math.max(count, Math.floor(chances / 2)); - } - getEnemyModifierTypesForWave(difficultyWaveIndex, count, [ enemyPokemon ], this.currentBattle.battleType === BattleType.TRAINER ? ModifierPoolType.TRAINER : ModifierPoolType.WILD, upgradeChance) - .map(mt => mt.newModifier(enemyPokemon).add(this.enemyModifiers, false, this)); + return true; } + + const isBoss = enemyPokemon.isBoss() || (this.currentBattle.battleType === BattleType.TRAINER && this.currentBattle.trainer.config.isBoss); + let upgradeChance = 32; + if (isBoss) { + upgradeChance /= 2; + } + if (isFinalBoss) { + upgradeChance /= 8; + } + const modifierChance = this.gameMode.getEnemyModifierChance(isBoss); + let pokemonModifierChance = modifierChance; + if (this.currentBattle.battleType === BattleType.TRAINER) + pokemonModifierChance = Math.ceil(pokemonModifierChance * this.currentBattle.trainer.getPartyMemberModifierChanceMultiplier(i)); // eslint-disable-line + let count = 0; + for (let c = 0; c < chances; c++) { + if (!Utils.randSeedInt(modifierChance)) { + count++; + } + } + if (isBoss) { + count = Math.max(count, Math.floor(chances / 2)); + } + getEnemyModifierTypesForWave(difficultyWaveIndex, count, [ enemyPokemon ], this.currentBattle.battleType === BattleType.TRAINER ? ModifierPoolType.TRAINER : ModifierPoolType.WILD, upgradeChance) + .map(mt => mt.newModifier(enemyPokemon).add(this.enemyModifiers, false, this)); + + return true; }); this.updateModifiers(false).then(() => resolve()); diff --git a/src/phases.ts b/src/phases.ts index 878a3ef9d60..091629b31d5 100644 --- a/src/phases.ts +++ b/src/phases.ts @@ -5,7 +5,7 @@ import { allMoves, applyMoveAttrs, BypassSleepAttr, ChargeAttr, applyFilteredMov import { Mode } from "./ui/ui"; import { Command } from "./ui/command-ui-handler"; import { Stat } from "./data/pokemon-stat"; -import { BerryModifier, ContactHeldItemTransferChanceModifier, EnemyAttackStatusEffectChanceModifier, EnemyPersistentModifier, EnemyStatusEffectHealChanceModifier, EnemyTurnHealModifier, ExpBalanceModifier, ExpBoosterModifier, ExpShareModifier, FlinchChanceModifier, HealingBoosterModifier, HitHealModifier, LapsingPersistentModifier, MapModifier, Modifier, MultipleParticipantExpBonusModifier, PersistentModifier, PokemonExpBoosterModifier, PokemonHeldItemModifier, PokemonInstantReviveModifier, SwitchEffectTransferModifier, TempBattleStatBoosterModifier, TurnHealModifier, TurnHeldItemTransferModifier, MoneyMultiplierModifier, MoneyInterestModifier, IvScannerModifier, LapsingPokemonHeldItemModifier, PokemonMultiHitModifier, PokemonMoveAccuracyBoosterModifier, overrideModifiers, overrideHeldItems, BypassSpeedChanceModifier, TurnStatusEffectModifier, ExtraModifierModifier } from "./modifier/modifier"; +import { BerryModifier, ContactHeldItemTransferChanceModifier, EnemyAttackStatusEffectChanceModifier, EnemyPersistentModifier, EnemyStatusEffectHealChanceModifier, EnemyTurnHealModifier, ExpBalanceModifier, ExpBoosterModifier, ExpShareModifier, ExtraModifierModifier, FlinchChanceModifier, HealingBoosterModifier, HitHealModifier, LapsingPersistentModifier, MapModifier, Modifier, MultipleParticipantExpBonusModifier, PersistentModifier, PokemonExpBoosterModifier, PokemonHeldItemModifier, PokemonInstantReviveModifier, SwitchEffectTransferModifier, TempBattleStatBoosterModifier, TurnHealModifier, TurnHeldItemTransferModifier, MoneyMultiplierModifier, MoneyInterestModifier, IvScannerModifier, LapsingPokemonHeldItemModifier, PokemonMultiHitModifier, PokemonMoveAccuracyBoosterModifier, overrideModifiers, overrideHeldItems, BypassSpeedChanceModifier, TurnStatusEffectModifier } from "./modifier/modifier"; import PartyUiHandler, { PartyOption, PartyUiMode } from "./ui/party-ui-handler"; import { doPokeballBounceAnim, getPokeballAtlasKey, getPokeballCatchMultiplier, getPokeballTintColor, PokeballType } from "./data/pokeball"; import { CommonAnim, CommonBattleAnim, MoveAnim, initMoveAnim, loadMoveAnimAssets } from "./data/battle-anims"; @@ -17,7 +17,7 @@ import { Phase } from "./phase"; import { BattleStat, getBattleStatLevelChangeDescription, getBattleStatName } from "./data/battle-stat"; import { biomeLinks, getBiomeName } from "./data/biomes"; import { ModifierTier } from "./modifier/modifier-tier"; -import { ModifierPoolType, ModifierType, ModifierTypeFunc, getDailyRunStarterModifiers, getEnemyBuffModifierForWave, getModifierType, modifierTypes, regenerateModifierPoolThresholds, CustomModifierSettings, ModifierTypeOption, getPlayerShopModifierTypeOptionsForWave, PokemonModifierType, FusePokemonModifierType, PokemonMoveModifierType, TmModifierType, RememberMoveModifierType, PokemonPpRestoreModifierType, PokemonPpUpModifierType, getPlayerModifierTypeOptions } from "./modifier/modifier-type"; +import { FusePokemonModifierType, ModifierPoolType, ModifierType, ModifierTypeFunc, ModifierTypeOption, PokemonModifierType, PokemonMoveModifierType, PokemonPpRestoreModifierType, PokemonPpUpModifierType, RememberMoveModifierType, TmModifierType, getDailyRunStarterModifiers, getEnemyBuffModifierForWave, getModifierType, getPlayerModifierTypeOptions, getPlayerShopModifierTypeOptionsForWave, modifierTypes, regenerateModifierPoolThresholds, CustomModifierSettings } from "./modifier/modifier-type"; import SoundFade from "phaser3-rex-plugins/plugins/soundfade"; import { BattlerTagLapseType, CenterOfAttentionTag, EncoreTag, ProtectedTag, SemiInvulnerableTag, TrappedTag, MysteryEncounterPostSummonTag } from "./data/battler-tags"; import { getPokemonMessage, getPokemonNameWithAffix } from "./messages"; diff --git a/src/test/vitest.setup.ts b/src/test/vitest.setup.ts index fb0fdb5fa98..b8b655e3e96 100644 --- a/src/test/vitest.setup.ts +++ b/src/test/vitest.setup.ts @@ -9,13 +9,13 @@ import { initMoves } from "#app/data/move"; import { initPokemonPrevolutions } from "#app/data/pokemon-evolutions"; import { initPokemonForms } from "#app/data/pokemon-forms"; import { initSpecies } from "#app/data/pokemon-species"; -import { initStatsKeys } from "#app/ui/game-stats-ui-handler"; -import { beforeAll, beforeEach, vi } from "vitest"; -import * as overrides from "#app/overrides"; -import { initMysteryEncounters } from "#app/data/mystery-encounters/mystery-encounters"; -import { initMysteryEncounterDialogue } from "#app/data/mystery-encounters/mystery-encounter-dialogue"; import { initVouchers } from "#app/system/voucher"; import { initAchievements } from "#app/system/achv"; +import { initStatsKeys } from "#app/ui/game-stats-ui-handler"; +import { initMysteryEncounters } from "#app/data/mystery-encounters/mystery-encounters"; +import { initMysteryEncounterDialogue } from "#app/data/mystery-encounters/mystery-encounter-dialogue"; +import { beforeAll, beforeEach, vi } from "vitest"; +import * as overrides from "#app/overrides"; initVouchers(); initAchievements(); From ec7cabc8c87679b5653d2c539f09e1daeca08e35 Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Wed, 10 Jul 2024 18:39:55 -0700 Subject: [PATCH 042/270] getting lost at the sea MVP (event) --- .../getting-lost-at-the-sea-dialogue.ts | 50 +++++++++++++++++++ .../getting-lost-at-the-sea-encounter.ts | 45 +++++++++++++++++ .../mystery-encounter-dialogue.ts | 2 + .../mystery-encounters/mystery-encounters.ts | 6 ++- src/enums/mystery-encounter-type.ts | 3 +- src/locales/en/mystery-encounter.ts | 5 +- .../getting-lost-at-the-sea.ts | 25 ++++++++++ src/overrides.ts | 8 +-- 8 files changed, 136 insertions(+), 8 deletions(-) create mode 100644 src/data/mystery-encounters/dialogue/getting-lost-at-the-sea-dialogue.ts create mode 100644 src/data/mystery-encounters/encounters/getting-lost-at-the-sea-encounter.ts create mode 100644 src/locales/en/mystery-encounters/getting-lost-at-the-sea.ts diff --git a/src/data/mystery-encounters/dialogue/getting-lost-at-the-sea-dialogue.ts b/src/data/mystery-encounters/dialogue/getting-lost-at-the-sea-dialogue.ts new file mode 100644 index 00000000000..9e008c93c57 --- /dev/null +++ b/src/data/mystery-encounters/dialogue/getting-lost-at-the-sea-dialogue.ts @@ -0,0 +1,50 @@ +import MysteryEncounterDialogue from "#app/data/mystery-encounters/mystery-encounter-dialogue"; + +const namepsace = "mysteryEncounter:gettingLostAtTheSea"; + +export const GettingLostAtTheSeaDialogue: MysteryEncounterDialogue = { + intro: [ + { + text: `${namepsace}:intro` + } + ], + encounterOptionsDialogue: { + title: `${namepsace}:title`, + description: `${namepsace}:description`, + query: `${namepsace}:query`, + options: [ + { + buttonLabel: `${namepsace}:option:1:label`, + buttonTooltip: `${namepsace}:option:1:tooltip`, + selected: [ + { + text: `${namepsace}:option:1:selected`, + }, + ], + }, + { + buttonLabel: `${namepsace}:option:2:label`, + buttonTooltip: `${namepsace}:option:2:tooltip`, + selected: [ + { + text: `${namepsace}:option:2:selected`, + }, + ], + }, + { + buttonLabel: `${namepsace}:option:3:label`, + buttonTooltip: `${namepsace}:option:3:tooltip`, + selected: [ + { + text: `${namepsace}:option:3:selected`, + }, + ], + }, + ], + }, + outro: [ + { + text: `${namepsace}:outro`, + }, + ], +}; diff --git a/src/data/mystery-encounters/encounters/getting-lost-at-the-sea-encounter.ts b/src/data/mystery-encounters/encounters/getting-lost-at-the-sea-encounter.ts new file mode 100644 index 00000000000..3b9b2366158 --- /dev/null +++ b/src/data/mystery-encounters/encounters/getting-lost-at-the-sea-encounter.ts @@ -0,0 +1,45 @@ +import { MysteryEncounterType } from "#enums/mystery-encounter-type"; +import BattleScene from "../../../battle-scene"; +import MysteryEncounter, { + MysteryEncounterBuilder, + MysteryEncounterTier, +} from "../mystery-encounter"; + +/** + * Getting lost at the sea encounter. + * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/9|GitHub Issue #9} + * @see {@linkcode MysteryEncounter|Dialogues} + * @see For biome requirements check [mysteryEncountersByBiome](../mystery-encounters.ts) + */ +export const GettingLostAtTheSeaEncounter: MysteryEncounter = + MysteryEncounterBuilder.withEncounterType( + MysteryEncounterType.GETTING_LOST_AT_THE_SEA + ) + .withEncounterTier(MysteryEncounterTier.COMMON) + .withIntroSpriteConfigs([ + { + fileRoot: "pokemon", + spriteKey: "130", // gyarados for now + hasShadow: false, + scale: 4, + y: 100, + x: 130, + tint: .25 + }, + ]) + .withSceneWaveRangeRequirement(11, 179) + .withOnInit((_scene: BattleScene) => { + console.log("GettingLostAtTheSeaEncounter OnInit"); + return true; + }) + .withOptionPhase(async (scene: BattleScene) => { + // OPTION 1 + }) + .withOptionPhase(async (scene: BattleScene) => { + // OPTION 2 + }) + .withOptionPhase(async (scene: BattleScene) => { + // OPTION 3 + return true; + }) + .build(); diff --git a/src/data/mystery-encounters/mystery-encounter-dialogue.ts b/src/data/mystery-encounters/mystery-encounter-dialogue.ts index 1e2dfe85045..6f8f6a844ed 100644 --- a/src/data/mystery-encounters/mystery-encounter-dialogue.ts +++ b/src/data/mystery-encounters/mystery-encounter-dialogue.ts @@ -8,6 +8,7 @@ import { SleepingSnorlaxDialogue } from "./dialogue/sleeping-snorlax-dialogue"; import { DepartmentStoreSaleDialogue } from "#app/data/mystery-encounters/dialogue/department-store-sale-dialogue"; import { ShadyVitaminDealerDialogue } from "#app/data/mystery-encounters/dialogue/shady-vitamin-dealer"; import { TextStyle } from "#app/ui/text"; +import { GettingLostAtTheSeaDialogue } from "./dialogue/getting-lost-at-the-sea-dialogue"; export class TextDisplay { speaker?: TemplateStringsArray | `mysteryEncounter:${string}`; @@ -92,4 +93,5 @@ export function initMysteryEncounterDialogue() { allMysteryEncounterDialogue[MysteryEncounterType.SLEEPING_SNORLAX] = SleepingSnorlaxDialogue; allMysteryEncounterDialogue[MysteryEncounterType.DEPARTMENT_STORE_SALE] = DepartmentStoreSaleDialogue; allMysteryEncounterDialogue[MysteryEncounterType.SHADY_VITAMIN_DEALER] = ShadyVitaminDealerDialogue; + allMysteryEncounterDialogue[MysteryEncounterType.GETTING_LOST_AT_THE_SEA] = GettingLostAtTheSeaDialogue; } diff --git a/src/data/mystery-encounters/mystery-encounters.ts b/src/data/mystery-encounters/mystery-encounters.ts index e4a748d3a23..bb27426d798 100644 --- a/src/data/mystery-encounters/mystery-encounters.ts +++ b/src/data/mystery-encounters/mystery-encounters.ts @@ -9,6 +9,7 @@ import { SleepingSnorlaxEncounter } from "./encounters/sleeping-snorlax"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { DepartmentStoreSaleEncounter } from "#app/data/mystery-encounters/encounters/department-store-sale"; import { ShadyVitaminDealerEncounter } from "#app/data/mystery-encounters/encounters/shady-vitamin-dealer"; +import { GettingLostAtTheSeaEncounter } from "./encounters/getting-lost-at-the-sea-encounter"; // Spawn chance: (BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT + WIGHT_INCREMENT_ON_SPAWN_MISS * ) / 256 export const BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT = 1; @@ -40,7 +41,9 @@ export const mysteryEncountersByBiome = new Map([ MysteryEncounterType.SLEEPING_SNORLAX ]], - [Biome.SEA, []], + [Biome.SEA, [ + MysteryEncounterType.GETTING_LOST_AT_THE_SEA + ]], [Biome.SWAMP, []], [Biome.BEACH, [ MysteryEncounterType.DEPARTMENT_STORE_SALE @@ -95,6 +98,7 @@ export function initMysteryEncounters() { allMysteryEncounters[MysteryEncounterType.SLEEPING_SNORLAX] = SleepingSnorlaxEncounter; allMysteryEncounters[MysteryEncounterType.DEPARTMENT_STORE_SALE] = DepartmentStoreSaleEncounter; allMysteryEncounters[MysteryEncounterType.SHADY_VITAMIN_DEALER] = ShadyVitaminDealerEncounter; + allMysteryEncounters[MysteryEncounterType.GETTING_LOST_AT_THE_SEA] = GettingLostAtTheSeaEncounter; // Append encounters that can occur in any biome to biome map const anyBiomeEncounters: MysteryEncounterType[] = Object.keys(MysteryEncounterType).filter(e => !isNaN(Number(e))).map(k => Number(k) as MysteryEncounterType); diff --git a/src/enums/mystery-encounter-type.ts b/src/enums/mystery-encounter-type.ts index 6e2815babca..9a78bf1b3ea 100644 --- a/src/enums/mystery-encounter-type.ts +++ b/src/enums/mystery-encounter-type.ts @@ -6,5 +6,6 @@ export enum MysteryEncounterType { SLEEPING_SNORLAX, TRAINING_SESSION, DEPARTMENT_STORE_SALE, - SHADY_VITAMIN_DEALER + SHADY_VITAMIN_DEALER, + GETTING_LOST_AT_THE_SEA //might be generalized later on } diff --git a/src/locales/en/mystery-encounter.ts b/src/locales/en/mystery-encounter.ts index ac04eed2688..3ff720dae0b 100644 --- a/src/locales/en/mystery-encounter.ts +++ b/src/locales/en/mystery-encounter.ts @@ -1,4 +1,4 @@ -import { SimpleTranslationEntries } from "#app/interfaces/locales"; +import { gettingLostAtTheSea } from "./mystery-encounters/getting-lost-at-the-sea"; /** * Patterns that can be used: @@ -12,7 +12,7 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; * Any '(+)' or '(-)' type of tooltip will auto-color to green/blue respectively. THIS ONLY OCCURS FOR OPTION TOOLTIPS, NOWHERE ELSE * Other types of '(...)' tooltips will have to specify the text color manually by using '@[SUMMARY_GREEN]{}' pattern */ -export const mysteryEncounter: SimpleTranslationEntries = { +export const mysteryEncounter = { // DO NOT REMOVE "unit_test_dialogue": "@ec{test}@ec{test} @ec{test@ec{test}} @ec{test1} @ec{test\} @ec{test\\} @ec{test\\\} {test}", @@ -181,4 +181,5 @@ export const mysteryEncounter: SimpleTranslationEntries = { "sleeping_snorlax_option_3_good_result": "Your @ec{option3PrimaryName} uses @ec{option3PrimaryMove}! @s{item_fanfare}It steals Leftovers off the sleeping Snorlax and you make out like bandits!", // "sleeping_snorlax_outro_win": "The mysterious challengers were defeated!", + gettingLostAtTheSea, } as const; diff --git a/src/locales/en/mystery-encounters/getting-lost-at-the-sea.ts b/src/locales/en/mystery-encounters/getting-lost-at-the-sea.ts new file mode 100644 index 00000000000..a9640a20490 --- /dev/null +++ b/src/locales/en/mystery-encounters/getting-lost-at-the-sea.ts @@ -0,0 +1,25 @@ + +export const gettingLostAtTheSea = { + intro: "TBA: INTRO MESSAGE", + "title": "Getting lost at the sea", + "description": "You get lost. Certain Pokémons can help you get back on track unharmed.", + "query": "What will you do?", + option: { + 1: { + label: "Let (Water type) guide you back", //TODO: replace (Water type) with pokemon in team + tooltip: "Needs a Water type in the party. That PKMN earns EXP as if having defeated a Lapras.", + selected: "TBA: OPTION 1 SELECTED TEXT " + }, + 2: { + label: " Let (Flying type) guide you back", //TODO: replace (Flying type) with pokemon in team + tooltip: "Needs a Flying type in the party. That PKMN earns EXP as if having defeated a Lapras.", + selected: "TBA: OPTION 2 SELECTED TEXT " + }, + 3: { + label: "Wander aimlessly until you're back", + tooltip: "All your Pokémon lose 30% of their HP. Any below that are KO'd.", + selected: "TBA: OPTION 3 SELECTED TEXT " + } + }, + "outro": "TBA GETTING LOST AT SEA OUTRO MESSAGE", +}; diff --git a/src/overrides.ts b/src/overrides.ts index ce706173691..596ee8f20f1 100644 --- a/src/overrides.ts +++ b/src/overrides.ts @@ -35,8 +35,8 @@ export const SEED_OVERRIDE: string = ""; export const WEATHER_OVERRIDE: WeatherType = WeatherType.NONE; export const DOUBLE_BATTLE_OVERRIDE: boolean = false; export const SINGLE_BATTLE_OVERRIDE: boolean = false; -export const STARTING_WAVE_OVERRIDE: integer = 0; -export const STARTING_BIOME_OVERRIDE: Biome = Biome.TOWN; +export const STARTING_WAVE_OVERRIDE: integer = 15; +export const STARTING_BIOME_OVERRIDE: Biome = Biome.SEA; export const ARENA_TINT_OVERRIDE: TimeOfDay = null; // Multiplies XP gained by this value including 0. Set to null to ignore the override export const XP_MULTIPLIER_OVERRIDE: number = null; @@ -118,9 +118,9 @@ export const EGG_GACHA_PULL_COUNT_OVERRIDE: number = 0; */ // 1 to 256, set to null to ignore -export const MYSTERY_ENCOUNTER_RATE_OVERRIDE: number = null; +export const MYSTERY_ENCOUNTER_RATE_OVERRIDE: number = 100000; export const MYSTERY_ENCOUNTER_TIER_OVERRIDE: MysteryEncounterTier = null; -export const MYSTERY_ENCOUNTER_OVERRIDE: MysteryEncounterType = null; +export const MYSTERY_ENCOUNTER_OVERRIDE: MysteryEncounterType = MysteryEncounterType.GETTING_LOST_AT_THE_SEA; /** * MODIFIER / ITEM OVERRIDES From d9ea676a92f58394a7a5dbad59216b11125320b9 Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Wed, 10 Jul 2024 20:34:28 -0700 Subject: [PATCH 043/270] add `KnownFileRoot` template literal --- src/field/mystery-encounter-intro.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/field/mystery-encounter-intro.ts b/src/field/mystery-encounter-intro.ts index adb700b4854..ef3baa17cdf 100644 --- a/src/field/mystery-encounter-intro.ts +++ b/src/field/mystery-encounter-intro.ts @@ -2,9 +2,11 @@ import { GameObjects } from "phaser"; import BattleScene from "../battle-scene"; import MysteryEncounter from "../data/mystery-encounters/mystery-encounter"; +type KnownFileRoot = "trainer" | "pokemon" | "arenas" | "battle_anims" | "cg" | "character" | "effect" | "egg" | "events" | "inputs" | "items" | "mystery-encounters" | "pokeball" | "pokemon" | "statuses" | "trainer" | "ui"; + export class MysteryEncounterSpriteConfig { spriteKey: string; // e.g. "ace_trainer_f" - fileRoot: string; // "trainer" for trainer sprites, "pokemon" for pokemon, etc. Refer to /public/images directory for the folder name + fileRoot: KnownFileRoot & string; // Refer to /public/images directory for the folder name hasShadow?: boolean = false; // Spawns shadow underneath sprite disableAnimation?: boolean = false; // Animates frames or not repeat?: boolean = false; // Cycles animation From 81112eeabe67833d758bf3b5568cc895051e3c0f Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Wed, 10 Jul 2024 20:43:31 -0700 Subject: [PATCH 044/270] myster-encounter-intro.ts improve types and documentation --- src/field/mystery-encounter-intro.ts | 47 ++++++++++++++++++++++------ 1 file changed, 38 insertions(+), 9 deletions(-) diff --git a/src/field/mystery-encounter-intro.ts b/src/field/mystery-encounter-intro.ts index ef3baa17cdf..ab284d83fb4 100644 --- a/src/field/mystery-encounter-intro.ts +++ b/src/field/mystery-encounter-intro.ts @@ -2,19 +2,48 @@ import { GameObjects } from "phaser"; import BattleScene from "../battle-scene"; import MysteryEncounter from "../data/mystery-encounters/mystery-encounter"; -type KnownFileRoot = "trainer" | "pokemon" | "arenas" | "battle_anims" | "cg" | "character" | "effect" | "egg" | "events" | "inputs" | "items" | "mystery-encounters" | "pokeball" | "pokemon" | "statuses" | "trainer" | "ui"; +type KnownFileRoot = + | "trainer" + | "pokemon" + | "arenas" + | "battle_anims" + | "cg" + | "character" + | "effect" + | "egg" + | "events" + | "inputs" + | "items" + | "mystery-encounters" + | "pokeball" + | "pokemon" + | "statuses" + | "trainer" + | "ui"; export class MysteryEncounterSpriteConfig { - spriteKey: string; // e.g. "ace_trainer_f" - fileRoot: KnownFileRoot & string; // Refer to /public/images directory for the folder name - hasShadow?: boolean = false; // Spawns shadow underneath sprite - disableAnimation?: boolean = false; // Animates frames or not - repeat?: boolean = false; // Cycles animation + /** The sprite key (which is the image file name). e.g. "ace_trainer_f" */ + spriteKey: string; + /** Refer to [/public/images](../../public/images) directorty for all folder names */ + fileRoot: KnownFileRoot & string; + /** Enable shadow. Defaults to `false` */ + hasShadow?: boolean = false; + /** Disable animation. Defaults to `false` */ + disableAnimation?: boolean = false; + /** Depeat the animation. Defaults to `false` */ + repeat?: boolean = false; + /** Tint color. `0` - `1`. Higher means darker tint. */ tint?: number; - x?: number; // X offset - y?: number; // Y offset + /** X offset */ + x?: number; + /** Y offset */ + y?: number; + /** Sprite scale. `0` - `n` */ scale?: number; - isItem?: boolean; // For item sprites, set to true + /** If you are using an item sprite, set to `true` */ + isItem?: boolean; + /** The sprites alpha. `0` - `1` The lower the number, the more transparent */ + alpha?: number; } /** From 5ff1ae617dc7fb6ec144b9c2b2e225779f448414 Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Wed, 10 Jul 2024 20:54:55 -0700 Subject: [PATCH 045/270] add alpha config for myst-ec sprites --- src/field/mystery-encounter-intro.ts | 37 +++++++++++++++++----------- 1 file changed, 22 insertions(+), 15 deletions(-) diff --git a/src/field/mystery-encounter-intro.ts b/src/field/mystery-encounter-intro.ts index ab284d83fb4..3cdb6fad681 100644 --- a/src/field/mystery-encounter-intro.ts +++ b/src/field/mystery-encounter-intro.ts @@ -90,32 +90,34 @@ export default class MysteryEncounterIntroVisuals extends Phaser.GameObjects.Con const spacingValue = Math.round((maxX - minX) / Math.max(this.spriteConfigs.filter(s => !s.x && !s.y).length, 1)); this.spriteConfigs?.forEach((config) => { + const { spriteKey, isItem, hasShadow, scale, x, y, alpha } = config; + let sprite: GameObjects.Sprite; let tintSprite: GameObjects.Sprite; - if (!config.isItem) { - sprite = getSprite(config.spriteKey, config.hasShadow); - tintSprite = getSprite(config.spriteKey); + if (!isItem) { + sprite = getSprite(spriteKey, hasShadow); + tintSprite = getSprite(spriteKey); } else { - sprite = getItemSprite(config.spriteKey); - tintSprite = getItemSprite(config.spriteKey); + sprite = getItemSprite(spriteKey); + tintSprite = getItemSprite(spriteKey); } tintSprite.setVisible(false); - if (config.scale) { - sprite.setScale(config.scale); - tintSprite.setScale(config.scale); + if (scale) { + sprite.setScale(scale); + tintSprite.setScale(scale); } // Sprite offset from origin - if (config.x || config.y) { - if (config.x) { - sprite.setPosition(origin + config.x, sprite.y); - tintSprite.setPosition(origin + config.x, tintSprite.y); + if (x || y) { + if (x) { + sprite.setPosition(origin + x, sprite.y); + tintSprite.setPosition(origin + x, tintSprite.y); } - if (config.y) { - sprite.setPosition(sprite.x, config.y); - tintSprite.setPosition(tintSprite.x, config.y); + if (y) { + sprite.setPosition(sprite.x, y); + tintSprite.setPosition(tintSprite.x, y); } } else { // Single sprite @@ -130,6 +132,11 @@ export default class MysteryEncounterIntroVisuals extends Phaser.GameObjects.Con } } + if (alpha) { + sprite.setAlpha(alpha); + tintSprite.setAlpha(alpha); + } + this.add(sprite); this.add(tintSprite); }); From 0f9c0c5d24234efb85e8b8f7727c6ba86aa4e890 Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Thu, 11 Jul 2024 07:50:58 -0700 Subject: [PATCH 046/270] improve jsdocs in myster-encounter.ts --- src/data/mystery-encounters/mystery-encounter.ts | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/data/mystery-encounters/mystery-encounter.ts b/src/data/mystery-encounters/mystery-encounter.ts index 87b80aba321..8fcf2033b61 100644 --- a/src/data/mystery-encounters/mystery-encounter.ts +++ b/src/data/mystery-encounters/mystery-encounter.ts @@ -356,6 +356,7 @@ export class MysteryEncounterBuilder implements Partial { doEncounterExp?: (scene: BattleScene) => boolean; doEncounterRewards?: (scene: BattleScene) => boolean; onInit?: (scene: BattleScene) => boolean; + onDone?: (scene: BattleScene) => boolean; hideBattleIntroMessage?: boolean; hideIntroVisuals?: boolean; enemyPartyConfigs?: EnemyPartyConfig[] = []; @@ -374,8 +375,11 @@ export class MysteryEncounterBuilder implements Partial { } /** - * Defines an option for the encounter - * There should be at least 2 options defined and no more than 4 + * Defines an option for the encounter. + * Use for complex options. + * There should be at least 2 options defined and no more than 4. + * If easy/streamlined use {@linkcode MysteryEncounterBuilder.withOptionPhase} + * * @param option - MysteryEncounterOption to add, can use MysteryEncounterOptionBuilder to create instance * @returns */ @@ -391,8 +395,10 @@ export class MysteryEncounterBuilder implements Partial { } /** - * Adds a streamlined option phase. - * Only use if no pre-/post-options or condtions necessary. + * Defines an option + phasefor the encounter. + * Use for easy/streamlined options. + * There should be at least 2 options defined and no more than 4. + * If complex use {@linkcode MysteryEncounterBuilder.withOption} * * @param callback - OptionPhaseCallback * @returns From ef4222cbfaf869f2aedd01efc7cd6b1ee5cf3281 Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Thu, 11 Jul 2024 07:57:41 -0700 Subject: [PATCH 047/270] Lost at sea myster encounter MVP.... - filled some dialogue - add placeholders for the pokemons that can help - rename it to `Lost at Sea` (from Getting lost at the sea - add damage calculation for 3rd option --- ...ea-dialogue.ts => lost-at-sea-dialogue.ts} | 4 +- .../getting-lost-at-the-sea-encounter.ts | 45 -------- .../encounters/lost-at-sea-encounter.ts | 102 ++++++++++++++++++ .../mystery-encounter-dialogue.ts | 4 +- .../mystery-encounter-option.ts | 17 ++- .../mystery-encounter-requirements.ts | 12 ++- .../mystery-encounters/mystery-encounters.ts | 6 +- src/enums/mystery-encounter-type.ts | 2 +- src/locales/en/mystery-encounter.ts | 4 +- .../getting-lost-at-the-sea.ts | 25 ----- .../en/mystery-encounters/lost-at-sea.ts | 29 +++++ src/overrides.ts | 2 +- 12 files changed, 168 insertions(+), 84 deletions(-) rename src/data/mystery-encounters/dialogue/{getting-lost-at-the-sea-dialogue.ts => lost-at-sea-dialogue.ts} (89%) delete mode 100644 src/data/mystery-encounters/encounters/getting-lost-at-the-sea-encounter.ts create mode 100644 src/data/mystery-encounters/encounters/lost-at-sea-encounter.ts delete mode 100644 src/locales/en/mystery-encounters/getting-lost-at-the-sea.ts create mode 100644 src/locales/en/mystery-encounters/lost-at-sea.ts diff --git a/src/data/mystery-encounters/dialogue/getting-lost-at-the-sea-dialogue.ts b/src/data/mystery-encounters/dialogue/lost-at-sea-dialogue.ts similarity index 89% rename from src/data/mystery-encounters/dialogue/getting-lost-at-the-sea-dialogue.ts rename to src/data/mystery-encounters/dialogue/lost-at-sea-dialogue.ts index 9e008c93c57..1bfea19d83e 100644 --- a/src/data/mystery-encounters/dialogue/getting-lost-at-the-sea-dialogue.ts +++ b/src/data/mystery-encounters/dialogue/lost-at-sea-dialogue.ts @@ -1,8 +1,8 @@ import MysteryEncounterDialogue from "#app/data/mystery-encounters/mystery-encounter-dialogue"; -const namepsace = "mysteryEncounter:gettingLostAtTheSea"; +const namepsace = "mysteryEncounter:lostAtSea"; -export const GettingLostAtTheSeaDialogue: MysteryEncounterDialogue = { +export const LostAtSeaDialogue: MysteryEncounterDialogue = { intro: [ { text: `${namepsace}:intro` diff --git a/src/data/mystery-encounters/encounters/getting-lost-at-the-sea-encounter.ts b/src/data/mystery-encounters/encounters/getting-lost-at-the-sea-encounter.ts deleted file mode 100644 index 3b9b2366158..00000000000 --- a/src/data/mystery-encounters/encounters/getting-lost-at-the-sea-encounter.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { MysteryEncounterType } from "#enums/mystery-encounter-type"; -import BattleScene from "../../../battle-scene"; -import MysteryEncounter, { - MysteryEncounterBuilder, - MysteryEncounterTier, -} from "../mystery-encounter"; - -/** - * Getting lost at the sea encounter. - * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/9|GitHub Issue #9} - * @see {@linkcode MysteryEncounter|Dialogues} - * @see For biome requirements check [mysteryEncountersByBiome](../mystery-encounters.ts) - */ -export const GettingLostAtTheSeaEncounter: MysteryEncounter = - MysteryEncounterBuilder.withEncounterType( - MysteryEncounterType.GETTING_LOST_AT_THE_SEA - ) - .withEncounterTier(MysteryEncounterTier.COMMON) - .withIntroSpriteConfigs([ - { - fileRoot: "pokemon", - spriteKey: "130", // gyarados for now - hasShadow: false, - scale: 4, - y: 100, - x: 130, - tint: .25 - }, - ]) - .withSceneWaveRangeRequirement(11, 179) - .withOnInit((_scene: BattleScene) => { - console.log("GettingLostAtTheSeaEncounter OnInit"); - return true; - }) - .withOptionPhase(async (scene: BattleScene) => { - // OPTION 1 - }) - .withOptionPhase(async (scene: BattleScene) => { - // OPTION 2 - }) - .withOptionPhase(async (scene: BattleScene) => { - // OPTION 3 - return true; - }) - .build(); diff --git a/src/data/mystery-encounters/encounters/lost-at-sea-encounter.ts b/src/data/mystery-encounters/encounters/lost-at-sea-encounter.ts new file mode 100644 index 00000000000..d2c60762b2d --- /dev/null +++ b/src/data/mystery-encounters/encounters/lost-at-sea-encounter.ts @@ -0,0 +1,102 @@ +import { Type } from "#app/data/type.js"; +import { Species } from "#app/enums/species.js"; +import { PlayerPokemon } from "#app/field/pokemon.js"; +import { MysteryEncounterType } from "#enums/mystery-encounter-type"; +import BattleScene from "../../../battle-scene"; +import MysteryEncounter, { + MysteryEncounterBuilder, + MysteryEncounterTier, +} from "../mystery-encounter"; +import { MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; +import { leaveEncounterWithoutBattle } from "../mystery-encounter-utils"; + +const DAMAGE_PERCENTAGE: number = 30; // 0 - 100 + +/** + * Lost at sea encounter. + * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/9|GitHub Issue #9} + * @see For biome requirements check [mysteryEncountersByBiome](../mystery-encounters.ts) + */ +export const LostAtSeaEncounter: MysteryEncounter = + MysteryEncounterBuilder.withEncounterType( + MysteryEncounterType.LOST_AT_SEA + ) + .withEncounterTier(MysteryEncounterTier.COMMON) + .withIntroSpriteConfigs([ + { + fileRoot: "pokemon", + spriteKey: `${Species.GYARADOS}`, + hasShadow: false, + scale: 4, + y: 100, + x: 130, + tint: 0.75, + alpha: 0.25, + }, + ]) + .withSceneWaveRangeRequirement(11, 179) + .withOnInit((scene: BattleScene) => { + const party = scene.getParty(); + const { mysteryEncounter } = scene.currentBattle; + + mysteryEncounter.setDialogueToken( + "damagePercentage", + String(DAMAGE_PERCENTAGE) + ); + + // check for water pokemon + const waterPkm = findPokemonByType(party, Type.WATER); + mysteryEncounter.setDialogueToken("waterPkm", waterPkm?.name ?? ""); + + // check for flying pokemon + const flyingPkm = findPokemonByType(party, Type.FLYING); + mysteryEncounter.setDialogueToken( + "flyingPkm", + flyingPkm?.name ?? "" + ); + + return true; + }) + /** + * Option 1: Use a (non fainted) water pokemon to guide you back. + * Receives EXP similar to defeating a Lapras + */ + .withOption( + new MysteryEncounterOptionBuilder() + .withPokemonTypeRequirement(Type.WATER, true, 1) + .withOptionPhase(async (scene: BattleScene) => { + console.debug("Lost at sea: Option 1 - Water Pokemon"); + leaveEncounterWithoutBattle(scene); + }) + .build() + ) + /** + * Option 2: Use a (non fainted) flying pokemon to guide you back. + * Receives EXP similar to defeating a Lapras + */ + .withOption( + new MysteryEncounterOptionBuilder() + .withPokemonTypeRequirement(Type.FLYING, true, 1) + .withOptionPhase(async (scene: BattleScene) => { + console.debug("Lost at sea: Option 2 - Flying Pokemon"); + leaveEncounterWithoutBattle(scene); + }) + .build() + ) + /** + * Option 3: Wander aimlessly. All pokemons lose 30% of their HP (or KO on 0 HP). + */ + .withOptionPhase(async (scene: BattleScene) => { + const party = scene.getParty().filter((p) => !p.isFainted()); + party.forEach((pkm) => { + const damage = Math.round(pkm.getMaxHp() / 3); + pkm.hp = Math.min(pkm.hp, damage); + }); + leaveEncounterWithoutBattle(scene); + return true; + }) + .build(); + +const findPokemonByType = (party: PlayerPokemon[], type: Type) => { + return party.find((p) => p.getTypes(true).includes(type)); +}; diff --git a/src/data/mystery-encounters/mystery-encounter-dialogue.ts b/src/data/mystery-encounters/mystery-encounter-dialogue.ts index 6f8f6a844ed..aa04ea89e73 100644 --- a/src/data/mystery-encounters/mystery-encounter-dialogue.ts +++ b/src/data/mystery-encounters/mystery-encounter-dialogue.ts @@ -8,7 +8,7 @@ import { SleepingSnorlaxDialogue } from "./dialogue/sleeping-snorlax-dialogue"; import { DepartmentStoreSaleDialogue } from "#app/data/mystery-encounters/dialogue/department-store-sale-dialogue"; import { ShadyVitaminDealerDialogue } from "#app/data/mystery-encounters/dialogue/shady-vitamin-dealer"; import { TextStyle } from "#app/ui/text"; -import { GettingLostAtTheSeaDialogue } from "./dialogue/getting-lost-at-the-sea-dialogue"; +import { LostAtSeaDialogue } from "./dialogue/lost-at-sea-dialogue"; export class TextDisplay { speaker?: TemplateStringsArray | `mysteryEncounter:${string}`; @@ -93,5 +93,5 @@ export function initMysteryEncounterDialogue() { allMysteryEncounterDialogue[MysteryEncounterType.SLEEPING_SNORLAX] = SleepingSnorlaxDialogue; allMysteryEncounterDialogue[MysteryEncounterType.DEPARTMENT_STORE_SALE] = DepartmentStoreSaleDialogue; allMysteryEncounterDialogue[MysteryEncounterType.SHADY_VITAMIN_DEALER] = ShadyVitaminDealerDialogue; - allMysteryEncounterDialogue[MysteryEncounterType.GETTING_LOST_AT_THE_SEA] = GettingLostAtTheSeaDialogue; + allMysteryEncounterDialogue[MysteryEncounterType.LOST_AT_SEA] = LostAtSeaDialogue; } diff --git a/src/data/mystery-encounters/mystery-encounter-option.ts b/src/data/mystery-encounters/mystery-encounter-option.ts index f1316ff64f1..3fc04213d44 100644 --- a/src/data/mystery-encounters/mystery-encounter-option.ts +++ b/src/data/mystery-encounters/mystery-encounter-option.ts @@ -2,7 +2,8 @@ import { OptionTextDisplay } from "#app/data/mystery-encounters/mystery-encounte import { PlayerPokemon } from "#app/field/pokemon"; import BattleScene from "../../battle-scene"; import * as Utils from "../../utils"; -import { EncounterPokemonRequirement, EncounterSceneRequirement, MoneyRequirement } from "./mystery-encounter-requirements"; +import { Type } from "../type"; +import { EncounterPokemonRequirement, EncounterSceneRequirement, MoneyRequirement, TypeRequirement } from "./mystery-encounter-requirements"; export type OptionPhaseCallback = (scene: BattleScene) => Promise; @@ -158,6 +159,20 @@ export class MysteryEncounterOptionBuilder implements Partial> { this.secondaryPokemonRequirements.push(requirement); this.excludePrimaryFromSecondaryRequirements = excludePrimaryFromSecondaryRequirements; diff --git a/src/data/mystery-encounters/mystery-encounter-requirements.ts b/src/data/mystery-encounters/mystery-encounter-requirements.ts index 8781e5a4cdc..f31b37118ee 100644 --- a/src/data/mystery-encounters/mystery-encounter-requirements.ts +++ b/src/data/mystery-encounters/mystery-encounter-requirements.ts @@ -331,11 +331,13 @@ export class NatureRequirement extends EncounterPokemonRequirement { export class TypeRequirement extends EncounterPokemonRequirement { requiredType: Type[]; + excludeFainted: boolean; minNumberOfPokemon: number; invertQuery: boolean; - constructor(type: Type | Type[], minNumberOfPokemon: number = 1, invertQuery: boolean = false) { + constructor(type: Type | Type[], excludeFainted: boolean = true, minNumberOfPokemon: number = 1, invertQuery: boolean = false) { super(); + this.excludeFainted = excludeFainted; this.minNumberOfPokemon = minNumberOfPokemon; this.invertQuery = invertQuery; if (type instanceof Array) { @@ -347,10 +349,16 @@ export class TypeRequirement extends EncounterPokemonRequirement { } meetsRequirement(scene: BattleScene): boolean { - const partyPokemon = scene.getParty(); + let partyPokemon = scene.getParty(); + if (isNullOrUndefined(partyPokemon) || this?.requiredType?.length < 0) { return false; } + + if (!this.excludeFainted) { + partyPokemon = partyPokemon.filter((pokemon) => !pokemon.isFainted()); + } + return this.queryParty(partyPokemon).length >= this.minNumberOfPokemon; } diff --git a/src/data/mystery-encounters/mystery-encounters.ts b/src/data/mystery-encounters/mystery-encounters.ts index bb27426d798..e74101763fe 100644 --- a/src/data/mystery-encounters/mystery-encounters.ts +++ b/src/data/mystery-encounters/mystery-encounters.ts @@ -9,7 +9,7 @@ import { SleepingSnorlaxEncounter } from "./encounters/sleeping-snorlax"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { DepartmentStoreSaleEncounter } from "#app/data/mystery-encounters/encounters/department-store-sale"; import { ShadyVitaminDealerEncounter } from "#app/data/mystery-encounters/encounters/shady-vitamin-dealer"; -import { GettingLostAtTheSeaEncounter } from "./encounters/getting-lost-at-the-sea-encounter"; +import { LostAtSeaEncounter } from "./encounters/lost-at-sea-encounter"; // Spawn chance: (BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT + WIGHT_INCREMENT_ON_SPAWN_MISS * ) / 256 export const BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT = 1; @@ -42,7 +42,7 @@ export const mysteryEncountersByBiome = new Map([ ]], [Biome.SEA, [ - MysteryEncounterType.GETTING_LOST_AT_THE_SEA + MysteryEncounterType.LOST_AT_SEA ]], [Biome.SWAMP, []], [Biome.BEACH, [ @@ -98,7 +98,7 @@ export function initMysteryEncounters() { allMysteryEncounters[MysteryEncounterType.SLEEPING_SNORLAX] = SleepingSnorlaxEncounter; allMysteryEncounters[MysteryEncounterType.DEPARTMENT_STORE_SALE] = DepartmentStoreSaleEncounter; allMysteryEncounters[MysteryEncounterType.SHADY_VITAMIN_DEALER] = ShadyVitaminDealerEncounter; - allMysteryEncounters[MysteryEncounterType.GETTING_LOST_AT_THE_SEA] = GettingLostAtTheSeaEncounter; + allMysteryEncounters[MysteryEncounterType.LOST_AT_SEA] = LostAtSeaEncounter; // Append encounters that can occur in any biome to biome map const anyBiomeEncounters: MysteryEncounterType[] = Object.keys(MysteryEncounterType).filter(e => !isNaN(Number(e))).map(k => Number(k) as MysteryEncounterType); diff --git a/src/enums/mystery-encounter-type.ts b/src/enums/mystery-encounter-type.ts index 9a78bf1b3ea..2c467dc0873 100644 --- a/src/enums/mystery-encounter-type.ts +++ b/src/enums/mystery-encounter-type.ts @@ -7,5 +7,5 @@ export enum MysteryEncounterType { TRAINING_SESSION, DEPARTMENT_STORE_SALE, SHADY_VITAMIN_DEALER, - GETTING_LOST_AT_THE_SEA //might be generalized later on + LOST_AT_SEA //might be generalized later on } diff --git a/src/locales/en/mystery-encounter.ts b/src/locales/en/mystery-encounter.ts index 3ff720dae0b..180aa6dd2d8 100644 --- a/src/locales/en/mystery-encounter.ts +++ b/src/locales/en/mystery-encounter.ts @@ -1,4 +1,4 @@ -import { gettingLostAtTheSea } from "./mystery-encounters/getting-lost-at-the-sea"; +import { lostAtSea } from "./mystery-encounters/lost-at-sea"; /** * Patterns that can be used: @@ -181,5 +181,5 @@ export const mysteryEncounter = { "sleeping_snorlax_option_3_good_result": "Your @ec{option3PrimaryName} uses @ec{option3PrimaryMove}! @s{item_fanfare}It steals Leftovers off the sleeping Snorlax and you make out like bandits!", // "sleeping_snorlax_outro_win": "The mysterious challengers were defeated!", - gettingLostAtTheSea, + lostAtSea, } as const; diff --git a/src/locales/en/mystery-encounters/getting-lost-at-the-sea.ts b/src/locales/en/mystery-encounters/getting-lost-at-the-sea.ts deleted file mode 100644 index a9640a20490..00000000000 --- a/src/locales/en/mystery-encounters/getting-lost-at-the-sea.ts +++ /dev/null @@ -1,25 +0,0 @@ - -export const gettingLostAtTheSea = { - intro: "TBA: INTRO MESSAGE", - "title": "Getting lost at the sea", - "description": "You get lost. Certain Pokémons can help you get back on track unharmed.", - "query": "What will you do?", - option: { - 1: { - label: "Let (Water type) guide you back", //TODO: replace (Water type) with pokemon in team - tooltip: "Needs a Water type in the party. That PKMN earns EXP as if having defeated a Lapras.", - selected: "TBA: OPTION 1 SELECTED TEXT " - }, - 2: { - label: " Let (Flying type) guide you back", //TODO: replace (Flying type) with pokemon in team - tooltip: "Needs a Flying type in the party. That PKMN earns EXP as if having defeated a Lapras.", - selected: "TBA: OPTION 2 SELECTED TEXT " - }, - 3: { - label: "Wander aimlessly until you're back", - tooltip: "All your Pokémon lose 30% of their HP. Any below that are KO'd.", - selected: "TBA: OPTION 3 SELECTED TEXT " - } - }, - "outro": "TBA GETTING LOST AT SEA OUTRO MESSAGE", -}; diff --git a/src/locales/en/mystery-encounters/lost-at-sea.ts b/src/locales/en/mystery-encounters/lost-at-sea.ts new file mode 100644 index 00000000000..a5846acf058 --- /dev/null +++ b/src/locales/en/mystery-encounters/lost-at-sea.ts @@ -0,0 +1,29 @@ +export const lostAtSea = { + intro: "You are halucinating and starting to loose your bearings.", + title: "Lost at sea", + description: + "You get lost at sea. All you \"sea\" is water everywhere and the sun is burning bright. Certain Pokémons can help you get back on track unharmed.", + query: "What will you do?", + option: { + 1: { + label: "Use @ec{waterPkm}", // pkm has to be of type water + tooltip: + "Use @ec{waterPkm} to guide you back. @ec{waterPkm} earns EXP as if having defeated a Lapras.", + selected: "@ec{waterPkm} guides you back and earns EXP.", + }, + 2: { + label: "Use @ec{flyingPkm}", // pkm has to be of type water + tooltip: + "Use @ec{flyingPkm} to guide you back. @ec{flyingPkm} earns EXP as if having defeated a Lapras.", + selected: "@ec{flyingPkm} guides you back and earns EXP.", + }, + 3: { + label: "Wander aimlessly", + tooltip: + "Wander aimlessly until you're back. All your Pokémon lose @ec{damagePercentage}% of their HP. Any below that are KO'd.", + selected: + "You wander aimlessly around. After hours of wandering, you find your way back. You and your team take the toll.", + }, + }, + // outro: "TBA: OUTRO MESSAGE", +}; diff --git a/src/overrides.ts b/src/overrides.ts index 596ee8f20f1..0f2ff365ae1 100644 --- a/src/overrides.ts +++ b/src/overrides.ts @@ -120,7 +120,7 @@ export const EGG_GACHA_PULL_COUNT_OVERRIDE: number = 0; // 1 to 256, set to null to ignore export const MYSTERY_ENCOUNTER_RATE_OVERRIDE: number = 100000; export const MYSTERY_ENCOUNTER_TIER_OVERRIDE: MysteryEncounterTier = null; -export const MYSTERY_ENCOUNTER_OVERRIDE: MysteryEncounterType = MysteryEncounterType.GETTING_LOST_AT_THE_SEA; +export const MYSTERY_ENCOUNTER_OVERRIDE: MysteryEncounterType = MysteryEncounterType.LOST_AT_SEA; /** * MODIFIER / ITEM OVERRIDES From b7bf22e3e595741bbdbabd5932dee7561a447195 Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Thu, 11 Jul 2024 08:02:01 -0700 Subject: [PATCH 048/270] fix typo in myster-encounter-intro --- src/field/mystery-encounter-intro.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/field/mystery-encounter-intro.ts b/src/field/mystery-encounter-intro.ts index 3cdb6fad681..683170df4ac 100644 --- a/src/field/mystery-encounter-intro.ts +++ b/src/field/mystery-encounter-intro.ts @@ -30,7 +30,7 @@ export class MysteryEncounterSpriteConfig { hasShadow?: boolean = false; /** Disable animation. Defaults to `false` */ disableAnimation?: boolean = false; - /** Depeat the animation. Defaults to `false` */ + /** Repeat the animation. Defaults to `false` */ repeat?: boolean = false; /** Tint color. `0` - `1`. Higher means darker tint. */ tint?: number; From 524d4a4ca7571ebc3d55c254136d81c09dfa31c5 Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Thu, 11 Jul 2024 08:03:12 -0700 Subject: [PATCH 049/270] lost-at-sea ME: fix using DAMAGE_PERCENTAGE for damage calculation --- src/data/mystery-encounters/encounters/lost-at-sea-encounter.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 d2c60762b2d..0e906bb60c4 100644 --- a/src/data/mystery-encounters/encounters/lost-at-sea-encounter.ts +++ b/src/data/mystery-encounters/encounters/lost-at-sea-encounter.ts @@ -89,7 +89,7 @@ export const LostAtSeaEncounter: MysteryEncounter = .withOptionPhase(async (scene: BattleScene) => { const party = scene.getParty().filter((p) => !p.isFainted()); party.forEach((pkm) => { - const damage = Math.round(pkm.getMaxHp() / 3); + const damage = Math.round(pkm.getMaxHp() / (DAMAGE_PERCENTAGE / 100)); pkm.hp = Math.min(pkm.hp, damage); }); leaveEncounterWithoutBattle(scene); From 93fbb0e401a7a354ca31133d6b28e56d2230d172 Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Thu, 11 Jul 2024 08:04:33 -0700 Subject: [PATCH 050/270] add jsdoc to lost-at-sea-encounter --- .../encounters/lost-at-sea-encounter.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) 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 0e906bb60c4..28a8c572872 100644 --- a/src/data/mystery-encounters/encounters/lost-at-sea-encounter.ts +++ b/src/data/mystery-encounters/encounters/lost-at-sea-encounter.ts @@ -10,6 +10,11 @@ import MysteryEncounter, { import { MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; import { leaveEncounterWithoutBattle } from "../mystery-encounter-utils"; +/** + * Damage percentage taken when wandering aimlessly. + * Can be a number between `0` - `100`. + * The higher the more damage taken (100% = instant KO). + */ const DAMAGE_PERCENTAGE: number = 30; // 0 - 100 /** @@ -18,9 +23,7 @@ const DAMAGE_PERCENTAGE: number = 30; // 0 - 100 * @see For biome requirements check [mysteryEncountersByBiome](../mystery-encounters.ts) */ export const LostAtSeaEncounter: MysteryEncounter = - MysteryEncounterBuilder.withEncounterType( - MysteryEncounterType.LOST_AT_SEA - ) + MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.LOST_AT_SEA) .withEncounterTier(MysteryEncounterTier.COMMON) .withIntroSpriteConfigs([ { From 810c50cda27b5359add24eabc752beff37df0ffb Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Thu, 11 Jul 2024 11:40:07 -0400 Subject: [PATCH 051/270] new Field Trip encounter and add EXP gains to other encounters --- public/images/mystery-encounters/teacher.json | 41 ++++ public/images/mystery-encounters/teacher.png | Bin 0 -> 727 bytes .../dialogue/field-trip-dialogue.ts | 50 ++++ .../dialogue/shady-vitamin-dealer.ts | 4 +- .../encounters/department-store-sale.ts | 3 +- .../encounters/field-trip-encounter.ts | 220 ++++++++++++++++++ .../encounters/shady-vitamin-dealer.ts | 97 ++++++-- .../encounters/sleeping-snorlax.ts | 23 +- .../mystery-encounter-dialogue.ts | 2 + .../mystery-encounter-option.ts | 24 +- .../mystery-encounter-utils.ts | 7 +- .../mystery-encounters/mystery-encounter.ts | 7 +- .../mystery-encounters/mystery-encounters.ts | 2 + src/enums/mystery-encounter-type.ts | 3 +- src/locales/en/mystery-encounter.ts | 35 ++- src/overrides.ts | 7 +- src/phases.ts | 1 + src/ui/mystery-encounter-ui-handler.ts | 33 ++- 18 files changed, 495 insertions(+), 64 deletions(-) create mode 100644 public/images/mystery-encounters/teacher.json create mode 100644 public/images/mystery-encounters/teacher.png create mode 100644 src/data/mystery-encounters/dialogue/field-trip-dialogue.ts create mode 100644 src/data/mystery-encounters/encounters/field-trip-encounter.ts diff --git a/public/images/mystery-encounters/teacher.json b/public/images/mystery-encounters/teacher.json new file mode 100644 index 00000000000..881386d7228 --- /dev/null +++ b/public/images/mystery-encounters/teacher.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "teacher.png", + "format": "RGBA8888", + "size": { + "w": 43, + "h": 74 + }, + "scale": 1, + "frames": [ + { + "filename": "Spr_HGSS_Teacher.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 19, + "y": 8, + "w": 41, + "h": 72 + }, + "frame": { + "x": 1, + "y": 1, + "w": 41, + "h": 72 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:506e5a4ce79c134a7b4af90a90aef244:1b81d3d84bf12cedc419805eaff82548:59bc5dd000b5e72588320b473e31c312$" + } +} diff --git a/public/images/mystery-encounters/teacher.png b/public/images/mystery-encounters/teacher.png new file mode 100644 index 0000000000000000000000000000000000000000..b4332bc0032ccd93ec4319f4a1172e5bb676bcf7 GIT binary patch literal 727 zcmV;|0x127P)z5oCJY(`#A00001 zbW%=J06^y0W&i*H32;bRa{vGf6951U69E94oEQKA0zgSbK~zY`z1EGAqaY9jU>gJk zg1rCRZqI<4Tq2sfy`yS38~wH!ej=Hs|JY`2_vErH{B^14O-h?Fq|Gc_!)50uSbD2h`;Pajl)9EFxrdi0=*R8iKopcYvc zS-o>xN|GXCO>-*qD0c#T*Miq|Nk#Y2`P#*euBG4;jWIq2%h=?nQQ8o~LF?mzBe+!z zbV-}@hT}upjzL`_6+~L+XhXG)u8$a>?37tj%Kbh2cQqWAvmf$qYlvC7_G`t~PHEE` z<4#Sep+;S2uj6vL)@+Z_a6Ek`jQ2G+T8#yBpJKPsl-Q_Yifo`%s{w-M+Lz@*&NZkd ztsa&%vkzF8bAGW?U`O8cSg}5n8V|<)K?MhIB#8A^I9TwF;15>r@RrwCwO+3v18=*h zV`#XAwR*vWf4x~WYlw|Gf?@N!)nLP2K*`awXT_YLlVD!dR7;s9nem^Bn2Zj>i)9I# zM002ov JPDHLkV1m$-S=|5t literal 0 HcmV?d00001 diff --git a/src/data/mystery-encounters/dialogue/field-trip-dialogue.ts b/src/data/mystery-encounters/dialogue/field-trip-dialogue.ts new file mode 100644 index 00000000000..dca3f48f5bf --- /dev/null +++ b/src/data/mystery-encounters/dialogue/field-trip-dialogue.ts @@ -0,0 +1,50 @@ +import MysteryEncounterDialogue from "#app/data/mystery-encounters/mystery-encounter-dialogue"; + +export const FieldTripDialogue: MysteryEncounterDialogue = { + intro: [ + { + text: "mysteryEncounter:field_trip_intro_message" + }, + { + text: "mysteryEncounter:field_trip_intro_dialogue", + speaker: "mysteryEncounter:field_trip_speaker" + } + ], + encounterOptionsDialogue: { + title: "mysteryEncounter:field_trip_title", + description: "mysteryEncounter:field_trip_description", + query: "mysteryEncounter:field_trip_query", + options: [ + { + buttonLabel: "mysteryEncounter:field_trip_option_1_label", + buttonTooltip: "mysteryEncounter:field_trip_option_1_tooltip", + secondOptionPrompt: "mysteryEncounter:field_trip_second_option_prompt", + selected: [ + { + text: "mysteryEncounter:field_trip_option_selected" + } + ] + }, + { + buttonLabel: "mysteryEncounter:field_trip_option_2_label", + buttonTooltip: "mysteryEncounter:field_trip_option_2_tooltip", + secondOptionPrompt: "mysteryEncounter:field_trip_second_option_prompt", + selected: [ + { + text: "mysteryEncounter:field_trip_option_selected" + } + ] + }, + { + buttonLabel: "mysteryEncounter:field_trip_option_3_label", + buttonTooltip: "mysteryEncounter:field_trip_option_3_tooltip", + secondOptionPrompt: "mysteryEncounter:field_trip_second_option_prompt", + selected: [ + { + text: "mysteryEncounter:field_trip_option_selected" + } + ] + } + ] + } +}; diff --git a/src/data/mystery-encounters/dialogue/shady-vitamin-dealer.ts b/src/data/mystery-encounters/dialogue/shady-vitamin-dealer.ts index cb0c5ac130e..52b9741caf8 100644 --- a/src/data/mystery-encounters/dialogue/shady-vitamin-dealer.ts +++ b/src/data/mystery-encounters/dialogue/shady-vitamin-dealer.ts @@ -21,7 +21,7 @@ export const ShadyVitaminDealerDialogue: MysteryEncounterDialogue = { selected: [ { text: "mysteryEncounter:shady_vitamin_dealer_option_selected" - }, + } ] }, { @@ -30,7 +30,7 @@ export const ShadyVitaminDealerDialogue: MysteryEncounterDialogue = { selected: [ { text: "mysteryEncounter:shady_vitamin_dealer_option_selected" - }, + } ] }, { diff --git a/src/data/mystery-encounters/encounters/department-store-sale.ts b/src/data/mystery-encounters/encounters/department-store-sale.ts index 1d44c2b3af8..19269a774f3 100644 --- a/src/data/mystery-encounters/encounters/department-store-sale.ts +++ b/src/data/mystery-encounters/encounters/department-store-sale.ts @@ -1,5 +1,5 @@ import { - leaveEncounterWithoutBattle, setEncounterExp, + leaveEncounterWithoutBattle, setEncounterRewards, } from "#app/data/mystery-encounters/mystery-encounter-utils"; import { modifierTypes } from "#app/modifier/modifier-type"; @@ -46,7 +46,6 @@ export const DepartmentStoreSaleEncounter: MysteryEncounter = MysteryEncounterBu i++; } - setEncounterExp(scene, scene.getParty().map(p => p.id), 300); setEncounterRewards(scene, { guaranteedModifierTypeFuncs: modifiers, fillRemaining: false }); leaveEncounterWithoutBattle(scene); }) diff --git a/src/data/mystery-encounters/encounters/field-trip-encounter.ts b/src/data/mystery-encounters/encounters/field-trip-encounter.ts new file mode 100644 index 00000000000..410df127b6e --- /dev/null +++ b/src/data/mystery-encounters/encounters/field-trip-encounter.ts @@ -0,0 +1,220 @@ +import { generateModifierTypeOption, leaveEncounterWithoutBattle, selectPokemonForOption, setEncounterExp, setEncounterRewards, } from "#app/data/mystery-encounters/mystery-encounter-utils"; +import { modifierTypes } from "#app/modifier/modifier-type"; +import { MysteryEncounterType } from "#enums/mystery-encounter-type"; +import BattleScene from "../../../battle-scene"; +import MysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier } from "../mystery-encounter"; +import { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; +import { PlayerPokemon, PokemonMove } from "#app/field/pokemon"; +import { OptionSelectItem } from "#app/ui/abstact-option-select-ui-handler"; +import { MoveCategory } from "#app/data/move"; +import { TempBattleStat } from "#app/data/temp-battle-stat"; + +export const FieldTripEncounter: MysteryEncounter = MysteryEncounterBuilder + .withEncounterType(MysteryEncounterType.FIELD_TRIP) + .withEncounterTier(MysteryEncounterTier.COMMON) + .withIntroSpriteConfigs([ + { + spriteKey: "preschooler_m", + fileRoot: "trainer", + hasShadow: true + }, + { + spriteKey: "teacher", + fileRoot: "mystery-encounters", + hasShadow: true + }, + { + spriteKey: "preschooler_f", + fileRoot: "trainer", + hasShadow: true + }, + ]) + .withHideIntroVisuals(false) + .withSceneWaveRangeRequirement(10, 180) + .withOption(new MysteryEncounterOptionBuilder() + .withPreOptionPhase(async (scene: BattleScene): Promise => { + const encounter = scene.currentBattle.mysteryEncounter; + const onPokemonSelected = (pokemon: PlayerPokemon) => { + // Return the options for Pokemon move valid for this option + return pokemon.moveset.map((move: PokemonMove) => { + const option: OptionSelectItem = { + label: move.getName(), + handler: () => { + // Pokemon and move selected + const correctMove = move.getMove().category === MoveCategory.PHYSICAL; + encounter.setDialogueToken("moveCategory", "Physical"); + if (!correctMove) { + encounter.dialogue.encounterOptionsDialogue.options[0].selected = [ + { + text: "mysteryEncounter:field_trip_option_incorrect", + speaker: "mysteryEncounter:field_trip_speaker" + }, + { + text: "mysteryEncounter:field_trip_lesson_learned", + } + ]; + setEncounterExp(scene, scene.getParty().map(p => p.id), 50); + } else { + encounter.setDialogueToken("pokeName", pokemon.name); + encounter.setDialogueToken("move", move.getName()); + encounter.dialogue.encounterOptionsDialogue.options[0].selected = [ + { + text: "mysteryEncounter:field_trip_option_selected" + } + ]; + setEncounterExp(scene, [pokemon.id], 100); + } + encounter.misc = { + correctMove: correctMove + }; + return true; + } + }; + return option; + }); + }; + + return selectPokemonForOption(scene, onPokemonSelected); + }) + .withOptionPhase(async (scene: BattleScene) => { + 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) + ]; + + setEncounterRewards(scene, { guaranteedModifierTypeOptions: modifiers, fillRemaining: false }); + } + + leaveEncounterWithoutBattle(scene, !encounter.misc.correctMove); + }) + .build() + ) + .withOption(new MysteryEncounterOptionBuilder() + .withPreOptionPhase(async (scene: BattleScene): Promise => { + const encounter = scene.currentBattle.mysteryEncounter; + const onPokemonSelected = (pokemon: PlayerPokemon) => { + // Return the options for Pokemon move valid for this option + return pokemon.moveset.map((move: PokemonMove) => { + const option: OptionSelectItem = { + label: move.getName(), + handler: () => { + // Pokemon and move selected + const correctMove = move.getMove().category === MoveCategory.SPECIAL; + encounter.setDialogueToken("moveCategory", "Special"); + if (!correctMove) { + encounter.dialogue.encounterOptionsDialogue.options[1].selected = [ + { + text: "mysteryEncounter:field_trip_option_incorrect", + speaker: "mysteryEncounter:field_trip_speaker" + }, + { + text: "mysteryEncounter:field_trip_lesson_learned", + } + ]; + setEncounterExp(scene, scene.getParty().map(p => p.id), 50); + } else { + encounter.setDialogueToken("pokeName", pokemon.name); + encounter.setDialogueToken("move", move.getName()); + encounter.dialogue.encounterOptionsDialogue.options[1].selected = [ + { + text: "mysteryEncounter:field_trip_option_selected" + } + ]; + setEncounterExp(scene, [pokemon.id], 100); + } + encounter.misc = { + correctMove: correctMove + }; + return true; + } + }; + return option; + }); + }; + + return selectPokemonForOption(scene, onPokemonSelected); + }) + .withOptionPhase(async (scene: BattleScene) => { + 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) + ]; + + setEncounterRewards(scene, { guaranteedModifierTypeOptions: modifiers, fillRemaining: false }); + } + + leaveEncounterWithoutBattle(scene, !encounter.misc.correctMove); + }) + .build() + ) + .withOption(new MysteryEncounterOptionBuilder() + .withPreOptionPhase(async (scene: BattleScene): Promise => { + const encounter = scene.currentBattle.mysteryEncounter; + const onPokemonSelected = (pokemon: PlayerPokemon) => { + // Return the options for Pokemon move valid for this option + return pokemon.moveset.map((move: PokemonMove) => { + const option: OptionSelectItem = { + label: move.getName(), + handler: () => { + // Pokemon and move selected + const correctMove = move.getMove().category === MoveCategory.STATUS; + encounter.setDialogueToken("moveCategory", "Status"); + if (!correctMove) { + encounter.dialogue.encounterOptionsDialogue.options[2].selected = [ + { + text: "mysteryEncounter:field_trip_option_incorrect", + speaker: "mysteryEncounter:field_trip_speaker" + }, + { + text: "mysteryEncounter:field_trip_lesson_learned", + } + ]; + setEncounterExp(scene, scene.getParty().map(p => p.id), 50); + } else { + encounter.setDialogueToken("pokeName", pokemon.name); + encounter.setDialogueToken("move", move.getName()); + encounter.dialogue.encounterOptionsDialogue.options[2].selected = [ + { + text: "mysteryEncounter:field_trip_option_selected" + } + ]; + setEncounterExp(scene, [pokemon.id], 100); + } + encounter.misc = { + correctMove: correctMove + }; + return true; + } + }; + return option; + }); + }; + + return selectPokemonForOption(scene, onPokemonSelected); + }) + .withOptionPhase(async (scene: BattleScene) => { + 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) + ]; + + setEncounterRewards(scene, { guaranteedModifierTypeOptions: modifiers, fillRemaining: false }); + } + + leaveEncounterWithoutBattle(scene, !encounter.misc.correctMove); + }) + .build() + ) + .build(); diff --git a/src/data/mystery-encounters/encounters/shady-vitamin-dealer.ts b/src/data/mystery-encounters/encounters/shady-vitamin-dealer.ts index d58bc44daf7..21e1b199e04 100644 --- a/src/data/mystery-encounters/encounters/shady-vitamin-dealer.ts +++ b/src/data/mystery-encounters/encounters/shady-vitamin-dealer.ts @@ -1,9 +1,8 @@ import { - generateModifierType, + generateModifierTypeOption, leaveEncounterWithoutBattle, queueEncounterMessage, - selectPokemonForOption, - setEncounterRewards, + selectPokemonForOption, setEncounterExp, updatePlayerMoney, } from "#app/data/mystery-encounters/mystery-encounter-utils"; import { StatusEffect } from "#app/data/status-effect"; @@ -18,6 +17,7 @@ import { MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; import { MoneyRequirement } from "../mystery-encounter-requirements"; +import i18next from "i18next"; export const ShadyVitaminDealerEncounter: MysteryEncounter = MysteryEncounterBuilder .withEncounterType(MysteryEncounterType.SHADY_VITAMIN_DEALER) @@ -43,7 +43,7 @@ export const ShadyVitaminDealerEncounter: MysteryEncounter = MysteryEncounterBui .withPrimaryPokemonStatusEffectRequirement([StatusEffect.NONE]) // Pokemon must not have status .withPrimaryPokemonHealthRatioRequirement([0.34, 1]) // Pokemon must have above 1/3rd HP .withOption(new MysteryEncounterOptionBuilder() - .withSceneMoneyRequirement(0, 2) // Wave scaling multiplier of 2 for cost + .withSceneMoneyRequirement(0, 2) // Wave scaling money multiplier of 2 .withPreOptionPhase(async (scene: BattleScene): Promise => { const encounter = scene.currentBattle.mysteryEncounter; const onPokemonSelected = (pokemon: PlayerPokemon) => { @@ -51,8 +51,8 @@ export const ShadyVitaminDealerEncounter: MysteryEncounter = MysteryEncounterBui 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) + generateModifierTypeOption(scene, modifierTypes.BASE_STAT_BOOSTER).type, + generateModifierTypeOption(scene, modifierTypes.BASE_STAT_BOOSTER).type ]; encounter.setDialogueToken("boost1", modifiers[0].name); encounter.setDialogueToken("boost2", modifiers[1].name); @@ -62,12 +62,12 @@ export const ShadyVitaminDealerEncounter: MysteryEncounter = MysteryEncounterBui }; }; - // Only Pokemon that can gain benefits are unfainted with no status + // Only Pokemon that can gain benefits are above 1/3rd HP with no status const selectableFilter = (pokemon: Pokemon) => { // If pokemon meets primary pokemon reqs, it can be selected const meetsReqs = encounter.pokemonMeetsPrimaryRequirements(scene, pokemon); if (!meetsReqs) { - return "Pokémon must be healthy enough."; + return i18next.t("mysteryEncounter:shady_vitamin_dealer_invalid_selection"); } return null; @@ -99,7 +99,7 @@ export const ShadyVitaminDealerEncounter: MysteryEncounter = MysteryEncounterBui chosenPokemon.hp = Math.max(chosenPokemon.hp - damage, 0); // Roll for poison (80%) - if (randSeedInt(10) < 10) { + if (randSeedInt(10) < 8) { if (chosenPokemon.trySetStatus(StatusEffect.TOXIC)) { // Toxic applied queueEncounterMessage(scene, "mysteryEncounter:shady_vitamin_dealer_bad_poison"); @@ -111,32 +111,81 @@ export const ShadyVitaminDealerEncounter: MysteryEncounter = MysteryEncounterBui queueEncounterMessage(scene, "mysteryEncounter:shady_vitamin_dealer_damage_only"); } + setEncounterExp(scene, [chosenPokemon.id], 100); + chosenPokemon.updateInfo(); }) .build()) - .withOption(new MysteryEncounterOptionBuilder() - .withSceneMoneyRequirement(0, 5) // Wave scaling multiplier of 2 for cost + .withSceneMoneyRequirement(0, 5) // Wave scaling money multiplier of 5 + .withPreOptionPhase(async (scene: BattleScene): Promise => { + const encounter = scene.currentBattle.mysteryEncounter; + const onPokemonSelected = (pokemon: PlayerPokemon) => { + // Update money + updatePlayerMoney(scene, -(encounter.options[1].requirements[0] as MoneyRequirement).requiredMoney); + // Calculate modifiers and dialogue tokens + const modifiers = [ + generateModifierTypeOption(scene, modifierTypes.BASE_STAT_BOOSTER).type, + generateModifierTypeOption(scene, modifierTypes.BASE_STAT_BOOSTER).type + ]; + encounter.setDialogueToken("boost1", modifiers[0].name); + encounter.setDialogueToken("boost2", modifiers[1].name); + encounter.misc = { + chosenPokemon: pokemon, + modifiers: modifiers + }; + }; + + // Only Pokemon that can gain benefits are above 1/3rd HP with no status + const selectableFilter = (pokemon: Pokemon) => { + // If pokemon meets primary pokemon reqs, it can be selected + const meetsReqs = encounter.pokemonMeetsPrimaryRequirements(scene, pokemon); + if (!meetsReqs) { + return i18next.t("mysteryEncounter:shady_vitamin_dealer_invalid_selection"); + } + + return null; + }; + + return selectPokemonForOption(scene, onPokemonSelected, null, selectableFilter); + }) .withOptionPhase(async (scene: BattleScene) => { // Choose Expensive Option - const modifiers = []; - let i = 0; - while (i < 3) { - // 2/1 weight on base stat booster vs PP Up - const roll = randSeedInt(3); - if (roll === 0) { - modifiers.push(modifierTypes.PP_UP); - } else { + const encounter = scene.currentBattle.mysteryEncounter; + const chosenPokemon = encounter.misc.chosenPokemon; + const modifiers = encounter.misc.modifiers; - } - i++; + for (const modType of modifiers) { + const modifier = modType.newModifier(chosenPokemon); + await scene.addModifier(modifier, true, false, false, true); } + scene.updateModifiers(true); - setEncounterRewards(scene, { guaranteedModifierTypeFuncs: modifiers, fillRemaining: false }); leaveEncounterWithoutBattle(scene); }) - .build() - ) + .withPostOptionPhase(async (scene: BattleScene) => { + // Status applied after dealer leaves (to make thematic sense) + const encounter = scene.currentBattle.mysteryEncounter; + const chosenPokemon = encounter.misc.chosenPokemon; + + // Roll for poison (20%) + if (randSeedInt(10) < 2) { + if (chosenPokemon.trySetStatus(StatusEffect.POISON)) { + // Poison applied + queueEncounterMessage(scene, "mysteryEncounter:shady_vitamin_dealer_poison"); + } else { + // Pokemon immune or something else prevents status + queueEncounterMessage(scene, "mysteryEncounter:shady_vitamin_dealer_no_bad_effects"); + } + } else { + queueEncounterMessage(scene, "mysteryEncounter:shady_vitamin_dealer_no_bad_effects"); + } + + setEncounterExp(scene, [chosenPokemon.id], 100); + + chosenPokemon.updateInfo(); + }) + .build()) .withOptionPhase(async (scene: BattleScene) => { // Leave encounter with no rewards or exp leaveEncounterWithoutBattle(scene, true); diff --git a/src/data/mystery-encounters/encounters/sleeping-snorlax.ts b/src/data/mystery-encounters/encounters/sleeping-snorlax.ts index 1a011bb05a0..cb2029272ef 100644 --- a/src/data/mystery-encounters/encounters/sleeping-snorlax.ts +++ b/src/data/mystery-encounters/encounters/sleeping-snorlax.ts @@ -1,5 +1,4 @@ import { - ModifierTypeOption, modifierTypes } from "#app/modifier/modifier-type"; import { BerryType } from "#enums/berry-type"; @@ -15,9 +14,9 @@ import { MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; import { MoveRequirement } from "../mystery-encounter-requirements"; import { EnemyPartyConfig, - EnemyPokemonConfig, generateModifierType, + EnemyPokemonConfig, generateModifierTypeOption, initBattleWithEnemyConfig, - leaveEncounterWithoutBattle, queueEncounterMessage, + leaveEncounterWithoutBattle, queueEncounterMessage, setEncounterExp, setEncounterRewards } from "../mystery-encounter-utils"; @@ -30,7 +29,9 @@ export const SleepingSnorlaxEncounter: MysteryEncounter = MysteryEncounterBuilde fileRoot: "pokemon", hasShadow: true, tint: 0.25, - repeat: true + scale: 1.5, + repeat: true, + y: 5 } ]) .withSceneWaveRangeRequirement(10, 180) // waves 10 to 180 @@ -66,16 +67,19 @@ export const SleepingSnorlaxEncounter: MysteryEncounter = MysteryEncounterBuilde scene.executeWithSeedOffset(() => { roll = Utils.randSeedInt(16, 0); }, scene.currentBattle.waveIndex); - console.log(roll); + + // Half Snorlax exp to entire party + setEncounterExp(scene, scene.getParty().map(p => p.id), 98); + if (roll > 4) { // Fall asleep and get a sitrus berry (75%) const p = instance.primaryPokemon; p.status = new Status(StatusEffect.SLEEP, 0, 3); p.updateInfo(true); // const sitrus = (modifierTypes.BERRY?.() as ModifierTypeGenerator).generateType(scene.getParty(), [BerryType.SITRUS]); - const sitrus = generateModifierType(scene, modifierTypes.BERRY, [BerryType.SITRUS]); + const sitrus = generateModifierTypeOption(scene, modifierTypes.BERRY, [BerryType.SITRUS]); - setEncounterRewards(scene, { guaranteedModifierTypeOptions: [new ModifierTypeOption(sitrus, 0)], fillRemaining: false }); + setEncounterRewards(scene, { guaranteedModifierTypeOptions: [sitrus], fillRemaining: false }); queueEncounterMessage(scene, "mysteryEncounter:sleeping_snorlax_option_2_bad_result"); leaveEncounterWithoutBattle(scene); } else { @@ -96,9 +100,12 @@ export const SleepingSnorlaxEncounter: MysteryEncounter = MysteryEncounterBuilde .withOption(new MysteryEncounterOptionBuilder() .withPrimaryPokemonRequirement(new MoveRequirement([Moves.PLUCK, Moves.COVET, Moves.KNOCK_OFF, Moves.THIEF, Moves.TRICK, Moves.SWITCHEROO])) .withOptionPhase(async (scene: BattleScene) => { - // Leave encounter with no rewards or exp + // Steal the Snorlax's Leftovers + const instance = scene.currentBattle.mysteryEncounter; setEncounterRewards(scene, { guaranteedModifierTypeFuncs: [modifierTypes.LEFTOVERS], fillRemaining: false }); queueEncounterMessage(scene, "mysteryEncounter:sleeping_snorlax_option_3_good_result"); + // Snorlax exp to Pokemon that did the stealing + setEncounterExp(scene, [instance.primaryPokemon.id], 189); leaveEncounterWithoutBattle(scene); }) .build() diff --git a/src/data/mystery-encounters/mystery-encounter-dialogue.ts b/src/data/mystery-encounters/mystery-encounter-dialogue.ts index 1e2dfe85045..5129f3bf23e 100644 --- a/src/data/mystery-encounters/mystery-encounter-dialogue.ts +++ b/src/data/mystery-encounters/mystery-encounter-dialogue.ts @@ -8,6 +8,7 @@ import { SleepingSnorlaxDialogue } from "./dialogue/sleeping-snorlax-dialogue"; import { DepartmentStoreSaleDialogue } from "#app/data/mystery-encounters/dialogue/department-store-sale-dialogue"; import { ShadyVitaminDealerDialogue } from "#app/data/mystery-encounters/dialogue/shady-vitamin-dealer"; import { TextStyle } from "#app/ui/text"; +import { FieldTripDialogue } from "#app/data/mystery-encounters/dialogue/field-trip-dialogue"; export class TextDisplay { speaker?: TemplateStringsArray | `mysteryEncounter:${string}`; @@ -92,4 +93,5 @@ export function initMysteryEncounterDialogue() { allMysteryEncounterDialogue[MysteryEncounterType.SLEEPING_SNORLAX] = SleepingSnorlaxDialogue; allMysteryEncounterDialogue[MysteryEncounterType.DEPARTMENT_STORE_SALE] = DepartmentStoreSaleDialogue; allMysteryEncounterDialogue[MysteryEncounterType.SHADY_VITAMIN_DEALER] = ShadyVitaminDealerDialogue; + allMysteryEncounterDialogue[MysteryEncounterType.FIELD_TRIP] = FieldTripDialogue; } diff --git a/src/data/mystery-encounters/mystery-encounter-option.ts b/src/data/mystery-encounters/mystery-encounter-option.ts index f1316ff64f1..7731468a977 100644 --- a/src/data/mystery-encounters/mystery-encounter-option.ts +++ b/src/data/mystery-encounters/mystery-encounter-option.ts @@ -3,6 +3,7 @@ import { PlayerPokemon } from "#app/field/pokemon"; import BattleScene from "../../battle-scene"; import * as Utils from "../../utils"; import { EncounterPokemonRequirement, EncounterSceneRequirement, MoneyRequirement } from "./mystery-encounter-requirements"; +import { isNullOrUndefined } from "../../utils"; export type OptionPhaseCallback = (scene: BattleScene) => Promise; @@ -14,6 +15,12 @@ export default interface MysteryEncounterOption { primaryPokemon?: PlayerPokemon; secondaryPokemon?: PlayerPokemon[]; excludePrimaryFromSecondaryRequirements?: boolean; + /** + * There are two modes of option requirements: + * 1 (DEFAULT): Option is completely disabled if requirements are not met (unselectable and greyed out) + * 2: Option is *NOT* disabled if requirements are not met + */ + isDisabledOnRequirementsNotMet?: boolean; /** * Dialogue object containing all the dialogue, messages, tooltips, etc. for this option @@ -33,12 +40,19 @@ export default class MysteryEncounterOption implements MysteryEncounterOption { constructor(option: MysteryEncounterOption) { Object.assign(this, option); this.requirements = this.requirements ? this.requirements : []; + this.primaryPokemonRequirements = this.primaryPokemonRequirements ? this.primaryPokemonRequirements : []; + this.secondaryPokemonRequirements = this.secondaryPokemonRequirements ? this.secondaryPokemonRequirements : []; + this.isDisabledOnRequirementsNotMet = isNullOrUndefined(this.isDisabledOnRequirementsNotMet) ? true : this.isDisabledOnRequirementsNotMet; + } + + hasRequirements?() { + return this.requirements.length > 0 || this.primaryPokemonRequirements.length > 0 || this.secondaryPokemonRequirements.length > 0; } meetsRequirements?(scene: BattleScene) { return !this.requirements.some(requirement => !requirement.meetsRequirement(scene)) && - this.meetsPrimaryRequirementAndPrimaryPokemonSelected(scene) && - this.meetsSupportingRequirementAndSupportingPokemonSelected(scene); + this.meetsSupportingRequirementAndSupportingPokemonSelected(scene) && + this.meetsPrimaryRequirementAndPrimaryPokemonSelected(scene); } meetsPrimaryRequirementAndPrimaryPokemonSelected?(scene: BattleScene) { @@ -124,6 +138,7 @@ export class MysteryEncounterOptionBuilder implements Partial> { + this.isDisabledOnRequirementsNotMet = disabled; + return Object.assign(this, { isDisabledOnRequirementsNotMet: this.isDisabledOnRequirementsNotMet }); + } } diff --git a/src/data/mystery-encounters/mystery-encounter-utils.ts b/src/data/mystery-encounters/mystery-encounter-utils.ts index 2d8d7bfbf66..d2e1a5eba2f 100644 --- a/src/data/mystery-encounters/mystery-encounter-utils.ts +++ b/src/data/mystery-encounters/mystery-encounter-utils.ts @@ -8,7 +8,7 @@ import { TrainerConfig, trainerConfigs, TrainerSlot } from "../trainer-config"; import Pokemon, { FieldPosition, PlayerPokemon } from "#app/field/pokemon"; import Trainer, { TrainerVariant } from "../../field/trainer"; import { ExpBalanceModifier, ExpShareModifier, MultipleParticipantExpBonusModifier, PokemonExpBoosterModifier } from "#app/modifier/modifier"; -import { CustomModifierSettings, getModifierPoolForType, ModifierPoolType, ModifierType, ModifierTypeFunc, ModifierTypeGenerator, modifierTypes, PokemonHeldItemModifierType, regenerateModifierPoolThresholds } from "#app/modifier/modifier-type"; +import { CustomModifierSettings, getModifierPoolForType, ModifierPoolType, ModifierType, ModifierTypeFunc, ModifierTypeGenerator, ModifierTypeOption, modifierTypes, PokemonHeldItemModifierType, regenerateModifierPoolThresholds } from "#app/modifier/modifier-type"; import { BattleEndPhase, EggLapsePhase, ExpPhase, ModifierRewardPhase, SelectModifierPhase, ShowPartyExpBarPhase, TrainerVictoryPhase } from "#app/phases"; import { MysteryEncounterBattlePhase, MysteryEncounterRewardsPhase } from "#app/phases/mystery-encounter-phase"; import * as Utils from "../../utils"; @@ -443,7 +443,7 @@ 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 { +export function generateModifierTypeOption(scene: BattleScene, modifier: () => ModifierType, pregenArgs?: any[]): ModifierTypeOption { const modifierId = Object.keys(modifierTypes).find(k => modifierTypes[k] === modifier); let result: ModifierType = modifierTypes[modifierId]?.(); @@ -463,7 +463,7 @@ export function generateModifierType(scene: BattleScene, modifier: () => Modifie }); result = result instanceof ModifierTypeGenerator ? result.generateType(scene.getParty(), pregenArgs) : result; - return result; + return new ModifierTypeOption(result, 0); } /** @@ -593,6 +593,7 @@ export function setEncounterRewards(scene: BattleScene, customShopRewards?: Cust * 290 - trio legendaries * 340 - box legendaries * 608 - Blissey (highest in game) + * https://bulbapedia.bulbagarden.net/wiki/List_of_Pok%C3%A9mon_by_effort_value_yield_(Generation_IX) * @param useWaveIndex - set to false when directly passing the the full exp value instead of baseExpValue */ export function setEncounterExp(scene: BattleScene, participantIds: integer[], baseExpValue: number, useWaveIndex: boolean = true) { diff --git a/src/data/mystery-encounters/mystery-encounter.ts b/src/data/mystery-encounters/mystery-encounter.ts index 87b80aba321..0d656988009 100644 --- a/src/data/mystery-encounters/mystery-encounter.ts +++ b/src/data/mystery-encounters/mystery-encounter.ts @@ -120,6 +120,7 @@ export default interface MysteryEncounter { /** * Generic property to set any custom data required for the encounter + * Extremely useful for carrying state/data between onPreOptionPhase/onOptionPhase/onPostOptionPhase */ misc?: any; } @@ -276,6 +277,7 @@ export default class MysteryEncounter implements MysteryEncounter { * For multiple support pokemon in the dialogue token, it will have to be overridden. */ populateDialogueTokensFromRequirements?(scene: BattleScene) { + this.meetsRequirements(scene); if (this.requirements?.length > 0) { for (const req of this.requirements) { const dialogueToken = req.getDialogueToken(scene); @@ -304,6 +306,7 @@ export default class MysteryEncounter implements MysteryEncounter { // Dialogue tokens for options for (let i = 0; i < this.options.length; i++) { const opt = this.options[i]; + opt.meetsRequirements(scene); const j = i + 1; if (opt.requirements?.length > 0) { for (const req of opt.requirements) { @@ -316,7 +319,7 @@ export default class MysteryEncounter implements MysteryEncounter { for (const req of opt.primaryPokemonRequirements) { if (!req.invertQuery) { const value = req.getDialogueToken(scene, opt.primaryPokemon); - this.setDialogueToken("option" + j + "Primary", value[1]); + this.setDialogueToken("option" + j + "Primary" + this.capitalizeFirstLetter(value[0]), value[1]); } } } @@ -325,7 +328,7 @@ export default class MysteryEncounter implements MysteryEncounter { for (const req of opt.secondaryPokemonRequirements) { if (!req.invertQuery) { const value = req.getDialogueToken(scene, opt.secondaryPokemon[0]); - this.setDialogueToken("option" + j + "Secondary", value[1]); + this.setDialogueToken("option" + j + "Secondary" + this.capitalizeFirstLetter(value[0]), value[1]); } } } diff --git a/src/data/mystery-encounters/mystery-encounters.ts b/src/data/mystery-encounters/mystery-encounters.ts index e4a748d3a23..a1f8a73192e 100644 --- a/src/data/mystery-encounters/mystery-encounters.ts +++ b/src/data/mystery-encounters/mystery-encounters.ts @@ -9,6 +9,7 @@ import { SleepingSnorlaxEncounter } from "./encounters/sleeping-snorlax"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { DepartmentStoreSaleEncounter } from "#app/data/mystery-encounters/encounters/department-store-sale"; import { ShadyVitaminDealerEncounter } from "#app/data/mystery-encounters/encounters/shady-vitamin-dealer"; +import { FieldTripEncounter } from "#app/data/mystery-encounters/encounters/field-trip-encounter"; // Spawn chance: (BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT + WIGHT_INCREMENT_ON_SPAWN_MISS * ) / 256 export const BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT = 1; @@ -95,6 +96,7 @@ export function initMysteryEncounters() { allMysteryEncounters[MysteryEncounterType.SLEEPING_SNORLAX] = SleepingSnorlaxEncounter; allMysteryEncounters[MysteryEncounterType.DEPARTMENT_STORE_SALE] = DepartmentStoreSaleEncounter; allMysteryEncounters[MysteryEncounterType.SHADY_VITAMIN_DEALER] = ShadyVitaminDealerEncounter; + allMysteryEncounters[MysteryEncounterType.FIELD_TRIP] = FieldTripEncounter; // Append encounters that can occur in any biome to biome map const anyBiomeEncounters: MysteryEncounterType[] = Object.keys(MysteryEncounterType).filter(e => !isNaN(Number(e))).map(k => Number(k) as MysteryEncounterType); diff --git a/src/enums/mystery-encounter-type.ts b/src/enums/mystery-encounter-type.ts index 6e2815babca..b5b0144c3be 100644 --- a/src/enums/mystery-encounter-type.ts +++ b/src/enums/mystery-encounter-type.ts @@ -6,5 +6,6 @@ export enum MysteryEncounterType { SLEEPING_SNORLAX, TRAINING_SESSION, DEPARTMENT_STORE_SALE, - SHADY_VITAMIN_DEALER + SHADY_VITAMIN_DEALER, + FIELD_TRIP } diff --git a/src/locales/en/mystery-encounter.ts b/src/locales/en/mystery-encounter.ts index ac04eed2688..59fcf6940c2 100644 --- a/src/locales/en/mystery-encounter.ts +++ b/src/locales/en/mystery-encounter.ts @@ -17,6 +17,7 @@ export const mysteryEncounter: SimpleTranslationEntries = { "unit_test_dialogue": "@ec{test}@ec{test} @ec{test@ec{test}} @ec{test1} @ec{test\} @ec{test\\} @ec{test\\\} {test}", // Mystery Encounters -- Common Tier + "mysterious_chest_intro_message": "You found...@d{32} a chest?", "mysterious_chest_title": "The Mysterious Chest", "mysterious_chest_description": "A beautifully ornamented chest stands on the ground. There must be something good inside... right?", @@ -82,6 +83,7 @@ export const mysteryEncounter: SimpleTranslationEntries = { "shady_vitamin_dealer_title": "The Vitamin Dealer", "shady_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.", "shady_vitamin_dealer_query": "Which deal will choose?", + "shady_vitamin_dealer_invalid_selection": "Pokémon must be healthy enough.", "shady_vitamin_dealer_option_1_label": "The Cheap Deal", "shady_vitamin_dealer_option_1_tooltip": "(-) Pay @ec{option1Money}\n(-) Side Effects?\n(+) Chosen Pokémon Gains 2 Random Vitamins", "shady_vitamin_dealer_option_2_label": "The Pricey Deal", @@ -94,9 +96,34 @@ export const mysteryEncounter: SimpleTranslationEntries = { $Your @ec{selectedPokemon} takes some damage\nand becomes badly poisoned...`, "shady_vitamin_dealer_poison": `But the medicine had some side effects! $Your @ec{selectedPokemon} becomes poisoned...`, + "shady_vitamin_dealer_no_bad_effects": "Looks like there were no side-effects this time.", "shady_vitamin_dealer_option_3_label": "Leave", "shady_vitamin_dealer_option_3_tooltip": "(-) No Rewards", - "shady_vitamin_dealer_outro_good": "Looks like there were no side-effects this time.", + + "field_trip_intro_message": "It's a teacher and some school children!", + "field_trip_speaker": "Teacher", + "field_trip_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?`, + "field_trip_title": "Field Trip", + "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.", + "field_trip_query": "Which move category will you show off?", + // "field_trip_invalid_selection": "Pokémon doesn't know that type of move.", + "field_trip_option_1_label": "A Physical Move", + "field_trip_option_1_tooltip": "(+) Physical Item Rewards", + "field_trip_option_2_label": "A Special Move", + "field_trip_option_2_tooltip": "(+) Special Item Rewards", + "field_trip_option_3_label": "A Status Move", + "field_trip_option_3_tooltip": "(+) Status Item Rewards", + "field_trip_second_option_prompt": "Choose a move for your Pokémon to use.", + "field_trip_option_selected": "@ec{pokeName} shows off an awesome display of @ec{move}!", + "field_trip_option_incorrect": `... + $That isn't a @ec{moveCategory} move! + $I'm sorry, but I can't give you anything.`, + "field_trip_lesson_learned": `Looks like you learned a valuable lesson? + $Your Pokémon also gained some knowledge.`, + "field_trip_outro_good": "Thank you so much for your kindness!\nI hope the items I had were helpful!", + "field_trip_outro_bad": "Come along children, we'll\nfind a better demonstration elsewhere.", // Mystery Encounters -- Uncommon Tier @@ -162,14 +189,14 @@ export const mysteryEncounter: SimpleTranslationEntries = { "sleeping_snorlax_intro_message": `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.`, "sleeping_snorlax_title": "Sleeping Snorlax", - "sleeping_snorlax_description": "You could attack it to try and get it to move, or simply wait for it to wake up.", + "sleeping_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...", "sleeping_snorlax_query": "What will you do?", "sleeping_snorlax_option_1_label": "Fight it", "sleeping_snorlax_option_1_tooltip": "(-) Fight Sleeping Snorlax", "sleeping_snorlax_option_2_label": "Wait for it to move", "sleeping_snorlax_option_2_tooltip": "@[SUMMARY_BLUE]{(75%) Wait a short time}\n@[SUMMARY_BLUE]{(25%) Wait a long time}", - "sleeping_snorlax_option_3_label": "Steal", - "sleeping_snorlax_option_3_tooltip": "(+) Leftovers", + "sleeping_snorlax_option_3_label": "Steal its item", + "sleeping_snorlax_option_3_tooltip": "(+) @ec{option3PrimaryName} uses @ec{option3PrimaryMove}\n(+) Leftovers", "sleeping_snorlax_option_3_disabled_tooltip": "Your Pokémon need to know certain moves to choose this", "sleeping_snorlax_option_1_selected_message": "You approach the\nPokémon without fear.", "sleeping_snorlax_option_2_selected_message": `.@d{32}.@d{32}.@d{32} diff --git a/src/overrides.ts b/src/overrides.ts index ce706173691..e19a5bf20dd 100644 --- a/src/overrides.ts +++ b/src/overrides.ts @@ -8,18 +8,17 @@ import { PokeballCounts } from "./battle-scene"; import { PokeballType } from "./data/pokeball"; import { Gender } from "./data/gender"; import { StatusEffect } from "./data/status-effect"; -import { SpeciesStatBoosterItem, modifierTypes } from "./modifier/modifier-type"; +import { modifierTypes, SpeciesStatBoosterItem } from "./modifier/modifier-type"; import { VariantTier } from "./enums/variant-tiers"; import { EggTier } from "#enums/egg-type"; -import { allSpecies } from "./data/pokemon-species"; // eslint-disable-line @typescript-eslint/no-unused-vars import { Abilities } from "#enums/abilities"; import { BerryType } from "#enums/berry-type"; import { Biome } from "#enums/biome"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { TimeOfDay } from "#enums/time-of-day"; -import {MysteryEncounterType} from "#enums/mystery-encounter-type"; // eslint-disable-line @typescript-eslint/no-unused-vars -import {MysteryEncounterTier} from "#app/data/mystery-encounters/mystery-encounter"; // eslint-disable-line @typescript-eslint/no-unused-vars +import { MysteryEncounterType } from "#enums/mystery-encounter-type"; // eslint-disable-line @typescript-eslint/no-unused-vars +import { MysteryEncounterTier } from "#app/data/mystery-encounters/mystery-encounter"; // eslint-disable-line @typescript-eslint/no-unused-vars /** * Overrides for testing different in game situations diff --git a/src/phases.ts b/src/phases.ts index 091629b31d5..6c64cc9454f 100644 --- a/src/phases.ts +++ b/src/phases.ts @@ -5363,6 +5363,7 @@ export class SelectModifierPhase extends BattlePhase { this.scene.ui.revertMode(); this.scene.ui.setMode(Mode.MESSAGE); super.end(); + break; } modifierType = typeOptions[cursor].type; break; diff --git a/src/ui/mystery-encounter-ui-handler.ts b/src/ui/mystery-encounter-ui-handler.ts index 163d79784f8..8be862b965d 100644 --- a/src/ui/mystery-encounter-ui-handler.ts +++ b/src/ui/mystery-encounter-ui-handler.ts @@ -1,16 +1,16 @@ import BattleScene from "../battle-scene"; -import {addBBCodeTextObject, getBBCodeFrag, TextStyle} from "./text"; -import {Mode} from "./ui"; +import { addBBCodeTextObject, getBBCodeFrag, TextStyle } from "./text"; +import { Mode } from "./ui"; import UiHandler from "./ui-handler"; -import {Button} from "#enums/buttons"; -import {addWindow, WindowVariant} from "./ui-theme"; -import {MysteryEncounterPhase} from "../phases/mystery-encounter-phase"; -import {PartyUiMode} from "./party-ui-handler"; +import { Button } from "#enums/buttons"; +import { addWindow, WindowVariant } from "./ui-theme"; +import { MysteryEncounterPhase } from "../phases/mystery-encounter-phase"; +import { PartyUiMode } from "./party-ui-handler"; import MysteryEncounterOption from "../data/mystery-encounters/mystery-encounter-option"; import * as Utils from "../utils"; -import {isNullOrUndefined} from "../utils"; -import {getPokeballAtlasKey} from "../data/pokeball"; -import {getEncounterText} from "#app/data/mystery-encounters/mystery-encounter-utils"; +import { isNullOrUndefined } from "../utils"; +import { getPokeballAtlasKey } from "../data/pokeball"; +import { getEncounterText } from "#app/data/mystery-encounters/mystery-encounter-utils"; export default class MysteryEncounterUiHandler extends UiHandler { private cursorContainer: Phaser.GameObjects.Container; @@ -319,13 +319,22 @@ export default class MysteryEncounterUiHandler extends UiHandler { optionText = addBBCodeTextObject(this.scene, i % 2 === 0 ? 0 : 100, i < 2 ? 0 : 16, "-", TextStyle.WINDOW, { wordWrap: { width: 558 }, fontSize: "80px", lineSpacing: -8 }); break; } - const option = mysteryEncounter.dialogue.encounterOptionsDialogue.options[i]; - const text = getEncounterText(this.scene, option.buttonLabel, option.style ? option.style : TextStyle.WINDOW); + this.optionsMeetsReqs.push(this.filteredEncounterOptions[i].meetsRequirements(this.scene)); + + const optionDialogue = mysteryEncounter.dialogue.encounterOptionsDialogue.options[i]; + let text; + if (this.filteredEncounterOptions[i].hasRequirements() && this.optionsMeetsReqs[i]) { + // Options with special requirements that are met are automatically colored green + text = getEncounterText(this.scene, optionDialogue.buttonLabel, TextStyle.SUMMARY_GREEN); + } else { + text = getEncounterText(this.scene, optionDialogue.buttonLabel, optionDialogue.style ? optionDialogue.style : TextStyle.WINDOW); + } + if (text) { optionText.setText(text); } - this.optionsMeetsReqs.push(this.filteredEncounterOptions[i].meetsRequirements(this.scene)); + if (!this.optionsMeetsReqs[i]) { optionText.setAlpha(0.5); From 47f12b665b07413850192e8de46a0a46689f4db4 Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Thu, 11 Jul 2024 09:23:43 -0700 Subject: [PATCH 052/270] ME: add damage/heal application utils --- .../mystery-encounter-utils.ts | 53 ++++++++++++++++++- 1 file changed, 51 insertions(+), 2 deletions(-) diff --git a/src/data/mystery-encounters/mystery-encounter-utils.ts b/src/data/mystery-encounters/mystery-encounter-utils.ts index 2d8d7bfbf66..00e6eb90040 100644 --- a/src/data/mystery-encounters/mystery-encounter-utils.ts +++ b/src/data/mystery-encounters/mystery-encounter-utils.ts @@ -1,4 +1,4 @@ -import i18next from "i18next"; +import i18next, { ParseKeys } from "i18next"; import { BattleType } from "#app/battle"; import BattleScene from "../../battle-scene"; import PokemonSpecies, { getPokemonSpecies, speciesStarters } from "../pokemon-species"; @@ -179,7 +179,7 @@ function getTextWithDialogueTokens(scene: BattleScene, textKey: TemplateStringsA return null; } - let textString: string = i18next.t(textKey); + let textString: string = i18next.t(textKey as ParseKeys); // Apply dialogue tokens const dialogueTokens = scene.currentBattle?.mysteryEncounter?.dialogueTokens; @@ -821,3 +821,52 @@ export function calculateMEAggregateStats(scene: BattleScene, baseSpawnWeight: n console.log(`Starting weight: ${baseSpawnWeight}\nAverage MEs per run: ${totalMean}\nStandard Deviation: ${totalStd}\nAvg Commons: ${commonMean}\nAvg Uncommons: ${uncommonMean}\nAvg Rares: ${rareMean}\nAvg Super Rares: ${superRareMean}`); } + +/** + * Handles applying hp changes to a player pokemon. + * Takes care of not going below `0`, above max-hp, adding `FNT` status correctly and updating the pokemon info. + * TODO: handle special cases like wonder-guard/ninjask + * + * @param pokemon the player pokemon to apply the hp change to + * @param damage the hp change amount. Positive for heal. Negative for damage + * + */ +function applyHpChangeToPokemon(pokemon: PlayerPokemon, value: number) { + const hpChange = Math.round(pokemon.hp + value); + const nextHp = Math.max(Math.min(hpChange, pokemon.getMaxHp()), 0); + if (nextHp === 0) { + koPlayerPokemon(pokemon); + } else { + pokemon.hp = nextHp; + } +} + +/** + * Handles applying damage to a player pokemon + * + * @param pokemon the player pokemon to apply damage to + * @param damage the amount of damage to apply + * @see {@linkcode applyHpChangeToPokemon} + */ +export function applyDamageToPokemon(pokemon: PlayerPokemon, damage: number) { + if (damage <= 0) { + console.warn("Healing pokemon with `applyDamageToPokemon` is not recommended! Please use `applyHealToPokemon` instead."); + } + + applyHpChangeToPokemon(pokemon, -damage); +} + +/** + * Handles applying heal to a player pokemon + * + * @param pokemon the player pokemon to apply heal to + * @param heal the amount of heal to apply + * @see {@linkcode applyHpChangeToPokemon} + */ +export function applyHealToPokemon(pokemon: PlayerPokemon, heal: number) { + if (heal <= 0) { + console.warn("Damaging pokemong with `applyHealToPokemon` is not recommended! Please use `applyDamageToPokemon` instead."); + } + + applyHpChangeToPokemon(pokemon, heal); +} From 85df834811e4c0dad0a8394de9960a5bd02ff580 Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Thu, 11 Jul 2024 09:35:15 -0700 Subject: [PATCH 053/270] optimize mystery-encounter-utils.setEncounterExp() --- src/data/mystery-encounters/mystery-encounter-utils.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/data/mystery-encounters/mystery-encounter-utils.ts b/src/data/mystery-encounters/mystery-encounter-utils.ts index 00e6eb90040..2f9f3eb8a45 100644 --- a/src/data/mystery-encounters/mystery-encounter-utils.ts +++ b/src/data/mystery-encounters/mystery-encounter-utils.ts @@ -582,7 +582,7 @@ export function setEncounterRewards(scene: BattleScene, customShopRewards?: Cust * Will initialize exp phases into the phase queue (these are in addition to any combat or other exp earned) * Exp Share and Exp Balance will still function as normal * @param scene - Battle Scene - * @param participantIds - ids of party pokemon that get full exp value. Other party members will receive Exp Share amounts + * @param participantId - ids of party pokemon that get full exp value. Other party members will receive Exp Share amounts * @param baseExpValue - gives exp equivalent to a pokemon of the wave index's level. * Guidelines: * 36 - Sunkern (lowest in game) @@ -595,7 +595,8 @@ export function setEncounterRewards(scene: BattleScene, customShopRewards?: Cust * 608 - Blissey (highest in game) * @param useWaveIndex - set to false when directly passing the the full exp value instead of baseExpValue */ -export function setEncounterExp(scene: BattleScene, participantIds: integer[], baseExpValue: number, useWaveIndex: boolean = true) { +export function setEncounterExp(scene: BattleScene, participantId: integer | integer[], baseExpValue: number, useWaveIndex: boolean = true) { + const participantIds = Array.isArray(participantId) ? participantId : [participantId]; scene.currentBattle.mysteryEncounter.doEncounterExp = (scene: BattleScene) => { const party = scene.getParty(); const expShareModifier = scene.findModifier(m => m instanceof ExpShareModifier) as ExpShareModifier; From 5a79b50f1dca55cad11605381c7d52698bf5cb0d Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Thu, 11 Jul 2024 10:30:26 -0700 Subject: [PATCH 054/270] lost at sea encounter finishing touches --- .../dialogue/lost-at-sea-dialogue.ts | 9 +-- .../encounters/lost-at-sea-encounter.ts | 77 ++++++++++++++----- .../en/mystery-encounters/lost-at-sea.ts | 3 +- 3 files changed, 61 insertions(+), 28 deletions(-) diff --git a/src/data/mystery-encounters/dialogue/lost-at-sea-dialogue.ts b/src/data/mystery-encounters/dialogue/lost-at-sea-dialogue.ts index 1bfea19d83e..3e0e69c1a97 100644 --- a/src/data/mystery-encounters/dialogue/lost-at-sea-dialogue.ts +++ b/src/data/mystery-encounters/dialogue/lost-at-sea-dialogue.ts @@ -5,8 +5,8 @@ const namepsace = "mysteryEncounter:lostAtSea"; export const LostAtSeaDialogue: MysteryEncounterDialogue = { intro: [ { - text: `${namepsace}:intro` - } + text: `${namepsace}:intro`, + }, ], encounterOptionsDialogue: { title: `${namepsace}:title`, @@ -42,9 +42,4 @@ export const LostAtSeaDialogue: MysteryEncounterDialogue = { }, ], }, - outro: [ - { - text: `${namepsace}:outro`, - }, - ], }; 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 28a8c572872..fb902bb9958 100644 --- a/src/data/mystery-encounters/encounters/lost-at-sea-encounter.ts +++ b/src/data/mystery-encounters/encounters/lost-at-sea-encounter.ts @@ -8,7 +8,11 @@ import MysteryEncounter, { MysteryEncounterTier, } from "../mystery-encounter"; import { MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; -import { leaveEncounterWithoutBattle } from "../mystery-encounter-utils"; +import { + applyDamageToPokemon, + leaveEncounterWithoutBattle, + setEncounterExp, +} from "../mystery-encounter-utils"; /** * Damage percentage taken when wandering aimlessly. @@ -17,9 +21,12 @@ import { leaveEncounterWithoutBattle } from "../mystery-encounter-utils"; */ const DAMAGE_PERCENTAGE: number = 30; // 0 - 100 +let waterPkm: PlayerPokemon; +let flyingPkm: PlayerPokemon; + /** * Lost at sea encounter. - * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/9|GitHub Issue #9} + * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/9 | GitHub Issue #9} * @see For biome requirements check [mysteryEncountersByBiome](../mystery-encounters.ts) */ export const LostAtSeaEncounter: MysteryEncounter = @@ -39,7 +46,9 @@ export const LostAtSeaEncounter: MysteryEncounter = ]) .withSceneWaveRangeRequirement(11, 179) .withOnInit((scene: BattleScene) => { - const party = scene.getParty(); + const allowedPokemon = scene + .getParty() + .filter((p) => p.isAllowedInBattle()); const { mysteryEncounter } = scene.currentBattle; mysteryEncounter.setDialogueToken( @@ -48,11 +57,11 @@ export const LostAtSeaEncounter: MysteryEncounter = ); // check for water pokemon - const waterPkm = findPokemonByType(party, Type.WATER); + waterPkm = findPokemonByType(allowedPokemon, Type.WATER); mysteryEncounter.setDialogueToken("waterPkm", waterPkm?.name ?? ""); // check for flying pokemon - const flyingPkm = findPokemonByType(party, Type.FLYING); + flyingPkm = findPokemonByType(allowedPokemon, Type.FLYING); mysteryEncounter.setDialogueToken( "flyingPkm", flyingPkm?.name ?? "" @@ -67,10 +76,9 @@ export const LostAtSeaEncounter: MysteryEncounter = .withOption( new MysteryEncounterOptionBuilder() .withPokemonTypeRequirement(Type.WATER, true, 1) - .withOptionPhase(async (scene: BattleScene) => { - console.debug("Lost at sea: Option 1 - Water Pokemon"); - leaveEncounterWithoutBattle(scene); - }) + .withOptionPhase(async (scene: BattleScene) => + handleGuidingOption(scene, waterPkm) + ) .build() ) /** @@ -80,26 +88,57 @@ export const LostAtSeaEncounter: MysteryEncounter = .withOption( new MysteryEncounterOptionBuilder() .withPokemonTypeRequirement(Type.FLYING, true, 1) - .withOptionPhase(async (scene: BattleScene) => { - console.debug("Lost at sea: Option 2 - Flying Pokemon"); - leaveEncounterWithoutBattle(scene); - }) + .withOptionPhase(async (scene: BattleScene) => + handleGuidingOption(scene, flyingPkm) + ) .build() ) /** * Option 3: Wander aimlessly. All pokemons lose 30% of their HP (or KO on 0 HP). */ .withOptionPhase(async (scene: BattleScene) => { - const party = scene.getParty().filter((p) => !p.isFainted()); - party.forEach((pkm) => { - const damage = Math.round(pkm.getMaxHp() / (DAMAGE_PERCENTAGE / 100)); - pkm.hp = Math.min(pkm.hp, damage); + const allowedPokemon = scene + .getParty() + .filter((p) => p.isAllowedInBattle()); + + allowedPokemon.forEach((pkm) => { + const percentage = DAMAGE_PERCENTAGE / 100; + const damage = Math.floor(pkm.getMaxHp() * percentage); + return applyDamageToPokemon(pkm, damage); }); leaveEncounterWithoutBattle(scene); return true; }) .build(); -const findPokemonByType = (party: PlayerPokemon[], type: Type) => { +/** + * Find a pokemon inside the given party by a given type + * + * @param party player pokemon party + * @param type type to search for + * @returns + */ +function findPokemonByType(party: PlayerPokemon[], type: Type) { return party.find((p) => p.getTypes(true).includes(type)); -}; +} + +/** + * Generic handler for using a guiding pokemon to guide you back. + * + * @param scene Battle scene + * @param guidePokemon pokemon choosen as a guide + */ +function handleGuidingOption(scene: BattleScene, guidePokemon: PlayerPokemon) { + /** Base EXP value for guiding pokemon. Currently Lapras base-value */ + const baseExpValue: number = 187; + + if (guidePokemon) { + setEncounterExp(scene, guidePokemon.id, baseExpValue, true); + } else { + console.warn( + "Lost at sea: No guide pokemon found but pokemon guides player. huh!?" + ); + } + + leaveEncounterWithoutBattle(scene); +} diff --git a/src/locales/en/mystery-encounters/lost-at-sea.ts b/src/locales/en/mystery-encounters/lost-at-sea.ts index a5846acf058..e4ea07c77ad 100644 --- a/src/locales/en/mystery-encounters/lost-at-sea.ts +++ b/src/locales/en/mystery-encounters/lost-at-sea.ts @@ -12,7 +12,7 @@ export const lostAtSea = { selected: "@ec{waterPkm} guides you back and earns EXP.", }, 2: { - label: "Use @ec{flyingPkm}", // pkm has to be of type water + label: "Use @ec{flyingPkm}", // pkm has to be of type flying tooltip: "Use @ec{flyingPkm} to guide you back. @ec{flyingPkm} earns EXP as if having defeated a Lapras.", selected: "@ec{flyingPkm} guides you back and earns EXP.", @@ -25,5 +25,4 @@ export const lostAtSea = { "You wander aimlessly around. After hours of wandering, you find your way back. You and your team take the toll.", }, }, - // outro: "TBA: OUTRO MESSAGE", }; From f128b47db5dcd279ce76143c6c2d008f5f9fa04e Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Thu, 11 Jul 2024 14:37:29 -0400 Subject: [PATCH 055/270] update encounter biome mapping and option coloring/disablement with requirements --- .../mystery-encounters/mad_scientist_m.json | 10 +- .../mystery-encounters/mad_scientist_m.png | Bin 13992 -> 920 bytes public/images/mystery-encounters/teacher.json | 2 +- src/battle-scene.ts | 2 +- .../encounters/fight-or-flight.ts | 96 ++++---- .../encounters/sleeping-snorlax.ts | 4 +- .../mystery-encounters/mystery-encounters.ts | 218 ++++++++++++++---- .../requirements/requirement-groups.ts | 42 ++++ src/locales/en/mystery-encounter.ts | 4 +- src/ui/mystery-encounter-ui-handler.ts | 10 +- 10 files changed, 276 insertions(+), 112 deletions(-) create mode 100644 src/data/mystery-encounters/requirements/requirement-groups.ts diff --git a/public/images/mystery-encounters/mad_scientist_m.json b/public/images/mystery-encounters/mad_scientist_m.json index 0cb3f904cb0..10aa3d6f42a 100644 --- a/public/images/mystery-encounters/mad_scientist_m.json +++ b/public/images/mystery-encounters/mad_scientist_m.json @@ -4,8 +4,8 @@ "image": "mad_scientist_m.png", "format": "RGBA8888", "size": { - "w": 44, - "h": 74 + "w": 46, + "h": 76 }, "scale": 1, "frames": [ @@ -24,8 +24,8 @@ "h": 74 }, "frame": { - "x": 0, - "y": 0, + "x": 1, + "y": 1, "w": 44, "h": 74 } @@ -36,6 +36,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:895f0a79b89fa0fb44167f4584fd9a22:357b46953b7e17c6b2f43a62d52855d8:cc1ed0e4f90aaa9dcf1b39a0af1283b0$" + "smartupdate": "$TexturePacker:SmartUpdate:a7f8ff2bbb362868f51125c254eb6681:cf76e61ddd31a8f46af67ced168c44a2:4fc09abe16c0608828269e5da81d0744$" } } diff --git a/public/images/mystery-encounters/mad_scientist_m.png b/public/images/mystery-encounters/mad_scientist_m.png index 84349b46c8a9ab6a3dcf29de3b67f42631c38547..453cb767ec14c4032d52ba665cb23381b8ebf280 100644 GIT binary patch literal 920 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 0) { - // Use first valid pokemon to execute the theivery - const pokemon = validPokemon[0]; - encounter.setDialogueToken("thiefPokemon", pokemon.name); - encounter.setDialogueToken(...moveRequirement.getDialogueToken(scene, pokemon)); + encounter.options[1].meetsRequirements(scene); + const primaryPokemon = encounter.options[1].primaryPokemon; + if (primaryPokemon) { + // Use primaryPokemon to execute the thievery encounter.dialogue.encounterOptionsDialogue.options[1].buttonTooltip = "mysteryEncounter:fight_or_flight_option_2_steal_tooltip"; encounter.dialogue.encounterOptionsDialogue.options[1].style = TextStyle.SUMMARY_GREEN; } else { @@ -104,44 +92,44 @@ export const FightOrFlightEncounter: MysteryEncounter = MysteryEncounterBuilder setEncounterRewards(scene, { guaranteedModifierTypeOptions: [item], fillRemaining: false }); await initBattleWithEnemyConfig(scene, scene.currentBattle.mysteryEncounter.enemyPartyConfigs[0]); }) - .withOptionPhase(async (scene: BattleScene) => { - // Pick steal - const encounter = scene.currentBattle.mysteryEncounter; - const item = scene.currentBattle.mysteryEncounter.misc as ModifierTypeOption; - setEncounterRewards(scene, { guaranteedModifierTypeOptions: [item], fillRemaining: false }); + .withOption(new MysteryEncounterOptionBuilder() + .withPrimaryPokemonRequirement(new MoveRequirement(STEALING_MOVES)) // Will set option2PrimaryName and option2PrimaryMove dialogue tokens automatically + .withDisabledOnRequirementsNotMet(false) + .withOptionPhase(async (scene: BattleScene) => { + // Pick steal + const encounter = scene.currentBattle.mysteryEncounter; + const item = scene.currentBattle.mysteryEncounter.misc as ModifierTypeOption; + setEncounterRewards(scene, { guaranteedModifierTypeOptions: [item], fillRemaining: false }); - // If player has a stealing move, they succeed automatically - const moveRequirement = new MoveRequirement(validMovesForSteal); - const validPokemon = moveRequirement.queryParty(scene.getParty()); - if (validPokemon?.length > 0) { - // Use first valid pokemon to execute the theivery - const pokemon = validPokemon[0]; - encounter.setDialogueToken("thiefPokemon", pokemon.name); - encounter.setDialogueToken(...moveRequirement.getDialogueToken(scene, pokemon)); - await showEncounterText(scene, "mysteryEncounter:fight_or_flight_option_2_steal_result"); - leaveEncounterWithoutBattle(scene); - return; - } + // If player has a stealing move, they succeed automatically + const primaryPokemon = encounter.options[1].primaryPokemon; + if (primaryPokemon) { + // Use primaryPokemon to execute the thievery + await showEncounterText(scene, "mysteryEncounter:fight_or_flight_option_2_steal_result"); + leaveEncounterWithoutBattle(scene); + return; + } - const roll = randSeedInt(16); - if (roll > 6) { - // Noticed and attacked by boss, gets +1 to all stats at start of fight (62.5%) - const config = scene.currentBattle.mysteryEncounter.enemyPartyConfigs[0]; - config.pokemonConfigs[0].tags = [BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON]; - config.pokemonConfigs[0].mysteryEncounterBattleEffects = (pokemon: Pokemon) => { - pokemon.scene.currentBattle.mysteryEncounter.setDialogueToken("enemyPokemon", pokemon.name); - queueEncounterMessage(pokemon.scene, "mysteryEncounter:fight_or_flight_boss_enraged"); - pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [BattleStat.ATK, BattleStat.DEF, BattleStat.SPATK, BattleStat.SPDEF, BattleStat.SPD], 1)); - }; - await showEncounterText(scene, "mysteryEncounter:fight_or_flight_option_2_bad_result"); - await initBattleWithEnemyConfig(scene, config); - } else { - // Steal item (37.5%) - // Display result message then proceed to rewards - await showEncounterText(scene, "mysteryEncounter:fight_or_flight_option_2_good_result"); - leaveEncounterWithoutBattle(scene); - } - }) + const roll = randSeedInt(16); + if (roll > 6) { + // Noticed and attacked by boss, gets +1 to all stats at start of fight (62.5%) + const config = scene.currentBattle.mysteryEncounter.enemyPartyConfigs[0]; + config.pokemonConfigs[0].tags = [BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON]; + config.pokemonConfigs[0].mysteryEncounterBattleEffects = (pokemon: Pokemon) => { + pokemon.scene.currentBattle.mysteryEncounter.setDialogueToken("enemyPokemon", pokemon.name); + queueEncounterMessage(pokemon.scene, "mysteryEncounter:fight_or_flight_boss_enraged"); + pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [BattleStat.ATK, BattleStat.DEF, BattleStat.SPATK, BattleStat.SPDEF, BattleStat.SPD], 1)); + }; + await showEncounterText(scene, "mysteryEncounter:fight_or_flight_option_2_bad_result"); + await initBattleWithEnemyConfig(scene, config); + } else { + // Steal item (37.5%) + // Display result message then proceed to rewards + await showEncounterText(scene, "mysteryEncounter:fight_or_flight_option_2_good_result"); + leaveEncounterWithoutBattle(scene); + } + }) + .build()) .withOptionPhase(async (scene: BattleScene) => { // Leave encounter with no rewards or exp leaveEncounterWithoutBattle(scene, true); diff --git a/src/data/mystery-encounters/encounters/sleeping-snorlax.ts b/src/data/mystery-encounters/encounters/sleeping-snorlax.ts index cb2029272ef..444ce5a6581 100644 --- a/src/data/mystery-encounters/encounters/sleeping-snorlax.ts +++ b/src/data/mystery-encounters/encounters/sleeping-snorlax.ts @@ -2,7 +2,6 @@ import { modifierTypes } from "#app/modifier/modifier-type"; import { BerryType } from "#enums/berry-type"; -import { Moves } from "#enums/moves"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { Species } from "#enums/species"; import BattleScene from "../../../battle-scene"; @@ -19,6 +18,7 @@ import { leaveEncounterWithoutBattle, queueEncounterMessage, setEncounterExp, setEncounterRewards } from "../mystery-encounter-utils"; +import { STEALING_MOVES } from "#app/data/mystery-encounters/requirements/requirement-groups"; export const SleepingSnorlaxEncounter: MysteryEncounter = MysteryEncounterBuilder .withEncounterType(MysteryEncounterType.SLEEPING_SNORLAX) @@ -98,7 +98,7 @@ export const SleepingSnorlaxEncounter: MysteryEncounter = MysteryEncounterBuilde } }) .withOption(new MysteryEncounterOptionBuilder() - .withPrimaryPokemonRequirement(new MoveRequirement([Moves.PLUCK, Moves.COVET, Moves.KNOCK_OFF, Moves.THIEF, Moves.TRICK, Moves.SWITCHEROO])) + .withPrimaryPokemonRequirement(new MoveRequirement(STEALING_MOVES)) .withOptionPhase(async (scene: BattleScene) => { // Steal the Snorlax's Leftovers const instance = scene.currentBattle.mysteryEncounter; diff --git a/src/data/mystery-encounters/mystery-encounters.ts b/src/data/mystery-encounters/mystery-encounters.ts index a1f8a73192e..0244281be26 100644 --- a/src/data/mystery-encounters/mystery-encounters.ts +++ b/src/data/mystery-encounters/mystery-encounters.ts @@ -16,36 +16,148 @@ export const BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT = 1; export const WIGHT_INCREMENT_ON_SPAWN_MISS = 5; export const AVERAGE_ENCOUNTERS_PER_RUN_TARGET = 15; +export const EXTREME_ENCOUNTER_BIOMES = [ + Biome.SEA, + Biome.SEABED, + Biome.BADLANDS, + Biome.DESERT, + Biome.ICE_CAVE, + Biome.VOLCANO, + Biome.WASTELAND, + Biome.ABYSS, + Biome.SPACE, + Biome.END +]; + +export const NON_EXTREME_ENCOUNTER_BIOMES = [ + Biome.TOWN, + Biome.PLAINS, + Biome.GRASS, + Biome.TALL_GRASS, + Biome.METROPOLIS, + Biome.FOREST, + Biome.SWAMP, + Biome.BEACH, + Biome.LAKE, + Biome.MOUNTAIN, + Biome.CAVE, + Biome.MEADOW, + Biome.POWER_PLANT, + Biome.GRAVEYARD, + Biome.DOJO, + Biome.FACTORY, + Biome.RUINS, + Biome.CONSTRUCTION_SITE, + Biome.JUNGLE, + Biome.FAIRY_CAVE, + Biome.TEMPLE, + Biome.SLUM, + Biome.SNOWY_FOREST, + Biome.ISLAND, + Biome.LABORATORY +]; + +/** + * Places where you could very reasonably expect to encounter a single human + * + * Diff from NON_EXTREME_ENCOUNTER_BIOMES: + * + BADLANDS + * + DESERT + * + ICE_CAVE + */ +export const HUMAN_TRANSITABLE_BIOMES = [ + Biome.TOWN, + Biome.PLAINS, + Biome.GRASS, + Biome.TALL_GRASS, + Biome.METROPOLIS, + Biome.FOREST, + Biome.SWAMP, + Biome.BEACH, + Biome.LAKE, + Biome.MOUNTAIN, + Biome.BADLANDS, + Biome.CAVE, + Biome.DESERT, + Biome.ICE_CAVE, + Biome.MEADOW, + Biome.POWER_PLANT, + Biome.GRAVEYARD, + Biome.DOJO, + Biome.FACTORY, + Biome.RUINS, + Biome.CONSTRUCTION_SITE, + Biome.JUNGLE, + Biome.FAIRY_CAVE, + Biome.TEMPLE, + Biome.SLUM, + Biome.SNOWY_FOREST, + Biome.ISLAND, + Biome.LABORATORY +]; + +/** + * Places where you could expect a town or city, some form of large civilization + */ +export const CIVILIZATION_ENCOUNTER_BIOMES = [ + Biome.TOWN, + Biome.PLAINS, + Biome.GRASS, + Biome.TALL_GRASS, + Biome.METROPOLIS, + Biome.BEACH, + Biome.LAKE, + Biome.MEADOW, + Biome.POWER_PLANT, + Biome.GRAVEYARD, + Biome.DOJO, + Biome.FACTORY, + Biome.CONSTRUCTION_SITE, + Biome.SLUM, + Biome.ISLAND +]; + export const allMysteryEncounters: { [encounterType: number]: MysteryEncounter } = {}; +// TO ENABLE AN ENCOUNTER IN ALL BIOMES, DO NOT SPECIFY IN ANY OF THESE LISTS/MAPS + +const extremeBiomeEncounters: MysteryEncounterType[] = []; + +const nonExtremeBiomeEncounters: MysteryEncounterType[] = [ + MysteryEncounterType.FIELD_TRIP +]; + +const humanTransitableBiomeEncounters: MysteryEncounterType[] = [ + MysteryEncounterType.MYSTERIOUS_CHALLENGERS, + MysteryEncounterType.SHADY_VITAMIN_DEALER +]; + +const civilizationBiomeEncounters: MysteryEncounterType[] = [ + MysteryEncounterType.DEPARTMENT_STORE_SALE +]; + +const anyBiomeEncounters: MysteryEncounterType[] = [ + MysteryEncounterType.FIGHT_OR_FLIGHT, + MysteryEncounterType.DARK_DEAL, + MysteryEncounterType.MYSTERIOUS_CHEST, + MysteryEncounterType.TRAINING_SESSION +]; + // Add MysteryEncounterType to biomes to enable it exclusively for those biomes -// To enable an encounter in all biomes, do not add to this map export const mysteryEncountersByBiome = new Map([ - [Biome.TOWN, [ - MysteryEncounterType.DEPARTMENT_STORE_SALE - ]], - [Biome.PLAINS, [ - MysteryEncounterType.DEPARTMENT_STORE_SALE - ]], + [Biome.TOWN, []], + [Biome.PLAINS, []], [Biome.GRASS, [ MysteryEncounterType.SLEEPING_SNORLAX, - MysteryEncounterType.DEPARTMENT_STORE_SALE - ]], - [Biome.TALL_GRASS, [ - MysteryEncounterType.DEPARTMENT_STORE_SALE - ]], - [Biome.METROPOLIS, [ - MysteryEncounterType.DEPARTMENT_STORE_SALE ]], + [Biome.TALL_GRASS, []], + [Biome.METROPOLIS, []], [Biome.FOREST, [ MysteryEncounterType.SLEEPING_SNORLAX ]], - [Biome.SEA, []], [Biome.SWAMP, []], - [Biome.BEACH, [ - MysteryEncounterType.DEPARTMENT_STORE_SALE - ]], + [Biome.BEACH, []], [Biome.LAKE, []], [Biome.SEABED, []], [Biome.MOUNTAIN, [ @@ -57,31 +169,21 @@ export const mysteryEncountersByBiome = new Map([ ]], [Biome.DESERT, []], [Biome.ICE_CAVE, []], - [Biome.MEADOW, [ - MysteryEncounterType.DEPARTMENT_STORE_SALE - ]], - [Biome.POWER_PLANT, [ - MysteryEncounterType.DEPARTMENT_STORE_SALE - ]], + [Biome.MEADOW, []], + [Biome.POWER_PLANT, []], [Biome.VOLCANO, []], [Biome.GRAVEYARD, []], [Biome.DOJO, []], - [Biome.FACTORY, [ - MysteryEncounterType.DEPARTMENT_STORE_SALE - ]], + [Biome.FACTORY, []], [Biome.RUINS, []], [Biome.WASTELAND, []], [Biome.ABYSS, []], [Biome.SPACE, []], - [Biome.CONSTRUCTION_SITE, [ - MysteryEncounterType.DEPARTMENT_STORE_SALE - ]], + [Biome.CONSTRUCTION_SITE, []], [Biome.JUNGLE, []], [Biome.FAIRY_CAVE, []], [Biome.TEMPLE, []], - [Biome.SLUM, [ - MysteryEncounterType.DEPARTMENT_STORE_SALE - ]], + [Biome.SLUM, []], [Biome.SNOWY_FOREST, []], [Biome.ISLAND, []], [Biome.LABORATORY, []] @@ -90,7 +192,7 @@ export const mysteryEncountersByBiome = new Map([ export function initMysteryEncounters() { allMysteryEncounters[MysteryEncounterType.MYSTERIOUS_CHALLENGERS] = MysteriousChallengersEncounter; allMysteryEncounters[MysteryEncounterType.MYSTERIOUS_CHEST] = MysteriousChestEncounter; - allMysteryEncounters[MysteryEncounterType.DARK_DEAL] = DarkDealEncounter; + allMysteryEncounters[MysteryEncounterType.DARK_DEAL] = DarkDealEncounter; // TODO: move to HUMAN if we add an ANY biome ROGUE tier encounter allMysteryEncounters[MysteryEncounterType.FIGHT_OR_FLIGHT] = FightOrFlightEncounter; allMysteryEncounters[MysteryEncounterType.TRAINING_SESSION] = TrainingSessionEncounter; allMysteryEncounters[MysteryEncounterType.SLEEPING_SNORLAX] = SleepingSnorlaxEncounter; @@ -98,15 +200,49 @@ export function initMysteryEncounters() { allMysteryEncounters[MysteryEncounterType.SHADY_VITAMIN_DEALER] = ShadyVitaminDealerEncounter; allMysteryEncounters[MysteryEncounterType.FIELD_TRIP] = FieldTripEncounter; - // Append encounters that can occur in any biome to biome map - const anyBiomeEncounters: MysteryEncounterType[] = Object.keys(MysteryEncounterType).filter(e => !isNaN(Number(e))).map(k => Number(k) as MysteryEncounterType); - mysteryEncountersByBiome.forEach(biomeEncounters => { - biomeEncounters.forEach(e => { - if (anyBiomeEncounters.includes(e)) { - anyBiomeEncounters.splice(anyBiomeEncounters.indexOf(e), 1); + // Add extreme encounters to biome map + extremeBiomeEncounters.forEach(encounter => { + EXTREME_ENCOUNTER_BIOMES.forEach(biome => { + const encountersForBiome = mysteryEncountersByBiome.get(biome); + if (!encountersForBiome.includes(encounter)) { + encountersForBiome.push(encounter); + } + }); + }); + // Add non-extreme encounters to biome map + nonExtremeBiomeEncounters.forEach(encounter => { + NON_EXTREME_ENCOUNTER_BIOMES.forEach(biome => { + const encountersForBiome = mysteryEncountersByBiome.get(biome); + if (!encountersForBiome.includes(encounter)) { + encountersForBiome.push(encounter); + } + }); + }); + // Add human encounters to biome map + humanTransitableBiomeEncounters.forEach(encounter => { + HUMAN_TRANSITABLE_BIOMES.forEach(biome => { + const encountersForBiome = mysteryEncountersByBiome.get(biome); + if (!encountersForBiome.includes(encounter)) { + encountersForBiome.push(encounter); + } + }); + }); + // Add civilization encounters to biome map + civilizationBiomeEncounters.forEach(encounter => { + CIVILIZATION_ENCOUNTER_BIOMES.forEach(biome => { + const encountersForBiome = mysteryEncountersByBiome.get(biome); + if (!encountersForBiome.includes(encounter)) { + encountersForBiome.push(encounter); } }); }); - mysteryEncountersByBiome.forEach(biomeEncounters => biomeEncounters.push(...anyBiomeEncounters)); + // Add ANY biome encounters to biome map + mysteryEncountersByBiome.forEach(biomeEncounters => { + anyBiomeEncounters.forEach(encounter => { + if (!biomeEncounters.includes(encounter)) { + biomeEncounters.push(encounter); + } + }); + }); } diff --git a/src/data/mystery-encounters/requirements/requirement-groups.ts b/src/data/mystery-encounters/requirements/requirement-groups.ts new file mode 100644 index 00000000000..3281129e63e --- /dev/null +++ b/src/data/mystery-encounters/requirements/requirement-groups.ts @@ -0,0 +1,42 @@ +import { Moves } from "#enums/moves"; + +export const STEALING_MOVES = [ + Moves.PLUCK, + Moves.COVET, + Moves.KNOCK_OFF, + Moves.FAKE_OUT, + Moves.THIEF, + Moves.TRICK, + Moves.SWITCHEROO +]; + +export const DISTRACTION_MOVES = [ + Moves.FAKE_OUT, + Moves.FOLLOW_ME, + Moves.TAUNT, + Moves.ROAR, + Moves.TELEPORT, + Moves.CHARM, + Moves.FAKE_TEARS, + Moves.TICKLE, + Moves.CAPTIVATE, + Moves.RAGE_POWDER, + Moves.SUBSTITUTE, + Moves.SHED_TAIL +]; + +export const PROTECTING_MOVES = [ + Moves.PROTECT, + Moves.WIDE_GUARD, + Moves.MAX_GUARD, + Moves.SAFEGUARD, + Moves.REFLECT, + Moves.BARRIER, + Moves.QUICK_GUARD, + Moves.FLOWER_SHIELD, + Moves.KINGS_SHIELD, + Moves.CRAFTY_SHIELD, + Moves.SPIKY_SHIELD, + Moves.OBSTRUCT, + Moves.DETECT +]; diff --git a/src/locales/en/mystery-encounter.ts b/src/locales/en/mystery-encounter.ts index 59fcf6940c2..b07e22f7a9a 100644 --- a/src/locales/en/mystery-encounter.ts +++ b/src/locales/en/mystery-encounter.ts @@ -43,14 +43,14 @@ export const mysteryEncounter: SimpleTranslationEntries = { "fight_or_flight_option_1_tooltip": "(-) Hard Battle\n(+) New Item", "fight_or_flight_option_2_label": "Steal the item", "fight_or_flight_option_2_tooltip": "@[SUMMARY_GREEN]{(35%) Steal Item}\n@[SUMMARY_BLUE]{(65%) Harder Battle}", - "fight_or_flight_option_2_steal_tooltip": "@[SUMMARY_GREEN]{(?) Use a Pokémon Move}", + "fight_or_flight_option_2_steal_tooltip": "(+) @ec{option2PrimaryName} uses @ec{option2PrimaryMove}", "fight_or_flight_option_3_label": "Leave", "fight_or_flight_option_3_tooltip": "(-) No Rewards", "fight_or_flight_option_1_selected_message": "You approach the\nPokémon without fear.", "fight_or_flight_option_2_good_result": `.@d{32}.@d{32}.@d{32} $You manage to sneak your way\npast and grab the item!`, "fight_or_flight_option_2_steal_result": `.@d{32}.@d{32}.@d{32} - $Your @ec{thiefPokemon} helps you out and uses @ec{move}! + $Your @ec{option2PrimaryName} helps you out and uses @ec{option2PrimaryMove}! $ You nabbed the item!`, "fight_or_flight_option_2_bad_result": `.@d{32}.@d{32}.@d{32} $The Pokémon catches you\nas you try to sneak around!`, diff --git a/src/ui/mystery-encounter-ui-handler.ts b/src/ui/mystery-encounter-ui-handler.ts index 8be862b965d..306fb01c575 100644 --- a/src/ui/mystery-encounter-ui-handler.ts +++ b/src/ui/mystery-encounter-ui-handler.ts @@ -110,7 +110,7 @@ export default class MysteryEncounterUiHandler extends UiHandler { this.unblockInput(); }, 300); }); - } else if (this.blockInput || !this.optionsMeetsReqs[cursor]) { + } else if (this.blockInput || (!this.optionsMeetsReqs[cursor] && this.filteredEncounterOptions[cursor].isDisabledOnRequirementsNotMet)) { success = false; } else { const selected = this.filteredEncounterOptions[cursor]; @@ -253,7 +253,7 @@ export default class MysteryEncounterUiHandler extends UiHandler { if (this.blockInput) { this.blockInput = false; for (let i = 0; i < this.optionsContainer.length - 1; i++) { - if (!this.optionsMeetsReqs[i]) { + if (!this.optionsMeetsReqs[i] && this.filteredEncounterOptions[i].isDisabledOnRequirementsNotMet) { continue; } (this.optionsContainer.getAt(i) as Phaser.GameObjects.Text).setAlpha(1); @@ -334,9 +334,7 @@ export default class MysteryEncounterUiHandler extends UiHandler { optionText.setText(text); } - - - if (!this.optionsMeetsReqs[i]) { + if (!this.optionsMeetsReqs[i] && this.filteredEncounterOptions[i].isDisabledOnRequirementsNotMet) { optionText.setAlpha(0.5); } if (this.blockInput) { @@ -424,7 +422,7 @@ export default class MysteryEncounterUiHandler extends UiHandler { const mysteryEncounter = this.scene.currentBattle.mysteryEncounter; let text; const option = mysteryEncounter.dialogue.encounterOptionsDialogue.options[cursor]; - if (!this.optionsMeetsReqs[cursor] && option.disabledTooltip) { + if (!this.optionsMeetsReqs[cursor] && this.filteredEncounterOptions[cursor].isDisabledOnRequirementsNotMet && option.disabledTooltip) { text = getEncounterText(this.scene, option.disabledTooltip, TextStyle.TOOLTIP_CONTENT); } else { text = getEncounterText(this.scene, option.buttonTooltip, TextStyle.TOOLTIP_CONTENT); From b6ef21058490430e9646bfaf94cbf41bc479b441 Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Thu, 11 Jul 2024 14:43:57 -0400 Subject: [PATCH 056/270] remove unnecessary styling override on fight or flight option --- src/data/mystery-encounters/encounters/fight-or-flight.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/data/mystery-encounters/encounters/fight-or-flight.ts b/src/data/mystery-encounters/encounters/fight-or-flight.ts index 4392468c7bc..8a82439772c 100644 --- a/src/data/mystery-encounters/encounters/fight-or-flight.ts +++ b/src/data/mystery-encounters/encounters/fight-or-flight.ts @@ -16,7 +16,6 @@ import { regenerateModifierPoolThresholds } from "#app/modifier/modifier-type"; import { StatChangePhase } from "#app/phases"; -import { TextStyle } from "#app/ui/text"; import { randSeedInt } from "#app/utils"; import { BattlerTagType } from "#enums/battler-tag-type"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; @@ -78,10 +77,8 @@ export const FightOrFlightEncounter: MysteryEncounter = MysteryEncounterBuilder if (primaryPokemon) { // Use primaryPokemon to execute the thievery encounter.dialogue.encounterOptionsDialogue.options[1].buttonTooltip = "mysteryEncounter:fight_or_flight_option_2_steal_tooltip"; - encounter.dialogue.encounterOptionsDialogue.options[1].style = TextStyle.SUMMARY_GREEN; } else { encounter.dialogue.encounterOptionsDialogue.options[1].buttonTooltip = "mysteryEncounter:fight_or_flight_option_2_tooltip"; - encounter.dialogue.encounterOptionsDialogue.options[1].style = null; } return true; From c72bed0ee76b7f50b9be7400703da9fb3b9e2b53 Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Thu, 11 Jul 2024 14:58:44 -0400 Subject: [PATCH 057/270] small cleanup of changes --- src/data/mystery-encounters/mystery-encounters.ts | 15 ++++++++++++--- src/locales/en/mystery-encounter.ts | 7 +++---- src/ui/mystery-encounter-ui-handler.ts | 1 + 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/src/data/mystery-encounters/mystery-encounters.ts b/src/data/mystery-encounters/mystery-encounters.ts index 0244281be26..1651430e59d 100644 --- a/src/data/mystery-encounters/mystery-encounters.ts +++ b/src/data/mystery-encounters/mystery-encounters.ts @@ -119,7 +119,6 @@ export const CIVILIZATION_ENCOUNTER_BIOMES = [ export const allMysteryEncounters: { [encounterType: number]: MysteryEncounter } = {}; -// TO ENABLE AN ENCOUNTER IN ALL BIOMES, DO NOT SPECIFY IN ANY OF THESE LISTS/MAPS const extremeBiomeEncounters: MysteryEncounterType[] = []; @@ -136,6 +135,10 @@ const civilizationBiomeEncounters: MysteryEncounterType[] = [ MysteryEncounterType.DEPARTMENT_STORE_SALE ]; + +/** + * To add an encounter to every biome possible, use this array + */ const anyBiomeEncounters: MysteryEncounterType[] = [ MysteryEncounterType.FIGHT_OR_FLIGHT, MysteryEncounterType.DARK_DEAL, @@ -143,7 +146,13 @@ const anyBiomeEncounters: MysteryEncounterType[] = [ MysteryEncounterType.TRAINING_SESSION ]; -// Add MysteryEncounterType to biomes to enable it exclusively for those biomes +/** + * ENCOUNTER BIOME MAPPING + * To add an Encounter to a biome group, instead of cluttering the map, use the biome group arrays above + * + * Adding specific Encounters to the mysteryEncountersByBiome map is for specific cases and special circumstances + * that biome groups do not cover + */ export const mysteryEncountersByBiome = new Map([ [Biome.TOWN, []], [Biome.PLAINS, []], @@ -192,7 +201,7 @@ export const mysteryEncountersByBiome = new Map([ export function initMysteryEncounters() { allMysteryEncounters[MysteryEncounterType.MYSTERIOUS_CHALLENGERS] = MysteriousChallengersEncounter; allMysteryEncounters[MysteryEncounterType.MYSTERIOUS_CHEST] = MysteriousChestEncounter; - allMysteryEncounters[MysteryEncounterType.DARK_DEAL] = DarkDealEncounter; // TODO: move to HUMAN if we add an ANY biome ROGUE tier encounter + allMysteryEncounters[MysteryEncounterType.DARK_DEAL] = DarkDealEncounter; allMysteryEncounters[MysteryEncounterType.FIGHT_OR_FLIGHT] = FightOrFlightEncounter; allMysteryEncounters[MysteryEncounterType.TRAINING_SESSION] = TrainingSessionEncounter; allMysteryEncounters[MysteryEncounterType.SLEEPING_SNORLAX] = SleepingSnorlaxEncounter; diff --git a/src/locales/en/mystery-encounter.ts b/src/locales/en/mystery-encounter.ts index b07e22f7a9a..f944615452a 100644 --- a/src/locales/en/mystery-encounter.ts +++ b/src/locales/en/mystery-encounter.ts @@ -108,7 +108,6 @@ export const mysteryEncounter: SimpleTranslationEntries = { "field_trip_title": "Field Trip", "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.", "field_trip_query": "Which move category will you show off?", - // "field_trip_invalid_selection": "Pokémon doesn't know that type of move.", "field_trip_option_1_label": "A Physical Move", "field_trip_option_1_tooltip": "(+) Physical Item Rewards", "field_trip_option_2_label": "A Special Move", @@ -141,6 +140,7 @@ export const mysteryEncounter: SimpleTranslationEntries = { "mysterious_challengers_outro_win": "The mysterious challenger was defeated!", // Mystery Encounters -- Rare Tier + "training_session_intro_message": "You've come across some\ntraining tools and supplies.", "training_session_title": "Training Session", "training_session_description": "These supplies look like they could be used to train a member of your party! There are a few ways you could train your Pokémon, by battling against it with the rest of your team.", @@ -173,8 +173,8 @@ export const mysteryEncounter: SimpleTranslationEntries = { "dark_deal_title": "Dark Deal", "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...\"", "dark_deal_query": "What will you do?", - "dark_deal_option_1_label": "Accept", // Give player 10 rogue balls. Remove a random Pokémon from player's party. Fight a legendary Pokémon as a boss - "dark_deal_option_1_tooltip": "(+) 5 Rogue Balls\n(?) Enhance a Random Pokémon", // Give player 10 rogue balls. Remove a random Pokémon from player's party. Fight a legendary Pokémon as a boss + "dark_deal_option_1_label": "Accept", + "dark_deal_option_1_tooltip": "(+) 5 Rogue Balls\n(?) Enhance a Random Pokémon", "dark_deal_option_2_label": "Refuse", "dark_deal_option_2_tooltip": "(-) No Rewards", "dark_deal_option_1_selected": `Let's see, that @ec{pokeName} will do nicely! @@ -206,6 +206,5 @@ export const mysteryEncounter: SimpleTranslationEntries = { $But on the bright side, the Snorlax left something behind... $@s{item_fanfare}You gained a Berry!`, "sleeping_snorlax_option_3_good_result": "Your @ec{option3PrimaryName} uses @ec{option3PrimaryMove}! @s{item_fanfare}It steals Leftovers off the sleeping Snorlax and you make out like bandits!", - // "sleeping_snorlax_outro_win": "The mysterious challengers were defeated!", } as const; diff --git a/src/ui/mystery-encounter-ui-handler.ts b/src/ui/mystery-encounter-ui-handler.ts index 306fb01c575..cad678acf87 100644 --- a/src/ui/mystery-encounter-ui-handler.ts +++ b/src/ui/mystery-encounter-ui-handler.ts @@ -325,6 +325,7 @@ export default class MysteryEncounterUiHandler extends UiHandler { let text; if (this.filteredEncounterOptions[i].hasRequirements() && this.optionsMeetsReqs[i]) { // Options with special requirements that are met are automatically colored green + // In cases where isDisabledOnRequirementsNotMet = false and requirements are not met, option will not be auto-colored text = getEncounterText(this.scene, optionDialogue.buttonLabel, TextStyle.SUMMARY_GREEN); } else { text = getEncounterText(this.scene, optionDialogue.buttonLabel, optionDialogue.style ? optionDialogue.style : TextStyle.WINDOW); From 390b2e93f92d8aae1a93e6c3c8ff7aa1c60e7dc2 Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Thu, 11 Jul 2024 15:03:57 -0400 Subject: [PATCH 058/270] remove fake out from stealing move group --- src/data/mystery-encounters/requirements/requirement-groups.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/data/mystery-encounters/requirements/requirement-groups.ts b/src/data/mystery-encounters/requirements/requirement-groups.ts index 3281129e63e..c4d1c592df4 100644 --- a/src/data/mystery-encounters/requirements/requirement-groups.ts +++ b/src/data/mystery-encounters/requirements/requirement-groups.ts @@ -4,7 +4,6 @@ export const STEALING_MOVES = [ Moves.PLUCK, Moves.COVET, Moves.KNOCK_OFF, - Moves.FAKE_OUT, Moves.THIEF, Moves.TRICK, Moves.SWITCHEROO From 74125ef1cfd0db811a2d3e35c0b8cc90f5dffbad Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Thu, 11 Jul 2024 12:56:15 -0700 Subject: [PATCH 059/270] WIP: add option to use dialogues in builder --- .../dialogue/dark-deal-dialogue.ts | 68 +++--- .../encounters/dark-deal.ts | 197 ++++++++++++------ .../mystery-encounter-dialogue.ts | 2 +- .../mystery-encounter-option.ts | 6 + .../mystery-encounters/mystery-encounter.ts | 19 +- src/overrides.ts | 6 +- src/phases.ts | 2 +- src/ui/mystery-encounter-ui-handler.ts | 6 +- 8 files changed, 195 insertions(+), 111 deletions(-) diff --git a/src/data/mystery-encounters/dialogue/dark-deal-dialogue.ts b/src/data/mystery-encounters/dialogue/dark-deal-dialogue.ts index 25b31f79a50..9ee7ce5472b 100644 --- a/src/data/mystery-encounters/dialogue/dark-deal-dialogue.ts +++ b/src/data/mystery-encounters/dialogue/dark-deal-dialogue.ts @@ -1,44 +1,44 @@ import MysteryEncounterDialogue from "#app/data/mystery-encounters/mystery-encounter-dialogue"; export const DarkDealDialogue: MysteryEncounterDialogue = { - intro: [ - { - text: "mysteryEncounter:dark_deal_intro_message" - }, - { - speaker: "mysteryEncounter:dark_deal_speaker", - text: "mysteryEncounter:dark_deal_intro_dialogue" - } - ], + // intro: [ + // { + // text: "mysteryEncounter:dark_deal_intro_message" + // }, + // { + // speaker: "mysteryEncounter:dark_deal_speaker", + // text: "mysteryEncounter:dark_deal_intro_dialogue" + // } + // ], encounterOptionsDialogue: { title: "mysteryEncounter:dark_deal_title", description: "mysteryEncounter:dark_deal_description", query: "mysteryEncounter:dark_deal_query", - options: [ - { - buttonLabel: "mysteryEncounter:dark_deal_option_1_label", - buttonTooltip: "mysteryEncounter:dark_deal_option_1_tooltip", - selected: [ - { - speaker: "mysteryEncounter:dark_deal_speaker", - text: "mysteryEncounter:dark_deal_option_1_selected" - }, - { - text: "mysteryEncounter:dark_deal_option_1_selected_message" - } - ] - }, - { - buttonLabel: "mysteryEncounter:dark_deal_option_2_label", - buttonTooltip: "mysteryEncounter:dark_deal_option_2_tooltip", - selected: [ - { - speaker: "mysteryEncounter:dark_deal_speaker", - text: "mysteryEncounter:dark_deal_option_2_selected" - } - ] - } - ] + // options: [ + // { + // buttonLabel: "mysteryEncounter:dark_deal_option_1_label", + // buttonTooltip: "mysteryEncounter:dark_deal_option_1_tooltip", + // selected: [ + // { + // speaker: "mysteryEncounter:dark_deal_speaker", + // text: "mysteryEncounter:dark_deal_option_1_selected" + // }, + // { + // text: "mysteryEncounter:dark_deal_option_1_selected_message" + // } + // ] + // }, + // { + // buttonLabel: "mysteryEncounter:dark_deal_option_2_label", + // buttonTooltip: "mysteryEncounter:dark_deal_option_2_tooltip", + // selected: [ + // { + // speaker: "mysteryEncounter:dark_deal_speaker", + // text: "mysteryEncounter:dark_deal_option_2_selected" + // } + // ] + // } + // ] }, outro: [ { diff --git a/src/data/mystery-encounters/encounters/dark-deal.ts b/src/data/mystery-encounters/encounters/dark-deal.ts index 1985ffcf8dd..c1651aa8dec 100644 --- a/src/data/mystery-encounters/encounters/dark-deal.ts +++ b/src/data/mystery-encounters/encounters/dark-deal.ts @@ -7,14 +7,18 @@ import BattleScene from "../../../battle-scene"; import { AddPokeballModifierType } from "../../../modifier/modifier-type"; import { PokeballType } from "../../pokeball"; import { getPokemonSpecies } from "../../pokemon-species"; -import MysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier } from "../mystery-encounter"; +import MysteryEncounter, { + MysteryEncounterBuilder, + MysteryEncounterTier, +} from "../mystery-encounter"; import { MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; import { - EnemyPartyConfig, EnemyPokemonConfig, + EnemyPartyConfig, + EnemyPokemonConfig, getRandomPlayerPokemon, getRandomSpeciesByStarterTier, initBattleWithEnemyConfig, - leaveEncounterWithoutBattle + leaveEncounterWithoutBattle, } from "../mystery-encounter-utils"; // Exclude Ultra Beasts, Paradox, Necrozma, Eternatus, and egg-locked mythicals @@ -63,71 +67,132 @@ const excludedBosses = [ Species.ARCEUS, Species.VICTINI, Species.MELTAN, - Species.PECHARUNT + Species.PECHARUNT, ]; -export const DarkDealEncounter: MysteryEncounter = MysteryEncounterBuilder - .withEncounterType(MysteryEncounterType.DARK_DEAL) - .withEncounterTier(MysteryEncounterTier.ROGUE) - .withIntroSpriteConfigs([ - { - spriteKey: "mad_scientist_m", - fileRoot: "mystery-encounters", - hasShadow: true - }, - { - spriteKey: "dark_deal_porygon", - fileRoot: "mystery-encounters", - hasShadow: true, - repeat: true - } - ]) - .withSceneWaveRangeRequirement(30, 180) // waves 30 to 180 - .withScenePartySizeRequirement(2, 6) // Must have at least 2 pokemon in party - .withCatchAllowed(true) - .withOption(new MysteryEncounterOptionBuilder() - .withPreOptionPhase(async (scene: BattleScene) => { - // Removes random pokemon (including fainted) from party and adds name to dialogue data tokens - // Will never return last battle able mon and instead pick fainted/unable to battle - const removedPokemon = getRandomPlayerPokemon(scene, false, true); - scene.removePokemonFromPlayerParty(removedPokemon); +export const DarkDealEncounter: MysteryEncounter = + MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.DARK_DEAL) + .withEncounterTier(MysteryEncounterTier.ROGUE) + .withIntroSpriteConfigs([ + { + spriteKey: "mad_scientist_m", + fileRoot: "mystery-encounters", + hasShadow: true, + }, + { + spriteKey: "dark_deal_porygon", + fileRoot: "mystery-encounters", + hasShadow: true, + repeat: true, + }, + ]) + .withIntroDialogue([ + { + text: "mysteryEncounter:dark_deal_intro_message", + }, + { + speaker: "mysteryEncounter:dark_deal_speaker", + text: "mysteryEncounter:dark_deal_intro_dialogue", + }, + ]) + .withSceneWaveRangeRequirement(30, 180) // waves 30 to 180 + .withScenePartySizeRequirement(2, 6) // Must have at least 2 pokemon in party + .withCatchAllowed(true) + .withOption( + new MysteryEncounterOptionBuilder() + .withDialogue({ + buttonLabel: "mysteryEncounter:dark_deal_option_1_label", + buttonTooltip: "mysteryEncounter:dark_deal_option_1_tooltip", + selected: [ + { + speaker: "mysteryEncounter:dark_deal_speaker", + text: "mysteryEncounter:dark_deal_option_1_selected", + }, + { + text: "mysteryEncounter:dark_deal_option_1_selected_message", + }, + ], + }) + .withPreOptionPhase(async (scene: BattleScene) => { + // Removes random pokemon (including fainted) from party and adds name to dialogue data tokens + // Will never return last battle able mon and instead pick fainted/unable to battle + const removedPokemon = getRandomPlayerPokemon(scene, false, true); + scene.removePokemonFromPlayerParty(removedPokemon); - scene.currentBattle.mysteryEncounter.setDialogueToken("pokeName", removedPokemon.name); + scene.currentBattle.mysteryEncounter.setDialogueToken( + "pokeName", + removedPokemon.name + ); - // Store removed pokemon types - scene.currentBattle.mysteryEncounter.misc = [removedPokemon.species.type1]; - if (removedPokemon.species.type2) { - scene.currentBattle.mysteryEncounter.misc.push(removedPokemon.species.type2); - } - }) - .withOptionPhase(async (scene: BattleScene) => { - // Give the player 5 Rogue Balls - scene.unshiftPhase(new ModifierRewardPhase(scene, () => new AddPokeballModifierType("rb", PokeballType.ROGUE_BALL, 5))); + // Store removed pokemon types + scene.currentBattle.mysteryEncounter.misc = [ + removedPokemon.species.type1, + ]; + if (removedPokemon.species.type2) { + scene.currentBattle.mysteryEncounter.misc.push( + removedPokemon.species.type2 + ); + } + }) + .withOptionPhase(async (scene: BattleScene) => { + // Give the player 5 Rogue Balls + scene.unshiftPhase( + new ModifierRewardPhase( + scene, + () => + new AddPokeballModifierType("rb", PokeballType.ROGUE_BALL, 5) + ) + ); - // Start encounter with random legendary (7-10 starter strength) that has level additive - const bossTypes = scene.currentBattle.mysteryEncounter.misc as Type[]; - // Starter egg tier, 35/50/10/5 %odds for tiers 6/7/8/9+ - const roll = randSeedInt(100); - const starterTier: number | [number, number] = roll > 65 ? 6 : roll > 15 ? 7 : roll > 5 ? 8 : [9, 10]; - const bossSpecies = getPokemonSpecies(getRandomSpeciesByStarterTier(starterTier, excludedBosses, bossTypes)); - const pokemonConfig: EnemyPokemonConfig = { - species: bossSpecies, - isBoss: true - }; - if (!isNullOrUndefined(bossSpecies.forms) && bossSpecies.forms.length > 0) { - pokemonConfig.formIndex = 0; - } - const config: EnemyPartyConfig = { - levelAdditiveMultiplier: 0.75, - pokemonConfigs: [pokemonConfig] - }; - return initBattleWithEnemyConfig(scene, config); - }) - .build() - ) - .withOptionPhase(async (scene: BattleScene) => { - // Leave encounter with no rewards or exp - leaveEncounterWithoutBattle(scene, true); - return true; - }) - .build(); + // Start encounter with random legendary (7-10 starter strength) that has level additive + const bossTypes = scene.currentBattle.mysteryEncounter.misc as Type[]; + // Starter egg tier, 35/50/10/5 %odds for tiers 6/7/8/9+ + const roll = randSeedInt(100); + const starterTier: number | [number, number] = + roll > 65 ? 6 : roll > 15 ? 7 : roll > 5 ? 8 : [9, 10]; + const bossSpecies = getPokemonSpecies( + getRandomSpeciesByStarterTier( + starterTier, + excludedBosses, + bossTypes + ) + ); + const pokemonConfig: EnemyPokemonConfig = { + species: bossSpecies, + isBoss: true, + }; + if ( + !isNullOrUndefined(bossSpecies.forms) && + bossSpecies.forms.length > 0 + ) { + pokemonConfig.formIndex = 0; + } + const config: EnemyPartyConfig = { + levelAdditiveMultiplier: 0.75, + pokemonConfigs: [pokemonConfig], + }; + return initBattleWithEnemyConfig(scene, config); + }) + .build() + ) + .withOption( + new MysteryEncounterOptionBuilder() + .withDialogue({ + buttonLabel: "mysteryEncounter:dark_deal_option_2_label", + buttonTooltip: "mysteryEncounter:dark_deal_option_2_tooltip", + selected: [ + { + speaker: "mysteryEncounter:dark_deal_speaker", + text: "mysteryEncounter:dark_deal_option_2_selected", + }, + ], + }) + .withOptionPhase(async (scene: BattleScene) => { + // Leave encounter with no rewards or exp + + leaveEncounterWithoutBattle(scene, true); + return true; + }) + .build() + ) + .build(); diff --git a/src/data/mystery-encounters/mystery-encounter-dialogue.ts b/src/data/mystery-encounters/mystery-encounter-dialogue.ts index 1e2dfe85045..7a9427a5d4a 100644 --- a/src/data/mystery-encounters/mystery-encounter-dialogue.ts +++ b/src/data/mystery-encounters/mystery-encounter-dialogue.ts @@ -28,7 +28,7 @@ export class EncounterOptionsDialogue { title: TemplateStringsArray | `mysteryEncounter:${string}`; description: TemplateStringsArray | `mysteryEncounter:${string}`; query?: TemplateStringsArray | `mysteryEncounter:${string}`; - options: [OptionTextDisplay, OptionTextDisplay, ...OptionTextDisplay[]]; // Options array with minimum 2 options + options?: [...OptionTextDisplay[]]; // Options array with minimum 2 options } export default class MysteryEncounterDialogue { diff --git a/src/data/mystery-encounters/mystery-encounter-option.ts b/src/data/mystery-encounters/mystery-encounter-option.ts index f1316ff64f1..2d1b4e5cfb9 100644 --- a/src/data/mystery-encounters/mystery-encounter-option.ts +++ b/src/data/mystery-encounters/mystery-encounter-option.ts @@ -127,6 +127,7 @@ export class MysteryEncounterOptionBuilder implements Partial> { this.requirements.push(requirement); @@ -163,4 +164,9 @@ export class MysteryEncounterOptionBuilder implements Partial o.dialogue = this.dialogue.encounterOptionsDialogue.options[i]); + if (this.dialogue?.encounterOptionsDialogue) { + // this.options.forEach((o, i) => o.dialogue = this.dialogue.encounterOptionsDialogue.options[i]); } // Reset any dirty flags or encounter data @@ -408,9 +410,20 @@ export class MysteryEncounterBuilder implements Partial { * @returns */ withIntroSpriteConfigs(spriteConfigs: MysteryEncounterSpriteConfig[]): this & Pick { + console.debug("with intro sprite configs: ", spriteConfigs); return Object.assign(this, { spriteConfigs: spriteConfigs }); } + withIntroDialogue(dialogue: MysteryEncounterDialogue["intro"] = []): this { + console.debug("with intro dialogue: ", dialogue); + this.dialogue = {...this.dialogue, intro: dialogue }; + return this; + } + + withIntro({spriteConfigs, dialogue} : {spriteConfigs: MysteryEncounterSpriteConfig[], dialogue?: MysteryEncounterDialogue["intro"]}) { + return this.withIntroSpriteConfigs(spriteConfigs).withIntroDialogue(dialogue); + } + /** * OPTIONAL */ diff --git a/src/overrides.ts b/src/overrides.ts index ce706173691..f6a3778c4da 100644 --- a/src/overrides.ts +++ b/src/overrides.ts @@ -35,7 +35,7 @@ export const SEED_OVERRIDE: string = ""; export const WEATHER_OVERRIDE: WeatherType = WeatherType.NONE; export const DOUBLE_BATTLE_OVERRIDE: boolean = false; export const SINGLE_BATTLE_OVERRIDE: boolean = false; -export const STARTING_WAVE_OVERRIDE: integer = 0; +export const STARTING_WAVE_OVERRIDE: integer = 33; export const STARTING_BIOME_OVERRIDE: Biome = Biome.TOWN; export const ARENA_TINT_OVERRIDE: TimeOfDay = null; // Multiplies XP gained by this value including 0. Set to null to ignore the override @@ -118,9 +118,9 @@ export const EGG_GACHA_PULL_COUNT_OVERRIDE: number = 0; */ // 1 to 256, set to null to ignore -export const MYSTERY_ENCOUNTER_RATE_OVERRIDE: number = null; +export const MYSTERY_ENCOUNTER_RATE_OVERRIDE: number = 10000; export const MYSTERY_ENCOUNTER_TIER_OVERRIDE: MysteryEncounterTier = null; -export const MYSTERY_ENCOUNTER_OVERRIDE: MysteryEncounterType = null; +export const MYSTERY_ENCOUNTER_OVERRIDE: MysteryEncounterType = MysteryEncounterType.DARK_DEAL; /** * MODIFIER / ITEM OVERRIDES diff --git a/src/phases.ts b/src/phases.ts index 091629b31d5..2233763dc7f 100644 --- a/src/phases.ts +++ b/src/phases.ts @@ -828,7 +828,7 @@ export class EncounterPhase extends BattlePhase { if (mysteryEncounter.onInit) { mysteryEncounter.onInit(this.scene); } - mysteryEncounter.populateDialogueTokensFromRequirements(this.scene); + // mysteryEncounter.populateDialogueTokensFromRequirements(this.scene); }, this.scene.currentBattle.waveIndex); // Add intro visuals for mystery encounter diff --git a/src/ui/mystery-encounter-ui-handler.ts b/src/ui/mystery-encounter-ui-handler.ts index 163d79784f8..7be7f16e8bc 100644 --- a/src/ui/mystery-encounter-ui-handler.ts +++ b/src/ui/mystery-encounter-ui-handler.ts @@ -319,13 +319,13 @@ export default class MysteryEncounterUiHandler extends UiHandler { optionText = addBBCodeTextObject(this.scene, i % 2 === 0 ? 0 : 100, i < 2 ? 0 : 16, "-", TextStyle.WINDOW, { wordWrap: { width: 558 }, fontSize: "80px", lineSpacing: -8 }); break; } - const option = mysteryEncounter.dialogue.encounterOptionsDialogue.options[i]; - const text = getEncounterText(this.scene, option.buttonLabel, option.style ? option.style : TextStyle.WINDOW); + const option = this.filteredEncounterOptions[i]; + const text = getEncounterText(this.scene, option.dialogue?.buttonLabel, option.dialogue?.style ? option.dialogue?.style : TextStyle.WINDOW); if (text) { optionText.setText(text); } - this.optionsMeetsReqs.push(this.filteredEncounterOptions[i].meetsRequirements(this.scene)); + this.optionsMeetsReqs.push(option.meetsRequirements(this.scene)); if (!this.optionsMeetsReqs[i]) { optionText.setAlpha(0.5); From c589689a6c067189f22b918e91a82f1914ac2045 Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Thu, 11 Jul 2024 13:26:21 -0700 Subject: [PATCH 060/270] migrate dark-deal encounter to new dialogue setup --- .../dialogue/dark-deal-dialogue.ts | 48 ------------- .../encounters/dark-deal.ts | 42 +++++++----- .../encounters/department-store-sale.ts | 8 +-- .../encounters/fight-or-flight.ts | 4 +- .../encounters/mysterious-challengers.ts | 6 +- .../encounters/mysterious-chest.ts | 2 +- .../encounters/shady-vitamin-dealer.ts | 2 +- .../encounters/sleeping-snorlax.ts | 4 +- .../mystery-encounter-dialogue.ts | 8 +-- .../mystery-encounters/mystery-encounter.ts | 68 ++++++++++++++++--- src/ui/mystery-encounter-ui-handler.ts | 11 +-- 11 files changed, 104 insertions(+), 99 deletions(-) delete mode 100644 src/data/mystery-encounters/dialogue/dark-deal-dialogue.ts diff --git a/src/data/mystery-encounters/dialogue/dark-deal-dialogue.ts b/src/data/mystery-encounters/dialogue/dark-deal-dialogue.ts deleted file mode 100644 index 9ee7ce5472b..00000000000 --- a/src/data/mystery-encounters/dialogue/dark-deal-dialogue.ts +++ /dev/null @@ -1,48 +0,0 @@ -import MysteryEncounterDialogue from "#app/data/mystery-encounters/mystery-encounter-dialogue"; - -export const DarkDealDialogue: MysteryEncounterDialogue = { - // intro: [ - // { - // text: "mysteryEncounter:dark_deal_intro_message" - // }, - // { - // speaker: "mysteryEncounter:dark_deal_speaker", - // text: "mysteryEncounter:dark_deal_intro_dialogue" - // } - // ], - encounterOptionsDialogue: { - title: "mysteryEncounter:dark_deal_title", - description: "mysteryEncounter:dark_deal_description", - query: "mysteryEncounter:dark_deal_query", - // options: [ - // { - // buttonLabel: "mysteryEncounter:dark_deal_option_1_label", - // buttonTooltip: "mysteryEncounter:dark_deal_option_1_tooltip", - // selected: [ - // { - // speaker: "mysteryEncounter:dark_deal_speaker", - // text: "mysteryEncounter:dark_deal_option_1_selected" - // }, - // { - // text: "mysteryEncounter:dark_deal_option_1_selected_message" - // } - // ] - // }, - // { - // buttonLabel: "mysteryEncounter:dark_deal_option_2_label", - // buttonTooltip: "mysteryEncounter:dark_deal_option_2_tooltip", - // selected: [ - // { - // speaker: "mysteryEncounter:dark_deal_speaker", - // text: "mysteryEncounter:dark_deal_option_2_selected" - // } - // ] - // } - // ] - }, - outro: [ - { - text: "mysteryEncounter:dark_deal_outro" - } - ] -}; diff --git a/src/data/mystery-encounters/encounters/dark-deal.ts b/src/data/mystery-encounters/encounters/dark-deal.ts index c1651aa8dec..740c4e86c28 100644 --- a/src/data/mystery-encounters/encounters/dark-deal.ts +++ b/src/data/mystery-encounters/encounters/dark-deal.ts @@ -98,6 +98,9 @@ export const DarkDealEncounter: MysteryEncounter = .withSceneWaveRangeRequirement(30, 180) // waves 30 to 180 .withScenePartySizeRequirement(2, 6) // Must have at least 2 pokemon in party .withCatchAllowed(true) + .withTitle("mysteryEncounter:dark_deal_title") + .withDescription("mysteryEncounter:dark_deal_description") + .withQuery("mysteryEncounter:dark_deal_query") .withOption( new MysteryEncounterOptionBuilder() .withDialogue({ @@ -175,24 +178,27 @@ export const DarkDealEncounter: MysteryEncounter = }) .build() ) - .withOption( - new MysteryEncounterOptionBuilder() - .withDialogue({ - buttonLabel: "mysteryEncounter:dark_deal_option_2_label", - buttonTooltip: "mysteryEncounter:dark_deal_option_2_tooltip", - selected: [ - { - speaker: "mysteryEncounter:dark_deal_speaker", - text: "mysteryEncounter:dark_deal_option_2_selected", - }, - ], - }) - .withOptionPhase(async (scene: BattleScene) => { - // Leave encounter with no rewards or exp + .withSimpleOption( + { + buttonLabel: "mysteryEncounter:dark_deal_option_2_label", + buttonTooltip: "mysteryEncounter:dark_deal_option_2_tooltip", + selected: [ + { + speaker: "mysteryEncounter:dark_deal_speaker", + text: "mysteryEncounter:dark_deal_option_2_selected", + }, + ], + }, + async (scene: BattleScene) => { + // Leave encounter with no rewards or exp - leaveEncounterWithoutBattle(scene, true); - return true; - }) - .build() + leaveEncounterWithoutBattle(scene, true); + return true; + } ) + .withOutroDialogue([ + { + text: "mysteryEncounter:dark_deal_outro" + } + ]) .build(); diff --git a/src/data/mystery-encounters/encounters/department-store-sale.ts b/src/data/mystery-encounters/encounters/department-store-sale.ts index 19269a774f3..4323fc15434 100644 --- a/src/data/mystery-encounters/encounters/department-store-sale.ts +++ b/src/data/mystery-encounters/encounters/department-store-sale.ts @@ -29,7 +29,7 @@ export const DepartmentStoreSaleEncounter: MysteryEncounter = MysteryEncounterBu ]) // .withHideIntroVisuals(false) .withSceneWaveRangeRequirement(10, 100) - .withOptionPhase(async (scene: BattleScene) => { + .withSimpleOption(async (scene: BattleScene) => { // Choose TMs const modifiers = []; let i = 0; @@ -49,7 +49,7 @@ export const DepartmentStoreSaleEncounter: MysteryEncounter = MysteryEncounterBu setEncounterRewards(scene, { guaranteedModifierTypeFuncs: modifiers, fillRemaining: false }); leaveEncounterWithoutBattle(scene); }) - .withOptionPhase(async (scene: BattleScene) => { + .withSimpleOption(async (scene: BattleScene) => { // Choose Vitamins const modifiers = []; let i = 0; @@ -67,7 +67,7 @@ export const DepartmentStoreSaleEncounter: MysteryEncounter = MysteryEncounterBu setEncounterRewards(scene, { guaranteedModifierTypeFuncs: modifiers, fillRemaining: false }); leaveEncounterWithoutBattle(scene); }) - .withOptionPhase(async (scene: BattleScene) => { + .withSimpleOption(async (scene: BattleScene) => { // Choose X Items const modifiers = []; let i = 0; @@ -85,7 +85,7 @@ export const DepartmentStoreSaleEncounter: MysteryEncounter = MysteryEncounterBu setEncounterRewards(scene, { guaranteedModifierTypeFuncs: modifiers, fillRemaining: false }); leaveEncounterWithoutBattle(scene); }) - .withOptionPhase(async (scene: BattleScene) => { + .withSimpleOption(async (scene: BattleScene) => { // Choose Pokeballs const modifiers = []; let i = 0; diff --git a/src/data/mystery-encounters/encounters/fight-or-flight.ts b/src/data/mystery-encounters/encounters/fight-or-flight.ts index 8a82439772c..2a362eaed37 100644 --- a/src/data/mystery-encounters/encounters/fight-or-flight.ts +++ b/src/data/mystery-encounters/encounters/fight-or-flight.ts @@ -83,7 +83,7 @@ export const FightOrFlightEncounter: MysteryEncounter = MysteryEncounterBuilder return true; }) - .withOptionPhase(async (scene: BattleScene) => { + .withSimpleOption(async (scene: BattleScene) => { // Pick battle const item = scene.currentBattle.mysteryEncounter.misc as ModifierTypeOption; setEncounterRewards(scene, { guaranteedModifierTypeOptions: [item], fillRemaining: false }); @@ -127,7 +127,7 @@ export const FightOrFlightEncounter: MysteryEncounter = MysteryEncounterBuilder } }) .build()) - .withOptionPhase(async (scene: BattleScene) => { + .withSimpleOption(async (scene: BattleScene) => { // Leave encounter with no rewards or exp leaveEncounterWithoutBattle(scene, true); return true; diff --git a/src/data/mystery-encounters/encounters/mysterious-challengers.ts b/src/data/mystery-encounters/encounters/mysterious-challengers.ts index 880c7be4ca2..db794c58e9f 100644 --- a/src/data/mystery-encounters/encounters/mysterious-challengers.ts +++ b/src/data/mystery-encounters/encounters/mysterious-challengers.ts @@ -95,7 +95,7 @@ export const MysteriousChallengersEncounter: MysteryEncounter = MysteryEncounter return true; }) - .withOptionPhase(async (scene: BattleScene) => { + .withSimpleOption(async (scene: BattleScene) => { const encounter = scene.currentBattle.mysteryEncounter; // Spawn standard trainer battle with memory mushroom reward const config: EnemyPartyConfig = encounter.enemyPartyConfigs[0]; @@ -109,7 +109,7 @@ export const MysteriousChallengersEncounter: MysteryEncounter = MysteryEncounter }, scene.currentBattle.waveIndex * 10); return ret; }) - .withOptionPhase(async (scene: BattleScene) => { + .withSimpleOption(async (scene: BattleScene) => { const encounter = scene.currentBattle.mysteryEncounter; // Spawn hard fight with ULTRA/GREAT reward (can improve with luck) const config: EnemyPartyConfig = encounter.enemyPartyConfigs[1]; @@ -123,7 +123,7 @@ export const MysteriousChallengersEncounter: MysteryEncounter = MysteryEncounter }, scene.currentBattle.waveIndex * 100); return ret; }) - .withOptionPhase(async (scene: BattleScene) => { + .withSimpleOption(async (scene: BattleScene) => { const encounter = scene.currentBattle.mysteryEncounter; // Spawn brutal fight with ROGUE/ULTRA/GREAT reward (can improve with luck) const config: EnemyPartyConfig = encounter.enemyPartyConfigs[2]; diff --git a/src/data/mystery-encounters/encounters/mysterious-chest.ts b/src/data/mystery-encounters/encounters/mysterious-chest.ts index 5e572131562..69ae93f312f 100644 --- a/src/data/mystery-encounters/encounters/mysterious-chest.ts +++ b/src/data/mystery-encounters/encounters/mysterious-chest.ts @@ -85,7 +85,7 @@ export const MysteriousChestEncounter: MysteryEncounter = MysteryEncounterBuilde }) .build() ) - .withOptionPhase(async (scene: BattleScene) => { + .withSimpleOption(async (scene: BattleScene) => { // Leave encounter with no rewards or exp leaveEncounterWithoutBattle(scene, true); return true; diff --git a/src/data/mystery-encounters/encounters/shady-vitamin-dealer.ts b/src/data/mystery-encounters/encounters/shady-vitamin-dealer.ts index 21e1b199e04..6ab668d73a6 100644 --- a/src/data/mystery-encounters/encounters/shady-vitamin-dealer.ts +++ b/src/data/mystery-encounters/encounters/shady-vitamin-dealer.ts @@ -186,7 +186,7 @@ export const ShadyVitaminDealerEncounter: MysteryEncounter = MysteryEncounterBui chosenPokemon.updateInfo(); }) .build()) - .withOptionPhase(async (scene: BattleScene) => { + .withSimpleOption(async (scene: BattleScene) => { // Leave encounter with no rewards or exp leaveEncounterWithoutBattle(scene, true); return true; diff --git a/src/data/mystery-encounters/encounters/sleeping-snorlax.ts b/src/data/mystery-encounters/encounters/sleeping-snorlax.ts index 444ce5a6581..6a820812ae1 100644 --- a/src/data/mystery-encounters/encounters/sleeping-snorlax.ts +++ b/src/data/mystery-encounters/encounters/sleeping-snorlax.ts @@ -55,13 +55,13 @@ export const SleepingSnorlaxEncounter: MysteryEncounter = MysteryEncounterBuilde encounter.enemyPartyConfigs = [config]; return true; }) - .withOptionPhase(async (scene: BattleScene) => { + .withSimpleOption(async (scene: BattleScene) => { // Pick battle // TODO: do we want special rewards for this? // setCustomEncounterRewards(scene, { guaranteedModifierTypeFuncs: [modifierTypes.LEFTOVERS], fillRemaining: true}); await initBattleWithEnemyConfig(scene, scene.currentBattle.mysteryEncounter.enemyPartyConfigs[0]); }) - .withOptionPhase(async (scene: BattleScene) => { + .withSimpleOption(async (scene: BattleScene) => { const instance = scene.currentBattle.mysteryEncounter; let roll: integer; scene.executeWithSeedOffset(() => { diff --git a/src/data/mystery-encounters/mystery-encounter-dialogue.ts b/src/data/mystery-encounters/mystery-encounter-dialogue.ts index c0eb3fdfec7..11135a58085 100644 --- a/src/data/mystery-encounters/mystery-encounter-dialogue.ts +++ b/src/data/mystery-encounters/mystery-encounter-dialogue.ts @@ -1,7 +1,6 @@ import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { MysteriousChallengersDialogue } from "#app/data/mystery-encounters/dialogue/mysterious-challengers-dialogue"; import { MysteriousChestDialogue } from "#app/data/mystery-encounters/dialogue/mysterious-chest-dialogue"; -import { DarkDealDialogue } from "#app/data/mystery-encounters/dialogue/dark-deal-dialogue"; import { FightOrFlightDialogue } from "#app/data/mystery-encounters/dialogue/fight-or-flight-dialogue"; import { TrainingSessionDialogue } from "#app/data/mystery-encounters/dialogue/training-session-dialogue"; import { SleepingSnorlaxDialogue } from "./dialogue/sleeping-snorlax-dialogue"; @@ -26,15 +25,15 @@ export class OptionTextDisplay { } export class EncounterOptionsDialogue { - title: TemplateStringsArray | `mysteryEncounter:${string}`; - description: TemplateStringsArray | `mysteryEncounter:${string}`; + title?: TemplateStringsArray | `mysteryEncounter:${string}`; + description?: TemplateStringsArray | `mysteryEncounter:${string}`; query?: TemplateStringsArray | `mysteryEncounter:${string}`; options?: [...OptionTextDisplay[]]; // Options array with minimum 2 options } export default class MysteryEncounterDialogue { intro?: TextDisplay[]; - encounterOptionsDialogue: EncounterOptionsDialogue; + encounterOptionsDialogue?: EncounterOptionsDialogue; outro?: TextDisplay[]; } @@ -87,7 +86,6 @@ export const allMysteryEncounterDialogue: { [encounterType: number]: MysteryEnco export function initMysteryEncounterDialogue() { allMysteryEncounterDialogue[MysteryEncounterType.MYSTERIOUS_CHALLENGERS] = MysteriousChallengersDialogue; allMysteryEncounterDialogue[MysteryEncounterType.MYSTERIOUS_CHEST] = MysteriousChestDialogue; - allMysteryEncounterDialogue[MysteryEncounterType.DARK_DEAL] = DarkDealDialogue; allMysteryEncounterDialogue[MysteryEncounterType.FIGHT_OR_FLIGHT] = FightOrFlightDialogue; allMysteryEncounterDialogue[MysteryEncounterType.TRAINING_SESSION] = TrainingSessionDialogue; allMysteryEncounterDialogue[MysteryEncounterType.SLEEPING_SNORLAX] = SleepingSnorlaxDialogue; diff --git a/src/data/mystery-encounters/mystery-encounter.ts b/src/data/mystery-encounters/mystery-encounter.ts index 6c8c0b4381d..0780aa33ae4 100644 --- a/src/data/mystery-encounters/mystery-encounter.ts +++ b/src/data/mystery-encounters/mystery-encounter.ts @@ -7,7 +7,8 @@ import MysteryEncounterIntroVisuals, { MysteryEncounterSpriteConfig } from "../. import * as Utils from "../../utils"; import { StatusEffect } from "../status-effect"; import MysteryEncounterDialogue, { - allMysteryEncounterDialogue + allMysteryEncounterDialogue, + OptionTextDisplay } from "./mystery-encounter-dialogue"; import MysteryEncounterOption, { MysteryEncounterOptionBuilder, OptionPhaseCallback } from "./mystery-encounter-option"; import { @@ -136,9 +137,7 @@ export default class MysteryEncounter implements MysteryEncounter { Object.assign(this, encounter); } this.encounterTier = this.encounterTier ? this.encounterTier : MysteryEncounterTier.COMMON; - this.dialogue = Object.assign((this.dialogue ?? {}), allMysteryEncounterDialogue[this.encounterType]); - // this.dialogue = allMysteryEncounterDialogue[this.encounterType]; - console.log(`${MysteryEncounterType[encounter.encounterType]} Encounter Dialogue:`, this.dialogue); + this.dialogue = Object.assign((this.dialogue ?? {}), allMysteryEncounterDialogue[this.encounterType] ?? {}); this.encounterVariant = MysteryEncounterVariant.DEFAULT; this.requirements = this.requirements ? this.requirements : []; this.hideBattleIntroMessage = !isNullOrUndefined(this.hideBattleIntroMessage) ? this.hideBattleIntroMessage : false; @@ -399,11 +398,12 @@ export class MysteryEncounterBuilder implements Partial { * Adds a streamlined option phase. * Only use if no pre-/post-options or condtions necessary. * - * @param callback - OptionPhaseCallback + * @param dialogue - {@linkcode OptionTextDisplay} + * @param callback - {@linkcode OptionPhaseCallback} * @returns */ - withOptionPhase(callback: OptionPhaseCallback) { - return this.withOption(new MysteryEncounterOptionBuilder().withOptionPhase(callback).build()); + withSimpleOption(dialogue: OptionTextDisplay, callback: OptionPhaseCallback) { + return this.withOption(new MysteryEncounterOptionBuilder().withDialogue(dialogue).withOptionPhase(callback).build()); } /** @@ -413,12 +413,10 @@ export class MysteryEncounterBuilder implements Partial { * @returns */ withIntroSpriteConfigs(spriteConfigs: MysteryEncounterSpriteConfig[]): this & Pick { - console.debug("with intro sprite configs: ", spriteConfigs); return Object.assign(this, { spriteConfigs: spriteConfigs }); } - withIntroDialogue(dialogue: MysteryEncounterDialogue["intro"] = []): this { - console.debug("with intro dialogue: ", dialogue); + withIntroDialogue(dialogue: MysteryEncounterDialogue["intro"] = []) { this.dialogue = {...this.dialogue, intro: dialogue }; return this; } @@ -581,6 +579,56 @@ export class MysteryEncounterBuilder implements Partial { return Object.assign(this, { hideIntroVisuals: hideIntroVisuals }); } + withTitle(title: TemplateStringsArray | `mysteryEncounter:${string}`) { + const dialogue = this.dialogue ?? {}; + const encounterOptionsDialogue = this.dialogue?.encounterOptionsDialogue ?? {}; + + this.dialogue = { + ...dialogue, + encounterOptionsDialogue: { + ...encounterOptionsDialogue, + title, + } + }; + + return this; + } + + withDescription(description: TemplateStringsArray | `mysteryEncounter:${string}`) { + const dialogue = this.dialogue ?? {}; + const encounterOptionsDialogue = this.dialogue?.encounterOptionsDialogue ?? {}; + + this.dialogue = { + ...dialogue, + encounterOptionsDialogue: { + ...encounterOptionsDialogue, + description, + } + }; + + return this; + } + + withQuery(query: TemplateStringsArray | `mysteryEncounter:${string}`) { + const dialogue = this.dialogue ?? {}; + const encounterOptionsDialogue = this.dialogue?.encounterOptionsDialogue ?? {}; + + this.dialogue = { + ...dialogue, + encounterOptionsDialogue: { + ...encounterOptionsDialogue, + query, + } + }; + + return this; + } + + withOutroDialogue(dialogue: MysteryEncounterDialogue["outro"] = []) { + this.dialogue = {...this.dialogue, outro: dialogue }; + return this; + } + build(this: MysteryEncounter) { return new MysteryEncounter(this); } diff --git a/src/ui/mystery-encounter-ui-handler.ts b/src/ui/mystery-encounter-ui-handler.ts index 5c0ceac4964..c446481b744 100644 --- a/src/ui/mystery-encounter-ui-handler.ts +++ b/src/ui/mystery-encounter-ui-handler.ts @@ -424,12 +424,13 @@ export default class MysteryEncounterUiHandler extends UiHandler { } const mysteryEncounter = this.scene.currentBattle.mysteryEncounter; - let text; - const option = mysteryEncounter.dialogue.encounterOptionsDialogue.options[cursor]; - if (!this.optionsMeetsReqs[cursor] && this.filteredEncounterOptions[cursor].isDisabledOnRequirementsNotMet && option.disabledTooltip) { - text = getEncounterText(this.scene, option.disabledTooltip, TextStyle.TOOLTIP_CONTENT); + let text: string; + const option = this.filteredEncounterOptions[cursor]; + const optionDialogue = option.dialogue ?? mysteryEncounter.dialogue.encounterOptionsDialogue.options[cursor]; + if (!this.optionsMeetsReqs[cursor] && this.filteredEncounterOptions[cursor].isDisabledOnRequirementsNotMet && optionDialogue.disabledTooltip) { + text = getEncounterText(this.scene, optionDialogue.disabledTooltip, TextStyle.TOOLTIP_CONTENT); } else { - text = getEncounterText(this.scene, option.buttonTooltip, TextStyle.TOOLTIP_CONTENT); + text = getEncounterText(this.scene, optionDialogue.buttonTooltip, TextStyle.TOOLTIP_CONTENT); } // Auto-color options green/blue for good/bad by looking for (+)/(-) From d9e0957d409828895abe2f52a09dd992440b4519 Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Thu, 11 Jul 2024 13:35:46 -0700 Subject: [PATCH 061/270] migrate department-store-sale encounter --- .../department-store-sale-dialogue.ts | 36 --- .../encounters/dark-deal.ts | 35 +-- .../encounters/department-store-sale.ts | 242 +++++++++++------- .../mystery-encounter-dialogue.ts | 2 - 4 files changed, 168 insertions(+), 147 deletions(-) delete mode 100644 src/data/mystery-encounters/dialogue/department-store-sale-dialogue.ts diff --git a/src/data/mystery-encounters/dialogue/department-store-sale-dialogue.ts b/src/data/mystery-encounters/dialogue/department-store-sale-dialogue.ts deleted file mode 100644 index 87cd8dbda55..00000000000 --- a/src/data/mystery-encounters/dialogue/department-store-sale-dialogue.ts +++ /dev/null @@ -1,36 +0,0 @@ -import MysteryEncounterDialogue from "#app/data/mystery-encounters/mystery-encounter-dialogue"; - -export const DepartmentStoreSaleDialogue: MysteryEncounterDialogue = { - intro: [ - { - text: "mysteryEncounter:department_store_sale_intro_message" - }, - { - text: "mysteryEncounter:department_store_sale_intro_dialogue", - speaker: "mysteryEncounter:department_store_sale_speaker" - } - ], - encounterOptionsDialogue: { - title: "mysteryEncounter:department_store_sale_title", - description: "mysteryEncounter:department_store_sale_description", - query: "mysteryEncounter:department_store_sale_query", - options: [ - { - buttonLabel: "mysteryEncounter:department_store_sale_option_1_label", - buttonTooltip: "mysteryEncounter:department_store_sale_option_1_tooltip" - }, - { - buttonLabel: "mysteryEncounter:department_store_sale_option_2_label", - buttonTooltip: "mysteryEncounter:department_store_sale_option_2_tooltip" - }, - { - buttonLabel: "mysteryEncounter:department_store_sale_option_3_label", - buttonTooltip: "mysteryEncounter:department_store_sale_option_3_tooltip" - }, - { - buttonLabel: "mysteryEncounter:department_store_sale_option_4_label", - buttonTooltip: "mysteryEncounter:department_store_sale_option_4_tooltip" - } - ] - } -}; diff --git a/src/data/mystery-encounters/encounters/dark-deal.ts b/src/data/mystery-encounters/encounters/dark-deal.ts index 740c4e86c28..8f13e373e9a 100644 --- a/src/data/mystery-encounters/encounters/dark-deal.ts +++ b/src/data/mystery-encounters/encounters/dark-deal.ts @@ -21,6 +21,9 @@ import { leaveEncounterWithoutBattle, } from "../mystery-encounter-utils"; +/** i18n namespace for encounter */ +const namespace = "mysteryEncounter:dark_deal"; + // Exclude Ultra Beasts, Paradox, Necrozma, Eternatus, and egg-locked mythicals const excludedBosses = [ Species.NECROZMA, @@ -88,31 +91,31 @@ export const DarkDealEncounter: MysteryEncounter = ]) .withIntroDialogue([ { - text: "mysteryEncounter:dark_deal_intro_message", + text: `${namespace}_intro_message`, }, { - speaker: "mysteryEncounter:dark_deal_speaker", - text: "mysteryEncounter:dark_deal_intro_dialogue", + speaker: `${namespace}_speaker`, + text: `${namespace}_intro_dialogue`, }, ]) .withSceneWaveRangeRequirement(30, 180) // waves 30 to 180 .withScenePartySizeRequirement(2, 6) // Must have at least 2 pokemon in party .withCatchAllowed(true) - .withTitle("mysteryEncounter:dark_deal_title") - .withDescription("mysteryEncounter:dark_deal_description") - .withQuery("mysteryEncounter:dark_deal_query") + .withTitle(`${namespace}_title`) + .withDescription(`${namespace}_description`) + .withQuery(`${namespace}_query`) .withOption( new MysteryEncounterOptionBuilder() .withDialogue({ - buttonLabel: "mysteryEncounter:dark_deal_option_1_label", - buttonTooltip: "mysteryEncounter:dark_deal_option_1_tooltip", + buttonLabel: `${namespace}_option_1_label`, + buttonTooltip: `${namespace}_option_1_tooltip`, selected: [ { - speaker: "mysteryEncounter:dark_deal_speaker", - text: "mysteryEncounter:dark_deal_option_1_selected", + speaker: `${namespace}_speaker`, + text: `${namespace}_option_1_selected`, }, { - text: "mysteryEncounter:dark_deal_option_1_selected_message", + text: `${namespace}_option_1_selected_message`, }, ], }) @@ -180,12 +183,12 @@ export const DarkDealEncounter: MysteryEncounter = ) .withSimpleOption( { - buttonLabel: "mysteryEncounter:dark_deal_option_2_label", - buttonTooltip: "mysteryEncounter:dark_deal_option_2_tooltip", + buttonLabel: `${namespace}_option_2_label`, + buttonTooltip: `${namespace}_option_2_tooltip`, selected: [ { - speaker: "mysteryEncounter:dark_deal_speaker", - text: "mysteryEncounter:dark_deal_option_2_selected", + speaker: `${namespace}_speaker`, + text: `${namespace}_option_2_selected`, }, ], }, @@ -198,7 +201,7 @@ export const DarkDealEncounter: MysteryEncounter = ) .withOutroDialogue([ { - text: "mysteryEncounter:dark_deal_outro" + text: `${namespace}_outro` } ]) .build(); diff --git a/src/data/mystery-encounters/encounters/department-store-sale.ts b/src/data/mystery-encounters/encounters/department-store-sale.ts index 4323fc15434..2dcee4455df 100644 --- a/src/data/mystery-encounters/encounters/department-store-sale.ts +++ b/src/data/mystery-encounters/encounters/department-store-sale.ts @@ -7,104 +7,160 @@ import { randSeedInt } from "#app/utils"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { Species } from "#enums/species"; import BattleScene from "../../../battle-scene"; -import MysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier } from "../mystery-encounter"; +import MysteryEncounter, { + MysteryEncounterBuilder, + MysteryEncounterTier, +} from "../mystery-encounter"; -export const DepartmentStoreSaleEncounter: MysteryEncounter = MysteryEncounterBuilder - .withEncounterType(MysteryEncounterType.DEPARTMENT_STORE_SALE) - .withEncounterTier(MysteryEncounterTier.COMMON) - .withIntroSpriteConfigs([ - { - spriteKey: "b2w2_lady", - fileRoot: "mystery-encounters", - hasShadow: true, - x: -20 - }, - { - spriteKey: Species.FURFROU.toString(), - fileRoot: "pokemon", - hasShadow: true, - repeat: true, - x: 30 - } - ]) - // .withHideIntroVisuals(false) - .withSceneWaveRangeRequirement(10, 100) - .withSimpleOption(async (scene: BattleScene) => { - // Choose TMs - const modifiers = []; - let i = 0; - while (i < 4) { - // 2/2/1 weight on TM rarity - const roll = randSeedInt(5); - if (roll < 2) { - modifiers.push(modifierTypes.TM_COMMON); - } else if (roll < 4) { - modifiers.push(modifierTypes.TM_GREAT); - } else { - modifiers.push(modifierTypes.TM_ULTRA); +/** i18n namespace for encounter */ +const namespace = "mysteryEncounter:department_store_sale"; + +export const DepartmentStoreSaleEncounter: MysteryEncounter = + MysteryEncounterBuilder.withEncounterType( + MysteryEncounterType.DEPARTMENT_STORE_SALE + ) + .withEncounterTier(MysteryEncounterTier.COMMON) + .withSceneWaveRangeRequirement(10, 100) + .withIntroSpriteConfigs([ + { + spriteKey: "b2w2_lady", + fileRoot: "mystery-encounters", + hasShadow: true, + x: -20, + }, + { + spriteKey: Species.FURFROU.toString(), + fileRoot: "pokemon", + hasShadow: true, + repeat: true, + x: 30, + }, + ]) + .withIntroDialogue([ + { + text: `${namespace}_intro_message`, + }, + { + text: `${namespace}_intro_dialogue`, + speaker: `${namespace}_speaker`, + }, + ]) + // .withHideIntroVisuals(false) + .withTitle(`${namespace}_title`) + .withDescription(`${namespace}_description`) + .withQuery(`${namespace}_query`) + .withSimpleOption( + { + buttonLabel: `${namespace}_option_1_label`, + buttonTooltip: `${namespace}_option_1_tooltip`, + }, + async (scene: BattleScene) => { + // Choose TMs + const modifiers = []; + let i = 0; + while (i < 4) { + // 2/2/1 weight on TM rarity + const roll = randSeedInt(5); + if (roll < 2) { + modifiers.push(modifierTypes.TM_COMMON); + } else if (roll < 4) { + modifiers.push(modifierTypes.TM_GREAT); + } else { + modifiers.push(modifierTypes.TM_ULTRA); + } + i++; + } + + setEncounterRewards(scene, { + guaranteedModifierTypeFuncs: modifiers, + fillRemaining: false, + }); + leaveEncounterWithoutBattle(scene); } - i++; - } + ) + .withSimpleOption( + { + buttonLabel: `${namespace}_option_2_label`, + buttonTooltip: `${namespace}_option_2_tooltip`, + }, + async (scene: BattleScene) => { + // Choose Vitamins + const modifiers = []; + let i = 0; + while (i < 3) { + // 2/1 weight on base stat booster vs PP Up + const roll = randSeedInt(3); + if (roll === 0) { + modifiers.push(modifierTypes.PP_UP); + } else { + modifiers.push(modifierTypes.BASE_STAT_BOOSTER); + } + i++; + } - setEncounterRewards(scene, { guaranteedModifierTypeFuncs: modifiers, fillRemaining: false }); - leaveEncounterWithoutBattle(scene); - }) - .withSimpleOption(async (scene: BattleScene) => { - // Choose Vitamins - const modifiers = []; - let i = 0; - while (i < 3) { - // 2/1 weight on base stat booster vs PP Up - const roll = randSeedInt(3); - if (roll === 0) { - modifiers.push(modifierTypes.PP_UP); - } else { - modifiers.push(modifierTypes.BASE_STAT_BOOSTER); + setEncounterRewards(scene, { + guaranteedModifierTypeFuncs: modifiers, + fillRemaining: false, + }); + leaveEncounterWithoutBattle(scene); } - i++; - } + ) + .withSimpleOption( + { + buttonLabel: `${namespace}_option_3_label`, + buttonTooltip: `${namespace}_option_3_tooltip`, + }, + async (scene: BattleScene) => { + // Choose X Items + const modifiers = []; + let i = 0; + while (i < 5) { + // 4/1 weight on base stat booster vs Dire Hit + const roll = randSeedInt(5); + if (roll === 0) { + modifiers.push(modifierTypes.DIRE_HIT); + } else { + modifiers.push(modifierTypes.TEMP_STAT_BOOSTER); + } + i++; + } - setEncounterRewards(scene, { guaranteedModifierTypeFuncs: modifiers, fillRemaining: false }); - leaveEncounterWithoutBattle(scene); - }) - .withSimpleOption(async (scene: BattleScene) => { - // Choose X Items - const modifiers = []; - let i = 0; - while (i < 5) { - // 4/1 weight on base stat booster vs Dire Hit - const roll = randSeedInt(5); - if (roll === 0) { - modifiers.push(modifierTypes.DIRE_HIT); - } else { - modifiers.push(modifierTypes.TEMP_STAT_BOOSTER); + setEncounterRewards(scene, { + guaranteedModifierTypeFuncs: modifiers, + fillRemaining: false, + }); + leaveEncounterWithoutBattle(scene); } - i++; - } + ) + .withSimpleOption( + { + buttonLabel: `${namespace}_option_4_label`, + buttonTooltip: `${namespace}_option_4_tooltip`, + }, + async (scene: BattleScene) => { + // Choose Pokeballs + const modifiers = []; + let i = 0; + while (i < 4) { + // 10/30/20/5 weight on pokeballs + const roll = randSeedInt(65); + if (roll < 10) { + modifiers.push(modifierTypes.POKEBALL); + } else if (roll < 40) { + modifiers.push(modifierTypes.GREAT_BALL); + } else if (roll < 60) { + modifiers.push(modifierTypes.ULTRA_BALL); + } else { + modifiers.push(modifierTypes.ROGUE_BALL); + } + i++; + } - setEncounterRewards(scene, { guaranteedModifierTypeFuncs: modifiers, fillRemaining: false }); - leaveEncounterWithoutBattle(scene); - }) - .withSimpleOption(async (scene: BattleScene) => { - // Choose Pokeballs - const modifiers = []; - let i = 0; - while (i < 4) { - // 10/30/20/5 weight on pokeballs - const roll = randSeedInt(65); - if (roll < 10) { - modifiers.push(modifierTypes.POKEBALL); - } else if (roll < 40) { - modifiers.push(modifierTypes.GREAT_BALL); - } else if (roll < 60) { - modifiers.push(modifierTypes.ULTRA_BALL); - } else { - modifiers.push(modifierTypes.ROGUE_BALL); + setEncounterRewards(scene, { + guaranteedModifierTypeFuncs: modifiers, + fillRemaining: false, + }); + leaveEncounterWithoutBattle(scene); } - i++; - } - - setEncounterRewards(scene, { guaranteedModifierTypeFuncs: modifiers, fillRemaining: false }); - leaveEncounterWithoutBattle(scene); - }) - .build(); + ) + .build(); diff --git a/src/data/mystery-encounters/mystery-encounter-dialogue.ts b/src/data/mystery-encounters/mystery-encounter-dialogue.ts index 11135a58085..d6938f49607 100644 --- a/src/data/mystery-encounters/mystery-encounter-dialogue.ts +++ b/src/data/mystery-encounters/mystery-encounter-dialogue.ts @@ -4,7 +4,6 @@ import { MysteriousChestDialogue } from "#app/data/mystery-encounters/dialogue/m import { FightOrFlightDialogue } from "#app/data/mystery-encounters/dialogue/fight-or-flight-dialogue"; import { TrainingSessionDialogue } from "#app/data/mystery-encounters/dialogue/training-session-dialogue"; import { SleepingSnorlaxDialogue } from "./dialogue/sleeping-snorlax-dialogue"; -import { DepartmentStoreSaleDialogue } from "#app/data/mystery-encounters/dialogue/department-store-sale-dialogue"; import { ShadyVitaminDealerDialogue } from "#app/data/mystery-encounters/dialogue/shady-vitamin-dealer"; import { TextStyle } from "#app/ui/text"; import { FieldTripDialogue } from "#app/data/mystery-encounters/dialogue/field-trip-dialogue"; @@ -89,7 +88,6 @@ export function initMysteryEncounterDialogue() { allMysteryEncounterDialogue[MysteryEncounterType.FIGHT_OR_FLIGHT] = FightOrFlightDialogue; allMysteryEncounterDialogue[MysteryEncounterType.TRAINING_SESSION] = TrainingSessionDialogue; allMysteryEncounterDialogue[MysteryEncounterType.SLEEPING_SNORLAX] = SleepingSnorlaxDialogue; - allMysteryEncounterDialogue[MysteryEncounterType.DEPARTMENT_STORE_SALE] = DepartmentStoreSaleDialogue; allMysteryEncounterDialogue[MysteryEncounterType.SHADY_VITAMIN_DEALER] = ShadyVitaminDealerDialogue; allMysteryEncounterDialogue[MysteryEncounterType.FIELD_TRIP] = FieldTripDialogue; } From ce73c38e330694108e856d05bf9d8c7cb5ad77eb Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Thu, 11 Jul 2024 13:47:10 -0700 Subject: [PATCH 062/270] migrate field-trip encounter --- .../dialogue/field-trip-dialogue.ts | 50 -- .../encounters/field-trip-encounter.ts | 509 +++++++++++------- .../mystery-encounter-dialogue.ts | 2 - 3 files changed, 311 insertions(+), 250 deletions(-) delete mode 100644 src/data/mystery-encounters/dialogue/field-trip-dialogue.ts diff --git a/src/data/mystery-encounters/dialogue/field-trip-dialogue.ts b/src/data/mystery-encounters/dialogue/field-trip-dialogue.ts deleted file mode 100644 index dca3f48f5bf..00000000000 --- a/src/data/mystery-encounters/dialogue/field-trip-dialogue.ts +++ /dev/null @@ -1,50 +0,0 @@ -import MysteryEncounterDialogue from "#app/data/mystery-encounters/mystery-encounter-dialogue"; - -export const FieldTripDialogue: MysteryEncounterDialogue = { - intro: [ - { - text: "mysteryEncounter:field_trip_intro_message" - }, - { - text: "mysteryEncounter:field_trip_intro_dialogue", - speaker: "mysteryEncounter:field_trip_speaker" - } - ], - encounterOptionsDialogue: { - title: "mysteryEncounter:field_trip_title", - description: "mysteryEncounter:field_trip_description", - query: "mysteryEncounter:field_trip_query", - options: [ - { - buttonLabel: "mysteryEncounter:field_trip_option_1_label", - buttonTooltip: "mysteryEncounter:field_trip_option_1_tooltip", - secondOptionPrompt: "mysteryEncounter:field_trip_second_option_prompt", - selected: [ - { - text: "mysteryEncounter:field_trip_option_selected" - } - ] - }, - { - buttonLabel: "mysteryEncounter:field_trip_option_2_label", - buttonTooltip: "mysteryEncounter:field_trip_option_2_tooltip", - secondOptionPrompt: "mysteryEncounter:field_trip_second_option_prompt", - selected: [ - { - text: "mysteryEncounter:field_trip_option_selected" - } - ] - }, - { - buttonLabel: "mysteryEncounter:field_trip_option_3_label", - buttonTooltip: "mysteryEncounter:field_trip_option_3_tooltip", - secondOptionPrompt: "mysteryEncounter:field_trip_second_option_prompt", - selected: [ - { - text: "mysteryEncounter:field_trip_option_selected" - } - ] - } - ] - } -}; diff --git a/src/data/mystery-encounters/encounters/field-trip-encounter.ts b/src/data/mystery-encounters/encounters/field-trip-encounter.ts index 410df127b6e..8cb6fe65048 100644 --- a/src/data/mystery-encounters/encounters/field-trip-encounter.ts +++ b/src/data/mystery-encounters/encounters/field-trip-encounter.ts @@ -1,220 +1,333 @@ -import { generateModifierTypeOption, leaveEncounterWithoutBattle, selectPokemonForOption, setEncounterExp, setEncounterRewards, } from "#app/data/mystery-encounters/mystery-encounter-utils"; +import { MoveCategory } from "#app/data/move"; +import { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; +import { + generateModifierTypeOption, + leaveEncounterWithoutBattle, + selectPokemonForOption, + setEncounterExp, + setEncounterRewards, +} from "#app/data/mystery-encounters/mystery-encounter-utils"; +import { TempBattleStat } from "#app/data/temp-battle-stat"; +import { PlayerPokemon, PokemonMove } from "#app/field/pokemon"; import { modifierTypes } from "#app/modifier/modifier-type"; +import { OptionSelectItem } from "#app/ui/abstact-option-select-ui-handler"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import BattleScene from "../../../battle-scene"; -import MysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier } from "../mystery-encounter"; -import { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; -import { PlayerPokemon, PokemonMove } from "#app/field/pokemon"; -import { OptionSelectItem } from "#app/ui/abstact-option-select-ui-handler"; -import { MoveCategory } from "#app/data/move"; -import { TempBattleStat } from "#app/data/temp-battle-stat"; +import MysteryEncounter, { + MysteryEncounterBuilder, + MysteryEncounterTier, +} from "../mystery-encounter"; -export const FieldTripEncounter: MysteryEncounter = MysteryEncounterBuilder - .withEncounterType(MysteryEncounterType.FIELD_TRIP) - .withEncounterTier(MysteryEncounterTier.COMMON) - .withIntroSpriteConfigs([ - { - spriteKey: "preschooler_m", - fileRoot: "trainer", - hasShadow: true - }, - { - spriteKey: "teacher", - fileRoot: "mystery-encounters", - hasShadow: true - }, - { - spriteKey: "preschooler_f", - fileRoot: "trainer", - hasShadow: true - }, - ]) - .withHideIntroVisuals(false) - .withSceneWaveRangeRequirement(10, 180) - .withOption(new MysteryEncounterOptionBuilder() - .withPreOptionPhase(async (scene: BattleScene): Promise => { - const encounter = scene.currentBattle.mysteryEncounter; - const onPokemonSelected = (pokemon: PlayerPokemon) => { - // Return the options for Pokemon move valid for this option - return pokemon.moveset.map((move: PokemonMove) => { - const option: OptionSelectItem = { - label: move.getName(), - handler: () => { - // Pokemon and move selected - const correctMove = move.getMove().category === MoveCategory.PHYSICAL; - encounter.setDialogueToken("moveCategory", "Physical"); - if (!correctMove) { - encounter.dialogue.encounterOptionsDialogue.options[0].selected = [ - { - text: "mysteryEncounter:field_trip_option_incorrect", - speaker: "mysteryEncounter:field_trip_speaker" - }, - { - text: "mysteryEncounter:field_trip_lesson_learned", +/** i18n namespace for the encounter */ +const namespace = "mysteryEncounter:field_trip"; + +export const FieldTripEncounter: MysteryEncounter = + MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.FIELD_TRIP) + .withEncounterTier(MysteryEncounterTier.COMMON) + .withSceneWaveRangeRequirement(10, 180) + .withIntroSpriteConfigs([ + { + spriteKey: "preschooler_m", + fileRoot: "trainer", + hasShadow: true, + }, + { + spriteKey: "teacher", + fileRoot: "mystery-encounters", + hasShadow: true, + }, + { + spriteKey: "preschooler_f", + fileRoot: "trainer", + hasShadow: true, + }, + ]) + .withIntroDialogue([ + { + text: `${namespace}_intro_message`, + }, + { + text: `${namespace}_intro_dialogue`, + speaker: `${namespace}_speaker`, + }, + ]) + .withHideIntroVisuals(false) + .withTitle(`${namespace}_title`) + .withDescription(`${namespace}_description`) + .withQuery(`${namespace}_query`) + .withOption( + new MysteryEncounterOptionBuilder() + .withDialogue({ + buttonLabel: `${namespace}_option_1_label`, + buttonTooltip: `${namespace}_option_1_tooltip`, + secondOptionPrompt: `${namespace}_second_option_prompt`, + selected: [ + { + text: `${namespace}_option_selected`, + }, + ], + }) + .withPreOptionPhase(async (scene: BattleScene): Promise => { + const encounter = scene.currentBattle.mysteryEncounter; + const onPokemonSelected = (pokemon: PlayerPokemon) => { + // Return the options for Pokemon move valid for this option + return pokemon.moveset.map((move: PokemonMove) => { + const option: OptionSelectItem = { + label: move.getName(), + handler: () => { + // Pokemon and move selected + const correctMove = + move.getMove().category === MoveCategory.PHYSICAL; + encounter.setDialogueToken("moveCategory", "Physical"); + if (!correctMove) { + encounter.options[0].dialogue.selected = [ + { + text: `${namespace}_option_incorrect`, + speaker: `${namespace}_speaker`, + }, + { + text: `${namespace}_lesson_learned`, + }, + ]; + setEncounterExp( + scene, + scene.getParty().map((p) => p.id), + 50 + ); + } else { + encounter.setDialogueToken("pokeName", pokemon.name); + encounter.setDialogueToken("move", move.getName()); + encounter.options[0].dialogue.selected = [ + { + text: `${namespace}_option_selected`, + }, + ]; + setEncounterExp(scene, [pokemon.id], 100); } - ]; - setEncounterExp(scene, scene.getParty().map(p => p.id), 50); - } else { - encounter.setDialogueToken("pokeName", pokemon.name); - encounter.setDialogueToken("move", move.getName()); - encounter.dialogue.encounterOptionsDialogue.options[0].selected = [ - { - text: "mysteryEncounter:field_trip_option_selected" - } - ]; - setEncounterExp(scene, [pokemon.id], 100); - } - encounter.misc = { - correctMove: correctMove + encounter.misc = { + correctMove: correctMove, + }; + return true; + }, }; - return true; - } + return option; + }); }; - return option; - }); - }; - return selectPokemonForOption(scene, onPokemonSelected); - }) - .withOptionPhase(async (scene: BattleScene) => { - 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) - ]; + return selectPokemonForOption(scene, onPokemonSelected); + }) + .withOptionPhase(async (scene: BattleScene) => { + 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), + ]; - setEncounterRewards(scene, { guaranteedModifierTypeOptions: modifiers, fillRemaining: false }); - } + setEncounterRewards(scene, { + guaranteedModifierTypeOptions: modifiers, + fillRemaining: false, + }); + } - leaveEncounterWithoutBattle(scene, !encounter.misc.correctMove); - }) - .build() - ) - .withOption(new MysteryEncounterOptionBuilder() - .withPreOptionPhase(async (scene: BattleScene): Promise => { - const encounter = scene.currentBattle.mysteryEncounter; - const onPokemonSelected = (pokemon: PlayerPokemon) => { - // Return the options for Pokemon move valid for this option - return pokemon.moveset.map((move: PokemonMove) => { - const option: OptionSelectItem = { - label: move.getName(), - handler: () => { - // Pokemon and move selected - const correctMove = move.getMove().category === MoveCategory.SPECIAL; - encounter.setDialogueToken("moveCategory", "Special"); - if (!correctMove) { - encounter.dialogue.encounterOptionsDialogue.options[1].selected = [ - { - text: "mysteryEncounter:field_trip_option_incorrect", - speaker: "mysteryEncounter:field_trip_speaker" - }, - { - text: "mysteryEncounter:field_trip_lesson_learned", + leaveEncounterWithoutBattle(scene, !encounter.misc.correctMove); + }) + .build() + ) + .withOption( + new MysteryEncounterOptionBuilder() + .withDialogue({ + buttonLabel: `${namespace}_option_2_label`, + buttonTooltip: `${namespace}_option_2_tooltip`, + secondOptionPrompt: `${namespace}_second_option_prompt`, + selected: [ + { + text: `${namespace}_option_selected`, + }, + ], + }) + .withPreOptionPhase(async (scene: BattleScene): Promise => { + const encounter = scene.currentBattle.mysteryEncounter; + const onPokemonSelected = (pokemon: PlayerPokemon) => { + // Return the options for Pokemon move valid for this option + return pokemon.moveset.map((move: PokemonMove) => { + const option: OptionSelectItem = { + label: move.getName(), + handler: () => { + // Pokemon and move selected + const correctMove = + move.getMove().category === MoveCategory.SPECIAL; + encounter.setDialogueToken("moveCategory", "Special"); + if (!correctMove) { + encounter.options[1].dialogue.selected = [ + { + text: `${namespace}_option_incorrect`, + speaker: `${namespace}_speaker`, + }, + { + text: `${namespace}_lesson_learned`, + }, + ]; + setEncounterExp( + scene, + scene.getParty().map((p) => p.id), + 50 + ); + } else { + encounter.setDialogueToken("pokeName", pokemon.name); + encounter.setDialogueToken("move", move.getName()); + encounter.options[1].dialogue.selected = [ + { + text: `${namespace}_option_selected`, + }, + ]; + setEncounterExp(scene, [pokemon.id], 100); } - ]; - setEncounterExp(scene, scene.getParty().map(p => p.id), 50); - } else { - encounter.setDialogueToken("pokeName", pokemon.name); - encounter.setDialogueToken("move", move.getName()); - encounter.dialogue.encounterOptionsDialogue.options[1].selected = [ - { - text: "mysteryEncounter:field_trip_option_selected" - } - ]; - setEncounterExp(scene, [pokemon.id], 100); - } - encounter.misc = { - correctMove: correctMove + encounter.misc = { + correctMove: correctMove, + }; + return true; + }, }; - return true; - } + return option; + }); }; - return option; - }); - }; - return selectPokemonForOption(scene, onPokemonSelected); - }) - .withOptionPhase(async (scene: BattleScene) => { - 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) - ]; + return selectPokemonForOption(scene, onPokemonSelected); + }) + .withOptionPhase(async (scene: BattleScene) => { + 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), + ]; - setEncounterRewards(scene, { guaranteedModifierTypeOptions: modifiers, fillRemaining: false }); - } + setEncounterRewards(scene, { + guaranteedModifierTypeOptions: modifiers, + fillRemaining: false, + }); + } - leaveEncounterWithoutBattle(scene, !encounter.misc.correctMove); - }) - .build() - ) - .withOption(new MysteryEncounterOptionBuilder() - .withPreOptionPhase(async (scene: BattleScene): Promise => { - const encounter = scene.currentBattle.mysteryEncounter; - const onPokemonSelected = (pokemon: PlayerPokemon) => { - // Return the options for Pokemon move valid for this option - return pokemon.moveset.map((move: PokemonMove) => { - const option: OptionSelectItem = { - label: move.getName(), - handler: () => { - // Pokemon and move selected - const correctMove = move.getMove().category === MoveCategory.STATUS; - encounter.setDialogueToken("moveCategory", "Status"); - if (!correctMove) { - encounter.dialogue.encounterOptionsDialogue.options[2].selected = [ - { - text: "mysteryEncounter:field_trip_option_incorrect", - speaker: "mysteryEncounter:field_trip_speaker" - }, - { - text: "mysteryEncounter:field_trip_lesson_learned", + leaveEncounterWithoutBattle(scene, !encounter.misc.correctMove); + }) + .build() + ) + .withOption( + new MysteryEncounterOptionBuilder() + .withDialogue({ + buttonLabel: `${namespace}_option_3_label`, + buttonTooltip: `${namespace}_option_3_tooltip`, + secondOptionPrompt: `${namespace}_second_option_prompt`, + selected: [ + { + text: `${namespace}_option_selected`, + }, + ], + }) + .withPreOptionPhase(async (scene: BattleScene): Promise => { + const encounter = scene.currentBattle.mysteryEncounter; + const onPokemonSelected = (pokemon: PlayerPokemon) => { + // Return the options for Pokemon move valid for this option + return pokemon.moveset.map((move: PokemonMove) => { + const option: OptionSelectItem = { + label: move.getName(), + handler: () => { + // Pokemon and move selected + const correctMove = + move.getMove().category === MoveCategory.STATUS; + encounter.setDialogueToken("moveCategory", "Status"); + if (!correctMove) { + encounter.options[2].dialogue.selected = [ + { + text: `${namespace}_option_incorrect`, + speaker: `${namespace}_speaker`, + }, + { + text: `${namespace}_lesson_learned`, + }, + ]; + setEncounterExp( + scene, + scene.getParty().map((p) => p.id), + 50 + ); + } else { + encounter.setDialogueToken("pokeName", pokemon.name); + encounter.setDialogueToken("move", move.getName()); + encounter.options[2].dialogue.selected = [ + { + text: `${namespace}_option_selected`, + }, + ]; + setEncounterExp(scene, [pokemon.id], 100); } - ]; - setEncounterExp(scene, scene.getParty().map(p => p.id), 50); - } else { - encounter.setDialogueToken("pokeName", pokemon.name); - encounter.setDialogueToken("move", move.getName()); - encounter.dialogue.encounterOptionsDialogue.options[2].selected = [ - { - text: "mysteryEncounter:field_trip_option_selected" - } - ]; - setEncounterExp(scene, [pokemon.id], 100); - } - encounter.misc = { - correctMove: correctMove + encounter.misc = { + correctMove: correctMove, + }; + return true; + }, }; - return true; - } + return option; + }); }; - return option; - }); - }; - return selectPokemonForOption(scene, onPokemonSelected); - }) - .withOptionPhase(async (scene: BattleScene) => { - 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) - ]; + return selectPokemonForOption(scene, onPokemonSelected); + }) + .withOptionPhase(async (scene: BattleScene) => { + 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), + ]; - setEncounterRewards(scene, { guaranteedModifierTypeOptions: modifiers, fillRemaining: false }); - } + setEncounterRewards(scene, { + guaranteedModifierTypeOptions: modifiers, + fillRemaining: false, + }); + } - leaveEncounterWithoutBattle(scene, !encounter.misc.correctMove); - }) - .build() - ) - .build(); + leaveEncounterWithoutBattle(scene, !encounter.misc.correctMove); + }) + .build() + ) + .build(); diff --git a/src/data/mystery-encounters/mystery-encounter-dialogue.ts b/src/data/mystery-encounters/mystery-encounter-dialogue.ts index d6938f49607..bfeb094c9a5 100644 --- a/src/data/mystery-encounters/mystery-encounter-dialogue.ts +++ b/src/data/mystery-encounters/mystery-encounter-dialogue.ts @@ -6,7 +6,6 @@ import { TrainingSessionDialogue } from "#app/data/mystery-encounters/dialogue/t import { SleepingSnorlaxDialogue } from "./dialogue/sleeping-snorlax-dialogue"; import { ShadyVitaminDealerDialogue } from "#app/data/mystery-encounters/dialogue/shady-vitamin-dealer"; import { TextStyle } from "#app/ui/text"; -import { FieldTripDialogue } from "#app/data/mystery-encounters/dialogue/field-trip-dialogue"; export class TextDisplay { speaker?: TemplateStringsArray | `mysteryEncounter:${string}`; @@ -89,5 +88,4 @@ export function initMysteryEncounterDialogue() { allMysteryEncounterDialogue[MysteryEncounterType.TRAINING_SESSION] = TrainingSessionDialogue; allMysteryEncounterDialogue[MysteryEncounterType.SLEEPING_SNORLAX] = SleepingSnorlaxDialogue; allMysteryEncounterDialogue[MysteryEncounterType.SHADY_VITAMIN_DEALER] = ShadyVitaminDealerDialogue; - allMysteryEncounterDialogue[MysteryEncounterType.FIELD_TRIP] = FieldTripDialogue; } From 171339509170803b1bd6a0036f337620822316d9 Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Thu, 11 Jul 2024 13:54:44 -0700 Subject: [PATCH 063/270] migrate fight-or-flight encounter --- .../dialogue/fight-or-flight-dialogue.ts | 38 --- .../encounters/fight-or-flight.ts | 304 ++++++++++++------ .../mystery-encounter-dialogue.ts | 2 - 3 files changed, 202 insertions(+), 142 deletions(-) delete mode 100644 src/data/mystery-encounters/dialogue/fight-or-flight-dialogue.ts diff --git a/src/data/mystery-encounters/dialogue/fight-or-flight-dialogue.ts b/src/data/mystery-encounters/dialogue/fight-or-flight-dialogue.ts deleted file mode 100644 index 93d46548d7f..00000000000 --- a/src/data/mystery-encounters/dialogue/fight-or-flight-dialogue.ts +++ /dev/null @@ -1,38 +0,0 @@ -import MysteryEncounterDialogue from "#app/data/mystery-encounters/mystery-encounter-dialogue"; - -export const FightOrFlightDialogue: MysteryEncounterDialogue = { - intro: [ - { - text: "mysteryEncounter:fight_or_flight_intro_message" - } - ], - encounterOptionsDialogue: { - title: "mysteryEncounter:fight_or_flight_title", - description: "mysteryEncounter:fight_or_flight_description", - query: "mysteryEncounter:fight_or_flight_query", - options: [ - { - buttonLabel: "mysteryEncounter:fight_or_flight_option_1_label", - buttonTooltip: "mysteryEncounter:fight_or_flight_option_1_tooltip", - selected: [ - { - text: "mysteryEncounter:fight_or_flight_option_1_selected_message" - } - ] - }, - { - buttonLabel: "mysteryEncounter:fight_or_flight_option_2_label", - buttonTooltip: "mysteryEncounter:fight_or_flight_option_2_tooltip" - }, - { - buttonLabel: "mysteryEncounter:fight_or_flight_option_3_label", - buttonTooltip: "mysteryEncounter:fight_or_flight_option_3_tooltip", - selected: [ - { - text: "mysteryEncounter:fight_or_flight_option_3_selected" - } - ] - } - ] - } -}; diff --git a/src/data/mystery-encounters/encounters/fight-or-flight.ts b/src/data/mystery-encounters/encounters/fight-or-flight.ts index 2a362eaed37..3080ab76810 100644 --- a/src/data/mystery-encounters/encounters/fight-or-flight.ts +++ b/src/data/mystery-encounters/encounters/fight-or-flight.ts @@ -1,11 +1,14 @@ import { BattleStat } from "#app/data/battle-stat"; +import { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; import { EnemyPartyConfig, initBattleWithEnemyConfig, - leaveEncounterWithoutBattle, queueEncounterMessage, + leaveEncounterWithoutBattle, + queueEncounterMessage, setEncounterRewards, - showEncounterText + showEncounterText, } from "#app/data/mystery-encounters/mystery-encounter-utils"; +import { STEALING_MOVES } from "#app/data/mystery-encounters/requirements/requirement-groups"; import Pokemon from "#app/field/pokemon"; import { ModifierTier } from "#app/modifier/modifier-tier"; import { @@ -13,123 +16,220 @@ import { getPlayerModifierTypeOptions, ModifierPoolType, ModifierTypeOption, - regenerateModifierPoolThresholds + regenerateModifierPoolThresholds, } from "#app/modifier/modifier-type"; import { StatChangePhase } from "#app/phases"; import { randSeedInt } from "#app/utils"; import { BattlerTagType } from "#enums/battler-tag-type"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import BattleScene from "../../../battle-scene"; -import MysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier } from "../mystery-encounter"; +import MysteryEncounter, { + MysteryEncounterBuilder, + MysteryEncounterTier, +} from "../mystery-encounter"; import { MoveRequirement } from "../mystery-encounter-requirements"; -import { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; -import { STEALING_MOVES } from "#app/data/mystery-encounters/requirements/requirement-groups"; -export const FightOrFlightEncounter: MysteryEncounter = MysteryEncounterBuilder - .withEncounterType(MysteryEncounterType.FIGHT_OR_FLIGHT) - .withEncounterTier(MysteryEncounterTier.COMMON) - .withIntroSpriteConfigs([]) // Set in onInit() - .withSceneWaveRangeRequirement(10, 180) // waves 10 to 180 - .withCatchAllowed(true) - .withHideWildIntroMessage(true) - .withOnInit((scene: BattleScene) => { - const encounter = scene.currentBattle.mysteryEncounter; +/** the i18n namespace for the encounter */ +const namespace = "mysteryEncounter:fight_or_flight"; - // Calculate boss mon - const bossSpecies = scene.arena.randomSpecies(scene.currentBattle.waveIndex, scene.currentBattle.waveIndex, 0, getPartyLuckValue(scene.getParty()), true); - const config: EnemyPartyConfig = { - levelAdditiveMultiplier: 1, - pokemonConfigs: [{ species: bossSpecies, isBoss: true }] - }; - encounter.enemyPartyConfigs = [config]; - - // Calculate item - // 10-60 GREAT, 60-110 ULTRA, 110-160 ROGUE, 160-180 MASTER - const tier = scene.currentBattle.waveIndex > 160 ? ModifierTier.MASTER : scene.currentBattle.waveIndex > 110 ? ModifierTier.ROGUE : scene.currentBattle.waveIndex > 60 ? ModifierTier.ULTRA : ModifierTier.GREAT; - regenerateModifierPoolThresholds(scene.getParty(), ModifierPoolType.PLAYER, 0); // refresh player item pool - const item = getPlayerModifierTypeOptions(1, scene.getParty(), [], { guaranteedModifierTiers: [tier] })[0]; - encounter.setDialogueToken("itemName", item.type.name); - encounter.misc = item; - - encounter.spriteConfigs = [ +export const FightOrFlightEncounter: MysteryEncounter = + MysteryEncounterBuilder.withEncounterType( + MysteryEncounterType.FIGHT_OR_FLIGHT + ) + .withEncounterTier(MysteryEncounterTier.COMMON) + .withSceneWaveRangeRequirement(10, 180) // waves 10 to 180 + .withCatchAllowed(true) + .withHideWildIntroMessage(true) + .withIntroSpriteConfigs([]) // Set in onInit() + .withIntroDialogue([ { - spriteKey: item.type.iconImage, - fileRoot: "items", - hasShadow: false, - x: 35, - y: -5, - scale: 0.75, - isItem: true + text: `${namespace}_intro_message`, }, - { - spriteKey: bossSpecies.speciesId.toString(), - fileRoot: "pokemon", - hasShadow: true, - tint: 0.25, - x: -5, - repeat: true - } - ]; - - // If player has a stealing move, they succeed automatically - encounter.options[1].meetsRequirements(scene); - const primaryPokemon = encounter.options[1].primaryPokemon; - if (primaryPokemon) { - // Use primaryPokemon to execute the thievery - encounter.dialogue.encounterOptionsDialogue.options[1].buttonTooltip = "mysteryEncounter:fight_or_flight_option_2_steal_tooltip"; - } else { - encounter.dialogue.encounterOptionsDialogue.options[1].buttonTooltip = "mysteryEncounter:fight_or_flight_option_2_tooltip"; - } - - return true; - }) - .withSimpleOption(async (scene: BattleScene) => { - // Pick battle - const item = scene.currentBattle.mysteryEncounter.misc as ModifierTypeOption; - setEncounterRewards(scene, { guaranteedModifierTypeOptions: [item], fillRemaining: false }); - await initBattleWithEnemyConfig(scene, scene.currentBattle.mysteryEncounter.enemyPartyConfigs[0]); - }) - .withOption(new MysteryEncounterOptionBuilder() - .withPrimaryPokemonRequirement(new MoveRequirement(STEALING_MOVES)) // Will set option2PrimaryName and option2PrimaryMove dialogue tokens automatically - .withDisabledOnRequirementsNotMet(false) - .withOptionPhase(async (scene: BattleScene) => { - // Pick steal + ]) + .withOnInit((scene: BattleScene) => { const encounter = scene.currentBattle.mysteryEncounter; - const item = scene.currentBattle.mysteryEncounter.misc as ModifierTypeOption; - setEncounterRewards(scene, { guaranteedModifierTypeOptions: [item], fillRemaining: false }); + + // Calculate boss mon + const bossSpecies = scene.arena.randomSpecies( + scene.currentBattle.waveIndex, + scene.currentBattle.waveIndex, + 0, + getPartyLuckValue(scene.getParty()), + true + ); + const config: EnemyPartyConfig = { + levelAdditiveMultiplier: 1, + pokemonConfigs: [{ species: bossSpecies, isBoss: true }], + }; + encounter.enemyPartyConfigs = [config]; + + // Calculate item + // 10-60 GREAT, 60-110 ULTRA, 110-160 ROGUE, 160-180 MASTER + const tier = + scene.currentBattle.waveIndex > 160 + ? ModifierTier.MASTER + : scene.currentBattle.waveIndex > 110 + ? ModifierTier.ROGUE + : scene.currentBattle.waveIndex > 60 + ? ModifierTier.ULTRA + : ModifierTier.GREAT; + regenerateModifierPoolThresholds( + scene.getParty(), + ModifierPoolType.PLAYER, + 0 + ); // refresh player item pool + const item = getPlayerModifierTypeOptions(1, scene.getParty(), [], { + guaranteedModifierTiers: [tier], + })[0]; + encounter.setDialogueToken("itemName", item.type.name); + encounter.misc = item; + + encounter.spriteConfigs = [ + { + spriteKey: item.type.iconImage, + fileRoot: "items", + hasShadow: false, + x: 35, + y: -5, + scale: 0.75, + isItem: true, + }, + { + spriteKey: bossSpecies.speciesId.toString(), + fileRoot: "pokemon", + hasShadow: true, + tint: 0.25, + x: -5, + repeat: true, + }, + ]; // If player has a stealing move, they succeed automatically + encounter.options[1].meetsRequirements(scene); const primaryPokemon = encounter.options[1].primaryPokemon; if (primaryPokemon) { // Use primaryPokemon to execute the thievery - await showEncounterText(scene, "mysteryEncounter:fight_or_flight_option_2_steal_result"); - leaveEncounterWithoutBattle(scene); - return; + encounter.options[1].dialogue.buttonTooltip = `${namespace}_option_2_steal_tooltip`; + } else { + encounter.options[1].dialogue.buttonTooltip = `${namespace}_option_2_tooltip`; } - const roll = randSeedInt(16); - if (roll > 6) { - // Noticed and attacked by boss, gets +1 to all stats at start of fight (62.5%) - const config = scene.currentBattle.mysteryEncounter.enemyPartyConfigs[0]; - config.pokemonConfigs[0].tags = [BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON]; - config.pokemonConfigs[0].mysteryEncounterBattleEffects = (pokemon: Pokemon) => { - pokemon.scene.currentBattle.mysteryEncounter.setDialogueToken("enemyPokemon", pokemon.name); - queueEncounterMessage(pokemon.scene, "mysteryEncounter:fight_or_flight_boss_enraged"); - pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [BattleStat.ATK, BattleStat.DEF, BattleStat.SPATK, BattleStat.SPDEF, BattleStat.SPD], 1)); - }; - await showEncounterText(scene, "mysteryEncounter:fight_or_flight_option_2_bad_result"); - await initBattleWithEnemyConfig(scene, config); - } else { - // Steal item (37.5%) - // Display result message then proceed to rewards - await showEncounterText(scene, "mysteryEncounter:fight_or_flight_option_2_good_result"); - leaveEncounterWithoutBattle(scene); - } + return true; }) - .build()) - .withSimpleOption(async (scene: BattleScene) => { - // Leave encounter with no rewards or exp - leaveEncounterWithoutBattle(scene, true); - return true; - }) - .build(); + .withTitle(`${namespace}_title`) + .withDescription(`${namespace}_description`) + .withQuery(`${namespace}_query`) + .withSimpleOption( + { + buttonLabel: `${namespace}_option_1_label`, + buttonTooltip: `${namespace}_option_1_tooltip`, + selected: [ + { + text: `${namespace}_option_1_selected_message`, + }, + ], + }, + async (scene: BattleScene) => { + // Pick battle + const item = scene.currentBattle.mysteryEncounter + .misc as ModifierTypeOption; + setEncounterRewards(scene, { + guaranteedModifierTypeOptions: [item], + fillRemaining: false, + }); + await initBattleWithEnemyConfig( + scene, + scene.currentBattle.mysteryEncounter.enemyPartyConfigs[0] + ); + } + ) + .withOption( + new MysteryEncounterOptionBuilder() + .withPrimaryPokemonRequirement(new MoveRequirement(STEALING_MOVES)) // Will set option2PrimaryName and option2PrimaryMove dialogue tokens automatically + .withDisabledOnRequirementsNotMet(false) + .withDialogue({ + buttonLabel: `${namespace}_option_2_label`, + buttonTooltip: `${namespace}_option_2_tooltip`, + }) + .withOptionPhase(async (scene: BattleScene) => { + // Pick steal + const encounter = scene.currentBattle.mysteryEncounter; + const item = scene.currentBattle.mysteryEncounter + .misc as ModifierTypeOption; + setEncounterRewards(scene, { + guaranteedModifierTypeOptions: [item], + fillRemaining: false, + }); + + // If player has a stealing move, they succeed automatically + const primaryPokemon = encounter.options[1].primaryPokemon; + if (primaryPokemon) { + // Use primaryPokemon to execute the thievery + await showEncounterText( + scene, + `${namespace}_option_2_steal_result` + ); + leaveEncounterWithoutBattle(scene); + return; + } + + const roll = randSeedInt(16); + if (roll > 6) { + // Noticed and attacked by boss, gets +1 to all stats at start of fight (62.5%) + const config = + scene.currentBattle.mysteryEncounter.enemyPartyConfigs[0]; + config.pokemonConfigs[0].tags = [ + BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON, + ]; + config.pokemonConfigs[0].mysteryEncounterBattleEffects = ( + pokemon: Pokemon + ) => { + pokemon.scene.currentBattle.mysteryEncounter.setDialogueToken( + "enemyPokemon", + pokemon.name + ); + queueEncounterMessage(pokemon.scene, `${namespace}_boss_enraged`); + pokemon.scene.unshiftPhase( + new StatChangePhase( + pokemon.scene, + pokemon.getBattlerIndex(), + true, + [ + BattleStat.ATK, + BattleStat.DEF, + BattleStat.SPATK, + BattleStat.SPDEF, + BattleStat.SPD, + ], + 1 + ) + ); + }; + await showEncounterText(scene, `${namespace}_option_2_bad_result`); + await initBattleWithEnemyConfig(scene, config); + } else { + // Steal item (37.5%) + // Display result message then proceed to rewards + await showEncounterText(scene, `${namespace}_option_2_good_result`); + leaveEncounterWithoutBattle(scene); + } + }) + .build() + ) + .withSimpleOption( + { + buttonLabel: `${namespace}_option_3_label`, + buttonTooltip: `${namespace}_option_3_tooltip`, + selected: [ + { + text: `${namespace}_option_3_selected`, + }, + ], + }, + async (scene: BattleScene) => { + // Leave encounter with no rewards or exp + leaveEncounterWithoutBattle(scene, true); + return true; + } + ) + .build(); diff --git a/src/data/mystery-encounters/mystery-encounter-dialogue.ts b/src/data/mystery-encounters/mystery-encounter-dialogue.ts index bfeb094c9a5..d9532ee4984 100644 --- a/src/data/mystery-encounters/mystery-encounter-dialogue.ts +++ b/src/data/mystery-encounters/mystery-encounter-dialogue.ts @@ -1,7 +1,6 @@ import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { MysteriousChallengersDialogue } from "#app/data/mystery-encounters/dialogue/mysterious-challengers-dialogue"; import { MysteriousChestDialogue } from "#app/data/mystery-encounters/dialogue/mysterious-chest-dialogue"; -import { FightOrFlightDialogue } from "#app/data/mystery-encounters/dialogue/fight-or-flight-dialogue"; import { TrainingSessionDialogue } from "#app/data/mystery-encounters/dialogue/training-session-dialogue"; import { SleepingSnorlaxDialogue } from "./dialogue/sleeping-snorlax-dialogue"; import { ShadyVitaminDealerDialogue } from "#app/data/mystery-encounters/dialogue/shady-vitamin-dealer"; @@ -84,7 +83,6 @@ export const allMysteryEncounterDialogue: { [encounterType: number]: MysteryEnco export function initMysteryEncounterDialogue() { allMysteryEncounterDialogue[MysteryEncounterType.MYSTERIOUS_CHALLENGERS] = MysteriousChallengersDialogue; allMysteryEncounterDialogue[MysteryEncounterType.MYSTERIOUS_CHEST] = MysteriousChestDialogue; - allMysteryEncounterDialogue[MysteryEncounterType.FIGHT_OR_FLIGHT] = FightOrFlightDialogue; allMysteryEncounterDialogue[MysteryEncounterType.TRAINING_SESSION] = TrainingSessionDialogue; allMysteryEncounterDialogue[MysteryEncounterType.SLEEPING_SNORLAX] = SleepingSnorlaxDialogue; allMysteryEncounterDialogue[MysteryEncounterType.SHADY_VITAMIN_DEALER] = ShadyVitaminDealerDialogue; From e6bf12ab8c1e0918cf938b006f0a3a6942df8474 Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Thu, 11 Jul 2024 14:02:26 -0700 Subject: [PATCH 064/270] migrate mysterious-challengers --- .../mysterious-challengers-dialogue.ts | 57 --- .../encounters/mysterious-challengers.ts | 339 ++++++++++++------ .../mystery-encounter-dialogue.ts | 2 - 3 files changed, 220 insertions(+), 178 deletions(-) delete mode 100644 src/data/mystery-encounters/dialogue/mysterious-challengers-dialogue.ts diff --git a/src/data/mystery-encounters/dialogue/mysterious-challengers-dialogue.ts b/src/data/mystery-encounters/dialogue/mysterious-challengers-dialogue.ts deleted file mode 100644 index 065cfceb1b7..00000000000 --- a/src/data/mystery-encounters/dialogue/mysterious-challengers-dialogue.ts +++ /dev/null @@ -1,57 +0,0 @@ -import MysteryEncounterDialogue from "#app/data/mystery-encounters/mystery-encounter-dialogue"; - -export const MysteriousChallengersDialogue: MysteryEncounterDialogue = { - intro: [ - { - text: "mysteryEncounter:mysterious_challengers_intro_message" - } - ], - encounterOptionsDialogue: { - title: "mysteryEncounter:mysterious_challengers_title", - description: "mysteryEncounter:mysterious_challengers_description", - query: "mysteryEncounter:mysterious_challengers_query", - options: [ - { - buttonLabel: "mysteryEncounter:mysterious_challengers_option_1_label", - buttonTooltip: "mysteryEncounter:mysterious_challengers_option_1_tooltip", - selected: [ - { - text: "mysteryEncounter:mysterious_challengers_option_selected_message" - } - ] - }, - { - buttonLabel: "mysteryEncounter:mysterious_challengers_option_2_label", - buttonTooltip: "mysteryEncounter:mysterious_challengers_option_2_tooltip", - selected: [ - { - text: "mysteryEncounter:mysterious_challengers_option_selected_message" - } - ] - }, - { - buttonLabel: "mysteryEncounter:mysterious_challengers_option_3_label", - buttonTooltip: "mysteryEncounter:mysterious_challengers_option_3_tooltip", - selected: [ - { - text: "mysteryEncounter:mysterious_challengers_option_selected_message" - } - ] - }, - { - buttonLabel: "mysteryEncounter:mysterious_challengers_option_4_label", - buttonTooltip: "mysteryEncounter:mysterious_challengers_option_4_tooltip", - selected: [ - { - text: "mysteryEncounter:mysterious_challengers_option_4_selected_message" - } - ] - } - ] - }, - outro: [ - { - text: "mysteryEncounter:mysterious_challengers_outro_win" - } - ] -}; diff --git a/src/data/mystery-encounters/encounters/mysterious-challengers.ts b/src/data/mystery-encounters/encounters/mysterious-challengers.ts index db794c58e9f..e8efc3470ed 100644 --- a/src/data/mystery-encounters/encounters/mysterious-challengers.ts +++ b/src/data/mystery-encounters/encounters/mysterious-challengers.ts @@ -1,9 +1,13 @@ -import { EnemyPartyConfig, initBattleWithEnemyConfig, setEncounterRewards } from "#app/data/mystery-encounters/mystery-encounter-utils"; +import { + EnemyPartyConfig, + initBattleWithEnemyConfig, + setEncounterRewards, +} from "#app/data/mystery-encounters/mystery-encounter-utils"; import { trainerConfigs, TrainerPartyCompoundTemplate, TrainerPartyTemplate, - trainerPartyTemplates + trainerPartyTemplates, } from "#app/data/trainer-config"; import { ModifierTier } from "#app/modifier/modifier-tier"; import { modifierTypes } from "#app/modifier/modifier-type"; @@ -11,133 +15,230 @@ import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { PartyMemberStrength } from "#enums/party-member-strength"; import BattleScene from "../../../battle-scene"; import * as Utils from "../../../utils"; -import MysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier } from "../mystery-encounter"; +import MysteryEncounter, { + MysteryEncounterBuilder, + MysteryEncounterTier, +} from "../mystery-encounter"; -export const MysteriousChallengersEncounter: MysteryEncounter = MysteryEncounterBuilder - .withEncounterType(MysteryEncounterType.MYSTERIOUS_CHALLENGERS) - .withEncounterTier(MysteryEncounterTier.GREAT) - .withIntroSpriteConfigs([]) // These are set in onInit() - .withSceneWaveRangeRequirement(10, 180) // waves 10 to 180 - .withOnInit((scene: BattleScene) => { - const encounter = scene.currentBattle.mysteryEncounter; - // Calculates what trainers are available for battle in the encounter +/** the i18n namespace for the encounter */ +const namespace = "mysteryEncounter:mysterious_challengers"; - // Normal difficulty trainer is randomly pulled from biome - const normalTrainerType = scene.arena.randomTrainerType(scene.currentBattle.waveIndex); - const normalConfig = trainerConfigs[normalTrainerType].copy(); - let female = false; - if (normalConfig.hasGenders) { - female = !!(Utils.randSeedInt(2)); - } - const normalSpriteKey = normalConfig.getSpriteKey(female, normalConfig.doubleOnly); - encounter.enemyPartyConfigs.push({ - trainerConfig: normalConfig, - female: female - }); - - // Hard difficulty trainer is another random trainer, but with AVERAGE_BALANCED config - // Number of mons is based off wave: 1-20 is 2, 20-40 is 3, etc. capping at 6 after wave 100 - const hardTrainerType = scene.arena.randomTrainerType(scene.currentBattle.waveIndex); - const hardTemplate = new TrainerPartyCompoundTemplate( - new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER, false, true), - new TrainerPartyTemplate(Math.min(Math.ceil(scene.currentBattle.waveIndex / 20), 5), PartyMemberStrength.AVERAGE, false, true)); - const hardConfig = trainerConfigs[hardTrainerType].copy(); - hardConfig.setPartyTemplates(hardTemplate); - female = false; - if (hardConfig.hasGenders) { - female = !!(Utils.randSeedInt(2)); - } - const hardSpriteKey = hardConfig.getSpriteKey(female, hardConfig.doubleOnly); - encounter.enemyPartyConfigs.push({ - trainerConfig: hardConfig, - levelAdditiveMultiplier: 0.5, - female: female, - }); - - // Brutal trainer is pulled from pool of boss trainers (gym leaders) for the biome - // They are given an E4 template team, so will be stronger than usual boss encounter and always have 6 mons - const brutalTrainerType = scene.arena.randomTrainerType(scene.currentBattle.waveIndex, true); - const e4Template = trainerPartyTemplates.ELITE_FOUR; - const brutalConfig = trainerConfigs[brutalTrainerType].copy(); - brutalConfig.setPartyTemplates(e4Template); - brutalConfig.partyTemplateFunc = null; // Overrides gym leader party template func - female = false; - if (brutalConfig.hasGenders) { - female = !!(Utils.randSeedInt(2)); - } - const brutalSpriteKey = brutalConfig.getSpriteKey(female, brutalConfig.doubleOnly); - encounter.enemyPartyConfigs.push({ - trainerConfig: brutalConfig, - levelAdditiveMultiplier: 1.1, - female: female - }); - - encounter.spriteConfigs = [ +export const MysteriousChallengersEncounter: MysteryEncounter = + MysteryEncounterBuilder.withEncounterType( + MysteryEncounterType.MYSTERIOUS_CHALLENGERS + ) + .withEncounterTier(MysteryEncounterTier.GREAT) + .withSceneWaveRangeRequirement(10, 180) // waves 10 to 180 + .withIntroSpriteConfigs([]) // These are set in onInit() + .withIntroDialogue([ { - spriteKey: normalSpriteKey, - fileRoot: "trainer", - hasShadow: true, - tint: 1 + text: `${namespace}_intro_message`, }, - { - spriteKey: hardSpriteKey, - fileRoot: "trainer", - hasShadow: true, - tint: 1 - }, - { - spriteKey: brutalSpriteKey, - fileRoot: "trainer", - hasShadow: true, - tint: 1 + ]) + .withOnInit((scene: BattleScene) => { + const encounter = scene.currentBattle.mysteryEncounter; + // Calculates what trainers are available for battle in the encounter + + // Normal difficulty trainer is randomly pulled from biome + const normalTrainerType = scene.arena.randomTrainerType( + scene.currentBattle.waveIndex + ); + const normalConfig = trainerConfigs[normalTrainerType].copy(); + let female = false; + if (normalConfig.hasGenders) { + female = !!Utils.randSeedInt(2); } - ]; + const normalSpriteKey = normalConfig.getSpriteKey( + female, + normalConfig.doubleOnly + ); + encounter.enemyPartyConfigs.push({ + trainerConfig: normalConfig, + female: female, + }); - return true; - }) - .withSimpleOption(async (scene: BattleScene) => { - const encounter = scene.currentBattle.mysteryEncounter; - // Spawn standard trainer battle with memory mushroom reward - const config: EnemyPartyConfig = encounter.enemyPartyConfigs[0]; + // Hard difficulty trainer is another random trainer, but with AVERAGE_BALANCED config + // Number of mons is based off wave: 1-20 is 2, 20-40 is 3, etc. capping at 6 after wave 100 + const hardTrainerType = scene.arena.randomTrainerType( + scene.currentBattle.waveIndex + ); + const hardTemplate = new TrainerPartyCompoundTemplate( + new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER, false, true), + new TrainerPartyTemplate( + Math.min(Math.ceil(scene.currentBattle.waveIndex / 20), 5), + PartyMemberStrength.AVERAGE, + false, + true + ) + ); + const hardConfig = trainerConfigs[hardTrainerType].copy(); + hardConfig.setPartyTemplates(hardTemplate); + female = false; + if (hardConfig.hasGenders) { + female = !!Utils.randSeedInt(2); + } + const hardSpriteKey = hardConfig.getSpriteKey( + female, + hardConfig.doubleOnly + ); + encounter.enemyPartyConfigs.push({ + trainerConfig: hardConfig, + levelAdditiveMultiplier: 0.5, + female: female, + }); - setEncounterRewards(scene, { guaranteedModifierTypeFuncs: [modifierTypes.TM_COMMON, modifierTypes.TM_GREAT, modifierTypes.MEMORY_MUSHROOM], fillRemaining: true }); + // Brutal trainer is pulled from pool of boss trainers (gym leaders) for the biome + // They are given an E4 template team, so will be stronger than usual boss encounter and always have 6 mons + const brutalTrainerType = scene.arena.randomTrainerType( + scene.currentBattle.waveIndex, + true + ); + const e4Template = trainerPartyTemplates.ELITE_FOUR; + const brutalConfig = trainerConfigs[brutalTrainerType].copy(); + brutalConfig.setPartyTemplates(e4Template); + brutalConfig.partyTemplateFunc = null; // Overrides gym leader party template func + female = false; + if (brutalConfig.hasGenders) { + female = !!Utils.randSeedInt(2); + } + const brutalSpriteKey = brutalConfig.getSpriteKey( + female, + brutalConfig.doubleOnly + ); + encounter.enemyPartyConfigs.push({ + trainerConfig: brutalConfig, + levelAdditiveMultiplier: 1.1, + female: female, + }); - // Seed offsets to remove possibility of different trainers having exact same teams - let ret; - scene.executeWithSeedOffset(() => { - ret = initBattleWithEnemyConfig(scene, config); - }, scene.currentBattle.waveIndex * 10); - return ret; - }) - .withSimpleOption(async (scene: BattleScene) => { - const encounter = scene.currentBattle.mysteryEncounter; - // Spawn hard fight with ULTRA/GREAT reward (can improve with luck) - const config: EnemyPartyConfig = encounter.enemyPartyConfigs[1]; + encounter.spriteConfigs = [ + { + spriteKey: normalSpriteKey, + fileRoot: "trainer", + hasShadow: true, + tint: 1, + }, + { + spriteKey: hardSpriteKey, + fileRoot: "trainer", + hasShadow: true, + tint: 1, + }, + { + spriteKey: brutalSpriteKey, + fileRoot: "trainer", + hasShadow: true, + tint: 1, + }, + ]; - setEncounterRewards(scene, { guaranteedModifierTiers: [ModifierTier.ULTRA, ModifierTier.GREAT, ModifierTier.GREAT], fillRemaining: true }); + return true; + }) + .withTitle(`${namespace}_title`) + .withDescription(`${namespace}_description`) + .withQuery(`${namespace}_query`) + .withSimpleOption( + { + buttonLabel: `${namespace}_option_1_label`, + buttonTooltip: `${namespace}_option_1_tooltip`, + selected: [ + { + text: `${namespace}_option_selected_message`, + }, + ], + }, + async (scene: BattleScene) => { + const encounter = scene.currentBattle.mysteryEncounter; + // Spawn standard trainer battle with memory mushroom reward + const config: EnemyPartyConfig = encounter.enemyPartyConfigs[0]; - // Seed offsets to remove possibility of different trainers having exact same teams - let ret; - scene.executeWithSeedOffset(() => { - ret = initBattleWithEnemyConfig(scene, config); - }, scene.currentBattle.waveIndex * 100); - return ret; - }) - .withSimpleOption(async (scene: BattleScene) => { - const encounter = scene.currentBattle.mysteryEncounter; - // Spawn brutal fight with ROGUE/ULTRA/GREAT reward (can improve with luck) - const config: EnemyPartyConfig = encounter.enemyPartyConfigs[2]; + setEncounterRewards(scene, { + guaranteedModifierTypeFuncs: [ + modifierTypes.TM_COMMON, + modifierTypes.TM_GREAT, + modifierTypes.MEMORY_MUSHROOM, + ], + fillRemaining: true, + }); - // To avoid player level snowballing from picking this option - encounter.expMultiplier = 0.9; + // Seed offsets to remove possibility of different trainers having exact same teams + let ret; + scene.executeWithSeedOffset(() => { + ret = initBattleWithEnemyConfig(scene, config); + }, scene.currentBattle.waveIndex * 10); + return ret; + } + ) + .withSimpleOption( + { + buttonLabel: `${namespace}_option_2_label`, + buttonTooltip: `${namespace}_option_2_tooltip`, + selected: [ + { + text: `${namespace}_option_selected_message`, + }, + ], + }, + async (scene: BattleScene) => { + const encounter = scene.currentBattle.mysteryEncounter; + // Spawn hard fight with ULTRA/GREAT reward (can improve with luck) + const config: EnemyPartyConfig = encounter.enemyPartyConfigs[1]; - setEncounterRewards(scene, { guaranteedModifierTiers: [ModifierTier.ROGUE, ModifierTier.ULTRA, ModifierTier.GREAT], fillRemaining: true }); + setEncounterRewards(scene, { + guaranteedModifierTiers: [ + ModifierTier.ULTRA, + ModifierTier.GREAT, + ModifierTier.GREAT, + ], + fillRemaining: true, + }); - // Seed offsets to remove possibility of different trainers having exact same teams - let ret; - scene.executeWithSeedOffset(() => { - ret = initBattleWithEnemyConfig(scene, config); - }, scene.currentBattle.waveIndex * 1000); - return ret; - }) - .build(); + // Seed offsets to remove possibility of different trainers having exact same teams + let ret; + scene.executeWithSeedOffset(() => { + ret = initBattleWithEnemyConfig(scene, config); + }, scene.currentBattle.waveIndex * 100); + return ret; + } + ) + .withSimpleOption( + { + buttonLabel: `${namespace}_option_3_label`, + buttonTooltip: `${namespace}_option_3_tooltip`, + selected: [ + { + text: `${namespace}_option_selected_message`, + }, + ], + }, + async (scene: BattleScene) => { + const encounter = scene.currentBattle.mysteryEncounter; + // Spawn brutal fight with ROGUE/ULTRA/GREAT reward (can improve with luck) + const config: EnemyPartyConfig = encounter.enemyPartyConfigs[2]; + + // To avoid player level snowballing from picking this option + encounter.expMultiplier = 0.9; + + setEncounterRewards(scene, { + guaranteedModifierTiers: [ + ModifierTier.ROGUE, + ModifierTier.ULTRA, + ModifierTier.GREAT, + ], + fillRemaining: true, + }); + + // Seed offsets to remove possibility of different trainers having exact same teams + let ret; + scene.executeWithSeedOffset(() => { + ret = initBattleWithEnemyConfig(scene, config); + }, scene.currentBattle.waveIndex * 1000); + return ret; + } + ) + .withOutroDialogue([ + { + text: `${namespace}_outro_win`, + }, + ]) + .build(); diff --git a/src/data/mystery-encounters/mystery-encounter-dialogue.ts b/src/data/mystery-encounters/mystery-encounter-dialogue.ts index d9532ee4984..f1051c698d5 100644 --- a/src/data/mystery-encounters/mystery-encounter-dialogue.ts +++ b/src/data/mystery-encounters/mystery-encounter-dialogue.ts @@ -1,5 +1,4 @@ import { MysteryEncounterType } from "#enums/mystery-encounter-type"; -import { MysteriousChallengersDialogue } from "#app/data/mystery-encounters/dialogue/mysterious-challengers-dialogue"; import { MysteriousChestDialogue } from "#app/data/mystery-encounters/dialogue/mysterious-chest-dialogue"; import { TrainingSessionDialogue } from "#app/data/mystery-encounters/dialogue/training-session-dialogue"; import { SleepingSnorlaxDialogue } from "./dialogue/sleeping-snorlax-dialogue"; @@ -81,7 +80,6 @@ export default class MysteryEncounterDialogue { export const allMysteryEncounterDialogue: { [encounterType: number]: MysteryEncounterDialogue } = {}; export function initMysteryEncounterDialogue() { - allMysteryEncounterDialogue[MysteryEncounterType.MYSTERIOUS_CHALLENGERS] = MysteriousChallengersDialogue; allMysteryEncounterDialogue[MysteryEncounterType.MYSTERIOUS_CHEST] = MysteriousChestDialogue; allMysteryEncounterDialogue[MysteryEncounterType.TRAINING_SESSION] = TrainingSessionDialogue; allMysteryEncounterDialogue[MysteryEncounterType.SLEEPING_SNORLAX] = SleepingSnorlaxDialogue; From 71a047a1f66f4e78551bda6e577a9e363f9d7fa9 Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Thu, 11 Jul 2024 14:10:21 -0700 Subject: [PATCH 065/270] migrate mysterious-chest encounter --- .../dialogue/mysterious-chest-dialogue.ts | 34 --- .../encounters/mysterious-chest.ts | 231 ++++++++++++------ .../mystery-encounter-dialogue.ts | 2 - 3 files changed, 153 insertions(+), 114 deletions(-) delete mode 100644 src/data/mystery-encounters/dialogue/mysterious-chest-dialogue.ts diff --git a/src/data/mystery-encounters/dialogue/mysterious-chest-dialogue.ts b/src/data/mystery-encounters/dialogue/mysterious-chest-dialogue.ts deleted file mode 100644 index ba8dafc6826..00000000000 --- a/src/data/mystery-encounters/dialogue/mysterious-chest-dialogue.ts +++ /dev/null @@ -1,34 +0,0 @@ -import MysteryEncounterDialogue from "#app/data/mystery-encounters/mystery-encounter-dialogue"; - -export const MysteriousChestDialogue: MysteryEncounterDialogue = { - intro: [ - { - text: "mysteryEncounter:mysterious_chest_intro_message" - } - ], - encounterOptionsDialogue: { - title: "mysteryEncounter:mysterious_chest_title", - description: "mysteryEncounter:mysterious_chest_description", - query: "mysteryEncounter:mysterious_chest_query", - options: [ - { - buttonLabel: "mysteryEncounter:mysterious_chest_option_1_label", - buttonTooltip: "mysteryEncounter:mysterious_chest_option_1_tooltip", - selected: [ - { - text: "mysteryEncounter:mysterious_chest_option_1_selected_message" - } - ] - }, - { - buttonLabel: "mysteryEncounter:mysterious_chest_option_2_label", - buttonTooltip: "mysteryEncounter:mysterious_chest_option_2_tooltip", - selected: [ - { - text: "mysteryEncounter:mysterious_chest_option_2_selected_message" - } - ] - } - ] - } -}; diff --git a/src/data/mystery-encounters/encounters/mysterious-chest.ts b/src/data/mystery-encounters/encounters/mysterious-chest.ts index 69ae93f312f..9dd4f56f623 100644 --- a/src/data/mystery-encounters/encounters/mysterious-chest.ts +++ b/src/data/mystery-encounters/encounters/mysterious-chest.ts @@ -4,90 +4,165 @@ import { leaveEncounterWithoutBattle, queueEncounterMessage, setEncounterRewards, - showEncounterText + showEncounterText, } from "#app/data/mystery-encounters/mystery-encounter-utils"; import { ModifierTier } from "#app/modifier/modifier-tier"; import { GameOverPhase } from "#app/phases"; import { randSeedInt } from "#app/utils"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import BattleScene from "../../../battle-scene"; -import MysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier } from "../mystery-encounter"; +import MysteryEncounter, { + MysteryEncounterBuilder, + MysteryEncounterTier, +} from "../mystery-encounter"; import { MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; -export const MysteriousChestEncounter: MysteryEncounter = MysteryEncounterBuilder - .withEncounterType(MysteryEncounterType.MYSTERIOUS_CHEST) - .withEncounterTier(MysteryEncounterTier.COMMON) - .withIntroSpriteConfigs([ - { - spriteKey: "chest_blue", - fileRoot: "mystery-encounters", - hasShadow: true, - x: 4, - y: 8, - disableAnimation: true // Re-enabled after option select - } - ]) - .withHideIntroVisuals(false) - .withSceneWaveRangeRequirement(10, 180) // waves 2 to 180 - .withOption(new MysteryEncounterOptionBuilder() - .withPreOptionPhase(async (scene: BattleScene) => { - // Play animation - const introVisuals = scene.currentBattle.mysteryEncounter.introVisuals; - introVisuals.spriteConfigs[0].disableAnimation = false; - introVisuals.playAnim(); - }) - .withOptionPhase(async (scene: BattleScene) => { - // Open the chest - const roll = randSeedInt(100); - if (roll > 60) { - // Choose between 2 COMMON / 2 GREAT tier items (40%) - setEncounterRewards(scene, { guaranteedModifierTiers: [ModifierTier.COMMON, ModifierTier.COMMON, ModifierTier.GREAT, ModifierTier.GREAT] }); - // Display result message then proceed to rewards - queueEncounterMessage(scene, "mysteryEncounter:mysterious_chest_option_1_normal_result"); - leaveEncounterWithoutBattle(scene); - } else if (roll > 40) { - // Choose between 3 ULTRA tier items (20%) - setEncounterRewards(scene, { guaranteedModifierTiers: [ModifierTier.ULTRA, ModifierTier.ULTRA, ModifierTier.ULTRA] }); - // Display result message then proceed to rewards - queueEncounterMessage(scene, "mysteryEncounter:mysterious_chest_option_1_good_result"); - leaveEncounterWithoutBattle(scene); - } else if (roll > 36) { - // Choose between 2 ROGUE tier items (4%) - setEncounterRewards(scene, { guaranteedModifierTiers: [ModifierTier.ROGUE, ModifierTier.ROGUE] }); - // Display result message then proceed to rewards - queueEncounterMessage(scene, "mysteryEncounter:mysterious_chest_option_1_great_result"); - leaveEncounterWithoutBattle(scene); - } else if (roll > 35) { - // Choose 1 MASTER tier item (1%) - setEncounterRewards(scene, { guaranteedModifierTiers: [ModifierTier.MASTER] }); - // Display result message then proceed to rewards - queueEncounterMessage(scene, "mysteryEncounter:mysterious_chest_option_1_amazing_result"); - leaveEncounterWithoutBattle(scene); - } else { - // Your highest level unfainted Pok�mon gets OHKO. Progress with no rewards (35%) - const highestLevelPokemon = getHighestLevelPlayerPokemon(scene, true); - koPlayerPokemon(highestLevelPokemon); - - scene.currentBattle.mysteryEncounter.setDialogueToken("pokeName", highestLevelPokemon.name); - // Show which Pokemon was KOed, then leave encounter with no rewards - // Does this synchronously so that game over doesn't happen over result message - await showEncounterText(scene, "mysteryEncounter:mysterious_chest_option_1_bad_result") - .then(() => { - if (scene.getParty().filter(p => p.isAllowedInBattle()).length === 0) { - // All pokemon fainted, game over - scene.clearPhaseQueue(); - scene.unshiftPhase(new GameOverPhase(scene)); - } else { - leaveEncounterWithoutBattle(scene); - } - }); - } - }) - .build() +export const MysteriousChestEncounter: MysteryEncounter = + MysteryEncounterBuilder.withEncounterType( + MysteryEncounterType.MYSTERIOUS_CHEST ) - .withSimpleOption(async (scene: BattleScene) => { - // Leave encounter with no rewards or exp - leaveEncounterWithoutBattle(scene, true); - return true; - }) - .build(); + .withEncounterTier(MysteryEncounterTier.COMMON) + .withSceneWaveRangeRequirement(10, 180) // waves 2 to 180 + .withHideIntroVisuals(false) + .withIntroSpriteConfigs([ + { + spriteKey: "chest_blue", + fileRoot: "mystery-encounters", + hasShadow: true, + x: 4, + y: 8, + disableAnimation: true, // Re-enabled after option select + }, + ]) + .withIntroDialogue([ + { + text: "mysteryEncounter:mysterious_chest_intro_message", + }, + ]) + .withTitle("mysteryEncounter:mysterious_chest_title") + .withDescription("mysteryEncounter:mysterious_chest_description") + .withQuery("mysteryEncounter:mysterious_chest_query") + .withOption( + new MysteryEncounterOptionBuilder() + .withDialogue({ + buttonLabel: "mysteryEncounter:mysterious_chest_option_1_label", + buttonTooltip: "mysteryEncounter:mysterious_chest_option_1_tooltip", + selected: [ + { + text: "mysteryEncounter:mysterious_chest_option_1_selected_message", + }, + ], + }) + .withPreOptionPhase(async (scene: BattleScene) => { + // Play animation + const introVisuals = + scene.currentBattle.mysteryEncounter.introVisuals; + introVisuals.spriteConfigs[0].disableAnimation = false; + introVisuals.playAnim(); + }) + .withOptionPhase(async (scene: BattleScene) => { + // Open the chest + const roll = randSeedInt(100); + if (roll > 60) { + // Choose between 2 COMMON / 2 GREAT tier items (40%) + setEncounterRewards(scene, { + guaranteedModifierTiers: [ + ModifierTier.COMMON, + ModifierTier.COMMON, + ModifierTier.GREAT, + ModifierTier.GREAT, + ], + }); + // Display result message then proceed to rewards + queueEncounterMessage( + scene, + "mysteryEncounter:mysterious_chest_option_1_normal_result" + ); + leaveEncounterWithoutBattle(scene); + } else if (roll > 40) { + // Choose between 3 ULTRA tier items (20%) + setEncounterRewards(scene, { + guaranteedModifierTiers: [ + ModifierTier.ULTRA, + ModifierTier.ULTRA, + ModifierTier.ULTRA, + ], + }); + // Display result message then proceed to rewards + queueEncounterMessage( + scene, + "mysteryEncounter:mysterious_chest_option_1_good_result" + ); + leaveEncounterWithoutBattle(scene); + } else if (roll > 36) { + // Choose between 2 ROGUE tier items (4%) + setEncounterRewards(scene, { + guaranteedModifierTiers: [ModifierTier.ROGUE, ModifierTier.ROGUE], + }); + // Display result message then proceed to rewards + queueEncounterMessage( + scene, + "mysteryEncounter:mysterious_chest_option_1_great_result" + ); + leaveEncounterWithoutBattle(scene); + } else if (roll > 35) { + // Choose 1 MASTER tier item (1%) + setEncounterRewards(scene, { + guaranteedModifierTiers: [ModifierTier.MASTER], + }); + // Display result message then proceed to rewards + queueEncounterMessage( + scene, + "mysteryEncounter:mysterious_chest_option_1_amazing_result" + ); + leaveEncounterWithoutBattle(scene); + } else { + // Your highest level unfainted Pok�mon gets OHKO. Progress with no rewards (35%) + const highestLevelPokemon = getHighestLevelPlayerPokemon( + scene, + true + ); + koPlayerPokemon(highestLevelPokemon); + + scene.currentBattle.mysteryEncounter.setDialogueToken( + "pokeName", + highestLevelPokemon.name + ); + // Show which Pokemon was KOed, then leave encounter with no rewards + // Does this synchronously so that game over doesn't happen over result message + await showEncounterText( + scene, + "mysteryEncounter:mysterious_chest_option_1_bad_result" + ).then(() => { + if ( + scene.getParty().filter((p) => p.isAllowedInBattle()).length === + 0 + ) { + // All pokemon fainted, game over + scene.clearPhaseQueue(); + scene.unshiftPhase(new GameOverPhase(scene)); + } else { + leaveEncounterWithoutBattle(scene); + } + }); + } + }) + .build() + ) + .withSimpleOption( + { + buttonLabel: "mysteryEncounter:mysterious_chest_option_2_label", + buttonTooltip: "mysteryEncounter:mysterious_chest_option_2_tooltip", + selected: [ + { + text: "mysteryEncounter:mysterious_chest_option_2_selected_message", + }, + ], + }, + async (scene: BattleScene) => { + // Leave encounter with no rewards or exp + leaveEncounterWithoutBattle(scene, true); + return true; + } + ) + .build(); diff --git a/src/data/mystery-encounters/mystery-encounter-dialogue.ts b/src/data/mystery-encounters/mystery-encounter-dialogue.ts index f1051c698d5..c5663eef6ba 100644 --- a/src/data/mystery-encounters/mystery-encounter-dialogue.ts +++ b/src/data/mystery-encounters/mystery-encounter-dialogue.ts @@ -1,5 +1,4 @@ import { MysteryEncounterType } from "#enums/mystery-encounter-type"; -import { MysteriousChestDialogue } from "#app/data/mystery-encounters/dialogue/mysterious-chest-dialogue"; import { TrainingSessionDialogue } from "#app/data/mystery-encounters/dialogue/training-session-dialogue"; import { SleepingSnorlaxDialogue } from "./dialogue/sleeping-snorlax-dialogue"; import { ShadyVitaminDealerDialogue } from "#app/data/mystery-encounters/dialogue/shady-vitamin-dealer"; @@ -80,7 +79,6 @@ export default class MysteryEncounterDialogue { export const allMysteryEncounterDialogue: { [encounterType: number]: MysteryEncounterDialogue } = {}; export function initMysteryEncounterDialogue() { - allMysteryEncounterDialogue[MysteryEncounterType.MYSTERIOUS_CHEST] = MysteriousChestDialogue; allMysteryEncounterDialogue[MysteryEncounterType.TRAINING_SESSION] = TrainingSessionDialogue; allMysteryEncounterDialogue[MysteryEncounterType.SLEEPING_SNORLAX] = SleepingSnorlaxDialogue; allMysteryEncounterDialogue[MysteryEncounterType.SHADY_VITAMIN_DEALER] = ShadyVitaminDealerDialogue; From 19d96ed381b2aea7bbb17f2d52bf2cc843491730 Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Thu, 11 Jul 2024 14:39:18 -0700 Subject: [PATCH 066/270] migrate shady-vitamin-dealer encounter --- src/battle-scene.ts | 4 +- .../dialogue/shady-vitamin-dealer.ts | 42 -- .../encounters/shady-vitamin-dealer.ts | 446 +++++++++++------- .../mystery-encounter-dialogue.ts | 2 - 4 files changed, 273 insertions(+), 221 deletions(-) delete mode 100644 src/data/mystery-encounters/dialogue/shady-vitamin-dealer.ts diff --git a/src/battle-scene.ts b/src/battle-scene.ts index d3eac7fc973..be0e83b7976 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -2646,7 +2646,7 @@ export default class BattleScene extends SceneBase { if (encounter) { encounter = new MysteryEncounter(encounter); - encounter.meetsRequirements(this); + encounter.populateDialogueTokensFromRequirements(this); return encounter; } @@ -2674,7 +2674,7 @@ export default class BattleScene extends SceneBase { tier = Overrides.MYSTERY_ENCOUNTER_TIER_OVERRIDE; } - let availableEncounters = []; + let availableEncounters: MysteryEncounter[] = []; // New encounter will never be the same as the most recent encounter const previousEncounter = this.mysteryEncounterData.encounteredEvents?.length > 0 ? this.mysteryEncounterData.encounteredEvents[this.mysteryEncounterData.encounteredEvents.length - 1][0] : null; const biomeMysteryEncounters = mysteryEncountersByBiome.get(this.arena.biomeType); diff --git a/src/data/mystery-encounters/dialogue/shady-vitamin-dealer.ts b/src/data/mystery-encounters/dialogue/shady-vitamin-dealer.ts deleted file mode 100644 index 52b9741caf8..00000000000 --- a/src/data/mystery-encounters/dialogue/shady-vitamin-dealer.ts +++ /dev/null @@ -1,42 +0,0 @@ -import MysteryEncounterDialogue from "#app/data/mystery-encounters/mystery-encounter-dialogue"; - -export const ShadyVitaminDealerDialogue: MysteryEncounterDialogue = { - intro: [ - { - text: "mysteryEncounter:shady_vitamin_dealer_intro_message" - }, - { - text: "mysteryEncounter:shady_vitamin_dealer_intro_dialogue", - speaker: "mysteryEncounter:shady_vitamin_dealer_speaker" - } - ], - encounterOptionsDialogue: { - title: "mysteryEncounter:shady_vitamin_dealer_title", - description: "mysteryEncounter:shady_vitamin_dealer_description", - query: "mysteryEncounter:shady_vitamin_dealer_query", - options: [ - { - buttonLabel: "mysteryEncounter:shady_vitamin_dealer_option_1_label", - buttonTooltip: "mysteryEncounter:shady_vitamin_dealer_option_1_tooltip", - selected: [ - { - text: "mysteryEncounter:shady_vitamin_dealer_option_selected" - } - ] - }, - { - buttonLabel: "mysteryEncounter:shady_vitamin_dealer_option_2_label", - buttonTooltip: "mysteryEncounter:shady_vitamin_dealer_option_2_tooltip", - selected: [ - { - text: "mysteryEncounter:shady_vitamin_dealer_option_selected" - } - ] - }, - { - buttonLabel: "mysteryEncounter:shady_vitamin_dealer_option_3_label", - buttonTooltip: "mysteryEncounter:shady_vitamin_dealer_option_3_tooltip" - } - ] - } -}; diff --git a/src/data/mystery-encounters/encounters/shady-vitamin-dealer.ts b/src/data/mystery-encounters/encounters/shady-vitamin-dealer.ts index 6ab668d73a6..773c4b97b0e 100644 --- a/src/data/mystery-encounters/encounters/shady-vitamin-dealer.ts +++ b/src/data/mystery-encounters/encounters/shady-vitamin-dealer.ts @@ -2,7 +2,8 @@ import { generateModifierTypeOption, leaveEncounterWithoutBattle, queueEncounterMessage, - selectPokemonForOption, setEncounterExp, + selectPokemonForOption, + setEncounterExp, updatePlayerMoney, } from "#app/data/mystery-encounters/mystery-encounter-utils"; import { StatusEffect } from "#app/data/status-effect"; @@ -11,184 +12,279 @@ import { modifierTypes } from "#app/modifier/modifier-type"; import { randSeedInt } from "#app/utils"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { Species } from "#enums/species"; -import BattleScene from "../../../battle-scene"; -import MysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier } from "../mystery-encounter"; -import { MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; -import { - MoneyRequirement -} from "../mystery-encounter-requirements"; import i18next from "i18next"; +import BattleScene from "../../../battle-scene"; +import MysteryEncounter, { + MysteryEncounterBuilder, + MysteryEncounterTier, +} from "../mystery-encounter"; +import { MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; +import { MoneyRequirement } from "../mystery-encounter-requirements"; -export const ShadyVitaminDealerEncounter: MysteryEncounter = MysteryEncounterBuilder - .withEncounterType(MysteryEncounterType.SHADY_VITAMIN_DEALER) - .withEncounterTier(MysteryEncounterTier.COMMON) - .withIntroSpriteConfigs([ - { - spriteKey: Species.KROOKODILE.toString(), - fileRoot: "pokemon", - hasShadow: true, - repeat: true, - x: 10, - y: -1 - }, - { - spriteKey: "b2w2_veteran_m", - fileRoot: "mystery-encounters", - hasShadow: true, - x: -10, - y: 2 - } - ]) - .withSceneWaveRangeRequirement(10, 180) - .withPrimaryPokemonStatusEffectRequirement([StatusEffect.NONE]) // Pokemon must not have status - .withPrimaryPokemonHealthRatioRequirement([0.34, 1]) // Pokemon must have above 1/3rd HP - .withOption(new MysteryEncounterOptionBuilder() - .withSceneMoneyRequirement(0, 2) // Wave scaling money multiplier of 2 - .withPreOptionPhase(async (scene: BattleScene): Promise => { - const encounter = scene.currentBattle.mysteryEncounter; - const onPokemonSelected = (pokemon: PlayerPokemon) => { - // Update money - updatePlayerMoney(scene, -(encounter.options[0].requirements[0] as MoneyRequirement).requiredMoney); - // Calculate modifiers and dialogue tokens - const modifiers = [ - generateModifierTypeOption(scene, modifierTypes.BASE_STAT_BOOSTER).type, - generateModifierTypeOption(scene, modifierTypes.BASE_STAT_BOOSTER).type - ]; - encounter.setDialogueToken("boost1", modifiers[0].name); - encounter.setDialogueToken("boost2", modifiers[1].name); - encounter.misc = { - chosenPokemon: pokemon, - modifiers: modifiers - }; - }; +export const ShadyVitaminDealerEncounter: MysteryEncounter = + MysteryEncounterBuilder.withEncounterType( + MysteryEncounterType.SHADY_VITAMIN_DEALER + ) + .withEncounterTier(MysteryEncounterTier.COMMON) + .withSceneWaveRangeRequirement(10, 180) + .withPrimaryPokemonStatusEffectRequirement([StatusEffect.NONE]) // Pokemon must not have status + .withPrimaryPokemonHealthRatioRequirement([0.34, 1]) // Pokemon must have above 1/3rd HP + .withIntroSpriteConfigs([ + { + spriteKey: Species.KROOKODILE.toString(), + fileRoot: "pokemon", + hasShadow: true, + repeat: true, + x: 10, + y: -1, + }, + { + spriteKey: "b2w2_veteran_m", + fileRoot: "mystery-encounters", + hasShadow: true, + x: -10, + y: 2, + }, + ]) + .withIntroDialogue([ + { + text: "mysteryEncounter:shady_vitamin_dealer_intro_message", + }, + { + text: "mysteryEncounter:shady_vitamin_dealer_intro_dialogue", + speaker: "mysteryEncounter:shady_vitamin_dealer_speaker", + }, + ]) + .withTitle("mysteryEncounter:shady_vitamin_dealer_title") + .withDescription("mysteryEncounter:shady_vitamin_dealer_description") + .withQuery("mysteryEncounter:shady_vitamin_dealer_query") + .withOption( + new MysteryEncounterOptionBuilder() + .withSceneMoneyRequirement(0, 2) // Wave scaling money multiplier of 2 + .withDialogue({ + buttonLabel: "mysteryEncounter:shady_vitamin_dealer_option_1_label", + buttonTooltip: + "mysteryEncounter:shady_vitamin_dealer_option_1_tooltip", + selected: [ + { + text: "mysteryEncounter:shady_vitamin_dealer_option_selected", + }, + ], + }) + .withPreOptionPhase(async (scene: BattleScene): Promise => { + const encounter = scene.currentBattle.mysteryEncounter; + const onPokemonSelected = (pokemon: PlayerPokemon) => { + // Update money + updatePlayerMoney( + scene, + -(encounter.options[0].requirements[0] as MoneyRequirement) + .requiredMoney + ); + // Calculate modifiers and dialogue tokens + const modifiers = [ + generateModifierTypeOption(scene, modifierTypes.BASE_STAT_BOOSTER) + .type, + generateModifierTypeOption(scene, modifierTypes.BASE_STAT_BOOSTER) + .type, + ]; + encounter.setDialogueToken("boost1", modifiers[0].name); + encounter.setDialogueToken("boost2", modifiers[1].name); + encounter.misc = { + chosenPokemon: pokemon, + modifiers: modifiers, + }; + }; - // Only Pokemon that can gain benefits are above 1/3rd HP with no status - const selectableFilter = (pokemon: Pokemon) => { - // If pokemon meets primary pokemon reqs, it can be selected - const meetsReqs = encounter.pokemonMeetsPrimaryRequirements(scene, pokemon); - if (!meetsReqs) { - return i18next.t("mysteryEncounter:shady_vitamin_dealer_invalid_selection"); - } + // Only Pokemon that can gain benefits are above 1/3rd HP with no status + const selectableFilter = (pokemon: Pokemon) => { + // If pokemon meets primary pokemon reqs, it can be selected + const meetsReqs = encounter.pokemonMeetsPrimaryRequirements( + scene, + pokemon + ); + if (!meetsReqs) { + return i18next.t( + "mysteryEncounter:shady_vitamin_dealer_invalid_selection" + ); + } - return null; - }; + return null; + }; - return selectPokemonForOption(scene, onPokemonSelected, null, selectableFilter); - }) - .withOptionPhase(async (scene: BattleScene) => { - // Choose Cheap Option - const encounter = scene.currentBattle.mysteryEncounter; - const chosenPokemon = encounter.misc.chosenPokemon; - const modifiers = encounter.misc.modifiers; + return selectPokemonForOption( + scene, + onPokemonSelected, + null, + selectableFilter + ); + }) + .withOptionPhase(async (scene: BattleScene) => { + // Choose Cheap Option + const encounter = scene.currentBattle.mysteryEncounter; + const chosenPokemon = encounter.misc.chosenPokemon; + const modifiers = encounter.misc.modifiers; - for (const modType of modifiers) { - const modifier = modType.newModifier(chosenPokemon); - await scene.addModifier(modifier, true, false, false, true); + for (const modType of modifiers) { + const modifier = modType.newModifier(chosenPokemon); + await scene.addModifier(modifier, true, false, false, true); + } + scene.updateModifiers(true); + + leaveEncounterWithoutBattle(scene); + }) + .withPostOptionPhase(async (scene: BattleScene) => { + // Damage and status applied after dealer leaves (to make thematic sense) + const encounter = scene.currentBattle.mysteryEncounter; + const chosenPokemon = encounter.misc.chosenPokemon; + + // Pokemon takes 1/3 max HP damage + const damage = Math.round(chosenPokemon.getMaxHp() / 3); + chosenPokemon.hp = Math.max(chosenPokemon.hp - damage, 0); + + // Roll for poison (80%) + if (randSeedInt(10) < 8) { + if (chosenPokemon.trySetStatus(StatusEffect.TOXIC)) { + // Toxic applied + queueEncounterMessage( + scene, + "mysteryEncounter:shady_vitamin_dealer_bad_poison" + ); + } else { + // Pokemon immune or something else prevents status + queueEncounterMessage( + scene, + "mysteryEncounter:shady_vitamin_dealer_damage_only" + ); + } + } else { + queueEncounterMessage( + scene, + "mysteryEncounter:shady_vitamin_dealer_damage_only" + ); + } + + setEncounterExp(scene, [chosenPokemon.id], 100); + + chosenPokemon.updateInfo(); + }) + .build() + ) + .withOption( + new MysteryEncounterOptionBuilder() + .withDialogue({ + buttonLabel: "mysteryEncounter:shady_vitamin_dealer_option_2_label", + buttonTooltip: + "mysteryEncounter:shady_vitamin_dealer_option_2_tooltip", + selected: [ + { + text: "mysteryEncounter:shady_vitamin_dealer_option_selected", + }, + ], + }) + .withSceneMoneyRequirement(0, 5) // Wave scaling money multiplier of 5 + .withPreOptionPhase(async (scene: BattleScene): Promise => { + const encounter = scene.currentBattle.mysteryEncounter; + const onPokemonSelected = (pokemon: PlayerPokemon) => { + // Update money + updatePlayerMoney( + scene, + -(encounter.options[1].requirements[0] as MoneyRequirement) + .requiredMoney + ); + // Calculate modifiers and dialogue tokens + const modifiers = [ + generateModifierTypeOption(scene, modifierTypes.BASE_STAT_BOOSTER) + .type, + generateModifierTypeOption(scene, modifierTypes.BASE_STAT_BOOSTER) + .type, + ]; + encounter.setDialogueToken("boost1", modifiers[0].name); + encounter.setDialogueToken("boost2", modifiers[1].name); + encounter.misc = { + chosenPokemon: pokemon, + modifiers: modifiers, + }; + }; + + // Only Pokemon that can gain benefits are above 1/3rd HP with no status + const selectableFilter = (pokemon: Pokemon) => { + // If pokemon meets primary pokemon reqs, it can be selected + const meetsReqs = encounter.pokemonMeetsPrimaryRequirements( + scene, + pokemon + ); + if (!meetsReqs) { + return i18next.t( + "mysteryEncounter:shady_vitamin_dealer_invalid_selection" + ); + } + + return null; + }; + + return selectPokemonForOption( + scene, + onPokemonSelected, + null, + selectableFilter + ); + }) + .withOptionPhase(async (scene: BattleScene) => { + // Choose Expensive Option + const encounter = scene.currentBattle.mysteryEncounter; + const chosenPokemon = encounter.misc.chosenPokemon; + const modifiers = encounter.misc.modifiers; + + for (const modType of modifiers) { + const modifier = modType.newModifier(chosenPokemon); + await scene.addModifier(modifier, true, false, false, true); + } + scene.updateModifiers(true); + + leaveEncounterWithoutBattle(scene); + }) + .withPostOptionPhase(async (scene: BattleScene) => { + // Status applied after dealer leaves (to make thematic sense) + const encounter = scene.currentBattle.mysteryEncounter; + const chosenPokemon = encounter.misc.chosenPokemon; + + // Roll for poison (20%) + if (randSeedInt(10) < 2) { + if (chosenPokemon.trySetStatus(StatusEffect.POISON)) { + // Poison applied + queueEncounterMessage( + scene, + "mysteryEncounter:shady_vitamin_dealer_poison" + ); + } else { + // Pokemon immune or something else prevents status + queueEncounterMessage( + scene, + "mysteryEncounter:shady_vitamin_dealer_no_bad_effects" + ); + } + } else { + queueEncounterMessage( + scene, + "mysteryEncounter:shady_vitamin_dealer_no_bad_effects" + ); + } + + setEncounterExp(scene, [chosenPokemon.id], 100); + + chosenPokemon.updateInfo(); + }) + .build() + ) + .withSimpleOption( + { + buttonLabel: "mysteryEncounter:shady_vitamin_dealer_option_3_label", + buttonTooltip: "mysteryEncounter:shady_vitamin_dealer_option_3_tooltip", + }, + async (scene: BattleScene) => { + // Leave encounter with no rewards or exp + leaveEncounterWithoutBattle(scene, true); + return true; } - scene.updateModifiers(true); - - leaveEncounterWithoutBattle(scene); - }) - .withPostOptionPhase(async (scene: BattleScene) => { - // Damage and status applied after dealer leaves (to make thematic sense) - const encounter = scene.currentBattle.mysteryEncounter; - const chosenPokemon = encounter.misc.chosenPokemon; - - // Pokemon takes 1/3 max HP damage - const damage = Math.round(chosenPokemon.getMaxHp() / 3); - chosenPokemon.hp = Math.max(chosenPokemon.hp - damage, 0); - - // Roll for poison (80%) - if (randSeedInt(10) < 8) { - if (chosenPokemon.trySetStatus(StatusEffect.TOXIC)) { - // Toxic applied - queueEncounterMessage(scene, "mysteryEncounter:shady_vitamin_dealer_bad_poison"); - } else { - // Pokemon immune or something else prevents status - queueEncounterMessage(scene, "mysteryEncounter:shady_vitamin_dealer_damage_only"); - } - } else { - queueEncounterMessage(scene, "mysteryEncounter:shady_vitamin_dealer_damage_only"); - } - - setEncounterExp(scene, [chosenPokemon.id], 100); - - chosenPokemon.updateInfo(); - }) - .build()) - .withOption(new MysteryEncounterOptionBuilder() - .withSceneMoneyRequirement(0, 5) // Wave scaling money multiplier of 5 - .withPreOptionPhase(async (scene: BattleScene): Promise => { - const encounter = scene.currentBattle.mysteryEncounter; - const onPokemonSelected = (pokemon: PlayerPokemon) => { - // Update money - updatePlayerMoney(scene, -(encounter.options[1].requirements[0] as MoneyRequirement).requiredMoney); - // Calculate modifiers and dialogue tokens - const modifiers = [ - generateModifierTypeOption(scene, modifierTypes.BASE_STAT_BOOSTER).type, - generateModifierTypeOption(scene, modifierTypes.BASE_STAT_BOOSTER).type - ]; - encounter.setDialogueToken("boost1", modifiers[0].name); - encounter.setDialogueToken("boost2", modifiers[1].name); - encounter.misc = { - chosenPokemon: pokemon, - modifiers: modifiers - }; - }; - - // Only Pokemon that can gain benefits are above 1/3rd HP with no status - const selectableFilter = (pokemon: Pokemon) => { - // If pokemon meets primary pokemon reqs, it can be selected - const meetsReqs = encounter.pokemonMeetsPrimaryRequirements(scene, pokemon); - if (!meetsReqs) { - return i18next.t("mysteryEncounter:shady_vitamin_dealer_invalid_selection"); - } - - return null; - }; - - return selectPokemonForOption(scene, onPokemonSelected, null, selectableFilter); - }) - .withOptionPhase(async (scene: BattleScene) => { - // Choose Expensive Option - const encounter = scene.currentBattle.mysteryEncounter; - const chosenPokemon = encounter.misc.chosenPokemon; - const modifiers = encounter.misc.modifiers; - - for (const modType of modifiers) { - const modifier = modType.newModifier(chosenPokemon); - await scene.addModifier(modifier, true, false, false, true); - } - scene.updateModifiers(true); - - leaveEncounterWithoutBattle(scene); - }) - .withPostOptionPhase(async (scene: BattleScene) => { - // Status applied after dealer leaves (to make thematic sense) - const encounter = scene.currentBattle.mysteryEncounter; - const chosenPokemon = encounter.misc.chosenPokemon; - - // Roll for poison (20%) - if (randSeedInt(10) < 2) { - if (chosenPokemon.trySetStatus(StatusEffect.POISON)) { - // Poison applied - queueEncounterMessage(scene, "mysteryEncounter:shady_vitamin_dealer_poison"); - } else { - // Pokemon immune or something else prevents status - queueEncounterMessage(scene, "mysteryEncounter:shady_vitamin_dealer_no_bad_effects"); - } - } else { - queueEncounterMessage(scene, "mysteryEncounter:shady_vitamin_dealer_no_bad_effects"); - } - - setEncounterExp(scene, [chosenPokemon.id], 100); - - chosenPokemon.updateInfo(); - }) - .build()) - .withSimpleOption(async (scene: BattleScene) => { - // Leave encounter with no rewards or exp - leaveEncounterWithoutBattle(scene, true); - return true; - }) - .build(); + ) + .build(); diff --git a/src/data/mystery-encounters/mystery-encounter-dialogue.ts b/src/data/mystery-encounters/mystery-encounter-dialogue.ts index c5663eef6ba..f44921ba677 100644 --- a/src/data/mystery-encounters/mystery-encounter-dialogue.ts +++ b/src/data/mystery-encounters/mystery-encounter-dialogue.ts @@ -1,7 +1,6 @@ import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { TrainingSessionDialogue } from "#app/data/mystery-encounters/dialogue/training-session-dialogue"; import { SleepingSnorlaxDialogue } from "./dialogue/sleeping-snorlax-dialogue"; -import { ShadyVitaminDealerDialogue } from "#app/data/mystery-encounters/dialogue/shady-vitamin-dealer"; import { TextStyle } from "#app/ui/text"; export class TextDisplay { @@ -81,5 +80,4 @@ export const allMysteryEncounterDialogue: { [encounterType: number]: MysteryEnco export function initMysteryEncounterDialogue() { allMysteryEncounterDialogue[MysteryEncounterType.TRAINING_SESSION] = TrainingSessionDialogue; allMysteryEncounterDialogue[MysteryEncounterType.SLEEPING_SNORLAX] = SleepingSnorlaxDialogue; - allMysteryEncounterDialogue[MysteryEncounterType.SHADY_VITAMIN_DEALER] = ShadyVitaminDealerDialogue; } From 2d4269732103eac8c6dadc93211c06ed1808188a Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Thu, 11 Jul 2024 14:44:31 -0700 Subject: [PATCH 067/270] migrate sleeping snorlax encounter --- .../dialogue/sleeping-snorlax-dialogue.ts | 39 --- .../encounters/sleeping-snorlax.ts | 256 +++++++++++------- .../mystery-encounter-dialogue.ts | 2 - 3 files changed, 159 insertions(+), 138 deletions(-) delete mode 100644 src/data/mystery-encounters/dialogue/sleeping-snorlax-dialogue.ts diff --git a/src/data/mystery-encounters/dialogue/sleeping-snorlax-dialogue.ts b/src/data/mystery-encounters/dialogue/sleeping-snorlax-dialogue.ts deleted file mode 100644 index c10835f728e..00000000000 --- a/src/data/mystery-encounters/dialogue/sleeping-snorlax-dialogue.ts +++ /dev/null @@ -1,39 +0,0 @@ -import MysteryEncounterDialogue from "#app/data/mystery-encounters/mystery-encounter-dialogue"; - -export const SleepingSnorlaxDialogue: MysteryEncounterDialogue = { - intro: [ - { - text: "mysteryEncounter:sleeping_snorlax_intro_message" - } - ], - encounterOptionsDialogue: { - title: "mysteryEncounter:sleeping_snorlax_title", - description: "mysteryEncounter:sleeping_snorlax_description", - query: "mysteryEncounter:sleeping_snorlax_query", - options: [ - { - buttonLabel: "mysteryEncounter:sleeping_snorlax_option_1_label", - buttonTooltip: "mysteryEncounter:sleeping_snorlax_option_1_tooltip", - selected: [ - { - text: "mysteryEncounter:sleeping_snorlax_option_1_selected_message" - } - ] - }, - { - buttonLabel: "mysteryEncounter:sleeping_snorlax_option_2_label", - buttonTooltip: "mysteryEncounter:sleeping_snorlax_option_2_tooltip", - selected: [ - { - text: "mysteryEncounter:sleeping_snorlax_option_2_selected_message" - } - ] - }, - { - buttonLabel: "mysteryEncounter:sleeping_snorlax_option_3_label", - buttonTooltip: "mysteryEncounter:sleeping_snorlax_option_3_tooltip", - disabledTooltip: "mysteryEncounter:sleeping_snorlax_option_3_disabled_tooltip" - } - ] - } -}; diff --git a/src/data/mystery-encounters/encounters/sleeping-snorlax.ts b/src/data/mystery-encounters/encounters/sleeping-snorlax.ts index 6a820812ae1..324beb35e99 100644 --- a/src/data/mystery-encounters/encounters/sleeping-snorlax.ts +++ b/src/data/mystery-encounters/encounters/sleeping-snorlax.ts @@ -1,6 +1,5 @@ -import { - modifierTypes -} from "#app/modifier/modifier-type"; +import { STEALING_MOVES } from "#app/data/mystery-encounters/requirements/requirement-groups"; +import { modifierTypes } from "#app/modifier/modifier-type"; import { BerryType } from "#enums/berry-type"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { Species } from "#enums/species"; @@ -8,106 +7,169 @@ import BattleScene from "../../../battle-scene"; import * as Utils from "../../../utils"; import { getPokemonSpecies } from "../../pokemon-species"; import { Status, StatusEffect } from "../../status-effect"; -import MysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier } from "../mystery-encounter"; +import MysteryEncounter, { + MysteryEncounterBuilder, + MysteryEncounterTier, +} from "../mystery-encounter"; import { MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; import { MoveRequirement } from "../mystery-encounter-requirements"; import { EnemyPartyConfig, - EnemyPokemonConfig, generateModifierTypeOption, + EnemyPokemonConfig, + generateModifierTypeOption, initBattleWithEnemyConfig, - leaveEncounterWithoutBattle, queueEncounterMessage, setEncounterExp, - setEncounterRewards + leaveEncounterWithoutBattle, + queueEncounterMessage, + setEncounterExp, + setEncounterRewards, } from "../mystery-encounter-utils"; -import { STEALING_MOVES } from "#app/data/mystery-encounters/requirements/requirement-groups"; -export const SleepingSnorlaxEncounter: MysteryEncounter = MysteryEncounterBuilder - .withEncounterType(MysteryEncounterType.SLEEPING_SNORLAX) - .withEncounterTier(MysteryEncounterTier.ULTRA) - .withIntroSpriteConfigs([ - { - spriteKey: Species.SNORLAX.toString(), - fileRoot: "pokemon", - hasShadow: true, - tint: 0.25, - scale: 1.5, - repeat: true, - y: 5 - } - ]) - .withSceneWaveRangeRequirement(10, 180) // waves 10 to 180 - .withCatchAllowed(true) - .withHideWildIntroMessage(true) - .withOnInit((scene: BattleScene) => { - const encounter = scene.currentBattle.mysteryEncounter; - console.log(encounter); +/** i18n namespace for the encounter */ +const namespace = "mysteryEncounter:sleeping_snorlax"; - // Calculate boss mon - const bossSpecies = getPokemonSpecies(Species.SNORLAX); - const pokemonConfig: EnemyPokemonConfig = { - species: bossSpecies, - isBoss: true, - status: StatusEffect.SLEEP - }; - const config: EnemyPartyConfig = { - levelAdditiveMultiplier: 2, - pokemonConfigs: [pokemonConfig] - }; - encounter.enemyPartyConfigs = [config]; - return true; - }) - .withSimpleOption(async (scene: BattleScene) => { - // Pick battle - // TODO: do we want special rewards for this? - // setCustomEncounterRewards(scene, { guaranteedModifierTypeFuncs: [modifierTypes.LEFTOVERS], fillRemaining: true}); - await initBattleWithEnemyConfig(scene, scene.currentBattle.mysteryEncounter.enemyPartyConfigs[0]); - }) - .withSimpleOption(async (scene: BattleScene) => { - const instance = scene.currentBattle.mysteryEncounter; - let roll: integer; - scene.executeWithSeedOffset(() => { - roll = Utils.randSeedInt(16, 0); - }, scene.currentBattle.waveIndex); - - // Half Snorlax exp to entire party - setEncounterExp(scene, scene.getParty().map(p => p.id), 98); - - if (roll > 4) { - // Fall asleep and get a sitrus berry (75%) - const p = instance.primaryPokemon; - p.status = new Status(StatusEffect.SLEEP, 0, 3); - p.updateInfo(true); - // const sitrus = (modifierTypes.BERRY?.() as ModifierTypeGenerator).generateType(scene.getParty(), [BerryType.SITRUS]); - const sitrus = generateModifierTypeOption(scene, modifierTypes.BERRY, [BerryType.SITRUS]); - - setEncounterRewards(scene, { guaranteedModifierTypeOptions: [sitrus], fillRemaining: false }); - queueEncounterMessage(scene, "mysteryEncounter:sleeping_snorlax_option_2_bad_result"); - leaveEncounterWithoutBattle(scene); - } else { - // Heal to full (25%) - for (const pokemon of scene.getParty()) { - pokemon.hp = pokemon.getMaxHp(); - pokemon.resetStatus(); - for (const move of pokemon.moveset) { - move.ppUsed = 0; - } - pokemon.updateInfo(true); - } - - queueEncounterMessage(scene, "mysteryEncounter:sleeping_snorlax_option_2_good_result"); - leaveEncounterWithoutBattle(scene); - } - }) - .withOption(new MysteryEncounterOptionBuilder() - .withPrimaryPokemonRequirement(new MoveRequirement(STEALING_MOVES)) - .withOptionPhase(async (scene: BattleScene) => { - // Steal the Snorlax's Leftovers - const instance = scene.currentBattle.mysteryEncounter; - setEncounterRewards(scene, { guaranteedModifierTypeFuncs: [modifierTypes.LEFTOVERS], fillRemaining: false }); - queueEncounterMessage(scene, "mysteryEncounter:sleeping_snorlax_option_3_good_result"); - // Snorlax exp to Pokemon that did the stealing - setEncounterExp(scene, [instance.primaryPokemon.id], 189); - leaveEncounterWithoutBattle(scene); - }) - .build() +export const SleepingSnorlaxEncounter: MysteryEncounter = + MysteryEncounterBuilder.withEncounterType( + MysteryEncounterType.SLEEPING_SNORLAX ) - .build(); + .withEncounterTier(MysteryEncounterTier.ULTRA) + .withSceneWaveRangeRequirement(10, 180) // waves 10 to 180 + .withCatchAllowed(true) + .withHideWildIntroMessage(true) + .withIntroSpriteConfigs([ + { + spriteKey: Species.SNORLAX.toString(), + fileRoot: "pokemon", + hasShadow: true, + tint: 0.25, + scale: 1.5, + repeat: true, + y: 5, + }, + ]) + .withIntroDialogue([ + { + text: `${namespace}_intro_message`, + }, + ]) + .withOnInit((scene: BattleScene) => { + const encounter = scene.currentBattle.mysteryEncounter; + console.log(encounter); + + // Calculate boss mon + const bossSpecies = getPokemonSpecies(Species.SNORLAX); + const pokemonConfig: EnemyPokemonConfig = { + species: bossSpecies, + isBoss: true, + status: StatusEffect.SLEEP, + }; + const config: EnemyPartyConfig = { + levelAdditiveMultiplier: 2, + pokemonConfigs: [pokemonConfig], + }; + encounter.enemyPartyConfigs = [config]; + return true; + }) + .withTitle(`${namespace}_title`) + .withDescription(`${namespace}_description`) + .withQuery(`${namespace}_query`) + .withSimpleOption( + { + buttonLabel: `${namespace}_option_1_label`, + buttonTooltip: `${namespace}_option_1_tooltip`, + selected: [ + { + text: `${namespace}_option_1_selected_message`, + }, + ], + }, + async (scene: BattleScene) => { + // Pick battle + // TODO: do we want special rewards for this? + // setCustomEncounterRewards(scene, { guaranteedModifierTypeFuncs: [modifierTypes.LEFTOVERS], fillRemaining: true}); + await initBattleWithEnemyConfig( + scene, + scene.currentBattle.mysteryEncounter.enemyPartyConfigs[0] + ); + } + ) + .withSimpleOption( + { + buttonLabel: `${namespace}_option_2_label`, + buttonTooltip: `${namespace}_option_2_tooltip`, + selected: [ + { + text: `${namespace}_option_2_selected_message`, + }, + ], + }, + async (scene: BattleScene) => { + const instance = scene.currentBattle.mysteryEncounter; + let roll: integer; + scene.executeWithSeedOffset(() => { + roll = Utils.randSeedInt(16, 0); + }, scene.currentBattle.waveIndex); + + // Half Snorlax exp to entire party + setEncounterExp( + scene, + scene.getParty().map((p) => p.id), + 98 + ); + + if (roll > 4) { + // Fall asleep and get a sitrus berry (75%) + const p = instance.primaryPokemon; + p.status = new Status(StatusEffect.SLEEP, 0, 3); + p.updateInfo(true); + // const sitrus = (modifierTypes.BERRY?.() as ModifierTypeGenerator).generateType(scene.getParty(), [BerryType.SITRUS]); + const sitrus = generateModifierTypeOption( + scene, + modifierTypes.BERRY, + [BerryType.SITRUS] + ); + + setEncounterRewards(scene, { + guaranteedModifierTypeOptions: [sitrus], + fillRemaining: false, + }); + queueEncounterMessage(scene, `${namespace}_option_2_bad_result`); + leaveEncounterWithoutBattle(scene); + } else { + // Heal to full (25%) + for (const pokemon of scene.getParty()) { + pokemon.hp = pokemon.getMaxHp(); + pokemon.resetStatus(); + for (const move of pokemon.moveset) { + move.ppUsed = 0; + } + pokemon.updateInfo(true); + } + + queueEncounterMessage(scene, `${namespace}_option_2_good_result`); + leaveEncounterWithoutBattle(scene); + } + } + ) + .withOption( + new MysteryEncounterOptionBuilder() + .withPrimaryPokemonRequirement(new MoveRequirement(STEALING_MOVES)) + .withDialogue({ + buttonLabel: `${namespace}_option_3_label`, + buttonTooltip: `${namespace}_option_3_tooltip`, + disabledTooltip: `${namespace}_option_3_disabled_tooltip`, + }) + .withOptionPhase(async (scene: BattleScene) => { + // Steal the Snorlax's Leftovers + const instance = scene.currentBattle.mysteryEncounter; + setEncounterRewards(scene, { + guaranteedModifierTypeFuncs: [modifierTypes.LEFTOVERS], + fillRemaining: false, + }); + queueEncounterMessage(scene, `${namespace}_option_3_good_result`); + // Snorlax exp to Pokemon that did the stealing + setEncounterExp(scene, [instance.primaryPokemon.id], 189); + leaveEncounterWithoutBattle(scene); + }) + .build() + ) + .build(); diff --git a/src/data/mystery-encounters/mystery-encounter-dialogue.ts b/src/data/mystery-encounters/mystery-encounter-dialogue.ts index f44921ba677..fcd2db8cc52 100644 --- a/src/data/mystery-encounters/mystery-encounter-dialogue.ts +++ b/src/data/mystery-encounters/mystery-encounter-dialogue.ts @@ -1,6 +1,5 @@ import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { TrainingSessionDialogue } from "#app/data/mystery-encounters/dialogue/training-session-dialogue"; -import { SleepingSnorlaxDialogue } from "./dialogue/sleeping-snorlax-dialogue"; import { TextStyle } from "#app/ui/text"; export class TextDisplay { @@ -79,5 +78,4 @@ export const allMysteryEncounterDialogue: { [encounterType: number]: MysteryEnco export function initMysteryEncounterDialogue() { allMysteryEncounterDialogue[MysteryEncounterType.TRAINING_SESSION] = TrainingSessionDialogue; - allMysteryEncounterDialogue[MysteryEncounterType.SLEEPING_SNORLAX] = SleepingSnorlaxDialogue; } From 39f98222a6a0a8a82b362f67b1f7b97ff9bcc327 Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Thu, 11 Jul 2024 14:50:19 -0700 Subject: [PATCH 068/270] migrate training session encounter --- .../dialogue/training-session-dialogue.ts | 50 -- .../encounters/training-session.ts | 649 +++++++++++------- .../mystery-encounter-dialogue.ts | 3 - 3 files changed, 396 insertions(+), 306 deletions(-) delete mode 100644 src/data/mystery-encounters/dialogue/training-session-dialogue.ts diff --git a/src/data/mystery-encounters/dialogue/training-session-dialogue.ts b/src/data/mystery-encounters/dialogue/training-session-dialogue.ts deleted file mode 100644 index 87f30ca14c2..00000000000 --- a/src/data/mystery-encounters/dialogue/training-session-dialogue.ts +++ /dev/null @@ -1,50 +0,0 @@ -import MysteryEncounterDialogue from "#app/data/mystery-encounters/mystery-encounter-dialogue"; - -export const TrainingSessionDialogue: MysteryEncounterDialogue = { - intro: [ - { - text: "mysteryEncounter:training_session_intro_message" - } - ], - encounterOptionsDialogue: { - title: "mysteryEncounter:training_session_title", - description: "mysteryEncounter:training_session_description", - query: "mysteryEncounter:training_session_query", - options: [ - { - buttonLabel: "mysteryEncounter:training_session_option_1_label", - buttonTooltip: "mysteryEncounter:training_session_option_1_tooltip", - selected: [ - { - text: "mysteryEncounter:training_session_option_selected_message" - } - ] - }, - { - buttonLabel: "mysteryEncounter:training_session_option_2_label", - buttonTooltip: "mysteryEncounter:training_session_option_2_tooltip", - secondOptionPrompt: "mysteryEncounter:training_session_option_2_select_prompt", - selected: [ - { - text: "mysteryEncounter:training_session_option_selected_message" - } - ] - }, - { - buttonLabel: "mysteryEncounter:training_session_option_3_label", - buttonTooltip: "mysteryEncounter:training_session_option_3_tooltip", - secondOptionPrompt: "mysteryEncounter:training_session_option_3_select_prompt", - selected: [ - { - text: "mysteryEncounter:training_session_option_selected_message" - } - ] - } - ] - }, - outro: [ - { - text: "mysteryEncounter:training_session_outro_win" - } - ] -}; diff --git a/src/data/mystery-encounters/encounters/training-session.ts b/src/data/mystery-encounters/encounters/training-session.ts index 8030cbaf850..e9b0461857d 100644 --- a/src/data/mystery-encounters/encounters/training-session.ts +++ b/src/data/mystery-encounters/encounters/training-session.ts @@ -4,7 +4,7 @@ import { getEncounterText, initBattleWithEnemyConfig, selectPokemonForOption, - setEncounterRewards + setEncounterRewards, } from "#app/data/mystery-encounters/mystery-encounter-utils"; import { getNatureName, Nature } from "#app/data/nature"; import { speciesStarters } from "#app/data/pokemon-species"; @@ -20,270 +20,414 @@ import { randSeedShuffle } from "#app/utils"; import { BattlerTagType } from "#enums/battler-tag-type"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import BattleScene from "../../../battle-scene"; -import MysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier } from "../mystery-encounter"; +import MysteryEncounter, { + MysteryEncounterBuilder, + MysteryEncounterTier, +} from "../mystery-encounter"; import { MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; -export const TrainingSessionEncounter: MysteryEncounter = MysteryEncounterBuilder - .withEncounterType(MysteryEncounterType.TRAINING_SESSION) - .withEncounterTier(MysteryEncounterTier.ULTRA) - .withIntroSpriteConfigs([ - { - spriteKey: "training_gear", - fileRoot: "mystery-encounters", - hasShadow: true, - y: 3 - } - ]) - .withSceneWaveRangeRequirement(10, 180) // waves 10 to 180 - .withHideWildIntroMessage(true) - .withOption(new MysteryEncounterOptionBuilder() - .withPreOptionPhase(async (scene: BattleScene): Promise => { - const encounter = scene.currentBattle.mysteryEncounter; - const onPokemonSelected = (pokemon: PlayerPokemon) => { - encounter.misc = { - playerPokemon: pokemon - }; - }; - - return selectPokemonForOption(scene, onPokemonSelected); - }) - .withOptionPhase(async (scene: BattleScene) => { - const encounter = scene.currentBattle.mysteryEncounter; - const playerPokemon: PlayerPokemon = encounter.misc.playerPokemon; - - // Spawn light training session with chosen pokemon - // Every 50 waves, add +1 boss segment, capping at 5 - const segments = Math.min(2 + Math.floor(scene.currentBattle.waveIndex / 50), 5); - const modifiers = new ModifiersHolder(); - const config = getEnemyConfig(scene, playerPokemon, segments, modifiers); - scene.removePokemonFromPlayerParty(playerPokemon, false); - - const getIvName = (index: number) => { - switch (index) { - case Stat.HP: - return pokemonInfo.Stat["HPshortened"]; - case Stat.ATK: - return pokemonInfo.Stat["ATKshortened"]; - case Stat.DEF: - return pokemonInfo.Stat["DEFshortened"]; - case Stat.SPATK: - return pokemonInfo.Stat["SPATKshortened"]; - case Stat.SPDEF: - return pokemonInfo.Stat["SPDEFshortened"]; - case Stat.SPD: - return pokemonInfo.Stat["SPDshortened"]; - } - }; - - const onBeforeRewardsPhase = () => { - encounter.setDialogueToken("stat1", "-"); - encounter.setDialogueToken("stat2", "-"); - // Add the pokemon back to party with IV boost - const ivIndexes = []; - playerPokemon.ivs.forEach((iv, index) => { - if (iv < 31) { - ivIndexes.push({ iv: iv, index: index }); - } - }); - - // Improves 2 random non-maxed IVs - // +10 if IV is < 10, +5 if between 10-20, and +3 if > 20 - // A 0-4 starting IV will cap in 6 encounters (assuming you always rolled that IV) - // 5-14 starting IV caps in 5 encounters - // 15-19 starting IV caps in 4 encounters - // 20-24 starting IV caps in 3 encounters - // 25-27 starting IV caps in 2 encounters - let improvedCount = 0; - while (ivIndexes.length > 0 && improvedCount < 2) { - randSeedShuffle(ivIndexes); - const ivToChange = ivIndexes.pop(); - let newVal = ivToChange.iv; - if (improvedCount === 0) { - encounter.setDialogueToken("stat1", getIvName(ivToChange.index)); - } else { - encounter.setDialogueToken("stat2", getIvName(ivToChange.index)); - } - - // Corrects required encounter breakpoints to be continuous for all IV values - if (ivToChange.iv <= 21 && ivToChange.iv - 1 % 5 === 0) { - newVal += 1; - } - - newVal += ivToChange.iv <= 10 ? 10 : ivToChange.iv <= 20 ? 5 : 3; - newVal = Math.min(newVal, 31); - playerPokemon.ivs[ivToChange.index] = newVal; - improvedCount++; - } - - if (improvedCount > 0) { - playerPokemon.calculateStats(); - scene.gameData.updateSpeciesDexIvs(playerPokemon.species.getRootSpeciesId(true), playerPokemon.ivs); - scene.gameData.setPokemonCaught(playerPokemon, false); - } - - // Add pokemon and mods back - scene.getParty().push(playerPokemon); - for (const mod of modifiers.value) { - scene.addModifier(mod, true, false, false, true); - } - scene.updateModifiers(true); - scene.queueMessage(getEncounterText(scene, "mysteryEncounter:training_session_battle_finished_1"), null, true); - }; - - setEncounterRewards(scene, { fillRemaining: true }, null, onBeforeRewardsPhase); - - return initBattleWithEnemyConfig(scene, config); - }) - .build() +export const TrainingSessionEncounter: MysteryEncounter = + MysteryEncounterBuilder.withEncounterType( + MysteryEncounterType.TRAINING_SESSION ) - .withOption(new MysteryEncounterOptionBuilder() - .withPreOptionPhase(async (scene: BattleScene): Promise => { - // Open menu for selecting pokemon and Nature - const encounter = scene.currentBattle.mysteryEncounter; - const natures = new Array(25).fill(null).map((val, i) => i as Nature); - const onPokemonSelected = (pokemon: PlayerPokemon) => { - // Return the options for nature selection - return natures.map((nature: Nature) => { - const option: OptionSelectItem = { - label: getNatureName(nature, true, true, true, scene.uiTheme), - handler: () => { - // Pokemon and second option selected - encounter.setDialogueToken("nature", getNatureName(nature)); - encounter.misc = { - playerPokemon: pokemon, - chosenNature: nature - }; - return true; - } - }; - return option; - }); - }; - - return selectPokemonForOption(scene, onPokemonSelected); - }) - .withOptionPhase(async (scene: BattleScene) => { - const encounter = scene.currentBattle.mysteryEncounter; - const playerPokemon: PlayerPokemon = encounter.misc.playerPokemon; - - // Spawn medium training session with chosen pokemon - // Every 40 waves, add +1 boss segment, capping at 6 - const segments = Math.min(2 + Math.floor(scene.currentBattle.waveIndex / 40), 6); - const modifiers = new ModifiersHolder(); - const config = getEnemyConfig(scene, playerPokemon, segments, modifiers); - scene.removePokemonFromPlayerParty(playerPokemon, false); - - const onBeforeRewardsPhase = () => { - scene.queueMessage(getEncounterText(scene, "mysteryEncounter:training_session_battle_finished_2"), null, true); - // Add the pokemon back to party with Nature change - playerPokemon.setNature(encounter.misc.chosenNature); - scene.gameData.setPokemonCaught(playerPokemon, false); - - // Add pokemon and mods back - scene.getParty().push(playerPokemon); - for (const mod of modifiers.value) { - scene.addModifier(mod, true, false, false, true); - } - scene.updateModifiers(true); - }; - - setEncounterRewards(scene, { fillRemaining: true }, null, onBeforeRewardsPhase); - - return initBattleWithEnemyConfig(scene, config); - }) - .build() - ) - .withOption(new MysteryEncounterOptionBuilder() - .withPreOptionPhase(async (scene: BattleScene): Promise => { - // Open menu for selecting pokemon and ability to learn - const encounter = scene.currentBattle.mysteryEncounter; - const onPokemonSelected = (pokemon: PlayerPokemon) => { - // Return the options for ability selection - const speciesForm = !!pokemon.getFusionSpeciesForm() ? pokemon.getFusionSpeciesForm() : pokemon.getSpeciesForm(); - const abilityCount = speciesForm.getAbilityCount(); - const abilities = new Array(abilityCount).fill(null).map((val, i) => allAbilities[speciesForm.getAbility(i)]); - return abilities.map((ability: Ability, index) => { - const option: OptionSelectItem = { - label: ability.name, - handler: () => { - // Pokemon and ability selected - encounter.setDialogueToken("ability", ability.name); - encounter.misc = { - playerPokemon: pokemon, - abilityIndex: index - }; - return true; + .withEncounterTier(MysteryEncounterTier.ULTRA) + .withSceneWaveRangeRequirement(10, 180) // waves 10 to 180 + .withHideWildIntroMessage(true) + .withIntroSpriteConfigs([ + { + spriteKey: "training_gear", + fileRoot: "mystery-encounters", + hasShadow: true, + y: 3, + }, + ]) + .withIntroDialogue([ + { + text: "mysteryEncounter:training_session_intro_message", + }, + ]) + .withTitle("mysteryEncounter:training_session_title") + .withDescription("mysteryEncounter:training_session_description") + .withQuery("mysteryEncounter:training_session_query") + .withOption( + new MysteryEncounterOptionBuilder() + .withDialogue({ + buttonLabel: "mysteryEncounter:training_session_option_1_label", + buttonTooltip: "mysteryEncounter:training_session_option_1_tooltip", + selected: [ + { + text: "mysteryEncounter:training_session_option_selected_message", }, - onHover: () => { - scene.ui.showText(ability.description); + ], + }) + .withPreOptionPhase(async (scene: BattleScene): Promise => { + const encounter = scene.currentBattle.mysteryEncounter; + const onPokemonSelected = (pokemon: PlayerPokemon) => { + encounter.misc = { + playerPokemon: pokemon, + }; + }; + + return selectPokemonForOption(scene, onPokemonSelected); + }) + .withOptionPhase(async (scene: BattleScene) => { + const encounter = scene.currentBattle.mysteryEncounter; + const playerPokemon: PlayerPokemon = encounter.misc.playerPokemon; + + // Spawn light training session with chosen pokemon + // Every 50 waves, add +1 boss segment, capping at 5 + const segments = Math.min( + 2 + Math.floor(scene.currentBattle.waveIndex / 50), + 5 + ); + const modifiers = new ModifiersHolder(); + const config = getEnemyConfig( + scene, + playerPokemon, + segments, + modifiers + ); + scene.removePokemonFromPlayerParty(playerPokemon, false); + + const getIvName = (index: number) => { + switch (index) { + case Stat.HP: + return pokemonInfo.Stat["HPshortened"]; + case Stat.ATK: + return pokemonInfo.Stat["ATKshortened"]; + case Stat.DEF: + return pokemonInfo.Stat["DEFshortened"]; + case Stat.SPATK: + return pokemonInfo.Stat["SPATKshortened"]; + case Stat.SPDEF: + return pokemonInfo.Stat["SPDEFshortened"]; + case Stat.SPD: + return pokemonInfo.Stat["SPDshortened"]; } }; - return option; - }); - }; - return selectPokemonForOption(scene, onPokemonSelected); - }) - .withOptionPhase(async (scene: BattleScene) => { - const encounter = scene.currentBattle.mysteryEncounter; - const playerPokemon: PlayerPokemon = encounter.misc.playerPokemon; + const onBeforeRewardsPhase = () => { + encounter.setDialogueToken("stat1", "-"); + encounter.setDialogueToken("stat2", "-"); + // Add the pokemon back to party with IV boost + const ivIndexes = []; + playerPokemon.ivs.forEach((iv, index) => { + if (iv < 31) { + ivIndexes.push({ iv: iv, index: index }); + } + }); - // Spawn hard training session with chosen pokemon - // Every 30 waves, add +1 boss segment, capping at 6 - // Also starts with +1 to all stats - const segments = Math.min(2 + Math.floor(scene.currentBattle.waveIndex / 30), 6); - const modifiers = new ModifiersHolder(); - const config = getEnemyConfig(scene, playerPokemon, segments, modifiers); - config.pokemonConfigs[0].tags = [BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON]; - scene.removePokemonFromPlayerParty(playerPokemon, false); + // Improves 2 random non-maxed IVs + // +10 if IV is < 10, +5 if between 10-20, and +3 if > 20 + // A 0-4 starting IV will cap in 6 encounters (assuming you always rolled that IV) + // 5-14 starting IV caps in 5 encounters + // 15-19 starting IV caps in 4 encounters + // 20-24 starting IV caps in 3 encounters + // 25-27 starting IV caps in 2 encounters + let improvedCount = 0; + while (ivIndexes.length > 0 && improvedCount < 2) { + randSeedShuffle(ivIndexes); + const ivToChange = ivIndexes.pop(); + let newVal = ivToChange.iv; + if (improvedCount === 0) { + encounter.setDialogueToken( + "stat1", + getIvName(ivToChange.index) + ); + } else { + encounter.setDialogueToken( + "stat2", + getIvName(ivToChange.index) + ); + } - const onBeforeRewardsPhase = () => { - scene.queueMessage(getEncounterText(scene, "mysteryEncounter:training_session_battle_finished_3"), null, true); - // Add the pokemon back to party with ability change - const abilityIndex = encounter.misc.abilityIndex; - if (!!playerPokemon.getFusionSpeciesForm()) { - playerPokemon.fusionAbilityIndex = abilityIndex; - if (speciesStarters.hasOwnProperty(playerPokemon.fusionSpecies.speciesId)) { - scene.gameData.starterData[playerPokemon.fusionSpecies.speciesId].abilityAttr |= abilityIndex !== 1 || playerPokemon.fusionSpecies.ability2 - ? Math.pow(2, playerPokemon.fusionAbilityIndex) - : AbilityAttr.ABILITY_HIDDEN; - } - } else { - playerPokemon.abilityIndex = abilityIndex; - if (speciesStarters.hasOwnProperty(playerPokemon.species.speciesId)) { - scene.gameData.starterData[playerPokemon.species.speciesId].abilityAttr |= abilityIndex !== 1 || playerPokemon.species.ability2 - ? Math.pow(2, playerPokemon.abilityIndex) - : AbilityAttr.ABILITY_HIDDEN; - } - } + // Corrects required encounter breakpoints to be continuous for all IV values + if (ivToChange.iv <= 21 && ivToChange.iv - (1 % 5) === 0) { + newVal += 1; + } - playerPokemon.getAbility(); - playerPokemon.calculateStats(); - scene.gameData.setPokemonCaught(playerPokemon, false); + newVal += ivToChange.iv <= 10 ? 10 : ivToChange.iv <= 20 ? 5 : 3; + newVal = Math.min(newVal, 31); + playerPokemon.ivs[ivToChange.index] = newVal; + improvedCount++; + } - // Add pokemon and mods back - scene.getParty().push(playerPokemon); - for (const mod of modifiers.value) { - scene.addModifier(mod, true, false, false, true); - } - scene.updateModifiers(true); - }; + if (improvedCount > 0) { + playerPokemon.calculateStats(); + scene.gameData.updateSpeciesDexIvs( + playerPokemon.species.getRootSpeciesId(true), + playerPokemon.ivs + ); + scene.gameData.setPokemonCaught(playerPokemon, false); + } - setEncounterRewards(scene, { fillRemaining: true }, null, onBeforeRewardsPhase); + // Add pokemon and mods back + scene.getParty().push(playerPokemon); + for (const mod of modifiers.value) { + scene.addModifier(mod, true, false, false, true); + } + scene.updateModifiers(true); + scene.queueMessage( + getEncounterText( + scene, + "mysteryEncounter:training_session_battle_finished_1" + ), + null, + true + ); + }; - return initBattleWithEnemyConfig(scene, config); - }) - .build() - ) - .build(); + setEncounterRewards( + scene, + { fillRemaining: true }, + null, + onBeforeRewardsPhase + ); -function getEnemyConfig(scene: BattleScene, playerPokemon: PlayerPokemon, segments: number, modifiers: ModifiersHolder): EnemyPartyConfig { + return initBattleWithEnemyConfig(scene, config); + }) + .build() + ) + .withOption( + new MysteryEncounterOptionBuilder() + .withDialogue({ + buttonLabel: "mysteryEncounter:training_session_option_2_label", + buttonTooltip: "mysteryEncounter:training_session_option_2_tooltip", + secondOptionPrompt: + "mysteryEncounter:training_session_option_2_select_prompt", + selected: [ + { + text: "mysteryEncounter:training_session_option_selected_message", + }, + ], + }) + .withPreOptionPhase(async (scene: BattleScene): Promise => { + // Open menu for selecting pokemon and Nature + const encounter = scene.currentBattle.mysteryEncounter; + const natures = new Array(25).fill(null).map((val, i) => i as Nature); + const onPokemonSelected = (pokemon: PlayerPokemon) => { + // Return the options for nature selection + return natures.map((nature: Nature) => { + const option: OptionSelectItem = { + label: getNatureName(nature, true, true, true, scene.uiTheme), + handler: () => { + // Pokemon and second option selected + encounter.setDialogueToken("nature", getNatureName(nature)); + encounter.misc = { + playerPokemon: pokemon, + chosenNature: nature, + }; + return true; + }, + }; + return option; + }); + }; + + return selectPokemonForOption(scene, onPokemonSelected); + }) + .withOptionPhase(async (scene: BattleScene) => { + const encounter = scene.currentBattle.mysteryEncounter; + const playerPokemon: PlayerPokemon = encounter.misc.playerPokemon; + + // Spawn medium training session with chosen pokemon + // Every 40 waves, add +1 boss segment, capping at 6 + const segments = Math.min( + 2 + Math.floor(scene.currentBattle.waveIndex / 40), + 6 + ); + const modifiers = new ModifiersHolder(); + const config = getEnemyConfig( + scene, + playerPokemon, + segments, + modifiers + ); + scene.removePokemonFromPlayerParty(playerPokemon, false); + + const onBeforeRewardsPhase = () => { + scene.queueMessage( + getEncounterText( + scene, + "mysteryEncounter:training_session_battle_finished_2" + ), + null, + true + ); + // Add the pokemon back to party with Nature change + playerPokemon.setNature(encounter.misc.chosenNature); + scene.gameData.setPokemonCaught(playerPokemon, false); + + // Add pokemon and mods back + scene.getParty().push(playerPokemon); + for (const mod of modifiers.value) { + scene.addModifier(mod, true, false, false, true); + } + scene.updateModifiers(true); + }; + + setEncounterRewards( + scene, + { fillRemaining: true }, + null, + onBeforeRewardsPhase + ); + + return initBattleWithEnemyConfig(scene, config); + }) + .build() + ) + .withOption( + new MysteryEncounterOptionBuilder() + .withDialogue({ + buttonLabel: "mysteryEncounter:training_session_option_3_label", + buttonTooltip: "mysteryEncounter:training_session_option_3_tooltip", + secondOptionPrompt: + "mysteryEncounter:training_session_option_3_select_prompt", + selected: [ + { + text: "mysteryEncounter:training_session_option_selected_message", + }, + ], + }) + .withPreOptionPhase(async (scene: BattleScene): Promise => { + // Open menu for selecting pokemon and ability to learn + const encounter = scene.currentBattle.mysteryEncounter; + const onPokemonSelected = (pokemon: PlayerPokemon) => { + // Return the options for ability selection + const speciesForm = !!pokemon.getFusionSpeciesForm() + ? pokemon.getFusionSpeciesForm() + : pokemon.getSpeciesForm(); + const abilityCount = speciesForm.getAbilityCount(); + const abilities = new Array(abilityCount) + .fill(null) + .map((val, i) => allAbilities[speciesForm.getAbility(i)]); + return abilities.map((ability: Ability, index) => { + const option: OptionSelectItem = { + label: ability.name, + handler: () => { + // Pokemon and ability selected + encounter.setDialogueToken("ability", ability.name); + encounter.misc = { + playerPokemon: pokemon, + abilityIndex: index, + }; + return true; + }, + onHover: () => { + scene.ui.showText(ability.description); + }, + }; + return option; + }); + }; + + return selectPokemonForOption(scene, onPokemonSelected); + }) + .withOptionPhase(async (scene: BattleScene) => { + const encounter = scene.currentBattle.mysteryEncounter; + const playerPokemon: PlayerPokemon = encounter.misc.playerPokemon; + + // Spawn hard training session with chosen pokemon + // Every 30 waves, add +1 boss segment, capping at 6 + // Also starts with +1 to all stats + const segments = Math.min( + 2 + Math.floor(scene.currentBattle.waveIndex / 30), + 6 + ); + const modifiers = new ModifiersHolder(); + const config = getEnemyConfig( + scene, + playerPokemon, + segments, + modifiers + ); + config.pokemonConfigs[0].tags = [ + BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON, + ]; + scene.removePokemonFromPlayerParty(playerPokemon, false); + + const onBeforeRewardsPhase = () => { + scene.queueMessage( + getEncounterText( + scene, + "mysteryEncounter:training_session_battle_finished_3" + ), + null, + true + ); + // Add the pokemon back to party with ability change + const abilityIndex = encounter.misc.abilityIndex; + if (!!playerPokemon.getFusionSpeciesForm()) { + playerPokemon.fusionAbilityIndex = abilityIndex; + if ( + speciesStarters.hasOwnProperty( + playerPokemon.fusionSpecies.speciesId + ) + ) { + scene.gameData.starterData[ + playerPokemon.fusionSpecies.speciesId + ].abilityAttr |= + abilityIndex !== 1 || playerPokemon.fusionSpecies.ability2 + ? Math.pow(2, playerPokemon.fusionAbilityIndex) + : AbilityAttr.ABILITY_HIDDEN; + } + } else { + playerPokemon.abilityIndex = abilityIndex; + if ( + speciesStarters.hasOwnProperty(playerPokemon.species.speciesId) + ) { + scene.gameData.starterData[ + playerPokemon.species.speciesId + ].abilityAttr |= + abilityIndex !== 1 || playerPokemon.species.ability2 + ? Math.pow(2, playerPokemon.abilityIndex) + : AbilityAttr.ABILITY_HIDDEN; + } + } + + playerPokemon.getAbility(); + playerPokemon.calculateStats(); + scene.gameData.setPokemonCaught(playerPokemon, false); + + // Add pokemon and mods back + scene.getParty().push(playerPokemon); + for (const mod of modifiers.value) { + scene.addModifier(mod, true, false, false, true); + } + scene.updateModifiers(true); + }; + + setEncounterRewards( + scene, + { fillRemaining: true }, + null, + onBeforeRewardsPhase + ); + + return initBattleWithEnemyConfig(scene, config); + }) + .build() + ) + .build(); + +function getEnemyConfig( + scene: BattleScene, + playerPokemon: PlayerPokemon, + segments: number, + modifiers: ModifiersHolder +): EnemyPartyConfig { playerPokemon.resetSummonData(); // Passes modifiers by reference - modifiers.value = scene.findModifiers(m => m instanceof PokemonHeldItemModifier - && (m as PokemonHeldItemModifier).pokemonId === playerPokemon.id) as PokemonHeldItemModifier[]; - const modifierTypes = modifiers.value.map(mod => mod.type) as PokemonHeldItemModifierType[]; + modifiers.value = scene.findModifiers( + (m) => + m instanceof PokemonHeldItemModifier && + (m as PokemonHeldItemModifier).pokemonId === playerPokemon.id + ) as PokemonHeldItemModifier[]; + const modifierTypes = modifiers.value.map( + (mod) => mod.type + ) as PokemonHeldItemModifierType[]; const data = new PokemonData(playerPokemon); return { @@ -295,15 +439,14 @@ function getEnemyConfig(scene: BattleScene, playerPokemon: PlayerPokemon, segmen formIndex: playerPokemon.formIndex, level: playerPokemon.level, dataSource: data, - modifierTypes: modifierTypes - } - ] + modifierTypes: modifierTypes, + }, + ], }; } class ModifiersHolder { public value: PokemonHeldItemModifier[] = []; - constructor() { - } + constructor() {} } diff --git a/src/data/mystery-encounters/mystery-encounter-dialogue.ts b/src/data/mystery-encounters/mystery-encounter-dialogue.ts index fcd2db8cc52..9e4943f37a2 100644 --- a/src/data/mystery-encounters/mystery-encounter-dialogue.ts +++ b/src/data/mystery-encounters/mystery-encounter-dialogue.ts @@ -1,5 +1,3 @@ -import { MysteryEncounterType } from "#enums/mystery-encounter-type"; -import { TrainingSessionDialogue } from "#app/data/mystery-encounters/dialogue/training-session-dialogue"; import { TextStyle } from "#app/ui/text"; export class TextDisplay { @@ -77,5 +75,4 @@ export default class MysteryEncounterDialogue { export const allMysteryEncounterDialogue: { [encounterType: number]: MysteryEncounterDialogue } = {}; export function initMysteryEncounterDialogue() { - allMysteryEncounterDialogue[MysteryEncounterType.TRAINING_SESSION] = TrainingSessionDialogue; } From 941a8e71d66848bc02ca06c1377146be1240380d Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Thu, 11 Jul 2024 14:58:52 -0700 Subject: [PATCH 069/270] finishing touches --- .../mystery-encounter-dialogue.ts | 5 -- .../mystery-encounters/mystery-encounter.ts | 75 +++++++++++++++---- src/loading-scene.ts | 2 - src/overrides.ts | 4 +- src/test/vitest.setup.ts | 2 - 5 files changed, 61 insertions(+), 27 deletions(-) diff --git a/src/data/mystery-encounters/mystery-encounter-dialogue.ts b/src/data/mystery-encounters/mystery-encounter-dialogue.ts index 9e4943f37a2..d96aeb87ba6 100644 --- a/src/data/mystery-encounters/mystery-encounter-dialogue.ts +++ b/src/data/mystery-encounters/mystery-encounter-dialogue.ts @@ -71,8 +71,3 @@ export default class MysteryEncounterDialogue { } * */ - -export const allMysteryEncounterDialogue: { [encounterType: number]: MysteryEncounterDialogue } = {}; - -export function initMysteryEncounterDialogue() { -} diff --git a/src/data/mystery-encounters/mystery-encounter.ts b/src/data/mystery-encounters/mystery-encounter.ts index 0780aa33ae4..c367f2377b2 100644 --- a/src/data/mystery-encounters/mystery-encounter.ts +++ b/src/data/mystery-encounters/mystery-encounter.ts @@ -7,7 +7,6 @@ import MysteryEncounterIntroVisuals, { MysteryEncounterSpriteConfig } from "../. import * as Utils from "../../utils"; import { StatusEffect } from "../status-effect"; import MysteryEncounterDialogue, { - allMysteryEncounterDialogue, OptionTextDisplay } from "./mystery-encounter-dialogue"; import MysteryEncounterOption, { MysteryEncounterOptionBuilder, OptionPhaseCallback } from "./mystery-encounter-option"; @@ -137,17 +136,12 @@ export default class MysteryEncounter implements MysteryEncounter { Object.assign(this, encounter); } this.encounterTier = this.encounterTier ? this.encounterTier : MysteryEncounterTier.COMMON; - this.dialogue = Object.assign((this.dialogue ?? {}), allMysteryEncounterDialogue[this.encounterType] ?? {}); + this.dialogue = {}; this.encounterVariant = MysteryEncounterVariant.DEFAULT; this.requirements = this.requirements ? this.requirements : []; this.hideBattleIntroMessage = !isNullOrUndefined(this.hideBattleIntroMessage) ? this.hideBattleIntroMessage : false; this.hideIntroVisuals = !isNullOrUndefined(this.hideIntroVisuals) ? this.hideIntroVisuals : true; - // Populate options with respective dialogue - if (this.dialogue?.encounterOptionsDialogue) { - // this.options.forEach((o, i) => o.dialogue = this.dialogue.encounterOptionsDialogue.options[i]); - } - // Reset any dirty flags or encounter data this.lockEncounterRewardTiers = true; this.dialogueTokens = new Map; @@ -482,15 +476,37 @@ export class MysteryEncounterBuilder implements Partial { return this.withSceneRequirement(new PartySizeRequirement([min, max ?? min])); } + /** + * Add a primary pokemon requirement + * + * @param requirement {@linkcode EncounterPokemonRequirement} + * @returns + */ withPrimaryPokemonRequirement(requirement: EncounterPokemonRequirement): this & Required> { this.primaryPokemonRequirements.push(requirement); return Object.assign(this, { primaryPokemonRequirements: this.primaryPokemonRequirements }); } + /** + * Add a primary pokemon status effect requirement + * + * @param statusEffect the status effect/s to check + * @param minNumberOfPokemon minimum number of pokemon to have the effect + * @param invertQuery if true will invert the query + * @returns + */ withPrimaryPokemonStatusEffectRequirement(statusEffect: StatusEffect | StatusEffect[], minNumberOfPokemon: number = 1, invertQuery: boolean = false): this & Required> { return this.withPrimaryPokemonRequirement(new StatusEffectRequirement(statusEffect, minNumberOfPokemon, invertQuery)); } + /** + * Add a primary pokemon health ratio requirement + * + * @param requiredHealthRange the health range to check + * @param minNumberOfPokemon minimum number of pokemon to have the health range + * @param invertQuery if true will invert the query + * @returns + */ withPrimaryPokemonHealthRatioRequirement(requiredHealthRange: [number, number], minNumberOfPokemon: number = 1, invertQuery: boolean = false): this & Required> { return this.withPrimaryPokemonRequirement(new HealthRatioRequirement(requiredHealthRange, minNumberOfPokemon, invertQuery)); } @@ -579,12 +595,17 @@ export class MysteryEncounterBuilder implements Partial { return Object.assign(this, { hideIntroVisuals: hideIntroVisuals }); } + /** + * Add a title for the encounter + * + * @param title - title of the encounter + * @returns + */ withTitle(title: TemplateStringsArray | `mysteryEncounter:${string}`) { - const dialogue = this.dialogue ?? {}; - const encounterOptionsDialogue = this.dialogue?.encounterOptionsDialogue ?? {}; + const encounterOptionsDialogue = this.dialogue.encounterOptionsDialogue ?? {}; this.dialogue = { - ...dialogue, + ...this.dialogue, encounterOptionsDialogue: { ...encounterOptionsDialogue, title, @@ -594,12 +615,17 @@ export class MysteryEncounterBuilder implements Partial { return this; } + /** + * Add a description of the encounter + * + * @param description - description of the encounter + * @returns + */ withDescription(description: TemplateStringsArray | `mysteryEncounter:${string}`) { - const dialogue = this.dialogue ?? {}; - const encounterOptionsDialogue = this.dialogue?.encounterOptionsDialogue ?? {}; + const encounterOptionsDialogue = this.dialogue.encounterOptionsDialogue ?? {}; this.dialogue = { - ...dialogue, + ...this.dialogue, encounterOptionsDialogue: { ...encounterOptionsDialogue, description, @@ -609,12 +635,17 @@ export class MysteryEncounterBuilder implements Partial { return this; } + /** + * Add a query for the encounter + * + * @param query - query to use for the encounter + * @returns + */ withQuery(query: TemplateStringsArray | `mysteryEncounter:${string}`) { - const dialogue = this.dialogue ?? {}; - const encounterOptionsDialogue = this.dialogue?.encounterOptionsDialogue ?? {}; + const encounterOptionsDialogue = this.dialogue.encounterOptionsDialogue ?? {}; this.dialogue = { - ...dialogue, + ...this.dialogue, encounterOptionsDialogue: { ...encounterOptionsDialogue, query, @@ -624,11 +655,23 @@ export class MysteryEncounterBuilder implements Partial { return this; } + /** + * Add outro dialogue/s for the encounter + * + * @param dialogue - outro dialogue/s + * @returns + */ withOutroDialogue(dialogue: MysteryEncounterDialogue["outro"] = []) { this.dialogue = {...this.dialogue, outro: dialogue }; return this; } + /** + * Builds the mystery encounter + * + * @param this - MysteryEncounter + * @returns + */ build(this: MysteryEncounter) { return new MysteryEncounter(this); } diff --git a/src/loading-scene.ts b/src/loading-scene.ts index 096986ebcc8..1ce8ed87156 100644 --- a/src/loading-scene.ts +++ b/src/loading-scene.ts @@ -22,7 +22,6 @@ import { initStatsKeys } from "./ui/game-stats-ui-handler"; import { initVouchers } from "./system/voucher"; import { Biome } from "#enums/biome"; import { TrainerType } from "#enums/trainer-type"; -import {initMysteryEncounterDialogue} from "#app/data/mystery-encounters/mystery-encounter-dialogue"; import {initMysteryEncounters} from "#app/data/mystery-encounters/mystery-encounters"; export class LoadingScene extends SceneBase { @@ -346,7 +345,6 @@ export class LoadingScene extends SceneBase { initMoves(); initAbilities(); initChallenges(); - initMysteryEncounterDialogue(); initMysteryEncounters(); } diff --git a/src/overrides.ts b/src/overrides.ts index c2a6edf9868..1e428c6dd2d 100644 --- a/src/overrides.ts +++ b/src/overrides.ts @@ -117,9 +117,9 @@ export const EGG_GACHA_PULL_COUNT_OVERRIDE: number = 0; */ // 1 to 256, set to null to ignore -export const MYSTERY_ENCOUNTER_RATE_OVERRIDE: number = 10000; +export const MYSTERY_ENCOUNTER_RATE_OVERRIDE: number = null; export const MYSTERY_ENCOUNTER_TIER_OVERRIDE: MysteryEncounterTier = null; -export const MYSTERY_ENCOUNTER_OVERRIDE: MysteryEncounterType = MysteryEncounterType.DARK_DEAL; +export const MYSTERY_ENCOUNTER_OVERRIDE: MysteryEncounterType = null; /** * MODIFIER / ITEM OVERRIDES diff --git a/src/test/vitest.setup.ts b/src/test/vitest.setup.ts index b8b655e3e96..37c533a33db 100644 --- a/src/test/vitest.setup.ts +++ b/src/test/vitest.setup.ts @@ -13,7 +13,6 @@ import { initVouchers } from "#app/system/voucher"; import { initAchievements } from "#app/system/achv"; import { initStatsKeys } from "#app/ui/game-stats-ui-handler"; import { initMysteryEncounters } from "#app/data/mystery-encounters/mystery-encounters"; -import { initMysteryEncounterDialogue } from "#app/data/mystery-encounters/mystery-encounter-dialogue"; import { beforeAll, beforeEach, vi } from "vitest"; import * as overrides from "#app/overrides"; @@ -28,7 +27,6 @@ initSpecies(); initMoves(); initAbilities(); initLoggedInUser(); -initMysteryEncounterDialogue(); initMysteryEncounters(); global.testFailed = false; From e8670c4f00d2dfe9ee020a2fb70bedcdf796ada1 Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Thu, 11 Jul 2024 15:01:30 -0700 Subject: [PATCH 070/270] rename MysteryEncounter interface to IMysteryEncounter --- src/battle-scene.ts | 16 +++---- src/battle.ts | 4 +- .../encounters/dark-deal.ts | 4 +- .../encounters/department-store-sale.ts | 4 +- .../encounters/field-trip-encounter.ts | 4 +- .../encounters/fight-or-flight.ts | 4 +- .../encounters/mysterious-challengers.ts | 4 +- .../encounters/mysterious-chest.ts | 4 +- .../encounters/shady-vitamin-dealer.ts | 4 +- .../encounters/sleeping-snorlax.ts | 4 +- .../encounters/training-session.ts | 4 +- .../mystery-encounters/mystery-encounter.ts | 44 +++++++++---------- .../mystery-encounters/mystery-encounters.ts | 4 +- src/field/mystery-encounter-intro.ts | 6 +-- src/system/game-data.ts | 6 +-- .../mystery-encounter-utils.test.ts | 12 ++--- 16 files changed, 64 insertions(+), 64 deletions(-) diff --git a/src/battle-scene.ts b/src/battle-scene.ts index be0e83b7976..729cc826886 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -67,7 +67,7 @@ import { Species } from "#enums/species"; import { UiTheme } from "#enums/ui-theme"; import { TimedEventManager } from "#app/timed-event-manager.js"; import i18next from "i18next"; -import MysteryEncounter, { MysteryEncounterTier, MysteryEncounterVariant } from "./data/mystery-encounters/mystery-encounter"; +import IMysteryEncounter, { MysteryEncounterTier, MysteryEncounterVariant } from "./data/mystery-encounters/mystery-encounter"; import { mysteryEncountersByBiome, allMysteryEncounters, BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT, AVERAGE_ENCOUNTERS_PER_RUN_TARGET, WIGHT_INCREMENT_ON_SPAWN_MISS } from "./data/mystery-encounters/mystery-encounters"; import { MysteryEncounterData } from "#app/data/mystery-encounters/mystery-encounter-data"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; @@ -216,7 +216,7 @@ export default class BattleScene extends SceneBase { public pokemonInfoContainer: PokemonInfoContainer; private party: PlayerPokemon[]; public mysteryEncounterData: MysteryEncounterData = new MysteryEncounterData(null); - public lastMysteryEncounter: MysteryEncounter; + public lastMysteryEncounter: IMysteryEncounter; /** Combined Biome and Wave count text */ private biomeWaveText: Phaser.GameObjects.Text; private moneyText: Phaser.GameObjects.Text; @@ -1026,7 +1026,7 @@ export default class BattleScene extends SceneBase { } } - newBattle(waveIndex?: integer, battleType?: BattleType, trainerData?: TrainerData, double?: boolean, mysteryEncounter?: MysteryEncounter): Battle { + newBattle(waveIndex?: integer, battleType?: BattleType, trainerData?: TrainerData, double?: boolean, mysteryEncounter?: IMysteryEncounter): Battle { const _startingWave = Overrides.STARTING_WAVE_OVERRIDE || startingWave; const newWaveIndex = waveIndex || ((this.currentBattle?.waveIndex || (_startingWave - 1)) + 1); let newDouble: boolean; @@ -2621,9 +2621,9 @@ export default class BattleScene extends SceneBase { * @param override - used to load session encounter when restarting game, etc. * @returns */ - getMysteryEncounter(override: MysteryEncounter): MysteryEncounter { + getMysteryEncounter(override: IMysteryEncounter): IMysteryEncounter { // Loading override or session encounter - let encounter: MysteryEncounter; + let encounter: IMysteryEncounter; if (!isNullOrUndefined(Overrides.MYSTERY_ENCOUNTER_OVERRIDE) && allMysteryEncounters.hasOwnProperty(Overrides.MYSTERY_ENCOUNTER_OVERRIDE)) { encounter = allMysteryEncounters[Overrides.MYSTERY_ENCOUNTER_OVERRIDE]; } else { @@ -2645,7 +2645,7 @@ export default class BattleScene extends SceneBase { } if (encounter) { - encounter = new MysteryEncounter(encounter); + encounter = new IMysteryEncounter(encounter); encounter.populateDialogueTokensFromRequirements(this); return encounter; } @@ -2674,7 +2674,7 @@ export default class BattleScene extends SceneBase { tier = Overrides.MYSTERY_ENCOUNTER_TIER_OVERRIDE; } - let availableEncounters: MysteryEncounter[] = []; + let availableEncounters: IMysteryEncounter[] = []; // New encounter will never be the same as the most recent encounter const previousEncounter = this.mysteryEncounterData.encounteredEvents?.length > 0 ? this.mysteryEncounterData.encounteredEvents[this.mysteryEncounterData.encounteredEvents.length - 1][0] : null; const biomeMysteryEncounters = mysteryEncountersByBiome.get(this.arena.biomeType); @@ -2695,7 +2695,7 @@ export default class BattleScene extends SceneBase { } encounter = availableEncounters[Utils.randSeedInt(availableEncounters.length)]; // New encounter object to not dirty flags - encounter = new MysteryEncounter(encounter); + encounter = new IMysteryEncounter(encounter); encounter.populateDialogueTokensFromRequirements(this); return encounter; } diff --git a/src/battle.ts b/src/battle.ts index 30543933f49..ab47eac7993 100644 --- a/src/battle.ts +++ b/src/battle.ts @@ -14,7 +14,7 @@ import { PlayerGender } from "#enums/player-gender"; import { Species } from "#enums/species"; import { TrainerType } from "#enums/trainer-type"; import i18next from "#app/plugins/i18n"; -import MysteryEncounter, { MysteryEncounterVariant } from "./data/mystery-encounters/mystery-encounter"; +import IMysteryEncounter, { MysteryEncounterVariant } from "./data/mystery-encounters/mystery-encounter"; export enum BattleType { WILD, @@ -69,7 +69,7 @@ export default class Battle { public lastUsedPokeball: PokeballType; public playerFaints: number; // The amount of times pokemon on the players side have fainted public enemyFaints: number; // The amount of times pokemon on the enemies side have fainted - public mysteryEncounter: MysteryEncounter; + public mysteryEncounter: IMysteryEncounter; private rngCounter: integer = 0; diff --git a/src/data/mystery-encounters/encounters/dark-deal.ts b/src/data/mystery-encounters/encounters/dark-deal.ts index 8f13e373e9a..9d755ad9493 100644 --- a/src/data/mystery-encounters/encounters/dark-deal.ts +++ b/src/data/mystery-encounters/encounters/dark-deal.ts @@ -7,7 +7,7 @@ import BattleScene from "../../../battle-scene"; import { AddPokeballModifierType } from "../../../modifier/modifier-type"; import { PokeballType } from "../../pokeball"; import { getPokemonSpecies } from "../../pokemon-species"; -import MysteryEncounter, { +import IMysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier, } from "../mystery-encounter"; @@ -73,7 +73,7 @@ const excludedBosses = [ Species.PECHARUNT, ]; -export const DarkDealEncounter: MysteryEncounter = +export const DarkDealEncounter: IMysteryEncounter = MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.DARK_DEAL) .withEncounterTier(MysteryEncounterTier.ROGUE) .withIntroSpriteConfigs([ diff --git a/src/data/mystery-encounters/encounters/department-store-sale.ts b/src/data/mystery-encounters/encounters/department-store-sale.ts index 2dcee4455df..d821a952864 100644 --- a/src/data/mystery-encounters/encounters/department-store-sale.ts +++ b/src/data/mystery-encounters/encounters/department-store-sale.ts @@ -7,7 +7,7 @@ import { randSeedInt } from "#app/utils"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { Species } from "#enums/species"; import BattleScene from "../../../battle-scene"; -import MysteryEncounter, { +import IMysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier, } from "../mystery-encounter"; @@ -15,7 +15,7 @@ import MysteryEncounter, { /** i18n namespace for encounter */ const namespace = "mysteryEncounter:department_store_sale"; -export const DepartmentStoreSaleEncounter: MysteryEncounter = +export const DepartmentStoreSaleEncounter: IMysteryEncounter = MysteryEncounterBuilder.withEncounterType( MysteryEncounterType.DEPARTMENT_STORE_SALE ) diff --git a/src/data/mystery-encounters/encounters/field-trip-encounter.ts b/src/data/mystery-encounters/encounters/field-trip-encounter.ts index 8cb6fe65048..9235504e332 100644 --- a/src/data/mystery-encounters/encounters/field-trip-encounter.ts +++ b/src/data/mystery-encounters/encounters/field-trip-encounter.ts @@ -13,7 +13,7 @@ import { modifierTypes } from "#app/modifier/modifier-type"; import { OptionSelectItem } from "#app/ui/abstact-option-select-ui-handler"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import BattleScene from "../../../battle-scene"; -import MysteryEncounter, { +import IMysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier, } from "../mystery-encounter"; @@ -21,7 +21,7 @@ import MysteryEncounter, { /** i18n namespace for the encounter */ const namespace = "mysteryEncounter:field_trip"; -export const FieldTripEncounter: MysteryEncounter = +export const FieldTripEncounter: IMysteryEncounter = MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.FIELD_TRIP) .withEncounterTier(MysteryEncounterTier.COMMON) .withSceneWaveRangeRequirement(10, 180) diff --git a/src/data/mystery-encounters/encounters/fight-or-flight.ts b/src/data/mystery-encounters/encounters/fight-or-flight.ts index 3080ab76810..c98d7cd485f 100644 --- a/src/data/mystery-encounters/encounters/fight-or-flight.ts +++ b/src/data/mystery-encounters/encounters/fight-or-flight.ts @@ -23,7 +23,7 @@ import { randSeedInt } from "#app/utils"; import { BattlerTagType } from "#enums/battler-tag-type"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import BattleScene from "../../../battle-scene"; -import MysteryEncounter, { +import IMysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier, } from "../mystery-encounter"; @@ -32,7 +32,7 @@ import { MoveRequirement } from "../mystery-encounter-requirements"; /** the i18n namespace for the encounter */ const namespace = "mysteryEncounter:fight_or_flight"; -export const FightOrFlightEncounter: MysteryEncounter = +export const FightOrFlightEncounter: IMysteryEncounter = MysteryEncounterBuilder.withEncounterType( MysteryEncounterType.FIGHT_OR_FLIGHT ) diff --git a/src/data/mystery-encounters/encounters/mysterious-challengers.ts b/src/data/mystery-encounters/encounters/mysterious-challengers.ts index e8efc3470ed..1276d6e2226 100644 --- a/src/data/mystery-encounters/encounters/mysterious-challengers.ts +++ b/src/data/mystery-encounters/encounters/mysterious-challengers.ts @@ -15,7 +15,7 @@ import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { PartyMemberStrength } from "#enums/party-member-strength"; import BattleScene from "../../../battle-scene"; import * as Utils from "../../../utils"; -import MysteryEncounter, { +import IMysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier, } from "../mystery-encounter"; @@ -23,7 +23,7 @@ import MysteryEncounter, { /** the i18n namespace for the encounter */ const namespace = "mysteryEncounter:mysterious_challengers"; -export const MysteriousChallengersEncounter: MysteryEncounter = +export const MysteriousChallengersEncounter: IMysteryEncounter = MysteryEncounterBuilder.withEncounterType( MysteryEncounterType.MYSTERIOUS_CHALLENGERS ) diff --git a/src/data/mystery-encounters/encounters/mysterious-chest.ts b/src/data/mystery-encounters/encounters/mysterious-chest.ts index 9dd4f56f623..8d1f1c2eeb1 100644 --- a/src/data/mystery-encounters/encounters/mysterious-chest.ts +++ b/src/data/mystery-encounters/encounters/mysterious-chest.ts @@ -11,13 +11,13 @@ import { GameOverPhase } from "#app/phases"; import { randSeedInt } from "#app/utils"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import BattleScene from "../../../battle-scene"; -import MysteryEncounter, { +import IMysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier, } from "../mystery-encounter"; import { MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; -export const MysteriousChestEncounter: MysteryEncounter = +export const MysteriousChestEncounter: IMysteryEncounter = MysteryEncounterBuilder.withEncounterType( MysteryEncounterType.MYSTERIOUS_CHEST ) diff --git a/src/data/mystery-encounters/encounters/shady-vitamin-dealer.ts b/src/data/mystery-encounters/encounters/shady-vitamin-dealer.ts index 773c4b97b0e..f26890cefbc 100644 --- a/src/data/mystery-encounters/encounters/shady-vitamin-dealer.ts +++ b/src/data/mystery-encounters/encounters/shady-vitamin-dealer.ts @@ -14,14 +14,14 @@ import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { Species } from "#enums/species"; import i18next from "i18next"; import BattleScene from "../../../battle-scene"; -import MysteryEncounter, { +import IMysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier, } from "../mystery-encounter"; import { MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; import { MoneyRequirement } from "../mystery-encounter-requirements"; -export const ShadyVitaminDealerEncounter: MysteryEncounter = +export const ShadyVitaminDealerEncounter: IMysteryEncounter = MysteryEncounterBuilder.withEncounterType( MysteryEncounterType.SHADY_VITAMIN_DEALER ) diff --git a/src/data/mystery-encounters/encounters/sleeping-snorlax.ts b/src/data/mystery-encounters/encounters/sleeping-snorlax.ts index 324beb35e99..b0130c34419 100644 --- a/src/data/mystery-encounters/encounters/sleeping-snorlax.ts +++ b/src/data/mystery-encounters/encounters/sleeping-snorlax.ts @@ -7,7 +7,7 @@ import BattleScene from "../../../battle-scene"; import * as Utils from "../../../utils"; import { getPokemonSpecies } from "../../pokemon-species"; import { Status, StatusEffect } from "../../status-effect"; -import MysteryEncounter, { +import IMysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier, } from "../mystery-encounter"; @@ -27,7 +27,7 @@ import { /** i18n namespace for the encounter */ const namespace = "mysteryEncounter:sleeping_snorlax"; -export const SleepingSnorlaxEncounter: MysteryEncounter = +export const SleepingSnorlaxEncounter: IMysteryEncounter = MysteryEncounterBuilder.withEncounterType( MysteryEncounterType.SLEEPING_SNORLAX ) diff --git a/src/data/mystery-encounters/encounters/training-session.ts b/src/data/mystery-encounters/encounters/training-session.ts index e9b0461857d..4338f587583 100644 --- a/src/data/mystery-encounters/encounters/training-session.ts +++ b/src/data/mystery-encounters/encounters/training-session.ts @@ -20,13 +20,13 @@ import { randSeedShuffle } from "#app/utils"; import { BattlerTagType } from "#enums/battler-tag-type"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import BattleScene from "../../../battle-scene"; -import MysteryEncounter, { +import IMysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier, } from "../mystery-encounter"; import { MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; -export const TrainingSessionEncounter: MysteryEncounter = +export const TrainingSessionEncounter: IMysteryEncounter = MysteryEncounterBuilder.withEncounterType( MysteryEncounterType.TRAINING_SESSION ) diff --git a/src/data/mystery-encounters/mystery-encounter.ts b/src/data/mystery-encounters/mystery-encounter.ts index c367f2377b2..30e2e6682a6 100644 --- a/src/data/mystery-encounters/mystery-encounter.ts +++ b/src/data/mystery-encounters/mystery-encounter.ts @@ -35,7 +35,7 @@ export enum MysteryEncounterTier { MASTER // Not currently used } -export default interface MysteryEncounter { +export default interface IMysteryEncounter { /** * Required params */ @@ -130,8 +130,8 @@ export default interface MysteryEncounter { * These objects will be saved as part of session data any time the player is on a floor with an encounter * Unless you know what you're doing, you should use MysteryEncounterBuilder to create an instance for this class */ -export default class MysteryEncounter implements MysteryEncounter { - constructor(encounter: MysteryEncounter) { +export default class IMysteryEncounter implements IMysteryEncounter { + constructor(encounter: IMysteryEncounter) { if (!isNullOrUndefined(encounter)) { Object.assign(this, encounter); } @@ -339,7 +339,7 @@ export default class MysteryEncounter implements MysteryEncounter { } } -export class MysteryEncounterBuilder implements Partial { +export class MysteryEncounterBuilder implements Partial { encounterType?: MysteryEncounterType; options?: [MysteryEncounterOption, MysteryEncounterOption, ...MysteryEncounterOption[]] = [null, null]; spriteConfigs?: MysteryEncounterSpriteConfig[]; @@ -367,7 +367,7 @@ export class MysteryEncounterBuilder implements Partial { * @param encounterType * @returns this */ - static withEncounterType(encounterType: MysteryEncounterType): MysteryEncounterBuilder & Pick { + static withEncounterType(encounterType: MysteryEncounterType): MysteryEncounterBuilder & Pick { return Object.assign(new MysteryEncounterBuilder(), { encounterType: encounterType }); } @@ -377,7 +377,7 @@ export class MysteryEncounterBuilder implements Partial { * @param option - MysteryEncounterOption to add, can use MysteryEncounterOptionBuilder to create instance * @returns */ - withOption(option: MysteryEncounterOption): this & Pick { + withOption(option: MysteryEncounterOption): this & Pick { if (this.options[0] === null) { return Object.assign(this, { options: [option, this.options[0]] }); } else if (this.options[1] === null) { @@ -406,7 +406,7 @@ export class MysteryEncounterBuilder implements Partial { * @param spriteConfigs * @returns */ - withIntroSpriteConfigs(spriteConfigs: MysteryEncounterSpriteConfig[]): this & Pick { + withIntroSpriteConfigs(spriteConfigs: MysteryEncounterSpriteConfig[]): this & Pick { return Object.assign(this, { spriteConfigs: spriteConfigs }); } @@ -435,7 +435,7 @@ export class MysteryEncounterBuilder implements Partial { * @param encounterTier * @returns */ - withEncounterTier(encounterTier: MysteryEncounterTier): this & Required> { + withEncounterTier(encounterTier: MysteryEncounterTier): this & Required> { return Object.assign(this, { encounterTier: encounterTier }); } @@ -446,7 +446,7 @@ export class MysteryEncounterBuilder implements Partial { * @param requirement * @returns */ - withSceneRequirement(requirement: EncounterSceneRequirement): this & Required> { + withSceneRequirement(requirement: EncounterSceneRequirement): this & Required> { if (requirement instanceof EncounterPokemonRequirement) { Error("Incorrectly added pokemon requirement as scene requirement."); } @@ -482,7 +482,7 @@ export class MysteryEncounterBuilder implements Partial { * @param requirement {@linkcode EncounterPokemonRequirement} * @returns */ - withPrimaryPokemonRequirement(requirement: EncounterPokemonRequirement): this & Required> { + withPrimaryPokemonRequirement(requirement: EncounterPokemonRequirement): this & Required> { this.primaryPokemonRequirements.push(requirement); return Object.assign(this, { primaryPokemonRequirements: this.primaryPokemonRequirements }); } @@ -495,7 +495,7 @@ export class MysteryEncounterBuilder implements Partial { * @param invertQuery if true will invert the query * @returns */ - withPrimaryPokemonStatusEffectRequirement(statusEffect: StatusEffect | StatusEffect[], minNumberOfPokemon: number = 1, invertQuery: boolean = false): this & Required> { + withPrimaryPokemonStatusEffectRequirement(statusEffect: StatusEffect | StatusEffect[], minNumberOfPokemon: number = 1, invertQuery: boolean = false): this & Required> { return this.withPrimaryPokemonRequirement(new StatusEffectRequirement(statusEffect, minNumberOfPokemon, invertQuery)); } @@ -507,14 +507,14 @@ export class MysteryEncounterBuilder implements Partial { * @param invertQuery if true will invert the query * @returns */ - withPrimaryPokemonHealthRatioRequirement(requiredHealthRange: [number, number], minNumberOfPokemon: number = 1, invertQuery: boolean = false): this & Required> { + withPrimaryPokemonHealthRatioRequirement(requiredHealthRange: [number, number], minNumberOfPokemon: number = 1, invertQuery: boolean = false): this & Required> { return this.withPrimaryPokemonRequirement(new HealthRatioRequirement(requiredHealthRange, minNumberOfPokemon, invertQuery)); } // TODO: Maybe add an optional parameter for excluding primary pokemon from the support cast? // ex. if your only grass type pokemon, a snivy, is chosen as primary, if the support pokemon requires a grass type, the event won't trigger because // it's already been - withSecondaryPokemonRequirement(requirement: EncounterPokemonRequirement, excludePrimaryFromSecondaryRequirements: boolean = false): this & Required> { + withSecondaryPokemonRequirement(requirement: EncounterPokemonRequirement, excludePrimaryFromSecondaryRequirements: boolean = false): this & Required> { this.secondaryPokemonRequirements.push(requirement); this.excludePrimaryFromSupportRequirements = excludePrimaryFromSecondaryRequirements; return Object.assign(this, { excludePrimaryFromSecondaryRequirements: this.excludePrimaryFromSupportRequirements, secondaryPokemonRequirements: this.secondaryPokemonRequirements }); @@ -530,7 +530,7 @@ export class MysteryEncounterBuilder implements Partial { * @param doEncounterRewards - synchronous callback function to perform during rewards phase of the encounter * @returns */ - withRewards(doEncounterRewards: (scene: BattleScene) => boolean): this & Required> { + withRewards(doEncounterRewards: (scene: BattleScene) => boolean): this & Required> { return Object.assign(this, { doEncounterRewards: doEncounterRewards }); } @@ -544,7 +544,7 @@ export class MysteryEncounterBuilder implements Partial { * @param doEncounterExp - synchronous callback function to perform during rewards phase of the encounter * @returns */ - withExp(doEncounterExp: (scene: BattleScene) => boolean): this & Required> { + withExp(doEncounterExp: (scene: BattleScene) => boolean): this & Required> { return Object.assign(this, { doEncounterExp: doEncounterExp }); } @@ -555,7 +555,7 @@ export class MysteryEncounterBuilder implements Partial { * @param onInit - synchronous callback function to perform as soon as the encounter is selected for the next phase * @returns */ - withOnInit(onInit: (scene: BattleScene) => boolean): this & Required> { + withOnInit(onInit: (scene: BattleScene) => boolean): this & Required> { return Object.assign(this, { onInit: onInit }); } @@ -564,7 +564,7 @@ export class MysteryEncounterBuilder implements Partial { * @param enemyPartyConfig * @returns */ - withEnemyPartyConfig(enemyPartyConfig: EnemyPartyConfig): this & Required> { + withEnemyPartyConfig(enemyPartyConfig: EnemyPartyConfig): this & Required> { this.enemyPartyConfigs.push(enemyPartyConfig); return Object.assign(this, { enemyPartyConfigs: this.enemyPartyConfigs }); } @@ -575,7 +575,7 @@ export class MysteryEncounterBuilder implements Partial { * @param catchAllowed - if true, allows enemy pokemon to be caught during the encounter * @returns */ - withCatchAllowed(catchAllowed: boolean): this & Required> { + withCatchAllowed(catchAllowed: boolean): this & Required> { return Object.assign(this, { catchAllowed: catchAllowed }); } @@ -583,7 +583,7 @@ export class MysteryEncounterBuilder implements Partial { * @param hideBattleIntroMessage - if true, will not show the trainerAppeared/wildAppeared/bossAppeared message for an encounter * @returns */ - withHideWildIntroMessage(hideBattleIntroMessage: boolean): this & Required> { + withHideWildIntroMessage(hideBattleIntroMessage: boolean): this & Required> { return Object.assign(this, { hideBattleIntroMessage: hideBattleIntroMessage }); } @@ -591,7 +591,7 @@ export class MysteryEncounterBuilder implements Partial { * @param hideIntroVisuals - if false, will not hide the intro visuals that are displayed at the beginning of encounter * @returns */ - withHideIntroVisuals(hideIntroVisuals: boolean): this & Required> { + withHideIntroVisuals(hideIntroVisuals: boolean): this & Required> { return Object.assign(this, { hideIntroVisuals: hideIntroVisuals }); } @@ -672,7 +672,7 @@ export class MysteryEncounterBuilder implements Partial { * @param this - MysteryEncounter * @returns */ - build(this: MysteryEncounter) { - return new MysteryEncounter(this); + build(this: IMysteryEncounter) { + return new IMysteryEncounter(this); } } diff --git a/src/data/mystery-encounters/mystery-encounters.ts b/src/data/mystery-encounters/mystery-encounters.ts index 1651430e59d..602a01627c6 100644 --- a/src/data/mystery-encounters/mystery-encounters.ts +++ b/src/data/mystery-encounters/mystery-encounters.ts @@ -1,4 +1,4 @@ -import MysteryEncounter from "./mystery-encounter"; +import IMysteryEncounter from "./mystery-encounter"; import { DarkDealEncounter } from "./encounters/dark-deal"; import { MysteriousChallengersEncounter } from "./encounters/mysterious-challengers"; import { MysteriousChestEncounter } from "./encounters/mysterious-chest"; @@ -117,7 +117,7 @@ export const CIVILIZATION_ENCOUNTER_BIOMES = [ Biome.ISLAND ]; -export const allMysteryEncounters: { [encounterType: number]: MysteryEncounter } = {}; +export const allMysteryEncounters: { [encounterType: number]: IMysteryEncounter } = {}; const extremeBiomeEncounters: MysteryEncounterType[] = []; diff --git a/src/field/mystery-encounter-intro.ts b/src/field/mystery-encounter-intro.ts index adb700b4854..1b0fb3bca01 100644 --- a/src/field/mystery-encounter-intro.ts +++ b/src/field/mystery-encounter-intro.ts @@ -1,6 +1,6 @@ import { GameObjects } from "phaser"; import BattleScene from "../battle-scene"; -import MysteryEncounter from "../data/mystery-encounters/mystery-encounter"; +import IMysteryEncounter from "../data/mystery-encounters/mystery-encounter"; export class MysteryEncounterSpriteConfig { spriteKey: string; // e.g. "ace_trainer_f" @@ -21,10 +21,10 @@ export class MysteryEncounterSpriteConfig { * Note: intro visuals are not "Trainers" or any other specific game object, though they may contain trainer sprites */ export default class MysteryEncounterIntroVisuals extends Phaser.GameObjects.Container { - public encounter: MysteryEncounter; + public encounter: IMysteryEncounter; public spriteConfigs: MysteryEncounterSpriteConfig[]; - constructor(scene: BattleScene, encounter: MysteryEncounter) { + constructor(scene: BattleScene, encounter: IMysteryEncounter) { super(scene, -72, 76); this.encounter = encounter; // Shallow copy configs to allow visual config updates at runtime without dirtying master copy of Encounter diff --git a/src/system/game-data.ts b/src/system/game-data.ts index 871e2458bbd..606d63d70fe 100644 --- a/src/system/game-data.ts +++ b/src/system/game-data.ts @@ -41,7 +41,7 @@ import { Moves } from "#enums/moves"; import { PlayerGender } from "#enums/player-gender"; import { Species } from "#enums/species"; import { MysteryEncounterData } from "../data/mystery-encounters/mystery-encounter-data"; -import MysteryEncounter from "../data/mystery-encounters/mystery-encounter"; +import IMysteryEncounter from "../data/mystery-encounters/mystery-encounter"; export const defaultStarterSpecies: Species[] = [ Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE, @@ -124,7 +124,7 @@ export interface SessionSaveData { gameVersion: string; timestamp: integer; challenges: ChallengeData[]; - mysteryEncounter: MysteryEncounter; + mysteryEncounter: IMysteryEncounter; mysteryEncounterData: MysteryEncounterData; } @@ -1155,7 +1155,7 @@ export class GameData { } if (k === "mysteryEncounter") { - return new MysteryEncounter(v); + return new IMysteryEncounter(v); } if (k === "mysteryEncounterData") { diff --git a/src/test/mystery-encounter/mystery-encounter-utils.test.ts b/src/test/mystery-encounter/mystery-encounter-utils.test.ts index e558fe7a95c..50853c05a2e 100644 --- a/src/test/mystery-encounter/mystery-encounter-utils.test.ts +++ b/src/test/mystery-encounter/mystery-encounter-utils.test.ts @@ -10,7 +10,7 @@ import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; import { Species } from "#enums/species"; import BattleScene from "#app/battle-scene"; import { StatusEffect } from "#app/data/status-effect"; -import MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter"; +import IMysteryEncounter from "#app/data/mystery-encounters/mystery-encounter"; import { MessagePhase } from "#app/phases"; import { getPokemonSpecies, speciesStarters } from "#app/data/pokemon-species"; import { Type } from "#app/data/type"; @@ -273,7 +273,7 @@ describe("Mystery Encounter Utils", () => { describe("getTextWithEncounterDialogueTokens", () => { it("injects dialogue tokens and color styling", () => { - scene.currentBattle.mysteryEncounter = new MysteryEncounter(null); + scene.currentBattle.mysteryEncounter = new IMysteryEncounter(null); scene.currentBattle.mysteryEncounter.setDialogueToken("test", "value"); const result = getEncounterText(scene, "mysteryEncounter:unit_test_dialogue"); @@ -281,7 +281,7 @@ describe("Mystery Encounter Utils", () => { }); it("can perform nested dialogue token injection", () => { - scene.currentBattle.mysteryEncounter = new MysteryEncounter(null); + scene.currentBattle.mysteryEncounter = new IMysteryEncounter(null); scene.currentBattle.mysteryEncounter.setDialogueToken("test", "value"); scene.currentBattle.mysteryEncounter.setDialogueToken("testvalue", "new"); @@ -292,7 +292,7 @@ describe("Mystery Encounter Utils", () => { describe("queueEncounterMessage", () => { it("queues a message with encounter dialogue tokens", async () => { - scene.currentBattle.mysteryEncounter = new MysteryEncounter(null); + scene.currentBattle.mysteryEncounter = new IMysteryEncounter(null); scene.currentBattle.mysteryEncounter.setDialogueToken("test", "value"); const spy = vi.spyOn(game.scene, "queueMessage"); const phaseSpy = vi.spyOn(game.scene, "unshiftPhase"); @@ -305,7 +305,7 @@ describe("Mystery Encounter Utils", () => { describe("showEncounterText", () => { it("showText with dialogue tokens", async () => { - scene.currentBattle.mysteryEncounter = new MysteryEncounter(null); + scene.currentBattle.mysteryEncounter = new IMysteryEncounter(null); scene.currentBattle.mysteryEncounter.setDialogueToken("test", "value"); const spy = vi.spyOn(game.scene.ui, "showText"); @@ -316,7 +316,7 @@ describe("Mystery Encounter Utils", () => { describe("showEncounterDialogue", () => { it("showText with dialogue tokens", async () => { - scene.currentBattle.mysteryEncounter = new MysteryEncounter(null); + scene.currentBattle.mysteryEncounter = new IMysteryEncounter(null); scene.currentBattle.mysteryEncounter.setDialogueToken("test", "value"); const spy = vi.spyOn(game.scene.ui, "showDialogue"); From 55805d180470f757118c5f6097665f466caef6ca Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Thu, 11 Jul 2024 15:13:01 -0700 Subject: [PATCH 071/270] apply `namespace` for shady vitamin dealer encounter --- .../encounters/shady-vitamin-dealer.ts | 71 +++++++------------ 1 file changed, 25 insertions(+), 46 deletions(-) diff --git a/src/data/mystery-encounters/encounters/shady-vitamin-dealer.ts b/src/data/mystery-encounters/encounters/shady-vitamin-dealer.ts index f26890cefbc..14dddf91189 100644 --- a/src/data/mystery-encounters/encounters/shady-vitamin-dealer.ts +++ b/src/data/mystery-encounters/encounters/shady-vitamin-dealer.ts @@ -21,6 +21,9 @@ import IMysteryEncounter, { import { MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; import { MoneyRequirement } from "../mystery-encounter-requirements"; +/** the i18n namespace for this encounter */ +const namespace = "mysteryEncounter:shady_vitamin_dealer"; + export const ShadyVitaminDealerEncounter: IMysteryEncounter = MysteryEncounterBuilder.withEncounterType( MysteryEncounterType.SHADY_VITAMIN_DEALER @@ -48,26 +51,25 @@ export const ShadyVitaminDealerEncounter: IMysteryEncounter = ]) .withIntroDialogue([ { - text: "mysteryEncounter:shady_vitamin_dealer_intro_message", + text: `${namespace}_intro_message`, }, { - text: "mysteryEncounter:shady_vitamin_dealer_intro_dialogue", - speaker: "mysteryEncounter:shady_vitamin_dealer_speaker", + text: `${namespace}_intro_dialogue`, + speaker: `${namespace}_speaker`, }, ]) - .withTitle("mysteryEncounter:shady_vitamin_dealer_title") - .withDescription("mysteryEncounter:shady_vitamin_dealer_description") - .withQuery("mysteryEncounter:shady_vitamin_dealer_query") + .withTitle(`${namespace}_title`) + .withDescription(`${namespace}_description`) + .withQuery(`${namespace}_query`) .withOption( new MysteryEncounterOptionBuilder() .withSceneMoneyRequirement(0, 2) // Wave scaling money multiplier of 2 .withDialogue({ - buttonLabel: "mysteryEncounter:shady_vitamin_dealer_option_1_label", - buttonTooltip: - "mysteryEncounter:shady_vitamin_dealer_option_1_tooltip", + buttonLabel: `${namespace}_option_1_label`, + buttonTooltip: `${namespace}_option_1_tooltip`, selected: [ { - text: "mysteryEncounter:shady_vitamin_dealer_option_selected", + text: `${namespace}_option_selected`, }, ], }) @@ -103,9 +105,7 @@ export const ShadyVitaminDealerEncounter: IMysteryEncounter = pokemon ); if (!meetsReqs) { - return i18next.t( - "mysteryEncounter:shady_vitamin_dealer_invalid_selection" - ); + return i18next.t(`${namespace}_invalid_selection`); } return null; @@ -145,22 +145,13 @@ export const ShadyVitaminDealerEncounter: IMysteryEncounter = if (randSeedInt(10) < 8) { if (chosenPokemon.trySetStatus(StatusEffect.TOXIC)) { // Toxic applied - queueEncounterMessage( - scene, - "mysteryEncounter:shady_vitamin_dealer_bad_poison" - ); + queueEncounterMessage(scene, `${namespace}_bad_poison`); } else { // Pokemon immune or something else prevents status - queueEncounterMessage( - scene, - "mysteryEncounter:shady_vitamin_dealer_damage_only" - ); + queueEncounterMessage(scene, `${namespace}_damage_only`); } } else { - queueEncounterMessage( - scene, - "mysteryEncounter:shady_vitamin_dealer_damage_only" - ); + queueEncounterMessage(scene, `${namespace}_damage_only`); } setEncounterExp(scene, [chosenPokemon.id], 100); @@ -172,12 +163,11 @@ export const ShadyVitaminDealerEncounter: IMysteryEncounter = .withOption( new MysteryEncounterOptionBuilder() .withDialogue({ - buttonLabel: "mysteryEncounter:shady_vitamin_dealer_option_2_label", - buttonTooltip: - "mysteryEncounter:shady_vitamin_dealer_option_2_tooltip", + buttonLabel: `${namespace}_option_2_label`, + buttonTooltip: `${namespace}_option_2_tooltip`, selected: [ { - text: "mysteryEncounter:shady_vitamin_dealer_option_selected", + text: `${namespace}_option_selected`, }, ], }) @@ -214,9 +204,7 @@ export const ShadyVitaminDealerEncounter: IMysteryEncounter = pokemon ); if (!meetsReqs) { - return i18next.t( - "mysteryEncounter:shady_vitamin_dealer_invalid_selection" - ); + return i18next.t(`${namespace}_invalid_selection`); } return null; @@ -252,22 +240,13 @@ export const ShadyVitaminDealerEncounter: IMysteryEncounter = if (randSeedInt(10) < 2) { if (chosenPokemon.trySetStatus(StatusEffect.POISON)) { // Poison applied - queueEncounterMessage( - scene, - "mysteryEncounter:shady_vitamin_dealer_poison" - ); + queueEncounterMessage(scene, `${namespace}_poison`); } else { // Pokemon immune or something else prevents status - queueEncounterMessage( - scene, - "mysteryEncounter:shady_vitamin_dealer_no_bad_effects" - ); + queueEncounterMessage(scene, `${namespace}_no_bad_effects`); } } else { - queueEncounterMessage( - scene, - "mysteryEncounter:shady_vitamin_dealer_no_bad_effects" - ); + queueEncounterMessage(scene, `${namespace}_no_bad_effects`); } setEncounterExp(scene, [chosenPokemon.id], 100); @@ -278,8 +257,8 @@ export const ShadyVitaminDealerEncounter: IMysteryEncounter = ) .withSimpleOption( { - buttonLabel: "mysteryEncounter:shady_vitamin_dealer_option_3_label", - buttonTooltip: "mysteryEncounter:shady_vitamin_dealer_option_3_tooltip", + buttonLabel: `${namespace}_option_3_label`, + buttonTooltip: `${namespace}_option_3_tooltip`, }, async (scene: BattleScene) => { // Leave encounter with no rewards or exp From 4da5e0fb107011affe5772bb3b8ecbdba70d55d3 Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Thu, 11 Jul 2024 15:14:03 -0700 Subject: [PATCH 072/270] apply `namespace` for training session encounter --- .../encounters/training-session.ts | 52 ++++++++----------- 1 file changed, 22 insertions(+), 30 deletions(-) diff --git a/src/data/mystery-encounters/encounters/training-session.ts b/src/data/mystery-encounters/encounters/training-session.ts index 4338f587583..c5f0ee2e46f 100644 --- a/src/data/mystery-encounters/encounters/training-session.ts +++ b/src/data/mystery-encounters/encounters/training-session.ts @@ -6,7 +6,7 @@ import { selectPokemonForOption, setEncounterRewards, } from "#app/data/mystery-encounters/mystery-encounter-utils"; -import { getNatureName, Nature } from "#app/data/nature"; +import { Nature, getNatureName } from "#app/data/nature"; import { speciesStarters } from "#app/data/pokemon-species"; import { Stat } from "#app/data/pokemon-stat"; import { PlayerPokemon } from "#app/field/pokemon"; @@ -26,6 +26,9 @@ import IMysteryEncounter, { } from "../mystery-encounter"; import { MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; +/** The i18n namespace for the encounter */ +const namespace = "mysteryEncounter:training_session"; + export const TrainingSessionEncounter: IMysteryEncounter = MysteryEncounterBuilder.withEncounterType( MysteryEncounterType.TRAINING_SESSION @@ -43,20 +46,20 @@ export const TrainingSessionEncounter: IMysteryEncounter = ]) .withIntroDialogue([ { - text: "mysteryEncounter:training_session_intro_message", + text: `${namespace}_intro_message`, }, ]) - .withTitle("mysteryEncounter:training_session_title") - .withDescription("mysteryEncounter:training_session_description") - .withQuery("mysteryEncounter:training_session_query") + .withTitle(`${namespace}_title`) + .withDescription(`${namespace}_description`) + .withQuery(`${namespace}_query`) .withOption( new MysteryEncounterOptionBuilder() .withDialogue({ - buttonLabel: "mysteryEncounter:training_session_option_1_label", - buttonTooltip: "mysteryEncounter:training_session_option_1_tooltip", + buttonLabel: `${namespace}_option_1_label`, + buttonTooltip: `${namespace}_option_1_tooltip`, selected: [ { - text: "mysteryEncounter:training_session_option_selected_message", + text: `${namespace}_option_selected_message`, }, ], }) @@ -168,10 +171,7 @@ export const TrainingSessionEncounter: IMysteryEncounter = } scene.updateModifiers(true); scene.queueMessage( - getEncounterText( - scene, - "mysteryEncounter:training_session_battle_finished_1" - ), + getEncounterText(scene, `${namespace}_battle_finished_1`), null, true ); @@ -191,13 +191,12 @@ export const TrainingSessionEncounter: IMysteryEncounter = .withOption( new MysteryEncounterOptionBuilder() .withDialogue({ - buttonLabel: "mysteryEncounter:training_session_option_2_label", - buttonTooltip: "mysteryEncounter:training_session_option_2_tooltip", - secondOptionPrompt: - "mysteryEncounter:training_session_option_2_select_prompt", + buttonLabel: `${namespace}_option_2_label`, + buttonTooltip: `${namespace}_option_2_tooltip`, + secondOptionPrompt: `${namespace}_option_2_select_prompt`, selected: [ { - text: "mysteryEncounter:training_session_option_selected_message", + text: `${namespace}_option_selected_message`, }, ], }) @@ -247,10 +246,7 @@ export const TrainingSessionEncounter: IMysteryEncounter = const onBeforeRewardsPhase = () => { scene.queueMessage( - getEncounterText( - scene, - "mysteryEncounter:training_session_battle_finished_2" - ), + getEncounterText(scene, `${namespace}_battle_finished_2`), null, true ); @@ -280,13 +276,12 @@ export const TrainingSessionEncounter: IMysteryEncounter = .withOption( new MysteryEncounterOptionBuilder() .withDialogue({ - buttonLabel: "mysteryEncounter:training_session_option_3_label", - buttonTooltip: "mysteryEncounter:training_session_option_3_tooltip", - secondOptionPrompt: - "mysteryEncounter:training_session_option_3_select_prompt", + buttonLabel: `${namespace}_option_3_label`, + buttonTooltip: `${namespace}_option_3_tooltip`, + secondOptionPrompt: `${namespace}_option_3_select_prompt`, selected: [ { - text: "mysteryEncounter:training_session_option_selected_message", + text: `${namespace}_option_selected_message`, }, ], }) @@ -349,10 +344,7 @@ export const TrainingSessionEncounter: IMysteryEncounter = const onBeforeRewardsPhase = () => { scene.queueMessage( - getEncounterText( - scene, - "mysteryEncounter:training_session_battle_finished_3" - ), + getEncounterText(scene, `${namespace}_battle_finished_3`), null, true ); From 14289d27362bd75356af346fdfad628500117c69 Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Thu, 11 Jul 2024 15:17:37 -0700 Subject: [PATCH 073/270] add `-encounter` as suffix for encounter files --- .../{dark-deal.ts => dark-deal-encounter.ts} | 0 ...e.ts => department-store-sale-encounter.ts} | 0 ...-flight.ts => fight-or-flight-encounter.ts} | 0 ....ts => mysterious-challengers-encounter.ts} | 0 ...-chest.ts => mysterious-chest-encounter.ts} | 0 ...er.ts => shady-vitamin-dealer-encounter.ts} | 0 ...norlax.ts => sleeping-snorlax-encounter.ts} | 0 ...ession.ts => training-session-encounter.ts} | 0 .../mystery-encounters/mystery-encounters.ts | 18 +++++++++--------- 9 files changed, 9 insertions(+), 9 deletions(-) rename src/data/mystery-encounters/encounters/{dark-deal.ts => dark-deal-encounter.ts} (100%) rename src/data/mystery-encounters/encounters/{department-store-sale.ts => department-store-sale-encounter.ts} (100%) rename src/data/mystery-encounters/encounters/{fight-or-flight.ts => fight-or-flight-encounter.ts} (100%) rename src/data/mystery-encounters/encounters/{mysterious-challengers.ts => mysterious-challengers-encounter.ts} (100%) rename src/data/mystery-encounters/encounters/{mysterious-chest.ts => mysterious-chest-encounter.ts} (100%) rename src/data/mystery-encounters/encounters/{shady-vitamin-dealer.ts => shady-vitamin-dealer-encounter.ts} (100%) rename src/data/mystery-encounters/encounters/{sleeping-snorlax.ts => sleeping-snorlax-encounter.ts} (100%) rename src/data/mystery-encounters/encounters/{training-session.ts => training-session-encounter.ts} (100%) diff --git a/src/data/mystery-encounters/encounters/dark-deal.ts b/src/data/mystery-encounters/encounters/dark-deal-encounter.ts similarity index 100% rename from src/data/mystery-encounters/encounters/dark-deal.ts rename to src/data/mystery-encounters/encounters/dark-deal-encounter.ts diff --git a/src/data/mystery-encounters/encounters/department-store-sale.ts b/src/data/mystery-encounters/encounters/department-store-sale-encounter.ts similarity index 100% rename from src/data/mystery-encounters/encounters/department-store-sale.ts rename to src/data/mystery-encounters/encounters/department-store-sale-encounter.ts diff --git a/src/data/mystery-encounters/encounters/fight-or-flight.ts b/src/data/mystery-encounters/encounters/fight-or-flight-encounter.ts similarity index 100% rename from src/data/mystery-encounters/encounters/fight-or-flight.ts rename to src/data/mystery-encounters/encounters/fight-or-flight-encounter.ts diff --git a/src/data/mystery-encounters/encounters/mysterious-challengers.ts b/src/data/mystery-encounters/encounters/mysterious-challengers-encounter.ts similarity index 100% rename from src/data/mystery-encounters/encounters/mysterious-challengers.ts rename to src/data/mystery-encounters/encounters/mysterious-challengers-encounter.ts diff --git a/src/data/mystery-encounters/encounters/mysterious-chest.ts b/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts similarity index 100% rename from src/data/mystery-encounters/encounters/mysterious-chest.ts rename to src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts diff --git a/src/data/mystery-encounters/encounters/shady-vitamin-dealer.ts b/src/data/mystery-encounters/encounters/shady-vitamin-dealer-encounter.ts similarity index 100% rename from src/data/mystery-encounters/encounters/shady-vitamin-dealer.ts rename to src/data/mystery-encounters/encounters/shady-vitamin-dealer-encounter.ts diff --git a/src/data/mystery-encounters/encounters/sleeping-snorlax.ts b/src/data/mystery-encounters/encounters/sleeping-snorlax-encounter.ts similarity index 100% rename from src/data/mystery-encounters/encounters/sleeping-snorlax.ts rename to src/data/mystery-encounters/encounters/sleeping-snorlax-encounter.ts diff --git a/src/data/mystery-encounters/encounters/training-session.ts b/src/data/mystery-encounters/encounters/training-session-encounter.ts similarity index 100% rename from src/data/mystery-encounters/encounters/training-session.ts rename to src/data/mystery-encounters/encounters/training-session-encounter.ts diff --git a/src/data/mystery-encounters/mystery-encounters.ts b/src/data/mystery-encounters/mystery-encounters.ts index 602a01627c6..7a78c6edb4c 100644 --- a/src/data/mystery-encounters/mystery-encounters.ts +++ b/src/data/mystery-encounters/mystery-encounters.ts @@ -1,15 +1,15 @@ import IMysteryEncounter from "./mystery-encounter"; -import { DarkDealEncounter } from "./encounters/dark-deal"; -import { MysteriousChallengersEncounter } from "./encounters/mysterious-challengers"; -import { MysteriousChestEncounter } from "./encounters/mysterious-chest"; -import { FightOrFlightEncounter } from "#app/data/mystery-encounters/encounters/fight-or-flight"; -import { TrainingSessionEncounter } from "#app/data/mystery-encounters/encounters/training-session"; +import { DarkDealEncounter } from "./encounters/dark-deal-encounter"; +import { MysteriousChallengersEncounter } from "./encounters/mysterious-challengers-encounter"; +import { MysteriousChestEncounter } from "./encounters/mysterious-chest-encounter"; +import { FightOrFlightEncounter } from "./encounters/fight-or-flight-encounter"; +import { TrainingSessionEncounter } from "./encounters/training-session-encounter"; import { Biome } from "#enums/biome"; -import { SleepingSnorlaxEncounter } from "./encounters/sleeping-snorlax"; +import { SleepingSnorlaxEncounter } from "./encounters/sleeping-snorlax-encounter"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; -import { DepartmentStoreSaleEncounter } from "#app/data/mystery-encounters/encounters/department-store-sale"; -import { ShadyVitaminDealerEncounter } from "#app/data/mystery-encounters/encounters/shady-vitamin-dealer"; -import { FieldTripEncounter } from "#app/data/mystery-encounters/encounters/field-trip-encounter"; +import { DepartmentStoreSaleEncounter } from "./encounters/department-store-sale-encounter"; +import { ShadyVitaminDealerEncounter } from "./encounters/shady-vitamin-dealer-encounter"; +import { FieldTripEncounter } from "./encounters/field-trip-encounter"; // Spawn chance: (BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT + WIGHT_INCREMENT_ON_SPAWN_MISS * ) / 256 export const BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT = 1; From 92565691810f29354489c5efa988396431faa632 Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Thu, 11 Jul 2024 15:18:27 -0700 Subject: [PATCH 074/270] minor fix in phases.ts for myst.-enc. --- src/phases.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/phases.ts b/src/phases.ts index eeee9640427..6c64cc9454f 100644 --- a/src/phases.ts +++ b/src/phases.ts @@ -828,7 +828,7 @@ export class EncounterPhase extends BattlePhase { if (mysteryEncounter.onInit) { mysteryEncounter.onInit(this.scene); } - // mysteryEncounter.populateDialogueTokensFromRequirements(this.scene); + mysteryEncounter.populateDialogueTokensFromRequirements(this.scene); }, this.scene.currentBattle.waveIndex); // Add intro visuals for mystery encounter From 0326cb25383e0f4dc0fab834cbc6b4fad0b41b60 Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Thu, 11 Jul 2024 15:18:59 -0700 Subject: [PATCH 075/270] reset overrides.ts --- src/overrides.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/overrides.ts b/src/overrides.ts index 1e428c6dd2d..e19a5bf20dd 100644 --- a/src/overrides.ts +++ b/src/overrides.ts @@ -34,7 +34,7 @@ export const SEED_OVERRIDE: string = ""; export const WEATHER_OVERRIDE: WeatherType = WeatherType.NONE; export const DOUBLE_BATTLE_OVERRIDE: boolean = false; export const SINGLE_BATTLE_OVERRIDE: boolean = false; -export const STARTING_WAVE_OVERRIDE: integer = 33; +export const STARTING_WAVE_OVERRIDE: integer = 0; export const STARTING_BIOME_OVERRIDE: Biome = Biome.TOWN; export const ARENA_TINT_OVERRIDE: TimeOfDay = null; // Multiplies XP gained by this value including 0. Set to null to ignore the override From 4d4d0e55cc9fdc6f7a4ff38df8759a8450b6c07a Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Thu, 11 Jul 2024 15:24:40 -0700 Subject: [PATCH 076/270] fix myster-encounter-ui-handler duplicate req. check --- src/ui/mystery-encounter-ui-handler.ts | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/ui/mystery-encounter-ui-handler.ts b/src/ui/mystery-encounter-ui-handler.ts index c446481b744..7eb93f9b4ab 100644 --- a/src/ui/mystery-encounter-ui-handler.ts +++ b/src/ui/mystery-encounter-ui-handler.ts @@ -307,6 +307,8 @@ export default class MysteryEncounterUiHandler extends UiHandler { // Options Window for (let i = 0; i < this.filteredEncounterOptions.length; i++) { + const option = this.filteredEncounterOptions[i]; + let optionText; switch (this.filteredEncounterOptions.length) { case 2: @@ -319,10 +321,9 @@ export default class MysteryEncounterUiHandler extends UiHandler { optionText = addBBCodeTextObject(this.scene, i % 2 === 0 ? 0 : 100, i < 2 ? 0 : 16, "-", TextStyle.WINDOW, { wordWrap: { width: 558 }, fontSize: "80px", lineSpacing: -8 }); break; } - const option = this.filteredEncounterOptions[i]; - this.optionsMeetsReqs.push(this.filteredEncounterOptions[i].meetsRequirements(this.scene)); - const optionDialogue = option.dialogue ?? mysteryEncounter.dialogue.encounterOptionsDialogue.options[i]; + this.optionsMeetsReqs.push(option.meetsRequirements(this.scene)); + const optionDialogue = option.dialogue; let text: string; if (option.hasRequirements() && this.optionsMeetsReqs[i]) { // Options with special requirements that are met are automatically colored green @@ -336,8 +337,6 @@ export default class MysteryEncounterUiHandler extends UiHandler { optionText.setText(text); } - this.optionsMeetsReqs.push(option.meetsRequirements(this.scene)); - if (!this.optionsMeetsReqs[i]) { optionText.setAlpha(0.5); } From 96554427b586ed3acdac3c3e825d16958c037fd2 Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Thu, 11 Jul 2024 15:27:33 -0700 Subject: [PATCH 077/270] fix myster-encounter-ui-handler duplicate --- src/ui/mystery-encounter-ui-handler.ts | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/ui/mystery-encounter-ui-handler.ts b/src/ui/mystery-encounter-ui-handler.ts index 7eb93f9b4ab..9eccfd5d0e8 100644 --- a/src/ui/mystery-encounter-ui-handler.ts +++ b/src/ui/mystery-encounter-ui-handler.ts @@ -337,7 +337,7 @@ export default class MysteryEncounterUiHandler extends UiHandler { optionText.setText(text); } - if (!this.optionsMeetsReqs[i]) { + if (!this.optionsMeetsReqs[i] && option.isDisabledOnRequirementsNotMet) { optionText.setAlpha(0.5); } if (this.blockInput) { @@ -422,11 +422,10 @@ export default class MysteryEncounterUiHandler extends UiHandler { return; } - const mysteryEncounter = this.scene.currentBattle.mysteryEncounter; let text: string; - const option = this.filteredEncounterOptions[cursor]; - const optionDialogue = option.dialogue ?? mysteryEncounter.dialogue.encounterOptionsDialogue.options[cursor]; - if (!this.optionsMeetsReqs[cursor] && this.filteredEncounterOptions[cursor].isDisabledOnRequirementsNotMet && optionDialogue.disabledTooltip) { + const cursorOption = this.filteredEncounterOptions[cursor]; + const optionDialogue = cursorOption.dialogue; + if (!this.optionsMeetsReqs[cursor] && cursorOption.isDisabledOnRequirementsNotMet && optionDialogue.disabledTooltip) { text = getEncounterText(this.scene, optionDialogue.disabledTooltip, TextStyle.TOOLTIP_CONTENT); } else { text = getEncounterText(this.scene, optionDialogue.buttonTooltip, TextStyle.TOOLTIP_CONTENT); From 4412769cd99e1faacdfcf5b8e2a00418d1b14f30 Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Thu, 11 Jul 2024 18:31:48 -0400 Subject: [PATCH 078/270] small bug fixes --- src/battle-scene.ts | 2 +- src/overrides.ts | 4 ++-- src/phases.ts | 2 +- src/phases/mystery-encounter-phase.ts | 19 +++---------------- 4 files changed, 7 insertions(+), 20 deletions(-) diff --git a/src/battle-scene.ts b/src/battle-scene.ts index d3eac7fc973..2edec910f7b 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -2364,7 +2364,7 @@ export default class BattleScene extends SceneBase { } party.every((enemyPokemon: EnemyPokemon, i: integer) => { - if (customHeldModifiers && i < customHeldModifiers.length && customHeldModifiers[i].length > 0) { + if (customHeldModifiers && i < customHeldModifiers.length && customHeldModifiers[i] && customHeldModifiers[i].length > 0) { customHeldModifiers[i].forEach(mt => mt.newModifier(enemyPokemon).add(this.enemyModifiers, false, this)); return true; } diff --git a/src/overrides.ts b/src/overrides.ts index e19a5bf20dd..485f9c14864 100644 --- a/src/overrides.ts +++ b/src/overrides.ts @@ -117,9 +117,9 @@ export const EGG_GACHA_PULL_COUNT_OVERRIDE: number = 0; */ // 1 to 256, set to null to ignore -export const MYSTERY_ENCOUNTER_RATE_OVERRIDE: number = null; +export const MYSTERY_ENCOUNTER_RATE_OVERRIDE: number = 256; export const MYSTERY_ENCOUNTER_TIER_OVERRIDE: MysteryEncounterTier = null; -export const MYSTERY_ENCOUNTER_OVERRIDE: MysteryEncounterType = null; +export const MYSTERY_ENCOUNTER_OVERRIDE: MysteryEncounterType = MysteryEncounterType.SHADY_VITAMIN_DEALER; /** * MODIFIER / ITEM OVERRIDES diff --git a/src/phases.ts b/src/phases.ts index 6c64cc9454f..4be1305c8b7 100644 --- a/src/phases.ts +++ b/src/phases.ts @@ -5363,7 +5363,7 @@ export class SelectModifierPhase extends BattlePhase { this.scene.ui.revertMode(); this.scene.ui.setMode(Mode.MESSAGE); super.end(); - break; + return; } modifierType = typeOptions[cursor].type; break; diff --git a/src/phases/mystery-encounter-phase.ts b/src/phases/mystery-encounter-phase.ts index d84a5eb6b2f..3db7816387a 100644 --- a/src/phases/mystery-encounter-phase.ts +++ b/src/phases/mystery-encounter-phase.ts @@ -5,7 +5,7 @@ import { Mode } from "../ui/ui"; import { getEncounterText } from "../data/mystery-encounters/mystery-encounter-utils"; -import { CheckSwitchPhase, NewBattlePhase, PostSummonPhase, ReturnPhase, ScanIvsPhase, SelectModifierPhase, SummonPhase, ToggleDoublePositionPhase } from "../phases"; +import { CheckSwitchPhase, NewBattlePhase, ReturnPhase, ScanIvsPhase, SelectModifierPhase, SummonPhase, ToggleDoublePositionPhase } from "../phases"; import MysteryEncounterOption from "../data/mystery-encounters/mystery-encounter-option"; import { MysteryEncounterVariant } from "../data/mystery-encounters/mystery-encounter"; import { getCharVariantFromDialogue } from "../data/dialogue"; @@ -285,22 +285,9 @@ export class MysteryEncounterBattlePhase extends Phase { const enemyField = scene.getEnemyField(); const encounterVariant = scene.currentBattle.mysteryEncounter.encounterVariant; + // PostSummon and ShinySparkle phases are handled by SummonPhase + if (encounterVariant !== MysteryEncounterVariant.TRAINER_BATTLE) { - enemyField.map(p => this.scene.pushConditionalPhase(new PostSummonPhase(this.scene, p.getBattlerIndex()), () => { - // if there is not a player party, we can't continue - if (!this.scene.getParty()?.length) { - return false; - } - // how many player pokemon are on the field ? - const pokemonsOnFieldCount = this.scene.getParty().filter(p => p.isOnField()).length; - // if it's a 2vs1, there will never be a 2nd pokemon on our field even - const requiredPokemonsOnField = Math.min(this.scene.getParty().filter((p) => !p.isFainted()).length, 2); - // if it's a double, there should be 2, otherwise 1 - if (this.scene.currentBattle.double) { - return pokemonsOnFieldCount === requiredPokemonsOnField; - } - return pokemonsOnFieldCount === 1; - })); const ivScannerModifier = this.scene.findModifier(m => m instanceof IvScannerModifier); if (ivScannerModifier) { enemyField.map(p => this.scene.pushPhase(new ScanIvsPhase(this.scene, p.getBattlerIndex(), Math.min(ivScannerModifier.getStackCount() * 2, 6)))); From 61330c6967fb0ce794d148b8589752bd01c4b5bf Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Fri, 12 Jul 2024 11:28:22 -0400 Subject: [PATCH 079/270] remove overrides changes --- src/overrides.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/overrides.ts b/src/overrides.ts index 485f9c14864..e19a5bf20dd 100644 --- a/src/overrides.ts +++ b/src/overrides.ts @@ -117,9 +117,9 @@ export const EGG_GACHA_PULL_COUNT_OVERRIDE: number = 0; */ // 1 to 256, set to null to ignore -export const MYSTERY_ENCOUNTER_RATE_OVERRIDE: number = 256; +export const MYSTERY_ENCOUNTER_RATE_OVERRIDE: number = null; export const MYSTERY_ENCOUNTER_TIER_OVERRIDE: MysteryEncounterTier = null; -export const MYSTERY_ENCOUNTER_OVERRIDE: MysteryEncounterType = MysteryEncounterType.SHADY_VITAMIN_DEALER; +export const MYSTERY_ENCOUNTER_OVERRIDE: MysteryEncounterType = null; /** * MODIFIER / ITEM OVERRIDES From c99a6382ca02939700e629ec27a58820024aa0a2 Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Fri, 12 Jul 2024 13:20:14 -0400 Subject: [PATCH 080/270] add option mode for UI styling consistency --- .../encounters/dark-deal-encounter.ts | 47 +++------- .../department-store-sale-encounter.ts | 26 ++---- .../encounters/field-trip-encounter.ts | 89 +++++-------------- .../encounters/fight-or-flight-encounter.ts | 82 ++++------------- .../mysterious-challengers-encounter.ts | 50 ++--------- .../encounters/mysterious-chest-encounter.ts | 3 +- .../shady-vitamin-dealer-encounter.ts | 68 ++++---------- .../encounters/sleeping-snorlax-encounter.ts | 19 +--- .../encounters/training-session-encounter.ts | 20 ++--- .../mystery-encounter-option.ts | 30 ++++--- .../mystery-encounters/mystery-encounter.ts | 6 +- src/ui/mystery-encounter-ui-handler.ts | 16 ++-- 12 files changed, 121 insertions(+), 335 deletions(-) diff --git a/src/data/mystery-encounters/encounters/dark-deal-encounter.ts b/src/data/mystery-encounters/encounters/dark-deal-encounter.ts index 9d755ad9493..cb66208a6ff 100644 --- a/src/data/mystery-encounters/encounters/dark-deal-encounter.ts +++ b/src/data/mystery-encounters/encounters/dark-deal-encounter.ts @@ -7,19 +7,9 @@ import BattleScene from "../../../battle-scene"; import { AddPokeballModifierType } from "../../../modifier/modifier-type"; import { PokeballType } from "../../pokeball"; import { getPokemonSpecies } from "../../pokemon-species"; -import IMysteryEncounter, { - MysteryEncounterBuilder, - MysteryEncounterTier, -} from "../mystery-encounter"; -import { MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; -import { - EnemyPartyConfig, - EnemyPokemonConfig, - getRandomPlayerPokemon, - getRandomSpeciesByStarterTier, - initBattleWithEnemyConfig, - leaveEncounterWithoutBattle, -} from "../mystery-encounter-utils"; +import IMysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier, } from "../mystery-encounter"; +import { EncounterOptionMode, MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; +import { EnemyPartyConfig, EnemyPokemonConfig, getRandomPlayerPokemon, getRandomSpeciesByStarterTier, initBattleWithEnemyConfig, leaveEncounterWithoutBattle, } from "../mystery-encounter-utils"; /** i18n namespace for encounter */ const namespace = "mysteryEncounter:dark_deal"; @@ -27,6 +17,10 @@ const namespace = "mysteryEncounter:dark_deal"; // Exclude Ultra Beasts, Paradox, Necrozma, Eternatus, and egg-locked mythicals const excludedBosses = [ Species.NECROZMA, + Species.COSMOG, + Species.COSMOEM, + Species.SOLGALEO, + Species.LUNALA, Species.ETERNATUS, Species.NIHILEGO, Species.BUZZWOLE, @@ -106,6 +100,7 @@ export const DarkDealEncounter: IMysteryEncounter = .withQuery(`${namespace}_query`) .withOption( new MysteryEncounterOptionBuilder() + .withOptionMode(EncounterOptionMode.DEFAULT) .withDialogue({ buttonLabel: `${namespace}_option_1_label`, buttonTooltip: `${namespace}_option_1_tooltip`, @@ -135,20 +130,12 @@ export const DarkDealEncounter: IMysteryEncounter = removedPokemon.species.type1, ]; if (removedPokemon.species.type2) { - scene.currentBattle.mysteryEncounter.misc.push( - removedPokemon.species.type2 - ); + scene.currentBattle.mysteryEncounter.misc.push(removedPokemon.species.type2); } }) .withOptionPhase(async (scene: BattleScene) => { // Give the player 5 Rogue Balls - scene.unshiftPhase( - new ModifierRewardPhase( - scene, - () => - new AddPokeballModifierType("rb", PokeballType.ROGUE_BALL, 5) - ) - ); + scene.unshiftPhase(new ModifierRewardPhase(scene, () => new AddPokeballModifierType("rb", PokeballType.ROGUE_BALL, 5))); // Start encounter with random legendary (7-10 starter strength) that has level additive const bossTypes = scene.currentBattle.mysteryEncounter.misc as Type[]; @@ -156,21 +143,12 @@ export const DarkDealEncounter: IMysteryEncounter = const roll = randSeedInt(100); const starterTier: number | [number, number] = roll > 65 ? 6 : roll > 15 ? 7 : roll > 5 ? 8 : [9, 10]; - const bossSpecies = getPokemonSpecies( - getRandomSpeciesByStarterTier( - starterTier, - excludedBosses, - bossTypes - ) - ); + const bossSpecies = getPokemonSpecies(getRandomSpeciesByStarterTier(starterTier, excludedBosses, bossTypes)); const pokemonConfig: EnemyPokemonConfig = { species: bossSpecies, isBoss: true, }; - if ( - !isNullOrUndefined(bossSpecies.forms) && - bossSpecies.forms.length > 0 - ) { + if (!isNullOrUndefined(bossSpecies.forms) && bossSpecies.forms.length > 0) { pokemonConfig.formIndex = 0; } const config: EnemyPartyConfig = { @@ -194,7 +172,6 @@ export const DarkDealEncounter: IMysteryEncounter = }, async (scene: BattleScene) => { // Leave encounter with no rewards or exp - leaveEncounterWithoutBattle(scene, true); return true; } 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 d821a952864..9ad90a92cfb 100644 --- a/src/data/mystery-encounters/encounters/department-store-sale-encounter.ts +++ b/src/data/mystery-encounters/encounters/department-store-sale-encounter.ts @@ -16,9 +16,7 @@ import IMysteryEncounter, { const namespace = "mysteryEncounter:department_store_sale"; export const DepartmentStoreSaleEncounter: IMysteryEncounter = - MysteryEncounterBuilder.withEncounterType( - MysteryEncounterType.DEPARTMENT_STORE_SALE - ) + MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.DEPARTMENT_STORE_SALE) .withEncounterTier(MysteryEncounterTier.COMMON) .withSceneWaveRangeRequirement(10, 100) .withIntroSpriteConfigs([ @@ -45,7 +43,7 @@ export const DepartmentStoreSaleEncounter: IMysteryEncounter = speaker: `${namespace}_speaker`, }, ]) - // .withHideIntroVisuals(false) + .withHideIntroVisuals(false) .withTitle(`${namespace}_title`) .withDescription(`${namespace}_description`) .withQuery(`${namespace}_query`) @@ -71,10 +69,7 @@ export const DepartmentStoreSaleEncounter: IMysteryEncounter = i++; } - setEncounterRewards(scene, { - guaranteedModifierTypeFuncs: modifiers, - fillRemaining: false, - }); + setEncounterRewards(scene, { guaranteedModifierTypeFuncs: modifiers, fillRemaining: false, }); leaveEncounterWithoutBattle(scene); } ) @@ -98,10 +93,7 @@ export const DepartmentStoreSaleEncounter: IMysteryEncounter = i++; } - setEncounterRewards(scene, { - guaranteedModifierTypeFuncs: modifiers, - fillRemaining: false, - }); + setEncounterRewards(scene, { guaranteedModifierTypeFuncs: modifiers, fillRemaining: false, }); leaveEncounterWithoutBattle(scene); } ) @@ -125,10 +117,7 @@ export const DepartmentStoreSaleEncounter: IMysteryEncounter = i++; } - setEncounterRewards(scene, { - guaranteedModifierTypeFuncs: modifiers, - fillRemaining: false, - }); + setEncounterRewards(scene, { guaranteedModifierTypeFuncs: modifiers, fillRemaining: false, }); leaveEncounterWithoutBattle(scene); } ) @@ -156,10 +145,7 @@ export const DepartmentStoreSaleEncounter: IMysteryEncounter = i++; } - setEncounterRewards(scene, { - guaranteedModifierTypeFuncs: modifiers, - fillRemaining: false, - }); + setEncounterRewards(scene, { guaranteedModifierTypeFuncs: modifiers, fillRemaining: false, }); leaveEncounterWithoutBattle(scene); } ) diff --git a/src/data/mystery-encounters/encounters/field-trip-encounter.ts b/src/data/mystery-encounters/encounters/field-trip-encounter.ts index 9235504e332..b0131fa54c5 100644 --- a/src/data/mystery-encounters/encounters/field-trip-encounter.ts +++ b/src/data/mystery-encounters/encounters/field-trip-encounter.ts @@ -1,5 +1,5 @@ import { MoveCategory } from "#app/data/move"; -import { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; +import { EncounterOptionMode, MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; import { generateModifierTypeOption, leaveEncounterWithoutBattle, @@ -57,6 +57,7 @@ export const FieldTripEncounter: IMysteryEncounter = .withQuery(`${namespace}_query`) .withOption( new MysteryEncounterOptionBuilder() + .withOptionMode(EncounterOptionMode.DEFAULT) .withDialogue({ buttonLabel: `${namespace}_option_1_label`, buttonTooltip: `${namespace}_option_1_tooltip`, @@ -76,8 +77,7 @@ export const FieldTripEncounter: IMysteryEncounter = label: move.getName(), handler: () => { // Pokemon and move selected - const correctMove = - move.getMove().category === MoveCategory.PHYSICAL; + const correctMove = move.getMove().category === MoveCategory.PHYSICAL; encounter.setDialogueToken("moveCategory", "Physical"); if (!correctMove) { encounter.options[0].dialogue.selected = [ @@ -89,11 +89,7 @@ export const FieldTripEncounter: IMysteryEncounter = text: `${namespace}_lesson_learned`, }, ]; - setEncounterExp( - scene, - scene.getParty().map((p) => p.id), - 50 - ); + setEncounterExp(scene, scene.getParty().map((p) => p.id), 50); } else { encounter.setDialogueToken("pokeName", pokemon.name); encounter.setDialogueToken("move", move.getName()); @@ -120,28 +116,13 @@ export const FieldTripEncounter: IMysteryEncounter = 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.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, - }); + setEncounterRewards(scene, { guaranteedModifierTypeOptions: modifiers, fillRemaining: false }); } leaveEncounterWithoutBattle(scene, !encounter.misc.correctMove); @@ -150,6 +131,7 @@ export const FieldTripEncounter: IMysteryEncounter = ) .withOption( new MysteryEncounterOptionBuilder() + .withOptionMode(EncounterOptionMode.DEFAULT) .withDialogue({ buttonLabel: `${namespace}_option_2_label`, buttonTooltip: `${namespace}_option_2_tooltip`, @@ -169,8 +151,7 @@ export const FieldTripEncounter: IMysteryEncounter = label: move.getName(), handler: () => { // Pokemon and move selected - const correctMove = - move.getMove().category === MoveCategory.SPECIAL; + const correctMove = move.getMove().category === MoveCategory.SPECIAL; encounter.setDialogueToken("moveCategory", "Special"); if (!correctMove) { encounter.options[1].dialogue.selected = [ @@ -182,11 +163,7 @@ export const FieldTripEncounter: IMysteryEncounter = text: `${namespace}_lesson_learned`, }, ]; - setEncounterExp( - scene, - scene.getParty().map((p) => p.id), - 50 - ); + setEncounterExp(scene, scene.getParty().map((p) => p.id), 50); } else { encounter.setDialogueToken("pokeName", pokemon.name); encounter.setDialogueToken("move", move.getName()); @@ -213,28 +190,13 @@ export const FieldTripEncounter: IMysteryEncounter = 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.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, - }); + setEncounterRewards(scene, { guaranteedModifierTypeOptions: modifiers, fillRemaining: false }); } leaveEncounterWithoutBattle(scene, !encounter.misc.correctMove); @@ -243,6 +205,7 @@ export const FieldTripEncounter: IMysteryEncounter = ) .withOption( new MysteryEncounterOptionBuilder() + .withOptionMode(EncounterOptionMode.DEFAULT) .withDialogue({ buttonLabel: `${namespace}_option_3_label`, buttonTooltip: `${namespace}_option_3_tooltip`, @@ -262,8 +225,7 @@ export const FieldTripEncounter: IMysteryEncounter = label: move.getName(), handler: () => { // Pokemon and move selected - const correctMove = - move.getMove().category === MoveCategory.STATUS; + const correctMove = move.getMove().category === MoveCategory.STATUS; encounter.setDialogueToken("moveCategory", "Status"); if (!correctMove) { encounter.options[2].dialogue.selected = [ @@ -306,24 +268,13 @@ export const FieldTripEncounter: IMysteryEncounter = 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.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, - }); + setEncounterRewards(scene, { guaranteedModifierTypeOptions: modifiers, fillRemaining: false }); } leaveEncounterWithoutBattle(scene, !encounter.misc.correctMove); 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 c98d7cd485f..a742282a73f 100644 --- a/src/data/mystery-encounters/encounters/fight-or-flight-encounter.ts +++ b/src/data/mystery-encounters/encounters/fight-or-flight-encounter.ts @@ -1,5 +1,5 @@ import { BattleStat } from "#app/data/battle-stat"; -import { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; +import { EncounterOptionMode, MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; import { EnemyPartyConfig, initBattleWithEnemyConfig, @@ -8,7 +8,7 @@ import { setEncounterRewards, showEncounterText, } from "#app/data/mystery-encounters/mystery-encounter-utils"; -import { STEALING_MOVES } from "#app/data/mystery-encounters/requirements/requirement-groups"; +import { STEALING_MOVES } from "#app/data/mystery-encounters/requirements/requirement-groups"; import Pokemon from "#app/field/pokemon"; import { ModifierTier } from "#app/modifier/modifier-tier"; import { @@ -50,13 +50,7 @@ export const FightOrFlightEncounter: IMysteryEncounter = const encounter = scene.currentBattle.mysteryEncounter; // Calculate boss mon - const bossSpecies = scene.arena.randomSpecies( - scene.currentBattle.waveIndex, - scene.currentBattle.waveIndex, - 0, - getPartyLuckValue(scene.getParty()), - true - ); + const bossSpecies = scene.arena.randomSpecies(scene.currentBattle.waveIndex, scene.currentBattle.waveIndex, 0, getPartyLuckValue(scene.getParty()), true); const config: EnemyPartyConfig = { levelAdditiveMultiplier: 1, pokemonConfigs: [{ species: bossSpecies, isBoss: true }], @@ -73,17 +67,12 @@ export const FightOrFlightEncounter: IMysteryEncounter = : scene.currentBattle.waveIndex > 60 ? ModifierTier.ULTRA : ModifierTier.GREAT; - regenerateModifierPoolThresholds( - scene.getParty(), - ModifierPoolType.PLAYER, - 0 - ); // refresh player item pool - const item = getPlayerModifierTypeOptions(1, scene.getParty(), [], { - guaranteedModifierTiers: [tier], - })[0]; + regenerateModifierPoolThresholds(scene.getParty(), ModifierPoolType.PLAYER, 0); + const item = getPlayerModifierTypeOptions(1, scene.getParty(), [], { guaranteedModifierTiers: [tier] })[0]; encounter.setDialogueToken("itemName", item.type.name); encounter.misc = item; + const bossSpriteKey = bossSpecies.getSpriteId(false, bossSpecies.forms ? 0 : null, false, bossSpecies.hasVariants() ? 0 : null); encounter.spriteConfigs = [ { spriteKey: item.type.iconImage, @@ -95,7 +84,7 @@ export const FightOrFlightEncounter: IMysteryEncounter = isItem: true, }, { - spriteKey: bossSpecies.speciesId.toString(), + spriteKey: bossSpriteKey, fileRoot: "pokemon", hasShadow: true, tint: 0.25, @@ -133,20 +122,14 @@ export const FightOrFlightEncounter: IMysteryEncounter = // Pick battle const item = scene.currentBattle.mysteryEncounter .misc as ModifierTypeOption; - setEncounterRewards(scene, { - guaranteedModifierTypeOptions: [item], - fillRemaining: false, - }); - await initBattleWithEnemyConfig( - scene, - scene.currentBattle.mysteryEncounter.enemyPartyConfigs[0] - ); + setEncounterRewards(scene, { guaranteedModifierTypeOptions: [item], fillRemaining: false }); + await initBattleWithEnemyConfig(scene, scene.currentBattle.mysteryEncounter.enemyPartyConfigs[0]); } ) .withOption( new MysteryEncounterOptionBuilder() + .withOptionMode(EncounterOptionMode.DEFAULT_OR_SPECIAL) .withPrimaryPokemonRequirement(new MoveRequirement(STEALING_MOVES)) // Will set option2PrimaryName and option2PrimaryMove dialogue tokens automatically - .withDisabledOnRequirementsNotMet(false) .withDialogue({ buttonLabel: `${namespace}_option_2_label`, buttonTooltip: `${namespace}_option_2_tooltip`, @@ -154,21 +137,14 @@ export const FightOrFlightEncounter: IMysteryEncounter = .withOptionPhase(async (scene: BattleScene) => { // Pick steal const encounter = scene.currentBattle.mysteryEncounter; - const item = scene.currentBattle.mysteryEncounter - .misc as ModifierTypeOption; - setEncounterRewards(scene, { - guaranteedModifierTypeOptions: [item], - fillRemaining: false, - }); + const item = scene.currentBattle.mysteryEncounter.misc as ModifierTypeOption; + setEncounterRewards(scene, { guaranteedModifierTypeOptions: [item], fillRemaining: false }); // If player has a stealing move, they succeed automatically const primaryPokemon = encounter.options[1].primaryPokemon; if (primaryPokemon) { // Use primaryPokemon to execute the thievery - await showEncounterText( - scene, - `${namespace}_option_2_steal_result` - ); + await showEncounterText(scene, `${namespace}_option_2_steal_result`); leaveEncounterWithoutBattle(scene); return; } @@ -176,34 +152,12 @@ export const FightOrFlightEncounter: IMysteryEncounter = const roll = randSeedInt(16); if (roll > 6) { // Noticed and attacked by boss, gets +1 to all stats at start of fight (62.5%) - const config = - scene.currentBattle.mysteryEncounter.enemyPartyConfigs[0]; - config.pokemonConfigs[0].tags = [ - BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON, - ]; - config.pokemonConfigs[0].mysteryEncounterBattleEffects = ( - pokemon: Pokemon - ) => { - pokemon.scene.currentBattle.mysteryEncounter.setDialogueToken( - "enemyPokemon", - pokemon.name - ); + const config = scene.currentBattle.mysteryEncounter.enemyPartyConfigs[0]; + config.pokemonConfigs[0].tags = [BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON]; + config.pokemonConfigs[0].mysteryEncounterBattleEffects = (pokemon: Pokemon) => { + pokemon.scene.currentBattle.mysteryEncounter.setDialogueToken("enemyPokemon", pokemon.name); queueEncounterMessage(pokemon.scene, `${namespace}_boss_enraged`); - pokemon.scene.unshiftPhase( - new StatChangePhase( - pokemon.scene, - pokemon.getBattlerIndex(), - true, - [ - BattleStat.ATK, - BattleStat.DEF, - BattleStat.SPATK, - BattleStat.SPDEF, - BattleStat.SPD, - ], - 1 - ) - ); + pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [BattleStat.ATK, BattleStat.DEF, BattleStat.SPATK, BattleStat.SPDEF, BattleStat.SPD], 1)); }; await showEncounterText(scene, `${namespace}_option_2_bad_result`); await initBattleWithEnemyConfig(scene, config); diff --git a/src/data/mystery-encounters/encounters/mysterious-challengers-encounter.ts b/src/data/mystery-encounters/encounters/mysterious-challengers-encounter.ts index 1276d6e2226..7c7d03b7895 100644 --- a/src/data/mystery-encounters/encounters/mysterious-challengers-encounter.ts +++ b/src/data/mystery-encounters/encounters/mysterious-challengers-encounter.ts @@ -40,18 +40,13 @@ export const MysteriousChallengersEncounter: IMysteryEncounter = // Calculates what trainers are available for battle in the encounter // Normal difficulty trainer is randomly pulled from biome - const normalTrainerType = scene.arena.randomTrainerType( - scene.currentBattle.waveIndex - ); + const normalTrainerType = scene.arena.randomTrainerType(scene.currentBattle.waveIndex); const normalConfig = trainerConfigs[normalTrainerType].copy(); let female = false; if (normalConfig.hasGenders) { female = !!Utils.randSeedInt(2); } - const normalSpriteKey = normalConfig.getSpriteKey( - female, - normalConfig.doubleOnly - ); + const normalSpriteKey = normalConfig.getSpriteKey(female, normalConfig.doubleOnly); encounter.enemyPartyConfigs.push({ trainerConfig: normalConfig, female: female, @@ -59,9 +54,7 @@ export const MysteriousChallengersEncounter: IMysteryEncounter = // Hard difficulty trainer is another random trainer, but with AVERAGE_BALANCED config // Number of mons is based off wave: 1-20 is 2, 20-40 is 3, etc. capping at 6 after wave 100 - const hardTrainerType = scene.arena.randomTrainerType( - scene.currentBattle.waveIndex - ); + const hardTrainerType = scene.arena.randomTrainerType(scene.currentBattle.waveIndex); const hardTemplate = new TrainerPartyCompoundTemplate( new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER, false, true), new TrainerPartyTemplate( @@ -77,10 +70,7 @@ export const MysteriousChallengersEncounter: IMysteryEncounter = if (hardConfig.hasGenders) { female = !!Utils.randSeedInt(2); } - const hardSpriteKey = hardConfig.getSpriteKey( - female, - hardConfig.doubleOnly - ); + const hardSpriteKey = hardConfig.getSpriteKey(female, hardConfig.doubleOnly); encounter.enemyPartyConfigs.push({ trainerConfig: hardConfig, levelAdditiveMultiplier: 0.5, @@ -101,10 +91,7 @@ export const MysteriousChallengersEncounter: IMysteryEncounter = if (brutalConfig.hasGenders) { female = !!Utils.randSeedInt(2); } - const brutalSpriteKey = brutalConfig.getSpriteKey( - female, - brutalConfig.doubleOnly - ); + const brutalSpriteKey = brutalConfig.getSpriteKey(female, brutalConfig.doubleOnly); encounter.enemyPartyConfigs.push({ trainerConfig: brutalConfig, levelAdditiveMultiplier: 1.1, @@ -152,14 +139,7 @@ export const MysteriousChallengersEncounter: IMysteryEncounter = // Spawn standard trainer battle with memory mushroom reward const config: EnemyPartyConfig = encounter.enemyPartyConfigs[0]; - setEncounterRewards(scene, { - guaranteedModifierTypeFuncs: [ - modifierTypes.TM_COMMON, - modifierTypes.TM_GREAT, - modifierTypes.MEMORY_MUSHROOM, - ], - fillRemaining: true, - }); + setEncounterRewards(scene, { guaranteedModifierTypeFuncs: [modifierTypes.TM_COMMON, modifierTypes.TM_GREAT, modifierTypes.MEMORY_MUSHROOM], fillRemaining: true }); // Seed offsets to remove possibility of different trainers having exact same teams let ret; @@ -184,14 +164,7 @@ export const MysteriousChallengersEncounter: IMysteryEncounter = // Spawn hard fight with ULTRA/GREAT reward (can improve with luck) const config: EnemyPartyConfig = encounter.enemyPartyConfigs[1]; - setEncounterRewards(scene, { - guaranteedModifierTiers: [ - ModifierTier.ULTRA, - ModifierTier.GREAT, - ModifierTier.GREAT, - ], - fillRemaining: true, - }); + setEncounterRewards(scene, { guaranteedModifierTiers: [ModifierTier.ULTRA, ModifierTier.GREAT, ModifierTier.GREAT], fillRemaining: true }); // Seed offsets to remove possibility of different trainers having exact same teams let ret; @@ -219,14 +192,7 @@ export const MysteriousChallengersEncounter: IMysteryEncounter = // To avoid player level snowballing from picking this option encounter.expMultiplier = 0.9; - setEncounterRewards(scene, { - guaranteedModifierTiers: [ - ModifierTier.ROGUE, - ModifierTier.ULTRA, - ModifierTier.GREAT, - ], - fillRemaining: true, - }); + setEncounterRewards(scene, { guaranteedModifierTiers: [ModifierTier.ROGUE, ModifierTier.ULTRA, ModifierTier.GREAT], fillRemaining: true }); // Seed offsets to remove possibility of different trainers having exact same teams let ret; diff --git a/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts b/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts index 8d1f1c2eeb1..49672ee636c 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 @@ import IMysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier, } from "../mystery-encounter"; -import { MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; +import { EncounterOptionMode, MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; export const MysteriousChestEncounter: IMysteryEncounter = MysteryEncounterBuilder.withEncounterType( @@ -44,6 +44,7 @@ export const MysteriousChestEncounter: IMysteryEncounter = .withQuery("mysteryEncounter:mysterious_chest_query") .withOption( new MysteryEncounterOptionBuilder() + .withOptionMode(EncounterOptionMode.DEFAULT) .withDialogue({ buttonLabel: "mysteryEncounter:mysterious_chest_option_1_label", buttonTooltip: "mysteryEncounter:mysterious_chest_option_1_tooltip", 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 14dddf91189..6018b651639 100644 --- a/src/data/mystery-encounters/encounters/shady-vitamin-dealer-encounter.ts +++ b/src/data/mystery-encounters/encounters/shady-vitamin-dealer-encounter.ts @@ -1,11 +1,4 @@ -import { - generateModifierTypeOption, - leaveEncounterWithoutBattle, - queueEncounterMessage, - selectPokemonForOption, - setEncounterExp, - updatePlayerMoney, -} from "#app/data/mystery-encounters/mystery-encounter-utils"; +import { generateModifierTypeOption, leaveEncounterWithoutBattle, queueEncounterMessage, selectPokemonForOption, setEncounterExp, updatePlayerMoney, } from "#app/data/mystery-encounters/mystery-encounter-utils"; import { StatusEffect } from "#app/data/status-effect"; import Pokemon, { PlayerPokemon } from "#app/field/pokemon"; import { modifierTypes } from "#app/modifier/modifier-type"; @@ -14,11 +7,8 @@ import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { Species } from "#enums/species"; import i18next from "i18next"; import BattleScene from "../../../battle-scene"; -import IMysteryEncounter, { - MysteryEncounterBuilder, - MysteryEncounterTier, -} from "../mystery-encounter"; -import { MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; +import IMysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier, } from "../mystery-encounter"; +import { EncounterOptionMode, MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; import { MoneyRequirement } from "../mystery-encounter-requirements"; /** the i18n namespace for this encounter */ @@ -63,6 +53,7 @@ export const ShadyVitaminDealerEncounter: IMysteryEncounter = .withQuery(`${namespace}_query`) .withOption( new MysteryEncounterOptionBuilder() + .withOptionMode(EncounterOptionMode.DISABLED_OR_DEFAULT) .withSceneMoneyRequirement(0, 2) // Wave scaling money multiplier of 2 .withDialogue({ buttonLabel: `${namespace}_option_1_label`, @@ -77,17 +68,11 @@ export const ShadyVitaminDealerEncounter: IMysteryEncounter = const encounter = scene.currentBattle.mysteryEncounter; const onPokemonSelected = (pokemon: PlayerPokemon) => { // Update money - updatePlayerMoney( - scene, - -(encounter.options[0].requirements[0] as MoneyRequirement) - .requiredMoney - ); + updatePlayerMoney(scene, -(encounter.options[0].requirements[0] as MoneyRequirement).requiredMoney); // Calculate modifiers and dialogue tokens const modifiers = [ - generateModifierTypeOption(scene, modifierTypes.BASE_STAT_BOOSTER) - .type, - generateModifierTypeOption(scene, modifierTypes.BASE_STAT_BOOSTER) - .type, + generateModifierTypeOption(scene, modifierTypes.BASE_STAT_BOOSTER).type, + generateModifierTypeOption(scene, modifierTypes.BASE_STAT_BOOSTER).type, ]; encounter.setDialogueToken("boost1", modifiers[0].name); encounter.setDialogueToken("boost2", modifiers[1].name); @@ -100,10 +85,7 @@ export const ShadyVitaminDealerEncounter: IMysteryEncounter = // Only Pokemon that can gain benefits are above 1/3rd HP with no status const selectableFilter = (pokemon: Pokemon) => { // If pokemon meets primary pokemon reqs, it can be selected - const meetsReqs = encounter.pokemonMeetsPrimaryRequirements( - scene, - pokemon - ); + const meetsReqs = encounter.pokemonMeetsPrimaryRequirements(scene, pokemon); if (!meetsReqs) { return i18next.t(`${namespace}_invalid_selection`); } @@ -111,12 +93,7 @@ export const ShadyVitaminDealerEncounter: IMysteryEncounter = return null; }; - return selectPokemonForOption( - scene, - onPokemonSelected, - null, - selectableFilter - ); + return selectPokemonForOption(scene, onPokemonSelected, null, selectableFilter); }) .withOptionPhase(async (scene: BattleScene) => { // Choose Cheap Option @@ -162,6 +139,8 @@ export const ShadyVitaminDealerEncounter: IMysteryEncounter = ) .withOption( new MysteryEncounterOptionBuilder() + .withOptionMode(EncounterOptionMode.DISABLED_OR_DEFAULT) + .withSceneMoneyRequirement(0, 5) // Wave scaling money multiplier of 5 .withDialogue({ buttonLabel: `${namespace}_option_2_label`, buttonTooltip: `${namespace}_option_2_tooltip`, @@ -171,22 +150,15 @@ export const ShadyVitaminDealerEncounter: IMysteryEncounter = }, ], }) - .withSceneMoneyRequirement(0, 5) // Wave scaling money multiplier of 5 .withPreOptionPhase(async (scene: BattleScene): Promise => { const encounter = scene.currentBattle.mysteryEncounter; const onPokemonSelected = (pokemon: PlayerPokemon) => { // Update money - updatePlayerMoney( - scene, - -(encounter.options[1].requirements[0] as MoneyRequirement) - .requiredMoney - ); + updatePlayerMoney(scene, -(encounter.options[1].requirements[0] as MoneyRequirement).requiredMoney); // Calculate modifiers and dialogue tokens const modifiers = [ - generateModifierTypeOption(scene, modifierTypes.BASE_STAT_BOOSTER) - .type, - generateModifierTypeOption(scene, modifierTypes.BASE_STAT_BOOSTER) - .type, + generateModifierTypeOption(scene, modifierTypes.BASE_STAT_BOOSTER).type, + generateModifierTypeOption(scene, modifierTypes.BASE_STAT_BOOSTER).type, ]; encounter.setDialogueToken("boost1", modifiers[0].name); encounter.setDialogueToken("boost2", modifiers[1].name); @@ -199,10 +171,7 @@ export const ShadyVitaminDealerEncounter: IMysteryEncounter = // Only Pokemon that can gain benefits are above 1/3rd HP with no status const selectableFilter = (pokemon: Pokemon) => { // If pokemon meets primary pokemon reqs, it can be selected - const meetsReqs = encounter.pokemonMeetsPrimaryRequirements( - scene, - pokemon - ); + const meetsReqs = encounter.pokemonMeetsPrimaryRequirements(scene, pokemon); if (!meetsReqs) { return i18next.t(`${namespace}_invalid_selection`); } @@ -210,12 +179,7 @@ export const ShadyVitaminDealerEncounter: IMysteryEncounter = return null; }; - return selectPokemonForOption( - scene, - onPokemonSelected, - null, - selectableFilter - ); + return selectPokemonForOption(scene, onPokemonSelected, null, selectableFilter); }) .withOptionPhase(async (scene: BattleScene) => { // Choose Expensive Option diff --git a/src/data/mystery-encounters/encounters/sleeping-snorlax-encounter.ts b/src/data/mystery-encounters/encounters/sleeping-snorlax-encounter.ts index b0130c34419..d26bacf7c5c 100644 --- a/src/data/mystery-encounters/encounters/sleeping-snorlax-encounter.ts +++ b/src/data/mystery-encounters/encounters/sleeping-snorlax-encounter.ts @@ -7,22 +7,10 @@ import BattleScene from "../../../battle-scene"; import * as Utils from "../../../utils"; import { getPokemonSpecies } from "../../pokemon-species"; import { Status, StatusEffect } from "../../status-effect"; -import IMysteryEncounter, { - MysteryEncounterBuilder, - MysteryEncounterTier, -} from "../mystery-encounter"; -import { MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; +import IMysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier, } from "../mystery-encounter"; +import { EncounterOptionMode, MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; import { MoveRequirement } from "../mystery-encounter-requirements"; -import { - EnemyPartyConfig, - EnemyPokemonConfig, - generateModifierTypeOption, - initBattleWithEnemyConfig, - leaveEncounterWithoutBattle, - queueEncounterMessage, - setEncounterExp, - setEncounterRewards, -} from "../mystery-encounter-utils"; +import { EnemyPartyConfig, EnemyPokemonConfig, generateModifierTypeOption, initBattleWithEnemyConfig, leaveEncounterWithoutBattle, queueEncounterMessage, setEncounterExp, setEncounterRewards, } from "../mystery-encounter-utils"; /** i18n namespace for the encounter */ const namespace = "mysteryEncounter:sleeping_snorlax"; @@ -152,6 +140,7 @@ export const SleepingSnorlaxEncounter: IMysteryEncounter = ) .withOption( new MysteryEncounterOptionBuilder() + .withOptionMode(EncounterOptionMode.DISABLED_OR_SPECIAL) .withPrimaryPokemonRequirement(new MoveRequirement(STEALING_MOVES)) .withDialogue({ buttonLabel: `${namespace}_option_3_label`, diff --git a/src/data/mystery-encounters/encounters/training-session-encounter.ts b/src/data/mystery-encounters/encounters/training-session-encounter.ts index c5f0ee2e46f..da76d8a2d64 100644 --- a/src/data/mystery-encounters/encounters/training-session-encounter.ts +++ b/src/data/mystery-encounters/encounters/training-session-encounter.ts @@ -1,12 +1,6 @@ import { Ability, allAbilities } from "#app/data/ability"; -import { - EnemyPartyConfig, - getEncounterText, - initBattleWithEnemyConfig, - selectPokemonForOption, - setEncounterRewards, -} from "#app/data/mystery-encounters/mystery-encounter-utils"; -import { Nature, getNatureName } from "#app/data/nature"; +import { EnemyPartyConfig, getEncounterText, initBattleWithEnemyConfig, selectPokemonForOption, setEncounterRewards, } from "#app/data/mystery-encounters/mystery-encounter-utils"; +import { getNatureName, Nature } from "#app/data/nature"; import { speciesStarters } from "#app/data/pokemon-species"; import { Stat } from "#app/data/pokemon-stat"; import { PlayerPokemon } from "#app/field/pokemon"; @@ -20,11 +14,8 @@ import { randSeedShuffle } from "#app/utils"; import { BattlerTagType } from "#enums/battler-tag-type"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import BattleScene from "../../../battle-scene"; -import IMysteryEncounter, { - MysteryEncounterBuilder, - MysteryEncounterTier, -} from "../mystery-encounter"; -import { MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; +import IMysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier, } from "../mystery-encounter"; +import { EncounterOptionMode, MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; /** The i18n namespace for the encounter */ const namespace = "mysteryEncounter:training_session"; @@ -54,6 +45,7 @@ export const TrainingSessionEncounter: IMysteryEncounter = .withQuery(`${namespace}_query`) .withOption( new MysteryEncounterOptionBuilder() + .withOptionMode(EncounterOptionMode.DEFAULT) .withDialogue({ buttonLabel: `${namespace}_option_1_label`, buttonTooltip: `${namespace}_option_1_tooltip`, @@ -190,6 +182,7 @@ export const TrainingSessionEncounter: IMysteryEncounter = ) .withOption( new MysteryEncounterOptionBuilder() + .withOptionMode(EncounterOptionMode.DEFAULT) .withDialogue({ buttonLabel: `${namespace}_option_2_label`, buttonTooltip: `${namespace}_option_2_tooltip`, @@ -275,6 +268,7 @@ export const TrainingSessionEncounter: IMysteryEncounter = ) .withOption( new MysteryEncounterOptionBuilder() + .withOptionMode(EncounterOptionMode.DEFAULT) .withDialogue({ buttonLabel: `${namespace}_option_3_label`, buttonTooltip: `${namespace}_option_3_tooltip`, diff --git a/src/data/mystery-encounters/mystery-encounter-option.ts b/src/data/mystery-encounters/mystery-encounter-option.ts index 1ab6a4d59ef..05a717c3e85 100644 --- a/src/data/mystery-encounters/mystery-encounter-option.ts +++ b/src/data/mystery-encounters/mystery-encounter-option.ts @@ -3,24 +3,29 @@ import { PlayerPokemon } from "#app/field/pokemon"; import BattleScene from "../../battle-scene"; import * as Utils from "../../utils"; import { EncounterPokemonRequirement, EncounterSceneRequirement, MoneyRequirement } from "./mystery-encounter-requirements"; -import { isNullOrUndefined } from "../../utils"; + +export enum EncounterOptionMode { + /** Default style */ + DEFAULT, + /** Disabled on requirements not met, default style on requirements met */ + DISABLED_OR_DEFAULT, + /** Default style on requirements not met, special style on requirements met */ + DEFAULT_OR_SPECIAL, + /** Disabled on requirements not met, special style on requirements met */ + DISABLED_OR_SPECIAL +} export type OptionPhaseCallback = (scene: BattleScene) => Promise; export default interface MysteryEncounterOption { + optionMode: EncounterOptionMode; requirements?: EncounterSceneRequirement[]; primaryPokemonRequirements?: EncounterPokemonRequirement[]; secondaryPokemonRequirements?: EncounterPokemonRequirement[]; primaryPokemon?: PlayerPokemon; secondaryPokemon?: PlayerPokemon[]; excludePrimaryFromSecondaryRequirements?: boolean; - /** - * There are two modes of option requirements: - * 1 (DEFAULT): Option is completely disabled if requirements are not met (unselectable and greyed out) - * 2: Option is *NOT* disabled if requirements are not met - */ - isDisabledOnRequirementsNotMet?: boolean; /** * Dialogue object containing all the dialogue, messages, tooltips, etc. for this option @@ -42,7 +47,6 @@ export default class MysteryEncounterOption implements MysteryEncounterOption { this.requirements = this.requirements ? this.requirements : []; this.primaryPokemonRequirements = this.primaryPokemonRequirements ? this.primaryPokemonRequirements : []; this.secondaryPokemonRequirements = this.secondaryPokemonRequirements ? this.secondaryPokemonRequirements : []; - this.isDisabledOnRequirementsNotMet = isNullOrUndefined(this.isDisabledOnRequirementsNotMet) ? true : this.isDisabledOnRequirementsNotMet; } hasRequirements?() { @@ -134,6 +138,7 @@ export default class MysteryEncounterOption implements MysteryEncounterOption { export class MysteryEncounterOptionBuilder implements Partial { + optionMode?: EncounterOptionMode; requirements?: EncounterSceneRequirement[] = []; primaryPokemonRequirements?: EncounterPokemonRequirement[] = []; secondaryPokemonRequirements ?: EncounterPokemonRequirement[] = []; @@ -144,6 +149,10 @@ export class MysteryEncounterOptionBuilder implements Partial { + return Object.assign(this, { optionMode: optionMode }); + } + withSceneRequirement(requirement: EncounterSceneRequirement): this & Required> { this.requirements.push(requirement); return Object.assign(this, { requirements: this.requirements }); @@ -180,11 +189,6 @@ export class MysteryEncounterOptionBuilder implements Partial> { - this.isDisabledOnRequirementsNotMet = disabled; - return Object.assign(this, { isDisabledOnRequirementsNotMet: this.isDisabledOnRequirementsNotMet }); - } - withDialogue(dialogue: OptionTextDisplay) { this.dialogue = dialogue; return this; diff --git a/src/data/mystery-encounters/mystery-encounter.ts b/src/data/mystery-encounters/mystery-encounter.ts index 30e2e6682a6..6fee6e493cf 100644 --- a/src/data/mystery-encounters/mystery-encounter.ts +++ b/src/data/mystery-encounters/mystery-encounter.ts @@ -9,7 +9,7 @@ import { StatusEffect } from "../status-effect"; import MysteryEncounterDialogue, { OptionTextDisplay } from "./mystery-encounter-dialogue"; -import MysteryEncounterOption, { MysteryEncounterOptionBuilder, OptionPhaseCallback } from "./mystery-encounter-option"; +import MysteryEncounterOption, { EncounterOptionMode, MysteryEncounterOptionBuilder, OptionPhaseCallback } from "./mystery-encounter-option"; import { EncounterPokemonRequirement, EncounterSceneRequirement, @@ -136,7 +136,7 @@ export default class IMysteryEncounter implements IMysteryEncounter { Object.assign(this, encounter); } this.encounterTier = this.encounterTier ? this.encounterTier : MysteryEncounterTier.COMMON; - this.dialogue = {}; + this.dialogue = this.dialogue ?? {}; this.encounterVariant = MysteryEncounterVariant.DEFAULT; this.requirements = this.requirements ? this.requirements : []; this.hideBattleIntroMessage = !isNullOrUndefined(this.hideBattleIntroMessage) ? this.hideBattleIntroMessage : false; @@ -397,7 +397,7 @@ export class MysteryEncounterBuilder implements Partial { * @returns */ withSimpleOption(dialogue: OptionTextDisplay, callback: OptionPhaseCallback) { - return this.withOption(new MysteryEncounterOptionBuilder().withDialogue(dialogue).withOptionPhase(callback).build()); + return this.withOption(new MysteryEncounterOptionBuilder().withOptionMode(EncounterOptionMode.DEFAULT).withDialogue(dialogue).withOptionPhase(callback).build()); } /** diff --git a/src/ui/mystery-encounter-ui-handler.ts b/src/ui/mystery-encounter-ui-handler.ts index 9eccfd5d0e8..2d35e98c772 100644 --- a/src/ui/mystery-encounter-ui-handler.ts +++ b/src/ui/mystery-encounter-ui-handler.ts @@ -6,7 +6,7 @@ import { Button } from "#enums/buttons"; import { addWindow, WindowVariant } from "./ui-theme"; import { MysteryEncounterPhase } from "../phases/mystery-encounter-phase"; import { PartyUiMode } from "./party-ui-handler"; -import MysteryEncounterOption from "../data/mystery-encounters/mystery-encounter-option"; +import MysteryEncounterOption, { EncounterOptionMode } from "../data/mystery-encounters/mystery-encounter-option"; import * as Utils from "../utils"; import { isNullOrUndefined } from "../utils"; import { getPokeballAtlasKey } from "../data/pokeball"; @@ -100,6 +100,7 @@ export default class MysteryEncounterUiHandler extends UiHandler { if (button === Button.CANCEL || button === Button.ACTION) { if (button === Button.ACTION) { + const selected = this.filteredEncounterOptions[cursor]; if (cursor === this.viewPartyIndex) { // Handle view party success = true; @@ -110,10 +111,9 @@ export default class MysteryEncounterUiHandler extends UiHandler { this.unblockInput(); }, 300); }); - } else if (this.blockInput || (!this.optionsMeetsReqs[cursor] && this.filteredEncounterOptions[cursor].isDisabledOnRequirementsNotMet)) { + } else if (this.blockInput || (!this.optionsMeetsReqs[cursor] && (selected.optionMode === EncounterOptionMode.DISABLED_OR_DEFAULT || selected.optionMode === EncounterOptionMode.DISABLED_OR_SPECIAL))) { success = false; } else { - const selected = this.filteredEncounterOptions[cursor]; if ((this.scene.getCurrentPhase() as MysteryEncounterPhase).handleOptionSelect(selected, cursor)) { success = true; } else { @@ -253,7 +253,8 @@ export default class MysteryEncounterUiHandler extends UiHandler { if (this.blockInput) { this.blockInput = false; for (let i = 0; i < this.optionsContainer.length - 1; i++) { - if (!this.optionsMeetsReqs[i] && this.filteredEncounterOptions[i].isDisabledOnRequirementsNotMet) { + const optionMode = this.filteredEncounterOptions[i].optionMode; + if (!this.optionsMeetsReqs[i] && (optionMode === EncounterOptionMode.DISABLED_OR_DEFAULT || optionMode === EncounterOptionMode.DISABLED_OR_SPECIAL)) { continue; } (this.optionsContainer.getAt(i) as Phaser.GameObjects.Text).setAlpha(1); @@ -325,9 +326,8 @@ export default class MysteryEncounterUiHandler extends UiHandler { this.optionsMeetsReqs.push(option.meetsRequirements(this.scene)); const optionDialogue = option.dialogue; let text: string; - if (option.hasRequirements() && this.optionsMeetsReqs[i]) { + if (option.hasRequirements() && this.optionsMeetsReqs[i] && (option.optionMode === EncounterOptionMode.DEFAULT_OR_SPECIAL || option.optionMode === EncounterOptionMode.DISABLED_OR_SPECIAL)) { // Options with special requirements that are met are automatically colored green - // In cases where isDisabledOnRequirementsNotMet = false and requirements are not met, option will not be auto-colored text = getEncounterText(this.scene, optionDialogue.buttonLabel, TextStyle.SUMMARY_GREEN); } else { text = getEncounterText(this.scene, optionDialogue.buttonLabel, optionDialogue.style ? optionDialogue.style : TextStyle.WINDOW); @@ -337,7 +337,7 @@ export default class MysteryEncounterUiHandler extends UiHandler { optionText.setText(text); } - if (!this.optionsMeetsReqs[i] && option.isDisabledOnRequirementsNotMet) { + if (!this.optionsMeetsReqs[i] && (option.optionMode === EncounterOptionMode.DISABLED_OR_DEFAULT || option.optionMode === EncounterOptionMode.DISABLED_OR_SPECIAL)) { optionText.setAlpha(0.5); } if (this.blockInput) { @@ -425,7 +425,7 @@ export default class MysteryEncounterUiHandler extends UiHandler { let text: string; const cursorOption = this.filteredEncounterOptions[cursor]; const optionDialogue = cursorOption.dialogue; - if (!this.optionsMeetsReqs[cursor] && cursorOption.isDisabledOnRequirementsNotMet && optionDialogue.disabledTooltip) { + if (!this.optionsMeetsReqs[cursor] && (cursorOption.optionMode === EncounterOptionMode.DISABLED_OR_DEFAULT || cursorOption.optionMode === EncounterOptionMode.DISABLED_OR_SPECIAL) && optionDialogue.disabledTooltip) { text = getEncounterText(this.scene, optionDialogue.disabledTooltip, TextStyle.TOOLTIP_CONTENT); } else { text = getEncounterText(this.scene, optionDialogue.buttonTooltip, TextStyle.TOOLTIP_CONTENT); From 14ec528fea3c85dc9171ce1a76f54600b516952c Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Fri, 12 Jul 2024 13:29:47 -0400 Subject: [PATCH 081/270] remove extra space --- .../mystery-encounters/encounters/fight-or-flight-encounter.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 a742282a73f..7a96e3f89aa 100644 --- a/src/data/mystery-encounters/encounters/fight-or-flight-encounter.ts +++ b/src/data/mystery-encounters/encounters/fight-or-flight-encounter.ts @@ -8,7 +8,7 @@ import { setEncounterRewards, showEncounterText, } from "#app/data/mystery-encounters/mystery-encounter-utils"; -import { STEALING_MOVES } from "#app/data/mystery-encounters/requirements/requirement-groups"; +import { STEALING_MOVES } from "#app/data/mystery-encounters/requirements/requirement-groups"; import Pokemon from "#app/field/pokemon"; import { ModifierTier } from "#app/modifier/modifier-tier"; import { From bf72985c1987fb7b22da3e25c9afa907d528ff55 Mon Sep 17 00:00:00 2001 From: ImperialSympathizer <110984302+ben-lear@users.noreply.github.com> Date: Fri, 12 Jul 2024 13:37:59 -0400 Subject: [PATCH 082/270] Update src/data/mystery-encounters/mystery-encounter-option.ts Co-authored-by: flx-sta <50131232+flx-sta@users.noreply.github.com> --- src/data/mystery-encounters/mystery-encounter-option.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/mystery-encounters/mystery-encounter-option.ts b/src/data/mystery-encounters/mystery-encounter-option.ts index 05a717c3e85..7a65d77488e 100644 --- a/src/data/mystery-encounters/mystery-encounter-option.ts +++ b/src/data/mystery-encounters/mystery-encounter-option.ts @@ -150,7 +150,7 @@ export class MysteryEncounterOptionBuilder implements Partial { - return Object.assign(this, { optionMode: optionMode }); + return Object.assign(this, { optionMode }); } withSceneRequirement(requirement: EncounterSceneRequirement): this & Required> { From 58d533fb348170fb83c2ff1850c0dd67ac682f69 Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Fri, 12 Jul 2024 11:17:01 -0700 Subject: [PATCH 083/270] migrate lost at sea encounter to new dialogue pattern --- .../dialogue/lost-at-sea-dialogue.ts | 45 -------- .../encounters/lost-at-sea-encounter.ts | 103 +++++++++++++----- 2 files changed, 75 insertions(+), 73 deletions(-) delete mode 100644 src/data/mystery-encounters/dialogue/lost-at-sea-dialogue.ts diff --git a/src/data/mystery-encounters/dialogue/lost-at-sea-dialogue.ts b/src/data/mystery-encounters/dialogue/lost-at-sea-dialogue.ts deleted file mode 100644 index 3e0e69c1a97..00000000000 --- a/src/data/mystery-encounters/dialogue/lost-at-sea-dialogue.ts +++ /dev/null @@ -1,45 +0,0 @@ -import MysteryEncounterDialogue from "#app/data/mystery-encounters/mystery-encounter-dialogue"; - -const namepsace = "mysteryEncounter:lostAtSea"; - -export const LostAtSeaDialogue: MysteryEncounterDialogue = { - intro: [ - { - text: `${namepsace}:intro`, - }, - ], - encounterOptionsDialogue: { - title: `${namepsace}:title`, - description: `${namepsace}:description`, - query: `${namepsace}:query`, - options: [ - { - buttonLabel: `${namepsace}:option:1:label`, - buttonTooltip: `${namepsace}:option:1:tooltip`, - selected: [ - { - text: `${namepsace}:option:1:selected`, - }, - ], - }, - { - buttonLabel: `${namepsace}:option:2:label`, - buttonTooltip: `${namepsace}:option:2:tooltip`, - selected: [ - { - text: `${namepsace}:option:2:selected`, - }, - ], - }, - { - buttonLabel: `${namepsace}:option:3:label`, - buttonTooltip: `${namepsace}:option:3:tooltip`, - selected: [ - { - text: `${namepsace}:option:3:selected`, - }, - ], - }, - ], - }, -}; 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 fb902bb9958..b4525176cf1 100644 --- a/src/data/mystery-encounters/encounters/lost-at-sea-encounter.ts +++ b/src/data/mystery-encounters/encounters/lost-at-sea-encounter.ts @@ -7,7 +7,10 @@ import MysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier, } from "../mystery-encounter"; -import { MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; +import { + EncounterOptionMode, + MysteryEncounterOptionBuilder, +} from "../mystery-encounter-option"; import { applyDamageToPokemon, leaveEncounterWithoutBattle, @@ -20,6 +23,8 @@ import { * The higher the more damage taken (100% = instant KO). */ const DAMAGE_PERCENTAGE: number = 30; // 0 - 100 +/** The i18n namespace for the encounter */ +const namepsace = "mysteryEncounter:lostAtSea"; let waterPkm: PlayerPokemon; let flyingPkm: PlayerPokemon; @@ -32,6 +37,7 @@ let flyingPkm: PlayerPokemon; export const LostAtSeaEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.LOST_AT_SEA) .withEncounterTier(MysteryEncounterTier.COMMON) + .withSceneWaveRangeRequirement(11, 179) .withIntroSpriteConfigs([ { fileRoot: "pokemon", @@ -44,7 +50,11 @@ export const LostAtSeaEncounter: MysteryEncounter = alpha: 0.25, }, ]) - .withSceneWaveRangeRequirement(11, 179) + .withIntroDialogue([ + { + text: `${namepsace}:intro`, + }, + ]) .withOnInit((scene: BattleScene) => { const allowedPokemon = scene .getParty() @@ -69,46 +79,80 @@ export const LostAtSeaEncounter: MysteryEncounter = return true; }) - /** - * Option 1: Use a (non fainted) water pokemon to guide you back. - * Receives EXP similar to defeating a Lapras - */ + .withTitle(`${namepsace}:title`) + .withDescription(`${namepsace}:description`) + .withQuery(`${namepsace}:query`) .withOption( + /** + * Option 1: Use a (non fainted) water pokemon to guide you back. + * Receives EXP similar to defeating a Lapras + */ new MysteryEncounterOptionBuilder() .withPokemonTypeRequirement(Type.WATER, true, 1) + .withOptionMode(EncounterOptionMode.DISABLED_OR_DEFAULT) + .withDialogue({ + buttonLabel: `${namepsace}:option:1:label`, + buttonTooltip: `${namepsace}:option:1:tooltip`, + selected: [ + { + text: `${namepsace}:option:1:selected`, + }, + ], + }) .withOptionPhase(async (scene: BattleScene) => - handleGuidingOption(scene, waterPkm) + handleGuidingOptionPhase(scene, waterPkm) ) .build() ) - /** - * Option 2: Use a (non fainted) flying pokemon to guide you back. - * Receives EXP similar to defeating a Lapras - */ .withOption( + /** + * Option 2: Use a (non fainted) flying pokemon to guide you back. + * Receives EXP similar to defeating a Lapras + */ new MysteryEncounterOptionBuilder() .withPokemonTypeRequirement(Type.FLYING, true, 1) + .withOptionMode(EncounterOptionMode.DISABLED_OR_DEFAULT) + .withDialogue({ + buttonLabel: `${namepsace}:option:2:label`, + buttonTooltip: `${namepsace}:option:2:tooltip`, + selected: [ + { + text: `${namepsace}:option:2:selected`, + }, + ], + }) .withOptionPhase(async (scene: BattleScene) => - handleGuidingOption(scene, flyingPkm) + handleGuidingOptionPhase(scene, flyingPkm) ) .build() ) - /** - * Option 3: Wander aimlessly. All pokemons lose 30% of their HP (or KO on 0 HP). - */ - .withOptionPhase(async (scene: BattleScene) => { - const allowedPokemon = scene - .getParty() - .filter((p) => p.isAllowedInBattle()); + .withSimpleOption( + /** + * Option 3: Wander aimlessly. All pokemons lose {@linkcode DAMAGE_PERCENTAGE}}% of their HP (or KO on 0 HP). + */ + { + buttonLabel: `${namepsace}:option:3:label`, + buttonTooltip: `${namepsace}:option:3:tooltip`, + selected: [ + { + text: `${namepsace}:option:3:selected`, + }, + ], + }, + async (scene: BattleScene) => { + const allowedPokemon = scene + .getParty() + .filter((p) => p.isAllowedInBattle()); - allowedPokemon.forEach((pkm) => { - const percentage = DAMAGE_PERCENTAGE / 100; - const damage = Math.floor(pkm.getMaxHp() * percentage); - return applyDamageToPokemon(pkm, damage); - }); - leaveEncounterWithoutBattle(scene); - return true; - }) + allowedPokemon.forEach((pkm) => { + const percentage = DAMAGE_PERCENTAGE / 100; + const damage = Math.floor(pkm.getMaxHp() * percentage); + return applyDamageToPokemon(pkm, damage); + }); + leaveEncounterWithoutBattle(scene); + return true; + } + ) .build(); /** @@ -128,7 +172,10 @@ function findPokemonByType(party: PlayerPokemon[], type: Type) { * @param scene Battle scene * @param guidePokemon pokemon choosen as a guide */ -function handleGuidingOption(scene: BattleScene, guidePokemon: PlayerPokemon) { +function handleGuidingOptionPhase( + scene: BattleScene, + guidePokemon: PlayerPokemon +) { /** Base EXP value for guiding pokemon. Currently Lapras base-value */ const baseExpValue: number = 187; From 28d14ae45acd8aa2245be1e159760d9227553d2a Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Fri, 12 Jul 2024 11:37:58 -0700 Subject: [PATCH 084/270] minor refactor of abstract `EncounterPokemonRequirement` --- .../mystery-encounter-requirements.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/data/mystery-encounters/mystery-encounter-requirements.ts b/src/data/mystery-encounters/mystery-encounter-requirements.ts index f31b37118ee..c00a31fa872 100644 --- a/src/data/mystery-encounters/mystery-encounter-requirements.ts +++ b/src/data/mystery-encounters/mystery-encounter-requirements.ts @@ -31,12 +31,10 @@ export abstract class EncounterSceneRequirement implements EncounterRequirement } export abstract class EncounterPokemonRequirement implements EncounterRequirement { - minNumberOfPokemon: number; - invertQuery: boolean; + protected minNumberOfPokemon: number; + protected invertQuery: boolean; - meetsRequirement(scene: BattleScene): boolean { - throw new Error("Method not implemented."); - } + abstract meetsRequirement(scene: BattleScene): boolean; // Returns all party members that are compatible with this requirement. For non pokemon related requirements, the entire party is returned.. queryParty(partyPokemon: PlayerPokemon[]): PlayerPokemon[] { @@ -954,3 +952,5 @@ export class WeightRequirement extends EncounterPokemonRequirement { return ["weight", pokemon.getWeight().toString()]; } } + + From 60c26456f66f2cd1436d75112275f882638c89d2 Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Fri, 12 Jul 2024 15:40:30 -0400 Subject: [PATCH 085/270] move dialogue token injection to i18next --- .../encounters/training-session-encounter.ts | 8 +-- .../mystery-encounter-dialogue.ts | 18 +++---- .../mystery-encounter-requirements.ts | 7 +-- .../mystery-encounter-utils.ts | 30 +++++------ .../mystery-encounters/mystery-encounter.ts | 14 ++--- src/locales/en/mystery-encounter.ts | 52 +++++++++---------- src/phases/mystery-encounter-phase.ts | 2 +- .../mystery-encounter-utils.test.ts | 10 ++-- src/test/utils/phaseInterceptor.ts | 5 +- 9 files changed, 71 insertions(+), 75 deletions(-) diff --git a/src/data/mystery-encounters/encounters/training-session-encounter.ts b/src/data/mystery-encounters/encounters/training-session-encounter.ts index da76d8a2d64..062e8599823 100644 --- a/src/data/mystery-encounters/encounters/training-session-encounter.ts +++ b/src/data/mystery-encounters/encounters/training-session-encounter.ts @@ -162,11 +162,7 @@ export const TrainingSessionEncounter: IMysteryEncounter = scene.addModifier(mod, true, false, false, true); } scene.updateModifiers(true); - scene.queueMessage( - getEncounterText(scene, `${namespace}_battle_finished_1`), - null, - true - ); + scene.queueMessage(getEncounterText(scene, `${namespace}_battle_finished_1`), null, true); }; setEncounterRewards( @@ -338,7 +334,7 @@ export const TrainingSessionEncounter: IMysteryEncounter = const onBeforeRewardsPhase = () => { scene.queueMessage( - getEncounterText(scene, `${namespace}_battle_finished_3`), + getEncounterText(scene, [`${namespace}_battle_finished_3`]), null, true ); diff --git a/src/data/mystery-encounters/mystery-encounter-dialogue.ts b/src/data/mystery-encounters/mystery-encounter-dialogue.ts index d96aeb87ba6..3832aaa7cd3 100644 --- a/src/data/mystery-encounters/mystery-encounter-dialogue.ts +++ b/src/data/mystery-encounters/mystery-encounter-dialogue.ts @@ -1,24 +1,24 @@ import { TextStyle } from "#app/ui/text"; export class TextDisplay { - speaker?: TemplateStringsArray | `mysteryEncounter:${string}`; - text: TemplateStringsArray | `mysteryEncounter:${string}`; + speaker?: string; + text: string; style?: TextStyle; } export class OptionTextDisplay { - buttonLabel: TemplateStringsArray | `mysteryEncounter:${string}`; - buttonTooltip?: TemplateStringsArray | `mysteryEncounter:${string}`; - disabledTooltip?: TemplateStringsArray | `mysteryEncounter:${string}`; - secondOptionPrompt?: TemplateStringsArray | `mysteryEncounter:${string}`; + buttonLabel: string; + buttonTooltip?: string; + disabledTooltip?: string; + secondOptionPrompt?: string; selected?: TextDisplay[]; style?: TextStyle; } export class EncounterOptionsDialogue { - title?: TemplateStringsArray | `mysteryEncounter:${string}`; - description?: TemplateStringsArray | `mysteryEncounter:${string}`; - query?: TemplateStringsArray | `mysteryEncounter:${string}`; + title?: string; + description?: string; + query?: string; options?: [...OptionTextDisplay[]]; // Options array with minimum 2 options } diff --git a/src/data/mystery-encounters/mystery-encounter-requirements.ts b/src/data/mystery-encounters/mystery-encounter-requirements.ts index 8781e5a4cdc..a6de641478c 100644 --- a/src/data/mystery-encounters/mystery-encounter-requirements.ts +++ b/src/data/mystery-encounters/mystery-encounter-requirements.ts @@ -38,13 +38,14 @@ export abstract class EncounterPokemonRequirement implements EncounterRequiremen throw new Error("Method not implemented."); } - // Returns all party members that are compatible with this requirement. For non pokemon related requirements, the entire party is returned.. + /** + * Returns all party members that are compatible with this requirement. For non pokemon related requirements, the entire party is returned. + * @param partyPokemon + */ queryParty(partyPokemon: PlayerPokemon[]): PlayerPokemon[] { return []; } - // Doesn't require the "@ec" as prefix, just the string; populates the token with the attribute - // ex. @ec{primarySpecies} if strPrefix is simply "primary" getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] { return ["", ""]; } diff --git a/src/data/mystery-encounters/mystery-encounter-utils.ts b/src/data/mystery-encounters/mystery-encounter-utils.ts index d2e1a5eba2f..20022bdca30 100644 --- a/src/data/mystery-encounters/mystery-encounter-utils.ts +++ b/src/data/mystery-encounters/mystery-encounter-utils.ts @@ -158,12 +158,14 @@ export function koPlayerPokemon(pokemon: PlayerPokemon) { pokemon.updateInfo(); } -export function getEncounterText(scene: BattleScene, textKey: TemplateStringsArray | `mysteryEncounter:${string}`, primaryStyle?: TextStyle, uiTheme: UiTheme = UiTheme.DEFAULT): string { +export function getEncounterText(scene: BattleScene, textKey: string, primaryStyle?: TextStyle, uiTheme: UiTheme = UiTheme.DEFAULT): string { if (isNullOrUndefined(textKey)) { return null; } - let textString: string = getTextWithDialogueTokens(scene, textKey); + const stringArray = [`${textKey}`] as any; + stringArray.raw = [`${textKey}`]; + let textString: string = getTextWithDialogueTokens(scene, stringArray); // Can only color the text if a Primary Style is defined // primaryStyle is applied to all text that does not have its own specified style @@ -174,22 +176,20 @@ export function getEncounterText(scene: BattleScene, textKey: TemplateStringsArr return textString; } -function getTextWithDialogueTokens(scene: BattleScene, textKey: TemplateStringsArray | `mysteryEncounter:${string}`): string { +function getTextWithDialogueTokens(scene: BattleScene, textKey: TemplateStringsArray): string { if (isNullOrUndefined(textKey)) { return null; } - let textString: string = i18next.t(textKey); - // Apply dialogue tokens - const dialogueTokens = scene.currentBattle?.mysteryEncounter?.dialogueTokens; - if (dialogueTokens) { - dialogueTokens.forEach((value) => { - textString = textString.replace(value[0], value[1]); - }); - } + // const dialogueTokens = scene.currentBattle?.mysteryEncounter?.dialogueTokens; + // if (dialogueTokens) { + // dialogueTokens.forEach((value) => { + // textString = textString.replace(value[0], value[1]); + // }); + // } - return textString; + return i18next.t(textKey, scene.currentBattle?.mysteryEncounter?.dialogueTokens); } /** @@ -197,7 +197,7 @@ function getTextWithDialogueTokens(scene: BattleScene, textKey: TemplateStringsA * @param scene * @param contentKey */ -export function queueEncounterMessage(scene: BattleScene, contentKey: TemplateStringsArray | `mysteryEncounter:${string}`): void { +export function queueEncounterMessage(scene: BattleScene, contentKey: string): void { const text: string = getEncounterText(scene, contentKey); scene.queueMessage(text, null, true); } @@ -207,7 +207,7 @@ export function queueEncounterMessage(scene: BattleScene, contentKey: TemplateSt * @param scene * @param contentKey */ -export function showEncounterText(scene: BattleScene, contentKey: TemplateStringsArray | `mysteryEncounter:${string}`): Promise { +export function showEncounterText(scene: BattleScene, contentKey: string): Promise { return new Promise(resolve => { const text: string = getEncounterText(scene, contentKey); scene.ui.showText(text, null, () => resolve(), 0, true); @@ -221,7 +221,7 @@ export function showEncounterText(scene: BattleScene, contentKey: TemplateString * @param speakerContentKey * @param callback */ -export function showEncounterDialogue(scene: BattleScene, textContentKey: TemplateStringsArray | `mysteryEncounter:${string}`, speakerContentKey: TemplateStringsArray | `mysteryEncounter:${string}`, callback?: Function) { +export function showEncounterDialogue(scene: BattleScene, textContentKey: string, speakerContentKey: string, callback?: Function) { const text: string = getEncounterText(scene, textContentKey); const speaker: string = getEncounterText(scene, speakerContentKey); scene.ui.showDialogue(text, speaker, null, callback, 0, 0); diff --git a/src/data/mystery-encounters/mystery-encounter.ts b/src/data/mystery-encounters/mystery-encounter.ts index 6fee6e493cf..b54d0f17665 100644 --- a/src/data/mystery-encounters/mystery-encounter.ts +++ b/src/data/mystery-encounters/mystery-encounter.ts @@ -95,7 +95,7 @@ export default interface IMysteryEncounter { * Can be set for uses programatic dialogue during an encounter (storing the name of one of the party's pokemon, etc.) * Example use: see MYSTERIOUS_CHEST */ - dialogueTokens?: Map; + dialogueTokens?: { [key: string]: string; }; /** * Should be set depending upon option selected as part of an encounter * For example, if there is no battle as part of the encounter/selected option, should be set to NO_BATTLE @@ -144,7 +144,7 @@ export default class IMysteryEncounter implements IMysteryEncounter { // Reset any dirty flags or encounter data this.lockEncounterRewardTiers = true; - this.dialogueTokens = new Map; + this.dialogueTokens = {}; this.enemyPartyConfigs = []; this.introVisuals = null; this.misc = null; @@ -331,7 +331,7 @@ export default class IMysteryEncounter implements IMysteryEncounter { } setDialogueToken?(key: string, value: string) { - this.dialogueTokens.set(key, [new RegExp("@ec\{" + key + "\\}", "gi"), value]); + this.dialogueTokens[key] = value; } private capitalizeFirstLetter?(str: string) { @@ -350,7 +350,7 @@ export class MysteryEncounterBuilder implements Partial { primaryPokemonRequirements?: EncounterPokemonRequirement[] = []; secondaryPokemonRequirements ?: EncounterPokemonRequirement[] = []; excludePrimaryFromSupportRequirements?: boolean; - dialogueTokens?: Map; + dialogueTokens?: { [key: string]: string; }; doEncounterExp?: (scene: BattleScene) => boolean; doEncounterRewards?: (scene: BattleScene) => boolean; onInit?: (scene: BattleScene) => boolean; @@ -601,7 +601,7 @@ export class MysteryEncounterBuilder implements Partial { * @param title - title of the encounter * @returns */ - withTitle(title: TemplateStringsArray | `mysteryEncounter:${string}`) { + withTitle(title: string) { const encounterOptionsDialogue = this.dialogue.encounterOptionsDialogue ?? {}; this.dialogue = { @@ -621,7 +621,7 @@ export class MysteryEncounterBuilder implements Partial { * @param description - description of the encounter * @returns */ - withDescription(description: TemplateStringsArray | `mysteryEncounter:${string}`) { + withDescription(description: string) { const encounterOptionsDialogue = this.dialogue.encounterOptionsDialogue ?? {}; this.dialogue = { @@ -641,7 +641,7 @@ export class MysteryEncounterBuilder implements Partial { * @param query - query to use for the encounter * @returns */ - withQuery(query: TemplateStringsArray | `mysteryEncounter:${string}`) { + withQuery(query: string) { const encounterOptionsDialogue = this.dialogue.encounterOptionsDialogue ?? {}; this.dialogue = { diff --git a/src/locales/en/mystery-encounter.ts b/src/locales/en/mystery-encounter.ts index f944615452a..55791ae3654 100644 --- a/src/locales/en/mystery-encounter.ts +++ b/src/locales/en/mystery-encounter.ts @@ -5,7 +5,7 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; * '$' will be treated as a new line for Message and Dialogue strings * '@d{}' will add a time delay to text animation for Message and Dialogue strings * - * '@ec{}' will auto-inject the matching token value for the specified Encounter + * '{{}}' will auto-inject the matching token value for the specified Encounter that is stored in dialogueTokens * * '@[]{}' will auto-color the given text to a specified TextStyle (e.g. TextStyle.SUMMARY_GREEN) * @@ -14,7 +14,7 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; */ export const mysteryEncounter: SimpleTranslationEntries = { // DO NOT REMOVE - "unit_test_dialogue": "@ec{test}@ec{test} @ec{test@ec{test}} @ec{test1} @ec{test\} @ec{test\\} @ec{test\\\} {test}", + "unit_test_dialogue": "{{test}}{{test}} {{test{{test}}}} {{test1}} {{test\}} {{test\\}} {{test\\\}} {test}}", // Mystery Encounters -- Common Tier @@ -33,7 +33,7 @@ export const mysteryEncounter: SimpleTranslationEntries = { "mysterious_chest_option_1_great_result": "A couple great tools and items!", "mysterious_chest_option_1_amazing_result": "Whoa! An amazing item!", "mysterious_chest_option_1_bad_result": `Oh no!@d{32}\nThe chest was trapped! - $Your @ec{pokeName} jumps in front of you\nbut is KOed in the process.`, + $Your {{pokeName}} jumps in front of you\nbut is KOed in the process.`, "fight_or_flight_intro_message": "Something shiny is sparkling\non the ground near that Pokémon!", "fight_or_flight_title": "Fight or Flight", @@ -43,18 +43,18 @@ export const mysteryEncounter: SimpleTranslationEntries = { "fight_or_flight_option_1_tooltip": "(-) Hard Battle\n(+) New Item", "fight_or_flight_option_2_label": "Steal the item", "fight_or_flight_option_2_tooltip": "@[SUMMARY_GREEN]{(35%) Steal Item}\n@[SUMMARY_BLUE]{(65%) Harder Battle}", - "fight_or_flight_option_2_steal_tooltip": "(+) @ec{option2PrimaryName} uses @ec{option2PrimaryMove}", + "fight_or_flight_option_2_steal_tooltip": "(+) {{option2PrimaryName}} uses {{option2PrimaryMove}}", "fight_or_flight_option_3_label": "Leave", "fight_or_flight_option_3_tooltip": "(-) No Rewards", "fight_or_flight_option_1_selected_message": "You approach the\nPokémon without fear.", "fight_or_flight_option_2_good_result": `.@d{32}.@d{32}.@d{32} $You manage to sneak your way\npast and grab the item!`, "fight_or_flight_option_2_steal_result": `.@d{32}.@d{32}.@d{32} - $Your @ec{option2PrimaryName} helps you out and uses @ec{option2PrimaryMove}! + $Your {{option2PrimaryName}} helps you out and uses {{option2PrimaryMove}}! $ You nabbed the item!`, "fight_or_flight_option_2_bad_result": `.@d{32}.@d{32}.@d{32} $The Pokémon catches you\nas you try to sneak around!`, - "fight_or_flight_boss_enraged": "The opposing @ec{enemyPokemon} has become enraged!", + "fight_or_flight_boss_enraged": "The opposing {{enemyPokemon}} has become enraged!", "fight_or_flight_option_3_selected": "You leave the strong Pokémon\nwith its prize and continue on.", "department_store_sale_intro_message": "It's a lady with a ton of shopping bags.", @@ -85,17 +85,17 @@ export const mysteryEncounter: SimpleTranslationEntries = { "shady_vitamin_dealer_query": "Which deal will choose?", "shady_vitamin_dealer_invalid_selection": "Pokémon must be healthy enough.", "shady_vitamin_dealer_option_1_label": "The Cheap Deal", - "shady_vitamin_dealer_option_1_tooltip": "(-) Pay @ec{option1Money}\n(-) Side Effects?\n(+) Chosen Pokémon Gains 2 Random Vitamins", + "shady_vitamin_dealer_option_1_tooltip": "(-) Pay {{option1Money}}\n(-) Side Effects?\n(+) Chosen Pokémon Gains 2 Random Vitamins", "shady_vitamin_dealer_option_2_label": "The Pricey Deal", - "shady_vitamin_dealer_option_2_tooltip": "(-) Pay @ec{option2Money}\n(-) Side Effects?\n(+) Chosen Pokémon Gains 2 Random Vitamins", + "shady_vitamin_dealer_option_2_tooltip": "(-) Pay {{option2Money}}\n(-) Side Effects?\n(+) Chosen Pokémon Gains 2 Random Vitamins", "shady_vitamin_dealer_option_selected": `The man hands you two bottles and quickly disappears. - $@ec{selectedPokemon} gained @ec{boost1} and @ec{boost2} boosts!`, + \${{selectedPokemon}} gained {{boost1}} and {{boost2}} boosts!`, "shady_vitamin_dealer_damage_only": `But the medicine had some side effects! - $Your @ec{selectedPokemon} takes some damage...`, + $Your {{selectedPokemon}} takes some damage...`, "shady_vitamin_dealer_bad_poison": `But the medicine had some side effects! - $Your @ec{selectedPokemon} takes some damage\nand becomes badly poisoned...`, + $Your {{selectedPokemon}} takes some damage\nand becomes badly poisoned...`, "shady_vitamin_dealer_poison": `But the medicine had some side effects! - $Your @ec{selectedPokemon} becomes poisoned...`, + $Your {{selectedPokemon}} becomes poisoned...`, "shady_vitamin_dealer_no_bad_effects": "Looks like there were no side-effects this time.", "shady_vitamin_dealer_option_3_label": "Leave", "shady_vitamin_dealer_option_3_tooltip": "(-) No Rewards", @@ -115,9 +115,9 @@ export const mysteryEncounter: SimpleTranslationEntries = { "field_trip_option_3_label": "A Status Move", "field_trip_option_3_tooltip": "(+) Status Item Rewards", "field_trip_second_option_prompt": "Choose a move for your Pokémon to use.", - "field_trip_option_selected": "@ec{pokeName} shows off an awesome display of @ec{move}!", + "field_trip_option_selected": "{{pokeName}} shows off an awesome display of {{move}}!", "field_trip_option_incorrect": `... - $That isn't a @ec{moveCategory} move! + $That isn't a {{moveCategory}} move! $I'm sorry, but I can't give you anything.`, "field_trip_lesson_learned": `Looks like you learned a valuable lesson? $Your Pokémon also gained some knowledge.`, @@ -153,13 +153,13 @@ export const mysteryEncounter: SimpleTranslationEntries = { "training_session_option_3_label": "Heavy Training", "training_session_option_3_tooltip": "(-) Harsh Battle\n(+) Change Pokémon's Ability", "training_session_option_3_select_prompt": "Select a new ability\nto train your Pokémon in.", - "training_session_option_selected_message": "@ec{selectedPokemon} moves across\nthe clearing to face you...", - "training_session_battle_finished_1": `@ec{selectedPokemon} returns, feeling\nworn out but accomplished! - $Its @ec{stat1} and @ec{stat2} IVs were improved!`, - "training_session_battle_finished_2": `@ec{selectedPokemon} returns, feeling\nworn out but accomplished! - $Its nature was changed to @ec{nature}!`, - "training_session_battle_finished_3": `@ec{selectedPokemon} returns, feeling\nworn out but accomplished! - $Its ability was changed to @ec{ability}!`, + "training_session_option_selected_message": "{{selectedPokemon}} moves across\nthe clearing to face you...", + "training_session_battle_finished_1": `{{selectedPokemon}} returns, feeling\nworn out but accomplished! + $Its {{stat1}} and {{stat2}} IVs were improved!`, + "training_session_battle_finished_2": `{{selectedPokemon}} returns, feeling\nworn out but accomplished! + $Its nature was changed to {{nature}}!`, + "training_session_battle_finished_3": `{{selectedPokemon}} returns, feeling\nworn out but accomplished! + $Its ability was changed to {{ability}}!`, "training_session_outro_win": "That was a successful training session!", // Mystery Encounters -- Super Rare Tier @@ -177,10 +177,10 @@ export const mysteryEncounter: SimpleTranslationEntries = { "dark_deal_option_1_tooltip": "(+) 5 Rogue Balls\n(?) Enhance a Random Pokémon", "dark_deal_option_2_label": "Refuse", "dark_deal_option_2_tooltip": "(-) No Rewards", - "dark_deal_option_1_selected": `Let's see, that @ec{pokeName} will do nicely! + "dark_deal_option_1_selected": `Let's see, that {{pokeName}} will do nicely! $Remember, I'm not responsible\nif anything bad happens!@d{32} Hehe...`, "dark_deal_option_1_selected_message": `The man hands you 5 Rogue Balls. - $@ec{pokeName} hops into the strange machine... + \${{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!`, "dark_deal_option_2_selected": "Not gonna help a poor fellow out?\nPah!", @@ -196,15 +196,15 @@ export const mysteryEncounter: SimpleTranslationEntries = { "sleeping_snorlax_option_2_label": "Wait for it to move", "sleeping_snorlax_option_2_tooltip": "@[SUMMARY_BLUE]{(75%) Wait a short time}\n@[SUMMARY_BLUE]{(25%) Wait a long time}", "sleeping_snorlax_option_3_label": "Steal its item", - "sleeping_snorlax_option_3_tooltip": "(+) @ec{option3PrimaryName} uses @ec{option3PrimaryMove}\n(+) Leftovers", + "sleeping_snorlax_option_3_tooltip": "(+) {{option3PrimaryName}} uses {{option3PrimaryMove}}\n(+) Leftovers", "sleeping_snorlax_option_3_disabled_tooltip": "Your Pokémon need to know certain moves to choose this", "sleeping_snorlax_option_1_selected_message": "You approach the\nPokémon without fear.", "sleeping_snorlax_option_2_selected_message": `.@d{32}.@d{32}.@d{32} $You wait for a time, but the Snorlax's yawns make your party sleepy.`, "sleeping_snorlax_option_2_good_result": "When you all awaken, the Snorlax is no where to be found - but your Pokémon are all healed!", - "sleeping_snorlax_option_2_bad_result": `Your @ec{primaryName} is still asleep... + "sleeping_snorlax_option_2_bad_result": `Your {{primaryName}} is still asleep... $But on the bright side, the Snorlax left something behind... $@s{item_fanfare}You gained a Berry!`, - "sleeping_snorlax_option_3_good_result": "Your @ec{option3PrimaryName} uses @ec{option3PrimaryMove}! @s{item_fanfare}It steals Leftovers off the sleeping Snorlax and you make out like bandits!", + "sleeping_snorlax_option_3_good_result": "Your {{option3PrimaryName}} uses {{option3PrimaryMove}}! @s{item_fanfare}It steals Leftovers off the sleeping Snorlax and you make out like bandits!", } as const; diff --git a/src/phases/mystery-encounter-phase.ts b/src/phases/mystery-encounter-phase.ts index 3db7816387a..638f2c0b15d 100644 --- a/src/phases/mystery-encounter-phase.ts +++ b/src/phases/mystery-encounter-phase.ts @@ -78,7 +78,7 @@ export class MysteryEncounterPhase extends Phase { this.end(); }; - const optionSelectDialogue = this.scene.currentBattle?.mysteryEncounter?.dialogue?.encounterOptionsDialogue?.options?.[optionIndex]; + const optionSelectDialogue = this.scene.currentBattle?.mysteryEncounter?.options?.[optionIndex]?.dialogue; if (optionSelectDialogue?.selected?.length > 0) { // Handle intermediate dialogue (between player selection event and the onOptionSelect logic) this.scene.ui.setMode(Mode.MESSAGE); diff --git a/src/test/mystery-encounter/mystery-encounter-utils.test.ts b/src/test/mystery-encounter/mystery-encounter-utils.test.ts index 50853c05a2e..31f930319bf 100644 --- a/src/test/mystery-encounter/mystery-encounter-utils.test.ts +++ b/src/test/mystery-encounter/mystery-encounter-utils.test.ts @@ -277,7 +277,7 @@ describe("Mystery Encounter Utils", () => { scene.currentBattle.mysteryEncounter.setDialogueToken("test", "value"); const result = getEncounterText(scene, "mysteryEncounter:unit_test_dialogue"); - expect(result).toEqual("valuevalue @ec{testvalue} @ec{test1} value @ec{test\\} @ec{test\\} {test}"); + expect(result).toEqual("valuevalue {{testvalue}} {{test1}} {{test}} {{test\\}} {{test\\}} {test}}"); }); it("can perform nested dialogue token injection", () => { @@ -286,7 +286,7 @@ describe("Mystery Encounter Utils", () => { scene.currentBattle.mysteryEncounter.setDialogueToken("testvalue", "new"); const result = getEncounterText(scene, "mysteryEncounter:unit_test_dialogue"); - expect(result).toEqual("valuevalue new @ec{test1} value @ec{test\\} @ec{test\\} {test}"); + expect(result).toEqual("valuevalue {{testvalue}} {{test1}} {{test}} {{test\\}} {{test\\}} {test}}"); }); }); @@ -298,7 +298,7 @@ describe("Mystery Encounter Utils", () => { const phaseSpy = vi.spyOn(game.scene, "unshiftPhase"); queueEncounterMessage(scene, "mysteryEncounter:unit_test_dialogue"); - expect(spy).toHaveBeenCalledWith("valuevalue @ec{testvalue} @ec{test1} value @ec{test\\} @ec{test\\} {test}", null, true); + expect(spy).toHaveBeenCalledWith("valuevalue {{testvalue}} {{test1}} {{test}} {{test\\}} {{test\\}} {test}}", null, true); expect(phaseSpy).toHaveBeenCalledWith(expect.any(MessagePhase)); }); }); @@ -310,7 +310,7 @@ describe("Mystery Encounter Utils", () => { const spy = vi.spyOn(game.scene.ui, "showText"); showEncounterText(scene, "mysteryEncounter:unit_test_dialogue"); - expect(spy).toHaveBeenCalledWith("valuevalue @ec{testvalue} @ec{test1} value @ec{test\\} @ec{test\\} {test}", null, expect.any(Function), 0, true); + expect(spy).toHaveBeenCalledWith("valuevalue {{testvalue}} {{test1}} {{test}} {{test\\}} {{test\\}} {test}}", null, expect.any(Function), 0, true); }); }); @@ -321,7 +321,7 @@ describe("Mystery Encounter Utils", () => { const spy = vi.spyOn(game.scene.ui, "showDialogue"); showEncounterDialogue(scene, "mysteryEncounter:unit_test_dialogue", "mysteryEncounter:unit_test_dialogue"); - expect(spy).toHaveBeenCalledWith("valuevalue @ec{testvalue} @ec{test1} value @ec{test\\} @ec{test\\} {test}", "valuevalue @ec{testvalue} @ec{test1} value @ec{test\\} @ec{test\\} {test}", null, undefined, 0, 0); + expect(spy).toHaveBeenCalledWith("valuevalue {{testvalue}} {{test1}} {{test}} {{test\\}} {{test\\}} {test}}", "valuevalue {{testvalue}} {{test1}} {{test}} {{test\\}} {{test\\}} {test}}", null, undefined, 0, 0); }); }); diff --git a/src/test/utils/phaseInterceptor.ts b/src/test/utils/phaseInterceptor.ts index 09e3df4dac8..cc593030b09 100644 --- a/src/test/utils/phaseInterceptor.ts +++ b/src/test/utils/phaseInterceptor.ts @@ -289,13 +289,12 @@ export default class PhaseInterceptor { * @param phase - The phase to start. */ setMode(mode: Mode, ...args: any[]): Promise { - const currentPhase = this. - scene.getCurrentPhase(); + const currentPhase = this.scene.getCurrentPhase(); const instance = this.scene.ui; console.log("setMode", mode, args); const ret = this.originalSetMode.apply(instance, [mode, ...args]); if (!this.phases[currentPhase.constructor.name]) { - throw new Error(`missing ${currentPhase.constructor.name} in phaseInterceptior PHASES list`); + throw new Error(`missing ${currentPhase.constructor.name} in phaseInterceptor PHASES list`); } if (this.phases[currentPhase.constructor.name].endBySetMode) { this.inProgress?.callback(); From 2b855e58e37420c303e2ca60f2ba1fb0bd4ad43d Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Fri, 12 Jul 2024 15:44:34 -0400 Subject: [PATCH 086/270] move dialogue token injection to i18next --- .../encounters/training-session-encounter.ts | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/data/mystery-encounters/encounters/training-session-encounter.ts b/src/data/mystery-encounters/encounters/training-session-encounter.ts index 062e8599823..6abb340469a 100644 --- a/src/data/mystery-encounters/encounters/training-session-encounter.ts +++ b/src/data/mystery-encounters/encounters/training-session-encounter.ts @@ -333,11 +333,7 @@ export const TrainingSessionEncounter: IMysteryEncounter = scene.removePokemonFromPlayerParty(playerPokemon, false); const onBeforeRewardsPhase = () => { - scene.queueMessage( - getEncounterText(scene, [`${namespace}_battle_finished_3`]), - null, - true - ); + scene.queueMessage(getEncounterText(scene, `${namespace}_battle_finished_3`), null, true); // Add the pokemon back to party with ability change const abilityIndex = encounter.misc.abilityIndex; if (!!playerPokemon.getFusionSpeciesForm()) { From b82e8674cc7251f9c7a77d20476fb2b941ef6e1b Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Fri, 12 Jul 2024 15:54:35 -0400 Subject: [PATCH 087/270] add number formatting to money strings --- src/data/mystery-encounters/mystery-encounter-requirements.ts | 3 +-- src/locales/en/mystery-encounter.ts | 4 ++-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/data/mystery-encounters/mystery-encounter-requirements.ts b/src/data/mystery-encounters/mystery-encounter-requirements.ts index a6de641478c..30e8c989ae8 100644 --- a/src/data/mystery-encounters/mystery-encounter-requirements.ts +++ b/src/data/mystery-encounters/mystery-encounter-requirements.ts @@ -240,8 +240,7 @@ export class MoneyRequirement extends EncounterSceneRequirement { getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] { const value = this?.scalingMultiplier > 0 ? scene.getWaveMoneyAmount(this.scalingMultiplier).toString() : this.requiredMoney.toString(); - // Colors money text - return ["money", "@[MONEY]{₽" + value + "}"]; + return ["money", value]; } } diff --git a/src/locales/en/mystery-encounter.ts b/src/locales/en/mystery-encounter.ts index 55791ae3654..d68848e4a37 100644 --- a/src/locales/en/mystery-encounter.ts +++ b/src/locales/en/mystery-encounter.ts @@ -85,9 +85,9 @@ export const mysteryEncounter: SimpleTranslationEntries = { "shady_vitamin_dealer_query": "Which deal will choose?", "shady_vitamin_dealer_invalid_selection": "Pokémon must be healthy enough.", "shady_vitamin_dealer_option_1_label": "The Cheap Deal", - "shady_vitamin_dealer_option_1_tooltip": "(-) Pay {{option1Money}}\n(-) Side Effects?\n(+) Chosen Pokémon Gains 2 Random Vitamins", + "shady_vitamin_dealer_option_1_tooltip": "(-) Pay @[MONEY]{₽{{option1Money, number}}}\n(-) Side Effects?\n(+) Chosen Pokémon Gains 2 Random Vitamins", "shady_vitamin_dealer_option_2_label": "The Pricey Deal", - "shady_vitamin_dealer_option_2_tooltip": "(-) Pay {{option2Money}}\n(-) Side Effects?\n(+) Chosen Pokémon Gains 2 Random Vitamins", + "shady_vitamin_dealer_option_2_tooltip": "(-) Pay @[MONEY]{₽{{option2Money, number}}}\n(-) Side Effects?\n(+) Chosen Pokémon Gains 2 Random Vitamins", "shady_vitamin_dealer_option_selected": `The man hands you two bottles and quickly disappears. \${{selectedPokemon}} gained {{boost1}} and {{boost2}} boosts!`, "shady_vitamin_dealer_damage_only": `But the medicine had some side effects! From d8fce8b245a2bd51830157d5c72677fae619c4de Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Fri, 12 Jul 2024 12:56:51 -0700 Subject: [PATCH 088/270] add `Pokemon.getEggMoves()` --- src/field/pokemon.ts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 08119931084..e32b5303dc7 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -1319,6 +1319,15 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return ret; } + /** + * Get a list of all egg moves + * + * @returns list of egg moves + */ + getEggMoves() : Moves[] { + return speciesEggMoves[this.species.speciesId]; + } + setMove(moveIndex: integer, moveId: Moves): void { const move = moveId ? new PokemonMove(moveId) : null; this.moveset[moveIndex] = move; From 39f91167c7a72ee348527a563f76b14674e45b70 Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Fri, 12 Jul 2024 15:57:12 -0400 Subject: [PATCH 089/270] PR cleanup and commit suggestions --- src/data/mystery-encounters/mystery-encounter-utils.ts | 8 -------- src/data/mystery-encounters/mystery-encounter.ts | 4 ++-- src/locales/en/mystery-encounter.ts | 1 + 3 files changed, 3 insertions(+), 10 deletions(-) diff --git a/src/data/mystery-encounters/mystery-encounter-utils.ts b/src/data/mystery-encounters/mystery-encounter-utils.ts index 20022bdca30..5c6e7eefa8d 100644 --- a/src/data/mystery-encounters/mystery-encounter-utils.ts +++ b/src/data/mystery-encounters/mystery-encounter-utils.ts @@ -181,14 +181,6 @@ function getTextWithDialogueTokens(scene: BattleScene, textKey: TemplateStringsA return null; } - // Apply dialogue tokens - // const dialogueTokens = scene.currentBattle?.mysteryEncounter?.dialogueTokens; - // if (dialogueTokens) { - // dialogueTokens.forEach((value) => { - // textString = textString.replace(value[0], value[1]); - // }); - // } - return i18next.t(textKey, scene.currentBattle?.mysteryEncounter?.dialogueTokens); } diff --git a/src/data/mystery-encounters/mystery-encounter.ts b/src/data/mystery-encounters/mystery-encounter.ts index b54d0f17665..e02639939b8 100644 --- a/src/data/mystery-encounters/mystery-encounter.ts +++ b/src/data/mystery-encounters/mystery-encounter.ts @@ -95,7 +95,7 @@ export default interface IMysteryEncounter { * Can be set for uses programatic dialogue during an encounter (storing the name of one of the party's pokemon, etc.) * Example use: see MYSTERIOUS_CHEST */ - dialogueTokens?: { [key: string]: string; }; + dialogueTokens?: Record; /** * Should be set depending upon option selected as part of an encounter * For example, if there is no battle as part of the encounter/selected option, should be set to NO_BATTLE @@ -350,7 +350,7 @@ export class MysteryEncounterBuilder implements Partial { primaryPokemonRequirements?: EncounterPokemonRequirement[] = []; secondaryPokemonRequirements ?: EncounterPokemonRequirement[] = []; excludePrimaryFromSupportRequirements?: boolean; - dialogueTokens?: { [key: string]: string; }; + dialogueTokens?: Record; doEncounterExp?: (scene: BattleScene) => boolean; doEncounterRewards?: (scene: BattleScene) => boolean; onInit?: (scene: BattleScene) => boolean; diff --git a/src/locales/en/mystery-encounter.ts b/src/locales/en/mystery-encounter.ts index d68848e4a37..9101b22d520 100644 --- a/src/locales/en/mystery-encounter.ts +++ b/src/locales/en/mystery-encounter.ts @@ -6,6 +6,7 @@ import { SimpleTranslationEntries } from "#app/interfaces/locales"; * '@d{}' will add a time delay to text animation for Message and Dialogue strings * * '{{}}' will auto-inject the matching token value for the specified Encounter that is stored in dialogueTokens + * (see [i18next interpolations](https://www.i18next.com/translation-function/interpolation)) * * '@[]{}' will auto-color the given text to a specified TextStyle (e.g. TextStyle.SUMMARY_GREEN) * From 72c76c4d39732ce5d90b1e8d3685d028fa4cfaf6 Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Fri, 12 Jul 2024 13:10:53 -0700 Subject: [PATCH 090/270] add `Pokemon.isAllowed()` to check if pokemon is allowed even if it's fainted --- src/field/pokemon.ts | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index e32b5303dc7..279ffeccc42 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -276,7 +276,18 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { isAllowedInBattle(): boolean { const challengeAllowed = new Utils.BooleanHolder(true); applyChallenges(this.scene.gameMode, ChallengeType.POKEMON_IN_BATTLE, this, challengeAllowed); - return !this.isFainted() && challengeAllowed.value; + return !this.isFainted() && this.isAllowed(); + } + + /** + * Check if this pokemon is allowed (no challenge exclusion) + * This is frequently a better alternative to {@link isFainted} + * @returns {boolean} True if pokemon is allowed in battle + */ + isAllowed(): boolean { + const challengeAllowed = new Utils.BooleanHolder(true); + applyChallenges(this.scene.gameMode, ChallengeType.POKEMON_IN_BATTLE, this, challengeAllowed); + return challengeAllowed.value; } isActive(onField?: boolean): boolean { From 515020742d380a56ea82101c843cdd59bd10edfa Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Fri, 12 Jul 2024 16:16:52 -0400 Subject: [PATCH 091/270] add i18next money formatter for MEs --- src/locales/en/mystery-encounter.ts | 4 ++-- src/plugins/i18n.ts | 8 ++++++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/locales/en/mystery-encounter.ts b/src/locales/en/mystery-encounter.ts index 9101b22d520..6ba84f6142b 100644 --- a/src/locales/en/mystery-encounter.ts +++ b/src/locales/en/mystery-encounter.ts @@ -86,9 +86,9 @@ export const mysteryEncounter: SimpleTranslationEntries = { "shady_vitamin_dealer_query": "Which deal will choose?", "shady_vitamin_dealer_invalid_selection": "Pokémon must be healthy enough.", "shady_vitamin_dealer_option_1_label": "The Cheap Deal", - "shady_vitamin_dealer_option_1_tooltip": "(-) Pay @[MONEY]{₽{{option1Money, number}}}\n(-) Side Effects?\n(+) Chosen Pokémon Gains 2 Random Vitamins", + "shady_vitamin_dealer_option_1_tooltip": "(-) Pay {{option1Money, money}}\n(-) Side Effects?\n(+) Chosen Pokémon Gains 2 Random Vitamins", "shady_vitamin_dealer_option_2_label": "The Pricey Deal", - "shady_vitamin_dealer_option_2_tooltip": "(-) Pay @[MONEY]{₽{{option2Money, number}}}\n(-) Side Effects?\n(+) Chosen Pokémon Gains 2 Random Vitamins", + "shady_vitamin_dealer_option_2_tooltip": "(-) Pay {{option2Money, money}}\n(-) Side Effects?\n(+) Chosen Pokémon Gains 2 Random Vitamins", "shady_vitamin_dealer_option_selected": `The man hands you two bottles and quickly disappears. \${{selectedPokemon}} gained {{boost1}} and {{boost2}} boosts!`, "shady_vitamin_dealer_damage_only": `But the medicine had some side effects! diff --git a/src/plugins/i18n.ts b/src/plugins/i18n.ts index 3bcac101465..1b4bfdbb16a 100644 --- a/src/plugins/i18n.ts +++ b/src/plugins/i18n.ts @@ -136,6 +136,14 @@ export async function initI18n(): Promise { postProcess: ["korean-postposition"], }); + // Input: {{myMoneyValue, money}} + // Output: @[MONEY]{₽100,000,000} (useful for BBCode coloring of text) + // If you don't want the BBCode tag applied, just use 'number' formatter + i18next.services.formatter.add("money", (value, lng, options) => { + const numberFormattedString = Intl.NumberFormat(lng, options).format(value); + return `@[MONEY]{₽${numberFormattedString}}`; + }); + await initFonts(); } From 7164b0afe4985ffdddf364cc265ad813f5016c1f Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Fri, 12 Jul 2024 13:23:48 -0700 Subject: [PATCH 092/270] add` CanLearnMoveRequirement` --- .../mystery-encounter-requirements.ts | 4 +- .../can-learn-move-requirement.ts | 113 ++++++++++++++++++ 2 files changed, 115 insertions(+), 2 deletions(-) create mode 100644 src/data/mystery-encounters/requirements/can-learn-move-requirement.ts diff --git a/src/data/mystery-encounters/mystery-encounter-requirements.ts b/src/data/mystery-encounters/mystery-encounter-requirements.ts index c00a31fa872..3ce57b5a558 100644 --- a/src/data/mystery-encounters/mystery-encounter-requirements.ts +++ b/src/data/mystery-encounters/mystery-encounter-requirements.ts @@ -31,8 +31,8 @@ export abstract class EncounterSceneRequirement implements EncounterRequirement } export abstract class EncounterPokemonRequirement implements EncounterRequirement { - protected minNumberOfPokemon: number; - protected invertQuery: boolean; + public minNumberOfPokemon: number; + public invertQuery: boolean; abstract meetsRequirement(scene: BattleScene): boolean; diff --git a/src/data/mystery-encounters/requirements/can-learn-move-requirement.ts b/src/data/mystery-encounters/requirements/can-learn-move-requirement.ts new file mode 100644 index 00000000000..c881602b4f8 --- /dev/null +++ b/src/data/mystery-encounters/requirements/can-learn-move-requirement.ts @@ -0,0 +1,113 @@ +import BattleScene from "#app/battle-scene.js"; +import { Moves } from "#app/enums/moves.js"; +import { PlayerPokemon } from "#app/field/pokemon.js"; +import { isNullOrUndefined } from "#app/utils.js"; +import { EncounterPokemonRequirement } from "../mystery-encounter-requirements"; + +/** + * {@linkcode CanLearnMoveRequirement} options + */ +interface Options { + excludeLevelMoves?: boolean; + excludeTmMoves?: boolean; + excludeEggMoves?: boolean; + includeFainted?: boolean; + minNumberOfPokemon?: number; + invertQuery?: boolean; +} + +/** + * Requires that a pokemon can learn a specific move/moveset. + */ +export class CanLearnMoveRequirement extends EncounterPokemonRequirement { + private readonly requiredMoves: Moves[]; + private readonly excludeLevelMoves?: boolean; + private readonly excludeTmMoves?: boolean; + private readonly excludeEggMoves?: boolean; + private readonly includeFainted?: boolean; + + constructor(requiredMoves: Moves | Moves[], options: Options = {}) { + super(); + this.requiredMoves = Array.isArray(requiredMoves) + ? requiredMoves + : [requiredMoves]; + + const { + excludeLevelMoves, + excludeTmMoves, + excludeEggMoves, + includeFainted, + minNumberOfPokemon, + invertQuery, + } = options; + + this.excludeLevelMoves = excludeLevelMoves ?? false; + this.excludeTmMoves = excludeTmMoves ?? false; + this.excludeEggMoves = excludeEggMoves ?? false; + this.includeFainted = includeFainted ?? false; + this.minNumberOfPokemon = minNumberOfPokemon ?? 1; + this.invertQuery = invertQuery; + } + + override meetsRequirement(scene: BattleScene): boolean { + const partyPokemon = scene + .getParty() + .filter((pkm) => + this.includeFainted ? pkm.isAllowed() : pkm.isAllowedInBattle() + ); + + if (isNullOrUndefined(partyPokemon) || this?.requiredMoves?.length < 0) { + return false; + } + + return this.queryParty(partyPokemon).length >= this.minNumberOfPokemon; + } + + override queryParty(partyPokemon: PlayerPokemon[]): PlayerPokemon[] { + if (!this.invertQuery) { + return partyPokemon.filter((pokemon) => + // every required move should be included + this.requiredMoves.every((requiredMove) => + this.getAllPokemonMoves(pokemon).includes(requiredMove) + ) + ); + } else { + return partyPokemon.filter( + (pokemon) => + // none of the "required" moves should be included + !this.requiredMoves.some((requiredMove) => + this.getAllPokemonMoves(pokemon).includes(requiredMove) + ) + ); + } + } + + override getDialogueToken( + _scene: BattleScene, + _pokemon?: PlayerPokemon + ): [string, string] { + return ["requiredMoves", this.requiredMoves.join(", ")]; + } + + private getPokemonLevelMoves(pkm: PlayerPokemon): Moves[] { + return pkm.getLevelMoves().map(([_level, move]) => move); + } + + private getAllPokemonMoves(pkm: PlayerPokemon): Moves[] { + const allPokemonMoves: Moves[] = []; + + if (!this.excludeLevelMoves) { + allPokemonMoves.push(...this.getPokemonLevelMoves(pkm)); + } + + if (this.excludeTmMoves) { + allPokemonMoves.push(...pkm.compatibleTms); + } + + if (this.excludeEggMoves) { + allPokemonMoves.push(...pkm.getEggMoves()); + } + + return allPokemonMoves; + } +} From c9cbdd7d4467c4245a9d2fc8ecd625ec741c3d21 Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Fri, 12 Jul 2024 14:07:33 -0700 Subject: [PATCH 093/270] lost-at-sea encounter - further progress --- .../encounters/lost-at-sea-encounter.ts | 241 +++++++----------- .../mystery-encounter-option.ts | 16 +- .../mystery-encounters/mystery-encounters.ts | 17 +- .../can-learn-move-requirement.ts | 38 +-- .../en/mystery-encounters/lost-at-sea.ts | 6 +- 5 files changed, 134 insertions(+), 184 deletions(-) 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 b4525176cf1..f3af2e79c0e 100644 --- a/src/data/mystery-encounters/encounters/lost-at-sea-encounter.ts +++ b/src/data/mystery-encounters/encounters/lost-at-sea-encounter.ts @@ -1,21 +1,12 @@ import { Type } from "#app/data/type.js"; +import { Moves } from "#app/enums/moves.js"; import { Species } from "#app/enums/species.js"; import { PlayerPokemon } from "#app/field/pokemon.js"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import BattleScene from "../../../battle-scene"; -import MysteryEncounter, { - MysteryEncounterBuilder, - MysteryEncounterTier, -} from "../mystery-encounter"; -import { - EncounterOptionMode, - MysteryEncounterOptionBuilder, -} from "../mystery-encounter-option"; -import { - applyDamageToPokemon, - leaveEncounterWithoutBattle, - setEncounterExp, -} from "../mystery-encounter-utils"; +import MysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier } from "../mystery-encounter"; +import { EncounterOptionMode, MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; +import { applyDamageToPokemon, leaveEncounterWithoutBattle, setEncounterExp } from "../mystery-encounter-utils"; /** * Damage percentage taken when wandering aimlessly. @@ -26,7 +17,7 @@ const DAMAGE_PERCENTAGE: number = 30; // 0 - 100 /** The i18n namespace for the encounter */ const namepsace = "mysteryEncounter:lostAtSea"; -let waterPkm: PlayerPokemon; +let surfablePkm: PlayerPokemon; let flyingPkm: PlayerPokemon; /** @@ -34,137 +25,108 @@ let flyingPkm: PlayerPokemon; * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/9 | GitHub Issue #9} * @see For biome requirements check [mysteryEncountersByBiome](../mystery-encounters.ts) */ -export const LostAtSeaEncounter: MysteryEncounter = - MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.LOST_AT_SEA) - .withEncounterTier(MysteryEncounterTier.COMMON) - .withSceneWaveRangeRequirement(11, 179) - .withIntroSpriteConfigs([ - { - fileRoot: "pokemon", - spriteKey: `${Species.GYARADOS}`, - hasShadow: false, - scale: 4, - y: 100, - x: 130, - tint: 0.75, - alpha: 0.25, - }, - ]) - .withIntroDialogue([ - { - text: `${namepsace}:intro`, - }, - ]) - .withOnInit((scene: BattleScene) => { - const allowedPokemon = scene - .getParty() - .filter((p) => p.isAllowedInBattle()); - const { mysteryEncounter } = scene.currentBattle; +export const LostAtSeaEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.LOST_AT_SEA) + .withEncounterTier(MysteryEncounterTier.COMMON) + .withSceneWaveRangeRequirement(11, 179) + .withIntroSpriteConfigs([ + { + fileRoot: "pokemon", + spriteKey: `${Species.GYARADOS}`, + hasShadow: false, + scale: 4, + y: 100, + x: 130, + tint: 0.75, + alpha: 0.25, + }, + ]) + .withIntroDialogue([{ text: `${namepsace}:intro` }]) + .withOnInit((scene: BattleScene) => { + // const allowedPokemon = scene.getParty().filter((p) => p.isAllowedInBattle()); + const { mysteryEncounter } = scene.currentBattle; - mysteryEncounter.setDialogueToken( - "damagePercentage", - String(DAMAGE_PERCENTAGE) - ); + mysteryEncounter.setDialogueToken("damagePercentage", String(DAMAGE_PERCENTAGE)); - // check for water pokemon - waterPkm = findPokemonByType(allowedPokemon, Type.WATER); - mysteryEncounter.setDialogueToken("waterPkm", waterPkm?.name ?? ""); + // check for water pokemon + // surfablePkm = findPokemonThatCanLearnMove(allowedPokemon, Type.WATER); + // mysteryEncounter.setDialogueToken("waterPkm", surfablePkm?.name ?? ""); - // check for flying pokemon - flyingPkm = findPokemonByType(allowedPokemon, Type.FLYING); - mysteryEncounter.setDialogueToken( - "flyingPkm", - flyingPkm?.name ?? "" - ); + // check for flying pokemon + // flyingPkm = findPokemonThatCanLearnMove(allowedPokemon, Type.FLYING); + // mysteryEncounter.setDialogueToken("flyingPkm", flyingPkm?.name ?? ""); - return true; - }) - .withTitle(`${namepsace}:title`) - .withDescription(`${namepsace}:description`) - .withQuery(`${namepsace}:query`) - .withOption( - /** - * Option 1: Use a (non fainted) water pokemon to guide you back. - * Receives EXP similar to defeating a Lapras - */ - new MysteryEncounterOptionBuilder() - .withPokemonTypeRequirement(Type.WATER, true, 1) - .withOptionMode(EncounterOptionMode.DISABLED_OR_DEFAULT) - .withDialogue({ - buttonLabel: `${namepsace}:option:1:label`, - buttonTooltip: `${namepsace}:option:1:tooltip`, - selected: [ - { - text: `${namepsace}:option:1:selected`, - }, - ], - }) - .withOptionPhase(async (scene: BattleScene) => - handleGuidingOptionPhase(scene, waterPkm) - ) - .build() - ) - .withOption( - /** - * Option 2: Use a (non fainted) flying pokemon to guide you back. - * Receives EXP similar to defeating a Lapras - */ - new MysteryEncounterOptionBuilder() - .withPokemonTypeRequirement(Type.FLYING, true, 1) - .withOptionMode(EncounterOptionMode.DISABLED_OR_DEFAULT) - .withDialogue({ - buttonLabel: `${namepsace}:option:2:label`, - buttonTooltip: `${namepsace}:option:2:tooltip`, - selected: [ - { - text: `${namepsace}:option:2:selected`, - }, - ], - }) - .withOptionPhase(async (scene: BattleScene) => - handleGuidingOptionPhase(scene, flyingPkm) - ) - .build() - ) - .withSimpleOption( - /** - * Option 3: Wander aimlessly. All pokemons lose {@linkcode DAMAGE_PERCENTAGE}}% of their HP (or KO on 0 HP). - */ - { - buttonLabel: `${namepsace}:option:3:label`, - buttonTooltip: `${namepsace}:option:3:tooltip`, + return true; + }) + .withTitle(`${namepsace}:title`) + .withDescription(`${namepsace}:description`) + .withQuery(`${namepsace}:query`) + .withOption( + /** + * Option 1: Use a (non fainted) water pokemon to guide you back. + * Receives EXP similar to defeating a Lapras + */ + new MysteryEncounterOptionBuilder() + .withPokemonCanLearnMoveRequirement(Moves.SURF) + .withOptionMode(EncounterOptionMode.DISABLED_OR_DEFAULT) + .withDialogue({ + buttonLabel: `${namepsace}:option:1:label`, + buttonTooltip: `${namepsace}:option:1:tooltip`, selected: [ { - text: `${namepsace}:option:3:selected`, + text: `${namepsace}:option:1:selected`, }, ], - }, - async (scene: BattleScene) => { - const allowedPokemon = scene - .getParty() - .filter((p) => p.isAllowedInBattle()); + }) + .withOptionPhase(async (scene: BattleScene) => handleGuidingOptionPhase(scene, surfablePkm)) + .build() + ) + .withOption( + /** + * Option 2: Use a (non fainted) flying pokemon to guide you back. + * Receives EXP similar to defeating a Lapras + */ + new MysteryEncounterOptionBuilder() + .withPokemonTypeRequirement(Type.FLYING, true, 1) + .withOptionMode(EncounterOptionMode.DISABLED_OR_DEFAULT) + .withDialogue({ + buttonLabel: `${namepsace}:option:2:label`, + buttonTooltip: `${namepsace}:option:2:tooltip`, + selected: [ + { + text: `${namepsace}:option:2:selected`, + }, + ], + }) + .withOptionPhase(async (scene: BattleScene) => handleGuidingOptionPhase(scene, flyingPkm)) + .build() + ) + .withSimpleOption( + /** + * Option 3: Wander aimlessly. All pokemons lose {@linkcode DAMAGE_PERCENTAGE}}% of their HP (or KO on 0 HP). + */ + { + buttonLabel: `${namepsace}:option:3:label`, + buttonTooltip: `${namepsace}:option:3:tooltip`, + selected: [ + { + text: `${namepsace}:option:3:selected`, + }, + ], + }, + async (scene: BattleScene) => { + const allowedPokemon = scene.getParty().filter((p) => p.isAllowedInBattle()); - allowedPokemon.forEach((pkm) => { - const percentage = DAMAGE_PERCENTAGE / 100; - const damage = Math.floor(pkm.getMaxHp() * percentage); - return applyDamageToPokemon(pkm, damage); - }); - leaveEncounterWithoutBattle(scene); - return true; - } - ) - .build(); + allowedPokemon.forEach((pkm) => { + const percentage = DAMAGE_PERCENTAGE / 100; + const damage = Math.floor(pkm.getMaxHp() * percentage); + return applyDamageToPokemon(pkm, damage); + }); + leaveEncounterWithoutBattle(scene); -/** - * Find a pokemon inside the given party by a given type - * - * @param party player pokemon party - * @param type type to search for - * @returns - */ -function findPokemonByType(party: PlayerPokemon[], type: Type) { - return party.find((p) => p.getTypes(true).includes(type)); -} + return true; + } + ) + .build(); /** * Generic handler for using a guiding pokemon to guide you back. @@ -172,19 +134,14 @@ function findPokemonByType(party: PlayerPokemon[], type: Type) { * @param scene Battle scene * @param guidePokemon pokemon choosen as a guide */ -function handleGuidingOptionPhase( - scene: BattleScene, - guidePokemon: PlayerPokemon -) { +function handleGuidingOptionPhase(scene: BattleScene, guidePokemon: PlayerPokemon) { /** Base EXP value for guiding pokemon. Currently Lapras base-value */ const baseExpValue: number = 187; if (guidePokemon) { setEncounterExp(scene, guidePokemon.id, baseExpValue, true); } else { - console.warn( - "Lost at sea: No guide pokemon found but pokemon guides player. huh!?" - ); + console.warn("Lost at sea: No guide pokemon found but pokemon guides player. huh!?"); } leaveEncounterWithoutBattle(scene); diff --git a/src/data/mystery-encounters/mystery-encounter-option.ts b/src/data/mystery-encounters/mystery-encounter-option.ts index 1dc62a5d2e5..7bbde3f3830 100644 --- a/src/data/mystery-encounters/mystery-encounter-option.ts +++ b/src/data/mystery-encounters/mystery-encounter-option.ts @@ -1,9 +1,11 @@ import { OptionTextDisplay } from "#app/data/mystery-encounters/mystery-encounter-dialogue"; +import { Moves } from "#app/enums/moves.js"; import { PlayerPokemon } from "#app/field/pokemon"; import BattleScene from "../../battle-scene"; import * as Utils from "../../utils"; import { Type } from "../type"; import { EncounterPokemonRequirement, EncounterSceneRequirement, MoneyRequirement, TypeRequirement } from "./mystery-encounter-requirements"; +import { CanLearnMoveRequirement, CanlearnMoveRequirementOptions } from "./requirements/can-learn-move-requirement"; export enum EncounterOptionMode { /** Default style */ @@ -194,8 +196,18 @@ export class MysteryEncounterOptionBuilder implements Partial> { diff --git a/src/data/mystery-encounters/mystery-encounters.ts b/src/data/mystery-encounters/mystery-encounters.ts index 67c95917a33..d489c51e178 100644 --- a/src/data/mystery-encounters/mystery-encounters.ts +++ b/src/data/mystery-encounters/mystery-encounters.ts @@ -1,15 +1,16 @@ -import IMysteryEncounter from "./mystery-encounter"; +import { Biome } from "#enums/biome"; +import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { DarkDealEncounter } from "./encounters/dark-deal-encounter"; +import { DepartmentStoreSaleEncounter } from "./encounters/department-store-sale-encounter"; +import { FieldTripEncounter } from "./encounters/field-trip-encounter"; +import { FightOrFlightEncounter } from "./encounters/fight-or-flight-encounter"; +import { LostAtSeaEncounter } from "./encounters/lost-at-sea-encounter"; import { MysteriousChallengersEncounter } from "./encounters/mysterious-challengers-encounter"; import { MysteriousChestEncounter } from "./encounters/mysterious-chest-encounter"; -import { FightOrFlightEncounter } from "./encounters/fight-or-flight-encounter"; -import { TrainingSessionEncounter } from "./encounters/training-session-encounter"; -import { Biome } from "#enums/biome"; -import { SleepingSnorlaxEncounter } from "./encounters/sleeping-snorlax-encounter"; -import { MysteryEncounterType } from "#enums/mystery-encounter-type"; -import { DepartmentStoreSaleEncounter } from "./encounters/department-store-sale-encounter"; import { ShadyVitaminDealerEncounter } from "./encounters/shady-vitamin-dealer-encounter"; -import { LostAtSeaEncounter } from "./encounters/lost-at-sea-encounter"; +import { SleepingSnorlaxEncounter } from "./encounters/sleeping-snorlax-encounter"; +import { TrainingSessionEncounter } from "./encounters/training-session-encounter"; +import IMysteryEncounter from "./mystery-encounter"; // Spawn chance: (BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT + WIGHT_INCREMENT_ON_SPAWN_MISS * ) / 256 export const BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT = 1; diff --git a/src/data/mystery-encounters/requirements/can-learn-move-requirement.ts b/src/data/mystery-encounters/requirements/can-learn-move-requirement.ts index c881602b4f8..ffdd1324177 100644 --- a/src/data/mystery-encounters/requirements/can-learn-move-requirement.ts +++ b/src/data/mystery-encounters/requirements/can-learn-move-requirement.ts @@ -7,7 +7,7 @@ import { EncounterPokemonRequirement } from "../mystery-encounter-requirements"; /** * {@linkcode CanLearnMoveRequirement} options */ -interface Options { +export interface CanlearnMoveRequirementOptions { excludeLevelMoves?: boolean; excludeTmMoves?: boolean; excludeEggMoves?: boolean; @@ -26,20 +26,11 @@ export class CanLearnMoveRequirement extends EncounterPokemonRequirement { private readonly excludeEggMoves?: boolean; private readonly includeFainted?: boolean; - constructor(requiredMoves: Moves | Moves[], options: Options = {}) { + constructor(requiredMoves: Moves | Moves[], options: CanlearnMoveRequirementOptions = {}) { super(); - this.requiredMoves = Array.isArray(requiredMoves) - ? requiredMoves - : [requiredMoves]; + this.requiredMoves = Array.isArray(requiredMoves) ? requiredMoves : [requiredMoves]; - const { - excludeLevelMoves, - excludeTmMoves, - excludeEggMoves, - includeFainted, - minNumberOfPokemon, - invertQuery, - } = options; + const { excludeLevelMoves, excludeTmMoves, excludeEggMoves, includeFainted, minNumberOfPokemon, invertQuery } = options; this.excludeLevelMoves = excludeLevelMoves ?? false; this.excludeTmMoves = excludeTmMoves ?? false; @@ -50,11 +41,7 @@ export class CanLearnMoveRequirement extends EncounterPokemonRequirement { } override meetsRequirement(scene: BattleScene): boolean { - const partyPokemon = scene - .getParty() - .filter((pkm) => - this.includeFainted ? pkm.isAllowed() : pkm.isAllowedInBattle() - ); + const partyPokemon = scene.getParty().filter((pkm) => (this.includeFainted ? pkm.isAllowed() : pkm.isAllowedInBattle())); if (isNullOrUndefined(partyPokemon) || this?.requiredMoves?.length < 0) { return false; @@ -67,26 +54,19 @@ export class CanLearnMoveRequirement extends EncounterPokemonRequirement { if (!this.invertQuery) { return partyPokemon.filter((pokemon) => // every required move should be included - this.requiredMoves.every((requiredMove) => - this.getAllPokemonMoves(pokemon).includes(requiredMove) - ) + this.requiredMoves.every((requiredMove) => this.getAllPokemonMoves(pokemon).includes(requiredMove)) ); } else { return partyPokemon.filter( (pokemon) => // none of the "required" moves should be included - !this.requiredMoves.some((requiredMove) => - this.getAllPokemonMoves(pokemon).includes(requiredMove) - ) + !this.requiredMoves.some((requiredMove) => this.getAllPokemonMoves(pokemon).includes(requiredMove)) ); } } - override getDialogueToken( - _scene: BattleScene, - _pokemon?: PlayerPokemon - ): [string, string] { - return ["requiredMoves", this.requiredMoves.join(", ")]; + override getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] { + return pokemon ? ["pokemonCanLearnMove", pokemon.name] : null; } private getPokemonLevelMoves(pkm: PlayerPokemon): Moves[] { diff --git a/src/locales/en/mystery-encounters/lost-at-sea.ts b/src/locales/en/mystery-encounters/lost-at-sea.ts index e4ea07c77ad..6c4664b8a4a 100644 --- a/src/locales/en/mystery-encounters/lost-at-sea.ts +++ b/src/locales/en/mystery-encounters/lost-at-sea.ts @@ -6,10 +6,10 @@ export const lostAtSea = { query: "What will you do?", option: { 1: { - label: "Use @ec{waterPkm}", // pkm has to be of type water + label: "Use @ec{pokemonCanLearnMove}", // pkm has to be of type water tooltip: - "Use @ec{waterPkm} to guide you back. @ec{waterPkm} earns EXP as if having defeated a Lapras.", - selected: "@ec{waterPkm} guides you back and earns EXP.", + "Use @ec{pokemonCanLearnMove} to guide you back. @ec{pokemonCanLearnMove} earns EXP as if having defeated a Lapras.", + selected: "@ec{pokemonCanLearnMove} guides you back and earns EXP.", }, 2: { label: "Use @ec{flyingPkm}", // pkm has to be of type flying From 53f178fde2f37dd9cfada64e507b8a936824f311 Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Fri, 12 Jul 2024 14:10:19 -0700 Subject: [PATCH 094/270] replace @ec with i18n variables --- src/locales/en/mystery-encounters/lost-at-sea.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/locales/en/mystery-encounters/lost-at-sea.ts b/src/locales/en/mystery-encounters/lost-at-sea.ts index 6c4664b8a4a..f3485c723af 100644 --- a/src/locales/en/mystery-encounters/lost-at-sea.ts +++ b/src/locales/en/mystery-encounters/lost-at-sea.ts @@ -6,21 +6,21 @@ export const lostAtSea = { query: "What will you do?", option: { 1: { - label: "Use @ec{pokemonCanLearnMove}", // pkm has to be of type water + label: "Use {{pokemonCanLearnMove}}", // pkm has to be of type water tooltip: - "Use @ec{pokemonCanLearnMove} to guide you back. @ec{pokemonCanLearnMove} earns EXP as if having defeated a Lapras.", - selected: "@ec{pokemonCanLearnMove} guides you back and earns EXP.", + "Use {{pokemonCanLearnMove}} to guide you back. {{pokemonCanLearnMove}} earns EXP as if having defeated a Lapras.", + selected: "{{pokemonCanLearnMove}} guides you back and earns EXP.", }, 2: { - label: "Use @ec{flyingPkm}", // pkm has to be of type flying + label: "Use {{flyingPkm}}", // pkm has to be of type flying tooltip: - "Use @ec{flyingPkm} to guide you back. @ec{flyingPkm} earns EXP as if having defeated a Lapras.", - selected: "@ec{flyingPkm} guides you back and earns EXP.", + "Use {{flyingPkm}} to guide you back. {{flyingPkm}} earns EXP as if having defeated a Lapras.", + selected: "{{flyingPkm}} guides you back and earns EXP.", }, 3: { label: "Wander aimlessly", tooltip: - "Wander aimlessly until you're back. All your Pokémon lose @ec{damagePercentage}% of their HP. Any below that are KO'd.", + "Wander aimlessly until you're back. All your Pokémon lose {{damagePercentage}}% of their HP. Any below that are KO'd.", selected: "You wander aimlessly around. After hours of wandering, you find your way back. You and your team take the toll.", }, From 0a212b3f81529678d50f79b747fe5771d24937b1 Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Fri, 12 Jul 2024 14:24:37 -0700 Subject: [PATCH 095/270] minor changes to CanLearnMoveRequirement --- .../can-learn-move-requirement.ts | 43 ++++++++++++++----- 1 file changed, 33 insertions(+), 10 deletions(-) diff --git a/src/data/mystery-encounters/requirements/can-learn-move-requirement.ts b/src/data/mystery-encounters/requirements/can-learn-move-requirement.ts index ffdd1324177..3d13019dc1c 100644 --- a/src/data/mystery-encounters/requirements/can-learn-move-requirement.ts +++ b/src/data/mystery-encounters/requirements/can-learn-move-requirement.ts @@ -26,11 +26,23 @@ export class CanLearnMoveRequirement extends EncounterPokemonRequirement { private readonly excludeEggMoves?: boolean; private readonly includeFainted?: boolean; - constructor(requiredMoves: Moves | Moves[], options: CanlearnMoveRequirementOptions = {}) { + constructor( + requiredMoves: Moves | Moves[], + options: CanlearnMoveRequirementOptions = {} + ) { super(); - this.requiredMoves = Array.isArray(requiredMoves) ? requiredMoves : [requiredMoves]; + this.requiredMoves = Array.isArray(requiredMoves) + ? requiredMoves + : [requiredMoves]; - const { excludeLevelMoves, excludeTmMoves, excludeEggMoves, includeFainted, minNumberOfPokemon, invertQuery } = options; + const { + excludeLevelMoves, + excludeTmMoves, + excludeEggMoves, + includeFainted, + minNumberOfPokemon, + invertQuery, + } = options; this.excludeLevelMoves = excludeLevelMoves ?? false; this.excludeTmMoves = excludeTmMoves ?? false; @@ -41,7 +53,11 @@ export class CanLearnMoveRequirement extends EncounterPokemonRequirement { } override meetsRequirement(scene: BattleScene): boolean { - const partyPokemon = scene.getParty().filter((pkm) => (this.includeFainted ? pkm.isAllowed() : pkm.isAllowedInBattle())); + const partyPokemon = scene + .getParty() + .filter((pkm) => + this.includeFainted ? pkm.isAllowed() : pkm.isAllowedInBattle() + ); if (isNullOrUndefined(partyPokemon) || this?.requiredMoves?.length < 0) { return false; @@ -54,19 +70,26 @@ export class CanLearnMoveRequirement extends EncounterPokemonRequirement { if (!this.invertQuery) { return partyPokemon.filter((pokemon) => // every required move should be included - this.requiredMoves.every((requiredMove) => this.getAllPokemonMoves(pokemon).includes(requiredMove)) + this.requiredMoves.every((requiredMove) => + this.getAllPokemonMoves(pokemon).includes(requiredMove) + ) ); } else { return partyPokemon.filter( (pokemon) => // none of the "required" moves should be included - !this.requiredMoves.some((requiredMove) => this.getAllPokemonMoves(pokemon).includes(requiredMove)) + !this.requiredMoves.some((requiredMove) => + this.getAllPokemonMoves(pokemon).includes(requiredMove) + ) ); } } - override getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] { - return pokemon ? ["pokemonCanLearnMove", pokemon.name] : null; + override getDialogueToken( + _scene: BattleScene, + _pokemon?: PlayerPokemon + ): [string, string] { + return ["requiredMoves", this.requiredMoves.join(", ")]; } private getPokemonLevelMoves(pkm: PlayerPokemon): Moves[] { @@ -80,11 +103,11 @@ export class CanLearnMoveRequirement extends EncounterPokemonRequirement { allPokemonMoves.push(...this.getPokemonLevelMoves(pkm)); } - if (this.excludeTmMoves) { + if (!this.excludeTmMoves) { allPokemonMoves.push(...pkm.compatibleTms); } - if (this.excludeEggMoves) { + if (!this.excludeEggMoves) { allPokemonMoves.push(...pkm.getEggMoves()); } From a72e76b6fdfdf25f8b60469613b15d29e3502bc8 Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Fri, 12 Jul 2024 17:33:55 -0400 Subject: [PATCH 096/270] safari zone --- .../encounters/safari-zone-encounter.ts | 172 ++++++++++++++++++ .../mystery-encounters/mystery-encounters.ts | 11 +- src/enums/mystery-encounter-type.ts | 3 +- 3 files changed, 182 insertions(+), 4 deletions(-) create mode 100644 src/data/mystery-encounters/encounters/safari-zone-encounter.ts diff --git a/src/data/mystery-encounters/encounters/safari-zone-encounter.ts b/src/data/mystery-encounters/encounters/safari-zone-encounter.ts new file mode 100644 index 00000000000..e2dd7849a49 --- /dev/null +++ b/src/data/mystery-encounters/encounters/safari-zone-encounter.ts @@ -0,0 +1,172 @@ +import { + getHighestLevelPlayerPokemon, + koPlayerPokemon, + leaveEncounterWithoutBattle, + queueEncounterMessage, + setEncounterRewards, + showEncounterText, +} from "#app/data/mystery-encounters/mystery-encounter-utils"; +import { ModifierTier } from "#app/modifier/modifier-tier"; +import { GameOverPhase } from "#app/phases"; +import { randSeedInt } from "#app/utils"; +import { MysteryEncounterType } from "#enums/mystery-encounter-type"; +import BattleScene from "../../../battle-scene"; +import IMysteryEncounter, { + MysteryEncounterBuilder, + MysteryEncounterTier, +} from "../mystery-encounter"; +import { EncounterOptionMode, MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; + +/** the i18n namespace for the encounter */ +const namespace = "mysteryEncounter:safari_zone"; + +export const SafariZoneEncounter: IMysteryEncounter = + MysteryEncounterBuilder.withEncounterType( + MysteryEncounterType.SAFARI_ZONE + ) + .withEncounterTier(MysteryEncounterTier.GREAT) + .withSceneWaveRangeRequirement(10, 180) // waves 2 to 180 + .withHideIntroVisuals(false) + .withIntroSpriteConfigs([ + { + spriteKey: "chest_blue", + fileRoot: "mystery-encounters", + hasShadow: true, + x: 4, + y: 8, + disableAnimation: true, // Re-enabled after option select + }, + ]) + .withIntroDialogue([ + { + text: `mysteryEncounter:${namespace}_intro_message`, + }, + ]) + .withTitle(`mysteryEncounter:${namespace}_title`) + .withDescription(`mysteryEncounter:${namespace}_description`) + .withQuery(`mysteryEncounter:${namespace}_query`) + .withOption( + new MysteryEncounterOptionBuilder() + .withOptionMode(EncounterOptionMode.DEFAULT) + .withDialogue({ + buttonLabel: "mysteryEncounter:${namespace}_option_1_label", + buttonTooltip: "mysteryEncounter:${namespace}_option_1_tooltip", + selected: [ + { + text: "mysteryEncounter:${namespace}_option_1_selected_message", + }, + ], + }) + .withPreOptionPhase(async (scene: BattleScene) => { + // Play animation + const introVisuals = + scene.currentBattle.mysteryEncounter.introVisuals; + introVisuals.spriteConfigs[0].disableAnimation = false; + introVisuals.playAnim(); + }) + .withOptionPhase(async (scene: BattleScene) => { + // Open the chest + const roll = randSeedInt(100); + if (roll > 60) { + // Choose between 2 COMMON / 2 GREAT tier items (40%) + setEncounterRewards(scene, { + guaranteedModifierTiers: [ + ModifierTier.COMMON, + ModifierTier.COMMON, + ModifierTier.GREAT, + ModifierTier.GREAT, + ], + }); + // Display result message then proceed to rewards + queueEncounterMessage( + scene, + "mysteryEncounter:${namespace}_option_1_normal_result" + ); + leaveEncounterWithoutBattle(scene); + } else if (roll > 40) { + // Choose between 3 ULTRA tier items (20%) + setEncounterRewards(scene, { + guaranteedModifierTiers: [ + ModifierTier.ULTRA, + ModifierTier.ULTRA, + ModifierTier.ULTRA, + ], + }); + // Display result message then proceed to rewards + queueEncounterMessage( + scene, + "mysteryEncounter:${namespace}_option_1_good_result" + ); + leaveEncounterWithoutBattle(scene); + } else if (roll > 36) { + // Choose between 2 ROGUE tier items (4%) + setEncounterRewards(scene, { + guaranteedModifierTiers: [ModifierTier.ROGUE, ModifierTier.ROGUE], + }); + // Display result message then proceed to rewards + queueEncounterMessage( + scene, + "mysteryEncounter:${namespace}_option_1_great_result" + ); + leaveEncounterWithoutBattle(scene); + } else if (roll > 35) { + // Choose 1 MASTER tier item (1%) + setEncounterRewards(scene, { + guaranteedModifierTiers: [ModifierTier.MASTER], + }); + // Display result message then proceed to rewards + queueEncounterMessage( + scene, + "mysteryEncounter:${namespace}_option_1_amazing_result" + ); + leaveEncounterWithoutBattle(scene); + } else { + // Your highest level unfainted Pok�mon gets OHKO. Progress with no rewards (35%) + const highestLevelPokemon = getHighestLevelPlayerPokemon( + scene, + true + ); + koPlayerPokemon(highestLevelPokemon); + + scene.currentBattle.mysteryEncounter.setDialogueToken( + "pokeName", + highestLevelPokemon.name + ); + // Show which Pokemon was KOed, then leave encounter with no rewards + // Does this synchronously so that game over doesn't happen over result message + await showEncounterText( + scene, + "mysteryEncounter:${namespace}_option_1_bad_result" + ).then(() => { + if ( + scene.getParty().filter((p) => p.isAllowedInBattle()).length === + 0 + ) { + // All pokemon fainted, game over + scene.clearPhaseQueue(); + scene.unshiftPhase(new GameOverPhase(scene)); + } else { + leaveEncounterWithoutBattle(scene); + } + }); + } + }) + .build() + ) + .withSimpleOption( + { + buttonLabel: "mysteryEncounter:${namespace}_option_2_label", + buttonTooltip: "mysteryEncounter:${namespace}_option_2_tooltip", + selected: [ + { + text: "mysteryEncounter:${namespace}_option_2_selected_message", + }, + ], + }, + async (scene: BattleScene) => { + // Leave encounter with no rewards or exp + leaveEncounterWithoutBattle(scene, true); + return true; + } + ) + .build(); diff --git a/src/data/mystery-encounters/mystery-encounters.ts b/src/data/mystery-encounters/mystery-encounters.ts index 7a78c6edb4c..c384606f5e3 100644 --- a/src/data/mystery-encounters/mystery-encounters.ts +++ b/src/data/mystery-encounters/mystery-encounters.ts @@ -162,10 +162,13 @@ export const mysteryEncountersByBiome = new Map([ [Biome.TALL_GRASS, []], [Biome.METROPOLIS, []], [Biome.FOREST, [ - MysteryEncounterType.SLEEPING_SNORLAX + MysteryEncounterType.SLEEPING_SNORLAX, + MysteryEncounterType.SAFARI_ZONE ]], [Biome.SEA, []], - [Biome.SWAMP, []], + [Biome.SWAMP, [ + MysteryEncounterType.SAFARI_ZONE + ]], [Biome.BEACH, []], [Biome.LAKE, []], [Biome.SEABED, []], @@ -189,7 +192,9 @@ export const mysteryEncountersByBiome = new Map([ [Biome.ABYSS, []], [Biome.SPACE, []], [Biome.CONSTRUCTION_SITE, []], - [Biome.JUNGLE, []], + [Biome.JUNGLE, [ + MysteryEncounterType.SAFARI_ZONE + ]], [Biome.FAIRY_CAVE, []], [Biome.TEMPLE, []], [Biome.SLUM, []], diff --git a/src/enums/mystery-encounter-type.ts b/src/enums/mystery-encounter-type.ts index b5b0144c3be..2819b0eb6fb 100644 --- a/src/enums/mystery-encounter-type.ts +++ b/src/enums/mystery-encounter-type.ts @@ -7,5 +7,6 @@ export enum MysteryEncounterType { TRAINING_SESSION, DEPARTMENT_STORE_SALE, SHADY_VITAMIN_DEALER, - FIELD_TRIP + FIELD_TRIP, + SAFARI_ZONE } From 4097d49adce37bc878814586c1f92589d83d31f2 Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Fri, 12 Jul 2024 17:36:59 -0400 Subject: [PATCH 097/270] add an optional disabled button label --- .../encounters/sleeping-snorlax-encounter.ts | 2 +- .../mystery-encounters/mystery-encounter-dialogue.ts | 3 ++- src/ui/mystery-encounter-ui-handler.ts | 9 +++++---- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/data/mystery-encounters/encounters/sleeping-snorlax-encounter.ts b/src/data/mystery-encounters/encounters/sleeping-snorlax-encounter.ts index d26bacf7c5c..e0f4d2406e8 100644 --- a/src/data/mystery-encounters/encounters/sleeping-snorlax-encounter.ts +++ b/src/data/mystery-encounters/encounters/sleeping-snorlax-encounter.ts @@ -145,7 +145,7 @@ export const SleepingSnorlaxEncounter: IMysteryEncounter = .withDialogue({ buttonLabel: `${namespace}_option_3_label`, buttonTooltip: `${namespace}_option_3_tooltip`, - disabledTooltip: `${namespace}_option_3_disabled_tooltip`, + disabledButtonTooltip: `${namespace}_option_3_disabled_tooltip`, }) .withOptionPhase(async (scene: BattleScene) => { // Steal the Snorlax's Leftovers diff --git a/src/data/mystery-encounters/mystery-encounter-dialogue.ts b/src/data/mystery-encounters/mystery-encounter-dialogue.ts index 3832aaa7cd3..cbf939744c4 100644 --- a/src/data/mystery-encounters/mystery-encounter-dialogue.ts +++ b/src/data/mystery-encounters/mystery-encounter-dialogue.ts @@ -9,7 +9,8 @@ export class TextDisplay { export class OptionTextDisplay { buttonLabel: string; buttonTooltip?: string; - disabledTooltip?: string; + disabledButtonLabel?: string; + disabledButtonTooltip?: string; secondOptionPrompt?: string; selected?: TextDisplay[]; style?: TextStyle; diff --git a/src/ui/mystery-encounter-ui-handler.ts b/src/ui/mystery-encounter-ui-handler.ts index 2d35e98c772..e9ee0f1f6e7 100644 --- a/src/ui/mystery-encounter-ui-handler.ts +++ b/src/ui/mystery-encounter-ui-handler.ts @@ -325,12 +325,13 @@ export default class MysteryEncounterUiHandler extends UiHandler { this.optionsMeetsReqs.push(option.meetsRequirements(this.scene)); const optionDialogue = option.dialogue; + const label = !this.optionsMeetsReqs[i] && optionDialogue.disabledButtonLabel ? optionDialogue.disabledButtonLabel : optionDialogue.buttonLabel; let text: string; if (option.hasRequirements() && this.optionsMeetsReqs[i] && (option.optionMode === EncounterOptionMode.DEFAULT_OR_SPECIAL || option.optionMode === EncounterOptionMode.DISABLED_OR_SPECIAL)) { // Options with special requirements that are met are automatically colored green - text = getEncounterText(this.scene, optionDialogue.buttonLabel, TextStyle.SUMMARY_GREEN); + text = getEncounterText(this.scene, label, TextStyle.SUMMARY_GREEN); } else { - text = getEncounterText(this.scene, optionDialogue.buttonLabel, optionDialogue.style ? optionDialogue.style : TextStyle.WINDOW); + text = getEncounterText(this.scene, label, optionDialogue.style ? optionDialogue.style : TextStyle.WINDOW); } if (text) { @@ -425,8 +426,8 @@ export default class MysteryEncounterUiHandler extends UiHandler { let text: string; const cursorOption = this.filteredEncounterOptions[cursor]; const optionDialogue = cursorOption.dialogue; - if (!this.optionsMeetsReqs[cursor] && (cursorOption.optionMode === EncounterOptionMode.DISABLED_OR_DEFAULT || cursorOption.optionMode === EncounterOptionMode.DISABLED_OR_SPECIAL) && optionDialogue.disabledTooltip) { - text = getEncounterText(this.scene, optionDialogue.disabledTooltip, TextStyle.TOOLTIP_CONTENT); + if (!this.optionsMeetsReqs[cursor] && (cursorOption.optionMode === EncounterOptionMode.DISABLED_OR_DEFAULT || cursorOption.optionMode === EncounterOptionMode.DISABLED_OR_SPECIAL) && optionDialogue.disabledButtonTooltip) { + text = getEncounterText(this.scene, optionDialogue.disabledButtonTooltip, TextStyle.TOOLTIP_CONTENT); } else { text = getEncounterText(this.scene, optionDialogue.buttonTooltip, TextStyle.TOOLTIP_CONTENT); } From b23664cb9e221ac7ed41b74914aff5ebd128ecde Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Fri, 12 Jul 2024 14:40:47 -0700 Subject: [PATCH 098/270] extend MysteryEncounterOptionBuilder --- .../mystery-encounter-option.ts | 42 ++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/src/data/mystery-encounters/mystery-encounter-option.ts b/src/data/mystery-encounters/mystery-encounter-option.ts index 7bbde3f3830..43ccd258ce3 100644 --- a/src/data/mystery-encounters/mystery-encounter-option.ts +++ b/src/data/mystery-encounters/mystery-encounter-option.ts @@ -1,4 +1,4 @@ -import { OptionTextDisplay } from "#app/data/mystery-encounters/mystery-encounter-dialogue"; +import { OptionTextDisplay, TextDisplay } from "#app/data/mystery-encounters/mystery-encounter-dialogue"; import { Moves } from "#app/enums/moves.js"; import { PlayerPokemon } from "#app/field/pokemon"; import BattleScene from "../../battle-scene"; @@ -216,8 +216,48 @@ export class MysteryEncounterOptionBuilder implements Partial Date: Fri, 12 Jul 2024 14:50:32 -0700 Subject: [PATCH 099/270] undo some MysterEncounterOptionBuilder changes --- .../mystery-encounter-option.ts | 36 +------------------ 1 file changed, 1 insertion(+), 35 deletions(-) diff --git a/src/data/mystery-encounters/mystery-encounter-option.ts b/src/data/mystery-encounters/mystery-encounter-option.ts index 43ccd258ce3..f6542a19d1a 100644 --- a/src/data/mystery-encounters/mystery-encounter-option.ts +++ b/src/data/mystery-encounters/mystery-encounter-option.ts @@ -1,4 +1,4 @@ -import { OptionTextDisplay, TextDisplay } from "#app/data/mystery-encounters/mystery-encounter-dialogue"; +import { OptionTextDisplay } from "#app/data/mystery-encounters/mystery-encounter-dialogue"; import { Moves } from "#app/enums/moves.js"; import { PlayerPokemon } from "#app/field/pokemon"; import BattleScene from "../../battle-scene"; @@ -226,38 +226,4 @@ export class MysteryEncounterOptionBuilder implements Partial Date: Fri, 12 Jul 2024 14:55:52 -0700 Subject: [PATCH 100/270] apply surf & fly condition (not water & flying) --- .../encounters/lost-at-sea-encounter.ts | 17 +++++++++---- .../en/mystery-encounters/lost-at-sea.ts | 24 +++++++++---------- 2 files changed, 24 insertions(+), 17 deletions(-) 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 f3af2e79c0e..e3e3ff5bc16 100644 --- a/src/data/mystery-encounters/encounters/lost-at-sea-encounter.ts +++ b/src/data/mystery-encounters/encounters/lost-at-sea-encounter.ts @@ -1,4 +1,3 @@ -import { Type } from "#app/data/type.js"; import { Moves } from "#app/enums/moves.js"; import { Species } from "#app/enums/species.js"; import { PlayerPokemon } from "#app/field/pokemon.js"; @@ -8,6 +7,8 @@ import MysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier } from import { EncounterOptionMode, MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; import { applyDamageToPokemon, leaveEncounterWithoutBattle, setEncounterExp } from "../mystery-encounter-utils"; +const OPTION_1_REQUIRED_MOVE = Moves.SURF; +const OPTION_2_REQUIRED_MOVE = Moves.FLY; /** * Damage percentage taken when wandering aimlessly. * Can be a number between `0` - `100`. @@ -46,6 +47,8 @@ export const LostAtSeaEncounter: MysteryEncounter = MysteryEncounterBuilder.with const { mysteryEncounter } = scene.currentBattle; mysteryEncounter.setDialogueToken("damagePercentage", String(DAMAGE_PERCENTAGE)); + mysteryEncounter.setDialogueToken("option1RequiredMove", Moves[OPTION_1_REQUIRED_MOVE]); + mysteryEncounter.setDialogueToken("option2RequiredMove", Moves[OPTION_2_REQUIRED_MOVE]); // check for water pokemon // surfablePkm = findPokemonThatCanLearnMove(allowedPokemon, Type.WATER); @@ -62,15 +65,17 @@ export const LostAtSeaEncounter: MysteryEncounter = MysteryEncounterBuilder.with .withQuery(`${namepsace}:query`) .withOption( /** - * Option 1: Use a (non fainted) water pokemon to guide you back. + * Option 1: Use a (non fainted) pokemon that can learn Surf to guide you back. * Receives EXP similar to defeating a Lapras */ new MysteryEncounterOptionBuilder() - .withPokemonCanLearnMoveRequirement(Moves.SURF) + .withPokemonCanLearnMoveRequirement(OPTION_1_REQUIRED_MOVE) .withOptionMode(EncounterOptionMode.DISABLED_OR_DEFAULT) .withDialogue({ buttonLabel: `${namepsace}:option:1:label`, + disabledButtonLabel: `${namepsace}:option:1:label_disabled`, buttonTooltip: `${namepsace}:option:1:tooltip`, + disabledButtonTooltip: `${namepsace}:option:1:tooltip_disabled`, selected: [ { text: `${namepsace}:option:1:selected`, @@ -82,15 +87,17 @@ export const LostAtSeaEncounter: MysteryEncounter = MysteryEncounterBuilder.with ) .withOption( /** - * Option 2: Use a (non fainted) flying pokemon to guide you back. + * Option 2: Use a (non fainted) pokemon that can learn fly to guide you back. * Receives EXP similar to defeating a Lapras */ new MysteryEncounterOptionBuilder() - .withPokemonTypeRequirement(Type.FLYING, true, 1) + .withPokemonCanLearnMoveRequirement(OPTION_2_REQUIRED_MOVE) .withOptionMode(EncounterOptionMode.DISABLED_OR_DEFAULT) .withDialogue({ buttonLabel: `${namepsace}:option:2:label`, + disabledButtonLabel: `${namepsace}:option:2:label_disabled`, buttonTooltip: `${namepsace}:option:2:tooltip`, + disabledButtonTooltip: `${namepsace}:option:2:tooltip_disabled`, selected: [ { text: `${namepsace}:option:2:selected`, diff --git a/src/locales/en/mystery-encounters/lost-at-sea.ts b/src/locales/en/mystery-encounters/lost-at-sea.ts index f3485c723af..d5413a48ffc 100644 --- a/src/locales/en/mystery-encounters/lost-at-sea.ts +++ b/src/locales/en/mystery-encounters/lost-at-sea.ts @@ -6,23 +6,23 @@ export const lostAtSea = { query: "What will you do?", option: { 1: { - label: "Use {{pokemonCanLearnMove}}", // pkm has to be of type water - tooltip: - "Use {{pokemonCanLearnMove}} to guide you back. {{pokemonCanLearnMove}} earns EXP as if having defeated a Lapras.", - selected: "{{pokemonCanLearnMove}} guides you back and earns EXP.", + label: "Use {{option1PrimaryName}}", + label_disabled: "Can't {{option1RequiredMove}}", + tooltip: "Use {{option1PrimaryName}} to guide you back. {{option1PrimaryName}} earns EXP as if having defeated a Lapras.", + tooltip_disabled: "You have no Pokémon that could learn {{option1RequiredMove}}", + selected: "{{option1PrimaryName}} guides you back and earns EXP.", }, 2: { - label: "Use {{flyingPkm}}", // pkm has to be of type flying - tooltip: - "Use {{flyingPkm}} to guide you back. {{flyingPkm}} earns EXP as if having defeated a Lapras.", - selected: "{{flyingPkm}} guides you back and earns EXP.", + label: "Use {{option2PrimaryName}}", + label_disabled: "Can't {{option2RequiredMove}}", + tooltip: "Use {{option2PrimaryName}} to guide you back. {{option2PrimaryName}} earns EXP as if having defeated a Lapras.", + tooltip_disabled: "You have no Pokémon that could learn {{option2RequiredMove}}", + selected: "{{option2PrimaryName}} guides you back and earns EXP.", }, 3: { label: "Wander aimlessly", - tooltip: - "Wander aimlessly until you're back. All your Pokémon lose {{damagePercentage}}% of their HP. Any below that are KO'd.", - selected: - "You wander aimlessly around. After hours of wandering, you find your way back. You and your team take the toll.", + tooltip: "Wander aimlessly until you're back. All your Pokémon lose {{damagePercentage}}% of their HP. Any below that are KO'd.", + selected: "You wander aimlessly around. After hours of wandering, you find your way back. You and your team take the toll.", }, }, }; From 975f272729fdb35c19b68ecae29de52d1aad4f51 Mon Sep 17 00:00:00 2001 From: InnocentGameDev Date: Sat, 13 Jul 2024 00:12:09 +0200 Subject: [PATCH 101/270] CLEANING MY BRANCH --- MEs_Proposal_Guide.md | 101 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 MEs_Proposal_Guide.md diff --git a/MEs_Proposal_Guide.md b/MEs_Proposal_Guide.md new file mode 100644 index 00000000000..7b7b8a5fed3 --- /dev/null +++ b/MEs_Proposal_Guide.md @@ -0,0 +1,101 @@ +# Event / Mystery Encounter Proposal Guidelines + The poing of this document + +If you want to add an Event to our branch, read the guidelines below and then create an "New Issue" here: +https://github.com/AsdarDevelops/PokeRogue-Events/issues + +The idea for this document is __not__ to stiffle creativity, but rather to guide a new Event creator, facilitate the reviewer's job, as well as keep Event philosophy consistent. + +# What should I know before proposing an Event + +Events are categorised in tiers/rarity. These are the rarities at the time of writing: + +- ## ⚪ Common Events +- ## 🔵 Great Events +- ## 🟡 Ultra Events +- ## 🔴 Rogue Events + +## Do tiers mean anything? + +Yes, and now. They overall represent the rate/chance an Event has to spawn, but they are not the only thing that is considered. More importantly, they help discern, at first glance, a few things: + +### Meta progression (Most important): +How much does the Event help you to __permanently unlock__: + - Rare starters (and candies to some extent) + - Better IVs + - Natures + - Hidden Abilities + - Mythical/legendary starters + - Shinies + + If you want to add an Event that gives you any of this, it's going to automatically go to 🟡 Ultra or 🔴 Rogue. And the further down the list, the more likely it will have to be 🔴 Rogue instead of 🟡 Ultra. + + For example, __Dark Deal__ is a 🔴 Rogue Event, because it gives you a chance to capture a very powerful PKMN and permanently add it to your Box. Whereas __Mysterious Challenger__, even it might have you fight a very, very strong trainer on the "Brutal Fight", will just give you an item that will stay with you within the boundaries of that run, hence why it could be 🔵 Great or ⚪ Common. + + Note: Bear in mind not even a 🔴 Rogue Event guarantees a shiny at the time of writing. + +### Variance and swinginess (Important) +Imagine an Event at wave 12, a mysterious man offers to throw a coin in front of you. This is what happens: + +- Heads: you win the run, get all the pokécandies as if you had won, and the final boss bows to your power. +- Tails: you die horribly and lose the run. + +How often do you think this Event should happen? "Never" is the right answer, BUT the lesson here is that this Event would lean towards 🔴 Rogue rather than ⚪ Common, because it's repercussions are so, so much more meaningful than simply encountering your usual wild Pokémon fight. If you want to propose a swingy Event, that's fine, but know that the harder the swings, the higher the rarity. + +- Example: ⚪ "Fight or Flight" will have you fight a boss PKMN from the biome, for a somewhat good reward. You will rarely win or lose your run here. +- Example: 🔴 "Dark Deal" will remove a Pokémon from your party. This can be your best Pokémon at the time. You **__can catch a legendary__** which is good for the run, and your box, but you also very well **__can lose the run and not catch anything__** + +### Requirements (Somewhat Important) +If an Event is Space Biome only and it needs you to have a Steel type with the moves Extreme Speed and Pluck and the ability Levitate because you need your Pokémon to fix a rocket on the fly, it might very well be ⚪ and still almost no one should find it. Because of this, **in some exceptional cases** you might see an Event with a catchable Mythical Pokémon in a 🟡 Ultra Event. This is because the Biome requirement itself and the other factors are making it much harder to appear. + +__Thus, the more requirements an Event has to even proc, the more it can lean towards ⚪__ + +### Simplicity (Somewhat Important) + +__The simpler the Event is at first glance **to the player**, the more it can lean towards ⚪ Common__. +Pretty straightforward, and useful when you're dealing with doubts between ⚪ Common or 🔵 Great. + +### What the Event rewards you with (**NOT** Important) +"Wait, what?" + +__Excluding Meta Progression__ and __Swinginess__, I couldn't care less what the Event is handling you, it can very well be a Master-Ball __as long as the price you pay for it is right on par with it__. So go wild. + +### That's it for rarity/tier +If you still can't figure it out, still suggest a range, like "I think either ⚪ Common or 🔵 Great". + +## What is "Waves" +This is the floors/waves where you'd like your Event to happen. (11-179)* is the standard, but think about the following: + +- Is your Event too strong early, but balanced towards the later waves of Classic? Then you might want to consider going for something like 50-179, or 110-179. +- Is your Event simply useless towards later stages? Then something like 11-89 might be your best call. +- Do you love number four? You can set your Events to be only multiples of 4. Hey, if it makes sense... 🤷🏻‍♂️ + +## Biomes + +Currently, you can set the Events to happen in the specific Biomes of your choosing, but there are other options too that you can use: +- "ANY" ; self explanatory, it's any/all biomes + +- "EXTREME_BIOMES" and "NON-EXTREME_BIOMES" ; these are all the biomes in two mutually exclusive lists. The main point of this split is to avoid "Breeders in Space" type situations, with random trainers saluting you while on the moon. + - "EXTREME_BIOMES": Abyss, Badlands, Desert, Ice Cave, Seabed, Space, Volcano, Wasteland + - "NON-EXTREME_BIOMES" ; Every other biome not on "EXTREME_BIOMES" + +- "HUMAN_TRANSITABLE_BIOMES" ; for __people__, things like trainers, traders, youngster Joey and the people of the world. These are the biomes where you would feaseably find human beings during your journey. + - They are: TOWN, PLAIN, GRASS, TALL_GRASS, METROPOLIS, FOREST, SWAMP, BEACH, LAKE, MOUNTAIN, BADLANDS, CAVE, DESERT, ICE_CAVE, MEADOW, POWER_PLANT, GRAVEYARD, DOJO, FACTORY, RUINS, CONSTRUCTION_SITE, JUNGLE, FAIRY_CAVE, TEMPLE, SLUM, SNOWY_FOREST, ISLAND, LABORATORY + +- "CIVILIZATION_BIOMES" ; these are the places where you might find not only people, but also __are or can be near buildings__, a PKMN Center, a shopping center, a school. + - They are: TOWN, PLAINS, GRASS, TALL_GRASS, METROPOLIS, BEACH, LAKE, MEADOW, POWER_PLANT, GRAVEYARD, DOJO, FACTORY, CONSTRUCTION_SITE, SLUM, ISLAND + +You can use these tags, or the specific Biome, or a combination of both, to let us know where you'd like the Event to happen. + +## Options + +For now, I'll leave this as a WIP as we are still ironing out the details of what __can__ be done with Events, so just let your imagination run wild. __**Maximum of 4 selectable options at a time though, as that's what the UI can handle**__. + +## Other tips for being more likely to get your Event approved + +- Present your idea in an organized matter. The easier it is to read and understand, the more likeky it is to be approved. This means try to follow the template provided, one idea = one paragraph, and good spelling. If your mother tongue isn't English, do not worry too much, but the effort is always appreciated. + +- Be specific, the more clear the whole flow of the Event is, and the less "holes" there are in your design, the more likely it gets approved. It will mean less guesswork and back and forth with the devs. + +- Read what current MEs do. Read what rejected MEs proposed. The more you know about the feature, the better your design will likely be. + +- Go wild. \ No newline at end of file From 9b7c4f0817da624d8ba69230f7effb3be11e87ec Mon Sep 17 00:00:00 2001 From: Asdar Date: Sat, 13 Jul 2024 00:36:32 +0200 Subject: [PATCH 102/270] Update MEs_Proposal_Guide.md Co-authored-by: flx-sta <50131232+flx-sta@users.noreply.github.com> --- MEs_Proposal_Guide.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/MEs_Proposal_Guide.md b/MEs_Proposal_Guide.md index 7b7b8a5fed3..95efd98484f 100644 --- a/MEs_Proposal_Guide.md +++ b/MEs_Proposal_Guide.md @@ -72,7 +72,9 @@ This is the floors/waves where you'd like your Event to happen. (11-179)* is the ## Biomes Currently, you can set the Events to happen in the specific Biomes of your choosing, but there are other options too that you can use: -- "ANY" ; self explanatory, it's any/all biomes +### `ANY` Biome" + +self explanatory, it's any/all biomes - "EXTREME_BIOMES" and "NON-EXTREME_BIOMES" ; these are all the biomes in two mutually exclusive lists. The main point of this split is to avoid "Breeders in Space" type situations, with random trainers saluting you while on the moon. - "EXTREME_BIOMES": Abyss, Badlands, Desert, Ice Cave, Seabed, Space, Volcano, Wasteland From b6b3bb49f2a2b11484ee1951f598b1a7e4b87952 Mon Sep 17 00:00:00 2001 From: Asdar Date: Sat, 13 Jul 2024 00:36:39 +0200 Subject: [PATCH 103/270] Update MEs_Proposal_Guide.md Co-authored-by: flx-sta <50131232+flx-sta@users.noreply.github.com> --- MEs_Proposal_Guide.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/MEs_Proposal_Guide.md b/MEs_Proposal_Guide.md index 95efd98484f..20856ecf0cc 100644 --- a/MEs_Proposal_Guide.md +++ b/MEs_Proposal_Guide.md @@ -76,7 +76,9 @@ Currently, you can set the Events to happen in the specific Biomes of your choos self explanatory, it's any/all biomes -- "EXTREME_BIOMES" and "NON-EXTREME_BIOMES" ; these are all the biomes in two mutually exclusive lists. The main point of this split is to avoid "Breeders in Space" type situations, with random trainers saluting you while on the moon. +### `EXTREME_BIOMES` and `NON-EXTREME_BIOMES` + +these are all the biomes in two mutually exclusive lists. The main point of this split is to avoid "Breeders in Space" type situations, with random trainers saluting you while on the moon. - "EXTREME_BIOMES": Abyss, Badlands, Desert, Ice Cave, Seabed, Space, Volcano, Wasteland - "NON-EXTREME_BIOMES" ; Every other biome not on "EXTREME_BIOMES" From def54141ceacaf03c082e2f725bbded1e7684722 Mon Sep 17 00:00:00 2001 From: Asdar Date: Sat, 13 Jul 2024 00:36:51 +0200 Subject: [PATCH 104/270] Update MEs_Proposal_Guide.md Co-authored-by: flx-sta <50131232+flx-sta@users.noreply.github.com> --- MEs_Proposal_Guide.md | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/MEs_Proposal_Guide.md b/MEs_Proposal_Guide.md index 20856ecf0cc..bb4fa27c265 100644 --- a/MEs_Proposal_Guide.md +++ b/MEs_Proposal_Guide.md @@ -79,7 +79,16 @@ self explanatory, it's any/all biomes ### `EXTREME_BIOMES` and `NON-EXTREME_BIOMES` these are all the biomes in two mutually exclusive lists. The main point of this split is to avoid "Breeders in Space" type situations, with random trainers saluting you while on the moon. - - "EXTREME_BIOMES": Abyss, Badlands, Desert, Ice Cave, Seabed, Space, Volcano, Wasteland +#### EXTREME_BIOMES + +- Abyss +- Badlands +- Desert +- Ice Cave +- Seabed +- Space +- Volcano +- Wasteland - "NON-EXTREME_BIOMES" ; Every other biome not on "EXTREME_BIOMES" - "HUMAN_TRANSITABLE_BIOMES" ; for __people__, things like trainers, traders, youngster Joey and the people of the world. These are the biomes where you would feaseably find human beings during your journey. From e28a3a94f5bba5f253640c38c93b7b9952740b04 Mon Sep 17 00:00:00 2001 From: Asdar Date: Sat, 13 Jul 2024 00:37:35 +0200 Subject: [PATCH 105/270] Update MEs_Proposal_Guide.md Co-authored-by: flx-sta <50131232+flx-sta@users.noreply.github.com> --- MEs_Proposal_Guide.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/MEs_Proposal_Guide.md b/MEs_Proposal_Guide.md index bb4fa27c265..8a5a85b106a 100644 --- a/MEs_Proposal_Guide.md +++ b/MEs_Proposal_Guide.md @@ -89,7 +89,9 @@ these are all the biomes in two mutually exclusive lists. The main point of this - Space - Volcano - Wasteland - - "NON-EXTREME_BIOMES" ; Every other biome not on "EXTREME_BIOMES" +#### NON-EXTREME_BIOMES + +Every other biome not on [`EXTREME_BIOMES`](link-to-extreme-biomes?) - "HUMAN_TRANSITABLE_BIOMES" ; for __people__, things like trainers, traders, youngster Joey and the people of the world. These are the biomes where you would feaseably find human beings during your journey. - They are: TOWN, PLAIN, GRASS, TALL_GRASS, METROPOLIS, FOREST, SWAMP, BEACH, LAKE, MOUNTAIN, BADLANDS, CAVE, DESERT, ICE_CAVE, MEADOW, POWER_PLANT, GRAVEYARD, DOJO, FACTORY, RUINS, CONSTRUCTION_SITE, JUNGLE, FAIRY_CAVE, TEMPLE, SLUM, SNOWY_FOREST, ISLAND, LABORATORY From 9dc69f19d118a8fc6833bb07cd6d674712a53126 Mon Sep 17 00:00:00 2001 From: Asdar Date: Sat, 13 Jul 2024 00:37:46 +0200 Subject: [PATCH 106/270] Update MEs_Proposal_Guide.md Co-authored-by: flx-sta <50131232+flx-sta@users.noreply.github.com> --- MEs_Proposal_Guide.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/MEs_Proposal_Guide.md b/MEs_Proposal_Guide.md index 8a5a85b106a..c29249dc2ce 100644 --- a/MEs_Proposal_Guide.md +++ b/MEs_Proposal_Guide.md @@ -93,8 +93,11 @@ these are all the biomes in two mutually exclusive lists. The main point of this Every other biome not on [`EXTREME_BIOMES`](link-to-extreme-biomes?) -- "HUMAN_TRANSITABLE_BIOMES" ; for __people__, things like trainers, traders, youngster Joey and the people of the world. These are the biomes where you would feaseably find human beings during your journey. - - They are: TOWN, PLAIN, GRASS, TALL_GRASS, METROPOLIS, FOREST, SWAMP, BEACH, LAKE, MOUNTAIN, BADLANDS, CAVE, DESERT, ICE_CAVE, MEADOW, POWER_PLANT, GRAVEYARD, DOJO, FACTORY, RUINS, CONSTRUCTION_SITE, JUNGLE, FAIRY_CAVE, TEMPLE, SLUM, SNOWY_FOREST, ISLAND, LABORATORY +### HUMAN_TRANSITABLE_BIOMES + +for __people__, things like trainers, traders, youngster Joey and the people of the world. These are the biomes where you would feaseably find human beings during your journey. + +They are: TOWN, PLAIN, GRASS, TALL_GRASS, METROPOLIS, FOREST, SWAMP, BEACH, LAKE, MOUNTAIN, BADLANDS, CAVE, DESERT, ICE_CAVE, MEADOW, POWER_PLANT, GRAVEYARD, DOJO, FACTORY, RUINS, CONSTRUCTION_SITE, JUNGLE, FAIRY_CAVE, TEMPLE, SLUM, SNOWY_FOREST, ISLAND, LABORATORY - "CIVILIZATION_BIOMES" ; these are the places where you might find not only people, but also __are or can be near buildings__, a PKMN Center, a shopping center, a school. - They are: TOWN, PLAINS, GRASS, TALL_GRASS, METROPOLIS, BEACH, LAKE, MEADOW, POWER_PLANT, GRAVEYARD, DOJO, FACTORY, CONSTRUCTION_SITE, SLUM, ISLAND From c56e6bdd853477a7835ba69f426ddef4612d9685 Mon Sep 17 00:00:00 2001 From: Asdar Date: Sat, 13 Jul 2024 00:37:58 +0200 Subject: [PATCH 107/270] Update MEs_Proposal_Guide.md Co-authored-by: flx-sta <50131232+flx-sta@users.noreply.github.com> --- MEs_Proposal_Guide.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/MEs_Proposal_Guide.md b/MEs_Proposal_Guide.md index c29249dc2ce..889279a3379 100644 --- a/MEs_Proposal_Guide.md +++ b/MEs_Proposal_Guide.md @@ -99,8 +99,10 @@ for __people__, things like trainers, traders, youngster Joey and the people of They are: TOWN, PLAIN, GRASS, TALL_GRASS, METROPOLIS, FOREST, SWAMP, BEACH, LAKE, MOUNTAIN, BADLANDS, CAVE, DESERT, ICE_CAVE, MEADOW, POWER_PLANT, GRAVEYARD, DOJO, FACTORY, RUINS, CONSTRUCTION_SITE, JUNGLE, FAIRY_CAVE, TEMPLE, SLUM, SNOWY_FOREST, ISLAND, LABORATORY -- "CIVILIZATION_BIOMES" ; these are the places where you might find not only people, but also __are or can be near buildings__, a PKMN Center, a shopping center, a school. - - They are: TOWN, PLAINS, GRASS, TALL_GRASS, METROPOLIS, BEACH, LAKE, MEADOW, POWER_PLANT, GRAVEYARD, DOJO, FACTORY, CONSTRUCTION_SITE, SLUM, ISLAND +### CIVILIZATION_BIOMES +these are the places where you might find not only people, but also __are or can be near buildings__, a PKMN Center, a shopping center, a school. + +They are: TOWN, PLAINS, GRASS, TALL_GRASS, METROPOLIS, BEACH, LAKE, MEADOW, POWER_PLANT, GRAVEYARD, DOJO, FACTORY, CONSTRUCTION_SITE, SLUM, ISLAND You can use these tags, or the specific Biome, or a combination of both, to let us know where you'd like the Event to happen. From e4a566785d79d7c4fab0ba33d7ae3ce4f2d34bb7 Mon Sep 17 00:00:00 2001 From: InnocentGameDev Date: Sat, 13 Jul 2024 00:41:31 +0200 Subject: [PATCH 108/270] formatting fix --- MEs_Proposal_Guide.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/MEs_Proposal_Guide.md b/MEs_Proposal_Guide.md index 889279a3379..b5f7a7ec1f7 100644 --- a/MEs_Proposal_Guide.md +++ b/MEs_Proposal_Guide.md @@ -72,7 +72,7 @@ This is the floors/waves where you'd like your Event to happen. (11-179)* is the ## Biomes Currently, you can set the Events to happen in the specific Biomes of your choosing, but there are other options too that you can use: -### `ANY` Biome" +### `ANY` Biome self explanatory, it's any/all biomes @@ -91,7 +91,7 @@ these are all the biomes in two mutually exclusive lists. The main point of this - Wasteland #### NON-EXTREME_BIOMES -Every other biome not on [`EXTREME_BIOMES`](link-to-extreme-biomes?) +Every other biome not on [`EXTREME_BIOMES`](https://github.com/AsdarDevelops/PokeRogue-Events/blob/Asdar/MEs_Proposal_Guide.md#extreme_biomes) ### HUMAN_TRANSITABLE_BIOMES From 52fd9d63c6f08b612bd2c572e72c61d629777225 Mon Sep 17 00:00:00 2001 From: InnocentGameDev Date: Sat, 13 Jul 2024 00:45:11 +0200 Subject: [PATCH 109/270] formatting + punctuation fix --- MEs_Proposal_Guide.md | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/MEs_Proposal_Guide.md b/MEs_Proposal_Guide.md index b5f7a7ec1f7..83bd701ccc6 100644 --- a/MEs_Proposal_Guide.md +++ b/MEs_Proposal_Guide.md @@ -74,11 +74,12 @@ This is the floors/waves where you'd like your Event to happen. (11-179)* is the Currently, you can set the Events to happen in the specific Biomes of your choosing, but there are other options too that you can use: ### `ANY` Biome -self explanatory, it's any/all biomes +Fairly self explanatory, it's any/all biomes. ### `EXTREME_BIOMES` and `NON-EXTREME_BIOMES` -these are all the biomes in two mutually exclusive lists. The main point of this split is to avoid "Breeders in Space" type situations, with random trainers saluting you while on the moon. +These are all the biomes in two mutually exclusive lists. The main point of this split is to avoid "Breeders in Space" type situations, with random trainers saluting you while on the moon. + #### EXTREME_BIOMES - Abyss @@ -89,18 +90,20 @@ these are all the biomes in two mutually exclusive lists. The main point of this - Space - Volcano - Wasteland + #### NON-EXTREME_BIOMES Every other biome not on [`EXTREME_BIOMES`](https://github.com/AsdarDevelops/PokeRogue-Events/blob/Asdar/MEs_Proposal_Guide.md#extreme_biomes) + ### HUMAN_TRANSITABLE_BIOMES -for __people__, things like trainers, traders, youngster Joey and the people of the world. These are the biomes where you would feaseably find human beings during your journey. +For **__people__**, things like trainers, traders, youngster Joey and the people of the world. These are the biomes where you would feaseably find human beings during your journey. They are: TOWN, PLAIN, GRASS, TALL_GRASS, METROPOLIS, FOREST, SWAMP, BEACH, LAKE, MOUNTAIN, BADLANDS, CAVE, DESERT, ICE_CAVE, MEADOW, POWER_PLANT, GRAVEYARD, DOJO, FACTORY, RUINS, CONSTRUCTION_SITE, JUNGLE, FAIRY_CAVE, TEMPLE, SLUM, SNOWY_FOREST, ISLAND, LABORATORY ### CIVILIZATION_BIOMES -these are the places where you might find not only people, but also __are or can be near buildings__, a PKMN Center, a shopping center, a school. +These are the places where you might find not only people, but also __are or can be near buildings__, a PKMN Center, a shopping center, a school. They are: TOWN, PLAINS, GRASS, TALL_GRASS, METROPOLIS, BEACH, LAKE, MEADOW, POWER_PLANT, GRAVEYARD, DOJO, FACTORY, CONSTRUCTION_SITE, SLUM, ISLAND From da0aea0d1e6213c04c4d3c2c6345111d101898ce Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Sun, 14 Jul 2024 17:37:03 -0400 Subject: [PATCH 110/270] safari encounter and sprite offset positioning updates --- .../images/mystery-encounters/chest_blue.json | 169 ++-- .../images/mystery-encounters/chest_blue.png | Bin 2723 -> 2671 bytes .../encounters/mysterious-chest-encounter.ts | 52 +- .../encounters/safari-zone-encounter.ts | 913 +++++++++++++++--- .../shady-vitamin-dealer-encounter.ts | 10 +- .../mystery-encounter-utils.ts | 24 +- .../mystery-encounters/mystery-encounter.ts | 15 +- .../mystery-encounters/mystery-encounters.ts | 2 + src/field/mystery-encounter-intro.ts | 11 +- src/locales/en/battle.ts | 3 + src/locales/en/mystery-encounter.ts | 38 +- src/phases.ts | 6 +- src/phases/mystery-encounter-phase.ts | 39 +- src/pipelines/sprite.ts | 9 +- src/ui/mystery-encounter-ui-handler.ts | 45 +- 15 files changed, 1048 insertions(+), 288 deletions(-) diff --git a/public/images/mystery-encounters/chest_blue.json b/public/images/mystery-encounters/chest_blue.json index 88aadda845a..9a386802e03 100644 --- a/public/images/mystery-encounters/chest_blue.json +++ b/public/images/mystery-encounters/chest_blue.json @@ -4,177 +4,198 @@ "image": "chest_blue.png", "format": "RGBA8888", "size": { - "w": 300, - "h": 75 + "w": 58, + "h": 528 }, "scale": 1, "frames": [ { - "filename": "0001.png", + "filename": "0000.png", "rotated": false, - "trimmed": false, + "trimmed": true, "sourceSize": { "w": 75, "h": 75 }, "spriteSourceSize": { - "x": 0, - "y": 0, + "x": 14, + "y": 30, + "w": 48, + "h": 41 + }, + "frame": { + "x": 1, + "y": 1, + "w": 48, + "h": 41 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { "w": 75, "h": 75 }, + "spriteSourceSize": { + "x": 14, + "y": 34, + "w": 49, + "h": 37 + }, "frame": { - "x": -15, - "y": 0, - "w": 75, - "h": 75 + "x": 1, + "y": 44, + "w": 49, + "h": 37 } }, { "filename": "0002.png", "rotated": false, - "trimmed": false, + "trimmed": true, "sourceSize": { "w": 75, "h": 75 }, "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 75 + "x": 14, + "y": 30, + "w": 48, + "h": 41 }, "frame": { - "x": -15, - "y": 0, - "w": 75, - "h": 75 + "x": 1, + "y": 83, + "w": 48, + "h": 41 } }, { "filename": "0003.png", "rotated": false, - "trimmed": false, + "trimmed": true, "sourceSize": { "w": 75, "h": 75 }, "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 75 + "x": 14, + "y": 23, + "w": 48, + "h": 48 }, "frame": { - "x": 57, - "y": 0, - "w": 75, - "h": 75 + "x": 1, + "y": 126, + "w": 48, + "h": 48 } }, { "filename": "0004.png", "rotated": false, - "trimmed": false, + "trimmed": true, "sourceSize": { "w": 75, "h": 75 }, "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 75 + "x": 13, + "y": 4, + "w": 55, + "h": 67 }, "frame": { - "x": 57, - "y": 0, - "w": 75, - "h": 75 + "x": 1, + "y": 176, + "w": 55, + "h": 67 } }, { "filename": "0005.png", "rotated": false, - "trimmed": false, + "trimmed": true, "sourceSize": { "w": 75, "h": 75 }, "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 75 + "x": 15, + "y": 2, + "w": 56, + "h": 69 }, "frame": { - "x": 129, - "y": 0, - "w": 75, - "h": 75 + "x": 1, + "y": 245, + "w": 56, + "h": 69 } }, { "filename": "0006.png", "rotated": false, - "trimmed": false, + "trimmed": true, "sourceSize": { "w": 75, "h": 75 }, "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 75 + "x": 15, + "y": 2, + "w": 56, + "h": 69 }, "frame": { - "x": 129, - "y": 0, - "w": 75, - "h": 75 + "x": 1, + "y": 316, + "w": 56, + "h": 69 } }, { "filename": "0007.png", "rotated": false, - "trimmed": false, + "trimmed": true, "sourceSize": { "w": 75, "h": 75 }, "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 75 + "x": 13, + "y": 2, + "w": 56, + "h": 69 }, "frame": { - "x": 201, - "y": 0, - "w": 75, - "h": 75 + "x": 1, + "y": 387, + "w": 56, + "h": 69 } }, { "filename": "0008.png", "rotated": false, - "trimmed": false, + "trimmed": true, "sourceSize": { "w": 75, "h": 75 }, "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 75 + "x": 13, + "y": 2, + "w": 56, + "h": 69 }, "frame": { - "x": 201, - "y": 0, - "w": 75, - "h": 75 + "x": 1, + "y": 458, + "w": 56, + "h": 69 } } ] @@ -183,6 +204,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:895f0a79b89fa0fb44167f4584fd9a22:357b46953b7e17c6b2f43a62d52855d8:cc1ed0e4f90aaa9dcf1b39a0af1283b0$" + "smartupdate": "$TexturePacker:SmartUpdate:5f36000f6160ee6f397afe5a6fd60b73:cf6f4b08e23400447813583c322eb6c7:f4f3c064e6c93b8d1290f93bee927f60$" } } diff --git a/public/images/mystery-encounters/chest_blue.png b/public/images/mystery-encounters/chest_blue.png index 0097346e845a2a21d52fb840704f7566b2f23921..ac1039544e3249789b3ece452203dfdde1f6933a 100644 GIT binary patch literal 2671 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 diff --git a/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts b/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts index 49672ee636c..ae6c14f725e 100644 --- a/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts +++ b/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts @@ -30,7 +30,8 @@ export const MysteriousChestEncounter: IMysteryEncounter = fileRoot: "mystery-encounters", hasShadow: true, x: 4, - y: 8, + y: 10, + yShadowOffset: 3, disableAnimation: true, // Re-enabled after option select }, ]) @@ -75,10 +76,7 @@ export const MysteriousChestEncounter: IMysteryEncounter = ], }); // Display result message then proceed to rewards - queueEncounterMessage( - scene, - "mysteryEncounter:mysterious_chest_option_1_normal_result" - ); + queueEncounterMessage(scene, "mysteryEncounter:mysterious_chest_option_1_normal_result"); leaveEncounterWithoutBattle(scene); } else if (roll > 40) { // Choose between 3 ULTRA tier items (20%) @@ -90,10 +88,7 @@ export const MysteriousChestEncounter: IMysteryEncounter = ], }); // Display result message then proceed to rewards - queueEncounterMessage( - scene, - "mysteryEncounter:mysterious_chest_option_1_good_result" - ); + queueEncounterMessage(scene, "mysteryEncounter:mysterious_chest_option_1_good_result"); leaveEncounterWithoutBattle(scene); } else if (roll > 36) { // Choose between 2 ROGUE tier items (4%) @@ -101,10 +96,7 @@ export const MysteriousChestEncounter: IMysteryEncounter = guaranteedModifierTiers: [ModifierTier.ROGUE, ModifierTier.ROGUE], }); // Display result message then proceed to rewards - queueEncounterMessage( - scene, - "mysteryEncounter:mysterious_chest_option_1_great_result" - ); + queueEncounterMessage(scene, "mysteryEncounter:mysterious_chest_option_1_great_result"); leaveEncounterWithoutBattle(scene); } else if (roll > 35) { // Choose 1 MASTER tier item (1%) @@ -112,10 +104,7 @@ export const MysteriousChestEncounter: IMysteryEncounter = guaranteedModifierTiers: [ModifierTier.MASTER], }); // Display result message then proceed to rewards - queueEncounterMessage( - scene, - "mysteryEncounter:mysterious_chest_option_1_amazing_result" - ); + queueEncounterMessage(scene, "mysteryEncounter:mysterious_chest_option_1_amazing_result"); leaveEncounterWithoutBattle(scene); } else { // Your highest level unfainted Pok�mon gets OHKO. Progress with no rewards (35%) @@ -125,27 +114,22 @@ export const MysteriousChestEncounter: IMysteryEncounter = ); koPlayerPokemon(highestLevelPokemon); - scene.currentBattle.mysteryEncounter.setDialogueToken( - "pokeName", - highestLevelPokemon.name - ); + scene.currentBattle.mysteryEncounter.setDialogueToken("pokeName", highestLevelPokemon.name); // Show which Pokemon was KOed, then leave encounter with no rewards // Does this synchronously so that game over doesn't happen over result message - await showEncounterText( - scene, - "mysteryEncounter:mysterious_chest_option_1_bad_result" - ).then(() => { - if ( - scene.getParty().filter((p) => p.isAllowedInBattle()).length === + await showEncounterText(scene, "mysteryEncounter:mysterious_chest_option_1_bad_result") + .then(() => { + if ( + scene.getParty().filter((p) => p.isAllowedInBattle()).length === 0 - ) { + ) { // All pokemon fainted, game over - scene.clearPhaseQueue(); - scene.unshiftPhase(new GameOverPhase(scene)); - } else { - leaveEncounterWithoutBattle(scene); - } - }); + scene.clearPhaseQueue(); + scene.unshiftPhase(new GameOverPhase(scene)); + } else { + leaveEncounterWithoutBattle(scene); + } + }); } }) .build() diff --git a/src/data/mystery-encounters/encounters/safari-zone-encounter.ts b/src/data/mystery-encounters/encounters/safari-zone-encounter.ts index e2dd7849a49..000c5f24f8d 100644 --- a/src/data/mystery-encounters/encounters/safari-zone-encounter.ts +++ b/src/data/mystery-encounters/encounters/safari-zone-encounter.ts @@ -1,31 +1,167 @@ -import { - getHighestLevelPlayerPokemon, - koPlayerPokemon, - leaveEncounterWithoutBattle, - queueEncounterMessage, - setEncounterRewards, - showEncounterText, -} from "#app/data/mystery-encounters/mystery-encounter-utils"; -import { ModifierTier } from "#app/modifier/modifier-tier"; -import { GameOverPhase } from "#app/phases"; -import { randSeedInt } from "#app/utils"; +import { getRandomSpeciesByStarterTier, initFollowupOptionSelect, leaveEncounterWithoutBattle, updatePlayerMoney, } from "#app/data/mystery-encounters/mystery-encounter-utils"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import BattleScene from "../../../battle-scene"; -import IMysteryEncounter, { - MysteryEncounterBuilder, - MysteryEncounterTier, -} from "../mystery-encounter"; -import { EncounterOptionMode, MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; +import IMysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier, MysteryEncounterVariant } from "../mystery-encounter"; +import MysteryEncounterOption, { EncounterOptionMode, MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; +import { TrainerSlot } from "#app/data/trainer-config"; +import { ScanIvsPhase, SummonPhase, VictoryPhase } from "#app/phases"; +import i18next from "i18next"; +import { HiddenAbilityRateBoosterModifier, IvScannerModifier, PokemonHeldItemModifier } from "#app/modifier/modifier"; +import { EnemyPokemon } from "#app/field/pokemon"; +import { doPokeballBounceAnim, getPokeballAtlasKey, getPokeballTintColor, PokeballType } from "#app/data/pokeball"; +import { StatusEffect } from "#app/data/status-effect"; +import { addPokeballCaptureStars, addPokeballOpenParticles } from "#app/field/anims"; +import { achvs } from "#app/system/achv"; +import { Mode } from "#app/ui/ui"; +import { PartyOption, PartyUiMode } from "#app/ui/party-ui-handler"; +import { BattlerIndex } from "#app/battle"; +import { PlayerGender } from "#enums/player-gender"; +import { IntegerHolder, randSeedInt } from "#app/utils"; +import { getPokemonSpecies } from "#app/data/pokemon-species"; +import { MoneyRequirement } from "#app/data/mystery-encounters/mystery-encounter-requirements"; /** the i18n namespace for the encounter */ const namespace = "mysteryEncounter:safari_zone"; +/** + * SAFARI ZONE OPTIONS + * + * Catch and flee rate **multipliers** are calculated in the same way stat changes are (they range from -6/+6) + * https://bulbapedia.bulbagarden.net/wiki/Catch_rate#Great_Marsh_and_Johto_Safari_Zone + * + * Catch Rate calculation: + * catchRate = speciesCatchRate [1 to 255] * catchStageMultiplier [2/8 to 8/2] * ballCatchRate [1.5] + * + * Flee calculation: + * The harder a species is to catch, the higher its flee rate is + * (Caps at 50% base chance to flee for the hardest to catch Pokemon, before factoring in flee stage) + * fleeRate = ((255^2 - speciesCatchRate^2) / 255 / 2) [0 to 127.5] * fleeStageMultiplier [2/8 to 8/2] + * Flee chance = fleeRate / 255 + */ +const safariZoneOptions: MysteryEncounterOption[] = [ + new MysteryEncounterOptionBuilder() + .withOptionMode(EncounterOptionMode.DEFAULT) + .withDialogue({ + buttonLabel: `${namespace}_pokeball_option_label`, + buttonTooltip: `${namespace}_pokeball_option_tooltip`, + selected: [ + { + text: `${namespace}_pokeball_option_selected`, + }, + ], + }) + .withOptionPhase(async (scene: BattleScene) => { + // Throw a ball option + const pokemon = scene.currentBattle.mysteryEncounter.misc.pokemon; + const catchResult = await throwPokeball(scene, pokemon); + + if (catchResult) { + // You caught pokemon + scene.unshiftPhase(new VictoryPhase(scene, 0)); + // Check how many safari pokemon left + if (scene.currentBattle.mysteryEncounter.misc.safariPokemonRemaining > 0) { + await summonSafariPokemon(scene); + initFollowupOptionSelect(scene, { overrideOptions: safariZoneOptions, startingCursorIndex: 0, hideDescription: true }); + } else { + // End safari mode + leaveEncounterWithoutBattle(scene, true); + } + } else { + // Pokemon failed to catch, end turn + await doEndTurn(scene, 0); + } + return true; + }) + .build(), + new MysteryEncounterOptionBuilder() + .withOptionMode(EncounterOptionMode.DEFAULT) + .withDialogue({ + buttonLabel: `${namespace}_bait_option_label`, + buttonTooltip: `${namespace}_bait_option_tooltip`, + selected: [ + { + text: `${namespace}_bait_option_selected`, + }, + ], + }) + .withOptionPhase(async (scene: BattleScene) => { + // Throw bait option + const pokemon = scene.currentBattle.mysteryEncounter.misc.pokemon; + await throwBait(scene, pokemon); + + // 100% chance to increase catch stage +2 + tryChangeCatchStage(scene, 2); + // 80% chance to increase flee stage +1 + const fleeChangeResult = tryChangeFleeStage(scene, 1, 8); + if (!fleeChangeResult) { + scene.queueMessage(i18next.t(`${namespace}_pokemon_busy_eating`, { pokemonName: pokemon.name }), 0, null, 500); + } else { + scene.queueMessage(i18next.t(`${namespace}_pokemon_eating`, { pokemonName: pokemon.name }), 0, null, 500); + } + // TODO: throw bait with eat animation + // TODO: play bug bite sfx, maybe spike cannon? + + await doEndTurn(scene, 1); + return true; + }) + .build(), + new MysteryEncounterOptionBuilder() + .withOptionMode(EncounterOptionMode.DEFAULT) + .withDialogue({ + buttonLabel: `${namespace}_mud_option_label`, + buttonTooltip: `${namespace}_mud_option_tooltip`, + selected: [ + { + text: `${namespace}_mud_option_selected`, + }, + ], + }) + .withOptionPhase(async (scene: BattleScene) => { + // Throw mud option + const pokemon = scene.currentBattle.mysteryEncounter.misc.pokemon; + await throwMud(scene, pokemon); + // 100% chance to decrease flee stage -2 + tryChangeFleeStage(scene, -2); + // 80% chance to decrease catch stage -1 + const catchChangeResult = tryChangeCatchStage(scene, -1, 8); + if (!catchChangeResult) { + scene.queueMessage(i18next.t(`${namespace}_pokemon_beside_itself_angry`, { pokemonName: pokemon.name }), 0, null, 500); + } else { + scene.queueMessage(i18next.t(`${namespace}_pokemon_angry`, { pokemonName: pokemon.name }), 0, null, 500); + } + + await doEndTurn(scene, 2); + return true; + }) + .build(), + new MysteryEncounterOptionBuilder() + .withOptionMode(EncounterOptionMode.DEFAULT) + .withDialogue({ + buttonLabel: `${namespace}_flee_option_label`, + buttonTooltip: `${namespace}_flee_option_tooltip`, + }) + .withOptionPhase(async (scene: BattleScene) => { + // Flee option + const pokemon = scene.currentBattle.mysteryEncounter.misc.pokemon; + await doPlayerFlee(scene, pokemon); + // Check how many safari pokemon left + if (scene.currentBattle.mysteryEncounter.misc.safariPokemonRemaining > 0) { + await summonSafariPokemon(scene); + initFollowupOptionSelect(scene, { overrideOptions: safariZoneOptions, startingCursorIndex: 3, hideDescription: true }); + } else { + // End safari mode + leaveEncounterWithoutBattle(scene, true); + } + return true; + }) + .build() +]; + export const SafariZoneEncounter: IMysteryEncounter = - MysteryEncounterBuilder.withEncounterType( - MysteryEncounterType.SAFARI_ZONE - ) + MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.SAFARI_ZONE) .withEncounterTier(MysteryEncounterTier.GREAT) .withSceneWaveRangeRequirement(10, 180) // waves 2 to 180 + .withSceneRequirement(new MoneyRequirement(0, 2.75)) // Cost equal to 1 Max Revive .withHideIntroVisuals(false) .withIntroSpriteConfigs([ { @@ -33,133 +169,57 @@ export const SafariZoneEncounter: IMysteryEncounter = fileRoot: "mystery-encounters", hasShadow: true, x: 4, - y: 8, + y: 10, + yShadowOffset: 3, disableAnimation: true, // Re-enabled after option select }, ]) .withIntroDialogue([ { - text: `mysteryEncounter:${namespace}_intro_message`, + text: `${namespace}_intro_message`, }, ]) - .withTitle(`mysteryEncounter:${namespace}_title`) - .withDescription(`mysteryEncounter:${namespace}_description`) - .withQuery(`mysteryEncounter:${namespace}_query`) - .withOption( - new MysteryEncounterOptionBuilder() - .withOptionMode(EncounterOptionMode.DEFAULT) - .withDialogue({ - buttonLabel: "mysteryEncounter:${namespace}_option_1_label", - buttonTooltip: "mysteryEncounter:${namespace}_option_1_tooltip", - selected: [ - { - text: "mysteryEncounter:${namespace}_option_1_selected_message", - }, - ], - }) - .withPreOptionPhase(async (scene: BattleScene) => { - // Play animation - const introVisuals = - scene.currentBattle.mysteryEncounter.introVisuals; - introVisuals.spriteConfigs[0].disableAnimation = false; - introVisuals.playAnim(); - }) - .withOptionPhase(async (scene: BattleScene) => { - // Open the chest - const roll = randSeedInt(100); - if (roll > 60) { - // Choose between 2 COMMON / 2 GREAT tier items (40%) - setEncounterRewards(scene, { - guaranteedModifierTiers: [ - ModifierTier.COMMON, - ModifierTier.COMMON, - ModifierTier.GREAT, - ModifierTier.GREAT, - ], - }); - // Display result message then proceed to rewards - queueEncounterMessage( - scene, - "mysteryEncounter:${namespace}_option_1_normal_result" - ); - leaveEncounterWithoutBattle(scene); - } else if (roll > 40) { - // Choose between 3 ULTRA tier items (20%) - setEncounterRewards(scene, { - guaranteedModifierTiers: [ - ModifierTier.ULTRA, - ModifierTier.ULTRA, - ModifierTier.ULTRA, - ], - }); - // Display result message then proceed to rewards - queueEncounterMessage( - scene, - "mysteryEncounter:${namespace}_option_1_good_result" - ); - leaveEncounterWithoutBattle(scene); - } else if (roll > 36) { - // Choose between 2 ROGUE tier items (4%) - setEncounterRewards(scene, { - guaranteedModifierTiers: [ModifierTier.ROGUE, ModifierTier.ROGUE], - }); - // Display result message then proceed to rewards - queueEncounterMessage( - scene, - "mysteryEncounter:${namespace}_option_1_great_result" - ); - leaveEncounterWithoutBattle(scene); - } else if (roll > 35) { - // Choose 1 MASTER tier item (1%) - setEncounterRewards(scene, { - guaranteedModifierTiers: [ModifierTier.MASTER], - }); - // Display result message then proceed to rewards - queueEncounterMessage( - scene, - "mysteryEncounter:${namespace}_option_1_amazing_result" - ); - leaveEncounterWithoutBattle(scene); - } else { - // Your highest level unfainted Pok�mon gets OHKO. Progress with no rewards (35%) - const highestLevelPokemon = getHighestLevelPlayerPokemon( - scene, - true - ); - koPlayerPokemon(highestLevelPokemon); - - scene.currentBattle.mysteryEncounter.setDialogueToken( - "pokeName", - highestLevelPokemon.name - ); - // Show which Pokemon was KOed, then leave encounter with no rewards - // Does this synchronously so that game over doesn't happen over result message - await showEncounterText( - scene, - "mysteryEncounter:${namespace}_option_1_bad_result" - ).then(() => { - if ( - scene.getParty().filter((p) => p.isAllowedInBattle()).length === - 0 - ) { - // All pokemon fainted, game over - scene.clearPhaseQueue(); - scene.unshiftPhase(new GameOverPhase(scene)); - } else { - leaveEncounterWithoutBattle(scene); - } - }); - } - }) - .build() + .withTitle(`${namespace}_title`) + .withDescription(`${namespace}_description`) + .withQuery(`${namespace}_query`) + .withOption(new MysteryEncounterOptionBuilder() + .withOptionMode(EncounterOptionMode.DISABLED_OR_DEFAULT) + // TODO: update + .withSceneRequirement(new MoneyRequirement(0, 2.75)) // Cost equal to 1 Max Revive + .withDialogue({ + buttonLabel: `${namespace}_option_1_label`, + buttonTooltip: `${namespace}_option_1_tooltip`, + selected: [ + { + text: `${namespace}_option_1_selected_message`, + }, + ], + }) + .withOptionPhase(async (scene: BattleScene) => { + // Start safari encounter + const encounter = scene.currentBattle.mysteryEncounter; + encounter.encounterVariant = MysteryEncounterVariant.SAFARI_BATTLE; + encounter.misc = { + safariPokemonRemaining: 3 + }; + updatePlayerMoney(scene, -(encounter.options[0].requirements[0] as MoneyRequirement).requiredMoney); + scene.loadSe("PRSFX- Bug Bite", "battle_anims"); + scene.loadSe("PRSFX- Sludge Bomb2", "battle_anims"); + scene.loadSe("PRSFX- Taunt2", "battle_anims"); + await hideMysteryEncounterIntroVisuals(scene); + await summonSafariPokemon(scene); + initFollowupOptionSelect(scene, { overrideOptions: safariZoneOptions, hideDescription: true }); + return true; + }) + .build() ) .withSimpleOption( { - buttonLabel: "mysteryEncounter:${namespace}_option_2_label", - buttonTooltip: "mysteryEncounter:${namespace}_option_2_tooltip", + buttonLabel: `${namespace}_option_2_label`, + buttonTooltip: `${namespace}_option_2_tooltip`, selected: [ { - text: "mysteryEncounter:${namespace}_option_2_selected_message", + text: `${namespace}_option_2_selected_message`, }, ], }, @@ -170,3 +230,588 @@ export const SafariZoneEncounter: IMysteryEncounter = } ) .build(); + +function hideMysteryEncounterIntroVisuals(scene: BattleScene): Promise { + return new Promise(resolve => { + const introVisuals = scene.currentBattle.mysteryEncounter.introVisuals; + if (introVisuals) { + // Hide + scene.tweens.add({ + targets: introVisuals, + x: "+=16", + y: "-=16", + alpha: 0, + ease: "Sine.easeInOut", + duration: 750, + onComplete: () => { + scene.field.remove(introVisuals); + introVisuals.setVisible(false); + introVisuals.destroy(); + scene.currentBattle.mysteryEncounter.introVisuals = null; + resolve(true); + } + }); + } else { + resolve(true); + } + }); +} + +async function summonSafariPokemon(scene: BattleScene) { + const encounter = scene.currentBattle.mysteryEncounter; + // Message pokemon remaining + scene.queueMessage(i18next.t(`${namespace}_remaining_count`, { remainingCount: encounter.misc.safariPokemonRemaining}), null, true); + + // Generate pokemon using safariPokemonRemaining so they are always the same pokemon no matter how many turns are taken + // Safari pokemon roll twice on shiny and HA chances, but are otherwise normal + let enemySpecies; + let pokemon; + scene.executeWithSeedOffset(() => { + enemySpecies = getPokemonSpecies(getRandomSpeciesByStarterTier([0, 5])); + enemySpecies = getPokemonSpecies(enemySpecies.getWildSpeciesForLevel(scene.currentBattle.waveIndex, true, false, scene.gameMode)); + scene.currentBattle.enemyParty = []; + pokemon = scene.addEnemyPokemon(enemySpecies, scene.currentBattle.waveIndex, TrainerSlot.NONE, false); + + // Roll shiny twice + if (!pokemon.shiny) { + pokemon.trySetShiny(); + } + + // Roll HA twice + if (pokemon.species.abilityHidden) { + const hiddenIndex = pokemon.species.ability2 ? 2 : 1; + if (pokemon.abilityIndex < hiddenIndex) { + const hiddenAbilityChance = new IntegerHolder(256); + scene.applyModifiers(HiddenAbilityRateBoosterModifier, true, hiddenAbilityChance); + + const hasHiddenAbility = !randSeedInt(hiddenAbilityChance.value); + + if (hasHiddenAbility) { + pokemon.abilityIndex = hiddenIndex; + } + } + } + + pokemon.calculateStats(); + + scene.currentBattle.enemyParty[0] = pokemon; + }, scene.currentBattle.waveIndex + encounter.misc.safariPokemonRemaining); + + scene.gameData.setPokemonSeen(pokemon, true); + await pokemon.loadAssets(); + + // Reset safari catch and flee rates + encounter.misc.catchStage = 0; + encounter.misc.fleeStage = 0; + encounter.misc.pokemon = pokemon; + encounter.misc.safariPokemonRemaining -= 1; + + scene.unshiftPhase(new SummonPhase(scene, 0, false)); + + scene.ui.showText(i18next.t("battle:singleWildAppeared", { pokemonName: pokemon.name }), null, () => { + const ivScannerModifier = scene.findModifier(m => m instanceof IvScannerModifier); + if (ivScannerModifier) { + scene.pushPhase(new ScanIvsPhase(scene, pokemon.getBattlerIndex(), Math.min(ivScannerModifier.getStackCount() * 2, 6))); + } + }, 1500); +} + +async function throwPokeball(scene: BattleScene, pokemon: EnemyPokemon): Promise { + const pokeballType: PokeballType = PokeballType.POKEBALL; + const originalY: number = pokemon.y; + + const baseCatchRate = pokemon.species.catchRate; + // Catch stage ranges from -6 to +6 (like stat boost stages) + const safariCatchStage = scene.currentBattle.mysteryEncounter.misc.catchStage; + // Catch modifier ranges from 2/8 (-6 stage) to 8/2 (+6) + const safariModifier = (2 + Math.min(Math.max(safariCatchStage, 0), 6)) / (2 - Math.max(Math.min(safariCatchStage, 0), -6)); + // Catch rate same as safari ball + const pokeballMultiplier = 1.5; + const catchRate = Math.round(baseCatchRate * pokeballMultiplier * safariModifier); + const ballTwitchRate = Math.round(1048560 / Math.sqrt(Math.sqrt(16711680 / catchRate))); + const fpOffset = pokemon.getFieldPositionOffset(); + const catchSuccess = (ballTwitchRate / 65536) * (ballTwitchRate / 65536) * (ballTwitchRate / 65536); + console.log("Catch success rate: " + catchSuccess); + + const pokeballAtlasKey = getPokeballAtlasKey(pokeballType); + const pokeball: Phaser.GameObjects.Sprite = scene.addFieldSprite(16 + 75, 80 + 25, "pb", pokeballAtlasKey); + pokeball.setOrigin(0.5, 0.625); + scene.field.add(pokeball); + + scene.playSound("pb_throw"); + scene.time.delayedCall(300, () => { + scene.field.moveBelow(pokeball as Phaser.GameObjects.GameObject, pokemon); + }); + + return new Promise(resolve => { + scene.trainer.setTexture(`trainer_${scene.gameData.gender === PlayerGender.FEMALE ? "f" : "m"}_back_pb`); + scene.time.delayedCall(512, () => { + // Trainer throw frames + scene.trainer.setFrame("2"); + scene.time.delayedCall(256, () => { + scene.trainer.setFrame("3"); + scene.time.delayedCall(768, () => { + scene.trainer.setTexture(`trainer_${scene.gameData.gender === PlayerGender.FEMALE ? "f" : "m"}_back`); + }); + }); + + // Pokeball move and catch logic + scene.tweens.add({ + targets: pokeball, + x: { value: 236 + fpOffset[0], ease: "Linear" }, + y: { value: 16 + fpOffset[1], ease: "Cubic.easeOut" }, + duration: 500, + onComplete: () => { + pokeball.setTexture("pb", `${pokeballAtlasKey}_opening`); + scene.time.delayedCall(17, () => pokeball.setTexture("pb", `${pokeballAtlasKey}_open`)); + scene.playSound("pb_rel"); + pokemon.tint(getPokeballTintColor(pokeballType)); + + addPokeballOpenParticles(scene, pokeball.x, pokeball.y, pokeballType); + + scene.tweens.add({ + targets: pokemon, + duration: 500, + ease: "Sine.easeIn", + scale: 0.25, + y: 20, + onComplete: () => { + pokeball.setTexture("pb", `${pokeballAtlasKey}_opening`); + pokemon.setVisible(false); + scene.playSound("pb_catch"); + scene.time.delayedCall(17, () => pokeball.setTexture("pb", `${pokeballAtlasKey}`)); + + const doShake = () => { + let shakeCount = 0; + const pbX = pokeball.x; + const shakeCounter = scene.tweens.addCounter({ + from: 0, + to: 1, + repeat: 4, + yoyo: true, + ease: "Cubic.easeOut", + duration: 250, + repeatDelay: 500, + onUpdate: t => { + if (shakeCount && shakeCount < 4) { + const value = t.getValue(); + const directionMultiplier = shakeCount % 2 === 1 ? 1 : -1; + pokeball.setX(pbX + value * 4 * directionMultiplier); + pokeball.setAngle(value * 27.5 * directionMultiplier); + } + }, + onRepeat: () => { + if (!pokemon.species.isObtainable()) { + shakeCounter.stop(); + failCatch(scene, pokemon, originalY, pokeball, pokeballType).then(() => resolve(false)); + } else if (shakeCount++ < 3) { + if (randSeedInt(65536) < ballTwitchRate) { + scene.playSound("pb_move"); + } else { + shakeCounter.stop(); + failCatch(scene, pokemon, originalY, pokeball, pokeballType).then(() => resolve(false)); + } + } else { + scene.playSound("pb_lock"); + addPokeballCaptureStars(scene, pokeball); + + const pbTint = scene.add.sprite(pokeball.x, pokeball.y, "pb", "pb"); + pbTint.setOrigin(pokeball.originX, pokeball.originY); + pbTint.setTintFill(0); + pbTint.setAlpha(0); + scene.field.add(pbTint); + scene.tweens.add({ + targets: pbTint, + alpha: 0.375, + duration: 200, + easing: "Sine.easeOut", + onComplete: () => { + scene.tweens.add({ + targets: pbTint, + alpha: 0, + duration: 200, + easing: "Sine.easeIn", + onComplete: () => pbTint.destroy() + }); + } + }); + } + }, + onComplete: () => { + catchPokemon(scene, pokemon, pokeball, pokeballType).then(() => resolve(true)); + } + }); + }; + + scene.time.delayedCall(250, () => doPokeballBounceAnim(scene, pokeball, 16, 72, 350, doShake)); + } + }); + } + }); + }); + }); +} + +async function throwBait(scene: BattleScene, pokemon: EnemyPokemon): Promise { + // TODO: replace with bait + const pokeballType: PokeballType = PokeballType.POKEBALL; + const originalY: number = pokemon.y; + + const fpOffset = pokemon.getFieldPositionOffset(); + const pokeballAtlasKey = getPokeballAtlasKey(pokeballType); + const bait: Phaser.GameObjects.Sprite = scene.addFieldSprite(16 + 75, 80 + 25, "pb", pokeballAtlasKey); + bait.setOrigin(0.5, 0.625); + scene.field.add(bait); + + scene.playSound("pb_throw"); + // scene.time.delayedCall(300, () => { + // scene.field.moveBelow(pokemon, pokeball as Phaser.GameObjects.GameObject); + // }); + + return new Promise(resolve => { + scene.trainer.setTexture(`trainer_${scene.gameData.gender === PlayerGender.FEMALE ? "f" : "m"}_back_pb`); + scene.time.delayedCall(512, () => { + // Trainer throw frames + scene.trainer.setFrame("2"); + scene.time.delayedCall(256, () => { + scene.trainer.setFrame("3"); + scene.time.delayedCall(768, () => { + scene.trainer.setTexture(`trainer_${scene.gameData.gender === PlayerGender.FEMALE ? "f" : "m"}_back`); + }); + }); + + // Pokeball move and catch logic + scene.tweens.add({ + targets: bait, + x: { value: 210 + fpOffset[0], ease: "Linear" }, + y: { value: 55 + fpOffset[1], ease: "Cubic.easeOut" }, + duration: 500, + onComplete: () => { + // Bait frame 2 + bait.setTexture("pb", `${pokeballAtlasKey}_opening`); + // Bait frame 3 + scene.time.delayedCall(17, () => bait.setTexture("pb", `${pokeballAtlasKey}_open`)); + // scene.playSound("pb_rel"); + // pokemon.tint(getPokeballTintColor(pokeballType)); + + // addPokeballOpenParticles(scene, pokeball.x, pokeball.y, pokeballType); + scene.time.delayedCall(512, () => { + scene.tweens.add({ + targets: pokemon, + duration: 200, + ease: "Cubic.easeOut", + yoyo: true, + y: originalY - 30, + loop: 2, + onStart: () => { + scene.playSound("PRSFX- Bug Bite"); + }, + onLoop: () => { + scene.playSound("PRSFX- Bug Bite"); + }, + onComplete: () => { + resolve(true); + bait.destroy(); + } + }); + }); + } + }); + }); + }); +} + +async function throwMud(scene: BattleScene, pokemon: EnemyPokemon): Promise { + // TODO: replace with mud + const pokeballType: PokeballType = PokeballType.POKEBALL; + const originalY: number = pokemon.y; + + const fpOffset = pokemon.getFieldPositionOffset(); + const pokeballAtlasKey = getPokeballAtlasKey(pokeballType); + const mud: Phaser.GameObjects.Sprite = scene.addFieldSprite(16 + 75, 80 + 25, "pb", pokeballAtlasKey); + mud.setOrigin(0.5, 0.625); + scene.field.add(mud); + + scene.playSound("pb_throw"); + + return new Promise(resolve => { + scene.trainer.setTexture(`trainer_${scene.gameData.gender === PlayerGender.FEMALE ? "f" : "m"}_back_pb`); + scene.time.delayedCall(512, () => { + // Trainer throw frames + scene.trainer.setFrame("2"); + scene.time.delayedCall(256, () => { + scene.trainer.setFrame("3"); + scene.time.delayedCall(768, () => { + scene.trainer.setTexture(`trainer_${scene.gameData.gender === PlayerGender.FEMALE ? "f" : "m"}_back`); + }); + }); + + // Pokeball move and catch logic + scene.tweens.add({ + targets: mud, + x: { value: 230 + fpOffset[0], ease: "Linear" }, + y: { value: 55 + fpOffset[1], ease: "Cubic.easeOut" }, + duration: 500, + onComplete: () => { + // Bait frame 2 + mud.setTexture("pb", `${pokeballAtlasKey}_opening`); + // Bait frame 3 + scene.time.delayedCall(17, () => mud.setTexture("pb", `${pokeballAtlasKey}_open`)); + scene.playSound("PRSFX- Sludge Bomb2"); + // pokemon.tint(getPokeballTintColor(pokeballType)); + + // addPokeballOpenParticles(scene, pokeball.x, pokeball.y, pokeballType); + scene.time.delayedCall(1536, () => { + mud.destroy(); + scene.tweens.add({ + targets: pokemon, + duration: 300, + ease: "Cubic.easeOut", + yoyo: true, + y: originalY - 20, + loop: 1, + onStart: () => { + scene.playSound("PRSFX- Taunt2"); + }, + onLoop: () => { + scene.playSound("PRSFX- Taunt2"); + }, + onComplete: () => { + resolve(true); + } + }); + }); + } + }); + }); + }); +} + +async function failCatch(scene: BattleScene, pokemon: EnemyPokemon, originalY: number, pokeball: Phaser.GameObjects.Sprite, pokeballType: PokeballType) { + return new Promise(resolve => { + scene.playSound("pb_rel"); + pokemon.setY(originalY); + if (pokemon.status?.effect !== StatusEffect.SLEEP) { + pokemon.cry(pokemon.getHpRatio() > 0.25 ? undefined : { rate: 0.85 }); + } + pokemon.tint(getPokeballTintColor(pokeballType)); + pokemon.setVisible(true); + pokemon.untint(250, "Sine.easeOut"); + + const pokeballAtlasKey = getPokeballAtlasKey(pokeballType); + pokeball.setTexture("pb", `${pokeballAtlasKey}_opening`); + scene.time.delayedCall(17, () => pokeball.setTexture("pb", `${pokeballAtlasKey}_open`)); + + scene.tweens.add({ + targets: pokemon, + duration: 250, + ease: "Sine.easeOut", + scale: 1 + }); + + scene.currentBattle.lastUsedPokeball = pokeballType; + removePb(scene, pokeball); + + scene.ui.showText(i18next.t("battle:pokemonBrokeFree", { pokemonName: pokemon.name }), null, () => resolve(), null, true); + }); +} + +async function catchPokemon(scene: BattleScene, pokemon: EnemyPokemon, pokeball: Phaser.GameObjects.Sprite, pokeballType: PokeballType): Promise { + scene.unshiftPhase(new VictoryPhase(scene, BattlerIndex.ENEMY)); + + const speciesForm = !pokemon.fusionSpecies ? pokemon.getSpeciesForm() : pokemon.getFusionSpeciesForm(); + + if (speciesForm.abilityHidden && (pokemon.fusionSpecies ? pokemon.fusionAbilityIndex : pokemon.abilityIndex) === speciesForm.getAbilityCount() - 1) { + scene.validateAchv(achvs.HIDDEN_ABILITY); + } + + if (pokemon.species.subLegendary) { + scene.validateAchv(achvs.CATCH_SUB_LEGENDARY); + } + + if (pokemon.species.legendary) { + scene.validateAchv(achvs.CATCH_LEGENDARY); + } + + if (pokemon.species.mythical) { + scene.validateAchv(achvs.CATCH_MYTHICAL); + } + + scene.pokemonInfoContainer.show(pokemon, true); + + scene.gameData.updateSpeciesDexIvs(pokemon.species.getRootSpeciesId(true), pokemon.ivs); + + return new Promise(resolve => { + scene.ui.showText(i18next.t("battle:pokemonCaught", { pokemonName: pokemon.name }), null, () => { + const end = () => { + scene.pokemonInfoContainer.hide(); + removePb(scene, pokeball); + resolve(); + }; + const removePokemon = () => { + scene.field.remove(pokemon, true); + }; + const addToParty = () => { + const newPokemon = pokemon.addToParty(pokeballType); + const modifiers = scene.findModifiers(m => m instanceof PokemonHeldItemModifier, false); + if (scene.getParty().filter(p => p.isShiny()).length === 6) { + scene.validateAchv(achvs.SHINY_PARTY); + } + Promise.all(modifiers.map(m => scene.addModifier(m, true))).then(() => { + scene.updateModifiers(true); + removePokemon(); + if (newPokemon) { + newPokemon.loadAssets().then(end); + } else { + end(); + } + }); + }; + Promise.all([pokemon.hideInfo(), scene.gameData.setPokemonCaught(pokemon)]).then(() => { + if (scene.getParty().length === 6) { + const promptRelease = () => { + scene.ui.showText(i18next.t("battle:partyFull", { pokemonName: pokemon.name }), null, () => { + scene.pokemonInfoContainer.makeRoomForConfirmUi(); + scene.ui.setMode(Mode.CONFIRM, () => { + scene.ui.setMode(Mode.PARTY, PartyUiMode.RELEASE, 0, (slotIndex: integer, _option: PartyOption) => { + scene.ui.setMode(Mode.MESSAGE).then(() => { + if (slotIndex < 6) { + addToParty(); + } else { + promptRelease(); + } + }); + }); + }, () => { + scene.ui.setMode(Mode.MESSAGE).then(() => { + removePokemon(); + end(); + }); + }); + }); + }; + promptRelease(); + } else { + addToParty(); + } + }); + }, 0, true); + }); +} + +function removePb(scene: BattleScene, pokeball: Phaser.GameObjects.Sprite) { + scene.tweens.add({ + targets: pokeball, + duration: 250, + delay: 250, + ease: "Sine.easeIn", + alpha: 0, + onComplete: () => pokeball.destroy() + }); +} + +function isPokemonFlee(pokemon: EnemyPokemon, fleeStage: number): boolean { + const speciesCatchRate = pokemon.species.catchRate; + const fleeModifier = (2 + Math.min(Math.max(fleeStage, 0), 6)) / (2 - Math.max(Math.min(fleeStage, 0), -6)); + const fleeRate = (255 * 255 - speciesCatchRate * speciesCatchRate) / 255 / 2 * fleeModifier; + console.log("Flee rate: " + fleeRate); + const roll = randSeedInt(256); + console.log("Roll: " + roll); + return roll < fleeRate; +} + +async function doPokemonFlee(scene: BattleScene, pokemon: EnemyPokemon): Promise { + const fleeAnimation = new Promise(resolve => { + // Ease pokemon out + scene.tweens.add({ + targets: pokemon, + x: "+=16", + y: "-=16", + alpha: 0, + duration: 1000, + ease: "Sine.easeIn", + scale: pokemon.getSpriteScale(), + onComplete: () => { + pokemon.setVisible(false); + scene.field.remove(pokemon, true); + resolve(); + } + }); + }); + + const prompt = new Promise(resolve => { + scene.ui.showText(i18next.t("battle:pokemonFled", { pokemonName: pokemon.name }), 0, () => resolve(), 500); + }); + + await Promise.all([fleeAnimation, prompt]); +} + +async function doPlayerFlee(scene: BattleScene, pokemon: EnemyPokemon): Promise { + const fleeAnimation = new Promise(resolve => { + // Ease pokemon out + scene.tweens.add({ + targets: pokemon, + x: "+=16", + y: "-=16", + alpha: 0, + duration: 1000, + ease: "Sine.easeIn", + scale: pokemon.getSpriteScale(), + onComplete: () => { + pokemon.setVisible(false); + scene.field.remove(pokemon, true); + resolve(); + } + }); + }); + + const prompt = new Promise(resolve => { + scene.ui.showText(i18next.t("battle:playerFled", { pokemonName: pokemon.name }), 0, () => resolve(), 500); + }); + + await Promise.all([fleeAnimation, prompt]); +} + +function tryChangeFleeStage(scene: BattleScene, change: number, chance?: number): boolean { + if (chance && randSeedInt(10) >= chance) { + console.log("Failed to change flee stage"); + return false; + } + const currentFleeStage = scene.currentBattle.mysteryEncounter.misc.fleeStage ?? 0; + // console.log("currentFleeStage: " + currentFleeStage); + scene.currentBattle.mysteryEncounter.misc.fleeStage = Math.min(Math.max(currentFleeStage + change, -6), 6); + return true; +} + +function tryChangeCatchStage(scene: BattleScene, change: number, chance?: number): boolean { + if (chance && randSeedInt(10) >= chance) { + console.log("Failed to change catch stage"); + return false; + } + const currentCatchStage = scene.currentBattle.mysteryEncounter.misc.catchStage ?? 0; + // console.log("currentCatchStage: " + currentCatchStage); + scene.currentBattle.mysteryEncounter.misc.catchStage = Math.min(Math.max(currentCatchStage + change, -6), 6); + return true; +} + +async function doEndTurn(scene: BattleScene, cursorIndex: number, message?: string) { + const pokemon = scene.currentBattle.mysteryEncounter.misc.pokemon; + console.log("fleeStage: " + scene.currentBattle.mysteryEncounter.misc.fleeStage); + console.log("catchStage: " + scene.currentBattle.mysteryEncounter.misc.catchStage); + const isFlee = isPokemonFlee(pokemon, scene.currentBattle.mysteryEncounter.misc.fleeStage); + if (isFlee) { + // Pokemon flees! + await doPokemonFlee(scene, pokemon); + // Check how many safari pokemon left + if (scene.currentBattle.mysteryEncounter.misc.safariPokemonRemaining > 0) { + await summonSafariPokemon(scene); + initFollowupOptionSelect(scene, { overrideOptions: safariZoneOptions, startingCursorIndex: cursorIndex, hideDescription: true }); + } else { + // End safari mode + leaveEncounterWithoutBattle(scene, true); + } + } else { + scene.queueMessage(i18next.t(`${namespace}_pokemon_watching`, { pokemonName: pokemon.name }), 0, null, 500); + initFollowupOptionSelect(scene, { overrideOptions: safariZoneOptions, startingCursorIndex: cursorIndex, hideDescription: 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 6018b651639..8bfd6daa9f9 100644 --- a/src/data/mystery-encounters/encounters/shady-vitamin-dealer-encounter.ts +++ b/src/data/mystery-encounters/encounters/shady-vitamin-dealer-encounter.ts @@ -28,15 +28,17 @@ export const ShadyVitaminDealerEncounter: IMysteryEncounter = fileRoot: "pokemon", hasShadow: true, repeat: true, - x: 10, - y: -1, + x: 12, + y: -5, + yShadowOffset: -5 }, { spriteKey: "b2w2_veteran_m", fileRoot: "mystery-encounters", hasShadow: true, - x: -10, - y: 2, + x: -12, + y: 3, + yShadowOffset: 3 }, ]) .withIntroDialogue([ diff --git a/src/data/mystery-encounters/mystery-encounter-utils.ts b/src/data/mystery-encounters/mystery-encounter-utils.ts index 5c6e7eefa8d..e0c8f73e569 100644 --- a/src/data/mystery-encounters/mystery-encounter-utils.ts +++ b/src/data/mystery-encounters/mystery-encounter-utils.ts @@ -10,7 +10,7 @@ import Trainer, { TrainerVariant } from "../../field/trainer"; import { ExpBalanceModifier, ExpShareModifier, MultipleParticipantExpBonusModifier, PokemonExpBoosterModifier } from "#app/modifier/modifier"; import { CustomModifierSettings, getModifierPoolForType, ModifierPoolType, ModifierType, ModifierTypeFunc, ModifierTypeGenerator, ModifierTypeOption, modifierTypes, PokemonHeldItemModifierType, regenerateModifierPoolThresholds } from "#app/modifier/modifier-type"; import { BattleEndPhase, EggLapsePhase, ExpPhase, ModifierRewardPhase, SelectModifierPhase, ShowPartyExpBarPhase, TrainerVictoryPhase } from "#app/phases"; -import { MysteryEncounterBattlePhase, MysteryEncounterRewardsPhase } from "#app/phases/mystery-encounter-phase"; +import { MysteryEncounterBattlePhase, MysteryEncounterPhase, MysteryEncounterRewardsPhase } from "#app/phases/mystery-encounter-phase"; import * as Utils from "../../utils"; import { isNullOrUndefined } from "#app/utils"; import { TrainerType } from "#enums/trainer-type"; @@ -27,6 +27,7 @@ import { WIGHT_INCREMENT_ON_SPAWN_MISS } from "#app/data/mystery-encounters/myst import { getTextWithColors, TextStyle } from "#app/ui/text"; import * as Overrides from "#app/overrides"; import { UiTheme } from "#enums/ui-theme"; +import { MysteryEncounterUiSettings } from "#app/ui/mystery-encounter-ui-handler"; /** * @@ -427,6 +428,11 @@ export function updatePlayerMoney(scene: BattleScene, changeValue: number, playS if (playSound) { scene.playSound("buy"); } + if (changeValue < 0) { + scene.queueMessage(i18next.t("mysteryEncounter:paid_money", { amount: -changeValue }), null, true); + } else { + scene.queueMessage(i18next.t("mysteryEncounter:receive_money", { amount: changeValue }), null, true); + } } /** @@ -459,7 +465,7 @@ export function generateModifierTypeOption(scene: BattleScene, modifier: () => M } /** - * + * This function is intended for use inside onPreOptionPhase() of an encounter option * @param scene * @param onPokemonSelected - Any logic that needs to be performed when Pokemon is chosen * If a second option needs to be selected, onPokemonSelected should return a OptionSelectItem[] object @@ -674,6 +680,16 @@ export function setEncounterExp(scene: BattleScene, participantIds: integer[], b }; } +/** + * Can be used to exit an encounter without any battles or followup + * Will skip any shops and rewards, and queue the next encounter phase as normal + * @param scene + * @param followupOptionSelectSettings + */ +export function initFollowupOptionSelect(scene: BattleScene, followupOptionSelectSettings: MysteryEncounterUiSettings) { + scene.pushPhase(new MysteryEncounterPhase(scene, followupOptionSelectSettings)); +} + /** * Can be used to exit an encounter without any battles or followup * Will skip any shops and rewards, and queue the next encounter phase as normal @@ -688,7 +704,9 @@ export function leaveEncounterWithoutBattle(scene: BattleScene, addHealPhase: bo } export function handleMysteryEncounterVictory(scene: BattleScene, addHealPhase: boolean = false) { - if (scene.currentBattle.mysteryEncounter.encounterVariant === MysteryEncounterVariant.NO_BATTLE) { + if (scene.currentBattle.mysteryEncounter.encounterVariant === MysteryEncounterVariant.SAFARI_BATTLE) { + scene.pushPhase(new MysteryEncounterRewardsPhase(scene, addHealPhase)); + } else if (scene.currentBattle.mysteryEncounter.encounterVariant === MysteryEncounterVariant.NO_BATTLE) { scene.pushPhase(new EggLapsePhase(scene)); scene.pushPhase(new MysteryEncounterRewardsPhase(scene, addHealPhase)); } else if (!scene.getEnemyParty().find(p => scene.currentBattle.mysteryEncounter.encounterVariant !== MysteryEncounterVariant.TRAINER_BATTLE ? p.isOnField() : !p?.isFainted(true))) { diff --git a/src/data/mystery-encounters/mystery-encounter.ts b/src/data/mystery-encounters/mystery-encounter.ts index e02639939b8..0be21d1520f 100644 --- a/src/data/mystery-encounters/mystery-encounter.ts +++ b/src/data/mystery-encounters/mystery-encounter.ts @@ -24,7 +24,8 @@ export enum MysteryEncounterVariant { TRAINER_BATTLE, WILD_BATTLE, BOSS_BATTLE, - NO_BATTLE + NO_BATTLE, + SAFARI_BATTLE } export enum MysteryEncounterTier { @@ -118,6 +119,18 @@ export default interface IMysteryEncounter { */ expMultiplier?: number; + /** + * When true, will never queue PostSummon phases from a SummonPhase + * Defaults to false + */ + disableAllPostSummon?: boolean; + + /** + * Used for keeping RNG consistent on session resets, but increments when cycling through multiple "Encounters" on the same wave + * You should never need to modify this + */ + seedOffset?: any; + /** * Generic property to set any custom data required for the encounter * Extremely useful for carrying state/data between onPreOptionPhase/onOptionPhase/onPostOptionPhase diff --git a/src/data/mystery-encounters/mystery-encounters.ts b/src/data/mystery-encounters/mystery-encounters.ts index c384606f5e3..a53f12a0bfa 100644 --- a/src/data/mystery-encounters/mystery-encounters.ts +++ b/src/data/mystery-encounters/mystery-encounters.ts @@ -10,6 +10,7 @@ import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { DepartmentStoreSaleEncounter } from "./encounters/department-store-sale-encounter"; import { ShadyVitaminDealerEncounter } from "./encounters/shady-vitamin-dealer-encounter"; import { FieldTripEncounter } from "./encounters/field-trip-encounter"; +import { SafariZoneEncounter } from "#app/data/mystery-encounters/encounters/safari-zone-encounter"; // Spawn chance: (BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT + WIGHT_INCREMENT_ON_SPAWN_MISS * ) / 256 export const BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT = 1; @@ -213,6 +214,7 @@ export function initMysteryEncounters() { allMysteryEncounters[MysteryEncounterType.DEPARTMENT_STORE_SALE] = DepartmentStoreSaleEncounter; allMysteryEncounters[MysteryEncounterType.SHADY_VITAMIN_DEALER] = ShadyVitaminDealerEncounter; allMysteryEncounters[MysteryEncounterType.FIELD_TRIP] = FieldTripEncounter; + allMysteryEncounters[MysteryEncounterType.SAFARI_ZONE] = SafariZoneEncounter; // Add extreme encounters to biome map extremeBiomeEncounters.forEach(encounter => { diff --git a/src/field/mystery-encounter-intro.ts b/src/field/mystery-encounter-intro.ts index 1b0fb3bca01..2c606ad61cc 100644 --- a/src/field/mystery-encounter-intro.ts +++ b/src/field/mystery-encounter-intro.ts @@ -11,6 +11,7 @@ export class MysteryEncounterSpriteConfig { tint?: number; x?: number; // X offset y?: number; // Y offset + yShadowOffset?: number; scale?: number; isItem?: boolean; // For item sprites, set to true } @@ -37,10 +38,10 @@ export default class MysteryEncounterIntroVisuals extends Phaser.GameObjects.Con return; } - const getSprite = (spriteKey: string, hasShadow?: boolean) => { + const getSprite = (spriteKey: string, hasShadow?: boolean, yShadowOffset?: number) => { const ret = this.scene.addFieldSprite(0, 0, spriteKey); ret.setOrigin(0.5, 1); - ret.setPipeline(this.scene.spritePipeline, { tone: [0.0, 0.0, 0.0, 0.0], hasShadow: !!hasShadow }); + ret.setPipeline(this.scene.spritePipeline, { tone: [0.0, 0.0, 0.0, 0.0], hasShadow: !!hasShadow, yShadowOffset: yShadowOffset ?? 0 }); return ret; }; @@ -62,7 +63,7 @@ export default class MysteryEncounterIntroVisuals extends Phaser.GameObjects.Con let sprite: GameObjects.Sprite; let tintSprite: GameObjects.Sprite; if (!config.isItem) { - sprite = getSprite(config.spriteKey, config.hasShadow); + sprite = getSprite(config.spriteKey, config.hasShadow, config.yShadowOffset); tintSprite = getSprite(config.spriteKey); } else { sprite = getItemSprite(config.spriteKey); @@ -83,8 +84,8 @@ export default class MysteryEncounterIntroVisuals extends Phaser.GameObjects.Con tintSprite.setPosition(origin + config.x, tintSprite.y); } if (config.y) { - sprite.setPosition(sprite.x, config.y); - tintSprite.setPosition(tintSprite.x, config.y); + sprite.setPosition(sprite.x, sprite.y + config.y); + tintSprite.setPosition(tintSprite.x, tintSprite.y + config.y); } } else { // Single sprite diff --git a/src/locales/en/battle.ts b/src/locales/en/battle.ts index b10e5507b3b..6deaf4496a0 100644 --- a/src/locales/en/battle.ts +++ b/src/locales/en/battle.ts @@ -16,6 +16,9 @@ export const battle: SimpleTranslationEntries = { "moneyWon": "You got\n₽{{moneyAmount}} for winning!", "moneyPickedUp": "You picked up ₽{{moneyAmount}}!", "pokemonCaught": "{{pokemonName}} was caught!", + "pokemonBrokeFree": "Oh no!\nThe Pokémon broke free!", + "pokemonFled": "The wild {{pokemonName}} fled!", + "playerFled": "You fled from the {{pokemonName}}!", "addedAsAStarter": "{{pokemonName}} has been\nadded as a starter!", "partyFull": "Your party is full.\nRelease a Pokémon to make room for {{pokemonName}}?", "pokemon": "Pokémon", diff --git a/src/locales/en/mystery-encounter.ts b/src/locales/en/mystery-encounter.ts index 6ba84f6142b..a13e35a4474 100644 --- a/src/locales/en/mystery-encounter.ts +++ b/src/locales/en/mystery-encounter.ts @@ -17,6 +17,10 @@ export const mysteryEncounter: SimpleTranslationEntries = { // 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}}!", + // Mystery Encounters -- Common Tier "mysterious_chest_intro_message": "You found...@d{32} a chest?", @@ -125,7 +129,7 @@ export const mysteryEncounter: SimpleTranslationEntries = { "field_trip_outro_good": "Thank you so much for your kindness!\nI hope the items I had were helpful!", "field_trip_outro_bad": "Come along children, we'll\nfind a better demonstration elsewhere.", - // Mystery Encounters -- Uncommon Tier + // Mystery Encounters -- Great Tier "mysterious_challengers_intro_message": "Mysterious challengers have appeared!", "mysterious_challengers_title": "Mysterious Challengers", @@ -140,7 +144,35 @@ export const mysteryEncounter: SimpleTranslationEntries = { "mysterious_challengers_option_selected_message": "The trainer steps forward...", "mysterious_challengers_outro_win": "The mysterious challenger was defeated!", - // Mystery Encounters -- Rare Tier + "safari_zone_intro_message": "It's a safari zone!", + "safari_zone_title": "The Safari Zone", + "safari_zone_description": "There are all kinds of rare and special Pokémon that can be found here!\nIf you choose to enter, you'll have a time limit of 3 wild encounters where you can try to catch these special Pokémon.\nBeware, though. These Pokémon may flee before you're able to catch them!", + "safari_zone_query": "Would you like to enter?", + "safari_zone_option_1_label": "Enter", + "safari_zone_option_1_tooltip": "(-) Pay {{option1Money, money}}\n@[SUMMARY_GREEN]{(?) Safari Zone}", + "safari_zone_option_2_label": "Leave", + "safari_zone_option_2_tooltip": "(-) No Rewards", + "safari_zone_option_1_selected_message": "Time to test your luck.", + "safari_zone_option_2_selected_message": "You hurry along your way,\nwith a slight feeling of regret.", + "safari_zone_pokeball_option_label": "Throw a Pokéball", + "safari_zone_pokeball_option_tooltip": "(+) Throw a Pokéball", + "safari_zone_pokeball_option_selected": "You throw a Pokéball!", + "safari_zone_bait_option_label": "Throw bait", + "safari_zone_bait_option_tooltip": "(+) Increases Capture Rate\n(-) Chance to Increase Flee Rate", + "safari_zone_bait_option_selected": "You throw some bait!", + "safari_zone_mud_option_label": "Throw mud", + "safari_zone_mud_option_tooltip": "(+) Decreases Flee Rate\n(-) Chance to Decrease Capture Rate", + "safari_zone_mud_option_selected": "You throw some mud!", + "safari_zone_flee_option_label": "Flee", + "safari_zone_flee_option_tooltip": "(?) Flee from this Pokémon", + "safari_zone_pokemon_watching": "{{pokemonName}} is watching carefully!", + "safari_zone_pokemon_eating": "{{pokemonName}} is eating!", + "safari_zone_pokemon_busy_eating": "{{pokemonName}} is busy eating!", + "safari_zone_pokemon_angry": "{{pokemonName}} is angry!", + "safari_zone_pokemon_beside_itself_angry": "{{pokemonName}} is beside itself with anger!", + "safari_zone_remaining_count": "{{remainingCount}} Pokémon remaining!", + + // Mystery Encounters -- Ultra Tier "training_session_intro_message": "You've come across some\ntraining tools and supplies.", "training_session_title": "Training Session", @@ -163,7 +195,7 @@ export const mysteryEncounter: SimpleTranslationEntries = { $Its ability was changed to {{ability}}!`, "training_session_outro_win": "That was a successful training session!", - // Mystery Encounters -- Super Rare Tier + // Mystery Encounters -- Rogue Tier "dark_deal_intro_message": "A strange man in a tattered coat\nstands in your way...", "dark_deal_speaker": "Shady Guy", diff --git a/src/phases.ts b/src/phases.ts index 4be1305c8b7..9bc61aa8454 100644 --- a/src/phases.ts +++ b/src/phases.ts @@ -1650,7 +1650,7 @@ export class SummonPhase extends PartyMemberPokemonPhase { pokemon.untint(250, "Sine.easeIn"); this.scene.updateFieldScale(); pokemon.x += 16; - pokemon.y -= 16; + pokemon.y -= 20; pokemon.alpha = 0; // Ease pokemon in @@ -1680,7 +1680,9 @@ export class SummonPhase extends PartyMemberPokemonPhase { pokemon.resetTurnData(); - if (!this.loaded || this.scene.currentBattle.battleType === BattleType.TRAINER || this.scene.currentBattle.battleType === BattleType.MYSTERY_ENCOUNTER || (this.scene.currentBattle.waveIndex % 10) === 1) { + const addPostSummonForEncounter = this.scene.currentBattle.battleType === BattleType.MYSTERY_ENCOUNTER && !this.scene.currentBattle.mysteryEncounter?.disableAllPostSummon; + + if (!this.loaded || this.scene.currentBattle.battleType === BattleType.TRAINER || (this.scene.currentBattle.waveIndex % 10) === 1 || addPostSummonForEncounter) { this.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeActiveTrigger, true); this.queuePostSummon(); } diff --git a/src/phases/mystery-encounter-phase.ts b/src/phases/mystery-encounter-phase.ts index 638f2c0b15d..96acce6adcc 100644 --- a/src/phases/mystery-encounter-phase.ts +++ b/src/phases/mystery-encounter-phase.ts @@ -15,6 +15,7 @@ import { Tutorial, handleTutorial } from "../tutorial"; import { IvScannerModifier } from "../modifier/modifier"; import * as Utils from "../utils"; import { isNullOrUndefined } from "../utils"; +import { MysteryEncounterUiSettings } from "#app/ui/mystery-encounter-ui-handler"; /** * Will handle (in order): @@ -26,8 +27,11 @@ import { isNullOrUndefined } from "../utils"; * - Queuing of the MysteryEncounterOptionSelectedPhase */ export class MysteryEncounterPhase extends Phase { - constructor(scene: BattleScene) { + followupOptionSelectSettings: MysteryEncounterUiSettings; + + constructor(scene: BattleScene, followupOptionSelectSettings?: MysteryEncounterUiSettings) { super(scene); + this.followupOptionSelectSettings = followupOptionSelectSettings; } start() { @@ -37,12 +41,18 @@ export class MysteryEncounterPhase extends Phase { this.scene.clearPhaseQueue(); this.scene.clearPhaseQueueSplice(); - // Sets flag that ME was encountered - // Can be used in later MEs to check for requirements to spawn, etc. - this.scene.mysteryEncounterData.encounteredEvents.push([this.scene.currentBattle.mysteryEncounter.encounterType, this.scene.currentBattle.mysteryEncounter.encounterTier]); + // Generates seed offset for RNG consistency, but incremented if the same MysteryEncounter has multiple option select cycles + const offset = this.scene.currentBattle.mysteryEncounter.seedOffset ?? this.scene.currentBattle.waveIndex * 1000; + this.scene.currentBattle.mysteryEncounter.seedOffset = offset + 512; + + if (!this.followupOptionSelectSettings) { + // Sets flag that ME was encountered, only if this is not a followup option select phase + // Can be used in later MEs to check for requirements to spawn, etc. + this.scene.mysteryEncounterData.encounteredEvents.push([this.scene.currentBattle.mysteryEncounter.encounterType, this.scene.currentBattle.mysteryEncounter.encounterTier]); + } // Initiates encounter dialogue window and option select - this.scene.ui.setMode(Mode.MYSTERY_ENCOUNTER); + this.scene.ui.setMode(Mode.MYSTERY_ENCOUNTER, this.followupOptionSelectSettings); } handleOptionSelect(option: MysteryEncounterOption, index: number): boolean { @@ -61,24 +71,24 @@ export class MysteryEncounterPhase extends Phase { return await option.onPreOptionPhase(this.scene) .then((result) => { if (isNullOrUndefined(result) || result) { - this.continueEncounter(index); + this.continueEncounter(); } }); - }, this.scene.currentBattle.waveIndex * 1000); + }, this.scene.currentBattle.mysteryEncounter.seedOffset); } else { - this.continueEncounter(index); + this.continueEncounter(); } return true; } - continueEncounter(optionIndex: number) { + continueEncounter() { const endDialogueAndContinueEncounter = () => { this.scene.pushPhase(new MysteryEncounterOptionSelectedPhase(this.scene)); this.end(); }; - const optionSelectDialogue = this.scene.currentBattle?.mysteryEncounter?.options?.[optionIndex]?.dialogue; + const optionSelectDialogue = this.scene.currentBattle?.mysteryEncounter?.selectedOption?.dialogue; if (optionSelectDialogue?.selected?.length > 0) { // Handle intermediate dialogue (between player selection event and the onOptionSelect logic) this.scene.ui.setMode(Mode.MESSAGE); @@ -139,14 +149,14 @@ export class MysteryEncounterOptionSelectedPhase extends Phase { this.onOptionSelect(this.scene).finally(() => { this.end(); }); - }, this.scene.currentBattle.waveIndex * 1000); + }, this.scene.currentBattle.mysteryEncounter.seedOffset); }); } else { this.scene.executeWithSeedOffset(() => { this.onOptionSelect(this.scene).finally(() => { this.end(); }); - }, this.scene.currentBattle.waveIndex * 1000); + }, this.scene.currentBattle.mysteryEncounter.seedOffset); } } @@ -265,7 +275,7 @@ export class MysteryEncounterBattlePhase extends Phase { } else { const trainer = this.scene.currentBattle.trainer; let message: string; - scene.executeWithSeedOffset(() => message = Utils.randSeedItem(encounterMessages), scene.currentBattle.waveIndex * 1000); + scene.executeWithSeedOffset(() => message = Utils.randSeedItem(encounterMessages), this.scene.currentBattle.mysteryEncounter.seedOffset); const showDialogueAndSummon = () => { scene.ui.showDialogue(message, trainer.getName(TrainerSlot.NONE, true), null, () => { @@ -390,6 +400,7 @@ export class MysteryEncounterRewardsPhase extends Phase { this.scene.tryRemovePhase(p => p instanceof SelectModifierPhase); this.scene.unshiftPhase(new SelectModifierPhase(this.scene, 0, null, { fillRemaining: false, rerollMultiplier: 0 })); } + // 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)); @@ -423,7 +434,7 @@ export class PostMysteryEncounterPhase extends Phase { this.continueEncounter(); } }); - }, this.scene.currentBattle.waveIndex * 1000); + }, this.scene.currentBattle.mysteryEncounter.seedOffset); } else { this.continueEncounter(); } diff --git a/src/pipelines/sprite.ts b/src/pipelines/sprite.ts index a61d321c765..e36765f0d4c 100644 --- a/src/pipelines/sprite.ts +++ b/src/pipelines/sprite.ts @@ -38,6 +38,7 @@ uniform vec2 texFrameUv; uniform vec2 size; uniform vec2 texSize; uniform float yOffset; +uniform float yShadowOffset; uniform vec4 tone; uniform ivec4 baseVariantColors[32]; uniform vec4 variantColors[32]; @@ -252,7 +253,7 @@ void main() { float width = size.x - (yOffset / 2.0); float spriteX = ((floor(outPosition.x / fieldScale) - relPosition.x) / width) + 0.5; - float spriteY = ((floor(outPosition.y / fieldScale) - relPosition.y) / size.y); + float spriteY = ((floor(outPosition.y / fieldScale) - relPosition.y - yShadowOffset) / size.y); if (yCenter == 1) { spriteY += 0.5; @@ -339,6 +340,7 @@ export default class SpritePipeline extends FieldSpritePipeline { this.set2f("size", 0, 0); this.set2f("texSize", 0, 0); this.set1f("yOffset", 0); + this.set1f("yShadowOffset", 0); this.set4fv("tone", this._tone); } @@ -351,6 +353,7 @@ export default class SpritePipeline extends FieldSpritePipeline { const tone = data["tone"] as number[]; const teraColor = data["teraColor"] as integer[] ?? [ 0, 0, 0 ]; const hasShadow = data["hasShadow"] as boolean; + const yShadowOffset = data["yShadowOffset"] as number; const ignoreFieldPos = data["ignoreFieldPos"] as boolean; const ignoreOverride = data["ignoreOverride"] as boolean; @@ -377,6 +380,7 @@ export default class SpritePipeline extends FieldSpritePipeline { this.set2f("size", sprite.frame.width, sprite.height); this.set2f("texSize", sprite.texture.source[0].width, sprite.texture.source[0].height); this.set1f("yOffset", sprite.height - sprite.frame.height * (isEntityObj ? sprite.parentContainer.scale : sprite.scale)); + this.set1f("yShadowOffset", yShadowOffset ?? 0); this.set4fv("tone", tone); this.bindTexture(this.game.textures.get("tera").source[0].glTexture, 1); @@ -448,6 +452,7 @@ export default class SpritePipeline extends FieldSpritePipeline { this.set1f("vCutoff", v1); const hasShadow = sprite.pipelineData["hasShadow"] as boolean; + const yShadowOffset = sprite.pipelineData["yShadowOffset"] as number; if (hasShadow) { const isEntityObj = sprite.parentContainer instanceof Pokemon || sprite.parentContainer instanceof Trainer || sprite.parentContainer instanceof MysteryEncounterIntroVisuals; const field = isEntityObj ? sprite.parentContainer.parentContainer : sprite.parentContainer; @@ -455,7 +460,7 @@ export default class SpritePipeline extends FieldSpritePipeline { const baseY = (isEntityObj ? sprite.parentContainer.y : sprite.y + sprite.height) * 6 / fieldScaleRatio; - const bottomPadding = Math.ceil(sprite.height * 0.05) * 6 / fieldScaleRatio; + const bottomPadding = Math.ceil(sprite.height * 0.05 + Math.max(yShadowOffset, 0)) * 6 / fieldScaleRatio; const yDelta = (baseY - y1) / field.scale; y2 = y1 = baseY + bottomPadding; const pixelHeight = (v1 - v0) / (sprite.frame.height * (isEntityObj ? sprite.parentContainer.scale : sprite.scale)); diff --git a/src/ui/mystery-encounter-ui-handler.ts b/src/ui/mystery-encounter-ui-handler.ts index e9ee0f1f6e7..800dd551dc4 100644 --- a/src/ui/mystery-encounter-ui-handler.ts +++ b/src/ui/mystery-encounter-ui-handler.ts @@ -12,6 +12,16 @@ import { isNullOrUndefined } from "../utils"; import { getPokeballAtlasKey } from "../data/pokeball"; import { getEncounterText } from "#app/data/mystery-encounters/mystery-encounter-utils"; +export class MysteryEncounterUiSettings { + hideDescription?: boolean; + slideInDescription?: boolean; + overrideTitle?: string; + overrideDescription?: string; + overrideQuery?: string; + overrideOptions?: MysteryEncounterOption[]; + startingCursorIndex?: number; +} + export default class MysteryEncounterUiHandler extends UiHandler { private cursorContainer: Phaser.GameObjects.Container; private cursorObj: Phaser.GameObjects.Image; @@ -27,7 +37,8 @@ export default class MysteryEncounterUiHandler extends UiHandler { private descriptionScrollTween: Phaser.Tweens.Tween; private rarityBall: Phaser.GameObjects.Sprite; - private filteredEncounterOptions: MysteryEncounterOption[] = []; + private overrideSettings: MysteryEncounterUiSettings; + private encounterOptions: MysteryEncounterOption[] = []; private optionsMeetsReqs: boolean[]; protected viewPartyIndex: integer = 0; @@ -70,16 +81,21 @@ export default class MysteryEncounterUiHandler extends UiHandler { show(args: any[]): boolean { super.show(args); + this.overrideSettings = args[0] as MysteryEncounterUiSettings ?? {}; + const showDescriptionContainer = isNullOrUndefined(this.overrideSettings?.hideDescription) ? true : !this.overrideSettings?.hideDescription; + const slideInDescription = isNullOrUndefined(this.overrideSettings?.slideInDescription) ? true : this.overrideSettings?.slideInDescription; + const startingCursorIndex = this.overrideSettings?.startingCursorIndex ?? 0; + this.cursorContainer.setVisible(true); - this.descriptionContainer.setVisible(true); + this.descriptionContainer.setVisible(showDescriptionContainer); this.optionsContainer.setVisible(true); - this.displayEncounterOptions(!(args[0] as boolean || false)); + this.displayEncounterOptions(slideInDescription); const cursor = this.getCursor(); if (cursor === (this?.optionsContainer?.length || 0) - 1) { // Always resets cursor on view party button if it was last there this.setCursor(cursor); } else { - this.setCursor(0); + this.setCursor(startingCursorIndex); } if (this.blockInput) { setTimeout(() => { @@ -100,12 +116,16 @@ export default class MysteryEncounterUiHandler extends UiHandler { if (button === Button.CANCEL || button === Button.ACTION) { if (button === Button.ACTION) { - const selected = this.filteredEncounterOptions[cursor]; + const selected = this.encounterOptions[cursor]; if (cursor === this.viewPartyIndex) { // Handle view party success = true; + const overrideSettings: MysteryEncounterUiSettings = { + ...this.overrideSettings, + slideInDescription: false + }; this.scene.ui.setMode(Mode.PARTY, PartyUiMode.CHECK, -1, () => { - this.scene.ui.setMode(Mode.MYSTERY_ENCOUNTER, true); + this.scene.ui.setMode(Mode.MYSTERY_ENCOUNTER, overrideSettings); setTimeout(() => { this.setCursor(this.viewPartyIndex); this.unblockInput(); @@ -253,7 +273,7 @@ export default class MysteryEncounterUiHandler extends UiHandler { if (this.blockInput) { this.blockInput = false; for (let i = 0; i < this.optionsContainer.length - 1; i++) { - const optionMode = this.filteredEncounterOptions[i].optionMode; + const optionMode = this.encounterOptions[i].optionMode; if (!this.optionsMeetsReqs[i] && (optionMode === EncounterOptionMode.DISABLED_OR_DEFAULT || optionMode === EncounterOptionMode.DISABLED_OR_SPECIAL)) { continue; } @@ -296,7 +316,7 @@ export default class MysteryEncounterUiHandler extends UiHandler { displayEncounterOptions(slideInDescription: boolean = true): void { this.getUi().clearText(); const mysteryEncounter = this.scene.currentBattle.mysteryEncounter; - this.filteredEncounterOptions = mysteryEncounter.options; + this.encounterOptions = this.overrideSettings?.overrideOptions ?? mysteryEncounter.options; this.optionsMeetsReqs = []; const titleText: string = getEncounterText(this.scene, mysteryEncounter.dialogue.encounterOptionsDialogue.title, TextStyle.TOOLTIP_TITLE); @@ -307,11 +327,11 @@ export default class MysteryEncounterUiHandler extends UiHandler { this.optionsContainer.removeAll(); // Options Window - for (let i = 0; i < this.filteredEncounterOptions.length; i++) { - const option = this.filteredEncounterOptions[i]; + for (let i = 0; i < this.encounterOptions.length; i++) { + const option = this.encounterOptions[i]; let optionText; - switch (this.filteredEncounterOptions.length) { + switch (this.encounterOptions.length) { case 2: optionText = addBBCodeTextObject(this.scene, i % 2 === 0 ? 0 : 100, 8, "-", TextStyle.WINDOW, { wordWrap: { width: 558 }, fontSize: "80px", lineSpacing: -8 }); break; @@ -424,7 +444,7 @@ export default class MysteryEncounterUiHandler extends UiHandler { } let text: string; - const cursorOption = this.filteredEncounterOptions[cursor]; + const cursorOption = this.encounterOptions[cursor]; const optionDialogue = cursorOption.dialogue; if (!this.optionsMeetsReqs[cursor] && (cursorOption.optionMode === EncounterOptionMode.DISABLED_OR_DEFAULT || cursorOption.optionMode === EncounterOptionMode.DISABLED_OR_SPECIAL) && optionDialogue.disabledButtonTooltip) { text = getEncounterText(this.scene, optionDialogue.disabledButtonTooltip, TextStyle.TOOLTIP_CONTENT); @@ -474,6 +494,7 @@ export default class MysteryEncounterUiHandler extends UiHandler { clear(): void { super.clear(); + this.overrideSettings = null; this.optionsContainer.setVisible(false); this.optionsContainer.removeAll(true); this.descriptionContainer.setVisible(false); From 9208fd226b53742a3873a1edc742d4909f759cc6 Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Sun, 14 Jul 2024 21:31:43 -0700 Subject: [PATCH 111/270] RESET OVERRIDES.TS!! --- .../encounters/lost-at-sea-encounter.ts | 15 +++------------ src/overrides.ts | 8 ++++---- 2 files changed, 7 insertions(+), 16 deletions(-) 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 e3e3ff5bc16..340bfdd4281 100644 --- a/src/data/mystery-encounters/encounters/lost-at-sea-encounter.ts +++ b/src/data/mystery-encounters/encounters/lost-at-sea-encounter.ts @@ -43,21 +43,12 @@ export const LostAtSeaEncounter: MysteryEncounter = MysteryEncounterBuilder.with ]) .withIntroDialogue([{ text: `${namepsace}:intro` }]) .withOnInit((scene: BattleScene) => { - // const allowedPokemon = scene.getParty().filter((p) => p.isAllowedInBattle()); const { mysteryEncounter } = scene.currentBattle; mysteryEncounter.setDialogueToken("damagePercentage", String(DAMAGE_PERCENTAGE)); mysteryEncounter.setDialogueToken("option1RequiredMove", Moves[OPTION_1_REQUIRED_MOVE]); mysteryEncounter.setDialogueToken("option2RequiredMove", Moves[OPTION_2_REQUIRED_MOVE]); - // check for water pokemon - // surfablePkm = findPokemonThatCanLearnMove(allowedPokemon, Type.WATER); - // mysteryEncounter.setDialogueToken("waterPkm", surfablePkm?.name ?? ""); - - // check for flying pokemon - // flyingPkm = findPokemonThatCanLearnMove(allowedPokemon, Type.FLYING); - // mysteryEncounter.setDialogueToken("flyingPkm", flyingPkm?.name ?? ""); - return true; }) .withTitle(`${namepsace}:title`) @@ -82,7 +73,7 @@ export const LostAtSeaEncounter: MysteryEncounter = MysteryEncounterBuilder.with }, ], }) - .withOptionPhase(async (scene: BattleScene) => handleGuidingOptionPhase(scene, surfablePkm)) + .withOptionPhase(async (scene: BattleScene) => handlePokemongGuidingYouPhase(scene, surfablePkm)) .build() ) .withOption( @@ -104,7 +95,7 @@ export const LostAtSeaEncounter: MysteryEncounter = MysteryEncounterBuilder.with }, ], }) - .withOptionPhase(async (scene: BattleScene) => handleGuidingOptionPhase(scene, flyingPkm)) + .withOptionPhase(async (scene: BattleScene) => handlePokemongGuidingYouPhase(scene, flyingPkm)) .build() ) .withSimpleOption( @@ -141,7 +132,7 @@ export const LostAtSeaEncounter: MysteryEncounter = MysteryEncounterBuilder.with * @param scene Battle scene * @param guidePokemon pokemon choosen as a guide */ -function handleGuidingOptionPhase(scene: BattleScene, guidePokemon: PlayerPokemon) { +function handlePokemongGuidingYouPhase(scene: BattleScene, guidePokemon: PlayerPokemon) { /** Base EXP value for guiding pokemon. Currently Lapras base-value */ const baseExpValue: number = 187; diff --git a/src/overrides.ts b/src/overrides.ts index 7a9262ab73a..e19a5bf20dd 100644 --- a/src/overrides.ts +++ b/src/overrides.ts @@ -34,8 +34,8 @@ export const SEED_OVERRIDE: string = ""; export const WEATHER_OVERRIDE: WeatherType = WeatherType.NONE; export const DOUBLE_BATTLE_OVERRIDE: boolean = false; export const SINGLE_BATTLE_OVERRIDE: boolean = false; -export const STARTING_WAVE_OVERRIDE: integer = 15; -export const STARTING_BIOME_OVERRIDE: Biome = Biome.SEA; +export const STARTING_WAVE_OVERRIDE: integer = 0; +export const STARTING_BIOME_OVERRIDE: Biome = Biome.TOWN; export const ARENA_TINT_OVERRIDE: TimeOfDay = null; // Multiplies XP gained by this value including 0. Set to null to ignore the override export const XP_MULTIPLIER_OVERRIDE: number = null; @@ -117,9 +117,9 @@ export const EGG_GACHA_PULL_COUNT_OVERRIDE: number = 0; */ // 1 to 256, set to null to ignore -export const MYSTERY_ENCOUNTER_RATE_OVERRIDE: number = 100000; +export const MYSTERY_ENCOUNTER_RATE_OVERRIDE: number = null; export const MYSTERY_ENCOUNTER_TIER_OVERRIDE: MysteryEncounterTier = null; -export const MYSTERY_ENCOUNTER_OVERRIDE: MysteryEncounterType = MysteryEncounterType.LOST_AT_SEA; +export const MYSTERY_ENCOUNTER_OVERRIDE: MysteryEncounterType = null; /** * MODIFIER / ITEM OVERRIDES From e2c431b913acc7f32790fee3ab55b23c868219c8 Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Sun, 14 Jul 2024 21:32:22 -0700 Subject: [PATCH 112/270] polish lost at sea encounter - fix guide pokemon not receiving exp --- .../encounters/lost-at-sea-encounter.ts | 16 +++++++--------- .../mystery-encounter-option.ts | 1 - src/data/mystery-encounters/mystery-encounter.ts | 1 - src/locales/en/mystery-encounters/lost-at-sea.ts | 4 ++-- 4 files changed, 9 insertions(+), 13 deletions(-) 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 340bfdd4281..5e95c9d2b1f 100644 --- a/src/data/mystery-encounters/encounters/lost-at-sea-encounter.ts +++ b/src/data/mystery-encounters/encounters/lost-at-sea-encounter.ts @@ -1,6 +1,5 @@ import { Moves } from "#app/enums/moves.js"; import { Species } from "#app/enums/species.js"; -import { PlayerPokemon } from "#app/field/pokemon.js"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import BattleScene from "../../../battle-scene"; import MysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier } from "../mystery-encounter"; @@ -18,9 +17,6 @@ const DAMAGE_PERCENTAGE: number = 30; // 0 - 100 /** The i18n namespace for the encounter */ const namepsace = "mysteryEncounter:lostAtSea"; -let surfablePkm: PlayerPokemon; -let flyingPkm: PlayerPokemon; - /** * Lost at sea encounter. * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/9 | GitHub Issue #9} @@ -73,7 +69,7 @@ export const LostAtSeaEncounter: MysteryEncounter = MysteryEncounterBuilder.with }, ], }) - .withOptionPhase(async (scene: BattleScene) => handlePokemongGuidingYouPhase(scene, surfablePkm)) + .withOptionPhase(async (scene: BattleScene) => handlePokemongGuidingYouPhase(scene)) .build() ) .withOption( @@ -95,7 +91,7 @@ export const LostAtSeaEncounter: MysteryEncounter = MysteryEncounterBuilder.with }, ], }) - .withOptionPhase(async (scene: BattleScene) => handlePokemongGuidingYouPhase(scene, flyingPkm)) + .withOptionPhase(async (scene: BattleScene) => handlePokemongGuidingYouPhase(scene)) .build() ) .withSimpleOption( @@ -132,15 +128,17 @@ export const LostAtSeaEncounter: MysteryEncounter = MysteryEncounterBuilder.with * @param scene Battle scene * @param guidePokemon pokemon choosen as a guide */ -function handlePokemongGuidingYouPhase(scene: BattleScene, guidePokemon: PlayerPokemon) { +function handlePokemongGuidingYouPhase(scene: BattleScene) { /** Base EXP value for guiding pokemon. Currently Lapras base-value */ const baseExpValue: number = 187; + const { mysteryEncounter } = scene.currentBattle; - if (guidePokemon) { - setEncounterExp(scene, guidePokemon.id, baseExpValue, true); + if (mysteryEncounter.selectedOption) { + setEncounterExp(scene, mysteryEncounter.selectedOption.primaryPokemon.id, baseExpValue, true); } else { console.warn("Lost at sea: No guide pokemon found but pokemon guides player. huh!?"); } leaveEncounterWithoutBattle(scene); + return true; } diff --git a/src/data/mystery-encounters/mystery-encounter-option.ts b/src/data/mystery-encounters/mystery-encounter-option.ts index f6542a19d1a..edf08b26da7 100644 --- a/src/data/mystery-encounters/mystery-encounter-option.ts +++ b/src/data/mystery-encounters/mystery-encounter-option.ts @@ -68,7 +68,6 @@ export default class MysteryEncounterOption implements MysteryEncounterOption { } let qualified: PlayerPokemon[] = scene.getParty(); for (const req of this.primaryPokemonRequirements) { - console.log(req); if (req.meetsRequirement(scene)) { if (req instanceof EncounterPokemonRequirement) { qualified = qualified.filter(pkmn => req.queryParty(scene.getParty()).includes(pkmn)); diff --git a/src/data/mystery-encounters/mystery-encounter.ts b/src/data/mystery-encounters/mystery-encounter.ts index dfe824cc831..a072c0f80a8 100644 --- a/src/data/mystery-encounters/mystery-encounter.ts +++ b/src/data/mystery-encounters/mystery-encounter.ts @@ -188,7 +188,6 @@ export default class IMysteryEncounter implements IMysteryEncounter { } let qualified: PlayerPokemon[] = scene.getParty(); for (const req of this.primaryPokemonRequirements) { - console.log(req); if (req.meetsRequirement(scene)) { if (req instanceof EncounterPokemonRequirement) { qualified = qualified.filter(pkmn => req.queryParty(scene.getParty()).includes(pkmn)); diff --git a/src/locales/en/mystery-encounters/lost-at-sea.ts b/src/locales/en/mystery-encounters/lost-at-sea.ts index d5413a48ffc..35cceaa17a8 100644 --- a/src/locales/en/mystery-encounters/lost-at-sea.ts +++ b/src/locales/en/mystery-encounters/lost-at-sea.ts @@ -9,14 +9,14 @@ export const lostAtSea = { label: "Use {{option1PrimaryName}}", label_disabled: "Can't {{option1RequiredMove}}", tooltip: "Use {{option1PrimaryName}} to guide you back. {{option1PrimaryName}} earns EXP as if having defeated a Lapras.", - tooltip_disabled: "You have no Pokémon that could learn {{option1RequiredMove}}", + tooltip_disabled: "You have no Pokémon to {{option1RequiredMove}} on", selected: "{{option1PrimaryName}} guides you back and earns EXP.", }, 2: { label: "Use {{option2PrimaryName}}", label_disabled: "Can't {{option2RequiredMove}}", tooltip: "Use {{option2PrimaryName}} to guide you back. {{option2PrimaryName}} earns EXP as if having defeated a Lapras.", - tooltip_disabled: "You have no Pokémon that could learn {{option2RequiredMove}}", + tooltip_disabled: "You have no Pokémon to {{option2RequiredMove}} with", selected: "{{option2PrimaryName}} guides you back and earns EXP.", }, 3: { From e1bb1e24815cdda2816254381e49479ed765bcd2 Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Mon, 15 Jul 2024 12:36:10 -0400 Subject: [PATCH 113/270] clean up safari code and utils --- public/images/mystery-encounters/bait.json | 83 +++ public/images/mystery-encounters/bait.png | Bin 0 -> 277 bytes public/images/mystery-encounters/mud.json | 104 +++ public/images/mystery-encounters/mud.png | Bin 0 -> 361 bytes .../encounters/dark-deal-encounter.ts | 3 +- .../department-store-sale-encounter.ts | 2 +- .../encounters/field-trip-encounter.ts | 2 +- .../encounters/fight-or-flight-encounter.ts | 7 +- .../mysterious-challengers-encounter.ts | 2 +- .../encounters/mysterious-chest-encounter.ts | 17 +- .../encounters/safari-zone-encounter.ts | 598 ++++-------------- .../shady-vitamin-dealer-encounter.ts | 3 +- .../encounters/sleeping-snorlax-encounter.ts | 3 +- .../encounters/training-session-encounter.ts | 17 +- .../mystery-encounters/mystery-encounter.ts | 22 +- .../utils/encounter-dialogue-utils.ts | 72 +++ .../encounter-phase-utils.ts} | 261 ++------ .../utils/encounter-pokemon-utils.ts | 451 +++++++++++++ src/locales/en/mystery-encounter.ts | 4 +- src/phases.ts | 7 +- src/phases/mystery-encounter-phase.ts | 50 +- src/pipelines/sprite.ts | 2 +- .../mystery-encounter-utils.test.ts | 7 +- src/ui/mystery-encounter-ui-handler.ts | 23 +- 24 files changed, 953 insertions(+), 787 deletions(-) create mode 100644 public/images/mystery-encounters/bait.json create mode 100644 public/images/mystery-encounters/bait.png create mode 100644 public/images/mystery-encounters/mud.json create mode 100644 public/images/mystery-encounters/mud.png create mode 100644 src/data/mystery-encounters/utils/encounter-dialogue-utils.ts rename src/data/mystery-encounters/{mystery-encounter-utils.ts => utils/encounter-phase-utils.ts} (76%) create mode 100644 src/data/mystery-encounters/utils/encounter-pokemon-utils.ts diff --git a/public/images/mystery-encounters/bait.json b/public/images/mystery-encounters/bait.json new file mode 100644 index 00000000000..ae9ee38ee13 --- /dev/null +++ b/public/images/mystery-encounters/bait.json @@ -0,0 +1,83 @@ +{ + "textures": [ + { + "image": "bait.png", + "format": "RGBA8888", + "size": { + "w": 14, + "h": 43 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 12, + "h": 16 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 12, + "h": 13 + }, + "frame": { + "x": 1, + "y": 1, + "w": 12, + "h": 13 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 12, + "h": 16 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 12, + "h": 13 + }, + "frame": { + "x": 1, + "y": 16, + "w": 12, + "h": 13 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 12, + "h": 16 + }, + "spriteSourceSize": { + "x": 0, + "y": 5, + "w": 11, + "h": 11 + }, + "frame": { + "x": 1, + "y": 31, + "w": 11, + "h": 11 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:f0ec04fcd67ac346dce973693711d032:b697e09191c4312b8faaa0a080a309b7:1af241a52e61fa01ca849aa03c112f85$" + } +} diff --git a/public/images/mystery-encounters/bait.png b/public/images/mystery-encounters/bait.png new file mode 100644 index 0000000000000000000000000000000000000000..7de9169d187544cc2c992c19274f6299c09a39b8 GIT binary patch literal 277 zcmeAS@N?(olHy`uVBq!ia0vp^d_b(t!3-qpzk8+uDd_;85LX}#1Qo8)6O+sDE!h5X z+qSPK5B`67_y3O{(G^kWfpUx`L4Lsu4$p3Y^l%n4nJa0`PlBg3pY5E0jpgZkEMEml5YNEcaJqbjoWo&CSJ?MySOwYlD|`oOs2F-wn{ T@dF>A^B6o`{an^LB{Ts5i$-hZ literal 0 HcmV?d00001 diff --git a/public/images/mystery-encounters/mud.json b/public/images/mystery-encounters/mud.json new file mode 100644 index 00000000000..804eed36052 --- /dev/null +++ b/public/images/mystery-encounters/mud.json @@ -0,0 +1,104 @@ +{ + "textures": [ + { + "image": "mud.png", + "format": "RGBA8888", + "size": { + "w": 18, + "h": 55 + }, + "scale": 1, + "frames": [ + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 16, + "h": 16 + }, + "spriteSourceSize": { + "x": 0, + "y": 3, + "w": 16, + "h": 13 + }, + "frame": { + "x": 1, + "y": 1, + "w": 16, + "h": 13 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 16, + "h": 16 + }, + "spriteSourceSize": { + "x": 0, + "y": 4, + "w": 16, + "h": 12 + }, + "frame": { + "x": 1, + "y": 16, + "w": 16, + "h": 12 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 16, + "h": 16 + }, + "spriteSourceSize": { + "x": 0, + "y": 7, + "w": 16, + "h": 9 + }, + "frame": { + "x": 1, + "y": 30, + "w": 16, + "h": 9 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 16, + "h": 16 + }, + "spriteSourceSize": { + "x": 1, + "y": 3, + "w": 14, + "h": 13 + }, + "frame": { + "x": 1, + "y": 41, + "w": 14, + "h": 13 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:a9f7ae83758a2dffaacdaba2ee9dc2e2:0ebff9db47ce74a0ec049f5d74d589fa:c64f6b8befc3d5e9f836246d2b9536be$" + } +} diff --git a/public/images/mystery-encounters/mud.png b/public/images/mystery-encounters/mud.png new file mode 100644 index 0000000000000000000000000000000000000000..89f174bef74e73d32fd9538b3be7e58339212226 GIT binary patch literal 361 zcmV-v0ha!WP)CYkI;Xo&W#<0d!JMQvg8b*k%9#010qNS#tmY4#WTe4#WYK zD-Ig~008YtL_t(I%cYYG4#OY}L$MRM|B>f}mQUABs}`x1cnyfyZYhrnxU37RZx9Vl zs4h$`wYn$=5vWNAVx^WYNIMZhx{5duwGp6t^tQ7}`_u^a9c`x1y~bI^%yN_2dVjmD z@6pfdypx7&$0kkhpzo+sb90rIo_cXPE|qa9Jtc&!@OW@AL+#>3*{;n*Ir3TMBl<&$ zo3Sf&-7t7Y%bA%Np|O(NmeX6>8s{GS@*wsvdQ=4MigyBM00000NkvXX Hu0mjfv1XH$ literal 0 HcmV?d00001 diff --git a/src/data/mystery-encounters/encounters/dark-deal-encounter.ts b/src/data/mystery-encounters/encounters/dark-deal-encounter.ts index cb66208a6ff..f9a339db8c2 100644 --- a/src/data/mystery-encounters/encounters/dark-deal-encounter.ts +++ b/src/data/mystery-encounters/encounters/dark-deal-encounter.ts @@ -9,7 +9,8 @@ import { PokeballType } from "../../pokeball"; import { getPokemonSpecies } from "../../pokemon-species"; import IMysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier, } from "../mystery-encounter"; import { EncounterOptionMode, MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; -import { EnemyPartyConfig, EnemyPokemonConfig, getRandomPlayerPokemon, getRandomSpeciesByStarterTier, initBattleWithEnemyConfig, leaveEncounterWithoutBattle, } from "../mystery-encounter-utils"; +import { EnemyPartyConfig, EnemyPokemonConfig, initBattleWithEnemyConfig, leaveEncounterWithoutBattle, } from "../utils/encounter-phase-utils"; +import { getRandomPlayerPokemon, getRandomSpeciesByStarterTier } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; /** i18n namespace for encounter */ const namespace = "mysteryEncounter:dark_deal"; 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 9ad90a92cfb..f3bb422aa64 100644 --- a/src/data/mystery-encounters/encounters/department-store-sale-encounter.ts +++ b/src/data/mystery-encounters/encounters/department-store-sale-encounter.ts @@ -1,7 +1,7 @@ import { leaveEncounterWithoutBattle, setEncounterRewards, -} from "#app/data/mystery-encounters/mystery-encounter-utils"; +} from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { modifierTypes } from "#app/modifier/modifier-type"; import { randSeedInt } from "#app/utils"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; diff --git a/src/data/mystery-encounters/encounters/field-trip-encounter.ts b/src/data/mystery-encounters/encounters/field-trip-encounter.ts index b0131fa54c5..bc369ee4c4b 100644 --- a/src/data/mystery-encounters/encounters/field-trip-encounter.ts +++ b/src/data/mystery-encounters/encounters/field-trip-encounter.ts @@ -6,7 +6,7 @@ import { selectPokemonForOption, setEncounterExp, setEncounterRewards, -} from "#app/data/mystery-encounters/mystery-encounter-utils"; +} from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { TempBattleStat } from "#app/data/temp-battle-stat"; import { PlayerPokemon, PokemonMove } from "#app/field/pokemon"; import { modifierTypes } from "#app/modifier/modifier-type"; 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 7a96e3f89aa..db7495f6cfa 100644 --- a/src/data/mystery-encounters/encounters/fight-or-flight-encounter.ts +++ b/src/data/mystery-encounters/encounters/fight-or-flight-encounter.ts @@ -4,10 +4,8 @@ import { EnemyPartyConfig, initBattleWithEnemyConfig, leaveEncounterWithoutBattle, - queueEncounterMessage, - setEncounterRewards, - showEncounterText, -} from "#app/data/mystery-encounters/mystery-encounter-utils"; + setEncounterRewards +} from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { STEALING_MOVES } from "#app/data/mystery-encounters/requirements/requirement-groups"; import Pokemon from "#app/field/pokemon"; import { ModifierTier } from "#app/modifier/modifier-tier"; @@ -28,6 +26,7 @@ import IMysteryEncounter, { MysteryEncounterTier, } from "../mystery-encounter"; import { MoveRequirement } from "../mystery-encounter-requirements"; +import { queueEncounterMessage, showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; /** the i18n namespace for the encounter */ const namespace = "mysteryEncounter:fight_or_flight"; diff --git a/src/data/mystery-encounters/encounters/mysterious-challengers-encounter.ts b/src/data/mystery-encounters/encounters/mysterious-challengers-encounter.ts index 7c7d03b7895..f9fe8ab3d42 100644 --- a/src/data/mystery-encounters/encounters/mysterious-challengers-encounter.ts +++ b/src/data/mystery-encounters/encounters/mysterious-challengers-encounter.ts @@ -2,7 +2,7 @@ import { EnemyPartyConfig, initBattleWithEnemyConfig, setEncounterRewards, -} from "#app/data/mystery-encounters/mystery-encounter-utils"; +} from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { trainerConfigs, TrainerPartyCompoundTemplate, diff --git a/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts b/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts index ae6c14f725e..7773e03501b 100644 --- a/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts +++ b/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts @@ -1,11 +1,7 @@ import { - getHighestLevelPlayerPokemon, - koPlayerPokemon, leaveEncounterWithoutBattle, - queueEncounterMessage, - setEncounterRewards, - showEncounterText, -} from "#app/data/mystery-encounters/mystery-encounter-utils"; + setEncounterRewards +} from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { ModifierTier } from "#app/modifier/modifier-tier"; import { GameOverPhase } from "#app/phases"; import { randSeedInt } from "#app/utils"; @@ -16,6 +12,8 @@ import IMysteryEncounter, { MysteryEncounterTier, } from "../mystery-encounter"; import { EncounterOptionMode, MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; +import { queueEncounterMessage, showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; +import { getHighestLevelPlayerPokemon, koPlayerPokemon } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; export const MysteriousChestEncounter: IMysteryEncounter = MysteryEncounterBuilder.withEncounterType( @@ -119,11 +117,8 @@ export const MysteriousChestEncounter: IMysteryEncounter = // Does this synchronously so that game over doesn't happen over result message await showEncounterText(scene, "mysteryEncounter:mysterious_chest_option_1_bad_result") .then(() => { - if ( - scene.getParty().filter((p) => p.isAllowedInBattle()).length === - 0 - ) { - // All pokemon fainted, game over + if (scene.getParty().filter((p) => p.isAllowedInBattle()).length === 0) { + // All pokemon fainted, game over scene.clearPhaseQueue(); scene.unshiftPhase(new GameOverPhase(scene)); } else { diff --git a/src/data/mystery-encounters/encounters/safari-zone-encounter.ts b/src/data/mystery-encounters/encounters/safari-zone-encounter.ts index 000c5f24f8d..2b7a013dd22 100644 --- a/src/data/mystery-encounters/encounters/safari-zone-encounter.ts +++ b/src/data/mystery-encounters/encounters/safari-zone-encounter.ts @@ -1,4 +1,4 @@ -import { getRandomSpeciesByStarterTier, initFollowupOptionSelect, leaveEncounterWithoutBattle, updatePlayerMoney, } from "#app/data/mystery-encounters/mystery-encounter-utils"; +import { initSubsequentOptionSelect, leaveEncounterWithoutBattle, updatePlayerMoney, } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import BattleScene from "../../../battle-scene"; import IMysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier, MysteryEncounterVariant } from "../mystery-encounter"; @@ -6,27 +6,95 @@ import MysteryEncounterOption, { EncounterOptionMode, MysteryEncounterOptionBuil import { TrainerSlot } from "#app/data/trainer-config"; import { ScanIvsPhase, SummonPhase, VictoryPhase } from "#app/phases"; import i18next from "i18next"; -import { HiddenAbilityRateBoosterModifier, IvScannerModifier, PokemonHeldItemModifier } from "#app/modifier/modifier"; +import { HiddenAbilityRateBoosterModifier, IvScannerModifier } from "#app/modifier/modifier"; import { EnemyPokemon } from "#app/field/pokemon"; -import { doPokeballBounceAnim, getPokeballAtlasKey, getPokeballTintColor, PokeballType } from "#app/data/pokeball"; -import { StatusEffect } from "#app/data/status-effect"; -import { addPokeballCaptureStars, addPokeballOpenParticles } from "#app/field/anims"; -import { achvs } from "#app/system/achv"; -import { Mode } from "#app/ui/ui"; -import { PartyOption, PartyUiMode } from "#app/ui/party-ui-handler"; -import { BattlerIndex } from "#app/battle"; +import { PokeballType } from "#app/data/pokeball"; import { PlayerGender } from "#enums/player-gender"; import { IntegerHolder, randSeedInt } from "#app/utils"; import { getPokemonSpecies } from "#app/data/pokemon-species"; import { MoneyRequirement } from "#app/data/mystery-encounters/mystery-encounter-requirements"; +import { doPlayerFlee, doPokemonFlee, getRandomSpeciesByStarterTier, trainerThrowPokeball } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; +import { showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; /** the i18n namespace for the encounter */ const namespace = "mysteryEncounter:safari_zone"; +export const SafariZoneEncounter: IMysteryEncounter = + MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.SAFARI_ZONE) + .withEncounterTier(MysteryEncounterTier.GREAT) + .withSceneWaveRangeRequirement(10, 180) + .withSceneRequirement(new MoneyRequirement(0, 2.75)) // Cost equal to 1 Max Revive + .withIntroSpriteConfigs([ + { + spriteKey: "chest_blue", + fileRoot: "mystery-encounters", + hasShadow: true, + x: 4, + y: 10, + yShadowOffset: 3 + }, + ]) + .withIntroDialogue([ + { + text: `${namespace}_intro_message`, + }, + ]) + .withTitle(`${namespace}_title`) + .withDescription(`${namespace}_description`) + .withQuery(`${namespace}_query`) + .withOption(new MysteryEncounterOptionBuilder() + .withOptionMode(EncounterOptionMode.DISABLED_OR_DEFAULT) + .withSceneRequirement(new MoneyRequirement(0, 2.75)) // Cost equal to 1 Max Revive + .withDialogue({ + buttonLabel: `${namespace}_option_1_label`, + buttonTooltip: `${namespace}_option_1_tooltip`, + selected: [ + { + text: `${namespace}_option_1_selected_message`, + }, + ], + }) + .withOptionPhase(async (scene: BattleScene) => { + // Start safari encounter + const encounter = scene.currentBattle.mysteryEncounter; + encounter.encounterVariant = MysteryEncounterVariant.SAFARI_BATTLE; + encounter.misc = { + safariPokemonRemaining: 3 + }; + updatePlayerMoney(scene, -(encounter.options[0].requirements[0] as MoneyRequirement).requiredMoney); + scene.loadSe("PRSFX- Bug Bite", "battle_anims"); + scene.loadSe("PRSFX- Sludge Bomb2", "battle_anims"); + scene.loadSe("PRSFX- Taunt2", "battle_anims"); + scene.loadAtlas("bait", "mystery-encounters"); + scene.loadAtlas("mud", "mystery-encounters"); + await summonSafariPokemon(scene); + initSubsequentOptionSelect(scene, { overrideOptions: safariZoneGameOptions, hideDescription: true }); + return true; + }) + .build() + ) + .withSimpleOption( + { + buttonLabel: `${namespace}_option_2_label`, + buttonTooltip: `${namespace}_option_2_tooltip`, + selected: [ + { + text: `${namespace}_option_2_selected_message`, + }, + ], + }, + async (scene: BattleScene) => { + // Leave encounter with no rewards or exp + leaveEncounterWithoutBattle(scene, true); + return true; + } + ) + .build(); + /** - * SAFARI ZONE OPTIONS + * SAFARI ZONE MINIGAME OPTIONS * - * Catch and flee rate **multipliers** are calculated in the same way stat changes are (they range from -6/+6) + * Catch and flee rate **stages** are calculated in the same way stat changes are (they range from -6/+6) * https://bulbapedia.bulbagarden.net/wiki/Catch_rate#Great_Marsh_and_Johto_Safari_Zone * * Catch Rate calculation: @@ -38,7 +106,7 @@ const namespace = "mysteryEncounter:safari_zone"; * fleeRate = ((255^2 - speciesCatchRate^2) / 255 / 2) [0 to 127.5] * fleeStageMultiplier [2/8 to 8/2] * Flee chance = fleeRate / 255 */ -const safariZoneOptions: MysteryEncounterOption[] = [ +const safariZoneGameOptions: MysteryEncounterOption[] = [ new MysteryEncounterOptionBuilder() .withOptionMode(EncounterOptionMode.DEFAULT) .withDialogue({ @@ -47,7 +115,7 @@ const safariZoneOptions: MysteryEncounterOption[] = [ selected: [ { text: `${namespace}_pokeball_option_selected`, - }, + } ], }) .withOptionPhase(async (scene: BattleScene) => { @@ -61,7 +129,7 @@ const safariZoneOptions: MysteryEncounterOption[] = [ // Check how many safari pokemon left if (scene.currentBattle.mysteryEncounter.misc.safariPokemonRemaining > 0) { await summonSafariPokemon(scene); - initFollowupOptionSelect(scene, { overrideOptions: safariZoneOptions, startingCursorIndex: 0, hideDescription: true }); + initSubsequentOptionSelect(scene, { overrideOptions: safariZoneGameOptions, startingCursorIndex: 0, hideDescription: true }); } else { // End safari mode leaveEncounterWithoutBattle(scene, true); @@ -94,12 +162,10 @@ const safariZoneOptions: MysteryEncounterOption[] = [ // 80% chance to increase flee stage +1 const fleeChangeResult = tryChangeFleeStage(scene, 1, 8); if (!fleeChangeResult) { - scene.queueMessage(i18next.t(`${namespace}_pokemon_busy_eating`, { pokemonName: pokemon.name }), 0, null, 500); + await showEncounterText(scene, i18next.t(`${namespace}_pokemon_busy_eating`, { pokemonName: pokemon.name }), 1500, false ); } else { - scene.queueMessage(i18next.t(`${namespace}_pokemon_eating`, { pokemonName: pokemon.name }), 0, null, 500); + await showEncounterText(scene, i18next.t(`${namespace}_pokemon_eating`, { pokemonName: pokemon.name }), 1500, false); } - // TODO: throw bait with eat animation - // TODO: play bug bite sfx, maybe spike cannon? await doEndTurn(scene, 1); return true; @@ -125,9 +191,9 @@ const safariZoneOptions: MysteryEncounterOption[] = [ // 80% chance to decrease catch stage -1 const catchChangeResult = tryChangeCatchStage(scene, -1, 8); if (!catchChangeResult) { - scene.queueMessage(i18next.t(`${namespace}_pokemon_beside_itself_angry`, { pokemonName: pokemon.name }), 0, null, 500); + await showEncounterText(scene, i18next.t(`${namespace}_pokemon_beside_itself_angry`, { pokemonName: pokemon.name }), 1500, false ); } else { - scene.queueMessage(i18next.t(`${namespace}_pokemon_angry`, { pokemonName: pokemon.name }), 0, null, 500); + await showEncounterText(scene, i18next.t(`${namespace}_pokemon_angry`, { pokemonName: pokemon.name }), 1500, false ); } await doEndTurn(scene, 2); @@ -147,7 +213,7 @@ const safariZoneOptions: MysteryEncounterOption[] = [ // Check how many safari pokemon left if (scene.currentBattle.mysteryEncounter.misc.safariPokemonRemaining > 0) { await summonSafariPokemon(scene); - initFollowupOptionSelect(scene, { overrideOptions: safariZoneOptions, startingCursorIndex: 3, hideDescription: true }); + initSubsequentOptionSelect(scene, { overrideOptions: safariZoneGameOptions, startingCursorIndex: 3, hideDescription: true }); } else { // End safari mode leaveEncounterWithoutBattle(scene, true); @@ -157,106 +223,6 @@ const safariZoneOptions: MysteryEncounterOption[] = [ .build() ]; -export const SafariZoneEncounter: IMysteryEncounter = - MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.SAFARI_ZONE) - .withEncounterTier(MysteryEncounterTier.GREAT) - .withSceneWaveRangeRequirement(10, 180) // waves 2 to 180 - .withSceneRequirement(new MoneyRequirement(0, 2.75)) // Cost equal to 1 Max Revive - .withHideIntroVisuals(false) - .withIntroSpriteConfigs([ - { - spriteKey: "chest_blue", - fileRoot: "mystery-encounters", - hasShadow: true, - x: 4, - y: 10, - yShadowOffset: 3, - disableAnimation: true, // Re-enabled after option select - }, - ]) - .withIntroDialogue([ - { - text: `${namespace}_intro_message`, - }, - ]) - .withTitle(`${namespace}_title`) - .withDescription(`${namespace}_description`) - .withQuery(`${namespace}_query`) - .withOption(new MysteryEncounterOptionBuilder() - .withOptionMode(EncounterOptionMode.DISABLED_OR_DEFAULT) - // TODO: update - .withSceneRequirement(new MoneyRequirement(0, 2.75)) // Cost equal to 1 Max Revive - .withDialogue({ - buttonLabel: `${namespace}_option_1_label`, - buttonTooltip: `${namespace}_option_1_tooltip`, - selected: [ - { - text: `${namespace}_option_1_selected_message`, - }, - ], - }) - .withOptionPhase(async (scene: BattleScene) => { - // Start safari encounter - const encounter = scene.currentBattle.mysteryEncounter; - encounter.encounterVariant = MysteryEncounterVariant.SAFARI_BATTLE; - encounter.misc = { - safariPokemonRemaining: 3 - }; - updatePlayerMoney(scene, -(encounter.options[0].requirements[0] as MoneyRequirement).requiredMoney); - scene.loadSe("PRSFX- Bug Bite", "battle_anims"); - scene.loadSe("PRSFX- Sludge Bomb2", "battle_anims"); - scene.loadSe("PRSFX- Taunt2", "battle_anims"); - await hideMysteryEncounterIntroVisuals(scene); - await summonSafariPokemon(scene); - initFollowupOptionSelect(scene, { overrideOptions: safariZoneOptions, hideDescription: true }); - return true; - }) - .build() - ) - .withSimpleOption( - { - buttonLabel: `${namespace}_option_2_label`, - buttonTooltip: `${namespace}_option_2_tooltip`, - selected: [ - { - text: `${namespace}_option_2_selected_message`, - }, - ], - }, - async (scene: BattleScene) => { - // Leave encounter with no rewards or exp - leaveEncounterWithoutBattle(scene, true); - return true; - } - ) - .build(); - -function hideMysteryEncounterIntroVisuals(scene: BattleScene): Promise { - return new Promise(resolve => { - const introVisuals = scene.currentBattle.mysteryEncounter.introVisuals; - if (introVisuals) { - // Hide - scene.tweens.add({ - targets: introVisuals, - x: "+=16", - y: "-=16", - alpha: 0, - ease: "Sine.easeInOut", - duration: 750, - onComplete: () => { - scene.field.remove(introVisuals); - introVisuals.setVisible(false); - introVisuals.destroy(); - scene.currentBattle.mysteryEncounter.introVisuals = null; - resolve(true); - } - }); - } else { - resolve(true); - } - }); -} - async function summonSafariPokemon(scene: BattleScene) { const encounter = scene.currentBattle.mysteryEncounter; // Message pokemon remaining @@ -295,7 +261,7 @@ async function summonSafariPokemon(scene: BattleScene) { pokemon.calculateStats(); scene.currentBattle.enemyParty[0] = pokemon; - }, scene.currentBattle.waveIndex + encounter.misc.safariPokemonRemaining); + }, scene.currentBattle.waveIndex * 1000 + encounter.misc.safariPokemonRemaining); scene.gameData.setPokemonSeen(pokemon, true); await pokemon.loadAssets(); @@ -308,18 +274,16 @@ async function summonSafariPokemon(scene: BattleScene) { scene.unshiftPhase(new SummonPhase(scene, 0, false)); - scene.ui.showText(i18next.t("battle:singleWildAppeared", { pokemonName: pokemon.name }), null, () => { - const ivScannerModifier = scene.findModifier(m => m instanceof IvScannerModifier); - if (ivScannerModifier) { - scene.pushPhase(new ScanIvsPhase(scene, pokemon.getBattlerIndex(), Math.min(ivScannerModifier.getStackCount() * 2, 6))); - } - }, 1500); + showEncounterText(scene, i18next.t("battle:singleWildAppeared", { pokemonName: pokemon.name }), 1500, false) + .then(() => { + const ivScannerModifier = scene.findModifier(m => m instanceof IvScannerModifier); + if (ivScannerModifier) { + scene.pushPhase(new ScanIvsPhase(scene, pokemon.getBattlerIndex(), Math.min(ivScannerModifier.getStackCount() * 2, 6))); + } + }); } -async function throwPokeball(scene: BattleScene, pokemon: EnemyPokemon): Promise { - const pokeballType: PokeballType = PokeballType.POKEBALL; - const originalY: number = pokemon.y; - +function throwPokeball(scene: BattleScene, pokemon: EnemyPokemon): Promise { const baseCatchRate = pokemon.species.catchRate; // Catch stage ranges from -6 to +6 (like stat boost stages) const safariCatchStage = scene.currentBattle.mysteryEncounter.misc.catchStage; @@ -329,144 +293,18 @@ async function throwPokeball(scene: BattleScene, pokemon: EnemyPokemon): Promise const pokeballMultiplier = 1.5; const catchRate = Math.round(baseCatchRate * pokeballMultiplier * safariModifier); const ballTwitchRate = Math.round(1048560 / Math.sqrt(Math.sqrt(16711680 / catchRate))); - const fpOffset = pokemon.getFieldPositionOffset(); - const catchSuccess = (ballTwitchRate / 65536) * (ballTwitchRate / 65536) * (ballTwitchRate / 65536); - console.log("Catch success rate: " + catchSuccess); - - const pokeballAtlasKey = getPokeballAtlasKey(pokeballType); - const pokeball: Phaser.GameObjects.Sprite = scene.addFieldSprite(16 + 75, 80 + 25, "pb", pokeballAtlasKey); - pokeball.setOrigin(0.5, 0.625); - scene.field.add(pokeball); - - scene.playSound("pb_throw"); - scene.time.delayedCall(300, () => { - scene.field.moveBelow(pokeball as Phaser.GameObjects.GameObject, pokemon); - }); - - return new Promise(resolve => { - scene.trainer.setTexture(`trainer_${scene.gameData.gender === PlayerGender.FEMALE ? "f" : "m"}_back_pb`); - scene.time.delayedCall(512, () => { - // Trainer throw frames - scene.trainer.setFrame("2"); - scene.time.delayedCall(256, () => { - scene.trainer.setFrame("3"); - scene.time.delayedCall(768, () => { - scene.trainer.setTexture(`trainer_${scene.gameData.gender === PlayerGender.FEMALE ? "f" : "m"}_back`); - }); - }); - - // Pokeball move and catch logic - scene.tweens.add({ - targets: pokeball, - x: { value: 236 + fpOffset[0], ease: "Linear" }, - y: { value: 16 + fpOffset[1], ease: "Cubic.easeOut" }, - duration: 500, - onComplete: () => { - pokeball.setTexture("pb", `${pokeballAtlasKey}_opening`); - scene.time.delayedCall(17, () => pokeball.setTexture("pb", `${pokeballAtlasKey}_open`)); - scene.playSound("pb_rel"); - pokemon.tint(getPokeballTintColor(pokeballType)); - - addPokeballOpenParticles(scene, pokeball.x, pokeball.y, pokeballType); - - scene.tweens.add({ - targets: pokemon, - duration: 500, - ease: "Sine.easeIn", - scale: 0.25, - y: 20, - onComplete: () => { - pokeball.setTexture("pb", `${pokeballAtlasKey}_opening`); - pokemon.setVisible(false); - scene.playSound("pb_catch"); - scene.time.delayedCall(17, () => pokeball.setTexture("pb", `${pokeballAtlasKey}`)); - - const doShake = () => { - let shakeCount = 0; - const pbX = pokeball.x; - const shakeCounter = scene.tweens.addCounter({ - from: 0, - to: 1, - repeat: 4, - yoyo: true, - ease: "Cubic.easeOut", - duration: 250, - repeatDelay: 500, - onUpdate: t => { - if (shakeCount && shakeCount < 4) { - const value = t.getValue(); - const directionMultiplier = shakeCount % 2 === 1 ? 1 : -1; - pokeball.setX(pbX + value * 4 * directionMultiplier); - pokeball.setAngle(value * 27.5 * directionMultiplier); - } - }, - onRepeat: () => { - if (!pokemon.species.isObtainable()) { - shakeCounter.stop(); - failCatch(scene, pokemon, originalY, pokeball, pokeballType).then(() => resolve(false)); - } else if (shakeCount++ < 3) { - if (randSeedInt(65536) < ballTwitchRate) { - scene.playSound("pb_move"); - } else { - shakeCounter.stop(); - failCatch(scene, pokemon, originalY, pokeball, pokeballType).then(() => resolve(false)); - } - } else { - scene.playSound("pb_lock"); - addPokeballCaptureStars(scene, pokeball); - - const pbTint = scene.add.sprite(pokeball.x, pokeball.y, "pb", "pb"); - pbTint.setOrigin(pokeball.originX, pokeball.originY); - pbTint.setTintFill(0); - pbTint.setAlpha(0); - scene.field.add(pbTint); - scene.tweens.add({ - targets: pbTint, - alpha: 0.375, - duration: 200, - easing: "Sine.easeOut", - onComplete: () => { - scene.tweens.add({ - targets: pbTint, - alpha: 0, - duration: 200, - easing: "Sine.easeIn", - onComplete: () => pbTint.destroy() - }); - } - }); - } - }, - onComplete: () => { - catchPokemon(scene, pokemon, pokeball, pokeballType).then(() => resolve(true)); - } - }); - }; - - scene.time.delayedCall(250, () => doPokeballBounceAnim(scene, pokeball, 16, 72, 350, doShake)); - } - }); - } - }); - }); - }); + return trainerThrowPokeball(scene, pokemon, PokeballType.POKEBALL, ballTwitchRate); } async function throwBait(scene: BattleScene, pokemon: EnemyPokemon): Promise { - // TODO: replace with bait - const pokeballType: PokeballType = PokeballType.POKEBALL; const originalY: number = pokemon.y; const fpOffset = pokemon.getFieldPositionOffset(); - const pokeballAtlasKey = getPokeballAtlasKey(pokeballType); - const bait: Phaser.GameObjects.Sprite = scene.addFieldSprite(16 + 75, 80 + 25, "pb", pokeballAtlasKey); + const bait: Phaser.GameObjects.Sprite = scene.addFieldSprite(16 + 75, 80 + 25, "bait", "0001.png"); bait.setOrigin(0.5, 0.625); scene.field.add(bait); scene.playSound("pb_throw"); - // scene.time.delayedCall(300, () => { - // scene.field.moveBelow(pokemon, pokeball as Phaser.GameObjects.GameObject); - // }); return new Promise(resolve => { scene.trainer.setTexture(`trainer_${scene.gameData.gender === PlayerGender.FEMALE ? "f" : "m"}_back_pb`); @@ -487,31 +325,34 @@ async function throwBait(scene: BattleScene, pokemon: EnemyPokemon): Promise { - // Bait frame 2 - bait.setTexture("pb", `${pokeballAtlasKey}_opening`); - // Bait frame 3 - scene.time.delayedCall(17, () => bait.setTexture("pb", `${pokeballAtlasKey}_open`)); - // scene.playSound("pb_rel"); - // pokemon.tint(getPokeballTintColor(pokeballType)); - // addPokeballOpenParticles(scene, pokeball.x, pokeball.y, pokeballType); - scene.time.delayedCall(512, () => { + let index = 1; + scene.time.delayedCall(768, () => { scene.tweens.add({ targets: pokemon, - duration: 200, + duration: 150, ease: "Cubic.easeOut", yoyo: true, - y: originalY - 30, - loop: 2, + y: originalY - 5, + loop: 6, onStart: () => { scene.playSound("PRSFX- Bug Bite"); + bait.setFrame("0002.png"); }, onLoop: () => { - scene.playSound("PRSFX- Bug Bite"); + if (index % 2 === 0) { + scene.playSound("PRSFX- Bug Bite"); + } + if (index === 4) { + bait.setFrame("0003.png"); + } + index++; }, onComplete: () => { - resolve(true); - bait.destroy(); + scene.time.delayedCall(256, () => { + bait.destroy(); + resolve(true); + }); } }); }); @@ -522,13 +363,10 @@ async function throwBait(scene: BattleScene, pokemon: EnemyPokemon): Promise { - // TODO: replace with mud - const pokeballType: PokeballType = PokeballType.POKEBALL; const originalY: number = pokemon.y; const fpOffset = pokemon.getFieldPositionOffset(); - const pokeballAtlasKey = getPokeballAtlasKey(pokeballType); - const mud: Phaser.GameObjects.Sprite = scene.addFieldSprite(16 + 75, 80 + 25, "pb", pokeballAtlasKey); + const mud: Phaser.GameObjects.Sprite = scene.addFieldSprite(16 + 75, 80 + 25, "mud", "0001.png"); mud.setOrigin(0.5, 0.625); scene.field.add(mud); @@ -546,21 +384,24 @@ async function throwMud(scene: BattleScene, pokemon: EnemyPokemon): Promise { - // Bait frame 2 - mud.setTexture("pb", `${pokeballAtlasKey}_opening`); - // Bait frame 3 - scene.time.delayedCall(17, () => mud.setTexture("pb", `${pokeballAtlasKey}_open`)); + // Mud frame 2 scene.playSound("PRSFX- Sludge Bomb2"); - // pokemon.tint(getPokeballTintColor(pokeballType)); + mud.setFrame("0002.png"); + // Mud splat + scene.time.delayedCall(512, () => { + mud.setFrame("0003.png"); + scene.time.delayedCall(512, () => { + mud.setFrame("0004.png"); + }); + }); - // addPokeballOpenParticles(scene, pokeball.x, pokeball.y, pokeballType); scene.time.delayedCall(1536, () => { mud.destroy(); scene.tweens.add({ @@ -587,129 +428,6 @@ async function throwMud(scene: BattleScene, pokemon: EnemyPokemon): Promise(resolve => { - scene.playSound("pb_rel"); - pokemon.setY(originalY); - if (pokemon.status?.effect !== StatusEffect.SLEEP) { - pokemon.cry(pokemon.getHpRatio() > 0.25 ? undefined : { rate: 0.85 }); - } - pokemon.tint(getPokeballTintColor(pokeballType)); - pokemon.setVisible(true); - pokemon.untint(250, "Sine.easeOut"); - - const pokeballAtlasKey = getPokeballAtlasKey(pokeballType); - pokeball.setTexture("pb", `${pokeballAtlasKey}_opening`); - scene.time.delayedCall(17, () => pokeball.setTexture("pb", `${pokeballAtlasKey}_open`)); - - scene.tweens.add({ - targets: pokemon, - duration: 250, - ease: "Sine.easeOut", - scale: 1 - }); - - scene.currentBattle.lastUsedPokeball = pokeballType; - removePb(scene, pokeball); - - scene.ui.showText(i18next.t("battle:pokemonBrokeFree", { pokemonName: pokemon.name }), null, () => resolve(), null, true); - }); -} - -async function catchPokemon(scene: BattleScene, pokemon: EnemyPokemon, pokeball: Phaser.GameObjects.Sprite, pokeballType: PokeballType): Promise { - scene.unshiftPhase(new VictoryPhase(scene, BattlerIndex.ENEMY)); - - const speciesForm = !pokemon.fusionSpecies ? pokemon.getSpeciesForm() : pokemon.getFusionSpeciesForm(); - - if (speciesForm.abilityHidden && (pokemon.fusionSpecies ? pokemon.fusionAbilityIndex : pokemon.abilityIndex) === speciesForm.getAbilityCount() - 1) { - scene.validateAchv(achvs.HIDDEN_ABILITY); - } - - if (pokemon.species.subLegendary) { - scene.validateAchv(achvs.CATCH_SUB_LEGENDARY); - } - - if (pokemon.species.legendary) { - scene.validateAchv(achvs.CATCH_LEGENDARY); - } - - if (pokemon.species.mythical) { - scene.validateAchv(achvs.CATCH_MYTHICAL); - } - - scene.pokemonInfoContainer.show(pokemon, true); - - scene.gameData.updateSpeciesDexIvs(pokemon.species.getRootSpeciesId(true), pokemon.ivs); - - return new Promise(resolve => { - scene.ui.showText(i18next.t("battle:pokemonCaught", { pokemonName: pokemon.name }), null, () => { - const end = () => { - scene.pokemonInfoContainer.hide(); - removePb(scene, pokeball); - resolve(); - }; - const removePokemon = () => { - scene.field.remove(pokemon, true); - }; - const addToParty = () => { - const newPokemon = pokemon.addToParty(pokeballType); - const modifiers = scene.findModifiers(m => m instanceof PokemonHeldItemModifier, false); - if (scene.getParty().filter(p => p.isShiny()).length === 6) { - scene.validateAchv(achvs.SHINY_PARTY); - } - Promise.all(modifiers.map(m => scene.addModifier(m, true))).then(() => { - scene.updateModifiers(true); - removePokemon(); - if (newPokemon) { - newPokemon.loadAssets().then(end); - } else { - end(); - } - }); - }; - Promise.all([pokemon.hideInfo(), scene.gameData.setPokemonCaught(pokemon)]).then(() => { - if (scene.getParty().length === 6) { - const promptRelease = () => { - scene.ui.showText(i18next.t("battle:partyFull", { pokemonName: pokemon.name }), null, () => { - scene.pokemonInfoContainer.makeRoomForConfirmUi(); - scene.ui.setMode(Mode.CONFIRM, () => { - scene.ui.setMode(Mode.PARTY, PartyUiMode.RELEASE, 0, (slotIndex: integer, _option: PartyOption) => { - scene.ui.setMode(Mode.MESSAGE).then(() => { - if (slotIndex < 6) { - addToParty(); - } else { - promptRelease(); - } - }); - }); - }, () => { - scene.ui.setMode(Mode.MESSAGE).then(() => { - removePokemon(); - end(); - }); - }); - }); - }; - promptRelease(); - } else { - addToParty(); - } - }); - }, 0, true); - }); -} - -function removePb(scene: BattleScene, pokeball: Phaser.GameObjects.Sprite) { - scene.tweens.add({ - targets: pokeball, - duration: 250, - delay: 250, - ease: "Sine.easeIn", - alpha: 0, - onComplete: () => pokeball.destroy() - }); -} - function isPokemonFlee(pokemon: EnemyPokemon, fleeStage: number): boolean { const speciesCatchRate = pokemon.species.catchRate; const fleeModifier = (2 + Math.min(Math.max(fleeStage, 0), 6)) / (2 - Math.max(Math.min(fleeStage, 0), -6)); @@ -720,84 +438,26 @@ function isPokemonFlee(pokemon: EnemyPokemon, fleeStage: number): boolean { return roll < fleeRate; } -async function doPokemonFlee(scene: BattleScene, pokemon: EnemyPokemon): Promise { - const fleeAnimation = new Promise(resolve => { - // Ease pokemon out - scene.tweens.add({ - targets: pokemon, - x: "+=16", - y: "-=16", - alpha: 0, - duration: 1000, - ease: "Sine.easeIn", - scale: pokemon.getSpriteScale(), - onComplete: () => { - pokemon.setVisible(false); - scene.field.remove(pokemon, true); - resolve(); - } - }); - }); - - const prompt = new Promise(resolve => { - scene.ui.showText(i18next.t("battle:pokemonFled", { pokemonName: pokemon.name }), 0, () => resolve(), 500); - }); - - await Promise.all([fleeAnimation, prompt]); -} - -async function doPlayerFlee(scene: BattleScene, pokemon: EnemyPokemon): Promise { - const fleeAnimation = new Promise(resolve => { - // Ease pokemon out - scene.tweens.add({ - targets: pokemon, - x: "+=16", - y: "-=16", - alpha: 0, - duration: 1000, - ease: "Sine.easeIn", - scale: pokemon.getSpriteScale(), - onComplete: () => { - pokemon.setVisible(false); - scene.field.remove(pokemon, true); - resolve(); - } - }); - }); - - const prompt = new Promise(resolve => { - scene.ui.showText(i18next.t("battle:playerFled", { pokemonName: pokemon.name }), 0, () => resolve(), 500); - }); - - await Promise.all([fleeAnimation, prompt]); -} - function tryChangeFleeStage(scene: BattleScene, change: number, chance?: number): boolean { if (chance && randSeedInt(10) >= chance) { - console.log("Failed to change flee stage"); return false; } const currentFleeStage = scene.currentBattle.mysteryEncounter.misc.fleeStage ?? 0; - // console.log("currentFleeStage: " + currentFleeStage); scene.currentBattle.mysteryEncounter.misc.fleeStage = Math.min(Math.max(currentFleeStage + change, -6), 6); return true; } function tryChangeCatchStage(scene: BattleScene, change: number, chance?: number): boolean { if (chance && randSeedInt(10) >= chance) { - console.log("Failed to change catch stage"); return false; } const currentCatchStage = scene.currentBattle.mysteryEncounter.misc.catchStage ?? 0; - // console.log("currentCatchStage: " + currentCatchStage); scene.currentBattle.mysteryEncounter.misc.catchStage = Math.min(Math.max(currentCatchStage + change, -6), 6); return true; } async function doEndTurn(scene: BattleScene, cursorIndex: number, message?: string) { const pokemon = scene.currentBattle.mysteryEncounter.misc.pokemon; - console.log("fleeStage: " + scene.currentBattle.mysteryEncounter.misc.fleeStage); - console.log("catchStage: " + scene.currentBattle.mysteryEncounter.misc.catchStage); const isFlee = isPokemonFlee(pokemon, scene.currentBattle.mysteryEncounter.misc.fleeStage); if (isFlee) { // Pokemon flees! @@ -805,13 +465,13 @@ async function doEndTurn(scene: BattleScene, cursorIndex: number, message?: stri // Check how many safari pokemon left if (scene.currentBattle.mysteryEncounter.misc.safariPokemonRemaining > 0) { await summonSafariPokemon(scene); - initFollowupOptionSelect(scene, { overrideOptions: safariZoneOptions, startingCursorIndex: cursorIndex, hideDescription: true }); + initSubsequentOptionSelect(scene, { overrideOptions: safariZoneGameOptions, startingCursorIndex: cursorIndex, hideDescription: true }); } else { // End safari mode leaveEncounterWithoutBattle(scene, true); } } else { - scene.queueMessage(i18next.t(`${namespace}_pokemon_watching`, { pokemonName: pokemon.name }), 0, null, 500); - initFollowupOptionSelect(scene, { overrideOptions: safariZoneOptions, startingCursorIndex: cursorIndex, hideDescription: true }); + scene.queueMessage(i18next.t(`${namespace}_pokemon_watching`, { pokemonName: pokemon.name }), 0, null, 1000); + initSubsequentOptionSelect(scene, { overrideOptions: safariZoneGameOptions, startingCursorIndex: cursorIndex, hideDescription: 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 8bfd6daa9f9..7e32ca87c55 100644 --- a/src/data/mystery-encounters/encounters/shady-vitamin-dealer-encounter.ts +++ b/src/data/mystery-encounters/encounters/shady-vitamin-dealer-encounter.ts @@ -1,4 +1,4 @@ -import { generateModifierTypeOption, leaveEncounterWithoutBattle, queueEncounterMessage, selectPokemonForOption, setEncounterExp, updatePlayerMoney, } from "#app/data/mystery-encounters/mystery-encounter-utils"; +import { generateModifierTypeOption, leaveEncounterWithoutBattle, selectPokemonForOption, setEncounterExp, updatePlayerMoney, } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { StatusEffect } from "#app/data/status-effect"; import Pokemon, { PlayerPokemon } from "#app/field/pokemon"; import { modifierTypes } from "#app/modifier/modifier-type"; @@ -10,6 +10,7 @@ import BattleScene from "../../../battle-scene"; import IMysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier, } from "../mystery-encounter"; import { EncounterOptionMode, MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; import { MoneyRequirement } from "../mystery-encounter-requirements"; +import { queueEncounterMessage } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; /** the i18n namespace for this encounter */ const namespace = "mysteryEncounter:shady_vitamin_dealer"; diff --git a/src/data/mystery-encounters/encounters/sleeping-snorlax-encounter.ts b/src/data/mystery-encounters/encounters/sleeping-snorlax-encounter.ts index e0f4d2406e8..9d3659f9443 100644 --- a/src/data/mystery-encounters/encounters/sleeping-snorlax-encounter.ts +++ b/src/data/mystery-encounters/encounters/sleeping-snorlax-encounter.ts @@ -10,7 +10,8 @@ import { Status, StatusEffect } from "../../status-effect"; import IMysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier, } from "../mystery-encounter"; import { EncounterOptionMode, MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; import { MoveRequirement } from "../mystery-encounter-requirements"; -import { EnemyPartyConfig, EnemyPokemonConfig, generateModifierTypeOption, initBattleWithEnemyConfig, leaveEncounterWithoutBattle, queueEncounterMessage, setEncounterExp, setEncounterRewards, } from "../mystery-encounter-utils"; +import { EnemyPartyConfig, EnemyPokemonConfig, generateModifierTypeOption, initBattleWithEnemyConfig, leaveEncounterWithoutBattle, setEncounterExp, setEncounterRewards, } from "../utils/encounter-phase-utils"; +import { queueEncounterMessage } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; /** i18n namespace for the encounter */ const namespace = "mysteryEncounter:sleeping_snorlax"; diff --git a/src/data/mystery-encounters/encounters/training-session-encounter.ts b/src/data/mystery-encounters/encounters/training-session-encounter.ts index 6abb340469a..1c0c3633883 100644 --- a/src/data/mystery-encounters/encounters/training-session-encounter.ts +++ b/src/data/mystery-encounters/encounters/training-session-encounter.ts @@ -1,5 +1,5 @@ import { Ability, allAbilities } from "#app/data/ability"; -import { EnemyPartyConfig, getEncounterText, initBattleWithEnemyConfig, selectPokemonForOption, setEncounterRewards, } from "#app/data/mystery-encounters/mystery-encounter-utils"; +import { EnemyPartyConfig, initBattleWithEnemyConfig, selectPokemonForOption, setEncounterRewards, } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { getNatureName, Nature } from "#app/data/nature"; import { speciesStarters } from "#app/data/pokemon-species"; import { Stat } from "#app/data/pokemon-stat"; @@ -16,6 +16,7 @@ import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import BattleScene from "../../../battle-scene"; import IMysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier, } from "../mystery-encounter"; import { EncounterOptionMode, MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; +import { queueEncounterMessage } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; /** The i18n namespace for the encounter */ const namespace = "mysteryEncounter:training_session"; @@ -32,7 +33,9 @@ export const TrainingSessionEncounter: IMysteryEncounter = spriteKey: "training_gear", fileRoot: "mystery-encounters", hasShadow: true, - y: 3, + y: 6, + x: 5, + yShadowOffset: -2 }, ]) .withIntroDialogue([ @@ -162,7 +165,7 @@ export const TrainingSessionEncounter: IMysteryEncounter = scene.addModifier(mod, true, false, false, true); } scene.updateModifiers(true); - scene.queueMessage(getEncounterText(scene, `${namespace}_battle_finished_1`), null, true); + queueEncounterMessage(scene, `${namespace}_battle_finished_1`); }; setEncounterRewards( @@ -234,11 +237,7 @@ export const TrainingSessionEncounter: IMysteryEncounter = scene.removePokemonFromPlayerParty(playerPokemon, false); const onBeforeRewardsPhase = () => { - scene.queueMessage( - getEncounterText(scene, `${namespace}_battle_finished_2`), - null, - true - ); + queueEncounterMessage(scene, `${namespace}_battle_finished_2`); // Add the pokemon back to party with Nature change playerPokemon.setNature(encounter.misc.chosenNature); scene.gameData.setPokemonCaught(playerPokemon, false); @@ -333,7 +332,7 @@ export const TrainingSessionEncounter: IMysteryEncounter = scene.removePokemonFromPlayerParty(playerPokemon, false); const onBeforeRewardsPhase = () => { - scene.queueMessage(getEncounterText(scene, `${namespace}_battle_finished_3`), null, true); + queueEncounterMessage(scene, `${namespace}_battle_finished_3`); // Add the pokemon back to party with ability change const abilityIndex = encounter.misc.abilityIndex; if (!!playerPokemon.getFusionSpeciesForm()) { diff --git a/src/data/mystery-encounters/mystery-encounter.ts b/src/data/mystery-encounters/mystery-encounter.ts index 0be21d1520f..45ff955bc33 100644 --- a/src/data/mystery-encounters/mystery-encounter.ts +++ b/src/data/mystery-encounters/mystery-encounter.ts @@ -1,4 +1,4 @@ -import { EnemyPartyConfig } from "#app/data/mystery-encounters/mystery-encounter-utils"; +import { EnemyPartyConfig } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import Pokemon, { PlayerPokemon } from "#app/field/pokemon"; import { isNullOrUndefined } from "#app/utils"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; @@ -58,14 +58,16 @@ export default interface IMysteryEncounter { * Requirements */ requirements?: EncounterSceneRequirement[]; + /** Primary Pokemon is a single pokemon randomly selected from the party that meet ALL primary pokemon requirements */ primaryPokemonRequirements?: EncounterPokemonRequirement[]; - secondaryPokemonRequirements?: EncounterPokemonRequirement[]; // A list of requirements that must ALL be met by a subset of pokemon to trigger the event + /** + * Secondary Pokemon are pokemon that meet ALL secondary pokemon requirements + * Note that an individual requirement may require multiple pokemon, but the resulting pokemon after all secondary requirements are met may be lower than expected + * If the primary pokemon and secondary pokemon are the same and ExcludePrimaryFromSupportRequirements flag is true, primary pokemon may be promoted from secondary pool + */ + secondaryPokemonRequirements?: EncounterPokemonRequirement[]; excludePrimaryFromSupportRequirements?: boolean; - // Primary Pokemon is a single pokemon randomly selected from a set of pokemon that meet ALL primary pokemon requirements primaryPokemon?: PlayerPokemon; - // Support Pokemon are pokemon that meet ALL support pokemon requirements. - // Note that an individual requirement may require multiple pokemon, but the resulting pokemon after all secondary requirements are met may be lower than expected - // If the primary pokemon and supporting pokemon are the same and ExcludePrimaryFromSupportRequirements flag is true, primary pokemon may be promoted from secondary pool secondaryPokemon?: PlayerPokemon[]; /** @@ -118,19 +120,11 @@ export default interface IMysteryEncounter { * Defaults to 1 */ expMultiplier?: number; - - /** - * When true, will never queue PostSummon phases from a SummonPhase - * Defaults to false - */ - disableAllPostSummon?: boolean; - /** * Used for keeping RNG consistent on session resets, but increments when cycling through multiple "Encounters" on the same wave * You should never need to modify this */ seedOffset?: any; - /** * Generic property to set any custom data required for the encounter * Extremely useful for carrying state/data between onPreOptionPhase/onOptionPhase/onPostOptionPhase diff --git a/src/data/mystery-encounters/utils/encounter-dialogue-utils.ts b/src/data/mystery-encounters/utils/encounter-dialogue-utils.ts new file mode 100644 index 00000000000..1042984533d --- /dev/null +++ b/src/data/mystery-encounters/utils/encounter-dialogue-utils.ts @@ -0,0 +1,72 @@ +import BattleScene from "#app/battle-scene"; +import { getTextWithColors, TextStyle } from "#app/ui/text"; +import { UiTheme } from "#enums/ui-theme"; +import { isNullOrUndefined } from "#app/utils"; +import i18next from "i18next"; + +export function getEncounterText(scene: BattleScene, keyOrString: string, primaryStyle?: TextStyle, uiTheme: UiTheme = UiTheme.DEFAULT): string { + if (isNullOrUndefined(keyOrString)) { + return null; + } + + let textString: string = getTextWithDialogueTokens(scene, keyOrString); + + // Can only color the text if a Primary Style is defined + // primaryStyle is applied to all text that does not have its own specified style + if (primaryStyle) { + textString = getTextWithColors(textString, primaryStyle, uiTheme); + } + + return textString; +} + +function getTextWithDialogueTokens(scene: BattleScene, keyOrString: string): string { + if (isNullOrUndefined(keyOrString)) { + return null; + } + + if (i18next.exists(keyOrString, scene.currentBattle?.mysteryEncounter?.dialogueTokens)) { + const stringArray = [`${keyOrString}`] as any; + stringArray.raw = [`${keyOrString}`]; + return i18next.t(stringArray, scene.currentBattle?.mysteryEncounter?.dialogueTokens); + } + + return keyOrString; +} + +/** + * Will queue a message in UI with injected encounter data tokens + * @param scene + * @param contentKey + */ +export function queueEncounterMessage(scene: BattleScene, contentKey: string): void { + const text: string = getEncounterText(scene, contentKey); + scene.queueMessage(text, null, true); +} + +/** + * Will display a message in UI with injected encounter data tokens + * @param scene + * @param contentKey + * @param prompt + * @param callbackDelay + */ +export function showEncounterText(scene: BattleScene, contentKey: string, callbackDelay: number = 0, prompt: boolean = true): Promise { + return new Promise(resolve => { + const text: string = getEncounterText(scene, contentKey); + scene.ui.showText(text, null, () => resolve(), callbackDelay, prompt); + }); +} + +/** + * Will display a dialogue (with speaker title) in UI with injected encounter data tokens + * @param scene + * @param textContentKey + * @param speakerContentKey + * @param callback + */ +export function showEncounterDialogue(scene: BattleScene, textContentKey: string, speakerContentKey: string, callback?: Function) { + const text: string = getEncounterText(scene, textContentKey); + const speaker: string = getEncounterText(scene, speakerContentKey); + scene.ui.showDialogue(text, speaker, null, callback, 0, 0); +} diff --git a/src/data/mystery-encounters/mystery-encounter-utils.ts b/src/data/mystery-encounters/utils/encounter-phase-utils.ts similarity index 76% rename from src/data/mystery-encounters/mystery-encounter-utils.ts rename to src/data/mystery-encounters/utils/encounter-phase-utils.ts index e0c8f73e569..100c25aa45d 100644 --- a/src/data/mystery-encounters/mystery-encounter-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-phase-utils.ts @@ -1,21 +1,19 @@ import i18next from "i18next"; import { BattleType } from "#app/battle"; -import BattleScene from "../../battle-scene"; -import PokemonSpecies, { getPokemonSpecies, speciesStarters } from "../pokemon-species"; -import { MysteryEncounterVariant } from "./mystery-encounter"; -import { Status, StatusEffect } from "../status-effect"; -import { TrainerConfig, trainerConfigs, TrainerSlot } from "../trainer-config"; +import BattleScene from "../../../battle-scene"; +import PokemonSpecies from "../../pokemon-species"; +import { MysteryEncounterVariant } from "../mystery-encounter"; +import { Status, StatusEffect } from "../../status-effect"; +import { TrainerConfig, trainerConfigs, TrainerSlot } from "../../trainer-config"; import Pokemon, { FieldPosition, PlayerPokemon } from "#app/field/pokemon"; -import Trainer, { TrainerVariant } from "../../field/trainer"; +import Trainer, { TrainerVariant } from "../../../field/trainer"; import { ExpBalanceModifier, ExpShareModifier, MultipleParticipantExpBonusModifier, PokemonExpBoosterModifier } from "#app/modifier/modifier"; import { CustomModifierSettings, getModifierPoolForType, ModifierPoolType, ModifierType, ModifierTypeFunc, ModifierTypeGenerator, ModifierTypeOption, modifierTypes, PokemonHeldItemModifierType, regenerateModifierPoolThresholds } from "#app/modifier/modifier-type"; import { BattleEndPhase, EggLapsePhase, ExpPhase, ModifierRewardPhase, SelectModifierPhase, ShowPartyExpBarPhase, TrainerVictoryPhase } from "#app/phases"; import { MysteryEncounterBattlePhase, MysteryEncounterPhase, MysteryEncounterRewardsPhase } from "#app/phases/mystery-encounter-phase"; -import * as Utils from "../../utils"; +import * as Utils from "../../../utils"; import { isNullOrUndefined } from "#app/utils"; import { TrainerType } from "#enums/trainer-type"; -import { Species } from "#enums/species"; -import { Type } from "#app/data/type"; import { BattlerTagType } from "#enums/battler-tag-type"; import PokemonData from "#app/system/pokemon-data"; import { Biome } from "#enums/biome"; @@ -24,201 +22,9 @@ import { Mode } from "#app/ui/ui"; import { PartyOption, PartyUiMode } from "#app/ui/party-ui-handler"; import { OptionSelectConfig, OptionSelectItem } from "#app/ui/abstact-option-select-ui-handler"; import { WIGHT_INCREMENT_ON_SPAWN_MISS } from "#app/data/mystery-encounters/mystery-encounters"; -import { getTextWithColors, TextStyle } from "#app/ui/text"; import * as Overrides from "#app/overrides"; -import { UiTheme } from "#enums/ui-theme"; -import { MysteryEncounterUiSettings } from "#app/ui/mystery-encounter-ui-handler"; - -/** - * - * Will never remove the player's last non-fainted Pokemon (if they only have 1) - * Otherwise, picks a Pokemon completely at random and removes from the party - * @param scene - * @param isAllowedInBattle - default false. If true, only picks from unfainted mons. If there is only 1 unfainted mon left and doNotReturnLastAbleMon is also true, will return fainted mon - * @param doNotReturnLastAbleMon - If true, will never return the last unfainted pokemon in the party. Useful when this function is being used to determine what Pokemon to remove from the party (Don't want to remove last unfainted) - * @returns - */ -export function getRandomPlayerPokemon(scene: BattleScene, isAllowedInBattle: boolean = false, doNotReturnLastAbleMon: boolean = false): PlayerPokemon { - const party = scene.getParty(); - let chosenIndex: number; - let chosenPokemon: PlayerPokemon; - const unfaintedMons = party.filter(p => p.isAllowedInBattle()); - const faintedMons = party.filter(p => !p.isAllowedInBattle()); - - if (doNotReturnLastAbleMon && unfaintedMons.length === 1) { - chosenIndex = Utils.randSeedInt(faintedMons.length); - chosenPokemon = faintedMons.at(chosenIndex); - } else if (isAllowedInBattle) { - chosenIndex = Utils.randSeedInt(unfaintedMons.length); - chosenPokemon = unfaintedMons.at(chosenIndex); - } else { - chosenIndex = Utils.randSeedInt(party.length); - chosenPokemon = party.at(chosenIndex); - } - - return chosenPokemon; -} - -// export function getTokensFromScene(scene: BattleScene, reqs: EncounterSceneRequirement[]): Array<[RegExp, String]> { -// const arr = []; -// if (scene) { -// for (const req of reqs) { -// req.getDialogueToken(scene); -// } -// } -// return arr; -// } - -/** - * Ties are broken by whatever mon is closer to the front of the party - * @param scene - * @param unfainted - default false. If true, only picks from unfainted mons. - * @returns - */ -export function getHighestLevelPlayerPokemon(scene: BattleScene, unfainted: boolean = false): PlayerPokemon { - const party = scene.getParty(); - let pokemon: PlayerPokemon; - party.every(p => { - if (unfainted && p.isFainted()) { - return true; - } - - pokemon = pokemon ? pokemon?.level < p?.level ? p : pokemon : p; - return true; - }); - - return pokemon; -} - -/** - * Ties are broken by whatever mon is closer to the front of the party - * @param scene - * @param unfainted - default false. If true, only picks from unfainted mons. - * @returns - */ -export function getLowestLevelPlayerPokemon(scene: BattleScene, unfainted: boolean = false): PlayerPokemon { - const party = scene.getParty(); - let pokemon: PlayerPokemon; - party.every(p => { - if (unfainted && p.isFainted()) { - return true; - } - - pokemon = pokemon ? pokemon?.level > p?.level ? p : pokemon : p; - return true; - }); - - return pokemon; -} - -/** - * - * NOTE: This returns ANY random species, including those locked behind eggs, etc. - * @param starterTiers - * @param excludedSpecies - * @param types - * @returns - */ -export function getRandomSpeciesByStarterTier(starterTiers: number | [number, number], excludedSpecies?: Species[], types?: Type[]): Species { - let min = starterTiers instanceof Array ? starterTiers[0] : starterTiers; - let max = starterTiers instanceof Array ? starterTiers[1] : starterTiers; - - let filteredSpecies: [PokemonSpecies, number][] = Object.keys(speciesStarters) - .map(s => [parseInt(s) as Species, speciesStarters[s] as number]) - .filter(s => getPokemonSpecies(s[0]) && (!excludedSpecies || !excludedSpecies.includes(s[0]))) - .map(s => [getPokemonSpecies(s[0]), s[1]]); - - if (!isNullOrUndefined(types) && types.length > 0) { - filteredSpecies = filteredSpecies.filter(s => types.includes(s[0].type1) || types.includes(s[0].type2)); - } - - // If no filtered mons exist at specified starter tiers, will expand starter search range until there are - // Starts by decrementing starter tier min until it is 0, then increments tier max up to 10 - let tryFilterStarterTiers: [PokemonSpecies, number][] = filteredSpecies.filter(s => (s[1] >= min && s[1] <= max)); - while (tryFilterStarterTiers.length === 0 && (min !== 0 && max !== 10)) { - if (min > 0) { - min--; - } else { - max++; - } - - tryFilterStarterTiers = filteredSpecies.filter(s => s[1] >= min && s[1] <= max); - } - - if (tryFilterStarterTiers.length > 0) { - const index = Utils.randSeedInt(tryFilterStarterTiers.length); - return Phaser.Math.RND.shuffle(tryFilterStarterTiers)[index][0].speciesId; - } - - return Species.BULBASAUR; -} - -export function koPlayerPokemon(pokemon: PlayerPokemon) { - pokemon.hp = 0; - pokemon.trySetStatus(StatusEffect.FAINT); - pokemon.updateInfo(); -} - -export function getEncounterText(scene: BattleScene, textKey: string, primaryStyle?: TextStyle, uiTheme: UiTheme = UiTheme.DEFAULT): string { - if (isNullOrUndefined(textKey)) { - return null; - } - - const stringArray = [`${textKey}`] as any; - stringArray.raw = [`${textKey}`]; - let textString: string = getTextWithDialogueTokens(scene, stringArray); - - // Can only color the text if a Primary Style is defined - // primaryStyle is applied to all text that does not have its own specified style - if (primaryStyle) { - textString = getTextWithColors(textString, primaryStyle, uiTheme); - } - - return textString; -} - -function getTextWithDialogueTokens(scene: BattleScene, textKey: TemplateStringsArray): string { - if (isNullOrUndefined(textKey)) { - return null; - } - - return i18next.t(textKey, scene.currentBattle?.mysteryEncounter?.dialogueTokens); -} - -/** - * Will queue a message in UI with injected encounter data tokens - * @param scene - * @param contentKey - */ -export function queueEncounterMessage(scene: BattleScene, contentKey: string): void { - const text: string = getEncounterText(scene, contentKey); - scene.queueMessage(text, null, true); -} - -/** - * Will display a message in UI with injected encounter data tokens - * @param scene - * @param contentKey - */ -export function showEncounterText(scene: BattleScene, contentKey: string): Promise { - return new Promise(resolve => { - const text: string = getEncounterText(scene, contentKey); - scene.ui.showText(text, null, () => resolve(), 0, true); - }); -} - -/** - * Will display a dialogue (with speaker title) in UI with injected encounter data tokens - * @param scene - * @param textContentKey - * @param speakerContentKey - * @param callback - */ -export function showEncounterDialogue(scene: BattleScene, textContentKey: string, speakerContentKey: string, callback?: Function) { - const text: string = getEncounterText(scene, textContentKey); - const speaker: string = getEncounterText(scene, speakerContentKey); - scene.ui.showDialogue(text, speaker, null, callback, 0, 0); -} +import MysteryEncounterOption from "#app/data/mystery-encounters/mystery-encounter-option"; +import { showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; export class EnemyPokemonConfig { species: PokemonSpecies; @@ -525,8 +331,7 @@ export function selectPokemonForOption(scene: BattleScene, onPokemonSelected: (p if (!textPromptKey) { displayOptions(); } else { - const secondOptionSelectPrompt = getEncounterText(scene, textPromptKey, TextStyle.MESSAGE); - scene.ui.showText(secondOptionSelectPrompt, null, displayOptions, null, true); + showEncounterText(scene, textPromptKey).then(() => displayOptions()); } }); }); @@ -680,14 +485,24 @@ export function setEncounterExp(scene: BattleScene, participantIds: integer[], b }; } +export class OptionSelectSettings { + hideDescription?: boolean; + slideInDescription?: boolean; + overrideTitle?: string; + overrideDescription?: string; + overrideQuery?: string; + overrideOptions?: MysteryEncounterOption[]; + startingCursorIndex?: number; +} + /** - * Can be used to exit an encounter without any battles or followup - * Will skip any shops and rewards, and queue the next encounter phase as normal + * Can be used to queue a new series of Options to select for an Encounter + * MUST be used only in onOptionPhase, will not work in onPreOptionPhase or onPostOptionPhase * @param scene - * @param followupOptionSelectSettings + * @param optionSelectSettings */ -export function initFollowupOptionSelect(scene: BattleScene, followupOptionSelectSettings: MysteryEncounterUiSettings) { - scene.pushPhase(new MysteryEncounterPhase(scene, followupOptionSelectSettings)); +export function initSubsequentOptionSelect(scene: BattleScene, optionSelectSettings: OptionSelectSettings) { + scene.pushPhase(new MysteryEncounterPhase(scene, optionSelectSettings)); } /** @@ -721,6 +536,32 @@ export function handleMysteryEncounterVictory(scene: BattleScene, addHealPhase: } } +export function hideMysteryEncounterIntroVisuals(scene: BattleScene): Promise { + return new Promise(resolve => { + const introVisuals = scene.currentBattle.mysteryEncounter.introVisuals; + if (introVisuals) { + // Hide + scene.tweens.add({ + targets: introVisuals, + x: "+=16", + y: "-=16", + alpha: 0, + ease: "Sine.easeInOut", + duration: 750, + onComplete: () => { + scene.field.remove(introVisuals); + introVisuals.setVisible(false); + introVisuals.destroy(); + scene.currentBattle.mysteryEncounter.introVisuals = null; + resolve(true); + } + }); + } else { + resolve(true); + } + }); +} + /** * TODO: remove once encounter spawn rate is finalized * Just a helper function to calculate aggregate stats for MEs in a Classic run diff --git a/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts b/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts new file mode 100644 index 00000000000..fdbb957161f --- /dev/null +++ b/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts @@ -0,0 +1,451 @@ +import BattleScene from "#app/battle-scene"; +import i18next from "i18next"; +import { isNullOrUndefined, randSeedInt } from "#app/utils"; +import { PokemonHeldItemModifier } from "#app/modifier/modifier"; +import { VictoryPhase } from "#app/phases"; +import { EnemyPokemon, PlayerPokemon } from "#app/field/pokemon"; +import { doPokeballBounceAnim, getPokeballAtlasKey, getPokeballCatchMultiplier, getPokeballTintColor, PokeballType } from "#app/data/pokeball"; +import { PlayerGender } from "#enums/player-gender"; +import { addPokeballCaptureStars, addPokeballOpenParticles } from "#app/field/anims"; +import { getStatusEffectCatchRateMultiplier, StatusEffect } from "#app/data/status-effect"; +import { BattlerIndex } from "#app/battle"; +import { achvs } from "#app/system/achv"; +import { Mode } from "#app/ui/ui"; +import { PartyOption, PartyUiMode } from "#app/ui/party-ui-handler"; +import { Species } from "#enums/species"; +import { Type } from "#app/data/type"; +import PokemonSpecies, { getPokemonSpecies, speciesStarters } from "#app/data/pokemon-species"; +import { showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; + +/** + * + * Will never remove the player's last non-fainted Pokemon (if they only have 1) + * Otherwise, picks a Pokemon completely at random and removes from the party + * @param scene + * @param isAllowedInBattle - default false. If true, only picks from unfainted mons. If there is only 1 unfainted mon left and doNotReturnLastAbleMon is also true, will return fainted mon + * @param doNotReturnLastAbleMon - If true, will never return the last unfainted pokemon in the party. Useful when this function is being used to determine what Pokemon to remove from the party (Don't want to remove last unfainted) + * @returns + */ +export function getRandomPlayerPokemon(scene: BattleScene, isAllowedInBattle: boolean = false, doNotReturnLastAbleMon: boolean = false): PlayerPokemon { + const party = scene.getParty(); + let chosenIndex: number; + let chosenPokemon: PlayerPokemon; + const unfaintedMons = party.filter(p => p.isAllowedInBattle()); + const faintedMons = party.filter(p => !p.isAllowedInBattle()); + + if (doNotReturnLastAbleMon && unfaintedMons.length === 1) { + chosenIndex = randSeedInt(faintedMons.length); + chosenPokemon = faintedMons.at(chosenIndex); + } else if (isAllowedInBattle) { + chosenIndex = randSeedInt(unfaintedMons.length); + chosenPokemon = unfaintedMons.at(chosenIndex); + } else { + chosenIndex = randSeedInt(party.length); + chosenPokemon = party.at(chosenIndex); + } + + return chosenPokemon; +} + +/** + * Ties are broken by whatever mon is closer to the front of the party + * @param scene + * @param unfainted - default false. If true, only picks from unfainted mons. + * @returns + */ +export function getHighestLevelPlayerPokemon(scene: BattleScene, unfainted: boolean = false): PlayerPokemon { + const party = scene.getParty(); + let pokemon: PlayerPokemon; + party.every(p => { + if (unfainted && p.isFainted()) { + return true; + } + + pokemon = pokemon ? pokemon?.level < p?.level ? p : pokemon : p; + return true; + }); + + return pokemon; +} + +/** + * Ties are broken by whatever mon is closer to the front of the party + * @param scene + * @param unfainted - default false. If true, only picks from unfainted mons. + * @returns + */ +export function getLowestLevelPlayerPokemon(scene: BattleScene, unfainted: boolean = false): PlayerPokemon { + const party = scene.getParty(); + let pokemon: PlayerPokemon; + party.every(p => { + if (unfainted && p.isFainted()) { + return true; + } + + pokemon = pokemon ? pokemon?.level > p?.level ? p : pokemon : p; + return true; + }); + + return pokemon; +} + +/** + * + * NOTE: This returns ANY random species, including those locked behind eggs, etc. + * @param starterTiers + * @param excludedSpecies + * @param types + * @returns + */ +export function getRandomSpeciesByStarterTier(starterTiers: number | [number, number], excludedSpecies?: Species[], types?: Type[]): Species { + let min = starterTiers instanceof Array ? starterTiers[0] : starterTiers; + let max = starterTiers instanceof Array ? starterTiers[1] : starterTiers; + + let filteredSpecies: [PokemonSpecies, number][] = Object.keys(speciesStarters) + .map(s => [parseInt(s) as Species, speciesStarters[s] as number]) + .filter(s => getPokemonSpecies(s[0]) && (!excludedSpecies || !excludedSpecies.includes(s[0]))) + .map(s => [getPokemonSpecies(s[0]), s[1]]); + + if (!isNullOrUndefined(types) && types.length > 0) { + filteredSpecies = filteredSpecies.filter(s => types.includes(s[0].type1) || types.includes(s[0].type2)); + } + + // If no filtered mons exist at specified starter tiers, will expand starter search range until there are + // Starts by decrementing starter tier min until it is 0, then increments tier max up to 10 + let tryFilterStarterTiers: [PokemonSpecies, number][] = filteredSpecies.filter(s => (s[1] >= min && s[1] <= max)); + while (tryFilterStarterTiers.length === 0 && (min !== 0 && max !== 10)) { + if (min > 0) { + min--; + } else { + max++; + } + + tryFilterStarterTiers = filteredSpecies.filter(s => s[1] >= min && s[1] <= max); + } + + if (tryFilterStarterTiers.length > 0) { + const index = randSeedInt(tryFilterStarterTiers.length); + return Phaser.Math.RND.shuffle(tryFilterStarterTiers)[index][0].speciesId; + } + + return Species.BULBASAUR; +} + +export function koPlayerPokemon(pokemon: PlayerPokemon) { + pokemon.hp = 0; + pokemon.trySetStatus(StatusEffect.FAINT); + pokemon.updateInfo(); +} + +/** + * Alternative to using AttemptCapturePhase + * Assumes player sprite is visible on the screen (this is intended for non-combat uses) + * + * Can await returned promise to wait for throw animation completion before continuing + * + * @param scene + * @param pokemon + * @param pokeballType + * @param ballTwitchRate - can pass custom ball catch rates (for special events, like safari) + */ +export function trainerThrowPokeball(scene: BattleScene, pokemon: EnemyPokemon, pokeballType: PokeballType, ballTwitchRate?: number): Promise { + const originalY: number = pokemon.y; + + if (!ballTwitchRate) { + const _3m = 3 * pokemon.getMaxHp(); + const _2h = 2 * pokemon.hp; + const catchRate = pokemon.species.catchRate; + const pokeballMultiplier = getPokeballCatchMultiplier(this.pokeballType); + const statusMultiplier = pokemon.status ? getStatusEffectCatchRateMultiplier(pokemon.status.effect) : 1; + const x = Math.round((((_3m - _2h) * catchRate * pokeballMultiplier) / _3m) * statusMultiplier); + ballTwitchRate = Math.round(65536 / Math.sqrt(Math.sqrt(255 / x))); + } + + const fpOffset = pokemon.getFieldPositionOffset(); + const pokeballAtlasKey = getPokeballAtlasKey(pokeballType); + const pokeball: Phaser.GameObjects.Sprite = scene.addFieldSprite(16 + 75, 80 + 25, "pb", pokeballAtlasKey); + pokeball.setOrigin(0.5, 0.625); + scene.field.add(pokeball); + + scene.playSound("pb_throw"); + scene.time.delayedCall(300, () => { + scene.field.moveBelow(pokeball as Phaser.GameObjects.GameObject, pokemon); + }); + + return new Promise(resolve => { + scene.trainer.setTexture(`trainer_${scene.gameData.gender === PlayerGender.FEMALE ? "f" : "m"}_back_pb`); + scene.time.delayedCall(512, () => { + // Trainer throw frames + scene.trainer.setFrame("2"); + scene.time.delayedCall(256, () => { + scene.trainer.setFrame("3"); + scene.time.delayedCall(768, () => { + scene.trainer.setTexture(`trainer_${scene.gameData.gender === PlayerGender.FEMALE ? "f" : "m"}_back`); + }); + }); + + // Pokeball move and catch logic + scene.tweens.add({ + targets: pokeball, + x: { value: 236 + fpOffset[0], ease: "Linear" }, + y: { value: 16 + fpOffset[1], ease: "Cubic.easeOut" }, + duration: 500, + onComplete: () => { + pokeball.setTexture("pb", `${pokeballAtlasKey}_opening`); + scene.time.delayedCall(17, () => pokeball.setTexture("pb", `${pokeballAtlasKey}_open`)); + scene.playSound("pb_rel"); + pokemon.tint(getPokeballTintColor(pokeballType)); + + addPokeballOpenParticles(scene, pokeball.x, pokeball.y, pokeballType); + + scene.tweens.add({ + targets: pokemon, + duration: 500, + ease: "Sine.easeIn", + scale: 0.25, + y: 20, + onComplete: () => { + pokeball.setTexture("pb", `${pokeballAtlasKey}_opening`); + pokemon.setVisible(false); + scene.playSound("pb_catch"); + scene.time.delayedCall(17, () => pokeball.setTexture("pb", `${pokeballAtlasKey}`)); + + const doShake = () => { + let shakeCount = 0; + const pbX = pokeball.x; + const shakeCounter = scene.tweens.addCounter({ + from: 0, + to: 1, + repeat: 4, + yoyo: true, + ease: "Cubic.easeOut", + duration: 250, + repeatDelay: 500, + onUpdate: t => { + if (shakeCount && shakeCount < 4) { + const value = t.getValue(); + const directionMultiplier = shakeCount % 2 === 1 ? 1 : -1; + pokeball.setX(pbX + value * 4 * directionMultiplier); + pokeball.setAngle(value * 27.5 * directionMultiplier); + } + }, + onRepeat: () => { + if (!pokemon.species.isObtainable()) { + shakeCounter.stop(); + failCatch(scene, pokemon, originalY, pokeball, pokeballType).then(() => resolve(false)); + } else if (shakeCount++ < 3) { + if (randSeedInt(65536) < ballTwitchRate) { + scene.playSound("pb_move"); + } else { + shakeCounter.stop(); + failCatch(scene, pokemon, originalY, pokeball, pokeballType).then(() => resolve(false)); + } + } else { + scene.playSound("pb_lock"); + addPokeballCaptureStars(scene, pokeball); + + const pbTint = scene.add.sprite(pokeball.x, pokeball.y, "pb", "pb"); + pbTint.setOrigin(pokeball.originX, pokeball.originY); + pbTint.setTintFill(0); + pbTint.setAlpha(0); + scene.field.add(pbTint); + scene.tweens.add({ + targets: pbTint, + alpha: 0.375, + duration: 200, + easing: "Sine.easeOut", + onComplete: () => { + scene.tweens.add({ + targets: pbTint, + alpha: 0, + duration: 200, + easing: "Sine.easeIn", + onComplete: () => pbTint.destroy() + }); + } + }); + } + }, + onComplete: () => { + catchPokemon(scene, pokemon, pokeball, pokeballType).then(() => resolve(true)); + } + }); + }; + + scene.time.delayedCall(250, () => doPokeballBounceAnim(scene, pokeball, 16, 72, 350, doShake)); + } + }); + } + }); + }); + }); +} + +function failCatch(scene: BattleScene, pokemon: EnemyPokemon, originalY: number, pokeball: Phaser.GameObjects.Sprite, pokeballType: PokeballType) { + return new Promise(resolve => { + scene.playSound("pb_rel"); + pokemon.setY(originalY); + if (pokemon.status?.effect !== StatusEffect.SLEEP) { + pokemon.cry(pokemon.getHpRatio() > 0.25 ? undefined : { rate: 0.85 }); + } + pokemon.tint(getPokeballTintColor(pokeballType)); + pokemon.setVisible(true); + pokemon.untint(250, "Sine.easeOut"); + + const pokeballAtlasKey = getPokeballAtlasKey(pokeballType); + pokeball.setTexture("pb", `${pokeballAtlasKey}_opening`); + scene.time.delayedCall(17, () => pokeball.setTexture("pb", `${pokeballAtlasKey}_open`)); + + scene.tweens.add({ + targets: pokemon, + duration: 250, + ease: "Sine.easeOut", + scale: 1 + }); + + scene.currentBattle.lastUsedPokeball = pokeballType; + removePb(scene, pokeball); + + scene.ui.showText(i18next.t("battle:pokemonBrokeFree", { pokemonName: pokemon.name }), null, () => resolve(), null, true); + }); +} + +function catchPokemon(scene: BattleScene, pokemon: EnemyPokemon, pokeball: Phaser.GameObjects.Sprite, pokeballType: PokeballType): Promise { + scene.unshiftPhase(new VictoryPhase(scene, BattlerIndex.ENEMY)); + + const speciesForm = !pokemon.fusionSpecies ? pokemon.getSpeciesForm() : pokemon.getFusionSpeciesForm(); + + if (speciesForm.abilityHidden && (pokemon.fusionSpecies ? pokemon.fusionAbilityIndex : pokemon.abilityIndex) === speciesForm.getAbilityCount() - 1) { + scene.validateAchv(achvs.HIDDEN_ABILITY); + } + + if (pokemon.species.subLegendary) { + scene.validateAchv(achvs.CATCH_SUB_LEGENDARY); + } + + if (pokemon.species.legendary) { + scene.validateAchv(achvs.CATCH_LEGENDARY); + } + + if (pokemon.species.mythical) { + scene.validateAchv(achvs.CATCH_MYTHICAL); + } + + scene.pokemonInfoContainer.show(pokemon, true); + + scene.gameData.updateSpeciesDexIvs(pokemon.species.getRootSpeciesId(true), pokemon.ivs); + + return new Promise(resolve => { + scene.ui.showText(i18next.t("battle:pokemonCaught", { pokemonName: pokemon.name }), null, () => { + const end = () => { + scene.pokemonInfoContainer.hide(); + removePb(scene, pokeball); + resolve(); + }; + const removePokemon = () => { + scene.field.remove(pokemon, true); + }; + const addToParty = () => { + const newPokemon = pokemon.addToParty(pokeballType); + const modifiers = scene.findModifiers(m => m instanceof PokemonHeldItemModifier, false); + if (scene.getParty().filter(p => p.isShiny()).length === 6) { + scene.validateAchv(achvs.SHINY_PARTY); + } + Promise.all(modifiers.map(m => scene.addModifier(m, true))).then(() => { + scene.updateModifiers(true); + removePokemon(); + if (newPokemon) { + newPokemon.loadAssets().then(end); + } else { + end(); + } + }); + }; + Promise.all([pokemon.hideInfo(), scene.gameData.setPokemonCaught(pokemon)]).then(() => { + if (scene.getParty().length === 6) { + const promptRelease = () => { + scene.ui.showText(i18next.t("battle:partyFull", { pokemonName: pokemon.name }), null, () => { + scene.pokemonInfoContainer.makeRoomForConfirmUi(); + scene.ui.setMode(Mode.CONFIRM, () => { + scene.ui.setMode(Mode.PARTY, PartyUiMode.RELEASE, 0, (slotIndex: integer, _option: PartyOption) => { + scene.ui.setMode(Mode.MESSAGE).then(() => { + if (slotIndex < 6) { + addToParty(); + } else { + promptRelease(); + } + }); + }); + }, () => { + scene.ui.setMode(Mode.MESSAGE).then(() => { + removePokemon(); + end(); + }); + }); + }); + }; + promptRelease(); + } else { + addToParty(); + } + }); + }, 0, true); + }); +} + +function removePb(scene: BattleScene, pokeball: Phaser.GameObjects.Sprite) { + scene.tweens.add({ + targets: pokeball, + duration: 250, + delay: 250, + ease: "Sine.easeIn", + alpha: 0, + onComplete: () => pokeball.destroy() + }); +} + +export function doPokemonFlee(scene: BattleScene, pokemon: EnemyPokemon): Promise { + return new Promise(resolve => { + // Ease pokemon out + scene.tweens.add({ + targets: pokemon, + x: "+=16", + y: "-=16", + alpha: 0, + duration: 1000, + ease: "Sine.easeIn", + scale: pokemon.getSpriteScale(), + onComplete: () => { + pokemon.setVisible(false); + scene.field.remove(pokemon, true); + showEncounterText(scene, i18next.t("battle:pokemonFled", { pokemonName: pokemon.name }), 600, false) + .then(() => { + resolve(); + }); + } + }); + }); +} + +export function doPlayerFlee(scene: BattleScene, pokemon: EnemyPokemon): Promise { + return new Promise(resolve => { + // Ease pokemon out + scene.tweens.add({ + targets: pokemon, + x: "+=16", + y: "-=16", + alpha: 0, + duration: 1000, + ease: "Sine.easeIn", + scale: pokemon.getSpriteScale(), + onComplete: () => { + pokemon.setVisible(false); + scene.field.remove(pokemon, true); + showEncounterText(scene, i18next.t("battle:playerFled", { pokemonName: pokemon.name }), 600, false) + .then(() => { + resolve(); + }); + } + }); + }); +} diff --git a/src/locales/en/mystery-encounter.ts b/src/locales/en/mystery-encounter.ts index a13e35a4474..67b2a6c8579 100644 --- a/src/locales/en/mystery-encounter.ts +++ b/src/locales/en/mystery-encounter.ts @@ -146,13 +146,13 @@ export const mysteryEncounter: SimpleTranslationEntries = { "safari_zone_intro_message": "It's a safari zone!", "safari_zone_title": "The Safari Zone", - "safari_zone_description": "There are all kinds of rare and special Pokémon that can be found here!\nIf you choose to enter, you'll have a time limit of 3 wild encounters where you can try to catch these special Pokémon.\nBeware, though. These Pokémon may flee before you're able to catch them!", + "safari_zone_description": "There are all kinds of rare and special Pokémon that can be found here!\nIf you choose to enter, you'll have a time limit of 3 wild encounters where you can try to catch these special Pokémon.\n\nBeware, though. These Pokémon may flee before you're able to catch them!", "safari_zone_query": "Would you like to enter?", "safari_zone_option_1_label": "Enter", "safari_zone_option_1_tooltip": "(-) Pay {{option1Money, money}}\n@[SUMMARY_GREEN]{(?) Safari Zone}", "safari_zone_option_2_label": "Leave", "safari_zone_option_2_tooltip": "(-) No Rewards", - "safari_zone_option_1_selected_message": "Time to test your luck.", + "safari_zone_option_1_selected_message": "Time to test your luck!", "safari_zone_option_2_selected_message": "You hurry along your way,\nwith a slight feeling of regret.", "safari_zone_pokeball_option_label": "Throw a Pokéball", "safari_zone_pokeball_option_tooltip": "(+) Throw a Pokéball", diff --git a/src/phases.ts b/src/phases.ts index 9bc61aa8454..f98c914e320 100644 --- a/src/phases.ts +++ b/src/phases.ts @@ -66,9 +66,10 @@ import { Species } from "#enums/species"; import { TrainerType } from "#enums/trainer-type"; import { MysteryEncounterVariant } from "#app/data/mystery-encounters/mystery-encounter"; import { MysteryEncounterPhase } from "#app/phases/mystery-encounter-phase"; -import { getEncounterText, handleMysteryEncounterVictory } from "#app/data/mystery-encounters/mystery-encounter-utils"; +import { handleMysteryEncounterVictory } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import ModifierSelectUiHandler, { SHOP_OPTIONS_ROW_LIMIT } from "#app/ui/modifier-select-ui-handler"; import { isNullOrUndefined } from "./utils"; +import { getEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; const { t } = i18next; @@ -1680,9 +1681,7 @@ export class SummonPhase extends PartyMemberPokemonPhase { pokemon.resetTurnData(); - const addPostSummonForEncounter = this.scene.currentBattle.battleType === BattleType.MYSTERY_ENCOUNTER && !this.scene.currentBattle.mysteryEncounter?.disableAllPostSummon; - - if (!this.loaded || this.scene.currentBattle.battleType === BattleType.TRAINER || (this.scene.currentBattle.waveIndex % 10) === 1 || addPostSummonForEncounter) { + if (!this.loaded || this.scene.currentBattle.battleType === BattleType.TRAINER || (this.scene.currentBattle.waveIndex % 10) === 1 || this.scene.currentBattle.battleType === BattleType.MYSTERY_ENCOUNTER) { this.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeActiveTrigger, true); this.queuePostSummon(); } diff --git a/src/phases/mystery-encounter-phase.ts b/src/phases/mystery-encounter-phase.ts index 96acce6adcc..13856471e4d 100644 --- a/src/phases/mystery-encounter-phase.ts +++ b/src/phases/mystery-encounter-phase.ts @@ -2,9 +2,7 @@ import i18next from "i18next"; import BattleScene from "../battle-scene"; import { Phase } from "../phase"; import { Mode } from "../ui/ui"; -import { - getEncounterText -} from "../data/mystery-encounters/mystery-encounter-utils"; +import { hideMysteryEncounterIntroVisuals, OptionSelectSettings } from "../data/mystery-encounters/utils/encounter-phase-utils"; import { CheckSwitchPhase, NewBattlePhase, ReturnPhase, ScanIvsPhase, SelectModifierPhase, SummonPhase, ToggleDoublePositionPhase } from "../phases"; import MysteryEncounterOption from "../data/mystery-encounters/mystery-encounter-option"; import { MysteryEncounterVariant } from "../data/mystery-encounters/mystery-encounter"; @@ -15,7 +13,7 @@ import { Tutorial, handleTutorial } from "../tutorial"; import { IvScannerModifier } from "../modifier/modifier"; import * as Utils from "../utils"; import { isNullOrUndefined } from "../utils"; -import { MysteryEncounterUiSettings } from "#app/ui/mystery-encounter-ui-handler"; +import { getEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; /** * Will handle (in order): @@ -27,11 +25,17 @@ import { MysteryEncounterUiSettings } from "#app/ui/mystery-encounter-ui-handler * - Queuing of the MysteryEncounterOptionSelectedPhase */ export class MysteryEncounterPhase extends Phase { - followupOptionSelectSettings: MysteryEncounterUiSettings; + optionSelectSettings: OptionSelectSettings; - constructor(scene: BattleScene, followupOptionSelectSettings?: MysteryEncounterUiSettings) { + /** + * + * @param scene + * @param optionSelectSettings - allows overriding the typical options of an encounter with new ones + * Mostly useful for having repeated queries during a single encounter, where the queries and options may differ each time + */ + constructor(scene: BattleScene, optionSelectSettings?: OptionSelectSettings) { super(scene); - this.followupOptionSelectSettings = followupOptionSelectSettings; + this.optionSelectSettings = optionSelectSettings; } start() { @@ -45,14 +49,14 @@ export class MysteryEncounterPhase extends Phase { const offset = this.scene.currentBattle.mysteryEncounter.seedOffset ?? this.scene.currentBattle.waveIndex * 1000; this.scene.currentBattle.mysteryEncounter.seedOffset = offset + 512; - if (!this.followupOptionSelectSettings) { + if (!this.optionSelectSettings) { // Sets flag that ME was encountered, only if this is not a followup option select phase // Can be used in later MEs to check for requirements to spawn, etc. this.scene.mysteryEncounterData.encounteredEvents.push([this.scene.currentBattle.mysteryEncounter.encounterType, this.scene.currentBattle.mysteryEncounter.encounterTier]); } // Initiates encounter dialogue window and option select - this.scene.ui.setMode(Mode.MYSTERY_ENCOUNTER, this.followupOptionSelectSettings); + this.scene.ui.setMode(Mode.MYSTERY_ENCOUNTER, this.optionSelectSettings); } handleOptionSelect(option: MysteryEncounterOption, index: number): boolean { @@ -144,7 +148,7 @@ export class MysteryEncounterOptionSelectedPhase extends Phase { start() { super.start(); if (this.scene.currentBattle.mysteryEncounter.hideIntroVisuals) { - this.hideMysteryEncounterIntroVisuals().then(() => { + hideMysteryEncounterIntroVisuals(this.scene).then(() => { this.scene.executeWithSeedOffset(() => { this.onOptionSelect(this.scene).finally(() => { this.end(); @@ -159,32 +163,6 @@ export class MysteryEncounterOptionSelectedPhase extends Phase { }, this.scene.currentBattle.mysteryEncounter.seedOffset); } } - - hideMysteryEncounterIntroVisuals(): Promise { - return new Promise(resolve => { - const introVisuals = this.scene.currentBattle.mysteryEncounter.introVisuals; - if (introVisuals) { - // Hide - this.scene.tweens.add({ - targets: introVisuals, - x: "+=16", - y: "-=16", - alpha: 0, - ease: "Sine.easeInOut", - duration: 750, - onComplete: () => { - this.scene.field.remove(introVisuals); - introVisuals.setVisible(false); - introVisuals.destroy(); - this.scene.currentBattle.mysteryEncounter.introVisuals = null; - resolve(true); - } - }); - } else { - resolve(true); - } - }); - } } /** diff --git a/src/pipelines/sprite.ts b/src/pipelines/sprite.ts index e36765f0d4c..79da2ad9a39 100644 --- a/src/pipelines/sprite.ts +++ b/src/pipelines/sprite.ts @@ -452,7 +452,7 @@ export default class SpritePipeline extends FieldSpritePipeline { this.set1f("vCutoff", v1); const hasShadow = sprite.pipelineData["hasShadow"] as boolean; - const yShadowOffset = sprite.pipelineData["yShadowOffset"] as number; + const yShadowOffset = sprite.pipelineData["yShadowOffset"] as number ?? 0; if (hasShadow) { const isEntityObj = sprite.parentContainer instanceof Pokemon || sprite.parentContainer instanceof Trainer || sprite.parentContainer instanceof MysteryEncounterIntroVisuals; const field = isEntityObj ? sprite.parentContainer.parentContainer : sprite.parentContainer; diff --git a/src/test/mystery-encounter/mystery-encounter-utils.test.ts b/src/test/mystery-encounter/mystery-encounter-utils.test.ts index 31f930319bf..22582f8a8bc 100644 --- a/src/test/mystery-encounter/mystery-encounter-utils.test.ts +++ b/src/test/mystery-encounter/mystery-encounter-utils.test.ts @@ -1,11 +1,6 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import GameManager from "#app/test/utils/gameManager"; import Phaser from "phaser"; -import { - getHighestLevelPlayerPokemon, getLowestLevelPlayerPokemon, - getRandomPlayerPokemon, getRandomSpeciesByStarterTier, getEncounterText, - koPlayerPokemon, queueEncounterMessage, showEncounterDialogue, showEncounterText, -} from "#app/data/mystery-encounters/mystery-encounter-utils"; import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; import { Species } from "#enums/species"; import BattleScene from "#app/battle-scene"; @@ -14,6 +9,8 @@ import IMysteryEncounter from "#app/data/mystery-encounters/mystery-encounter"; import { MessagePhase } from "#app/phases"; import { getPokemonSpecies, speciesStarters } from "#app/data/pokemon-species"; import { Type } from "#app/data/type"; +import { getHighestLevelPlayerPokemon, getLowestLevelPlayerPokemon, getRandomPlayerPokemon, getRandomSpeciesByStarterTier, koPlayerPokemon } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; +import { getEncounterText, queueEncounterMessage, showEncounterDialogue, showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; describe("Mystery Encounter Utils", () => { let phaserGame: Phaser.Game; diff --git a/src/ui/mystery-encounter-ui-handler.ts b/src/ui/mystery-encounter-ui-handler.ts index 800dd551dc4..d1ce9fb5d04 100644 --- a/src/ui/mystery-encounter-ui-handler.ts +++ b/src/ui/mystery-encounter-ui-handler.ts @@ -10,17 +10,8 @@ import MysteryEncounterOption, { EncounterOptionMode } from "../data/mystery-enc import * as Utils from "../utils"; import { isNullOrUndefined } from "../utils"; import { getPokeballAtlasKey } from "../data/pokeball"; -import { getEncounterText } from "#app/data/mystery-encounters/mystery-encounter-utils"; - -export class MysteryEncounterUiSettings { - hideDescription?: boolean; - slideInDescription?: boolean; - overrideTitle?: string; - overrideDescription?: string; - overrideQuery?: string; - overrideOptions?: MysteryEncounterOption[]; - startingCursorIndex?: number; -} +import { OptionSelectSettings } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { getEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; export default class MysteryEncounterUiHandler extends UiHandler { private cursorContainer: Phaser.GameObjects.Container; @@ -37,7 +28,7 @@ export default class MysteryEncounterUiHandler extends UiHandler { private descriptionScrollTween: Phaser.Tweens.Tween; private rarityBall: Phaser.GameObjects.Sprite; - private overrideSettings: MysteryEncounterUiSettings; + private overrideSettings: OptionSelectSettings; private encounterOptions: MysteryEncounterOption[] = []; private optionsMeetsReqs: boolean[]; @@ -81,7 +72,7 @@ export default class MysteryEncounterUiHandler extends UiHandler { show(args: any[]): boolean { super.show(args); - this.overrideSettings = args[0] as MysteryEncounterUiSettings ?? {}; + this.overrideSettings = args[0] as OptionSelectSettings ?? {}; const showDescriptionContainer = isNullOrUndefined(this.overrideSettings?.hideDescription) ? true : !this.overrideSettings?.hideDescription; const slideInDescription = isNullOrUndefined(this.overrideSettings?.slideInDescription) ? true : this.overrideSettings?.slideInDescription; const startingCursorIndex = this.overrideSettings?.startingCursorIndex ?? 0; @@ -100,7 +91,7 @@ export default class MysteryEncounterUiHandler extends UiHandler { if (this.blockInput) { setTimeout(() => { this.unblockInput(); - }, 1500); + }, 1000); } this.displayOptionTooltip(); @@ -120,7 +111,7 @@ export default class MysteryEncounterUiHandler extends UiHandler { if (cursor === this.viewPartyIndex) { // Handle view party success = true; - const overrideSettings: MysteryEncounterUiSettings = { + const overrideSettings: OptionSelectSettings = { ...this.overrideSettings, slideInDescription: false }; @@ -387,7 +378,7 @@ export default class MysteryEncounterUiHandler extends UiHandler { descriptionTextMaskRect.setScale(6); descriptionTextMaskRect.fillStyle(0xFFFFFF); descriptionTextMaskRect.beginPath(); - descriptionTextMaskRect.fillRect(6, 54, 206, 60); + descriptionTextMaskRect.fillRect(6, 53, 206, 57); const abilityDescriptionTextMask = descriptionTextMaskRect.createGeometryMask(); From 23f6fb17a493fbe89ca4e5197a724ea3a198a97e Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Mon, 15 Jul 2024 12:56:58 -0400 Subject: [PATCH 114/270] add art issues form and remove some leftover beta branch poison --- .github/ISSUE_TEMPLATE/art_request.md | 17 ++ src/test/lokalisation/battle-stat.test.ts | 208 -------------- src/test/lokalisation/french.test.ts | 42 --- src/test/lokalisation/status-effect.test.ts | 300 -------------------- 4 files changed, 17 insertions(+), 550 deletions(-) create mode 100644 .github/ISSUE_TEMPLATE/art_request.md delete mode 100644 src/test/lokalisation/battle-stat.test.ts delete mode 100644 src/test/lokalisation/french.test.ts delete mode 100644 src/test/lokalisation/status-effect.test.ts diff --git a/.github/ISSUE_TEMPLATE/art_request.md b/.github/ISSUE_TEMPLATE/art_request.md new file mode 100644 index 00000000000..df557462f26 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/art_request.md @@ -0,0 +1,17 @@ +--- +name: Art Request +about: Create an art request for a specific Encounter +title: "[ART]" +labels: Art +assignees: '' + +--- + +**Link to Mystery Encounter Issue/PR** + + +**Describe the Art** + + +**Additional context** + diff --git a/src/test/lokalisation/battle-stat.test.ts b/src/test/lokalisation/battle-stat.test.ts deleted file mode 100644 index d894d705947..00000000000 --- a/src/test/lokalisation/battle-stat.test.ts +++ /dev/null @@ -1,208 +0,0 @@ -import {beforeAll, describe, expect, it} from "vitest"; -import { getBattleStatName, getBattleStatLevelChangeDescription } from "#app/data/battle-stat.js"; -import { BattleStat } from "#app/data/battle-stat.js"; -import { pokemonInfo as enPokemonInfo } from "#app/locales/en/pokemon-info.js"; -import { battle as enBattleStat } from "#app/locales/en/battle.js"; -import { pokemonInfo as dePokemonInfo } from "#app/locales/de/pokemon-info.js"; -import { battle as deBattleStat } from "#app/locales/de/battle.js"; -import { pokemonInfo as esPokemonInfo } from "#app/locales/es/pokemon-info.js"; -import { battle as esBattleStat } from "#app/locales/es/battle.js"; -import { pokemonInfo as frPokemonInfo } from "#app/locales/fr/pokemon-info.js"; -import { battle as frBattleStat } from "#app/locales/fr/battle.js"; -import { pokemonInfo as itPokemonInfo } from "#app/locales/it/pokemon-info.js"; -import { battle as itBattleStat } from "#app/locales/it/battle.js"; -import { pokemonInfo as koPokemonInfo } from "#app/locales/ko/pokemon-info.js"; -import { battle as koBattleStat } from "#app/locales/ko/battle.js"; -import { pokemonInfo as ptBrPokemonInfo } from "#app/locales/pt_BR/pokemon-info.js"; -import { battle as ptBrBattleStat } from "#app/locales/pt_BR/battle.js"; -import { pokemonInfo as zhCnPokemonInfo } from "#app/locales/zh_CN/pokemon-info.js"; -import { battle as zhCnBattleStat } from "#app/locales/zh_CN/battle.js"; -import { pokemonInfo as zhTwPokemonInfo } from "#app/locales/zh_TW/pokemon-info.js"; -import { battle as zhTwBattleStat } from "#app/locales/zh_TW/battle.js"; - -import i18next, {initI18n} from "#app/plugins/i18n"; -import { KoreanPostpositionProcessor } from "i18next-korean-postposition-processor"; - -interface BattleStatTestUnit { - stat: BattleStat, - key: string -} - -interface BattleStatLevelTestUnit { - levels: integer, - up: boolean, - key: string -} - -function testBattleStatName(stat: BattleStat, expectMessage: string) { - const message = getBattleStatName(stat); - console.log(`message ${message}, expected ${expectMessage}`); - expect(message).toBe(expectMessage); -} - -function testBattleStatLevelChangeDescription(levels: integer, up: boolean, expectMessage: string) { - const message = getBattleStatLevelChangeDescription("{{pokemonNameWithAffix}}", "{{stats}}", levels, up); - console.log(`message ${message}, expected ${expectMessage}`); - expect(message).toBe(expectMessage); -} - -describe("Test for BattleStat Localization", () => { - const battleStatUnits: BattleStatTestUnit[] = []; - const battleStatLevelUnits: BattleStatLevelTestUnit[] = []; - - beforeAll(() => { - initI18n(); - - battleStatUnits.push({ stat: BattleStat.ATK, key: "Stat.ATK" }); - battleStatUnits.push({ stat: BattleStat.DEF, key: "Stat.DEF" }); - battleStatUnits.push({ stat: BattleStat.SPATK, key: "Stat.SPATK" }); - battleStatUnits.push({ stat: BattleStat.SPDEF, key: "Stat.SPDEF" }); - battleStatUnits.push({ stat: BattleStat.SPD, key: "Stat.SPD" }); - battleStatUnits.push({ stat: BattleStat.ACC, key: "Stat.ACC" }); - battleStatUnits.push({ stat: BattleStat.EVA, key: "Stat.EVA" }); - - battleStatLevelUnits.push({ levels: 1, up: true, key: "statRose" }); - battleStatLevelUnits.push({ levels: 2, up: true, key: "statSharplyRose" }); - battleStatLevelUnits.push({ levels: 3, up: true, key: "statRoseDrastically" }); - battleStatLevelUnits.push({ levels: 4, up: true, key: "statRoseDrastically" }); - battleStatLevelUnits.push({ levels: 5, up: true, key: "statRoseDrastically" }); - battleStatLevelUnits.push({ levels: 6, up: true, key: "statRoseDrastically" }); - battleStatLevelUnits.push({ levels: 7, up: true, key: "statWontGoAnyHigher" }); - battleStatLevelUnits.push({ levels: 1, up: false, key: "statFell" }); - battleStatLevelUnits.push({ levels: 2, up: false, key: "statHarshlyFell" }); - battleStatLevelUnits.push({ levels: 3, up: false, key: "statSeverelyFell" }); - battleStatLevelUnits.push({ levels: 4, up: false, key: "statSeverelyFell" }); - battleStatLevelUnits.push({ levels: 5, up: false, key: "statSeverelyFell" }); - battleStatLevelUnits.push({ levels: 6, up: false, key: "statSeverelyFell" }); - battleStatLevelUnits.push({ levels: 7, up: false, key: "statWontGoAnyLower" }); - }); - - it("Test getBattleStatName() in English", async () => { - i18next.changeLanguage("en"); - battleStatUnits.forEach(unit => { - testBattleStatName(unit.stat, enPokemonInfo[unit.key.split(".")[0]][unit.key.split(".")[1]]); - }); - }); - - it("Test getBattleStatLevelChangeDescription() in English", async () => { - i18next.changeLanguage("en"); - battleStatLevelUnits.forEach(unit => { - testBattleStatLevelChangeDescription(unit.levels, unit.up, enBattleStat[unit.key]); - }); - }); - - it("Test getBattleStatName() in Español", async () => { - i18next.changeLanguage("es"); - battleStatUnits.forEach(unit => { - testBattleStatName(unit.stat, esPokemonInfo[unit.key.split(".")[0]][unit.key.split(".")[1]]); - }); - }); - - it("Test getBattleStatLevelChangeDescription() in Español", async () => { - i18next.changeLanguage("es"); - battleStatLevelUnits.forEach(unit => { - testBattleStatLevelChangeDescription(unit.levels, unit.up, esBattleStat[unit.key]); - }); - }); - - it("Test getBattleStatName() in Italiano", async () => { - i18next.changeLanguage("it"); - battleStatUnits.forEach(unit => { - testBattleStatName(unit.stat, itPokemonInfo[unit.key.split(".")[0]][unit.key.split(".")[1]]); - }); - }); - - it("Test getBattleStatLevelChangeDescription() in Italiano", async () => { - i18next.changeLanguage("it"); - battleStatLevelUnits.forEach(unit => { - testBattleStatLevelChangeDescription(unit.levels, unit.up, itBattleStat[unit.key]); - }); - }); - - it("Test getBattleStatName() in Français", async () => { - i18next.changeLanguage("fr"); - battleStatUnits.forEach(unit => { - testBattleStatName(unit.stat, frPokemonInfo[unit.key.split(".")[0]][unit.key.split(".")[1]]); - }); - }); - - it("Test getBattleStatLevelChangeDescription() in Français", async () => { - i18next.changeLanguage("fr"); - battleStatLevelUnits.forEach(unit => { - testBattleStatLevelChangeDescription(unit.levels, unit.up, frBattleStat[unit.key]); - }); - }); - - it("Test getBattleStatName() in Deutsch", async () => { - i18next.changeLanguage("de"); - battleStatUnits.forEach(unit => { - testBattleStatName(unit.stat, dePokemonInfo[unit.key.split(".")[0]][unit.key.split(".")[1]]); - }); - }); - - it("Test getBattleStatLevelChangeDescription() in Deutsch", async () => { - i18next.changeLanguage("de"); - battleStatLevelUnits.forEach(unit => { - testBattleStatLevelChangeDescription(unit.levels, unit.up, deBattleStat[unit.key]); - }); - }); - - it("Test getBattleStatName() in Português (BR)", async () => { - i18next.changeLanguage("pt-BR"); - battleStatUnits.forEach(unit => { - testBattleStatName(unit.stat, ptBrPokemonInfo[unit.key.split(".")[0]][unit.key.split(".")[1]]); - }); - }); - - it("Test getBattleStatLevelChangeDescription() in Português (BR)", async () => { - i18next.changeLanguage("pt-BR"); - battleStatLevelUnits.forEach(unit => { - testBattleStatLevelChangeDescription(unit.levels, unit.up, ptBrBattleStat[unit.key]); - }); - }); - - it("Test getBattleStatName() in 简体中文", async () => { - i18next.changeLanguage("zh-CN"); - battleStatUnits.forEach(unit => { - testBattleStatName(unit.stat, zhCnPokemonInfo[unit.key.split(".")[0]][unit.key.split(".")[1]]); - }); - }); - - it("Test getBattleStatLevelChangeDescription() in 简体中文", async () => { - i18next.changeLanguage("zh-CN"); - battleStatLevelUnits.forEach(unit => { - testBattleStatLevelChangeDescription(unit.levels, unit.up, zhCnBattleStat[unit.key]); - }); - }); - - it("Test getBattleStatName() in 繁體中文", async () => { - i18next.changeLanguage("zh-TW"); - battleStatUnits.forEach(unit => { - testBattleStatName(unit.stat, zhTwPokemonInfo[unit.key.split(".")[0]][unit.key.split(".")[1]]); - }); - }); - - it("Test getBattleStatLevelChangeDescription() in 繁體中文", async () => { - i18next.changeLanguage("zh-TW"); - battleStatLevelUnits.forEach(unit => { - testBattleStatLevelChangeDescription(unit.levels, unit.up, zhTwBattleStat[unit.key]); - }); - }); - - it("Test getBattleStatName() in 한국어", async () => { - await i18next.changeLanguage("ko"); - battleStatUnits.forEach(unit => { - testBattleStatName(unit.stat, koPokemonInfo[unit.key.split(".")[0]][unit.key.split(".")[1]]); - }); - }); - - it("Test getBattleStatLevelChangeDescription() in 한국어", async () => { - i18next.changeLanguage("ko", () => { - battleStatLevelUnits.forEach(unit => { - const processor = new KoreanPostpositionProcessor(); - const message = processor.process(koBattleStat[unit.key]); - testBattleStatLevelChangeDescription(unit.levels, unit.up, message); - }); - }); - }); -}); diff --git a/src/test/lokalisation/french.test.ts b/src/test/lokalisation/french.test.ts deleted file mode 100644 index 45429b1b157..00000000000 --- a/src/test/lokalisation/french.test.ts +++ /dev/null @@ -1,42 +0,0 @@ -import {afterEach, beforeAll, describe, expect, it} from "vitest"; -import Phaser from "phaser"; -import GameManager from "#app/test/utils/gameManager"; -import {Species} from "#enums/species"; -import i18next from "i18next"; -import {initI18n} from "#app/plugins/i18n"; - -describe("Lokalization - french", () => { - let phaserGame: Phaser.Game; - let game: GameManager; - - beforeAll(() => { - initI18n(); - phaserGame = new Phaser.Game({ - type: Phaser.HEADLESS, - }); - }); - - afterEach(() => { - game.phaseInterceptor.restoreOg(); - }); - - it("test bulbasaur name english", async () => { - game = new GameManager(phaserGame); - await game.startBattle([ - Species.BULBASAUR, - ]); - expect(game.scene.getParty()[0].name).toBe("Bulbasaur"); - }, 20000); - - it("test bulbasaure name french", async () => { - const locale = "fr"; - i18next.changeLanguage(locale); - localStorage.setItem("prLang", locale); - game = new GameManager(phaserGame); - - await game.startBattle([ - Species.BULBASAUR, - ]); - expect(game.scene.getParty()[0].name).toBe("Bulbizarre"); - }, 20000); -}); diff --git a/src/test/lokalisation/status-effect.test.ts b/src/test/lokalisation/status-effect.test.ts deleted file mode 100644 index ad33a59a675..00000000000 --- a/src/test/lokalisation/status-effect.test.ts +++ /dev/null @@ -1,300 +0,0 @@ -import { beforeAll, describe, afterEach, expect, it, vi } from "vitest"; -import { - StatusEffect, - getStatusEffectActivationText, - getStatusEffectDescriptor, - getStatusEffectHealText, - getStatusEffectObtainText, - getStatusEffectOverlapText, -} from "#app/data/status-effect"; -import i18next from "i18next"; -import { mockI18next } from "../utils/testUtils"; - -const pokemonName = "PKM"; -const sourceText = "SOURCE"; - -describe("status-effect", () => { - beforeAll(() => { - i18next.init(); - }); - - describe("NONE", () => { - const statusEffect = StatusEffect.NONE; - - it("should return the obtain text", () => { - mockI18next(); - - const text = getStatusEffectObtainText(statusEffect, pokemonName); - expect(text).toBe("statusEffect:none.obtain"); - - const emptySourceText = getStatusEffectObtainText(statusEffect, pokemonName, ""); - expect(emptySourceText).toBe("statusEffect:none.obtain"); - }); - - it("should return the source-obtain text", () => { - mockI18next(); - - const text = getStatusEffectObtainText(statusEffect, pokemonName, sourceText); - expect(text).toBe("statusEffect:none.obtainSource"); - - const emptySourceText = getStatusEffectObtainText(statusEffect, pokemonName, ""); - expect(emptySourceText).not.toBe("statusEffect:none.obtainSource"); - }); - - it("should return the activation text", () => { - mockI18next(); - const text = getStatusEffectActivationText(statusEffect, pokemonName); - expect(text).toBe("statusEffect:none.activation"); - }); - - it("should return the overlap text", () => { - mockI18next(); - const text = getStatusEffectOverlapText(statusEffect, pokemonName); - expect(text).toBe("statusEffect:none.overlap"); - }); - - it("should return the heal text", () => { - mockI18next(); - const text = getStatusEffectHealText(statusEffect, pokemonName); - expect(text).toBe("statusEffect:none.heal"); - }); - - it("should return the descriptor", () => { - mockI18next(); - const text = getStatusEffectDescriptor(statusEffect); - expect(text).toBe("statusEffect:none.description"); - }); - }); - - describe("POISON", () => { - const statusEffect = StatusEffect.POISON; - - it("should return the obtain text", () => { - mockI18next(); - - const text = getStatusEffectObtainText(statusEffect, pokemonName); - expect(text).toBe("statusEffect:poison.obtain"); - - const emptySourceText = getStatusEffectObtainText(statusEffect, pokemonName, ""); - expect(emptySourceText).toBe("statusEffect:poison.obtain"); - }); - - it("should return the activation text", () => { - mockI18next(); - const text = getStatusEffectActivationText(statusEffect, pokemonName); - expect(text).toBe("statusEffect:poison.activation"); - }); - - it("should return the descriptor", () => { - mockI18next(); - const text = getStatusEffectDescriptor(statusEffect); - expect(text).toBe("statusEffect:poison.description"); - }); - - it("should return the heal text", () => { - mockI18next(); - const text = getStatusEffectHealText(statusEffect, pokemonName); - expect(text).toBe("statusEffect:poison.heal"); - }); - - it("should return the overlap text", () => { - mockI18next(); - const text = getStatusEffectOverlapText(statusEffect, pokemonName); - expect(text).toBe("statusEffect:poison.overlap"); - }); - }); - - describe("TOXIC", () => { - const statusEffect = StatusEffect.TOXIC; - - it("should return the obtain text", () => { - mockI18next(); - - const text = getStatusEffectObtainText(statusEffect, pokemonName); - expect(text).toBe("statusEffect:toxic.obtain"); - - const emptySourceText = getStatusEffectObtainText(statusEffect, pokemonName, ""); - expect(emptySourceText).toBe("statusEffect:toxic.obtain"); - }); - - it("should return the activation text", () => { - mockI18next(); - const text = getStatusEffectActivationText(statusEffect, pokemonName); - expect(text).toBe("statusEffect:toxic.activation"); - }); - - it("should return the descriptor", () => { - mockI18next(); - const text = getStatusEffectDescriptor(statusEffect); - expect(text).toBe("statusEffect:toxic.description"); - }); - - it("should return the heal text", () => { - mockI18next(); - const text = getStatusEffectHealText(statusEffect, pokemonName); - expect(text).toBe("statusEffect:toxic.heal"); - }); - - it("should return the overlap text", () => { - mockI18next(); - const text = getStatusEffectOverlapText(statusEffect, pokemonName); - expect(text).toBe("statusEffect:toxic.overlap"); - }); - }); - - describe("PARALYSIS", () => { - const statusEffect = StatusEffect.PARALYSIS; - - it("should return the obtain text", () => { - mockI18next(); - - const text = getStatusEffectObtainText(statusEffect, pokemonName); - expect(text).toBe("statusEffect:paralysis.obtain"); - - const emptySourceText = getStatusEffectObtainText(statusEffect, pokemonName, ""); - expect(emptySourceText).toBe("statusEffect:paralysis.obtain"); - }); - - it("should return the activation text", () => { - mockI18next(); - const text = getStatusEffectActivationText(statusEffect, pokemonName); - expect(text).toBe("statusEffect:paralysis.activation"); - }); - - it("should return the descriptor", () => { - mockI18next(); - const text = getStatusEffectDescriptor(statusEffect); - expect(text).toBe("statusEffect:paralysis.description"); - }); - - it("should return the heal text", () => { - mockI18next(); - const text = getStatusEffectHealText(statusEffect, pokemonName); - expect(text).toBe("statusEffect:paralysis.heal"); - }); - - it("should return the overlap text", () => { - mockI18next(); - const text = getStatusEffectOverlapText(statusEffect, pokemonName); - expect(text).toBe("statusEffect:paralysis.overlap"); - }); - }); - - describe("SLEEP", () => { - const statusEffect = StatusEffect.SLEEP; - - it("should return the obtain text", () => { - mockI18next(); - - const text = getStatusEffectObtainText(statusEffect, pokemonName); - expect(text).toBe("statusEffect:sleep.obtain"); - - const emptySourceText = getStatusEffectObtainText(statusEffect, pokemonName, ""); - expect(emptySourceText).toBe("statusEffect:sleep.obtain"); - }); - - it("should return the activation text", () => { - mockI18next(); - const text = getStatusEffectActivationText(statusEffect, pokemonName); - expect(text).toBe("statusEffect:sleep.activation"); - }); - - it("should return the descriptor", () => { - mockI18next(); - const text = getStatusEffectDescriptor(statusEffect); - expect(text).toBe("statusEffect:sleep.description"); - }); - - it("should return the heal text", () => { - mockI18next(); - const text = getStatusEffectHealText(statusEffect, pokemonName); - expect(text).toBe("statusEffect:sleep.heal"); - }); - - it("should return the overlap text", () => { - mockI18next(); - const text = getStatusEffectOverlapText(statusEffect, pokemonName); - expect(text).toBe("statusEffect:sleep.overlap"); - }); - }); - - describe("FREEZE", () => { - const statusEffect = StatusEffect.FREEZE; - - it("should return the obtain text", () => { - mockI18next(); - - const text = getStatusEffectObtainText(statusEffect, pokemonName); - expect(text).toBe("statusEffect:freeze.obtain"); - - const emptySourceText = getStatusEffectObtainText(statusEffect, pokemonName, ""); - expect(emptySourceText).toBe("statusEffect:freeze.obtain"); - }); - - it("should return the activation text", () => { - mockI18next(); - const text = getStatusEffectActivationText(statusEffect, pokemonName); - expect(text).toBe("statusEffect:freeze.activation"); - }); - - it("should return the descriptor", () => { - mockI18next(); - const text = getStatusEffectDescriptor(statusEffect); - expect(text).toBe("statusEffect:freeze.description"); - }); - - it("should return the heal text", () => { - mockI18next(); - const text = getStatusEffectHealText(statusEffect, pokemonName); - expect(text).toBe("statusEffect:freeze.heal"); - }); - - it("should return the overlap text", () => { - mockI18next(); - const text = getStatusEffectOverlapText(statusEffect, pokemonName); - expect(text).toBe("statusEffect:freeze.overlap"); - }); - }); - - describe("BURN", () => { - const statusEffect = StatusEffect.BURN; - - it("should return the obtain text", () => { - mockI18next(); - - const text = getStatusEffectObtainText(statusEffect, pokemonName); - expect(text).toBe("statusEffect:burn.obtain"); - - const emptySourceText = getStatusEffectObtainText(statusEffect, pokemonName, ""); - expect(emptySourceText).toBe("statusEffect:burn.obtain"); - }); - - it("should return the activation text", () => { - mockI18next(); - const text = getStatusEffectActivationText(statusEffect, pokemonName); - expect(text).toBe("statusEffect:burn.activation"); - }); - - it("should return the descriptor", () => { - mockI18next(); - const text = getStatusEffectDescriptor(statusEffect); - expect(text).toBe("statusEffect:burn.description"); - }); - - it("should return the heal text", () => { - mockI18next(); - const text = getStatusEffectHealText(statusEffect, pokemonName); - expect(text).toBe("statusEffect:burn.heal"); - }); - - it("should return the overlap text", () => { - mockI18next(); - const text = getStatusEffectOverlapText(statusEffect, pokemonName); - expect(text).toBe("statusEffect:burn.overlap"); - }); - }); - - afterEach(() => { - vi.resetAllMocks(); - }); -}); From 7b9e95db401fded14124eec72a5d4c3742113a41 Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Mon, 15 Jul 2024 13:02:10 -0400 Subject: [PATCH 115/270] update forms with labels --- .github/ISSUE_TEMPLATE/art_request.md | 4 ++-- .github/ISSUE_TEMPLATE/bug_report.md | 2 +- .github/ISSUE_TEMPLATE/feature_request.md | 2 +- .github/ISSUE_TEMPLATE/mystery_event.yml | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/art_request.md b/.github/ISSUE_TEMPLATE/art_request.md index df557462f26..f31b0a07425 100644 --- a/.github/ISSUE_TEMPLATE/art_request.md +++ b/.github/ISSUE_TEMPLATE/art_request.md @@ -1,8 +1,8 @@ --- name: Art Request about: Create an art request for a specific Encounter -title: "[ART]" -labels: Art +title: "[Art]" +labels: ["art request"] assignees: '' --- diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 6545a0d2367..ce0e39798bd 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -2,7 +2,7 @@ name: Bug report about: Create a report to help us improve title: "[BUG]" -labels: Bug +labels: ["bug"] assignees: '' --- diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index cb5c8a1b6f3..baaa58886e5 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -2,7 +2,7 @@ name: Feature request about: Suggest an idea for this project title: "[Feature]" -labels: enhancement +labels: ["enhancement/util"] assignees: '' --- diff --git a/.github/ISSUE_TEMPLATE/mystery_event.yml b/.github/ISSUE_TEMPLATE/mystery_event.yml index 5e3b6a585f7..be7b98eda78 100644 --- a/.github/ISSUE_TEMPLATE/mystery_event.yml +++ b/.github/ISSUE_TEMPLATE/mystery_event.yml @@ -1,7 +1,7 @@ name: Mystery Event description: Propose a new mystery event title: "[Event] " -labels: ["event proposal"] +labels: ["event proposal", "balance review"] projects: ["AsdarDevelops/1"] body: - type: input From 1a95f0679504850e2cacd7cadd57790586551270 Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Mon, 15 Jul 2024 14:01:47 -0400 Subject: [PATCH 116/270] implement max spawns per run for individual encounters, tweak spawn rates --- src/battle-scene.ts | 30 ++++++++++++++----- .../mystery-encounters/mystery-encounter.ts | 18 +++++++++-- .../utils/encounter-phase-utils.ts | 2 +- 3 files changed, 38 insertions(+), 12 deletions(-) diff --git a/src/battle-scene.ts b/src/battle-scene.ts index 3e9176430a5..c0a3f0b090a 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -1071,13 +1071,14 @@ export default class BattleScene extends SceneBase { this.field.add(newTrainer); } - // Check for mystery encounter - // Can only occur in place of a standard wild battle, waves 10-180 + // TODO: remove this once spawn rates are finalized // let testStartingWeight = 0; - // while (testStartingWeight < 20) { + // while (testStartingWeight < 3) { // calculateMEAggregateStats(this, testStartingWeight); // testStartingWeight += 1; // } + // Check for mystery encounter + // Can only occur in place of a standard wild battle, waves 10-180 if (this.gameMode.hasMysteryEncounters && newBattleType === BattleType.WILD && !this.gameMode.isBoss(newWaveIndex) && newWaveIndex < 180 && newWaveIndex > 10) { const roll = Utils.randSeedInt(256); @@ -2651,7 +2652,7 @@ export default class BattleScene extends SceneBase { } // Common / Uncommon / Rare / Super Rare - const tierWeights = [61, 40, 21, 6]; + const tierWeights = [64, 40, 21, 3]; // Adjust tier weights by previously encountered events to lower odds of only common/uncommons in run this.mysteryEncounterData.encounteredEvents.forEach(val => { @@ -2681,10 +2682,23 @@ export default class BattleScene extends SceneBase { // If no valid encounters exist at tier, checks next tier down, continuing until there are some encounters available while (availableEncounters.length === 0 && tier >= 0) { availableEncounters = biomeMysteryEncounters - .filter((encounterType) => - allMysteryEncounters[encounterType]?.meetsRequirements(this) && - allMysteryEncounters[encounterType].encounterTier === tier && - (isNullOrUndefined(previousEncounter) || encounterType !== previousEncounter)) + .filter((encounterType) => { + if (allMysteryEncounters[encounterType].encounterTier !== tier) { // Encounter is in tier + return false; + } + if (!allMysteryEncounters[encounterType]?.meetsRequirements(this)) { // Meets encounter requirements + return false; + } + if (!isNullOrUndefined(previousEncounter) && encounterType === previousEncounter) { // Previous encounter was not this one + return false; + } + if (this.mysteryEncounterData.encounteredEvents?.length > 0 && // Encounter has not exceeded max allowed encounters + allMysteryEncounters[encounterType].maxAllowedEncounters > 0 + && this.mysteryEncounterData.encounteredEvents.filter(e => e[0] === encounterType).length >= allMysteryEncounters[encounterType].maxAllowedEncounters) { + return false; + } + return true; + }) .map((m) => (allMysteryEncounters[m])); tier--; } diff --git a/src/data/mystery-encounters/mystery-encounter.ts b/src/data/mystery-encounters/mystery-encounter.ts index 45ff955bc33..c0c8b1e5aaf 100644 --- a/src/data/mystery-encounters/mystery-encounter.ts +++ b/src/data/mystery-encounters/mystery-encounter.ts @@ -50,6 +50,7 @@ export default interface IMysteryEncounter { hideBattleIntroMessage?: boolean; hideIntroVisuals?: boolean; catchAllowed?: boolean; + maxAllowedEncounters?: number; doEncounterExp?: (scene: BattleScene) => boolean; doEncounterRewards?: (scene: BattleScene) => boolean; onInit?: (scene: BattleScene) => boolean; @@ -144,6 +145,8 @@ export default class IMysteryEncounter implements IMysteryEncounter { } this.encounterTier = this.encounterTier ? this.encounterTier : MysteryEncounterTier.COMMON; this.dialogue = this.dialogue ?? {}; + // Default max is 1 for ROGUE encounters, 3 for others + this.maxAllowedEncounters = this.maxAllowedEncounters ?? this.encounterTier === MysteryEncounterTier.ROGUE ? 1 : 3; this.encounterVariant = MysteryEncounterVariant.DEFAULT; this.requirements = this.requirements ? this.requirements : []; this.hideBattleIntroMessage = !isNullOrUndefined(this.hideBattleIntroMessage) ? this.hideBattleIntroMessage : false; @@ -435,9 +438,9 @@ export class MysteryEncounterBuilder implements Partial { * If not specified, defaults to COMMON * Tiers are: * COMMON 32/64 odds - * UNCOMMON 16/64 odds - * RARE 10/64 odds - * SUPER_RARE 6/64 odds + * GREAT 16/64 odds + * ULTRA 10/64 odds + * ROGUE 6/64 odds * ULTRA_RARE Not currently used * @param encounterTier * @returns @@ -446,6 +449,15 @@ export class MysteryEncounterBuilder implements Partial { return Object.assign(this, { encounterTier: encounterTier }); } + /** + * Sets the maximum number of times that an encounter can spawn in a given Classic run + * @param maxAllowedEncounters + * @returns + */ + withMaxAllowedEncounters(maxAllowedEncounters: number): this & Required> { + return Object.assign(this, { maxAllowedEncounters: maxAllowedEncounters }); + } + /** * Specifies a requirement for an encounter * For example, passing requirement as "new WaveCountRequirement([2, 180])" would create a requirement that the encounter can only be spawned between waves 2 and 180 diff --git a/src/data/mystery-encounters/utils/encounter-phase-utils.ts b/src/data/mystery-encounters/utils/encounter-phase-utils.ts index 100c25aa45d..c9c3e980456 100644 --- a/src/data/mystery-encounters/utils/encounter-phase-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-phase-utils.ts @@ -632,7 +632,7 @@ export function calculateMEAggregateStats(scene: BattleScene, baseSpawnWeight: n // Calculate encounter rarity // Common / Uncommon / Rare / Super Rare (base is out of 128) - const tierWeights = [61, 40, 21, 6]; + const tierWeights = [64, 40, 21, 3]; // Adjust tier weights by currently encountered events (pity system that lowers odds of multiple common/uncommons) tierWeights[0] = tierWeights[0] - 6 * numEncounters[0]; From dc299275aca8f662a44375d4edabb211c98cf653 Mon Sep 17 00:00:00 2001 From: InnocentGameDev Date: Mon, 15 Jul 2024 20:26:15 +0200 Subject: [PATCH 117/270] testing form changes --- .github/ISSUE_TEMPLATE/mystery_event copy.yml | 170 ++++++++++++++++++ 1 file changed, 170 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/mystery_event copy.yml diff --git a/.github/ISSUE_TEMPLATE/mystery_event copy.yml b/.github/ISSUE_TEMPLATE/mystery_event copy.yml new file mode 100644 index 00000000000..e471037dd8a --- /dev/null +++ b/.github/ISSUE_TEMPLATE/mystery_event copy.yml @@ -0,0 +1,170 @@ +name: Mystery Event Test +description: Don't use this one +title: "[Event] " +labels: ["event proposal", "balance review"] +projects: ["AsdarDevelops/1"] +body: + - type: input + id: name + attributes: + label: Event Name + description: Name of the event + placeholder: e.g "Fight or Flight" + validations: + required: true + - type: markdown # SEPARATOR + attributes: + value: | + --- + - type: dropdown + id: rarity + attributes: + label: Rarity Tier + multiple: false + options: + - Common + - Great + - Ultra + - Rogue + - Other or unsure (please specify) + validations: + required: true + + - type: input + id: other_rarity_specify + attributes: + label: Please specify other rarity + visible: false # Initially hidden + validations: + required: true + +- type: script + content: | + document.getElementById('rarity').addEventListener('change', function() { + var otherInput = document.getElementById('other_rarity_specify'); + if (this.value === 'Other or unsure (please specify)') { + otherInput.style.display = 'block'; + } else { + otherInput.style.display = 'none'; + } + }); + + - type: markdown # SEPARATOR + attributes: + value: | + --- + - type: input + id: waves + attributes: + label: Waves + description: Classic/Challenge is 1 -200. Currently only 11-179 is supported. + placeholder: 1-200 + validations: + required: true + - type: markdown # SEPARATOR + attributes: + value: | + --- + - type: textarea + id: description + attributes: + label: Description + description: Describe the event you are proposing + placeholder: What is it? + validations: + required: true + - type: markdown # SEPARATOR + attributes: + value: | + --- + - type: dropdown + id: biomes + attributes: + label: Biomes + description: Select all biomes where the event can occur + multiple: true + options: + - ANY (no need to select all) + - NON-EXTREME (almost all except Space, Seabed, etc...) + - TOWN + - PLAINS + - GRASS + - TALL_GRASS + - METROPOLIS + - FOREST + - SEA + - SWAMP + - BEACH + - LAKE + - SEABED + - MOUNTAIN + - BADLANDS + - CAVE + - DESERT + - ICE_CAVE + - MEADOW + - POWER_PLANT + - VOLCANO + - GRAVEYARD + - DOJO + - FACTORY + - RUINS + - WASTELAND + - ABYSS + - SPACE + - CONSTRUCTION_SITE + - JUNGLE + - FAIRY_CAVE + - TEMPLE + - SLUM + - SNOWY_FOREST + - ISLAND + - LABORATORY + - END + - OTHER (please specify) + validations: + required: true + - type: markdown # SEPARATOR + attributes: + value: | + --- + - type: textarea + id: options + attributes: + label: Options offered to the player + description: A maximum of four options can be displayed at a time + placeholder: Remember that only up to four options can be displayed at a time + value: | + - [ ] OPTION-1 Label + - _OPTION-1 description._ + - [ ] OPTION-2 Label + - _OPTION-2 description._ + - [ ] OPTION-3 Label + - _OPTION-3 description._ + - [ ] OPTION-4 Label + - _OPTION-4 description._ + validations: + required: true + - type: markdown # SEPARATOR + attributes: + value: | + --- + - type: textarea + id: design-notes + attributes: + label: Explanation/Notes on Design + description: Explain why you think this design is right and what this Event brings to the table + placeholder: Explain why you think this design is right and what this Event brings to the table + validations: + required: true + - type: markdown # SEPARATOR + attributes: + value: | + --- + - type: textarea + id: dev-notes + attributes: + label: Notes to Developers + placeholder: If necessary + validations: + required: false From 5b9cc1eb8d23eae4614dbe492c82c068ef9312b4 Mon Sep 17 00:00:00 2001 From: Asdar Date: Mon, 15 Jul 2024 20:32:21 +0200 Subject: [PATCH 118/270] Update mystery_event.yml Referring to the guide --- .github/ISSUE_TEMPLATE/mystery_event.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/ISSUE_TEMPLATE/mystery_event.yml b/.github/ISSUE_TEMPLATE/mystery_event.yml index be7b98eda78..f26886c5a1a 100644 --- a/.github/ISSUE_TEMPLATE/mystery_event.yml +++ b/.github/ISSUE_TEMPLATE/mystery_event.yml @@ -20,6 +20,7 @@ body: id: rarity attributes: label: Rarity Tier + description: Check out the [Event Proposal Guide](https://github.com/AsdarDevelops/PokeRogue-Events/blob/mystery-battle-events/MEs_Proposal_Guide.md#do-tiers-mean-anything) if you have not yet! multiple: false options: - Common From 543cb70323caa758429e475ee7409ed577d06d5f Mon Sep 17 00:00:00 2001 From: InnocentGameDev Date: Mon, 15 Jul 2024 21:51:38 +0200 Subject: [PATCH 119/270] included art request in the form and made some more minor changes --- .github/ISSUE_TEMPLATE/mystery_event copy.yml | 170 ------------------ .github/ISSUE_TEMPLATE/mystery_event.yml | 34 ++-- 2 files changed, 24 insertions(+), 180 deletions(-) delete mode 100644 .github/ISSUE_TEMPLATE/mystery_event copy.yml diff --git a/.github/ISSUE_TEMPLATE/mystery_event copy.yml b/.github/ISSUE_TEMPLATE/mystery_event copy.yml deleted file mode 100644 index e471037dd8a..00000000000 --- a/.github/ISSUE_TEMPLATE/mystery_event copy.yml +++ /dev/null @@ -1,170 +0,0 @@ -name: Mystery Event Test -description: Don't use this one -title: "[Event] " -labels: ["event proposal", "balance review"] -projects: ["AsdarDevelops/1"] -body: - - type: input - id: name - attributes: - label: Event Name - description: Name of the event - placeholder: e.g "Fight or Flight" - validations: - required: true - - type: markdown # SEPARATOR - attributes: - value: | - --- - - type: dropdown - id: rarity - attributes: - label: Rarity Tier - multiple: false - options: - - Common - - Great - - Ultra - - Rogue - - Other or unsure (please specify) - validations: - required: true - - - type: input - id: other_rarity_specify - attributes: - label: Please specify other rarity - visible: false # Initially hidden - validations: - required: true - -- type: script - content: | - document.getElementById('rarity').addEventListener('change', function() { - var otherInput = document.getElementById('other_rarity_specify'); - if (this.value === 'Other or unsure (please specify)') { - otherInput.style.display = 'block'; - } else { - otherInput.style.display = 'none'; - } - }); - - - type: markdown # SEPARATOR - attributes: - value: | - --- - - type: input - id: waves - attributes: - label: Waves - description: Classic/Challenge is 1 -200. Currently only 11-179 is supported. - placeholder: 1-200 - validations: - required: true - - type: markdown # SEPARATOR - attributes: - value: | - --- - - type: textarea - id: description - attributes: - label: Description - description: Describe the event you are proposing - placeholder: What is it? - validations: - required: true - - type: markdown # SEPARATOR - attributes: - value: | - --- - - type: dropdown - id: biomes - attributes: - label: Biomes - description: Select all biomes where the event can occur - multiple: true - options: - - ANY (no need to select all) - - NON-EXTREME (almost all except Space, Seabed, etc...) - - TOWN - - PLAINS - - GRASS - - TALL_GRASS - - METROPOLIS - - FOREST - - SEA - - SWAMP - - BEACH - - LAKE - - SEABED - - MOUNTAIN - - BADLANDS - - CAVE - - DESERT - - ICE_CAVE - - MEADOW - - POWER_PLANT - - VOLCANO - - GRAVEYARD - - DOJO - - FACTORY - - RUINS - - WASTELAND - - ABYSS - - SPACE - - CONSTRUCTION_SITE - - JUNGLE - - FAIRY_CAVE - - TEMPLE - - SLUM - - SNOWY_FOREST - - ISLAND - - LABORATORY - - END - - OTHER (please specify) - validations: - required: true - - type: markdown # SEPARATOR - attributes: - value: | - --- - - type: textarea - id: options - attributes: - label: Options offered to the player - description: A maximum of four options can be displayed at a time - placeholder: Remember that only up to four options can be displayed at a time - value: | - - [ ] OPTION-1 Label - - _OPTION-1 description._ - - [ ] OPTION-2 Label - - _OPTION-2 description._ - - [ ] OPTION-3 Label - - _OPTION-3 description._ - - [ ] OPTION-4 Label - - _OPTION-4 description._ - validations: - required: true - - type: markdown # SEPARATOR - attributes: - value: | - --- - - type: textarea - id: design-notes - attributes: - label: Explanation/Notes on Design - description: Explain why you think this design is right and what this Event brings to the table - placeholder: Explain why you think this design is right and what this Event brings to the table - validations: - required: true - - type: markdown # SEPARATOR - attributes: - value: | - --- - - type: textarea - id: dev-notes - attributes: - label: Notes to Developers - placeholder: If necessary - validations: - required: false diff --git a/.github/ISSUE_TEMPLATE/mystery_event.yml b/.github/ISSUE_TEMPLATE/mystery_event.yml index f26886c5a1a..dbc262d31f7 100644 --- a/.github/ISSUE_TEMPLATE/mystery_event.yml +++ b/.github/ISSUE_TEMPLATE/mystery_event.yml @@ -9,7 +9,7 @@ body: attributes: label: Event Name description: Name of the event - placeholder: e.g Fight or Flight + placeholder: ie. "Fight or Flight" validations: required: true - type: markdown # SEPARATOR @@ -20,7 +20,7 @@ body: id: rarity attributes: label: Rarity Tier - description: Check out the [Event Proposal Guide](https://github.com/AsdarDevelops/PokeRogue-Events/blob/mystery-battle-events/MEs_Proposal_Guide.md#do-tiers-mean-anything) if you have not yet! + description: Check out the [Event Proposal Guide](https://github.com/AsdarDevelops/PokeRogue-Events/blob/mystery-battle-events/MEs_Proposal_Guide.md) if you have not yet! multiple: false options: - Common @@ -38,8 +38,8 @@ body: id: waves attributes: label: Waves - description: Classic/Challenge is 1 -200. Currently only 11-179 is supported. - placeholder: 1-200 + description: Classic/Challenge ranges 1-200. Currently only 11-179 is supported. + placeholder: 11-179 validations: required: true - type: markdown # SEPARATOR @@ -50,8 +50,8 @@ body: id: description attributes: label: Description - description: Describe the event you are proposing - placeholder: What is it? + description: Describe the event you are proposing. Explain its theme and how it's different from others. + placeholder: ie. "Fight or Flight is a common event where the player can fight a boss PKMN of the biome. The PKMN is stronger than usual, but also holds an item that's better than usual." validations: required: true - type: markdown # SEPARATOR @@ -62,11 +62,13 @@ body: id: biomes attributes: label: Biomes - description: Select all biomes where the event can occur + description: Select all biomes where the event can occur. "ANY, NON-EXTREME, CIVILIZATION and HUMAN are groups of biomes. Check the [Biomes part of the guide](https://github.com/AsdarDevelops/PokeRogue-Events/blob/mystery-battle-events/MEs_Proposal_Guide.md#biomes)." multiple: true options: - - ANY (no need to select all) - - NON-EXTREME (almost all except Space, Seabed, etc...) + - ANY + - NON-EXTREME + - HUMAN + - CIVILIZATION - TOWN - PLAINS - GRASS @@ -135,13 +137,25 @@ body: attributes: label: Explanation/Notes on Design description: Explain why you think this design is right and what this Event brings to the table - placeholder: Explain why you think this design is right and what this Event brings to the table + placeholder: ie. "We need more simple Events that mix slightly higher stakes with slightly better rewards" validations: required: true - type: markdown # SEPARATOR attributes: value: | --- + - type: textarea + id: artist-notes + attributes: + label: Notes to Artists + description: Does your Event need custom spriting? If so, please detail them here (reference screenshots are helpful) + placeholder: Ie. "We currently don't have a Cynthia sprite while dressed in a Garchomp costume. RAWR! This is highly needed for my Event!" + validations: + required: false + - type: markdown # SEPARATOR + attributes: + value: | + --- - type: textarea id: dev-notes attributes: From 87f7408117fd57c06692dbf3118417849c8a4e62 Mon Sep 17 00:00:00 2001 From: InnocentGameDev Date: Mon, 15 Jul 2024 22:02:36 +0200 Subject: [PATCH 120/270] template modifications --- .github/ISSUE_TEMPLATE/mystery_event.yml | 27 +++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/mystery_event.yml b/.github/ISSUE_TEMPLATE/mystery_event.yml index dbc262d31f7..b336eea0ee3 100644 --- a/.github/ISSUE_TEMPLATE/mystery_event.yml +++ b/.github/ISSUE_TEMPLATE/mystery_event.yml @@ -27,6 +27,7 @@ body: - Great - Ultra - Rogue + - Part of a "Quest" - Other or unsure (please specify) validations: required: true @@ -34,6 +35,18 @@ body: attributes: value: | --- + - type: input + id: rarity-other + attributes: + label: Rarity Tier - Other. Please Specify + description: If you chose `Other` on the `Rarity Tier` please specify it here + placeholder: e.g. "I'm unsure of whether this should be Common or Great" + validations: + required: false + - type: markdown # SEPARATOR + attributes: + value: | + --- - type: input id: waves attributes: @@ -50,7 +63,7 @@ body: id: description attributes: label: Description - description: Describe the event you are proposing. Explain its theme and how it's different from others. + description: Describe the event you are proposing. Explain its theme and how it's different from others. If the Event has any requirements to even trigger, detail them here too. placeholder: ie. "Fight or Flight is a common event where the player can fight a boss PKMN of the biome. The PKMN is stronger than usual, but also holds an item that's better than usual." validations: required: true @@ -111,6 +124,18 @@ body: attributes: value: | --- + - type: input + id: biome-other + attributes: + label: Biome - Other. Please Specify + description: If you chose `Other` on the `Biome` please specify it here + placeholder: e.g. "I would like to only trigger at Graveyard at night!" + validations: + required: false + - type: markdown # SEPARATOR + attributes: + value: | + --- - type: textarea id: options attributes: From 6ac54def30a49f10fc31a9deb9ec51e9e9852d96 Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Mon, 15 Jul 2024 13:45:25 -0700 Subject: [PATCH 121/270] re-add lost utiltiy methods: - applyHpChangeToPokemon - applyDamageToPokemon - applyHealToPokemon - koPlayerPokemon --- .../encounters/lost-at-sea-encounter.ts | 2 +- .../utils/encounter-phase-utils.ts | 66 ++++++++++++++++++- 2 files changed, 65 insertions(+), 3 deletions(-) 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 5e95c9d2b1f..8f1d9f3eb63 100644 --- a/src/data/mystery-encounters/encounters/lost-at-sea-encounter.ts +++ b/src/data/mystery-encounters/encounters/lost-at-sea-encounter.ts @@ -4,7 +4,7 @@ import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import BattleScene from "../../../battle-scene"; import MysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier } from "../mystery-encounter"; import { EncounterOptionMode, MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; -import { applyDamageToPokemon, leaveEncounterWithoutBattle, setEncounterExp } from "../mystery-encounter-utils"; +import { applyDamageToPokemon, leaveEncounterWithoutBattle, setEncounterExp } from "../utils/encounter-phase-utils"; const OPTION_1_REQUIRED_MOVE = Moves.SURF; const OPTION_2_REQUIRED_MOVE = Moves.FLY; diff --git a/src/data/mystery-encounters/utils/encounter-phase-utils.ts b/src/data/mystery-encounters/utils/encounter-phase-utils.ts index 100c25aa45d..6fa15ec373d 100644 --- a/src/data/mystery-encounters/utils/encounter-phase-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-phase-utils.ts @@ -385,7 +385,7 @@ export function setEncounterRewards(scene: BattleScene, customShopRewards?: Cust * Will initialize exp phases into the phase queue (these are in addition to any combat or other exp earned) * Exp Share and Exp Balance will still function as normal * @param scene - Battle Scene - * @param participantIds - ids of party pokemon that get full exp value. Other party members will receive Exp Share amounts + * @param participantId - id/s of party pokemon that get full exp value. Other party members will receive Exp Share amounts * @param baseExpValue - gives exp equivalent to a pokemon of the wave index's level. * Guidelines: * 36 - Sunkern (lowest in game) @@ -399,7 +399,9 @@ export function setEncounterRewards(scene: BattleScene, customShopRewards?: Cust * https://bulbapedia.bulbagarden.net/wiki/List_of_Pok%C3%A9mon_by_effort_value_yield_(Generation_IX) * @param useWaveIndex - set to false when directly passing the the full exp value instead of baseExpValue */ -export function setEncounterExp(scene: BattleScene, participantIds: integer[], baseExpValue: number, useWaveIndex: boolean = true) { +export function setEncounterExp(scene: BattleScene, participantId: integer | integer[], baseExpValue: number, useWaveIndex: boolean = true) { + const participantIds = Array.isArray(participantId) ? participantId : [participantId]; + scene.currentBattle.mysteryEncounter.doEncounterExp = (scene: BattleScene) => { const party = scene.getParty(); const expShareModifier = scene.findModifier(m => m instanceof ExpShareModifier) as ExpShareModifier; @@ -673,3 +675,63 @@ export function calculateMEAggregateStats(scene: BattleScene, baseSpawnWeight: n console.log(`Starting weight: ${baseSpawnWeight}\nAverage MEs per run: ${totalMean}\nStandard Deviation: ${totalStd}\nAvg Commons: ${commonMean}\nAvg Uncommons: ${uncommonMean}\nAvg Rares: ${rareMean}\nAvg Super Rares: ${superRareMean}`); } + +/** + * Takes care of handling player pokemon KO (with all its side effects) + * + * @param pokemon the player pokemon to KO + */ +export function koPlayerPokemon(pokemon: PlayerPokemon) { + pokemon.hp = 0; + pokemon.trySetStatus(StatusEffect.FAINT); + pokemon.updateInfo(); +} + +/** + * Handles applying hp changes to a player pokemon. + * Takes care of not going below `0`, above max-hp, adding `FNT` status correctly and updating the pokemon info. + * TODO: handle special cases like wonder-guard/ninjask + * + * @param pokemon the player pokemon to apply the hp change to + * @param damage the hp change amount. Positive for heal. Negative for damage + * + */ +function applyHpChangeToPokemon(pokemon: PlayerPokemon, value: number) { + const hpChange = Math.round(pokemon.hp + value); + const nextHp = Math.max(Math.min(hpChange, pokemon.getMaxHp()), 0); + if (nextHp === 0) { + koPlayerPokemon(pokemon); + } else { + pokemon.hp = nextHp; + } +} + +/** + * Handles applying damage to a player pokemon + * + * @param pokemon the player pokemon to apply damage to + * @param damage the amount of damage to apply + * @see {@linkcode applyHpChangeToPokemon} + */ +export function applyDamageToPokemon(pokemon: PlayerPokemon, damage: number) { + if (damage <= 0) { + console.warn("Healing pokemon with `applyDamageToPokemon` is not recommended! Please use `applyHealToPokemon` instead."); + } + + applyHpChangeToPokemon(pokemon, -damage); +} + +/** + * Handles applying heal to a player pokemon + * + * @param pokemon the player pokemon to apply heal to + * @param heal the amount of heal to apply + * @see {@linkcode applyHpChangeToPokemon} + */ +export function applyHealToPokemon(pokemon: PlayerPokemon, heal: number) { + if (heal <= 0) { + console.warn("Damaging pokemong with `applyHealToPokemon` is not recommended! Please use `applyDamageToPokemon` instead."); + } + + applyHpChangeToPokemon(pokemon, heal); +} From 8cd5f34b0cf6463f746409df14f4213a3df85387 Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Mon, 15 Jul 2024 13:59:04 -0700 Subject: [PATCH 122/270] lost at sea enc.: reduce dmg to 25% --- src/data/mystery-encounters/encounters/lost-at-sea-encounter.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 8f1d9f3eb63..093829ca0a9 100644 --- a/src/data/mystery-encounters/encounters/lost-at-sea-encounter.ts +++ b/src/data/mystery-encounters/encounters/lost-at-sea-encounter.ts @@ -13,7 +13,7 @@ const OPTION_2_REQUIRED_MOVE = Moves.FLY; * Can be a number between `0` - `100`. * The higher the more damage taken (100% = instant KO). */ -const DAMAGE_PERCENTAGE: number = 30; // 0 - 100 +const DAMAGE_PERCENTAGE: number = 25; // 0 - 100 /** The i18n namespace for the encounter */ const namepsace = "mysteryEncounter:lostAtSea"; From d73bf1e81d78219705cfcecdd58f3fd978bd0512 Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Mon, 15 Jul 2024 15:16:23 -0700 Subject: [PATCH 123/270] remove ".js" in imports --- .../mystery-encounters/encounters/lost-at-sea-encounter.ts | 4 ++-- src/data/mystery-encounters/mystery-encounter-option.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) 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 093829ca0a9..cbbdbdccf92 100644 --- a/src/data/mystery-encounters/encounters/lost-at-sea-encounter.ts +++ b/src/data/mystery-encounters/encounters/lost-at-sea-encounter.ts @@ -1,5 +1,5 @@ -import { Moves } from "#app/enums/moves.js"; -import { Species } from "#app/enums/species.js"; +import { Moves } from "#app/enums/moves"; +import { Species } from "#app/enums/species"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import BattleScene from "../../../battle-scene"; import MysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier } from "../mystery-encounter"; diff --git a/src/data/mystery-encounters/mystery-encounter-option.ts b/src/data/mystery-encounters/mystery-encounter-option.ts index edf08b26da7..b02cfd351a4 100644 --- a/src/data/mystery-encounters/mystery-encounter-option.ts +++ b/src/data/mystery-encounters/mystery-encounter-option.ts @@ -1,5 +1,5 @@ import { OptionTextDisplay } from "#app/data/mystery-encounters/mystery-encounter-dialogue"; -import { Moves } from "#app/enums/moves.js"; +import { Moves } from "#app/enums/moves"; import { PlayerPokemon } from "#app/field/pokemon"; import BattleScene from "../../battle-scene"; import * as Utils from "../../utils"; From c685d3b7382d07b0ee626b7c6623f9ecab0f3d4f Mon Sep 17 00:00:00 2001 From: InnocentGameDev Date: Tue, 16 Jul 2024 02:16:39 +0200 Subject: [PATCH 124/270] template formatting --- .github/ISSUE_TEMPLATE/mystery_event.yml | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/mystery_event.yml b/.github/ISSUE_TEMPLATE/mystery_event.yml index b336eea0ee3..3791026e778 100644 --- a/.github/ISSUE_TEMPLATE/mystery_event.yml +++ b/.github/ISSUE_TEMPLATE/mystery_event.yml @@ -9,7 +9,7 @@ body: attributes: label: Event Name description: Name of the event - placeholder: ie. "Fight or Flight" + placeholder: e.g. "Fight or Flight" validations: required: true - type: markdown # SEPARATOR @@ -29,12 +29,7 @@ body: - Rogue - Part of a "Quest" - Other or unsure (please specify) - validations: - required: true - - type: markdown # SEPARATOR - attributes: - value: | - --- + - type: input id: rarity-other attributes: @@ -64,7 +59,7 @@ body: attributes: label: Description description: Describe the event you are proposing. Explain its theme and how it's different from others. If the Event has any requirements to even trigger, detail them here too. - placeholder: ie. "Fight or Flight is a common event where the player can fight a boss PKMN of the biome. The PKMN is stronger than usual, but also holds an item that's better than usual." + placeholder: e.g. "Fight or Flight is a common event where the player can fight a boss PKMN of the biome. The PKMN is stronger than usual, but also holds an item that's better than usual." validations: required: true - type: markdown # SEPARATOR @@ -120,10 +115,7 @@ body: - OTHER (please specify) validations: required: true - - type: markdown # SEPARATOR - attributes: - value: | - --- + - type: input id: biome-other attributes: @@ -162,7 +154,7 @@ body: attributes: label: Explanation/Notes on Design description: Explain why you think this design is right and what this Event brings to the table - placeholder: ie. "We need more simple Events that mix slightly higher stakes with slightly better rewards" + placeholder: e.g. "We need more simple Events that mix slightly higher stakes with slightly better rewards" validations: required: true - type: markdown # SEPARATOR From e10a9caddc4899809bad6df46654d1f2c94da827 Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Mon, 15 Jul 2024 21:45:33 -0400 Subject: [PATCH 125/270] commit changes --- public/images/mystery-encounters/mud.json | 90 ++++----- public/images/mystery-encounters/mud.png | Bin 361 -> 375 bytes .../encounters/fiery-fallout-encounter.ts | 173 ++++++++++++++++++ .../encounters/safari-zone-encounter.ts | 63 ++++--- .../mystery-encounters/mystery-encounter.ts | 32 +++- .../mystery-encounters/mystery-encounters.ts | 6 +- .../utils/encounter-phase-utils.ts | 44 ++++- .../utils/encounter-pokemon-utils.ts | 3 +- src/enums/mystery-encounter-type.ts | 3 +- src/locales/en/mystery-encounter.ts | 20 ++ src/overrides.ts | 4 +- src/phases.ts | 38 ++-- src/phases/mystery-encounter-phase.ts | 9 +- 13 files changed, 380 insertions(+), 105 deletions(-) create mode 100644 src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts diff --git a/public/images/mystery-encounters/mud.json b/public/images/mystery-encounters/mud.json index 804eed36052..505a6fadd27 100644 --- a/public/images/mystery-encounters/mud.json +++ b/public/images/mystery-encounters/mud.json @@ -4,51 +4,72 @@ "image": "mud.png", "format": "RGBA8888", "size": { - "w": 18, - "h": 55 + "w": 14, + "h": 68 }, "scale": 1, "frames": [ { - "filename": "0002.png", + "filename": "0001.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 16, - "h": 16 + "w": 12, + "h": 20 }, "spriteSourceSize": { "x": 0, - "y": 3, - "w": 16, + "y": 0, + "w": 12, "h": 13 }, "frame": { "x": 1, "y": 1, - "w": 16, + "w": 12, "h": 13 } }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 12, + "h": 20 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 12, + "h": 14 + }, + "frame": { + "x": 1, + "y": 16, + "w": 12, + "h": 14 + } + }, { "filename": "0003.png", "rotated": false, "trimmed": true, "sourceSize": { - "w": 16, - "h": 16 + "w": 12, + "h": 20 }, "spriteSourceSize": { "x": 0, - "y": 4, - "w": 16, - "h": 12 + "y": 1, + "w": 12, + "h": 16 }, "frame": { "x": 1, - "y": 16, - "w": 16, - "h": 12 + "y": 32, + "w": 12, + "h": 16 } }, { @@ -56,41 +77,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 16, - "h": 16 + "w": 12, + "h": 20 }, "spriteSourceSize": { "x": 0, - "y": 7, - "w": 16, - "h": 9 - }, - "frame": { - "x": 1, - "y": 30, - "w": 16, - "h": 9 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 16, - "h": 16 - }, - "spriteSourceSize": { - "x": 1, "y": 3, - "w": 14, - "h": 13 + "w": 12, + "h": 17 }, "frame": { "x": 1, - "y": 41, - "w": 14, - "h": 13 + "y": 50, + "w": 12, + "h": 17 } } ] @@ -99,6 +99,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:a9f7ae83758a2dffaacdaba2ee9dc2e2:0ebff9db47ce74a0ec049f5d74d589fa:c64f6b8befc3d5e9f836246d2b9536be$" + "smartupdate": "$TexturePacker:SmartUpdate:4f18a8effb8f01eb70f9f25b8294c1bf:ad663a73c51f780bbf45d00a52519553:c64f6b8befc3d5e9f836246d2b9536be$" } } diff --git a/public/images/mystery-encounters/mud.png b/public/images/mystery-encounters/mud.png index 89f174bef74e73d32fd9538b3be7e58339212226..2ba7cb00047aa4b3207ec70993c6fef3e34e7834 100644 GIT binary patch delta 349 zcmV-j0iyot0`~$%iBL{Q4GJ0x0000DNk~Le0000E0000)2m=5B0ESic=>Px#7*I@9 zMNDaNp>tP}UqEw7F2a^29iOE%sAua_s|;D_@a5(7pk+^m_XOp)~sBMJ((z z8l@j|-Ap6teCd12`Ld5w{*R*gPD8$UY`*kyr(qvqOd8(X!ii49cR;*->2qr|5*OB_ v(b&td)5wi;{Yry4nneB%O#fk4H@*QbOa}pU59*4R00000NkvXXu0mjfbT*oI delta 335 zcmV-V0kHn}0_g%miBL{Q4GJ0x0000DNk~Le0000I0000t2m=5B05);z-~a#s6;Mo6 zMNDaNb4f8?G$At~7m;5;p>tQbh--SnBc72(C4cQnL_t(I%cYYG4#OY}L$MRM|B>f} zmQUABs}`x1cnyfyZYhrnxU37RZx9Vls4h$`wYn$=5vWNAVx^WYNIMZhx{5duwGp6t z^tQ7}`_u^a9c`x1y~bI^%yN_2dVjmD@6pfdypx7&$0kkhpzo+sb90rIo_cXPE|qa9 zJ%1&HtnhenFhlL)MA@#*L^<+V { + const encounter = scene.currentBattle.mysteryEncounter; + + // Calculate boss mon + const volcaronaSpecies = getPokemonSpecies(Species.VOLCARONA); + const config: EnemyPartyConfig = { + levelAdditiveMultiplier: 0.25, + pokemonConfigs: [ + { + species: volcaronaSpecies, + isBoss: false, + gender: Gender.MALE + }, + { + species: volcaronaSpecies, + isBoss: false, + gender: Gender.FEMALE + } + ], + doubleBattle: true, + disableSwitch: true + }; + encounter.enemyPartyConfigs = [config]; + + const spriteKey = volcaronaSpecies.getSpriteId(false, null, false, null); + encounter.spriteConfigs = [ + { + spriteKey: spriteKey, + fileRoot: "pokemon", + tint: 0.9, + repeat: true + } + ]; + + // Sets weather for 5 turns + scene.arena.trySetWeather(WeatherType.SUNNY, true); + + return true; + }) + .withTitle(`${namespace}_title`) + .withDescription(`${namespace}_description`) + .withQuery(`${namespace}_query`) + .withSimpleOption( + { + buttonLabel: `${namespace}_option_1_label`, + buttonTooltip: `${namespace}_option_1_tooltip`, + selected: [ + { + text: `${namespace}_option_1_selected`, + }, + ], + }, + async (scene: BattleScene) => { + // Pick battle + const encounter = scene.currentBattle.mysteryEncounter; + // TODO: play heat wave animation for weather effect + // await initMoveAnim(scene, Moves.HEAT_WAVE); + // await loadMoveAnimAssets(scene, [ Moves.HEAT_WAVE ], true); + // const heatWave = new MoveAnim(Moves.HEAT_WAVE, scene.getPlayerPokemon(), 0); + // heatWave.play(scene); + + await initMoveAnim(scene, Moves.QUIVER_DANCE); + await initMoveAnim(scene, Moves.FIRE_SPIN); + await initMoveAnim(scene, Moves.HEAT_WAVE); + const charcoal = generateModifierTypeOption(scene, modifierTypes.ATTACK_TYPE_BOOSTER, [Type.FIRE]); + setEncounterRewards(scene, { guaranteedModifierTypeOptions: [charcoal], fillRemaining: true }); + encounter.startOfBattleEffects.push( + { + sourceBattlerIndex: BattlerIndex.ENEMY, + targets: [BattlerIndex.PLAYER, BattlerIndex.PLAYER_2], + move: new PokemonMove(Moves.HEAT_WAVE), + ignorePp: true + }, + { + sourceBattlerIndex: BattlerIndex.ENEMY, + targets: [BattlerIndex.ENEMY], + move: new PokemonMove(Moves.QUIVER_DANCE), + ignorePp: true + }, + { + sourceBattlerIndex: BattlerIndex.ENEMY_2, + targets: [BattlerIndex.ENEMY_2], + move: new PokemonMove(Moves.QUIVER_DANCE), + ignorePp: true + }, + { + sourceBattlerIndex: BattlerIndex.ENEMY, + targets: [BattlerIndex.PLAYER], + move: new PokemonMove(Moves.FIRE_SPIN), + ignorePp: true + }, + { + sourceBattlerIndex: BattlerIndex.ENEMY_2, + targets: [BattlerIndex.PLAYER_2], + move: new PokemonMove(Moves.FIRE_SPIN), + ignorePp: true + }); + await initBattleWithEnemyConfig(scene, scene.currentBattle.mysteryEncounter.enemyPartyConfigs[0]); + } + ) + .withSimpleOption( + { + buttonLabel: `${namespace}_option_2_label`, + buttonTooltip: `${namespace}_option_2_tooltip`, + selected: [ + { + text: `${namespace}_option_2_selected`, + }, + ], + }, + async (scene: BattleScene) => { + // Damage party and burn 1 random member + // No rewards + leaveEncounterWithoutBattle(scene); + } + ) + .withOption( + new MysteryEncounterOptionBuilder() + .withOptionMode(EncounterOptionMode.DISABLED_OR_SPECIAL) + .withPrimaryPokemonRequirement(new TypeRequirement(Type.FIRE, 2)) // Will set option2PrimaryName and option2PrimaryMove dialogue tokens automatically + .withDialogue({ + buttonLabel: `${namespace}_option_3_label`, + buttonTooltip: `${namespace}_option_3_tooltip`, + selected: [ + { + text: `${namespace}_option_3_selected`, + }, + ], + }) + .withOptionPhase(async (scene: BattleScene) => { + // Fire types help calm the Volcarona + // const encounter = scene.currentBattle.mysteryEncounter; + const charcoal = generateModifierTypeOption(scene, modifierTypes.ATTACK_TYPE_BOOSTER, [Type.FIRE]); + setEncounterRewards(scene, { guaranteedModifierTypeOptions: [charcoal], fillRemaining: true }); + setEncounterExp(scene, scene.getParty().map(p => p.id), 500); + leaveEncounterWithoutBattle(scene); + }) + .build() + ) + .build(); diff --git a/src/data/mystery-encounters/encounters/safari-zone-encounter.ts b/src/data/mystery-encounters/encounters/safari-zone-encounter.ts index 2b7a013dd22..05cf76fae5f 100644 --- a/src/data/mystery-encounters/encounters/safari-zone-encounter.ts +++ b/src/data/mystery-encounters/encounters/safari-zone-encounter.ts @@ -304,14 +304,14 @@ async function throwBait(scene: BattleScene, pokemon: EnemyPokemon): Promise { scene.trainer.setTexture(`trainer_${scene.gameData.gender === PlayerGender.FEMALE ? "f" : "m"}_back_pb`); scene.time.delayedCall(512, () => { + scene.playSound("pb_throw"); + // Trainer throw frames scene.trainer.setFrame("2"); - scene.time.delayedCall(256, () => { + scene.time.delayedCall(184, () => { scene.trainer.setFrame("3"); scene.time.delayedCall(768, () => { scene.trainer.setTexture(`trainer_${scene.gameData.gender === PlayerGender.FEMALE ? "f" : "m"}_back`); @@ -366,18 +366,18 @@ async function throwMud(scene: BattleScene, pokemon: EnemyPokemon): Promise { scene.trainer.setTexture(`trainer_${scene.gameData.gender === PlayerGender.FEMALE ? "f" : "m"}_back_pb`); scene.time.delayedCall(512, () => { + scene.playSound("pb_throw"); + // Trainer throw frames scene.trainer.setFrame("2"); - scene.time.delayedCall(256, () => { + scene.time.delayedCall(184, () => { scene.trainer.setFrame("3"); scene.time.delayedCall(768, () => { scene.trainer.setTexture(`trainer_${scene.gameData.gender === PlayerGender.FEMALE ? "f" : "m"}_back`); @@ -395,32 +395,39 @@ async function throwMud(scene: BattleScene, pokemon: EnemyPokemon): Promise { + scene.time.delayedCall(200, () => { mud.setFrame("0003.png"); - scene.time.delayedCall(512, () => { + scene.time.delayedCall(400, () => { mud.setFrame("0004.png"); }); }); - scene.time.delayedCall(1536, () => { - mud.destroy(); - scene.tweens.add({ - targets: pokemon, - duration: 300, - ease: "Cubic.easeOut", - yoyo: true, - y: originalY - 20, - loop: 1, - onStart: () => { - scene.playSound("PRSFX- Taunt2"); - }, - onLoop: () => { - scene.playSound("PRSFX- Taunt2"); - }, - onComplete: () => { - resolve(true); - } - }); + // Fade mud then angry animation + scene.tweens.add({ + targets: mud, + alpha: 0, + ease: "Cubic.easeIn", + duration: 1000, + onComplete: () => { + mud.destroy(); + scene.tweens.add({ + targets: pokemon, + duration: 300, + ease: "Cubic.easeOut", + yoyo: true, + y: originalY - 20, + loop: 1, + onStart: () => { + scene.playSound("PRSFX- Taunt2"); + }, + onLoop: () => { + scene.playSound("PRSFX- Taunt2"); + }, + onComplete: () => { + resolve(true); + } + }); + } }); } }); diff --git a/src/data/mystery-encounters/mystery-encounter.ts b/src/data/mystery-encounters/mystery-encounter.ts index c0c8b1e5aaf..608783b7d87 100644 --- a/src/data/mystery-encounters/mystery-encounter.ts +++ b/src/data/mystery-encounters/mystery-encounter.ts @@ -1,5 +1,5 @@ import { EnemyPartyConfig } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import Pokemon, { PlayerPokemon } from "#app/field/pokemon"; +import Pokemon, { PlayerPokemon, PokemonMove } from "#app/field/pokemon"; import { isNullOrUndefined } from "#app/utils"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import BattleScene from "../../battle-scene"; @@ -18,6 +18,7 @@ import { StatusEffectRequirement, WaveRangeRequirement } from "./mystery-encounter-requirements"; +import { BattlerIndex } from "#app/battle"; export enum MysteryEncounterVariant { DEFAULT, @@ -36,6 +37,15 @@ export enum MysteryEncounterTier { MASTER // Not currently used } +export class StartOfBattleEffect { + sourcePokemon?: Pokemon; + sourceBattlerIndex?: BattlerIndex; + targets: BattlerIndex[]; + move: PokemonMove; + followUp?: boolean; + ignorePp?: boolean; +} + export default interface IMysteryEncounter { /** * Required params @@ -90,6 +100,15 @@ export default interface IMysteryEncounter { * You probably shouldn't do anything with this unless you have a very specific need */ introVisuals?: MysteryEncounterIntroVisuals; + /** + * Used for keeping RNG consistent on session resets, but increments when cycling through multiple "Encounters" on the same wave + * You should never need to modify this + */ + seedOffset?: any; + /** + * Will be set by option select handlers automatically, and can be used to refer to which option was chosen by later phases + */ + startOfBattleEffectsComplete?: boolean; /** * Flags @@ -116,16 +135,15 @@ export default interface IMysteryEncounter { * Will be set by option select handlers automatically, and can be used to refer to which option was chosen by later phases */ selectedOption?: MysteryEncounterOption; + /** + * Will be set by option select handlers automatically, and can be used to refer to which option was chosen by later phases + */ + startOfBattleEffects?: StartOfBattleEffect[]; /** * Can be set higher or lower based on the type of battle or exp gained for an option/encounter * Defaults to 1 */ expMultiplier?: number; - /** - * Used for keeping RNG consistent on session resets, but increments when cycling through multiple "Encounters" on the same wave - * You should never need to modify this - */ - seedOffset?: any; /** * Generic property to set any custom data required for the encounter * Extremely useful for carrying state/data between onPreOptionPhase/onOptionPhase/onPostOptionPhase @@ -151,8 +169,10 @@ export default class IMysteryEncounter implements IMysteryEncounter { this.requirements = this.requirements ? this.requirements : []; this.hideBattleIntroMessage = !isNullOrUndefined(this.hideBattleIntroMessage) ? this.hideBattleIntroMessage : false; this.hideIntroVisuals = !isNullOrUndefined(this.hideIntroVisuals) ? this.hideIntroVisuals : true; + this.startOfBattleEffects = this.startOfBattleEffects ?? []; // Reset any dirty flags or encounter data + this.startOfBattleEffectsComplete = false; this.lockEncounterRewardTiers = true; this.dialogueTokens = {}; this.enemyPartyConfigs = []; diff --git a/src/data/mystery-encounters/mystery-encounters.ts b/src/data/mystery-encounters/mystery-encounters.ts index a53f12a0bfa..c3016d8aaa2 100644 --- a/src/data/mystery-encounters/mystery-encounters.ts +++ b/src/data/mystery-encounters/mystery-encounters.ts @@ -11,6 +11,7 @@ import { DepartmentStoreSaleEncounter } from "./encounters/department-store-sale import { ShadyVitaminDealerEncounter } from "./encounters/shady-vitamin-dealer-encounter"; import { FieldTripEncounter } from "./encounters/field-trip-encounter"; import { SafariZoneEncounter } from "#app/data/mystery-encounters/encounters/safari-zone-encounter"; +import { FieryFalloutEncounter } from "#app/data/mystery-encounters/encounters/fiery-fallout-encounter"; // Spawn chance: (BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT + WIGHT_INCREMENT_ON_SPAWN_MISS * ) / 256 export const BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT = 1; @@ -184,7 +185,9 @@ export const mysteryEncountersByBiome = new Map([ [Biome.ICE_CAVE, []], [Biome.MEADOW, []], [Biome.POWER_PLANT, []], - [Biome.VOLCANO, []], + [Biome.VOLCANO, [ + MysteryEncounterType.FIERY_FALLOUT + ]], [Biome.GRAVEYARD, []], [Biome.DOJO, []], [Biome.FACTORY, []], @@ -215,6 +218,7 @@ export function initMysteryEncounters() { allMysteryEncounters[MysteryEncounterType.SHADY_VITAMIN_DEALER] = ShadyVitaminDealerEncounter; allMysteryEncounters[MysteryEncounterType.FIELD_TRIP] = FieldTripEncounter; allMysteryEncounters[MysteryEncounterType.SAFARI_ZONE] = SafariZoneEncounter; + allMysteryEncounters[MysteryEncounterType.FIERY_FALLOUT] = FieryFalloutEncounter; // Add extreme encounters to biome map extremeBiomeEncounters.forEach(encounter => { diff --git a/src/data/mystery-encounters/utils/encounter-phase-utils.ts b/src/data/mystery-encounters/utils/encounter-phase-utils.ts index c9c3e980456..c38caee472b 100644 --- a/src/data/mystery-encounters/utils/encounter-phase-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-phase-utils.ts @@ -1,5 +1,5 @@ import i18next from "i18next"; -import { BattleType } from "#app/battle"; +import { BattlerIndex, BattleType } from "#app/battle"; import BattleScene from "../../../battle-scene"; import PokemonSpecies from "../../pokemon-species"; import { MysteryEncounterVariant } from "../mystery-encounter"; @@ -9,7 +9,7 @@ import Pokemon, { FieldPosition, PlayerPokemon } from "#app/field/pokemon"; import Trainer, { TrainerVariant } from "../../../field/trainer"; import { ExpBalanceModifier, ExpShareModifier, MultipleParticipantExpBonusModifier, PokemonExpBoosterModifier } from "#app/modifier/modifier"; import { CustomModifierSettings, getModifierPoolForType, ModifierPoolType, ModifierType, ModifierTypeFunc, ModifierTypeGenerator, ModifierTypeOption, modifierTypes, PokemonHeldItemModifierType, regenerateModifierPoolThresholds } from "#app/modifier/modifier-type"; -import { BattleEndPhase, EggLapsePhase, ExpPhase, ModifierRewardPhase, SelectModifierPhase, ShowPartyExpBarPhase, TrainerVictoryPhase } from "#app/phases"; +import { BattleEndPhase, EggLapsePhase, ExpPhase, ModifierRewardPhase, MovePhase, SelectModifierPhase, ShowPartyExpBarPhase, TrainerVictoryPhase } from "#app/phases"; import { MysteryEncounterBattlePhase, MysteryEncounterPhase, MysteryEncounterRewardsPhase } from "#app/phases/mystery-encounter-phase"; import * as Utils from "../../../utils"; import { isNullOrUndefined } from "#app/utils"; @@ -25,6 +25,7 @@ import { WIGHT_INCREMENT_ON_SPAWN_MISS } from "#app/data/mystery-encounters/myst import * as Overrides from "#app/overrides"; import MysteryEncounterOption from "#app/data/mystery-encounters/mystery-encounter-option"; import { showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; +import { Gender } from "#app/data/gender"; export class EnemyPokemonConfig { species: PokemonSpecies; @@ -33,6 +34,7 @@ export class EnemyPokemonConfig { bossSegmentModifier?: number; // Additive to the determined segment number formIndex?: number; level?: number; + gender?: Gender; modifierTypes?: PokemonHeldItemModifierType[]; dataSource?: PokemonData; tags?: BattlerTagType[]; @@ -48,6 +50,7 @@ export class EnemyPartyConfig { trainerConfig?: TrainerConfig; // More customizable option for configuring trainer battle pokemonConfigs?: EnemyPokemonConfig[]; female?: boolean; // True for female trainer, false for male + disableSwitch?: boolean; // True will prevent player from switching } /** @@ -161,6 +164,11 @@ export async function initBattleWithEnemyConfig(scene: BattleScene, partyConfig: enemyPokemon.formIndex = config.formIndex; } + // Set gender + if (!isNullOrUndefined(config.gender)) { + enemyPokemon.gender = config.gender; + } + // Set Boss if (config.isBoss) { let segments = !isNullOrUndefined(config.bossSegments) ? config.bossSegments : scene.getEncounterBossSegments(scene.currentBattle.waveIndex, level, enemySpecies, true); @@ -201,7 +209,7 @@ export async function initBattleWithEnemyConfig(scene: BattleScene, partyConfig: console.log(enemyPokemon.name, enemyPokemon.species.speciesId, enemyPokemon.stats); }); - scene.pushPhase(new MysteryEncounterBattlePhase(scene)); + scene.pushPhase(new MysteryEncounterBattlePhase(scene, partyConfig.disableSwitch)); await Promise.all(loadEnemyAssets); battle.enemyParty.forEach((enemyPokemon_2, e_1) => { @@ -562,6 +570,36 @@ export function hideMysteryEncounterIntroVisuals(scene: BattleScene): Promise { + let source; + if (effect.sourcePokemon) { + source = effect.sourcePokemon; + } else if (!isNullOrUndefined(effect.sourceBattlerIndex)) { + if (effect.sourceBattlerIndex === BattlerIndex.ATTACKER) { + source = scene.getEnemyField()[0]; + } else if (effect.sourceBattlerIndex === BattlerIndex.ENEMY) { + source = scene.getEnemyField()[0]; + } else if (effect.sourceBattlerIndex === BattlerIndex.ENEMY_2) { + source = scene.getEnemyField()[1]; + } else if (effect.sourceBattlerIndex === BattlerIndex.PLAYER) { + source = scene.getPlayerField()[0]; + } else if (effect.sourceBattlerIndex === BattlerIndex.PLAYER_2) { + source = scene.getPlayerField()[1]; + } + } else { + source = scene.getEnemyField()[0]; + } + scene.pushPhase(new MovePhase(scene, source, effect.targets, effect.move, effect.followUp, effect.followUp)); + }); + + encounter.startOfBattleEffectsComplete = true; + } +} + /** * TODO: remove once encounter spawn rate is finalized * Just a helper function to calculate aggregate stats for MEs in a Classic run diff --git a/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts b/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts index fdbb957161f..15bf282d4df 100644 --- a/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts @@ -167,7 +167,6 @@ export function trainerThrowPokeball(scene: BattleScene, pokemon: EnemyPokemon, pokeball.setOrigin(0.5, 0.625); scene.field.add(pokeball); - scene.playSound("pb_throw"); scene.time.delayedCall(300, () => { scene.field.moveBelow(pokeball as Phaser.GameObjects.GameObject, pokemon); }); @@ -175,6 +174,8 @@ 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"); + // Trainer throw frames scene.trainer.setFrame("2"); scene.time.delayedCall(256, () => { diff --git a/src/enums/mystery-encounter-type.ts b/src/enums/mystery-encounter-type.ts index 2819b0eb6fb..de15b50f2b8 100644 --- a/src/enums/mystery-encounter-type.ts +++ b/src/enums/mystery-encounter-type.ts @@ -8,5 +8,6 @@ export enum MysteryEncounterType { DEPARTMENT_STORE_SALE, SHADY_VITAMIN_DEALER, FIELD_TRIP, - SAFARI_ZONE + SAFARI_ZONE, + FIERY_FALLOUT } diff --git a/src/locales/en/mystery-encounter.ts b/src/locales/en/mystery-encounter.ts index 67b2a6c8579..68d6877f53d 100644 --- a/src/locales/en/mystery-encounter.ts +++ b/src/locales/en/mystery-encounter.ts @@ -172,6 +172,26 @@ export const mysteryEncounter: SimpleTranslationEntries = { "safari_zone_pokemon_beside_itself_angry": "{{pokemonName}} is beside itself with anger!", "safari_zone_remaining_count": "{{remainingCount}} Pokémon remaining!", + "fiery_fallout_intro_message": "You encounter a blistering storm of smoke and ash!", + "fiery_fallout_title": "Fiery Fallout", + "fiery_fallout_description": "The whirling storm of ash and embers has cut visibility to nearly zero. It seems like there might be some... source that is causing these conditions. But what could be behind a phenomenon of this magnitude?", + "fiery_fallout_query": "What will you do?", + "fiery_fallout_option_1_label": "Find the source", + "fiery_fallout_option_1_tooltip": "(?) Discover the source\n(-) Hard Battle", + "fiery_fallout_option_2_label": "Hunker down", + "fiery_fallout_option_2_tooltip": "(-) Suffer the effects of the weather", + "fiery_fallout_option_3_label": "Your Fire types help", + "fiery_fallout_option_3_tooltip": "(+) End the conditions\n(+) Gain a Charcoal", + "fiery_fallout_option_3_disabled_tooltip": "You need at least 2 Fire Type Pokémon to choose this", + "fiery_fallout_option_1_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!`, + "fiery_fallout_option_2_selected": `The weather effects cause significant harm as you struggle to find shelter! + $Your party takes 30% Max HP damage! + $Your {burnTarget} also becomes burned!`, + // "fiery_fallout_boss_enraged": "The opposing {{enemyPokemon}} has become enraged!", + "fiery_fallout_option_3_selected": `Your {{primaryPokemonName}} and {{secondaryPokemonName}} guide you to where two Volcarona are in the middle of a mating dance! + $Thankfully, your Pokémon are able to calm them, and they depart without issue.`, + // Mystery Encounters -- Ultra Tier "training_session_intro_message": "You've come across some\ntraining tools and supplies.", diff --git a/src/overrides.ts b/src/overrides.ts index e19a5bf20dd..f7fa3c5fc86 100644 --- a/src/overrides.ts +++ b/src/overrides.ts @@ -117,9 +117,9 @@ export const EGG_GACHA_PULL_COUNT_OVERRIDE: number = 0; */ // 1 to 256, set to null to ignore -export const MYSTERY_ENCOUNTER_RATE_OVERRIDE: number = null; +export const MYSTERY_ENCOUNTER_RATE_OVERRIDE: number = 256; export const MYSTERY_ENCOUNTER_TIER_OVERRIDE: MysteryEncounterTier = null; -export const MYSTERY_ENCOUNTER_OVERRIDE: MysteryEncounterType = null; +export const MYSTERY_ENCOUNTER_OVERRIDE: MysteryEncounterType = MysteryEncounterType.FIERY_FALLOUT; /** * MODIFIER / ITEM OVERRIDES diff --git a/src/phases.ts b/src/phases.ts index f98c914e320..5bc1a72bdf4 100644 --- a/src/phases.ts +++ b/src/phases.ts @@ -1,15 +1,16 @@ import BattleScene, { bypassLogin } from "./battle-scene"; -import { default as Pokemon, PlayerPokemon, EnemyPokemon, PokemonMove, MoveResult, DamageResult, FieldPosition, HitResult, TurnMove } from "./field/pokemon"; +import { DamageResult, default as Pokemon, EnemyPokemon, FieldPosition, HitResult, MoveResult, PlayerPokemon, PokemonMove, TurnMove } from "./field/pokemon"; import * as Utils from "./utils"; -import { allMoves, applyMoveAttrs, BypassSleepAttr, ChargeAttr, applyFilteredMoveAttrs, HitsTagAttr, MissEffectAttr, MoveAttr, MoveEffectAttr, MoveFlags, MultiHitAttr, OverrideMoveEffectAttr, VariableAccuracyAttr, MoveTarget, getMoveTargets, MoveTargetSet, MoveEffectTrigger, CopyMoveAttr, AttackMove, SelfStatusMove, PreMoveMessageAttr, HealStatusEffectAttr, IgnoreOpponentStatChangesAttr, NoEffectAttr, BypassRedirectAttr, FixedDamageAttr, PostVictoryStatChangeAttr, OneHitKOAccuracyAttr, ForceSwitchOutAttr, VariableTargetAttr, IncrementMovePriorityAttr } from "./data/move"; +import { isNullOrUndefined } from "./utils"; +import { allMoves, applyFilteredMoveAttrs, applyMoveAttrs, AttackMove, BypassRedirectAttr, BypassSleepAttr, ChargeAttr, CopyMoveAttr, FixedDamageAttr, ForceSwitchOutAttr, getMoveTargets, HealStatusEffectAttr, HitsTagAttr, IgnoreOpponentStatChangesAttr, IncrementMovePriorityAttr, MissEffectAttr, MoveAttr, MoveEffectAttr, MoveEffectTrigger, MoveFlags, MoveTarget, MoveTargetSet, MultiHitAttr, NoEffectAttr, OneHitKOAccuracyAttr, OverrideMoveEffectAttr, PostVictoryStatChangeAttr, PreMoveMessageAttr, SelfStatusMove, VariableAccuracyAttr, VariableTargetAttr } from "./data/move"; import { Mode } from "./ui/ui"; import { Command } from "./ui/command-ui-handler"; import { Stat } from "./data/pokemon-stat"; -import { BerryModifier, ContactHeldItemTransferChanceModifier, EnemyAttackStatusEffectChanceModifier, EnemyPersistentModifier, EnemyStatusEffectHealChanceModifier, EnemyTurnHealModifier, ExpBalanceModifier, ExpBoosterModifier, ExpShareModifier, ExtraModifierModifier, FlinchChanceModifier, HealingBoosterModifier, HitHealModifier, LapsingPersistentModifier, MapModifier, Modifier, MultipleParticipantExpBonusModifier, PersistentModifier, PokemonExpBoosterModifier, PokemonHeldItemModifier, PokemonInstantReviveModifier, SwitchEffectTransferModifier, TempBattleStatBoosterModifier, TurnHealModifier, TurnHeldItemTransferModifier, MoneyMultiplierModifier, MoneyInterestModifier, IvScannerModifier, LapsingPokemonHeldItemModifier, PokemonMultiHitModifier, PokemonMoveAccuracyBoosterModifier, overrideModifiers, overrideHeldItems, BypassSpeedChanceModifier, TurnStatusEffectModifier } from "./modifier/modifier"; +import { BerryModifier, BypassSpeedChanceModifier, ContactHeldItemTransferChanceModifier, EnemyAttackStatusEffectChanceModifier, EnemyPersistentModifier, EnemyStatusEffectHealChanceModifier, EnemyTurnHealModifier, ExpBalanceModifier, ExpBoosterModifier, ExpShareModifier, ExtraModifierModifier, FlinchChanceModifier, HealingBoosterModifier, HitHealModifier, IvScannerModifier, LapsingPersistentModifier, LapsingPokemonHeldItemModifier, MapModifier, Modifier, MoneyInterestModifier, MoneyMultiplierModifier, MultipleParticipantExpBonusModifier, overrideHeldItems, overrideModifiers, PersistentModifier, PokemonExpBoosterModifier, PokemonHeldItemModifier, PokemonInstantReviveModifier, PokemonMoveAccuracyBoosterModifier, PokemonMultiHitModifier, SwitchEffectTransferModifier, TempBattleStatBoosterModifier, TurnHealModifier, TurnHeldItemTransferModifier, TurnStatusEffectModifier } from "./modifier/modifier"; import PartyUiHandler, { PartyOption, PartyUiMode } from "./ui/party-ui-handler"; import { doPokeballBounceAnim, getPokeballAtlasKey, getPokeballCatchMultiplier, getPokeballTintColor, PokeballType } from "./data/pokeball"; -import { CommonAnim, CommonBattleAnim, MoveAnim, initMoveAnim, loadMoveAnimAssets } from "./data/battle-anims"; -import { StatusEffect, getStatusEffectActivationText, getStatusEffectCatchRateMultiplier, getStatusEffectHealText, getStatusEffectObtainText, getStatusEffectOverlapText } from "./data/status-effect"; +import { CommonAnim, CommonBattleAnim, initMoveAnim, loadMoveAnimAssets, MoveAnim } from "./data/battle-anims"; +import { getStatusEffectActivationText, getStatusEffectCatchRateMultiplier, getStatusEffectHealText, getStatusEffectObtainText, getStatusEffectOverlapText, StatusEffect } from "./data/status-effect"; import { SummaryUiMode } from "./ui/summary-ui-handler"; import EvolutionSceneHandler from "./ui/evolution-scene-handler"; import { EvolutionPhase } from "./evolution-phase"; @@ -17,21 +18,21 @@ import { Phase } from "./phase"; import { BattleStat, getBattleStatLevelChangeDescription, getBattleStatName } from "./data/battle-stat"; import { biomeLinks, getBiomeName } from "./data/biomes"; import { ModifierTier } from "./modifier/modifier-tier"; -import { FusePokemonModifierType, ModifierPoolType, ModifierType, ModifierTypeFunc, ModifierTypeOption, PokemonModifierType, PokemonMoveModifierType, PokemonPpRestoreModifierType, PokemonPpUpModifierType, RememberMoveModifierType, TmModifierType, getDailyRunStarterModifiers, getEnemyBuffModifierForWave, getModifierType, getPlayerModifierTypeOptions, getPlayerShopModifierTypeOptionsForWave, modifierTypes, regenerateModifierPoolThresholds, CustomModifierSettings } from "./modifier/modifier-type"; +import { CustomModifierSettings, FusePokemonModifierType, getDailyRunStarterModifiers, getEnemyBuffModifierForWave, getModifierType, getPlayerModifierTypeOptions, getPlayerShopModifierTypeOptionsForWave, ModifierPoolType, ModifierType, ModifierTypeFunc, ModifierTypeOption, modifierTypes, PokemonModifierType, PokemonMoveModifierType, PokemonPpRestoreModifierType, PokemonPpUpModifierType, regenerateModifierPoolThresholds, RememberMoveModifierType, TmModifierType } from "./modifier/modifier-type"; import SoundFade from "phaser3-rex-plugins/plugins/soundfade"; -import { BattlerTagLapseType, CenterOfAttentionTag, EncoreTag, ProtectedTag, SemiInvulnerableTag, TrappedTag, MysteryEncounterPostSummonTag } from "./data/battler-tags"; +import { BattlerTagLapseType, CenterOfAttentionTag, EncoreTag, MysteryEncounterPostSummonTag, ProtectedTag, SemiInvulnerableTag, TrappedTag } from "./data/battler-tags"; import { getPokemonMessage, getPokemonNameWithAffix } from "./messages"; import { Starter } from "./ui/starter-select-ui-handler"; import { Gender } from "./data/gender"; -import { Weather, WeatherType, getRandomWeatherType, getTerrainBlockMessage, getWeatherDamageMessage, getWeatherLapseMessage } from "./data/weather"; +import { getRandomWeatherType, getTerrainBlockMessage, getWeatherDamageMessage, getWeatherLapseMessage, Weather, WeatherType } from "./data/weather"; import { TempBattleStat } from "./data/temp-battle-stat"; import { ArenaTagSide, ArenaTrapTag, MistTag, TrickRoomTag } from "./data/arena-tag"; import { CheckTrappedAbAttr, IgnoreOpponentStatChangesAbAttr, IgnoreOpponentEvasionAbAttr, PostAttackAbAttr, PostBattleAbAttr, PostDefendAbAttr, PostSummonAbAttr, PostTurnAbAttr, PostWeatherLapseAbAttr, PreSwitchOutAbAttr, PreWeatherDamageAbAttr, ProtectStatAbAttr, RedirectMoveAbAttr, BlockRedirectAbAttr, RunSuccessAbAttr, StatChangeMultiplierAbAttr, SuppressWeatherEffectAbAttr, SyncEncounterNatureAbAttr, applyAbAttrs, applyCheckTrappedAbAttrs, applyPostAttackAbAttrs, applyPostBattleAbAttrs, applyPostDefendAbAttrs, applyPostSummonAbAttrs, applyPostTurnAbAttrs, applyPostWeatherLapseAbAttrs, applyPreStatChangeAbAttrs, applyPreSwitchOutAbAttrs, applyPreWeatherEffectAbAttrs, BattleStatMultiplierAbAttr, applyBattleStatMultiplierAbAttrs, IncrementMovePriorityAbAttr, applyPostVictoryAbAttrs, PostVictoryAbAttr, BlockNonDirectDamageAbAttr as BlockNonDirectDamageAbAttr, applyPostKnockOutAbAttrs, PostKnockOutAbAttr, PostBiomeChangeAbAttr, applyPostFaintAbAttrs, PostFaintAbAttr, IncreasePpAbAttr, PostStatChangeAbAttr, applyPostStatChangeAbAttrs, AlwaysHitAbAttr, PreventBerryUseAbAttr, StatChangeCopyAbAttr, PokemonTypeChangeAbAttr, applyPreAttackAbAttrs, applyPostMoveUsedAbAttrs, PostMoveUsedAbAttr, MaxMultiHitAbAttr, HealFromBerryUseAbAttr, WonderSkinAbAttr, applyPreDefendAbAttrs, IgnoreMoveEffectsAbAttr, BlockStatusDamageAbAttr, BypassSpeedChanceAbAttr, AddSecondStrikeAbAttr } from "./data/ability"; import { Unlockables, getUnlockableName } from "./system/unlockables"; import { getBiomeKey } from "./field/arena"; -import { BattleType, BattlerIndex, TurnCommand } from "./battle"; -import { ChallengeAchv, HealAchv, LevelAchv, achvs } from "./system/achv"; -import { TrainerSlot, trainerConfigs } from "./data/trainer-config"; +import { BattlerIndex, BattleType, TurnCommand } from "./battle"; +import { achvs, ChallengeAchv, HealAchv, LevelAchv } from "./system/achv"; +import { trainerConfigs, TrainerSlot } from "./data/trainer-config"; import { EggHatchPhase } from "./egg-hatch-phase"; import { Egg } from "./data/egg"; import { vouchers } from "./system/voucher"; @@ -41,7 +42,7 @@ import { addPokeballCaptureStars, addPokeballOpenParticles } from "./field/anims import { SpeciesFormChangeActiveTrigger, SpeciesFormChangeManualTrigger, SpeciesFormChangeMoveLearnedTrigger, SpeciesFormChangePostMoveTrigger, SpeciesFormChangePreMoveTrigger } from "./data/pokemon-forms"; import { battleSpecDialogue, getCharVariantFromDialogue, miscDialogue } from "./data/dialogue"; import { SettingKeys } from "./system/settings/settings"; -import { Tutorial, handleTutorial } from "./tutorial"; +import { handleTutorial, Tutorial } from "./tutorial"; import { TerrainType } from "./data/terrain"; import { OptionSelectConfig, OptionSelectItem } from "./ui/abstact-option-select-ui-handler"; import { SaveSlotUiMode } from "./ui/save-slot-select-ui-handler"; @@ -50,7 +51,7 @@ import { GameMode, GameModes, getGameMode } from "./game-mode"; import PokemonSpecies, { getPokemonSpecies, speciesStarters } from "./data/pokemon-species"; import i18next from "./plugins/i18n"; import * as Overrides from "./overrides"; -import { TextStyle, addTextObject } from "./ui/text"; +import { addTextObject, TextStyle } from "./ui/text"; import { Type } from "./data/type"; import { BerryUsedEvent, EncounterPhaseEvent, MoveUsedEvent, TurnEndEvent, TurnInitEvent } from "./events/battle-scene"; import { Abilities } from "#enums/abilities"; @@ -66,9 +67,8 @@ import { Species } from "#enums/species"; import { TrainerType } from "#enums/trainer-type"; import { MysteryEncounterVariant } from "#app/data/mystery-encounters/mystery-encounter"; import { MysteryEncounterPhase } from "#app/phases/mystery-encounter-phase"; -import { handleMysteryEncounterVictory } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { handleEncounterStartOfBattleEffects, handleMysteryEncounterVictory } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import ModifierSelectUiHandler, { SHOP_OPTIONS_ROW_LIMIT } from "#app/ui/modifier-select-ui-handler"; -import { isNullOrUndefined } from "./utils"; import { getEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; const { t } = i18next; @@ -891,6 +891,11 @@ export class EncounterPhase extends BattlePhase { if (battle.battleType === BattleType.TRAINER) { loadEnemyAssets.push(battle.trainer.loadAssets().then(() => battle.trainer.initSprite())); } else if (battle.battleType === BattleType.MYSTERY_ENCOUNTER) { + // this.scene.getEnemyParty().forEach(p => { + // this.scene.field.remove(p); + // p.destroy(); + // }); + // this.scene.currentBattle.enemyParty = []; if (!battle.mysteryEncounter) { const newEncounter = this.scene.getMysteryEncounter(mysteryEncounter); battle.mysteryEncounter = newEncounter; @@ -2034,6 +2039,9 @@ export class TurnInitPhase extends FieldPhase { //this.scene.pushPhase(new MoveAnimTestPhase(this.scene)); this.scene.eventTarget.dispatchEvent(new TurnInitEvent()); + // Start of battle effects for Mystery Encounters + handleEncounterStartOfBattleEffects(this.scene); + this.scene.getField().forEach((pokemon, i) => { if (pokemon?.isActive()) { if (pokemon.isPlayer()) { diff --git a/src/phases/mystery-encounter-phase.ts b/src/phases/mystery-encounter-phase.ts index 13856471e4d..fda0e008484 100644 --- a/src/phases/mystery-encounter-phase.ts +++ b/src/phases/mystery-encounter-phase.ts @@ -173,8 +173,11 @@ export class MysteryEncounterOptionSelectedPhase extends Phase { * - Queue the SummonPhases, PostSummonPhases, etc., required to initialize the phase queue for a battle */ export class MysteryEncounterBattlePhase extends Phase { - constructor(scene: BattleScene) { + disableSwitch: boolean; + + constructor(scene: BattleScene, disableSwitch = false) { super(scene); + this.disableSwitch = disableSwitch; } start() { @@ -219,7 +222,7 @@ export class MysteryEncounterBattlePhase extends Phase { } if (!scene.currentBattle.mysteryEncounter.hideBattleIntroMessage) { - scene.ui.showText(this.getBattleMessage(scene), null, () => this.endBattleSetup(scene), 1500); + scene.ui.showText(this.getBattleMessage(scene), null, () => this.endBattleSetup(scene), 500); } else { this.endBattleSetup(scene); } @@ -302,7 +305,7 @@ export class MysteryEncounterBattlePhase extends Phase { scene.pushPhase(new ToggleDoublePositionPhase(scene, false)); } - if (encounterVariant !== MysteryEncounterVariant.TRAINER_BATTLE && (scene.currentBattle.waveIndex > 1 || !scene.gameMode.isDaily)) { + if (encounterVariant !== MysteryEncounterVariant.TRAINER_BATTLE && !this.disableSwitch) { const minPartySize = scene.currentBattle.double ? 2 : 1; if (availablePartyMembers.length > minPartySize) { scene.pushPhase(new CheckSwitchPhase(scene, 0, scene.currentBattle.double)); From a7eb972d9ea5d49796370f803d777a4193346cec Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Tue, 16 Jul 2024 10:46:07 -0700 Subject: [PATCH 126/270] ui.getHandler() add generic type with default https://www.typescriptlang.org/docs/handbook/2/generics.html#generic-parameter-defaults --- src/ui/mystery-encounter-ui-handler.ts | 2 +- src/ui/ui.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/ui/mystery-encounter-ui-handler.ts b/src/ui/mystery-encounter-ui-handler.ts index d1ce9fb5d04..e6699afbfe8 100644 --- a/src/ui/mystery-encounter-ui-handler.ts +++ b/src/ui/mystery-encounter-ui-handler.ts @@ -135,7 +135,7 @@ export default class MysteryEncounterUiHandler extends UiHandler { // TODO: If we need to handle cancel option? Maybe default logic to leave/run from encounter idk } } else { - switch (this.optionsContainer.length) { + switch (this.optionsContainer.list.length) { case 3: success = this.handleTwoOptionMoveInput(button); break; diff --git a/src/ui/ui.ts b/src/ui/ui.ts index fa7dc9fad9f..aac2779e111 100644 --- a/src/ui/ui.ts +++ b/src/ui/ui.ts @@ -234,8 +234,8 @@ export default class UI extends Phaser.GameObjects.Container { (this.scene as BattleScene).uiContainer.add(this.tooltipContainer); } - getHandler(): UiHandler { - return this.handlers[this.mode]; + getHandler(): H { + return this.handlers[this.mode] as H; } getMessageHandler(): BattleMessageUiHandler { From d967ac52b6278070fcf779719c3a834303dbfba0 Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Tue, 16 Jul 2024 10:46:19 -0700 Subject: [PATCH 127/270] add buoy sprite --- public/images/mystery-encounters/buoy.json | 19 +++++++++++++++++++ public/images/mystery-encounters/buoy.png | Bin 0 -> 1721 bytes 2 files changed, 19 insertions(+) create mode 100644 public/images/mystery-encounters/buoy.json create mode 100644 public/images/mystery-encounters/buoy.png diff --git a/public/images/mystery-encounters/buoy.json b/public/images/mystery-encounters/buoy.json new file mode 100644 index 00000000000..ba5d9567fe5 --- /dev/null +++ b/public/images/mystery-encounters/buoy.json @@ -0,0 +1,19 @@ +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 0, "w": 46, "h": 60 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 46, "h": 60 }, + "sourceSize": { "w": 46, "h": 60 } + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.7-x64", + "image": "buoy-sheet.png", + "format": "RGBA8888", + "size": { "w": 46, "h": 60 }, + "scale": "1" + } +} diff --git a/public/images/mystery-encounters/buoy.png b/public/images/mystery-encounters/buoy.png new file mode 100644 index 0000000000000000000000000000000000000000..dee7194365054238ce1e082ab53edaaaa5b192fc GIT binary patch literal 1721 zcmV;q21fabP)Px*SxH1eRA_HTyfr1&z9$aA$ zu6@xFp%8u2&QP|s4};Q&p>4%(VJ(=Kt?1TBkq&00q(zZ3RFqPk#;sTwoINDx^xT`9 z#?{B_%>M&m~$}b&z=q|4pebtpzl?v9j z9RR{izTk-Kqyef*1$|V4iTt4h;+GMUbh^(_V8o@jt#I?jQ^V(iA`aHxUE6lhU0!cE zS8&9wFtWOy5?Kn4cruC@KAU9%1r}A3UKLkMD_Glh5R32PU3vtN62}V?A!myKB3RaR86Ud(ag24v)ucOCATlIPDTG7U2bhb9qTvx;FvlRfs;|ZNFZfvS^03l}!fXoWh zBIla&^#p{w!%Jstqv5*z66T`WjGRRkJ(|b}qDPibD;iSfv>!Xp*^`F>D4m|p$S&xUr#_tc?1T&QRn5RBW3bn`E|+x*<}Jb^!V7!Jk51A+`cwo(6+uP!Aj$TSbR6@ z{c}bx3vlF*M~j9mdDLowH0KjlWhkeWsw?VbiFvs z{fJ6r1d z?6Vbu{(gFghtvTu_i$2O(~Xh_*vSI-Mf}e7LC5)XUCL{`>qYyq<4o>ssfyfOg_lfC89GxE?hdaqLPC05Ry&%<72ZmA zsQ;s3WOd!pPLKwaOidZ)SQ#Oasoe&s$|xK8jKnSesl&+Xy842Kk|P}Y>3hJ~bxE;n2xSY_2W=@P5&P;rt());g4)m82y`BT;p4S+04P9vQ|YlPr0SVz=LL z@3LyA<#!fIYjgwT;Gb9D46KdMlMdM`o^&;)4xMy5vbyIjb(HBTSm9N8IHMjz&K6 Date: Tue, 16 Jul 2024 10:46:39 -0700 Subject: [PATCH 128/270] chore: format can-learn-move-requirement.ts --- .../can-learn-move-requirement.ts | 45 +++++-------------- 1 file changed, 11 insertions(+), 34 deletions(-) diff --git a/src/data/mystery-encounters/requirements/can-learn-move-requirement.ts b/src/data/mystery-encounters/requirements/can-learn-move-requirement.ts index 3d13019dc1c..c9d54d54d49 100644 --- a/src/data/mystery-encounters/requirements/can-learn-move-requirement.ts +++ b/src/data/mystery-encounters/requirements/can-learn-move-requirement.ts @@ -1,7 +1,7 @@ -import BattleScene from "#app/battle-scene.js"; -import { Moves } from "#app/enums/moves.js"; -import { PlayerPokemon } from "#app/field/pokemon.js"; -import { isNullOrUndefined } from "#app/utils.js"; +import BattleScene from "#app/battle-scene"; +import { Moves } from "#app/enums/moves"; +import { PlayerPokemon } from "#app/field/pokemon"; +import { isNullOrUndefined } from "#app/utils"; import { EncounterPokemonRequirement } from "../mystery-encounter-requirements"; /** @@ -26,23 +26,11 @@ export class CanLearnMoveRequirement extends EncounterPokemonRequirement { private readonly excludeEggMoves?: boolean; private readonly includeFainted?: boolean; - constructor( - requiredMoves: Moves | Moves[], - options: CanlearnMoveRequirementOptions = {} - ) { + constructor(requiredMoves: Moves | Moves[], options: CanlearnMoveRequirementOptions = {}) { super(); - this.requiredMoves = Array.isArray(requiredMoves) - ? requiredMoves - : [requiredMoves]; + this.requiredMoves = Array.isArray(requiredMoves) ? requiredMoves : [requiredMoves]; - const { - excludeLevelMoves, - excludeTmMoves, - excludeEggMoves, - includeFainted, - minNumberOfPokemon, - invertQuery, - } = options; + const { excludeLevelMoves, excludeTmMoves, excludeEggMoves, includeFainted, minNumberOfPokemon, invertQuery } = options; this.excludeLevelMoves = excludeLevelMoves ?? false; this.excludeTmMoves = excludeTmMoves ?? false; @@ -53,11 +41,7 @@ export class CanLearnMoveRequirement extends EncounterPokemonRequirement { } override meetsRequirement(scene: BattleScene): boolean { - const partyPokemon = scene - .getParty() - .filter((pkm) => - this.includeFainted ? pkm.isAllowed() : pkm.isAllowedInBattle() - ); + const partyPokemon = scene.getParty().filter((pkm) => (this.includeFainted ? pkm.isAllowed() : pkm.isAllowedInBattle())); if (isNullOrUndefined(partyPokemon) || this?.requiredMoves?.length < 0) { return false; @@ -70,25 +54,18 @@ export class CanLearnMoveRequirement extends EncounterPokemonRequirement { if (!this.invertQuery) { return partyPokemon.filter((pokemon) => // every required move should be included - this.requiredMoves.every((requiredMove) => - this.getAllPokemonMoves(pokemon).includes(requiredMove) - ) + this.requiredMoves.every((requiredMove) => this.getAllPokemonMoves(pokemon).includes(requiredMove)) ); } else { return partyPokemon.filter( (pokemon) => // none of the "required" moves should be included - !this.requiredMoves.some((requiredMove) => - this.getAllPokemonMoves(pokemon).includes(requiredMove) - ) + !this.requiredMoves.some((requiredMove) => this.getAllPokemonMoves(pokemon).includes(requiredMove)) ); } } - override getDialogueToken( - _scene: BattleScene, - _pokemon?: PlayerPokemon - ): [string, string] { + override getDialogueToken(_scene: BattleScene, _pokemon?: PlayerPokemon): [string, string] { return ["requiredMoves", this.requiredMoves.join(", ")]; } From 75bf80cbad63a70af45df8b530dfc5a2d726c224 Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Tue, 16 Jul 2024 11:36:45 -0700 Subject: [PATCH 129/270] WIP: add lost-at-sea-encounter.test.ts added a couple of easy tests and 1 int/e2e for option3 --- .../encounters/lost-at-sea-encounter.test.ts | 184 ++++++++++++++++++ 1 file changed, 184 insertions(+) create mode 100644 src/test/mystery-encounter/encounters/lost-at-sea-encounter.test.ts 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 new file mode 100644 index 00000000000..6f4a8c3c9e6 --- /dev/null +++ b/src/test/mystery-encounter/encounters/lost-at-sea-encounter.test.ts @@ -0,0 +1,184 @@ +import { LostAtSeaEncounter } from "#app/data/mystery-encounters/encounters/lost-at-sea-encounter"; +import { EncounterOptionMode } from "#app/data/mystery-encounters/mystery-encounter-option"; +import { MysteryEncounterTier } from "#app/data/mystery-encounters/mystery-encounter.js"; +import { Button } from "#app/enums/buttons.js"; +import { Moves } from "#app/enums/moves"; +import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; +import { Species } from "#app/enums/species.js"; +import * as Overrides from "#app/overrides"; +import { MysteryEncounterPhase } from "#app/phases/mystery-encounter-phase.js"; +import GameManager from "#app/test/utils/gameManager.js"; +import MysteryEncounterUiHandler from "#app/ui/mystery-encounter-ui-handler.js"; +import { Mode } from "#app/ui/ui.js"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; + +const namepsace = "mysteryEncounter:lostAtSea"; + +describe("Lost at Sea - Mystery Encounter", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ type: Phaser.HEADLESS }); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + vi.spyOn(Overrides, "MYSTERY_ENCOUNTER_RATE_OVERRIDE", "get").mockReturnValue(100000); + vi.spyOn(Overrides, "MYSTERY_ENCOUNTER_OVERRIDE", "get").mockReturnValue(MysteryEncounterType.LOST_AT_SEA); + // vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(33); + // vi.spyOn(game.scene.currentBattle, "mysteryEncounter", "get").mockReturnValue(LostAtSeaEncounter); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + it("should have the correct properties", () => { + game.runToMysteryEncounter([Species.MAGIKARP, Species.GYARADOS]); + expect(LostAtSeaEncounter.encounterType).toBe(MysteryEncounterType.LOST_AT_SEA); + expect(LostAtSeaEncounter.dialogue).toBeDefined(); + expect(LostAtSeaEncounter.dialogue.intro).toStrictEqual([{ text: `${namepsace}:intro` }]); + expect(LostAtSeaEncounter.dialogue.encounterOptionsDialogue.title).toBe(`${namepsace}:title`); + expect(LostAtSeaEncounter.dialogue.encounterOptionsDialogue.description).toBe(`${namepsace}:description`); + expect(LostAtSeaEncounter.dialogue.encounterOptionsDialogue.query).toBe(`${namepsace}:query`); + expect(LostAtSeaEncounter.options.length).toBe(3); + }); + + it("should not run below wave 11", async () => { + vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(10); + + await game.runToMysteryEncounter(); + + const { currentBattle } = game.scene; + expect(currentBattle).toBeDefined(); + expect(currentBattle.mysteryEncounter).toBeUndefined(); + }); + + it("should not run above wave 179", async () => { + vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(180); + + await game.runToMysteryEncounter(); + + const { currentBattle } = game.scene; + expect(currentBattle).toBeDefined(); + expect(currentBattle.mysteryEncounter).toBeUndefined(); + }); + + it("should set the correct dialog tokens during initialization", () => { + const { onInit } = LostAtSeaEncounter; + + expect(LostAtSeaEncounter.onInit).toBeDefined(); + + const onInitResult = onInit(game.scene); + + expect(LostAtSeaEncounter.dialogueTokens?.damagePercentage).toBe("25"); + expect(LostAtSeaEncounter.dialogueTokens?.option1RequiredMove).toBe(Moves[Moves.SURF]); + expect(LostAtSeaEncounter.dialogueTokens?.option2RequiredMove).toBe(Moves[Moves.FLY]); + expect(onInitResult).toBe(true); + }); + + describe("Option 1 - Surf", () => { + it("should have the correct properties", () => { + const option1 = LostAtSeaEncounter.options[0]; + expect(option1.optionMode).toBe(EncounterOptionMode.DISABLED_OR_DEFAULT); + expect(option1.dialogue).toBeDefined(); + expect(option1.dialogue).toStrictEqual({ + buttonLabel: `${namepsace}:option:1:label`, + disabledButtonLabel: `${namepsace}:option:1:label_disabled`, + buttonTooltip: `${namepsace}:option:1:tooltip`, + disabledButtonTooltip: `${namepsace}:option:1:tooltip_disabled`, + selected: [ + { + text: `${namepsace}:option:1:selected`, + }, + ], + }); + }); + }); + + describe("Option 2 - Fly", () => { + it("should have the correct properties", () => { + const option2 = LostAtSeaEncounter.options[1]; + + expect(option2.optionMode).toBe(EncounterOptionMode.DISABLED_OR_DEFAULT); + expect(option2.dialogue).toBeDefined(); + expect(option2.dialogue).toStrictEqual({ + buttonLabel: `${namepsace}:option:2:label`, + disabledButtonLabel: `${namepsace}:option:2:label_disabled`, + buttonTooltip: `${namepsace}:option:2:tooltip`, + disabledButtonTooltip: `${namepsace}:option:2:tooltip_disabled`, + selected: [ + { + text: `${namepsace}:option:2:selected`, + }, + ], + }); + }); + }); + + describe("Option 3 - Wander aimlessy", () => { + it("should have the correct properties", () => { + const option3 = LostAtSeaEncounter.options[2]; + + expect(option3.optionMode).toBe(EncounterOptionMode.DEFAULT); + expect(option3.dialogue).toBeDefined(); + expect(option3.dialogue).toStrictEqual({ + buttonLabel: `${namepsace}:option:3:label`, + buttonTooltip: `${namepsace}:option:3:tooltip`, + selected: [ + { + text: `${namepsace}:option:3:selected`, + }, + ], + }); + }); + + it("should apply 25% damage to all Pokemon", async () => { + vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(33); + + await game.runToMysteryEncounter([Species.ABRA]); + + game.onNextPrompt("MysteryEncounterPhase", Mode.MESSAGE, () => { + const uiHandler = game.scene.ui.getHandler(); + uiHandler.processInput(Button.ACTION); + }); + game.onNextPrompt("MysteryEncounterPhase", Mode.MYSTERY_ENCOUNTER, () => { + const uiHandler = game.scene.ui.getHandler(); + uiHandler.unblockInput(); + uiHandler.processInput(Button.DOWN); + uiHandler.processInput(Button.ACTION); + }); + + await game.phaseInterceptor.run(MysteryEncounterPhase); + + const { encounteredEvents } = game.scene.mysteryEncounterData; + expect(encounteredEvents.some(([type, tier]) => type === MysteryEncounterType.LOST_AT_SEA && tier === MysteryEncounterTier.COMMON)).toBe(true); + }); + }); +}); + +/* +// Import necessary dependencies for testing +import { describe, it, expect } from "vitest"; +import { LostAtSeaEncounter } from "../lost-at-sea-encounter"; +import BattleScene from "../../../battle-scene"; + +describe("Lost At Sea Encounter Tests", () => { + it("should set the correct encounter properties", () => { + // Test the properties of the LostAtSeaEncounter object + // For example, test the encounter type, tier, scene wave range requirement, etc. + // You can use expect statements to check if the properties are set correctly + }); + + it("should handle the guiding pokemon phase correctly", () => { + // Create a mock BattleScene object for testing + const scene = new BattleScene(); // You may need to customize this based on your actual implementation + + // Call the handlePokemongGuidingYouPhase function with the scene + handlePokemongGuidingYouPhase(scene); + + // Use expect statements to verify the behavior of the function + // For example, check if the function sets the correct EXP value or handles cases where no guide pokemon is found + }); +});*/ From cb4162252cd5a5b33a7d58176e0717272ae19fae Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Tue, 16 Jul 2024 15:17:04 -0700 Subject: [PATCH 130/270] add overrides helper to gameManager --- src/test/utils/gameManager.ts | 3 +++ src/test/utils/overridesHelper.ts | 45 +++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+) create mode 100644 src/test/utils/overridesHelper.ts diff --git a/src/test/utils/gameManager.ts b/src/test/utils/gameManager.ts index 4550891dcf9..6c750c60a92 100644 --- a/src/test/utils/gameManager.ts +++ b/src/test/utils/gameManager.ts @@ -35,6 +35,7 @@ import { BattlerIndex } from "#app/battle.js"; import TargetSelectUiHandler from "#app/ui/target-select-ui-handler.js"; import BattleMessageUiHandler from "#app/ui/battle-message-ui-handler"; import {MysteryEncounterPhase} from "#app/phases/mystery-encounter-phase"; +import { OverridesHelper } from "./overridesHelper"; /** * Class to manage the game state and transitions between phases. @@ -45,6 +46,7 @@ export default class GameManager { public phaseInterceptor: PhaseInterceptor; public textInterceptor: TextInterceptor; public inputsHandler: InputsHandler; + public readonly override: OverridesHelper; /** * Creates an instance of GameManager. @@ -60,6 +62,7 @@ export default class GameManager { this.phaseInterceptor = new PhaseInterceptor(this.scene); this.textInterceptor = new TextInterceptor(this.scene); this.gameWrapper.setScene(this.scene); + this.override = new OverridesHelper(); } /** diff --git a/src/test/utils/overridesHelper.ts b/src/test/utils/overridesHelper.ts new file mode 100644 index 00000000000..5500533470e --- /dev/null +++ b/src/test/utils/overridesHelper.ts @@ -0,0 +1,45 @@ +import { Biome } from "#app/enums/biome"; +import * as Overrides from "#app/overrides"; +import { vi } from "vitest"; + +/** + * Helper to handle overrides in tests + */ +export class OverridesHelper { + constructor() {} + + /** + * Set the encounter chance for a mystery encounter. + * @param percentage the encounter chance in % + */ + mysteryEncounterChance(percentage: number) { + const maxRate: number = 256; // 100% + const rate = maxRate * (percentage / 100); + vi.spyOn(Overrides, "MYSTERY_ENCOUNTER_RATE_OVERRIDE", "get").mockReturnValue(rate); + this.log(`Mystery encounter chance set to ${percentage}% (=${rate})!`); + } + + /** + * Set the starting biome + * @warning The biome will not be overridden unless you call `workaround_reInitSceneWithOverrides()` (testUtils) + * @param biome the biome to set + */ + startingBiome(biome: Biome) { + vi.spyOn(Overrides, "STARTING_BIOME_OVERRIDE", "get").mockReturnValue(biome); + this.log(`Starting biome set to ${Biome[biome]} (=${biome})!`); + } + + /** + * Set the starting wave (index) + * + * @param wave the wave (index) to set. Classic: `1`-`200` + */ + startingWave(wave: number) { + vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(wave); + this.log(`Starting wave set to ${wave}!`); + } + + private log(...params: any[]) { + console.log("Overrides:", ...params); + } +} From af989fdaa6989c577511eb562c88fe7fb11c5ab6 Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Tue, 16 Jul 2024 15:17:26 -0700 Subject: [PATCH 131/270] add `testUtils.workaround_reInitSceneWithOverrides()` --- src/test/utils/testUtils.ts | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/test/utils/testUtils.ts b/src/test/utils/testUtils.ts index b922fc9c61c..a8461b3a5db 100644 --- a/src/test/utils/testUtils.ts +++ b/src/test/utils/testUtils.ts @@ -1,5 +1,6 @@ import i18next, { type ParseKeys } from "i18next"; import { vi } from "vitest"; +import GameManager from "./gameManager"; /** * Sets up the i18next mock. @@ -21,3 +22,15 @@ export function mockI18next() { export function arrayOfRange(start: integer, end: integer) { return Array.from({ length: end - start }, (_v, k) => k + start); } + +/** + * Woraround to reinitialize the game scene with overrides being set properly. + * By default the scene is initialized without all overrides even having a chance to be applied. + * @warning USE AT YOUR OWN RISK! Might be deleted in the future + * @param game The game manager + * @deprecated + */ +export async function workaround_reInitSceneWithOverrides(game: GameManager) { + await game.runToTitle(); + game.gameWrapper.setScene(game.scene); +} From 7a15a0f81ed955a59b83be7771c20fdbfcab02ea Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Tue, 16 Jul 2024 15:17:48 -0700 Subject: [PATCH 132/270] add lost-at-sea option 3 phase check full test --- .../encounters/lost-at-sea-encounter.test.ts | 53 ++++++++++++++----- 1 file changed, 41 insertions(+), 12 deletions(-) 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 6f4a8c3c9e6..ac0c8d6a430 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 @@ -1,13 +1,17 @@ +import Battle from "#app/battle.js"; import { LostAtSeaEncounter } from "#app/data/mystery-encounters/encounters/lost-at-sea-encounter"; import { EncounterOptionMode } from "#app/data/mystery-encounters/mystery-encounter-option"; import { MysteryEncounterTier } from "#app/data/mystery-encounters/mystery-encounter.js"; +import * as MysteryEncounters from "#app/data/mystery-encounters/mystery-encounters"; +import { Biome } from "#app/enums/biome.js"; import { Button } from "#app/enums/buttons.js"; import { Moves } from "#app/enums/moves"; import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species.js"; -import * as Overrides from "#app/overrides"; -import { MysteryEncounterPhase } from "#app/phases/mystery-encounter-phase.js"; +import { MessagePhase } from "#app/phases.js"; +import { MysteryEncounterOptionSelectedPhase, MysteryEncounterPhase } from "#app/phases/mystery-encounter-phase.js"; import GameManager from "#app/test/utils/gameManager.js"; +import { workaround_reInitSceneWithOverrides } from "#app/test/utils/testUtils.js"; import MysteryEncounterUiHandler from "#app/ui/mystery-encounter-ui-handler.js"; import { Mode } from "#app/ui/ui.js"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; @@ -24,18 +28,18 @@ describe("Lost at Sea - Mystery Encounter", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(Overrides, "MYSTERY_ENCOUNTER_RATE_OVERRIDE", "get").mockReturnValue(100000); - vi.spyOn(Overrides, "MYSTERY_ENCOUNTER_OVERRIDE", "get").mockReturnValue(MysteryEncounterType.LOST_AT_SEA); - // vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(33); - // vi.spyOn(game.scene.currentBattle, "mysteryEncounter", "get").mockReturnValue(LostAtSeaEncounter); + game.override.mysteryEncounterChance(100); + game.override.startingBiome(Biome.SEA); + vi.spyOn(MysteryEncounters, "allMysteryEncounters", "get").mockReturnValue({ [MysteryEncounterType.LOST_AT_SEA]: LostAtSeaEncounter }); }); afterEach(() => { game.phaseInterceptor.restoreOg(); }); - it("should have the correct properties", () => { - game.runToMysteryEncounter([Species.MAGIKARP, Species.GYARADOS]); + it("should have the correct properties", async () => { + await game.runToMysteryEncounter([Species.ABRA]); + expect(LostAtSeaEncounter.encounterType).toBe(MysteryEncounterType.LOST_AT_SEA); expect(LostAtSeaEncounter.dialogue).toBeDefined(); expect(LostAtSeaEncounter.dialogue.intro).toStrictEqual([{ text: `${namepsace}:intro` }]); @@ -46,7 +50,7 @@ describe("Lost at Sea - Mystery Encounter", () => { }); it("should not run below wave 11", async () => { - vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(10); + game.override.startingWave(10); await game.runToMysteryEncounter(); @@ -56,7 +60,7 @@ describe("Lost at Sea - Mystery Encounter", () => { }); it("should not run above wave 179", async () => { - vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(180); + game.override.startingWave(180); await game.runToMysteryEncounter(); @@ -66,6 +70,8 @@ describe("Lost at Sea - Mystery Encounter", () => { }); it("should set the correct dialog tokens during initialization", () => { + vi.spyOn(game.scene, "currentBattle", "get").mockReturnValue({ mysteryEncounter: LostAtSeaEncounter } as Battle); + const { onInit } = LostAtSeaEncounter; expect(LostAtSeaEncounter.onInit).toBeDefined(); @@ -135,12 +141,13 @@ describe("Lost at Sea - Mystery Encounter", () => { }); it("should apply 25% damage to all Pokemon", async () => { - vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(33); + game.override.startingWave(33); + workaround_reInitSceneWithOverrides(game); await game.runToMysteryEncounter([Species.ABRA]); game.onNextPrompt("MysteryEncounterPhase", Mode.MESSAGE, () => { - const uiHandler = game.scene.ui.getHandler(); + const uiHandler = game.scene.ui.getHandler(); uiHandler.processInput(Button.ACTION); }); game.onNextPrompt("MysteryEncounterPhase", Mode.MYSTERY_ENCOUNTER, () => { @@ -150,10 +157,32 @@ describe("Lost at Sea - Mystery Encounter", () => { uiHandler.processInput(Button.ACTION); }); + /** There is some inconsistency in the phase order here. Probably because of the workaround */ + if (game.isCurrentPhase(MessagePhase)) { + game.onNextPrompt("MessagePhase", Mode.MESSAGE, () => { + const uiHandler = game.scene.ui.getHandler(); + uiHandler.processInput(Button.ACTION); + }); + await game.phaseInterceptor.run(MessagePhase); + } + await game.phaseInterceptor.run(MysteryEncounterPhase); const { encounteredEvents } = game.scene.mysteryEncounterData; expect(encounteredEvents.some(([type, tier]) => type === MysteryEncounterType.LOST_AT_SEA && tier === MysteryEncounterTier.COMMON)).toBe(true); + + game.onNextPrompt("MysteryEncounterOptionSelectedPhase", Mode.MESSAGE, () => { + const uiHandler = game.scene.ui.getHandler(); + uiHandler.processInput(Button.ACTION); + }); + await game.phaseInterceptor.run(MysteryEncounterOptionSelectedPhase); + + const party = game.scene.getParty(); + party.forEach((pkm) => { + const maxHp = pkm.getMaxHp(); + const msg = `${pkm.name} should have receivd 25% damage: ${pkm.hp} / ${maxHp} HP`; + expect(pkm.hp, msg).toBe(maxHp - Math.floor(maxHp * 0.25)); + }); }); }); }); From 944197330c6ac14a20c803006cc73555fbd1fbc6 Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Tue, 16 Jul 2024 15:31:42 -0700 Subject: [PATCH 133/270] fix can-learn-move-requirement getAllPokemonMoves --- .../requirements/can-learn-move-requirement.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/data/mystery-encounters/requirements/can-learn-move-requirement.ts b/src/data/mystery-encounters/requirements/can-learn-move-requirement.ts index c9d54d54d49..a194933a404 100644 --- a/src/data/mystery-encounters/requirements/can-learn-move-requirement.ts +++ b/src/data/mystery-encounters/requirements/can-learn-move-requirement.ts @@ -77,15 +77,15 @@ export class CanLearnMoveRequirement extends EncounterPokemonRequirement { const allPokemonMoves: Moves[] = []; if (!this.excludeLevelMoves) { - allPokemonMoves.push(...this.getPokemonLevelMoves(pkm)); + allPokemonMoves.push(...(this.getPokemonLevelMoves(pkm) ?? [])); } if (!this.excludeTmMoves) { - allPokemonMoves.push(...pkm.compatibleTms); + allPokemonMoves.push(...(pkm.compatibleTms ?? [])); } if (!this.excludeEggMoves) { - allPokemonMoves.push(...pkm.getEggMoves()); + allPokemonMoves.push(...(pkm.getEggMoves() ?? [])); } return allPokemonMoves; From 391054c8e0fcb740a9fdbae66a7fbc05c9f10ae8 Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Tue, 16 Jul 2024 16:41:30 -0700 Subject: [PATCH 134/270] extend overridesHelper --- src/test/utils/overridesHelper.ts | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/src/test/utils/overridesHelper.ts b/src/test/utils/overridesHelper.ts index 5500533470e..7bd14b213b5 100644 --- a/src/test/utils/overridesHelper.ts +++ b/src/test/utils/overridesHelper.ts @@ -1,3 +1,4 @@ +import { Weather, WeatherType } from "#app/data/weather.js"; import { Biome } from "#app/enums/biome"; import * as Overrides from "#app/overrides"; import { vi } from "vitest"; @@ -9,7 +10,7 @@ export class OverridesHelper { constructor() {} /** - * Set the encounter chance for a mystery encounter. + * Override the encounter chance for a mystery encounter. * @param percentage the encounter chance in % */ mysteryEncounterChance(percentage: number) { @@ -20,7 +21,7 @@ export class OverridesHelper { } /** - * Set the starting biome + * Override the starting biome * @warning The biome will not be overridden unless you call `workaround_reInitSceneWithOverrides()` (testUtils) * @param biome the biome to set */ @@ -30,8 +31,7 @@ export class OverridesHelper { } /** - * Set the starting wave (index) - * + * Override the starting wave (index) * @param wave the wave (index) to set. Classic: `1`-`200` */ startingWave(wave: number) { @@ -39,6 +39,25 @@ export class OverridesHelper { this.log(`Starting wave set to ${wave}!`); } + /** + * Override the weather (type) + * @param type weather type to set + */ + weather(type: WeatherType) { + vi.spyOn(Overrides, "WEATHER_OVERRIDE", "get").mockReturnValue(type); + this.log(`Weather set to ${Weather[type]} (=${type})!`); + } + + /** + * Override the seed + * @warning The seed will not be overridden unless you call `workaround_reInitSceneWithOverrides()` (testUtils) + * @param seed the seed to set + */ + seed(seed: string) { + vi.spyOn(Overrides, "SEED_OVERRIDE", "get").mockReturnValue(seed); + this.log(`Seed set to "${seed}"!`); + } + private log(...params: any[]) { console.log("Overrides:", ...params); } From 94e43e633c93434c060feec3ba52bbc5a0b6917a Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Tue, 16 Jul 2024 16:41:47 -0700 Subject: [PATCH 135/270] add encounterTestUtils.ts --- .../mystery-encounter/encounterTestUtils.ts | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 src/test/mystery-encounter/encounterTestUtils.ts diff --git a/src/test/mystery-encounter/encounterTestUtils.ts b/src/test/mystery-encounter/encounterTestUtils.ts new file mode 100644 index 00000000000..1fb0d0bbc17 --- /dev/null +++ b/src/test/mystery-encounter/encounterTestUtils.ts @@ -0,0 +1,54 @@ +import { Button } from "#app/enums/buttons.js"; +import { MessagePhase } from "#app/phases.js"; +import { MysteryEncounterOptionSelectedPhase, MysteryEncounterPhase } from "#app/phases/mystery-encounter-phase.js"; +import MysteryEncounterUiHandler from "#app/ui/mystery-encounter-ui-handler.js"; +import { Mode } from "#app/ui/ui.js"; +import GameManager from "../utils/gameManager"; + +export async function runSelectMysteryEncounterOption(game: GameManager, optionNo: number) { + // Handle eventual weather messages (e.g. a downpour started!) + if (game.isCurrentPhase(MessagePhase)) { + game.onNextPrompt("MessagePhase", Mode.MESSAGE, () => { + const uiHandler = game.scene.ui.getHandler(); + uiHandler.processInput(Button.ACTION); + }); + await game.phaseInterceptor.run(MessagePhase); + } + + // dispose of intro messages + game.onNextPrompt("MysteryEncounterPhase", Mode.MESSAGE, () => { + const uiHandler = game.scene.ui.getHandler(); + uiHandler.processInput(Button.ACTION); + }); + // select the desired option + game.onNextPrompt("MysteryEncounterPhase", Mode.MYSTERY_ENCOUNTER, () => { + const uiHandler = game.scene.ui.getHandler(); + uiHandler.unblockInput(); + + switch (optionNo) { + case 1: + // no movement needed. Default cursor position + break; + case 2: + uiHandler.processInput(Button.RIGHT); + break; + case 3: + uiHandler.processInput(Button.DOWN); + break; + case 4: + uiHandler.processInput(Button.RIGHT); + uiHandler.processInput(Button.DOWN); + break; + } + + uiHandler.processInput(Button.ACTION); + }); + await game.phaseInterceptor.run(MysteryEncounterPhase); + + // run the selected options phase + game.onNextPrompt("MysteryEncounterOptionSelectedPhase", Mode.MESSAGE, () => { + const uiHandler = game.scene.ui.getHandler(); + uiHandler.processInput(Button.ACTION); + }); + await game.phaseInterceptor.run(MysteryEncounterOptionSelectedPhase); +} From fa02f84448be46a5fa56fa8610212daab9af2565 Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Tue, 16 Jul 2024 16:41:53 -0700 Subject: [PATCH 136/270] use encounterTestUtils.ts --- .../encounters/lost-at-sea-encounter.test.ts | 90 +++++-------------- 1 file changed, 20 insertions(+), 70 deletions(-) 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 ac0c8d6a430..8d08abd66c6 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 @@ -1,20 +1,18 @@ -import Battle from "#app/battle.js"; +import Battle from "#app/battle"; import { LostAtSeaEncounter } from "#app/data/mystery-encounters/encounters/lost-at-sea-encounter"; +import { MysteryEncounterTier } from "#app/data/mystery-encounters/mystery-encounter"; import { EncounterOptionMode } from "#app/data/mystery-encounters/mystery-encounter-option"; -import { MysteryEncounterTier } from "#app/data/mystery-encounters/mystery-encounter.js"; import * as MysteryEncounters from "#app/data/mystery-encounters/mystery-encounters"; -import { Biome } from "#app/enums/biome.js"; -import { Button } from "#app/enums/buttons.js"; +import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { WeatherType } from "#app/data/weather"; +import { Biome } from "#app/enums/biome"; import { Moves } from "#app/enums/moves"; import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; -import { Species } from "#app/enums/species.js"; -import { MessagePhase } from "#app/phases.js"; -import { MysteryEncounterOptionSelectedPhase, MysteryEncounterPhase } from "#app/phases/mystery-encounter-phase.js"; -import GameManager from "#app/test/utils/gameManager.js"; -import { workaround_reInitSceneWithOverrides } from "#app/test/utils/testUtils.js"; -import MysteryEncounterUiHandler from "#app/ui/mystery-encounter-ui-handler.js"; -import { Mode } from "#app/ui/ui.js"; +import { Species } from "#app/enums/species"; +import GameManager from "#app/test/utils/gameManager"; +import { workaround_reInitSceneWithOverrides } from "#app/test/utils/testUtils"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import { runSelectMysteryEncounterOption } from "../encounterTestUtils"; const namepsace = "mysteryEncounter:lostAtSea"; @@ -140,74 +138,26 @@ describe("Lost at Sea - Mystery Encounter", () => { }); }); - it("should apply 25% damage to all Pokemon", async () => { + it("should handle the option phase properly", async () => { game.override.startingWave(33); + game.override.weather(WeatherType.RAIN); + const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); workaround_reInitSceneWithOverrides(game); - await game.runToMysteryEncounter([Species.ABRA]); - - game.onNextPrompt("MysteryEncounterPhase", Mode.MESSAGE, () => { - const uiHandler = game.scene.ui.getHandler(); - uiHandler.processInput(Button.ACTION); - }); - game.onNextPrompt("MysteryEncounterPhase", Mode.MYSTERY_ENCOUNTER, () => { - const uiHandler = game.scene.ui.getHandler(); - uiHandler.unblockInput(); - uiHandler.processInput(Button.DOWN); - uiHandler.processInput(Button.ACTION); - }); - - /** There is some inconsistency in the phase order here. Probably because of the workaround */ - if (game.isCurrentPhase(MessagePhase)) { - game.onNextPrompt("MessagePhase", Mode.MESSAGE, () => { - const uiHandler = game.scene.ui.getHandler(); - uiHandler.processInput(Button.ACTION); - }); - await game.phaseInterceptor.run(MessagePhase); - } - - await game.phaseInterceptor.run(MysteryEncounterPhase); + await game.runToMysteryEncounter([Species.ABRA, Species.ZEBSTRIKA, Species.BULBASAUR, Species.GROUDON]); + await runSelectMysteryEncounterOption(game, 3); const { encounteredEvents } = game.scene.mysteryEncounterData; - expect(encounteredEvents.some(([type, tier]) => type === MysteryEncounterType.LOST_AT_SEA && tier === MysteryEncounterTier.COMMON)).toBe(true); - - game.onNextPrompt("MysteryEncounterOptionSelectedPhase", Mode.MESSAGE, () => { - const uiHandler = game.scene.ui.getHandler(); - uiHandler.processInput(Button.ACTION); - }); - await game.phaseInterceptor.run(MysteryEncounterOptionSelectedPhase); - const party = game.scene.getParty(); + + expect(encounteredEvents.some(([type, tier]) => type === MysteryEncounterType.LOST_AT_SEA && tier === MysteryEncounterTier.COMMON)).toBe(true); party.forEach((pkm) => { const maxHp = pkm.getMaxHp(); - const msg = `${pkm.name} should have receivd 25% damage: ${pkm.hp} / ${maxHp} HP`; - expect(pkm.hp, msg).toBe(maxHp - Math.floor(maxHp * 0.25)); + const expectMsg = `${pkm.name} should have receivd 25% damage: ${pkm.hp} / ${maxHp} HP`; + + expect(pkm.hp, expectMsg).toBe(maxHp - Math.floor(maxHp * 0.25)); }); + expect(leaveEncounterWithoutBattleSpy).toBeCalled(); }); }); }); - -/* -// Import necessary dependencies for testing -import { describe, it, expect } from "vitest"; -import { LostAtSeaEncounter } from "../lost-at-sea-encounter"; -import BattleScene from "../../../battle-scene"; - -describe("Lost At Sea Encounter Tests", () => { - it("should set the correct encounter properties", () => { - // Test the properties of the LostAtSeaEncounter object - // For example, test the encounter type, tier, scene wave range requirement, etc. - // You can use expect statements to check if the properties are set correctly - }); - - it("should handle the guiding pokemon phase correctly", () => { - // Create a mock BattleScene object for testing - const scene = new BattleScene(); // You may need to customize this based on your actual implementation - - // Call the handlePokemongGuidingYouPhase function with the scene - handlePokemongGuidingYouPhase(scene); - - // Use expect statements to verify the behavior of the function - // For example, check if the function sets the correct EXP value or handles cases where no guide pokemon is found - }); -});*/ From 233f6072d679a49d4c3af8ae180fd4555b72f1a9 Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Tue, 16 Jul 2024 16:42:53 -0700 Subject: [PATCH 137/270] chore: remove .js from imports --- src/test/mystery-encounter/encounterTestUtils.ts | 10 +++++----- src/test/utils/overridesHelper.ts | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/test/mystery-encounter/encounterTestUtils.ts b/src/test/mystery-encounter/encounterTestUtils.ts index 1fb0d0bbc17..246c763690a 100644 --- a/src/test/mystery-encounter/encounterTestUtils.ts +++ b/src/test/mystery-encounter/encounterTestUtils.ts @@ -1,8 +1,8 @@ -import { Button } from "#app/enums/buttons.js"; -import { MessagePhase } from "#app/phases.js"; -import { MysteryEncounterOptionSelectedPhase, MysteryEncounterPhase } from "#app/phases/mystery-encounter-phase.js"; -import MysteryEncounterUiHandler from "#app/ui/mystery-encounter-ui-handler.js"; -import { Mode } from "#app/ui/ui.js"; +import { Button } from "#app/enums/buttons"; +import { MessagePhase } from "#app/phases"; +import { MysteryEncounterOptionSelectedPhase, MysteryEncounterPhase } from "#app/phases/mystery-encounter-phase"; +import MysteryEncounterUiHandler from "#app/ui/mystery-encounter-ui-handler"; +import { Mode } from "#app/ui/ui"; import GameManager from "../utils/gameManager"; export async function runSelectMysteryEncounterOption(game: GameManager, optionNo: number) { diff --git a/src/test/utils/overridesHelper.ts b/src/test/utils/overridesHelper.ts index 7bd14b213b5..dd45d972b50 100644 --- a/src/test/utils/overridesHelper.ts +++ b/src/test/utils/overridesHelper.ts @@ -1,4 +1,4 @@ -import { Weather, WeatherType } from "#app/data/weather.js"; +import { Weather, WeatherType } from "#app/data/weather"; import { Biome } from "#app/enums/biome"; import * as Overrides from "#app/overrides"; import { vi } from "vitest"; From 5cded35e364d4b08751c4bd07fb71d3efe34bb66 Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Tue, 16 Jul 2024 17:04:29 -0700 Subject: [PATCH 138/270] minor changes to encounterTestUtils.ts --- src/test/mystery-encounter/encounterTestUtils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/mystery-encounter/encounterTestUtils.ts b/src/test/mystery-encounter/encounterTestUtils.ts index 246c763690a..10fa9e7c648 100644 --- a/src/test/mystery-encounter/encounterTestUtils.ts +++ b/src/test/mystery-encounter/encounterTestUtils.ts @@ -23,7 +23,7 @@ export async function runSelectMysteryEncounterOption(game: GameManager, optionN // select the desired option game.onNextPrompt("MysteryEncounterPhase", Mode.MYSTERY_ENCOUNTER, () => { const uiHandler = game.scene.ui.getHandler(); - uiHandler.unblockInput(); + uiHandler.unblockInput(); // input are blocked by 1s to prevent accidental input. Tests need to handle that switch (optionNo) { case 1: From b26cffc49e8a87522fec379932aa613f075691fe Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Tue, 16 Jul 2024 19:45:24 -0700 Subject: [PATCH 139/270] WIP: working on lost-at-sea-encounter tests --- .../mystery-encounter/encounterTestUtils.ts | 6 ++- .../encounters/lost-at-sea-encounter.test.ts | 53 +++++++++++++------ 2 files changed, 42 insertions(+), 17 deletions(-) diff --git a/src/test/mystery-encounter/encounterTestUtils.ts b/src/test/mystery-encounter/encounterTestUtils.ts index 10fa9e7c648..cfd42f5afad 100644 --- a/src/test/mystery-encounter/encounterTestUtils.ts +++ b/src/test/mystery-encounter/encounterTestUtils.ts @@ -1,13 +1,13 @@ import { Button } from "#app/enums/buttons"; import { MessagePhase } from "#app/phases"; -import { MysteryEncounterOptionSelectedPhase, MysteryEncounterPhase } from "#app/phases/mystery-encounter-phase"; +import { MysteryEncounterOptionSelectedPhase, MysteryEncounterPhase, MysteryEncounterRewardsPhase } from "#app/phases/mystery-encounter-phase"; import MysteryEncounterUiHandler from "#app/ui/mystery-encounter-ui-handler"; import { Mode } from "#app/ui/ui"; import GameManager from "../utils/gameManager"; export async function runSelectMysteryEncounterOption(game: GameManager, optionNo: number) { - // Handle eventual weather messages (e.g. a downpour started!) if (game.isCurrentPhase(MessagePhase)) { + // Handle eventual weather messages (e.g. a downpour started!) game.onNextPrompt("MessagePhase", Mode.MESSAGE, () => { const uiHandler = game.scene.ui.getHandler(); uiHandler.processInput(Button.ACTION); @@ -51,4 +51,6 @@ export async function runSelectMysteryEncounterOption(game: GameManager, optionN uiHandler.processInput(Button.ACTION); }); await game.phaseInterceptor.run(MysteryEncounterOptionSelectedPhase); + + await game.phaseInterceptor.to(MysteryEncounterRewardsPhase); } 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 8d08abd66c6..30a85ff6d44 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 @@ -1,10 +1,8 @@ import Battle from "#app/battle"; import { LostAtSeaEncounter } from "#app/data/mystery-encounters/encounters/lost-at-sea-encounter"; -import { MysteryEncounterTier } from "#app/data/mystery-encounters/mystery-encounter"; import { EncounterOptionMode } from "#app/data/mystery-encounters/mystery-encounter-option"; import * as MysteryEncounters from "#app/data/mystery-encounters/mystery-encounters"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import { WeatherType } from "#app/data/weather"; import { Biome } from "#app/enums/biome"; import { Moves } from "#app/enums/moves"; import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; @@ -15,6 +13,8 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vite import { runSelectMysteryEncounterOption } from "../encounterTestUtils"; const namepsace = "mysteryEncounter:lostAtSea"; +/** Blastoise for surf. Pidgeot for fly. Abra for none. */ +const defaultParty = [Species.BLASTOISE, Species.PIDGEOT, Species.ABRA]; describe("Lost at Sea - Mystery Encounter", () => { let phaserGame: Phaser.Game; @@ -119,6 +119,24 @@ describe("Lost at Sea - Mystery Encounter", () => { ], }); }); + + it("should award exp to surfable pokemone (Blastoise)", async () => { + game.override.startingWave(33); + const setEncounterExpSpy = vi.spyOn(EncounterPhaseUtils, "setEncounterExp"); + + workaround_reInitSceneWithOverrides(game); + await game.runToMysteryEncounter(defaultParty); + let blastoise = game.scene.getParty().find((pkm) => pkm.species.speciesId === Species.BLASTOISE); + console.log("BLASTOISE EXP BEFORE: ", blastoise.exp); + + await runSelectMysteryEncounterOption(game, 2); + + blastoise = game.scene.getParty().find((pkm) => pkm.species.speciesId === Species.BLASTOISE); + console.log("BLASTOISE EXP AFTER: ", blastoise.exp); + + expect(blastoise.exp).toBe(128); + expect(setEncounterExpSpy).toHaveBeenCalledWith(expect.anything(), 128, expect.anything(), true); + }); }); describe("Option 3 - Wander aimlessy", () => { @@ -138,25 +156,30 @@ describe("Lost at Sea - Mystery Encounter", () => { }); }); - it("should handle the option phase properly", async () => { + it("should damage all party pokemon by 25%", async () => { + game.override.startingWave(33); + + workaround_reInitSceneWithOverrides(game); + await game.runToMysteryEncounter(defaultParty); + await runSelectMysteryEncounterOption(game, 3); + + game.scene + .getParty() + .forEach((pkm) => + expect(pkm.hp, `${pkm.name} should have receivd 25% damage: ${pkm.hp} / ${pkm.getMaxHp()} HP`).toBe( + pkm.getMaxHp() - Math.floor(pkm.getMaxHp() * 0.25) + ) + ); + }); + + it("should leave encounter without battle", async () => { game.override.startingWave(33); - game.override.weather(WeatherType.RAIN); const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); workaround_reInitSceneWithOverrides(game); - await game.runToMysteryEncounter([Species.ABRA, Species.ZEBSTRIKA, Species.BULBASAUR, Species.GROUDON]); + await game.runToMysteryEncounter(defaultParty); await runSelectMysteryEncounterOption(game, 3); - const { encounteredEvents } = game.scene.mysteryEncounterData; - const party = game.scene.getParty(); - - expect(encounteredEvents.some(([type, tier]) => type === MysteryEncounterType.LOST_AT_SEA && tier === MysteryEncounterTier.COMMON)).toBe(true); - party.forEach((pkm) => { - const maxHp = pkm.getMaxHp(); - const expectMsg = `${pkm.name} should have receivd 25% damage: ${pkm.hp} / ${maxHp} HP`; - - expect(pkm.hp, expectMsg).toBe(maxHp - Math.floor(maxHp * 0.25)); - }); expect(leaveEncounterWithoutBattleSpy).toBeCalled(); }); }); From 09a3167bacb224b095967fdbf3d9b460e7b65251 Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Tue, 16 Jul 2024 22:51:40 -0400 Subject: [PATCH 140/270] add fiery storm animation for fiery fallout --- public/battle-anims/encounter-magma-bg.json | 70 + .../battle-anims/encounter-magma-spout.json | 1569 +++++++++++++++++ src/battle-scene.ts | 3 +- src/data/battle-anims.ts | 224 +++ .../encounters/fiery-fallout-encounter.ts | 65 +- .../mystery-encounters/mystery-encounter.ts | 12 + .../utils/encounter-phase-utils.ts | 1 + src/phases.ts | 9 +- src/phases/mystery-encounter-phase.ts | 8 +- 9 files changed, 1916 insertions(+), 45 deletions(-) create mode 100644 public/battle-anims/encounter-magma-bg.json create mode 100644 public/battle-anims/encounter-magma-spout.json diff --git a/public/battle-anims/encounter-magma-bg.json b/public/battle-anims/encounter-magma-bg.json new file mode 100644 index 00000000000..1e144b9d4f6 --- /dev/null +++ b/public/battle-anims/encounter-magma-bg.json @@ -0,0 +1,70 @@ +{ + "graphic": "Encounter Magma Bg", + "frames": [ + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [], + [] + ], + "frameTimedEvents": { + "0": [ + { + "frameIndex": 0, + "resourceName": "PRAS- Fire BG", + "bgX": 0, + "bgY": 0, + "opacity": 0, + "duration": 35, + "eventType": "AnimTimedAddBgEvent" + }, + { + "frameIndex": 0, + "resourceName": "", + "bgX": 0, + "bgY": 0, + "opacity": 255, + "duration": 4, + "eventType": "AnimTimedUpdateBgEvent" + } + ], + "25": [ + { + "frameIndex": 25, + "resourceName": "", + "bgX": 0, + "bgY": 0, + "opacity": 0, + "duration": 7, + "eventType": "AnimTimedUpdateBgEvent" + } + ] + }, + "position": 1, + "hue": 0 +} \ No newline at end of file diff --git a/public/battle-anims/encounter-magma-spout.json b/public/battle-anims/encounter-magma-spout.json new file mode 100644 index 00000000000..961c5ab86bf --- /dev/null +++ b/public/battle-anims/encounter-magma-spout.json @@ -0,0 +1,1569 @@ +{ + "graphic": "PRAS- Magma Storm", + "frames": [ + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 0, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 0, + "focus": 1 + }, + { + "x": 101, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 0, + "opacity": 255, + "priority": 0, + "focus": 1 + }, + { + "x": 152, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 0, + "opacity": 255, + "priority": 0, + "focus": 1 + }, + { + "x": 124.5, + "y": -78.5, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 0, + "opacity": 255, + "focus": 1 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 0, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 0, + "focus": 1 + }, + { + "x": 101, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 1, + "opacity": 255, + "priority": 0, + "focus": 1 + }, + { + "x": 152, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 1, + "opacity": 255, + "priority": 0, + "focus": 1 + }, + { + "x": 124.5, + "y": -78.5, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 1, + "opacity": 255, + "focus": 1 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 0, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 0, + "focus": 1 + }, + { + "x": 101, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 2, + "opacity": 255, + "priority": 0, + "focus": 1 + }, + { + "x": 152, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 2, + "opacity": 255, + "priority": 0, + "focus": 1 + }, + { + "x": 124.5, + "y": -78.5, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 2, + "opacity": 255, + "focus": 1 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 0, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 0, + "focus": 1 + }, + { + "x": 101, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 3, + "opacity": 255, + "priority": 0, + "focus": 1 + }, + { + "x": 152, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 3, + "opacity": 255, + "priority": 0, + "focus": 1 + }, + { + "x": 124.5, + "y": -78.5, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 3, + "opacity": 255, + "focus": 1 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 0, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 0, + "focus": 1 + }, + { + "x": 101, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 4, + "opacity": 255, + "priority": 0, + "focus": 1 + }, + { + "x": 152, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 4, + "opacity": 255, + "priority": 0, + "focus": 1 + }, + { + "x": 124.5, + "y": -78.5, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 4, + "opacity": 255, + "focus": 1 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 0, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 0, + "focus": 1 + }, + { + "x": 101, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 5, + "opacity": 255, + "priority": 0, + "focus": 1 + }, + { + "x": 152, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 5, + "opacity": 255, + "priority": 0, + "focus": 1 + }, + { + "x": 124.5, + "y": -78.5, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 5, + "opacity": 255, + "focus": 1 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 0, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "tone": [ + 28, + -29, + -29, + 0 + ], + "locked": true, + "priority": 0, + "focus": 1 + }, + { + "x": 101, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 6, + "opacity": 255, + "priority": 0, + "focus": 1 + }, + { + "x": 152, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 6, + "opacity": 255, + "priority": 0, + "focus": 1 + }, + { + "x": 124.5, + "y": -78.5, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 6, + "opacity": 255, + "focus": 1 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 0, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "tone": [ + 56, + -57, + -57, + 0 + ], + "locked": true, + "priority": 0, + "focus": 1 + }, + { + "x": 101, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 7, + "opacity": 255, + "priority": 0, + "focus": 1 + }, + { + "x": 152, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 7, + "opacity": 255, + "priority": 0, + "focus": 1 + }, + { + "x": 124.5, + "y": -78.5, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 7, + "opacity": 255, + "focus": 1 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 0, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "tone": [ + 85, + -85, + -85, + 0 + ], + "locked": true, + "priority": 0, + "focus": 1 + }, + { + "x": 120, + "y": -56, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 8, + "opacity": 255, + "priority": 0, + "focus": 1 + }, + { + "x": 144, + "y": -84, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 8, + "opacity": 255, + "focus": 1 + }, + { + "x": 100, + "y": -86.5, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 8, + "opacity": 255, + "focus": 1 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 0, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "tone": [ + 113, + -114, + -114, + 0 + ], + "locked": true, + "priority": 0, + "focus": 1 + }, + { + "x": 140, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 9, + "opacity": 255, + "priority": 0, + "focus": 1 + }, + { + "x": 136, + "y": -92, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 9, + "opacity": 255, + "focus": 1 + }, + { + "x": 108, + "y": -78.5, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 9, + "opacity": 255, + "priority": 0, + "focus": 1 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 0, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "tone": [ + 141, + -142, + -142, + 0 + ], + "locked": true, + "priority": 0, + "focus": 1 + }, + { + "x": 152, + "y": -76, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 10, + "opacity": 255, + "focus": 1 + }, + { + "x": 116, + "y": -88, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 10, + "opacity": 255, + "focus": 1 + }, + { + "x": 128, + "y": -62.5, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 10, + "opacity": 255, + "priority": 0, + "focus": 1 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 0, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "tone": [ + 170, + -170, + -170, + 0 + ], + "locked": true, + "priority": 0, + "focus": 1 + }, + { + "x": 136, + "y": -96, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 7, + "opacity": 255, + "focus": 1 + }, + { + "x": 100, + "y": -76, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 7, + "opacity": 255, + "priority": 0, + "focus": 1 + }, + { + "x": 148, + "y": -66.5, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 7, + "opacity": 255, + "priority": 0, + "focus": 1 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 0, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "tone": [ + 198, + -199, + -199, + 0 + ], + "locked": true, + "priority": 0, + "focus": 1 + }, + { + "x": 108, + "y": -92, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 8, + "opacity": 255, + "priority": 0, + "focus": 1 + }, + { + "x": 120, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 8, + "opacity": 255, + "priority": 0, + "focus": 1 + }, + { + "x": 144, + "y": -86.5, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 8, + "opacity": 255, + "focus": 1 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 0, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "tone": [ + 226, + -227, + -227, + 0 + ], + "locked": true, + "priority": 0, + "focus": 1 + }, + { + "x": 100, + "y": -76, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 9, + "opacity": 255, + "priority": 0, + "focus": 1 + }, + { + "x": 136, + "y": -68, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 9, + "opacity": 255, + "focus": 1 + }, + { + "x": 128, + "y": -94.5, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 9, + "opacity": 255, + "focus": 1 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 0, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "tone": [ + 255, + -255, + -255, + 0 + ], + "locked": true, + "priority": 0, + "focus": 1 + }, + { + "x": 100.5, + "y": -70, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 10, + "opacity": 255, + "priority": 0, + "focus": 1 + }, + { + "x": 144, + "y": -66, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 10, + "opacity": 255, + "focus": 1 + }, + { + "x": 126, + "y": -86.5, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 10, + "opacity": 255, + "priority": 0, + "focus": 1 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 0, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "tone": [ + 223, + -224, + -224, + 0 + ], + "locked": true, + "priority": 0, + "focus": 1 + }, + { + "x": 101, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 6, + "opacity": 255, + "priority": 0, + "focus": 1 + }, + { + "x": 152, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 6, + "opacity": 255, + "priority": 0, + "focus": 1 + }, + { + "x": 124.5, + "y": -78.5, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 6, + "opacity": 255, + "focus": 1 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 0, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "tone": [ + 191, + -192, + -192, + 0 + ], + "locked": true, + "priority": 0, + "focus": 1 + }, + { + "x": 101, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 5, + "opacity": 255, + "priority": 0, + "focus": 1 + }, + { + "x": 152, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 5, + "opacity": 255, + "priority": 0, + "focus": 1 + }, + { + "x": 124.5, + "y": -78.5, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 5, + "opacity": 255, + "focus": 1 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 0, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "tone": [ + 159, + -160, + -160, + 0 + ], + "locked": true, + "priority": 0, + "focus": 1 + }, + { + "x": 101, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 4, + "opacity": 255, + "priority": 0, + "focus": 1 + }, + { + "x": 152, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 4, + "opacity": 255, + "priority": 0, + "focus": 1 + }, + { + "x": 124.5, + "y": -78.5, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 4, + "opacity": 255, + "focus": 1 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 0, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "tone": [ + 127, + -128, + -128, + 0 + ], + "locked": true, + "priority": 0, + "focus": 1 + }, + { + "x": 101, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 3, + "opacity": 255, + "priority": 0, + "focus": 1 + }, + { + "x": 152, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 3, + "opacity": 255, + "priority": 0, + "focus": 1 + }, + { + "x": 124.5, + "y": -78.5, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 3, + "opacity": 255, + "focus": 1 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 0, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "tone": [ + 95, + -96, + -96, + 0 + ], + "locked": true, + "priority": 0, + "focus": 1 + }, + { + "x": 101, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 2, + "opacity": 255, + "priority": 0, + "focus": 1 + }, + { + "x": 152, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 2, + "opacity": 255, + "priority": 0, + "focus": 1 + }, + { + "x": 124.5, + "y": -78.5, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 2, + "opacity": 255, + "focus": 1 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 0, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "tone": [ + 63, + -64, + -64, + 0 + ], + "locked": true, + "priority": 0, + "focus": 1 + }, + { + "x": 101, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 1, + "opacity": 255, + "priority": 0, + "focus": 1 + }, + { + "x": 152, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 1, + "opacity": 255, + "priority": 0, + "focus": 1 + }, + { + "x": 124.5, + "y": -78.5, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 1, + "opacity": 255, + "focus": 1 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 0, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "tone": [ + 31, + -32, + -32, + 0 + ], + "locked": true, + "priority": 0, + "focus": 1 + }, + { + "x": 101, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 0, + "opacity": 255, + "priority": 0, + "focus": 1 + }, + { + "x": 152, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 0, + "opacity": 255, + "priority": 0, + "focus": 1 + }, + { + "x": 124.5, + "y": -78.5, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 0, + "opacity": 255, + "focus": 1 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 0, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 0, + "focus": 1 + }, + { + "x": 101, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 0, + "opacity": 130, + "priority": 0, + "focus": 1 + }, + { + "x": 152, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 0, + "opacity": 130, + "priority": 0, + "focus": 1 + }, + { + "x": 124.5, + "y": -78.5, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 0, + "opacity": 140, + "focus": 1 + } + ] + ], + "frameTimedEvents": { + "0": [ + { + "frameIndex": 0, + "resourceName": "PRSFX- Magma Storm1.wav", + "volume": 100, + "pitch": 100, + "eventType": "AnimTimedSoundEvent" + } + ], + "8": [ + { + "frameIndex": 8, + "resourceName": "PRSFX- Magma Storm2.wav", + "volume": 100, + "pitch": 100, + "eventType": "AnimTimedSoundEvent" + } + ] + }, + "position": 1, + "hue": 0 +} \ No newline at end of file diff --git a/src/battle-scene.ts b/src/battle-scene.ts index c0a3f0b090a..4ebdafd3752 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -7,7 +7,7 @@ import {Constructor, isNullOrUndefined} from "#app/utils"; import * as Utils from "./utils"; import { Modifier, ModifierBar, ConsumablePokemonModifier, ConsumableModifier, PokemonHpRestoreModifier, HealingBoosterModifier, PersistentModifier, PokemonHeldItemModifier, ModifierPredicate, DoubleBattleChanceBoosterModifier, FusePokemonModifier, PokemonFormChangeItemModifier, TerastallizeModifier, overrideModifiers, overrideHeldItems } from "./modifier/modifier"; import { PokeballType } from "./data/pokeball"; -import { initCommonAnims, initMoveAnim, loadCommonAnimAssets, loadMoveAnimAssets, populateAnims } from "./data/battle-anims"; +import { initCommonAnims, initEncounterAnims, initMoveAnim, loadCommonAnimAssets, loadEncounterAnimAssets, loadMoveAnimAssets, populateAnims } from "./data/battle-anims"; import { Phase } from "./phase"; import { initGameSpeed } from "./system/game-speed"; import { Arena, ArenaBase } from "./field/arena"; @@ -555,6 +555,7 @@ export default class BattleScene extends SceneBase { Promise.all([ Promise.all(loadPokemonAssets), initCommonAnims(this).then(() => loadCommonAnimAssets(this, true)), + initEncounterAnims(this).then(() => loadEncounterAnimAssets(this, true)), Promise.all([ Moves.TACKLE, Moves.TAIL_WHIP, Moves.FOCUS_ENERGY, Moves.STRUGGLE ].map(m => initMoveAnim(this, m))).then(() => loadMoveAnimAssets(this, defaultMoves, true)), this.initStarterColors() ]).then(() => { diff --git a/src/data/battle-anims.ts b/src/data/battle-anims.ts index d4dbb8ec350..1643852f922 100644 --- a/src/data/battle-anims.ts +++ b/src/data/battle-anims.ts @@ -102,6 +102,11 @@ export enum CommonAnim { LOCK_ON = 2120 } +export enum EncounterAnim { + MAGMA_BG, + MAGMA_SPOUT +} + export class AnimConfig { public id: integer; public graphic: string; @@ -444,6 +449,7 @@ class AnimTimedAddBgEvent extends AnimTimedBgEvent { export const moveAnims = new Map(); export const chargeAnims = new Map(); export const commonAnims = new Map(); +export const encounterAnims = new Map(); export function initCommonAnims(scene: BattleScene): Promise { return new Promise(resolve => { @@ -511,6 +517,21 @@ export function initMoveAnim(scene: BattleScene, move: Moves): Promise { }); } +export function initEncounterAnims(scene: BattleScene): Promise { + return new Promise(resolve => { + const encounterAnimNames = Utils.getEnumKeys(EncounterAnim); + const encounterAnimIds = Utils.getEnumValues(EncounterAnim); + const encounterAnimFetches = []; + for (let ea = 0; ea < encounterAnimIds.length; ea++) { + const encounterAnimId = encounterAnimIds[ea]; + encounterAnimFetches.push(scene.cachedFetch(`./battle-anims/encounter-${encounterAnimNames[ea].toLowerCase().replace(/\_/g, "-")}.json`) + .then(response => response.json()) + .then(cas => encounterAnims.set(encounterAnimId, new AnimConfig(cas)))); + } + Promise.allSettled(encounterAnimFetches).then(() => resolve()); + }); +} + export function initMoveChargeAnim(scene: BattleScene, chargeAnim: ChargeAnim): Promise { return new Promise(resolve => { if (chargeAnims.has(chargeAnim)) { @@ -565,6 +586,12 @@ export function loadCommonAnimAssets(scene: BattleScene, startLoad?: boolean): P }); } +export function loadEncounterAnimAssets(scene: BattleScene, startLoad?: boolean): Promise { + return new Promise(resolve => { + loadAnimAssets(scene, Array.from(encounterAnims.values()), startLoad).then(() => resolve()); + }); +} + export function loadMoveAnimAssets(scene: BattleScene, moveIds: Moves[], startLoad?: boolean): Promise { return new Promise(resolve => { const moveAnimations = moveIds.map(m => moveAnims.get(m) as AnimConfig).flat(); @@ -977,6 +1004,185 @@ export abstract class BattleAnim { } }); } + + private getGraphicFrameDataWithoutTarget(scene: BattleScene, frames: AnimFrame[], targetInitialX: number, targetInitialY: number): Map> { + const ret: Map> = new Map([ + [AnimFrameTarget.GRAPHIC, new Map() ], + [AnimFrameTarget.USER, new Map() ], + [AnimFrameTarget.TARGET, new Map() ] + ]); + + const userInitialX = 0; + const userInitialY = 0; + const userHalfHeight = 30; + const targetHalfHeight = 30; + + let g = 0; + let u = 0; + let t = 0; + + for (const frame of frames) { + let x = frame.x; + let y = frame.y; + let scaleX = (frame.zoomX / 100) * (!frame.mirror ? 1 : -1); + const scaleY = (frame.zoomY / 100); + switch (frame.focus) { + case AnimFocus.TARGET: + x += targetInitialX - targetFocusX; + y += (targetInitialY - targetHalfHeight) - targetFocusY; + break; + case AnimFocus.USER: + x += userInitialX - userFocusX; + y += (userInitialY - userHalfHeight) - userFocusY; + break; + case AnimFocus.USER_TARGET: + const point = transformPoint(this.srcLine[0], this.srcLine[1], this.srcLine[2], this.srcLine[3], + this.dstLine[0], this.dstLine[1] - userHalfHeight, this.dstLine[2], this.dstLine[3] - targetHalfHeight, x, y); + x = point[0]; + y = point[1]; + if (frame.target === AnimFrameTarget.GRAPHIC && isReversed(this.srcLine[0], this.srcLine[2], this.dstLine[0], this.dstLine[2])) { + scaleX = scaleX * -1; + } + break; + } + const angle = -frame.angle; + const key = frame.target === AnimFrameTarget.GRAPHIC ? g++ : frame.target === AnimFrameTarget.USER ? u++ : t++; + ret.get(frame.target).set(key, { x: x, y: y, scaleX: scaleX, scaleY: scaleY, angle: angle }); + } + + return ret; + } + + playWithoutTargets(scene: BattleScene, targetInitialX: number, targetInitialY: number, frameTimeMult: number, callback?: Function) { + const spriteCache: SpriteCache = { + [AnimFrameTarget.GRAPHIC]: [], + [AnimFrameTarget.USER]: [], + [AnimFrameTarget.TARGET]: [] + }; + const spritePriorities: integer[] = []; + + const cleanUpAndComplete = () => { + for (const ms of Object.values(spriteCache).flat()) { + if (ms) { + ms.destroy(); + } + } + if (this.bgSprite) { + this.bgSprite.destroy(); + } + if (callback) { + callback(); + } + }; + + if (!scene.moveAnimations) { + return cleanUpAndComplete(); + } + + const anim = this.getAnim(); + + this.srcLine = [ userFocusX, userFocusY, targetFocusX, targetFocusY ]; + this.dstLine = [ 150, 75, targetInitialX, targetInitialY ]; + + let r = anim.frames.length; + let f = 0; + + scene.tweens.addCounter({ + duration: Utils.getFrameMs(3) * frameTimeMult, + repeat: anim.frames.length, + onRepeat: () => { + const spriteFrames = anim.frames[f]; + const frameData = this.getGraphicFrameDataWithoutTarget(scene, anim.frames[f], targetInitialX, targetInitialY); + const u = 0; + const t = 0; + let g = 0; + for (const frame of spriteFrames) { + if (frame.target !== AnimFrameTarget.GRAPHIC) { + console.log("Encounter animations do not support targets"); + continue; + } + + const sprites = spriteCache[AnimFrameTarget.GRAPHIC]; + if (g === sprites.length) { + const newSprite: Phaser.GameObjects.Sprite = scene.addFieldSprite(0, 0, anim.graphic, 1); + sprites.push(newSprite); + scene.field.add(newSprite); + spritePriorities.push(1); + } + + const graphicIndex = g++; + const moveSprite = sprites[graphicIndex]; + if (spritePriorities[graphicIndex] !== frame.priority) { + spritePriorities[graphicIndex] = frame.priority; + const setSpritePriority = (priority: integer) => { + if (priority < 0) { + // Move to top of scene + scene.field.moveTo(moveSprite, scene.field.getAll().length - 1); + } else if (priority < scene.field.getAll().length) { + // Indexes of field: + // 0 is scene background + // 1 is enemy field + scene.field.moveTo(moveSprite, priority); + } else { + setSpritePriority(-1); + } + }; + setSpritePriority(frame.priority); + } + moveSprite.setFrame(frame.graphicFrame); + //console.log(AnimFocus[frame.focus]); + + const graphicFrameData = frameData.get(frame.target).get(graphicIndex); + moveSprite.setPosition(graphicFrameData.x, graphicFrameData.y); + moveSprite.setAngle(graphicFrameData.angle); + moveSprite.setScale(graphicFrameData.scaleX, graphicFrameData.scaleY); + + moveSprite.setAlpha(frame.opacity / 255); + moveSprite.setVisible(frame.visible); + moveSprite.setBlendMode(frame.blendType === AnimBlendType.NORMAL ? Phaser.BlendModes.NORMAL : frame.blendType === AnimBlendType.ADD ? Phaser.BlendModes.ADD : Phaser.BlendModes.DIFFERENCE); + } + if (anim.frameTimedEvents.has(f)) { + for (const event of anim.frameTimedEvents.get(f)) { + r = Math.max((anim.frames.length - f) + event.execute(scene, this), r); + } + } + const targets = Utils.getEnumValues(AnimFrameTarget); + for (const i of targets) { + const count = i === AnimFrameTarget.GRAPHIC ? g : i === AnimFrameTarget.USER ? u : t; + if (count < spriteCache[i].length) { + const spritesToRemove = spriteCache[i].slice(count, spriteCache[i].length); + for (const rs of spritesToRemove) { + if (!rs.getData("locked") as boolean) { + const spriteCacheIndex = spriteCache[i].indexOf(rs); + spriteCache[i].splice(spriteCacheIndex, 1); + if (i === AnimFrameTarget.GRAPHIC) { + spritePriorities.splice(spriteCacheIndex, 1); + } + rs.destroy(); + } + } + } + } + f++; + r--; + }, + onComplete: () => { + for (const ms of Object.values(spriteCache).flat()) { + if (ms && !ms.getData("locked")) { + ms.destroy(); + } + } + if (r) { + scene.tweens.addCounter({ + duration: Utils.getFrameMs(r), + onComplete: () => cleanUpAndComplete() + }); + } else { + cleanUpAndComplete(); + } + } + }); + } } export class CommonBattleAnim extends BattleAnim { @@ -1045,6 +1251,24 @@ export class MoveChargeAnim extends MoveAnim { } } +export class EncounterBattleAnim extends BattleAnim { + public encounterAnim: EncounterAnim; + + constructor(encounterAnim: EncounterAnim, user: Pokemon, target?: Pokemon) { + super(user, target || user); + + this.encounterAnim = encounterAnim; + } + + getAnim(): AnimConfig { + return encounterAnims.get(this.encounterAnim); + } + + isOppAnim(): boolean { + return false; + } +} + export async function populateAnims() { const commonAnimNames = Utils.getEnumKeys(CommonAnim).map(k => k.toLowerCase()); const commonAnimMatchNames = commonAnimNames.map(k => k.replace(/\_/g, "")); diff --git a/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts b/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts index 8db4db8169d..84cf0d9ae7f 100644 --- a/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts +++ b/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts @@ -12,8 +12,9 @@ import { Type } from "#app/data/type"; import { BattlerIndex } from "#app/battle"; import { PokemonMove } from "#app/field/pokemon"; import { Moves } from "#enums/moves"; -import { initMoveAnim } from "#app/data/battle-anims"; +import { EncounterAnim, EncounterBattleAnim, initMoveAnim, loadMoveAnimAssets } from "#app/data/battle-anims"; import { WeatherType } from "#app/data/weather"; +import { randSeedInt } from "#app/utils"; /** the i18n namespace for the encounter */ const namespace = "mysteryEncounter:fiery_fallout"; @@ -34,7 +35,7 @@ export const FieryFalloutEncounter: IMysteryEncounter = .withOnInit((scene: BattleScene) => { const encounter = scene.currentBattle.mysteryEncounter; - // Calculate boss mon + // Calculate boss mons const volcaronaSpecies = getPokemonSpecies(Species.VOLCARONA); const config: EnemyPartyConfig = { levelAdditiveMultiplier: 0.25, @@ -55,19 +56,28 @@ export const FieryFalloutEncounter: IMysteryEncounter = }; encounter.enemyPartyConfigs = [config]; - const spriteKey = volcaronaSpecies.getSpriteId(false, null, false, null); - encounter.spriteConfigs = [ - { - spriteKey: spriteKey, - fileRoot: "pokemon", - tint: 0.9, - repeat: true - } - ]; - // Sets weather for 5 turns scene.arena.trySetWeather(WeatherType.SUNNY, true); + // Load animations/sfx for Volcarona moves + Promise.all([initMoveAnim(scene, Moves.QUIVER_DANCE), initMoveAnim(scene, Moves.FIRE_SPIN)]) + .then(() => loadMoveAnimAssets(scene, [Moves.QUIVER_DANCE, Moves.FIRE_SPIN])); + + return true; + }) + .withOnVisualsStart((scene: BattleScene) => { + // Play animations + const background = new EncounterBattleAnim(EncounterAnim.MAGMA_BG, scene.getPlayerPokemon(), scene.getPlayerPokemon()); + background.playWithoutTargets(scene, 200, 70, 2); + const animation = new EncounterBattleAnim(EncounterAnim.MAGMA_SPOUT, scene.getPlayerPokemon(), scene.getPlayerPokemon()); + animation.playWithoutTargets(scene, 200, 70, 2); + const increment = 600; + for (let i = 3; i < 6; i++) { + scene.time.delayedCall((increment) * (i - 2), () => { + animation.playWithoutTargets(scene, 100 + randSeedInt(12) * 20, 110 - randSeedInt(10) * 15, 2); + }); + } + return true; }) .withTitle(`${namespace}_title`) @@ -86,22 +96,19 @@ export const FieryFalloutEncounter: IMysteryEncounter = async (scene: BattleScene) => { // Pick battle const encounter = scene.currentBattle.mysteryEncounter; - // TODO: play heat wave animation for weather effect - // await initMoveAnim(scene, Moves.HEAT_WAVE); - // await loadMoveAnimAssets(scene, [ Moves.HEAT_WAVE ], true); - // const heatWave = new MoveAnim(Moves.HEAT_WAVE, scene.getPlayerPokemon(), 0); - // heatWave.play(scene); - - await initMoveAnim(scene, Moves.QUIVER_DANCE); - await initMoveAnim(scene, Moves.FIRE_SPIN); - await initMoveAnim(scene, Moves.HEAT_WAVE); const charcoal = generateModifierTypeOption(scene, modifierTypes.ATTACK_TYPE_BOOSTER, [Type.FIRE]); setEncounterRewards(scene, { guaranteedModifierTypeOptions: [charcoal], fillRemaining: true }); encounter.startOfBattleEffects.push( { sourceBattlerIndex: BattlerIndex.ENEMY, - targets: [BattlerIndex.PLAYER, BattlerIndex.PLAYER_2], - move: new PokemonMove(Moves.HEAT_WAVE), + targets: [BattlerIndex.PLAYER], + move: new PokemonMove(Moves.FIRE_SPIN), + ignorePp: true + }, + { + sourceBattlerIndex: BattlerIndex.ENEMY_2, + targets: [BattlerIndex.PLAYER_2], + move: new PokemonMove(Moves.FIRE_SPIN), ignorePp: true }, { @@ -115,18 +122,6 @@ export const FieryFalloutEncounter: IMysteryEncounter = targets: [BattlerIndex.ENEMY_2], move: new PokemonMove(Moves.QUIVER_DANCE), ignorePp: true - }, - { - sourceBattlerIndex: BattlerIndex.ENEMY, - targets: [BattlerIndex.PLAYER], - move: new PokemonMove(Moves.FIRE_SPIN), - ignorePp: true - }, - { - sourceBattlerIndex: BattlerIndex.ENEMY_2, - targets: [BattlerIndex.PLAYER_2], - move: new PokemonMove(Moves.FIRE_SPIN), - ignorePp: true }); await initBattleWithEnemyConfig(scene, scene.currentBattle.mysteryEncounter.enemyPartyConfigs[0]); } diff --git a/src/data/mystery-encounters/mystery-encounter.ts b/src/data/mystery-encounters/mystery-encounter.ts index 608783b7d87..d68e912fdff 100644 --- a/src/data/mystery-encounters/mystery-encounter.ts +++ b/src/data/mystery-encounters/mystery-encounter.ts @@ -64,6 +64,7 @@ export default interface IMysteryEncounter { doEncounterExp?: (scene: BattleScene) => boolean; doEncounterRewards?: (scene: BattleScene) => boolean; onInit?: (scene: BattleScene) => boolean; + onVisualsStart?: (scene: BattleScene) => boolean; /** * Requirements @@ -384,6 +385,7 @@ export class MysteryEncounterBuilder implements Partial { doEncounterExp?: (scene: BattleScene) => boolean; doEncounterRewards?: (scene: BattleScene) => boolean; onInit?: (scene: BattleScene) => boolean; + onVisualsStart?: (scene: BattleScene) => boolean; hideBattleIntroMessage?: boolean; hideIntroVisuals?: boolean; enemyPartyConfigs?: EnemyPartyConfig[] = []; @@ -598,6 +600,16 @@ export class MysteryEncounterBuilder implements Partial { return Object.assign(this, { onInit: onInit }); } + /** + * Can be used to perform some extra logic (usually animations) when the enemy field is finished sliding in + * + * @param onVisualsStart - synchronous callback function to perform as soon as the enemy field finishes sliding in + * @returns + */ + withOnVisualsStart(onVisualsStart: (scene: BattleScene) => boolean): this & Required> { + return Object.assign(this, { onVisualsStart: onVisualsStart }); + } + /** * Defines any enemies to use for a battle from the mystery encounter * @param enemyPartyConfig diff --git a/src/data/mystery-encounters/utils/encounter-phase-utils.ts b/src/data/mystery-encounters/utils/encounter-phase-utils.ts index c38caee472b..0aae84a7a8a 100644 --- a/src/data/mystery-encounters/utils/encounter-phase-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-phase-utils.ts @@ -202,6 +202,7 @@ export async function initBattleWithEnemyConfig(scene: BattleScene, partyConfig: } enemyPokemon.initBattleInfo(); + enemyPokemon.getBattleInfo().initInfo(enemyPokemon); } loadEnemyAssets.push(enemyPokemon.loadAssets()); diff --git a/src/phases.ts b/src/phases.ts index 5bc1a72bdf4..6465d573622 100644 --- a/src/phases.ts +++ b/src/phases.ts @@ -891,11 +891,6 @@ export class EncounterPhase extends BattlePhase { if (battle.battleType === BattleType.TRAINER) { loadEnemyAssets.push(battle.trainer.loadAssets().then(() => battle.trainer.initSprite())); } else if (battle.battleType === BattleType.MYSTERY_ENCOUNTER) { - // this.scene.getEnemyParty().forEach(p => { - // this.scene.field.remove(p); - // p.destroy(); - // }); - // this.scene.currentBattle.enemyParty = []; if (!battle.mysteryEncounter) { const newEncounter = this.scene.getMysteryEncounter(mysteryEncounter); battle.mysteryEncounter = newEncounter; @@ -1081,6 +1076,10 @@ export class EncounterPhase extends BattlePhase { const introVisuals = this.scene.currentBattle.mysteryEncounter.introVisuals; introVisuals.playAnim(); + if (this.scene.currentBattle.mysteryEncounter.onVisualsStart) { + this.scene.currentBattle.mysteryEncounter.onVisualsStart(this.scene); + } + const doEncounter = () => { this.scene.playBgm(undefined); diff --git a/src/phases/mystery-encounter-phase.ts b/src/phases/mystery-encounter-phase.ts index fda0e008484..5745e2c68d1 100644 --- a/src/phases/mystery-encounter-phase.ts +++ b/src/phases/mystery-encounter-phase.ts @@ -108,9 +108,9 @@ export class MysteryEncounterPhase extends Phase { } if (title) { - this.scene.ui.showDialogue(text, title, null, nextAction, 0, i === 0 ? 750 : 0); + this.scene.ui.showDialogue(text, title, null, nextAction, 0, i === 0 ? 300 : 0); } else { - this.scene.ui.showText(text, null, nextAction, i === 0 ? 750 : 0, true); + this.scene.ui.showText(text, null, nextAction, i === 0 ? 300 : 0, true); } i++; }; @@ -222,7 +222,7 @@ export class MysteryEncounterBattlePhase extends Phase { } if (!scene.currentBattle.mysteryEncounter.hideBattleIntroMessage) { - scene.ui.showText(this.getBattleMessage(scene), null, () => this.endBattleSetup(scene), 500); + scene.ui.showText(this.getBattleMessage(scene), null, () => this.endBattleSetup(scene), 0); } else { this.endBattleSetup(scene); } @@ -243,7 +243,7 @@ export class MysteryEncounterBattlePhase extends Phase { this.endBattleSetup(scene); }; if (!scene.currentBattle.mysteryEncounter.hideBattleIntroMessage) { - scene.ui.showText(this.getBattleMessage(scene), null, doTrainerSummon, 1500, true); + scene.ui.showText(this.getBattleMessage(scene), null, doTrainerSummon, 1000, true); } else { doTrainerSummon(); } From 04da4516b44102588a7f4935ac0e7c006549190b Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Tue, 16 Jul 2024 21:27:35 -0700 Subject: [PATCH 141/270] finish lost-at-sea-encounter.test.ts (for now) --- .../mystery-encounter/encounterTestUtils.ts | 4 +- .../encounters/lost-at-sea-encounter.test.ts | 103 +++++++++++++----- src/test/utils/phaseInterceptor.ts | 8 +- 3 files changed, 84 insertions(+), 31 deletions(-) diff --git a/src/test/mystery-encounter/encounterTestUtils.ts b/src/test/mystery-encounter/encounterTestUtils.ts index cfd42f5afad..65f6ae0edc9 100644 --- a/src/test/mystery-encounter/encounterTestUtils.ts +++ b/src/test/mystery-encounter/encounterTestUtils.ts @@ -1,6 +1,6 @@ import { Button } from "#app/enums/buttons"; import { MessagePhase } from "#app/phases"; -import { MysteryEncounterOptionSelectedPhase, MysteryEncounterPhase, MysteryEncounterRewardsPhase } from "#app/phases/mystery-encounter-phase"; +import { MysteryEncounterPhase, MysteryEncounterRewardsPhase } from "#app/phases/mystery-encounter-phase"; import MysteryEncounterUiHandler from "#app/ui/mystery-encounter-ui-handler"; import { Mode } from "#app/ui/ui"; import GameManager from "../utils/gameManager"; @@ -50,7 +50,5 @@ export async function runSelectMysteryEncounterOption(game: GameManager, optionN const uiHandler = game.scene.ui.getHandler(); uiHandler.processInput(Button.ACTION); }); - await game.phaseInterceptor.run(MysteryEncounterOptionSelectedPhase); - await game.phaseInterceptor.to(MysteryEncounterRewardsPhase); } 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 30a85ff6d44..928da9760d4 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 @@ -28,7 +28,9 @@ describe("Lost at Sea - Mystery Encounter", () => { game = new GameManager(phaserGame); game.override.mysteryEncounterChance(100); game.override.startingBiome(Biome.SEA); - vi.spyOn(MysteryEncounters, "allMysteryEncounters", "get").mockReturnValue({ [MysteryEncounterType.LOST_AT_SEA]: LostAtSeaEncounter }); + vi.spyOn(MysteryEncounters, "allMysteryEncounters", "get").mockReturnValue({ + [MysteryEncounterType.LOST_AT_SEA]: LostAtSeaEncounter, + }); }); afterEach(() => { @@ -47,14 +49,16 @@ describe("Lost at Sea - Mystery Encounter", () => { expect(LostAtSeaEncounter.options.length).toBe(3); }); + it("should not run outside of sea biome", async () => { + // TODO: a little tricky + }); + it("should not run below wave 11", async () => { game.override.startingWave(10); await game.runToMysteryEncounter(); - const { currentBattle } = game.scene; - expect(currentBattle).toBeDefined(); - expect(currentBattle.mysteryEncounter).toBeUndefined(); + expect(game.scene.currentBattle.mysteryEncounter).toBeUndefined(); }); it("should not run above wave 179", async () => { @@ -62,9 +66,7 @@ describe("Lost at Sea - Mystery Encounter", () => { await game.runToMysteryEncounter(); - const { currentBattle } = game.scene; - expect(currentBattle).toBeDefined(); - expect(currentBattle.mysteryEncounter).toBeUndefined(); + expect(game.scene.currentBattle.mysteryEncounter).toBeUndefined(); }); it("should set the correct dialog tokens during initialization", () => { @@ -99,6 +101,37 @@ describe("Lost at Sea - Mystery Encounter", () => { ], }); }); + + it("should award exp to surfable PKM (Blastoise)", async () => { + const laprasBaseExp = 187; + const wave = 33; + game.override.startingWave(wave); + + await workaround_reInitSceneWithOverrides(game); + await game.runToMysteryEncounter(defaultParty); + const party = game.scene.getParty(); + const blastoise = party.find((pkm) => pkm.species.speciesId === Species.PIDGEOT); + const expBefore = blastoise.exp; + + await runSelectMysteryEncounterOption(game, 2); + + expect(blastoise.exp).toBe(expBefore + laprasBaseExp * wave); + }); + + it("should leave encounter without battle", async () => { + game.override.startingWave(33); + const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); + + await workaround_reInitSceneWithOverrides(game); + await game.runToMysteryEncounter(defaultParty); + await runSelectMysteryEncounterOption(game, 1); + + expect(leaveEncounterWithoutBattleSpy).toBeCalled(); + }); + + it("should be disabled if no surfable PKM is in party", async () => { + // TODO + }); }); describe("Option 2 - Fly", () => { @@ -120,22 +153,35 @@ describe("Lost at Sea - Mystery Encounter", () => { }); }); - it("should award exp to surfable pokemone (Blastoise)", async () => { - game.override.startingWave(33); - const setEncounterExpSpy = vi.spyOn(EncounterPhaseUtils, "setEncounterExp"); + it("should award exp to flyable PKM (Pidgeot)", async () => { + const laprasBaseExp = 187; + const wave = 33; + game.override.startingWave(wave); - workaround_reInitSceneWithOverrides(game); + await workaround_reInitSceneWithOverrides(game); await game.runToMysteryEncounter(defaultParty); - let blastoise = game.scene.getParty().find((pkm) => pkm.species.speciesId === Species.BLASTOISE); - console.log("BLASTOISE EXP BEFORE: ", blastoise.exp); + const party = game.scene.getParty(); + const pidgeot = party.find((pkm) => pkm.species.speciesId === Species.PIDGEOT); + const expBefore = pidgeot.exp; await runSelectMysteryEncounterOption(game, 2); - blastoise = game.scene.getParty().find((pkm) => pkm.species.speciesId === Species.BLASTOISE); - console.log("BLASTOISE EXP AFTER: ", blastoise.exp); + expect(pidgeot.exp).toBe(expBefore + laprasBaseExp * wave); + }); - expect(blastoise.exp).toBe(128); - expect(setEncounterExpSpy).toHaveBeenCalledWith(expect.anything(), 128, expect.anything(), true); + it("should leave encounter without battle", async () => { + game.override.startingWave(33); + const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); + + await workaround_reInitSceneWithOverrides(game); + await game.runToMysteryEncounter(defaultParty); + await runSelectMysteryEncounterOption(game, 2); + + expect(leaveEncounterWithoutBattleSpy).toBeCalled(); + }); + + it("should be disabled if no flyable PKM is in party", async () => { + // TODO }); }); @@ -156,20 +202,25 @@ describe("Lost at Sea - Mystery Encounter", () => { }); }); - it("should damage all party pokemon by 25%", async () => { + it("should damage all (allowed in battle) party PKM by 25%", async () => { game.override.startingWave(33); - workaround_reInitSceneWithOverrides(game); + await workaround_reInitSceneWithOverrides(game); await game.runToMysteryEncounter(defaultParty); + + const party = game.scene.getParty(); + const abra = party.find((pkm) => pkm.species.speciesId === Species.ABRA); + vi.spyOn(abra, "isAllowedInBattle").mockReturnValue(false); + await runSelectMysteryEncounterOption(game, 3); - game.scene - .getParty() - .forEach((pkm) => - expect(pkm.hp, `${pkm.name} should have receivd 25% damage: ${pkm.hp} / ${pkm.getMaxHp()} HP`).toBe( - pkm.getMaxHp() - Math.floor(pkm.getMaxHp() * 0.25) - ) - ); + const allowedPkm = party.filter((pkm) => pkm.isAllowedInBattle()); + const notAllowedPkm = party.filter((pkm) => !pkm.isAllowedInBattle()); + allowedPkm.forEach((pkm) => + expect(pkm.hp, `${pkm.name} should have receivd 25% damage: ${pkm.hp} / ${pkm.getMaxHp()} HP`).toBe(pkm.getMaxHp() - Math.floor(pkm.getMaxHp() * 0.25)) + ); + + notAllowedPkm.forEach((pkm) => expect(pkm.hp, `${pkm.name} should be full hp: ${pkm.hp} / ${pkm.getMaxHp()} HP`).toBe(pkm.getMaxHp())); }); it("should leave encounter without battle", async () => { diff --git a/src/test/utils/phaseInterceptor.ts b/src/test/utils/phaseInterceptor.ts index cc593030b09..71cf6b495ed 100644 --- a/src/test/utils/phaseInterceptor.ts +++ b/src/test/utils/phaseInterceptor.ts @@ -8,6 +8,7 @@ import { EncounterPhase, EnemyCommandPhase, FaintPhase, + LearnMovePhase, LoginPhase, MessagePhase, MoveEffectPhase, @@ -41,6 +42,7 @@ import { MysteryEncounterBattlePhase, MysteryEncounterOptionSelectedPhase, MysteryEncounterPhase, + MysteryEncounterRewardsPhase, PostMysteryEncounterPhase } from "#app/phases/mystery-encounter-phase"; @@ -100,11 +102,13 @@ export default class PhaseInterceptor { [MysteryEncounterPhase, this.startPhase], [MysteryEncounterOptionSelectedPhase, this.startPhase], [MysteryEncounterBattlePhase, this.startPhase], - [PostMysteryEncounterPhase, this.startPhase] + [MysteryEncounterRewardsPhase, this.startPhase], + [PostMysteryEncounterPhase, this.startPhase], + [LearnMovePhase, this.startPhase] ]; private endBySetMode = [ - TitlePhase, SelectGenderPhase, CommandPhase, SelectModifierPhase + TitlePhase, SelectGenderPhase, CommandPhase, SelectModifierPhase, PostMysteryEncounterPhase ]; /** From 613c13c41938e8eadc48e0d0691667dd8a98454e Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Tue, 16 Jul 2024 21:34:05 -0700 Subject: [PATCH 142/270] use buoy sprite in lost-at-sea encounter --- .../encounters/lost-at-sea-encounter.ts | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) 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 cbbdbdccf92..dabbf07469e 100644 --- a/src/data/mystery-encounters/encounters/lost-at-sea-encounter.ts +++ b/src/data/mystery-encounters/encounters/lost-at-sea-encounter.ts @@ -1,5 +1,4 @@ import { Moves } from "#app/enums/moves"; -import { Species } from "#app/enums/species"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import BattleScene from "../../../battle-scene"; import MysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier } from "../mystery-encounter"; @@ -27,14 +26,11 @@ export const LostAtSeaEncounter: MysteryEncounter = MysteryEncounterBuilder.with .withSceneWaveRangeRequirement(11, 179) .withIntroSpriteConfigs([ { - fileRoot: "pokemon", - spriteKey: `${Species.GYARADOS}`, + fileRoot: "mystery-encounters", + spriteKey: "buoy", hasShadow: false, - scale: 4, - y: 100, - x: 130, - tint: 0.75, - alpha: 0.25, + y: 5, + x: 10, }, ]) .withIntroDialogue([{ text: `${namepsace}:intro` }]) From 4452356555dd162c6791959d80ec506a0512560f Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Tue, 16 Jul 2024 21:36:56 -0700 Subject: [PATCH 143/270] fix buoy sprite placement --- .../mystery-encounters/encounters/lost-at-sea-encounter.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 dabbf07469e..9ee35bb6e31 100644 --- a/src/data/mystery-encounters/encounters/lost-at-sea-encounter.ts +++ b/src/data/mystery-encounters/encounters/lost-at-sea-encounter.ts @@ -29,8 +29,8 @@ export const LostAtSeaEncounter: MysteryEncounter = MysteryEncounterBuilder.with fileRoot: "mystery-encounters", spriteKey: "buoy", hasShadow: false, - y: 5, - x: 10, + x: 20, + y: 3, }, ]) .withIntroDialogue([{ text: `${namepsace}:intro` }]) From c978e348b792cb4d286e7d3ba665697473fba0d5 Mon Sep 17 00:00:00 2001 From: flx-sta <50131232+flx-sta@users.noreply.github.com> Date: Wed, 17 Jul 2024 08:06:36 -0700 Subject: [PATCH 144/270] Apply suggestions from code review Co-authored-by: Asdar --- .../en/mystery-encounters/lost-at-sea.ts | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/locales/en/mystery-encounters/lost-at-sea.ts b/src/locales/en/mystery-encounters/lost-at-sea.ts index 35cceaa17a8..9b156f261ec 100644 --- a/src/locales/en/mystery-encounters/lost-at-sea.ts +++ b/src/locales/en/mystery-encounters/lost-at-sea.ts @@ -1,28 +1,28 @@ export const lostAtSea = { - intro: "You are halucinating and starting to loose your bearings.", + intro: "Wandering aimlessly, you effectively get nowhere.", title: "Lost at sea", description: - "You get lost at sea. All you \"sea\" is water everywhere and the sun is burning bright. Certain Pokémons can help you get back on track unharmed.", + "The sea is turbulent in this area and you seem to be running out of fuel as well.\nThis is bad. Is there a way out of the situation?", query: "What will you do?", option: { 1: { - label: "Use {{option1PrimaryName}}", + label: "{{option1PrimaryName}} can help", label_disabled: "Can't {{option1RequiredMove}}", - tooltip: "Use {{option1PrimaryName}} to guide you back. {{option1PrimaryName}} earns EXP as if having defeated a Lapras.", + tooltip: "{{option1PrimaryName}} saves you.\n{{option1PrimaryName}} gains some EXP.", tooltip_disabled: "You have no Pokémon to {{option1RequiredMove}} on", - selected: "{{option1PrimaryName}} guides you back and earns EXP.", + selected: "{{option1PrimaryName}} swims ahead, guiding you back on track.\n{{option1PrimaryName}} seems to also have gotten stronger in this time of need.", }, 2: { - label: "Use {{option2PrimaryName}}", + label: "{{option2PrimaryName}} can help", label_disabled: "Can't {{option2RequiredMove}}", - tooltip: "Use {{option2PrimaryName}} to guide you back. {{option2PrimaryName}} earns EXP as if having defeated a Lapras.", + tooltip: "{{option2PrimaryName}} saves you.\n{{option2PrimaryName}} gains some EXP.", tooltip_disabled: "You have no Pokémon to {{option2RequiredMove}} with", - selected: "{{option2PrimaryName}} guides you back and earns EXP.", + 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.", }, 3: { label: "Wander aimlessly", - tooltip: "Wander aimlessly until you're back. All your Pokémon lose {{damagePercentage}}% of their HP. Any below that are KO'd.", - selected: "You wander aimlessly around. After hours of wandering, you find your way back. You and your team take the toll.", + tooltip: "(-) Each of your Pokémon lose {{damagePercentage}}% of their total HP.", + selected: "You float about in the boat, steering it aimlessly until you finally get back on track. You and your Pokémon get very fatigued during the whole ordeal", }, }, }; From beb13c8361fe9ceaaffe3c9a6d17169a527ad925 Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Wed, 17 Jul 2024 08:43:55 -0700 Subject: [PATCH 145/270] fix types in myster-encounter-phase.ts --- src/phases/mystery-encounter-phase.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/phases/mystery-encounter-phase.ts b/src/phases/mystery-encounter-phase.ts index 13856471e4d..cebba02f585 100644 --- a/src/phases/mystery-encounter-phase.ts +++ b/src/phases/mystery-encounter-phase.ts @@ -4,7 +4,7 @@ import { Phase } from "../phase"; import { Mode } from "../ui/ui"; import { hideMysteryEncounterIntroVisuals, OptionSelectSettings } from "../data/mystery-encounters/utils/encounter-phase-utils"; import { CheckSwitchPhase, NewBattlePhase, ReturnPhase, ScanIvsPhase, SelectModifierPhase, SummonPhase, ToggleDoublePositionPhase } from "../phases"; -import MysteryEncounterOption from "../data/mystery-encounters/mystery-encounter-option"; +import MysteryEncounterOption, { OptionPhaseCallback } from "../data/mystery-encounters/mystery-encounter-option"; import { MysteryEncounterVariant } from "../data/mystery-encounters/mystery-encounter"; import { getCharVariantFromDialogue } from "../data/dialogue"; import { TrainerSlot } from "../data/trainer-config"; @@ -138,7 +138,7 @@ export class MysteryEncounterPhase extends Phase { * Any phase that is meant to follow this one MUST be queued via the onOptionSelect() logic of the selected option */ export class MysteryEncounterOptionSelectedPhase extends Phase { - onOptionSelect: (scene: BattleScene) => Promise; + onOptionSelect: OptionPhaseCallback; constructor(scene: BattleScene) { super(scene); @@ -394,7 +394,7 @@ export class MysteryEncounterRewardsPhase extends Phase { * - Queuing of the next wave */ export class PostMysteryEncounterPhase extends Phase { - onPostOptionSelect: (scene: BattleScene) => Promise; + onPostOptionSelect: OptionPhaseCallback; constructor(scene: BattleScene) { super(scene); From cd1bed3ab1b4a496cb75a815297131371d272e3f Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Wed, 17 Jul 2024 08:52:43 -0700 Subject: [PATCH 146/270] lost at sea enc.: add outro. add fainted msgs --- .../encounters/lost-at-sea-encounter.ts | 28 ++++++++++--------- .../en/mystery-encounters/lost-at-sea.ts | 13 +++++---- 2 files changed, 23 insertions(+), 18 deletions(-) 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 9ee35bb6e31..d32d9025346 100644 --- a/src/data/mystery-encounters/encounters/lost-at-sea-encounter.ts +++ b/src/data/mystery-encounters/encounters/lost-at-sea-encounter.ts @@ -12,7 +12,7 @@ const OPTION_2_REQUIRED_MOVE = Moves.FLY; * Can be a number between `0` - `100`. * The higher the more damage taken (100% = instant KO). */ -const DAMAGE_PERCENTAGE: number = 25; // 0 - 100 +const DAMAGE_PERCENTAGE: number = 25; /** The i18n namespace for the encounter */ const namepsace = "mysteryEncounter:lostAtSea"; @@ -47,10 +47,7 @@ export const LostAtSeaEncounter: MysteryEncounter = MysteryEncounterBuilder.with .withDescription(`${namepsace}:description`) .withQuery(`${namepsace}:query`) .withOption( - /** - * Option 1: Use a (non fainted) pokemon that can learn Surf to guide you back. - * Receives EXP similar to defeating a Lapras - */ + // Option 1: Use a (non fainted) pokemon that can learn Surf to guide you back/ new MysteryEncounterOptionBuilder() .withPokemonCanLearnMoveRequirement(OPTION_1_REQUIRED_MOVE) .withOptionMode(EncounterOptionMode.DISABLED_OR_DEFAULT) @@ -69,10 +66,7 @@ export const LostAtSeaEncounter: MysteryEncounter = MysteryEncounterBuilder.with .build() ) .withOption( - /** - * Option 2: Use a (non fainted) pokemon that can learn fly to guide you back. - * Receives EXP similar to defeating a Lapras - */ + //Option 2: Use a (non fainted) pokemon that can learn fly to guide you back. new MysteryEncounterOptionBuilder() .withPokemonCanLearnMoveRequirement(OPTION_2_REQUIRED_MOVE) .withOptionMode(EncounterOptionMode.DISABLED_OR_DEFAULT) @@ -91,9 +85,7 @@ export const LostAtSeaEncounter: MysteryEncounter = MysteryEncounterBuilder.with .build() ) .withSimpleOption( - /** - * Option 3: Wander aimlessly. All pokemons lose {@linkcode DAMAGE_PERCENTAGE}}% of their HP (or KO on 0 HP). - */ + // Option 3: Wander aimlessly { buttonLabel: `${namepsace}:option:3:label`, buttonTooltip: `${namepsace}:option:3:tooltip`, @@ -109,13 +101,23 @@ export const LostAtSeaEncounter: MysteryEncounter = MysteryEncounterBuilder.with allowedPokemon.forEach((pkm) => { const percentage = DAMAGE_PERCENTAGE / 100; const damage = Math.floor(pkm.getMaxHp() * percentage); - return applyDamageToPokemon(pkm, damage); + applyDamageToPokemon(pkm, damage); + if (pkm.isFainted()) { + scene.currentBattle.mysteryEncounter.dialogue.outro.push({ + text: `${pkm.name} fainted!`, + }); + } }); leaveEncounterWithoutBattle(scene); return true; } ) + .withOutroDialogue([ + { + text: `${namepsace}:outro`, + }, + ]) .build(); /** diff --git a/src/locales/en/mystery-encounters/lost-at-sea.ts b/src/locales/en/mystery-encounters/lost-at-sea.ts index 9b156f261ec..35d86e44d04 100644 --- a/src/locales/en/mystery-encounters/lost-at-sea.ts +++ b/src/locales/en/mystery-encounters/lost-at-sea.ts @@ -1,8 +1,7 @@ export const lostAtSea = { intro: "Wandering aimlessly, you effectively get nowhere.", title: "Lost at sea", - description: - "The sea is turbulent in this area and you seem to be running out of fuel as well.\nThis is bad. Is there a way out of the situation?", + description: "The sea is turbulent in this area and you seem to be running out of fuel as well.\nThis is bad. Is there a way out of the situation?", query: "What will you do?", option: { 1: { @@ -10,19 +9,23 @@ export const lostAtSea = { 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.\n{{option1PrimaryName}} seems to also have gotten stronger in this time of need.", }, 2: { label: "{{option2PrimaryName}} can 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.\n{{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 it aimlessly until you finally get back on track. You and your Pokémon get very fatigued during the whole ordeal", + selected: `You float about in the boat, steering it aimlessly until you finally get back on track. + $You and your Pokémon get very fatigued during the whole ordeal`, }, }, + outro: "You are back on track." }; From 274ff219430b33502fa4fd004328d202bac2056c Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Wed, 17 Jul 2024 09:53:27 -0700 Subject: [PATCH 147/270] add game-over handling to encounter-phase.-utils it now checks initially if all allowed pokemon are fainted --- .../mystery-encounters/utils/encounter-phase-utils.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/data/mystery-encounters/utils/encounter-phase-utils.ts b/src/data/mystery-encounters/utils/encounter-phase-utils.ts index 88004fae989..76f530cf0db 100644 --- a/src/data/mystery-encounters/utils/encounter-phase-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-phase-utils.ts @@ -9,7 +9,7 @@ import Pokemon, { FieldPosition, PlayerPokemon } from "#app/field/pokemon"; import Trainer, { TrainerVariant } from "../../../field/trainer"; import { ExpBalanceModifier, ExpShareModifier, MultipleParticipantExpBonusModifier, PokemonExpBoosterModifier } from "#app/modifier/modifier"; import { CustomModifierSettings, getModifierPoolForType, ModifierPoolType, ModifierType, ModifierTypeFunc, ModifierTypeGenerator, ModifierTypeOption, modifierTypes, PokemonHeldItemModifierType, regenerateModifierPoolThresholds } from "#app/modifier/modifier-type"; -import { BattleEndPhase, EggLapsePhase, ExpPhase, ModifierRewardPhase, SelectModifierPhase, ShowPartyExpBarPhase, TrainerVictoryPhase } from "#app/phases"; +import { BattleEndPhase, EggLapsePhase, ExpPhase, GameOverPhase, ModifierRewardPhase, SelectModifierPhase, ShowPartyExpBarPhase, TrainerVictoryPhase } from "#app/phases"; import { MysteryEncounterBattlePhase, MysteryEncounterPhase, MysteryEncounterRewardsPhase } from "#app/phases/mystery-encounter-phase"; import * as Utils from "../../../utils"; import { isNullOrUndefined } from "#app/utils"; @@ -521,7 +521,11 @@ export function leaveEncounterWithoutBattle(scene: BattleScene, addHealPhase: bo } export function handleMysteryEncounterVictory(scene: BattleScene, addHealPhase: boolean = false) { - if (scene.currentBattle.mysteryEncounter.encounterVariant === MysteryEncounterVariant.SAFARI_BATTLE) { + const allowedPkm = scene.getParty().filter((pkm) => pkm.isAllowedInBattle()); + if (allowedPkm.length === 0) { + scene.clearPhaseQueue(); + scene.unshiftPhase(new GameOverPhase(scene)); + } else if (scene.currentBattle.mysteryEncounter.encounterVariant === MysteryEncounterVariant.SAFARI_BATTLE) { scene.pushPhase(new MysteryEncounterRewardsPhase(scene, addHealPhase)); } else if (scene.currentBattle.mysteryEncounter.encounterVariant === MysteryEncounterVariant.NO_BATTLE) { scene.pushPhase(new EggLapsePhase(scene)); From 6451eb8049b521f8d0a8bc1eb142fc18d336f3cc Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Wed, 17 Jul 2024 09:54:02 -0700 Subject: [PATCH 148/270] lost-at-sea enc.: add `fainted` msg display --- .../encounters/lost-at-sea-encounter.ts | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) 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 d32d9025346..d06aaff5be8 100644 --- a/src/data/mystery-encounters/encounters/lost-at-sea-encounter.ts +++ b/src/data/mystery-encounters/encounters/lost-at-sea-encounter.ts @@ -1,8 +1,10 @@ import { Moves } from "#app/enums/moves"; +import { getPokemonNameWithAffix } from "#app/messages"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import BattleScene from "../../../battle-scene"; import MysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier } from "../mystery-encounter"; import { EncounterOptionMode, MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; +import { showEncounterText } from "../utils/encounter-dialogue-utils"; import { applyDamageToPokemon, leaveEncounterWithoutBattle, setEncounterExp } from "../utils/encounter-phase-utils"; const OPTION_1_REQUIRED_MOVE = Moves.SURF; @@ -96,18 +98,20 @@ export const LostAtSeaEncounter: MysteryEncounter = MysteryEncounterBuilder.with ], }, async (scene: BattleScene) => { + const { mysteryEncounter } = scene.currentBattle; const allowedPokemon = scene.getParty().filter((p) => p.isAllowedInBattle()); - allowedPokemon.forEach((pkm) => { + for (const pkm of allowedPokemon) { const percentage = DAMAGE_PERCENTAGE / 100; const damage = Math.floor(pkm.getMaxHp() * percentage); applyDamageToPokemon(pkm, damage); + if (pkm.isFainted()) { - scene.currentBattle.mysteryEncounter.dialogue.outro.push({ - text: `${pkm.name} fainted!`, - }); + mysteryEncounter.setDialogueToken("pokemonNameWithAffix", getPokemonNameWithAffix(pkm)); + await showEncounterText(scene, "battle:fainted"); } - }); + } + leaveEncounterWithoutBattle(scene); return true; From a862dabcd1f38dbda0f9e7cd132b0a84baf2d283 Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Wed, 17 Jul 2024 10:10:40 -0700 Subject: [PATCH 149/270] optimize handleMysteryEncounterVictory --- src/data/mystery-encounters/utils/encounter-phase-utils.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/data/mystery-encounters/utils/encounter-phase-utils.ts b/src/data/mystery-encounters/utils/encounter-phase-utils.ts index 76f530cf0db..3f600a0f389 100644 --- a/src/data/mystery-encounters/utils/encounter-phase-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-phase-utils.ts @@ -522,10 +522,14 @@ export function leaveEncounterWithoutBattle(scene: BattleScene, addHealPhase: bo export function handleMysteryEncounterVictory(scene: BattleScene, addHealPhase: boolean = false) { const allowedPkm = scene.getParty().filter((pkm) => pkm.isAllowedInBattle()); + if (allowedPkm.length === 0) { scene.clearPhaseQueue(); scene.unshiftPhase(new GameOverPhase(scene)); - } else if (scene.currentBattle.mysteryEncounter.encounterVariant === MysteryEncounterVariant.SAFARI_BATTLE) { + return; + } + + if (scene.currentBattle.mysteryEncounter.encounterVariant === MysteryEncounterVariant.SAFARI_BATTLE) { scene.pushPhase(new MysteryEncounterRewardsPhase(scene, addHealPhase)); } else if (scene.currentBattle.mysteryEncounter.encounterVariant === MysteryEncounterVariant.NO_BATTLE) { scene.pushPhase(new EggLapsePhase(scene)); From 78cbc226930efd411db4942a6d79a4b0216e2ec8 Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Wed, 17 Jul 2024 10:11:34 -0700 Subject: [PATCH 150/270] myst. chest enc.: remove manual game-over check --- .../encounters/mysterious-chest-encounter.ts | 23 +++++++++---------- 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts b/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts index 7773e03501b..419179b4ecc 100644 --- a/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts +++ b/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts @@ -1,10 +1,10 @@ +import { queueEncounterMessage, showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; import { leaveEncounterWithoutBattle, setEncounterRewards } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { getHighestLevelPlayerPokemon, koPlayerPokemon } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; import { ModifierTier } from "#app/modifier/modifier-tier"; -import { GameOverPhase } from "#app/phases"; -import { randSeedInt } from "#app/utils"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import BattleScene from "../../../battle-scene"; import IMysteryEncounter, { @@ -12,8 +12,6 @@ import IMysteryEncounter, { MysteryEncounterTier, } from "../mystery-encounter"; import { EncounterOptionMode, MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; -import { queueEncounterMessage, showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; -import { getHighestLevelPlayerPokemon, koPlayerPokemon } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; export const MysteriousChestEncounter: IMysteryEncounter = MysteryEncounterBuilder.withEncounterType( @@ -62,7 +60,8 @@ export const MysteriousChestEncounter: IMysteryEncounter = }) .withOptionPhase(async (scene: BattleScene) => { // Open the chest - const roll = randSeedInt(100); + // const roll = randSeedInt(100); + const roll = 0; if (roll > 60) { // Choose between 2 COMMON / 2 GREAT tier items (40%) setEncounterRewards(scene, { @@ -117,13 +116,13 @@ export const MysteriousChestEncounter: IMysteryEncounter = // Does this synchronously so that game over doesn't happen over result message await showEncounterText(scene, "mysteryEncounter:mysterious_chest_option_1_bad_result") .then(() => { - if (scene.getParty().filter((p) => p.isAllowedInBattle()).length === 0) { - // All pokemon fainted, game over - scene.clearPhaseQueue(); - scene.unshiftPhase(new GameOverPhase(scene)); - } else { - leaveEncounterWithoutBattle(scene); - } + // if (scene.getParty().filter((p) => p.isAllowedInBattle()).length === 0) { + // // All pokemon fainted, game over + // scene.clearPhaseQueue(); + // scene.unshiftPhase(new GameOverPhase(scene)); + // } else { + leaveEncounterWithoutBattle(scene); + // } }); } }) From ad259c9e8f7aae9416bb50781d3abbea7e10cae1 Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Wed, 17 Jul 2024 10:36:09 -0700 Subject: [PATCH 151/270] MysteriousChestEncounter: revert debugging change (whops) --- .../encounters/mysterious-chest-encounter.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts b/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts index 419179b4ecc..5842ab407a3 100644 --- a/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts +++ b/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts @@ -5,6 +5,7 @@ import { } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { getHighestLevelPlayerPokemon, koPlayerPokemon } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; import { ModifierTier } from "#app/modifier/modifier-tier"; +import { randSeedInt } from "#app/utils.js"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import BattleScene from "../../../battle-scene"; import IMysteryEncounter, { @@ -60,8 +61,7 @@ export const MysteriousChestEncounter: IMysteryEncounter = }) .withOptionPhase(async (scene: BattleScene) => { // Open the chest - // const roll = randSeedInt(100); - const roll = 0; + const roll = randSeedInt(100); if (roll > 60) { // Choose between 2 COMMON / 2 GREAT tier items (40%) setEncounterRewards(scene, { From ebd8eedd1e4d8318fda201379f3e7b98b1953cb0 Mon Sep 17 00:00:00 2001 From: flx-sta <50131232+flx-sta@users.noreply.github.com> Date: Wed, 17 Jul 2024 10:55:14 -0700 Subject: [PATCH 152/270] Update src/locales/en/mystery-encounters/lost-at-sea.ts Co-authored-by: Asdar --- src/locales/en/mystery-encounters/lost-at-sea.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/locales/en/mystery-encounters/lost-at-sea.ts b/src/locales/en/mystery-encounters/lost-at-sea.ts index 35d86e44d04..7e44c02e6be 100644 --- a/src/locales/en/mystery-encounters/lost-at-sea.ts +++ b/src/locales/en/mystery-encounters/lost-at-sea.ts @@ -24,7 +24,7 @@ export const lostAtSea = { label: "Wander aimlessly", tooltip: "(-) Each of your Pokémon lose {{damagePercentage}}% of their total HP.", selected: `You float about in the boat, steering it aimlessly until you finally get back on track. - $You and your Pokémon get very fatigued during the whole ordeal`, + $You and your Pokémon get very fatigued during the whole ordeal.`, }, }, outro: "You are back on track." From 36dd3798e67ae18a2a3e467fee44acd60ca98ac1 Mon Sep 17 00:00:00 2001 From: flx-sta <50131232+flx-sta@users.noreply.github.com> Date: Wed, 17 Jul 2024 10:55:29 -0700 Subject: [PATCH 153/270] Update src/locales/en/mystery-encounters/lost-at-sea.ts Co-authored-by: Asdar --- src/locales/en/mystery-encounters/lost-at-sea.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/locales/en/mystery-encounters/lost-at-sea.ts b/src/locales/en/mystery-encounters/lost-at-sea.ts index 7e44c02e6be..71743afb2db 100644 --- a/src/locales/en/mystery-encounters/lost-at-sea.ts +++ b/src/locales/en/mystery-encounters/lost-at-sea.ts @@ -7,7 +7,7 @@ export const lostAtSea = { 1: { label: "{{option1PrimaryName}} can help", label_disabled: "Can't {{option1RequiredMove}}", - tooltip: "{{option1PrimaryName}} saves you.\n{{option1PrimaryName}} gains some EXP.", + 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.", From 2b47cd2a56f879c950302200c03f674e1c329e25 Mon Sep 17 00:00:00 2001 From: flx-sta <50131232+flx-sta@users.noreply.github.com> Date: Wed, 17 Jul 2024 10:55:43 -0700 Subject: [PATCH 154/270] Update src/locales/en/mystery-encounters/lost-at-sea.ts Co-authored-by: Asdar --- src/locales/en/mystery-encounters/lost-at-sea.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/locales/en/mystery-encounters/lost-at-sea.ts b/src/locales/en/mystery-encounters/lost-at-sea.ts index 71743afb2db..ec016c3e169 100644 --- a/src/locales/en/mystery-encounters/lost-at-sea.ts +++ b/src/locales/en/mystery-encounters/lost-at-sea.ts @@ -1,7 +1,7 @@ export const lostAtSea = { intro: "Wandering aimlessly, you effectively get nowhere.", title: "Lost at sea", - description: "The sea is turbulent in this area and you seem to be running out of fuel as well.\nThis is bad. Is there a way out of the situation?", + description: "The sea is turbulent in this area, and you seem to be running out of fuel.\nThis is bad. Is there a way out of the situation?", query: "What will you do?", option: { 1: { From de4d0f7d7955c627ac4e4d66e1ad355fc51f50e1 Mon Sep 17 00:00:00 2001 From: flx-sta <50131232+flx-sta@users.noreply.github.com> Date: Wed, 17 Jul 2024 10:57:26 -0700 Subject: [PATCH 155/270] Update src/locales/en/mystery-encounters/lost-at-sea.ts Co-authored-by: Asdar --- src/locales/en/mystery-encounters/lost-at-sea.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/locales/en/mystery-encounters/lost-at-sea.ts b/src/locales/en/mystery-encounters/lost-at-sea.ts index ec016c3e169..6e37168a255 100644 --- a/src/locales/en/mystery-encounters/lost-at-sea.ts +++ b/src/locales/en/mystery-encounters/lost-at-sea.ts @@ -15,7 +15,7 @@ export const lostAtSea = { 2: { label: "{{option2PrimaryName}} can help", label_disabled: "Can't {{option2RequiredMove}}", - tooltip: "{{option2PrimaryName}} saves you.\n{{option2PrimaryName}} gains some EXP.", + 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.", From 35ede48153a721e385fa00b11859b15eb6dba1f6 Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Wed, 17 Jul 2024 14:45:12 -0700 Subject: [PATCH 156/270] encounter-phase-utils: update applyHpChangeToPokemon method family - now automatically queues a battle:fainted msg on KO --- .../utils/encounter-phase-utils.ts | 58 ++++++++++--------- 1 file changed, 30 insertions(+), 28 deletions(-) diff --git a/src/data/mystery-encounters/utils/encounter-phase-utils.ts b/src/data/mystery-encounters/utils/encounter-phase-utils.ts index 3f600a0f389..17090467da9 100644 --- a/src/data/mystery-encounters/utils/encounter-phase-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-phase-utils.ts @@ -1,30 +1,31 @@ -import i18next from "i18next"; import { BattleType } from "#app/battle"; -import BattleScene from "../../../battle-scene"; -import PokemonSpecies from "../../pokemon-species"; -import { MysteryEncounterVariant } from "../mystery-encounter"; -import { Status, StatusEffect } from "../../status-effect"; -import { TrainerConfig, trainerConfigs, TrainerSlot } from "../../trainer-config"; +import { biomeLinks } from "#app/data/biomes"; +import MysteryEncounterOption from "#app/data/mystery-encounters/mystery-encounter-option"; +import { WIGHT_INCREMENT_ON_SPAWN_MISS } from "#app/data/mystery-encounters/mystery-encounters"; +import { queueEncounterMessage, showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; import Pokemon, { FieldPosition, PlayerPokemon } from "#app/field/pokemon"; -import Trainer, { TrainerVariant } from "../../../field/trainer"; +import { getPokemonNameWithAffix } from "#app/messages"; import { ExpBalanceModifier, ExpShareModifier, MultipleParticipantExpBonusModifier, PokemonExpBoosterModifier } from "#app/modifier/modifier"; import { CustomModifierSettings, getModifierPoolForType, ModifierPoolType, ModifierType, ModifierTypeFunc, ModifierTypeGenerator, ModifierTypeOption, modifierTypes, PokemonHeldItemModifierType, regenerateModifierPoolThresholds } from "#app/modifier/modifier-type"; +import * as Overrides from "#app/overrides"; import { BattleEndPhase, EggLapsePhase, ExpPhase, GameOverPhase, ModifierRewardPhase, SelectModifierPhase, ShowPartyExpBarPhase, TrainerVictoryPhase } from "#app/phases"; import { MysteryEncounterBattlePhase, MysteryEncounterPhase, MysteryEncounterRewardsPhase } from "#app/phases/mystery-encounter-phase"; -import * as Utils from "../../../utils"; -import { isNullOrUndefined } from "#app/utils"; -import { TrainerType } from "#enums/trainer-type"; -import { BattlerTagType } from "#enums/battler-tag-type"; import PokemonData from "#app/system/pokemon-data"; -import { Biome } from "#enums/biome"; -import { biomeLinks } from "#app/data/biomes"; -import { Mode } from "#app/ui/ui"; -import { PartyOption, PartyUiMode } from "#app/ui/party-ui-handler"; import { OptionSelectConfig, OptionSelectItem } from "#app/ui/abstact-option-select-ui-handler"; -import { WIGHT_INCREMENT_ON_SPAWN_MISS } from "#app/data/mystery-encounters/mystery-encounters"; -import * as Overrides from "#app/overrides"; -import MysteryEncounterOption from "#app/data/mystery-encounters/mystery-encounter-option"; -import { showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; +import { PartyOption, PartyUiMode } from "#app/ui/party-ui-handler"; +import { Mode } from "#app/ui/ui"; +import { isNullOrUndefined } from "#app/utils"; +import { BattlerTagType } from "#enums/battler-tag-type"; +import { Biome } from "#enums/biome"; +import { TrainerType } from "#enums/trainer-type"; +import i18next from "i18next"; +import BattleScene from "../../../battle-scene"; +import Trainer, { TrainerVariant } from "../../../field/trainer"; +import * as Utils from "../../../utils"; +import PokemonSpecies from "../../pokemon-species"; +import { Status, StatusEffect } from "../../status-effect"; +import { TrainerConfig, trainerConfigs, TrainerSlot } from "../../trainer-config"; +import { MysteryEncounterVariant } from "../mystery-encounter"; export class EnemyPokemonConfig { species: PokemonSpecies; @@ -699,16 +700,17 @@ export function koPlayerPokemon(pokemon: PlayerPokemon) { * Handles applying hp changes to a player pokemon. * Takes care of not going below `0`, above max-hp, adding `FNT` status correctly and updating the pokemon info. * TODO: handle special cases like wonder-guard/ninjask - * + * @param scene the battle scene * @param pokemon the player pokemon to apply the hp change to - * @param damage the hp change amount. Positive for heal. Negative for damage + * @param value the hp change amount. Positive for heal. Negative for damage * */ -function applyHpChangeToPokemon(pokemon: PlayerPokemon, value: number) { +function applyHpChangeToPokemon(scene: BattleScene, pokemon: PlayerPokemon, value: number) { const hpChange = Math.round(pokemon.hp + value); const nextHp = Math.max(Math.min(hpChange, pokemon.getMaxHp()), 0); if (nextHp === 0) { koPlayerPokemon(pokemon); + queueEncounterMessage(scene, i18next.t("battle:fainted", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); } else { pokemon.hp = nextHp; } @@ -716,30 +718,30 @@ function applyHpChangeToPokemon(pokemon: PlayerPokemon, value: number) { /** * Handles applying damage to a player pokemon - * + * @param scene the battle scene * @param pokemon the player pokemon to apply damage to * @param damage the amount of damage to apply * @see {@linkcode applyHpChangeToPokemon} */ -export function applyDamageToPokemon(pokemon: PlayerPokemon, damage: number) { +export function applyDamageToPokemon(scene: BattleScene, pokemon: PlayerPokemon, damage: number) { if (damage <= 0) { console.warn("Healing pokemon with `applyDamageToPokemon` is not recommended! Please use `applyHealToPokemon` instead."); } - applyHpChangeToPokemon(pokemon, -damage); + applyHpChangeToPokemon(scene, pokemon, -damage); } /** * Handles applying heal to a player pokemon - * + * @param scene the battle scene * @param pokemon the player pokemon to apply heal to * @param heal the amount of heal to apply * @see {@linkcode applyHpChangeToPokemon} */ -export function applyHealToPokemon(pokemon: PlayerPokemon, heal: number) { +export function applyHealToPokemon(scene: BattleScene, pokemon: PlayerPokemon, heal: number) { if (heal <= 0) { console.warn("Damaging pokemong with `applyHealToPokemon` is not recommended! Please use `applyDamageToPokemon` instead."); } - applyHpChangeToPokemon(pokemon, heal); + applyHpChangeToPokemon(scene, pokemon, heal); } From ada6eee88463cef76be750c9ed4b8a9945d2407b Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Wed, 17 Jul 2024 14:45:49 -0700 Subject: [PATCH 157/270] lost-at-sea-encounter: remove fainted msg code this is automatically handled in the encounter-phase-utils now --- .../encounters/lost-at-sea-encounter.ts | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) 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 d06aaff5be8..49d670a29d5 100644 --- a/src/data/mystery-encounters/encounters/lost-at-sea-encounter.ts +++ b/src/data/mystery-encounters/encounters/lost-at-sea-encounter.ts @@ -1,10 +1,8 @@ import { Moves } from "#app/enums/moves"; -import { getPokemonNameWithAffix } from "#app/messages"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import BattleScene from "../../../battle-scene"; import MysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier } from "../mystery-encounter"; import { EncounterOptionMode, MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; -import { showEncounterText } from "../utils/encounter-dialogue-utils"; import { applyDamageToPokemon, leaveEncounterWithoutBattle, setEncounterExp } from "../utils/encounter-phase-utils"; const OPTION_1_REQUIRED_MOVE = Moves.SURF; @@ -98,18 +96,12 @@ export const LostAtSeaEncounter: MysteryEncounter = MysteryEncounterBuilder.with ], }, async (scene: BattleScene) => { - const { mysteryEncounter } = scene.currentBattle; const allowedPokemon = scene.getParty().filter((p) => p.isAllowedInBattle()); for (const pkm of allowedPokemon) { const percentage = DAMAGE_PERCENTAGE / 100; const damage = Math.floor(pkm.getMaxHp() * percentage); - applyDamageToPokemon(pkm, damage); - - if (pkm.isFainted()) { - mysteryEncounter.setDialogueToken("pokemonNameWithAffix", getPokemonNameWithAffix(pkm)); - await showEncounterText(scene, "battle:fainted"); - } + applyDamageToPokemon(scene, pkm, damage); } leaveEncounterWithoutBattle(scene); From 09808887b739ccd949e45e67ee3d31e5606685e0 Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Wed, 17 Jul 2024 14:51:20 -0700 Subject: [PATCH 158/270] add .github/workflows/mystery-event.yml --- .github/workflows/mystery-event.yml | 54 +++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 .github/workflows/mystery-event.yml diff --git a/.github/workflows/mystery-event.yml b/.github/workflows/mystery-event.yml new file mode 100644 index 00000000000..448ce8f3e43 --- /dev/null +++ b/.github/workflows/mystery-event.yml @@ -0,0 +1,54 @@ +# These are workflows use exclusively for the mystery events sub-project +# It's basically a copy of eslint.yml & test.yml just aimed at a different branch + +name: Mystery Events workflows + +on: + # Trigger the workflow on push or pull request, + # but only for the mystery-battle-events branch + push: + branches: + - mystery-battle-events # Trigger on push events to the mystery-battle-events branch + pull_request: + branches: + - mystery-battle-events # Trigger on pull request events targeting the mystery-battle-events branch + +jobs: + run-linters: # Define a job named "run-linters" + name: Run linters # Human-readable name for the job + runs-on: ubuntu-latest # Specify the latest Ubuntu runner for the job + + steps: + - name: Check out Git repository # Step to check out the repository + uses: actions/checkout@v2 # Use the checkout action version 2 + + - name: Set up Node.js # Step to set up Node.js environment + uses: actions/setup-node@v1 # Use the setup-node action version 1 + with: + node-version: 20 # Specify Node.js version 20 + + - name: Install Node.js dependencies # Step to install Node.js dependencies + run: npm ci # Use 'npm ci' to install dependencies + + - name: eslint # Step to run linters + run: npm run eslint-ci + run-tests: # Define a job named "run-tests" + + run-tests: # Define a job named "run-tests" + name: Run tests # Human-readable name for the job + runs-on: ubuntu-latest # Specify the latest Ubuntu runner for the job + + steps: + - name: Check out Git repository # Step to check out the repository + uses: actions/checkout@v4 # Use the checkout action version 4 + + - name: Set up Node.js # Step to set up Node.js environment + uses: actions/setup-node@v4 # Use the setup-node action version 4 + with: + node-version: 20 # Specify Node.js version 20 + + - name: Install Node.js dependencies # Step to install Node.js dependencies + run: npm ci # Use 'npm ci' to install dependencies + + - name: tests # Step to run tests + run: npm run test:silent \ No newline at end of file From ad222513cbb163be0e98789b7d35e041f578f162 Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Wed, 17 Jul 2024 14:57:04 -0700 Subject: [PATCH 159/270] update mystery-event.yml --- .github/workflows/mystery-event.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/mystery-event.yml b/.github/workflows/mystery-event.yml index 448ce8f3e43..016ea7abdba 100644 --- a/.github/workflows/mystery-event.yml +++ b/.github/workflows/mystery-event.yml @@ -32,8 +32,7 @@ jobs: - name: eslint # Step to run linters run: npm run eslint-ci - run-tests: # Define a job named "run-tests" - + run-tests: # Define a job named "run-tests" name: Run tests # Human-readable name for the job runs-on: ubuntu-latest # Specify the latest Ubuntu runner for the job @@ -51,4 +50,4 @@ jobs: run: npm ci # Use 'npm ci' to install dependencies - name: tests # Step to run tests - run: npm run test:silent \ No newline at end of file + run: npm run test:silent From fe2888be4b28e873c182f9aef55c33918428f88c Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Wed, 17 Jul 2024 15:08:08 -0700 Subject: [PATCH 160/270] mystery encounters: resolve review comments: Lost at Sea: -fix typo in handlePokemonGuidingYouPhase function Mysterious Chest: - remove obsolete commented code mystery-encounter.ts - remove unused `onDone` field from MysteryEncounterBuilder --- .../encounters/lost-at-sea-encounter.ts | 13 +++++++------ .../encounters/mysterious-chest-encounter.ts | 13 +++---------- src/data/mystery-encounters/mystery-encounter.ts | 1 - 3 files changed, 10 insertions(+), 17 deletions(-) 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 49d670a29d5..9e25e003e1b 100644 --- a/src/data/mystery-encounters/encounters/lost-at-sea-encounter.ts +++ b/src/data/mystery-encounters/encounters/lost-at-sea-encounter.ts @@ -1,4 +1,6 @@ +import { getPokemonSpecies } from "#app/data/pokemon-species.js"; import { Moves } from "#app/enums/moves"; +import { Species } from "#app/enums/species.js"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import BattleScene from "../../../battle-scene"; import MysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier } from "../mystery-encounter"; @@ -62,7 +64,7 @@ export const LostAtSeaEncounter: MysteryEncounter = MysteryEncounterBuilder.with }, ], }) - .withOptionPhase(async (scene: BattleScene) => handlePokemongGuidingYouPhase(scene)) + .withOptionPhase(async (scene: BattleScene) => handlePokemonGuidingYouPhase(scene)) .build() ) .withOption( @@ -81,7 +83,7 @@ export const LostAtSeaEncounter: MysteryEncounter = MysteryEncounterBuilder.with }, ], }) - .withOptionPhase(async (scene: BattleScene) => handlePokemongGuidingYouPhase(scene)) + .withOptionPhase(async (scene: BattleScene) => handlePokemonGuidingYouPhase(scene)) .build() ) .withSimpleOption( @@ -122,13 +124,12 @@ export const LostAtSeaEncounter: MysteryEncounter = MysteryEncounterBuilder.with * @param scene Battle scene * @param guidePokemon pokemon choosen as a guide */ -function handlePokemongGuidingYouPhase(scene: BattleScene) { - /** Base EXP value for guiding pokemon. Currently Lapras base-value */ - const baseExpValue: number = 187; +function handlePokemonGuidingYouPhase(scene: BattleScene) { + const laprasSpecies = getPokemonSpecies(Species.LAPRAS); const { mysteryEncounter } = scene.currentBattle; if (mysteryEncounter.selectedOption) { - setEncounterExp(scene, mysteryEncounter.selectedOption.primaryPokemon.id, baseExpValue, true); + setEncounterExp(scene, mysteryEncounter.selectedOption.primaryPokemon.id, laprasSpecies.baseExp, true); } else { console.warn("Lost at sea: No guide pokemon found but pokemon guides player. huh!?"); } diff --git a/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts b/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts index 5842ab407a3..9a0a42af2c8 100644 --- a/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts +++ b/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts @@ -114,16 +114,9 @@ export const MysteriousChestEncounter: IMysteryEncounter = scene.currentBattle.mysteryEncounter.setDialogueToken("pokeName", highestLevelPokemon.name); // Show which Pokemon was KOed, then leave encounter with no rewards // Does this synchronously so that game over doesn't happen over result message - await showEncounterText(scene, "mysteryEncounter:mysterious_chest_option_1_bad_result") - .then(() => { - // if (scene.getParty().filter((p) => p.isAllowedInBattle()).length === 0) { - // // All pokemon fainted, game over - // scene.clearPhaseQueue(); - // scene.unshiftPhase(new GameOverPhase(scene)); - // } else { - leaveEncounterWithoutBattle(scene); - // } - }); + await showEncounterText(scene, "mysteryEncounter:mysterious_chest_option_1_bad_result").then(() => { + leaveEncounterWithoutBattle(scene); + }); } }) .build() diff --git a/src/data/mystery-encounters/mystery-encounter.ts b/src/data/mystery-encounters/mystery-encounter.ts index 983be1fdb2a..c6fc8c1ca66 100644 --- a/src/data/mystery-encounters/mystery-encounter.ts +++ b/src/data/mystery-encounters/mystery-encounter.ts @@ -363,7 +363,6 @@ export class MysteryEncounterBuilder implements Partial { doEncounterExp?: (scene: BattleScene) => boolean; doEncounterRewards?: (scene: BattleScene) => boolean; onInit?: (scene: BattleScene) => boolean; - onDone?: (scene: BattleScene) => boolean; hideBattleIntroMessage?: boolean; hideIntroVisuals?: boolean; enemyPartyConfigs?: EnemyPartyConfig[] = []; From 918320079aa719eeaa7f7cb060702613e56dad6e Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Wed, 17 Jul 2024 15:09:17 -0700 Subject: [PATCH 161/270] fix typo in CanLearnMoveRequirementOptions --- src/data/mystery-encounters/mystery-encounter-option.ts | 6 +++--- .../requirements/can-learn-move-requirement.ts | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/data/mystery-encounters/mystery-encounter-option.ts b/src/data/mystery-encounters/mystery-encounter-option.ts index b02cfd351a4..c7feb2688c3 100644 --- a/src/data/mystery-encounters/mystery-encounter-option.ts +++ b/src/data/mystery-encounters/mystery-encounter-option.ts @@ -5,7 +5,7 @@ import BattleScene from "../../battle-scene"; import * as Utils from "../../utils"; import { Type } from "../type"; import { EncounterPokemonRequirement, EncounterSceneRequirement, MoneyRequirement, TypeRequirement } from "./mystery-encounter-requirements"; -import { CanLearnMoveRequirement, CanlearnMoveRequirementOptions } from "./requirements/can-learn-move-requirement"; +import { CanLearnMoveRequirement, CanLearnMoveRequirementOptions } from "./requirements/can-learn-move-requirement"; export enum EncounterOptionMode { /** Default style */ @@ -202,10 +202,10 @@ export class MysteryEncounterOptionBuilder implements Partial Date: Wed, 17 Jul 2024 15:10:50 -0700 Subject: [PATCH 162/270] remove redundance from Pokemon.isAllowedInBattle() --- src/field/pokemon.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 279ffeccc42..3221aac18aa 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -274,8 +274,6 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * @returns {boolean} True if pokemon is allowed in battle */ isAllowedInBattle(): boolean { - const challengeAllowed = new Utils.BooleanHolder(true); - applyChallenges(this.scene.gameMode, ChallengeType.POKEMON_IN_BATTLE, this, challengeAllowed); return !this.isFainted() && this.isAllowed(); } From 96d0df42fc3530ad2dba7e3db95f2987e8446f5f Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Wed, 17 Jul 2024 15:11:17 -0700 Subject: [PATCH 163/270] chore: jsdoc formatting --- src/field/pokemon.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 3221aac18aa..ebae5fe8122 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -278,10 +278,10 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } /** - * Check if this pokemon is allowed (no challenge exclusion) - * This is frequently a better alternative to {@link isFainted} - * @returns {boolean} True if pokemon is allowed in battle - */ + * Check if this pokemon is allowed (no challenge exclusion) + * This is frequently a better alternative to {@link isFainted} + * @returns {boolean} True if pokemon is allowed in battle + */ isAllowed(): boolean { const challengeAllowed = new Utils.BooleanHolder(true); applyChallenges(this.scene.gameMode, ChallengeType.POKEMON_IN_BATTLE, this, challengeAllowed); From 6e97bca0ad3abc18ac46a2a261e081153a182ccf Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Wed, 17 Jul 2024 15:31:12 -0700 Subject: [PATCH 164/270] fix lost-at-sea tests --- .../encounters/lost-at-sea-encounter.test.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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 928da9760d4..1b2bc157772 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 @@ -28,9 +28,9 @@ describe("Lost at Sea - Mystery Encounter", () => { game = new GameManager(phaserGame); game.override.mysteryEncounterChance(100); game.override.startingBiome(Biome.SEA); - vi.spyOn(MysteryEncounters, "allMysteryEncounters", "get").mockReturnValue({ - [MysteryEncounterType.LOST_AT_SEA]: LostAtSeaEncounter, - }); + vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue( + new Map([[Biome.SEA, [MysteryEncounterType.LOST_AT_SEA]]]) + ); }); afterEach(() => { From 3fd79984cd3c6d85a0585db08babc348a0739dc6 Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Wed, 17 Jul 2024 16:06:08 -0700 Subject: [PATCH 165/270] add fallback for biomeMysteryEncounters if empty --- src/battle-scene.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle-scene.ts b/src/battle-scene.ts index c0a3f0b090a..6cde5929308 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -2678,7 +2678,7 @@ export default class BattleScene extends SceneBase { let availableEncounters: IMysteryEncounter[] = []; // New encounter will never be the same as the most recent encounter const previousEncounter = this.mysteryEncounterData.encounteredEvents?.length > 0 ? this.mysteryEncounterData.encounteredEvents[this.mysteryEncounterData.encounteredEvents.length - 1][0] : null; - const biomeMysteryEncounters = mysteryEncountersByBiome.get(this.arena.biomeType); + const biomeMysteryEncounters = mysteryEncountersByBiome.get(this.arena.biomeType) ?? []; // If no valid encounters exist at tier, checks next tier down, continuing until there are some encounters available while (availableEncounters.length === 0 && tier >= 0) { availableEncounters = biomeMysteryEncounters From 41cacde623f5f25c8f7bb9df86d4206f44c5ccb8 Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Wed, 17 Jul 2024 16:23:31 -0700 Subject: [PATCH 166/270] lost-at-sea-encounter: fix and extend tests --- .../encounters/lost-at-sea-encounter.test.ts | 27 +++++++++++++------ 1 file changed, 19 insertions(+), 8 deletions(-) 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 1b2bc157772..03d7eb90820 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 @@ -3,6 +3,7 @@ import { LostAtSeaEncounter } from "#app/data/mystery-encounters/encounters/lost import { EncounterOptionMode } from "#app/data/mystery-encounters/mystery-encounter-option"; import * as MysteryEncounters from "#app/data/mystery-encounters/mystery-encounters"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { getPokemonSpecies } from "#app/data/pokemon-species.js"; import { Biome } from "#app/enums/biome"; import { Moves } from "#app/enums/moves"; import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; @@ -15,6 +16,8 @@ import { runSelectMysteryEncounterOption } from "../encounterTestUtils"; const namepsace = "mysteryEncounter:lostAtSea"; /** Blastoise for surf. Pidgeot for fly. Abra for none. */ const defaultParty = [Species.BLASTOISE, Species.PIDGEOT, Species.ABRA]; +const defaultBiome = Biome.SEA; +const defaultWave = 33; describe("Lost at Sea - Mystery Encounter", () => { let phaserGame: Phaser.Game; @@ -24,10 +27,14 @@ describe("Lost at Sea - Mystery Encounter", () => { phaserGame = new Phaser.Game({ type: Phaser.HEADLESS }); }); - beforeEach(() => { + beforeEach(async () => { game = new GameManager(phaserGame); game.override.mysteryEncounterChance(100); - game.override.startingBiome(Biome.SEA); + game.override.startingBiome(defaultBiome); + game.override.startingWave(defaultWave); + vi.spyOn(MysteryEncounters, "allMysteryEncounters", "get").mockReturnValue({ + [MysteryEncounterType.LOST_AT_SEA]: LostAtSeaEncounter, + }); vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue( new Map([[Biome.SEA, [MysteryEncounterType.LOST_AT_SEA]]]) ); @@ -38,7 +45,8 @@ describe("Lost at Sea - Mystery Encounter", () => { }); it("should have the correct properties", async () => { - await game.runToMysteryEncounter([Species.ABRA]); + await workaround_reInitSceneWithOverrides(game); + await game.runToMysteryEncounter(defaultParty); expect(LostAtSeaEncounter.encounterType).toBe(MysteryEncounterType.LOST_AT_SEA); expect(LostAtSeaEncounter.dialogue).toBeDefined(); @@ -50,7 +58,12 @@ describe("Lost at Sea - Mystery Encounter", () => { }); it("should not run outside of sea biome", async () => { - // TODO: a little tricky + game.override.startingBiome(Biome.MOUNTAIN); + + await workaround_reInitSceneWithOverrides(game); + + //expect the `TypeError: Cannot read properties of undefined (reading 'introVisuals')` error + await expect(() => game.runToMysteryEncounter()).rejects.toThrowError(/introVisuals/); }); it("should not run below wave 11", async () => { @@ -103,9 +116,7 @@ describe("Lost at Sea - Mystery Encounter", () => { }); it("should award exp to surfable PKM (Blastoise)", async () => { - const laprasBaseExp = 187; - const wave = 33; - game.override.startingWave(wave); + const laprasSpecies = getPokemonSpecies(Species.LAPRAS); await workaround_reInitSceneWithOverrides(game); await game.runToMysteryEncounter(defaultParty); @@ -115,7 +126,7 @@ describe("Lost at Sea - Mystery Encounter", () => { await runSelectMysteryEncounterOption(game, 2); - expect(blastoise.exp).toBe(expBefore + laprasBaseExp * wave); + expect(blastoise.exp).toBe(expBefore + laprasSpecies.baseExp * defaultWave); }); it("should leave encounter without battle", async () => { From 3e6183cd5066caa0872c59ead15068d7d710ea85 Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Wed, 17 Jul 2024 16:24:34 -0700 Subject: [PATCH 167/270] move "battle:fainted" into `koPlayerPokemon` --- src/data/mystery-encounters/utils/encounter-phase-utils.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/data/mystery-encounters/utils/encounter-phase-utils.ts b/src/data/mystery-encounters/utils/encounter-phase-utils.ts index 17090467da9..ffaf11b8219 100644 --- a/src/data/mystery-encounters/utils/encounter-phase-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-phase-utils.ts @@ -688,12 +688,14 @@ export function calculateMEAggregateStats(scene: BattleScene, baseSpawnWeight: n /** * Takes care of handling player pokemon KO (with all its side effects) * + * @param scene the battle scene * @param pokemon the player pokemon to KO */ -export function koPlayerPokemon(pokemon: PlayerPokemon) { +export function koPlayerPokemon(scene: BattleScene, pokemon: PlayerPokemon) { pokemon.hp = 0; pokemon.trySetStatus(StatusEffect.FAINT); pokemon.updateInfo(); + queueEncounterMessage(scene, i18next.t("battle:fainted", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); } /** @@ -709,8 +711,7 @@ function applyHpChangeToPokemon(scene: BattleScene, pokemon: PlayerPokemon, valu const hpChange = Math.round(pokemon.hp + value); const nextHp = Math.max(Math.min(hpChange, pokemon.getMaxHp()), 0); if (nextHp === 0) { - koPlayerPokemon(pokemon); - queueEncounterMessage(scene, i18next.t("battle:fainted", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + koPlayerPokemon(scene, pokemon); } else { pokemon.hp = nextHp; } From 6cbf73281c38f15b7cba547a4be7dff7371db91d Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Wed, 17 Jul 2024 16:38:25 -0700 Subject: [PATCH 168/270] add retries to quick-draw tests --- src/test/abilities/quick_draw.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/abilities/quick_draw.test.ts b/src/test/abilities/quick_draw.test.ts index 884b108381d..aa66d7e052f 100644 --- a/src/test/abilities/quick_draw.test.ts +++ b/src/test/abilities/quick_draw.test.ts @@ -52,7 +52,7 @@ describe("Abilities - Quick Draw", () => { expect(pokemon.battleData.abilitiesApplied).contain(Abilities.QUICK_DRAW); }, 20000); - test("does not triggered by non damage moves", async () => { + test("does not triggered by non damage moves", { timeout: 20000, retry: 5 }, async () => { await game.startBattle([Species.SLOWBRO]); const pokemon = game.scene.getPlayerPokemon(); @@ -67,7 +67,7 @@ describe("Abilities - Quick Draw", () => { expect(pokemon.isFainted()).toBe(true); expect(enemy.isFainted()).toBe(false); expect(pokemon.battleData.abilitiesApplied).not.contain(Abilities.QUICK_DRAW); - }, 20000); + }); test("does not increase priority", async () => { vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue(Array(4).fill(Moves.EXTREME_SPEED)); From a98dbfdc93a7f5564eeb961fa9a88b021aadeb12 Mon Sep 17 00:00:00 2001 From: Felix Staud Date: Wed, 17 Jul 2024 17:05:08 -0700 Subject: [PATCH 169/270] fix lost-at-sea-encounter tests --- .../encounters/lost-at-sea-encounter.test.ts | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) 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 03d7eb90820..3b8017fa4c6 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 @@ -32,11 +32,11 @@ describe("Lost at Sea - Mystery Encounter", () => { game.override.mysteryEncounterChance(100); game.override.startingBiome(defaultBiome); game.override.startingWave(defaultWave); - vi.spyOn(MysteryEncounters, "allMysteryEncounters", "get").mockReturnValue({ - [MysteryEncounterType.LOST_AT_SEA]: LostAtSeaEncounter, - }); vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue( - new Map([[Biome.SEA, [MysteryEncounterType.LOST_AT_SEA]]]) + new Map([ + [Biome.SEA, [MysteryEncounterType.LOST_AT_SEA]], + [Biome.MOUNTAIN, [MysteryEncounterType.MYSTERIOUS_CHALLENGERS]], + ]) ); }); @@ -57,13 +57,12 @@ describe("Lost at Sea - Mystery Encounter", () => { expect(LostAtSeaEncounter.options.length).toBe(3); }); - it("should not run outside of sea biome", async () => { + it("should not spawn outside of sea biome", async () => { game.override.startingBiome(Biome.MOUNTAIN); - await workaround_reInitSceneWithOverrides(game); + await game.runToMysteryEncounter(); - //expect the `TypeError: Cannot read properties of undefined (reading 'introVisuals')` error - await expect(() => game.runToMysteryEncounter()).rejects.toThrowError(/introVisuals/); + expect(game.scene.currentBattle.mysteryEncounter.encounterType).not.toBe(MysteryEncounterType.LOST_AT_SEA); }); it("should not run below wave 11", async () => { From 06684e06a2fcfa088fb053c6b81c51bbd54e8295 Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Wed, 17 Jul 2024 22:58:34 -0400 Subject: [PATCH 170/270] clean up battle animation logic --- .../battle-anims/encounter-magma-spout.json | 780 +----------------- src/battle-scene.ts | 3 +- src/data/battle-anims.ts | 107 ++- .../encounters/fiery-fallout-encounter.ts | 14 +- .../mystery-encounters/mystery-encounter.ts | 20 +- .../utils/encounter-phase-utils.ts | 16 + src/phases.ts | 7 +- .../phases/mystery-encounter-phase.test.ts | 4 +- 8 files changed, 151 insertions(+), 800 deletions(-) diff --git a/public/battle-anims/encounter-magma-spout.json b/public/battle-anims/encounter-magma-spout.json index 961c5ab86bf..9e0acea61fa 100644 --- a/public/battle-anims/encounter-magma-spout.json +++ b/public/battle-anims/encounter-magma-spout.json @@ -2,32 +2,6 @@ "graphic": "PRAS- Magma Storm", "frames": [ [ - { - "x": 0, - "y": 0, - "zoomX": 100, - "zoomY": 100, - "visible": true, - "target": 0, - "graphicFrame": 0, - "opacity": 255, - "locked": true, - "priority": 0, - "focus": 2 - }, - { - "x": 128, - "y": -64, - "zoomX": 100, - "zoomY": 100, - "visible": true, - "target": 1, - "graphicFrame": 0, - "opacity": 255, - "locked": true, - "priority": 0, - "focus": 1 - }, { "x": 101, "y": -64, @@ -37,7 +11,7 @@ "target": 2, "graphicFrame": 0, "opacity": 255, - "priority": 0, + "priority": 1, "focus": 1 }, { @@ -49,7 +23,7 @@ "target": 2, "graphicFrame": 0, "opacity": 255, - "priority": 0, + "priority": 1, "focus": 1 }, { @@ -65,32 +39,6 @@ } ], [ - { - "x": 0, - "y": 0, - "zoomX": 100, - "zoomY": 100, - "visible": true, - "target": 0, - "graphicFrame": 0, - "opacity": 255, - "locked": true, - "priority": 0, - "focus": 2 - }, - { - "x": 128, - "y": -64, - "zoomX": 100, - "zoomY": 100, - "visible": true, - "target": 1, - "graphicFrame": 0, - "opacity": 255, - "locked": true, - "priority": 0, - "focus": 1 - }, { "x": 101, "y": -64, @@ -100,7 +48,7 @@ "target": 2, "graphicFrame": 1, "opacity": 255, - "priority": 0, + "priority": 1, "focus": 1 }, { @@ -112,7 +60,7 @@ "target": 2, "graphicFrame": 1, "opacity": 255, - "priority": 0, + "priority": 1, "focus": 1 }, { @@ -128,32 +76,6 @@ } ], [ - { - "x": 0, - "y": 0, - "zoomX": 100, - "zoomY": 100, - "visible": true, - "target": 0, - "graphicFrame": 0, - "opacity": 255, - "locked": true, - "priority": 0, - "focus": 2 - }, - { - "x": 128, - "y": -64, - "zoomX": 100, - "zoomY": 100, - "visible": true, - "target": 1, - "graphicFrame": 0, - "opacity": 255, - "locked": true, - "priority": 0, - "focus": 1 - }, { "x": 101, "y": -64, @@ -163,7 +85,7 @@ "target": 2, "graphicFrame": 2, "opacity": 255, - "priority": 0, + "priority": 1, "focus": 1 }, { @@ -175,7 +97,7 @@ "target": 2, "graphicFrame": 2, "opacity": 255, - "priority": 0, + "priority": 1, "focus": 1 }, { @@ -191,32 +113,6 @@ } ], [ - { - "x": 0, - "y": 0, - "zoomX": 100, - "zoomY": 100, - "visible": true, - "target": 0, - "graphicFrame": 0, - "opacity": 255, - "locked": true, - "priority": 0, - "focus": 2 - }, - { - "x": 128, - "y": -64, - "zoomX": 100, - "zoomY": 100, - "visible": true, - "target": 1, - "graphicFrame": 0, - "opacity": 255, - "locked": true, - "priority": 0, - "focus": 1 - }, { "x": 101, "y": -64, @@ -226,7 +122,7 @@ "target": 2, "graphicFrame": 3, "opacity": 255, - "priority": 0, + "priority": 1, "focus": 1 }, { @@ -238,7 +134,7 @@ "target": 2, "graphicFrame": 3, "opacity": 255, - "priority": 0, + "priority": 1, "focus": 1 }, { @@ -254,32 +150,6 @@ } ], [ - { - "x": 0, - "y": 0, - "zoomX": 100, - "zoomY": 100, - "visible": true, - "target": 0, - "graphicFrame": 0, - "opacity": 255, - "locked": true, - "priority": 0, - "focus": 2 - }, - { - "x": 128, - "y": -64, - "zoomX": 100, - "zoomY": 100, - "visible": true, - "target": 1, - "graphicFrame": 0, - "opacity": 255, - "locked": true, - "priority": 0, - "focus": 1 - }, { "x": 101, "y": -64, @@ -289,7 +159,7 @@ "target": 2, "graphicFrame": 4, "opacity": 255, - "priority": 0, + "priority": 1, "focus": 1 }, { @@ -301,7 +171,7 @@ "target": 2, "graphicFrame": 4, "opacity": 255, - "priority": 0, + "priority": 1, "focus": 1 }, { @@ -317,32 +187,6 @@ } ], [ - { - "x": 0, - "y": 0, - "zoomX": 100, - "zoomY": 100, - "visible": true, - "target": 0, - "graphicFrame": 0, - "opacity": 255, - "locked": true, - "priority": 0, - "focus": 2 - }, - { - "x": 128, - "y": -64, - "zoomX": 100, - "zoomY": 100, - "visible": true, - "target": 1, - "graphicFrame": 0, - "opacity": 255, - "locked": true, - "priority": 0, - "focus": 1 - }, { "x": 101, "y": -64, @@ -352,7 +196,7 @@ "target": 2, "graphicFrame": 5, "opacity": 255, - "priority": 0, + "priority": 1, "focus": 1 }, { @@ -364,7 +208,7 @@ "target": 2, "graphicFrame": 5, "opacity": 255, - "priority": 0, + "priority": 1, "focus": 1 }, { @@ -380,38 +224,6 @@ } ], [ - { - "x": 0, - "y": 0, - "zoomX": 100, - "zoomY": 100, - "visible": true, - "target": 0, - "graphicFrame": 0, - "opacity": 255, - "locked": true, - "priority": 0, - "focus": 2 - }, - { - "x": 128, - "y": -64, - "zoomX": 100, - "zoomY": 100, - "visible": true, - "target": 1, - "graphicFrame": 0, - "opacity": 255, - "tone": [ - 28, - -29, - -29, - 0 - ], - "locked": true, - "priority": 0, - "focus": 1 - }, { "x": 101, "y": -64, @@ -421,7 +233,7 @@ "target": 2, "graphicFrame": 6, "opacity": 255, - "priority": 0, + "priority": 1, "focus": 1 }, { @@ -433,7 +245,7 @@ "target": 2, "graphicFrame": 6, "opacity": 255, - "priority": 0, + "priority": 1, "focus": 1 }, { @@ -449,38 +261,6 @@ } ], [ - { - "x": 0, - "y": 0, - "zoomX": 100, - "zoomY": 100, - "visible": true, - "target": 0, - "graphicFrame": 0, - "opacity": 255, - "locked": true, - "priority": 0, - "focus": 2 - }, - { - "x": 128, - "y": -64, - "zoomX": 100, - "zoomY": 100, - "visible": true, - "target": 1, - "graphicFrame": 0, - "opacity": 255, - "tone": [ - 56, - -57, - -57, - 0 - ], - "locked": true, - "priority": 0, - "focus": 1 - }, { "x": 101, "y": -64, @@ -490,7 +270,7 @@ "target": 2, "graphicFrame": 7, "opacity": 255, - "priority": 0, + "priority": 1, "focus": 1 }, { @@ -502,7 +282,7 @@ "target": 2, "graphicFrame": 7, "opacity": 255, - "priority": 0, + "priority": 1, "focus": 1 }, { @@ -518,38 +298,6 @@ } ], [ - { - "x": 0, - "y": 0, - "zoomX": 100, - "zoomY": 100, - "visible": true, - "target": 0, - "graphicFrame": 0, - "opacity": 255, - "locked": true, - "priority": 0, - "focus": 2 - }, - { - "x": 128, - "y": -64, - "zoomX": 100, - "zoomY": 100, - "visible": true, - "target": 1, - "graphicFrame": 0, - "opacity": 255, - "tone": [ - 85, - -85, - -85, - 0 - ], - "locked": true, - "priority": 0, - "focus": 1 - }, { "x": 120, "y": -56, @@ -559,7 +307,7 @@ "target": 2, "graphicFrame": 8, "opacity": 255, - "priority": 0, + "priority": 1, "focus": 1 }, { @@ -586,38 +334,6 @@ } ], [ - { - "x": 0, - "y": 0, - "zoomX": 100, - "zoomY": 100, - "visible": true, - "target": 0, - "graphicFrame": 0, - "opacity": 255, - "locked": true, - "priority": 0, - "focus": 2 - }, - { - "x": 128, - "y": -64, - "zoomX": 100, - "zoomY": 100, - "visible": true, - "target": 1, - "graphicFrame": 0, - "opacity": 255, - "tone": [ - 113, - -114, - -114, - 0 - ], - "locked": true, - "priority": 0, - "focus": 1 - }, { "x": 140, "y": -64, @@ -627,7 +343,7 @@ "target": 2, "graphicFrame": 9, "opacity": 255, - "priority": 0, + "priority": 1, "focus": 1 }, { @@ -650,43 +366,11 @@ "target": 2, "graphicFrame": 9, "opacity": 255, - "priority": 0, + "priority": 1, "focus": 1 } ], [ - { - "x": 0, - "y": 0, - "zoomX": 100, - "zoomY": 100, - "visible": true, - "target": 0, - "graphicFrame": 0, - "opacity": 255, - "locked": true, - "priority": 0, - "focus": 2 - }, - { - "x": 128, - "y": -64, - "zoomX": 100, - "zoomY": 100, - "visible": true, - "target": 1, - "graphicFrame": 0, - "opacity": 255, - "tone": [ - 141, - -142, - -142, - 0 - ], - "locked": true, - "priority": 0, - "focus": 1 - }, { "x": 152, "y": -76, @@ -718,43 +402,11 @@ "target": 2, "graphicFrame": 10, "opacity": 255, - "priority": 0, + "priority": 1, "focus": 1 } ], [ - { - "x": 0, - "y": 0, - "zoomX": 100, - "zoomY": 100, - "visible": true, - "target": 0, - "graphicFrame": 0, - "opacity": 255, - "locked": true, - "priority": 0, - "focus": 2 - }, - { - "x": 128, - "y": -64, - "zoomX": 100, - "zoomY": 100, - "visible": true, - "target": 1, - "graphicFrame": 0, - "opacity": 255, - "tone": [ - 170, - -170, - -170, - 0 - ], - "locked": true, - "priority": 0, - "focus": 1 - }, { "x": 136, "y": -96, @@ -775,7 +427,7 @@ "target": 2, "graphicFrame": 7, "opacity": 255, - "priority": 0, + "priority": 1, "focus": 1 }, { @@ -787,43 +439,11 @@ "target": 2, "graphicFrame": 7, "opacity": 255, - "priority": 0, + "priority": 1, "focus": 1 } ], [ - { - "x": 0, - "y": 0, - "zoomX": 100, - "zoomY": 100, - "visible": true, - "target": 0, - "graphicFrame": 0, - "opacity": 255, - "locked": true, - "priority": 0, - "focus": 2 - }, - { - "x": 128, - "y": -64, - "zoomX": 100, - "zoomY": 100, - "visible": true, - "target": 1, - "graphicFrame": 0, - "opacity": 255, - "tone": [ - 198, - -199, - -199, - 0 - ], - "locked": true, - "priority": 0, - "focus": 1 - }, { "x": 108, "y": -92, @@ -833,7 +453,7 @@ "target": 2, "graphicFrame": 8, "opacity": 255, - "priority": 0, + "priority": 1, "focus": 1 }, { @@ -845,7 +465,7 @@ "target": 2, "graphicFrame": 8, "opacity": 255, - "priority": 0, + "priority": 1, "focus": 1 }, { @@ -861,38 +481,6 @@ } ], [ - { - "x": 0, - "y": 0, - "zoomX": 100, - "zoomY": 100, - "visible": true, - "target": 0, - "graphicFrame": 0, - "opacity": 255, - "locked": true, - "priority": 0, - "focus": 2 - }, - { - "x": 128, - "y": -64, - "zoomX": 100, - "zoomY": 100, - "visible": true, - "target": 1, - "graphicFrame": 0, - "opacity": 255, - "tone": [ - 226, - -227, - -227, - 0 - ], - "locked": true, - "priority": 0, - "focus": 1 - }, { "x": 100, "y": -76, @@ -902,7 +490,7 @@ "target": 2, "graphicFrame": 9, "opacity": 255, - "priority": 0, + "priority": 1, "focus": 1 }, { @@ -929,38 +517,6 @@ } ], [ - { - "x": 0, - "y": 0, - "zoomX": 100, - "zoomY": 100, - "visible": true, - "target": 0, - "graphicFrame": 0, - "opacity": 255, - "locked": true, - "priority": 0, - "focus": 2 - }, - { - "x": 128, - "y": -64, - "zoomX": 100, - "zoomY": 100, - "visible": true, - "target": 1, - "graphicFrame": 0, - "opacity": 255, - "tone": [ - 255, - -255, - -255, - 0 - ], - "locked": true, - "priority": 0, - "focus": 1 - }, { "x": 100.5, "y": -70, @@ -970,7 +526,7 @@ "target": 2, "graphicFrame": 10, "opacity": 255, - "priority": 0, + "priority": 1, "focus": 1 }, { @@ -993,43 +549,11 @@ "target": 2, "graphicFrame": 10, "opacity": 255, - "priority": 0, + "priority": 1, "focus": 1 } ], [ - { - "x": 0, - "y": 0, - "zoomX": 100, - "zoomY": 100, - "visible": true, - "target": 0, - "graphicFrame": 0, - "opacity": 255, - "locked": true, - "priority": 0, - "focus": 2 - }, - { - "x": 128, - "y": -64, - "zoomX": 100, - "zoomY": 100, - "visible": true, - "target": 1, - "graphicFrame": 0, - "opacity": 255, - "tone": [ - 223, - -224, - -224, - 0 - ], - "locked": true, - "priority": 0, - "focus": 1 - }, { "x": 101, "y": -64, @@ -1039,7 +563,7 @@ "target": 2, "graphicFrame": 6, "opacity": 255, - "priority": 0, + "priority": 1, "focus": 1 }, { @@ -1051,7 +575,7 @@ "target": 2, "graphicFrame": 6, "opacity": 255, - "priority": 0, + "priority": 1, "focus": 1 }, { @@ -1067,38 +591,6 @@ } ], [ - { - "x": 0, - "y": 0, - "zoomX": 100, - "zoomY": 100, - "visible": true, - "target": 0, - "graphicFrame": 0, - "opacity": 255, - "locked": true, - "priority": 0, - "focus": 2 - }, - { - "x": 128, - "y": -64, - "zoomX": 100, - "zoomY": 100, - "visible": true, - "target": 1, - "graphicFrame": 0, - "opacity": 255, - "tone": [ - 191, - -192, - -192, - 0 - ], - "locked": true, - "priority": 0, - "focus": 1 - }, { "x": 101, "y": -64, @@ -1108,7 +600,7 @@ "target": 2, "graphicFrame": 5, "opacity": 255, - "priority": 0, + "priority": 1, "focus": 1 }, { @@ -1120,7 +612,7 @@ "target": 2, "graphicFrame": 5, "opacity": 255, - "priority": 0, + "priority": 1, "focus": 1 }, { @@ -1136,38 +628,6 @@ } ], [ - { - "x": 0, - "y": 0, - "zoomX": 100, - "zoomY": 100, - "visible": true, - "target": 0, - "graphicFrame": 0, - "opacity": 255, - "locked": true, - "priority": 0, - "focus": 2 - }, - { - "x": 128, - "y": -64, - "zoomX": 100, - "zoomY": 100, - "visible": true, - "target": 1, - "graphicFrame": 0, - "opacity": 255, - "tone": [ - 159, - -160, - -160, - 0 - ], - "locked": true, - "priority": 0, - "focus": 1 - }, { "x": 101, "y": -64, @@ -1177,7 +637,7 @@ "target": 2, "graphicFrame": 4, "opacity": 255, - "priority": 0, + "priority": 1, "focus": 1 }, { @@ -1189,7 +649,7 @@ "target": 2, "graphicFrame": 4, "opacity": 255, - "priority": 0, + "priority": 1, "focus": 1 }, { @@ -1205,38 +665,6 @@ } ], [ - { - "x": 0, - "y": 0, - "zoomX": 100, - "zoomY": 100, - "visible": true, - "target": 0, - "graphicFrame": 0, - "opacity": 255, - "locked": true, - "priority": 0, - "focus": 2 - }, - { - "x": 128, - "y": -64, - "zoomX": 100, - "zoomY": 100, - "visible": true, - "target": 1, - "graphicFrame": 0, - "opacity": 255, - "tone": [ - 127, - -128, - -128, - 0 - ], - "locked": true, - "priority": 0, - "focus": 1 - }, { "x": 101, "y": -64, @@ -1246,7 +674,7 @@ "target": 2, "graphicFrame": 3, "opacity": 255, - "priority": 0, + "priority": 1, "focus": 1 }, { @@ -1258,7 +686,7 @@ "target": 2, "graphicFrame": 3, "opacity": 255, - "priority": 0, + "priority": 1, "focus": 1 }, { @@ -1274,38 +702,6 @@ } ], [ - { - "x": 0, - "y": 0, - "zoomX": 100, - "zoomY": 100, - "visible": true, - "target": 0, - "graphicFrame": 0, - "opacity": 255, - "locked": true, - "priority": 0, - "focus": 2 - }, - { - "x": 128, - "y": -64, - "zoomX": 100, - "zoomY": 100, - "visible": true, - "target": 1, - "graphicFrame": 0, - "opacity": 255, - "tone": [ - 95, - -96, - -96, - 0 - ], - "locked": true, - "priority": 0, - "focus": 1 - }, { "x": 101, "y": -64, @@ -1315,7 +711,7 @@ "target": 2, "graphicFrame": 2, "opacity": 255, - "priority": 0, + "priority": 1, "focus": 1 }, { @@ -1327,7 +723,7 @@ "target": 2, "graphicFrame": 2, "opacity": 255, - "priority": 0, + "priority": 1, "focus": 1 }, { @@ -1343,38 +739,6 @@ } ], [ - { - "x": 0, - "y": 0, - "zoomX": 100, - "zoomY": 100, - "visible": true, - "target": 0, - "graphicFrame": 0, - "opacity": 255, - "locked": true, - "priority": 0, - "focus": 2 - }, - { - "x": 128, - "y": -64, - "zoomX": 100, - "zoomY": 100, - "visible": true, - "target": 1, - "graphicFrame": 0, - "opacity": 255, - "tone": [ - 63, - -64, - -64, - 0 - ], - "locked": true, - "priority": 0, - "focus": 1 - }, { "x": 101, "y": -64, @@ -1384,7 +748,7 @@ "target": 2, "graphicFrame": 1, "opacity": 255, - "priority": 0, + "priority": 1, "focus": 1 }, { @@ -1396,7 +760,7 @@ "target": 2, "graphicFrame": 1, "opacity": 255, - "priority": 0, + "priority": 1, "focus": 1 }, { @@ -1412,38 +776,6 @@ } ], [ - { - "x": 0, - "y": 0, - "zoomX": 100, - "zoomY": 100, - "visible": true, - "target": 0, - "graphicFrame": 0, - "opacity": 255, - "locked": true, - "priority": 0, - "focus": 2 - }, - { - "x": 128, - "y": -64, - "zoomX": 100, - "zoomY": 100, - "visible": true, - "target": 1, - "graphicFrame": 0, - "opacity": 255, - "tone": [ - 31, - -32, - -32, - 0 - ], - "locked": true, - "priority": 0, - "focus": 1 - }, { "x": 101, "y": -64, @@ -1453,7 +785,7 @@ "target": 2, "graphicFrame": 0, "opacity": 255, - "priority": 0, + "priority": 1, "focus": 1 }, { @@ -1465,7 +797,7 @@ "target": 2, "graphicFrame": 0, "opacity": 255, - "priority": 0, + "priority": 1, "focus": 1 }, { @@ -1481,32 +813,6 @@ } ], [ - { - "x": 0, - "y": 0, - "zoomX": 100, - "zoomY": 100, - "visible": true, - "target": 0, - "graphicFrame": 0, - "opacity": 255, - "locked": true, - "priority": 0, - "focus": 2 - }, - { - "x": 128, - "y": -64, - "zoomX": 100, - "zoomY": 100, - "visible": true, - "target": 1, - "graphicFrame": 0, - "opacity": 255, - "locked": true, - "priority": 0, - "focus": 1 - }, { "x": 101, "y": -64, @@ -1516,7 +822,7 @@ "target": 2, "graphicFrame": 0, "opacity": 130, - "priority": 0, + "priority": 1, "focus": 1 }, { @@ -1528,7 +834,7 @@ "target": 2, "graphicFrame": 0, "opacity": 130, - "priority": 0, + "priority": 1, "focus": 1 }, { diff --git a/src/battle-scene.ts b/src/battle-scene.ts index 4ebdafd3752..c0a3f0b090a 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -7,7 +7,7 @@ import {Constructor, isNullOrUndefined} from "#app/utils"; import * as Utils from "./utils"; import { Modifier, ModifierBar, ConsumablePokemonModifier, ConsumableModifier, PokemonHpRestoreModifier, HealingBoosterModifier, PersistentModifier, PokemonHeldItemModifier, ModifierPredicate, DoubleBattleChanceBoosterModifier, FusePokemonModifier, PokemonFormChangeItemModifier, TerastallizeModifier, overrideModifiers, overrideHeldItems } from "./modifier/modifier"; import { PokeballType } from "./data/pokeball"; -import { initCommonAnims, initEncounterAnims, initMoveAnim, loadCommonAnimAssets, loadEncounterAnimAssets, loadMoveAnimAssets, populateAnims } from "./data/battle-anims"; +import { initCommonAnims, initMoveAnim, loadCommonAnimAssets, loadMoveAnimAssets, populateAnims } from "./data/battle-anims"; import { Phase } from "./phase"; import { initGameSpeed } from "./system/game-speed"; import { Arena, ArenaBase } from "./field/arena"; @@ -555,7 +555,6 @@ export default class BattleScene extends SceneBase { Promise.all([ Promise.all(loadPokemonAssets), initCommonAnims(this).then(() => loadCommonAnimAssets(this, true)), - initEncounterAnims(this).then(() => loadEncounterAnimAssets(this, true)), Promise.all([ Moves.TACKLE, Moves.TAIL_WHIP, Moves.FOCUS_ENERGY, Moves.STRUGGLE ].map(m => initMoveAnim(this, m))).then(() => loadMoveAnimAssets(this, defaultMoves, true)), this.initStarterColors() ]).then(() => { diff --git a/src/data/battle-anims.ts b/src/data/battle-anims.ts index 1643852f922..f832318fc4b 100644 --- a/src/data/battle-anims.ts +++ b/src/data/battle-anims.ts @@ -6,6 +6,7 @@ import * as Utils from "../utils"; import { BattlerIndex } from "../battle"; import { Element } from "json-stable-stringify"; import { Moves } from "#enums/moves"; +import { isNullOrUndefined } from "../utils"; //import fs from 'vite-plugin-fs/browser'; export enum AnimFrameTarget { @@ -307,7 +308,7 @@ abstract class AnimTimedEvent { this.resourceName = resourceName; } - abstract execute(scene: BattleScene, battleAnim: BattleAnim): integer; + abstract execute(scene: BattleScene, battleAnim: BattleAnim, priority?: number): integer; abstract getEventType(): string; } @@ -325,7 +326,7 @@ class AnimTimedSoundEvent extends AnimTimedEvent { } } - execute(scene: BattleScene, battleAnim: BattleAnim): integer { + execute(scene: BattleScene, battleAnim: BattleAnim, priority?: number): integer { const soundConfig = { rate: (this.pitch * 0.01), volume: (this.volume * 0.01) }; if (this.resourceName) { try { @@ -387,7 +388,7 @@ class AnimTimedUpdateBgEvent extends AnimTimedBgEvent { super(frameIndex, resourceName, source); } - execute(scene: BattleScene, moveAnim: MoveAnim): integer { + execute(scene: BattleScene, moveAnim: MoveAnim, priority?: number): integer { const tweenProps = {}; if (this.bgX !== undefined) { tweenProps["x"] = (this.bgX * 0.5) - 320; @@ -417,7 +418,7 @@ class AnimTimedAddBgEvent extends AnimTimedBgEvent { super(frameIndex, resourceName, source); } - execute(scene: BattleScene, moveAnim: MoveAnim): integer { + execute(scene: BattleScene, moveAnim: MoveAnim, priority?: number): integer { if (moveAnim.bgSprite) { moveAnim.bgSprite.destroy(); } @@ -429,7 +430,9 @@ class AnimTimedAddBgEvent extends AnimTimedBgEvent { moveAnim.bgSprite.setAlpha(this.opacity / 255); scene.field.add(moveAnim.bgSprite); const fieldPokemon = scene.getEnemyPokemon() || scene.getPlayerPokemon(); - if (fieldPokemon?.isOnField()) { + if (!isNullOrUndefined(priority)) { + scene.field.moveTo(moveAnim.bgSprite as Phaser.GameObjects.GameObject, priority); + } else if (fieldPokemon?.isOnField()) { scene.field.moveBelow(moveAnim.bgSprite as Phaser.GameObjects.GameObject, fieldPokemon); } @@ -517,14 +520,18 @@ export function initMoveAnim(scene: BattleScene, move: Moves): Promise { }); } -export function initEncounterAnims(scene: BattleScene): Promise { +export function initEncounterAnims(scene: BattleScene, anims: EncounterAnim | EncounterAnim[]): Promise { + anims = anims instanceof Array ? anims : [anims]; return new Promise(resolve => { const encounterAnimNames = Utils.getEnumKeys(EncounterAnim); const encounterAnimIds = Utils.getEnumValues(EncounterAnim); const encounterAnimFetches = []; - for (let ea = 0; ea < encounterAnimIds.length; ea++) { - const encounterAnimId = encounterAnimIds[ea]; - encounterAnimFetches.push(scene.cachedFetch(`./battle-anims/encounter-${encounterAnimNames[ea].toLowerCase().replace(/\_/g, "-")}.json`) + for (const anim of anims) { + if (encounterAnims.has(anim) && !isNullOrUndefined(encounterAnims.get(anim))) { + continue; + } + const encounterAnimId = encounterAnimIds[anim]; + encounterAnimFetches.push(scene.cachedFetch(`./battle-anims/encounter-${encounterAnimNames[anim].toLowerCase().replace(/\_/g, "-")}.json`) .then(response => response.json()) .then(cas => encounterAnims.set(encounterAnimId, new AnimConfig(cas)))); } @@ -1005,18 +1012,13 @@ export abstract class BattleAnim { }); } - private getGraphicFrameDataWithoutTarget(scene: BattleScene, frames: AnimFrame[], targetInitialX: number, targetInitialY: number): Map> { + private getGraphicFrameDataWithoutTarget(frames: AnimFrame[], targetInitialX: number, targetInitialY: number): Map> { const ret: Map> = new Map([ [AnimFrameTarget.GRAPHIC, new Map() ], [AnimFrameTarget.USER, new Map() ], [AnimFrameTarget.TARGET, new Map() ] ]); - const userInitialX = 0; - const userInitialY = 0; - const userHalfHeight = 30; - const targetHalfHeight = 30; - let g = 0; let u = 0; let t = 0; @@ -1024,27 +1026,10 @@ export abstract class BattleAnim { for (const frame of frames) { let x = frame.x; let y = frame.y; - let scaleX = (frame.zoomX / 100) * (!frame.mirror ? 1 : -1); + const scaleX = (frame.zoomX / 100) * (!frame.mirror ? 1 : -1); const scaleY = (frame.zoomY / 100); - switch (frame.focus) { - case AnimFocus.TARGET: - x += targetInitialX - targetFocusX; - y += (targetInitialY - targetHalfHeight) - targetFocusY; - break; - case AnimFocus.USER: - x += userInitialX - userFocusX; - y += (userInitialY - userHalfHeight) - userFocusY; - break; - case AnimFocus.USER_TARGET: - const point = transformPoint(this.srcLine[0], this.srcLine[1], this.srcLine[2], this.srcLine[3], - this.dstLine[0], this.dstLine[1] - userHalfHeight, this.dstLine[2], this.dstLine[3] - targetHalfHeight, x, y); - x = point[0]; - y = point[1]; - if (frame.target === AnimFrameTarget.GRAPHIC && isReversed(this.srcLine[0], this.srcLine[2], this.dstLine[0], this.dstLine[2])) { - scaleX = scaleX * -1; - } - break; - } + x += targetInitialX; + y += targetInitialY; const angle = -frame.angle; const key = frame.target === AnimFrameTarget.GRAPHIC ? g++ : frame.target === AnimFrameTarget.USER ? u++ : t++; ret.get(frame.target).set(key, { x: x, y: y, scaleX: scaleX, scaleY: scaleY, angle: angle }); @@ -1053,7 +1038,20 @@ export abstract class BattleAnim { return ret; } - playWithoutTargets(scene: BattleScene, targetInitialX: number, targetInitialY: number, frameTimeMult: number, callback?: Function) { + /** + * + * @param scene + * @param targetInitialX + * @param targetInitialY + * @param frameTimeMult + * @param frameTimedEventPriority + * - 0 is behind all other sprites (except BG) + * - 1 on top of player field + * - 3 is on top of both fields + * - 5 is on top of player sprite + * @param callback + */ + playWithoutTargets(scene: BattleScene, targetInitialX: number, targetInitialY: number, frameTimeMult: number, frameTimedEventPriority?: 0 | 1 | 3 | 5, callback?: Function) { const spriteCache: SpriteCache = { [AnimFrameTarget.GRAPHIC]: [], [AnimFrameTarget.USER]: [], @@ -1087,12 +1085,17 @@ export abstract class BattleAnim { let r = anim.frames.length; let f = 0; + const fieldSprites = scene.field.getAll(); + const playerFieldSprite = fieldSprites[1]; + const enemyFieldSprite = fieldSprites[3]; + const trainerSprite = fieldSprites[5]; + scene.tweens.addCounter({ duration: Utils.getFrameMs(3) * frameTimeMult, repeat: anim.frames.length, onRepeat: () => { const spriteFrames = anim.frames[f]; - const frameData = this.getGraphicFrameDataWithoutTarget(scene, anim.frames[f], targetInitialX, targetInitialY); + const frameData = this.getGraphicFrameDataWithoutTarget(anim.frames[f], targetInitialX, targetInitialY); const u = 0; const t = 0; let g = 0; @@ -1116,13 +1119,29 @@ export abstract class BattleAnim { spritePriorities[graphicIndex] = frame.priority; const setSpritePriority = (priority: integer) => { if (priority < 0) { - // Move to top of scene + // Move to top of scene scene.field.moveTo(moveSprite, scene.field.getAll().length - 1); - } else if (priority < scene.field.getAll().length) { - // Indexes of field: - // 0 is scene background - // 1 is enemy field - scene.field.moveTo(moveSprite, priority); + } else if (priority === 1) { + // Move above player field + if (playerFieldSprite) { + scene.field.moveAbove(moveSprite as Phaser.GameObjects.GameObject, playerFieldSprite); + } else { + setSpritePriority(-1); + } + } else if (priority === 3) { + // Move above player enemy field + if (enemyFieldSprite) { + scene.field.moveAbove(moveSprite as Phaser.GameObjects.GameObject, enemyFieldSprite); + } else { + setSpritePriority(-1); + } + } else if (priority === 5) { + // Move above player trainer sprite + if (trainerSprite) { + scene.field.moveAbove(moveSprite as Phaser.GameObjects.GameObject, trainerSprite); + } else { + setSpritePriority(-1); + } } else { setSpritePriority(-1); } @@ -1143,7 +1162,7 @@ export abstract class BattleAnim { } if (anim.frameTimedEvents.has(f)) { for (const event of anim.frameTimedEvents.get(f)) { - r = Math.max((anim.frames.length - f) + event.execute(scene, this), r); + r = Math.max((anim.frames.length - f) + event.execute(scene, this, frameTimedEventPriority), r); } } const targets = Utils.getEnumValues(AnimFrameTarget); diff --git a/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts b/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts index 84cf0d9ae7f..df637aa4cfd 100644 --- a/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts +++ b/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts @@ -1,5 +1,5 @@ import { EncounterOptionMode, MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; -import { EnemyPartyConfig, generateModifierTypeOption, initBattleWithEnemyConfig, leaveEncounterWithoutBattle, setEncounterExp, setEncounterRewards } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { EnemyPartyConfig, generateModifierTypeOption, initBattleWithEnemyConfig, initCustomMovesForEncounter, leaveEncounterWithoutBattle, setEncounterExp, setEncounterRewards } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { modifierTypes, } from "#app/modifier/modifier-type"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import BattleScene from "../../../battle-scene"; @@ -12,7 +12,7 @@ import { Type } from "#app/data/type"; import { BattlerIndex } from "#app/battle"; import { PokemonMove } from "#app/field/pokemon"; import { Moves } from "#enums/moves"; -import { EncounterAnim, EncounterBattleAnim, initMoveAnim, loadMoveAnimAssets } from "#app/data/battle-anims"; +import { EncounterAnim, EncounterBattleAnim } from "#app/data/battle-anims"; import { WeatherType } from "#app/data/weather"; import { randSeedInt } from "#app/utils"; @@ -27,6 +27,7 @@ export const FieryFalloutEncounter: IMysteryEncounter = .withSceneWaveRangeRequirement(40, 180) // waves 10 to 180 .withCatchAllowed(true) .withIntroSpriteConfigs([]) // Set in onInit() + .withAnimations(EncounterAnim.MAGMA_BG, EncounterAnim.MAGMA_SPOUT) .withIntroDialogue([ { text: `${namespace}_intro_message`, @@ -60,21 +61,20 @@ export const FieryFalloutEncounter: IMysteryEncounter = scene.arena.trySetWeather(WeatherType.SUNNY, true); // Load animations/sfx for Volcarona moves - Promise.all([initMoveAnim(scene, Moves.QUIVER_DANCE), initMoveAnim(scene, Moves.FIRE_SPIN)]) - .then(() => loadMoveAnimAssets(scene, [Moves.QUIVER_DANCE, Moves.FIRE_SPIN])); + initCustomMovesForEncounter(scene, [Moves.FIRE_SPIN, Moves.QUIVER_DANCE]); return true; }) .withOnVisualsStart((scene: BattleScene) => { // Play animations const background = new EncounterBattleAnim(EncounterAnim.MAGMA_BG, scene.getPlayerPokemon(), scene.getPlayerPokemon()); - background.playWithoutTargets(scene, 200, 70, 2); + background.playWithoutTargets(scene, 200, 70, 2, 3); const animation = new EncounterBattleAnim(EncounterAnim.MAGMA_SPOUT, scene.getPlayerPokemon(), scene.getPlayerPokemon()); - animation.playWithoutTargets(scene, 200, 70, 2); + animation.playWithoutTargets(scene, 100, 100, 2); const increment = 600; for (let i = 3; i < 6; i++) { scene.time.delayedCall((increment) * (i - 2), () => { - animation.playWithoutTargets(scene, 100 + randSeedInt(12) * 20, 110 - randSeedInt(10) * 15, 2); + animation.playWithoutTargets(scene, randSeedInt(12) * 15, 150 - randSeedInt(10) * 15, 2); }); } diff --git a/src/data/mystery-encounters/mystery-encounter.ts b/src/data/mystery-encounters/mystery-encounter.ts index d68e912fdff..efad93e2f28 100644 --- a/src/data/mystery-encounters/mystery-encounter.ts +++ b/src/data/mystery-encounters/mystery-encounter.ts @@ -19,6 +19,7 @@ import { WaveRangeRequirement } from "./mystery-encounter-requirements"; import { BattlerIndex } from "#app/battle"; +import { EncounterAnim } from "#app/data/battle-anims"; export enum MysteryEncounterVariant { DEFAULT, @@ -57,6 +58,7 @@ export default interface IMysteryEncounter { * Optional params */ encounterTier?: MysteryEncounterTier; + encounterAnimations?: EncounterAnim[]; hideBattleIntroMessage?: boolean; hideIntroVisuals?: boolean; catchAllowed?: boolean; @@ -193,13 +195,6 @@ export default class IMysteryEncounter implements IMysteryEncounter { const secReqs = this.meetsSecondaryRequirementAndSecondaryPokemonSelected(scene); // secondary is checked first to handle cases of primary overlapping with secondary const priReqs = this.meetsPrimaryRequirementAndPrimaryPokemonSelected(scene); - // console.log("-------" + MysteryEncounterType[this.encounterType] + " Encounter Check -------"); - // console.log(this); - // console.log( "sceneCheck: " + sceneReq); - // console.log( "primaryCheck: " + priReqs); - // console.log( "secondaryCheck: " + secReqs); - // console.log(MysteryEncounterTier[this.encounterTier]); - return sceneReq && secReqs && priReqs; } @@ -377,6 +372,7 @@ export class MysteryEncounterBuilder implements Partial { dialogue?: MysteryEncounterDialogue; encounterTier?: MysteryEncounterTier; + encounterAnimations?: EncounterAnim[]; requirements?: EncounterSceneRequirement[] = []; primaryPokemonRequirements?: EncounterPokemonRequirement[] = []; secondaryPokemonRequirements ?: EncounterPokemonRequirement[] = []; @@ -471,6 +467,16 @@ export class MysteryEncounterBuilder implements Partial { return Object.assign(this, { encounterTier: encounterTier }); } + /** + * Defines any EncounterAnim animations that are intended to be used during the encounter + * @param encounterAnimations + * @returns + */ + withAnimations(...encounterAnimations: EncounterAnim[]): this & Required> { + encounterAnimations = encounterAnimations instanceof Array ? encounterAnimations : [encounterAnimations]; + return Object.assign(this, { encounterAnimations: encounterAnimations }); + } + /** * Sets the maximum number of times that an encounter can spawn in a given Classic run * @param maxAllowedEncounters diff --git a/src/data/mystery-encounters/utils/encounter-phase-utils.ts b/src/data/mystery-encounters/utils/encounter-phase-utils.ts index 0aae84a7a8a..ba6a154abd9 100644 --- a/src/data/mystery-encounters/utils/encounter-phase-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-phase-utils.ts @@ -26,6 +26,8 @@ import * as Overrides from "#app/overrides"; import MysteryEncounterOption from "#app/data/mystery-encounters/mystery-encounter-option"; import { showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; import { Gender } from "#app/data/gender"; +import { initMoveAnim, loadMoveAnimAssets } from "#app/data/battle-anims"; +import { Moves } from "#enums/moves"; export class EnemyPokemonConfig { species: PokemonSpecies; @@ -230,6 +232,20 @@ export async function initBattleWithEnemyConfig(scene: BattleScene, partyConfig: } } +/** + * Load special move animations/sfx for hard-coded encounter-specific moves that a pokemon uses at the start of an encounter + * See: [startOfBattleEffects](IMysteryEncounter.startOfBattleEffects) for more details + * + * This promise does not need to be awaited on if called in an encounter onInit (will just load lazily) + * @param scene + * @param moves + */ +export function initCustomMovesForEncounter(scene: BattleScene, moves: Moves | Moves[]) { + moves = moves instanceof Array ? moves : [moves]; + return Promise.all(moves.map(move => initMoveAnim(scene, move))) + .then(() => loadMoveAnimAssets(scene, moves)); +} + /** * Will update player money, and animate change (sound optional) * @param scene - Battle Scene diff --git a/src/phases.ts b/src/phases.ts index 6465d573622..015a97ca115 100644 --- a/src/phases.ts +++ b/src/phases.ts @@ -9,7 +9,7 @@ import { Stat } from "./data/pokemon-stat"; import { BerryModifier, BypassSpeedChanceModifier, ContactHeldItemTransferChanceModifier, EnemyAttackStatusEffectChanceModifier, EnemyPersistentModifier, EnemyStatusEffectHealChanceModifier, EnemyTurnHealModifier, ExpBalanceModifier, ExpBoosterModifier, ExpShareModifier, ExtraModifierModifier, FlinchChanceModifier, HealingBoosterModifier, HitHealModifier, IvScannerModifier, LapsingPersistentModifier, LapsingPokemonHeldItemModifier, MapModifier, Modifier, MoneyInterestModifier, MoneyMultiplierModifier, MultipleParticipantExpBonusModifier, overrideHeldItems, overrideModifiers, PersistentModifier, PokemonExpBoosterModifier, PokemonHeldItemModifier, PokemonInstantReviveModifier, PokemonMoveAccuracyBoosterModifier, PokemonMultiHitModifier, SwitchEffectTransferModifier, TempBattleStatBoosterModifier, TurnHealModifier, TurnHeldItemTransferModifier, TurnStatusEffectModifier } from "./modifier/modifier"; import PartyUiHandler, { PartyOption, PartyUiMode } from "./ui/party-ui-handler"; import { doPokeballBounceAnim, getPokeballAtlasKey, getPokeballCatchMultiplier, getPokeballTintColor, PokeballType } from "./data/pokeball"; -import { CommonAnim, CommonBattleAnim, initMoveAnim, loadMoveAnimAssets, MoveAnim } from "./data/battle-anims"; +import { CommonAnim, CommonBattleAnim, initEncounterAnims, initMoveAnim, loadEncounterAnimAssets, loadMoveAnimAssets, MoveAnim } from "./data/battle-anims"; import { getStatusEffectActivationText, getStatusEffectCatchRateMultiplier, getStatusEffectHealText, getStatusEffectObtainText, getStatusEffectOverlapText, StatusEffect } from "./data/status-effect"; import { SummaryUiMode } from "./ui/summary-ui-handler"; import EvolutionSceneHandler from "./ui/evolution-scene-handler"; @@ -832,6 +832,11 @@ export class EncounterPhase extends BattlePhase { mysteryEncounter.populateDialogueTokensFromRequirements(this.scene); }, this.scene.currentBattle.waveIndex); + // Add any special encounter animations to load + if (mysteryEncounter.encounterAnimations && mysteryEncounter.encounterAnimations.length > 0) { + loadEnemyAssets.push(initEncounterAnims(this.scene, mysteryEncounter.encounterAnimations).then(() => loadEncounterAnimAssets(this.scene, true))); + } + // Add intro visuals for mystery encounter mysteryEncounter.initIntroVisuals(this.scene); this.scene.field.add(mysteryEncounter.introVisuals); diff --git a/src/test/phases/mystery-encounter-phase.test.ts b/src/test/phases/mystery-encounter-phase.test.ts index 0ae9ad35ed7..eef252bfff2 100644 --- a/src/test/phases/mystery-encounter-phase.test.ts +++ b/src/test/phases/mystery-encounter-phase.test.ts @@ -89,8 +89,8 @@ describe("Mystery Encounter Phases", () => { expect(dialogueSpy).toHaveBeenCalledTimes(1); expect(messageSpy).toHaveBeenCalledTimes(2); expect(dialogueSpy).toHaveBeenCalledWith("What's this?", "???", null, expect.any(Function)); - expect(messageSpy).toHaveBeenCalledWith("Mysterious challengers have appeared!", null, expect.any(Function), 750, true); - expect(messageSpy).toHaveBeenCalledWith("The trainer steps forward...", null, expect.any(Function), 750, true); + expect(messageSpy).toHaveBeenCalledWith("Mysterious challengers have appeared!", null, expect.any(Function), 300, true); + expect(messageSpy).toHaveBeenCalledWith("The trainer steps forward...", null, expect.any(Function), 300, true); }); }); From 0c397db686d9165a5c73cd30ff952442e8ee2524 Mon Sep 17 00:00:00 2001 From: flx-sta <50131232+flx-sta@users.noreply.github.com> Date: Wed, 17 Jul 2024 22:36:14 -0700 Subject: [PATCH 171/270] Update and rename mystery-event.yml to mystery-events.yml --- .github/workflows/{mystery-event.yml => mystery-events.yml} | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename .github/workflows/{mystery-event.yml => mystery-events.yml} (94%) diff --git a/.github/workflows/mystery-event.yml b/.github/workflows/mystery-events.yml similarity index 94% rename from .github/workflows/mystery-event.yml rename to .github/workflows/mystery-events.yml index 016ea7abdba..3e42af23f9c 100644 --- a/.github/workflows/mystery-event.yml +++ b/.github/workflows/mystery-events.yml @@ -1,7 +1,7 @@ # These are workflows use exclusively for the mystery events sub-project # It's basically a copy of eslint.yml & test.yml just aimed at a different branch -name: Mystery Events workflows +name: MysteryEvents on: # Trigger the workflow on push or pull request, @@ -50,4 +50,4 @@ jobs: run: npm ci # Use 'npm ci' to install dependencies - name: tests # Step to run tests - run: npm run test:silent + run: npm run test${{ runner.debug == '0' &&':silent' }} # silent on default. if debug run loud From 2b8246e2f4611d7b552d3aea2ee0f54895bb29cb Mon Sep 17 00:00:00 2001 From: flx-sta <50131232+flx-sta@users.noreply.github.com> Date: Wed, 17 Jul 2024 22:38:33 -0700 Subject: [PATCH 172/270] Update mystery-events.yml --- .github/workflows/mystery-events.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/mystery-events.yml b/.github/workflows/mystery-events.yml index 3e42af23f9c..af04d0a969f 100644 --- a/.github/workflows/mystery-events.yml +++ b/.github/workflows/mystery-events.yml @@ -14,8 +14,8 @@ on: - mystery-battle-events # Trigger on pull request events targeting the mystery-battle-events branch jobs: - run-linters: # Define a job named "run-linters" - name: Run linters # Human-readable name for the job + lint: # Define a job named "run-linters" + name: Lint # Human-readable name for the job runs-on: ubuntu-latest # Specify the latest Ubuntu runner for the job steps: @@ -33,8 +33,8 @@ jobs: - name: eslint # Step to run linters run: npm run eslint-ci - run-tests: # Define a job named "run-tests" - name: Run tests # Human-readable name for the job + test: # Define a job named "run-tests" + name: Test # Human-readable name for the job runs-on: ubuntu-latest # Specify the latest Ubuntu runner for the job steps: From bc059d59a07bcd70b1462eee79495bcc86261c0e Mon Sep 17 00:00:00 2001 From: flx-sta <50131232+flx-sta@users.noreply.github.com> Date: Wed, 17 Jul 2024 22:39:02 -0700 Subject: [PATCH 173/270] Fix typo --- .github/workflows/mystery-events.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/mystery-events.yml b/.github/workflows/mystery-events.yml index af04d0a969f..991480756db 100644 --- a/.github/workflows/mystery-events.yml +++ b/.github/workflows/mystery-events.yml @@ -1,4 +1,4 @@ -# These are workflows use exclusively for the mystery events sub-project +# These are workflows used exclusively for the mystery events sub-project # It's basically a copy of eslint.yml & test.yml just aimed at a different branch name: MysteryEvents From 21f519d8ad3843d1d813f451519c40749ae5d300 Mon Sep 17 00:00:00 2001 From: flx-sta <50131232+flx-sta@users.noreply.github.com> Date: Wed, 17 Jul 2024 22:53:58 -0700 Subject: [PATCH 174/270] Update mystery-events.yml Fix debug runs --- .github/workflows/mystery-events.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/mystery-events.yml b/.github/workflows/mystery-events.yml index 991480756db..66ab3dd1659 100644 --- a/.github/workflows/mystery-events.yml +++ b/.github/workflows/mystery-events.yml @@ -50,4 +50,4 @@ jobs: run: npm ci # Use 'npm ci' to install dependencies - name: tests # Step to run tests - run: npm run test${{ runner.debug == '0' &&':silent' }} # silent on default. if debug run loud + run: npm run test${{ runner.debug == '0' &&':silent' || '' }} # silent on default. if debug run loud From 2697a738babafef7f5996936e9a8632c9905fc43 Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Thu, 18 Jul 2024 11:04:52 -0400 Subject: [PATCH 175/270] clean up unit tests and utils --- .../encounters/fiery-fallout-encounter.ts | 2 +- .../encounters/safari-zone-encounter.ts | 11 +-- .../mystery-encounters/mystery-encounter.ts | 14 ++-- .../utils/encounter-phase-utils.ts | 6 +- src/overrides.ts | 4 +- .../mystery-encounter/encounterTestUtils.ts | 79 ++++++++++++------- .../encounters/lost-at-sea-encounter.test.ts | 15 +--- .../mystery-encounter-utils.test.ts | 40 +++------- .../mystery-encounter.test.ts | 16 +--- .../phases/mystery-encounter-phase.test.ts | 39 +++++---- src/test/utils/TextInterceptor.ts | 5 ++ src/test/utils/gameManager.ts | 2 +- .../utils/mocks/mocksContainer/mockText.ts | 8 ++ src/test/utils/overridesHelper.ts | 55 ++++++++++--- src/test/utils/phaseInterceptor.ts | 2 +- src/test/utils/testUtils.ts | 13 --- 16 files changed, 166 insertions(+), 145 deletions(-) diff --git a/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts b/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts index df637aa4cfd..45987c928a1 100644 --- a/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts +++ b/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts @@ -145,7 +145,7 @@ export const FieryFalloutEncounter: IMysteryEncounter = .withOption( new MysteryEncounterOptionBuilder() .withOptionMode(EncounterOptionMode.DISABLED_OR_SPECIAL) - .withPrimaryPokemonRequirement(new TypeRequirement(Type.FIRE, 2)) // Will set option2PrimaryName and option2PrimaryMove dialogue tokens automatically + .withPrimaryPokemonRequirement(new TypeRequirement(Type.FIRE, true,2)) // Will set option2PrimaryName and option2PrimaryMove dialogue tokens automatically .withDialogue({ buttonLabel: `${namespace}_option_3_label`, buttonTooltip: `${namespace}_option_3_tooltip`, diff --git a/src/data/mystery-encounters/encounters/safari-zone-encounter.ts b/src/data/mystery-encounters/encounters/safari-zone-encounter.ts index 05cf76fae5f..42e4d17d518 100644 --- a/src/data/mystery-encounters/encounters/safari-zone-encounter.ts +++ b/src/data/mystery-encounters/encounters/safari-zone-encounter.ts @@ -57,7 +57,7 @@ export const SafariZoneEncounter: IMysteryEncounter = .withOptionPhase(async (scene: BattleScene) => { // Start safari encounter const encounter = scene.currentBattle.mysteryEncounter; - encounter.encounterVariant = MysteryEncounterVariant.SAFARI_BATTLE; + encounter.encounterVariant = MysteryEncounterVariant.REPEATED_ENCOUNTER; encounter.misc = { safariPokemonRemaining: 3 }; @@ -463,14 +463,15 @@ function tryChangeCatchStage(scene: BattleScene, change: number, chance?: number return true; } -async function doEndTurn(scene: BattleScene, cursorIndex: number, message?: string) { - const pokemon = scene.currentBattle.mysteryEncounter.misc.pokemon; - const isFlee = isPokemonFlee(pokemon, scene.currentBattle.mysteryEncounter.misc.fleeStage); +async function doEndTurn(scene: BattleScene, cursorIndex: number) { + const encounter = scene.currentBattle.mysteryEncounter; + const pokemon = encounter.misc.pokemon; + const isFlee = isPokemonFlee(pokemon, encounter.misc.fleeStage); if (isFlee) { // Pokemon flees! await doPokemonFlee(scene, pokemon); // Check how many safari pokemon left - if (scene.currentBattle.mysteryEncounter.misc.safariPokemonRemaining > 0) { + if (encounter.misc.safariPokemonRemaining > 0) { await summonSafariPokemon(scene); initSubsequentOptionSelect(scene, { overrideOptions: safariZoneGameOptions, startingCursorIndex: cursorIndex, hideDescription: true }); } else { diff --git a/src/data/mystery-encounters/mystery-encounter.ts b/src/data/mystery-encounters/mystery-encounter.ts index 489bbd84d0a..1c6ad219799 100644 --- a/src/data/mystery-encounters/mystery-encounter.ts +++ b/src/data/mystery-encounters/mystery-encounter.ts @@ -27,7 +27,7 @@ export enum MysteryEncounterVariant { WILD_BATTLE, BOSS_BATTLE, NO_BATTLE, - SAFARI_BATTLE + REPEATED_ENCOUNTER } export enum MysteryEncounterTier { @@ -38,7 +38,7 @@ export enum MysteryEncounterTier { MASTER // Not currently used } -export class StartOfBattleEffect { +export interface StartOfBattleEffect { sourcePokemon?: Pokemon; sourceBattlerIndex?: BattlerIndex; targets: BattlerIndex[]; @@ -108,10 +108,6 @@ export default interface IMysteryEncounter { * You should never need to modify this */ seedOffset?: any; - /** - * Will be set by option select handlers automatically, and can be used to refer to which option was chosen by later phases - */ - startOfBattleEffectsComplete?: boolean; /** * Flags @@ -134,6 +130,10 @@ export default interface IMysteryEncounter { * Will be set to false after a shop is shown (so can't reroll same rarity items for free) */ lockEncounterRewardTiers?: boolean; + /** + * Will be set automatically, indicates special moves in startOfBattleEffects are complete (so will not repeat) + */ + startOfBattleEffectsComplete?: boolean; /** * Will be set by option select handlers automatically, and can be used to refer to which option was chosen by later phases */ @@ -473,6 +473,8 @@ export class MysteryEncounterBuilder implements Partial { /** * Defines any EncounterAnim animations that are intended to be used during the encounter + * EncounterAnims can be played at any point during an encounter or callback + * They just need to be specified here so that resources are loaded on encounter init * @param encounterAnimations * @returns */ diff --git a/src/data/mystery-encounters/utils/encounter-phase-utils.ts b/src/data/mystery-encounters/utils/encounter-phase-utils.ts index 3c35263fae2..6e13bbb0874 100644 --- a/src/data/mystery-encounters/utils/encounter-phase-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-phase-utils.ts @@ -555,8 +555,10 @@ export function handleMysteryEncounterVictory(scene: BattleScene, addHealPhase: return; } - if (scene.currentBattle.mysteryEncounter.encounterVariant === MysteryEncounterVariant.SAFARI_BATTLE) { - scene.pushPhase(new MysteryEncounterRewardsPhase(scene, addHealPhase)); + // If in repeated encounter variant, do nothing + // Variant must eventually be swapped in order to handle "true" end of the encounter + if (scene.currentBattle.mysteryEncounter.encounterVariant === MysteryEncounterVariant.REPEATED_ENCOUNTER) { + return; } else if (scene.currentBattle.mysteryEncounter.encounterVariant === MysteryEncounterVariant.NO_BATTLE) { scene.pushPhase(new EggLapsePhase(scene)); scene.pushPhase(new MysteryEncounterRewardsPhase(scene, addHealPhase)); diff --git a/src/overrides.ts b/src/overrides.ts index f7fa3c5fc86..e19a5bf20dd 100644 --- a/src/overrides.ts +++ b/src/overrides.ts @@ -117,9 +117,9 @@ export const EGG_GACHA_PULL_COUNT_OVERRIDE: number = 0; */ // 1 to 256, set to null to ignore -export const MYSTERY_ENCOUNTER_RATE_OVERRIDE: number = 256; +export const MYSTERY_ENCOUNTER_RATE_OVERRIDE: number = null; export const MYSTERY_ENCOUNTER_TIER_OVERRIDE: MysteryEncounterTier = null; -export const MYSTERY_ENCOUNTER_OVERRIDE: MysteryEncounterType = MysteryEncounterType.FIERY_FALLOUT; +export const MYSTERY_ENCOUNTER_OVERRIDE: MysteryEncounterType = null; /** * MODIFIER / ITEM OVERRIDES diff --git a/src/test/mystery-encounter/encounterTestUtils.ts b/src/test/mystery-encounter/encounterTestUtils.ts index 65f6ae0edc9..1a602b7b239 100644 --- a/src/test/mystery-encounter/encounterTestUtils.ts +++ b/src/test/mystery-encounter/encounterTestUtils.ts @@ -1,17 +1,19 @@ import { Button } from "#app/enums/buttons"; -import { MessagePhase } from "#app/phases"; +import { MessagePhase, VictoryPhase } from "#app/phases"; import { MysteryEncounterPhase, MysteryEncounterRewardsPhase } from "#app/phases/mystery-encounter-phase"; import MysteryEncounterUiHandler from "#app/ui/mystery-encounter-ui-handler"; import { Mode } from "#app/ui/ui"; import GameManager from "../utils/gameManager"; +import MessageUiHandler from "#app/ui/message-ui-handler"; export async function runSelectMysteryEncounterOption(game: GameManager, optionNo: number) { + // Handle any eventual queued messages (e.g. weather phase, etc.) + game.onNextPrompt("MessagePhase", Mode.MESSAGE, () => { + const uiHandler = game.scene.ui.getHandler(); + uiHandler.processInput(Button.ACTION); + }); + if (game.isCurrentPhase(MessagePhase)) { - // Handle eventual weather messages (e.g. a downpour started!) - game.onNextPrompt("MessagePhase", Mode.MESSAGE, () => { - const uiHandler = game.scene.ui.getHandler(); - uiHandler.processInput(Button.ACTION); - }); await game.phaseInterceptor.run(MessagePhase); } @@ -20,35 +22,56 @@ export async function runSelectMysteryEncounterOption(game: GameManager, optionN const uiHandler = game.scene.ui.getHandler(); uiHandler.processInput(Button.ACTION); }); - // select the desired option - game.onNextPrompt("MysteryEncounterPhase", Mode.MYSTERY_ENCOUNTER, () => { - const uiHandler = game.scene.ui.getHandler(); - uiHandler.unblockInput(); // input are blocked by 1s to prevent accidental input. Tests need to handle that - switch (optionNo) { - case 1: - // no movement needed. Default cursor position - break; - case 2: - uiHandler.processInput(Button.RIGHT); - break; - case 3: - uiHandler.processInput(Button.DOWN); - break; - case 4: - uiHandler.processInput(Button.RIGHT); - uiHandler.processInput(Button.DOWN); - break; - } - - uiHandler.processInput(Button.ACTION); - }); await game.phaseInterceptor.run(MysteryEncounterPhase); + // select the desired option + const uiHandler = game.scene.ui.getHandler(); + uiHandler.unblockInput(); // input are blocked by 1s to prevent accidental input. Tests need to handle that + + switch (optionNo) { + case 1: + // no movement needed. Default cursor position + break; + case 2: + uiHandler.processInput(Button.RIGHT); + break; + case 3: + uiHandler.processInput(Button.DOWN); + break; + case 4: + uiHandler.processInput(Button.RIGHT); + uiHandler.processInput(Button.DOWN); + break; + } + + uiHandler.processInput(Button.ACTION); + // run the selected options phase game.onNextPrompt("MysteryEncounterOptionSelectedPhase", Mode.MESSAGE, () => { const uiHandler = game.scene.ui.getHandler(); uiHandler.processInput(Button.ACTION); }); + + // If a battle is started, fast forward to end of the battle + game.onNextPrompt("CommandPhase", Mode.COMMAND, () => { + game.scene.clearPhaseQueue(); + game.scene.clearPhaseQueueSplice(); + game.scene.unshiftPhase(new VictoryPhase(game.scene, 0)); + game.endPhase(); + }); + + // Handle end of battle trainer messages + game.onNextPrompt("TrainerVictoryPhase", Mode.MESSAGE, () => { + const uiHandler = game.scene.ui.getHandler(); + uiHandler.processInput(Button.ACTION); + }); + + // Handle egg hatch dialogue + game.onNextPrompt("EggLapsePhase", Mode.MESSAGE, () => { + const uiHandler = game.scene.ui.getHandler(); + uiHandler.processInput(Button.ACTION); + }); + await game.phaseInterceptor.to(MysteryEncounterRewardsPhase); } 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 3b8017fa4c6..14dd43be8bb 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 @@ -9,7 +9,6 @@ import { Moves } from "#app/enums/moves"; import { MysteryEncounterType } from "#app/enums/mystery-encounter-type"; import { Species } from "#app/enums/species"; import GameManager from "#app/test/utils/gameManager"; -import { workaround_reInitSceneWithOverrides } from "#app/test/utils/testUtils"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { runSelectMysteryEncounterOption } from "../encounterTestUtils"; @@ -30,8 +29,9 @@ describe("Lost at Sea - Mystery Encounter", () => { beforeEach(async () => { game = new GameManager(phaserGame); game.override.mysteryEncounterChance(100); - game.override.startingBiome(defaultBiome); game.override.startingWave(defaultWave); + game.override.startingBiome(defaultBiome); + vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue( new Map([ [Biome.SEA, [MysteryEncounterType.LOST_AT_SEA]], @@ -45,7 +45,6 @@ describe("Lost at Sea - Mystery Encounter", () => { }); it("should have the correct properties", async () => { - await workaround_reInitSceneWithOverrides(game); await game.runToMysteryEncounter(defaultParty); expect(LostAtSeaEncounter.encounterType).toBe(MysteryEncounterType.LOST_AT_SEA); @@ -59,7 +58,6 @@ describe("Lost at Sea - Mystery Encounter", () => { it("should not spawn outside of sea biome", async () => { game.override.startingBiome(Biome.MOUNTAIN); - await workaround_reInitSceneWithOverrides(game); await game.runToMysteryEncounter(); expect(game.scene.currentBattle.mysteryEncounter.encounterType).not.toBe(MysteryEncounterType.LOST_AT_SEA); @@ -117,7 +115,6 @@ describe("Lost at Sea - Mystery Encounter", () => { it("should award exp to surfable PKM (Blastoise)", async () => { const laprasSpecies = getPokemonSpecies(Species.LAPRAS); - await workaround_reInitSceneWithOverrides(game); await game.runToMysteryEncounter(defaultParty); const party = game.scene.getParty(); const blastoise = party.find((pkm) => pkm.species.speciesId === Species.PIDGEOT); @@ -126,13 +123,12 @@ describe("Lost at Sea - Mystery Encounter", () => { await runSelectMysteryEncounterOption(game, 2); expect(blastoise.exp).toBe(expBefore + laprasSpecies.baseExp * defaultWave); - }); + }, 10000000); it("should leave encounter without battle", async () => { game.override.startingWave(33); const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); - await workaround_reInitSceneWithOverrides(game); await game.runToMysteryEncounter(defaultParty); await runSelectMysteryEncounterOption(game, 1); @@ -168,7 +164,6 @@ describe("Lost at Sea - Mystery Encounter", () => { const wave = 33; game.override.startingWave(wave); - await workaround_reInitSceneWithOverrides(game); await game.runToMysteryEncounter(defaultParty); const party = game.scene.getParty(); const pidgeot = party.find((pkm) => pkm.species.speciesId === Species.PIDGEOT); @@ -183,7 +178,7 @@ describe("Lost at Sea - Mystery Encounter", () => { game.override.startingWave(33); const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); - await workaround_reInitSceneWithOverrides(game); + // await workaround_reInitSceneWithOverrides(game); await game.runToMysteryEncounter(defaultParty); await runSelectMysteryEncounterOption(game, 2); @@ -215,7 +210,6 @@ describe("Lost at Sea - Mystery Encounter", () => { it("should damage all (allowed in battle) party PKM by 25%", async () => { game.override.startingWave(33); - await workaround_reInitSceneWithOverrides(game); await game.runToMysteryEncounter(defaultParty); const party = game.scene.getParty(); @@ -237,7 +231,6 @@ describe("Lost at Sea - Mystery Encounter", () => { game.override.startingWave(33); const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); - workaround_reInitSceneWithOverrides(game); await game.runToMysteryEncounter(defaultParty); await runSelectMysteryEncounterOption(game, 3); diff --git a/src/test/mystery-encounter/mystery-encounter-utils.test.ts b/src/test/mystery-encounter/mystery-encounter-utils.test.ts index 22582f8a8bc..2867bcc63bc 100644 --- a/src/test/mystery-encounter/mystery-encounter-utils.test.ts +++ b/src/test/mystery-encounter/mystery-encounter-utils.test.ts @@ -36,16 +36,12 @@ describe("Mystery Encounter Utils", () => { describe("getRandomPlayerPokemon", () => { it("gets a random pokemon from player party", () => { // Seeds are calculated to return index 0 first, 1 second (if both pokemon are legal) - scene.waveSeed = "random"; - Phaser.Math.RND.sow([scene.waveSeed]); - scene.rngCounter = 0; + game.override.seed("random"); let result = getRandomPlayerPokemon(scene); expect(result.species.speciesId).toBe(Species.MANAPHY); - scene.waveSeed = "random2"; - Phaser.Math.RND.sow([scene.waveSeed]); - scene.rngCounter = 0; + game.override.seed("random2"); result = getRandomPlayerPokemon(scene); expect(result.species.speciesId).toBe(Species.ARCEUS); @@ -60,16 +56,12 @@ describe("Mystery Encounter Utils", () => { }); // Seeds are calculated to return index 0 first, 1 second (if both pokemon are legal) - scene.waveSeed = "random"; - Phaser.Math.RND.sow([scene.waveSeed]); - scene.rngCounter = 0; + game.override.seed("random"); let result = getRandomPlayerPokemon(scene); expect(result.species.speciesId).toBe(Species.MANAPHY); - scene.waveSeed = "random2"; - Phaser.Math.RND.sow([scene.waveSeed]); - scene.rngCounter = 0; + game.override.seed("random2"); result = getRandomPlayerPokemon(scene); expect(result.species.speciesId).toBe(Species.ARCEUS); @@ -83,16 +75,12 @@ describe("Mystery Encounter Utils", () => { party[0].updateInfo(); // Seeds are calculated to return index 0 first, 1 second (if both pokemon are legal) - scene.waveSeed = "random"; - Phaser.Math.RND.sow([scene.waveSeed]); - scene.rngCounter = 0; + game.override.seed("random"); let result = getRandomPlayerPokemon(scene, true); expect(result.species.speciesId).toBe(Species.MANAPHY); - scene.waveSeed = "random2"; - Phaser.Math.RND.sow([scene.waveSeed]); - scene.rngCounter = 0; + game.override.seed("random2"); result = getRandomPlayerPokemon(scene, true); expect(result.species.speciesId).toBe(Species.MANAPHY); @@ -106,16 +94,12 @@ describe("Mystery Encounter Utils", () => { party[0].updateInfo(); // Seeds are calculated to return index 0 first, 1 second (if both pokemon are legal) - scene.waveSeed = "random"; - Phaser.Math.RND.sow([scene.waveSeed]); - scene.rngCounter = 0; + game.override.seed("random"); let result = getRandomPlayerPokemon(scene, true, false); expect(result.species.speciesId).toBe(Species.MANAPHY); - scene.waveSeed = "random2"; - Phaser.Math.RND.sow([scene.waveSeed]); - scene.rngCounter = 0; + game.override.seed("random2"); result = getRandomPlayerPokemon(scene, true, false); expect(result.species.speciesId).toBe(Species.MANAPHY); @@ -129,16 +113,12 @@ describe("Mystery Encounter Utils", () => { party[0].updateInfo(); // Seeds are calculated to return index 0 first, 1 second (if both pokemon are legal) - scene.waveSeed = "random"; - Phaser.Math.RND.sow([scene.waveSeed]); - scene.rngCounter = 0; + game.override.seed("random"); let result = getRandomPlayerPokemon(scene, true, true); expect(result.species.speciesId).toBe(Species.ARCEUS); - scene.waveSeed = "random2"; - Phaser.Math.RND.sow([scene.waveSeed]); - scene.rngCounter = 0; + game.override.seed("random2"); result = getRandomPlayerPokemon(scene, true, true); expect(result.species.speciesId).toBe(Species.ARCEUS); diff --git a/src/test/mystery-encounter/mystery-encounter.test.ts b/src/test/mystery-encounter/mystery-encounter.test.ts index f4a083c06d4..8ed2e4756ca 100644 --- a/src/test/mystery-encounter/mystery-encounter.test.ts +++ b/src/test/mystery-encounter/mystery-encounter.test.ts @@ -1,5 +1,4 @@ -import { afterEach, beforeAll, beforeEach, expect, describe, it, vi } from "vitest"; -import * as overrides from "../../overrides"; +import { afterEach, beforeAll, beforeEach, expect, describe, it } from "vitest"; import GameManager from "#app/test/utils/gameManager"; import Phaser from "phaser"; import { Species } from "#enums/species"; @@ -22,16 +21,9 @@ describe("Mystery Encounters", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "MYSTERY_ENCOUNTER_RATE_OVERRIDE", "get").mockReturnValue(256); - vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(11); - vi.spyOn(overrides, "MYSTERY_ENCOUNTER_OVERRIDE", "get").mockReturnValue(MysteryEncounterType.MYSTERIOUS_CHALLENGERS); - - // Seed guarantees wild encounter to be replaced by ME - vi.spyOn(game.scene, "resetSeed").mockImplementation(() => { - game.scene.waveSeed = "test"; - Phaser.Math.RND.sow([game.scene.waveSeed]); - game.scene.rngCounter = 0; - }); + game.override.startingWave(11); + game.override.mysteryEncounterChance(100); + game.override.mysteryEncounter(MysteryEncounterType.MYSTERIOUS_CHALLENGERS); }); it("Spawns a mystery encounter", async () => { diff --git a/src/test/phases/mystery-encounter-phase.test.ts b/src/test/phases/mystery-encounter-phase.test.ts index eef252bfff2..91e6a09bb99 100644 --- a/src/test/phases/mystery-encounter-phase.test.ts +++ b/src/test/phases/mystery-encounter-phase.test.ts @@ -1,14 +1,14 @@ -import {afterEach, beforeAll, beforeEach, expect, describe, it, vi} from "vitest"; -import * as overrides from "../../overrides"; +import {afterEach, beforeAll, beforeEach, expect, describe, it, vi } from "vitest"; import GameManager from "#app/test/utils/gameManager"; import Phaser from "phaser"; import {Species} from "#enums/species"; -import {MysteryEncounterOptionSelectedPhase, MysteryEncounterPhase} from "#app/phases/mystery-encounter-phase"; +import { MysteryEncounterOptionSelectedPhase, MysteryEncounterPhase } from "#app/phases/mystery-encounter-phase"; import {Mode} from "#app/ui/ui"; import {Button} from "#enums/buttons"; import MysteryEncounterUiHandler from "#app/ui/mystery-encounter-ui-handler"; import {MysteryEncounterType} from "#enums/mystery-encounter-type"; import {MysteryEncounterTier} from "#app/data/mystery-encounters/mystery-encounter"; +import MessageUiHandler from "#app/ui/message-ui-handler"; describe("Mystery Encounter Phases", () => { let phaserGame: Phaser.Game; @@ -26,16 +26,11 @@ describe("Mystery Encounter Phases", () => { beforeEach(() => { game = new GameManager(phaserGame); - vi.spyOn(overrides, "MYSTERY_ENCOUNTER_RATE_OVERRIDE", "get").mockReturnValue(256); - vi.spyOn(overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(11); - vi.spyOn(overrides, "MYSTERY_ENCOUNTER_OVERRIDE", "get").mockReturnValue(MysteryEncounterType.MYSTERIOUS_CHALLENGERS); - + game.override.startingWave(11); + game.override.mysteryEncounterChance(100); + game.override.mysteryEncounter(MysteryEncounterType.MYSTERIOUS_CHALLENGERS); // Seed guarantees wild encounter to be replaced by ME - vi.spyOn(game.scene, "resetSeed").mockImplementation(() => { - game.scene.waveSeed = "test"; - Phaser.Math.RND.sow([ game.scene.waveSeed ]); - game.scene.rngCounter = 0; - }); + game.override.seed("test"); }); describe("MysteryEncounterPhase", () => { @@ -75,21 +70,25 @@ describe("Mystery Encounter Phases", () => { Species.VOLCARONA ]); - game.onNextPrompt("MysteryEncounterPhase", Mode.MYSTERY_ENCOUNTER, () => { - // Select option 1 for encounter - const handler = game.scene.ui.getHandler() as MysteryEncounterUiHandler; - handler.unblockInput(); + game.onNextPrompt("MysteryEncounterPhase", Mode.MESSAGE, () => { + const handler = game.scene.ui.getHandler() as MessageUiHandler; handler.processInput(Button.ACTION); - }, () => !game.isCurrentPhase(MysteryEncounterPhase)); + }); + await game.phaseInterceptor.run(MysteryEncounterPhase); - // After option selected - expect(game.scene.getCurrentPhase().constructor.name).toBe(MysteryEncounterOptionSelectedPhase.name); + // Select option 1 for encounter + const handler = game.scene.ui.getHandler() as MysteryEncounterUiHandler; + handler.unblockInput(); + handler.processInput(Button.ACTION); + + // Waitfor required so that option select messages and preOptionPhase logic are handled + await vi.waitFor(() => expect(game.scene.getCurrentPhase().constructor.name).toBe(MysteryEncounterOptionSelectedPhase.name)); expect(game.scene.ui.getMode()).toBe(Mode.MESSAGE); expect(dialogueSpy).toHaveBeenCalledTimes(1); expect(messageSpy).toHaveBeenCalledTimes(2); expect(dialogueSpy).toHaveBeenCalledWith("What's this?", "???", null, expect.any(Function)); - expect(messageSpy).toHaveBeenCalledWith("Mysterious challengers have appeared!", null, expect.any(Function), 300, true); + expect(messageSpy).toHaveBeenCalledWith("Mysterious challengers have appeared!", null, expect.any(Function), 750, true); expect(messageSpy).toHaveBeenCalledWith("The trainer steps forward...", null, expect.any(Function), 300, true); }); }); diff --git a/src/test/utils/TextInterceptor.ts b/src/test/utils/TextInterceptor.ts index 34b55aa30ac..a49f41f6be0 100644 --- a/src/test/utils/TextInterceptor.ts +++ b/src/test/utils/TextInterceptor.ts @@ -11,6 +11,11 @@ export default class TextInterceptor { this.logs.push(text); } + showDialogue(text: string, name: string, delay?: integer, callback?: Function, callbackDelay?: integer, promptDelay?: integer): void { + console.log(name, text); + this.logs.push(name, text); + } + getLatestMessage(): string { return this.logs.pop(); } diff --git a/src/test/utils/gameManager.ts b/src/test/utils/gameManager.ts index 6c750c60a92..f0c7d08c6b7 100644 --- a/src/test/utils/gameManager.ts +++ b/src/test/utils/gameManager.ts @@ -62,7 +62,7 @@ export default class GameManager { this.phaseInterceptor = new PhaseInterceptor(this.scene); this.textInterceptor = new TextInterceptor(this.scene); this.gameWrapper.setScene(this.scene); - this.override = new OverridesHelper(); + this.override = new OverridesHelper(this); } /** diff --git a/src/test/utils/mocks/mocksContainer/mockText.ts b/src/test/utils/mocks/mocksContainer/mockText.ts index 1dd440fde7c..2e6ed67f21f 100644 --- a/src/test/utils/mocks/mocksContainer/mockText.ts +++ b/src/test/utils/mocks/mocksContainer/mockText.ts @@ -17,6 +17,7 @@ export default class MockText { // Phaser.GameObjects.Text.prototype.updateText = () => null; // Phaser.Textures.TextureManager.prototype.addCanvas = () => {}; UI.prototype.showText = this.showText; + UI.prototype.showDialogue = this.showDialogue; // super(scene, x, y); // this.phaserText = new Phaser.GameObjects.Text(scene, x, y, content, styleOptions); } @@ -79,6 +80,13 @@ export default class MockText { } } + showDialogue(text, name, delay, callback, callbackDelay, promptDelay) { + this.scene.messageWrapper.showDialogue(text, name, delay, callback, callbackDelay, promptDelay); + if (callback) { + callback(); + } + } + setScale(scale) { // return this.phaserText.setScale(scale); } diff --git a/src/test/utils/overridesHelper.ts b/src/test/utils/overridesHelper.ts index dd45d972b50..85d458bf826 100644 --- a/src/test/utils/overridesHelper.ts +++ b/src/test/utils/overridesHelper.ts @@ -1,61 +1,90 @@ import { Weather, WeatherType } from "#app/data/weather"; import { Biome } from "#app/enums/biome"; import * as Overrides from "#app/overrides"; -import { vi } from "vitest"; +import { MockInstance, vi } from "vitest"; +import GameManager from "#test/utils/gameManager"; +import { MysteryEncounterType } from "#enums/mystery-encounter-type"; +import * as overrides from "#app/overrides"; /** * Helper to handle overrides in tests */ export class OverridesHelper { - constructor() {} + game: GameManager; + constructor(game: GameManager) { + this.game = game; + } /** * Override the encounter chance for a mystery encounter. * @param percentage the encounter chance in % + * @returns spy instance */ - mysteryEncounterChance(percentage: number) { + mysteryEncounterChance(percentage: number): MockInstance { const maxRate: number = 256; // 100% const rate = maxRate * (percentage / 100); - vi.spyOn(Overrides, "MYSTERY_ENCOUNTER_RATE_OVERRIDE", "get").mockReturnValue(rate); + const spy = vi.spyOn(Overrides, "MYSTERY_ENCOUNTER_RATE_OVERRIDE", "get").mockReturnValue(rate); this.log(`Mystery encounter chance set to ${percentage}% (=${rate})!`); + return spy; + } + + /** + * Override the encounter that spawns for the scene + * @param encounterType + * @returns spy instance + */ + mysteryEncounter(encounterType: MysteryEncounterType): MockInstance { + const spy = vi.spyOn(overrides, "MYSTERY_ENCOUNTER_OVERRIDE", "get").mockReturnValue(encounterType); + this.log(`Mystery encounter override set to ${encounterType}!`); + return spy; } /** * Override the starting biome - * @warning The biome will not be overridden unless you call `workaround_reInitSceneWithOverrides()` (testUtils) + * @warning Any event listeners that are attached to [NewArenaEvent](events\battle-scene.ts) may need to be handled down the line * @param biome the biome to set */ startingBiome(biome: Biome) { - vi.spyOn(Overrides, "STARTING_BIOME_OVERRIDE", "get").mockReturnValue(biome); + this.game.scene.newArena(biome); this.log(`Starting biome set to ${Biome[biome]} (=${biome})!`); } /** * Override the starting wave (index) * @param wave the wave (index) to set. Classic: `1`-`200` + * @returns spy instance */ - startingWave(wave: number) { - vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(wave); + startingWave(wave: number): MockInstance { + const spy = vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(wave); this.log(`Starting wave set to ${wave}!`); + return spy; } /** * Override the weather (type) * @param type weather type to set + * @returns spy instance */ - weather(type: WeatherType) { - vi.spyOn(Overrides, "WEATHER_OVERRIDE", "get").mockReturnValue(type); + weather(type: WeatherType): MockInstance { + const spy = vi.spyOn(Overrides, "WEATHER_OVERRIDE", "get").mockReturnValue(type); this.log(`Weather set to ${Weather[type]} (=${type})!`); + return spy; } /** * Override the seed - * @warning The seed will not be overridden unless you call `workaround_reInitSceneWithOverrides()` (testUtils) * @param seed the seed to set + * @returns spy instance */ - seed(seed: string) { - vi.spyOn(Overrides, "SEED_OVERRIDE", "get").mockReturnValue(seed); + seed(seed: string): MockInstance { + const spy = vi.spyOn(this.game.scene, "resetSeed").mockImplementation(() => { + this.game.scene.waveSeed = seed; + Phaser.Math.RND.sow([seed]); + this.game.scene.rngCounter = 0; + }); + this.game.scene.resetSeed(); this.log(`Seed set to "${seed}"!`); + return spy; } private log(...params: any[]) { diff --git a/src/test/utils/phaseInterceptor.ts b/src/test/utils/phaseInterceptor.ts index 71cf6b495ed..aa297e4944c 100644 --- a/src/test/utils/phaseInterceptor.ts +++ b/src/test/utils/phaseInterceptor.ts @@ -108,7 +108,7 @@ export default class PhaseInterceptor { ]; private endBySetMode = [ - TitlePhase, SelectGenderPhase, CommandPhase, SelectModifierPhase, PostMysteryEncounterPhase + TitlePhase, SelectGenderPhase, CommandPhase, SelectModifierPhase, MysteryEncounterPhase, PostMysteryEncounterPhase ]; /** diff --git a/src/test/utils/testUtils.ts b/src/test/utils/testUtils.ts index a8461b3a5db..b922fc9c61c 100644 --- a/src/test/utils/testUtils.ts +++ b/src/test/utils/testUtils.ts @@ -1,6 +1,5 @@ import i18next, { type ParseKeys } from "i18next"; import { vi } from "vitest"; -import GameManager from "./gameManager"; /** * Sets up the i18next mock. @@ -22,15 +21,3 @@ export function mockI18next() { export function arrayOfRange(start: integer, end: integer) { return Array.from({ length: end - start }, (_v, k) => k + start); } - -/** - * Woraround to reinitialize the game scene with overrides being set properly. - * By default the scene is initialized without all overrides even having a chance to be applied. - * @warning USE AT YOUR OWN RISK! Might be deleted in the future - * @param game The game manager - * @deprecated - */ -export async function workaround_reInitSceneWithOverrides(game: GameManager) { - await game.runToTitle(); - game.gameWrapper.setScene(game.scene); -} From 1ffefe744d93b9cebefc06c615c40fbce3e50c11 Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Thu, 18 Jul 2024 11:19:39 -0400 Subject: [PATCH 176/270] attach github issues to all encounter jsdocs --- .../encounters/dark-deal-encounter.ts | 7 ++++++- .../encounters/department-store-sale-encounter.ts | 5 +++++ .../encounters/field-trip-encounter.ts | 5 +++++ .../encounters/fiery-fallout-encounter.ts | 5 +++++ .../encounters/fight-or-flight-encounter.ts | 5 +++++ .../encounters/lost-at-sea-encounter.ts | 2 +- .../encounters/mysterious-challengers-encounter.ts | 5 +++++ .../encounters/mysterious-chest-encounter.ts | 5 +++++ .../encounters/safari-zone-encounter.ts | 5 +++++ .../encounters/shady-vitamin-dealer-encounter.ts | 5 +++++ .../encounters/sleeping-snorlax-encounter.ts | 14 +++++++------- .../encounters/training-session-encounter.ts | 5 +++++ src/locales/en/mystery-encounter.ts | 4 ++-- .../{lost-at-sea.ts => lost-at-sea-dialogue.ts} | 2 +- .../encounters/lost-at-sea-encounter.test.ts | 2 +- 15 files changed, 63 insertions(+), 13 deletions(-) rename src/locales/en/mystery-encounters/{lost-at-sea.ts => lost-at-sea-dialogue.ts} (97%) diff --git a/src/data/mystery-encounters/encounters/dark-deal-encounter.ts b/src/data/mystery-encounters/encounters/dark-deal-encounter.ts index f9a339db8c2..103fe82ea9f 100644 --- a/src/data/mystery-encounters/encounters/dark-deal-encounter.ts +++ b/src/data/mystery-encounters/encounters/dark-deal-encounter.ts @@ -15,7 +15,7 @@ import { getRandomPlayerPokemon, getRandomSpeciesByStarterTier } from "#app/data /** i18n namespace for encounter */ const namespace = "mysteryEncounter:dark_deal"; -// Exclude Ultra Beasts, Paradox, Necrozma, Eternatus, and egg-locked mythicals +/** Exclude Ultra Beasts (inludes Cosmog/Solgaleo/Lunala/Necrozma), Paradox (includes Miraidon/Koraidon), Eternatus, and egg-locked mythicals */ const excludedBosses = [ Species.NECROZMA, Species.COSMOG, @@ -68,6 +68,11 @@ const excludedBosses = [ Species.PECHARUNT, ]; +/** + * Dark Deal encounter. + * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/61 | GitHub Issue #61} + * @see For biome requirements check [mysteryEncountersByBiome](../mystery-encounters.ts) + */ export const DarkDealEncounter: IMysteryEncounter = MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.DARK_DEAL) .withEncounterTier(MysteryEncounterTier.ROGUE) 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 f3bb422aa64..4156acdc7b7 100644 --- a/src/data/mystery-encounters/encounters/department-store-sale-encounter.ts +++ b/src/data/mystery-encounters/encounters/department-store-sale-encounter.ts @@ -15,6 +15,11 @@ import IMysteryEncounter, { /** i18n namespace for encounter */ const namespace = "mysteryEncounter:department_store_sale"; +/** + * Department Store Sale encounter. + * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/33 | GitHub Issue #33} + * @see For biome requirements check [mysteryEncountersByBiome](../mystery-encounters.ts) + */ export const DepartmentStoreSaleEncounter: IMysteryEncounter = MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.DEPARTMENT_STORE_SALE) .withEncounterTier(MysteryEncounterTier.COMMON) diff --git a/src/data/mystery-encounters/encounters/field-trip-encounter.ts b/src/data/mystery-encounters/encounters/field-trip-encounter.ts index bc369ee4c4b..2d4aa645f4a 100644 --- a/src/data/mystery-encounters/encounters/field-trip-encounter.ts +++ b/src/data/mystery-encounters/encounters/field-trip-encounter.ts @@ -21,6 +21,11 @@ import IMysteryEncounter, { /** i18n namespace for the encounter */ const namespace = "mysteryEncounter:field_trip"; +/** + * Field Trip encounter. + * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/17 | GitHub Issue #17} + * @see For biome requirements check [mysteryEncountersByBiome](../mystery-encounters.ts) + */ export const FieldTripEncounter: IMysteryEncounter = MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.FIELD_TRIP) .withEncounterTier(MysteryEncounterTier.COMMON) diff --git a/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts b/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts index 45987c928a1..77030cadb04 100644 --- a/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts +++ b/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts @@ -19,6 +19,11 @@ import { randSeedInt } from "#app/utils"; /** the i18n namespace for the encounter */ const namespace = "mysteryEncounter:fiery_fallout"; +/** + * Fiery Fallout encounter. + * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/88 | GitHub Issue #88} + * @see For biome requirements check [mysteryEncountersByBiome](../mystery-encounters.ts) + */ export const FieryFalloutEncounter: IMysteryEncounter = MysteryEncounterBuilder.withEncounterType( MysteryEncounterType.FIERY_FALLOUT 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 db7495f6cfa..8b61b690bfa 100644 --- a/src/data/mystery-encounters/encounters/fight-or-flight-encounter.ts +++ b/src/data/mystery-encounters/encounters/fight-or-flight-encounter.ts @@ -31,6 +31,11 @@ import { queueEncounterMessage, showEncounterText } from "#app/data/mystery-enco /** the i18n namespace for the encounter */ const namespace = "mysteryEncounter:fight_or_flight"; +/** + * Fight or Flight encounter. + * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/24 | GitHub Issue #24} + * @see For biome requirements check [mysteryEncountersByBiome](../mystery-encounters.ts) + */ export const FightOrFlightEncounter: IMysteryEncounter = MysteryEncounterBuilder.withEncounterType( MysteryEncounterType.FIGHT_OR_FLIGHT 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 9e25e003e1b..276da15a2ae 100644 --- a/src/data/mystery-encounters/encounters/lost-at-sea-encounter.ts +++ b/src/data/mystery-encounters/encounters/lost-at-sea-encounter.ts @@ -16,7 +16,7 @@ const OPTION_2_REQUIRED_MOVE = Moves.FLY; */ const DAMAGE_PERCENTAGE: number = 25; /** The i18n namespace for the encounter */ -const namepsace = "mysteryEncounter:lostAtSea"; +const namepsace = "mysteryEncounter:lostAtSeaDialogue"; /** * Lost at sea encounter. diff --git a/src/data/mystery-encounters/encounters/mysterious-challengers-encounter.ts b/src/data/mystery-encounters/encounters/mysterious-challengers-encounter.ts index f9fe8ab3d42..a2df4968f1d 100644 --- a/src/data/mystery-encounters/encounters/mysterious-challengers-encounter.ts +++ b/src/data/mystery-encounters/encounters/mysterious-challengers-encounter.ts @@ -23,6 +23,11 @@ import IMysteryEncounter, { /** the i18n namespace for the encounter */ const namespace = "mysteryEncounter:mysterious_challengers"; +/** + * Mysterious Challengers encounter. + * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/41 | GitHub Issue #41} + * @see For biome requirements check [mysteryEncountersByBiome](../mystery-encounters.ts) + */ export const MysteriousChallengersEncounter: IMysteryEncounter = MysteryEncounterBuilder.withEncounterType( MysteryEncounterType.MYSTERIOUS_CHALLENGERS diff --git a/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts b/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts index 9a0a42af2c8..87529900799 100644 --- a/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts +++ b/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts @@ -14,6 +14,11 @@ import IMysteryEncounter, { } from "../mystery-encounter"; import { EncounterOptionMode, MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; +/** + * Mysterious Chest encounter. + * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/32 | GitHub Issue #32} + * @see For biome requirements check [mysteryEncountersByBiome](../mystery-encounters.ts) + */ export const MysteriousChestEncounter: IMysteryEncounter = MysteryEncounterBuilder.withEncounterType( MysteryEncounterType.MYSTERIOUS_CHEST diff --git a/src/data/mystery-encounters/encounters/safari-zone-encounter.ts b/src/data/mystery-encounters/encounters/safari-zone-encounter.ts index 42e4d17d518..18c6b296b42 100644 --- a/src/data/mystery-encounters/encounters/safari-zone-encounter.ts +++ b/src/data/mystery-encounters/encounters/safari-zone-encounter.ts @@ -19,6 +19,11 @@ import { showEncounterText } from "#app/data/mystery-encounters/utils/encounter- /** the i18n namespace for the encounter */ const namespace = "mysteryEncounter:safari_zone"; +/** + * Safari Zone encounter. + * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/39 | GitHub Issue #39} + * @see For biome requirements check [mysteryEncountersByBiome](../mystery-encounters.ts) + */ export const SafariZoneEncounter: IMysteryEncounter = MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.SAFARI_ZONE) .withEncounterTier(MysteryEncounterTier.GREAT) 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 7e32ca87c55..5ce90f988bd 100644 --- a/src/data/mystery-encounters/encounters/shady-vitamin-dealer-encounter.ts +++ b/src/data/mystery-encounters/encounters/shady-vitamin-dealer-encounter.ts @@ -15,6 +15,11 @@ import { queueEncounterMessage } from "#app/data/mystery-encounters/utils/encoun /** the i18n namespace for this encounter */ const namespace = "mysteryEncounter:shady_vitamin_dealer"; +/** + * Shady Vitamin Dealer encounter. + * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/34 | GitHub Issue #34} + * @see For biome requirements check [mysteryEncountersByBiome](../mystery-encounters.ts) + */ export const ShadyVitaminDealerEncounter: IMysteryEncounter = MysteryEncounterBuilder.withEncounterType( MysteryEncounterType.SHADY_VITAMIN_DEALER diff --git a/src/data/mystery-encounters/encounters/sleeping-snorlax-encounter.ts b/src/data/mystery-encounters/encounters/sleeping-snorlax-encounter.ts index 9d3659f9443..98013352353 100644 --- a/src/data/mystery-encounters/encounters/sleeping-snorlax-encounter.ts +++ b/src/data/mystery-encounters/encounters/sleeping-snorlax-encounter.ts @@ -16,11 +16,16 @@ import { queueEncounterMessage } from "#app/data/mystery-encounters/utils/encoun /** i18n namespace for the encounter */ const namespace = "mysteryEncounter:sleeping_snorlax"; +/** + * Sleeping Snorlax encounter. + * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/103 | GitHub Issue #103} + * @see For biome requirements check [mysteryEncountersByBiome](../mystery-encounters.ts) + */ export const SleepingSnorlaxEncounter: IMysteryEncounter = MysteryEncounterBuilder.withEncounterType( MysteryEncounterType.SLEEPING_SNORLAX ) - .withEncounterTier(MysteryEncounterTier.ULTRA) + .withEncounterTier(MysteryEncounterTier.GREAT) .withSceneWaveRangeRequirement(10, 180) // waves 10 to 180 .withCatchAllowed(true) .withHideWildIntroMessage(true) @@ -110,12 +115,7 @@ export const SleepingSnorlaxEncounter: IMysteryEncounter = const p = instance.primaryPokemon; p.status = new Status(StatusEffect.SLEEP, 0, 3); p.updateInfo(true); - // const sitrus = (modifierTypes.BERRY?.() as ModifierTypeGenerator).generateType(scene.getParty(), [BerryType.SITRUS]); - const sitrus = generateModifierTypeOption( - scene, - modifierTypes.BERRY, - [BerryType.SITRUS] - ); + const sitrus = generateModifierTypeOption(scene, modifierTypes.BERRY, [BerryType.SITRUS]); setEncounterRewards(scene, { guaranteedModifierTypeOptions: [sitrus], diff --git a/src/data/mystery-encounters/encounters/training-session-encounter.ts b/src/data/mystery-encounters/encounters/training-session-encounter.ts index 1c0c3633883..0829ce69040 100644 --- a/src/data/mystery-encounters/encounters/training-session-encounter.ts +++ b/src/data/mystery-encounters/encounters/training-session-encounter.ts @@ -21,6 +21,11 @@ import { queueEncounterMessage } from "#app/data/mystery-encounters/utils/encoun /** The i18n namespace for the encounter */ const namespace = "mysteryEncounter:training_session"; +/** + * Training Session encounter. + * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/43 | GitHub Issue #43} + * @see For biome requirements check [mysteryEncountersByBiome](../mystery-encounters.ts) + */ export const TrainingSessionEncounter: IMysteryEncounter = MysteryEncounterBuilder.withEncounterType( MysteryEncounterType.TRAINING_SESSION diff --git a/src/locales/en/mystery-encounter.ts b/src/locales/en/mystery-encounter.ts index a23518aac60..a35815646b7 100644 --- a/src/locales/en/mystery-encounter.ts +++ b/src/locales/en/mystery-encounter.ts @@ -1,4 +1,4 @@ -import { lostAtSea } from "./mystery-encounters/lost-at-sea"; +import { lostAtSeaDialogue } from "./mystery-encounters/lost-at-sea-dialogue"; /** * Patterns that can be used: @@ -260,5 +260,5 @@ export const mysteryEncounter = { $@s{item_fanfare}You gained a Berry!`, "sleeping_snorlax_option_3_good_result": "Your {{option3PrimaryName}} uses {{option3PrimaryMove}}! @s{item_fanfare}It steals Leftovers off the sleeping Snorlax and you make out like bandits!", - lostAtSea, + lostAtSea: lostAtSeaDialogue, } as const; diff --git a/src/locales/en/mystery-encounters/lost-at-sea.ts b/src/locales/en/mystery-encounters/lost-at-sea-dialogue.ts similarity index 97% rename from src/locales/en/mystery-encounters/lost-at-sea.ts rename to src/locales/en/mystery-encounters/lost-at-sea-dialogue.ts index 6e37168a255..523dba6e10f 100644 --- a/src/locales/en/mystery-encounters/lost-at-sea.ts +++ b/src/locales/en/mystery-encounters/lost-at-sea-dialogue.ts @@ -1,4 +1,4 @@ -export const lostAtSea = { +export const lostAtSeaDialogue = { intro: "Wandering aimlessly, you effectively get nowhere.", title: "Lost at sea", description: "The sea is turbulent in this area, and you seem to be running out of fuel.\nThis is bad. Is there a way out of the situation?", 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 14dd43be8bb..48f7275fdff 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 @@ -12,7 +12,7 @@ import GameManager from "#app/test/utils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { runSelectMysteryEncounterOption } from "../encounterTestUtils"; -const namepsace = "mysteryEncounter:lostAtSea"; +const namepsace = "mysteryEncounter:lostAtSeaDialogue"; /** Blastoise for surf. Pidgeot for fly. Abra for none. */ const defaultParty = [Species.BLASTOISE, Species.PIDGEOT, Species.ABRA]; const defaultBiome = Biome.SEA; From a3664b462470e29e496322bf34b1edf1e6303518 Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Thu, 18 Jul 2024 11:35:57 -0400 Subject: [PATCH 177/270] start dialogue refactor --- .../encounters/mysterious-chest-encounter.ts | 47 +++++++++---------- .../mystery-encounters/dark-deal-dialogue.ts | 31 ++++++++++++ .../department-store-sale-dialogue.ts | 31 ++++++++++++ .../mystery-encounters/field-trip-dialogue.ts | 31 ++++++++++++ .../fiery-fallout-dialogue.ts | 31 ++++++++++++ .../fight-or-flight-dialogue.ts | 31 ++++++++++++ .../lost-at-sea-dialogue.ts | 14 +++--- .../mysterious-challengers-dialogue.ts | 31 ++++++++++++ .../mysterious-chest-dialogue.ts | 27 +++++++++++ .../safari-zone-dialogue.ts | 31 ++++++++++++ .../shady-vitamin-dealer-dialogue.ts | 31 ++++++++++++ .../sleeping-snorlax-dialogue.ts | 31 ++++++++++++ .../training-session-dialogue.ts | 31 ++++++++++++ 13 files changed, 365 insertions(+), 33 deletions(-) create mode 100644 src/locales/en/mystery-encounters/dark-deal-dialogue.ts create mode 100644 src/locales/en/mystery-encounters/department-store-sale-dialogue.ts create mode 100644 src/locales/en/mystery-encounters/field-trip-dialogue.ts create mode 100644 src/locales/en/mystery-encounters/fiery-fallout-dialogue.ts create mode 100644 src/locales/en/mystery-encounters/fight-or-flight-dialogue.ts create mode 100644 src/locales/en/mystery-encounters/mysterious-challengers-dialogue.ts create mode 100644 src/locales/en/mystery-encounters/mysterious-chest-dialogue.ts create mode 100644 src/locales/en/mystery-encounters/safari-zone-dialogue.ts create mode 100644 src/locales/en/mystery-encounters/shady-vitamin-dealer-dialogue.ts create mode 100644 src/locales/en/mystery-encounters/sleeping-snorlax-dialogue.ts create mode 100644 src/locales/en/mystery-encounters/training-session-dialogue.ts diff --git a/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts b/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts index 87529900799..91c5aaac0c0 100644 --- a/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts +++ b/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts @@ -1,28 +1,23 @@ import { queueEncounterMessage, showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; -import { - leaveEncounterWithoutBattle, - setEncounterRewards -} from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { leaveEncounterWithoutBattle, setEncounterRewards } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { getHighestLevelPlayerPokemon, koPlayerPokemon } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; import { ModifierTier } from "#app/modifier/modifier-tier"; import { randSeedInt } from "#app/utils.js"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import BattleScene from "../../../battle-scene"; -import IMysteryEncounter, { - MysteryEncounterBuilder, - MysteryEncounterTier, -} from "../mystery-encounter"; +import IMysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier, } from "../mystery-encounter"; import { EncounterOptionMode, MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; +/** i18n namespace for encounter */ +const namespace = "mysteryEncounter:dark_deal"; + /** * Mysterious Chest encounter. * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/32 | GitHub Issue #32} * @see For biome requirements check [mysteryEncountersByBiome](../mystery-encounters.ts) */ export const MysteriousChestEncounter: IMysteryEncounter = - MysteryEncounterBuilder.withEncounterType( - MysteryEncounterType.MYSTERIOUS_CHEST - ) + MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.MYSTERIOUS_CHEST) .withEncounterTier(MysteryEncounterTier.COMMON) .withSceneWaveRangeRequirement(10, 180) // waves 2 to 180 .withHideIntroVisuals(false) @@ -39,21 +34,21 @@ export const MysteriousChestEncounter: IMysteryEncounter = ]) .withIntroDialogue([ { - text: "mysteryEncounter:mysterious_chest_intro_message", + text: "${namespace}:intro:message", }, ]) - .withTitle("mysteryEncounter:mysterious_chest_title") - .withDescription("mysteryEncounter:mysterious_chest_description") - .withQuery("mysteryEncounter:mysterious_chest_query") + .withTitle(`${namespace}:title`) + .withDescription(`${namespace}:description`) + .withQuery(`${namespace}:query`) .withOption( new MysteryEncounterOptionBuilder() .withOptionMode(EncounterOptionMode.DEFAULT) .withDialogue({ - buttonLabel: "mysteryEncounter:mysterious_chest_option_1_label", - buttonTooltip: "mysteryEncounter:mysterious_chest_option_1_tooltip", + buttonLabel: `${namespace}:option:1:label`, + buttonTooltip: `${namespace}:option:1:tooltip`, selected: [ { - text: "mysteryEncounter:mysterious_chest_option_1_selected_message", + text: `${namespace}:option:1:selected`, }, ], }) @@ -78,7 +73,7 @@ export const MysteriousChestEncounter: IMysteryEncounter = ], }); // Display result message then proceed to rewards - queueEncounterMessage(scene, "mysteryEncounter:mysterious_chest_option_1_normal_result"); + queueEncounterMessage(scene, `${namespace}:option:1:normal`); leaveEncounterWithoutBattle(scene); } else if (roll > 40) { // Choose between 3 ULTRA tier items (20%) @@ -90,7 +85,7 @@ export const MysteriousChestEncounter: IMysteryEncounter = ], }); // Display result message then proceed to rewards - queueEncounterMessage(scene, "mysteryEncounter:mysterious_chest_option_1_good_result"); + queueEncounterMessage(scene, `${namespace}:option:1:good`); leaveEncounterWithoutBattle(scene); } else if (roll > 36) { // Choose between 2 ROGUE tier items (4%) @@ -98,7 +93,7 @@ export const MysteriousChestEncounter: IMysteryEncounter = guaranteedModifierTiers: [ModifierTier.ROGUE, ModifierTier.ROGUE], }); // Display result message then proceed to rewards - queueEncounterMessage(scene, "mysteryEncounter:mysterious_chest_option_1_great_result"); + queueEncounterMessage(scene, `${namespace}:option:1:great`); leaveEncounterWithoutBattle(scene); } else if (roll > 35) { // Choose 1 MASTER tier item (1%) @@ -106,7 +101,7 @@ export const MysteriousChestEncounter: IMysteryEncounter = guaranteedModifierTiers: [ModifierTier.MASTER], }); // Display result message then proceed to rewards - queueEncounterMessage(scene, "mysteryEncounter:mysterious_chest_option_1_amazing_result"); + queueEncounterMessage(scene, `${namespace}:option:1:amazing`); leaveEncounterWithoutBattle(scene); } else { // Your highest level unfainted Pok�mon gets OHKO. Progress with no rewards (35%) @@ -119,7 +114,7 @@ export const MysteriousChestEncounter: IMysteryEncounter = scene.currentBattle.mysteryEncounter.setDialogueToken("pokeName", highestLevelPokemon.name); // Show which Pokemon was KOed, then leave encounter with no rewards // Does this synchronously so that game over doesn't happen over result message - await showEncounterText(scene, "mysteryEncounter:mysterious_chest_option_1_bad_result").then(() => { + await showEncounterText(scene, `${namespace}:option:1:bad`).then(() => { leaveEncounterWithoutBattle(scene); }); } @@ -128,11 +123,11 @@ export const MysteriousChestEncounter: IMysteryEncounter = ) .withSimpleOption( { - buttonLabel: "mysteryEncounter:mysterious_chest_option_2_label", - buttonTooltip: "mysteryEncounter:mysterious_chest_option_2_tooltip", + buttonLabel: `${namespace}:option:2:label`, + buttonTooltip: `${namespace}:option:2:tooltip`, selected: [ { - text: "mysteryEncounter:mysterious_chest_option_2_selected_message", + text: `${namespace}:option:2:selected`, }, ], }, diff --git a/src/locales/en/mystery-encounters/dark-deal-dialogue.ts b/src/locales/en/mystery-encounters/dark-deal-dialogue.ts new file mode 100644 index 00000000000..85a238f7b72 --- /dev/null +++ b/src/locales/en/mystery-encounters/dark-deal-dialogue.ts @@ -0,0 +1,31 @@ +export const darkDealDialogue = { + intro: "Wandering aimlessly, you effectively get nowhere.", + title: "Lost at sea", + description: "The sea is turbulent in this area, and you seem to be running out of fuel.\nThis is bad. Is there a way out of the situation?", + query: "What will you do?", + option: { + 1: { + label: "{{option1PrimaryName}} can help", + 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.", + }, + 2: { + label: "{{option2PrimaryName}} can 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.", + }, + 3: { + label: "Wander aimlessly", + tooltip: "(-) Each of your Pokémon lose {{damagePercentage}}% of their total HP.", + selected: `You float about in the boat, steering it aimlessly until you finally get back on track. + $You and your Pokémon get very fatigued during the whole ordeal.`, + }, + }, + outro: "You are back on track." +}; diff --git a/src/locales/en/mystery-encounters/department-store-sale-dialogue.ts b/src/locales/en/mystery-encounters/department-store-sale-dialogue.ts new file mode 100644 index 00000000000..608cb0df5ff --- /dev/null +++ b/src/locales/en/mystery-encounters/department-store-sale-dialogue.ts @@ -0,0 +1,31 @@ +export const departmentStoreSaleDialogue = { + intro: "Wandering aimlessly, you effectively get nowhere.", + title: "Lost at sea", + description: "The sea is turbulent in this area, and you seem to be running out of fuel.\nThis is bad. Is there a way out of the situation?", + query: "What will you do?", + option: { + 1: { + label: "{{option1PrimaryName}} can help", + 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.", + }, + 2: { + label: "{{option2PrimaryName}} can 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.", + }, + 3: { + label: "Wander aimlessly", + tooltip: "(-) Each of your Pokémon lose {{damagePercentage}}% of their total HP.", + selected: `You float about in the boat, steering it aimlessly until you finally get back on track. + $You and your Pokémon get very fatigued during the whole ordeal.`, + }, + }, + outro: "You are back on track." +}; diff --git a/src/locales/en/mystery-encounters/field-trip-dialogue.ts b/src/locales/en/mystery-encounters/field-trip-dialogue.ts new file mode 100644 index 00000000000..9efa781de95 --- /dev/null +++ b/src/locales/en/mystery-encounters/field-trip-dialogue.ts @@ -0,0 +1,31 @@ +export const fieldTripDialogue = { + intro: "Wandering aimlessly, you effectively get nowhere.", + title: "Lost at sea", + description: "The sea is turbulent in this area, and you seem to be running out of fuel.\nThis is bad. Is there a way out of the situation?", + query: "What will you do?", + option: { + 1: { + label: "{{option1PrimaryName}} can help", + 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.", + }, + 2: { + label: "{{option2PrimaryName}} can 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.", + }, + 3: { + label: "Wander aimlessly", + tooltip: "(-) Each of your Pokémon lose {{damagePercentage}}% of their total HP.", + selected: `You float about in the boat, steering it aimlessly until you finally get back on track. + $You and your Pokémon get very fatigued during the whole ordeal.`, + }, + }, + outro: "You are back on track." +}; diff --git a/src/locales/en/mystery-encounters/fiery-fallout-dialogue.ts b/src/locales/en/mystery-encounters/fiery-fallout-dialogue.ts new file mode 100644 index 00000000000..a9d1a8c3c49 --- /dev/null +++ b/src/locales/en/mystery-encounters/fiery-fallout-dialogue.ts @@ -0,0 +1,31 @@ +export const fieryFalloutDialogue = { + intro: "Wandering aimlessly, you effectively get nowhere.", + title: "Lost at sea", + description: "The sea is turbulent in this area, and you seem to be running out of fuel.\nThis is bad. Is there a way out of the situation?", + query: "What will you do?", + option: { + 1: { + label: "{{option1PrimaryName}} can help", + 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.", + }, + 2: { + label: "{{option2PrimaryName}} can 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.", + }, + 3: { + label: "Wander aimlessly", + tooltip: "(-) Each of your Pokémon lose {{damagePercentage}}% of their total HP.", + selected: `You float about in the boat, steering it aimlessly until you finally get back on track. + $You and your Pokémon get very fatigued during the whole ordeal.`, + }, + }, + outro: "You are back on track." +}; diff --git a/src/locales/en/mystery-encounters/fight-or-flight-dialogue.ts b/src/locales/en/mystery-encounters/fight-or-flight-dialogue.ts new file mode 100644 index 00000000000..fcacae8ecb2 --- /dev/null +++ b/src/locales/en/mystery-encounters/fight-or-flight-dialogue.ts @@ -0,0 +1,31 @@ +export const fightOrFlightDialogue = { + intro: "Wandering aimlessly, you effectively get nowhere.", + title: "Lost at sea", + description: "The sea is turbulent in this area, and you seem to be running out of fuel.\nThis is bad. Is there a way out of the situation?", + query: "What will you do?", + option: { + 1: { + label: "{{option1PrimaryName}} can help", + 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.", + }, + 2: { + label: "{{option2PrimaryName}} can 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.", + }, + 3: { + label: "Wander aimlessly", + tooltip: "(-) Each of your Pokémon lose {{damagePercentage}}% of their total HP.", + selected: `You float about in the boat, steering it aimlessly until you finally get back on track. + $You and your Pokémon get very fatigued during the whole ordeal.`, + }, + }, + outro: "You are back on track." +}; diff --git a/src/locales/en/mystery-encounters/lost-at-sea-dialogue.ts b/src/locales/en/mystery-encounters/lost-at-sea-dialogue.ts index 523dba6e10f..344640610be 100644 --- a/src/locales/en/mystery-encounters/lost-at-sea-dialogue.ts +++ b/src/locales/en/mystery-encounters/lost-at-sea-dialogue.ts @@ -1,7 +1,7 @@ export const lostAtSeaDialogue = { - intro: "Wandering aimlessly, you effectively get nowhere.", - title: "Lost at sea", - description: "The sea is turbulent in this area, and you seem to be running out of fuel.\nThis is bad. Is there a way out of the situation?", + intro: "Wandering aimlessly through the sea, you've effectively gotten nowhere.", + title: "Lost at Sea", + description: "The sea is turbulent in this area, and you're running out of energy.\nThis is bad. Is there a way out of the situation?", query: "What will you do?", option: { 1: { @@ -9,16 +9,16 @@ export const lostAtSeaDialogue = { 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}} can 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", diff --git a/src/locales/en/mystery-encounters/mysterious-challengers-dialogue.ts b/src/locales/en/mystery-encounters/mysterious-challengers-dialogue.ts new file mode 100644 index 00000000000..bdb15b4e7b4 --- /dev/null +++ b/src/locales/en/mystery-encounters/mysterious-challengers-dialogue.ts @@ -0,0 +1,31 @@ +export const mysteriousChallengersDialogue = { + intro: "Wandering aimlessly, you effectively get nowhere.", + title: "Lost at sea", + description: "The sea is turbulent in this area, and you seem to be running out of fuel.\nThis is bad. Is there a way out of the situation?", + query: "What will you do?", + option: { + 1: { + label: "{{option1PrimaryName}} can help", + 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.", + }, + 2: { + label: "{{option2PrimaryName}} can 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.", + }, + 3: { + label: "Wander aimlessly", + tooltip: "(-) Each of your Pokémon lose {{damagePercentage}}% of their total HP.", + selected: `You float about in the boat, steering it aimlessly until you finally get back on track. + $You and your Pokémon get very fatigued during the whole ordeal.`, + }, + }, + outro: "You are back on track." +}; diff --git a/src/locales/en/mystery-encounters/mysterious-chest-dialogue.ts b/src/locales/en/mystery-encounters/mysterious-chest-dialogue.ts new file mode 100644 index 00000000000..74a578cfe39 --- /dev/null +++ b/src/locales/en/mystery-encounters/mysterious-chest-dialogue.ts @@ -0,0 +1,27 @@ +export const mysteriousChestDialogue = { + intro: "You found...@d{32} a chest?", + title: "The Mysterious Chest", + description: "A beautifully ornamented chest stands on the ground. There must be something good inside... right?", + query: "Will you open it?", + option: { + 1: { + label: "Open it", + tooltip: "@[SUMMARY_BLUE]{(35%) Something terrible}\n@[SUMMARY_GREEN]{(40%) Okay Rewards}\n@[SUMMARY_GREEN]{(20%) Good Rewards}\n@[SUMMARY_GREEN]{(4%) Great Rewards}\n@[SUMMARY_GREEN]{(1%) Amazing Rewards}", + selected: "You open the chest to find...", + normal: "Just some normal tools and items.", + 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! + $Your {{pokeName}} jumps in front of you\nbut is KOed in the process.`, + }, + 2: { + label: "It's too risky, leave", + tooltip: "(-) No Rewards", + selected: "You hurry along your way,\nwith a slight feeling of regret.", + }, + } +}; + + + diff --git a/src/locales/en/mystery-encounters/safari-zone-dialogue.ts b/src/locales/en/mystery-encounters/safari-zone-dialogue.ts new file mode 100644 index 00000000000..34fb6a9b44e --- /dev/null +++ b/src/locales/en/mystery-encounters/safari-zone-dialogue.ts @@ -0,0 +1,31 @@ +export const safariZoneDialogue = { + intro: "Wandering aimlessly, you effectively get nowhere.", + title: "Lost at sea", + description: "The sea is turbulent in this area, and you seem to be running out of fuel.\nThis is bad. Is there a way out of the situation?", + query: "What will you do?", + option: { + 1: { + label: "{{option1PrimaryName}} can help", + 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.", + }, + 2: { + label: "{{option2PrimaryName}} can 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.", + }, + 3: { + label: "Wander aimlessly", + tooltip: "(-) Each of your Pokémon lose {{damagePercentage}}% of their total HP.", + selected: `You float about in the boat, steering it aimlessly until you finally get back on track. + $You and your Pokémon get very fatigued during the whole ordeal.`, + }, + }, + outro: "You are back on track." +}; diff --git a/src/locales/en/mystery-encounters/shady-vitamin-dealer-dialogue.ts b/src/locales/en/mystery-encounters/shady-vitamin-dealer-dialogue.ts new file mode 100644 index 00000000000..ffa864a2efe --- /dev/null +++ b/src/locales/en/mystery-encounters/shady-vitamin-dealer-dialogue.ts @@ -0,0 +1,31 @@ +export const shadyVitaminDealerDialogue = { + intro: "Wandering aimlessly, you effectively get nowhere.", + title: "Lost at sea", + description: "The sea is turbulent in this area, and you seem to be running out of fuel.\nThis is bad. Is there a way out of the situation?", + query: "What will you do?", + option: { + 1: { + label: "{{option1PrimaryName}} can help", + 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.", + }, + 2: { + label: "{{option2PrimaryName}} can 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.", + }, + 3: { + label: "Wander aimlessly", + tooltip: "(-) Each of your Pokémon lose {{damagePercentage}}% of their total HP.", + selected: `You float about in the boat, steering it aimlessly until you finally get back on track. + $You and your Pokémon get very fatigued during the whole ordeal.`, + }, + }, + outro: "You are back on track." +}; diff --git a/src/locales/en/mystery-encounters/sleeping-snorlax-dialogue.ts b/src/locales/en/mystery-encounters/sleeping-snorlax-dialogue.ts new file mode 100644 index 00000000000..bb93657e8f3 --- /dev/null +++ b/src/locales/en/mystery-encounters/sleeping-snorlax-dialogue.ts @@ -0,0 +1,31 @@ +export const sleepingSnorlaxDialogue = { + intro: "Wandering aimlessly, you effectively get nowhere.", + title: "Lost at sea", + description: "The sea is turbulent in this area, and you seem to be running out of fuel.\nThis is bad. Is there a way out of the situation?", + query: "What will you do?", + option: { + 1: { + label: "{{option1PrimaryName}} can help", + 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.", + }, + 2: { + label: "{{option2PrimaryName}} can 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.", + }, + 3: { + label: "Wander aimlessly", + tooltip: "(-) Each of your Pokémon lose {{damagePercentage}}% of their total HP.", + selected: `You float about in the boat, steering it aimlessly until you finally get back on track. + $You and your Pokémon get very fatigued during the whole ordeal.`, + }, + }, + outro: "You are back on track." +}; diff --git a/src/locales/en/mystery-encounters/training-session-dialogue.ts b/src/locales/en/mystery-encounters/training-session-dialogue.ts new file mode 100644 index 00000000000..905141e57ca --- /dev/null +++ b/src/locales/en/mystery-encounters/training-session-dialogue.ts @@ -0,0 +1,31 @@ +export const trainingSessionDialogue = { + intro: "Wandering aimlessly, you effectively get nowhere.", + title: "Lost at sea", + description: "The sea is turbulent in this area, and you seem to be running out of fuel.\nThis is bad. Is there a way out of the situation?", + query: "What will you do?", + option: { + 1: { + label: "{{option1PrimaryName}} can help", + 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.", + }, + 2: { + label: "{{option2PrimaryName}} can 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.", + }, + 3: { + label: "Wander aimlessly", + tooltip: "(-) Each of your Pokémon lose {{damagePercentage}}% of their total HP.", + selected: `You float about in the boat, steering it aimlessly until you finally get back on track. + $You and your Pokémon get very fatigued during the whole ordeal.`, + }, + }, + outro: "You are back on track." +}; From fd48c3fcaec8937fe2404063b4bae11b1bc66a50 Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Thu, 18 Jul 2024 13:41:50 -0400 Subject: [PATCH 178/270] update sleeping snorlax encounter --- src/data/battler-tags.ts | 2 +- .../encounters/dark-deal-encounter.ts | 40 ++++---- .../encounters/fight-or-flight-encounter.ts | 34 +++---- .../encounters/lost-at-sea-encounter.ts | 38 ++++---- .../mysterious-challengers-encounter.ts | 2 +- .../encounters/mysterious-chest-encounter.ts | 2 +- .../encounters/sleeping-snorlax-encounter.ts | 97 ++++++++----------- .../mystery-encounters/mystery-encounter.ts | 2 +- .../mystery-encounters/mystery-encounters.ts | 13 +-- .../utils/encounter-phase-utils.ts | 67 ++++++++----- src/field/pokemon.ts | 3 +- src/locales/en/mystery-encounter.ts | 92 +++++------------- .../mystery-encounters/dark-deal-dialogue.ts | 44 ++++----- .../department-store-sale-dialogue.ts | 24 ++--- .../mystery-encounters/field-trip-dialogue.ts | 24 ++--- .../fiery-fallout-dialogue.ts | 24 ++--- .../fight-or-flight-dialogue.ts | 40 ++++---- .../lost-at-sea-dialogue.ts | 10 +- .../mysterious-challengers-dialogue.ts | 24 ++--- .../safari-zone-dialogue.ts | 24 ++--- .../shady-vitamin-dealer-dialogue.ts | 24 ++--- .../sleeping-snorlax-dialogue.ts | 24 ++--- .../training-session-dialogue.ts | 24 ++--- src/overrides.ts | 4 +- src/phases.ts | 2 +- ...r-phase.ts => mystery-encounter-phases.ts} | 23 +++++ .../mystery-encounter/encounterTestUtils.ts | 2 +- .../encounters/lost-at-sea-encounter.test.ts | 36 +++---- .../mystery-encounter.test.ts | 2 +- .../phases/mystery-encounter-phase.test.ts | 2 +- src/test/utils/gameManager.ts | 2 +- src/test/utils/phaseInterceptor.ts | 2 +- src/ui/mystery-encounter-ui-handler.ts | 2 +- 33 files changed, 362 insertions(+), 393 deletions(-) rename src/phases/{mystery-encounter-phase.ts => mystery-encounter-phases.ts} (96%) diff --git a/src/data/battler-tags.ts b/src/data/battler-tags.ts index e78977b56ba..060bf3efa19 100644 --- a/src/data/battler-tags.ts +++ b/src/data/battler-tags.ts @@ -1554,7 +1554,7 @@ export class MysteryEncounterPostSummonTag extends BattlerTag { const cancelled = new Utils.BooleanHolder(false); applyAbAttrs(ProtectStatAbAttr, pokemon, cancelled); if (!cancelled.value) { - const mysteryEncounterBattleEffects = pokemon.summonData.mysteryEncounterBattleEffects; + const mysteryEncounterBattleEffects = pokemon.mysteryEncounterBattleEffects; if (mysteryEncounterBattleEffects) { mysteryEncounterBattleEffects(pokemon); } diff --git a/src/data/mystery-encounters/encounters/dark-deal-encounter.ts b/src/data/mystery-encounters/encounters/dark-deal-encounter.ts index 103fe82ea9f..23ccba9c32e 100644 --- a/src/data/mystery-encounters/encounters/dark-deal-encounter.ts +++ b/src/data/mystery-encounters/encounters/dark-deal-encounter.ts @@ -13,7 +13,7 @@ import { EnemyPartyConfig, EnemyPokemonConfig, initBattleWithEnemyConfig, leaveE import { getRandomPlayerPokemon, getRandomSpeciesByStarterTier } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; /** i18n namespace for encounter */ -const namespace = "mysteryEncounter:dark_deal"; +const namespace = "mysteryEncounter:darkDeal"; /** Exclude Ultra Beasts (inludes Cosmog/Solgaleo/Lunala/Necrozma), Paradox (includes Miraidon/Koraidon), Eternatus, and egg-locked mythicals */ const excludedBosses = [ @@ -91,32 +91,32 @@ export const DarkDealEncounter: IMysteryEncounter = ]) .withIntroDialogue([ { - text: `${namespace}_intro_message`, + text: `${namespace}:intro`, }, { - speaker: `${namespace}_speaker`, - text: `${namespace}_intro_dialogue`, + speaker: `${namespace}:speaker`, + text: `${namespace}:intro_dialogue`, }, ]) .withSceneWaveRangeRequirement(30, 180) // waves 30 to 180 .withScenePartySizeRequirement(2, 6) // Must have at least 2 pokemon in party .withCatchAllowed(true) - .withTitle(`${namespace}_title`) - .withDescription(`${namespace}_description`) - .withQuery(`${namespace}_query`) + .withTitle(`${namespace}:title`) + .withDescription(`${namespace}:description`) + .withQuery(`${namespace}:query`) .withOption( new MysteryEncounterOptionBuilder() .withOptionMode(EncounterOptionMode.DEFAULT) .withDialogue({ - buttonLabel: `${namespace}_option_1_label`, - buttonTooltip: `${namespace}_option_1_tooltip`, + buttonLabel: `${namespace}:option:1:label`, + buttonTooltip: `${namespace}:option:1:tooltip`, selected: [ { - speaker: `${namespace}_speaker`, - text: `${namespace}_option_1_selected`, + speaker: `${namespace}:speaker`, + text: `${namespace}:option:1:selected_dialogue`, }, { - text: `${namespace}_option_1_selected_message`, + text: `${namespace}:option:1:selected_message`, }, ], }) @@ -126,10 +126,7 @@ export const DarkDealEncounter: IMysteryEncounter = const removedPokemon = getRandomPlayerPokemon(scene, false, true); scene.removePokemonFromPlayerParty(removedPokemon); - scene.currentBattle.mysteryEncounter.setDialogueToken( - "pokeName", - removedPokemon.name - ); + scene.currentBattle.mysteryEncounter.setDialogueToken("pokeName", removedPokemon.name); // Store removed pokemon types scene.currentBattle.mysteryEncounter.misc = [ @@ -158,7 +155,6 @@ export const DarkDealEncounter: IMysteryEncounter = pokemonConfig.formIndex = 0; } const config: EnemyPartyConfig = { - levelAdditiveMultiplier: 0.75, pokemonConfigs: [pokemonConfig], }; return initBattleWithEnemyConfig(scene, config); @@ -167,12 +163,12 @@ export const DarkDealEncounter: IMysteryEncounter = ) .withSimpleOption( { - buttonLabel: `${namespace}_option_2_label`, - buttonTooltip: `${namespace}_option_2_tooltip`, + buttonLabel: `${namespace}:option:2:label`, + buttonTooltip: `${namespace}:option:2:tooltip`, selected: [ { - speaker: `${namespace}_speaker`, - text: `${namespace}_option_2_selected`, + speaker: `${namespace}:speaker`, + text: `${namespace}:option:2:selected`, }, ], }, @@ -184,7 +180,7 @@ export const DarkDealEncounter: IMysteryEncounter = ) .withOutroDialogue([ { - text: `${namespace}_outro` + text: `${namespace}:outro` } ]) .build(); 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 8b61b690bfa..fc8ba869fe9 100644 --- a/src/data/mystery-encounters/encounters/fight-or-flight-encounter.ts +++ b/src/data/mystery-encounters/encounters/fight-or-flight-encounter.ts @@ -102,23 +102,23 @@ export const FightOrFlightEncounter: IMysteryEncounter = const primaryPokemon = encounter.options[1].primaryPokemon; if (primaryPokemon) { // Use primaryPokemon to execute the thievery - encounter.options[1].dialogue.buttonTooltip = `${namespace}_option_2_steal_tooltip`; + encounter.options[1].dialogue.buttonTooltip = `${namespace}:option:2:tooltip_special`; } else { - encounter.options[1].dialogue.buttonTooltip = `${namespace}_option_2_tooltip`; + encounter.options[1].dialogue.buttonTooltip = `${namespace}:option:2:tooltip`; } return true; }) - .withTitle(`${namespace}_title`) - .withDescription(`${namespace}_description`) - .withQuery(`${namespace}_query`) + .withTitle(`${namespace}:title`) + .withDescription(`${namespace}:description`) + .withQuery(`${namespace}:query`) .withSimpleOption( { - buttonLabel: `${namespace}_option_1_label`, - buttonTooltip: `${namespace}_option_1_tooltip`, + buttonLabel: `${namespace}:option:1:label`, + buttonTooltip: `${namespace}:option:1:tooltip`, selected: [ { - text: `${namespace}_option_1_selected_message`, + text: `${namespace}:option:1:selected`, }, ], }, @@ -135,8 +135,8 @@ export const FightOrFlightEncounter: IMysteryEncounter = .withOptionMode(EncounterOptionMode.DEFAULT_OR_SPECIAL) .withPrimaryPokemonRequirement(new MoveRequirement(STEALING_MOVES)) // Will set option2PrimaryName and option2PrimaryMove dialogue tokens automatically .withDialogue({ - buttonLabel: `${namespace}_option_2_label`, - buttonTooltip: `${namespace}_option_2_tooltip`, + buttonLabel: `${namespace}:option:2:label`, + buttonTooltip: `${namespace}:option:2:tooltip`, }) .withOptionPhase(async (scene: BattleScene) => { // Pick steal @@ -148,7 +148,7 @@ export const FightOrFlightEncounter: IMysteryEncounter = const primaryPokemon = encounter.options[1].primaryPokemon; if (primaryPokemon) { // Use primaryPokemon to execute the thievery - await showEncounterText(scene, `${namespace}_option_2_steal_result`); + await showEncounterText(scene, `${namespace}:option:2:steal_result`); leaveEncounterWithoutBattle(scene); return; } @@ -160,15 +160,15 @@ export const FightOrFlightEncounter: IMysteryEncounter = config.pokemonConfigs[0].tags = [BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON]; config.pokemonConfigs[0].mysteryEncounterBattleEffects = (pokemon: Pokemon) => { pokemon.scene.currentBattle.mysteryEncounter.setDialogueToken("enemyPokemon", pokemon.name); - queueEncounterMessage(pokemon.scene, `${namespace}_boss_enraged`); + queueEncounterMessage(pokemon.scene, `${namespace}:boss_enraged`); pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [BattleStat.ATK, BattleStat.DEF, BattleStat.SPATK, BattleStat.SPDEF, BattleStat.SPD], 1)); }; - await showEncounterText(scene, `${namespace}_option_2_bad_result`); + await showEncounterText(scene, `${namespace}:option:2:bad_result`); await initBattleWithEnemyConfig(scene, config); } else { // Steal item (37.5%) // Display result message then proceed to rewards - await showEncounterText(scene, `${namespace}_option_2_good_result`); + await showEncounterText(scene, `${namespace}:option:2:good_result`); leaveEncounterWithoutBattle(scene); } }) @@ -176,11 +176,11 @@ export const FightOrFlightEncounter: IMysteryEncounter = ) .withSimpleOption( { - buttonLabel: `${namespace}_option_3_label`, - buttonTooltip: `${namespace}_option_3_tooltip`, + buttonLabel: `${namespace}:option:3:label`, + buttonTooltip: `${namespace}:option:3:tooltip`, selected: [ { - text: `${namespace}_option_3_selected`, + text: `${namespace}:option:3:selected`, }, ], }, 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 276da15a2ae..fb7d1bcbbb5 100644 --- a/src/data/mystery-encounters/encounters/lost-at-sea-encounter.ts +++ b/src/data/mystery-encounters/encounters/lost-at-sea-encounter.ts @@ -16,7 +16,7 @@ const OPTION_2_REQUIRED_MOVE = Moves.FLY; */ const DAMAGE_PERCENTAGE: number = 25; /** The i18n namespace for the encounter */ -const namepsace = "mysteryEncounter:lostAtSeaDialogue"; +const namespace = "mysteryEncounter:lostAtSea"; /** * Lost at sea encounter. @@ -35,7 +35,7 @@ export const LostAtSeaEncounter: MysteryEncounter = MysteryEncounterBuilder.with y: 3, }, ]) - .withIntroDialogue([{ text: `${namepsace}:intro` }]) + .withIntroDialogue([{ text: `${namespace}:intro` }]) .withOnInit((scene: BattleScene) => { const { mysteryEncounter } = scene.currentBattle; @@ -45,22 +45,22 @@ export const LostAtSeaEncounter: MysteryEncounter = MysteryEncounterBuilder.with return true; }) - .withTitle(`${namepsace}:title`) - .withDescription(`${namepsace}:description`) - .withQuery(`${namepsace}:query`) + .withTitle(`${namespace}:title`) + .withDescription(`${namespace}:description`) + .withQuery(`${namespace}:query`) .withOption( // Option 1: Use a (non fainted) pokemon that can learn Surf to guide you back/ new MysteryEncounterOptionBuilder() .withPokemonCanLearnMoveRequirement(OPTION_1_REQUIRED_MOVE) .withOptionMode(EncounterOptionMode.DISABLED_OR_DEFAULT) .withDialogue({ - buttonLabel: `${namepsace}:option:1:label`, - disabledButtonLabel: `${namepsace}:option:1:label_disabled`, - buttonTooltip: `${namepsace}:option:1:tooltip`, - disabledButtonTooltip: `${namepsace}:option:1:tooltip_disabled`, + buttonLabel: `${namespace}:option:1:label`, + disabledButtonLabel: `${namespace}:option:1:label_disabled`, + buttonTooltip: `${namespace}:option:1:tooltip`, + disabledButtonTooltip: `${namespace}:option:1:tooltip_disabled`, selected: [ { - text: `${namepsace}:option:1:selected`, + text: `${namespace}:option:1:selected`, }, ], }) @@ -73,13 +73,13 @@ export const LostAtSeaEncounter: MysteryEncounter = MysteryEncounterBuilder.with .withPokemonCanLearnMoveRequirement(OPTION_2_REQUIRED_MOVE) .withOptionMode(EncounterOptionMode.DISABLED_OR_DEFAULT) .withDialogue({ - buttonLabel: `${namepsace}:option:2:label`, - disabledButtonLabel: `${namepsace}:option:2:label_disabled`, - buttonTooltip: `${namepsace}:option:2:tooltip`, - disabledButtonTooltip: `${namepsace}:option:2:tooltip_disabled`, + buttonLabel: `${namespace}:option:2:label`, + disabledButtonLabel: `${namespace}:option:2:label_disabled`, + buttonTooltip: `${namespace}:option:2:tooltip`, + disabledButtonTooltip: `${namespace}:option:2:tooltip_disabled`, selected: [ { - text: `${namepsace}:option:2:selected`, + text: `${namespace}:option:2:selected`, }, ], }) @@ -89,11 +89,11 @@ export const LostAtSeaEncounter: MysteryEncounter = MysteryEncounterBuilder.with .withSimpleOption( // Option 3: Wander aimlessly { - buttonLabel: `${namepsace}:option:3:label`, - buttonTooltip: `${namepsace}:option:3:tooltip`, + buttonLabel: `${namespace}:option:3:label`, + buttonTooltip: `${namespace}:option:3:tooltip`, selected: [ { - text: `${namepsace}:option:3:selected`, + text: `${namespace}:option:3:selected`, }, ], }, @@ -113,7 +113,7 @@ export const LostAtSeaEncounter: MysteryEncounter = MysteryEncounterBuilder.with ) .withOutroDialogue([ { - text: `${namepsace}:outro`, + text: `${namespace}:outro`, }, ]) .build(); diff --git a/src/data/mystery-encounters/encounters/mysterious-challengers-encounter.ts b/src/data/mystery-encounters/encounters/mysterious-challengers-encounter.ts index a2df4968f1d..a46f6fd5f8d 100644 --- a/src/data/mystery-encounters/encounters/mysterious-challengers-encounter.ts +++ b/src/data/mystery-encounters/encounters/mysterious-challengers-encounter.ts @@ -99,7 +99,7 @@ export const MysteriousChallengersEncounter: IMysteryEncounter = const brutalSpriteKey = brutalConfig.getSpriteKey(female, brutalConfig.doubleOnly); encounter.enemyPartyConfigs.push({ trainerConfig: brutalConfig, - levelAdditiveMultiplier: 1.1, + levelAdditiveMultiplier: 1, female: female, }); diff --git a/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts b/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts index 91c5aaac0c0..67ca533e893 100644 --- a/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts +++ b/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts @@ -9,7 +9,7 @@ import IMysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier, } fro import { EncounterOptionMode, MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; /** i18n namespace for encounter */ -const namespace = "mysteryEncounter:dark_deal"; +const namespace = "mysteryEncounter:mysteriousChest"; /** * Mysterious Chest encounter. diff --git a/src/data/mystery-encounters/encounters/sleeping-snorlax-encounter.ts b/src/data/mystery-encounters/encounters/sleeping-snorlax-encounter.ts index 98013352353..0e60304d9dc 100644 --- a/src/data/mystery-encounters/encounters/sleeping-snorlax-encounter.ts +++ b/src/data/mystery-encounters/encounters/sleeping-snorlax-encounter.ts @@ -1,17 +1,19 @@ import { STEALING_MOVES } from "#app/data/mystery-encounters/requirements/requirement-groups"; import { modifierTypes } from "#app/modifier/modifier-type"; -import { BerryType } from "#enums/berry-type"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { Species } from "#enums/species"; -import BattleScene from "../../../battle-scene"; -import * as Utils from "../../../utils"; -import { getPokemonSpecies } from "../../pokemon-species"; -import { Status, StatusEffect } from "../../status-effect"; +import BattleScene from "#app/battle-scene"; +import { StatusEffect } from "#app/data/status-effect"; import IMysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier, } from "../mystery-encounter"; import { EncounterOptionMode, MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; import { MoveRequirement } from "../mystery-encounter-requirements"; -import { EnemyPartyConfig, EnemyPokemonConfig, generateModifierTypeOption, initBattleWithEnemyConfig, leaveEncounterWithoutBattle, setEncounterExp, setEncounterRewards, } from "../utils/encounter-phase-utils"; +import { EnemyPartyConfig, EnemyPokemonConfig, initBattleWithEnemyConfig, initCustomMovesForEncounter, leaveEncounterWithoutBattle, setEncounterExp, setEncounterRewards, } from "../utils/encounter-phase-utils"; import { queueEncounterMessage } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; +import { Moves } from "#enums/moves"; +import { BattlerIndex } from "#app/battle"; +import { PokemonMove } from "#app/field/pokemon"; +import { getPokemonSpecies } from "#app/data/pokemon-species"; +import { PartyHealPhase } from "#app/phases"; /** i18n namespace for the encounter */ const namespace = "mysteryEncounter:sleeping_snorlax"; @@ -54,13 +56,18 @@ export const SleepingSnorlaxEncounter: IMysteryEncounter = const pokemonConfig: EnemyPokemonConfig = { species: bossSpecies, isBoss: true, - status: StatusEffect.SLEEP, + status: [StatusEffect.SLEEP, 5], // Extra turns on timer for Snorlax's start of fight moves + moveSet: [Moves.REST, Moves.SLEEP_TALK, Moves.CRUNCH, Moves.GIGA_IMPACT] }; const config: EnemyPartyConfig = { - levelAdditiveMultiplier: 2, + levelAdditiveMultiplier: 0.5, pokemonConfigs: [pokemonConfig], }; encounter.enemyPartyConfigs = [config]; + + // Load animations/sfx for Snorlax fight start moves + initCustomMovesForEncounter(scene, [Moves.SNORE]); + return true; }) .withTitle(`${namespace}_title`) @@ -78,12 +85,22 @@ export const SleepingSnorlaxEncounter: IMysteryEncounter = }, async (scene: BattleScene) => { // Pick battle - // TODO: do we want special rewards for this? - // setCustomEncounterRewards(scene, { guaranteedModifierTypeFuncs: [modifierTypes.LEFTOVERS], fillRemaining: true}); - await initBattleWithEnemyConfig( - scene, - scene.currentBattle.mysteryEncounter.enemyPartyConfigs[0] - ); + const encounter = scene.currentBattle.mysteryEncounter; + setEncounterRewards(scene, { guaranteedModifierTypeFuncs: [modifierTypes.LEFTOVERS], fillRemaining: true}); + encounter.startOfBattleEffects.push( + { + sourceBattlerIndex: BattlerIndex.ENEMY, + targets: [BattlerIndex.PLAYER], + move: new PokemonMove(Moves.SNORE), + ignorePp: true + }, + { + sourceBattlerIndex: BattlerIndex.ENEMY, + targets: [BattlerIndex.PLAYER], + move: new PokemonMove(Moves.SNORE), + ignorePp: true + }); + await initBattleWithEnemyConfig(scene, encounter.enemyPartyConfigs[0]); } ) .withSimpleOption( @@ -97,46 +114,11 @@ export const SleepingSnorlaxEncounter: IMysteryEncounter = ], }, async (scene: BattleScene) => { - const instance = scene.currentBattle.mysteryEncounter; - let roll: integer; - scene.executeWithSeedOffset(() => { - roll = Utils.randSeedInt(16, 0); - }, scene.currentBattle.waveIndex); - - // Half Snorlax exp to entire party - setEncounterExp( - scene, - scene.getParty().map((p) => p.id), - 98 - ); - - if (roll > 4) { - // Fall asleep and get a sitrus berry (75%) - const p = instance.primaryPokemon; - p.status = new Status(StatusEffect.SLEEP, 0, 3); - p.updateInfo(true); - const sitrus = generateModifierTypeOption(scene, modifierTypes.BERRY, [BerryType.SITRUS]); - - setEncounterRewards(scene, { - guaranteedModifierTypeOptions: [sitrus], - fillRemaining: false, - }); - queueEncounterMessage(scene, `${namespace}_option_2_bad_result`); - leaveEncounterWithoutBattle(scene); - } else { - // Heal to full (25%) - for (const pokemon of scene.getParty()) { - pokemon.hp = pokemon.getMaxHp(); - pokemon.resetStatus(); - for (const move of pokemon.moveset) { - move.ppUsed = 0; - } - pokemon.updateInfo(true); - } - - queueEncounterMessage(scene, `${namespace}_option_2_good_result`); - leaveEncounterWithoutBattle(scene); - } + // Fall asleep waiting for Snorlax + // Full heal party + scene.unshiftPhase(new PartyHealPhase(scene, true)); + queueEncounterMessage(scene, `${namespace}_option_2_good_result`); + leaveEncounterWithoutBattle(scene); } ) .withOption( @@ -151,13 +133,10 @@ export const SleepingSnorlaxEncounter: IMysteryEncounter = .withOptionPhase(async (scene: BattleScene) => { // Steal the Snorlax's Leftovers const instance = scene.currentBattle.mysteryEncounter; - setEncounterRewards(scene, { - guaranteedModifierTypeFuncs: [modifierTypes.LEFTOVERS], - fillRemaining: false, - }); + setEncounterRewards(scene, { guaranteedModifierTypeFuncs: [modifierTypes.LEFTOVERS], fillRemaining: false }); queueEncounterMessage(scene, `${namespace}_option_3_good_result`); // Snorlax exp to Pokemon that did the stealing - setEncounterExp(scene, [instance.primaryPokemon.id], 189); + setEncounterExp(scene, instance.primaryPokemon.id, getPokemonSpecies(Species.SNORLAX).baseExp); leaveEncounterWithoutBattle(scene); }) .build() diff --git a/src/data/mystery-encounters/mystery-encounter.ts b/src/data/mystery-encounters/mystery-encounter.ts index 1c6ad219799..5b65cb12260 100644 --- a/src/data/mystery-encounters/mystery-encounter.ts +++ b/src/data/mystery-encounters/mystery-encounter.ts @@ -43,8 +43,8 @@ export interface StartOfBattleEffect { sourceBattlerIndex?: BattlerIndex; targets: BattlerIndex[]; move: PokemonMove; + ignorePp: boolean; followUp?: boolean; - ignorePp?: boolean; } export default interface IMysteryEncounter { diff --git a/src/data/mystery-encounters/mystery-encounters.ts b/src/data/mystery-encounters/mystery-encounters.ts index 77e22fce9e9..672fb3300a4 100644 --- a/src/data/mystery-encounters/mystery-encounters.ts +++ b/src/data/mystery-encounters/mystery-encounters.ts @@ -158,14 +158,15 @@ const anyBiomeEncounters: MysteryEncounterType[] = [ */ export const mysteryEncountersByBiome = new Map([ [Biome.TOWN, []], - [Biome.PLAINS, []], + [Biome.PLAINS, [ + MysteryEncounterType.SLEEPING_SNORLAX + ]], [Biome.GRASS, [ MysteryEncounterType.SLEEPING_SNORLAX, ]], [Biome.TALL_GRASS, []], [Biome.METROPOLIS, []], [Biome.FOREST, [ - MysteryEncounterType.SLEEPING_SNORLAX, MysteryEncounterType.SAFARI_ZONE ]], @@ -178,13 +179,9 @@ export const mysteryEncountersByBiome = new Map([ [Biome.BEACH, []], [Biome.LAKE, []], [Biome.SEABED, []], - [Biome.MOUNTAIN, [ - MysteryEncounterType.SLEEPING_SNORLAX - ]], + [Biome.MOUNTAIN, []], [Biome.BADLANDS, []], - [Biome.CAVE, [ - MysteryEncounterType.SLEEPING_SNORLAX - ]], + [Biome.CAVE, []], [Biome.DESERT, []], [Biome.ICE_CAVE, []], [Biome.MEADOW, []], diff --git a/src/data/mystery-encounters/utils/encounter-phase-utils.ts b/src/data/mystery-encounters/utils/encounter-phase-utils.ts index 6e13bbb0874..44b9f7c8c7e 100644 --- a/src/data/mystery-encounters/utils/encounter-phase-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-phase-utils.ts @@ -3,13 +3,13 @@ import { biomeLinks } from "#app/data/biomes"; import MysteryEncounterOption from "#app/data/mystery-encounters/mystery-encounter-option"; import { WIGHT_INCREMENT_ON_SPAWN_MISS } from "#app/data/mystery-encounters/mystery-encounters"; import { queueEncounterMessage, showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; -import Pokemon, { FieldPosition, PlayerPokemon } from "#app/field/pokemon"; +import Pokemon, { FieldPosition, PlayerPokemon, PokemonMove } from "#app/field/pokemon"; import { getPokemonNameWithAffix } from "#app/messages"; import { ExpBalanceModifier, ExpShareModifier, MultipleParticipantExpBonusModifier, PokemonExpBoosterModifier } from "#app/modifier/modifier"; import { CustomModifierSettings, getModifierPoolForType, ModifierPoolType, ModifierType, ModifierTypeFunc, ModifierTypeGenerator, ModifierTypeOption, modifierTypes, PokemonHeldItemModifierType, regenerateModifierPoolThresholds } from "#app/modifier/modifier-type"; import * as Overrides from "#app/overrides"; import { BattleEndPhase, EggLapsePhase, ExpPhase, GameOverPhase, ModifierRewardPhase, MovePhase, SelectModifierPhase, ShowPartyExpBarPhase, TrainerVictoryPhase } from "#app/phases"; -import { MysteryEncounterBattlePhase, MysteryEncounterPhase, MysteryEncounterRewardsPhase } from "#app/phases/mystery-encounter-phase"; +import { MysteryEncounterBattlePhase, MysteryEncounterBattleStartCleanupPhase, MysteryEncounterPhase, MysteryEncounterRewardsPhase } from "#app/phases/mystery-encounter-phases"; import PokemonData from "#app/system/pokemon-data"; import { OptionSelectConfig, OptionSelectItem } from "#app/ui/abstact-option-select-ui-handler"; import { PartyOption, PartyUiMode } from "#app/ui/party-ui-handler"; @@ -30,25 +30,27 @@ import { Gender } from "#app/data/gender"; import { Moves } from "#enums/moves"; import { initMoveAnim, loadMoveAnimAssets } from "#app/data/battle-anims"; -export class EnemyPokemonConfig { +export interface EnemyPokemonConfig { species: PokemonSpecies; - isBoss: boolean = false; + isBoss: boolean; bossSegments?: number; bossSegmentModifier?: number; // Additive to the determined segment number formIndex?: number; level?: number; gender?: Gender; - modifierTypes?: PokemonHeldItemModifierType[]; - dataSource?: PokemonData; - tags?: BattlerTagType[]; - mysteryEncounterBattleEffects?: (pokemon: Pokemon) => void; - status?: StatusEffect; passive?: boolean; + moveSet?: Moves[]; + /** Can set just the status, or pass a timer on the status turns */ + status?: StatusEffect | [StatusEffect, number]; + mysteryEncounterBattleEffects?: (pokemon: Pokemon) => void; + modifierTypes?: PokemonHeldItemModifierType[]; + tags?: BattlerTagType[]; + dataSource?: PokemonData; } -export class EnemyPartyConfig { - levelAdditiveMultiplier?: number = 0; // Formula for enemy: level += waveIndex / 10 * levelAdditive - doubleBattle?: boolean = false; +export interface EnemyPartyConfig { + levelAdditiveMultiplier?: number; // Formula for enemy: level += waveIndex / 10 * levelAdditive + doubleBattle?: boolean; trainerType?: TrainerType; // Generates trainer battle solely off trainer type trainerConfig?: TrainerConfig; // More customizable option for configuring trainer battle pokemonConfigs?: EnemyPokemonConfig[]; @@ -167,11 +169,6 @@ export async function initBattleWithEnemyConfig(scene: BattleScene, partyConfig: enemyPokemon.formIndex = config.formIndex; } - // Set gender - if (!isNullOrUndefined(config.gender)) { - enemyPokemon.gender = config.gender; - } - // Set Boss if (config.isBoss) { let segments = !isNullOrUndefined(config.bossSegments) ? config.bossSegments : scene.getEncounterBossSegments(scene.currentBattle.waveIndex, level, enemySpecies, true); @@ -189,21 +186,40 @@ export async function initBattleWithEnemyConfig(scene: BattleScene, partyConfig: // Set Status if (partyConfig.pokemonConfigs[e].status) { // Default to cureturn 3 for sleep - const cureTurn = partyConfig.pokemonConfigs[e].status === StatusEffect.SLEEP ? 3 : null; - enemyPokemon.status = new Status(partyConfig.pokemonConfigs[e].status, 0, cureTurn); + const status = partyConfig.pokemonConfigs[e].status instanceof Array ? partyConfig.pokemonConfigs[e].status[0] : partyConfig.pokemonConfigs[e].status; + const cureTurn = partyConfig.pokemonConfigs[e].status instanceof Array ? partyConfig.pokemonConfigs[e].status[1] : partyConfig.pokemonConfigs[e].status === StatusEffect.SLEEP ? 3 : null; + enemyPokemon.status = new Status(status, 0, cureTurn); + } + + // Set summon data fields + + // Set gender + if (!isNullOrUndefined(config.gender)) { + enemyPokemon.gender = config.gender; + enemyPokemon.summonData.gender = config.gender; + } + + // Set moves + if (config?.moveSet?.length > 0) { + const moves = config.moveSet.map(m => new PokemonMove(m)); + enemyPokemon.moveset = moves; + enemyPokemon.summonData.moveset = moves; } // Set tags if (config.tags?.length > 0) { const tags = config.tags; tags.forEach(tag => enemyPokemon.addTag(tag)); - // mysteryEncounterBattleEffects can be used IFF MYSTERY_ENCOUNTER_POST_SUMMON tag is applied - enemyPokemon.summonData.mysteryEncounterBattleEffects = config.mysteryEncounterBattleEffects; - - // Requires re-priming summon data so that tags are not cleared on SummonPhase - enemyPokemon.primeSummonData(enemyPokemon.summonData); } + // mysteryEncounterBattleEffects will only be used IFF MYSTERY_ENCOUNTER_POST_SUMMON tag is applied + if (config.mysteryEncounterBattleEffects) { + enemyPokemon.mysteryEncounterBattleEffects = config.mysteryEncounterBattleEffects; + } + + // Requires re-priming summon data to update everything properly + enemyPokemon.primeSummonData(enemyPokemon.summonData); + enemyPokemon.initBattleInfo(); enemyPokemon.getBattleInfo().initInfo(enemyPokemon); } @@ -626,6 +642,9 @@ export function handleEncounterStartOfBattleEffects(scene: BattleScene) { scene.pushPhase(new MovePhase(scene, source, effect.targets, effect.move, effect.followUp, effect.followUp)); }); + // Pseudo turn end phase to reset flinch states, Endure, etc. + scene.pushPhase(new MysteryEncounterBattleStartCleanupPhase(scene)); + encounter.startOfBattleEffectsComplete = true; } } diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index ebae5fe8122..65fd982cbdc 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -101,6 +101,8 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { public battleSummonData: PokemonBattleSummonData; public turnData: PokemonTurnData; + public mysteryEncounterBattleEffects: (pokemon: Pokemon) => void = null; + public fieldPosition: FieldPosition; public maskEnabled: boolean; @@ -3931,7 +3933,6 @@ export class PokemonSummonData { public moveset: PokemonMove[]; // If not initialized this value will not be populated from save data. public types: Type[] = null; - public mysteryEncounterBattleEffects: (pokemon: Pokemon) => void = null; } export class PokemonBattleData { diff --git a/src/locales/en/mystery-encounter.ts b/src/locales/en/mystery-encounter.ts index a35815646b7..3e15782d7f0 100644 --- a/src/locales/en/mystery-encounter.ts +++ b/src/locales/en/mystery-encounter.ts @@ -1,4 +1,15 @@ import { lostAtSeaDialogue } from "./mystery-encounters/lost-at-sea-dialogue"; +import { mysteriousChestDialogue } from "#app/locales/en/mystery-encounters/mysterious-chest-dialogue"; +import { mysteriousChallengersDialogue } from "#app/locales/en/mystery-encounters/mysterious-challengers-dialogue"; +import { darkDealDialogue } from "#app/locales/en/mystery-encounters/dark-deal-dialogue"; +import { departmentStoreSaleDialogue } from "#app/locales/en/mystery-encounters/department-store-sale-dialogue"; +import { fieldTripDialogue } from "#app/locales/en/mystery-encounters/field-trip-dialogue"; +import { fieryFalloutDialogue } from "#app/locales/en/mystery-encounters/fiery-fallout-dialogue"; +import { fightOrFlightDialogue } from "#app/locales/en/mystery-encounters/fight-or-flight-dialogue"; +import { safariZoneDialogue } from "#app/locales/en/mystery-encounters/safari-zone-dialogue"; +import { shadyVitaminDealerDialogue } from "#app/locales/en/mystery-encounters/shady-vitamin-dealer-dialogue"; +import { sleepingSnorlaxDialogue } from "#app/locales/en/mystery-encounters/sleeping-snorlax-dialogue"; +import { trainingSessionDialogue } from "#app/locales/en/mystery-encounters/training-session-dialogue"; /** * Patterns that can be used: @@ -21,47 +32,6 @@ export const mysteryEncounter = { "paid_money": "You paid ₽{{amount, number}}.", "receive_money": "You received ₽{{amount, number}}!", - // Mystery Encounters -- Common Tier - - "mysterious_chest_intro_message": "You found...@d{32} a chest?", - "mysterious_chest_title": "The Mysterious Chest", - "mysterious_chest_description": "A beautifully ornamented chest stands on the ground. There must be something good inside... right?", - "mysterious_chest_query": "Will you open it?", - "mysterious_chest_option_1_label": "Open it", - "mysterious_chest_option_1_tooltip": "@[SUMMARY_BLUE]{(35%) Something terrible}\n@[SUMMARY_GREEN]{(40%) Okay Rewards}\n@[SUMMARY_GREEN]{(20%) Good Rewards}\n@[SUMMARY_GREEN]{(4%) Great Rewards}\n@[SUMMARY_GREEN]{(1%) Amazing Rewards}", - "mysterious_chest_option_2_label": "It's too risky, leave", - "mysterious_chest_option_2_tooltip": "(-) No Rewards", - "mysterious_chest_option_1_selected_message": "You open the chest to find...", - "mysterious_chest_option_2_selected_message": "You hurry along your way,\nwith a slight feeling of regret.", - "mysterious_chest_option_1_normal_result": "Just some normal tools and items.", - "mysterious_chest_option_1_good_result": "Some pretty nice tools and items.", - "mysterious_chest_option_1_great_result": "A couple great tools and items!", - "mysterious_chest_option_1_amazing_result": "Whoa! An amazing item!", - "mysterious_chest_option_1_bad_result": `Oh no!@d{32}\nThe chest was trapped! - $Your {{pokeName}} jumps in front of you\nbut is KOed in the process.`, - - "fight_or_flight_intro_message": "Something shiny is sparkling\non the ground near that Pokémon!", - "fight_or_flight_title": "Fight or Flight", - "fight_or_flight_description": "It looks like there's a strong Pokémon guarding an item. Battling is the straightforward approach, but this Pokémon looks strong. You could also try to sneak around, though the Pokémon might catch you.", - "fight_or_flight_query": "What will you do?", - "fight_or_flight_option_1_label": "Battle the Pokémon", - "fight_or_flight_option_1_tooltip": "(-) Hard Battle\n(+) New Item", - "fight_or_flight_option_2_label": "Steal the item", - "fight_or_flight_option_2_tooltip": "@[SUMMARY_GREEN]{(35%) Steal Item}\n@[SUMMARY_BLUE]{(65%) Harder Battle}", - "fight_or_flight_option_2_steal_tooltip": "(+) {{option2PrimaryName}} uses {{option2PrimaryMove}}", - "fight_or_flight_option_3_label": "Leave", - "fight_or_flight_option_3_tooltip": "(-) No Rewards", - "fight_or_flight_option_1_selected_message": "You approach the\nPokémon without fear.", - "fight_or_flight_option_2_good_result": `.@d{32}.@d{32}.@d{32} - $You manage to sneak your way\npast and grab the item!`, - "fight_or_flight_option_2_steal_result": `.@d{32}.@d{32}.@d{32} - $Your {{option2PrimaryName}} helps you out and uses {{option2PrimaryMove}}! - $ You nabbed the item!`, - "fight_or_flight_option_2_bad_result": `.@d{32}.@d{32}.@d{32} - $The Pokémon catches you\nas you try to sneak around!`, - "fight_or_flight_boss_enraged": "The opposing {{enemyPokemon}} has become enraged!", - "fight_or_flight_option_3_selected": "You leave the strong Pokémon\nwith its prize and continue on.", - "department_store_sale_intro_message": "It's a lady with a ton of shopping bags.", "department_store_sale_speaker": "Shopper", "department_store_sale_intro_dialogue": `Hello! Are you here for\nthe amazing sales too? @@ -217,28 +187,6 @@ export const mysteryEncounter = { // Mystery Encounters -- Rogue Tier - "dark_deal_intro_message": "A strange man in a tattered coat\nstands in your way...", - "dark_deal_speaker": "Shady Guy", - "dark_deal_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.`, - "dark_deal_title": "Dark Deal", - "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...\"", - "dark_deal_query": "What will you do?", - "dark_deal_option_1_label": "Accept", - "dark_deal_option_1_tooltip": "(+) 5 Rogue Balls\n(?) Enhance a Random Pokémon", - "dark_deal_option_2_label": "Refuse", - "dark_deal_option_2_tooltip": "(-) No Rewards", - "dark_deal_option_1_selected": `Let's see, that {{pokeName}} will do nicely! - $Remember, I'm not responsible\nif anything bad happens!@d{32} Hehe...`, - "dark_deal_option_1_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!`, - "dark_deal_option_2_selected": "Not gonna help a poor fellow out?\nPah!", - "dark_deal_outro": "After the harrowing encounter,\nyou collect yourself and depart.", - "sleeping_snorlax_intro_message": `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.`, "sleeping_snorlax_title": "Sleeping Snorlax", @@ -253,12 +201,20 @@ export const mysteryEncounter = { "sleeping_snorlax_option_3_disabled_tooltip": "Your Pokémon need to know certain moves to choose this", "sleeping_snorlax_option_1_selected_message": "You approach the\nPokémon without fear.", "sleeping_snorlax_option_2_selected_message": `.@d{32}.@d{32}.@d{32} - $You wait for a time, but the Snorlax's yawns make your party sleepy.`, - "sleeping_snorlax_option_2_good_result": "When you all awaken, the Snorlax is no where to be found - but your Pokémon are all healed!", - "sleeping_snorlax_option_2_bad_result": `Your {{primaryName}} is still asleep... - $But on the bright side, the Snorlax left something behind... - $@s{item_fanfare}You gained a Berry!`, + $You wait for a time, but the Snorlax's yawns make your party sleepy...`, + "sleeping_snorlax_option_2_good_result": "When you all awaken, the Snorlax is no where to be found -\nbut your Pokémon are all healed!", "sleeping_snorlax_option_3_good_result": "Your {{option3PrimaryName}} uses {{option3PrimaryMove}}! @s{item_fanfare}It steals Leftovers off the sleeping Snorlax and you make out like bandits!", + mysteriousChallengers: mysteriousChallengersDialogue, + mysteriousChest: mysteriousChestDialogue, + darkDeal: darkDealDialogue, + fightOrFlight: fightOrFlightDialogue, + sleepingSnorlax: sleepingSnorlaxDialogue, + trainingSession: trainingSessionDialogue, + departmentStoreSale: departmentStoreSaleDialogue, + shadyVitaminDealer: shadyVitaminDealerDialogue, + fieldTrip: fieldTripDialogue, + safariZone: safariZoneDialogue, lostAtSea: lostAtSeaDialogue, + fieryFallout: fieryFalloutDialogue, } as const; diff --git a/src/locales/en/mystery-encounters/dark-deal-dialogue.ts b/src/locales/en/mystery-encounters/dark-deal-dialogue.ts index 85a238f7b72..113209bf61a 100644 --- a/src/locales/en/mystery-encounters/dark-deal-dialogue.ts +++ b/src/locales/en/mystery-encounters/dark-deal-dialogue.ts @@ -1,31 +1,29 @@ export const darkDealDialogue = { - intro: "Wandering aimlessly, you effectively get nowhere.", - title: "Lost at sea", - description: "The sea is turbulent in this area, and you seem to be running out of fuel.\nThis is bad. Is there a way out of the situation?", + intro: "A strange man in a tattered coat\nstands in your way...", + speaker: "Shady Guy", + 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?", option: { 1: { - label: "{{option1PrimaryName}} can help", - 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.", + label: "Accept", + tooltip: "(+) 5 Rogue Balls\n(?) Enhance a Random Pokémon", + 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: "{{option2PrimaryName}} can 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.", - }, - 3: { - label: "Wander aimlessly", - tooltip: "(-) Each of your Pokémon lose {{damagePercentage}}% of their total HP.", - selected: `You float about in the boat, steering it aimlessly until you finally get back on track. - $You and your Pokémon get very fatigued during the whole ordeal.`, - }, + label: "Refuse", + tooltip: "(-) No Rewards", + selected: "Not gonna help a poor fellow out?\nPah!", + } }, - outro: "You are back on track." + outro: "After the harrowing encounter,\nyou collect yourself and depart." }; diff --git a/src/locales/en/mystery-encounters/department-store-sale-dialogue.ts b/src/locales/en/mystery-encounters/department-store-sale-dialogue.ts index 608cb0df5ff..287e3c9bae2 100644 --- a/src/locales/en/mystery-encounters/department-store-sale-dialogue.ts +++ b/src/locales/en/mystery-encounters/department-store-sale-dialogue.ts @@ -1,30 +1,30 @@ export const departmentStoreSaleDialogue = { - intro: "Wandering aimlessly, you effectively get nowhere.", - title: "Lost at sea", - description: "The sea is turbulent in this area, and you seem to be running out of fuel.\nThis is bad. Is there a way out of the situation?", + intro: "Wandering aimlessly through the sea, you've effectively gotten nowhere.", + title: "Lost at Sea", + description: "The sea is turbulent in this area, and you're running out of energy.\nThis is bad. Is there a way out of the situation?", query: "What will you do?", option: { 1: { label: "{{option1PrimaryName}} can help", label_disabled: "Can't {{option1RequiredMove}}", - tooltip: "(+) {{option1PrimaryName}} saves you.\n(+) {{option1PrimaryName}} gains some EXP.", + 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}} can help", label_disabled: "Can't {{option2RequiredMove}}", - tooltip: "(+) {{option2PrimaryName}} saves you.\n(+) {{option2PrimaryName}} gains some EXP.", + 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 it aimlessly until you finally get back on track. - $You and your Pokémon get very fatigued during the whole ordeal.`, + 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. + $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/field-trip-dialogue.ts b/src/locales/en/mystery-encounters/field-trip-dialogue.ts index 9efa781de95..7e4a4041b92 100644 --- a/src/locales/en/mystery-encounters/field-trip-dialogue.ts +++ b/src/locales/en/mystery-encounters/field-trip-dialogue.ts @@ -1,30 +1,30 @@ export const fieldTripDialogue = { - intro: "Wandering aimlessly, you effectively get nowhere.", - title: "Lost at sea", - description: "The sea is turbulent in this area, and you seem to be running out of fuel.\nThis is bad. Is there a way out of the situation?", + intro: "Wandering aimlessly through the sea, you've effectively gotten nowhere.", + title: "Lost at Sea", + description: "The sea is turbulent in this area, and you're running out of energy.\nThis is bad. Is there a way out of the situation?", query: "What will you do?", option: { 1: { label: "{{option1PrimaryName}} can help", label_disabled: "Can't {{option1RequiredMove}}", - tooltip: "(+) {{option1PrimaryName}} saves you.\n(+) {{option1PrimaryName}} gains some EXP.", + 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}} can help", label_disabled: "Can't {{option2RequiredMove}}", - tooltip: "(+) {{option2PrimaryName}} saves you.\n(+) {{option2PrimaryName}} gains some EXP.", + 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 it aimlessly until you finally get back on track. - $You and your Pokémon get very fatigued during the whole ordeal.`, + 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. + $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/fiery-fallout-dialogue.ts b/src/locales/en/mystery-encounters/fiery-fallout-dialogue.ts index a9d1a8c3c49..2c0549a3374 100644 --- a/src/locales/en/mystery-encounters/fiery-fallout-dialogue.ts +++ b/src/locales/en/mystery-encounters/fiery-fallout-dialogue.ts @@ -1,30 +1,30 @@ export const fieryFalloutDialogue = { - intro: "Wandering aimlessly, you effectively get nowhere.", - title: "Lost at sea", - description: "The sea is turbulent in this area, and you seem to be running out of fuel.\nThis is bad. Is there a way out of the situation?", + intro: "Wandering aimlessly through the sea, you've effectively gotten nowhere.", + title: "Lost at Sea", + description: "The sea is turbulent in this area, and you're running out of energy.\nThis is bad. Is there a way out of the situation?", query: "What will you do?", option: { 1: { label: "{{option1PrimaryName}} can help", label_disabled: "Can't {{option1RequiredMove}}", - tooltip: "(+) {{option1PrimaryName}} saves you.\n(+) {{option1PrimaryName}} gains some EXP.", + 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}} can help", label_disabled: "Can't {{option2RequiredMove}}", - tooltip: "(+) {{option2PrimaryName}} saves you.\n(+) {{option2PrimaryName}} gains some EXP.", + 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 it aimlessly until you finally get back on track. - $You and your Pokémon get very fatigued during the whole ordeal.`, + 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. + $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/fight-or-flight-dialogue.ts b/src/locales/en/mystery-encounters/fight-or-flight-dialogue.ts index fcacae8ecb2..2ef9d31a821 100644 --- a/src/locales/en/mystery-encounters/fight-or-flight-dialogue.ts +++ b/src/locales/en/mystery-encounters/fight-or-flight-dialogue.ts @@ -1,31 +1,31 @@ export const fightOrFlightDialogue = { - intro: "Wandering aimlessly, you effectively get nowhere.", - title: "Lost at sea", - description: "The sea is turbulent in this area, and you seem to be running out of fuel.\nThis is bad. Is there a way out of the situation?", + intro: "Something shiny is sparkling\non the ground near that Pokémon!", + title: "Fight or Flight", + description: "It looks like there's a strong Pokémon guarding an item. Battling is the straightforward approach, but this Pokémon looks strong. You could also try to sneak around, though the Pokémon might catch you.", query: "What will you do?", option: { 1: { - label: "{{option1PrimaryName}} can help", - 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.", + label: "Battle the Pokémon", + tooltip: "(-) Hard Battle\n(+) New Item", + selected: "You approach the\nPokémon without fear.", }, 2: { label: "{{option2PrimaryName}} can 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.", + tooltip: "@[SUMMARY_GREEN]{(35%) Steal Item}\n@[SUMMARY_BLUE]{(65%) Harder Battle}", + tooltip_special: "(+) {{option2PrimaryName}} uses {{option2PrimaryMove}}", + good_result: `.@d{32}.@d{32}.@d{32} + $You manage to sneak your way\npast and grab the item!`, + special_result: `.@d{32}.@d{32}.@d{32} + $Your {{option2PrimaryName}} helps you out and uses {{option2PrimaryMove}}! + $ You nabbed the item!`, + bad_result: `.@d{32}.@d{32}.@d{32} + $The Pokémon catches you\nas you try to sneak around!`, + boss_enraged: "The opposing {{enemyPokemon}} has become enraged!" }, 3: { - label: "Wander aimlessly", - tooltip: "(-) Each of your Pokémon lose {{damagePercentage}}% of their total HP.", - selected: `You float about in the boat, steering it aimlessly until you finally get back on track. - $You and your Pokémon get very fatigued during the whole ordeal.`, + label: "Leave", + tooltip: "(-) No Rewards", + selected: "You leave the strong Pokémon\nwith its prize and continue on.", }, - }, - outro: "You are back on track." + } }; diff --git a/src/locales/en/mystery-encounters/lost-at-sea-dialogue.ts b/src/locales/en/mystery-encounters/lost-at-sea-dialogue.ts index 344640610be..cb1de1315cd 100644 --- a/src/locales/en/mystery-encounters/lost-at-sea-dialogue.ts +++ b/src/locales/en/mystery-encounters/lost-at-sea-dialogue.ts @@ -7,7 +7,7 @@ export const lostAtSeaDialogue = { 1: { label: "{{option1PrimaryName}} can help", label_disabled: "Can't {{option1RequiredMove}}", - tooltip: "(+) {{option1PrimaryName}} saves you.\n(+) {{option1PrimaryName}} gains some EXP.", + 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. \${{option1PrimaryName}} seems to also have gotten stronger in this time of need!`, @@ -15,16 +15,16 @@ export const lostAtSeaDialogue = { 2: { label: "{{option2PrimaryName}} can help", label_disabled: "Can't {{option2RequiredMove}}", - tooltip: "(+) {{option2PrimaryName}} saves you.\n(+) {{option2PrimaryName}} gains some EXP.", + 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. \${{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 it aimlessly until you finally get back on track. - $You and your Pokémon get very fatigued during the whole ordeal.`, + 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. + $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-challengers-dialogue.ts b/src/locales/en/mystery-encounters/mysterious-challengers-dialogue.ts index bdb15b4e7b4..20be45af4c9 100644 --- a/src/locales/en/mystery-encounters/mysterious-challengers-dialogue.ts +++ b/src/locales/en/mystery-encounters/mysterious-challengers-dialogue.ts @@ -1,30 +1,30 @@ export const mysteriousChallengersDialogue = { - intro: "Wandering aimlessly, you effectively get nowhere.", - title: "Lost at sea", - description: "The sea is turbulent in this area, and you seem to be running out of fuel.\nThis is bad. Is there a way out of the situation?", + intro: "Wandering aimlessly through the sea, you've effectively gotten nowhere.", + title: "Lost at Sea", + description: "The sea is turbulent in this area, and you're running out of energy.\nThis is bad. Is there a way out of the situation?", query: "What will you do?", option: { 1: { label: "{{option1PrimaryName}} can help", label_disabled: "Can't {{option1RequiredMove}}", - tooltip: "(+) {{option1PrimaryName}} saves you.\n(+) {{option1PrimaryName}} gains some EXP.", + 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}} can help", label_disabled: "Can't {{option2RequiredMove}}", - tooltip: "(+) {{option2PrimaryName}} saves you.\n(+) {{option2PrimaryName}} gains some EXP.", + 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 it aimlessly until you finally get back on track. - $You and your Pokémon get very fatigued during the whole ordeal.`, + 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. + $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/safari-zone-dialogue.ts b/src/locales/en/mystery-encounters/safari-zone-dialogue.ts index 34fb6a9b44e..46952b7b197 100644 --- a/src/locales/en/mystery-encounters/safari-zone-dialogue.ts +++ b/src/locales/en/mystery-encounters/safari-zone-dialogue.ts @@ -1,30 +1,30 @@ export const safariZoneDialogue = { - intro: "Wandering aimlessly, you effectively get nowhere.", - title: "Lost at sea", - description: "The sea is turbulent in this area, and you seem to be running out of fuel.\nThis is bad. Is there a way out of the situation?", + intro: "Wandering aimlessly through the sea, you've effectively gotten nowhere.", + title: "Lost at Sea", + description: "The sea is turbulent in this area, and you're running out of energy.\nThis is bad. Is there a way out of the situation?", query: "What will you do?", option: { 1: { label: "{{option1PrimaryName}} can help", label_disabled: "Can't {{option1RequiredMove}}", - tooltip: "(+) {{option1PrimaryName}} saves you.\n(+) {{option1PrimaryName}} gains some EXP.", + 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}} can help", label_disabled: "Can't {{option2RequiredMove}}", - tooltip: "(+) {{option2PrimaryName}} saves you.\n(+) {{option2PrimaryName}} gains some EXP.", + 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 it aimlessly until you finally get back on track. - $You and your Pokémon get very fatigued during the whole ordeal.`, + 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. + $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/shady-vitamin-dealer-dialogue.ts b/src/locales/en/mystery-encounters/shady-vitamin-dealer-dialogue.ts index ffa864a2efe..9bfdc139ea1 100644 --- a/src/locales/en/mystery-encounters/shady-vitamin-dealer-dialogue.ts +++ b/src/locales/en/mystery-encounters/shady-vitamin-dealer-dialogue.ts @@ -1,30 +1,30 @@ export const shadyVitaminDealerDialogue = { - intro: "Wandering aimlessly, you effectively get nowhere.", - title: "Lost at sea", - description: "The sea is turbulent in this area, and you seem to be running out of fuel.\nThis is bad. Is there a way out of the situation?", + intro: "Wandering aimlessly through the sea, you've effectively gotten nowhere.", + title: "Lost at Sea", + description: "The sea is turbulent in this area, and you're running out of energy.\nThis is bad. Is there a way out of the situation?", query: "What will you do?", option: { 1: { label: "{{option1PrimaryName}} can help", label_disabled: "Can't {{option1RequiredMove}}", - tooltip: "(+) {{option1PrimaryName}} saves you.\n(+) {{option1PrimaryName}} gains some EXP.", + 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}} can help", label_disabled: "Can't {{option2RequiredMove}}", - tooltip: "(+) {{option2PrimaryName}} saves you.\n(+) {{option2PrimaryName}} gains some EXP.", + 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 it aimlessly until you finally get back on track. - $You and your Pokémon get very fatigued during the whole ordeal.`, + 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. + $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/sleeping-snorlax-dialogue.ts b/src/locales/en/mystery-encounters/sleeping-snorlax-dialogue.ts index bb93657e8f3..bc2dc65e572 100644 --- a/src/locales/en/mystery-encounters/sleeping-snorlax-dialogue.ts +++ b/src/locales/en/mystery-encounters/sleeping-snorlax-dialogue.ts @@ -1,30 +1,30 @@ export const sleepingSnorlaxDialogue = { - intro: "Wandering aimlessly, you effectively get nowhere.", - title: "Lost at sea", - description: "The sea is turbulent in this area, and you seem to be running out of fuel.\nThis is bad. Is there a way out of the situation?", + intro: "Wandering aimlessly through the sea, you've effectively gotten nowhere.", + title: "Lost at Sea", + description: "The sea is turbulent in this area, and you're running out of energy.\nThis is bad. Is there a way out of the situation?", query: "What will you do?", option: { 1: { label: "{{option1PrimaryName}} can help", label_disabled: "Can't {{option1RequiredMove}}", - tooltip: "(+) {{option1PrimaryName}} saves you.\n(+) {{option1PrimaryName}} gains some EXP.", + 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}} can help", label_disabled: "Can't {{option2RequiredMove}}", - tooltip: "(+) {{option2PrimaryName}} saves you.\n(+) {{option2PrimaryName}} gains some EXP.", + 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 it aimlessly until you finally get back on track. - $You and your Pokémon get very fatigued during the whole ordeal.`, + 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. + $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/training-session-dialogue.ts b/src/locales/en/mystery-encounters/training-session-dialogue.ts index 905141e57ca..a54adf92492 100644 --- a/src/locales/en/mystery-encounters/training-session-dialogue.ts +++ b/src/locales/en/mystery-encounters/training-session-dialogue.ts @@ -1,30 +1,30 @@ export const trainingSessionDialogue = { - intro: "Wandering aimlessly, you effectively get nowhere.", - title: "Lost at sea", - description: "The sea is turbulent in this area, and you seem to be running out of fuel.\nThis is bad. Is there a way out of the situation?", + intro: "Wandering aimlessly through the sea, you've effectively gotten nowhere.", + title: "Lost at Sea", + description: "The sea is turbulent in this area, and you're running out of energy.\nThis is bad. Is there a way out of the situation?", query: "What will you do?", option: { 1: { label: "{{option1PrimaryName}} can help", label_disabled: "Can't {{option1RequiredMove}}", - tooltip: "(+) {{option1PrimaryName}} saves you.\n(+) {{option1PrimaryName}} gains some EXP.", + 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}} can help", label_disabled: "Can't {{option2RequiredMove}}", - tooltip: "(+) {{option2PrimaryName}} saves you.\n(+) {{option2PrimaryName}} gains some EXP.", + 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 it aimlessly until you finally get back on track. - $You and your Pokémon get very fatigued during the whole ordeal.`, + 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. + $You and your Pokémon are fatigued from the whole ordeal.`, }, }, outro: "You are back on track." diff --git a/src/overrides.ts b/src/overrides.ts index e19a5bf20dd..7272f68bcb4 100644 --- a/src/overrides.ts +++ b/src/overrides.ts @@ -117,9 +117,9 @@ export const EGG_GACHA_PULL_COUNT_OVERRIDE: number = 0; */ // 1 to 256, set to null to ignore -export const MYSTERY_ENCOUNTER_RATE_OVERRIDE: number = null; +export const MYSTERY_ENCOUNTER_RATE_OVERRIDE: number = 256; export const MYSTERY_ENCOUNTER_TIER_OVERRIDE: MysteryEncounterTier = null; -export const MYSTERY_ENCOUNTER_OVERRIDE: MysteryEncounterType = null; +export const MYSTERY_ENCOUNTER_OVERRIDE: MysteryEncounterType = MysteryEncounterType.SLEEPING_SNORLAX; /** * MODIFIER / ITEM OVERRIDES diff --git a/src/phases.ts b/src/phases.ts index 015a97ca115..5e4bdf29943 100644 --- a/src/phases.ts +++ b/src/phases.ts @@ -66,7 +66,7 @@ import { PlayerGender } from "#enums/player-gender"; import { Species } from "#enums/species"; import { TrainerType } from "#enums/trainer-type"; import { MysteryEncounterVariant } from "#app/data/mystery-encounters/mystery-encounter"; -import { MysteryEncounterPhase } from "#app/phases/mystery-encounter-phase"; +import { MysteryEncounterPhase } from "#app/phases/mystery-encounter-phases"; import { handleEncounterStartOfBattleEffects, handleMysteryEncounterVictory } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import ModifierSelectUiHandler, { SHOP_OPTIONS_ROW_LIMIT } from "#app/ui/modifier-select-ui-handler"; import { getEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; diff --git a/src/phases/mystery-encounter-phase.ts b/src/phases/mystery-encounter-phases.ts similarity index 96% rename from src/phases/mystery-encounter-phase.ts rename to src/phases/mystery-encounter-phases.ts index b0acdd3c1e1..6f474500838 100644 --- a/src/phases/mystery-encounter-phase.ts +++ b/src/phases/mystery-encounter-phases.ts @@ -14,6 +14,7 @@ import { IvScannerModifier } from "../modifier/modifier"; import * as Utils from "../utils"; import { isNullOrUndefined } from "../utils"; import { getEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; +import { BattlerTagLapseType } from "#app/data/battler-tags"; /** * Will handle (in order): @@ -165,6 +166,28 @@ export class MysteryEncounterOptionSelectedPhase extends Phase { } } +/** + * Runs at the beginning of an Encounter's battle + * Will cleanup any residual flinches, Endure, etc. that are left over from startOfBattleEffects + * See [TurnEndPhase](../phases.ts) for more details + */ +export class MysteryEncounterBattleStartCleanupPhase extends Phase { + constructor(scene: BattleScene) { + super(scene); + } + + start() { + super.start(); + + const field = this.scene.getField(true).filter(p => p.summonData); + field.forEach(pokemon => { + pokemon.lapseTags(BattlerTagLapseType.TURN_END); + }); + + this.end(); + } +} + /** * Will handle (in order): * - Setting BGM diff --git a/src/test/mystery-encounter/encounterTestUtils.ts b/src/test/mystery-encounter/encounterTestUtils.ts index 1a602b7b239..6caff2a8693 100644 --- a/src/test/mystery-encounter/encounterTestUtils.ts +++ b/src/test/mystery-encounter/encounterTestUtils.ts @@ -1,6 +1,6 @@ import { Button } from "#app/enums/buttons"; import { MessagePhase, VictoryPhase } from "#app/phases"; -import { MysteryEncounterPhase, MysteryEncounterRewardsPhase } from "#app/phases/mystery-encounter-phase"; +import { MysteryEncounterPhase, MysteryEncounterRewardsPhase } from "#app/phases/mystery-encounter-phases"; import MysteryEncounterUiHandler from "#app/ui/mystery-encounter-ui-handler"; import { Mode } from "#app/ui/ui"; import GameManager from "../utils/gameManager"; 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 48f7275fdff..76a7dca8cdf 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 @@ -12,7 +12,7 @@ import GameManager from "#app/test/utils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { runSelectMysteryEncounterOption } from "../encounterTestUtils"; -const namepsace = "mysteryEncounter:lostAtSeaDialogue"; +const namespace = "mysteryEncounter:lostAtSeaDialogue"; /** Blastoise for surf. Pidgeot for fly. Abra for none. */ const defaultParty = [Species.BLASTOISE, Species.PIDGEOT, Species.ABRA]; const defaultBiome = Biome.SEA; @@ -49,10 +49,10 @@ describe("Lost at Sea - Mystery Encounter", () => { expect(LostAtSeaEncounter.encounterType).toBe(MysteryEncounterType.LOST_AT_SEA); expect(LostAtSeaEncounter.dialogue).toBeDefined(); - expect(LostAtSeaEncounter.dialogue.intro).toStrictEqual([{ text: `${namepsace}:intro` }]); - expect(LostAtSeaEncounter.dialogue.encounterOptionsDialogue.title).toBe(`${namepsace}:title`); - expect(LostAtSeaEncounter.dialogue.encounterOptionsDialogue.description).toBe(`${namepsace}:description`); - expect(LostAtSeaEncounter.dialogue.encounterOptionsDialogue.query).toBe(`${namepsace}:query`); + expect(LostAtSeaEncounter.dialogue.intro).toStrictEqual([{ text: `${namespace}:intro` }]); + expect(LostAtSeaEncounter.dialogue.encounterOptionsDialogue.title).toBe(`${namespace}:title`); + expect(LostAtSeaEncounter.dialogue.encounterOptionsDialogue.description).toBe(`${namespace}:description`); + expect(LostAtSeaEncounter.dialogue.encounterOptionsDialogue.query).toBe(`${namespace}:query`); expect(LostAtSeaEncounter.options.length).toBe(3); }); @@ -100,13 +100,13 @@ describe("Lost at Sea - Mystery Encounter", () => { expect(option1.optionMode).toBe(EncounterOptionMode.DISABLED_OR_DEFAULT); expect(option1.dialogue).toBeDefined(); expect(option1.dialogue).toStrictEqual({ - buttonLabel: `${namepsace}:option:1:label`, - disabledButtonLabel: `${namepsace}:option:1:label_disabled`, - buttonTooltip: `${namepsace}:option:1:tooltip`, - disabledButtonTooltip: `${namepsace}:option:1:tooltip_disabled`, + buttonLabel: `${namespace}:option:1:label`, + disabledButtonLabel: `${namespace}:option:1:label_disabled`, + buttonTooltip: `${namespace}:option:1:tooltip`, + disabledButtonTooltip: `${namespace}:option:1:tooltip_disabled`, selected: [ { - text: `${namepsace}:option:1:selected`, + text: `${namespace}:option:1:selected`, }, ], }); @@ -147,13 +147,13 @@ describe("Lost at Sea - Mystery Encounter", () => { expect(option2.optionMode).toBe(EncounterOptionMode.DISABLED_OR_DEFAULT); expect(option2.dialogue).toBeDefined(); expect(option2.dialogue).toStrictEqual({ - buttonLabel: `${namepsace}:option:2:label`, - disabledButtonLabel: `${namepsace}:option:2:label_disabled`, - buttonTooltip: `${namepsace}:option:2:tooltip`, - disabledButtonTooltip: `${namepsace}:option:2:tooltip_disabled`, + buttonLabel: `${namespace}:option:2:label`, + disabledButtonLabel: `${namespace}:option:2:label_disabled`, + buttonTooltip: `${namespace}:option:2:tooltip`, + disabledButtonTooltip: `${namespace}:option:2:tooltip_disabled`, selected: [ { - text: `${namepsace}:option:2:selected`, + text: `${namespace}:option:2:selected`, }, ], }); @@ -197,11 +197,11 @@ describe("Lost at Sea - Mystery Encounter", () => { expect(option3.optionMode).toBe(EncounterOptionMode.DEFAULT); expect(option3.dialogue).toBeDefined(); expect(option3.dialogue).toStrictEqual({ - buttonLabel: `${namepsace}:option:3:label`, - buttonTooltip: `${namepsace}:option:3:tooltip`, + buttonLabel: `${namespace}:option:3:label`, + buttonTooltip: `${namespace}:option:3:tooltip`, selected: [ { - text: `${namepsace}:option:3:selected`, + text: `${namespace}:option:3:selected`, }, ], }); diff --git a/src/test/mystery-encounter/mystery-encounter.test.ts b/src/test/mystery-encounter/mystery-encounter.test.ts index 8ed2e4756ca..b840302278e 100644 --- a/src/test/mystery-encounter/mystery-encounter.test.ts +++ b/src/test/mystery-encounter/mystery-encounter.test.ts @@ -2,7 +2,7 @@ import { afterEach, beforeAll, beforeEach, expect, describe, it } from "vitest"; import GameManager from "#app/test/utils/gameManager"; import Phaser from "phaser"; import { Species } from "#enums/species"; -import { MysteryEncounterPhase } from "#app/phases/mystery-encounter-phase"; +import { MysteryEncounterPhase } from "#app/phases/mystery-encounter-phases"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; describe("Mystery Encounters", () => { diff --git a/src/test/phases/mystery-encounter-phase.test.ts b/src/test/phases/mystery-encounter-phase.test.ts index 91e6a09bb99..9fd989e82b8 100644 --- a/src/test/phases/mystery-encounter-phase.test.ts +++ b/src/test/phases/mystery-encounter-phase.test.ts @@ -2,7 +2,7 @@ import {afterEach, beforeAll, beforeEach, expect, describe, it, vi } from "vites import GameManager from "#app/test/utils/gameManager"; import Phaser from "phaser"; import {Species} from "#enums/species"; -import { MysteryEncounterOptionSelectedPhase, MysteryEncounterPhase } from "#app/phases/mystery-encounter-phase"; +import { MysteryEncounterOptionSelectedPhase, MysteryEncounterPhase } from "#app/phases/mystery-encounter-phases"; import {Mode} from "#app/ui/ui"; import {Button} from "#enums/buttons"; import MysteryEncounterUiHandler from "#app/ui/mystery-encounter-ui-handler"; diff --git a/src/test/utils/gameManager.ts b/src/test/utils/gameManager.ts index f0c7d08c6b7..1b8c5c383a0 100644 --- a/src/test/utils/gameManager.ts +++ b/src/test/utils/gameManager.ts @@ -34,7 +34,7 @@ import { Button } from "#enums/buttons"; import { BattlerIndex } from "#app/battle.js"; import TargetSelectUiHandler from "#app/ui/target-select-ui-handler.js"; import BattleMessageUiHandler from "#app/ui/battle-message-ui-handler"; -import {MysteryEncounterPhase} from "#app/phases/mystery-encounter-phase"; +import {MysteryEncounterPhase} from "#app/phases/mystery-encounter-phases"; import { OverridesHelper } from "./overridesHelper"; /** diff --git a/src/test/utils/phaseInterceptor.ts b/src/test/utils/phaseInterceptor.ts index aa297e4944c..39278c673d4 100644 --- a/src/test/utils/phaseInterceptor.ts +++ b/src/test/utils/phaseInterceptor.ts @@ -44,7 +44,7 @@ import { MysteryEncounterPhase, MysteryEncounterRewardsPhase, PostMysteryEncounterPhase -} from "#app/phases/mystery-encounter-phase"; +} from "#app/phases/mystery-encounter-phases"; export default class PhaseInterceptor { public scene; diff --git a/src/ui/mystery-encounter-ui-handler.ts b/src/ui/mystery-encounter-ui-handler.ts index e6699afbfe8..cfb2dfbd3a8 100644 --- a/src/ui/mystery-encounter-ui-handler.ts +++ b/src/ui/mystery-encounter-ui-handler.ts @@ -4,7 +4,7 @@ import { Mode } from "./ui"; import UiHandler from "./ui-handler"; import { Button } from "#enums/buttons"; import { addWindow, WindowVariant } from "./ui-theme"; -import { MysteryEncounterPhase } from "../phases/mystery-encounter-phase"; +import { MysteryEncounterPhase } from "../phases/mystery-encounter-phases"; import { PartyUiMode } from "./party-ui-handler"; import MysteryEncounterOption, { EncounterOptionMode } from "../data/mystery-encounters/mystery-encounter-option"; import * as Utils from "../utils"; From 872542080a757a09cdab9194747814ff1177db4a Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Thu, 18 Jul 2024 15:52:43 -0400 Subject: [PATCH 179/270] migrate encounters dialogue to new format --- .../department-store-sale-encounter.ts | 35 ++-- .../encounters/field-trip-encounter.ts | 62 +++--- .../encounters/fiery-fallout-encounter.ts | 29 +-- .../encounters/fight-or-flight-encounter.ts | 5 +- .../mysterious-challengers-encounter.ts | 30 +-- .../encounters/safari-zone-encounter.ts | 65 ++++--- .../shady-vitamin-dealer-encounter.ts | 49 +++-- ...ter.ts => slumbering-snorlax-encounter.ts} | 0 .../encounters/training-session-encounter.ts | 38 ++-- .../mystery-encounter-dialogue.ts | 12 +- .../mystery-encounters/mystery-encounters.ts | 8 +- src/enums/mystery-encounter-type.ts | 2 +- src/locales/en/mystery-encounter.ts | 177 +----------------- .../department-store-sale-dialogue.ts | 40 ++-- .../mystery-encounters/field-trip-dialogue.ts | 44 ++--- .../fiery-fallout-dialogue.ts | 39 ++-- .../mysterious-challengers-dialogue.ts | 33 ++-- .../safari-zone-dialogue.ts | 61 +++--- .../shady-vitamin-dealer-dialogue.ts | 39 ++-- ...ogue.ts => slumbering-snorlax-dialogue.ts} | 0 .../training-session-dialogue.ts | 39 ++-- src/overrides.ts | 4 +- .../encounters/lost-at-sea-encounter.test.ts | 5 +- 23 files changed, 331 insertions(+), 485 deletions(-) rename src/data/mystery-encounters/encounters/{sleeping-snorlax-encounter.ts => slumbering-snorlax-encounter.ts} (100%) rename src/locales/en/mystery-encounters/{sleeping-snorlax-dialogue.ts => slumbering-snorlax-dialogue.ts} (100%) 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 4156acdc7b7..ae025a909b1 100644 --- a/src/data/mystery-encounters/encounters/department-store-sale-encounter.ts +++ b/src/data/mystery-encounters/encounters/department-store-sale-encounter.ts @@ -13,7 +13,7 @@ import IMysteryEncounter, { } from "../mystery-encounter"; /** i18n namespace for encounter */ -const namespace = "mysteryEncounter:department_store_sale"; +const namespace = "mysteryEncounter:departmentStoreSale"; /** * Department Store Sale encounter. @@ -41,21 +41,21 @@ export const DepartmentStoreSaleEncounter: IMysteryEncounter = ]) .withIntroDialogue([ { - text: `${namespace}_intro_message`, + text: `${namespace}:intro`, }, { - text: `${namespace}_intro_dialogue`, - speaker: `${namespace}_speaker`, + text: `${namespace}:intro_dialogue`, + speaker: `${namespace}:speaker`, }, ]) .withHideIntroVisuals(false) - .withTitle(`${namespace}_title`) - .withDescription(`${namespace}_description`) - .withQuery(`${namespace}_query`) + .withTitle(`${namespace}:title`) + .withDescription(`${namespace}:description`) + .withQuery(`${namespace}:query`) .withSimpleOption( { - buttonLabel: `${namespace}_option_1_label`, - buttonTooltip: `${namespace}_option_1_tooltip`, + buttonLabel: `${namespace}:option:1:label`, + buttonTooltip: `${namespace}:option:1:tooltip`, }, async (scene: BattleScene) => { // Choose TMs @@ -80,8 +80,8 @@ export const DepartmentStoreSaleEncounter: IMysteryEncounter = ) .withSimpleOption( { - buttonLabel: `${namespace}_option_2_label`, - buttonTooltip: `${namespace}_option_2_tooltip`, + buttonLabel: `${namespace}:option:2:label`, + buttonTooltip: `${namespace}:option:2:tooltip`, }, async (scene: BattleScene) => { // Choose Vitamins @@ -104,8 +104,8 @@ export const DepartmentStoreSaleEncounter: IMysteryEncounter = ) .withSimpleOption( { - buttonLabel: `${namespace}_option_3_label`, - buttonTooltip: `${namespace}_option_3_tooltip`, + buttonLabel: `${namespace}:option:3:label`, + buttonTooltip: `${namespace}:option:3:tooltip`, }, async (scene: BattleScene) => { // Choose X Items @@ -128,8 +128,8 @@ export const DepartmentStoreSaleEncounter: IMysteryEncounter = ) .withSimpleOption( { - buttonLabel: `${namespace}_option_4_label`, - buttonTooltip: `${namespace}_option_4_tooltip`, + buttonLabel: `${namespace}:option:4:label`, + buttonTooltip: `${namespace}:option:4:tooltip`, }, async (scene: BattleScene) => { // Choose Pokeballs @@ -154,4 +154,9 @@ export const DepartmentStoreSaleEncounter: IMysteryEncounter = leaveEncounterWithoutBattle(scene); } ) + .withOutroDialogue([ + { + text: `${namespace}:outro`, + } + ]) .build(); diff --git a/src/data/mystery-encounters/encounters/field-trip-encounter.ts b/src/data/mystery-encounters/encounters/field-trip-encounter.ts index 2d4aa645f4a..da0016db360 100644 --- a/src/data/mystery-encounters/encounters/field-trip-encounter.ts +++ b/src/data/mystery-encounters/encounters/field-trip-encounter.ts @@ -19,7 +19,7 @@ import IMysteryEncounter, { } from "../mystery-encounter"; /** i18n namespace for the encounter */ -const namespace = "mysteryEncounter:field_trip"; +const namespace = "mysteryEncounter:fieldTrip"; /** * Field Trip encounter. @@ -49,27 +49,27 @@ export const FieldTripEncounter: IMysteryEncounter = ]) .withIntroDialogue([ { - text: `${namespace}_intro_message`, + text: `${namespace}:intro`, }, { - text: `${namespace}_intro_dialogue`, - speaker: `${namespace}_speaker`, + text: `${namespace}:intro_dialogue`, + speaker: `${namespace}:speaker`, }, ]) .withHideIntroVisuals(false) - .withTitle(`${namespace}_title`) - .withDescription(`${namespace}_description`) - .withQuery(`${namespace}_query`) + .withTitle(`${namespace}:title`) + .withDescription(`${namespace}:description`) + .withQuery(`${namespace}:query`) .withOption( new MysteryEncounterOptionBuilder() .withOptionMode(EncounterOptionMode.DEFAULT) .withDialogue({ - buttonLabel: `${namespace}_option_1_label`, - buttonTooltip: `${namespace}_option_1_tooltip`, - secondOptionPrompt: `${namespace}_second_option_prompt`, + buttonLabel: `${namespace}:option:1:label`, + buttonTooltip: `${namespace}:option:1:tooltip`, + secondOptionPrompt: `${namespace}:second_option_prompt`, selected: [ { - text: `${namespace}_option_selected`, + text: `${namespace}:option:selected`, }, ], }) @@ -87,11 +87,11 @@ export const FieldTripEncounter: IMysteryEncounter = if (!correctMove) { encounter.options[0].dialogue.selected = [ { - text: `${namespace}_option_incorrect`, - speaker: `${namespace}_speaker`, + text: `${namespace}:incorrect`, + speaker: `${namespace}:speaker`, }, { - text: `${namespace}_lesson_learned`, + text: `${namespace}:lesson_learned`, }, ]; setEncounterExp(scene, scene.getParty().map((p) => p.id), 50); @@ -100,7 +100,7 @@ export const FieldTripEncounter: IMysteryEncounter = encounter.setDialogueToken("move", move.getName()); encounter.options[0].dialogue.selected = [ { - text: `${namespace}_option_selected`, + text: `${namespace}:option:selected`, }, ]; setEncounterExp(scene, [pokemon.id], 100); @@ -138,12 +138,12 @@ export const FieldTripEncounter: IMysteryEncounter = new MysteryEncounterOptionBuilder() .withOptionMode(EncounterOptionMode.DEFAULT) .withDialogue({ - buttonLabel: `${namespace}_option_2_label`, - buttonTooltip: `${namespace}_option_2_tooltip`, - secondOptionPrompt: `${namespace}_second_option_prompt`, + buttonLabel: `${namespace}:option:2:label`, + buttonTooltip: `${namespace}:option:2:tooltip`, + secondOptionPrompt: `${namespace}:second_option_prompt`, selected: [ { - text: `${namespace}_option_selected`, + text: `${namespace}:option:selected`, }, ], }) @@ -161,11 +161,11 @@ export const FieldTripEncounter: IMysteryEncounter = if (!correctMove) { encounter.options[1].dialogue.selected = [ { - text: `${namespace}_option_incorrect`, - speaker: `${namespace}_speaker`, + text: `${namespace}:incorrect`, + speaker: `${namespace}:speaker`, }, { - text: `${namespace}_lesson_learned`, + text: `${namespace}:lesson_learned`, }, ]; setEncounterExp(scene, scene.getParty().map((p) => p.id), 50); @@ -174,7 +174,7 @@ export const FieldTripEncounter: IMysteryEncounter = encounter.setDialogueToken("move", move.getName()); encounter.options[1].dialogue.selected = [ { - text: `${namespace}_option_selected`, + text: `${namespace}:option:selected`, }, ]; setEncounterExp(scene, [pokemon.id], 100); @@ -212,12 +212,12 @@ export const FieldTripEncounter: IMysteryEncounter = new MysteryEncounterOptionBuilder() .withOptionMode(EncounterOptionMode.DEFAULT) .withDialogue({ - buttonLabel: `${namespace}_option_3_label`, - buttonTooltip: `${namespace}_option_3_tooltip`, - secondOptionPrompt: `${namespace}_second_option_prompt`, + buttonLabel: `${namespace}:option:3:label`, + buttonTooltip: `${namespace}:option:3:tooltip`, + secondOptionPrompt: `${namespace}:second_option_prompt`, selected: [ { - text: `${namespace}_option_selected`, + text: `${namespace}:option:selected`, }, ], }) @@ -235,11 +235,11 @@ export const FieldTripEncounter: IMysteryEncounter = if (!correctMove) { encounter.options[2].dialogue.selected = [ { - text: `${namespace}_option_incorrect`, - speaker: `${namespace}_speaker`, + text: `${namespace}:incorrect`, + speaker: `${namespace}:speaker`, }, { - text: `${namespace}_lesson_learned`, + text: `${namespace}:lesson_learned`, }, ]; setEncounterExp( @@ -252,7 +252,7 @@ export const FieldTripEncounter: IMysteryEncounter = encounter.setDialogueToken("move", move.getName()); encounter.options[2].dialogue.selected = [ { - text: `${namespace}_option_selected`, + text: `${namespace}:option:selected`, }, ]; setEncounterExp(scene, [pokemon.id], 100); diff --git a/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts b/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts index 77030cadb04..f4c9db5e4f8 100644 --- a/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts +++ b/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts @@ -17,7 +17,7 @@ import { WeatherType } from "#app/data/weather"; import { randSeedInt } from "#app/utils"; /** the i18n namespace for the encounter */ -const namespace = "mysteryEncounter:fiery_fallout"; +const namespace = "mysteryEncounter:fieryFallout"; /** * Fiery Fallout encounter. @@ -35,7 +35,7 @@ export const FieryFalloutEncounter: IMysteryEncounter = .withAnimations(EncounterAnim.MAGMA_BG, EncounterAnim.MAGMA_SPOUT) .withIntroDialogue([ { - text: `${namespace}_intro_message`, + text: `${namespace}:intro`, }, ]) .withOnInit((scene: BattleScene) => { @@ -85,16 +85,16 @@ export const FieryFalloutEncounter: IMysteryEncounter = return true; }) - .withTitle(`${namespace}_title`) - .withDescription(`${namespace}_description`) - .withQuery(`${namespace}_query`) + .withTitle(`${namespace}:title`) + .withDescription(`${namespace}:description`) + .withQuery(`${namespace}:query`) .withSimpleOption( { - buttonLabel: `${namespace}_option_1_label`, - buttonTooltip: `${namespace}_option_1_tooltip`, + buttonLabel: `${namespace}:option:1:label`, + buttonTooltip: `${namespace}:option:1:tooltip`, selected: [ { - text: `${namespace}_option_1_selected`, + text: `${namespace}:option:1:selected`, }, ], }, @@ -133,11 +133,11 @@ export const FieryFalloutEncounter: IMysteryEncounter = ) .withSimpleOption( { - buttonLabel: `${namespace}_option_2_label`, - buttonTooltip: `${namespace}_option_2_tooltip`, + buttonLabel: `${namespace}:option:2:label`, + buttonTooltip: `${namespace}:option:2:tooltip`, selected: [ { - text: `${namespace}_option_2_selected`, + text: `${namespace}:option:2:selected`, }, ], }, @@ -152,11 +152,12 @@ export const FieryFalloutEncounter: IMysteryEncounter = .withOptionMode(EncounterOptionMode.DISABLED_OR_SPECIAL) .withPrimaryPokemonRequirement(new TypeRequirement(Type.FIRE, true,2)) // Will set option2PrimaryName and option2PrimaryMove dialogue tokens automatically .withDialogue({ - buttonLabel: `${namespace}_option_3_label`, - buttonTooltip: `${namespace}_option_3_tooltip`, + buttonLabel: `${namespace}:option:3:label`, + buttonTooltip: `${namespace}:option:3:tooltip`, + disabledButtonTooltip: `${namespace}:option:3:disabled_tooltip`, selected: [ { - text: `${namespace}_option_3_selected`, + text: `${namespace}:option:3:selected`, }, ], }) 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 fc8ba869fe9..ca64ba30552 100644 --- a/src/data/mystery-encounters/encounters/fight-or-flight-encounter.ts +++ b/src/data/mystery-encounters/encounters/fight-or-flight-encounter.ts @@ -27,9 +27,10 @@ import IMysteryEncounter, { } from "../mystery-encounter"; import { MoveRequirement } from "../mystery-encounter-requirements"; import { queueEncounterMessage, showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; +import { getPokemonNameWithAffix } from "#app/messages"; /** the i18n namespace for the encounter */ -const namespace = "mysteryEncounter:fight_or_flight"; +const namespace = "mysteryEncounter:fightOrFlight"; /** * Fight or Flight encounter. @@ -159,7 +160,7 @@ export const FightOrFlightEncounter: IMysteryEncounter = const config = scene.currentBattle.mysteryEncounter.enemyPartyConfigs[0]; config.pokemonConfigs[0].tags = [BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON]; config.pokemonConfigs[0].mysteryEncounterBattleEffects = (pokemon: Pokemon) => { - pokemon.scene.currentBattle.mysteryEncounter.setDialogueToken("enemyPokemon", pokemon.name); + pokemon.scene.currentBattle.mysteryEncounter.setDialogueToken("enemyPokemon", getPokemonNameWithAffix(pokemon)); queueEncounterMessage(pokemon.scene, `${namespace}:boss_enraged`); pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [BattleStat.ATK, BattleStat.DEF, BattleStat.SPATK, BattleStat.SPDEF, BattleStat.SPD], 1)); }; diff --git a/src/data/mystery-encounters/encounters/mysterious-challengers-encounter.ts b/src/data/mystery-encounters/encounters/mysterious-challengers-encounter.ts index a46f6fd5f8d..b1b61434511 100644 --- a/src/data/mystery-encounters/encounters/mysterious-challengers-encounter.ts +++ b/src/data/mystery-encounters/encounters/mysterious-challengers-encounter.ts @@ -21,7 +21,7 @@ import IMysteryEncounter, { } from "../mystery-encounter"; /** the i18n namespace for the encounter */ -const namespace = "mysteryEncounter:mysterious_challengers"; +const namespace = "mysteryEncounter:mysteriousChallengers"; /** * Mysterious Challengers encounter. @@ -37,7 +37,7 @@ export const MysteriousChallengersEncounter: IMysteryEncounter = .withIntroSpriteConfigs([]) // These are set in onInit() .withIntroDialogue([ { - text: `${namespace}_intro_message`, + text: `${namespace}:intro`, }, ]) .withOnInit((scene: BattleScene) => { @@ -126,16 +126,16 @@ export const MysteriousChallengersEncounter: IMysteryEncounter = return true; }) - .withTitle(`${namespace}_title`) - .withDescription(`${namespace}_description`) - .withQuery(`${namespace}_query`) + .withTitle(`${namespace}:title`) + .withDescription(`${namespace}:description`) + .withQuery(`${namespace}:query`) .withSimpleOption( { - buttonLabel: `${namespace}_option_1_label`, - buttonTooltip: `${namespace}_option_1_tooltip`, + buttonLabel: `${namespace}:option:1:label`, + buttonTooltip: `${namespace}:option:1:tooltip`, selected: [ { - text: `${namespace}_option_selected_message`, + text: `${namespace}:option:selected`, }, ], }, @@ -156,11 +156,11 @@ export const MysteriousChallengersEncounter: IMysteryEncounter = ) .withSimpleOption( { - buttonLabel: `${namespace}_option_2_label`, - buttonTooltip: `${namespace}_option_2_tooltip`, + buttonLabel: `${namespace}:option:2:label`, + buttonTooltip: `${namespace}:option:2:tooltip`, selected: [ { - text: `${namespace}_option_selected_message`, + text: `${namespace}:option:selected`, }, ], }, @@ -181,11 +181,11 @@ export const MysteriousChallengersEncounter: IMysteryEncounter = ) .withSimpleOption( { - buttonLabel: `${namespace}_option_3_label`, - buttonTooltip: `${namespace}_option_3_tooltip`, + buttonLabel: `${namespace}:option:3:label`, + buttonTooltip: `${namespace}:option:3:tooltip`, selected: [ { - text: `${namespace}_option_selected_message`, + text: `${namespace}:option:selected`, }, ], }, @@ -209,7 +209,7 @@ export const MysteriousChallengersEncounter: IMysteryEncounter = ) .withOutroDialogue([ { - text: `${namespace}_outro_win`, + text: `${namespace}:outro`, }, ]) .build(); diff --git a/src/data/mystery-encounters/encounters/safari-zone-encounter.ts b/src/data/mystery-encounters/encounters/safari-zone-encounter.ts index 18c6b296b42..ee0a161408a 100644 --- a/src/data/mystery-encounters/encounters/safari-zone-encounter.ts +++ b/src/data/mystery-encounters/encounters/safari-zone-encounter.ts @@ -5,7 +5,6 @@ import IMysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier, Myste import MysteryEncounterOption, { EncounterOptionMode, MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; import { TrainerSlot } from "#app/data/trainer-config"; import { ScanIvsPhase, SummonPhase, VictoryPhase } from "#app/phases"; -import i18next from "i18next"; import { HiddenAbilityRateBoosterModifier, IvScannerModifier } from "#app/modifier/modifier"; import { EnemyPokemon } from "#app/field/pokemon"; import { PokeballType } from "#app/data/pokeball"; @@ -14,10 +13,11 @@ import { IntegerHolder, randSeedInt } from "#app/utils"; import { getPokemonSpecies } from "#app/data/pokemon-species"; import { MoneyRequirement } from "#app/data/mystery-encounters/mystery-encounter-requirements"; import { doPlayerFlee, doPokemonFlee, getRandomSpeciesByStarterTier, trainerThrowPokeball } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; -import { showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; +import { getEncounterText, showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; +import { getPokemonNameWithAffix } from "#app/messages"; /** the i18n namespace for the encounter */ -const namespace = "mysteryEncounter:safari_zone"; +const namespace = "mysteryEncounter:safariZone"; /** * Safari Zone encounter. @@ -41,21 +41,21 @@ export const SafariZoneEncounter: IMysteryEncounter = ]) .withIntroDialogue([ { - text: `${namespace}_intro_message`, + text: `${namespace}:intro`, }, ]) - .withTitle(`${namespace}_title`) - .withDescription(`${namespace}_description`) - .withQuery(`${namespace}_query`) + .withTitle(`${namespace}:title`) + .withDescription(`${namespace}:description`) + .withQuery(`${namespace}:query`) .withOption(new MysteryEncounterOptionBuilder() .withOptionMode(EncounterOptionMode.DISABLED_OR_DEFAULT) .withSceneRequirement(new MoneyRequirement(0, 2.75)) // Cost equal to 1 Max Revive .withDialogue({ - buttonLabel: `${namespace}_option_1_label`, - buttonTooltip: `${namespace}_option_1_tooltip`, + buttonLabel: `${namespace}:option:1:label`, + buttonTooltip: `${namespace}:option:1:tooltip`, selected: [ { - text: `${namespace}_option_1_selected_message`, + text: `${namespace}:option:1:selected`, }, ], }) @@ -67,6 +67,7 @@ export const SafariZoneEncounter: IMysteryEncounter = safariPokemonRemaining: 3 }; updatePlayerMoney(scene, -(encounter.options[0].requirements[0] as MoneyRequirement).requiredMoney); + // Load bait/mud assets scene.loadSe("PRSFX- Bug Bite", "battle_anims"); scene.loadSe("PRSFX- Sludge Bomb2", "battle_anims"); scene.loadSe("PRSFX- Taunt2", "battle_anims"); @@ -80,11 +81,11 @@ export const SafariZoneEncounter: IMysteryEncounter = ) .withSimpleOption( { - buttonLabel: `${namespace}_option_2_label`, - buttonTooltip: `${namespace}_option_2_tooltip`, + buttonLabel: `${namespace}:option:2:label`, + buttonTooltip: `${namespace}:option:2:tooltip`, selected: [ { - text: `${namespace}_option_2_selected_message`, + text: `${namespace}:option:2:selected`, }, ], }, @@ -115,11 +116,11 @@ const safariZoneGameOptions: MysteryEncounterOption[] = [ new MysteryEncounterOptionBuilder() .withOptionMode(EncounterOptionMode.DEFAULT) .withDialogue({ - buttonLabel: `${namespace}_pokeball_option_label`, - buttonTooltip: `${namespace}_pokeball_option_tooltip`, + buttonLabel: `${namespace}:safari:1:label`, + buttonTooltip: `${namespace}:safari:1:tooltip`, selected: [ { - text: `${namespace}_pokeball_option_selected`, + text: `${namespace}:safari:1:selected`, } ], }) @@ -149,11 +150,11 @@ const safariZoneGameOptions: MysteryEncounterOption[] = [ new MysteryEncounterOptionBuilder() .withOptionMode(EncounterOptionMode.DEFAULT) .withDialogue({ - buttonLabel: `${namespace}_bait_option_label`, - buttonTooltip: `${namespace}_bait_option_tooltip`, + buttonLabel: `${namespace}:safari:2:label`, + buttonTooltip: `${namespace}:safari:2:tooltip`, selected: [ { - text: `${namespace}_bait_option_selected`, + text: `${namespace}:safari:2:selected`, }, ], }) @@ -167,9 +168,9 @@ const safariZoneGameOptions: MysteryEncounterOption[] = [ // 80% chance to increase flee stage +1 const fleeChangeResult = tryChangeFleeStage(scene, 1, 8); if (!fleeChangeResult) { - await showEncounterText(scene, i18next.t(`${namespace}_pokemon_busy_eating`, { pokemonName: pokemon.name }), 1500, false ); + await showEncounterText(scene, getEncounterText(scene, `${namespace}:safari:busy_eating`), 1000, false ); } else { - await showEncounterText(scene, i18next.t(`${namespace}_pokemon_eating`, { pokemonName: pokemon.name }), 1500, false); + await showEncounterText(scene, getEncounterText(scene, `${namespace}:safari:eating`), 1000, false); } await doEndTurn(scene, 1); @@ -179,11 +180,11 @@ const safariZoneGameOptions: MysteryEncounterOption[] = [ new MysteryEncounterOptionBuilder() .withOptionMode(EncounterOptionMode.DEFAULT) .withDialogue({ - buttonLabel: `${namespace}_mud_option_label`, - buttonTooltip: `${namespace}_mud_option_tooltip`, + buttonLabel: `${namespace}:safari:3:label`, + buttonTooltip: `${namespace}:safari:3:tooltip`, selected: [ { - text: `${namespace}_mud_option_selected`, + text: `${namespace}:safari:3:selected`, }, ], }) @@ -196,9 +197,9 @@ const safariZoneGameOptions: MysteryEncounterOption[] = [ // 80% chance to decrease catch stage -1 const catchChangeResult = tryChangeCatchStage(scene, -1, 8); if (!catchChangeResult) { - await showEncounterText(scene, i18next.t(`${namespace}_pokemon_beside_itself_angry`, { pokemonName: pokemon.name }), 1500, false ); + await showEncounterText(scene, getEncounterText(scene, `${namespace}:safari:beside_itself_angry`), 1000, false ); } else { - await showEncounterText(scene, i18next.t(`${namespace}_pokemon_angry`, { pokemonName: pokemon.name }), 1500, false ); + await showEncounterText(scene, getEncounterText(scene, `${namespace}:safari:angry`), 1000, false ); } await doEndTurn(scene, 2); @@ -208,8 +209,8 @@ const safariZoneGameOptions: MysteryEncounterOption[] = [ new MysteryEncounterOptionBuilder() .withOptionMode(EncounterOptionMode.DEFAULT) .withDialogue({ - buttonLabel: `${namespace}_flee_option_label`, - buttonTooltip: `${namespace}_flee_option_tooltip`, + buttonLabel: `${namespace}:safari:4:label`, + buttonTooltip: `${namespace}:safari:4:tooltip`, }) .withOptionPhase(async (scene: BattleScene) => { // Flee option @@ -231,7 +232,8 @@ const safariZoneGameOptions: MysteryEncounterOption[] = [ async function summonSafariPokemon(scene: BattleScene) { const encounter = scene.currentBattle.mysteryEncounter; // Message pokemon remaining - scene.queueMessage(i18next.t(`${namespace}_remaining_count`, { remainingCount: encounter.misc.safariPokemonRemaining}), null, true); + encounter.setDialogueToken("remainingCount", encounter.misc.safariPokemonRemaining); + scene.queueMessage(getEncounterText(scene, `${namespace}:safari:remaining_count`), null, true); // Generate pokemon using safariPokemonRemaining so they are always the same pokemon no matter how many turns are taken // Safari pokemon roll twice on shiny and HA chances, but are otherwise normal @@ -279,7 +281,8 @@ async function summonSafariPokemon(scene: BattleScene) { scene.unshiftPhase(new SummonPhase(scene, 0, false)); - showEncounterText(scene, i18next.t("battle:singleWildAppeared", { pokemonName: pokemon.name }), 1500, false) + encounter.setDialogueToken("pokemonName", getPokemonNameWithAffix(pokemon)); + showEncounterText(scene, getEncounterText(scene, "battle:singleWildAppeared"), 1500, false) .then(() => { const ivScannerModifier = scene.findModifier(m => m instanceof IvScannerModifier); if (ivScannerModifier) { @@ -484,7 +487,7 @@ async function doEndTurn(scene: BattleScene, cursorIndex: number) { leaveEncounterWithoutBattle(scene, true); } } else { - scene.queueMessage(i18next.t(`${namespace}_pokemon_watching`, { pokemonName: pokemon.name }), 0, null, 1000); + scene.queueMessage(getEncounterText(scene, `${namespace}:safari:watching`), 0, null, 1000); initSubsequentOptionSelect(scene, { overrideOptions: safariZoneGameOptions, startingCursorIndex: cursorIndex, hideDescription: 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 5ce90f988bd..082eb9a1872 100644 --- a/src/data/mystery-encounters/encounters/shady-vitamin-dealer-encounter.ts +++ b/src/data/mystery-encounters/encounters/shady-vitamin-dealer-encounter.ts @@ -5,15 +5,14 @@ import { modifierTypes } from "#app/modifier/modifier-type"; import { randSeedInt } from "#app/utils"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { Species } from "#enums/species"; -import i18next from "i18next"; import BattleScene from "../../../battle-scene"; import IMysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier, } from "../mystery-encounter"; import { EncounterOptionMode, MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; import { MoneyRequirement } from "../mystery-encounter-requirements"; -import { queueEncounterMessage } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; +import { getEncounterText, queueEncounterMessage } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; /** the i18n namespace for this encounter */ -const namespace = "mysteryEncounter:shady_vitamin_dealer"; +const namespace = "mysteryEncounter:shadyVitaminDealer"; /** * Shady Vitamin Dealer encounter. @@ -49,26 +48,26 @@ export const ShadyVitaminDealerEncounter: IMysteryEncounter = ]) .withIntroDialogue([ { - text: `${namespace}_intro_message`, + text: `${namespace}:intro`, }, { - text: `${namespace}_intro_dialogue`, - speaker: `${namespace}_speaker`, + text: `${namespace}:intro_dialogue`, + speaker: `${namespace}:speaker`, }, ]) - .withTitle(`${namespace}_title`) - .withDescription(`${namespace}_description`) - .withQuery(`${namespace}_query`) + .withTitle(`${namespace}:title`) + .withDescription(`${namespace}:description`) + .withQuery(`${namespace}:query`) .withOption( new MysteryEncounterOptionBuilder() .withOptionMode(EncounterOptionMode.DISABLED_OR_DEFAULT) .withSceneMoneyRequirement(0, 2) // Wave scaling money multiplier of 2 .withDialogue({ - buttonLabel: `${namespace}_option_1_label`, - buttonTooltip: `${namespace}_option_1_tooltip`, + buttonLabel: `${namespace}:option:1:label`, + buttonTooltip: `${namespace}:option:1:tooltip`, selected: [ { - text: `${namespace}_option_selected`, + text: `${namespace}:option:selected`, }, ], }) @@ -95,7 +94,7 @@ export const ShadyVitaminDealerEncounter: IMysteryEncounter = // If pokemon meets primary pokemon reqs, it can be selected const meetsReqs = encounter.pokemonMeetsPrimaryRequirements(scene, pokemon); if (!meetsReqs) { - return i18next.t(`${namespace}_invalid_selection`); + return getEncounterText(scene, `${namespace}:invalid_selection`); } return null; @@ -130,13 +129,13 @@ export const ShadyVitaminDealerEncounter: IMysteryEncounter = if (randSeedInt(10) < 8) { if (chosenPokemon.trySetStatus(StatusEffect.TOXIC)) { // Toxic applied - queueEncounterMessage(scene, `${namespace}_bad_poison`); + queueEncounterMessage(scene, `${namespace}:bad_poison`); } else { // Pokemon immune or something else prevents status - queueEncounterMessage(scene, `${namespace}_damage_only`); + queueEncounterMessage(scene, `${namespace}:damage_only`); } } else { - queueEncounterMessage(scene, `${namespace}_damage_only`); + queueEncounterMessage(scene, `${namespace}:damage_only`); } setEncounterExp(scene, [chosenPokemon.id], 100); @@ -150,11 +149,11 @@ export const ShadyVitaminDealerEncounter: IMysteryEncounter = .withOptionMode(EncounterOptionMode.DISABLED_OR_DEFAULT) .withSceneMoneyRequirement(0, 5) // Wave scaling money multiplier of 5 .withDialogue({ - buttonLabel: `${namespace}_option_2_label`, - buttonTooltip: `${namespace}_option_2_tooltip`, + buttonLabel: `${namespace}:option:2:label`, + buttonTooltip: `${namespace}:option:2:tooltip`, selected: [ { - text: `${namespace}_option_selected`, + text: `${namespace}:option:selected`, }, ], }) @@ -181,7 +180,7 @@ export const ShadyVitaminDealerEncounter: IMysteryEncounter = // If pokemon meets primary pokemon reqs, it can be selected const meetsReqs = encounter.pokemonMeetsPrimaryRequirements(scene, pokemon); if (!meetsReqs) { - return i18next.t(`${namespace}_invalid_selection`); + return getEncounterText(scene, `${namespace}:invalid_selection`); } return null; @@ -212,13 +211,13 @@ export const ShadyVitaminDealerEncounter: IMysteryEncounter = if (randSeedInt(10) < 2) { if (chosenPokemon.trySetStatus(StatusEffect.POISON)) { // Poison applied - queueEncounterMessage(scene, `${namespace}_poison`); + queueEncounterMessage(scene, `${namespace}:poison`); } else { // Pokemon immune or something else prevents status - queueEncounterMessage(scene, `${namespace}_no_bad_effects`); + queueEncounterMessage(scene, `${namespace}:no_bad_effects`); } } else { - queueEncounterMessage(scene, `${namespace}_no_bad_effects`); + queueEncounterMessage(scene, `${namespace}:no_bad_effects`); } setEncounterExp(scene, [chosenPokemon.id], 100); @@ -229,8 +228,8 @@ export const ShadyVitaminDealerEncounter: IMysteryEncounter = ) .withSimpleOption( { - buttonLabel: `${namespace}_option_3_label`, - buttonTooltip: `${namespace}_option_3_tooltip`, + buttonLabel: `${namespace}:option:3:label`, + buttonTooltip: `${namespace}:option:3:tooltip`, }, async (scene: BattleScene) => { // Leave encounter with no rewards or exp diff --git a/src/data/mystery-encounters/encounters/sleeping-snorlax-encounter.ts b/src/data/mystery-encounters/encounters/slumbering-snorlax-encounter.ts similarity index 100% rename from src/data/mystery-encounters/encounters/sleeping-snorlax-encounter.ts rename to src/data/mystery-encounters/encounters/slumbering-snorlax-encounter.ts diff --git a/src/data/mystery-encounters/encounters/training-session-encounter.ts b/src/data/mystery-encounters/encounters/training-session-encounter.ts index 0829ce69040..e417bcc7ef4 100644 --- a/src/data/mystery-encounters/encounters/training-session-encounter.ts +++ b/src/data/mystery-encounters/encounters/training-session-encounter.ts @@ -19,7 +19,7 @@ import { EncounterOptionMode, MysteryEncounterOptionBuilder } from "../mystery-e import { queueEncounterMessage } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; /** The i18n namespace for the encounter */ -const namespace = "mysteryEncounter:training_session"; +const namespace = "mysteryEncounter:trainingSession"; /** * Training Session encounter. @@ -45,21 +45,21 @@ export const TrainingSessionEncounter: IMysteryEncounter = ]) .withIntroDialogue([ { - text: `${namespace}_intro_message`, + text: `${namespace}:intro`, }, ]) - .withTitle(`${namespace}_title`) - .withDescription(`${namespace}_description`) - .withQuery(`${namespace}_query`) + .withTitle(`${namespace}:title`) + .withDescription(`${namespace}:description`) + .withQuery(`${namespace}:query`) .withOption( new MysteryEncounterOptionBuilder() .withOptionMode(EncounterOptionMode.DEFAULT) .withDialogue({ - buttonLabel: `${namespace}_option_1_label`, - buttonTooltip: `${namespace}_option_1_tooltip`, + buttonLabel: `${namespace}:option:1:label`, + buttonTooltip: `${namespace}:option:1:tooltip`, selected: [ { - text: `${namespace}_option_selected_message`, + text: `${namespace}:option:selected`, }, ], }) @@ -170,7 +170,7 @@ export const TrainingSessionEncounter: IMysteryEncounter = scene.addModifier(mod, true, false, false, true); } scene.updateModifiers(true); - queueEncounterMessage(scene, `${namespace}_battle_finished_1`); + queueEncounterMessage(scene, `${namespace}:option:1:finished`); }; setEncounterRewards( @@ -188,12 +188,12 @@ export const TrainingSessionEncounter: IMysteryEncounter = new MysteryEncounterOptionBuilder() .withOptionMode(EncounterOptionMode.DEFAULT) .withDialogue({ - buttonLabel: `${namespace}_option_2_label`, - buttonTooltip: `${namespace}_option_2_tooltip`, - secondOptionPrompt: `${namespace}_option_2_select_prompt`, + buttonLabel: `${namespace}:option:2:label`, + buttonTooltip: `${namespace}:option:2:tooltip`, + secondOptionPrompt: `${namespace}:option:2:select_prompt`, selected: [ { - text: `${namespace}_option_selected_message`, + text: `${namespace}:option:selected`, }, ], }) @@ -242,7 +242,7 @@ export const TrainingSessionEncounter: IMysteryEncounter = scene.removePokemonFromPlayerParty(playerPokemon, false); const onBeforeRewardsPhase = () => { - queueEncounterMessage(scene, `${namespace}_battle_finished_2`); + queueEncounterMessage(scene, `${namespace}:option:2:finished`); // Add the pokemon back to party with Nature change playerPokemon.setNature(encounter.misc.chosenNature); scene.gameData.setPokemonCaught(playerPokemon, false); @@ -270,12 +270,12 @@ export const TrainingSessionEncounter: IMysteryEncounter = new MysteryEncounterOptionBuilder() .withOptionMode(EncounterOptionMode.DEFAULT) .withDialogue({ - buttonLabel: `${namespace}_option_3_label`, - buttonTooltip: `${namespace}_option_3_tooltip`, - secondOptionPrompt: `${namespace}_option_3_select_prompt`, + buttonLabel: `${namespace}:option:3:label`, + buttonTooltip: `${namespace}:option:3:tooltip`, + secondOptionPrompt: `${namespace}:option:3:select_prompt`, selected: [ { - text: `${namespace}_option_selected_message`, + text: `${namespace}:option:selected`, }, ], }) @@ -337,7 +337,7 @@ export const TrainingSessionEncounter: IMysteryEncounter = scene.removePokemonFromPlayerParty(playerPokemon, false); const onBeforeRewardsPhase = () => { - queueEncounterMessage(scene, `${namespace}_battle_finished_3`); + queueEncounterMessage(scene, `${namespace}:option:3:finished`); // Add the pokemon back to party with ability change const abilityIndex = encounter.misc.abilityIndex; if (!!playerPokemon.getFusionSpeciesForm()) { diff --git a/src/data/mystery-encounters/mystery-encounter-dialogue.ts b/src/data/mystery-encounters/mystery-encounter-dialogue.ts index cbf939744c4..34f5f4eb169 100644 --- a/src/data/mystery-encounters/mystery-encounter-dialogue.ts +++ b/src/data/mystery-encounters/mystery-encounter-dialogue.ts @@ -23,12 +23,6 @@ export class EncounterOptionsDialogue { options?: [...OptionTextDisplay[]]; // Options array with minimum 2 options } -export default class MysteryEncounterDialogue { - intro?: TextDisplay[]; - encounterOptionsDialogue?: EncounterOptionsDialogue; - outro?: TextDisplay[]; -} - /** * Example MysteryEncounterDialogue object: * @@ -72,3 +66,9 @@ export default class MysteryEncounterDialogue { } * */ +export default class MysteryEncounterDialogue { + intro?: TextDisplay[]; + encounterOptionsDialogue?: EncounterOptionsDialogue; + outro?: TextDisplay[]; +} + diff --git a/src/data/mystery-encounters/mystery-encounters.ts b/src/data/mystery-encounters/mystery-encounters.ts index 672fb3300a4..9163c16357b 100644 --- a/src/data/mystery-encounters/mystery-encounters.ts +++ b/src/data/mystery-encounters/mystery-encounters.ts @@ -8,7 +8,7 @@ import { LostAtSeaEncounter } from "./encounters/lost-at-sea-encounter"; import { MysteriousChallengersEncounter } from "./encounters/mysterious-challengers-encounter"; import { MysteriousChestEncounter } from "./encounters/mysterious-chest-encounter"; import { ShadyVitaminDealerEncounter } from "./encounters/shady-vitamin-dealer-encounter"; -import { SleepingSnorlaxEncounter } from "./encounters/sleeping-snorlax-encounter"; +import { SlumberingSnorlaxEncounter } from "./encounters/slumbering-snorlax-encounter"; import { TrainingSessionEncounter } from "./encounters/training-session-encounter"; import IMysteryEncounter from "./mystery-encounter"; import { SafariZoneEncounter } from "#app/data/mystery-encounters/encounters/safari-zone-encounter"; @@ -159,10 +159,10 @@ const anyBiomeEncounters: MysteryEncounterType[] = [ export const mysteryEncountersByBiome = new Map([ [Biome.TOWN, []], [Biome.PLAINS, [ - MysteryEncounterType.SLEEPING_SNORLAX + MysteryEncounterType.SLUMBERING_SNORLAX ]], [Biome.GRASS, [ - MysteryEncounterType.SLEEPING_SNORLAX, + MysteryEncounterType.SLUMBERING_SNORLAX, ]], [Biome.TALL_GRASS, []], [Biome.METROPOLIS, []], @@ -214,7 +214,7 @@ export function initMysteryEncounters() { allMysteryEncounters[MysteryEncounterType.DARK_DEAL] = DarkDealEncounter; allMysteryEncounters[MysteryEncounterType.FIGHT_OR_FLIGHT] = FightOrFlightEncounter; allMysteryEncounters[MysteryEncounterType.TRAINING_SESSION] = TrainingSessionEncounter; - allMysteryEncounters[MysteryEncounterType.SLEEPING_SNORLAX] = SleepingSnorlaxEncounter; + allMysteryEncounters[MysteryEncounterType.SLUMBERING_SNORLAX] = SlumberingSnorlaxEncounter; allMysteryEncounters[MysteryEncounterType.DEPARTMENT_STORE_SALE] = DepartmentStoreSaleEncounter; allMysteryEncounters[MysteryEncounterType.SHADY_VITAMIN_DEALER] = ShadyVitaminDealerEncounter; allMysteryEncounters[MysteryEncounterType.FIELD_TRIP] = FieldTripEncounter; diff --git a/src/enums/mystery-encounter-type.ts b/src/enums/mystery-encounter-type.ts index a863ce46020..348b7c9f398 100644 --- a/src/enums/mystery-encounter-type.ts +++ b/src/enums/mystery-encounter-type.ts @@ -3,7 +3,7 @@ export enum MysteryEncounterType { MYSTERIOUS_CHEST, DARK_DEAL, FIGHT_OR_FLIGHT, - SLEEPING_SNORLAX, + SLUMBERING_SNORLAX, TRAINING_SESSION, DEPARTMENT_STORE_SALE, SHADY_VITAMIN_DEALER, diff --git a/src/locales/en/mystery-encounter.ts b/src/locales/en/mystery-encounter.ts index 3e15782d7f0..817daa19bf8 100644 --- a/src/locales/en/mystery-encounter.ts +++ b/src/locales/en/mystery-encounter.ts @@ -8,7 +8,7 @@ import { fieryFalloutDialogue } from "#app/locales/en/mystery-encounters/fiery-f import { fightOrFlightDialogue } from "#app/locales/en/mystery-encounters/fight-or-flight-dialogue"; import { safariZoneDialogue } from "#app/locales/en/mystery-encounters/safari-zone-dialogue"; import { shadyVitaminDealerDialogue } from "#app/locales/en/mystery-encounters/shady-vitamin-dealer-dialogue"; -import { sleepingSnorlaxDialogue } from "#app/locales/en/mystery-encounters/sleeping-snorlax-dialogue"; +import { slumberingSnorlaxDialogue } from "#app/locales/en/mystery-encounters/slumbering-snorlax-dialogue"; import { trainingSessionDialogue } from "#app/locales/en/mystery-encounters/training-session-dialogue"; /** @@ -32,184 +32,11 @@ export const mysteryEncounter = { "paid_money": "You paid ₽{{amount, number}}.", "receive_money": "You received ₽{{amount, number}}!", - "department_store_sale_intro_message": "It's a lady with a ton of shopping bags.", - "department_store_sale_speaker": "Shopper", - "department_store_sale_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!`, - "department_store_sale_title": "Department Store Sale", - "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!", - "department_store_sale_query": "Which counter will you go to?", - "department_store_sale_option_1_label": "TM Counter", - "department_store_sale_option_1_tooltip": "(+) TM Shop", - "department_store_sale_option_2_label": "Vitamin Counter", - "department_store_sale_option_2_tooltip": "(+) Vitamin Shop", - "department_store_sale_option_3_label": "Battle Item Counter", - "department_store_sale_option_3_tooltip": "(+) X Item Shop", - "department_store_sale_option_4_label": "Pokéball Counter", - "department_store_sale_option_4_tooltip": "(+) Pokéball Shop", - "department_store_sale_outro": "What a deal! You should shop there more often.", - - "shady_vitamin_dealer_intro_message": "A man in a dark coat approaches you.", - "shady_vitamin_dealer_speaker": "Shady Salesman", - "shady_vitamin_dealer_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.`, - "shady_vitamin_dealer_title": "The Vitamin Dealer", - "shady_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.", - "shady_vitamin_dealer_query": "Which deal will choose?", - "shady_vitamin_dealer_invalid_selection": "Pokémon must be healthy enough.", - "shady_vitamin_dealer_option_1_label": "The Cheap Deal", - "shady_vitamin_dealer_option_1_tooltip": "(-) Pay {{option1Money, money}}\n(-) Side Effects?\n(+) Chosen Pokémon Gains 2 Random Vitamins", - "shady_vitamin_dealer_option_2_label": "The Pricey Deal", - "shady_vitamin_dealer_option_2_tooltip": "(-) Pay {{option2Money, money}}\n(-) Side Effects?\n(+) Chosen Pokémon Gains 2 Random Vitamins", - "shady_vitamin_dealer_option_selected": `The man hands you two bottles and quickly disappears. - \${{selectedPokemon}} gained {{boost1}} and {{boost2}} boosts!`, - "shady_vitamin_dealer_damage_only": `But the medicine had some side effects! - $Your {{selectedPokemon}} takes some damage...`, - "shady_vitamin_dealer_bad_poison": `But the medicine had some side effects! - $Your {{selectedPokemon}} takes some damage\nand becomes badly poisoned...`, - "shady_vitamin_dealer_poison": `But the medicine had some side effects! - $Your {{selectedPokemon}} becomes poisoned...`, - "shady_vitamin_dealer_no_bad_effects": "Looks like there were no side-effects this time.", - "shady_vitamin_dealer_option_3_label": "Leave", - "shady_vitamin_dealer_option_3_tooltip": "(-) No Rewards", - - "field_trip_intro_message": "It's a teacher and some school children!", - "field_trip_speaker": "Teacher", - "field_trip_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?`, - "field_trip_title": "Field Trip", - "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.", - "field_trip_query": "Which move category will you show off?", - "field_trip_option_1_label": "A Physical Move", - "field_trip_option_1_tooltip": "(+) Physical Item Rewards", - "field_trip_option_2_label": "A Special Move", - "field_trip_option_2_tooltip": "(+) Special Item Rewards", - "field_trip_option_3_label": "A Status Move", - "field_trip_option_3_tooltip": "(+) Status Item Rewards", - "field_trip_second_option_prompt": "Choose a move for your Pokémon to use.", - "field_trip_option_selected": "{{pokeName}} shows off an awesome display of {{move}}!", - "field_trip_option_incorrect": `... - $That isn't a {{moveCategory}} move! - $I'm sorry, but I can't give you anything.`, - "field_trip_lesson_learned": `Looks like you learned a valuable lesson? - $Your Pokémon also gained some knowledge.`, - "field_trip_outro_good": "Thank you so much for your kindness!\nI hope the items I had were helpful!", - "field_trip_outro_bad": "Come along children, we'll\nfind a better demonstration elsewhere.", - - // Mystery Encounters -- Great Tier - - "mysterious_challengers_intro_message": "Mysterious challengers have appeared!", - "mysterious_challengers_title": "Mysterious Challengers", - "mysterious_challengers_description": "If you defeat a challenger, you might impress them enough to receive a boon. But some look tough, are you up to the challenge?", - "mysterious_challengers_query": "Who will you battle?", - "mysterious_challengers_option_1_label": "A clever, mindful foe", - "mysterious_challengers_option_1_tooltip": "(-) Standard Battle\n(+) Move Item Rewards", - "mysterious_challengers_option_2_label": "A strong foe", - "mysterious_challengers_option_2_tooltip": "(-) Hard Battle\n(+) Good Rewards", - "mysterious_challengers_option_3_label": "The mightiest foe", - "mysterious_challengers_option_3_tooltip": "(-) Brutal Battle\n(+) Great Rewards", - "mysterious_challengers_option_selected_message": "The trainer steps forward...", - "mysterious_challengers_outro_win": "The mysterious challenger was defeated!", - - "safari_zone_intro_message": "It's a safari zone!", - "safari_zone_title": "The Safari Zone", - "safari_zone_description": "There are all kinds of rare and special Pokémon that can be found here!\nIf you choose to enter, you'll have a time limit of 3 wild encounters where you can try to catch these special Pokémon.\n\nBeware, though. These Pokémon may flee before you're able to catch them!", - "safari_zone_query": "Would you like to enter?", - "safari_zone_option_1_label": "Enter", - "safari_zone_option_1_tooltip": "(-) Pay {{option1Money, money}}\n@[SUMMARY_GREEN]{(?) Safari Zone}", - "safari_zone_option_2_label": "Leave", - "safari_zone_option_2_tooltip": "(-) No Rewards", - "safari_zone_option_1_selected_message": "Time to test your luck!", - "safari_zone_option_2_selected_message": "You hurry along your way,\nwith a slight feeling of regret.", - "safari_zone_pokeball_option_label": "Throw a Pokéball", - "safari_zone_pokeball_option_tooltip": "(+) Throw a Pokéball", - "safari_zone_pokeball_option_selected": "You throw a Pokéball!", - "safari_zone_bait_option_label": "Throw bait", - "safari_zone_bait_option_tooltip": "(+) Increases Capture Rate\n(-) Chance to Increase Flee Rate", - "safari_zone_bait_option_selected": "You throw some bait!", - "safari_zone_mud_option_label": "Throw mud", - "safari_zone_mud_option_tooltip": "(+) Decreases Flee Rate\n(-) Chance to Decrease Capture Rate", - "safari_zone_mud_option_selected": "You throw some mud!", - "safari_zone_flee_option_label": "Flee", - "safari_zone_flee_option_tooltip": "(?) Flee from this Pokémon", - "safari_zone_pokemon_watching": "{{pokemonName}} is watching carefully!", - "safari_zone_pokemon_eating": "{{pokemonName}} is eating!", - "safari_zone_pokemon_busy_eating": "{{pokemonName}} is busy eating!", - "safari_zone_pokemon_angry": "{{pokemonName}} is angry!", - "safari_zone_pokemon_beside_itself_angry": "{{pokemonName}} is beside itself with anger!", - "safari_zone_remaining_count": "{{remainingCount}} Pokémon remaining!", - - "fiery_fallout_intro_message": "You encounter a blistering storm of smoke and ash!", - "fiery_fallout_title": "Fiery Fallout", - "fiery_fallout_description": "The whirling storm of ash and embers has cut visibility to nearly zero. It seems like there might be some... source that is causing these conditions. But what could be behind a phenomenon of this magnitude?", - "fiery_fallout_query": "What will you do?", - "fiery_fallout_option_1_label": "Find the source", - "fiery_fallout_option_1_tooltip": "(?) Discover the source\n(-) Hard Battle", - "fiery_fallout_option_2_label": "Hunker down", - "fiery_fallout_option_2_tooltip": "(-) Suffer the effects of the weather", - "fiery_fallout_option_3_label": "Your Fire types help", - "fiery_fallout_option_3_tooltip": "(+) End the conditions\n(+) Gain a Charcoal", - "fiery_fallout_option_3_disabled_tooltip": "You need at least 2 Fire Type Pokémon to choose this", - "fiery_fallout_option_1_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!`, - "fiery_fallout_option_2_selected": `The weather effects cause significant harm as you struggle to find shelter! - $Your party takes 30% Max HP damage! - $Your {burnTarget} also becomes burned!`, - // "fiery_fallout_boss_enraged": "The opposing {{enemyPokemon}} has become enraged!", - "fiery_fallout_option_3_selected": `Your {{primaryPokemonName}} and {{secondaryPokemonName}} guide you to where two Volcarona are in the middle of a mating dance! - $Thankfully, your Pokémon are able to calm them, and they depart without issue.`, - - // Mystery Encounters -- Ultra Tier - - "training_session_intro_message": "You've come across some\ntraining tools and supplies.", - "training_session_title": "Training Session", - "training_session_description": "These supplies look like they could be used to train a member of your party! There are a few ways you could train your Pokémon, by battling against it with the rest of your team.", - "training_session_query": "How should you train?", - "training_session_option_1_label": "Light Training", - "training_session_option_1_tooltip": "(-) Light Battle\n(+) Improve 2 Random IVs of Pokémon", - "training_session_option_2_label": "Moderate Training", - "training_session_option_2_tooltip": "(-) Moderate Battle\n(+) Change Pokémon's Nature", - "training_session_option_2_select_prompt": "Select a new nature\nto train your Pokémon in.", - "training_session_option_3_label": "Heavy Training", - "training_session_option_3_tooltip": "(-) Harsh Battle\n(+) Change Pokémon's Ability", - "training_session_option_3_select_prompt": "Select a new ability\nto train your Pokémon in.", - "training_session_option_selected_message": "{{selectedPokemon}} moves across\nthe clearing to face you...", - "training_session_battle_finished_1": `{{selectedPokemon}} returns, feeling\nworn out but accomplished! - $Its {{stat1}} and {{stat2}} IVs were improved!`, - "training_session_battle_finished_2": `{{selectedPokemon}} returns, feeling\nworn out but accomplished! - $Its nature was changed to {{nature}}!`, - "training_session_battle_finished_3": `{{selectedPokemon}} returns, feeling\nworn out but accomplished! - $Its ability was changed to {{ability}}!`, - "training_session_outro_win": "That was a successful training session!", - - // Mystery Encounters -- Rogue Tier - - "sleeping_snorlax_intro_message": `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.`, - "sleeping_snorlax_title": "Sleeping Snorlax", - "sleeping_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...", - "sleeping_snorlax_query": "What will you do?", - "sleeping_snorlax_option_1_label": "Fight it", - "sleeping_snorlax_option_1_tooltip": "(-) Fight Sleeping Snorlax", - "sleeping_snorlax_option_2_label": "Wait for it to move", - "sleeping_snorlax_option_2_tooltip": "@[SUMMARY_BLUE]{(75%) Wait a short time}\n@[SUMMARY_BLUE]{(25%) Wait a long time}", - "sleeping_snorlax_option_3_label": "Steal its item", - "sleeping_snorlax_option_3_tooltip": "(+) {{option3PrimaryName}} uses {{option3PrimaryMove}}\n(+) Leftovers", - "sleeping_snorlax_option_3_disabled_tooltip": "Your Pokémon need to know certain moves to choose this", - "sleeping_snorlax_option_1_selected_message": "You approach the\nPokémon without fear.", - "sleeping_snorlax_option_2_selected_message": `.@d{32}.@d{32}.@d{32} - $You wait for a time, but the Snorlax's yawns make your party sleepy...`, - "sleeping_snorlax_option_2_good_result": "When you all awaken, the Snorlax is no where to be found -\nbut your Pokémon are all healed!", - "sleeping_snorlax_option_3_good_result": "Your {{option3PrimaryName}} uses {{option3PrimaryMove}}! @s{item_fanfare}It steals Leftovers off the sleeping Snorlax and you make out like bandits!", - mysteriousChallengers: mysteriousChallengersDialogue, mysteriousChest: mysteriousChestDialogue, darkDeal: darkDealDialogue, fightOrFlight: fightOrFlightDialogue, - sleepingSnorlax: sleepingSnorlaxDialogue, + slumberingSnorlax: slumberingSnorlaxDialogue, trainingSession: trainingSessionDialogue, departmentStoreSale: departmentStoreSaleDialogue, shadyVitaminDealer: shadyVitaminDealerDialogue, diff --git a/src/locales/en/mystery-encounters/department-store-sale-dialogue.ts b/src/locales/en/mystery-encounters/department-store-sale-dialogue.ts index 287e3c9bae2..5b7fe9a0af0 100644 --- a/src/locales/en/mystery-encounters/department-store-sale-dialogue.ts +++ b/src/locales/en/mystery-encounters/department-store-sale-dialogue.ts @@ -1,31 +1,29 @@ export const departmentStoreSaleDialogue = { - intro: "Wandering aimlessly through the sea, you've effectively gotten nowhere.", - title: "Lost at Sea", - description: "The sea is turbulent in this area, and you're running out of energy.\nThis is bad. Is there a way out of the situation?", - query: "What will you do?", + intro: "It's a lady with a ton of shopping bags.", + speaker: "Shopper", + 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?", option: { 1: { - label: "{{option1PrimaryName}} can help", - 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. - \${{option1PrimaryName}} seems to also have gotten stronger in this time of need!`, + label: "TM Counter", + tooltip: "(+) TM Shop", }, 2: { - label: "{{option2PrimaryName}} can 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. - \${{option2PrimaryName}} seems to also have gotten stronger in this time of need!`, + label: "Vitamin Counter", + tooltip: "(+) Vitamin Shop", }, 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. - $You and your Pokémon are fatigued from the whole ordeal.`, + label: "Battle Item Counter", + tooltip: "(+) X Item Shop", + }, + 4: { + label: "Pokéball Counter", + tooltip: "(+) Pokéball Shop", }, }, - outro: "You are back on track." + outro: "What a deal! You should shop there more often." }; diff --git a/src/locales/en/mystery-encounters/field-trip-dialogue.ts b/src/locales/en/mystery-encounters/field-trip-dialogue.ts index 7e4a4041b92..62ee175e073 100644 --- a/src/locales/en/mystery-encounters/field-trip-dialogue.ts +++ b/src/locales/en/mystery-encounters/field-trip-dialogue.ts @@ -1,31 +1,33 @@ export const fieldTripDialogue = { - intro: "Wandering aimlessly through the sea, you've effectively gotten nowhere.", - title: "Lost at Sea", - description: "The sea is turbulent in this area, and you're running out of energy.\nThis is bad. Is there a way out of the situation?", - query: "What will you do?", + 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? + $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?", option: { 1: { - label: "{{option1PrimaryName}} can help", - 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. - \${{option1PrimaryName}} seems to also have gotten stronger in this time of need!`, + label: "A Physical Move", + tooltip: "(+) Physical Item Rewards", }, 2: { - label: "{{option2PrimaryName}} can 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. - \${{option2PrimaryName}} seems to also have gotten stronger in this time of need!`, + label: "A Special Move", + tooltip: "(+) Special Item Rewards", }, 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. - $You and your Pokémon are fatigued from the whole ordeal.`, + label: "A Status Move", + tooltip: "(+) Status Item Rewards", }, + selected: "{{pokeName}} shows off an awesome display of {{move}}!", + 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.` }, - outro: "You are back on track." + 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!", + outro_bad: "Come along children, we'll\nfind a better demonstration elsewhere." }; diff --git a/src/locales/en/mystery-encounters/fiery-fallout-dialogue.ts b/src/locales/en/mystery-encounters/fiery-fallout-dialogue.ts index 2c0549a3374..59808bc35ac 100644 --- a/src/locales/en/mystery-encounters/fiery-fallout-dialogue.ts +++ b/src/locales/en/mystery-encounters/fiery-fallout-dialogue.ts @@ -1,31 +1,28 @@ export const fieryFalloutDialogue = { - intro: "Wandering aimlessly through the sea, you've effectively gotten nowhere.", - title: "Lost at Sea", - description: "The sea is turbulent in this area, and you're running out of energy.\nThis is bad. Is there a way out of the situation?", + intro: "You encounter a blistering storm of smoke and ash!", + title: "Fiery Fallout", + description: "The whirling ash and embers have cut visibility to nearly zero. It seems like there might be some... source that is causing these conditions. But what could be behind a phenomenon of this magnitude?", query: "What will you do?", option: { 1: { - label: "{{option1PrimaryName}} can help", - 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. - \${{option1PrimaryName}} seems to also have gotten stronger in this time of need!`, + 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! + $They don't take kindly to the interruption and attack!`, }, 2: { - label: "{{option2PrimaryName}} can 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. - \${{option2PrimaryName}} seems to also have gotten stronger in this time of need!`, + label: "Hunker down", + tooltip: "(-) Suffer the effects of the weather", + selected: `The weather effects cause significant harm as you struggle to find shelter! + $Your party takes 30% Max HP damage! + $Your {burnTarget} also becomes burned!`, }, 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. - $You and your Pokémon are fatigued from the whole ordeal.`, + 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 {{primaryPokemonName}} and {{secondaryPokemonName}} guide you to where two Volcarona are in the middle of a mating dance! + $Thankfully, your Pokémon are able to calm them, and they depart without issue.`, }, - }, - outro: "You are back on track." + } }; diff --git a/src/locales/en/mystery-encounters/mysterious-challengers-dialogue.ts b/src/locales/en/mystery-encounters/mysterious-challengers-dialogue.ts index 20be45af4c9..56c78e7e5f8 100644 --- a/src/locales/en/mystery-encounters/mysterious-challengers-dialogue.ts +++ b/src/locales/en/mystery-encounters/mysterious-challengers-dialogue.ts @@ -1,31 +1,22 @@ export const mysteriousChallengersDialogue = { - intro: "Wandering aimlessly through the sea, you've effectively gotten nowhere.", - title: "Lost at Sea", - description: "The sea is turbulent in this area, and you're running out of energy.\nThis is bad. Is there a way out of the situation?", - query: "What will you do?", + intro: "Mysterious challengers have appeared!", + title: "Mysterious Challengers", + description: "If you defeat a challenger, you might impress them enough to receive a boon. But some look tough, are you up to the challenge?", + query: "Who will you battle?", option: { 1: { - label: "{{option1PrimaryName}} can help", - 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. - \${{option1PrimaryName}} seems to also have gotten stronger in this time of need!`, + label: "A clever, mindful foe", + tooltip: "(-) Standard Battle\n(+) Move Item Rewards", }, 2: { - label: "{{option2PrimaryName}} can 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. - \${{option2PrimaryName}} seems to also have gotten stronger in this time of need!`, + label: "A strong foe", + tooltip: "(-) Hard Battle\n(+) Good Rewards", }, 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. - $You and your Pokémon are fatigued from the whole ordeal.`, + label: "The mightiest foe", + tooltip: "(-) Brutal Battle\n(+) Great Rewards", }, + selected: "The trainer steps forward...", }, - outro: "You are back on track." + outro: "The mysterious challenger was defeated!" }; diff --git a/src/locales/en/mystery-encounters/safari-zone-dialogue.ts b/src/locales/en/mystery-encounters/safari-zone-dialogue.ts index 46952b7b197..ae77aa447b8 100644 --- a/src/locales/en/mystery-encounters/safari-zone-dialogue.ts +++ b/src/locales/en/mystery-encounters/safari-zone-dialogue.ts @@ -1,31 +1,46 @@ export const safariZoneDialogue = { - intro: "Wandering aimlessly through the sea, you've effectively gotten nowhere.", - title: "Lost at Sea", - description: "The sea is turbulent in this area, and you're running out of energy.\nThis is bad. Is there a way out of the situation?", - query: "What will you do?", + intro: "It's a safari zone!", + title: "The Safari Zone", + description: "There are all kinds of rare and special Pokémon that can be found here!\nIf you choose to enter, you'll have a time limit of 3 wild encounters where you can try to catch these special Pokémon.\n\nBeware, though. These Pokémon may flee before you're able to catch them!", + query: "Would you like to enter?", option: { 1: { - label: "{{option1PrimaryName}} can help", - 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. - \${{option1PrimaryName}} seems to also have gotten stronger in this time of need!`, + label: "Enter", + tooltip: "(-) Pay {{option1Money, money}}\n@[SUMMARY_GREEN]{(?) Safari Zone}", + selected: "Time to test your luck!", }, 2: { - label: "{{option2PrimaryName}} can 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. - \${{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. - $You and your Pokémon are fatigued from the whole ordeal.`, + label: "Leave", + tooltip: "(-) No Rewards", + selected: "You hurry along your way,\nwith a slight feeling of regret.", }, }, - outro: "You are back on track." + safari: { + 1: { + label: "Throw a Pokéball", + tooltip: "(+) Throw a Pokéball", + selected: "You throw a Pokéball!", + }, + 2: { + label: "Throw bait", + tooltip: "(+) Increases Capture Rate\n(-) Chance to Increase Flee Rate", + selected: "You throw some bait!", + }, + 3: { + label: "Throw mud", + tooltip: "(+) Decreases Flee Rate\n(-) Chance to Decrease Capture Rate", + selected: "You throw some mud!", + }, + 4: { + label: "Flee", + tooltip: "(?) Flee from this Pokémon", + }, + watching: "{{pokemonName}} is watching carefully!", + eating: "{{pokemonName}} is eating!", + busy_eating: "{{pokemonName}} is busy eating!", + angry: "{{pokemonName}} is angry!", + beside_itself_angry: "{{pokemonName}} is beside itself with anger!", + remaining_count: "{{remainingCount}} Pokémon remaining!", + }, + outro: "That was a fun little excursion!" }; diff --git a/src/locales/en/mystery-encounters/shady-vitamin-dealer-dialogue.ts b/src/locales/en/mystery-encounters/shady-vitamin-dealer-dialogue.ts index 9bfdc139ea1..ecf88577c75 100644 --- a/src/locales/en/mystery-encounters/shady-vitamin-dealer-dialogue.ts +++ b/src/locales/en/mystery-encounters/shady-vitamin-dealer-dialogue.ts @@ -1,31 +1,40 @@ export const shadyVitaminDealerDialogue = { - intro: "Wandering aimlessly through the sea, you've effectively gotten nowhere.", - title: "Lost at Sea", - description: "The sea is turbulent in this area, and you're running out of energy.\nThis is bad. Is there a way out of the situation?", - query: "What will you do?", + intro: "A man in a dark coat approaches you.", + speaker: "Shady Salesman", + 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?", + invalid_selection: "Pokémon must be healthy enough.", option: { 1: { - label: "{{option1PrimaryName}} can help", - label_disabled: "Can't {{option1RequiredMove}}", - tooltip: "(+) {{option1PrimaryName}} saves you\n(+) {{option1PrimaryName}} gains some EXP", - tooltip_disabled: "You have no Pokémon to {{option1RequiredMove}} on", + label: "The Cheap Deal", + tooltip: "(-) Pay {{option1Money, money}}\n(-) Side Effects?\n(+) Chosen Pokémon Gains 2 Random Vitamins", selected: `{{option1PrimaryName}} swims ahead, guiding you back on track. \${{option1PrimaryName}} seems to also have gotten stronger in this time of need!`, }, 2: { - label: "{{option2PrimaryName}} can 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", + label: "The Pricey Deal", + tooltip: "(-) Pay {{option2Money, money}}\n(-) Side Effects?\n(+) Chosen Pokémon Gains 2 Random Vitamins", 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", + label: "Leave", + tooltip: "(-) No Rewards", 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.`, }, + selected: `The man hands you two bottles and quickly disappears. + \${{selectedPokemon}} gained {{boost1}} and {{boost2}} boosts!` }, - outro: "You are back on track." + 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.", }; diff --git a/src/locales/en/mystery-encounters/sleeping-snorlax-dialogue.ts b/src/locales/en/mystery-encounters/slumbering-snorlax-dialogue.ts similarity index 100% rename from src/locales/en/mystery-encounters/sleeping-snorlax-dialogue.ts rename to src/locales/en/mystery-encounters/slumbering-snorlax-dialogue.ts diff --git a/src/locales/en/mystery-encounters/training-session-dialogue.ts b/src/locales/en/mystery-encounters/training-session-dialogue.ts index a54adf92492..12e84dd8d0d 100644 --- a/src/locales/en/mystery-encounters/training-session-dialogue.ts +++ b/src/locales/en/mystery-encounters/training-session-dialogue.ts @@ -1,31 +1,30 @@ export const trainingSessionDialogue = { - intro: "Wandering aimlessly through the sea, you've effectively gotten nowhere.", - title: "Lost at Sea", - description: "The sea is turbulent in this area, and you're running out of energy.\nThis is bad. Is there a way out of the situation?", - query: "What will you do?", + intro: "You've come across some\ntraining tools and supplies.", + title: "Training Session", + description: "These supplies look like they could be used to train a member of your party! There are a few ways you could train your Pokémon, by battling against it with the rest of your team.", + query: "How should you train?", option: { 1: { - label: "{{option1PrimaryName}} can help", - 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. - \${{option1PrimaryName}} seems to also have gotten stronger in this time of need!`, + label: "Light Training", + tooltip: "(-) Light Battle\n(+) Improve 2 Random IVs of Pokémon", + finished: `{{selectedPokemon}} returns, feeling\nworn out but accomplished! + $Its {{stat1}} and {{stat2}} IVs were improved!`, }, 2: { - label: "{{option2PrimaryName}} can 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. - \${{option2PrimaryName}} seems to also have gotten stronger in this time of need!`, + 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! + $Its nature was changed to {{nature}}!`, }, 3: { - label: "Wander aimlessly", + label: "Heavy Training", 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. - $You and your Pokémon are fatigued from the whole ordeal.`, + select_prompt: "Select a new ability\nto train your Pokémon in.", + finished: `{{selectedPokemon}} returns, feeling\nworn out but accomplished! + $Its ability was changed to {{ability}}!`, }, + selected: "{{selectedPokemon}} moves across\nthe clearing to face you...", }, - outro: "You are back on track." + outro: "That was a successful training session!", }; diff --git a/src/overrides.ts b/src/overrides.ts index 7272f68bcb4..e19a5bf20dd 100644 --- a/src/overrides.ts +++ b/src/overrides.ts @@ -117,9 +117,9 @@ export const EGG_GACHA_PULL_COUNT_OVERRIDE: number = 0; */ // 1 to 256, set to null to ignore -export const MYSTERY_ENCOUNTER_RATE_OVERRIDE: number = 256; +export const MYSTERY_ENCOUNTER_RATE_OVERRIDE: number = null; export const MYSTERY_ENCOUNTER_TIER_OVERRIDE: MysteryEncounterTier = null; -export const MYSTERY_ENCOUNTER_OVERRIDE: MysteryEncounterType = MysteryEncounterType.SLEEPING_SNORLAX; +export const MYSTERY_ENCOUNTER_OVERRIDE: MysteryEncounterType = null; /** * MODIFIER / ITEM OVERRIDES 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 76a7dca8cdf..e8dcc369662 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 @@ -12,7 +12,7 @@ import GameManager from "#app/test/utils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { runSelectMysteryEncounterOption } from "../encounterTestUtils"; -const namespace = "mysteryEncounter:lostAtSeaDialogue"; +const namespace = "mysteryEncounter:lostAtSea"; /** Blastoise for surf. Pidgeot for fly. Abra for none. */ const defaultParty = [Species.BLASTOISE, Species.PIDGEOT, Species.ABRA]; const defaultBiome = Biome.SEA; @@ -123,7 +123,7 @@ describe("Lost at Sea - Mystery Encounter", () => { await runSelectMysteryEncounterOption(game, 2); expect(blastoise.exp).toBe(expBefore + laprasSpecies.baseExp * defaultWave); - }, 10000000); + }); it("should leave encounter without battle", async () => { game.override.startingWave(33); @@ -178,7 +178,6 @@ describe("Lost at Sea - Mystery Encounter", () => { game.override.startingWave(33); const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); - // await workaround_reInitSceneWithOverrides(game); await game.runToMysteryEncounter(defaultParty); await runSelectMysteryEncounterOption(game, 2); From b68abaab9415ee97cfeef871c45c38cdb00faf85 Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Thu, 18 Jul 2024 16:01:47 -0400 Subject: [PATCH 180/270] cleanup and add jsdocs --- src/data/battle-anims.ts | 50 ++++++++++++------- .../encounters/safari-zone-encounter.ts | 14 +++--- .../slumbering-snorlax-encounter.ts | 40 ++++++++------- .../slumbering-snorlax-dialogue.ts | 41 +++++++-------- 4 files changed, 80 insertions(+), 65 deletions(-) diff --git a/src/data/battle-anims.ts b/src/data/battle-anims.ts index f832318fc4b..234e827b648 100644 --- a/src/data/battle-anims.ts +++ b/src/data/battle-anims.ts @@ -103,6 +103,11 @@ export enum CommonAnim { LOCK_ON = 2120 } +/** + * Animations used for Mystery Encounters + * These are custom animations that may or may not work in any other circumstance + * Use at your own risk + */ export enum EncounterAnim { MAGMA_BG, MAGMA_SPOUT @@ -520,23 +525,26 @@ export function initMoveAnim(scene: BattleScene, move: Moves): Promise { }); } -export function initEncounterAnims(scene: BattleScene, anims: EncounterAnim | EncounterAnim[]): Promise { +/** + * Fetches animation configs to be used in a Mystery Encounter + * @param scene + * @param anims - one or more animations to fetch + */ +export async function initEncounterAnims(scene: BattleScene, anims: EncounterAnim | EncounterAnim[]): Promise { anims = anims instanceof Array ? anims : [anims]; - return new Promise(resolve => { - const encounterAnimNames = Utils.getEnumKeys(EncounterAnim); - const encounterAnimIds = Utils.getEnumValues(EncounterAnim); - const encounterAnimFetches = []; - for (const anim of anims) { - if (encounterAnims.has(anim) && !isNullOrUndefined(encounterAnims.get(anim))) { - continue; - } - const encounterAnimId = encounterAnimIds[anim]; - encounterAnimFetches.push(scene.cachedFetch(`./battle-anims/encounter-${encounterAnimNames[anim].toLowerCase().replace(/\_/g, "-")}.json`) - .then(response => response.json()) - .then(cas => encounterAnims.set(encounterAnimId, new AnimConfig(cas)))); + const encounterAnimNames = Utils.getEnumKeys(EncounterAnim); + const encounterAnimIds = Utils.getEnumValues(EncounterAnim); + const encounterAnimFetches = []; + for (const anim of anims) { + if (encounterAnims.has(anim) && !isNullOrUndefined(encounterAnims.get(anim))) { + continue; } - Promise.allSettled(encounterAnimFetches).then(() => resolve()); - }); + const encounterAnimId = encounterAnimIds[anim]; + encounterAnimFetches.push(scene.cachedFetch(`./battle-anims/encounter-${encounterAnimNames[anim].toLowerCase().replace(/\_/g, "-")}.json`) + .then(response => response.json()) + .then(cas => encounterAnims.set(encounterAnimId, new AnimConfig(cas)))); + } + await Promise.allSettled(encounterAnimFetches); } export function initMoveChargeAnim(scene: BattleScene, chargeAnim: ChargeAnim): Promise { @@ -593,10 +601,14 @@ export function loadCommonAnimAssets(scene: BattleScene, startLoad?: boolean): P }); } -export function loadEncounterAnimAssets(scene: BattleScene, startLoad?: boolean): Promise { - return new Promise(resolve => { - loadAnimAssets(scene, Array.from(encounterAnims.values()), startLoad).then(() => resolve()); - }); +/** + * Loads encounter animation assets to scene + * MUST be called after [initEncounterAnims()](./battle-anims.ts) to load all required animations properly + * @param scene + * @param startLoad + */ +export async function loadEncounterAnimAssets(scene: BattleScene, startLoad?: boolean): Promise { + await loadAnimAssets(scene, Array.from(encounterAnims.values()), startLoad); } export function loadMoveAnimAssets(scene: BattleScene, moveIds: Moves[], startLoad?: boolean): Promise { diff --git a/src/data/mystery-encounters/encounters/safari-zone-encounter.ts b/src/data/mystery-encounters/encounters/safari-zone-encounter.ts index ee0a161408a..164ac112596 100644 --- a/src/data/mystery-encounters/encounters/safari-zone-encounter.ts +++ b/src/data/mystery-encounters/encounters/safari-zone-encounter.ts @@ -19,6 +19,8 @@ import { getPokemonNameWithAffix } from "#app/messages"; /** the i18n namespace for the encounter */ const namespace = "mysteryEncounter:safariZone"; +const TRAINER_THROW_ANIMATION_TIMES = [512, 184, 768]; + /** * Safari Zone encounter. * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/39 | GitHub Issue #39} @@ -314,14 +316,14 @@ async function throwBait(scene: BattleScene, pokemon: EnemyPokemon): Promise { scene.trainer.setTexture(`trainer_${scene.gameData.gender === PlayerGender.FEMALE ? "f" : "m"}_back_pb`); - scene.time.delayedCall(512, () => { + scene.time.delayedCall(TRAINER_THROW_ANIMATION_TIMES[0], () => { scene.playSound("pb_throw"); // Trainer throw frames scene.trainer.setFrame("2"); - scene.time.delayedCall(184, () => { + scene.time.delayedCall(TRAINER_THROW_ANIMATION_TIMES[1], () => { scene.trainer.setFrame("3"); - scene.time.delayedCall(768, () => { + scene.time.delayedCall(TRAINER_THROW_ANIMATION_TIMES[2], () => { scene.trainer.setTexture(`trainer_${scene.gameData.gender === PlayerGender.FEMALE ? "f" : "m"}_back`); }); }); @@ -380,14 +382,14 @@ async function throwMud(scene: BattleScene, pokemon: EnemyPokemon): Promise { scene.trainer.setTexture(`trainer_${scene.gameData.gender === PlayerGender.FEMALE ? "f" : "m"}_back_pb`); - scene.time.delayedCall(512, () => { + scene.time.delayedCall(TRAINER_THROW_ANIMATION_TIMES[0], () => { scene.playSound("pb_throw"); // Trainer throw frames scene.trainer.setFrame("2"); - scene.time.delayedCall(184, () => { + scene.time.delayedCall(TRAINER_THROW_ANIMATION_TIMES[1], () => { scene.trainer.setFrame("3"); - scene.time.delayedCall(768, () => { + scene.time.delayedCall(TRAINER_THROW_ANIMATION_TIMES[2], () => { scene.trainer.setTexture(`trainer_${scene.gameData.gender === PlayerGender.FEMALE ? "f" : "m"}_back`); }); }); diff --git a/src/data/mystery-encounters/encounters/slumbering-snorlax-encounter.ts b/src/data/mystery-encounters/encounters/slumbering-snorlax-encounter.ts index 0e60304d9dc..2efae68c9eb 100644 --- a/src/data/mystery-encounters/encounters/slumbering-snorlax-encounter.ts +++ b/src/data/mystery-encounters/encounters/slumbering-snorlax-encounter.ts @@ -16,16 +16,16 @@ import { getPokemonSpecies } from "#app/data/pokemon-species"; import { PartyHealPhase } from "#app/phases"; /** i18n namespace for the encounter */ -const namespace = "mysteryEncounter:sleeping_snorlax"; +const namespace = "mysteryEncounter:slumberingSnorlax"; /** * Sleeping Snorlax encounter. * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/103 | GitHub Issue #103} * @see For biome requirements check [mysteryEncountersByBiome](../mystery-encounters.ts) */ -export const SleepingSnorlaxEncounter: IMysteryEncounter = +export const SlumberingSnorlaxEncounter: IMysteryEncounter = MysteryEncounterBuilder.withEncounterType( - MysteryEncounterType.SLEEPING_SNORLAX + MysteryEncounterType.SLUMBERING_SNORLAX ) .withEncounterTier(MysteryEncounterTier.GREAT) .withSceneWaveRangeRequirement(10, 180) // waves 10 to 180 @@ -44,7 +44,7 @@ export const SleepingSnorlaxEncounter: IMysteryEncounter = ]) .withIntroDialogue([ { - text: `${namespace}_intro_message`, + text: `${namespace}:intro`, }, ]) .withOnInit((scene: BattleScene) => { @@ -70,16 +70,16 @@ export const SleepingSnorlaxEncounter: IMysteryEncounter = return true; }) - .withTitle(`${namespace}_title`) - .withDescription(`${namespace}_description`) - .withQuery(`${namespace}_query`) + .withTitle(`${namespace}:title`) + .withDescription(`${namespace}:description`) + .withQuery(`${namespace}:query`) .withSimpleOption( { - buttonLabel: `${namespace}_option_1_label`, - buttonTooltip: `${namespace}_option_1_tooltip`, + buttonLabel: `${namespace}:option:1:label`, + buttonTooltip: `${namespace}:option:1:tooltip`, selected: [ { - text: `${namespace}_option_1_selected_message`, + text: `${namespace}:option:1:selected`, }, ], }, @@ -105,11 +105,11 @@ export const SleepingSnorlaxEncounter: IMysteryEncounter = ) .withSimpleOption( { - buttonLabel: `${namespace}_option_2_label`, - buttonTooltip: `${namespace}_option_2_tooltip`, + buttonLabel: `${namespace}:option:2:label`, + buttonTooltip: `${namespace}:option:2:tooltip`, selected: [ { - text: `${namespace}_option_2_selected_message`, + text: `${namespace}:option:2:selected`, }, ], }, @@ -117,7 +117,7 @@ export const SleepingSnorlaxEncounter: IMysteryEncounter = // Fall asleep waiting for Snorlax // Full heal party scene.unshiftPhase(new PartyHealPhase(scene, true)); - queueEncounterMessage(scene, `${namespace}_option_2_good_result`); + queueEncounterMessage(scene, `${namespace}:option:2:rest_result`); leaveEncounterWithoutBattle(scene); } ) @@ -126,15 +126,19 @@ export const SleepingSnorlaxEncounter: IMysteryEncounter = .withOptionMode(EncounterOptionMode.DISABLED_OR_SPECIAL) .withPrimaryPokemonRequirement(new MoveRequirement(STEALING_MOVES)) .withDialogue({ - buttonLabel: `${namespace}_option_3_label`, - buttonTooltip: `${namespace}_option_3_tooltip`, - disabledButtonTooltip: `${namespace}_option_3_disabled_tooltip`, + buttonLabel: `${namespace}:option:3:label`, + buttonTooltip: `${namespace}:option:3:tooltip`, + disabledButtonTooltip: `${namespace}:option:3:disabled_tooltip`, + selected: [ + { + text: `${namespace}:option:3:selected` + } + ] }) .withOptionPhase(async (scene: BattleScene) => { // Steal the Snorlax's Leftovers const instance = scene.currentBattle.mysteryEncounter; setEncounterRewards(scene, { guaranteedModifierTypeFuncs: [modifierTypes.LEFTOVERS], fillRemaining: false }); - queueEncounterMessage(scene, `${namespace}_option_3_good_result`); // Snorlax exp to Pokemon that did the stealing setEncounterExp(scene, instance.primaryPokemon.id, getPokemonSpecies(Species.SNORLAX).baseExp); leaveEncounterWithoutBattle(scene); diff --git a/src/locales/en/mystery-encounters/slumbering-snorlax-dialogue.ts b/src/locales/en/mystery-encounters/slumbering-snorlax-dialogue.ts index bc2dc65e572..92244573c9b 100644 --- a/src/locales/en/mystery-encounters/slumbering-snorlax-dialogue.ts +++ b/src/locales/en/mystery-encounters/slumbering-snorlax-dialogue.ts @@ -1,31 +1,28 @@ -export const sleepingSnorlaxDialogue = { - intro: "Wandering aimlessly through the sea, you've effectively gotten nowhere.", - title: "Lost at Sea", - description: "The sea is turbulent in this area, and you're running out of energy.\nThis is bad. Is there a way out of the situation?", +export const slumberingSnorlaxDialogue = { + 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?", option: { 1: { - label: "{{option1PrimaryName}} can help", - 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. - \${{option1PrimaryName}} seems to also have gotten stronger in this time of need!`, + label: "Battle it", + tooltip: "(-) Fight Sleeping Snorlax\n(+) Special Reward", + selected: "You approach the\nPokémon without fear.", }, 2: { - label: "{{option2PrimaryName}} can 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. - \${{option2PrimaryName}} seems to also have gotten stronger in this time of need!`, + label: "Wait for it to move", + tooltip: "(-) Wait a Long Time\n(+) Recover Party", + 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: "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. - $You and your Pokémon are fatigued from the whole ordeal.`, + 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}}! + $@s{item_fanfare}It steals Leftovers off the sleeping\nSnorlax and you make out like bandits!`, }, - }, - outro: "You are back on track." + } }; From 70fc4b67ae12ce6d997cdd89f3187608ce7f411e Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Thu, 18 Jul 2024 22:37:58 -0400 Subject: [PATCH 181/270] finish fiery fallout encounter --- public/battle-anims/encounter-magma-bg.json | 8 +- .../battle-anims/encounter-magma-spout.json | 113 +++++++++++------- public/images/mystery-encounters/exclaim.json | 41 +++++++ public/images/mystery-encounters/exclaim.png | Bin 0 -> 378 bytes src/battle-scene.ts | 31 ++--- src/data/battle-anims.ts | 52 +++----- .../department-store-sale-encounter.ts | 2 +- .../encounters/field-trip-encounter.ts | 2 +- .../encounters/fiery-fallout-encounter.ts | 95 +++++++++++---- .../encounters/mysterious-chest-encounter.ts | 2 +- .../mystery-encounters/mystery-encounter.ts | 39 ++++-- .../utils/encounter-phase-utils.ts | 62 ++++++++-- .../utils/encounter-pokemon-utils.ts | 5 +- src/field/arena.ts | 2 +- src/field/mystery-encounter-intro.ts | 10 ++ .../fiery-fallout-dialogue.ts | 10 +- src/phases.ts | 26 +++- src/phases/mystery-encounter-phases.ts | 6 +- 18 files changed, 351 insertions(+), 155 deletions(-) create mode 100644 public/images/mystery-encounters/exclaim.json create mode 100644 public/images/mystery-encounters/exclaim.png diff --git a/public/battle-anims/encounter-magma-bg.json b/public/battle-anims/encounter-magma-bg.json index 1e144b9d4f6..bb22f721d9a 100644 --- a/public/battle-anims/encounter-magma-bg.json +++ b/public/battle-anims/encounter-magma-bg.json @@ -1,5 +1,4 @@ { - "graphic": "Encounter Magma Bg", "frames": [ [], [], @@ -27,9 +26,6 @@ [], [], [], - [], - [], - [], [] ], "frameTimedEvents": { @@ -49,7 +45,7 @@ "bgX": 0, "bgY": 0, "opacity": 255, - "duration": 4, + "duration": 12, "eventType": "AnimTimedUpdateBgEvent" } ], @@ -60,7 +56,7 @@ "bgX": 0, "bgY": 0, "opacity": 0, - "duration": 7, + "duration": 8, "eventType": "AnimTimedUpdateBgEvent" } ] diff --git a/public/battle-anims/encounter-magma-spout.json b/public/battle-anims/encounter-magma-spout.json index 9e0acea61fa..21f3bec585f 100644 --- a/public/battle-anims/encounter-magma-spout.json +++ b/public/battle-anims/encounter-magma-spout.json @@ -11,7 +11,7 @@ "target": 2, "graphicFrame": 0, "opacity": 255, - "priority": 1, + "priority": 4, "focus": 1 }, { @@ -23,7 +23,7 @@ "target": 2, "graphicFrame": 0, "opacity": 255, - "priority": 1, + "priority": 4, "focus": 1 }, { @@ -35,6 +35,7 @@ "target": 2, "graphicFrame": 0, "opacity": 255, + "priority": 4, "focus": 1 } ], @@ -48,7 +49,7 @@ "target": 2, "graphicFrame": 1, "opacity": 255, - "priority": 1, + "priority": 4, "focus": 1 }, { @@ -60,7 +61,7 @@ "target": 2, "graphicFrame": 1, "opacity": 255, - "priority": 1, + "priority": 4, "focus": 1 }, { @@ -72,6 +73,7 @@ "target": 2, "graphicFrame": 1, "opacity": 255, + "priority": 4, "focus": 1 } ], @@ -85,7 +87,7 @@ "target": 2, "graphicFrame": 2, "opacity": 255, - "priority": 1, + "priority": 4, "focus": 1 }, { @@ -97,7 +99,7 @@ "target": 2, "graphicFrame": 2, "opacity": 255, - "priority": 1, + "priority": 4, "focus": 1 }, { @@ -109,6 +111,7 @@ "target": 2, "graphicFrame": 2, "opacity": 255, + "priority": 4, "focus": 1 } ], @@ -122,7 +125,7 @@ "target": 2, "graphicFrame": 3, "opacity": 255, - "priority": 1, + "priority": 4, "focus": 1 }, { @@ -134,7 +137,7 @@ "target": 2, "graphicFrame": 3, "opacity": 255, - "priority": 1, + "priority": 4, "focus": 1 }, { @@ -146,6 +149,7 @@ "target": 2, "graphicFrame": 3, "opacity": 255, + "priority": 4, "focus": 1 } ], @@ -159,7 +163,7 @@ "target": 2, "graphicFrame": 4, "opacity": 255, - "priority": 1, + "priority": 4, "focus": 1 }, { @@ -171,7 +175,7 @@ "target": 2, "graphicFrame": 4, "opacity": 255, - "priority": 1, + "priority": 4, "focus": 1 }, { @@ -183,6 +187,7 @@ "target": 2, "graphicFrame": 4, "opacity": 255, + "priority": 4, "focus": 1 } ], @@ -196,7 +201,7 @@ "target": 2, "graphicFrame": 5, "opacity": 255, - "priority": 1, + "priority": 4, "focus": 1 }, { @@ -208,7 +213,7 @@ "target": 2, "graphicFrame": 5, "opacity": 255, - "priority": 1, + "priority": 4, "focus": 1 }, { @@ -220,6 +225,7 @@ "target": 2, "graphicFrame": 5, "opacity": 255, + "priority": 4, "focus": 1 } ], @@ -233,7 +239,7 @@ "target": 2, "graphicFrame": 6, "opacity": 255, - "priority": 1, + "priority": 4, "focus": 1 }, { @@ -245,7 +251,7 @@ "target": 2, "graphicFrame": 6, "opacity": 255, - "priority": 1, + "priority": 4, "focus": 1 }, { @@ -257,6 +263,7 @@ "target": 2, "graphicFrame": 6, "opacity": 255, + "priority": 4, "focus": 1 } ], @@ -270,7 +277,7 @@ "target": 2, "graphicFrame": 7, "opacity": 255, - "priority": 1, + "priority": 4, "focus": 1 }, { @@ -282,7 +289,7 @@ "target": 2, "graphicFrame": 7, "opacity": 255, - "priority": 1, + "priority": 4, "focus": 1 }, { @@ -294,6 +301,7 @@ "target": 2, "graphicFrame": 7, "opacity": 255, + "priority": 4, "focus": 1 } ], @@ -307,7 +315,7 @@ "target": 2, "graphicFrame": 8, "opacity": 255, - "priority": 1, + "priority": 4, "focus": 1 }, { @@ -319,6 +327,7 @@ "target": 2, "graphicFrame": 8, "opacity": 255, + "priority": 4, "focus": 1 }, { @@ -330,6 +339,7 @@ "target": 2, "graphicFrame": 8, "opacity": 255, + "priority": 4, "focus": 1 } ], @@ -343,7 +353,7 @@ "target": 2, "graphicFrame": 9, "opacity": 255, - "priority": 1, + "priority": 4, "focus": 1 }, { @@ -355,6 +365,7 @@ "target": 2, "graphicFrame": 9, "opacity": 255, + "priority": 4, "focus": 1 }, { @@ -366,7 +377,7 @@ "target": 2, "graphicFrame": 9, "opacity": 255, - "priority": 1, + "priority": 4, "focus": 1 } ], @@ -380,6 +391,7 @@ "target": 2, "graphicFrame": 10, "opacity": 255, + "priority": 4, "focus": 1 }, { @@ -391,6 +403,7 @@ "target": 2, "graphicFrame": 10, "opacity": 255, + "priority": 4, "focus": 1 }, { @@ -402,7 +415,7 @@ "target": 2, "graphicFrame": 10, "opacity": 255, - "priority": 1, + "priority": 4, "focus": 1 } ], @@ -416,6 +429,7 @@ "target": 2, "graphicFrame": 7, "opacity": 255, + "priority": 4, "focus": 1 }, { @@ -427,7 +441,7 @@ "target": 2, "graphicFrame": 7, "opacity": 255, - "priority": 1, + "priority": 4, "focus": 1 }, { @@ -439,7 +453,7 @@ "target": 2, "graphicFrame": 7, "opacity": 255, - "priority": 1, + "priority": 4, "focus": 1 } ], @@ -453,7 +467,7 @@ "target": 2, "graphicFrame": 8, "opacity": 255, - "priority": 1, + "priority": 4, "focus": 1 }, { @@ -465,7 +479,7 @@ "target": 2, "graphicFrame": 8, "opacity": 255, - "priority": 1, + "priority": 4, "focus": 1 }, { @@ -477,6 +491,7 @@ "target": 2, "graphicFrame": 8, "opacity": 255, + "priority": 4, "focus": 1 } ], @@ -490,7 +505,7 @@ "target": 2, "graphicFrame": 9, "opacity": 255, - "priority": 1, + "priority": 4, "focus": 1 }, { @@ -502,6 +517,7 @@ "target": 2, "graphicFrame": 9, "opacity": 255, + "priority": 4, "focus": 1 }, { @@ -513,6 +529,7 @@ "target": 2, "graphicFrame": 9, "opacity": 255, + "priority": 4, "focus": 1 } ], @@ -526,7 +543,7 @@ "target": 2, "graphicFrame": 10, "opacity": 255, - "priority": 1, + "priority": 4, "focus": 1 }, { @@ -538,6 +555,7 @@ "target": 2, "graphicFrame": 10, "opacity": 255, + "priority": 4, "focus": 1 }, { @@ -549,7 +567,8 @@ "target": 2, "graphicFrame": 10, "opacity": 255, - "priority": 1, + "priority": 4, + "priority": 4, "focus": 1 } ], @@ -563,7 +582,7 @@ "target": 2, "graphicFrame": 6, "opacity": 255, - "priority": 1, + "priority": 4, "focus": 1 }, { @@ -575,7 +594,7 @@ "target": 2, "graphicFrame": 6, "opacity": 255, - "priority": 1, + "priority": 4, "focus": 1 }, { @@ -587,6 +606,7 @@ "target": 2, "graphicFrame": 6, "opacity": 255, + "priority": 4, "focus": 1 } ], @@ -600,7 +620,7 @@ "target": 2, "graphicFrame": 5, "opacity": 255, - "priority": 1, + "priority": 4, "focus": 1 }, { @@ -612,7 +632,7 @@ "target": 2, "graphicFrame": 5, "opacity": 255, - "priority": 1, + "priority": 4, "focus": 1 }, { @@ -624,6 +644,7 @@ "target": 2, "graphicFrame": 5, "opacity": 255, + "priority": 4, "focus": 1 } ], @@ -637,7 +658,7 @@ "target": 2, "graphicFrame": 4, "opacity": 255, - "priority": 1, + "priority": 4, "focus": 1 }, { @@ -649,7 +670,7 @@ "target": 2, "graphicFrame": 4, "opacity": 255, - "priority": 1, + "priority": 4, "focus": 1 }, { @@ -661,6 +682,7 @@ "target": 2, "graphicFrame": 4, "opacity": 255, + "priority": 4, "focus": 1 } ], @@ -674,7 +696,7 @@ "target": 2, "graphicFrame": 3, "opacity": 255, - "priority": 1, + "priority": 4, "focus": 1 }, { @@ -686,7 +708,7 @@ "target": 2, "graphicFrame": 3, "opacity": 255, - "priority": 1, + "priority": 4, "focus": 1 }, { @@ -698,6 +720,7 @@ "target": 2, "graphicFrame": 3, "opacity": 255, + "priority": 4, "focus": 1 } ], @@ -711,7 +734,7 @@ "target": 2, "graphicFrame": 2, "opacity": 255, - "priority": 1, + "priority": 4, "focus": 1 }, { @@ -723,7 +746,7 @@ "target": 2, "graphicFrame": 2, "opacity": 255, - "priority": 1, + "priority": 4, "focus": 1 }, { @@ -735,6 +758,7 @@ "target": 2, "graphicFrame": 2, "opacity": 255, + "priority": 4, "focus": 1 } ], @@ -748,7 +772,7 @@ "target": 2, "graphicFrame": 1, "opacity": 255, - "priority": 1, + "priority": 4, "focus": 1 }, { @@ -760,7 +784,7 @@ "target": 2, "graphicFrame": 1, "opacity": 255, - "priority": 1, + "priority": 4, "focus": 1 }, { @@ -772,6 +796,7 @@ "target": 2, "graphicFrame": 1, "opacity": 255, + "priority": 4, "focus": 1 } ], @@ -785,7 +810,7 @@ "target": 2, "graphicFrame": 0, "opacity": 255, - "priority": 1, + "priority": 4, "focus": 1 }, { @@ -797,7 +822,7 @@ "target": 2, "graphicFrame": 0, "opacity": 255, - "priority": 1, + "priority": 4, "focus": 1 }, { @@ -809,6 +834,7 @@ "target": 2, "graphicFrame": 0, "opacity": 255, + "priority": 4, "focus": 1 } ], @@ -822,7 +848,7 @@ "target": 2, "graphicFrame": 0, "opacity": 130, - "priority": 1, + "priority": 4, "focus": 1 }, { @@ -834,7 +860,7 @@ "target": 2, "graphicFrame": 0, "opacity": 130, - "priority": 1, + "priority": 4, "focus": 1 }, { @@ -846,6 +872,7 @@ "target": 2, "graphicFrame": 0, "opacity": 140, + "priority": 4, "focus": 1 } ] diff --git a/public/images/mystery-encounters/exclaim.json b/public/images/mystery-encounters/exclaim.json new file mode 100644 index 00000000000..31231910097 --- /dev/null +++ b/public/images/mystery-encounters/exclaim.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "exclaim.png", + "format": "RGBA8888", + "size": { + "w": 32, + "h": 32 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 32, + "h": 32 + }, + "frame": { + "x": 0, + "y": 0, + "w": 32, + "h": 32 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:895f0a79b89fa0fb44167f4584fd9a22:357b46953b7e17c6b2f43a62d52855d8:cc1ed0e4f90aaa9dcf1b39a0af1283b0$" + } +} diff --git a/public/images/mystery-encounters/exclaim.png b/public/images/mystery-encounters/exclaim.png new file mode 100644 index 0000000000000000000000000000000000000000..a7727f4da2e1dc8c14f2b3edfb42fdd0220e7b78 GIT binary patch literal 378 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^TvcF`%+TnbgQKj8-7F(Bd!U0(a&+d*#CJdWpQUrE#PF$q1;0j~Boqh6*8=E^D zAGv8-?rV>%`+hIBgIOa}a`G&Ji9jQkW*=v{`>FQ!H{(SX3}QkpHLYvEvl!2r5Erna znc+lHk3d6a*{7l-x9vm1g3=tySazM~uw+WJ^kWw=VtC>(LwSO(yV;Bhk_MGM8VX^` zX9N|#E=W*4UbM-X!FJV&tuiTm3@6nTZfG07_XGwRUuuMBny)W|7Ld&W#2|1fcru9c MboFyt=akR{04;@z`Tzg` literal 0 HcmV?d00001 diff --git a/src/battle-scene.ts b/src/battle-scene.ts index 6cde5929308..954b24fd10b 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -1,43 +1,42 @@ import Phaser from "phaser"; import UI from "./ui/ui"; -import { NextEncounterPhase, NewBiomeEncounterPhase, SelectBiomePhase, MessagePhase, TurnInitPhase, ReturnPhase, LevelCapPhase, ShowTrainerPhase, LoginPhase, MovePhase, TitlePhase, SwitchPhase } from "./phases"; -import Pokemon, { PlayerPokemon, EnemyPokemon } from "./field/pokemon"; -import PokemonSpecies, { PokemonSpeciesFilter, allSpecies, getPokemonSpecies } from "./data/pokemon-species"; -import {Constructor, isNullOrUndefined} from "#app/utils"; +import { LevelCapPhase, LoginPhase, MessagePhase, MovePhase, NewBiomeEncounterPhase, NextEncounterPhase, ReturnPhase, SelectBiomePhase, ShowTrainerPhase, SwitchPhase, TitlePhase, TurnInitPhase } from "./phases"; +import Pokemon, { EnemyPokemon, PlayerPokemon } from "./field/pokemon"; +import PokemonSpecies, { allSpecies, getPokemonSpecies, PokemonSpeciesFilter } from "./data/pokemon-species"; +import { Constructor, isNullOrUndefined } from "#app/utils"; import * as Utils from "./utils"; -import { Modifier, ModifierBar, ConsumablePokemonModifier, ConsumableModifier, PokemonHpRestoreModifier, HealingBoosterModifier, PersistentModifier, PokemonHeldItemModifier, ModifierPredicate, DoubleBattleChanceBoosterModifier, FusePokemonModifier, PokemonFormChangeItemModifier, TerastallizeModifier, overrideModifiers, overrideHeldItems } from "./modifier/modifier"; +import { ConsumableModifier, ConsumablePokemonModifier, DoubleBattleChanceBoosterModifier, FusePokemonModifier, HealingBoosterModifier, Modifier, ModifierBar, ModifierPredicate, overrideHeldItems, overrideModifiers, PersistentModifier, PokemonFormChangeItemModifier, PokemonHeldItemModifier, PokemonHpRestoreModifier, TerastallizeModifier } from "./modifier/modifier"; import { PokeballType } from "./data/pokeball"; import { initCommonAnims, initMoveAnim, loadCommonAnimAssets, loadMoveAnimAssets, populateAnims } from "./data/battle-anims"; import { Phase } from "./phase"; import { initGameSpeed } from "./system/game-speed"; import { Arena, ArenaBase } from "./field/arena"; import { GameData } from "./system/game-data"; -import { TextStyle, addTextObject, getTextColor } from "./ui/text"; +import { addTextObject, getTextColor, TextStyle } from "./ui/text"; import { allMoves } from "./data/move"; -import { ModifierPoolType, getDefaultModifierTypeForTier, getEnemyModifierTypesForWave, getLuckString, getLuckTextTint, getModifierPoolForType, getPartyLuckValue, PokemonHeldItemModifierType } from "./modifier/modifier-type"; +import { getDefaultModifierTypeForTier, getEnemyModifierTypesForWave, getLuckString, getLuckTextTint, getModifierPoolForType, getPartyLuckValue, ModifierPoolType, PokemonHeldItemModifierType } from "./modifier/modifier-type"; import AbilityBar from "./ui/ability-bar"; -import { BlockItemTheftAbAttr, DoubleBattleChanceAbAttr, IncrementMovePriorityAbAttr, PostBattleInitAbAttr, applyAbAttrs, applyPostBattleInitAbAttrs } from "./data/ability"; -import { allAbilities } from "./data/ability"; +import { allAbilities, applyAbAttrs, applyPostBattleInitAbAttrs, BlockItemTheftAbAttr, DoubleBattleChanceAbAttr, IncrementMovePriorityAbAttr, PostBattleInitAbAttr } from "./data/ability"; import Battle, { BattleType, FixedBattleConfig } from "./battle"; import { GameMode, GameModes, getGameMode } from "./game-mode"; import FieldSpritePipeline from "./pipelines/field-sprite"; import SpritePipeline from "./pipelines/sprite"; import PartyExpBar from "./ui/party-exp-bar"; -import { TrainerSlot, trainerConfigs } from "./data/trainer-config"; +import { trainerConfigs, TrainerSlot } from "./data/trainer-config"; import Trainer, { TrainerVariant } from "./field/trainer"; import TrainerData from "./system/trainer-data"; import SoundFade from "phaser3-rex-plugins/plugins/soundfade"; import { pokemonPrevolutions } from "./data/pokemon-evolutions"; import PokeballTray from "./ui/pokeball-tray"; import InvertPostFX from "./pipelines/invert"; -import { Achv, ModifierAchv, MoneyAchv, achvs } from "./system/achv"; +import { Achv, achvs, ModifierAchv, MoneyAchv } from "./system/achv"; import { Voucher, vouchers } from "./system/voucher"; import { Gender } from "./data/gender"; import UIPlugin from "phaser3-rex-plugins/templates/ui/ui-plugin"; import { addUiThemeOverrides } from "./ui/ui-theme"; import PokemonData from "./system/pokemon-data"; import { Nature } from "./data/nature"; -import { SpeciesFormChangeManualTrigger, SpeciesFormChangeTimeOfDayTrigger, SpeciesFormChangeTrigger, pokemonFormChanges } from "./data/pokemon-forms"; +import { pokemonFormChanges, SpeciesFormChangeManualTrigger, SpeciesFormChangeTimeOfDayTrigger, SpeciesFormChangeTrigger } from "./data/pokemon-forms"; import { FormChangePhase, QuietFormChangePhase } from "./form-change-phase"; import { getTypeRgb } from "./data/type"; import PokemonSpriteSparkleHandler from "./field/pokemon-sprite-sparkle-handler"; @@ -50,8 +49,8 @@ import CandyBar from "./ui/candy-bar"; import { Variant, variantData } from "./data/variant"; import { Localizable } from "#app/interfaces/locales"; import * as Overrides from "./overrides"; -import {InputsController} from "./inputs-controller"; -import {UiInputs} from "./ui-inputs"; +import { InputsController } from "./inputs-controller"; +import { UiInputs } from "./ui-inputs"; import { NewArenaEvent } from "./events/battle-scene"; import ArenaFlyout from "./ui/arena-flyout"; import { EaseType } from "#enums/ease-type"; @@ -68,7 +67,7 @@ import { UiTheme } from "#enums/ui-theme"; import { TimedEventManager } from "#app/timed-event-manager.js"; import i18next from "i18next"; import IMysteryEncounter, { MysteryEncounterTier, MysteryEncounterVariant } from "./data/mystery-encounters/mystery-encounter"; -import { mysteryEncountersByBiome, allMysteryEncounters, BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT, AVERAGE_ENCOUNTERS_PER_RUN_TARGET, WIGHT_INCREMENT_ON_SPAWN_MISS } from "./data/mystery-encounters/mystery-encounters"; +import { allMysteryEncounters, AVERAGE_ENCOUNTERS_PER_RUN_TARGET, BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT, mysteryEncountersByBiome, WIGHT_INCREMENT_ON_SPAWN_MISS } from "./data/mystery-encounters/mystery-encounters"; import { MysteryEncounterData } from "#app/data/mystery-encounters/mystery-encounter-data"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; @@ -1039,6 +1038,8 @@ export default class BattleScene extends SceneBase { const playerField = this.getPlayerField(); + this.newArena(Biome.VOLCANO); + if (this.gameMode.isFixedBattle(newWaveIndex) && trainerData === undefined) { battleConfig = this.gameMode.getFixedBattle(newWaveIndex); newDouble = battleConfig.double; diff --git a/src/data/battle-anims.ts b/src/data/battle-anims.ts index 234e827b648..81536d74771 100644 --- a/src/data/battle-anims.ts +++ b/src/data/battle-anims.ts @@ -718,14 +718,16 @@ export abstract class BattleAnim { public target: Pokemon; public sprites: Phaser.GameObjects.Sprite[]; public bgSprite: Phaser.GameObjects.TileSprite | Phaser.GameObjects.Rectangle; + public playOnEmptyField: boolean; private srcLine: number[]; private dstLine: number[]; - constructor(user: Pokemon, target: Pokemon) { + constructor(user: Pokemon, target: Pokemon, playOnEmptyField: boolean = false) { this.user = user; this.target = target; this.sprites = []; + this.playOnEmptyField = playOnEmptyField; } abstract getAnim(): AnimConfig; @@ -799,7 +801,7 @@ export abstract class BattleAnim { const user = !isOppAnim ? this.user : this.target; const target = !isOppAnim ? this.target : this.user; - if (!target.isOnField()) { + if (!target.isOnField() && !this.playOnEmptyField) { if (callback) { callback(); } @@ -1097,10 +1099,7 @@ export abstract class BattleAnim { let r = anim.frames.length; let f = 0; - const fieldSprites = scene.field.getAll(); - const playerFieldSprite = fieldSprites[1]; - const enemyFieldSprite = fieldSprites[3]; - const trainerSprite = fieldSprites[5]; + const existingFieldSprites = [...scene.field.getAll()]; scene.tweens.addCounter({ duration: Utils.getFrameMs(3) * frameTimeMult, @@ -1127,41 +1126,24 @@ export abstract class BattleAnim { const graphicIndex = g++; const moveSprite = sprites[graphicIndex]; - if (spritePriorities[graphicIndex] !== frame.priority) { - spritePriorities[graphicIndex] = frame.priority; + spritePriorities[graphicIndex] = frame.priority; + if (!isNullOrUndefined(frame.priority)) { const setSpritePriority = (priority: integer) => { - if (priority < 0) { - // Move to top of scene - scene.field.moveTo(moveSprite, scene.field.getAll().length - 1); - } else if (priority === 1) { - // Move above player field - if (playerFieldSprite) { - scene.field.moveAbove(moveSprite as Phaser.GameObjects.GameObject, playerFieldSprite); + try { + if (existingFieldSprites.length > priority) { + // Move to specified priority index + scene.field.moveTo(moveSprite, scene.field.getIndex(existingFieldSprites[priority])); } else { - setSpritePriority(-1); + // Move to top of scene + scene.field.moveTo(moveSprite, scene.field.getAll().length - 1); } - } else if (priority === 3) { - // Move above player enemy field - if (enemyFieldSprite) { - scene.field.moveAbove(moveSprite as Phaser.GameObjects.GameObject, enemyFieldSprite); - } else { - setSpritePriority(-1); - } - } else if (priority === 5) { - // Move above player trainer sprite - if (trainerSprite) { - scene.field.moveAbove(moveSprite as Phaser.GameObjects.GameObject, trainerSprite); - } else { - setSpritePriority(-1); - } - } else { - setSpritePriority(-1); + } catch (ignored) { + console.log("index is no longer valid"); } }; setSpritePriority(frame.priority); } moveSprite.setFrame(frame.graphicFrame); - //console.log(AnimFocus[frame.focus]); const graphicFrameData = frameData.get(frame.target).get(graphicIndex); moveSprite.setPosition(graphicFrameData.x, graphicFrameData.y); @@ -1219,8 +1201,8 @@ export abstract class BattleAnim { export class CommonBattleAnim extends BattleAnim { public commonAnim: CommonAnim; - constructor(commonAnim: CommonAnim, user: Pokemon, target?: Pokemon) { - super(user, target || user); + constructor(commonAnim: CommonAnim, user: Pokemon, target?: Pokemon, playOnEmptyField: boolean = false) { + super(user, target || user, playOnEmptyField); this.commonAnim = commonAnim; } 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 ae025a909b1..2e8a5ff67bd 100644 --- a/src/data/mystery-encounters/encounters/department-store-sale-encounter.ts +++ b/src/data/mystery-encounters/encounters/department-store-sale-encounter.ts @@ -48,7 +48,7 @@ export const DepartmentStoreSaleEncounter: IMysteryEncounter = speaker: `${namespace}:speaker`, }, ]) - .withHideIntroVisuals(false) + .withAutoHideIntroVisuals(false) .withTitle(`${namespace}:title`) .withDescription(`${namespace}:description`) .withQuery(`${namespace}:query`) diff --git a/src/data/mystery-encounters/encounters/field-trip-encounter.ts b/src/data/mystery-encounters/encounters/field-trip-encounter.ts index da0016db360..45ac52eb161 100644 --- a/src/data/mystery-encounters/encounters/field-trip-encounter.ts +++ b/src/data/mystery-encounters/encounters/field-trip-encounter.ts @@ -56,7 +56,7 @@ export const FieldTripEncounter: IMysteryEncounter = speaker: `${namespace}:speaker`, }, ]) - .withHideIntroVisuals(false) + .withAutoHideIntroVisuals(false) .withTitle(`${namespace}:title`) .withDescription(`${namespace}:description`) .withQuery(`${namespace}:query`) diff --git a/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts b/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts index f4c9db5e4f8..2a7c26995d3 100644 --- a/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts +++ b/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts @@ -1,5 +1,5 @@ import { EncounterOptionMode, MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; -import { EnemyPartyConfig, generateModifierTypeOption, initBattleWithEnemyConfig, initCustomMovesForEncounter, leaveEncounterWithoutBattle, setEncounterExp, setEncounterRewards } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { applyDamageToPokemon, EnemyPartyConfig, generateModifierTypeOption, initBattleWithEnemyConfig, initCustomMovesForEncounter, leaveEncounterWithoutBattle, setEncounterExp, setEncounterRewards, transitionMysteryEncounterIntroVisuals } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { modifierTypes, } from "#app/modifier/modifier-type"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import BattleScene from "../../../battle-scene"; @@ -14,25 +14,33 @@ import { PokemonMove } from "#app/field/pokemon"; import { Moves } from "#enums/moves"; import { EncounterAnim, EncounterBattleAnim } from "#app/data/battle-anims"; import { WeatherType } from "#app/data/weather"; -import { randSeedInt } from "#app/utils"; +import { isNullOrUndefined, randSeedInt } from "#app/utils"; +import { StatusEffect } from "#app/data/status-effect"; +import { queueEncounterMessage } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; /** the i18n namespace for the encounter */ const namespace = "mysteryEncounter:fieryFallout"; +/** + * Damage percentage taken when suffering the heat. + * Can be a number between `0` - `100`. + * The higher the more damage taken (100% = instant KO). + */ +const DAMAGE_PERCENTAGE: number = 20; + /** * Fiery Fallout encounter. * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/88 | GitHub Issue #88} * @see For biome requirements check [mysteryEncountersByBiome](../mystery-encounters.ts) */ export const FieryFalloutEncounter: IMysteryEncounter = - MysteryEncounterBuilder.withEncounterType( - MysteryEncounterType.FIERY_FALLOUT - ) + MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.FIERY_FALLOUT) .withEncounterTier(MysteryEncounterTier.COMMON) .withSceneWaveRangeRequirement(40, 180) // waves 10 to 180 .withCatchAllowed(true) .withIntroSpriteConfigs([]) // Set in onInit() .withAnimations(EncounterAnim.MAGMA_BG, EncounterAnim.MAGMA_SPOUT) + .withAutoHideIntroVisuals(false) .withIntroDialogue([ { text: `${namespace}:intro`, @@ -44,7 +52,6 @@ export const FieryFalloutEncounter: IMysteryEncounter = // Calculate boss mons const volcaronaSpecies = getPokemonSpecies(Species.VOLCARONA); const config: EnemyPartyConfig = { - levelAdditiveMultiplier: 0.25, pokemonConfigs: [ { species: volcaronaSpecies, @@ -62,12 +69,31 @@ export const FieryFalloutEncounter: IMysteryEncounter = }; encounter.enemyPartyConfigs = [config]; - // Sets weather for 5 turns - scene.arena.trySetWeather(WeatherType.SUNNY, true); + // Load hidden Volcarona sprites + encounter.spriteConfigs = [ + { + spriteKey: volcaronaSpecies.getSpriteId(false), + fileRoot: "pokemon", + repeat: true, + hidden: true, + hasShadow: true, + x: -20 + }, + { + spriteKey: volcaronaSpecies.getSpriteId(true ), + fileRoot: "pokemon", + repeat: true, + hidden: true, + hasShadow: true, + x: 20 + }, + ]; // Load animations/sfx for Volcarona moves initCustomMovesForEncounter(scene, [Moves.FIRE_SPIN, Moves.QUIVER_DANCE]); + scene.arena.trySetWeather(WeatherType.SUNNY, true); + return true; }) .withOnVisualsStart((scene: BattleScene) => { @@ -75,13 +101,13 @@ export const FieryFalloutEncounter: IMysteryEncounter = const background = new EncounterBattleAnim(EncounterAnim.MAGMA_BG, scene.getPlayerPokemon(), scene.getPlayerPokemon()); background.playWithoutTargets(scene, 200, 70, 2, 3); const animation = new EncounterBattleAnim(EncounterAnim.MAGMA_SPOUT, scene.getPlayerPokemon(), scene.getPlayerPokemon()); - animation.playWithoutTargets(scene, 100, 100, 2); - const increment = 600; - for (let i = 3; i < 6; i++) { - scene.time.delayedCall((increment) * (i - 2), () => { - animation.playWithoutTargets(scene, randSeedInt(12) * 15, 150 - randSeedInt(10) * 15, 2); - }); - } + animation.playWithoutTargets(scene, 80, 100, 2); + scene.time.delayedCall(600, () => { + animation.playWithoutTargets(scene, -20, 100, 2); + }); + scene.time.delayedCall(1200, () => { + animation.playWithoutTargets(scene, 140, 150, 2); + }); return true; }) @@ -142,15 +168,36 @@ export const FieryFalloutEncounter: IMysteryEncounter = ], }, async (scene: BattleScene) => { - // Damage party and burn 1 random member + // Damage non-fire types and burn 1 random non-fire type member + const encounter = scene.currentBattle.mysteryEncounter; + const nonFireTypes = scene.getParty().filter((p) => !p.getTypes().includes(Type.FIRE)); + + for (const pkm of nonFireTypes) { + const percentage = DAMAGE_PERCENTAGE / 100; + const damage = Math.floor(pkm.getMaxHp() * percentage); + applyDamageToPokemon(scene, pkm, damage); + } + + // Burn random member + const burnable = nonFireTypes.filter(p => isNullOrUndefined(p.status) || isNullOrUndefined(p.status.effect) || p.status?.effect === StatusEffect.BURN); + if (burnable?.length > 0) { + const chosenPokemon = burnable[randSeedInt(burnable.length - 1)]; + if (chosenPokemon.trySetStatus(StatusEffect.BURN)) { + // Burn applied + encounter.setDialogueToken("burnedPokemon", chosenPokemon.name); + queueEncounterMessage(scene, `${namespace}:option:2:target_burned`); + } + } + // No rewards - leaveEncounterWithoutBattle(scene); + leaveEncounterWithoutBattle(scene, true); } ) .withOption( new MysteryEncounterOptionBuilder() .withOptionMode(EncounterOptionMode.DISABLED_OR_SPECIAL) - .withPrimaryPokemonRequirement(new TypeRequirement(Type.FIRE, true,2)) // Will set option2PrimaryName and option2PrimaryMove dialogue tokens automatically + .withPrimaryPokemonRequirement(new TypeRequirement(Type.FIRE, true,1)) // Will set option3PrimaryName dialogue token automatically + .withSecondaryPokemonRequirement(new TypeRequirement(Type.FIRE, true,1)) // Will set option3SecondaryName dialogue token automatically .withDialogue({ buttonLabel: `${namespace}:option:3:label`, buttonTooltip: `${namespace}:option:3:tooltip`, @@ -161,12 +208,20 @@ export const FieryFalloutEncounter: IMysteryEncounter = }, ], }) + .withPreOptionPhase(async (scene: BattleScene) => { + transitionMysteryEncounterIntroVisuals(scene, false, false, 2000); + }) .withOptionPhase(async (scene: BattleScene) => { // Fire types help calm the Volcarona - // const encounter = scene.currentBattle.mysteryEncounter; + const encounter = scene.currentBattle.mysteryEncounter; + transitionMysteryEncounterIntroVisuals(scene); const charcoal = generateModifierTypeOption(scene, modifierTypes.ATTACK_TYPE_BOOSTER, [Type.FIRE]); setEncounterRewards(scene, { guaranteedModifierTypeOptions: [charcoal], fillRemaining: true }); - setEncounterExp(scene, scene.getParty().map(p => p.id), 500); + + const primary = encounter.options[2].primaryPokemon; + const secondary = encounter.options[2].secondaryPokemon[0]; + + setEncounterExp(scene, [primary.id, secondary.id], getPokemonSpecies(Species.VOLCARONA).baseExp * 2); leaveEncounterWithoutBattle(scene); }) .build() diff --git a/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts b/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts index 67ca533e893..a93df6cb264 100644 --- a/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts +++ b/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts @@ -20,7 +20,7 @@ export const MysteriousChestEncounter: IMysteryEncounter = MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.MYSTERIOUS_CHEST) .withEncounterTier(MysteryEncounterTier.COMMON) .withSceneWaveRangeRequirement(10, 180) // waves 2 to 180 - .withHideIntroVisuals(false) + .withAutoHideIntroVisuals(false) .withIntroSpriteConfigs([ { spriteKey: "chest_blue", diff --git a/src/data/mystery-encounters/mystery-encounter.ts b/src/data/mystery-encounters/mystery-encounter.ts index 5b65cb12260..289800d0b52 100644 --- a/src/data/mystery-encounters/mystery-encounter.ts +++ b/src/data/mystery-encounters/mystery-encounter.ts @@ -60,13 +60,23 @@ export default interface IMysteryEncounter { encounterTier?: MysteryEncounterTier; encounterAnimations?: EncounterAnim[]; hideBattleIntroMessage?: boolean; - hideIntroVisuals?: boolean; + autoHideIntroVisuals?: boolean; catchAllowed?: boolean; maxAllowedEncounters?: number; - doEncounterExp?: (scene: BattleScene) => boolean; - doEncounterRewards?: (scene: BattleScene) => boolean; + + /** + * Event callback functions + */ + /** Event when Encounter is first loaded, use it for data conditioning */ onInit?: (scene: BattleScene) => boolean; + /** Event when battlefield visuals have finished sliding in and the encounter dialogue begins */ onVisualsStart?: (scene: BattleScene) => boolean; + /** Event right before MysteryEncounterPhase begins. Use for unshifting any phases before the actual encounter */ + onPreMysteryEncounterPhase?: (scene: BattleScene) => boolean; + /** 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 */ + doEncounterRewards?: (scene: BattleScene) => boolean; /** * Requirements @@ -171,7 +181,7 @@ export default class IMysteryEncounter implements IMysteryEncounter { this.encounterVariant = MysteryEncounterVariant.DEFAULT; this.requirements = this.requirements ? this.requirements : []; this.hideBattleIntroMessage = !isNullOrUndefined(this.hideBattleIntroMessage) ? this.hideBattleIntroMessage : false; - this.hideIntroVisuals = !isNullOrUndefined(this.hideIntroVisuals) ? this.hideIntroVisuals : true; + this.autoHideIntroVisuals = !isNullOrUndefined(this.autoHideIntroVisuals) ? this.autoHideIntroVisuals : true; this.startOfBattleEffects = this.startOfBattleEffects ?? []; // Reset any dirty flags or encounter data @@ -377,10 +387,13 @@ export class MysteryEncounterBuilder implements Partial { secondaryPokemonRequirements ?: EncounterPokemonRequirement[] = []; excludePrimaryFromSupportRequirements?: boolean; dialogueTokens?: Record; + doEncounterExp?: (scene: BattleScene) => boolean; doEncounterRewards?: (scene: BattleScene) => boolean; onInit?: (scene: BattleScene) => boolean; onVisualsStart?: (scene: BattleScene) => boolean; + onPreMysteryEncounterPhase?: (scene: BattleScene) => boolean; + hideBattleIntroMessage?: boolean; hideIntroVisuals?: boolean; enemyPartyConfigs?: EnemyPartyConfig[] = []; @@ -612,6 +625,18 @@ export class MysteryEncounterBuilder implements Partial { return Object.assign(this, { onInit: onInit }); } + /** + * Event callback right before MysteryEncounterPhase begins. + * Use for unshifting any last-minute phases before the actual encounter, as all phases are cleared and reset at that point. + * Example: set the weather before encounter begins + * + * @param onVisualsStart - synchronous callback function to perform immediately before MysteryEncounterPhase begins + * @returns + */ + withOnPreMysteryEncounterPhase(onPreMysteryEncounterPhase: (scene: BattleScene) => boolean): this & Required> { + return Object.assign(this, { onPreMysteryEncounterPhase: onPreMysteryEncounterPhase }); + } + /** * Can be used to perform some extra logic (usually animations) when the enemy field is finished sliding in * @@ -651,11 +676,11 @@ export class MysteryEncounterBuilder implements Partial { } /** - * @param hideIntroVisuals - if false, will not hide the intro visuals that are displayed at the beginning of encounter + * @param autoHideIntroVisuals - if false, will not hide the intro visuals that are displayed at the beginning of encounter * @returns */ - withHideIntroVisuals(hideIntroVisuals: boolean): this & Required> { - return Object.assign(this, { hideIntroVisuals: hideIntroVisuals }); + withAutoHideIntroVisuals(autoHideIntroVisuals: boolean): this & Required> { + return Object.assign(this, { autoHideIntroVisuals: autoHideIntroVisuals }); } /** diff --git a/src/data/mystery-encounters/utils/encounter-phase-utils.ts b/src/data/mystery-encounters/utils/encounter-phase-utils.ts index 44b9f7c8c7e..ef542971057 100644 --- a/src/data/mystery-encounters/utils/encounter-phase-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-phase-utils.ts @@ -30,6 +30,29 @@ import { Gender } from "#app/data/gender"; import { Moves } from "#enums/moves"; import { initMoveAnim, loadMoveAnimAssets } from "#app/data/battle-anims"; +export function doTrainerExclamation(scene: BattleScene) { + const exclamationSprite = scene.addFieldSprite(0, 0, "exclaim"); + exclamationSprite.setName("exclamation"); + scene.field.add(exclamationSprite); + scene.field.moveTo(exclamationSprite, scene.field.list.length - 1); + exclamationSprite.setVisible(true); + exclamationSprite.setPosition(110, 68); + scene.tweens.add({ + targets: exclamationSprite, + y: "-=25", + ease: "Cubic.easeOut", + duration: 300, + yoyo: true, + onComplete: () => { + scene.time.delayedCall(800, () => { + scene.field.remove(exclamationSprite, true); + }); + } + }); + + scene.playSound("GEN8- Exclaim.wav"); +} + export interface EnemyPokemonConfig { species: PokemonSpecies; isBoss: boolean; @@ -452,7 +475,7 @@ export function setEncounterExp(scene: BattleScene, participantId: integer | int const nonFaintedPartyMembers = party.filter(p => p.hp); const expPartyMembers = nonFaintedPartyMembers.filter(p => p.level < scene.getMaxExpLevel()); const partyMemberExp = []; - let expValue = baseExpValue * (useWaveIndex ? scene.currentBattle.waveIndex : 1); + let expValue = baseExpValue * (useWaveIndex ? scene.currentBattle.waveIndex : 1) / 5 + 1; if (participantIds?.length > 0) { if (scene.currentBattle.mysteryEncounter.encounterVariant === MysteryEncounterVariant.TRAINER_BATTLE) { @@ -590,23 +613,40 @@ export function handleMysteryEncounterVictory(scene: BattleScene, addHealPhase: } } -export function hideMysteryEncounterIntroVisuals(scene: BattleScene): Promise { +/** + * + * @param scene + * @param hide - If true, performs ease out and hide visuals. If false, eases in visuals. Defaults to true + * @param destroy - If true, will destroy visuals ONLY ON HIDE TRANSITION. Does nothing on show. Defaults to true + * @param duration + */ +export function transitionMysteryEncounterIntroVisuals(scene: BattleScene, hide: boolean = true, destroy: boolean = true, duration: number = 750): Promise { return new Promise(resolve => { const introVisuals = scene.currentBattle.mysteryEncounter.introVisuals; if (introVisuals) { - // Hide + if (!hide) { + // Make sure visuals are in proper state for showing + introVisuals.setVisible(true); + introVisuals.x += 16; + introVisuals.y -= 16; + introVisuals.alpha = 0; + } + + // Transition scene.tweens.add({ targets: introVisuals, - x: "+=16", - y: "-=16", - alpha: 0, + x: hide ? "+=16" : "-=16", + y: hide ? "-=16" : "+=16", + alpha: hide ? 0 : 1, ease: "Sine.easeInOut", - duration: 750, + duration: duration, onComplete: () => { - scene.field.remove(introVisuals); - introVisuals.setVisible(false); - introVisuals.destroy(); - scene.currentBattle.mysteryEncounter.introVisuals = null; + if (hide && destroy) { + scene.field.remove(introVisuals); + introVisuals.setVisible(false); + introVisuals.destroy(); + scene.currentBattle.mysteryEncounter.introVisuals = null; + } resolve(true); } }); diff --git a/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts b/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts index 15bf282d4df..b505c4f971d 100644 --- a/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts @@ -405,8 +405,9 @@ function removePb(scene: BattleScene, pokeball: Phaser.GameObjects.Sprite) { }); } -export function doPokemonFlee(scene: BattleScene, pokemon: EnemyPokemon): Promise { - return new Promise(resolve => { +export async function doPokemonFlee(scene: BattleScene, pokemon: EnemyPokemon): Promise { + await new Promise(resolve => { + scene.playSound("flee"); // Ease pokemon out scene.tweens.add({ targets: pokemon, diff --git a/src/field/arena.ts b/src/field/arena.ts index b4c474ce474..d767f84a135 100644 --- a/src/field/arena.ts +++ b/src/field/arena.ts @@ -317,7 +317,7 @@ export class Arena { this.eventTarget.dispatchEvent(new WeatherChangedEvent(oldWeatherType, this.weather?.weatherType, this.weather?.turnsLeft)); if (this.weather) { - this.scene.unshiftPhase(new CommonAnimPhase(this.scene, undefined, undefined, CommonAnim.SUNNY + (weather - 1))); + this.scene.unshiftPhase(new CommonAnimPhase(this.scene, undefined, undefined, CommonAnim.SUNNY + (weather - 1), true)); this.scene.queueMessage(getWeatherStartMessage(weather)); } else { this.scene.queueMessage(getWeatherClearMessage(oldWeatherType)); diff --git a/src/field/mystery-encounter-intro.ts b/src/field/mystery-encounter-intro.ts index bacf107f482..fb894869adf 100644 --- a/src/field/mystery-encounter-intro.ts +++ b/src/field/mystery-encounter-intro.ts @@ -32,6 +32,8 @@ export class MysteryEncounterSpriteConfig { disableAnimation?: boolean = false; /** Repeat the animation. Defaults to `false` */ repeat?: boolean = false; + /** Hidden at start of encounter. Defaults to `false` */ + hidden?: boolean = false; /** Tint color. `0` - `1`. Higher means darker tint. */ tint?: number; /** X offset */ @@ -105,6 +107,7 @@ export default class MysteryEncounterIntroVisuals extends Phaser.GameObjects.Con tintSprite = getItemSprite(spriteKey); } + sprite.setVisible(!config.hidden); tintSprite.setVisible(false); if (scale) { @@ -345,6 +348,13 @@ export default class MysteryEncounterIntroVisuals extends Phaser.GameObjects.Con this.untint(tintSprite, duration, ease); }); } + + setVisible(value: boolean): this { + this.getSprites().forEach(sprite => { + sprite.setVisible(value); + }); + return super.setVisible(value); + } } export default interface MysteryEncounterIntroVisuals { diff --git a/src/locales/en/mystery-encounters/fiery-fallout-dialogue.ts b/src/locales/en/mystery-encounters/fiery-fallout-dialogue.ts index 59808bc35ac..6f93cb239b1 100644 --- a/src/locales/en/mystery-encounters/fiery-fallout-dialogue.ts +++ b/src/locales/en/mystery-encounters/fiery-fallout-dialogue.ts @@ -13,16 +13,16 @@ export const fieryFalloutDialogue = { 2: { label: "Hunker down", tooltip: "(-) Suffer the effects of the weather", - selected: `The weather effects cause significant harm as you struggle to find shelter! - $Your party takes 30% Max HP damage! - $Your {burnTarget} also becomes burned!`, + 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 {{primaryPokemonName}} and {{secondaryPokemonName}} guide you to where two Volcarona are in the middle of a mating dance! - $Thankfully, your Pokémon are able to calm them, and 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.`, }, } }; diff --git a/src/phases.ts b/src/phases.ts index 5e4bdf29943..2e6c8224de2 100644 --- a/src/phases.ts +++ b/src/phases.ts @@ -67,7 +67,7 @@ import { Species } from "#enums/species"; import { TrainerType } from "#enums/trainer-type"; import { MysteryEncounterVariant } from "#app/data/mystery-encounters/mystery-encounter"; import { MysteryEncounterPhase } from "#app/phases/mystery-encounter-phases"; -import { handleEncounterStartOfBattleEffects, handleMysteryEncounterVictory } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { doTrainerExclamation, handleEncounterStartOfBattleEffects, handleMysteryEncounterVictory } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import ModifierSelectUiHandler, { SHOP_OPTIONS_ROW_LIMIT } from "#app/ui/modifier-select-ui-handler"; import { getEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; @@ -901,6 +901,15 @@ export class EncounterPhase extends BattlePhase { battle.mysteryEncounter = newEncounter; } loadEnemyAssets.push(battle.mysteryEncounter.introVisuals.loadAssets().then(() => battle.mysteryEncounter.introVisuals.initSprite())); + // Load Mystery Encounter Exclamation bubble and sfx + loadEnemyAssets.push(new Promise(resolve => { + this.scene.loadSe("GEN8- Exclaim.wav", "battle_anims", "GEN8- Exclaim.wav"); + this.scene.loadAtlas("exclaim", "mystery-encounters"); + this.scene.load.once(Phaser.Loader.Events.COMPLETE, () => resolve()); + if (!this.scene.load.isLoading()) { + this.scene.load.start(); + } + })); } else { // This block only applies for double battles to init the boss segments (idk why it's split up like this) if (battle.enemyParty.filter(p => p.isBoss()).length > 1) { @@ -1091,8 +1100,13 @@ export class EncounterPhase extends BattlePhase { const doShowEncounterOptions = () => { this.scene.ui.clearText(); this.scene.ui.getMessageHandler().hideNameText(); - this.scene.unshiftPhase(new MysteryEncounterPhase(this.scene)); + // Can add any additional unshift phases here before MysteryEncounterPhase begins (and all phase queues are cleared) + if (this.scene.currentBattle.mysteryEncounter.onPreMysteryEncounterPhase) { + this.scene.currentBattle.mysteryEncounter.onPreMysteryEncounterPhase(this.scene); + } + + this.scene.unshiftPhase(new MysteryEncounterPhase(this.scene)); this.end(); }; @@ -1125,6 +1139,7 @@ export class EncounterPhase extends BattlePhase { if (!encounterMessage) { doEncounter(); } else { + doTrainerExclamation(this.scene); this.scene.ui.showDialogue(encounterMessage, "???", null, () => { this.scene.charSprite.hide().then(() => this.scene.hideFieldOverlay(250).then(() => doEncounter())); }); @@ -2706,12 +2721,14 @@ export class NewBattlePhase extends BattlePhase { export class CommonAnimPhase extends PokemonPhase { private anim: CommonAnim; private targetIndex: integer; + private playOnEmptyField: boolean; - constructor(scene: BattleScene, battlerIndex: BattlerIndex, targetIndex: BattlerIndex, anim: CommonAnim) { + constructor(scene: BattleScene, battlerIndex: BattlerIndex, targetIndex: BattlerIndex, anim: CommonAnim, playOnEmptyField: boolean = false) { super(scene, battlerIndex); this.anim = anim; this.targetIndex = targetIndex; + this.playOnEmptyField = playOnEmptyField; } setAnimation(anim: CommonAnim) { @@ -2719,7 +2736,8 @@ export class CommonAnimPhase extends PokemonPhase { } start() { - new CommonBattleAnim(this.anim, this.getPokemon(), this.targetIndex !== undefined ? (this.player ? this.scene.getEnemyField() : this.scene.getPlayerField())[this.targetIndex] : this.getPokemon()).play(this.scene, () => { + const target = this.targetIndex !== undefined ? (this.player ? this.scene.getEnemyField() : this.scene.getPlayerField())[this.targetIndex] : this.getPokemon(); + new CommonBattleAnim(this.anim, this.getPokemon(), target, this.playOnEmptyField).play(this.scene, () => { this.end(); }); } diff --git a/src/phases/mystery-encounter-phases.ts b/src/phases/mystery-encounter-phases.ts index 6f474500838..1ac00cbea8e 100644 --- a/src/phases/mystery-encounter-phases.ts +++ b/src/phases/mystery-encounter-phases.ts @@ -2,7 +2,7 @@ import i18next from "i18next"; import BattleScene from "../battle-scene"; import { Phase } from "../phase"; import { Mode } from "../ui/ui"; -import { hideMysteryEncounterIntroVisuals, OptionSelectSettings } from "../data/mystery-encounters/utils/encounter-phase-utils"; +import { transitionMysteryEncounterIntroVisuals, OptionSelectSettings } from "../data/mystery-encounters/utils/encounter-phase-utils"; import { CheckSwitchPhase, NewBattlePhase, ReturnPhase, ScanIvsPhase, SelectModifierPhase, SummonPhase, ToggleDoublePositionPhase } from "../phases"; import MysteryEncounterOption, { OptionPhaseCallback } from "../data/mystery-encounters/mystery-encounter-option"; import { MysteryEncounterVariant } from "../data/mystery-encounters/mystery-encounter"; @@ -148,8 +148,8 @@ export class MysteryEncounterOptionSelectedPhase extends Phase { start() { super.start(); - if (this.scene.currentBattle.mysteryEncounter.hideIntroVisuals) { - hideMysteryEncounterIntroVisuals(this.scene).then(() => { + if (this.scene.currentBattle.mysteryEncounter.autoHideIntroVisuals) { + transitionMysteryEncounterIntroVisuals(this.scene).then(() => { this.scene.executeWithSeedOffset(() => { this.onOptionSelect(this.scene).finally(() => { this.end(); From a598c1cb059facdcca8a5df578264939d3f9ff33 Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Thu, 18 Jul 2024 22:56:01 -0400 Subject: [PATCH 182/270] fix unit test breaks --- src/battle-scene.ts | 2 -- src/data/mystery-encounters/utils/encounter-phase-utils.ts | 4 ++-- .../encounters/lost-at-sea-encounter.test.ts | 4 ++-- src/test/utils/mocks/mocksContainer/mockContainer.ts | 4 ++++ 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/battle-scene.ts b/src/battle-scene.ts index 954b24fd10b..af92c41b784 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -1038,8 +1038,6 @@ export default class BattleScene extends SceneBase { const playerField = this.getPlayerField(); - this.newArena(Biome.VOLCANO); - if (this.gameMode.isFixedBattle(newWaveIndex) && trainerData === undefined) { battleConfig = this.gameMode.getFixedBattle(newWaveIndex); newDouble = battleConfig.double; diff --git a/src/data/mystery-encounters/utils/encounter-phase-utils.ts b/src/data/mystery-encounters/utils/encounter-phase-utils.ts index ef542971057..d4720ce3e47 100644 --- a/src/data/mystery-encounters/utils/encounter-phase-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-phase-utils.ts @@ -34,7 +34,7 @@ export function doTrainerExclamation(scene: BattleScene) { const exclamationSprite = scene.addFieldSprite(0, 0, "exclaim"); exclamationSprite.setName("exclamation"); scene.field.add(exclamationSprite); - scene.field.moveTo(exclamationSprite, scene.field.list.length - 1); + scene.field.moveTo(exclamationSprite, scene.field.getAll().length - 1); exclamationSprite.setVisible(true); exclamationSprite.setPosition(110, 68); scene.tweens.add({ @@ -475,7 +475,7 @@ export function setEncounterExp(scene: BattleScene, participantId: integer | int const nonFaintedPartyMembers = party.filter(p => p.hp); const expPartyMembers = nonFaintedPartyMembers.filter(p => p.level < scene.getMaxExpLevel()); const partyMemberExp = []; - let expValue = baseExpValue * (useWaveIndex ? scene.currentBattle.waveIndex : 1) / 5 + 1; + let expValue = Math.floor(baseExpValue * (useWaveIndex ? scene.currentBattle.waveIndex : 1) / 5 + 1); if (participantIds?.length > 0) { if (scene.currentBattle.mysteryEncounter.encounterVariant === MysteryEncounterVariant.TRAINER_BATTLE) { 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 e8dcc369662..22dde79c50e 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 @@ -122,7 +122,7 @@ describe("Lost at Sea - Mystery Encounter", () => { await runSelectMysteryEncounterOption(game, 2); - expect(blastoise.exp).toBe(expBefore + laprasSpecies.baseExp * defaultWave); + expect(blastoise.exp).toBe(expBefore + Math.floor(laprasSpecies.baseExp * defaultWave / 5 + 1)); }); it("should leave encounter without battle", async () => { @@ -171,7 +171,7 @@ describe("Lost at Sea - Mystery Encounter", () => { await runSelectMysteryEncounterOption(game, 2); - expect(pidgeot.exp).toBe(expBefore + laprasBaseExp * wave); + expect(pidgeot.exp).toBe(expBefore + Math.floor(laprasBaseExp * defaultWave / 5 + 1)); }); it("should leave encounter without battle", async () => { diff --git a/src/test/utils/mocks/mocksContainer/mockContainer.ts b/src/test/utils/mocks/mocksContainer/mockContainer.ts index 4f8a58f7251..ea06c9de326 100644 --- a/src/test/utils/mocks/mocksContainer/mockContainer.ts +++ b/src/test/utils/mocks/mocksContainer/mockContainer.ts @@ -154,6 +154,10 @@ export default class MockContainer { // Sends this Game Object to the back of its parent's display list. } + moveTo(obj) { + // Moves this Game Object to the given index in the list. + } + moveAbove(obj) { // Moves this Game Object to be above the given Game Object in the display list. } From 2fce6a2769ef2a8441fe97a21dc0911f8bb7245a Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Thu, 18 Jul 2024 23:17:05 -0400 Subject: [PATCH 183/270] add skeleton tests to fiery fallout --- .../fiery-fallout-encounter.test.ts | 233 ++++++++++++++++++ .../encounters/lost-at-sea-encounter.test.ts | 4 +- 2 files changed, 235 insertions(+), 2 deletions(-) create mode 100644 src/test/mystery-encounter/encounters/fiery-fallout-encounter.test.ts diff --git a/src/test/mystery-encounter/encounters/fiery-fallout-encounter.test.ts b/src/test/mystery-encounter/encounters/fiery-fallout-encounter.test.ts new file mode 100644 index 00000000000..0c53066e5ff --- /dev/null +++ b/src/test/mystery-encounter/encounters/fiery-fallout-encounter.test.ts @@ -0,0 +1,233 @@ +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 { FieryFalloutEncounter } from "#app/data/mystery-encounters/encounters/fiery-fallout-encounter"; + +const namespace = "mysteryEncounter:fieryFallout"; +/** Arcanine and Ninetails for 2 Fire types. Lapras for burnable mon. */ +const defaultParty = [Species.ARCANINE, Species.NINETALES, Species.LAPRAS]; +const defaultBiome = Biome.VOLCANO; +const defaultWave = 45; + +describe("Fiery Fallout - Mystery Encounter", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ type: Phaser.HEADLESS }); + }); + + beforeEach(async () => { + game = new GameManager(phaserGame); + game.override.mysteryEncounterChance(100); + game.override.startingWave(defaultWave); + game.override.startingBiome(defaultBiome); + + vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue( + new Map([ + [Biome.SEA, [MysteryEncounterType.FIERY_FALLOUT]], + [Biome.MOUNTAIN, [MysteryEncounterType.MYSTERIOUS_CHALLENGERS]], + ]) + ); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + it("should have the correct properties", async () => { + await game.runToMysteryEncounter(defaultParty); + + expect(FieryFalloutEncounter.encounterType).toBe(MysteryEncounterType.FIERY_FALLOUT); + expect(FieryFalloutEncounter.dialogue).toBeDefined(); + expect(FieryFalloutEncounter.dialogue.intro).toStrictEqual([{ text: `${namespace}:intro` }]); + expect(FieryFalloutEncounter.dialogue.encounterOptionsDialogue.title).toBe(`${namespace}:title`); + expect(FieryFalloutEncounter.dialogue.encounterOptionsDialogue.description).toBe(`${namespace}:description`); + expect(FieryFalloutEncounter.dialogue.encounterOptionsDialogue.query).toBe(`${namespace}:query`); + expect(FieryFalloutEncounter.options.length).toBe(3); + }); + + it("should not spawn outside of volcano biome", async () => { + game.override.startingBiome(Biome.MOUNTAIN); + await game.runToMysteryEncounter(); + + expect(game.scene.currentBattle.mysteryEncounter.encounterType).not.toBe(MysteryEncounterType.LOST_AT_SEA); + }); + + it("should not run below wave 41", async () => { + game.override.startingWave(38); + + await game.runToMysteryEncounter(); + + expect(game.scene.currentBattle.mysteryEncounter.encounterType).not.toBe(MysteryEncounterType.FIERY_FALLOUT); + }); + + it("should not run above wave 179", async () => { + game.override.startingWave(181); + + await game.runToMysteryEncounter(); + + expect(game.scene.currentBattle.mysteryEncounter).toBeUndefined(); + }); + + // it("should set the correct dialog tokens during initialization", () => { + // vi.spyOn(game.scene, "currentBattle", "get").mockReturnValue({ mysteryEncounter: FieryFalloutEncounter } as Battle); + // + // const { onInit } = FieryFalloutEncounter; + // + // expect(FieryFalloutEncounter.onInit).toBeDefined(); + // + // const onInitResult = onInit(game.scene); + // + // expect(FieryFalloutEncounter.dialogueTokens?.damagePercentage).toBe("25"); + // expect(FieryFalloutEncounter.dialogueTokens?.option1RequiredMove).toBe(Moves[Moves.SURF]); + // expect(FieryFalloutEncounter.dialogueTokens?.option2RequiredMove).toBe(Moves[Moves.FLY]); + // expect(onInitResult).toBe(true); + // }); + + // describe("Option 1 - Fight 2 Volcarona", () => { + // it("should have the correct properties", () => { + // const option1 = LostAtSeaEncounter.options[0]; + // expect(option1.optionMode).toBe(EncounterOptionMode.DISABLED_OR_DEFAULT); + // expect(option1.dialogue).toBeDefined(); + // expect(option1.dialogue).toStrictEqual({ + // buttonLabel: `${namespace}:option:1:label`, + // disabledButtonLabel: `${namespace}:option:1:label_disabled`, + // buttonTooltip: `${namespace}:option:1:tooltip`, + // disabledButtonTooltip: `${namespace}:option:1:tooltip_disabled`, + // selected: [ + // { + // text: `${namespace}:option:1:selected`, + // }, + // ], + // }); + // }); + // + // it("should award exp to surfable PKM (Blastoise)", async () => { + // const laprasSpecies = getPokemonSpecies(Species.LAPRAS); + // + // await game.runToMysteryEncounter(defaultParty); + // const party = game.scene.getParty(); + // const blastoise = party.find((pkm) => pkm.species.speciesId === Species.PIDGEOT); + // const expBefore = blastoise.exp; + // + // await runSelectMysteryEncounterOption(game, 2); + // + // expect(blastoise.exp).toBe(expBefore + Math.floor(laprasSpecies.baseExp * defaultWave / 5 + 1)); + // }); + // + // it("should leave encounter without battle", async () => { + // game.override.startingWave(33); + // const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); + // + // await game.runToMysteryEncounter(defaultParty); + // await runSelectMysteryEncounterOption(game, 1); + // + // expect(leaveEncounterWithoutBattleSpy).toBeCalled(); + // }); + // + // it("should be disabled if no surfable PKM is in party", async () => { + // // TODO + // }); + // }); + + // describe("Option 2 - Suffer the weather", () => { + // it("should have the correct properties", () => { + // const option2 = LostAtSeaEncounter.options[1]; + // + // expect(option2.optionMode).toBe(EncounterOptionMode.DISABLED_OR_DEFAULT); + // expect(option2.dialogue).toBeDefined(); + // expect(option2.dialogue).toStrictEqual({ + // buttonLabel: `${namespace}:option:2:label`, + // disabledButtonLabel: `${namespace}:option:2:label_disabled`, + // buttonTooltip: `${namespace}:option:2:tooltip`, + // disabledButtonTooltip: `${namespace}:option:2:tooltip_disabled`, + // selected: [ + // { + // text: `${namespace}:option:2:selected`, + // }, + // ], + // }); + // }); + // + // it("should award exp to flyable PKM (Pidgeot)", async () => { + // const laprasBaseExp = 187; + // const wave = 33; + // game.override.startingWave(wave); + // + // await game.runToMysteryEncounter(defaultParty); + // const party = game.scene.getParty(); + // const pidgeot = party.find((pkm) => pkm.species.speciesId === Species.PIDGEOT); + // const expBefore = pidgeot.exp; + // + // await runSelectMysteryEncounterOption(game, 2); + // + // expect(pidgeot.exp).toBe(expBefore + Math.floor(laprasBaseExp * defaultWave / 5 + 1)); + // }); + // + // it("should leave encounter without battle", async () => { + // game.override.startingWave(33); + // const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); + // + // await game.runToMysteryEncounter(defaultParty); + // await runSelectMysteryEncounterOption(game, 2); + // + // expect(leaveEncounterWithoutBattleSpy).toBeCalled(); + // }); + // + // it("should be disabled if no flyable PKM is in party", async () => { + // // TODO + // }); + // }); + + // describe("Option 3 - use FIRE types", () => { + // it("should have the correct properties", () => { + // const option3 = LostAtSeaEncounter.options[2]; + // + // expect(option3.optionMode).toBe(EncounterOptionMode.DEFAULT); + // expect(option3.dialogue).toBeDefined(); + // expect(option3.dialogue).toStrictEqual({ + // buttonLabel: `${namespace}:option:3:label`, + // buttonTooltip: `${namespace}:option:3:tooltip`, + // selected: [ + // { + // text: `${namespace}:option:3:selected`, + // }, + // ], + // }); + // }); + // + // it("should damage all (allowed in battle) party PKM by 25%", async () => { + // game.override.startingWave(33); + // + // await game.runToMysteryEncounter(defaultParty); + // + // const party = game.scene.getParty(); + // const abra = party.find((pkm) => pkm.species.speciesId === Species.ABRA); + // vi.spyOn(abra, "isAllowedInBattle").mockReturnValue(false); + // + // await runSelectMysteryEncounterOption(game, 3); + // + // const allowedPkm = party.filter((pkm) => pkm.isAllowedInBattle()); + // const notAllowedPkm = party.filter((pkm) => !pkm.isAllowedInBattle()); + // allowedPkm.forEach((pkm) => + // expect(pkm.hp, `${pkm.name} should have receivd 25% damage: ${pkm.hp} / ${pkm.getMaxHp()} HP`).toBe(pkm.getMaxHp() - Math.floor(pkm.getMaxHp() * 0.25)) + // ); + // + // notAllowedPkm.forEach((pkm) => expect(pkm.hp, `${pkm.name} should be full hp: ${pkm.hp} / ${pkm.getMaxHp()} HP`).toBe(pkm.getMaxHp())); + // }); + // + // it("should leave encounter without battle", async () => { + // game.override.startingWave(33); + // const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); + // + // await game.runToMysteryEncounter(defaultParty); + // await runSelectMysteryEncounterOption(game, 3); + // + // expect(leaveEncounterWithoutBattleSpy).toBeCalled(); + // }); + // }); +}); 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 22dde79c50e..b614a400143 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 @@ -64,7 +64,7 @@ describe("Lost at Sea - Mystery Encounter", () => { }); it("should not run below wave 11", async () => { - game.override.startingWave(10); + game.override.startingWave(9); await game.runToMysteryEncounter(); @@ -72,7 +72,7 @@ describe("Lost at Sea - Mystery Encounter", () => { }); it("should not run above wave 179", async () => { - game.override.startingWave(180); + game.override.startingWave(181); await game.runToMysteryEncounter(); From 37419eb1d399972a0bac50020ca1c6c21c1fe03d Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Fri, 19 Jul 2024 12:00:03 -0400 Subject: [PATCH 184/270] commit latest test changes --- src/battle.ts | 2 +- .../encounters/dark-deal-encounter.ts | 2 +- .../department-store-sale-encounter.ts | 2 +- .../encounters/field-trip-encounter.ts | 2 +- .../encounters/fiery-fallout-encounter.ts | 35 +- .../encounters/fight-or-flight-encounter.ts | 2 +- .../encounters/lost-at-sea-encounter.ts | 2 +- .../mysterious-challengers-encounter.ts | 2 +- .../encounters/mysterious-chest-encounter.ts | 2 +- .../encounters/safari-zone-encounter.ts | 2 +- .../shady-vitamin-dealer-encounter.ts | 2 +- .../slumbering-snorlax-encounter.ts | 2 +- .../encounters/training-session-encounter.ts | 2 +- .../mystery-encounters/mystery-encounter.ts | 15 - .../utils/encounter-phase-utils.ts | 12 +- .../fiery-fallout-dialogue.ts | 6 +- src/phases.ts | 5 - src/phases/mystery-encounter-phases.ts | 2 +- .../mystery-encounter/encounterTestUtils.ts | 29 +- .../fiery-fallout-encounter.test.ts | 350 ++++++++++-------- src/test/utils/phaseInterceptor.ts | 3 +- 21 files changed, 269 insertions(+), 212 deletions(-) diff --git a/src/battle.ts b/src/battle.ts index ab47eac7993..9076eba7d0a 100644 --- a/src/battle.ts +++ b/src/battle.ts @@ -206,7 +206,7 @@ export default class Battle { getBgmOverride(scene: BattleScene): string { const battlers = this.enemyParty.slice(0, this.getBattlerCount()); if (this.battleType === BattleType.TRAINER || this.mysteryEncounter?.encounterVariant === MysteryEncounterVariant.TRAINER_BATTLE) { - if (!this.started && this.trainer.config.encounterBgm && this.trainer.getEncounterMessages()?.length) { + if (!this.started && this.trainer?.config?.encounterBgm && this.trainer?.getEncounterMessages()?.length) { return `encounter_${this.trainer.getEncounterBgm()}`; } if (scene.musicPreference === 0) { diff --git a/src/data/mystery-encounters/encounters/dark-deal-encounter.ts b/src/data/mystery-encounters/encounters/dark-deal-encounter.ts index 23ccba9c32e..698b374497b 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 For biome requirements check [mysteryEncountersByBiome](../mystery-encounters.ts) + * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ export const DarkDealEncounter: IMysteryEncounter = MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.DARK_DEAL) 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 2e8a5ff67bd..131dc68aa14 100644 --- a/src/data/mystery-encounters/encounters/department-store-sale-encounter.ts +++ b/src/data/mystery-encounters/encounters/department-store-sale-encounter.ts @@ -18,7 +18,7 @@ const namespace = "mysteryEncounter:departmentStoreSale"; /** * Department Store Sale encounter. * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/33 | GitHub Issue #33} - * @see For biome requirements check [mysteryEncountersByBiome](../mystery-encounters.ts) + * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ export const DepartmentStoreSaleEncounter: IMysteryEncounter = MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.DEPARTMENT_STORE_SALE) diff --git a/src/data/mystery-encounters/encounters/field-trip-encounter.ts b/src/data/mystery-encounters/encounters/field-trip-encounter.ts index 45ac52eb161..21db15ac7e0 100644 --- a/src/data/mystery-encounters/encounters/field-trip-encounter.ts +++ b/src/data/mystery-encounters/encounters/field-trip-encounter.ts @@ -24,7 +24,7 @@ const namespace = "mysteryEncounter:fieldTrip"; /** * Field Trip encounter. * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/17 | GitHub Issue #17} - * @see For biome requirements check [mysteryEncountersByBiome](../mystery-encounters.ts) + * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ export const FieldTripEncounter: IMysteryEncounter = MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.FIELD_TRIP) diff --git a/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts b/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts index 2a7c26995d3..ae7d26feece 100644 --- a/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts +++ b/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts @@ -31,7 +31,7 @@ const DAMAGE_PERCENTAGE: number = 20; /** * Fiery Fallout encounter. * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/88 | GitHub Issue #88} - * @see For biome requirements check [mysteryEncountersByBiome](../mystery-encounters.ts) + * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ export const FieryFalloutEncounter: IMysteryEncounter = MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.FIERY_FALLOUT) @@ -127,8 +127,13 @@ export const FieryFalloutEncounter: IMysteryEncounter = async (scene: BattleScene) => { // Pick battle const encounter = scene.currentBattle.mysteryEncounter; - const charcoal = generateModifierTypeOption(scene, modifierTypes.ATTACK_TYPE_BOOSTER, [Type.FIRE]); - setEncounterRewards(scene, { guaranteedModifierTypeOptions: [charcoal], fillRemaining: true }); + setEncounterRewards(scene, + { fillRemaining: true }, + null, + () => { + giveLeadPokemonCharcoal(scene); + }); + encounter.startOfBattleEffects.push( { sourceBattlerIndex: BattlerIndex.ENEMY, @@ -196,8 +201,8 @@ export const FieryFalloutEncounter: IMysteryEncounter = .withOption( new MysteryEncounterOptionBuilder() .withOptionMode(EncounterOptionMode.DISABLED_OR_SPECIAL) - .withPrimaryPokemonRequirement(new TypeRequirement(Type.FIRE, true,1)) // Will set option3PrimaryName dialogue token automatically - .withSecondaryPokemonRequirement(new TypeRequirement(Type.FIRE, true,1)) // Will set option3SecondaryName dialogue token automatically + .withPrimaryPokemonRequirement(new TypeRequirement(Type.STEEL, true,1)) // Will set option3PrimaryName dialogue token automatically + .withSecondaryPokemonRequirement(new TypeRequirement(Type.STEEL, true,1)) // Will set option3SecondaryName dialogue token automatically .withDialogue({ buttonLabel: `${namespace}:option:3:label`, buttonTooltip: `${namespace}:option:3:tooltip`, @@ -215,8 +220,12 @@ export const FieryFalloutEncounter: IMysteryEncounter = // Fire types help calm the Volcarona const encounter = scene.currentBattle.mysteryEncounter; transitionMysteryEncounterIntroVisuals(scene); - const charcoal = generateModifierTypeOption(scene, modifierTypes.ATTACK_TYPE_BOOSTER, [Type.FIRE]); - setEncounterRewards(scene, { guaranteedModifierTypeOptions: [charcoal], fillRemaining: true }); + setEncounterRewards(scene, + { fillRemaining: true }, + null, + () => { + giveLeadPokemonCharcoal(scene); + }); const primary = encounter.options[2].primaryPokemon; const secondary = encounter.options[2].secondaryPokemon[0]; @@ -227,3 +236,15 @@ export const FieryFalloutEncounter: IMysteryEncounter = .build() ) .build(); + +function giveLeadPokemonCharcoal(scene: BattleScene) { + // Give first party pokemon Charcoal for free at end of battle + const leadPokemon = scene.getParty()?.[0]; + if (leadPokemon) { + const charcoal = generateModifierTypeOption(scene, modifierTypes.ATTACK_TYPE_BOOSTER, [Type.FIRE]); + scene.addModifier(charcoal.type.newModifier(leadPokemon), true); + scene.updateModifiers(); + scene.currentBattle.mysteryEncounter.setDialogueToken("leadPokemon", leadPokemon.name); + queueEncounterMessage(scene, `${namespace}:found_charcoal`); + } +} 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 ca64ba30552..2d142f46d4e 100644 --- a/src/data/mystery-encounters/encounters/fight-or-flight-encounter.ts +++ b/src/data/mystery-encounters/encounters/fight-or-flight-encounter.ts @@ -35,7 +35,7 @@ const namespace = "mysteryEncounter:fightOrFlight"; /** * Fight or Flight encounter. * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/24 | GitHub Issue #24} - * @see For biome requirements check [mysteryEncountersByBiome](../mystery-encounters.ts) + * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ export const FightOrFlightEncounter: IMysteryEncounter = MysteryEncounterBuilder.withEncounterType( 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 fb7d1bcbbb5..3418f977ccd 100644 --- a/src/data/mystery-encounters/encounters/lost-at-sea-encounter.ts +++ b/src/data/mystery-encounters/encounters/lost-at-sea-encounter.ts @@ -21,7 +21,7 @@ const namespace = "mysteryEncounter:lostAtSea"; /** * Lost at sea encounter. * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/9 | GitHub Issue #9} - * @see For biome requirements check [mysteryEncountersByBiome](../mystery-encounters.ts) + * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ export const LostAtSeaEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.LOST_AT_SEA) .withEncounterTier(MysteryEncounterTier.COMMON) diff --git a/src/data/mystery-encounters/encounters/mysterious-challengers-encounter.ts b/src/data/mystery-encounters/encounters/mysterious-challengers-encounter.ts index b1b61434511..382dc1f212e 100644 --- a/src/data/mystery-encounters/encounters/mysterious-challengers-encounter.ts +++ b/src/data/mystery-encounters/encounters/mysterious-challengers-encounter.ts @@ -26,7 +26,7 @@ const namespace = "mysteryEncounter:mysteriousChallengers"; /** * Mysterious Challengers encounter. * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/41 | GitHub Issue #41} - * @see For biome requirements check [mysteryEncountersByBiome](../mystery-encounters.ts) + * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ export const MysteriousChallengersEncounter: IMysteryEncounter = MysteryEncounterBuilder.withEncounterType( diff --git a/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts b/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts index a93df6cb264..620d5380754 100644 --- a/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts +++ b/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts @@ -14,7 +14,7 @@ const namespace = "mysteryEncounter:mysteriousChest"; /** * Mysterious Chest encounter. * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/32 | GitHub Issue #32} - * @see For biome requirements check [mysteryEncountersByBiome](../mystery-encounters.ts) + * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ export const MysteriousChestEncounter: IMysteryEncounter = MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.MYSTERIOUS_CHEST) diff --git a/src/data/mystery-encounters/encounters/safari-zone-encounter.ts b/src/data/mystery-encounters/encounters/safari-zone-encounter.ts index 164ac112596..e5c5bd39b4d 100644 --- a/src/data/mystery-encounters/encounters/safari-zone-encounter.ts +++ b/src/data/mystery-encounters/encounters/safari-zone-encounter.ts @@ -24,7 +24,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 For biome requirements check [mysteryEncountersByBiome](../mystery-encounters.ts) + * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ export const SafariZoneEncounter: IMysteryEncounter = MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.SAFARI_ZONE) 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 082eb9a1872..de20a1e11b0 100644 --- a/src/data/mystery-encounters/encounters/shady-vitamin-dealer-encounter.ts +++ b/src/data/mystery-encounters/encounters/shady-vitamin-dealer-encounter.ts @@ -17,7 +17,7 @@ const namespace = "mysteryEncounter:shadyVitaminDealer"; /** * Shady Vitamin Dealer encounter. * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/34 | GitHub Issue #34} - * @see For biome requirements check [mysteryEncountersByBiome](../mystery-encounters.ts) + * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ export const ShadyVitaminDealerEncounter: IMysteryEncounter = MysteryEncounterBuilder.withEncounterType( diff --git a/src/data/mystery-encounters/encounters/slumbering-snorlax-encounter.ts b/src/data/mystery-encounters/encounters/slumbering-snorlax-encounter.ts index 2efae68c9eb..c905e0bd222 100644 --- a/src/data/mystery-encounters/encounters/slumbering-snorlax-encounter.ts +++ b/src/data/mystery-encounters/encounters/slumbering-snorlax-encounter.ts @@ -21,7 +21,7 @@ const namespace = "mysteryEncounter:slumberingSnorlax"; /** * Sleeping Snorlax encounter. * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/103 | GitHub Issue #103} - * @see For biome requirements check [mysteryEncountersByBiome](../mystery-encounters.ts) + * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ export const SlumberingSnorlaxEncounter: IMysteryEncounter = MysteryEncounterBuilder.withEncounterType( diff --git a/src/data/mystery-encounters/encounters/training-session-encounter.ts b/src/data/mystery-encounters/encounters/training-session-encounter.ts index e417bcc7ef4..2800a0befd1 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 For biome requirements check [mysteryEncountersByBiome](../mystery-encounters.ts) + * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ export const TrainingSessionEncounter: IMysteryEncounter = MysteryEncounterBuilder.withEncounterType( diff --git a/src/data/mystery-encounters/mystery-encounter.ts b/src/data/mystery-encounters/mystery-encounter.ts index 289800d0b52..2162f30a994 100644 --- a/src/data/mystery-encounters/mystery-encounter.ts +++ b/src/data/mystery-encounters/mystery-encounter.ts @@ -71,8 +71,6 @@ export default interface IMysteryEncounter { onInit?: (scene: BattleScene) => boolean; /** Event when battlefield visuals have finished sliding in and the encounter dialogue begins */ onVisualsStart?: (scene: BattleScene) => boolean; - /** Event right before MysteryEncounterPhase begins. Use for unshifting any phases before the actual encounter */ - onPreMysteryEncounterPhase?: (scene: BattleScene) => boolean; /** 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 */ @@ -392,7 +390,6 @@ export class MysteryEncounterBuilder implements Partial { doEncounterRewards?: (scene: BattleScene) => boolean; onInit?: (scene: BattleScene) => boolean; onVisualsStart?: (scene: BattleScene) => boolean; - onPreMysteryEncounterPhase?: (scene: BattleScene) => boolean; hideBattleIntroMessage?: boolean; hideIntroVisuals?: boolean; @@ -625,18 +622,6 @@ export class MysteryEncounterBuilder implements Partial { return Object.assign(this, { onInit: onInit }); } - /** - * Event callback right before MysteryEncounterPhase begins. - * Use for unshifting any last-minute phases before the actual encounter, as all phases are cleared and reset at that point. - * Example: set the weather before encounter begins - * - * @param onVisualsStart - synchronous callback function to perform immediately before MysteryEncounterPhase begins - * @returns - */ - withOnPreMysteryEncounterPhase(onPreMysteryEncounterPhase: (scene: BattleScene) => boolean): this & Required> { - return Object.assign(this, { onPreMysteryEncounterPhase: onPreMysteryEncounterPhase }); - } - /** * Can be used to perform some extra logic (usually animations) when the enemy field is finished sliding in * diff --git a/src/data/mystery-encounters/utils/encounter-phase-utils.ts b/src/data/mystery-encounters/utils/encounter-phase-utils.ts index d4720ce3e47..c07307b0597 100644 --- a/src/data/mystery-encounters/utils/encounter-phase-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-phase-utils.ts @@ -50,7 +50,7 @@ export function doTrainerExclamation(scene: BattleScene) { } }); - scene.playSound("GEN8- Exclaim.wav"); + scene.playSound("GEN8- Exclaim.wav", { volume: 0.8 }); } export interface EnemyPokemonConfig { @@ -417,10 +417,10 @@ export function selectPokemonForOption(scene: BattleScene, onPokemonSelected: (p * Can have shop displayed or skipped * @param scene - Battle Scene * @param customShopRewards - adds a shop phase with the specified rewards / reward tiers - * @param nonShopRewards - will add a non-shop reward phase for each specified item/modifier (can happen in addition to a shop) + * @param nonShopPlayerItemRewards - will add a non-shop reward phase for each specified item/modifier (can happen in addition to a shop) * @param preRewardsCallback - can execute an arbitrary callback before the new phases if necessary (useful for updating items/party/injecting new phases before MysteryEncounterRewardsPhase) */ -export function setEncounterRewards(scene: BattleScene, customShopRewards?: CustomModifierSettings, nonShopRewards?: ModifierTypeFunc[], preRewardsCallback?: Function) { +export function setEncounterRewards(scene: BattleScene, customShopRewards?: CustomModifierSettings, nonShopPlayerItemRewards?: ModifierTypeFunc[], preRewardsCallback?: Function) { scene.currentBattle.mysteryEncounter.doEncounterRewards = (scene: BattleScene) => { if (preRewardsCallback) { preRewardsCallback(); @@ -432,8 +432,8 @@ export function setEncounterRewards(scene: BattleScene, customShopRewards?: Cust scene.tryRemovePhase(p => p instanceof SelectModifierPhase); } - if (nonShopRewards?.length > 0) { - nonShopRewards.forEach((reward) => { + if (nonShopPlayerItemRewards?.length > 0) { + nonShopPlayerItemRewards.forEach((reward) => { scene.unshiftPhase(new ModifierRewardPhase(scene, reward)); }); } else { @@ -679,7 +679,7 @@ export function handleEncounterStartOfBattleEffects(scene: BattleScene) { } else { source = scene.getEnemyField()[0]; } - scene.pushPhase(new MovePhase(scene, source, effect.targets, effect.move, effect.followUp, effect.followUp)); + scene.pushPhase(new MovePhase(scene, source, effect.targets, effect.move, effect.followUp, effect.ignorePp)); }); // Pseudo turn end phase to reset flinch states, Endure, etc. diff --git a/src/locales/en/mystery-encounters/fiery-fallout-dialogue.ts b/src/locales/en/mystery-encounters/fiery-fallout-dialogue.ts index 6f93cb239b1..2fbf5a15bda 100644 --- a/src/locales/en/mystery-encounters/fiery-fallout-dialogue.ts +++ b/src/locales/en/mystery-encounters/fiery-fallout-dialogue.ts @@ -8,7 +8,7 @@ export const fieryFalloutDialogue = { 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! - $They don't take kindly to the interruption and attack!`, + $They don't take kindly to the interruption and attack!` }, 2: { label: "Hunker down", @@ -24,5 +24,7 @@ export const fieryFalloutDialogue = { 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. + $@s{item_fanfare}{{leadPokemon}} gained a Charcoal!` }; diff --git a/src/phases.ts b/src/phases.ts index 2e6c8224de2..bbf3115e671 100644 --- a/src/phases.ts +++ b/src/phases.ts @@ -1101,11 +1101,6 @@ export class EncounterPhase extends BattlePhase { this.scene.ui.clearText(); this.scene.ui.getMessageHandler().hideNameText(); - // Can add any additional unshift phases here before MysteryEncounterPhase begins (and all phase queues are cleared) - if (this.scene.currentBattle.mysteryEncounter.onPreMysteryEncounterPhase) { - this.scene.currentBattle.mysteryEncounter.onPreMysteryEncounterPhase(this.scene); - } - this.scene.unshiftPhase(new MysteryEncounterPhase(this.scene)); this.end(); }; diff --git a/src/phases/mystery-encounter-phases.ts b/src/phases/mystery-encounter-phases.ts index 1ac00cbea8e..25f6b140140 100644 --- a/src/phases/mystery-encounter-phases.ts +++ b/src/phases/mystery-encounter-phases.ts @@ -184,7 +184,7 @@ export class MysteryEncounterBattleStartCleanupPhase extends Phase { pokemon.lapseTags(BattlerTagLapseType.TURN_END); }); - this.end(); + super.end(); } } diff --git a/src/test/mystery-encounter/encounterTestUtils.ts b/src/test/mystery-encounter/encounterTestUtils.ts index 6caff2a8693..82975092a0f 100644 --- a/src/test/mystery-encounter/encounterTestUtils.ts +++ b/src/test/mystery-encounter/encounterTestUtils.ts @@ -1,15 +1,16 @@ import { Button } from "#app/enums/buttons"; -import { MessagePhase, VictoryPhase } from "#app/phases"; +import { CommandPhase, MessagePhase, VictoryPhase } from "#app/phases"; import { MysteryEncounterPhase, MysteryEncounterRewardsPhase } from "#app/phases/mystery-encounter-phases"; import MysteryEncounterUiHandler from "#app/ui/mystery-encounter-ui-handler"; import { Mode } from "#app/ui/ui"; import GameManager from "../utils/gameManager"; import MessageUiHandler from "#app/ui/message-ui-handler"; +import { Status, StatusEffect } from "#app/data/status-effect"; -export async function runSelectMysteryEncounterOption(game: GameManager, optionNo: number) { +export async function runSelectMysteryEncounterOption(game: GameManager, optionNo: number, isBattle: boolean = false) { // Handle any eventual queued messages (e.g. weather phase, etc.) game.onNextPrompt("MessagePhase", Mode.MESSAGE, () => { - const uiHandler = game.scene.ui.getHandler(); + const uiHandler = game.scene.ui.getHandler(); uiHandler.processInput(Button.ACTION); }); @@ -23,7 +24,7 @@ export async function runSelectMysteryEncounterOption(game: GameManager, optionN uiHandler.processInput(Button.ACTION); }); - await game.phaseInterceptor.run(MysteryEncounterPhase); + await game.phaseInterceptor.to(MysteryEncounterPhase, true); // select the desired option const uiHandler = game.scene.ui.getHandler(); @@ -73,5 +74,23 @@ export async function runSelectMysteryEncounterOption(game: GameManager, optionN uiHandler.processInput(Button.ACTION); }); - await game.phaseInterceptor.to(MysteryEncounterRewardsPhase); + if (isBattle) { + await game.phaseInterceptor.to(CommandPhase); + } else { + await game.phaseInterceptor.to(MysteryEncounterRewardsPhase); + } +} + +export async function skipBattleRunMysteryEncounterRewardsPhase(game: GameManager) { + game.scene.clearPhaseQueue(); + game.scene.clearPhaseQueueSplice(); + game.scene.getEnemyParty().forEach(p => { + p.hp = 0; + p.status = new Status(StatusEffect.FAINT); + game.scene.field.remove(p); + }); + game.scene.unshiftPhase(new VictoryPhase(game.scene, 0)); + game.endPhase(); + game.phaseInterceptor.superEndPhase(); + await game.phaseInterceptor.to(MysteryEncounterRewardsPhase, true); } 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 0c53066e5ff..a88a31968e2 100644 --- a/src/test/mystery-encounter/encounters/fiery-fallout-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/fiery-fallout-encounter.test.ts @@ -5,6 +5,16 @@ import { Species } from "#app/enums/species"; import GameManager from "#app/test/utils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { FieryFalloutEncounter } from "#app/data/mystery-encounters/encounters/fiery-fallout-encounter"; +import Battle from "#app/battle"; +import { Gender } from "#app/data/gender"; +import { getPokemonSpecies } from "#app/data/pokemon-species"; +import * as BattleAnims from "#app/data/battle-anims"; +import { EncounterOptionMode } from "#app/data/mystery-encounters/mystery-encounter-option"; +import { runSelectMysteryEncounterOption, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounterTestUtils"; +import { CommandPhase, MovePhase, SelectModifierPhase } from "#app/phases"; +import { Moves } from "#enums/moves"; +import BattleScene from "#app/battle-scene"; +import { PokemonHeldItemModifier } from "#app/modifier/modifier"; const namespace = "mysteryEncounter:fieryFallout"; /** Arcanine and Ninetails for 2 Fire types. Lapras for burnable mon. */ @@ -15,6 +25,7 @@ const defaultWave = 45; describe("Fiery Fallout - Mystery Encounter", () => { let phaserGame: Phaser.Game; let game: GameManager; + let scene: BattleScene; beforeAll(() => { phaserGame = new Phaser.Game({ type: Phaser.HEADLESS }); @@ -22,13 +33,14 @@ describe("Fiery Fallout - Mystery Encounter", () => { beforeEach(async () => { game = new GameManager(phaserGame); + scene = game.scene; game.override.mysteryEncounterChance(100); game.override.startingWave(defaultWave); game.override.startingBiome(defaultBiome); vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue( new Map([ - [Biome.SEA, [MysteryEncounterType.FIERY_FALLOUT]], + [Biome.VOLCANO, [MysteryEncounterType.FIERY_FALLOUT]], [Biome.MOUNTAIN, [MysteryEncounterType.MYSTERIOUS_CHALLENGERS]], ]) ); @@ -54,7 +66,7 @@ describe("Fiery Fallout - Mystery Encounter", () => { game.override.startingBiome(Biome.MOUNTAIN); await game.runToMysteryEncounter(); - expect(game.scene.currentBattle.mysteryEncounter.encounterType).not.toBe(MysteryEncounterType.LOST_AT_SEA); + expect(scene.currentBattle.mysteryEncounter.encounterType).not.toBe(MysteryEncounterType.LOST_AT_SEA); }); it("should not run below wave 41", async () => { @@ -62,7 +74,7 @@ describe("Fiery Fallout - Mystery Encounter", () => { await game.runToMysteryEncounter(); - expect(game.scene.currentBattle.mysteryEncounter.encounterType).not.toBe(MysteryEncounterType.FIERY_FALLOUT); + expect(scene.currentBattle.mysteryEncounter.encounterType).not.toBe(MysteryEncounterType.FIERY_FALLOUT); }); it("should not run above wave 179", async () => { @@ -70,164 +82,186 @@ describe("Fiery Fallout - Mystery Encounter", () => { await game.runToMysteryEncounter(); - expect(game.scene.currentBattle.mysteryEncounter).toBeUndefined(); + expect(scene.currentBattle.mysteryEncounter).toBeUndefined(); }); - // it("should set the correct dialog tokens during initialization", () => { - // vi.spyOn(game.scene, "currentBattle", "get").mockReturnValue({ mysteryEncounter: FieryFalloutEncounter } as Battle); - // - // const { onInit } = FieryFalloutEncounter; - // - // expect(FieryFalloutEncounter.onInit).toBeDefined(); - // - // const onInitResult = onInit(game.scene); - // - // expect(FieryFalloutEncounter.dialogueTokens?.damagePercentage).toBe("25"); - // expect(FieryFalloutEncounter.dialogueTokens?.option1RequiredMove).toBe(Moves[Moves.SURF]); - // expect(FieryFalloutEncounter.dialogueTokens?.option2RequiredMove).toBe(Moves[Moves.FLY]); - // expect(onInitResult).toBe(true); - // }); + it("should initialize fully ", async () => { + vi.spyOn(scene, "currentBattle", "get").mockReturnValue({ mysteryEncounter: FieryFalloutEncounter } as Battle); + const weatherSpy = vi.spyOn(scene.arena, "trySetWeather").mockReturnValue(true); + const moveInitSpy = vi.spyOn(BattleAnims, "loadMoveAnimAssets"); + const moveLoadSpy = vi.spyOn(BattleAnims, "loadMoveAnimAssets"); - // describe("Option 1 - Fight 2 Volcarona", () => { - // it("should have the correct properties", () => { - // const option1 = LostAtSeaEncounter.options[0]; - // expect(option1.optionMode).toBe(EncounterOptionMode.DISABLED_OR_DEFAULT); - // expect(option1.dialogue).toBeDefined(); - // expect(option1.dialogue).toStrictEqual({ - // buttonLabel: `${namespace}:option:1:label`, - // disabledButtonLabel: `${namespace}:option:1:label_disabled`, - // buttonTooltip: `${namespace}:option:1:tooltip`, - // disabledButtonTooltip: `${namespace}:option:1:tooltip_disabled`, - // selected: [ - // { - // text: `${namespace}:option:1:selected`, - // }, - // ], - // }); - // }); - // - // it("should award exp to surfable PKM (Blastoise)", async () => { - // const laprasSpecies = getPokemonSpecies(Species.LAPRAS); - // - // await game.runToMysteryEncounter(defaultParty); - // const party = game.scene.getParty(); - // const blastoise = party.find((pkm) => pkm.species.speciesId === Species.PIDGEOT); - // const expBefore = blastoise.exp; - // - // await runSelectMysteryEncounterOption(game, 2); - // - // expect(blastoise.exp).toBe(expBefore + Math.floor(laprasSpecies.baseExp * defaultWave / 5 + 1)); - // }); - // - // it("should leave encounter without battle", async () => { - // game.override.startingWave(33); - // const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); - // - // await game.runToMysteryEncounter(defaultParty); - // await runSelectMysteryEncounterOption(game, 1); - // - // expect(leaveEncounterWithoutBattleSpy).toBeCalled(); - // }); - // - // it("should be disabled if no surfable PKM is in party", async () => { - // // TODO - // }); - // }); + const { onInit } = FieryFalloutEncounter; - // describe("Option 2 - Suffer the weather", () => { - // it("should have the correct properties", () => { - // const option2 = LostAtSeaEncounter.options[1]; - // - // expect(option2.optionMode).toBe(EncounterOptionMode.DISABLED_OR_DEFAULT); - // expect(option2.dialogue).toBeDefined(); - // expect(option2.dialogue).toStrictEqual({ - // buttonLabel: `${namespace}:option:2:label`, - // disabledButtonLabel: `${namespace}:option:2:label_disabled`, - // buttonTooltip: `${namespace}:option:2:tooltip`, - // disabledButtonTooltip: `${namespace}:option:2:tooltip_disabled`, - // selected: [ - // { - // text: `${namespace}:option:2:selected`, - // }, - // ], - // }); - // }); - // - // it("should award exp to flyable PKM (Pidgeot)", async () => { - // const laprasBaseExp = 187; - // const wave = 33; - // game.override.startingWave(wave); - // - // await game.runToMysteryEncounter(defaultParty); - // const party = game.scene.getParty(); - // const pidgeot = party.find((pkm) => pkm.species.speciesId === Species.PIDGEOT); - // const expBefore = pidgeot.exp; - // - // await runSelectMysteryEncounterOption(game, 2); - // - // expect(pidgeot.exp).toBe(expBefore + Math.floor(laprasBaseExp * defaultWave / 5 + 1)); - // }); - // - // it("should leave encounter without battle", async () => { - // game.override.startingWave(33); - // const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); - // - // await game.runToMysteryEncounter(defaultParty); - // await runSelectMysteryEncounterOption(game, 2); - // - // expect(leaveEncounterWithoutBattleSpy).toBeCalled(); - // }); - // - // it("should be disabled if no flyable PKM is in party", async () => { - // // TODO - // }); - // }); + expect(FieryFalloutEncounter.onInit).toBeDefined(); - // describe("Option 3 - use FIRE types", () => { - // it("should have the correct properties", () => { - // const option3 = LostAtSeaEncounter.options[2]; - // - // expect(option3.optionMode).toBe(EncounterOptionMode.DEFAULT); - // expect(option3.dialogue).toBeDefined(); - // expect(option3.dialogue).toStrictEqual({ - // buttonLabel: `${namespace}:option:3:label`, - // buttonTooltip: `${namespace}:option:3:tooltip`, - // selected: [ - // { - // text: `${namespace}:option:3:selected`, - // }, - // ], - // }); - // }); - // - // it("should damage all (allowed in battle) party PKM by 25%", async () => { - // game.override.startingWave(33); - // - // await game.runToMysteryEncounter(defaultParty); - // - // const party = game.scene.getParty(); - // const abra = party.find((pkm) => pkm.species.speciesId === Species.ABRA); - // vi.spyOn(abra, "isAllowedInBattle").mockReturnValue(false); - // - // await runSelectMysteryEncounterOption(game, 3); - // - // const allowedPkm = party.filter((pkm) => pkm.isAllowedInBattle()); - // const notAllowedPkm = party.filter((pkm) => !pkm.isAllowedInBattle()); - // allowedPkm.forEach((pkm) => - // expect(pkm.hp, `${pkm.name} should have receivd 25% damage: ${pkm.hp} / ${pkm.getMaxHp()} HP`).toBe(pkm.getMaxHp() - Math.floor(pkm.getMaxHp() * 0.25)) - // ); - // - // notAllowedPkm.forEach((pkm) => expect(pkm.hp, `${pkm.name} should be full hp: ${pkm.hp} / ${pkm.getMaxHp()} HP`).toBe(pkm.getMaxHp())); - // }); - // - // it("should leave encounter without battle", async () => { - // game.override.startingWave(33); - // const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); - // - // await game.runToMysteryEncounter(defaultParty); - // await runSelectMysteryEncounterOption(game, 3); - // - // expect(leaveEncounterWithoutBattleSpy).toBeCalled(); - // }); - // }); + const onInitResult = onInit(scene); + + expect(FieryFalloutEncounter.enemyPartyConfigs).toEqual([ + { + pokemonConfigs: [ + { + species: getPokemonSpecies(Species.VOLCARONA), + isBoss: false, + gender: Gender.MALE + }, + { + species: getPokemonSpecies(Species.VOLCARONA), + isBoss: false, + gender: Gender.FEMALE + } + ], + doubleBattle: true, + disableSwitch: true + } + ]); + expect(weatherSpy).toHaveBeenCalledTimes(1); + await vi.waitFor(() => expect(moveInitSpy).toHaveBeenCalled()); + await vi.waitFor(() => expect(moveLoadSpy).toHaveBeenCalled()); + expect(onInitResult).toBe(true); + }); + + describe("Option 1 - Fight 2 Volcarona", () => { + it("should have the correct properties", () => { + const option1 = FieryFalloutEncounter.options[0]; + expect(option1.optionMode).toBe(EncounterOptionMode.DEFAULT); + expect(option1.dialogue).toBeDefined(); + expect(option1.dialogue).toStrictEqual({ + buttonLabel: `${namespace}:option:1:label`, + buttonTooltip: `${namespace}:option:1:tooltip`, + selected: [ + { + text: `${namespace}:option:1:selected`, + }, + ], + }); + }); + + it("should start battle against 2 Volcarona", async () => { + const phaseSpy = vi.spyOn(scene, "pushPhase"); + + await game.runToMysteryEncounter(defaultParty); + await runSelectMysteryEncounterOption(game, 1, true); + + const enemyField = scene.getEnemyField(); + expect(scene.getCurrentPhase().constructor.name).toBe(CommandPhase.name); + expect(enemyField.length).toBe(2); + expect(enemyField[0].species.speciesId).toBe(Species.VOLCARONA); + expect(enemyField[1].species.speciesId).toBe(Species.VOLCARONA); + expect(enemyField[0].gender).not.toEqual(enemyField[1].gender); // Should be opposite gender + + const movePhases = phaseSpy.mock.calls.filter(p => p[0] instanceof MovePhase).map(p => p[0]); + expect(movePhases.length).toBe(4); + expect(movePhases.filter(p => (p as MovePhase).move.moveId === Moves.FIRE_SPIN).length).toBe(2); // Fire spin used twice before battle + expect(movePhases.filter(p => (p as MovePhase).move.moveId === Moves.QUIVER_DANCE).length).toBe(2); // Quiver Dance used twice before battle + }); + + it("should give charcoal to lead pokemon", async () => { + await game.runToMysteryEncounter(defaultParty); + await runSelectMysteryEncounterOption(game, 1, true); + await skipBattleRunMysteryEncounterRewardsPhase(game); + await game.phaseInterceptor.to(SelectModifierPhase, false); + expect(scene.getCurrentPhase().constructor.name).toBe(SelectModifierPhase.name); + + const leadPokemonId = scene.getParty()?.[0].id; + const leadPokemonItems = scene.findModifiers(m => m instanceof PokemonHeldItemModifier + && (m as PokemonHeldItemModifier).pokemonId === leadPokemonId, true) as PokemonHeldItemModifier[]; + const charcoal = leadPokemonItems.find(i => i.type.name === "Charcoal"); + expect(charcoal).toBeDefined; + }); + }); + + describe("Option 2 - Suffer the weather", () => { + it("should have the correct properties", () => { + const option1 = FieryFalloutEncounter.options[0]; + expect(option1.optionMode).toBe(EncounterOptionMode.DEFAULT); + expect(option1.dialogue).toBeDefined(); + expect(option1.dialogue).toStrictEqual({ + buttonLabel: `${namespace}:option:2:label`, + buttonTooltip: `${namespace}:option:2:tooltip`, + selected: [ + { + text: `${namespace}:option:2:selected`, + }, + ], + }); + }); + + it("should damage all (allowed in battle) party PKM by 25%", async () => { + game.override.startingWave(33); + + await game.runToMysteryEncounter(defaultParty); + + const party = scene.getParty(); + const abra = party.find((pkm) => pkm.species.speciesId === Species.ABRA); + vi.spyOn(abra, "isAllowedInBattle").mockReturnValue(false); + + await runSelectMysteryEncounterOption(game, 3); + + const allowedPkm = party.filter((pkm) => pkm.isAllowedInBattle()); + const notAllowedPkm = party.filter((pkm) => !pkm.isAllowedInBattle()); + allowedPkm.forEach((pkm) => + expect(pkm.hp, `${pkm.name} should have receivd 25% damage: ${pkm.hp} / ${pkm.getMaxHp()} HP`).toBe(pkm.getMaxHp() - Math.floor(pkm.getMaxHp() * 0.25)) + ); + + notAllowedPkm.forEach((pkm) => expect(pkm.hp, `${pkm.name} should be full hp: ${pkm.hp} / ${pkm.getMaxHp()} HP`).toBe(pkm.getMaxHp())); + }); + + it("should leave encounter without battle", async () => { + game.override.startingWave(33); + const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); + + await game.runToMysteryEncounter(defaultParty); + await runSelectMysteryEncounterOption(game, 3); + + expect(leaveEncounterWithoutBattleSpy).toBeCalled(); + }); + }); + + describe("Option 3 - use FIRE types", () => { + it("should have the correct properties", () => { + const option1 = FieryFalloutEncounter.options[0]; + expect(option1.optionMode).toBe(EncounterOptionMode.DEFAULT); + expect(option1.dialogue).toBeDefined(); + expect(option1.dialogue).toStrictEqual({ + buttonLabel: `${namespace}:option:1:label`, + buttonTooltip: `${namespace}:option:1:tooltip`, + selected: [ + { + text: `${namespace}:option:1:selected`, + }, + ], + }); + }); + + it("should damage all (allowed in battle) party PKM by 25%", async () => { + game.override.startingWave(33); + + await game.runToMysteryEncounter(defaultParty); + + const party = scene.getParty(); + const abra = party.find((pkm) => pkm.species.speciesId === Species.ABRA); + vi.spyOn(abra, "isAllowedInBattle").mockReturnValue(false); + + await runSelectMysteryEncounterOption(game, 3); + + const allowedPkm = party.filter((pkm) => pkm.isAllowedInBattle()); + const notAllowedPkm = party.filter((pkm) => !pkm.isAllowedInBattle()); + allowedPkm.forEach((pkm) => + expect(pkm.hp, `${pkm.name} should have receivd 25% damage: ${pkm.hp} / ${pkm.getMaxHp()} HP`).toBe(pkm.getMaxHp() - Math.floor(pkm.getMaxHp() * 0.25)) + ); + + notAllowedPkm.forEach((pkm) => expect(pkm.hp, `${pkm.name} should be full hp: ${pkm.hp} / ${pkm.getMaxHp()} HP`).toBe(pkm.getMaxHp())); + }); + + it("should leave encounter without battle", async () => { + game.override.startingWave(33); + const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); + + await game.runToMysteryEncounter(defaultParty); + await runSelectMysteryEncounterOption(game, 3); + + expect(leaveEncounterWithoutBattleSpy).toBeCalled(); + }); + }); }); diff --git a/src/test/utils/phaseInterceptor.ts b/src/test/utils/phaseInterceptor.ts index 39278c673d4..7114d63afa0 100644 --- a/src/test/utils/phaseInterceptor.ts +++ b/src/test/utils/phaseInterceptor.ts @@ -104,7 +104,8 @@ export default class PhaseInterceptor { [MysteryEncounterBattlePhase, this.startPhase], [MysteryEncounterRewardsPhase, this.startPhase], [PostMysteryEncounterPhase, this.startPhase], - [LearnMovePhase, this.startPhase] + [LearnMovePhase, this.startPhase], + // [CommonAnimPhase, this.startPhase] ]; private endBySetMode = [ From 03f999e16973464e3e42ec348659f1df1d28012b Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Fri, 19 Jul 2024 14:51:38 -0400 Subject: [PATCH 185/270] finish unit tests for fiery fallout --- src/battle-scene.ts | 2 +- src/data/battle-anims.ts | 6 +- .../encounters/fiery-fallout-encounter.ts | 6 +- .../mystery-encounter-requirements.ts | 98 +++---------------- .../mystery-encounters/mystery-encounter.ts | 4 +- .../utils/encounter-phase-utils.ts | 9 +- .../utils/encounter-pokemon-utils.ts | 4 +- .../mystery-encounter/encounterTestUtils.ts | 3 +- .../fiery-fallout-encounter.test.ts | 74 +++++++------- .../encounters/lost-at-sea-encounter.test.ts | 1 + .../mystery-encounter.test.ts | 1 + src/test/utils/overridesHelper.ts | 11 +++ 12 files changed, 80 insertions(+), 139 deletions(-) diff --git a/src/battle-scene.ts b/src/battle-scene.ts index af92c41b784..9c32c58efdb 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -2650,7 +2650,7 @@ export default class BattleScene extends SceneBase { return encounter; } - // Common / Uncommon / Rare / Super Rare + // Common / Great / Ultra / Rogue const tierWeights = [64, 40, 21, 3]; // Adjust tier weights by previously encountered events to lower odds of only common/uncommons in run diff --git a/src/data/battle-anims.ts b/src/data/battle-anims.ts index 81536d74771..3f00a012ee3 100644 --- a/src/data/battle-anims.ts +++ b/src/data/battle-anims.ts @@ -528,10 +528,10 @@ export function initMoveAnim(scene: BattleScene, move: Moves): Promise { /** * Fetches animation configs to be used in a Mystery Encounter * @param scene - * @param anims - one or more animations to fetch + * @param encounterAnim - one or more animations to fetch */ -export async function initEncounterAnims(scene: BattleScene, anims: EncounterAnim | EncounterAnim[]): Promise { - anims = anims instanceof Array ? anims : [anims]; +export async function initEncounterAnims(scene: BattleScene, encounterAnim: EncounterAnim | EncounterAnim[]): Promise { + const anims = Array.isArray(encounterAnim) ? encounterAnim : [encounterAnim]; const encounterAnimNames = Utils.getEnumKeys(EncounterAnim); const encounterAnimIds = Utils.getEnumValues(EncounterAnim); const encounterAnimFetches = []; diff --git a/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts b/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts index ae7d26feece..705ba3296a4 100644 --- a/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts +++ b/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts @@ -175,7 +175,7 @@ export const FieryFalloutEncounter: IMysteryEncounter = async (scene: BattleScene) => { // Damage non-fire types and burn 1 random non-fire type member const encounter = scene.currentBattle.mysteryEncounter; - const nonFireTypes = scene.getParty().filter((p) => !p.getTypes().includes(Type.FIRE)); + const nonFireTypes = scene.getParty().filter((p) => p.isAllowedInBattle() && !p.getTypes().includes(Type.FIRE)); for (const pkm of nonFireTypes) { const percentage = DAMAGE_PERCENTAGE / 100; @@ -201,8 +201,8 @@ export const FieryFalloutEncounter: IMysteryEncounter = .withOption( new MysteryEncounterOptionBuilder() .withOptionMode(EncounterOptionMode.DISABLED_OR_SPECIAL) - .withPrimaryPokemonRequirement(new TypeRequirement(Type.STEEL, true,1)) // Will set option3PrimaryName dialogue token automatically - .withSecondaryPokemonRequirement(new TypeRequirement(Type.STEEL, true,1)) // Will set option3SecondaryName dialogue token automatically + .withPrimaryPokemonRequirement(new TypeRequirement(Type.FIRE, true,1)) // Will set option3PrimaryName dialogue token automatically + .withSecondaryPokemonRequirement(new TypeRequirement(Type.FIRE, true,1)) // Will set option3SecondaryName dialogue token automatically .withDialogue({ buttonLabel: `${namespace}:option:3:label`, buttonTooltip: `${namespace}:option:3:tooltip`, diff --git a/src/data/mystery-encounters/mystery-encounter-requirements.ts b/src/data/mystery-encounters/mystery-encounter-requirements.ts index 6ec5d652fb4..ac1d49c919e 100644 --- a/src/data/mystery-encounters/mystery-encounter-requirements.ts +++ b/src/data/mystery-encounters/mystery-encounter-requirements.ts @@ -103,12 +103,7 @@ export class TimeOfDayRequirement extends EncounterSceneRequirement { constructor(timeOfDay: TimeOfDay | TimeOfDay[]) { super(); - if (timeOfDay instanceof Array) { - this.requiredTimeOfDay = timeOfDay; - } else { - this.requiredTimeOfDay = []; - this.requiredTimeOfDay.push(timeOfDay); - } + this.requiredTimeOfDay = Array.isArray(timeOfDay) ? timeOfDay : [timeOfDay]; } meetsRequirement(scene: BattleScene): boolean { @@ -130,12 +125,7 @@ export class WeatherRequirement extends EncounterSceneRequirement { constructor(weather: WeatherType | WeatherType[]) { super(); - if (weather instanceof Array) { - this.requiredWeather = weather; - } else { - this.requiredWeather = []; - this.requiredWeather.push(weather); - } + this.requiredWeather = Array.isArray(weather) ? weather : [weather]; } meetsRequirement(scene: BattleScene): boolean { @@ -185,12 +175,7 @@ export class PersistentModifierRequirement extends EncounterSceneRequirement { requiredItems?: ModifierType[]; // TODO: not implemented constructor(item: ModifierType | ModifierType[]) { super(); - if (item instanceof Array) { - this.requiredItems = item; - } else { - this.requiredItems = []; - this.requiredItems.push(item); - } + this.requiredItems = Array.isArray(item) ? item : [item]; } meetsRequirement(scene: BattleScene): boolean { @@ -251,12 +236,7 @@ export class SpeciesRequirement extends EncounterPokemonRequirement { super(); this.minNumberOfPokemon = minNumberOfPokemon; this.invertQuery = invertQuery; - if (species instanceof Array) { - this.requiredSpecies = species; - } else { - this.requiredSpecies = []; - this.requiredSpecies.push(species); - } + this.requiredSpecies = Array.isArray(species) ? species : [species]; } meetsRequirement(scene: BattleScene): boolean { @@ -294,12 +274,7 @@ export class NatureRequirement extends EncounterPokemonRequirement { super(); this.minNumberOfPokemon = minNumberOfPokemon; this.invertQuery = invertQuery; - if (nature instanceof Array) { - this.requiredNature = nature; - } else { - this.requiredNature = []; - this.requiredNature.push(nature); - } + this.requiredNature = Array.isArray(nature) ? nature : [nature]; } meetsRequirement(scene: BattleScene): boolean { @@ -338,12 +313,7 @@ export class TypeRequirement extends EncounterPokemonRequirement { this.excludeFainted = excludeFainted; this.minNumberOfPokemon = minNumberOfPokemon; this.invertQuery = invertQuery; - if (type instanceof Array) { - this.requiredType = type; - } else { - this.requiredType = []; - this.requiredType.push(type); - } + this.requiredType = Array.isArray(type) ? type : [type]; } meetsRequirement(scene: BattleScene): boolean { @@ -388,12 +358,7 @@ export class MoveRequirement extends EncounterPokemonRequirement { super(); this.minNumberOfPokemon = minNumberOfPokemon; this.invertQuery = invertQuery; - if (moves instanceof Array) { - this.requiredMoves = moves; - } else { - this.requiredMoves = []; - this.requiredMoves.push(moves); - } + this.requiredMoves = Array.isArray(moves) ? moves : [moves]; } meetsRequirement(scene: BattleScene): boolean { @@ -437,12 +402,7 @@ export class CompatibleMoveRequirement extends EncounterPokemonRequirement { super(); this.minNumberOfPokemon = minNumberOfPokemon; this.invertQuery = invertQuery; - if (learnableMove instanceof Array) { - this.requiredMoves = learnableMove; - } else { - this.requiredMoves = []; - this.requiredMoves.push(learnableMove); - } + this.requiredMoves = Array.isArray(learnableMove) ? learnableMove : [learnableMove]; } meetsRequirement(scene: BattleScene): boolean { @@ -482,12 +442,7 @@ export class EvolutionTargetSpeciesRequirement extends EncounterPokemonRequireme super(); this.minNumberOfPokemon = minNumberOfPokemon; this.invertQuery = invertQuery; - if (evolutionTargetSpecies instanceof Array) { - this.requiredEvolutionTargetSpecies = evolutionTargetSpecies; - } else { - this.requiredEvolutionTargetSpecies = []; - this.requiredEvolutionTargetSpecies.push(evolutionTargetSpecies); - } + this.requiredEvolutionTargetSpecies = Array.isArray(evolutionTargetSpecies) ? evolutionTargetSpecies : [evolutionTargetSpecies]; } meetsRequirement(scene: BattleScene): boolean { @@ -526,12 +481,7 @@ export class AbilityRequirement extends EncounterPokemonRequirement { super(); this.minNumberOfPokemon = minNumberOfPokemon; this.invertQuery = invertQuery; - if (abilities instanceof Array) { - this.requiredAbilities = abilities; - } else { - this.requiredAbilities = []; - this.requiredAbilities.push(abilities); - } + this.requiredAbilities = Array.isArray(abilities) ? abilities : [abilities]; } meetsRequirement(scene: BattleScene): boolean { @@ -571,12 +521,7 @@ export class StatusEffectRequirement extends EncounterPokemonRequirement { super(); this.minNumberOfPokemon = minNumberOfPokemon; this.invertQuery = invertQuery; - if (statusEffect instanceof Array) { - this.requiredStatusEffect = statusEffect; - } else { - this.requiredStatusEffect = []; - this.requiredStatusEffect.push(statusEffect); - } + this.requiredStatusEffect = Array.isArray(statusEffect) ? statusEffect : [statusEffect]; } meetsRequirement(scene: BattleScene): boolean { @@ -646,12 +591,7 @@ export class CanFormChangeWithItemRequirement extends EncounterPokemonRequiremen super(); this.minNumberOfPokemon = minNumberOfPokemon; this.invertQuery = invertQuery; - if (formChangeItem instanceof Array) { - this.requiredFormChangeItem = formChangeItem; - } else { - this.requiredFormChangeItem = []; - this.requiredFormChangeItem.push(formChangeItem); - } + this.requiredFormChangeItem = Array.isArray(formChangeItem) ? formChangeItem : [formChangeItem]; } meetsRequirement(scene: BattleScene): boolean { @@ -703,12 +643,7 @@ export class CanEvolveWithItemRequirement extends EncounterPokemonRequirement { super(); this.minNumberOfPokemon = minNumberOfPokemon; this.invertQuery = invertQuery; - if (evolutionItems instanceof Array) { - this.requiredEvolutionItem = evolutionItems; - } else { - this.requiredEvolutionItem = []; - this.requiredEvolutionItem.push(evolutionItems); - } + this.requiredEvolutionItem = Array.isArray(evolutionItems) ? evolutionItems : [evolutionItems]; } meetsRequirement(scene: BattleScene): boolean { @@ -757,12 +692,7 @@ export class HeldItemRequirement extends EncounterPokemonRequirement { super(); this.minNumberOfPokemon = minNumberOfPokemon; this.invertQuery = invertQuery; - if (heldItem instanceof Array) { - this.requiredHeldItemModifier = heldItem; - } else { - this.requiredHeldItemModifier = []; - this.requiredHeldItemModifier.push(heldItem); - } + this.requiredHeldItemModifier = Array.isArray(heldItem) ? heldItem : [heldItem]; } meetsRequirement(scene: BattleScene): boolean { diff --git a/src/data/mystery-encounters/mystery-encounter.ts b/src/data/mystery-encounters/mystery-encounter.ts index 2162f30a994..7fc66dfa4e7 100644 --- a/src/data/mystery-encounters/mystery-encounter.ts +++ b/src/data/mystery-encounters/mystery-encounter.ts @@ -489,8 +489,8 @@ export class MysteryEncounterBuilder implements Partial { * @returns */ withAnimations(...encounterAnimations: EncounterAnim[]): this & Required> { - encounterAnimations = encounterAnimations instanceof Array ? encounterAnimations : [encounterAnimations]; - return Object.assign(this, { encounterAnimations: encounterAnimations }); + const animations = Array.isArray(encounterAnimations) ? encounterAnimations : [encounterAnimations]; + return Object.assign(this, { encounterAnimations: animations }); } /** diff --git a/src/data/mystery-encounters/utils/encounter-phase-utils.ts b/src/data/mystery-encounters/utils/encounter-phase-utils.ts index c07307b0597..9c569775f38 100644 --- a/src/data/mystery-encounters/utils/encounter-phase-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-phase-utils.ts @@ -207,10 +207,11 @@ export async function initBattleWithEnemyConfig(scene: BattleScene, partyConfig: } // Set Status - if (partyConfig.pokemonConfigs[e].status) { + const statusEffects = partyConfig.pokemonConfigs[e].status; + if (statusEffects) { // Default to cureturn 3 for sleep - const status = partyConfig.pokemonConfigs[e].status instanceof Array ? partyConfig.pokemonConfigs[e].status[0] : partyConfig.pokemonConfigs[e].status; - const cureTurn = partyConfig.pokemonConfigs[e].status instanceof Array ? partyConfig.pokemonConfigs[e].status[1] : partyConfig.pokemonConfigs[e].status === StatusEffect.SLEEP ? 3 : null; + const status = Array.isArray(statusEffects) ? statusEffects[0] : statusEffects; + const cureTurn = Array.isArray(statusEffects) ? statusEffects[1] : statusEffects === StatusEffect.SLEEP ? 3 : null; enemyPokemon.status = new Status(status, 0, cureTurn); } @@ -281,7 +282,7 @@ export async function initBattleWithEnemyConfig(scene: BattleScene, partyConfig: * @param moves */ export function initCustomMovesForEncounter(scene: BattleScene, moves: Moves | Moves[]) { - moves = moves instanceof Array ? moves : [moves]; + moves = Array.isArray(moves) ? moves : [moves]; return Promise.all(moves.map(move => initMoveAnim(scene, move))) .then(() => loadMoveAnimAssets(scene, moves)); } diff --git a/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts b/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts index b505c4f971d..76c6cb9c680 100644 --- a/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts @@ -98,8 +98,8 @@ export function getLowestLevelPlayerPokemon(scene: BattleScene, unfainted: boole * @returns */ export function getRandomSpeciesByStarterTier(starterTiers: number | [number, number], excludedSpecies?: Species[], types?: Type[]): Species { - let min = starterTiers instanceof Array ? starterTiers[0] : starterTiers; - let max = starterTiers instanceof Array ? starterTiers[1] : starterTiers; + let min = Array.isArray(starterTiers) ? starterTiers[0] : starterTiers; + let max = Array.isArray(starterTiers) ? starterTiers[1] : starterTiers; let filteredSpecies: [PokemonSpecies, number][] = Object.keys(speciesStarters) .map(s => [parseInt(s) as Species, speciesStarters[s] as number]) diff --git a/src/test/mystery-encounter/encounterTestUtils.ts b/src/test/mystery-encounter/encounterTestUtils.ts index 82975092a0f..218f2cdb971 100644 --- a/src/test/mystery-encounter/encounterTestUtils.ts +++ b/src/test/mystery-encounter/encounterTestUtils.ts @@ -89,8 +89,7 @@ export async function skipBattleRunMysteryEncounterRewardsPhase(game: GameManage p.status = new Status(StatusEffect.FAINT); game.scene.field.remove(p); }); - game.scene.unshiftPhase(new VictoryPhase(game.scene, 0)); - game.endPhase(); + game.scene.pushPhase(new VictoryPhase(game.scene, 0)); game.phaseInterceptor.superEndPhase(); await game.phaseInterceptor.to(MysteryEncounterRewardsPhase, true); } 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 a88a31968e2..19d909cab64 100644 --- a/src/test/mystery-encounter/encounters/fiery-fallout-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/fiery-fallout-encounter.test.ts @@ -9,16 +9,19 @@ import Battle from "#app/battle"; 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 { EncounterOptionMode } from "#app/data/mystery-encounters/mystery-encounter-option"; import { runSelectMysteryEncounterOption, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounterTestUtils"; import { CommandPhase, MovePhase, SelectModifierPhase } from "#app/phases"; import { Moves } from "#enums/moves"; import BattleScene from "#app/battle-scene"; import { PokemonHeldItemModifier } from "#app/modifier/modifier"; +import { Type } from "#app/data/type"; +import { Status, StatusEffect } from "#app/data/status-effect"; const namespace = "mysteryEncounter:fieryFallout"; -/** Arcanine and Ninetails for 2 Fire types. Lapras for burnable mon. */ -const defaultParty = [Species.ARCANINE, Species.NINETALES, Species.LAPRAS]; +/** Arcanine and Ninetails for 2 Fire types. Lapras, Gengar, Abra for burnable mon. */ +const defaultParty = [Species.ARCANINE, Species.NINETALES, Species.LAPRAS, Species.GENGAR, Species.ABRA]; const defaultBiome = Biome.VOLCANO; const defaultWave = 45; @@ -37,6 +40,7 @@ describe("Fiery Fallout - Mystery Encounter", () => { game.override.mysteryEncounterChance(100); game.override.startingWave(defaultWave); game.override.startingBiome(defaultBiome); + game.override.trainerWave(false); vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue( new Map([ @@ -168,12 +172,12 @@ describe("Fiery Fallout - Mystery Encounter", () => { && (m as PokemonHeldItemModifier).pokemonId === leadPokemonId, true) as PokemonHeldItemModifier[]; const charcoal = leadPokemonItems.find(i => i.type.name === "Charcoal"); expect(charcoal).toBeDefined; - }); + }, 100000000); }); describe("Option 2 - Suffer the weather", () => { it("should have the correct properties", () => { - const option1 = FieryFalloutEncounter.options[0]; + const option1 = FieryFalloutEncounter.options[1]; expect(option1.optionMode).toBe(EncounterOptionMode.DEFAULT); expect(option1.dialogue).toBeDefined(); expect(option1.dialogue).toStrictEqual({ @@ -187,32 +191,32 @@ describe("Fiery Fallout - Mystery Encounter", () => { }); }); - it("should damage all (allowed in battle) party PKM by 25%", async () => { - game.override.startingWave(33); - + it("should damage all non-fire party PKM by 20% and randomly burn 1", async () => { await game.runToMysteryEncounter(defaultParty); const party = scene.getParty(); + const lapras = party.find((pkm) => pkm.species.speciesId === Species.LAPRAS); + lapras.status = new Status(StatusEffect.POISON); const abra = party.find((pkm) => pkm.species.speciesId === Species.ABRA); vi.spyOn(abra, "isAllowedInBattle").mockReturnValue(false); - await runSelectMysteryEncounterOption(game, 3); + await runSelectMysteryEncounterOption(game, 2); - const allowedPkm = party.filter((pkm) => pkm.isAllowedInBattle()); - const notAllowedPkm = party.filter((pkm) => !pkm.isAllowedInBattle()); - allowedPkm.forEach((pkm) => - expect(pkm.hp, `${pkm.name} should have receivd 25% damage: ${pkm.hp} / ${pkm.getMaxHp()} HP`).toBe(pkm.getMaxHp() - Math.floor(pkm.getMaxHp() * 0.25)) - ); - - notAllowedPkm.forEach((pkm) => expect(pkm.hp, `${pkm.name} should be full hp: ${pkm.hp} / ${pkm.getMaxHp()} HP`).toBe(pkm.getMaxHp())); + const burnablePokemon = party.filter((pkm) => pkm.isAllowedInBattle() && !pkm.getTypes().includes(Type.FIRE)); + const notBurnablePokemon = party.filter((pkm) => !pkm.isAllowedInBattle() || pkm.getTypes().includes(Type.FIRE)); + expect(scene.currentBattle.mysteryEncounter.dialogueTokens["burnedPokemon"]).toBe("Gengar"); + burnablePokemon.forEach((pkm) => { + expect(pkm.hp, `${pkm.name} should have received 20% damage: ${pkm.hp} / ${pkm.getMaxHp()} HP`).toBe(pkm.getMaxHp() - Math.floor(pkm.getMaxHp() * 0.2)); + }); + expect(burnablePokemon.some(pkm => pkm?.status?.effect === StatusEffect.BURN)).toBeTruthy(); + notBurnablePokemon.forEach((pkm) => expect(pkm.hp, `${pkm.name} should be full hp: ${pkm.hp} / ${pkm.getMaxHp()} HP`).toBe(pkm.getMaxHp())); }); it("should leave encounter without battle", async () => { - game.override.startingWave(33); const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); await game.runToMysteryEncounter(defaultParty); - await runSelectMysteryEncounterOption(game, 3); + await runSelectMysteryEncounterOption(game, 2); expect(leaveEncounterWithoutBattleSpy).toBeCalled(); }); @@ -220,42 +224,36 @@ describe("Fiery Fallout - Mystery Encounter", () => { describe("Option 3 - use FIRE types", () => { it("should have the correct properties", () => { - const option1 = FieryFalloutEncounter.options[0]; - expect(option1.optionMode).toBe(EncounterOptionMode.DEFAULT); + const option1 = FieryFalloutEncounter.options[2]; + expect(option1.optionMode).toBe(EncounterOptionMode.DISABLED_OR_SPECIAL); expect(option1.dialogue).toBeDefined(); expect(option1.dialogue).toStrictEqual({ - buttonLabel: `${namespace}:option:1:label`, - buttonTooltip: `${namespace}:option:1:tooltip`, + buttonLabel: `${namespace}:option:3:label`, + buttonTooltip: `${namespace}:option:3:tooltip`, + disabledButtonTooltip: `${namespace}:option:3:disabled_tooltip`, selected: [ { - text: `${namespace}:option:1:selected`, + text: `${namespace}:option:3:selected`, }, ], }); }); - it("should damage all (allowed in battle) party PKM by 25%", async () => { - game.override.startingWave(33); - + it("should give charcoal to lead pokemon", async () => { await game.runToMysteryEncounter(defaultParty); - - const party = scene.getParty(); - const abra = party.find((pkm) => pkm.species.speciesId === Species.ABRA); - vi.spyOn(abra, "isAllowedInBattle").mockReturnValue(false); - await runSelectMysteryEncounterOption(game, 3); + // await skipBattleRunMysteryEncounterRewardsPhase(game); + await game.phaseInterceptor.to(SelectModifierPhase, false); + expect(scene.getCurrentPhase().constructor.name).toBe(SelectModifierPhase.name); - const allowedPkm = party.filter((pkm) => pkm.isAllowedInBattle()); - const notAllowedPkm = party.filter((pkm) => !pkm.isAllowedInBattle()); - allowedPkm.forEach((pkm) => - expect(pkm.hp, `${pkm.name} should have receivd 25% damage: ${pkm.hp} / ${pkm.getMaxHp()} HP`).toBe(pkm.getMaxHp() - Math.floor(pkm.getMaxHp() * 0.25)) - ); - - notAllowedPkm.forEach((pkm) => expect(pkm.hp, `${pkm.name} should be full hp: ${pkm.hp} / ${pkm.getMaxHp()} HP`).toBe(pkm.getMaxHp())); + const leadPokemonId = scene.getParty()?.[0].id; + const leadPokemonItems = scene.findModifiers(m => m instanceof PokemonHeldItemModifier + && (m as PokemonHeldItemModifier).pokemonId === leadPokemonId, true) as PokemonHeldItemModifier[]; + const charcoal = leadPokemonItems.find(i => i.type.name === "Charcoal"); + expect(charcoal).toBeDefined; }); it("should leave encounter without battle", async () => { - game.override.startingWave(33); const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); await game.runToMysteryEncounter(defaultParty); 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 b614a400143..99b1c8b4764 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 @@ -31,6 +31,7 @@ describe("Lost at Sea - Mystery Encounter", () => { game.override.mysteryEncounterChance(100); game.override.startingWave(defaultWave); game.override.startingBiome(defaultBiome); + game.override.trainerWave(false); vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue( new Map([ diff --git a/src/test/mystery-encounter/mystery-encounter.test.ts b/src/test/mystery-encounter/mystery-encounter.test.ts index b840302278e..cadca89b5e8 100644 --- a/src/test/mystery-encounter/mystery-encounter.test.ts +++ b/src/test/mystery-encounter/mystery-encounter.test.ts @@ -24,6 +24,7 @@ describe("Mystery Encounters", () => { game.override.startingWave(11); game.override.mysteryEncounterChance(100); game.override.mysteryEncounter(MysteryEncounterType.MYSTERIOUS_CHALLENGERS); + game.override.trainerWave(false); }); it("Spawns a mystery encounter", async () => { diff --git a/src/test/utils/overridesHelper.ts b/src/test/utils/overridesHelper.ts index 85d458bf826..97caeafd7a6 100644 --- a/src/test/utils/overridesHelper.ts +++ b/src/test/utils/overridesHelper.ts @@ -60,6 +60,17 @@ export class OverridesHelper { return spy; } + /** + * Override each wave to have or not have standard trainer battles + * @returns spy instance + * @param isTrainer + */ + trainerWave(isTrainer: boolean): MockInstance { + const spy = vi.spyOn(this.game.scene.gameMode, "isWaveTrainer").mockReturnValue(isTrainer); + this.log(`${isTrainer? "forcing" : "ignoring"} trainer waves!`); + return spy; + } + /** * Override the weather (type) * @param type weather type to set From 670013a1076562698db6220777577d65772d0c4f Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Fri, 19 Jul 2024 15:33:07 -0400 Subject: [PATCH 186/270] bug fix for empty modifier shop --- src/phases.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/phases.ts b/src/phases.ts index bbf3115e671..22a7b8bdd98 100644 --- a/src/phases.ts +++ b/src/phases.ts @@ -5386,10 +5386,10 @@ export class SelectModifierPhase extends BattlePhase { return true; case 1: if (typeOptions.length === 0) { - this.scene.ui.revertMode(); + this.scene.ui.clearText(); this.scene.ui.setMode(Mode.MESSAGE); super.end(); - return; + return true; } modifierType = typeOptions[cursor].type; break; From 9e96ee84c5fcdbb1b68696892c3581f086f48021 Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Fri, 19 Jul 2024 16:26:34 -0400 Subject: [PATCH 187/270] stash working changes --- .../mystery-encounters/berry_juice.json | 41 ++++ .../images/mystery-encounters/berry_juice.png | Bin 0 -> 318 bytes .../encounters/one-for-all-encounter.ts | 217 ++++++++++++++++++ .../encounters/sleeping-snorlax-encounter.ts | 1 + .../utils/encounter-phase-utils.ts | 8 + .../utils/encounter-pokemon-utils.ts | 4 + src/field/pokemon.ts | 4 + src/overrides.ts | 4 +- src/phases.ts | 1 + 9 files changed, 278 insertions(+), 2 deletions(-) create mode 100644 public/images/mystery-encounters/berry_juice.json create mode 100644 public/images/mystery-encounters/berry_juice.png create mode 100644 src/data/mystery-encounters/encounters/one-for-all-encounter.ts diff --git a/public/images/mystery-encounters/berry_juice.json b/public/images/mystery-encounters/berry_juice.json new file mode 100644 index 00000000000..88242213344 --- /dev/null +++ b/public/images/mystery-encounters/berry_juice.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "berry_juice.png", + "format": "RGBA8888", + "size": { + "w": 24, + "h": 23 + }, + "scale": 1, + "frames": [ + { + "filename": "Bag_Berry_Juice_Sprite.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 24, + "h": 24 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 22, + "h": 21 + }, + "frame": { + "x": 1, + "y": 1, + "w": 22, + "h": 21 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:04685a0eb6ef9095824b65408ec1b38f:9891674d538df100fcddde29330c21ae:927f117bdb1c2a27226a5540ce00ee8b$" + } +} diff --git a/public/images/mystery-encounters/berry_juice.png b/public/images/mystery-encounters/berry_juice.png new file mode 100644 index 0000000000000000000000000000000000000000..c0986b804f9ff176b4c5f0fb09e49d829f7ccd68 GIT binary patch literal 318 zcmeAS@N?(olHy`uVBq!ia0vp^5dmR!KK*shpv+vr1Zd!JR$t)%Tk3Y|hC38E9K7xbKjbyLUv(`U$f`BaU8KWAJ!~ z>XY^@w$fb%7 literal 0 HcmV?d00001 diff --git a/src/data/mystery-encounters/encounters/one-for-all-encounter.ts b/src/data/mystery-encounters/encounters/one-for-all-encounter.ts new file mode 100644 index 00000000000..a07bec924a9 --- /dev/null +++ b/src/data/mystery-encounters/encounters/one-for-all-encounter.ts @@ -0,0 +1,217 @@ +import { BattleStat } from "#app/data/battle-stat"; +import { EncounterOptionMode, MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; +import { + EnemyPartyConfig, EnemyPokemonConfig, + initBattleWithEnemyConfig, + leaveEncounterWithoutBattle, + setEncounterRewards +} from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { STEALING_MOVES } from "#app/data/mystery-encounters/requirements/requirement-groups"; +import Pokemon from "#app/field/pokemon"; +import { ModifierTier } from "#app/modifier/modifier-tier"; +import { + getPartyLuckValue, + getPlayerModifierTypeOptions, + ModifierPoolType, + ModifierTypeOption, + regenerateModifierPoolThresholds, +} from "#app/modifier/modifier-type"; +import { StatChangePhase } from "#app/phases"; +import { randSeedInt } from "#app/utils"; +import { BattlerTagType } from "#enums/battler-tag-type"; +import { MysteryEncounterType } from "#enums/mystery-encounter-type"; +import BattleScene from "../../../battle-scene"; +import IMysteryEncounter, { + MysteryEncounterBuilder, + MysteryEncounterTier, +} from "../mystery-encounter"; +import { MoveRequirement } from "../mystery-encounter-requirements"; +import { queueEncounterMessage, showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; +import { getPokemonSpecies } from "#app/data/pokemon-species"; +import { Species } from "#enums/species"; +import { StatusEffect } from "#app/data/status-effect"; + +/** the i18n namespace for the encounter */ +const namespace = "mysteryEncounter:oneForAll"; + +export const OneForAllEncounter: IMysteryEncounter = + MysteryEncounterBuilder.withEncounterType( + MysteryEncounterType.FIGHT_OR_FLIGHT + ) + .withEncounterTier(MysteryEncounterTier.COMMON) + .withSceneWaveRangeRequirement(10, 180) // waves 10 to 180 + .withHideWildIntroMessage(true) + .withIntroSpriteConfigs([ + { + spriteKey: Species.SHUCKLE.toString(), + fileRoot: "pokemon", + hasShadow: true, + repeat: true, + scale: 2 + }, + { + spriteKey: "berry_juice", + fileRoot: "mystery-encounters", + hasShadow: true, + scale: 2 + }, + ]) // Set in onInit() + .withIntroDialogue([ + { + text: `${namespace}_intro_message`, + }, + ]) + .withOnInit((scene: BattleScene) => { + const encounter = scene.currentBattle.mysteryEncounter; + + // Calculate boss mon + const bossSpecies = scene.arena.randomSpecies(scene.currentBattle.waveIndex, scene.currentBattle.waveIndex, 0, getPartyLuckValue(scene.getParty()), true); + const config: EnemyPartyConfig = { + levelAdditiveMultiplier: 1, + pokemonConfigs: [{ species: bossSpecies, isBoss: true }], + }; + encounter.enemyPartyConfigs = [config]; + + // Calculate item + // 10-60 GREAT, 60-110 ULTRA, 110-160 ROGUE, 160-180 MASTER + const tier = + scene.currentBattle.waveIndex > 160 + ? ModifierTier.MASTER + : scene.currentBattle.waveIndex > 110 + ? ModifierTier.ROGUE + : scene.currentBattle.waveIndex > 60 + ? ModifierTier.ULTRA + : ModifierTier.GREAT; + regenerateModifierPoolThresholds(scene.getParty(), ModifierPoolType.PLAYER, 0); + const item = getPlayerModifierTypeOptions(1, scene.getParty(), [], { guaranteedModifierTiers: [tier] })[0]; + encounter.setDialogueToken("itemName", item.type.name); + encounter.misc = item; + + const bossSpriteKey = bossSpecies.getSpriteId(false, bossSpecies.forms ? 0 : null, false, bossSpecies.hasVariants() ? 0 : null); + encounter.spriteConfigs = [ + { + spriteKey: item.type.iconImage, + fileRoot: "items", + hasShadow: false, + x: 35, + y: -5, + scale: 0.75, + isItem: true, + }, + { + spriteKey: bossSpriteKey, + fileRoot: "pokemon", + hasShadow: true, + tint: 0.25, + x: -5, + repeat: true, + }, + ]; + + // If player has a stealing move, they succeed automatically + encounter.options[1].meetsRequirements(scene); + const primaryPokemon = encounter.options[1].primaryPokemon; + if (primaryPokemon) { + // Use primaryPokemon to execute the thievery + encounter.options[1].dialogue.buttonTooltip = `${namespace}_option_2_steal_tooltip`; + } else { + encounter.options[1].dialogue.buttonTooltip = `${namespace}_option_2_tooltip`; + } + + return true; + }) + .withTitle(`${namespace}_title`) + .withDescription(`${namespace}_description`) + .withQuery(`${namespace}_query`) + .withSimpleOption( + { + buttonLabel: `${namespace}_option_1_label`, + buttonTooltip: `${namespace}_option_1_tooltip`, + selected: [ + { + text: `${namespace}_option_1_selected_message`, + }, + ], + }, + async (scene: BattleScene) => { + // Pick battle + const encounter = scene.currentBattle.mysteryEncounter; + const bossSpecies = getPokemonSpecies(Species.SNORLAX); + const pokemonConfig: EnemyPokemonConfig = { + species: bossSpecies, + isBoss: true, + status: StatusEffect.SLEEP, + }; + const config: EnemyPartyConfig = { + levelAdditiveMultiplier: 2, + pokemonConfigs: [pokemonConfig], + }; + encounter.enemyPartyConfigs = [config]; + + const item = scene.currentBattle.mysteryEncounter + .misc as ModifierTypeOption; + setEncounterRewards(scene, { guaranteedModifierTypeOptions: [item], fillRemaining: false }); + await initBattleWithEnemyConfig(scene, scene.currentBattle.mysteryEncounter.enemyPartyConfigs[0]); + } + ) + .withOption( + new MysteryEncounterOptionBuilder() + .withOptionMode(EncounterOptionMode.DEFAULT_OR_SPECIAL) + .withPrimaryPokemonRequirement(new MoveRequirement(STEALING_MOVES)) // Will set option2PrimaryName and option2PrimaryMove dialogue tokens automatically + .withDialogue({ + buttonLabel: `${namespace}_option_2_label`, + buttonTooltip: `${namespace}_option_2_tooltip`, + }) + .withOptionPhase(async (scene: BattleScene) => { + // Pick steal + const encounter = scene.currentBattle.mysteryEncounter; + const item = scene.currentBattle.mysteryEncounter.misc as ModifierTypeOption; + setEncounterRewards(scene, { guaranteedModifierTypeOptions: [item], fillRemaining: false }); + + // If player has a stealing move, they succeed automatically + const primaryPokemon = encounter.options[1].primaryPokemon; + if (primaryPokemon) { + // Use primaryPokemon to execute the thievery + await showEncounterText(scene, `${namespace}_option_2_steal_result`); + leaveEncounterWithoutBattle(scene); + return; + } + + const roll = randSeedInt(16); + if (roll > 6) { + // Noticed and attacked by boss, gets +1 to all stats at start of fight (62.5%) + const config = scene.currentBattle.mysteryEncounter.enemyPartyConfigs[0]; + config.pokemonConfigs[0].tags = [BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON]; + config.pokemonConfigs[0].mysteryEncounterBattleEffects = (pokemon: Pokemon) => { + pokemon.scene.currentBattle.mysteryEncounter.setDialogueToken("enemyPokemon", pokemon.name); + queueEncounterMessage(pokemon.scene, `${namespace}_boss_enraged`); + pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [BattleStat.ATK, BattleStat.DEF, BattleStat.SPATK, BattleStat.SPDEF, BattleStat.SPD], 1)); + }; + await showEncounterText(scene, `${namespace}_option_2_bad_result`); + await initBattleWithEnemyConfig(scene, config); + } else { + // Steal item (37.5%) + // Display result message then proceed to rewards + await showEncounterText(scene, `${namespace}_option_2_good_result`); + leaveEncounterWithoutBattle(scene); + } + }) + .build() + ) + .withSimpleOption( + { + buttonLabel: `${namespace}_option_3_label`, + buttonTooltip: `${namespace}_option_3_tooltip`, + selected: [ + { + text: `${namespace}_option_3_selected`, + }, + ], + }, + async (scene: BattleScene) => { + // Leave encounter with no rewards or exp + leaveEncounterWithoutBattle(scene, true); + return true; + } + ) + .build(); diff --git a/src/data/mystery-encounters/encounters/sleeping-snorlax-encounter.ts b/src/data/mystery-encounters/encounters/sleeping-snorlax-encounter.ts index 9d3659f9443..0bb7f4bfd52 100644 --- a/src/data/mystery-encounters/encounters/sleeping-snorlax-encounter.ts +++ b/src/data/mystery-encounters/encounters/sleeping-snorlax-encounter.ts @@ -50,6 +50,7 @@ export const SleepingSnorlaxEncounter: IMysteryEncounter = species: bossSpecies, isBoss: true, status: StatusEffect.SLEEP, + spriteScale: 1.5 }; const config: EnemyPartyConfig = { levelAdditiveMultiplier: 2, diff --git a/src/data/mystery-encounters/utils/encounter-phase-utils.ts b/src/data/mystery-encounters/utils/encounter-phase-utils.ts index ffaf11b8219..8ad022f881c 100644 --- a/src/data/mystery-encounters/utils/encounter-phase-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-phase-utils.ts @@ -40,6 +40,7 @@ export class EnemyPokemonConfig { mysteryEncounterBattleEffects?: (pokemon: Pokemon) => void; status?: StatusEffect; passive?: boolean; + spriteScale?: number; } export class EnemyPartyConfig { @@ -162,6 +163,13 @@ export async function initBattleWithEnemyConfig(scene: BattleScene, partyConfig: enemyPokemon.formIndex = config.formIndex; } + // Set scale + if (!isNullOrUndefined(config.spriteScale)) { + enemyPokemon.mysteryEncounterData = { + spriteScale: config.spriteScale + }; + } + // Set Boss if (config.isBoss) { let segments = !isNullOrUndefined(config.bossSegments) ? config.bossSegments : scene.getEncounterBossSegments(scene.currentBattle.waveIndex, level, enemySpecies, true); diff --git a/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts b/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts index fdbb957161f..48bfbb183e4 100644 --- a/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts @@ -17,6 +17,10 @@ import { Type } from "#app/data/type"; import PokemonSpecies, { getPokemonSpecies, speciesStarters } from "#app/data/pokemon-species"; import { showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; +export interface MysteryEncounterPokemonData { + spriteScale?: number +} + /** * * Will never remove the player's last non-fainted Pokemon (if they only have 1) diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index ebae5fe8122..5eea5d9c4b7 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -50,6 +50,7 @@ import { BerryType } from "#enums/berry-type"; import { Biome } from "#enums/biome"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; +import { MysteryEncounterPokemonData } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; export enum FieldPosition { CENTER, @@ -100,6 +101,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { public battleData: PokemonBattleData; public battleSummonData: PokemonBattleSummonData; public turnData: PokemonTurnData; + public mysteryEncounterData: MysteryEncounterPokemonData; public fieldPosition: FieldPosition; @@ -521,6 +523,8 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { const formKey = this.getFormKey(); if (formKey.indexOf(SpeciesFormKey.GIGANTAMAX) > -1 || formKey.indexOf(SpeciesFormKey.ETERNAMAX) > -1) { return 1.5; + } else if (this?.mysteryEncounterData?.spriteScale) { + return this.mysteryEncounterData.spriteScale; } return 1; } diff --git a/src/overrides.ts b/src/overrides.ts index e19a5bf20dd..7272f68bcb4 100644 --- a/src/overrides.ts +++ b/src/overrides.ts @@ -117,9 +117,9 @@ export const EGG_GACHA_PULL_COUNT_OVERRIDE: number = 0; */ // 1 to 256, set to null to ignore -export const MYSTERY_ENCOUNTER_RATE_OVERRIDE: number = null; +export const MYSTERY_ENCOUNTER_RATE_OVERRIDE: number = 256; export const MYSTERY_ENCOUNTER_TIER_OVERRIDE: MysteryEncounterTier = null; -export const MYSTERY_ENCOUNTER_OVERRIDE: MysteryEncounterType = null; +export const MYSTERY_ENCOUNTER_OVERRIDE: MysteryEncounterType = MysteryEncounterType.SLEEPING_SNORLAX; /** * MODIFIER / ITEM OVERRIDES diff --git a/src/phases.ts b/src/phases.ts index f98c914e320..c0ecea19eb7 100644 --- a/src/phases.ts +++ b/src/phases.ts @@ -1667,6 +1667,7 @@ export class SummonPhase extends PartyMemberPokemonPhase { pokemon.cry(pokemon.getHpRatio() > 0.25 ? undefined : { rate: 0.85 }); pokemon.getSprite().clearTint(); pokemon.resetSummonData(); + this.scene.updateFieldScale(); this.scene.time.delayedCall(1000, () => this.end()); } }); From b6793ea50fffb4c7b0df82cb765cf39c93475e97 Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Fri, 19 Jul 2024 17:20:39 -0400 Subject: [PATCH 188/270] stash changes --- .../juiced_shuckle-juice-encounter.ts | 122 ++++++++++ .../encounters/one-for-all-encounter.ts | 217 ------------------ .../utils/encounter-phase-utils.ts | 21 +- src/enums/mystery-encounter-type.ts | 3 +- 4 files changed, 141 insertions(+), 222 deletions(-) create mode 100644 src/data/mystery-encounters/encounters/juiced_shuckle-juice-encounter.ts delete mode 100644 src/data/mystery-encounters/encounters/one-for-all-encounter.ts diff --git a/src/data/mystery-encounters/encounters/juiced_shuckle-juice-encounter.ts b/src/data/mystery-encounters/encounters/juiced_shuckle-juice-encounter.ts new file mode 100644 index 00000000000..e30e3612761 --- /dev/null +++ b/src/data/mystery-encounters/encounters/juiced_shuckle-juice-encounter.ts @@ -0,0 +1,122 @@ +import { EnemyPartyConfig, initBattleWithEnemyConfig, leaveEncounterWithoutBattle, setEncounterRewards } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { modifierTypes, } from "#app/modifier/modifier-type"; +import { MysteryEncounterType } from "#enums/mystery-encounter-type"; +import BattleScene from "../../../battle-scene"; +import IMysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier, } from "../mystery-encounter"; +import { getPokemonSpecies } from "#app/data/pokemon-species"; +import { Species } from "#enums/species"; +import { Nature } from "#app/data/nature"; + +/** the i18n namespace for the encounter */ +const namespace = "mysteryEncounter:oneForAll"; + +export const JuicedShuckleJuiceEncounter: IMysteryEncounter = + MysteryEncounterBuilder.withEncounterType( + MysteryEncounterType.JUICED_SHUCKLE_JUICE + ) + .withEncounterTier(MysteryEncounterTier.COMMON) + .withSceneWaveRangeRequirement(10, 180) // waves 10 to 180 + .withHideWildIntroMessage(true) + .withIntroSpriteConfigs([ + { + spriteKey: Species.SHUCKLE.toString(), + fileRoot: "pokemon", + hasShadow: true, + repeat: true, + scale: 2 + }, + { + spriteKey: "berry_juice", + fileRoot: "mystery-encounters", + hasShadow: true, + scale: 2 + }, + ]) // Set in onInit() + .withIntroDialogue([ + { + text: `${namespace}_intro_message`, + }, + ]) + .withOnInit((scene: BattleScene) => { + const encounter = scene.currentBattle.mysteryEncounter; + + // Calculate boss mon + const config: EnemyPartyConfig = { + levelAdditiveMultiplier: 1, + pokemonConfigs: [ + { + species: getPokemonSpecies(Species.SHUCKLE), + isBoss: true, + bossSegments: 5, + spriteScale: 2, + nature: Nature.BOLD, + // moves: [Moves.INFESTATION, Moves.SALT_CURE, Moves.STEALTH_ROCK, Moves.RECOVER] + } + ], + }; + encounter.enemyPartyConfigs = [config]; + + return true; + }) + .withTitle(`${namespace}_title`) + .withDescription(`${namespace}_description`) + .withQuery(`${namespace}_query`) + .withSimpleOption( + { + buttonLabel: `${namespace}_option_1_label`, + buttonTooltip: `${namespace}_option_1_tooltip`, + selected: [ + { + text: `${namespace}_option_1_selected`, + }, + ], + }, + async (scene: BattleScene) => { + // Leave encounter with no rewards or exp + // const encounter = scene.currentBattle.mysteryEncounter; + + // Get highest BST mon + const party = scene.getParty(); + let highestBst = null; + let statTotal = 0; + for (const pokemon of party) { + if (!highestBst) { + highestBst = pokemon; + statTotal = pokemon.summonData.stats.reduce((i, n) => n + i); + continue; + } + + const total = pokemon.summonData.stats.reduce((i, n) => n + i); + if (total > statTotal) { + highestBst = pokemon; + statTotal = total; + } + } + + if (!highestBst) { + highestBst = party[0]; + } + + + + leaveEncounterWithoutBattle(scene, true); + return true; + } + ) + .withSimpleOption( + { + buttonLabel: `${namespace}_option_2_label`, + buttonTooltip: `${namespace}_option_2_tooltip`, + selected: [ + { + text: `${namespace}_option_2_selected_message`, + }, + ], + }, + async (scene: BattleScene) => { + // Pick battle + setEncounterRewards(scene, { guaranteedModifierTypeFuncs: [modifierTypes.SOUL_DEW], fillRemaining: true }); + await initBattleWithEnemyConfig(scene, scene.currentBattle.mysteryEncounter.enemyPartyConfigs[0]); + } + ) + .build(); diff --git a/src/data/mystery-encounters/encounters/one-for-all-encounter.ts b/src/data/mystery-encounters/encounters/one-for-all-encounter.ts deleted file mode 100644 index a07bec924a9..00000000000 --- a/src/data/mystery-encounters/encounters/one-for-all-encounter.ts +++ /dev/null @@ -1,217 +0,0 @@ -import { BattleStat } from "#app/data/battle-stat"; -import { EncounterOptionMode, MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; -import { - EnemyPartyConfig, EnemyPokemonConfig, - initBattleWithEnemyConfig, - leaveEncounterWithoutBattle, - setEncounterRewards -} from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import { STEALING_MOVES } from "#app/data/mystery-encounters/requirements/requirement-groups"; -import Pokemon from "#app/field/pokemon"; -import { ModifierTier } from "#app/modifier/modifier-tier"; -import { - getPartyLuckValue, - getPlayerModifierTypeOptions, - ModifierPoolType, - ModifierTypeOption, - regenerateModifierPoolThresholds, -} from "#app/modifier/modifier-type"; -import { StatChangePhase } from "#app/phases"; -import { randSeedInt } from "#app/utils"; -import { BattlerTagType } from "#enums/battler-tag-type"; -import { MysteryEncounterType } from "#enums/mystery-encounter-type"; -import BattleScene from "../../../battle-scene"; -import IMysteryEncounter, { - MysteryEncounterBuilder, - MysteryEncounterTier, -} from "../mystery-encounter"; -import { MoveRequirement } from "../mystery-encounter-requirements"; -import { queueEncounterMessage, showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; -import { getPokemonSpecies } from "#app/data/pokemon-species"; -import { Species } from "#enums/species"; -import { StatusEffect } from "#app/data/status-effect"; - -/** the i18n namespace for the encounter */ -const namespace = "mysteryEncounter:oneForAll"; - -export const OneForAllEncounter: IMysteryEncounter = - MysteryEncounterBuilder.withEncounterType( - MysteryEncounterType.FIGHT_OR_FLIGHT - ) - .withEncounterTier(MysteryEncounterTier.COMMON) - .withSceneWaveRangeRequirement(10, 180) // waves 10 to 180 - .withHideWildIntroMessage(true) - .withIntroSpriteConfigs([ - { - spriteKey: Species.SHUCKLE.toString(), - fileRoot: "pokemon", - hasShadow: true, - repeat: true, - scale: 2 - }, - { - spriteKey: "berry_juice", - fileRoot: "mystery-encounters", - hasShadow: true, - scale: 2 - }, - ]) // Set in onInit() - .withIntroDialogue([ - { - text: `${namespace}_intro_message`, - }, - ]) - .withOnInit((scene: BattleScene) => { - const encounter = scene.currentBattle.mysteryEncounter; - - // Calculate boss mon - const bossSpecies = scene.arena.randomSpecies(scene.currentBattle.waveIndex, scene.currentBattle.waveIndex, 0, getPartyLuckValue(scene.getParty()), true); - const config: EnemyPartyConfig = { - levelAdditiveMultiplier: 1, - pokemonConfigs: [{ species: bossSpecies, isBoss: true }], - }; - encounter.enemyPartyConfigs = [config]; - - // Calculate item - // 10-60 GREAT, 60-110 ULTRA, 110-160 ROGUE, 160-180 MASTER - const tier = - scene.currentBattle.waveIndex > 160 - ? ModifierTier.MASTER - : scene.currentBattle.waveIndex > 110 - ? ModifierTier.ROGUE - : scene.currentBattle.waveIndex > 60 - ? ModifierTier.ULTRA - : ModifierTier.GREAT; - regenerateModifierPoolThresholds(scene.getParty(), ModifierPoolType.PLAYER, 0); - const item = getPlayerModifierTypeOptions(1, scene.getParty(), [], { guaranteedModifierTiers: [tier] })[0]; - encounter.setDialogueToken("itemName", item.type.name); - encounter.misc = item; - - const bossSpriteKey = bossSpecies.getSpriteId(false, bossSpecies.forms ? 0 : null, false, bossSpecies.hasVariants() ? 0 : null); - encounter.spriteConfigs = [ - { - spriteKey: item.type.iconImage, - fileRoot: "items", - hasShadow: false, - x: 35, - y: -5, - scale: 0.75, - isItem: true, - }, - { - spriteKey: bossSpriteKey, - fileRoot: "pokemon", - hasShadow: true, - tint: 0.25, - x: -5, - repeat: true, - }, - ]; - - // If player has a stealing move, they succeed automatically - encounter.options[1].meetsRequirements(scene); - const primaryPokemon = encounter.options[1].primaryPokemon; - if (primaryPokemon) { - // Use primaryPokemon to execute the thievery - encounter.options[1].dialogue.buttonTooltip = `${namespace}_option_2_steal_tooltip`; - } else { - encounter.options[1].dialogue.buttonTooltip = `${namespace}_option_2_tooltip`; - } - - return true; - }) - .withTitle(`${namespace}_title`) - .withDescription(`${namespace}_description`) - .withQuery(`${namespace}_query`) - .withSimpleOption( - { - buttonLabel: `${namespace}_option_1_label`, - buttonTooltip: `${namespace}_option_1_tooltip`, - selected: [ - { - text: `${namespace}_option_1_selected_message`, - }, - ], - }, - async (scene: BattleScene) => { - // Pick battle - const encounter = scene.currentBattle.mysteryEncounter; - const bossSpecies = getPokemonSpecies(Species.SNORLAX); - const pokemonConfig: EnemyPokemonConfig = { - species: bossSpecies, - isBoss: true, - status: StatusEffect.SLEEP, - }; - const config: EnemyPartyConfig = { - levelAdditiveMultiplier: 2, - pokemonConfigs: [pokemonConfig], - }; - encounter.enemyPartyConfigs = [config]; - - const item = scene.currentBattle.mysteryEncounter - .misc as ModifierTypeOption; - setEncounterRewards(scene, { guaranteedModifierTypeOptions: [item], fillRemaining: false }); - await initBattleWithEnemyConfig(scene, scene.currentBattle.mysteryEncounter.enemyPartyConfigs[0]); - } - ) - .withOption( - new MysteryEncounterOptionBuilder() - .withOptionMode(EncounterOptionMode.DEFAULT_OR_SPECIAL) - .withPrimaryPokemonRequirement(new MoveRequirement(STEALING_MOVES)) // Will set option2PrimaryName and option2PrimaryMove dialogue tokens automatically - .withDialogue({ - buttonLabel: `${namespace}_option_2_label`, - buttonTooltip: `${namespace}_option_2_tooltip`, - }) - .withOptionPhase(async (scene: BattleScene) => { - // Pick steal - const encounter = scene.currentBattle.mysteryEncounter; - const item = scene.currentBattle.mysteryEncounter.misc as ModifierTypeOption; - setEncounterRewards(scene, { guaranteedModifierTypeOptions: [item], fillRemaining: false }); - - // If player has a stealing move, they succeed automatically - const primaryPokemon = encounter.options[1].primaryPokemon; - if (primaryPokemon) { - // Use primaryPokemon to execute the thievery - await showEncounterText(scene, `${namespace}_option_2_steal_result`); - leaveEncounterWithoutBattle(scene); - return; - } - - const roll = randSeedInt(16); - if (roll > 6) { - // Noticed and attacked by boss, gets +1 to all stats at start of fight (62.5%) - const config = scene.currentBattle.mysteryEncounter.enemyPartyConfigs[0]; - config.pokemonConfigs[0].tags = [BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON]; - config.pokemonConfigs[0].mysteryEncounterBattleEffects = (pokemon: Pokemon) => { - pokemon.scene.currentBattle.mysteryEncounter.setDialogueToken("enemyPokemon", pokemon.name); - queueEncounterMessage(pokemon.scene, `${namespace}_boss_enraged`); - pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [BattleStat.ATK, BattleStat.DEF, BattleStat.SPATK, BattleStat.SPDEF, BattleStat.SPD], 1)); - }; - await showEncounterText(scene, `${namespace}_option_2_bad_result`); - await initBattleWithEnemyConfig(scene, config); - } else { - // Steal item (37.5%) - // Display result message then proceed to rewards - await showEncounterText(scene, `${namespace}_option_2_good_result`); - leaveEncounterWithoutBattle(scene); - } - }) - .build() - ) - .withSimpleOption( - { - buttonLabel: `${namespace}_option_3_label`, - buttonTooltip: `${namespace}_option_3_tooltip`, - selected: [ - { - text: `${namespace}_option_3_selected`, - }, - ], - }, - async (scene: BattleScene) => { - // Leave encounter with no rewards or exp - leaveEncounterWithoutBattle(scene, true); - return true; - } - ) - .build(); diff --git a/src/data/mystery-encounters/utils/encounter-phase-utils.ts b/src/data/mystery-encounters/utils/encounter-phase-utils.ts index 8ad022f881c..92acc65326c 100644 --- a/src/data/mystery-encounters/utils/encounter-phase-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-phase-utils.ts @@ -26,6 +26,7 @@ import PokemonSpecies from "../../pokemon-species"; import { Status, StatusEffect } from "../../status-effect"; import { TrainerConfig, trainerConfigs, TrainerSlot } from "../../trainer-config"; import { MysteryEncounterVariant } from "../mystery-encounter"; +import { Nature } from "#app/data/nature"; export class EnemyPokemonConfig { species: PokemonSpecies; @@ -34,6 +35,8 @@ export class EnemyPokemonConfig { bossSegmentModifier?: number; // Additive to the determined segment number formIndex?: number; level?: number; + nature?: Nature; + ivs?: [integer, integer, integer, integer, integer, integer]; modifierTypes?: PokemonHeldItemModifierType[]; dataSource?: PokemonData; tags?: BattlerTagType[]; @@ -180,15 +183,25 @@ export async function initBattleWithEnemyConfig(scene: BattleScene, partyConfig: } // Set Passive - if (partyConfig.pokemonConfigs[e].passive) { + if (config.passive) { enemyPokemon.passive = true; } + // Set Nature + if (config.nature) { + enemyPokemon.nature = config.nature; + } + + // Set IVs + if (config.ivs) { + enemyPokemon.ivs = config.ivs; + } + // Set Status - if (partyConfig.pokemonConfigs[e].status) { + if (config.status) { // Default to cureturn 3 for sleep - const cureTurn = partyConfig.pokemonConfigs[e].status === StatusEffect.SLEEP ? 3 : null; - enemyPokemon.status = new Status(partyConfig.pokemonConfigs[e].status, 0, cureTurn); + const cureTurn = config.status === StatusEffect.SLEEP ? 3 : null; + enemyPokemon.status = new Status(config.status, 0, cureTurn); } // Set tags diff --git a/src/enums/mystery-encounter-type.ts b/src/enums/mystery-encounter-type.ts index 1f2711cd674..7a9938091c1 100644 --- a/src/enums/mystery-encounter-type.ts +++ b/src/enums/mystery-encounter-type.ts @@ -9,5 +9,6 @@ export enum MysteryEncounterType { SHADY_VITAMIN_DEALER, FIELD_TRIP, SAFARI_ZONE, - LOST_AT_SEA //might be generalized later on + LOST_AT_SEA, //might be generalized later on + JUICED_SHUCKLE_JUICE } From fc7d7092029aa465c41a5f85158bc860b0cd9cd5 Mon Sep 17 00:00:00 2001 From: ImperialSympathizer <110984302+ben-lear@users.noreply.github.com> Date: Fri, 19 Jul 2024 17:24:21 -0400 Subject: [PATCH 189/270] Update src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts Co-authored-by: flx-sta <50131232+flx-sta@users.noreply.github.com> --- .../mystery-encounters/encounters/fiery-fallout-encounter.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts b/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts index 705ba3296a4..96a2fad1b15 100644 --- a/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts +++ b/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts @@ -36,7 +36,7 @@ const DAMAGE_PERCENTAGE: number = 20; export const FieryFalloutEncounter: IMysteryEncounter = MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.FIERY_FALLOUT) .withEncounterTier(MysteryEncounterTier.COMMON) - .withSceneWaveRangeRequirement(40, 180) // waves 10 to 180 + .withSceneWaveRangeRequirement(40, 180) .withCatchAllowed(true) .withIntroSpriteConfigs([]) // Set in onInit() .withAnimations(EncounterAnim.MAGMA_BG, EncounterAnim.MAGMA_SPOUT) From d2874e29ac2c56a071608f9939423783267fc26a Mon Sep 17 00:00:00 2001 From: ImperialSympathizer <110984302+ben-lear@users.noreply.github.com> Date: Fri, 19 Jul 2024 17:24:33 -0400 Subject: [PATCH 190/270] Update src/test/utils/overridesHelper.ts Co-authored-by: flx-sta <50131232+flx-sta@users.noreply.github.com> --- src/test/utils/overridesHelper.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/utils/overridesHelper.ts b/src/test/utils/overridesHelper.ts index 97caeafd7a6..15a8cc9aa99 100644 --- a/src/test/utils/overridesHelper.ts +++ b/src/test/utils/overridesHelper.ts @@ -54,7 +54,7 @@ export class OverridesHelper { * @param wave the wave (index) to set. Classic: `1`-`200` * @returns spy instance */ - startingWave(wave: number): MockInstance { + startingWave(wave: number) { const spy = vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(wave); this.log(`Starting wave set to ${wave}!`); return spy; From 1e7c3b575fa3f699c147390d298319a5965834b6 Mon Sep 17 00:00:00 2001 From: ImperialSympathizer <110984302+ben-lear@users.noreply.github.com> Date: Fri, 19 Jul 2024 17:24:43 -0400 Subject: [PATCH 191/270] Update src/test/utils/overridesHelper.ts Co-authored-by: flx-sta <50131232+flx-sta@users.noreply.github.com> --- src/test/utils/overridesHelper.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/utils/overridesHelper.ts b/src/test/utils/overridesHelper.ts index 15a8cc9aa99..3c341808036 100644 --- a/src/test/utils/overridesHelper.ts +++ b/src/test/utils/overridesHelper.ts @@ -76,7 +76,7 @@ export class OverridesHelper { * @param type weather type to set * @returns spy instance */ - weather(type: WeatherType): MockInstance { + weather(type: WeatherType) { const spy = vi.spyOn(Overrides, "WEATHER_OVERRIDE", "get").mockReturnValue(type); this.log(`Weather set to ${Weather[type]} (=${type})!`); return spy; From 6a697b193eafe9cc37eff818170da01428c2e3e7 Mon Sep 17 00:00:00 2001 From: ImperialSympathizer <110984302+ben-lear@users.noreply.github.com> Date: Fri, 19 Jul 2024 17:24:52 -0400 Subject: [PATCH 192/270] Update src/test/utils/overridesHelper.ts Co-authored-by: flx-sta <50131232+flx-sta@users.noreply.github.com> --- src/test/utils/overridesHelper.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/utils/overridesHelper.ts b/src/test/utils/overridesHelper.ts index 3c341808036..52f53d697ad 100644 --- a/src/test/utils/overridesHelper.ts +++ b/src/test/utils/overridesHelper.ts @@ -87,7 +87,7 @@ export class OverridesHelper { * @param seed the seed to set * @returns spy instance */ - seed(seed: string): MockInstance { + seed(seed: string) { const spy = vi.spyOn(this.game.scene, "resetSeed").mockImplementation(() => { this.game.scene.waveSeed = seed; Phaser.Math.RND.sow([seed]); From f80901f7b94e76f187eb671c85862538a0e15c0f Mon Sep 17 00:00:00 2001 From: ImperialSympathizer <110984302+ben-lear@users.noreply.github.com> Date: Fri, 19 Jul 2024 17:25:03 -0400 Subject: [PATCH 193/270] Update src/test/utils/overridesHelper.ts Co-authored-by: flx-sta <50131232+flx-sta@users.noreply.github.com> --- src/test/utils/overridesHelper.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/utils/overridesHelper.ts b/src/test/utils/overridesHelper.ts index 52f53d697ad..2b60813ef53 100644 --- a/src/test/utils/overridesHelper.ts +++ b/src/test/utils/overridesHelper.ts @@ -20,7 +20,7 @@ export class OverridesHelper { * @param percentage the encounter chance in % * @returns spy instance */ - mysteryEncounterChance(percentage: number): MockInstance { + mysteryEncounterChance(percentage: number) { const maxRate: number = 256; // 100% const rate = maxRate * (percentage / 100); const spy = vi.spyOn(Overrides, "MYSTERY_ENCOUNTER_RATE_OVERRIDE", "get").mockReturnValue(rate); From 12cd014e1163ad318691cbf13615ed9b05393c5a Mon Sep 17 00:00:00 2001 From: ImperialSympathizer <110984302+ben-lear@users.noreply.github.com> Date: Fri, 19 Jul 2024 17:26:18 -0400 Subject: [PATCH 194/270] Update src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts Co-authored-by: flx-sta <50131232+flx-sta@users.noreply.github.com> --- .../mystery-encounters/encounters/fiery-fallout-encounter.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts b/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts index 96a2fad1b15..b99a7092902 100644 --- a/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts +++ b/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts @@ -186,7 +186,8 @@ export const FieryFalloutEncounter: IMysteryEncounter = // Burn random member const burnable = nonFireTypes.filter(p => isNullOrUndefined(p.status) || isNullOrUndefined(p.status.effect) || p.status?.effect === StatusEffect.BURN); if (burnable?.length > 0) { - const chosenPokemon = burnable[randSeedInt(burnable.length - 1)]; + const roll = randSeedInt(burnable.length); + const chosenPokemon = burnable[roll]; if (chosenPokemon.trySetStatus(StatusEffect.BURN)) { // Burn applied encounter.setDialogueToken("burnedPokemon", chosenPokemon.name); From 9bcaf6a336a4ef4be95fc70f364ec820d63f115e Mon Sep 17 00:00:00 2001 From: ImperialSympathizer <110984302+ben-lear@users.noreply.github.com> Date: Fri, 19 Jul 2024 17:26:40 -0400 Subject: [PATCH 195/270] Update src/data/battle-anims.ts Co-authored-by: flx-sta <50131232+flx-sta@users.noreply.github.com> --- src/data/battle-anims.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/data/battle-anims.ts b/src/data/battle-anims.ts index 3f00a012ee3..6f2f293d099 100644 --- a/src/data/battle-anims.ts +++ b/src/data/battle-anims.ts @@ -1038,8 +1038,7 @@ export abstract class BattleAnim { let t = 0; for (const frame of frames) { - let x = frame.x; - let y = frame.y; + let { x , y } = frame; const scaleX = (frame.zoomX / 100) * (!frame.mirror ? 1 : -1); const scaleY = (frame.zoomY / 100); x += targetInitialX; From 186a1af7b82a0da8102a2e4eb3e05b29682ef662 Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Fri, 19 Jul 2024 19:21:46 -0400 Subject: [PATCH 196/270] nit updates and cleanup --- src/battle-scene.ts | 4 +-- src/battle.ts | 2 +- .../mystery-encounters/mystery-encounter.ts | 16 ++++++---- .../fiery-fallout-encounter.test.ts | 32 ++++++++++++++----- .../encounters/lost-at-sea-encounter.test.ts | 31 +++++++++++++----- .../mystery-encounter.test.ts | 12 ++----- .../phases/mystery-encounter-phase.test.ts | 15 ++------- src/test/utils/gameManager.ts | 8 ++++- src/test/utils/overridesHelper.ts | 20 +++++++++--- 9 files changed, 89 insertions(+), 51 deletions(-) diff --git a/src/battle-scene.ts b/src/battle-scene.ts index 9c32c58efdb..4c0f31b051e 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -2650,8 +2650,8 @@ export default class BattleScene extends SceneBase { return encounter; } - // Common / Great / Ultra / Rogue - const tierWeights = [64, 40, 21, 3]; + // See Enum values for base tier weights + const tierWeights = [MysteryEncounterTier.COMMON, MysteryEncounterTier.GREAT, MysteryEncounterTier.ULTRA, MysteryEncounterTier.ROGUE]; // Adjust tier weights by previously encountered events to lower odds of only common/uncommons in run this.mysteryEncounterData.encounteredEvents.forEach(val => { diff --git a/src/battle.ts b/src/battle.ts index 9076eba7d0a..2c033ce38bf 100644 --- a/src/battle.ts +++ b/src/battle.ts @@ -206,7 +206,7 @@ export default class Battle { getBgmOverride(scene: BattleScene): string { const battlers = this.enemyParty.slice(0, this.getBattlerCount()); if (this.battleType === BattleType.TRAINER || this.mysteryEncounter?.encounterVariant === MysteryEncounterVariant.TRAINER_BATTLE) { - if (!this.started && this.trainer?.config?.encounterBgm && this.trainer?.getEncounterMessages()?.length) { + if (!this.started && this.trainer.config.encounterBgm && this.trainer.getEncounterMessages().length) { return `encounter_${this.trainer.getEncounterBgm()}`; } if (scene.musicPreference === 0) { diff --git a/src/data/mystery-encounters/mystery-encounter.ts b/src/data/mystery-encounters/mystery-encounter.ts index 7fc66dfa4e7..6136e338854 100644 --- a/src/data/mystery-encounters/mystery-encounter.ts +++ b/src/data/mystery-encounters/mystery-encounter.ts @@ -27,15 +27,19 @@ export enum MysteryEncounterVariant { WILD_BATTLE, BOSS_BATTLE, NO_BATTLE, + /** For spawning new encounter queries instead of continuing to next wave */ REPEATED_ENCOUNTER } +/** + * Enum values are base spawn weights of each tier + */ export enum MysteryEncounterTier { - COMMON, - GREAT, - ULTRA, - ROGUE, - MASTER // Not currently used + COMMON = 64, + GREAT = 40, + ULTRA = 21, + ROGUE = 3, + MASTER = 0 // Not currently used } export interface StartOfBattleEffect { @@ -438,7 +442,7 @@ export class MysteryEncounterBuilder implements Partial { * @param callback - {@linkcode OptionPhaseCallback} * @returns */ - withSimpleOption(dialogue: OptionTextDisplay, callback: OptionPhaseCallback) { + withSimpleOption(dialogue: OptionTextDisplay, callback: OptionPhaseCallback): this { return this.withOption(new MysteryEncounterOptionBuilder().withOptionMode(EncounterOptionMode.DEFAULT).withDialogue(dialogue).withOptionPhase(callback).build()); } 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 19d909cab64..9bcb3a36d2c 100644 --- a/src/test/mystery-encounter/encounters/fiery-fallout-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/fiery-fallout-encounter.test.ts @@ -18,6 +18,7 @@ import BattleScene from "#app/battle-scene"; import { PokemonHeldItemModifier } from "#app/modifier/modifier"; import { Type } from "#app/data/type"; import { Status, StatusEffect } from "#app/data/status-effect"; +import { MysteryEncounterTier } from "#app/data/mystery-encounters/mystery-encounter"; const namespace = "mysteryEncounter:fieryFallout"; /** Arcanine and Ninetails for 2 Fire types. Lapras, Gengar, Abra for burnable mon. */ @@ -38,9 +39,10 @@ describe("Fiery Fallout - Mystery Encounter", () => { game = new GameManager(phaserGame); scene = game.scene; game.override.mysteryEncounterChance(100); + game.override.mysteryEncounterTier(MysteryEncounterTier.COMMON); game.override.startingWave(defaultWave); game.override.startingBiome(defaultBiome); - game.override.trainerWave(false); + game.override.disableTrainerWave(true); vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue( new Map([ @@ -55,9 +57,11 @@ describe("Fiery Fallout - Mystery Encounter", () => { }); it("should have the correct properties", async () => { - await game.runToMysteryEncounter(defaultParty); + game.override.mysteryEncounter(MysteryEncounterType.FIERY_FALLOUT); + await game.runToMysteryEncounter(MysteryEncounterType.FIERY_FALLOUT, defaultParty); expect(FieryFalloutEncounter.encounterType).toBe(MysteryEncounterType.FIERY_FALLOUT); + expect(FieryFalloutEncounter.encounterTier).toBe(MysteryEncounterTier.COMMON); expect(FieryFalloutEncounter.dialogue).toBeDefined(); expect(FieryFalloutEncounter.dialogue.intro).toStrictEqual([{ text: `${namespace}:intro` }]); expect(FieryFalloutEncounter.dialogue.encounterOptionsDialogue.title).toBe(`${namespace}:title`); @@ -126,6 +130,10 @@ describe("Fiery Fallout - Mystery Encounter", () => { }); describe("Option 1 - Fight 2 Volcarona", () => { + beforeEach(async () => { + game.override.mysteryEncounter(MysteryEncounterType.FIERY_FALLOUT); + }); + it("should have the correct properties", () => { const option1 = FieryFalloutEncounter.options[0]; expect(option1.optionMode).toBe(EncounterOptionMode.DEFAULT); @@ -144,7 +152,7 @@ describe("Fiery Fallout - Mystery Encounter", () => { it("should start battle against 2 Volcarona", async () => { const phaseSpy = vi.spyOn(scene, "pushPhase"); - await game.runToMysteryEncounter(defaultParty); + await game.runToMysteryEncounter(MysteryEncounterType.FIERY_FALLOUT, defaultParty); await runSelectMysteryEncounterOption(game, 1, true); const enemyField = scene.getEnemyField(); @@ -161,7 +169,7 @@ describe("Fiery Fallout - Mystery Encounter", () => { }); it("should give charcoal to lead pokemon", async () => { - await game.runToMysteryEncounter(defaultParty); + await game.runToMysteryEncounter(MysteryEncounterType.FIERY_FALLOUT, defaultParty); await runSelectMysteryEncounterOption(game, 1, true); await skipBattleRunMysteryEncounterRewardsPhase(game); await game.phaseInterceptor.to(SelectModifierPhase, false); @@ -176,6 +184,10 @@ describe("Fiery Fallout - Mystery Encounter", () => { }); describe("Option 2 - Suffer the weather", () => { + beforeEach(async () => { + game.override.mysteryEncounter(MysteryEncounterType.FIERY_FALLOUT); + }); + it("should have the correct properties", () => { const option1 = FieryFalloutEncounter.options[1]; expect(option1.optionMode).toBe(EncounterOptionMode.DEFAULT); @@ -192,7 +204,7 @@ describe("Fiery Fallout - Mystery Encounter", () => { }); it("should damage all non-fire party PKM by 20% and randomly burn 1", async () => { - await game.runToMysteryEncounter(defaultParty); + await game.runToMysteryEncounter(MysteryEncounterType.FIERY_FALLOUT, defaultParty); const party = scene.getParty(); const lapras = party.find((pkm) => pkm.species.speciesId === Species.LAPRAS); @@ -215,7 +227,7 @@ describe("Fiery Fallout - Mystery Encounter", () => { it("should leave encounter without battle", async () => { const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); - await game.runToMysteryEncounter(defaultParty); + await game.runToMysteryEncounter(MysteryEncounterType.FIERY_FALLOUT, defaultParty); await runSelectMysteryEncounterOption(game, 2); expect(leaveEncounterWithoutBattleSpy).toBeCalled(); @@ -223,6 +235,10 @@ describe("Fiery Fallout - Mystery Encounter", () => { }); describe("Option 3 - use FIRE types", () => { + beforeEach(async () => { + game.override.mysteryEncounter(MysteryEncounterType.FIERY_FALLOUT); + }); + it("should have the correct properties", () => { const option1 = FieryFalloutEncounter.options[2]; expect(option1.optionMode).toBe(EncounterOptionMode.DISABLED_OR_SPECIAL); @@ -240,7 +256,7 @@ describe("Fiery Fallout - Mystery Encounter", () => { }); it("should give charcoal to lead pokemon", async () => { - await game.runToMysteryEncounter(defaultParty); + await game.runToMysteryEncounter(MysteryEncounterType.FIERY_FALLOUT, defaultParty); await runSelectMysteryEncounterOption(game, 3); // await skipBattleRunMysteryEncounterRewardsPhase(game); await game.phaseInterceptor.to(SelectModifierPhase, false); @@ -256,7 +272,7 @@ describe("Fiery Fallout - Mystery Encounter", () => { it("should leave encounter without battle", async () => { const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); - await game.runToMysteryEncounter(defaultParty); + await game.runToMysteryEncounter(MysteryEncounterType.FIERY_FALLOUT, defaultParty); await runSelectMysteryEncounterOption(game, 3); expect(leaveEncounterWithoutBattleSpy).toBeCalled(); 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 99b1c8b4764..04854574a77 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 @@ -11,6 +11,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 { runSelectMysteryEncounterOption } from "../encounterTestUtils"; +import { MysteryEncounterTier } from "#app/data/mystery-encounters/mystery-encounter"; const namespace = "mysteryEncounter:lostAtSea"; /** Blastoise for surf. Pidgeot for fly. Abra for none. */ @@ -31,7 +32,7 @@ describe("Lost at Sea - Mystery Encounter", () => { game.override.mysteryEncounterChance(100); game.override.startingWave(defaultWave); game.override.startingBiome(defaultBiome); - game.override.trainerWave(false); + game.override.disableTrainerWave(true); vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue( new Map([ @@ -46,9 +47,11 @@ describe("Lost at Sea - Mystery Encounter", () => { }); it("should have the correct properties", async () => { - await game.runToMysteryEncounter(defaultParty); + game.override.mysteryEncounter(MysteryEncounterType.LOST_AT_SEA); + await game.runToMysteryEncounter(MysteryEncounterType.LOST_AT_SEA, defaultParty); expect(LostAtSeaEncounter.encounterType).toBe(MysteryEncounterType.LOST_AT_SEA); + expect(LostAtSeaEncounter.encounterTier).toBe(MysteryEncounterTier.COMMON); expect(LostAtSeaEncounter.dialogue).toBeDefined(); expect(LostAtSeaEncounter.dialogue.intro).toStrictEqual([{ text: `${namespace}:intro` }]); expect(LostAtSeaEncounter.dialogue.encounterOptionsDialogue.title).toBe(`${namespace}:title`); @@ -96,6 +99,10 @@ describe("Lost at Sea - Mystery Encounter", () => { }); describe("Option 1 - Surf", () => { + beforeEach(async () => { + game.override.mysteryEncounter(MysteryEncounterType.LOST_AT_SEA); + }); + it("should have the correct properties", () => { const option1 = LostAtSeaEncounter.options[0]; expect(option1.optionMode).toBe(EncounterOptionMode.DISABLED_OR_DEFAULT); @@ -116,7 +123,7 @@ describe("Lost at Sea - Mystery Encounter", () => { it("should award exp to surfable PKM (Blastoise)", async () => { const laprasSpecies = getPokemonSpecies(Species.LAPRAS); - await game.runToMysteryEncounter(defaultParty); + await game.runToMysteryEncounter(MysteryEncounterType.LOST_AT_SEA, defaultParty); const party = game.scene.getParty(); const blastoise = party.find((pkm) => pkm.species.speciesId === Species.PIDGEOT); const expBefore = blastoise.exp; @@ -130,7 +137,7 @@ describe("Lost at Sea - Mystery Encounter", () => { game.override.startingWave(33); const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); - await game.runToMysteryEncounter(defaultParty); + await game.runToMysteryEncounter(MysteryEncounterType.LOST_AT_SEA, defaultParty); await runSelectMysteryEncounterOption(game, 1); expect(leaveEncounterWithoutBattleSpy).toBeCalled(); @@ -142,6 +149,10 @@ describe("Lost at Sea - Mystery Encounter", () => { }); describe("Option 2 - Fly", () => { + beforeEach(async () => { + game.override.mysteryEncounter(MysteryEncounterType.LOST_AT_SEA); + }); + it("should have the correct properties", () => { const option2 = LostAtSeaEncounter.options[1]; @@ -165,7 +176,7 @@ describe("Lost at Sea - Mystery Encounter", () => { const wave = 33; game.override.startingWave(wave); - await game.runToMysteryEncounter(defaultParty); + await game.runToMysteryEncounter(MysteryEncounterType.LOST_AT_SEA, defaultParty); const party = game.scene.getParty(); const pidgeot = party.find((pkm) => pkm.species.speciesId === Species.PIDGEOT); const expBefore = pidgeot.exp; @@ -179,7 +190,7 @@ describe("Lost at Sea - Mystery Encounter", () => { game.override.startingWave(33); const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); - await game.runToMysteryEncounter(defaultParty); + await game.runToMysteryEncounter(MysteryEncounterType.LOST_AT_SEA, defaultParty); await runSelectMysteryEncounterOption(game, 2); expect(leaveEncounterWithoutBattleSpy).toBeCalled(); @@ -191,6 +202,10 @@ describe("Lost at Sea - Mystery Encounter", () => { }); describe("Option 3 - Wander aimlessy", () => { + beforeEach(async () => { + game.override.mysteryEncounter(MysteryEncounterType.LOST_AT_SEA); + }); + it("should have the correct properties", () => { const option3 = LostAtSeaEncounter.options[2]; @@ -210,7 +225,7 @@ describe("Lost at Sea - Mystery Encounter", () => { it("should damage all (allowed in battle) party PKM by 25%", async () => { game.override.startingWave(33); - await game.runToMysteryEncounter(defaultParty); + await game.runToMysteryEncounter(MysteryEncounterType.LOST_AT_SEA, defaultParty); const party = game.scene.getParty(); const abra = party.find((pkm) => pkm.species.speciesId === Species.ABRA); @@ -231,7 +246,7 @@ describe("Lost at Sea - Mystery Encounter", () => { game.override.startingWave(33); const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); - await game.runToMysteryEncounter(defaultParty); + await game.runToMysteryEncounter(MysteryEncounterType.LOST_AT_SEA, defaultParty); await runSelectMysteryEncounterOption(game, 3); expect(leaveEncounterWithoutBattleSpy).toBeCalled(); diff --git a/src/test/mystery-encounter/mystery-encounter.test.ts b/src/test/mystery-encounter/mystery-encounter.test.ts index cadca89b5e8..ef0b5b3238a 100644 --- a/src/test/mystery-encounter/mystery-encounter.test.ts +++ b/src/test/mystery-encounter/mystery-encounter.test.ts @@ -24,24 +24,18 @@ describe("Mystery Encounters", () => { game.override.startingWave(11); game.override.mysteryEncounterChance(100); game.override.mysteryEncounter(MysteryEncounterType.MYSTERIOUS_CHALLENGERS); - game.override.trainerWave(false); + game.override.disableTrainerWave(true); }); it("Spawns a mystery encounter", async () => { - await game.runToMysteryEncounter([ - Species.CHARIZARD, - Species.VOLCARONA - ]); + await game.runToMysteryEncounter(MysteryEncounterType.MYSTERIOUS_CHALLENGERS, [Species.CHARIZARD, Species.VOLCARONA]); await game.phaseInterceptor.to(MysteryEncounterPhase, false); expect(game.scene.getCurrentPhase().constructor.name).toBe(MysteryEncounterPhase.name); }); it("", async () => { - await game.runToMysteryEncounter([ - Species.CHARIZARD, - Species.VOLCARONA - ]); + await game.runToMysteryEncounter(MysteryEncounterType.MYSTERIOUS_CHALLENGERS, [Species.CHARIZARD, Species.VOLCARONA]); await game.phaseInterceptor.to(MysteryEncounterPhase, false); expect(game.scene.getCurrentPhase().constructor.name).toBe(MysteryEncounterPhase.name); diff --git a/src/test/phases/mystery-encounter-phase.test.ts b/src/test/phases/mystery-encounter-phase.test.ts index 9fd989e82b8..2a7d3de3700 100644 --- a/src/test/phases/mystery-encounter-phase.test.ts +++ b/src/test/phases/mystery-encounter-phase.test.ts @@ -35,20 +35,14 @@ describe("Mystery Encounter Phases", () => { describe("MysteryEncounterPhase", () => { it("Runs to MysteryEncounterPhase", async() => { - await game.runToMysteryEncounter([ - Species.CHARIZARD, - Species.VOLCARONA - ]); + await game.runToMysteryEncounter(MysteryEncounterType.MYSTERIOUS_CHALLENGERS, [Species.CHARIZARD, Species.VOLCARONA]); await game.phaseInterceptor.to(MysteryEncounterPhase, false); expect(game.scene.getCurrentPhase().constructor.name).toBe(MysteryEncounterPhase.name); }); it("Runs MysteryEncounterPhase", async() => { - await game.runToMysteryEncounter([ - Species.CHARIZARD, - Species.VOLCARONA - ]); + await game.runToMysteryEncounter(MysteryEncounterType.MYSTERIOUS_CHALLENGERS, [Species.CHARIZARD, Species.VOLCARONA]); game.onNextPrompt("MysteryEncounterPhase", Mode.MYSTERY_ENCOUNTER, () => { // End phase early for test @@ -65,10 +59,7 @@ describe("Mystery Encounter Phases", () => { it("Selects an option for MysteryEncounterPhase", async() => { const dialogueSpy = vi.spyOn(game.scene.ui, "showDialogue"); const messageSpy = vi.spyOn(game.scene.ui, "showText"); - await game.runToMysteryEncounter([ - Species.CHARIZARD, - Species.VOLCARONA - ]); + await game.runToMysteryEncounter(MysteryEncounterType.MYSTERIOUS_CHALLENGERS, [Species.CHARIZARD, Species.VOLCARONA]); game.onNextPrompt("MysteryEncounterPhase", Mode.MESSAGE, () => { const handler = game.scene.ui.getHandler() as MessageUiHandler; diff --git a/src/test/utils/gameManager.ts b/src/test/utils/gameManager.ts index 1b8c5c383a0..7ccec8113b3 100644 --- a/src/test/utils/gameManager.ts +++ b/src/test/utils/gameManager.ts @@ -36,6 +36,8 @@ import TargetSelectUiHandler from "#app/ui/target-select-ui-handler.js"; import BattleMessageUiHandler from "#app/ui/battle-message-ui-handler"; import {MysteryEncounterPhase} from "#app/phases/mystery-encounter-phases"; import { OverridesHelper } from "./overridesHelper"; +import { expect } from "vitest"; +import { MysteryEncounterType } from "#enums/mystery-encounter-type"; /** * Class to manage the game state and transitions between phases. @@ -144,10 +146,11 @@ export default class GameManager { /** * Runs the game to a mystery encounter phase. + * @param encounterType - if specified, will expect encounter to have been spawned * @param species - Optional array of species for party. * @returns A promise that resolves when the EncounterPhase ends. */ - async runToMysteryEncounter(species?: Species[]) { + async runToMysteryEncounter(encounterType?: MysteryEncounterType, species?: Species[]) { await this.runToTitle(); this.onNextPrompt("TitlePhase", Mode.TITLE, () => { @@ -164,6 +167,9 @@ export default class GameManager { }, () => this.isCurrentPhase(MysteryEncounterPhase), true); await this.phaseInterceptor.run(EncounterPhase); + if (encounterType) { + expect(this.scene.currentBattle?.mysteryEncounter?.encounterType).toBe(encounterType); + } } /** diff --git a/src/test/utils/overridesHelper.ts b/src/test/utils/overridesHelper.ts index 97caeafd7a6..ff32f41e849 100644 --- a/src/test/utils/overridesHelper.ts +++ b/src/test/utils/overridesHelper.ts @@ -5,6 +5,7 @@ import { MockInstance, vi } from "vitest"; import GameManager from "#test/utils/gameManager"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import * as overrides from "#app/overrides"; +import { MysteryEncounterTier } from "#app/data/mystery-encounters/mystery-encounter"; /** * Helper to handle overrides in tests @@ -28,6 +29,17 @@ export class OverridesHelper { return spy; } + /** + * Override the encounter chance for a mystery encounter. + * @returns spy instance + * @param tier + */ + mysteryEncounterTier(tier: MysteryEncounterTier): MockInstance { + const spy = vi.spyOn(Overrides, "MYSTERY_ENCOUNTER_TIER_OVERRIDE", "get").mockReturnValue(tier); + this.log(`Mystery encounter tier set to ${tier}!`); + return spy; + } + /** * Override the encounter that spawns for the scene * @param encounterType @@ -63,11 +75,11 @@ export class OverridesHelper { /** * Override each wave to have or not have standard trainer battles * @returns spy instance - * @param isTrainer + * @param disable - true */ - trainerWave(isTrainer: boolean): MockInstance { - const spy = vi.spyOn(this.game.scene.gameMode, "isWaveTrainer").mockReturnValue(isTrainer); - this.log(`${isTrainer? "forcing" : "ignoring"} trainer waves!`); + disableTrainerWave(disable: boolean): MockInstance { + const spy = vi.spyOn(this.game.scene.gameMode, "isWaveTrainer").mockReturnValue(!disable); + this.log(`Standard trainer waves are ${disable? "disabled" : "enabled"}!`); return spy; } From e765b3a455e1ead3e7bd51167422c69a479d6bf7 Mon Sep 17 00:00:00 2001 From: ImperialSympathizer <110984302+ben-lear@users.noreply.github.com> Date: Fri, 19 Jul 2024 19:25:02 -0400 Subject: [PATCH 197/270] Update src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts Co-authored-by: flx-sta <50131232+flx-sta@users.noreply.github.com> --- .../mystery-encounters/encounters/fiery-fallout-encounter.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts b/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts index b99a7092902..8fad5e69a6c 100644 --- a/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts +++ b/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts @@ -202,8 +202,8 @@ export const FieryFalloutEncounter: IMysteryEncounter = .withOption( new MysteryEncounterOptionBuilder() .withOptionMode(EncounterOptionMode.DISABLED_OR_SPECIAL) - .withPrimaryPokemonRequirement(new TypeRequirement(Type.FIRE, true,1)) // Will set option3PrimaryName dialogue token automatically - .withSecondaryPokemonRequirement(new TypeRequirement(Type.FIRE, true,1)) // Will set option3SecondaryName dialogue token automatically + .withPrimaryPokemonRequirement(new TypeRequirement(Type.FIRE, true, 1)) // Will set option3PrimaryName dialogue token automatically + .withSecondaryPokemonRequirement(new TypeRequirement(Type.FIRE, true, 1)) // Will set option3SecondaryName dialogue token automatically .withDialogue({ buttonLabel: `${namespace}:option:3:label`, buttonTooltip: `${namespace}:option:3:tooltip`, From 88141759062b543fd74ce858e60d56329100405c Mon Sep 17 00:00:00 2001 From: ImperialSympathizer <110984302+ben-lear@users.noreply.github.com> Date: Fri, 19 Jul 2024 19:56:55 -0400 Subject: [PATCH 198/270] Apply suggestions from code review Co-authored-by: flx-sta <50131232+flx-sta@users.noreply.github.com> --- src/data/mystery-encounters/utils/encounter-phase-utils.ts | 6 +++--- src/test/utils/overridesHelper.ts | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/data/mystery-encounters/utils/encounter-phase-utils.ts b/src/data/mystery-encounters/utils/encounter-phase-utils.ts index 9c569775f38..b98a6597414 100644 --- a/src/data/mystery-encounters/utils/encounter-phase-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-phase-utils.ts @@ -636,11 +636,11 @@ export function transitionMysteryEncounterIntroVisuals(scene: BattleScene, hide: // Transition scene.tweens.add({ targets: introVisuals, - x: hide ? "+=16" : "-=16", - y: hide ? "-=16" : "+=16", + x: `${hide? "+" : "-"}=16`, + y: `${hide ? "-" : "+"}=16`, alpha: hide ? 0 : 1, ease: "Sine.easeInOut", - duration: duration, + duration, onComplete: () => { if (hide && destroy) { scene.field.remove(introVisuals); diff --git a/src/test/utils/overridesHelper.ts b/src/test/utils/overridesHelper.ts index 257ec523399..4116810be5d 100644 --- a/src/test/utils/overridesHelper.ts +++ b/src/test/utils/overridesHelper.ts @@ -45,7 +45,7 @@ export class OverridesHelper { * @param encounterType * @returns spy instance */ - mysteryEncounter(encounterType: MysteryEncounterType): MockInstance { + mysteryEncounter(encounterType: MysteryEncounterType) { const spy = vi.spyOn(overrides, "MYSTERY_ENCOUNTER_OVERRIDE", "get").mockReturnValue(encounterType); this.log(`Mystery encounter override set to ${encounterType}!`); return spy; From e795a626291da3eef84d941016a0e020af4be03a Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Fri, 19 Jul 2024 20:06:49 -0400 Subject: [PATCH 199/270] add jsdocs and more cleanup --- .../encounters/safari-zone-encounter.ts | 2 +- .../mystery-encounters/mystery-encounter.ts | 29 ++++++++++++++----- .../utils/encounter-phase-utils.ts | 14 +++++++-- src/field/mystery-encounter-intro.ts | 4 +++ src/field/pokemon.ts | 1 + src/phases.ts | 5 ++-- src/phases/mystery-encounter-phases.ts | 20 ++++++------- .../mystery-encounter/encounterTestUtils.ts | 10 +++++++ .../fiery-fallout-encounter.test.ts | 2 +- src/test/utils/TextInterceptor.ts | 3 ++ 10 files changed, 66 insertions(+), 24 deletions(-) diff --git a/src/data/mystery-encounters/encounters/safari-zone-encounter.ts b/src/data/mystery-encounters/encounters/safari-zone-encounter.ts index e5c5bd39b4d..28c60a0eb10 100644 --- a/src/data/mystery-encounters/encounters/safari-zone-encounter.ts +++ b/src/data/mystery-encounters/encounters/safari-zone-encounter.ts @@ -64,7 +64,7 @@ export const SafariZoneEncounter: IMysteryEncounter = .withOptionPhase(async (scene: BattleScene) => { // Start safari encounter const encounter = scene.currentBattle.mysteryEncounter; - encounter.encounterVariant = MysteryEncounterVariant.REPEATED_ENCOUNTER; + encounter.encounterVariant = MysteryEncounterVariant.CONTINUOUS_ENCOUNTER; encounter.misc = { safariPokemonRemaining: 3 }; diff --git a/src/data/mystery-encounters/mystery-encounter.ts b/src/data/mystery-encounters/mystery-encounter.ts index 6136e338854..026c58bb0c3 100644 --- a/src/data/mystery-encounters/mystery-encounter.ts +++ b/src/data/mystery-encounters/mystery-encounter.ts @@ -28,7 +28,7 @@ export enum MysteryEncounterVariant { BOSS_BATTLE, NO_BATTLE, /** For spawning new encounter queries instead of continuing to next wave */ - REPEATED_ENCOUNTER + CONTINUOUS_ENCOUNTER } /** @@ -115,11 +115,6 @@ export default interface IMysteryEncounter { * You probably shouldn't do anything with this unless you have a very specific need */ introVisuals?: MysteryEncounterIntroVisuals; - /** - * Used for keeping RNG consistent on session resets, but increments when cycling through multiple "Encounters" on the same wave - * You should never need to modify this - */ - seedOffset?: any; /** * Flags @@ -172,6 +167,12 @@ export default interface IMysteryEncounter { * Unless you know what you're doing, you should use MysteryEncounterBuilder to create an instance for this class */ export default class IMysteryEncounter implements IMysteryEncounter { + /** + * Used for keeping RNG consistent on session resets, but increments when cycling through multiple "Encounters" on the same wave + * You should only need to interact via getter/update methods + */ + private seedOffset?: any; + constructor(encounter: IMysteryEncounter) { if (!isNullOrUndefined(encounter)) { Object.assign(this, encounter); @@ -371,6 +372,20 @@ export default class IMysteryEncounter implements IMysteryEncounter { this.dialogueTokens[key] = value; } + getSeedOffset?() { + return this.seedOffset; + } + + /** + * Maintains seed offset for RNG consistency + * Increments if the same MysteryEncounter has multiple option select cycles + * @param scene + */ + updateSeedOffset?(scene: BattleScene) { + const currentOffset = this.seedOffset ?? scene.currentBattle.waveIndex * 1000; + this.seedOffset = currentOffset + 512; + } + private capitalizeFirstLetter?(str: string) { return str.charAt(0).toUpperCase() + str.slice(1); } @@ -442,7 +457,7 @@ export class MysteryEncounterBuilder implements Partial { * @param callback - {@linkcode OptionPhaseCallback} * @returns */ - withSimpleOption(dialogue: OptionTextDisplay, callback: OptionPhaseCallback): this { + withSimpleOption(dialogue: OptionTextDisplay, callback: OptionPhaseCallback): this & Pick { return this.withOption(new MysteryEncounterOptionBuilder().withOptionMode(EncounterOptionMode.DEFAULT).withDialogue(dialogue).withOptionPhase(callback).build()); } diff --git a/src/data/mystery-encounters/utils/encounter-phase-utils.ts b/src/data/mystery-encounters/utils/encounter-phase-utils.ts index 9c569775f38..8408dbfdd2c 100644 --- a/src/data/mystery-encounters/utils/encounter-phase-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-phase-utils.ts @@ -30,6 +30,10 @@ import { Gender } from "#app/data/gender"; import { Moves } from "#enums/moves"; import { initMoveAnim, loadMoveAnimAssets } from "#app/data/battle-anims"; +/** + * Animates exclamation sprite over trainer's head at start of encounter + * @param scene + */ export function doTrainerExclamation(scene: BattleScene) { const exclamationSprite = scene.addFieldSprite(0, 0, "exclaim"); exclamationSprite.setName("exclamation"); @@ -476,6 +480,7 @@ export function setEncounterExp(scene: BattleScene, participantId: integer | int const nonFaintedPartyMembers = party.filter(p => p.hp); const expPartyMembers = nonFaintedPartyMembers.filter(p => p.level < scene.getMaxExpLevel()); const partyMemberExp = []; + // EXP value calculation is based off Pokemon.getExpValue let expValue = Math.floor(baseExpValue * (useWaveIndex ? scene.currentBattle.waveIndex : 1) / 5 + 1); if (participantIds?.length > 0) { @@ -597,7 +602,7 @@ export function handleMysteryEncounterVictory(scene: BattleScene, addHealPhase: // If in repeated encounter variant, do nothing // Variant must eventually be swapped in order to handle "true" end of the encounter - if (scene.currentBattle.mysteryEncounter.encounterVariant === MysteryEncounterVariant.REPEATED_ENCOUNTER) { + if (scene.currentBattle.mysteryEncounter.encounterVariant === MysteryEncounterVariant.CONTINUOUS_ENCOUNTER) { return; } else if (scene.currentBattle.mysteryEncounter.encounterVariant === MysteryEncounterVariant.NO_BATTLE) { scene.pushPhase(new EggLapsePhase(scene)); @@ -657,7 +662,12 @@ export function transitionMysteryEncounterIntroVisuals(scene: BattleScene, hide: }); } -export function handleEncounterStartOfBattleEffects(scene: BattleScene) { +/** + * Will queue moves for any pokemon to use before the first CommandPhase of a battle + * Mostly useful for allowing MysteryEncounter enemies to "cheat" and use moves before the first turn + * @param scene + */ +export function handleMysteryEncounterBattleStartEffects(scene: BattleScene) { const encounter = scene.currentBattle?.mysteryEncounter; if (scene.currentBattle.battleType === BattleType.MYSTERY_ENCOUNTER && encounter.encounterVariant !== MysteryEncounterVariant.NO_BATTLE && !encounter.startOfBattleEffectsComplete) { const effects = encounter.startOfBattleEffects; diff --git a/src/field/mystery-encounter-intro.ts b/src/field/mystery-encounter-intro.ts index fb894869adf..9ae83f49fab 100644 --- a/src/field/mystery-encounter-intro.ts +++ b/src/field/mystery-encounter-intro.ts @@ -349,6 +349,10 @@ export default class MysteryEncounterIntroVisuals extends Phaser.GameObjects.Con }); } + /** + * Sets container and all child sprites to visible + * @param value - true for visible, false for hidden + */ setVisible(value: boolean): this { this.getSprites().forEach(sprite => { sprite.setVisible(value); diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 65fd982cbdc..b0974bd0aa8 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -101,6 +101,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { public battleSummonData: PokemonBattleSummonData; public turnData: PokemonTurnData; + /** Used by Mystery Encounters to execute pokemon-specific logic (such as stat boosts) at start of battle */ public mysteryEncounterBattleEffects: (pokemon: Pokemon) => void = null; public fieldPosition: FieldPosition; diff --git a/src/phases.ts b/src/phases.ts index 22a7b8bdd98..87e8cde9f5d 100644 --- a/src/phases.ts +++ b/src/phases.ts @@ -67,7 +67,7 @@ import { Species } from "#enums/species"; import { TrainerType } from "#enums/trainer-type"; import { MysteryEncounterVariant } from "#app/data/mystery-encounters/mystery-encounter"; import { MysteryEncounterPhase } from "#app/phases/mystery-encounter-phases"; -import { doTrainerExclamation, handleEncounterStartOfBattleEffects, handleMysteryEncounterVictory } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { doTrainerExclamation, handleMysteryEncounterBattleStartEffects, handleMysteryEncounterVictory } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import ModifierSelectUiHandler, { SHOP_OPTIONS_ROW_LIMIT } from "#app/ui/modifier-select-ui-handler"; import { getEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; @@ -2053,8 +2053,7 @@ export class TurnInitPhase extends FieldPhase { //this.scene.pushPhase(new MoveAnimTestPhase(this.scene)); this.scene.eventTarget.dispatchEvent(new TurnInitEvent()); - // Start of battle effects for Mystery Encounters - handleEncounterStartOfBattleEffects(this.scene); + handleMysteryEncounterBattleStartEffects(this.scene); this.scene.getField().forEach((pokemon, i) => { if (pokemon?.isActive()) { diff --git a/src/phases/mystery-encounter-phases.ts b/src/phases/mystery-encounter-phases.ts index 25f6b140140..11ff4766695 100644 --- a/src/phases/mystery-encounter-phases.ts +++ b/src/phases/mystery-encounter-phases.ts @@ -28,6 +28,8 @@ import { BattlerTagLapseType } from "#app/data/battler-tags"; export class MysteryEncounterPhase extends Phase { optionSelectSettings: OptionSelectSettings; + private FIRST_DIALOGUE_PROMPT_DELAY = 300; + /** * * @param scene @@ -46,9 +48,7 @@ export class MysteryEncounterPhase extends Phase { this.scene.clearPhaseQueue(); this.scene.clearPhaseQueueSplice(); - // Generates seed offset for RNG consistency, but incremented if the same MysteryEncounter has multiple option select cycles - const offset = this.scene.currentBattle.mysteryEncounter.seedOffset ?? this.scene.currentBattle.waveIndex * 1000; - this.scene.currentBattle.mysteryEncounter.seedOffset = offset + 512; + this.scene.currentBattle.mysteryEncounter.updateSeedOffset(this.scene); if (!this.optionSelectSettings) { // Sets flag that ME was encountered, only if this is not a followup option select phase @@ -79,7 +79,7 @@ export class MysteryEncounterPhase extends Phase { this.continueEncounter(); } }); - }, this.scene.currentBattle.mysteryEncounter.seedOffset); + }, this.scene.currentBattle.mysteryEncounter.getSeedOffset()); } else { this.continueEncounter(); } @@ -109,9 +109,9 @@ export class MysteryEncounterPhase extends Phase { } if (title) { - this.scene.ui.showDialogue(text, title, null, nextAction, 0, i === 0 ? 300 : 0); + this.scene.ui.showDialogue(text, title, null, nextAction, 0, i === 0 ? this.FIRST_DIALOGUE_PROMPT_DELAY : 0); } else { - this.scene.ui.showText(text, null, nextAction, i === 0 ? 300 : 0, true); + this.scene.ui.showText(text, null, nextAction, i === 0 ? this.FIRST_DIALOGUE_PROMPT_DELAY : 0, true); } i++; }; @@ -154,14 +154,14 @@ export class MysteryEncounterOptionSelectedPhase extends Phase { this.onOptionSelect(this.scene).finally(() => { this.end(); }); - }, this.scene.currentBattle.mysteryEncounter.seedOffset); + }, this.scene.currentBattle.mysteryEncounter.getSeedOffset()); }); } else { this.scene.executeWithSeedOffset(() => { this.onOptionSelect(this.scene).finally(() => { this.end(); }); - }, this.scene.currentBattle.mysteryEncounter.seedOffset); + }, this.scene.currentBattle.mysteryEncounter.getSeedOffset()); } } } @@ -279,7 +279,7 @@ export class MysteryEncounterBattlePhase extends Phase { } else { const trainer = this.scene.currentBattle.trainer; let message: string; - scene.executeWithSeedOffset(() => message = Utils.randSeedItem(encounterMessages), this.scene.currentBattle.mysteryEncounter.seedOffset); + scene.executeWithSeedOffset(() => message = Utils.randSeedItem(encounterMessages), this.scene.currentBattle.mysteryEncounter.getSeedOffset()); const showDialogueAndSummon = () => { scene.ui.showDialogue(message, trainer.getName(TrainerSlot.NONE, true), null, () => { @@ -438,7 +438,7 @@ export class PostMysteryEncounterPhase extends Phase { this.continueEncounter(); } }); - }, this.scene.currentBattle.mysteryEncounter.seedOffset); + }, this.scene.currentBattle.mysteryEncounter.getSeedOffset()); } else { this.continueEncounter(); } diff --git a/src/test/mystery-encounter/encounterTestUtils.ts b/src/test/mystery-encounter/encounterTestUtils.ts index 218f2cdb971..88233032ccd 100644 --- a/src/test/mystery-encounter/encounterTestUtils.ts +++ b/src/test/mystery-encounter/encounterTestUtils.ts @@ -7,6 +7,12 @@ import GameManager from "../utils/gameManager"; import MessageUiHandler from "#app/ui/message-ui-handler"; import { Status, StatusEffect } from "#app/data/status-effect"; +/** + * Runs a MysteryEncounter to either the start of a battle, or to the MysteryEncounterRewardsPhase, depending on the option selected + * @param game + * @param optionNo - human number, not index + * @param isBattle - if selecting option should lead to battle, set to true + */ export async function runSelectMysteryEncounterOption(game: GameManager, optionNo: number, isBattle: boolean = false) { // Handle any eventual queued messages (e.g. weather phase, etc.) game.onNextPrompt("MessagePhase", Mode.MESSAGE, () => { @@ -81,6 +87,10 @@ export async function runSelectMysteryEncounterOption(game: GameManager, optionN } } +/** + * For any MysteryEncounter that has a battle, can call this to skip battle and proceed to MysteryEncounterRewardsPhase + * @param game + */ export async function skipBattleRunMysteryEncounterRewardsPhase(game: GameManager) { game.scene.clearPhaseQueue(); game.scene.clearPhaseQueueSplice(); 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 9bcb3a36d2c..20d0426e02d 100644 --- a/src/test/mystery-encounter/encounters/fiery-fallout-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/fiery-fallout-encounter.test.ts @@ -74,7 +74,7 @@ describe("Fiery Fallout - Mystery Encounter", () => { game.override.startingBiome(Biome.MOUNTAIN); await game.runToMysteryEncounter(); - expect(scene.currentBattle.mysteryEncounter.encounterType).not.toBe(MysteryEncounterType.LOST_AT_SEA); + expect(scene.currentBattle.mysteryEncounter.encounterType).not.toBe(MysteryEncounterType.FIERY_FALLOUT); }); it("should not run below wave 41", async () => { diff --git a/src/test/utils/TextInterceptor.ts b/src/test/utils/TextInterceptor.ts index a49f41f6be0..c209ece7e04 100644 --- a/src/test/utils/TextInterceptor.ts +++ b/src/test/utils/TextInterceptor.ts @@ -1,3 +1,6 @@ +/** + * Class will intercept any text or dialogue message calls and log them for test purposes + */ export default class TextInterceptor { private scene; public logs = []; From e3c1c3bb8c1fe8f3f201367746146f8d152ac2c4 Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Fri, 19 Jul 2024 20:12:33 -0400 Subject: [PATCH 200/270] add more jsdoc --- src/data/mystery-encounters/mystery-encounter.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/data/mystery-encounters/mystery-encounter.ts b/src/data/mystery-encounters/mystery-encounter.ts index 026c58bb0c3..b18707968a3 100644 --- a/src/data/mystery-encounters/mystery-encounter.ts +++ b/src/data/mystery-encounters/mystery-encounter.ts @@ -372,6 +372,13 @@ export default class IMysteryEncounter implements IMysteryEncounter { this.dialogueTokens[key] = value; } + /** + * If an encounter uses {@link MysteryEncounterVariant.CONTINUOUS_ENCOUNTER}, + * should rely on this value for seed offset instead of wave index. + * + * This offset is incremented for each new {@link MysteryEncounterPhase} that occurs, + * so multi-encounter RNG will be consistent on resets and not be affected by number of turns, move RNG, etc. + */ getSeedOffset?() { return this.seedOffset; } From 46f8d26100fcc7dafce114c95d753f8607b6e0e5 Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Fri, 19 Jul 2024 23:40:36 -0400 Subject: [PATCH 201/270] add the strong stuff encounter --- .../mystery-encounters/berry_juice.json | 2 +- .../encounters/mysterious-chest-encounter.ts | 2 +- .../encounters/safari-zone-encounter.ts | 2 +- .../shady-vitamin-dealer-encounter.ts | 4 +- ...unter.ts => the-strong-stuff-encounter.ts} | 87 +++++++++++++------ .../encounters/training-session-encounter.ts | 2 +- .../mystery-encounters/mystery-encounters.ts | 2 + src/data/pokemon-species.ts | 8 ++ src/enums/mystery-encounter-type.ts | 2 +- src/field/mystery-encounter-intro.ts | 10 +-- src/locales/en/mystery-encounter.ts | 2 + .../the-strong-stuff-dialogue.ts | 25 ++++++ src/overrides.ts | 2 +- src/ui/message-ui-handler.ts | 20 ++++- 14 files changed, 128 insertions(+), 42 deletions(-) rename src/data/mystery-encounters/encounters/{juiced_shuckle-juice-encounter.ts => the-strong-stuff-encounter.ts} (50%) create mode 100644 src/locales/en/mystery-encounters/the-strong-stuff-dialogue.ts diff --git a/public/images/mystery-encounters/berry_juice.json b/public/images/mystery-encounters/berry_juice.json index 88242213344..1a5331368ad 100644 --- a/public/images/mystery-encounters/berry_juice.json +++ b/public/images/mystery-encounters/berry_juice.json @@ -10,7 +10,7 @@ "scale": 1, "frames": [ { - "filename": "Bag_Berry_Juice_Sprite.png", + "filename": "0001.png", "rotated": false, "trimmed": true, "sourceSize": { diff --git a/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts b/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts index 9a0a42af2c8..63ceea1dac9 100644 --- a/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts +++ b/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts @@ -28,7 +28,7 @@ export const MysteriousChestEncounter: IMysteryEncounter = hasShadow: true, x: 4, y: 10, - yShadowOffset: 3, + yShadow: 3, disableAnimation: true, // Re-enabled after option select }, ]) diff --git a/src/data/mystery-encounters/encounters/safari-zone-encounter.ts b/src/data/mystery-encounters/encounters/safari-zone-encounter.ts index 2b7a013dd22..aa7fd19391f 100644 --- a/src/data/mystery-encounters/encounters/safari-zone-encounter.ts +++ b/src/data/mystery-encounters/encounters/safari-zone-encounter.ts @@ -31,7 +31,7 @@ export const SafariZoneEncounter: IMysteryEncounter = hasShadow: true, x: 4, y: 10, - yShadowOffset: 3 + yShadow: 3 }, ]) .withIntroDialogue([ 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 7e32ca87c55..b1beee30247 100644 --- a/src/data/mystery-encounters/encounters/shady-vitamin-dealer-encounter.ts +++ b/src/data/mystery-encounters/encounters/shady-vitamin-dealer-encounter.ts @@ -31,7 +31,7 @@ export const ShadyVitaminDealerEncounter: IMysteryEncounter = repeat: true, x: 12, y: -5, - yShadowOffset: -5 + yShadow: -5 }, { spriteKey: "b2w2_veteran_m", @@ -39,7 +39,7 @@ export const ShadyVitaminDealerEncounter: IMysteryEncounter = hasShadow: true, x: -12, y: 3, - yShadowOffset: 3 + yShadow: 3 }, ]) .withIntroDialogue([ diff --git a/src/data/mystery-encounters/encounters/juiced_shuckle-juice-encounter.ts b/src/data/mystery-encounters/encounters/the-strong-stuff-encounter.ts similarity index 50% rename from src/data/mystery-encounters/encounters/juiced_shuckle-juice-encounter.ts rename to src/data/mystery-encounters/encounters/the-strong-stuff-encounter.ts index e30e3612761..019eac98d7c 100644 --- a/src/data/mystery-encounters/encounters/juiced_shuckle-juice-encounter.ts +++ b/src/data/mystery-encounters/encounters/the-strong-stuff-encounter.ts @@ -1,4 +1,4 @@ -import { EnemyPartyConfig, initBattleWithEnemyConfig, leaveEncounterWithoutBattle, setEncounterRewards } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { EnemyPartyConfig, hideMysteryEncounterIntroVisuals, initBattleWithEnemyConfig, leaveEncounterWithoutBattle, setEncounterRewards } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { modifierTypes, } from "#app/modifier/modifier-type"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import BattleScene from "../../../battle-scene"; @@ -6,35 +6,44 @@ import IMysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier, } fro import { getPokemonSpecies } from "#app/data/pokemon-species"; import { Species } from "#enums/species"; import { Nature } from "#app/data/nature"; +import { PlayerPokemon } from "#app/field/pokemon"; +import { showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; /** the i18n namespace for the encounter */ -const namespace = "mysteryEncounter:oneForAll"; +const namespace = "mysteryEncounter:theStrongStuff"; -export const JuicedShuckleJuiceEncounter: IMysteryEncounter = +export const TheStrongStuffEncounter: IMysteryEncounter = MysteryEncounterBuilder.withEncounterType( - MysteryEncounterType.JUICED_SHUCKLE_JUICE + MysteryEncounterType.THE_STRONG_STUFF ) .withEncounterTier(MysteryEncounterTier.COMMON) .withSceneWaveRangeRequirement(10, 180) // waves 10 to 180 .withHideWildIntroMessage(true) + .withHideIntroVisuals(false) .withIntroSpriteConfigs([ + { + spriteKey: "berry_juice", + fileRoot: "mystery-encounters", + hasShadow: true, + scale: 1.5, + x: -15, + y: 3, + yShadow: 0 + }, { spriteKey: Species.SHUCKLE.toString(), fileRoot: "pokemon", hasShadow: true, repeat: true, - scale: 2 - }, - { - spriteKey: "berry_juice", - fileRoot: "mystery-encounters", - hasShadow: true, - scale: 2 + scale: 1.5, + x: 20, + y: 10, + yShadow: 7 }, ]) // Set in onInit() .withIntroDialogue([ { - text: `${namespace}_intro_message`, + text: `${namespace}:intro`, }, ]) .withOnInit((scene: BattleScene) => { @@ -58,35 +67,39 @@ export const JuicedShuckleJuiceEncounter: IMysteryEncounter = return true; }) - .withTitle(`${namespace}_title`) - .withDescription(`${namespace}_description`) - .withQuery(`${namespace}_query`) + .withTitle(`${namespace}:title`) + .withDescription(`${namespace}:description`) + .withQuery(`${namespace}:query`) .withSimpleOption( { - buttonLabel: `${namespace}_option_1_label`, - buttonTooltip: `${namespace}_option_1_tooltip`, + buttonLabel: `${namespace}:option:1:label`, + buttonTooltip: `${namespace}:option:1:tooltip`, selected: [ { - text: `${namespace}_option_1_selected`, - }, - ], + text: `${namespace}:option:1:selected` + } + ] }, async (scene: BattleScene) => { - // Leave encounter with no rewards or exp - // const encounter = scene.currentBattle.mysteryEncounter; + const encounter = scene.currentBattle.mysteryEncounter; + // Do blackout and hide intro visuals during blackout + scene.time.delayedCall(700, () => { + hideMysteryEncounterIntroVisuals(scene); + }); + // -20 to all base stats of highest BST, +10 to all base stats of rest of party // Get highest BST mon const party = scene.getParty(); - let highestBst = null; + let highestBst: PlayerPokemon = null; let statTotal = 0; for (const pokemon of party) { if (!highestBst) { highestBst = pokemon; - statTotal = pokemon.summonData.stats.reduce((i, n) => n + i); + statTotal = pokemon.getSpeciesForm().getBaseStatTotal(); continue; } - const total = pokemon.summonData.stats.reduce((i, n) => n + i); + const total = pokemon.getSpeciesForm().getBaseStatTotal(); if (total > statTotal) { highestBst = pokemon; statTotal = total; @@ -97,7 +110,25 @@ export const JuicedShuckleJuiceEncounter: IMysteryEncounter = highestBst = party[0]; } + console.log("BST pre change: " + highestBst.getSpeciesForm().baseStats); + highestBst.getSpeciesForm().baseStats = [...highestBst.getSpeciesForm().baseStats].map(v => v - 20); + console.log("Species BST: " + getPokemonSpecies(highestBst.getSpeciesForm().speciesId).baseStats); + console.log("Pokemon BST: " + highestBst.getSpeciesForm().baseStats); + highestBst.calculateStats(); + highestBst.updateInfo(); + for (const pokemon of party) { + if (highestBst.id === pokemon.id) { + continue; + } + pokemon.getSpeciesForm().baseStats = [...pokemon.getSpeciesForm().baseStats].map(v => v + 10); + // pokemon.summonData.getSpeciesForm()Form.baseStats = pokemon.getSpeciesForm().baseStats; + pokemon.calculateStats(); + pokemon.updateInfo(); + } + + encounter.setDialogueToken("highBstPokemon", highestBst.name); + await showEncounterText(scene, `${namespace}:option:1:selected_2`, null, true); leaveEncounterWithoutBattle(scene, true); return true; @@ -105,11 +136,11 @@ export const JuicedShuckleJuiceEncounter: IMysteryEncounter = ) .withSimpleOption( { - buttonLabel: `${namespace}_option_2_label`, - buttonTooltip: `${namespace}_option_2_tooltip`, + buttonLabel: `${namespace}:option:2:label`, + buttonTooltip: `${namespace}:option:2:tooltip`, selected: [ { - text: `${namespace}_option_2_selected_message`, + text: `${namespace}:option:2:selected`, }, ], }, diff --git a/src/data/mystery-encounters/encounters/training-session-encounter.ts b/src/data/mystery-encounters/encounters/training-session-encounter.ts index 1c0c3633883..fd4c7d0e7cc 100644 --- a/src/data/mystery-encounters/encounters/training-session-encounter.ts +++ b/src/data/mystery-encounters/encounters/training-session-encounter.ts @@ -35,7 +35,7 @@ export const TrainingSessionEncounter: IMysteryEncounter = hasShadow: true, y: 6, x: 5, - yShadowOffset: -2 + yShadow: -2 }, ]) .withIntroDialogue([ diff --git a/src/data/mystery-encounters/mystery-encounters.ts b/src/data/mystery-encounters/mystery-encounters.ts index e70c00d90c8..6d16be83d22 100644 --- a/src/data/mystery-encounters/mystery-encounters.ts +++ b/src/data/mystery-encounters/mystery-encounters.ts @@ -12,6 +12,7 @@ import { SleepingSnorlaxEncounter } from "./encounters/sleeping-snorlax-encounte import { TrainingSessionEncounter } from "./encounters/training-session-encounter"; import IMysteryEncounter from "./mystery-encounter"; import { SafariZoneEncounter } from "#app/data/mystery-encounters/encounters/safari-zone-encounter"; +import { TheStrongStuffEncounter } from "#app/data/mystery-encounters/encounters/the-strong-stuff-encounter"; // Spawn chance: (BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT + WIGHT_INCREMENT_ON_SPAWN_MISS * ) / 256 export const BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT = 1; @@ -220,6 +221,7 @@ export function initMysteryEncounters() { allMysteryEncounters[MysteryEncounterType.FIELD_TRIP] = FieldTripEncounter; allMysteryEncounters[MysteryEncounterType.SAFARI_ZONE] = SafariZoneEncounter; allMysteryEncounters[MysteryEncounterType.LOST_AT_SEA] = LostAtSeaEncounter; + allMysteryEncounters[MysteryEncounterType.THE_STRONG_STUFF] = TheStrongStuffEncounter; // Add extreme encounters to biome map extremeBiomeEncounters.forEach(encounter => { diff --git a/src/data/pokemon-species.ts b/src/data/pokemon-species.ts index 2b488f330c4..26af9155687 100644 --- a/src/data/pokemon-species.ts +++ b/src/data/pokemon-species.ts @@ -221,6 +221,14 @@ export abstract class PokemonSpeciesForm { return false; } + /** + * Gets the BST for the species + * @returns The species' BST. + */ + getBaseStatTotal(): integer { + return this.baseStats.reduce((i, n) => n + i); + } + /** * Gets the species' base stat amount for the given stat. * @param stat The desired stat. diff --git a/src/enums/mystery-encounter-type.ts b/src/enums/mystery-encounter-type.ts index 7a9938091c1..7f8ed906fa7 100644 --- a/src/enums/mystery-encounter-type.ts +++ b/src/enums/mystery-encounter-type.ts @@ -10,5 +10,5 @@ export enum MysteryEncounterType { FIELD_TRIP, SAFARI_ZONE, LOST_AT_SEA, //might be generalized later on - JUICED_SHUCKLE_JUICE + THE_STRONG_STUFF } diff --git a/src/field/mystery-encounter-intro.ts b/src/field/mystery-encounter-intro.ts index bacf107f482..4767e58d79f 100644 --- a/src/field/mystery-encounter-intro.ts +++ b/src/field/mystery-encounter-intro.ts @@ -39,7 +39,7 @@ export class MysteryEncounterSpriteConfig { /** Y offset */ y?: number; /** Y shadow offset */ - yShadowOffset?: number; + yShadow?: number; /** Sprite scale. `0` - `n` */ scale?: number; /** If you are using an item sprite, set to `true` */ @@ -70,10 +70,10 @@ export default class MysteryEncounterIntroVisuals extends Phaser.GameObjects.Con return; } - const getSprite = (spriteKey: string, hasShadow?: boolean, yShadowOffset?: number) => { + const getSprite = (spriteKey: string, hasShadow?: boolean, yShadow?: number) => { const ret = this.scene.addFieldSprite(0, 0, spriteKey); ret.setOrigin(0.5, 1); - ret.setPipeline(this.scene.spritePipeline, { tone: [0.0, 0.0, 0.0, 0.0], hasShadow: !!hasShadow, yShadowOffset: yShadowOffset ?? 0 }); + ret.setPipeline(this.scene.spritePipeline, { tone: [0.0, 0.0, 0.0, 0.0], hasShadow: !!hasShadow, yShadowOffset: yShadow ?? 0 }); return ret; }; @@ -92,13 +92,13 @@ export default class MysteryEncounterIntroVisuals extends Phaser.GameObjects.Con const spacingValue = Math.round((maxX - minX) / Math.max(this.spriteConfigs.filter(s => !s.x && !s.y).length, 1)); this.spriteConfigs?.forEach((config) => { - const { spriteKey, isItem, hasShadow, scale, x, y, yShadowOffset, alpha } = config; + const { spriteKey, isItem, hasShadow, scale, x, y, yShadow, alpha } = config; let sprite: GameObjects.Sprite; let tintSprite: GameObjects.Sprite; if (!isItem) { - sprite = getSprite(spriteKey, hasShadow, yShadowOffset); + sprite = getSprite(spriteKey, hasShadow, yShadow); tintSprite = getSprite(spriteKey); } else { sprite = getItemSprite(spriteKey); diff --git a/src/locales/en/mystery-encounter.ts b/src/locales/en/mystery-encounter.ts index 47c601cc9db..5effff0b02a 100644 --- a/src/locales/en/mystery-encounter.ts +++ b/src/locales/en/mystery-encounter.ts @@ -1,4 +1,5 @@ import { lostAtSea } from "./mystery-encounters/lost-at-sea"; +import { theStrongStuffDialogue } from "#app/locales/en/mystery-encounters/the-strong-stuff-dialogue"; /** * Patterns that can be used: @@ -241,4 +242,5 @@ export const mysteryEncounter = { "sleeping_snorlax_option_3_good_result": "Your {{option3PrimaryName}} uses {{option3PrimaryMove}}! @s{item_fanfare}It steals Leftovers off the sleeping Snorlax and you make out like bandits!", lostAtSea, + theStrongStuff: theStrongStuffDialogue, } as const; diff --git a/src/locales/en/mystery-encounters/the-strong-stuff-dialogue.ts b/src/locales/en/mystery-encounters/the-strong-stuff-dialogue.ts new file mode 100644 index 00000000000..a165c9718a8 --- /dev/null +++ b/src/locales/en/mystery-encounters/the-strong-stuff-dialogue.ts @@ -0,0 +1,25 @@ +export const theStrongStuffDialogue = { + intro: "It's a massive Shuckle and what appears\nto be an equally large stash of... juice?", + title: "The Strong Stuff", + description: "The Shuckle that blocks your path looks incredibly strong. Meanwhile, the juice next to it is emanating power of some kind.\n\nThe Shuckle extends its feelers in your direction. It seems like it wants to touch you, but is that really a good idea?", + query: "What will you do?", + option: { + 1: { + 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. + $Your {{highBstPokemon}} feels a\nterrible lethargy come over it! + $It's 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", + tooltip: "(-) Hard Battle\n(+) Special Rewards", + 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.", + }, + }, + outro: "You are back on track." +}; diff --git a/src/overrides.ts b/src/overrides.ts index 7272f68bcb4..d16895b27fa 100644 --- a/src/overrides.ts +++ b/src/overrides.ts @@ -119,7 +119,7 @@ export const EGG_GACHA_PULL_COUNT_OVERRIDE: number = 0; // 1 to 256, set to null to ignore export const MYSTERY_ENCOUNTER_RATE_OVERRIDE: number = 256; export const MYSTERY_ENCOUNTER_TIER_OVERRIDE: MysteryEncounterTier = null; -export const MYSTERY_ENCOUNTER_OVERRIDE: MysteryEncounterType = MysteryEncounterType.SLEEPING_SNORLAX; +export const MYSTERY_ENCOUNTER_OVERRIDE: MysteryEncounterType = MysteryEncounterType.THE_STRONG_STUFF; /** * MODIFIER / ITEM OVERRIDES diff --git a/src/ui/message-ui-handler.ts b/src/ui/message-ui-handler.ts index 05c91ca1643..cdd8b20b09d 100644 --- a/src/ui/message-ui-handler.ts +++ b/src/ui/message-ui-handler.ts @@ -32,7 +32,8 @@ export default abstract class MessageUiHandler extends AwaitableUiHandler { const charVarMap = new Map(); const delayMap = new Map(); const soundMap = new Map(); - const actionPattern = /@(c|d|s)\{(.*?)\}/; + const fadeMap = new Map(); + const actionPattern = /@(c|d|s|f)\{(.*?)\}/; let actionMatch: RegExpExecArray; while ((actionMatch = actionPattern.exec(text))) { switch (actionMatch[1]) { @@ -45,6 +46,9 @@ export default abstract class MessageUiHandler extends AwaitableUiHandler { case "s": soundMap.set(actionMatch.index, actionMatch[2]); break; + case "f": + fadeMap.set(actionMatch.index, parseInt(actionMatch[2])); + break; } text = text.slice(0, actionMatch.index) + text.slice(actionMatch.index + actionMatch[2].length + 4); } @@ -103,6 +107,7 @@ export default abstract class MessageUiHandler extends AwaitableUiHandler { const charVar = charVarMap.get(charIndex); const charSound = soundMap.get(charIndex); const charDelay = delayMap.get(charIndex); + const charFade = fadeMap.get(charIndex); this.message.setText(text.slice(0, charIndex)); const advance = () => { if (charVar) { @@ -134,6 +139,19 @@ export default abstract class MessageUiHandler extends AwaitableUiHandler { advance(); } }); + } else if (charFade) { + this.textTimer.paused = true; + this.scene.time.delayedCall(150, () => { + this.scene.ui.fadeOut(750).then(() => { + const delay = Utils.getFrameMs(charFade); + this.scene.time.delayedCall(delay, () => { + this.scene.ui.fadeIn(500).then(() => { + this.textTimer.paused = false; + advance(); + }); + }); + }); + }); } else { advance(); } From d810af0b57b7d4633cc67405288d9b55ff696167 Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Sat, 20 Jul 2024 13:45:24 -0400 Subject: [PATCH 202/270] add the strong stuff encounter and more unit tests --- .../utils/encounter-phase-utils.ts | 2 +- .../utils/encounter-pokemon-utils.ts | 2 +- src/overrides.ts | 4 +- src/phases.ts | 11 +- src/phases/mystery-encounter-phases.ts | 20 +- .../department-store-sale-encounter.test.ts | 240 ++++++++++++++++++ .../fiery-fallout-encounter.test.ts | 25 +- .../encounters/lost-at-sea-encounter.test.ts | 15 +- .../the-strong-stuff-encounter.test.ts | 231 +++++++++++++++++ .../mystery-encounter-utils.test.ts | 2 +- src/test/utils/gameManager.ts | 8 +- src/ui/mystery-encounter-ui-handler.ts | 8 +- 12 files changed, 512 insertions(+), 56 deletions(-) create mode 100644 src/test/mystery-encounter/encounters/department-store-sale-encounter.test.ts create mode 100644 src/test/mystery-encounter/encounters/the-strong-stuff-encounter.test.ts diff --git a/src/data/mystery-encounters/utils/encounter-phase-utils.ts b/src/data/mystery-encounters/utils/encounter-phase-utils.ts index ac8c54d266b..40763358b89 100644 --- a/src/data/mystery-encounters/utils/encounter-phase-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-phase-utils.ts @@ -54,7 +54,7 @@ export function doTrainerExclamation(scene: BattleScene) { } }); - scene.playSound("GEN8- Exclaim.wav", { volume: 0.8 }); + scene.playSound("GEN8- Exclaim.wav", { volume: 0.7 }); } export interface EnemyPokemonConfig { diff --git a/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts b/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts index 07955a08a7d..2dbbe9f55a1 100644 --- a/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts @@ -207,7 +207,7 @@ export function applyHealToPokemon(scene: BattleScene, pokemon: PlayerPokemon, h export function modifyPlayerPokemonBST(pokemon: PlayerPokemon, value: number) { pokemon.getSpeciesForm().baseStats = [...pokemon.getSpeciesForm().baseStats].map(v => { const newVal = Math.floor(v + value); - return Math.min(newVal, 1); + return Math.max(newVal, 1); }); pokemon.calculateStats(); pokemon.updateInfo(); diff --git a/src/overrides.ts b/src/overrides.ts index d16895b27fa..e19a5bf20dd 100644 --- a/src/overrides.ts +++ b/src/overrides.ts @@ -117,9 +117,9 @@ export const EGG_GACHA_PULL_COUNT_OVERRIDE: number = 0; */ // 1 to 256, set to null to ignore -export const MYSTERY_ENCOUNTER_RATE_OVERRIDE: number = 256; +export const MYSTERY_ENCOUNTER_RATE_OVERRIDE: number = null; export const MYSTERY_ENCOUNTER_TIER_OVERRIDE: MysteryEncounterTier = null; -export const MYSTERY_ENCOUNTER_OVERRIDE: MysteryEncounterType = MysteryEncounterType.THE_STRONG_STUFF; +export const MYSTERY_ENCOUNTER_OVERRIDE: MysteryEncounterType = null; /** * MODIFIER / ITEM OVERRIDES diff --git a/src/phases.ts b/src/phases.ts index 904e860935b..0ceff19f059 100644 --- a/src/phases.ts +++ b/src/phases.ts @@ -1107,18 +1107,19 @@ export class EncounterPhase extends BattlePhase { if (showEncounterMessage) { const introDialogue = this.scene.currentBattle.mysteryEncounter.dialogue.intro; + const FIRST_DIALOGUE_PROMPT_DELAY = 750; let i = 0; const showNextDialogue = () => { const nextAction = i === introDialogue.length - 1 ? doShowEncounterOptions : showNextDialogue; const dialogue = introDialogue[i]; const title = getEncounterText(this.scene, dialogue.speaker); const text = getEncounterText(this.scene, dialogue.text); - if (title) { - this.scene.ui.showDialogue(text, title, null, nextAction, 0, i === 0 ? 750 : 0); - } else { - this.scene.ui.showText(text, null, nextAction, i === 0 ? 750 : 0, true); - } i++; + if (title) { + this.scene.ui.showDialogue(text, title, null, nextAction, 0, i === 1 ? FIRST_DIALOGUE_PROMPT_DELAY : 0); + } else { + this.scene.ui.showText(text, null, nextAction, i === 1 ? FIRST_DIALOGUE_PROMPT_DELAY : 0, true); + } }; if (introDialogue.length > 0) { diff --git a/src/phases/mystery-encounter-phases.ts b/src/phases/mystery-encounter-phases.ts index 11ff4766695..d55bcaad636 100644 --- a/src/phases/mystery-encounter-phases.ts +++ b/src/phases/mystery-encounter-phases.ts @@ -26,10 +26,9 @@ import { BattlerTagLapseType } from "#app/data/battler-tags"; * - Queuing of the MysteryEncounterOptionSelectedPhase */ export class MysteryEncounterPhase extends Phase { + private readonly FIRST_DIALOGUE_PROMPT_DELAY = 300; optionSelectSettings: OptionSelectSettings; - private FIRST_DIALOGUE_PROMPT_DELAY = 300; - /** * * @param scene @@ -108,12 +107,12 @@ export class MysteryEncounterPhase extends Phase { title = getEncounterText(this.scene, dialogue.speaker); } - if (title) { - this.scene.ui.showDialogue(text, title, null, nextAction, 0, i === 0 ? this.FIRST_DIALOGUE_PROMPT_DELAY : 0); - } else { - this.scene.ui.showText(text, null, nextAction, i === 0 ? this.FIRST_DIALOGUE_PROMPT_DELAY : 0, true); - } i++; + if (title) { + this.scene.ui.showDialogue(text, title, null, nextAction, 0, i === 1 ? this.FIRST_DIALOGUE_PROMPT_DELAY : 0); + } else { + this.scene.ui.showText(text, null, nextAction, i === 1 ? this.FIRST_DIALOGUE_PROMPT_DELAY : 0, true); + } }; showNextDialogue(); @@ -420,6 +419,7 @@ export class MysteryEncounterRewardsPhase extends Phase { * - Queuing of the next wave */ export class PostMysteryEncounterPhase extends Phase { + private readonly FIRST_DIALOGUE_PROMPT_DELAY = 750; onPostOptionSelect: OptionPhaseCallback; constructor(scene: BattleScene) { @@ -462,13 +462,13 @@ export class PostMysteryEncounterPhase extends Phase { title = getEncounterText(this.scene, dialogue.speaker); } + i++; this.scene.ui.setMode(Mode.MESSAGE); if (title) { - this.scene.ui.showDialogue(text, title, null, nextAction, 0, i === 0 ? 750 : 0); + this.scene.ui.showDialogue(text, title, null, nextAction, 0, i === 1 ? this.FIRST_DIALOGUE_PROMPT_DELAY : 0); } else { - this.scene.ui.showText(text, null, nextAction, i === 0 ? 750 : 0, true); + this.scene.ui.showText(text, null, nextAction, i === 1 ? this.FIRST_DIALOGUE_PROMPT_DELAY : 0, true); } - i++; }; showNextDialogue(); 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 new file mode 100644 index 00000000000..c8cbc88d54e --- /dev/null +++ b/src/test/mystery-encounter/encounters/department-store-sale-encounter.test.ts @@ -0,0 +1,240 @@ +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 * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { EncounterOptionMode } from "#app/data/mystery-encounters/mystery-encounter-option"; +import { runSelectMysteryEncounterOption } from "#test/mystery-encounter/encounterTestUtils"; +import { SelectModifierPhase } from "#app/phases"; +import BattleScene from "#app/battle-scene"; +import { MysteryEncounterTier } from "#app/data/mystery-encounters/mystery-encounter"; +import { Mode } from "#app/ui/ui"; +import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; +import { DepartmentStoreSaleEncounter } from "#app/data/mystery-encounters/encounters/department-store-sale-encounter"; +import { CIVILIZATION_ENCOUNTER_BIOMES } from "#app/data/mystery-encounters/mystery-encounters"; + +const namespace = "mysteryEncounter:departmentStoreSale"; +const defaultParty = [Species.LAPRAS, Species.GENGAR, Species.ABRA]; +const defaultBiome = Biome.PLAINS; +const defaultWave = 37; + +describe("Department Store Sale - 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.mysteryEncounterTier(MysteryEncounterTier.COMMON); + game.override.startingWave(defaultWave); + game.override.startingBiome(defaultBiome); + game.override.disableTrainerWave(true); + + const biomeMap = new Map([ + [Biome.VOLCANO, [MysteryEncounterType.MYSTERIOUS_CHALLENGERS]], + ]); + CIVILIZATION_ENCOUNTER_BIOMES.forEach(biome => { + biomeMap.set(biome, [MysteryEncounterType.DEPARTMENT_STORE_SALE]); + }); + vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue(biomeMap); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + vi.clearAllMocks(); + vi.resetAllMocks(); + }); + + it("should have the correct properties", async () => { + game.override.mysteryEncounter(MysteryEncounterType.DEPARTMENT_STORE_SALE); + await game.runToMysteryEncounter(MysteryEncounterType.DEPARTMENT_STORE_SALE, defaultParty); + + expect(DepartmentStoreSaleEncounter.encounterType).toBe(MysteryEncounterType.DEPARTMENT_STORE_SALE); + expect(DepartmentStoreSaleEncounter.encounterTier).toBe(MysteryEncounterTier.COMMON); + expect(DepartmentStoreSaleEncounter.dialogue).toBeDefined(); + expect(DepartmentStoreSaleEncounter.dialogue.intro).toStrictEqual([ + { text: `${namespace}:intro` }, + { + speaker: `${namespace}:speaker`, + text: `${namespace}:intro_dialogue`, + } + ]); + expect(DepartmentStoreSaleEncounter.dialogue.encounterOptionsDialogue.title).toBe(`${namespace}:title`); + expect(DepartmentStoreSaleEncounter.dialogue.encounterOptionsDialogue.description).toBe(`${namespace}:description`); + expect(DepartmentStoreSaleEncounter.dialogue.encounterOptionsDialogue.query).toBe(`${namespace}:query`); + expect(DepartmentStoreSaleEncounter.options.length).toBe(4); + }); + + it("should not spawn outside of CIVILIZATION_ENCOUNTER_BIOMES", async () => { + game.override.startingBiome(Biome.VOLCANO); + await game.runToMysteryEncounter(); + + expect(scene.currentBattle?.mysteryEncounter?.encounterType).not.toBe(MysteryEncounterType.DEPARTMENT_STORE_SALE); + }); + + it("should not run below wave 10", async () => { + game.override.startingWave(9); + + await game.runToMysteryEncounter(); + + expect(scene.currentBattle?.mysteryEncounter?.encounterType).not.toBe(MysteryEncounterType.DEPARTMENT_STORE_SALE); + }); + + it("should not run above wave 179", async () => { + game.override.startingWave(181); + + await game.runToMysteryEncounter(); + + expect(scene.currentBattle.mysteryEncounter).toBeUndefined(); + }); + + describe("Option 1 - TM Shop", () => { + it("should have the correct properties", () => { + const option = DepartmentStoreSaleEncounter.options[0]; + expect(option.optionMode).toBe(EncounterOptionMode.DEFAULT); + expect(option.dialogue).toBeDefined(); + expect(option.dialogue).toStrictEqual({ + buttonLabel: `${namespace}:option:1:label`, + buttonTooltip: `${namespace}:option:1:tooltip`, + }); + }); + + it("should have shop with only TMs", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.DEPARTMENT_STORE_SALE, defaultParty); + await runSelectMysteryEncounterOption(game, 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(4); + for (const option of modifierSelectHandler.options) { + expect(option.modifierTypeOption.type.id).toContain("TM_"); + } + }); + + it("should leave encounter without battle", async () => { + const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); + + await game.runToMysteryEncounter(MysteryEncounterType.DEPARTMENT_STORE_SALE, defaultParty); + await runSelectMysteryEncounterOption(game, 1); + + expect(leaveEncounterWithoutBattleSpy).toBeCalled(); + }); + }); + + describe("Option 2 - Vitamin Shop", () => { + it("should have the correct properties", () => { + const option = DepartmentStoreSaleEncounter.options[1]; + expect(option.optionMode).toBe(EncounterOptionMode.DEFAULT); + expect(option.dialogue).toBeDefined(); + expect(option.dialogue).toStrictEqual({ + buttonLabel: `${namespace}:option:2:label`, + buttonTooltip: `${namespace}:option:2:tooltip`, + }); + }); + + it("should have shop with only Vitamins", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.DEPARTMENT_STORE_SALE, defaultParty); + await runSelectMysteryEncounterOption(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); + for (const option of modifierSelectHandler.options) { + expect(option.modifierTypeOption.type.id.includes("PP_UP") || + option.modifierTypeOption.type.id.includes("BASE_STAT_BOOSTER")).toBeTruthy(); + } + }); + + it("should leave encounter without battle", async () => { + const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); + + await game.runToMysteryEncounter(MysteryEncounterType.DEPARTMENT_STORE_SALE, defaultParty); + await runSelectMysteryEncounterOption(game, 2); + + expect(leaveEncounterWithoutBattleSpy).toBeCalled(); + }); + }); + + describe("Option 3 - X Item Shop", () => { + it("should have the correct properties", () => { + const option = DepartmentStoreSaleEncounter.options[2]; + expect(option.optionMode).toBe(EncounterOptionMode.DEFAULT); + expect(option.dialogue).toBeDefined(); + expect(option.dialogue).toStrictEqual({ + buttonLabel: `${namespace}:option:3:label`, + buttonTooltip: `${namespace}:option:3:tooltip`, + }); + }); + + it("should have shop with only X Items", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.DEPARTMENT_STORE_SALE, defaultParty); + await runSelectMysteryEncounterOption(game, 3); + 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(5); + for (const option of modifierSelectHandler.options) { + expect(option.modifierTypeOption.type.id.includes("DIRE_HIT") || + option.modifierTypeOption.type.id.includes("TEMP_STAT_BOOSTER")).toBeTruthy(); + } + }); + + it("should leave encounter without battle", async () => { + const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); + + await game.runToMysteryEncounter(MysteryEncounterType.DEPARTMENT_STORE_SALE, defaultParty); + await runSelectMysteryEncounterOption(game, 3); + + expect(leaveEncounterWithoutBattleSpy).toBeCalled(); + }); + }); + + describe("Option 4 - Pokeball Shop", () => { + it("should have the correct properties", () => { + const option = DepartmentStoreSaleEncounter.options[3]; + expect(option.optionMode).toBe(EncounterOptionMode.DEFAULT); + expect(option.dialogue).toBeDefined(); + expect(option.dialogue).toStrictEqual({ + buttonLabel: `${namespace}:option:4:label`, + buttonTooltip: `${namespace}:option:4:tooltip`, + }); + }); + + it("should have shop with only Pokeballs", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.DEPARTMENT_STORE_SALE, defaultParty); + await runSelectMysteryEncounterOption(game, 4); + 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(4); + for (const option of modifierSelectHandler.options) { + expect(option.modifierTypeOption.type.id).toContain("BALL"); + } + }); + + it("should leave encounter without battle", async () => { + const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); + + await game.runToMysteryEncounter(MysteryEncounterType.DEPARTMENT_STORE_SALE, defaultParty); + await runSelectMysteryEncounterOption(game, 4); + + expect(leaveEncounterWithoutBattleSpy).toBeCalled(); + }); + }); +}); 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 20d0426e02d..6dd8593787e 100644 --- a/src/test/mystery-encounter/encounters/fiery-fallout-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/fiery-fallout-encounter.test.ts @@ -24,7 +24,7 @@ const namespace = "mysteryEncounter:fieryFallout"; /** Arcanine and Ninetails for 2 Fire types. Lapras, Gengar, Abra for burnable mon. */ const defaultParty = [Species.ARCANINE, Species.NINETALES, Species.LAPRAS, Species.GENGAR, Species.ABRA]; const defaultBiome = Biome.VOLCANO; -const defaultWave = 45; +const defaultWave = 56; describe("Fiery Fallout - Mystery Encounter", () => { let phaserGame: Phaser.Game; @@ -42,7 +42,6 @@ describe("Fiery Fallout - Mystery Encounter", () => { game.override.mysteryEncounterTier(MysteryEncounterTier.COMMON); game.override.startingWave(defaultWave); game.override.startingBiome(defaultBiome); - game.override.disableTrainerWave(true); vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue( new Map([ @@ -54,6 +53,8 @@ describe("Fiery Fallout - Mystery Encounter", () => { afterEach(() => { game.phaseInterceptor.restoreOg(); + vi.clearAllMocks(); + vi.resetAllMocks(); }); it("should have the correct properties", async () => { @@ -74,7 +75,7 @@ describe("Fiery Fallout - Mystery Encounter", () => { game.override.startingBiome(Biome.MOUNTAIN); await game.runToMysteryEncounter(); - expect(scene.currentBattle.mysteryEncounter.encounterType).not.toBe(MysteryEncounterType.FIERY_FALLOUT); + expect(scene.currentBattle?.mysteryEncounter?.encounterType).not.toBe(MysteryEncounterType.FIERY_FALLOUT); }); it("should not run below wave 41", async () => { @@ -82,7 +83,7 @@ describe("Fiery Fallout - Mystery Encounter", () => { await game.runToMysteryEncounter(); - expect(scene.currentBattle.mysteryEncounter.encounterType).not.toBe(MysteryEncounterType.FIERY_FALLOUT); + expect(scene.currentBattle?.mysteryEncounter?.encounterType).not.toBe(MysteryEncounterType.FIERY_FALLOUT); }); it("should not run above wave 179", async () => { @@ -96,7 +97,7 @@ describe("Fiery Fallout - Mystery Encounter", () => { it("should initialize fully ", async () => { vi.spyOn(scene, "currentBattle", "get").mockReturnValue({ mysteryEncounter: FieryFalloutEncounter } as Battle); const weatherSpy = vi.spyOn(scene.arena, "trySetWeather").mockReturnValue(true); - const moveInitSpy = vi.spyOn(BattleAnims, "loadMoveAnimAssets"); + const moveInitSpy = vi.spyOn(BattleAnims, "initMoveAnim"); const moveLoadSpy = vi.spyOn(BattleAnims, "loadMoveAnimAssets"); const { onInit } = FieryFalloutEncounter; @@ -130,10 +131,6 @@ describe("Fiery Fallout - Mystery Encounter", () => { }); describe("Option 1 - Fight 2 Volcarona", () => { - beforeEach(async () => { - game.override.mysteryEncounter(MysteryEncounterType.FIERY_FALLOUT); - }); - it("should have the correct properties", () => { const option1 = FieryFalloutEncounter.options[0]; expect(option1.optionMode).toBe(EncounterOptionMode.DEFAULT); @@ -180,14 +177,10 @@ describe("Fiery Fallout - Mystery Encounter", () => { && (m as PokemonHeldItemModifier).pokemonId === leadPokemonId, true) as PokemonHeldItemModifier[]; const charcoal = leadPokemonItems.find(i => i.type.name === "Charcoal"); expect(charcoal).toBeDefined; - }, 100000000); + }); }); describe("Option 2 - Suffer the weather", () => { - beforeEach(async () => { - game.override.mysteryEncounter(MysteryEncounterType.FIERY_FALLOUT); - }); - it("should have the correct properties", () => { const option1 = FieryFalloutEncounter.options[1]; expect(option1.optionMode).toBe(EncounterOptionMode.DEFAULT); @@ -235,10 +228,6 @@ describe("Fiery Fallout - Mystery Encounter", () => { }); describe("Option 3 - use FIRE types", () => { - beforeEach(async () => { - game.override.mysteryEncounter(MysteryEncounterType.FIERY_FALLOUT); - }); - it("should have the correct properties", () => { const option1 = FieryFalloutEncounter.options[2]; expect(option1.optionMode).toBe(EncounterOptionMode.DISABLED_OR_SPECIAL); 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 04854574a77..5f2df5b20eb 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 @@ -32,7 +32,6 @@ describe("Lost at Sea - Mystery Encounter", () => { game.override.mysteryEncounterChance(100); game.override.startingWave(defaultWave); game.override.startingBiome(defaultBiome); - game.override.disableTrainerWave(true); vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue( new Map([ @@ -44,6 +43,8 @@ describe("Lost at Sea - Mystery Encounter", () => { afterEach(() => { game.phaseInterceptor.restoreOg(); + vi.clearAllMocks(); + vi.resetAllMocks(); }); it("should have the correct properties", async () => { @@ -99,10 +100,6 @@ describe("Lost at Sea - Mystery Encounter", () => { }); describe("Option 1 - Surf", () => { - beforeEach(async () => { - game.override.mysteryEncounter(MysteryEncounterType.LOST_AT_SEA); - }); - it("should have the correct properties", () => { const option1 = LostAtSeaEncounter.options[0]; expect(option1.optionMode).toBe(EncounterOptionMode.DISABLED_OR_DEFAULT); @@ -149,10 +146,6 @@ describe("Lost at Sea - Mystery Encounter", () => { }); describe("Option 2 - Fly", () => { - beforeEach(async () => { - game.override.mysteryEncounter(MysteryEncounterType.LOST_AT_SEA); - }); - it("should have the correct properties", () => { const option2 = LostAtSeaEncounter.options[1]; @@ -202,10 +195,6 @@ describe("Lost at Sea - Mystery Encounter", () => { }); describe("Option 3 - Wander aimlessy", () => { - beforeEach(async () => { - game.override.mysteryEncounter(MysteryEncounterType.LOST_AT_SEA); - }); - it("should have the correct properties", () => { const option3 = LostAtSeaEncounter.options[2]; 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 new file mode 100644 index 00000000000..0df99c56cae --- /dev/null +++ b/src/test/mystery-encounter/encounters/the-strong-stuff-encounter.test.ts @@ -0,0 +1,231 @@ +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 Battle from "#app/battle"; +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 { EncounterOptionMode } from "#app/data/mystery-encounters/mystery-encounter-option"; +import { runSelectMysteryEncounterOption, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounterTestUtils"; +import { CommandPhase, MovePhase, SelectModifierPhase } from "#app/phases"; +import { Moves } from "#enums/moves"; +import BattleScene from "#app/battle-scene"; +import * as Modifiers from "#app/modifier/modifier"; +import { MysteryEncounterTier } from "#app/data/mystery-encounters/mystery-encounter"; +import { TheStrongStuffEncounter } from "#app/data/mystery-encounters/encounters/the-strong-stuff-encounter"; +import { Nature } from "#app/data/nature"; +import { BerryType } from "#enums/berry-type"; +import { BattlerTagType } from "#enums/battler-tag-type"; +import { PokemonMove } from "#app/field/pokemon"; +import { Mode } from "#app/ui/ui"; +import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; + +const namespace = "mysteryEncounter:theStrongStuff"; +const defaultParty = [Species.LAPRAS, Species.GENGAR, Species.ABRA]; +const defaultBiome = Biome.CAVE; +const defaultWave = 45; + +describe("The Strong Stuff - 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.mysteryEncounterTier(MysteryEncounterTier.COMMON); + game.override.startingWave(defaultWave); + game.override.startingBiome(defaultBiome); + + vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue( + new Map([ + [Biome.CAVE, [MysteryEncounterType.THE_STRONG_STUFF]], + [Biome.MOUNTAIN, [MysteryEncounterType.MYSTERIOUS_CHALLENGERS]], + ]) + ); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + vi.clearAllMocks(); + vi.resetAllMocks(); + }); + + it("should have the correct properties", async () => { + game.override.mysteryEncounter(MysteryEncounterType.THE_STRONG_STUFF); + await game.runToMysteryEncounter(MysteryEncounterType.THE_STRONG_STUFF, defaultParty); + + expect(TheStrongStuffEncounter.encounterType).toBe(MysteryEncounterType.THE_STRONG_STUFF); + expect(TheStrongStuffEncounter.encounterTier).toBe(MysteryEncounterTier.COMMON); + expect(TheStrongStuffEncounter.dialogue).toBeDefined(); + expect(TheStrongStuffEncounter.dialogue.intro).toStrictEqual([{ text: `${namespace}:intro` }]); + expect(TheStrongStuffEncounter.dialogue.encounterOptionsDialogue.title).toBe(`${namespace}:title`); + expect(TheStrongStuffEncounter.dialogue.encounterOptionsDialogue.description).toBe(`${namespace}:description`); + expect(TheStrongStuffEncounter.dialogue.encounterOptionsDialogue.query).toBe(`${namespace}:query`); + expect(TheStrongStuffEncounter.options.length).toBe(2); + }); + + it("should not spawn outside of CAVE biome", async () => { + game.override.startingBiome(Biome.MOUNTAIN); + await game.runToMysteryEncounter(); + + expect(scene.currentBattle?.mysteryEncounter?.encounterType).not.toBe(MysteryEncounterType.THE_STRONG_STUFF); + }); + + it("should not run below wave 10", async () => { + game.override.startingWave(9); + + await game.runToMysteryEncounter(); + + expect(scene.currentBattle?.mysteryEncounter?.encounterType).not.toBe(MysteryEncounterType.THE_STRONG_STUFF); + }); + + 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 () => { + vi.spyOn(scene, "currentBattle", "get").mockReturnValue({ mysteryEncounter: TheStrongStuffEncounter } as Battle); + const moveInitSpy = vi.spyOn(BattleAnims, "loadMoveAnimAssets"); + const moveLoadSpy = vi.spyOn(BattleAnims, "loadMoveAnimAssets"); + + const { onInit } = TheStrongStuffEncounter; + + expect(TheStrongStuffEncounter.onInit).toBeDefined(); + + const onInitResult = onInit(scene); + + expect(TheStrongStuffEncounter.enemyPartyConfigs).toEqual([ + { + levelAdditiveMultiplier: 1, + disableSwitch: true, + pokemonConfigs: [ + { + species: getPokemonSpecies(Species.SHUCKLE), + isBoss: true, + bossSegments: 5, + spriteScale: 1.5, + nature: Nature.BOLD, + moveSet: [Moves.INFESTATION, Moves.SALT_CURE, Moves.GASTRO_ACID, Moves.HEAL_ORDER], + modifierTypes: expect.any(Array), + tags: [BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON], + mysteryEncounterBattleEffects: expect.any(Function) + } + ], + } + ]); + await vi.waitFor(() => expect(moveInitSpy).toHaveBeenCalled()); + await vi.waitFor(() => expect(moveLoadSpy).toHaveBeenCalled()); + expect(onInitResult).toBe(true); + }); + + describe("Option 1 - Power Swap BSTs", () => { + it("should have the correct properties", () => { + const option1 = TheStrongStuffEncounter.options[0]; + expect(option1.optionMode).toBe(EncounterOptionMode.DEFAULT); + expect(option1.dialogue).toBeDefined(); + expect(option1.dialogue).toStrictEqual({ + buttonLabel: `${namespace}:option:1:label`, + buttonTooltip: `${namespace}:option:1:tooltip`, + selected: [ + { + text: `${namespace}:option:1:selected`, + }, + ], + }); + }); + + it("should lower stats of highest BST and raise stats for rest of party", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.THE_STRONG_STUFF, defaultParty); + + const bstsPrior = scene.getParty().map(p => p.getSpeciesForm().getBaseStatTotal()); + await runSelectMysteryEncounterOption(game, 1); + + const bstsAfter = scene.getParty().map(p => { + return p.getSpeciesForm().getBaseStatTotal(); + }); + + expect(bstsAfter[0]).toEqual(bstsPrior[0] - 20 * 6); + expect(bstsAfter[1]).toEqual(bstsPrior[1] + 10 * 6); + expect(bstsAfter[2]).toEqual(bstsPrior[2] + 10 * 6); + }); + + it("should leave encounter without battle", async () => { + const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); + + await game.runToMysteryEncounter(MysteryEncounterType.THE_STRONG_STUFF, defaultParty); + await runSelectMysteryEncounterOption(game, 1); + + expect(leaveEncounterWithoutBattleSpy).toBeCalled(); + }); + }); + + describe("Option 2 - battle the Shuckle", () => { + it("should have the correct properties", () => { + const option1 = TheStrongStuffEncounter.options[1]; + expect(option1.optionMode).toBe(EncounterOptionMode.DEFAULT); + expect(option1.dialogue).toBeDefined(); + expect(option1.dialogue).toStrictEqual({ + buttonLabel: `${namespace}:option:2:label`, + buttonTooltip: `${namespace}:option:2:tooltip`, + selected: [ + { + text: `${namespace}:option:2:selected`, + }, + ], + }); + }); + + it("should start battle against Shuckle", async () => { + const phaseSpy = vi.spyOn(scene, "pushPhase"); + + await game.runToMysteryEncounter(MysteryEncounterType.THE_STRONG_STUFF, defaultParty); + await runSelectMysteryEncounterOption(game, 2, true); + + const enemyField = scene.getEnemyField(); + expect(scene.getCurrentPhase().constructor.name).toBe(CommandPhase.name); + expect(enemyField.length).toBe(1); + expect(enemyField[0].species.speciesId).toBe(Species.SHUCKLE); + expect(enemyField[0].summonData.battleStats).toEqual([0, 2, 0, 2, 0, 0, 0]); + const shuckleItems = scene.getModifiers(Modifiers.BerryModifier, false); + expect(shuckleItems.length).toBe(4); + expect(shuckleItems.find(m => m.berryType === BerryType.SITRUS)?.stackCount).toBe(1); + expect(shuckleItems.find(m => m.berryType === BerryType.GANLON)?.stackCount).toBe(1); + expect(shuckleItems.find(m => m.berryType === BerryType.APICOT)?.stackCount).toBe(1); + expect(shuckleItems.find(m => m.berryType === BerryType.LUM)?.stackCount).toBe(2); + expect(enemyField[0].moveset).toEqual([new PokemonMove(Moves.INFESTATION), new PokemonMove(Moves.SALT_CURE), new PokemonMove(Moves.GASTRO_ACID), new PokemonMove(Moves.HEAL_ORDER)]); + + // Should have used moves pre-battle + const movePhases = phaseSpy.mock.calls.filter(p => p[0] instanceof MovePhase).map(p => p[0]); + expect(movePhases.length).toBe(2); + expect(movePhases.filter(p => (p as MovePhase).move.moveId === Moves.GASTRO_ACID).length).toBe(1); + expect(movePhases.filter(p => (p as MovePhase).move.moveId === Moves.STEALTH_ROCK).length).toBe(1); + }); + + it("should have Soul Dew in rewards", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.THE_STRONG_STUFF, defaultParty); + await runSelectMysteryEncounterOption(game, 2, true); + await skipBattleRunMysteryEncounterRewardsPhase(game); + await game.phaseInterceptor.to(SelectModifierPhase, false); + 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).toEqual("SOUL_DEW"); + }); + }); +}); diff --git a/src/test/mystery-encounter/mystery-encounter-utils.test.ts b/src/test/mystery-encounter/mystery-encounter-utils.test.ts index 2867bcc63bc..cdc7eda180f 100644 --- a/src/test/mystery-encounter/mystery-encounter-utils.test.ts +++ b/src/test/mystery-encounter/mystery-encounter-utils.test.ts @@ -243,7 +243,7 @@ describe("Mystery Encounter Utils", () => { arceus.hp = 100; expect(arceus.isAllowedInBattle()).toBe(true); - koPlayerPokemon(arceus); + koPlayerPokemon(scene, arceus); expect(arceus.isAllowedInBattle()).toBe(false); }); }); diff --git a/src/test/utils/gameManager.ts b/src/test/utils/gameManager.ts index 7ccec8113b3..039f55c4621 100644 --- a/src/test/utils/gameManager.ts +++ b/src/test/utils/gameManager.ts @@ -38,6 +38,7 @@ import {MysteryEncounterPhase} from "#app/phases/mystery-encounter-phases"; import { OverridesHelper } from "./overridesHelper"; import { expect } from "vitest"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; +import { isNullOrUndefined } from "#app/utils"; /** * Class to manage the game state and transitions between phases. @@ -151,6 +152,11 @@ export default class GameManager { * @returns A promise that resolves when the EncounterPhase ends. */ async runToMysteryEncounter(encounterType?: MysteryEncounterType, species?: Species[]) { + if (!isNullOrUndefined(encounterType)) { + this.override.disableTrainerWave(true); + this.override.mysteryEncounter(encounterType); + } + await this.runToTitle(); this.onNextPrompt("TitlePhase", Mode.TITLE, () => { @@ -167,7 +173,7 @@ export default class GameManager { }, () => this.isCurrentPhase(MysteryEncounterPhase), true); await this.phaseInterceptor.run(EncounterPhase); - if (encounterType) { + if (!isNullOrUndefined(encounterType)) { expect(this.scene.currentBattle?.mysteryEncounter?.encounterType).toBe(encounterType); } } diff --git a/src/ui/mystery-encounter-ui-handler.ts b/src/ui/mystery-encounter-ui-handler.ts index 3031d3d24c5..788d8811db1 100644 --- a/src/ui/mystery-encounter-ui-handler.ts +++ b/src/ui/mystery-encounter-ui-handler.ts @@ -285,7 +285,7 @@ export default class MysteryEncounterUiHandler extends UiHandler { this.cursor = cursor; } - this.viewPartyIndex = this.optionsContainer.length - 1; + this.viewPartyIndex = this.optionsContainer.list?.length - 1; if (!this.cursorObj) { this.cursorObj = this.scene.add.image(0, 0, "cursor"); @@ -294,11 +294,11 @@ export default class MysteryEncounterUiHandler extends UiHandler { if (cursor === this.viewPartyIndex) { this.cursorObj.setPosition(246, -17); - } else if (this.optionsContainer.length === 3) { // 2 Options + } else if (this.optionsContainer.list?.length === 3) { // 2 Options this.cursorObj.setPosition(-10.5 + (cursor % 2 === 1 ? 100 : 0), 15); - } else if (this.optionsContainer.length === 4) { // 3 Options + } else if (this.optionsContainer.list?.length === 4) { // 3 Options this.cursorObj.setPosition(-10.5 + (cursor % 2 === 1 ? 100 : 0), 7 + (cursor > 1 ? 16 : 0)); - } else if (this.optionsContainer.length === 5) { // 4 Options + } else if (this.optionsContainer.list?.length === 5) { // 4 Options this.cursorObj.setPosition(-10.5 + (cursor % 2 === 1 ? 100 : 0), 7 + (cursor > 1 ? 16 : 0)); } From 0475946367639add93b7f7236a3933094764fb90 Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Sat, 20 Jul 2024 13:50:47 -0400 Subject: [PATCH 203/270] cleanup container length checks in ME ui --- src/ui/mystery-encounter-ui-handler.ts | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/ui/mystery-encounter-ui-handler.ts b/src/ui/mystery-encounter-ui-handler.ts index 788d8811db1..72cce41d55f 100644 --- a/src/ui/mystery-encounter-ui-handler.ts +++ b/src/ui/mystery-encounter-ui-handler.ts @@ -136,7 +136,8 @@ export default class MysteryEncounterUiHandler extends UiHandler { // TODO: If we need to handle cancel option? Maybe default logic to leave/run from encounter idk } } else { - switch (this.optionsContainer.list.length) { + switch (this.optionsContainer.getAll()?.length) { + default: case 3: success = this.handleTwoOptionMoveInput(button); break; @@ -285,7 +286,7 @@ export default class MysteryEncounterUiHandler extends UiHandler { this.cursor = cursor; } - this.viewPartyIndex = this.optionsContainer.list?.length - 1; + this.viewPartyIndex = this.optionsContainer.getAll()?.length - 1; if (!this.cursorObj) { this.cursorObj = this.scene.add.image(0, 0, "cursor"); @@ -294,11 +295,11 @@ export default class MysteryEncounterUiHandler extends UiHandler { if (cursor === this.viewPartyIndex) { this.cursorObj.setPosition(246, -17); - } else if (this.optionsContainer.list?.length === 3) { // 2 Options + } else if (this.optionsContainer.getAll()?.length === 3) { // 2 Options this.cursorObj.setPosition(-10.5 + (cursor % 2 === 1 ? 100 : 0), 15); - } else if (this.optionsContainer.list?.length === 4) { // 3 Options + } else if (this.optionsContainer.getAll()?.length === 4) { // 3 Options this.cursorObj.setPosition(-10.5 + (cursor % 2 === 1 ? 100 : 0), 7 + (cursor > 1 ? 16 : 0)); - } else if (this.optionsContainer.list?.length === 5) { // 4 Options + } else if (this.optionsContainer.getAll()?.length === 5) { // 4 Options this.cursorObj.setPosition(-10.5 + (cursor % 2 === 1 ? 100 : 0), 7 + (cursor > 1 ? 16 : 0)); } From 8de1ca8fec3085e2708df5b3bbee2bfd4587b099 Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Sat, 20 Jul 2024 13:59:04 -0400 Subject: [PATCH 204/270] add retries to tests --- .github/workflows/mystery-events.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/mystery-events.yml b/.github/workflows/mystery-events.yml index 66ab3dd1659..499ce03b136 100644 --- a/.github/workflows/mystery-events.yml +++ b/.github/workflows/mystery-events.yml @@ -50,4 +50,4 @@ jobs: run: npm ci # Use 'npm ci' to install dependencies - name: tests # Step to run tests - run: npm run test${{ runner.debug == '0' &&':silent' || '' }} # silent on default. if debug run loud + run: npm run test${{ runner.debug == '0' &&':silent' || '' }} --retry=3 # silent on default. if debug run loud. Retry failed tests up to 3 times From c7ed5bee97dbce0e4500ee3a22826aec94bc8d83 Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Sat, 20 Jul 2024 14:01:04 -0400 Subject: [PATCH 205/270] add retries to tests --- .github/workflows/mystery-events.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/mystery-events.yml b/.github/workflows/mystery-events.yml index 499ce03b136..e2b756a9ca8 100644 --- a/.github/workflows/mystery-events.yml +++ b/.github/workflows/mystery-events.yml @@ -50,4 +50,4 @@ jobs: run: npm ci # Use 'npm ci' to install dependencies - name: tests # Step to run tests - run: npm run test${{ runner.debug == '0' &&':silent' || '' }} --retry=3 # silent on default. if debug run loud. Retry failed tests up to 3 times + run: npm run test${{ runner.debug == '0' &&':silent' || '' }} -- --retry=3 # silent on default. if debug run loud. Retry failed tests up to 3 times From 4133302c5dbabcea20b187cfa62721cb3e37f5c4 Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Sat, 20 Jul 2024 14:38:48 -0400 Subject: [PATCH 206/270] fix trainer wave disable override --- .github/workflows/mystery-events.yml | 2 +- .../department-store-sale-encounter.test.ts | 3 +-- .../encounters/fiery-fallout-encounter.test.ts | 1 - .../encounters/lost-at-sea-encounter.test.ts | 1 - .../encounters/the-strong-stuff-encounter.test.ts | 1 - src/test/mystery-encounter/mystery-encounter.test.ts | 2 -- src/test/phases/mystery-encounter-phase.test.ts | 1 - src/test/utils/gameManager.ts | 2 +- src/test/utils/overridesHelper.ts | 11 +++++++++-- 9 files changed, 12 insertions(+), 12 deletions(-) diff --git a/.github/workflows/mystery-events.yml b/.github/workflows/mystery-events.yml index e2b756a9ca8..621bffb3e2b 100644 --- a/.github/workflows/mystery-events.yml +++ b/.github/workflows/mystery-events.yml @@ -50,4 +50,4 @@ jobs: run: npm ci # Use 'npm ci' to install dependencies - name: tests # Step to run tests - run: npm run test${{ runner.debug == '0' &&':silent' || '' }} -- --retry=3 # silent on default. if debug run loud. Retry failed tests up to 3 times + run: npm run test${{ runner.debug == '0' &&':silent' || '' }} # silent on default. if debug run loud. 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 c8cbc88d54e..cbc5ab7950e 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 @@ -36,7 +36,7 @@ describe("Department Store Sale - Mystery Encounter", () => { game.override.mysteryEncounterTier(MysteryEncounterTier.COMMON); game.override.startingWave(defaultWave); game.override.startingBiome(defaultBiome); - game.override.disableTrainerWave(true); + game.override.disableTrainerWaves(true); const biomeMap = new Map([ [Biome.VOLCANO, [MysteryEncounterType.MYSTERIOUS_CHALLENGERS]], @@ -54,7 +54,6 @@ describe("Department Store Sale - Mystery Encounter", () => { }); it("should have the correct properties", async () => { - game.override.mysteryEncounter(MysteryEncounterType.DEPARTMENT_STORE_SALE); await game.runToMysteryEncounter(MysteryEncounterType.DEPARTMENT_STORE_SALE, defaultParty); expect(DepartmentStoreSaleEncounter.encounterType).toBe(MysteryEncounterType.DEPARTMENT_STORE_SALE); 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 6dd8593787e..33845d1dfe5 100644 --- a/src/test/mystery-encounter/encounters/fiery-fallout-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/fiery-fallout-encounter.test.ts @@ -58,7 +58,6 @@ describe("Fiery Fallout - Mystery Encounter", () => { }); it("should have the correct properties", async () => { - game.override.mysteryEncounter(MysteryEncounterType.FIERY_FALLOUT); await game.runToMysteryEncounter(MysteryEncounterType.FIERY_FALLOUT, defaultParty); expect(FieryFalloutEncounter.encounterType).toBe(MysteryEncounterType.FIERY_FALLOUT); 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 5f2df5b20eb..6d36f47a8c1 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 @@ -48,7 +48,6 @@ describe("Lost at Sea - Mystery Encounter", () => { }); it("should have the correct properties", async () => { - game.override.mysteryEncounter(MysteryEncounterType.LOST_AT_SEA); await game.runToMysteryEncounter(MysteryEncounterType.LOST_AT_SEA, defaultParty); expect(LostAtSeaEncounter.encounterType).toBe(MysteryEncounterType.LOST_AT_SEA); 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 0df99c56cae..ed15380b8c9 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 @@ -60,7 +60,6 @@ describe("The Strong Stuff - Mystery Encounter", () => { }); it("should have the correct properties", async () => { - game.override.mysteryEncounter(MysteryEncounterType.THE_STRONG_STUFF); await game.runToMysteryEncounter(MysteryEncounterType.THE_STRONG_STUFF, defaultParty); expect(TheStrongStuffEncounter.encounterType).toBe(MysteryEncounterType.THE_STRONG_STUFF); diff --git a/src/test/mystery-encounter/mystery-encounter.test.ts b/src/test/mystery-encounter/mystery-encounter.test.ts index ef0b5b3238a..0ba28bb77ec 100644 --- a/src/test/mystery-encounter/mystery-encounter.test.ts +++ b/src/test/mystery-encounter/mystery-encounter.test.ts @@ -23,8 +23,6 @@ describe("Mystery Encounters", () => { game = new GameManager(phaserGame); game.override.startingWave(11); game.override.mysteryEncounterChance(100); - game.override.mysteryEncounter(MysteryEncounterType.MYSTERIOUS_CHALLENGERS); - game.override.disableTrainerWave(true); }); it("Spawns a mystery encounter", async () => { diff --git a/src/test/phases/mystery-encounter-phase.test.ts b/src/test/phases/mystery-encounter-phase.test.ts index 2a7d3de3700..5c7c9958c80 100644 --- a/src/test/phases/mystery-encounter-phase.test.ts +++ b/src/test/phases/mystery-encounter-phase.test.ts @@ -28,7 +28,6 @@ describe("Mystery Encounter Phases", () => { game = new GameManager(phaserGame); game.override.startingWave(11); game.override.mysteryEncounterChance(100); - game.override.mysteryEncounter(MysteryEncounterType.MYSTERIOUS_CHALLENGERS); // Seed guarantees wild encounter to be replaced by ME game.override.seed("test"); }); diff --git a/src/test/utils/gameManager.ts b/src/test/utils/gameManager.ts index 039f55c4621..a8bd8ee3404 100644 --- a/src/test/utils/gameManager.ts +++ b/src/test/utils/gameManager.ts @@ -153,7 +153,7 @@ export default class GameManager { */ async runToMysteryEncounter(encounterType?: MysteryEncounterType, species?: Species[]) { if (!isNullOrUndefined(encounterType)) { - this.override.disableTrainerWave(true); + this.override.disableTrainerWaves(true); this.override.mysteryEncounter(encounterType); } diff --git a/src/test/utils/overridesHelper.ts b/src/test/utils/overridesHelper.ts index 4116810be5d..d2011bf4581 100644 --- a/src/test/utils/overridesHelper.ts +++ b/src/test/utils/overridesHelper.ts @@ -6,6 +6,8 @@ import GameManager from "#test/utils/gameManager"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import * as overrides from "#app/overrides"; import { MysteryEncounterTier } from "#app/data/mystery-encounters/mystery-encounter"; +import * as GameMode from "#app/game-mode"; +import { GameModes, getGameMode } from "#app/game-mode"; /** * Helper to handle overrides in tests @@ -77,8 +79,13 @@ export class OverridesHelper { * @returns spy instance * @param disable - true */ - disableTrainerWave(disable: boolean): MockInstance { - const spy = vi.spyOn(this.game.scene.gameMode, "isWaveTrainer").mockReturnValue(!disable); + disableTrainerWaves(disable: boolean): MockInstance { + const realFn = getGameMode; + const spy = vi.spyOn(GameMode, "getGameMode").mockImplementation((gameMode: GameModes) => { + const mode = realFn(gameMode); + mode.hasTrainers = !disable; + return mode; + }); this.log(`Standard trainer waves are ${disable? "disabled" : "enabled"}!`); return spy; } From f2b3a9ba4c7993b67df53be203f1953491340582 Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Sat, 20 Jul 2024 17:31:26 -0400 Subject: [PATCH 207/270] add shuckle juice modifier --- public/images/items.json | 6079 +++++++++-------- public/images/items.png | Bin 135511 -> 54907 bytes .../berry_juice.png | Bin ...berry_juice.json => pokemon_salesman.json} | 22 +- .../mystery-encounters/pokemon_salesman.png | Bin 0 -> 839 bytes .../encounters/fight-or-flight-encounter.ts | 1 + .../encounters/pokemon-salesman-encounter.ts | 291 + .../encounters/the-strong-stuff-encounter.ts | 10 +- .../mystery-encounters/mystery-encounters.ts | 6 +- .../utils/encounter-pokemon-utils.ts | 13 +- src/enums/mystery-encounter-type.ts | 3 +- src/field/pokemon.ts | 3 +- src/locales/en/modifier-type.ts | 12 + src/locales/en/mystery-encounter.ts | 2 + .../pokemon-salesman-dialogue.ts | 25 + src/modifier/modifier-type.ts | 28 + src/modifier/modifier.ts | 49 + src/overrides.ts | 4 +- 18 files changed, 3493 insertions(+), 3055 deletions(-) rename public/images/{mystery-encounters => items}/berry_juice.png (100%) rename public/images/mystery-encounters/{berry_juice.json => pokemon_salesman.json} (57%) create mode 100644 public/images/mystery-encounters/pokemon_salesman.png create mode 100644 src/data/mystery-encounters/encounters/pokemon-salesman-encounter.ts create mode 100644 src/locales/en/mystery-encounters/pokemon-salesman-dialogue.ts diff --git a/public/images/items.json b/public/images/items.json index 33dcf8f5e9a..a09aa42374f 100644 --- a/public/images/items.json +++ b/public/images/items.json @@ -4,8 +4,8 @@ "image": "items.png", "format": "RGBA8888", "size": { - "w": 415, - "h": 415 + "w": 416, + "h": 416 }, "scale": 1, "frames": [ @@ -744,27 +744,6 @@ "h": 24 } }, - { - "filename": "relic_gold", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 9, - "y": 11, - "w": 15, - "h": 11 - }, - "frame": { - "x": 0, - "y": 404, - "w": 15, - "h": 11 - } - }, { "filename": "calcium", "rotated": false, @@ -1165,7 +1144,7 @@ } }, { - "filename": "clefairy_doll", + "filename": "mind_plate", "rotated": false, "trimmed": true, "sourceSize": { @@ -1174,15 +1153,15 @@ }, "spriteSourceSize": { "x": 4, - "y": 5, + "y": 4, "w": 24, - "h": 23 + "h": 24 }, "frame": { "x": 24, "y": 392, "w": 24, - "h": 23 + "h": 24 } }, { @@ -1249,7 +1228,7 @@ } }, { - "filename": "mind_plate", + "filename": "muscle_band", "rotated": false, "trimmed": true, "sourceSize": { @@ -1270,7 +1249,7 @@ } }, { - "filename": "muscle_band", + "filename": "pixie_plate", "rotated": false, "trimmed": true, "sourceSize": { @@ -1291,7 +1270,7 @@ } }, { - "filename": "pixie_plate", + "filename": "salac_berry", "rotated": false, "trimmed": true, "sourceSize": { @@ -1312,7 +1291,7 @@ } }, { - "filename": "salac_berry", + "filename": "scanner", "rotated": false, "trimmed": true, "sourceSize": { @@ -1333,7 +1312,7 @@ } }, { - "filename": "scanner", + "filename": "silk_scarf", "rotated": false, "trimmed": true, "sourceSize": { @@ -1354,7 +1333,7 @@ } }, { - "filename": "coin_case", + "filename": "sky_plate", "rotated": false, "trimmed": true, "sourceSize": { @@ -1363,15 +1342,15 @@ }, "spriteSourceSize": { "x": 4, - "y": 5, + "y": 4, "w": 24, - "h": 23 + "h": 24 }, "frame": { "x": 48, "y": 392, "w": 24, - "h": 23 + "h": 24 } }, { @@ -1417,7 +1396,7 @@ } }, { - "filename": "silk_scarf", + "filename": "splash_plate", "rotated": false, "trimmed": true, "sourceSize": { @@ -1438,7 +1417,7 @@ } }, { - "filename": "sky_plate", + "filename": "spooky_plate", "rotated": false, "trimmed": true, "sourceSize": { @@ -1459,7 +1438,7 @@ } }, { - "filename": "splash_plate", + "filename": "stone_plate", "rotated": false, "trimmed": true, "sourceSize": { @@ -1480,7 +1459,7 @@ } }, { - "filename": "spooky_plate", + "filename": "sun_stone", "rotated": false, "trimmed": true, "sourceSize": { @@ -1501,7 +1480,7 @@ } }, { - "filename": "stone_plate", + "filename": "toxic_plate", "rotated": false, "trimmed": true, "sourceSize": { @@ -1522,7 +1501,7 @@ } }, { - "filename": "sun_stone", + "filename": "zap_plate", "rotated": false, "trimmed": true, "sourceSize": { @@ -1564,7 +1543,7 @@ } }, { - "filename": "toxic_plate", + "filename": "clefairy_doll", "rotated": false, "trimmed": true, "sourceSize": { @@ -1573,19 +1552,19 @@ }, "spriteSourceSize": { "x": 4, - "y": 4, + "y": 5, "w": 24, - "h": 24 + "h": 23 }, "frame": { "x": 339, "y": 20, "w": 24, - "h": 24 + "h": 23 } }, { - "filename": "zap_plate", + "filename": "coin_case", "rotated": false, "trimmed": true, "sourceSize": { @@ -1594,19 +1573,19 @@ }, "spriteSourceSize": { "x": 4, - "y": 4, + "y": 5, "w": 24, - "h": 24 + "h": 23 }, "frame": { "x": 363, "y": 20, "w": 24, - "h": 24 + "h": 23 } }, { - "filename": "max_revive", + "filename": "berry_pouch", "rotated": false, "trimmed": true, "sourceSize": { @@ -1614,16 +1593,16 @@ "h": 32 }, "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 22, - "h": 24 + "x": 4, + "y": 5, + "w": 23, + "h": 23 }, "frame": { "x": 387, "y": 20, - "w": 22, - "h": 24 + "w": 23, + "h": 23 } }, { @@ -1774,7 +1753,7 @@ } }, { - "filename": "berry_pouch", + "filename": "black_belt", "rotated": false, "trimmed": true, "sourceSize": { @@ -1782,15 +1761,15 @@ "h": 32 }, "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 23, + "x": 5, + "y": 4, + "w": 22, "h": 23 }, "frame": { "x": 327, "y": 45, - "w": 23, + "w": 22, "h": 23 } }, @@ -1809,8 +1788,8 @@ "h": 24 }, "frame": { - "x": 350, - "y": 44, + "x": 349, + "y": 43, "w": 23, "h": 24 } @@ -1830,14 +1809,14 @@ "h": 23 }, "frame": { - "x": 373, - "y": 44, + "x": 372, + "y": 43, "w": 24, "h": 23 } }, { - "filename": "max_ether", + "filename": "red_orb", "rotated": false, "trimmed": true, "sourceSize": { @@ -1845,15 +1824,15 @@ "h": 32 }, "spriteSourceSize": { - "x": 7, + "x": 6, "y": 4, - "w": 18, + "w": 20, "h": 24 }, "frame": { - "x": 397, - "y": 44, - "w": 18, + "x": 396, + "y": 43, + "w": 20, "h": 24 } }, @@ -1872,14 +1851,14 @@ "h": 18 }, "frame": { - "x": 373, - "y": 67, + "x": 372, + "y": 66, "w": 24, "h": 18 } }, { - "filename": "max_potion", + "filename": "mystic_water", "rotated": false, "trimmed": true, "sourceSize": { @@ -1887,16 +1866,37 @@ "h": 32 }, "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 18, - "h": 24 + "x": 6, + "y": 5, + "w": 20, + "h": 23 }, "frame": { - "x": 397, - "y": 68, - "w": 18, - "h": 24 + "x": 396, + "y": 67, + "w": 20, + "h": 23 + } + }, + { + "filename": "amulet_coin", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 5, + "w": 23, + "h": 21 + }, + "frame": { + "x": 349, + "y": 67, + "w": 23, + "h": 21 } }, { @@ -1914,12 +1914,54 @@ "h": 18 }, "frame": { - "x": 67, - "y": 50, + "x": 372, + "y": 84, "w": 24, "h": 18 } }, + { + "filename": "hard_meteorite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 5, + "w": 20, + "h": 22 + }, + "frame": { + "x": 396, + "y": 90, + "w": 20, + "h": 22 + } + }, + { + "filename": "relic_gold", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 9, + "y": 11, + "w": 15, + "h": 11 + }, + "frame": { + "x": 0, + "y": 404, + "w": 15, + "h": 11 + } + }, { "filename": "icy_reins_of_unity", "rotated": false, @@ -1934,6 +1976,27 @@ "w": 24, "h": 20 }, + "frame": { + "x": 67, + "y": 50, + "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": 91, "y": 50, @@ -1962,27 +2025,6 @@ "h": 23 } }, - { - "filename": "metal_powder", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 6, - "w": 24, - "h": 20 - }, - "frame": { - "x": 136, - "y": 60, - "w": 24, - "h": 20 - } - }, { "filename": "peat_block", "rotated": false, @@ -1998,180 +2040,12 @@ "h": 22 }, "frame": { - "x": 160, - "y": 67, + "x": 136, + "y": 60, "w": 24, "h": 22 } }, - { - "filename": "dynamax_band", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 23, - "h": 23 - }, - "frame": { - "x": 184, - "y": 67, - "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": 207, - "y": 67, - "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": 230, - "y": 68, - "w": 23, - "h": 22 - } - }, - { - "filename": "rare_candy", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 23, - "h": 23 - }, - "frame": { - "x": 253, - "y": 68, - "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": 276, - "y": 68, - "w": 23, - "h": 23 - } - }, - { - "filename": "stick", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 23, - "h": 23 - }, - "frame": { - "x": 299, - "y": 68, - "w": 23, - "h": 23 - } - }, - { - "filename": "black_belt", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 322, - "y": 68, - "w": 22, - "h": 23 - } - }, - { - "filename": "bug_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 344, - "y": 68, - "w": 22, - "h": 23 - } - }, { "filename": "quick_powder", "rotated": false, @@ -2187,75 +2061,12 @@ "h": 20 }, "frame": { - "x": 60, - "y": 68, + "x": 160, + "y": 67, "w": 24, "h": 20 } }, - { - "filename": "dark_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 57, - "y": 88, - "w": 22, - "h": 23 - } - }, - { - "filename": "dragon_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 57, - "y": 111, - "w": 22, - "h": 23 - } - }, - { - "filename": "electric_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 57, - "y": 134, - "w": 22, - "h": 23 - } - }, { "filename": "rusted_shield", "rotated": false, @@ -2271,222 +2082,12 @@ "h": 20 }, "frame": { - "x": 84, - "y": 70, + "x": 184, + "y": 67, "w": 24, "h": 20 } }, - { - "filename": "fairy_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 79, - "y": 90, - "w": 22, - "h": 23 - } - }, - { - "filename": "fighting_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 79, - "y": 113, - "w": 22, - "h": 23 - } - }, - { - "filename": "amulet_coin", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 23, - "h": 21 - }, - "frame": { - "x": 79, - "y": 136, - "w": 23, - "h": 21 - } - }, - { - "filename": "coupon", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 23, - "h": 19 - }, - "frame": { - "x": 63, - "y": 157, - "w": 23, - "h": 19 - } - }, - { - "filename": "fire_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 23 - }, - "frame": { - "x": 64, - "y": 176, - "w": 22, - "h": 23 - } - }, - { - "filename": "fire_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 64, - "y": 199, - "w": 22, - "h": 23 - } - }, - { - "filename": "flying_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 64, - "y": 222, - "w": 22, - "h": 23 - } - }, - { - "filename": "max_lure", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 17, - "h": 24 - }, - "frame": { - "x": 86, - "y": 157, - "w": 17, - "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": 86, - "y": 181, - "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": 86, - "y": 205, - "w": 21, - "h": 24 - } - }, { "filename": "auspicious_armor", "rotated": false, @@ -2502,54 +2103,12 @@ "h": 21 }, "frame": { - "x": 86, - "y": 229, + "x": 208, + "y": 67, "w": 23, "h": 21 } }, - { - "filename": "full_heal", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 15, - "h": 23 - }, - "frame": { - "x": 71, - "y": 245, - "w": 15, - "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": 86, - "y": 250, - "w": 23, - "h": 20 - } - }, { "filename": "sacred_ash", "rotated": false, @@ -2565,222 +2124,12 @@ "h": 20 }, "frame": { - "x": 108, - "y": 73, + "x": 231, + "y": 68, "w": 24, "h": 20 } }, - { - "filename": "focus_sash", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 101, - "y": 93, - "w": 22, - "h": 23 - } - }, - { - "filename": "deep_sea_scale", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 20 - }, - "frame": { - "x": 101, - "y": 116, - "w": 22, - "h": 20 - } - }, - { - "filename": "deep_sea_tooth", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 21 - }, - "frame": { - "x": 102, - "y": 136, - "w": 22, - "h": 21 - } - }, - { - "filename": "red_orb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 20, - "h": 24 - }, - "frame": { - "x": 103, - "y": 157, - "w": 20, - "h": 24 - } - }, - { - "filename": "max_repel", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 107, - "y": 181, - "w": 16, - "h": 24 - } - }, - { - "filename": "pp_max", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 107, - "y": 205, - "w": 16, - "h": 24 - } - }, - { - "filename": "pp_up", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 109, - "y": 229, - "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": 109, - "y": 253, - "w": 19, - "h": 20 - } - }, - { - "filename": "protein", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 123, - "y": 93, - "w": 16, - "h": 24 - } - }, - { - "filename": "lansat_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 21, - "h": 23 - }, - "frame": { - "x": 139, - "y": 80, - "w": 21, - "h": 23 - } - }, { "filename": "shadow_reins_of_unity", "rotated": false, @@ -2796,8 +2145,8 @@ "h": 20 }, "frame": { - "x": 160, - "y": 89, + "x": 255, + "y": 68, "w": 24, "h": 20 } @@ -2817,35 +2166,14 @@ "h": 20 }, "frame": { - "x": 184, - "y": 90, + "x": 279, + "y": 68, "w": 24, "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": 208, - "y": 90, - "w": 23, - "h": 21 - } - }, - { - "filename": "blank_memory", + "filename": "binding_band", "rotated": false, "trimmed": true, "sourceSize": { @@ -2854,19 +2182,19 @@ }, "spriteSourceSize": { "x": 5, - "y": 5, - "w": 22, - "h": 22 + "y": 6, + "w": 23, + "h": 20 }, "frame": { - "x": 231, - "y": 90, - "w": 22, - "h": 22 + "x": 303, + "y": 68, + "w": 23, + "h": 20 } }, { - "filename": "n_lunarizer", + "filename": "dynamax_band", "rotated": false, "trimmed": true, "sourceSize": { @@ -2875,141 +2203,15 @@ }, "spriteSourceSize": { "x": 4, - "y": 6, + "y": 4, "w": 23, - "h": 21 + "h": 23 }, "frame": { - "x": 253, - "y": 91, + "x": 326, + "y": 68, "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": 276, - "y": 91, - "w": 23, - "h": 21 - } - }, - { - "filename": "rusted_sword", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 23, - "h": 22 - }, - "frame": { - "x": 299, - "y": 91, - "w": 23, - "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": 322, - "y": 91, - "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": 344, - "y": 91, - "w": 22, - "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": 139, - "y": 103, - "w": 21, - "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": 123, - "y": 117, - "w": 16, - "h": 18 + "h": 23 } }, { @@ -3027,8 +2229,8 @@ "h": 17 }, "frame": { - "x": 160, - "y": 109, + "x": 349, + "y": 88, "w": 23, "h": 17 } @@ -3048,14 +2250,56 @@ "h": 17 }, "frame": { - "x": 183, - "y": 110, + "x": 60, + "y": 70, "w": 23, "h": 17 } }, { - "filename": "ghost_tera_shard", + "filename": "griseous_core", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 23, + "h": 23 + }, + "frame": { + "x": 57, + "y": 87, + "w": 23, + "h": 23 + } + }, + { + "filename": "max_revive", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 22, + "h": 24 + }, + "frame": { + "x": 57, + "y": 110, + "w": 22, + "h": 24 + } + }, + { + "filename": "bug_tera_shard", "rotated": false, "trimmed": true, "sourceSize": { @@ -3069,8 +2313,8 @@ "h": 23 }, "frame": { - "x": 366, - "y": 85, + "x": 57, + "y": 134, "w": 22, "h": 23 } @@ -3090,14 +2334,14 @@ "h": 17 }, "frame": { - "x": 206, - "y": 111, + "x": 83, + "y": 70, "w": 23, "h": 17 } }, { - "filename": "douse_drive", + "filename": "rare_candy", "rotated": false, "trimmed": true, "sourceSize": { @@ -3106,15 +2350,540 @@ }, "spriteSourceSize": { "x": 4, - "y": 8, + "y": 5, "w": 23, - "h": 17 + "h": 23 }, "frame": { - "x": 229, - "y": 112, + "x": 80, + "y": 87, "w": 23, - "h": 17 + "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": 79, + "y": 110, + "w": 23, + "h": 23 + } + }, + { + "filename": "stick", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 23, + "h": 23 + }, + "frame": { + "x": 79, + "y": 133, + "w": 23, + "h": 23 + } + }, + { + "filename": "big_mushroom", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 19, + "h": 19 + }, + "frame": { + "x": 63, + "y": 157, + "w": 19, + "h": 19 + } + }, + { + "filename": "max_ether", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 18, + "h": 24 + }, + "frame": { + "x": 64, + "y": 176, + "w": 18, + "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": 82, + "y": 156, + "w": 21, + "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": 64, + "y": 200, + "w": 18, + "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": 64, + "y": 224, + "w": 21, + "h": 24 + } + }, + { + "filename": "dark_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 82, + "y": 180, + "w": 22, + "h": 23 + } + }, + { + "filename": "berry_juice", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 24, + "h": 23 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 22, + "h": 21 + }, + "frame": { + "x": 82, + "y": 203, + "w": 22, + "h": 21 + } + }, + { + "filename": "dragon_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 85, + "y": 224, + "w": 22, + "h": 23 + } + }, + { + "filename": "max_lure", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 17, + "h": 24 + }, + "frame": { + "x": 71, + "y": 248, + "w": 17, + "h": 24 + } + }, + { + "filename": "electric_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 88, + "y": 247, + "w": 22, + "h": 23 + } + }, + { + "filename": "max_repel", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 72, + "y": 272, + "w": 16, + "h": 24 + } + }, + { + "filename": "fairy_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 88, + "y": 270, + "w": 22, + "h": 23 + } + }, + { + "filename": "pp_max", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 72, + "y": 296, + "w": 16, + "h": 24 + } + }, + { + "filename": "fighting_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 88, + "y": 293, + "w": 22, + "h": 23 + } + }, + { + "filename": "pp_up", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 72, + "y": 320, + "w": 16, + "h": 24 + } + }, + { + "filename": "fire_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 23 + }, + "frame": { + "x": 88, + "y": 316, + "w": 22, + "h": 23 + } + }, + { + "filename": "protein", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 72, + "y": 344, + "w": 16, + "h": 24 + } + }, + { + "filename": "fire_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 88, + "y": 339, + "w": 22, + "h": 23 + } + }, + { + "filename": "repel", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 72, + "y": 368, + "w": 16, + "h": 24 + } + }, + { + "filename": "super_lure", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 17, + "h": 24 + }, + "frame": { + "x": 72, + "y": 392, + "w": 17, + "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": 88, + "y": 362, + "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": 89, + "y": 385, + "w": 22, + "h": 23 + } + }, + { + "filename": "coupon", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 23, + "h": 19 + }, + "frame": { + "x": 106, + "y": 73, + "w": 23, + "h": 19 } }, { @@ -3132,14 +2901,14 @@ "h": 19 }, "frame": { - "x": 252, - "y": 112, + "x": 103, + "y": 92, "w": 23, "h": 19 } }, { - "filename": "mystic_ticket", + "filename": "ghost_tera_shard", "rotated": false, "trimmed": true, "sourceSize": { @@ -3147,62 +2916,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 23, - "h": 19 + "x": 6, + "y": 4, + "w": 22, + "h": 23 }, "frame": { - "x": 275, - "y": 112, - "w": 23, - "h": 19 + "x": 102, + "y": 111, + "w": 22, + "h": 23 } }, { - "filename": "pair_of_tickets", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 23, - "h": 19 - }, - "frame": { - "x": 298, - "y": 113, - "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": 321, - "y": 113, - "w": 23, - "h": 20 - } - }, - { - "filename": "dark_memory", + "filename": "blank_memory", "rotated": false, "trimmed": true, "sourceSize": { @@ -3216,8 +2943,8 @@ "h": 22 }, "frame": { - "x": 344, - "y": 113, + "x": 102, + "y": 134, "w": 22, "h": 22 } @@ -3237,33 +2964,12 @@ "h": 23 }, "frame": { - "x": 366, - "y": 108, + "x": 103, + "y": 156, "w": 22, "h": 23 } }, - { - "filename": "berry_pot", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 18, - "h": 22 - }, - "frame": { - "x": 124, - "y": 135, - "w": 18, - "h": 22 - } - }, { "filename": "ground_tera_shard", "rotated": false, @@ -3279,12 +2985,33 @@ "h": 23 }, "frame": { - "x": 123, - "y": 157, + "x": 104, + "y": 179, "w": 22, "h": 23 } }, + { + "filename": "bug_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 104, + "y": 202, + "w": 22, + "h": 22 + } + }, { "filename": "ice_tera_shard", "rotated": false, @@ -3300,14 +3027,14 @@ "h": 23 }, "frame": { - "x": 123, - "y": 180, + "x": 107, + "y": 224, "w": 22, "h": 23 } }, { - "filename": "never_melt_ice", + "filename": "lansat_berry", "rotated": false, "trimmed": true, "sourceSize": { @@ -3316,14 +3043,14 @@ }, "spriteSourceSize": { "x": 5, - "y": 5, - "w": 22, + "y": 4, + "w": 21, "h": 23 }, "frame": { - "x": 123, - "y": 203, - "w": 22, + "x": 110, + "y": 247, + "w": 21, "h": 23 } }, @@ -3342,14 +3069,14 @@ "h": 23 }, "frame": { - "x": 125, - "y": 226, + "x": 110, + "y": 270, "w": 21, "h": 23 } }, { - "filename": "mystic_water", + "filename": "never_melt_ice", "rotated": false, "trimmed": true, "sourceSize": { @@ -3357,15 +3084,15 @@ "h": 32 }, "spriteSourceSize": { - "x": 6, + "x": 5, "y": 5, - "w": 20, + "w": 22, "h": 23 }, "frame": { - "x": 128, - "y": 249, - "w": 20, + "x": 110, + "y": 293, + "w": 22, "h": 23 } }, @@ -3384,243 +3111,12 @@ "h": 23 }, "frame": { - "x": 388, - "y": 92, + "x": 110, + "y": 316, "w": 22, "h": 23 } }, - { - "filename": "blunder_policy", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 19 - }, - "frame": { - "x": 388, - "y": 115, - "w": 22, - "h": 19 - } - }, - { - "filename": "sachet", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 18, - "h": 23 - }, - "frame": { - "x": 142, - "y": 124, - "w": 18, - "h": 23 - } - }, - { - "filename": "wellspring_mask", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 23, - "h": 21 - }, - "frame": { - "x": 160, - "y": 126, - "w": 23, - "h": 21 - } - }, - { - "filename": "shell_bell", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 23, - "h": 20 - }, - "frame": { - "x": 183, - "y": 127, - "w": 23, - "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": 206, - "y": 128, - "w": 23, - "h": 18 - } - }, - { - "filename": "shock_drive", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 23, - "h": 17 - }, - "frame": { - "x": 229, - "y": 129, - "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": 252, - "y": 131, - "w": 23, - "h": 17 - } - }, - { - "filename": "dire_hit", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 275, - "y": 131, - "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": 297, - "y": 132, - "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": 319, - "y": 133, - "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": 341, - "y": 135, - "w": 22, - "h": 22 - } - }, { "filename": "petaya_berry", "rotated": false, @@ -3636,8 +3132,8 @@ "h": 23 }, "frame": { - "x": 145, - "y": 147, + "x": 110, + "y": 339, "w": 22, "h": 23 } @@ -3657,8 +3153,8 @@ "h": 23 }, "frame": { - "x": 167, - "y": 147, + "x": 110, + "y": 362, "w": 22, "h": 23 } @@ -3678,12 +3174,348 @@ "h": 23 }, "frame": { - "x": 145, - "y": 170, + "x": 111, + "y": 385, "w": 22, "h": 23 } }, + { + "filename": "douse_drive", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 23, + "h": 17 + }, + "frame": { + "x": 372, + "y": 102, + "w": 23, + "h": 17 + } + }, + { + "filename": "sharp_beak", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 21, + "h": 23 + }, + "frame": { + "x": 395, + "y": 112, + "w": 21, + "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": 129, + "y": 82, + "w": 23, + "h": 22 + } + }, + { + "filename": "moon_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 23, + "h": 21 + }, + "frame": { + "x": 152, + "y": 87, + "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": 175, + "y": 87, + "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": 198, + "y": 88, + "w": 23, + "h": 21 + } + }, + { + "filename": "rusted_sword", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 23, + "h": 22 + }, + "frame": { + "x": 221, + "y": 88, + "w": 23, + "h": 22 + } + }, + { + "filename": "charcoal", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 244, + "y": 88, + "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": 266, + "y": 88, + "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": 288, + "y": 88, + "w": 22, + "h": 22 + } + }, + { + "filename": "super_repel", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 310, + "y": 88, + "w": 16, + "h": 24 + } + }, + { + "filename": "wellspring_mask", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 23, + "h": 21 + }, + "frame": { + "x": 326, + "y": 91, + "w": 23, + "h": 21 + } + }, + { + "filename": "mystic_ticket", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 23, + "h": 19 + }, + "frame": { + "x": 349, + "y": 105, + "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": 372, + "y": 119, + "w": 23, + "h": 19 + } + }, + { + "filename": "whipped_dream", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 21, + "h": 23 + }, + "frame": { + "x": 395, + "y": 135, + "w": 21, + "h": 23 + } + }, + { + "filename": "relic_crown", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 23, + "h": 18 + }, + "frame": { + "x": 126, + "y": 104, + "w": 23, + "h": 18 + } + }, { "filename": "reaper_cloth", "rotated": false, @@ -3699,14 +3531,14 @@ "h": 23 }, "frame": { - "x": 145, - "y": 193, + "x": 124, + "y": 122, "w": 22, "h": 23 } }, { - "filename": "rock_tera_shard", + "filename": "reviver_seed", "rotated": false, "trimmed": true, "sourceSize": { @@ -3714,20 +3546,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 + "x": 5, + "y": 8, + "w": 23, + "h": 20 }, "frame": { - "x": 167, - "y": 170, - "w": 22, - "h": 23 + "x": 149, + "y": 108, + "w": 23, + "h": 20 } }, { - "filename": "steel_tera_shard", + "filename": "shell_bell", "rotated": false, "trimmed": true, "sourceSize": { @@ -3735,20 +3567,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 + "x": 5, + "y": 7, + "w": 23, + "h": 20 }, "frame": { - "x": 167, - "y": 193, - "w": 22, - "h": 23 + "x": 172, + "y": 108, + "w": 23, + "h": 20 } }, { - "filename": "super_lure", + "filename": "blunder_policy", "rotated": false, "trimmed": true, "sourceSize": { @@ -3756,20 +3588,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 17, - "h": 24 + "x": 5, + "y": 6, + "w": 22, + "h": 19 }, "frame": { - "x": 189, - "y": 147, - "w": 17, - "h": 24 + "x": 195, + "y": 109, + "w": 22, + "h": 19 } }, { - "filename": "stellar_tera_shard", + "filename": "shock_drive", "rotated": false, "trimmed": true, "sourceSize": { @@ -3777,20 +3609,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 + "x": 4, + "y": 8, + "w": 23, + "h": 17 }, "frame": { - "x": 206, - "y": 146, - "w": 22, - "h": 23 + "x": 146, + "y": 128, + "w": 23, + "h": 17 } }, { - "filename": "water_tera_shard", + "filename": "wise_glasses", "rotated": false, "trimmed": true, "sourceSize": { @@ -3798,16 +3630,121 @@ "h": 32 }, "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 + "x": 4, + "y": 8, + "w": 23, + "h": 17 }, "frame": { - "x": 228, - "y": 146, + "x": 169, + "y": 128, + "w": 23, + "h": 17 + } + }, + { + "filename": "deep_sea_scale", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, "w": 22, - "h": 23 + "h": 20 + }, + "frame": { + "x": 192, + "y": 128, + "w": 22, + "h": 20 + } + }, + { + "filename": "deep_sea_tooth", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 21 + }, + "frame": { + "x": 217, + "y": 110, + "w": 22, + "h": 21 + } + }, + { + "filename": "dna_splicers", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 239, + "y": 110, + "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": 261, + "y": 110, + "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": 283, + "y": 110, + "w": 22, + "h": 22 } }, { @@ -3825,54 +3762,12 @@ "h": 22 }, "frame": { - "x": 250, - "y": 148, + "x": 305, + "y": 112, "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": 189, - "y": 171, - "w": 17, - "h": 23 - } - }, - { - "filename": "wide_lens", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 206, - "y": 169, - "w": 22, - "h": 23 - } - }, { "filename": "enigma_berry", "rotated": false, @@ -3888,71 +3783,8 @@ "h": 22 }, "frame": { - "x": 228, - "y": 169, - "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": 250, - "y": 170, - "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": 272, - "y": 153, - "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": 294, - "y": 154, + "x": 327, + "y": 112, "w": 22, "h": 22 } @@ -3972,8 +3804,8 @@ "h": 19 }, "frame": { - "x": 272, - "y": 175, + "x": 214, + "y": 131, "w": 22, "h": 19 } @@ -3993,12 +3825,75 @@ "h": 20 }, "frame": { - "x": 294, - "y": 176, + "x": 236, + "y": 132, "w": 22, "h": 20 } }, + { + "filename": "fairy_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 258, + "y": 132, + "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": 280, + "y": 132, + "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": 302, + "y": 134, + "w": 22, + "h": 22 + } + }, { "filename": "flying_memory", "rotated": false, @@ -4014,12 +3909,75 @@ "h": 22 }, "frame": { - "x": 316, - "y": 155, + "x": 324, + "y": 134, "w": 22, "h": 22 } }, + { + "filename": "rock_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 125, + "y": 145, + "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": 147, + "y": 145, + "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": 169, + "y": 145, + "w": 22, + "h": 23 + } + }, { "filename": "ganlon_berry", "rotated": false, @@ -4035,8 +3993,8 @@ "h": 22 }, "frame": { - "x": 316, - "y": 177, + "x": 191, + "y": 148, "w": 22, "h": 22 } @@ -4056,8 +4014,8 @@ "h": 22 }, "frame": { - "x": 338, - "y": 157, + "x": 213, + "y": 150, "w": 22, "h": 22 } @@ -4077,8 +4035,8 @@ "h": 22 }, "frame": { - "x": 338, - "y": 179, + "x": 235, + "y": 152, "w": 22, "h": 22 } @@ -4098,33 +4056,12 @@ "h": 22 }, "frame": { - "x": 189, - "y": 194, + "x": 257, + "y": 154, "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": 211, - "y": 192, - "w": 17, - "h": 23 - } - }, { "filename": "guard_spec", "rotated": false, @@ -4140,8 +4077,8 @@ "h": 22 }, "frame": { - "x": 228, - "y": 191, + "x": 279, + "y": 154, "w": 22, "h": 22 } @@ -4161,8 +4098,8 @@ "h": 22 }, "frame": { - "x": 250, - "y": 192, + "x": 301, + "y": 156, "w": 22, "h": 22 } @@ -4182,8 +4119,113 @@ "h": 22 }, "frame": { - "x": 272, - "y": 194, + "x": 323, + "y": 156, + "w": 22, + "h": 22 + } + }, + { + "filename": "water_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 126, + "y": 168, + "w": 22, + "h": 23 + } + }, + { + "filename": "wide_lens", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 148, + "y": 168, + "w": 22, + "h": 23 + } + }, + { + "filename": "dusk_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 21, + "h": 21 + }, + "frame": { + "x": 170, + "y": 168, + "w": 21, + "h": 21 + } + }, + { + "filename": "magmarizer", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 126, + "y": 191, + "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": 148, + "y": 191, "w": 22, "h": 22 } @@ -4203,14 +4245,14 @@ "h": 21 }, "frame": { - "x": 294, - "y": 196, + "x": 191, + "y": 170, "w": 22, "h": 21 } }, { - "filename": "magmarizer", + "filename": "poison_barb", "rotated": false, "trimmed": true, "sourceSize": { @@ -4219,15 +4261,15 @@ }, "spriteSourceSize": { "x": 5, - "y": 5, - "w": 22, - "h": 22 + "y": 6, + "w": 21, + "h": 21 }, "frame": { - "x": 316, - "y": 199, - "w": 22, - "h": 22 + "x": 170, + "y": 189, + "w": 21, + "h": 21 } }, { @@ -4245,33 +4287,12 @@ "h": 20 }, "frame": { - "x": 338, - "y": 201, + "x": 213, + "y": 172, "w": 22, "h": 20 } }, - { - "filename": "mini_black_hole", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 146, - "y": 216, - "w": 22, - "h": 22 - } - }, { "filename": "poison_memory", "rotated": false, @@ -4287,8 +4308,8 @@ "h": 22 }, "frame": { - "x": 168, - "y": 216, + "x": 235, + "y": 174, "w": 22, "h": 22 } @@ -4308,33 +4329,12 @@ "h": 22 }, "frame": { - "x": 190, - "y": 216, + "x": 191, + "y": 191, "w": 22, "h": 22 } }, - { - "filename": "repel", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 212, - "y": 215, - "w": 16, - "h": 24 - } - }, { "filename": "psychic_memory", "rotated": false, @@ -4350,8 +4350,8 @@ "h": 22 }, "frame": { - "x": 228, - "y": 213, + "x": 213, + "y": 192, "w": 22, "h": 22 } @@ -4371,8 +4371,8 @@ "h": 22 }, "frame": { - "x": 250, - "y": 214, + "x": 257, + "y": 176, "w": 22, "h": 22 } @@ -4392,8 +4392,8 @@ "h": 22 }, "frame": { - "x": 272, - "y": 216, + "x": 279, + "y": 176, "w": 22, "h": 22 } @@ -4413,8 +4413,8 @@ "h": 22 }, "frame": { - "x": 294, - "y": 217, + "x": 235, + "y": 196, "w": 22, "h": 22 } @@ -4434,8 +4434,8 @@ "h": 22 }, "frame": { - "x": 316, - "y": 221, + "x": 301, + "y": 178, "w": 22, "h": 22 } @@ -4455,33 +4455,12 @@ "h": 22 }, "frame": { - "x": 338, - "y": 221, + "x": 323, + "y": 178, "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": 148, - "y": 238, - "w": 21, - "h": 23 - } - }, { "filename": "steel_memory", "rotated": false, @@ -4497,75 +4476,12 @@ "h": 22 }, "frame": { - "x": 169, - "y": 238, + "x": 257, + "y": 198, "w": 22, "h": 22 } }, - { - "filename": "whipped_dream", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 21, - "h": 23 - }, - "frame": { - "x": 191, - "y": 238, - "w": 21, - "h": 23 - } - }, - { - "filename": "hard_meteorite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 20, - "h": 22 - }, - "frame": { - "x": 212, - "y": 239, - "w": 20, - "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": 232, - "y": 235, - "w": 17, - "h": 23 - } - }, { "filename": "thick_club", "rotated": false, @@ -4581,8 +4497,8 @@ "h": 22 }, "frame": { - "x": 249, - "y": 236, + "x": 279, + "y": 198, "w": 22, "h": 22 } @@ -4602,8 +4518,8 @@ "h": 21 }, "frame": { - "x": 271, - "y": 238, + "x": 301, + "y": 200, "w": 22, "h": 21 } @@ -4623,29 +4539,8 @@ "h": 21 }, "frame": { - "x": 293, - "y": 239, - "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": 315, - "y": 243, + "x": 323, + "y": 200, "w": 22, "h": 21 } @@ -4665,71 +4560,8 @@ "h": 22 }, "frame": { - "x": 337, - "y": 243, - "w": 22, - "h": 22 - } - }, - { - "filename": "masterpiece_teacup", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 21, - "h": 18 - }, - "frame": { - "x": 148, - "y": 261, - "w": 21, - "h": 18 - } - }, - { - "filename": "tera_orb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 20 - }, - "frame": { - "x": 169, - "y": 260, - "w": 22, - "h": 20 - } - }, - { - "filename": "tm_bug", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 191, - "y": 261, + "x": 129, + "y": 213, "w": 22, "h": 22 } @@ -4749,12 +4581,96 @@ "h": 22 }, "frame": { - "x": 213, - "y": 261, + "x": 151, + "y": 213, "w": 19, "h": 22 } }, + { + "filename": "shiny_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 21, + "h": 21 + }, + "frame": { + "x": 170, + "y": 210, + "w": 21, + "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": 191, + "y": 213, + "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": 213, + "y": 214, + "w": 22, + "h": 20 + } + }, + { + "filename": "tm_bug", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 235, + "y": 218, + "w": 22, + "h": 22 + } + }, { "filename": "tm_dark", "rotated": false, @@ -4770,33 +4686,12 @@ "h": 22 }, "frame": { - "x": 232, - "y": 258, + "x": 257, + "y": 220, "w": 22, "h": 22 } }, - { - "filename": "metronome", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 17, - "h": 22 - }, - "frame": { - "x": 254, - "y": 258, - "w": 17, - "h": 22 - } - }, { "filename": "tm_dragon", "rotated": false, @@ -4812,8 +4707,8 @@ "h": 22 }, "frame": { - "x": 271, - "y": 259, + "x": 279, + "y": 220, "w": 22, "h": 22 } @@ -4833,8 +4728,8 @@ "h": 22 }, "frame": { - "x": 293, - "y": 260, + "x": 301, + "y": 221, "w": 22, "h": 22 } @@ -4854,8 +4749,8 @@ "h": 22 }, "frame": { - "x": 315, - "y": 264, + "x": 323, + "y": 221, "w": 22, "h": 22 } @@ -4875,8 +4770,8 @@ "h": 22 }, "frame": { - "x": 337, - "y": 265, + "x": 349, + "y": 124, "w": 22, "h": 22 } @@ -4896,8 +4791,8 @@ "h": 22 }, "frame": { - "x": 366, - "y": 131, + "x": 131, + "y": 235, "w": 22, "h": 22 } @@ -4917,14 +4812,14 @@ "h": 22 }, "frame": { - "x": 388, - "y": 134, + "x": 131, + "y": 257, "w": 22, "h": 22 } }, { - "filename": "big_nugget", + "filename": "hyper_potion", "rotated": false, "trimmed": true, "sourceSize": { @@ -4932,20 +4827,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 + "x": 8, + "y": 5, + "w": 17, + "h": 23 }, "frame": { - "x": 128, - "y": 272, - "w": 20, - "h": 20 + "x": 153, + "y": 235, + "w": 17, + "h": 23 } }, { - "filename": "metal_alloy", + "filename": "zoom_lens", "rotated": false, "trimmed": true, "sourceSize": { @@ -4953,16 +4848,16 @@ "h": 32 }, "spriteSourceSize": { - "x": 6, - "y": 7, + "x": 5, + "y": 6, "w": 21, - "h": 19 + "h": 21 }, "frame": { - "x": 148, - "y": 279, + "x": 170, + "y": 231, "w": 21, - "h": 19 + "h": 21 } }, { @@ -4980,8 +4875,8 @@ "h": 22 }, "frame": { - "x": 169, - "y": 280, + "x": 191, + "y": 234, "w": 22, "h": 22 } @@ -5000,31 +4895,10 @@ "w": 22, "h": 22 }, - "frame": { - "x": 191, - "y": 283, - "w": 22, - "h": 22 - } - }, - { - "filename": "metal_coat", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 19, - "h": 22 - }, "frame": { "x": 213, - "y": 283, - "w": 19, + "y": 234, + "w": 22, "h": 22 } }, @@ -5043,33 +4917,12 @@ "h": 22 }, "frame": { - "x": 232, - "y": 280, + "x": 235, + "y": 240, "w": 22, "h": 22 } }, - { - "filename": "soothe_bell", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 17, - "h": 22 - }, - "frame": { - "x": 254, - "y": 280, - "w": 17, - "h": 22 - } - }, { "filename": "tm_ice", "rotated": false, @@ -5085,8 +4938,8 @@ "h": 22 }, "frame": { - "x": 271, - "y": 281, + "x": 257, + "y": 242, "w": 22, "h": 22 } @@ -5106,8 +4959,8 @@ "h": 22 }, "frame": { - "x": 293, - "y": 282, + "x": 279, + "y": 242, "w": 22, "h": 22 } @@ -5127,8 +4980,8 @@ "h": 22 }, "frame": { - "x": 315, - "y": 286, + "x": 301, + "y": 243, "w": 22, "h": 22 } @@ -5148,12 +5001,54 @@ "h": 22 }, "frame": { - "x": 337, - "y": 287, + "x": 323, + "y": 243, "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": 153, + "y": 258, + "w": 18, + "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": 171, + "y": 252, + "w": 20, + "h": 22 + } + }, { "filename": "tm_rock", "rotated": false, @@ -5169,8 +5064,8 @@ "h": 22 }, "frame": { - "x": 72, - "y": 270, + "x": 191, + "y": 256, "w": 22, "h": 22 } @@ -5190,8 +5085,8 @@ "h": 22 }, "frame": { - "x": 72, - "y": 292, + "x": 213, + "y": 256, "w": 22, "h": 22 } @@ -5211,8 +5106,8 @@ "h": 22 }, "frame": { - "x": 72, - "y": 314, + "x": 235, + "y": 262, "w": 22, "h": 22 } @@ -5232,8 +5127,8 @@ "h": 22 }, "frame": { - "x": 72, - "y": 336, + "x": 257, + "y": 264, "w": 22, "h": 22 } @@ -5253,8 +5148,8 @@ "h": 22 }, "frame": { - "x": 72, - "y": 358, + "x": 279, + "y": 264, "w": 22, "h": 22 } @@ -5274,54 +5169,12 @@ "h": 22 }, "frame": { - "x": 72, - "y": 380, + "x": 301, + "y": 265, "w": 22, "h": 22 } }, - { - "filename": "leftovers", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 15, - "h": 22 - }, - "frame": { - "x": 94, - "y": 270, - "w": 15, - "h": 22 - } - }, - { - "filename": "big_mushroom", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 19, - "h": 19 - }, - "frame": { - "x": 109, - "y": 273, - "w": 19, - "h": 19 - } - }, { "filename": "x_attack", "rotated": false, @@ -5337,12 +5190,54 @@ "h": 22 }, "frame": { - "x": 94, - "y": 292, + "x": 323, + "y": 265, "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": 171, + "y": 274, + "w": 20, + "h": 20 + } + }, + { + "filename": "upgrade", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 22, + "h": 19 + }, + "frame": { + "x": 191, + "y": 278, + "w": 22, + "h": 19 + } + }, { "filename": "x_defense", "rotated": false, @@ -5358,8 +5253,8 @@ "h": 22 }, "frame": { - "x": 116, - "y": 292, + "x": 213, + "y": 278, "w": 22, "h": 22 } @@ -5379,8 +5274,8 @@ "h": 22 }, "frame": { - "x": 94, - "y": 314, + "x": 235, + "y": 284, "w": 22, "h": 22 } @@ -5400,8 +5295,8 @@ "h": 22 }, "frame": { - "x": 94, - "y": 336, + "x": 257, + "y": 286, "w": 22, "h": 22 } @@ -5421,138 +5316,12 @@ "h": 22 }, "frame": { - "x": 116, - "y": 314, + "x": 279, + "y": 286, "w": 22, "h": 22 } }, - { - "filename": "poison_barb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 21, - "h": 21 - }, - "frame": { - "x": 94, - "y": 358, - "w": 21, - "h": 21 - } - }, - { - "filename": "shiny_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 21, - "h": 21 - }, - "frame": { - "x": 116, - "y": 336, - "w": 21, - "h": 21 - } - }, - { - "filename": "sitrus_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 20, - "h": 22 - }, - "frame": { - "x": 94, - "y": 379, - "w": 20, - "h": 22 - } - }, - { - "filename": "zoom_lens", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 21, - "h": 21 - }, - "frame": { - "x": 138, - "y": 298, - "w": 21, - "h": 21 - } - }, - { - "filename": "sharp_meteorite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 21, - "h": 18 - }, - "frame": { - "x": 138, - "y": 319, - "w": 21, - "h": 18 - } - }, - { - "filename": "upgrade", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 22, - "h": 19 - }, - "frame": { - "x": 137, - "y": 337, - "w": 22, - "h": 19 - } - }, { "filename": "dawn_stone", "rotated": false, @@ -5568,8 +5337,8 @@ "h": 21 }, "frame": { - "x": 159, - "y": 302, + "x": 301, + "y": 287, "w": 20, "h": 21 } @@ -5589,14 +5358,35 @@ "h": 20 }, "frame": { - "x": 159, - "y": 323, + "x": 321, + "y": 287, "w": 20, "h": 20 } }, { - "filename": "everstone", + "filename": "masterpiece_teacup", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 21, + "h": 18 + }, + "frame": { + "x": 346, + "y": 146, + "w": 21, + "h": 18 + } + }, + { + "filename": "metal_coat", "rotated": false, "trimmed": true, "sourceSize": { @@ -5605,19 +5395,19 @@ }, "spriteSourceSize": { "x": 6, - "y": 8, - "w": 20, - "h": 17 + "y": 5, + "w": 19, + "h": 22 }, "frame": { - "x": 159, - "y": 343, - "w": 20, - "h": 17 + "x": 345, + "y": 164, + "w": 19, + "h": 22 } }, { - "filename": "revive", + "filename": "sachet", "rotated": false, "trimmed": true, "sourceSize": { @@ -5625,20 +5415,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 12, - "h": 17 + "x": 6, + "y": 4, + "w": 18, + "h": 23 }, "frame": { - "x": 179, - "y": 302, - "w": 12, - "h": 17 + "x": 345, + "y": 186, + "w": 18, + "h": 23 } }, { - "filename": "super_repel", + "filename": "potion", "rotated": false, "trimmed": true, "sourceSize": { @@ -5647,19 +5437,19 @@ }, "spriteSourceSize": { "x": 8, - "y": 4, - "w": 16, - "h": 24 + "y": 5, + "w": 17, + "h": 23 }, "frame": { - "x": 179, - "y": 319, - "w": 16, - "h": 24 + "x": 345, + "y": 209, + "w": 17, + "h": 23 } }, { - "filename": "candy", + "filename": "super_potion", "rotated": false, "trimmed": true, "sourceSize": { @@ -5667,16 +5457,16 @@ "h": 32 }, "spriteSourceSize": { - "x": 7, - "y": 11, - "w": 18, - "h": 18 + "x": 8, + "y": 5, + "w": 17, + "h": 23 }, "frame": { - "x": 179, - "y": 343, - "w": 18, - "h": 18 + "x": 345, + "y": 232, + "w": 17, + "h": 23 } }, { @@ -5694,35 +5484,14 @@ "h": 24 }, "frame": { - "x": 360, - "y": 157, + "x": 345, + "y": 255, "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": 360, - "y": 181, - "w": 16, - "h": 24 - } - }, - { - "filename": "quick_claw", + "filename": "metal_alloy", "rotated": false, "trimmed": true, "sourceSize": { @@ -5731,36 +5500,15 @@ }, "spriteSourceSize": { "x": 6, - "y": 6, - "w": 19, - "h": 21 + "y": 7, + "w": 21, + "h": 19 }, "frame": { - "x": 360, - "y": 205, - "w": 19, - "h": 21 - } - }, - { - "filename": "candy_jar", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 19, - "h": 20 - }, - "frame": { - "x": 360, - "y": 226, - "w": 19, - "h": 20 + "x": 371, + "y": 138, + "w": 21, + "h": 19 } }, { @@ -5778,12 +5526,33 @@ "h": 20 }, "frame": { - "x": 359, - "y": 246, + "x": 132, + "y": 279, "w": 20, "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": 152, + "y": 280, + "w": 19, + "h": 20 + } + }, { "filename": "magnet", "rotated": false, @@ -5799,8 +5568,8 @@ "h": 20 }, "frame": { - "x": 359, - "y": 266, + "x": 132, + "y": 299, "w": 20, "h": 20 } @@ -5820,8 +5589,8 @@ "h": 20 }, "frame": { - "x": 359, - "y": 286, + "x": 132, + "y": 319, "w": 20, "h": 20 } @@ -5841,8 +5610,71 @@ "h": 20 }, "frame": { - "x": 376, - "y": 156, + "x": 132, + "y": 339, + "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": 132, + "y": 359, + "w": 20, + "h": 20 + } + }, + { + "filename": "quick_claw", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 19, + "h": 21 + }, + "frame": { + "x": 152, + "y": 300, + "w": 19, + "h": 21 + } + }, + { + "filename": "rb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 171, + "y": 294, "w": 20, "h": 20 } @@ -5862,14 +5694,35 @@ "h": 21 }, "frame": { - "x": 396, - "y": 156, + "x": 152, + "y": 321, "w": 19, "h": 21 } }, { - "filename": "pb_gold", + "filename": "smooth_meteorite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 171, + "y": 314, + "w": 20, + "h": 20 + } + }, + { + "filename": "strange_ball", "rotated": false, "trimmed": true, "sourceSize": { @@ -5883,12 +5736,117 @@ "h": 20 }, "frame": { - "x": 376, - "y": 176, + "x": 191, + "y": 297, "w": 20, "h": 20 } }, + { + "filename": "zinc", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 152, + "y": 342, + "w": 16, + "h": 24 + } + }, + { + "filename": "everstone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 17 + }, + "frame": { + "x": 191, + "y": 317, + "w": 20, + "h": 17 + } + }, + { + "filename": "ub", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 211, + "y": 300, + "w": 20, + "h": 20 + } + }, + { + "filename": "lum_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 7, + "w": 20, + "h": 19 + }, + "frame": { + "x": 211, + "y": 320, + "w": 20, + "h": 19 + } + }, + { + "filename": "candy_jar", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 19, + "h": 20 + }, + "frame": { + "x": 231, + "y": 306, + "w": 19, + "h": 20 + } + }, { "filename": "hard_stone", "rotated": false, @@ -5904,287 +5862,14 @@ "h": 20 }, "frame": { - "x": 396, - "y": 177, + "x": 133, + "y": 379, "w": 19, "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": 379, - "y": 196, - "w": 17, - "h": 20 - } - }, - { - "filename": "miracle_seed", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 7, - "w": 19, - "h": 19 - }, - "frame": { - "x": 396, - "y": 197, - "w": 19, - "h": 19 - } - }, - { - "filename": "rb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 379, - "y": 216, - "w": 20, - "h": 20 - } - }, - { - "filename": "abomasite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 399, - "y": 216, - "w": 16, - "h": 16 - } - }, - { - "filename": "smooth_meteorite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 379, - "y": 236, - "w": 20, - "h": 20 - } - }, - { - "filename": "absolite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 399, - "y": 232, - "w": 16, - "h": 16 - } - }, - { - "filename": "aerodactylite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 399, - "y": 248, - "w": 16, - "h": 16 - } - }, - { - "filename": "strange_ball", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 379, - "y": 256, - "w": 20, - "h": 20 - } - }, - { - "filename": "aggronite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 399, - "y": 264, - "w": 16, - "h": 16 - } - }, - { - "filename": "ub", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 379, - "y": 276, - "w": 20, - "h": 20 - } - }, - { - "filename": "alakazite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 399, - "y": 280, - "w": 16, - "h": 16 - } - }, - { - "filename": "unremarkable_teacup", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 21, - "h": 18 - }, - "frame": { - "x": 379, - "y": 296, - "w": 21, - "h": 18 - } - }, - { - "filename": "eviolite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 15, - "h": 15 - }, - "frame": { - "x": 400, - "y": 296, - "w": 15, - "h": 15 - } - }, - { - "filename": "prism_scale", + "filename": "full_heal", "rotated": false, "trimmed": true, "sourceSize": { @@ -6193,19 +5878,19 @@ }, "spriteSourceSize": { "x": 9, - "y": 8, + "y": 4, "w": 15, - "h": 15 + "h": 23 }, "frame": { - "x": 400, - "y": 311, + "x": 152, + "y": 366, "w": 15, - "h": 15 + "h": 23 } }, { - "filename": "lum_berry", + "filename": "revive", "rotated": false, "trimmed": true, "sourceSize": { @@ -6213,16 +5898,16 @@ "h": 32 }, "spriteSourceSize": { - "x": 6, - "y": 7, - "w": 20, - "h": 19 + "x": 10, + "y": 8, + "w": 12, + "h": 17 }, "frame": { - "x": 359, - "y": 306, - "w": 20, - "h": 19 + "x": 133, + "y": 399, + "w": 12, + "h": 17 } }, { @@ -6240,14 +5925,14 @@ "h": 16 }, "frame": { - "x": 379, - "y": 314, + "x": 231, + "y": 326, "w": 20, "h": 16 } }, { - "filename": "altarianite", + "filename": "sharp_meteorite", "rotated": false, "trimmed": true, "sourceSize": { @@ -6255,16 +5940,37 @@ "h": 32 }, "spriteSourceSize": { - "x": 8, + "x": 6, "y": 8, - "w": 16, - "h": 16 + "w": 21, + "h": 18 }, "frame": { - "x": 399, - "y": 326, - "w": 16, - "h": 16 + "x": 250, + "y": 308, + "w": 21, + "h": 18 + } + }, + { + "filename": "unremarkable_teacup", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 21, + "h": 18 + }, + "frame": { + "x": 271, + "y": 308, + "w": 21, + "h": 18 } }, { @@ -6282,75 +5988,12 @@ "h": 19 }, "frame": { - "x": 195, - "y": 305, + "x": 292, + "y": 308, "w": 20, "h": 19 } }, - { - "filename": "oval_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 18, - "h": 19 - }, - "frame": { - "x": 195, - "y": 324, - "w": 18, - "h": 19 - } - }, - { - "filename": "lucky_egg", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 17, - "h": 20 - }, - "frame": { - "x": 215, - "y": 305, - "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": 232, - "y": 302, - "w": 18, - "h": 20 - } - }, { "filename": "wl_ability_urge", "rotated": false, @@ -6366,8 +6009,8 @@ "h": 18 }, "frame": { - "x": 250, - "y": 302, + "x": 251, + "y": 326, "w": 20, "h": 18 } @@ -6387,8 +6030,8 @@ "h": 18 }, "frame": { - "x": 270, - "y": 303, + "x": 271, + "y": 326, "w": 20, "h": 18 } @@ -6408,12 +6051,96 @@ "h": 18 }, "frame": { - "x": 213, - "y": 325, + "x": 291, + "y": 327, "w": 20, "h": 18 } }, + { + "filename": "golden_egg", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 6, + "w": 17, + "h": 20 + }, + "frame": { + "x": 312, + "y": 308, + "w": 17, + "h": 20 + } + }, + { + "filename": "candy", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 11, + "w": 18, + "h": 18 + }, + "frame": { + "x": 311, + "y": 328, + "w": 18, + "h": 18 + } + }, + { + "filename": "leftovers", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 15, + "h": 22 + }, + "frame": { + "x": 329, + "y": 307, + "w": 15, + "h": 22 + } + }, + { + "filename": "dark_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 7, + "w": 18, + "h": 18 + }, + "frame": { + "x": 329, + "y": 329, + "w": 18, + "h": 18 + } + }, { "filename": "wl_burn_heal", "rotated": false, @@ -6429,33 +6156,12 @@ "h": 18 }, "frame": { - "x": 197, - "y": 343, + "x": 171, + "y": 334, "w": 20, "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": 217, - "y": 343, - "w": 18, - "h": 18 - } - }, { "filename": "wl_custom_spliced", "rotated": false, @@ -6471,54 +6177,12 @@ "h": 18 }, "frame": { - "x": 290, - "y": 304, + "x": 191, + "y": 334, "w": 20, "h": 18 } }, - { - "filename": "flame_orb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 18, - "h": 18 - }, - "frame": { - "x": 233, - "y": 322, - "w": 18, - "h": 18 - } - }, - { - "filename": "light_ball", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 18, - "h": 18 - }, - "frame": { - "x": 251, - "y": 320, - "w": 18, - "h": 18 - } - }, { "filename": "wl_custom_thief", "rotated": false, @@ -6534,8 +6198,8 @@ "h": 18 }, "frame": { - "x": 269, - "y": 321, + "x": 211, + "y": 339, "w": 20, "h": 18 } @@ -6555,54 +6219,12 @@ "h": 18 }, "frame": { - "x": 289, - "y": 322, + "x": 231, + "y": 342, "w": 20, "h": 18 } }, - { - "filename": "light_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 18, - "h": 18 - }, - "frame": { - "x": 235, - "y": 340, - "w": 18, - "h": 18 - } - }, - { - "filename": "ampharosite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 253, - "y": 338, - "w": 16, - "h": 16 - } - }, { "filename": "wl_ether", "rotated": false, @@ -6618,8 +6240,8 @@ "h": 18 }, "frame": { - "x": 269, - "y": 339, + "x": 251, + "y": 344, "w": 20, "h": 18 } @@ -6639,8 +6261,8 @@ "h": 18 }, "frame": { - "x": 289, - "y": 340, + "x": 271, + "y": 344, "w": 20, "h": 18 } @@ -6660,12 +6282,54 @@ "h": 18 }, "frame": { - "x": 310, - "y": 308, + "x": 291, + "y": 345, "w": 20, "h": 18 } }, + { + "filename": "flame_orb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 7, + "w": 18, + "h": 18 + }, + "frame": { + "x": 311, + "y": 346, + "w": 18, + "h": 18 + } + }, + { + "filename": "light_ball", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 7, + "w": 18, + "h": 18 + }, + "frame": { + "x": 329, + "y": 347, + "w": 18, + "h": 18 + } + }, { "filename": "wl_guard_spec", "rotated": false, @@ -6681,8 +6345,8 @@ "h": 18 }, "frame": { - "x": 309, - "y": 326, + "x": 168, + "y": 352, "w": 20, "h": 18 } @@ -6702,12 +6366,33 @@ "h": 18 }, "frame": { - "x": 309, - "y": 344, + "x": 188, + "y": 352, "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": 167, + "y": 370, + "w": 19, + "h": 19 + } + }, { "filename": "wl_ice_heal", "rotated": false, @@ -6723,8 +6408,8 @@ "h": 18 }, "frame": { - "x": 330, - "y": 309, + "x": 186, + "y": 370, "w": 20, "h": 18 } @@ -6744,12 +6429,54 @@ "h": 18 }, "frame": { - "x": 329, - "y": 327, + "x": 152, + "y": 389, "w": 20, "h": 18 } }, + { + "filename": "light_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 7, + "w": 18, + "h": 18 + }, + "frame": { + "x": 172, + "y": 389, + "w": 18, + "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": 190, + "y": 388, + "w": 17, + "h": 20 + } + }, { "filename": "wl_item_urge", "rotated": false, @@ -6765,33 +6492,12 @@ "h": 18 }, "frame": { - "x": 329, - "y": 345, + "x": 208, + "y": 357, "w": 20, "h": 18 } }, - { - "filename": "audinite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 253, - "y": 354, - "w": 16, - "h": 16 - } - }, { "filename": "wl_max_elixir", "rotated": false, @@ -6807,8 +6513,8 @@ "h": 18 }, "frame": { - "x": 269, - "y": 357, + "x": 228, + "y": 360, "w": 20, "h": 18 } @@ -6828,8 +6534,8 @@ "h": 18 }, "frame": { - "x": 289, - "y": 358, + "x": 248, + "y": 362, "w": 20, "h": 18 } @@ -6849,7 +6555,7 @@ "h": 18 }, "frame": { - "x": 309, + "x": 268, "y": 362, "w": 20, "h": 18 @@ -6870,54 +6576,12 @@ "h": 18 }, "frame": { - "x": 329, + "x": 288, "y": 363, "w": 20, "h": 18 } }, - { - "filename": "toxic_orb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 18, - "h": 18 - }, - "frame": { - "x": 235, - "y": 358, - "w": 18, - "h": 18 - } - }, - { - "filename": "banettite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 253, - "y": 370, - "w": 16, - "h": 16 - } - }, { "filename": "wl_paralyze_heal", "rotated": false, @@ -6933,8 +6597,8 @@ "h": 18 }, "frame": { - "x": 269, - "y": 375, + "x": 308, + "y": 364, "w": 20, "h": 18 } @@ -6954,12 +6618,75 @@ "h": 18 }, "frame": { - "x": 289, - "y": 376, + "x": 328, + "y": 365, "w": 20, "h": 18 } }, + { + "filename": "razor_fang", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 6, + "w": 18, + "h": 20 + }, + "frame": { + "x": 341, + "y": 287, + "w": 18, + "h": 20 + } + }, + { + "filename": "metronome", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 5, + "w": 17, + "h": 22 + }, + "frame": { + "x": 344, + "y": 307, + "w": 17, + "h": 22 + } + }, + { + "filename": "soothe_bell", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 17, + "h": 22 + }, + "frame": { + "x": 347, + "y": 329, + "w": 17, + "h": 22 + } + }, { "filename": "wl_reset_urge", "rotated": false, @@ -6975,8 +6702,8 @@ "h": 18 }, "frame": { - "x": 309, - "y": 380, + "x": 207, + "y": 375, "w": 20, "h": 18 } @@ -6996,8 +6723,8 @@ "h": 18 }, "frame": { - "x": 329, - "y": 381, + "x": 207, + "y": 393, "w": 20, "h": 18 } @@ -7017,12 +6744,75 @@ "h": 18 }, "frame": { - "x": 116, - "y": 357, + "x": 227, + "y": 378, "w": 20, "h": 18 } }, + { + "filename": "oval_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 7, + "w": 18, + "h": 19 + }, + "frame": { + "x": 247, + "y": 380, + "w": 18, + "h": 19 + } + }, + { + "filename": "toxic_orb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 7, + "w": 18, + "h": 18 + }, + "frame": { + "x": 265, + "y": 380, + "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": 265, + "y": 398, + "w": 16, + "h": 18 + } + }, { "filename": "relic_band", "rotated": false, @@ -7038,12 +6828,201 @@ "h": 16 }, "frame": { - "x": 115, - "y": 375, + "x": 227, + "y": 396, "w": 17, "h": 16 } }, + { + "filename": "abomasite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 283, + "y": 381, + "w": 16, + "h": 16 + } + }, + { + "filename": "absolite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 244, + "y": 399, + "w": 16, + "h": 16 + } + }, + { + "filename": "aerodactylite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 299, + "y": 382, + "w": 16, + "h": 16 + } + }, + { + "filename": "aggronite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 364, + "y": 164, + "w": 16, + "h": 16 + } + }, + { + "filename": "alakazite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 364, + "y": 180, + "w": 16, + "h": 16 + } + }, + { + "filename": "altarianite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 363, + "y": 196, + "w": 16, + "h": 16 + } + }, + { + "filename": "ampharosite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 362, + "y": 212, + "w": 16, + "h": 16 + } + }, + { + "filename": "audinite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 362, + "y": 228, + "w": 16, + "h": 16 + } + }, + { + "filename": "banettite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 362, + "y": 244, + "w": 16, + "h": 16 + } + }, { "filename": "beedrillite", "rotated": false, @@ -7059,12 +7038,33 @@ "h": 16 }, "frame": { - "x": 114, - "y": 391, + "x": 361, + "y": 260, "w": 16, "h": 16 } }, + { + "filename": "eviolite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 15, + "h": 15 + }, + "frame": { + "x": 380, + "y": 157, + "w": 15, + "h": 15 + } + }, { "filename": "blastoisinite", "rotated": false, @@ -7080,8 +7080,8 @@ "h": 16 }, "frame": { - "x": 130, - "y": 399, + "x": 380, + "y": 172, "w": 16, "h": 16 } @@ -7101,8 +7101,8 @@ "h": 16 }, "frame": { - "x": 146, - "y": 399, + "x": 380, + "y": 188, "w": 16, "h": 16 } @@ -7122,8 +7122,8 @@ "h": 16 }, "frame": { - "x": 162, - "y": 399, + "x": 379, + "y": 204, "w": 16, "h": 16 } @@ -7143,8 +7143,8 @@ "h": 16 }, "frame": { - "x": 178, - "y": 399, + "x": 378, + "y": 220, "w": 16, "h": 16 } @@ -7164,218 +7164,8 @@ "h": 16 }, "frame": { - "x": 194, - "y": 399, - "w": 16, - "h": 16 - } - }, - { - "filename": "diancite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 210, - "y": 399, - "w": 16, - "h": 16 - } - }, - { - "filename": "galladite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 226, - "y": 399, - "w": 16, - "h": 16 - } - }, - { - "filename": "garchompite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 242, - "y": 399, - "w": 16, - "h": 16 - } - }, - { - "filename": "gardevoirite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 258, - "y": 399, - "w": 16, - "h": 16 - } - }, - { - "filename": "gengarite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 274, - "y": 399, - "w": 16, - "h": 16 - } - }, - { - "filename": "glalitite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 290, - "y": 399, - "w": 16, - "h": 16 - } - }, - { - "filename": "gyaradosite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 306, - "y": 399, - "w": 16, - "h": 16 - } - }, - { - "filename": "heracronite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 322, - "y": 399, - "w": 16, - "h": 16 - } - }, - { - "filename": "houndoominite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 338, - "y": 399, - "w": 16, - "h": 16 - } - }, - { - "filename": "kangaskhanite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 132, - "y": 375, + "x": 378, + "y": 236, "w": 16, "h": 16 } @@ -7395,12 +7185,243 @@ "h": 15 }, "frame": { - "x": 136, - "y": 360, + "x": 378, + "y": 252, "w": 16, "h": 15 } }, + { + "filename": "diancite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 377, + "y": 267, + "w": 16, + "h": 16 + } + }, + { + "filename": "galladite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 361, + "y": 276, + "w": 16, + "h": 16 + } + }, + { + "filename": "prism_scale", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 9, + "y": 8, + "w": 15, + "h": 15 + }, + "frame": { + "x": 359, + "y": 292, + "w": 15, + "h": 15 + } + }, + { + "filename": "garchompite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 361, + "y": 307, + "w": 16, + "h": 16 + } + }, + { + "filename": "gardevoirite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 377, + "y": 283, + "w": 16, + "h": 16 + } + }, + { + "filename": "gengarite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 377, + "y": 299, + "w": 16, + "h": 16 + } + }, + { + "filename": "glalitite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 377, + "y": 315, + "w": 16, + "h": 16 + } + }, + { + "filename": "gyaradosite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 364, + "y": 331, + "w": 16, + "h": 16 + } + }, + { + "filename": "heracronite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 380, + "y": 331, + "w": 16, + "h": 16 + } + }, + { + "filename": "houndoominite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 364, + "y": 347, + "w": 16, + "h": 16 + } + }, + { + "filename": "kangaskhanite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 380, + "y": 347, + "w": 16, + "h": 16 + } + }, { "filename": "latiasite", "rotated": false, @@ -7416,8 +7437,8 @@ "h": 16 }, "frame": { - "x": 152, - "y": 360, + "x": 348, + "y": 351, "w": 16, "h": 16 } @@ -7437,8 +7458,8 @@ "h": 16 }, "frame": { - "x": 148, - "y": 376, + "x": 348, + "y": 367, "w": 16, "h": 16 } @@ -7458,8 +7479,8 @@ "h": 16 }, "frame": { - "x": 168, - "y": 361, + "x": 364, + "y": 363, "w": 16, "h": 16 } @@ -7479,8 +7500,8 @@ "h": 16 }, "frame": { - "x": 184, - "y": 361, + "x": 380, + "y": 363, "w": 16, "h": 16 } @@ -7500,8 +7521,8 @@ "h": 16 }, "frame": { - "x": 200, - "y": 361, + "x": 364, + "y": 379, "w": 16, "h": 16 } @@ -7521,8 +7542,8 @@ "h": 16 }, "frame": { - "x": 216, - "y": 361, + "x": 380, + "y": 379, "w": 16, "h": 16 } @@ -7542,8 +7563,8 @@ "h": 16 }, "frame": { - "x": 164, - "y": 377, + "x": 281, + "y": 398, "w": 16, "h": 16 } @@ -7563,8 +7584,8 @@ "h": 16 }, "frame": { - "x": 180, - "y": 377, + "x": 297, + "y": 398, "w": 16, "h": 16 } @@ -7584,8 +7605,8 @@ "h": 16 }, "frame": { - "x": 196, - "y": 377, + "x": 396, + "y": 158, "w": 16, "h": 16 } @@ -7605,8 +7626,8 @@ "h": 16 }, "frame": { - "x": 212, - "y": 377, + "x": 396, + "y": 174, "w": 16, "h": 16 } @@ -7626,8 +7647,8 @@ "h": 16 }, "frame": { - "x": 228, - "y": 377, + "x": 396, + "y": 190, "w": 16, "h": 16 } @@ -7647,8 +7668,8 @@ "h": 16 }, "frame": { - "x": 349, - "y": 327, + "x": 395, + "y": 206, "w": 16, "h": 16 } @@ -7668,8 +7689,8 @@ "h": 16 }, "frame": { - "x": 349, - "y": 343, + "x": 394, + "y": 222, "w": 16, "h": 16 } @@ -7689,8 +7710,8 @@ "h": 16 }, "frame": { - "x": 349, - "y": 359, + "x": 394, + "y": 238, "w": 16, "h": 16 } @@ -7710,8 +7731,8 @@ "h": 16 }, "frame": { - "x": 349, - "y": 375, + "x": 394, + "y": 254, "w": 16, "h": 16 } @@ -7731,8 +7752,8 @@ "h": 16 }, "frame": { - "x": 354, - "y": 391, + "x": 393, + "y": 270, "w": 16, "h": 16 } @@ -7752,8 +7773,8 @@ "h": 16 }, "frame": { - "x": 365, - "y": 330, + "x": 393, + "y": 286, "w": 16, "h": 16 } @@ -7773,8 +7794,8 @@ "h": 16 }, "frame": { - "x": 381, - "y": 330, + "x": 393, + "y": 302, "w": 16, "h": 16 } @@ -7794,8 +7815,8 @@ "h": 16 }, "frame": { - "x": 365, - "y": 346, + "x": 315, + "y": 383, "w": 16, "h": 16 } @@ -7815,8 +7836,8 @@ "h": 16 }, "frame": { - "x": 365, - "y": 362, + "x": 331, + "y": 383, "w": 16, "h": 16 } @@ -7836,8 +7857,8 @@ "h": 16 }, "frame": { - "x": 381, - "y": 346, + "x": 347, + "y": 383, "w": 16, "h": 16 } @@ -7857,8 +7878,8 @@ "h": 16 }, "frame": { - "x": 381, - "y": 362, + "x": 313, + "y": 399, "w": 16, "h": 16 } @@ -7878,8 +7899,8 @@ "h": 16 }, "frame": { - "x": 397, - "y": 342, + "x": 329, + "y": 399, "w": 16, "h": 16 } @@ -7899,8 +7920,8 @@ "h": 16 }, "frame": { - "x": 397, - "y": 358, + "x": 345, + "y": 399, "w": 16, "h": 16 } @@ -7920,8 +7941,8 @@ "h": 16 }, "frame": { - "x": 397, - "y": 374, + "x": 363, + "y": 395, "w": 16, "h": 16 } @@ -7941,8 +7962,8 @@ "h": 16 }, "frame": { - "x": 370, - "y": 378, + "x": 379, + "y": 395, "w": 16, "h": 16 } @@ -7953,6 +7974,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:60db8f4653a650759cd9189e91c38a40:439307cbef9c000f6c45603b2d82d107:110e074689c9edd2c54833ce2e4d9270$" + "smartupdate": "$TexturePacker:SmartUpdate:1b6e262a772654e8b35b755bf9f72b4b:d747988c68896024764564ae07a7c2a2:110e074689c9edd2c54833ce2e4d9270$" } } diff --git a/public/images/items.png b/public/images/items.png index 6d9434d045416b3a455f990d19d7872238afc250..4857c4a66e4960d8098bd90bfec6ba1e17b89435 100644 GIT binary patch literal 54907 zcmXuK1yodD)IK}~3_Wzi3?L;S4U)sqNK1%-q=X`-Fz&o_p^_cF7hnDy-rcUdJG)=CTU{EP=*Va~$DOsLvMSoXt*>joo|MfkDoZtz z)JjA}zTnL{J6nl*8)N4<*7nh>VoAN_>O3x|J?P@*tRRn`;yL!yUB|)wFI9({?wHS2 zYi%lxrpTQ3-k?R3i`BxE*{h;_wc8kxg{2EWW&6>yw$uBo7hdkm=NqY&r#x>`qx375 z+$9FtsqSW5zMREe~zfWqPbRi+W#+TbEWh4GQ?y0X7`|Yz27_8 z{n<@hmt%y(_fOcVio^5S%Qxbz7wEwJk7U)>i|y^f+dIDgF4UKu*yS>>(+Z~5sl@Uu zOgc)neXjrbtyN=!eb@KTB7DUn@19;p|GK^65*0&sc2ezQHSG-*)_Z!e2`0Bc$z;{c zvu)F+su()m+vg2<2eLJ0$3AmMV(P;KzLb%*3%w10%y%?{8=76b;!mn5M5A4_RfcWM z9{4+%bTKU`+P+@cbo6Ka`p;keAYGNf-!av0Z}MYw$5Ey~+%}3`#>bL%V!pr5U<#hm zc)RPE%yM7h)Aq~C%!rs(DfsLA&qx@pqy0#J!qt&O)YpnBpReV7RbRsDJ?9y{_UI+i&bn-` z*_w`*{w8?JsrZ~#f!Vebwfl6Fh1y5j=20bkY%5D;R)wGPV+X>?Dq32agTSf(-rQ5; zlY&+7Eglkpz*A4_IpF_``$tK8a{+DS4_16vRbvkTfYkDT8n9HZ!~p<+1Jo4d^?jyy zfB3!7H~M(5>3dctSKdHL^Fa@yr~^}k$qUTZbVrm1vqwww6qE|m7p`wS^67MpvB%Z? zTx$PWkiK)}b$029J$Xc_VATxgdhE0eU7=vq7CSAc*XEXItMI?Eq3;v(*V)zQjqu{V z4BwzuZv$P*4W#Zn*^TcL(~jm^I>Yxa_j!U!4j$9*;)0BM<>XrDCN(rPPVBY+^TW?{ z=nPm`YxFvsbN)AW+uZ8-kLhVk@v&U>+)6>QoZHizt-&n98OoVSX`^yT&di(R>C0D@ z^)jd^OG^NBsZBV3t@?VY{RtybFIo6b7L%fcABRZ+x5ufxbcl47wMS&c1*xE%C0f`X z?VxWRd5)6{=A$<_kfkPxXzpgIp-+axT%BS)-c9)ItZ`IA^Qy{K{Jnelv zD09bVT5mY%ihb+dD;M6A%au>}*s6<%-2DgB z{FyYF zqd90>PU)Jux(u^YKDZ3;Bi1Yd(tGuj7tmm(D73oQpIIDa>z$~zjjLYDMjPd)%f?Sb zGWGg`OcgHelxtZoge|vqZOtx3=>_9){d^41ZRfp-HFRaaPuxz|`mP65w^6Q@7}whl zHocxd7fLVCXUk(YBp_CED6?=-BUVpfWqwj3!;fA5G>uOjX1DZ8MHa9*`bpTXF1OSB za7_D#>UUyJTXF4|y}8$mke~w2__Jm9h3#ckbi}8wf34>N%9f1!1-%@&Dh_B>CcxFH z8RTT=d%ZifYy?EU2oxBSIZ{3LFiYc4rGoeX2I_He7W}0eu}DMMA~zU$yupSQGL}c% zF$3sjZ>k*+=QjEYK+*u)36;DX5yz`9Cf`B;+NA6!LV#_=wFF8@T!fo@%i}^l`hEl) zAKlE^UxRmn@yYOMh;Al9Q@-B#eRPx~mB#;NTCHy|D=TpHUfjXa?O?Dqo>7(owkEd|zPrdL%FM4)0*<`F8 zHmW`55~kMpWi*r?RlYw`C}Dh4jlt+E`Q9AnE6`B?IE^nWJG_?3`#wh;-N2ceS%nAm zrOS2I>SOqdQ7D;@hq&f>ikiQ=#g9A5RIhg>IxeRo>4eT@T@2}nIY4D*Am^lG=N%ih)hO{fisUf zCY~8w{5aLy=@8R2UYyS)w40m|6X%>p0EkqdC5q7tha1zPgHzS;C6^u^E#0F=l>zH#q56X zy+BG*owfsjMg;-PoBqOQZPokV$UQ#=+c4nbYIiz?``?dOEBA=KR^srmejbEu`M|bNKr3t1CBtGTdv_5L1+*qz zhaz#tb`la`E4ak5o9lo zf1%H(t*XVB=MKMLz1;O1!pfI2allCd$(KY-l47#CuE?SUWvt25r|3;*l7lIOz6${2 z^~utwh{IR)H5HCV8kEewic+ILrT$Sa-e$>B-8dZCXiyRmPztI5R2}K_Tm}ZsgmGc9 zBlmH*h=zNKe?KmK{3ZPxl;!D!R;ho~&%Mc#Wugd+mmN9Fk-9aAuRO?ID3pBsx%Zb9 ze*`0_rCw-*nCXi8Z=y{+wS$HB>*Arb1oTWm#^Dt+jrKx^LTLmcsl+EJ#H03Ex<+W> zXURf5I8=JDb`VfvpgX(2YLlRQ{QH?fX2@{wS})}2>7$S#pXfaxl4k?FV1tYqdckf} z6YLHf_?vA$gjNCQ8#P4HX6!9>4v9^^b8xNzOPi4;TJ8F6eH=yG3U}=M^K&6Yw@N%qv z13{4gT|p6Nw58|U-@l@@j}6i3fDwO(h4@Kk7J^qKU;J)rmquH}PCVp@>4ZM8UMWte z-5*tPw*3nJTo_qXNCm~$1mOQTU5dcRKRiS*P8b?_tLw?)3&4or6YUlhU8$;!6(B91SpR+ z$d^m@u^j`E3K1ll+zc3cE3|vhWX$cUS=aH-cP<1W{9@yY8M)LkA_fP}ww$180 zrc6(oK4Qa9L|J9EL)N3jn2E@1XSujnB=~|soVRnFB8d#BHTpBoj@kL{#+2>0HPB+ffPNKM_OC|!c9$$Ws*wi#nKYV5A^XD9Ow;51 zDMkRRzJmK;M16QURXHMmy)XfT6y(8?RtcF!cgU2LB@kdBpy+v3;yH1@GZ_5p&hSU@JoBs96sk8mT38pWP4AN+^w5ZfhT^x4cqxS+4 zV5WfZH%ZTTMTURF^@p4DU&6`}5NXB>iRMXt%8%(l1f>Rv05g-U^wlG!Hx*VK5!dti z#j1mUW<`%TRvvN!mc%M*)LunwnKOtlr?eu7Qe^)DkBmFn9mUiNGDJ?7uEn-YqJj4t_#h9l^7(xbyq z^~RG@hhK~j=~!_OBd~{AVsF2JUS4HCw+jUY_m)-52mf6epTZ&+-L{={;0F@##NhCf z-?(8D9+9KLGW2j7JeyuSM=!A`wTd-{8fGodK7|2SNl8{Pj4Z*nc`g1)j3Ws<~_0c6*=K%rkH&Osa=C76V zPrM&9%@n>HsU0&Y;qslDihYMv1&Y45vs3V#fR40a-8FXFY+GCYdpGudaRDMLFA`-P z#i&Wijx&N=PT%8!gD-DP2cv)UD`Gz)rM+$_KWBdM{^>Pypt<*3CXv-|)mg{i7^yo$S6N5_gnk&YyOi{AV_XJzKM}hRyL78Jwx)&8+>*G6FS7}jR(Mp zl&!3>;OyMzuWZx1FIMi>h?sKaG9Dw zy?0`q{p%BVxf%0T_6}1d{_jsDy#B)(%r4va`ECnPCjl+!Jy_hg27kogPHCvwHG~czQ2ptEUbDj@8Os7wO^)jk*UE!tPv@N?hXiD zDmHdAe|x>Jva?h?wXZT);Huh{QO1FcU^XEUA0&|}{-HJ6Ht0IW>wqx|vQlTz%c}$OE;1qTEwbR8(bCPEjBoj~5r{k$bd|QlB6ZZg+o|nHe88 zq}X9V1wCaAK@&-W;IIUF6#xVzv>AzJ6)@rsW)pr%y?La7%LIf$`>=)Jj<_%R*1fM{ z(&fzA6yp%sJtS0d+4DRIsFQEk*-pQsmv6F8g-k22!T?8lV%7 zpq!$jU~;UJ3R0#nG_(*6(3SEhVo7WHth*xouH2&uKy0*Tx52yD^YOZNrZf-`kE=Qf zqtWrHe1(ez(G61)>zLE&#Nck~(&>CD#*$+^)(0{og$tjlFXE3#XA^C56AvTlhMmO! z(c#Kg^_4_|w}Y>?++u*NUg#z)oj*Y5J=?i!9KkY1L(Y2}W4=2gm~MTds^;sSh68>w zX4c@^USV@UAU$3~W`@ir#VL9gc~V}M@1G6O^aAMb0_^K?p@r8OWrZs7vL3dc1_t=j zRXCn~K%FF#NJ6e3rIBm+>FuxIF2uP-k~guy&-K0WRZEMi$RvQD-1g%h7be?Gw>F%E zYW-g7=s(Ye?9BSoRP~$pM-tK~!#*dd5?^cS!svq%NN+}oby1K5N?`6QdLgL15Eg_B zMI{iGJ^@1zs<wQ669uqXvQqzOTz+!jls=zqR%CU`OF zih3J@rX6Jn!Ki9h9CD6bwhief0$& zNKlp>%liT21i>ImZD#r7>`bG+=dkAC=7H6^ZJKHHRXMXzP9cV*=>m ztf;oFPuTmXN_dKY*BO%HKhxn{(HX2VhKL~7VMRcp2sp9MAN^Gd`AdyI&)+&iM*$fM zFdR=ec3PY+YgiG~xao8=@pV$di25T_WSiaE&(y7zhAF!#sNKJLJC;NQFwr4|4&4xI zJFm9E1`Zh(UN&||e0HREe}6vb{qN=DaRP}ZBTwWt*=jFKkVc0hvamEzS>^_YL8D21 zBw_|g(9@*y2Rup^RlF)#!AKjXLh^!ch`K5OGV=blo!2CzEZ}7$c^nhep0OBT`(?5O z`lyG2kh*jm^fmC7Ncjv6$8{4X?1R{Mg;mg~PX5R10|BGF8W~Gf@wzTm(S13r11ri@ za|lv#NMh2+;!*;!4Z-twI5IDwA!%ybCEFv`FuWpesIW8N8G+9U5eaITe|5~4CszKi zjVM^}Tdp5T-%SR+QpzV)^w)ZM{oyCd3)c1KF#O>PGd+4_Tm8ELFGVk}NxLT&%o_>e ztpx|X48UOTYudm>&@ynpFkS#c6>yTM&TI?qU}tC(IE~4bY%0gx#K07Rf@4;&DSm*} zVE&$QSBwfMMfTmAx(@^IGuQ77uTeikRIYTT38@cU{I2Cjn)d~YBiu8&V;*3286X8UUMUuV6>y$<3O^XcrQ`kz0@$@zO@7N#2TJHvyQZA zV-V9Ap)VH!%{2f=@d-OcvcQ=KBM^feK)e`w-VG|>PJ$?XMJm5ag!5dKKC^TfL?2tq zg}@(nkAT$}KZJw&@rDOWNjIFgQ&9G=m5f)6021ijPY;(Nh(h;d0CRS(M#rAKGyCfO z@kK!4#H*q%SXLj|LD%Nx~S3S$vEsF{5Yk;R#28j{5Zs{0HdWQXHnFPx~zn_&({W z#7|E7Y|r<=wJ|D)NWo5+T~rD?mlB$j6$IUC9ZcG#@7b^h59i=ZEG&`Wi5O!;2_!Ag zT-#4LfR-QIF4&PR zN?o)Nx{zsuL6CH@v8XU?rwbU?M7Y zFM%*y_vcmN7BTG}zs%Ir@d$y*4nkMtmQJGGFwFyJU-#Qrjn!l7!Bxl5eIs$M8Ud0)Y#H3x*f;};u~N3wP=I5qm| zz{6SEYG=jNA>ZtteSAwGf81>)){D|5bEHVUEqW^PqqDxjxCY#GZbm9>tKc7TY5cjuR}ji};R-1FUPB;JkbBrk6|`AF|uA41?1 zDKWdH_=(jPhFBlT!10y$A|Djp){NGWVUx(h!zn763fc%(js6CuSW+r>XQWoul^HYK z`Qx;{+{V$5KJZtAiFB<>hcwm`z7TpO-_f-niogCLa zv#iVkvYiJpjRxBN?X*xR;~LiAdgCRLqfSxN5{}U$;p%!N|DSiP0~DX^M<$vZ)QA<; zcMzX@Y~usvm{$6ED|Kx*XBuC#~Pxd*?$ZnAwDMiKw>OMh8Tl za$DSdw2fZtPT~+Y@#|@zn=ZI%0c-!PQr=IDuxA;N^U|v$siGdeWzFHNcYNi$wyd<4 zA8;4v#95p?ZVAxCyN@5N@{+!>(ca3{6S>%zNTB}hwSq2t#zF?=9x5}tyV>CLBbC#e zry6rg7=Bv#D;RVnj0^6rmR+pS&6iW?|7~@vePj z(zjF&6h?yNs_2>9BMw`?=|dd_j9k1^zsPqlH`69*T8p9F0#^HLN~-+GT{+j)uBgN= zTB&1Ix!{B&r_0y&1?6jNt(NGs>}Om7zKS$Tf|M8w$#)}Ekjl?#>QT3i%F|5X&k~Dt zJ$x5Pt+>6%--T}igK!^zx(yE=Y1ui=$14F8A+iD6F{qsEcd=2%v!lYyi5XB&lW zB7u>LhD9|Z868DH)%U)m-^GE_p+7>w!SVeaVMoDHj03zvLc+DgXLma@~j7(hYeP=sDLA6OGW7k z(y~XvNvw}4w$5NE>Ti4c>g)-XLk=OZ1v-pJXy*H1bD%H zPo4mHc<6U=E-7)EL*?#XfD}1cX>H#}=o(TV08zJB`1t=A{(_ox?ifhyi-VrUA06@U z0k8bJMtuQ&3BwoJ7JHh#7q{SW`IihU+L}!3LwzHrrlzieZXxv&2*i_kXi~^t6hgci zA?`d(@$s3O`FRxa87cHL5{Tub$m5mU06-6B8`+w6Q&Li*qdztj|I|&bDYiL2>S2A3 zAyA}QPlD; zM>IM#z3oIpt&Qh*Q6apf)`Gl|uwuX`9=vV~DPD!{q8=h=tD+$3j_ zFO>7~-~?P3!};A$J3Wzfbl~uAK*@NFrBQ|H2w)9NbKvNEd5Pb?vO+|Y0yS-`V z+Gk2w+`gZlyC=pLFGTjaCo(m0ae*;RKY`u$Xe;z^DlmHppo#4E zmEiu!Zt*Q4z6`X$3<9BOBKlFR#RL;0{iBlJfKv0u^76F}TIQ$ZiNu&SH)$duc1qP= zj2%BU6^s4Zps{>$G~U^bV7?&_U_^wn4Wgl4d7TEv2Dex3V3;ItWlaG)+R=|qUXW^e zlPxGA{9b+kt$U9RC*B5$0&;0-$t#zOO;nZQc+vgrWL~vvFA5e#{-rvWNOp1TTlGk5+1h}jtY>2l@i2rw z#J7V<7K4w4!$Fu#)(GP33ZW#47HPzIr<TG5qFh6NK@BB)^TDp7=kuYb@obG@K|9)-Fm=se})k1k_G7#JAXbmF46W-ZG= z2T?IGY(zQ~snQ?hKc_K*p`+ccDjE`psBrrTpE9mOA80wq zJUxj0Ro@a^1&K`HJeWur3GezXjjCDJW-Z3!0Te{C%Nm5@8YD_Fe8sN`wk6=DRU)~r z;7$@iCU)9Jqr1{J&>&Ykc_7ugTo_Pa7(U7}m8;Nkfqk%&cS{Bne>0whpxzru=EgPr^7${5S3? zh*l(w9EYYi^TL0r#-AUd?Iq{wf-EtYiz3D8dRe;bvY9v7Gt1{J7K}SkS}akH)$O`E zYTgq_e-_DF0HXg7Nbf`u>O+7h$o1&;f-E>;k0?2AP|A{d|Mq;L{@isxS7xO3@sXY?kf&_C_Lvzv3G?Ks5G>pP%HyW}BFAYi+9a zg!~DoK4kk4cY3K4D)Y;9R<^x+>bHPfy0?%!S8d{|tp5vMkMrjDwN2AB>kmvRx2b*U zOpG0&PlM7P&s3~pxICB(cZ#U6c{BK7IR)?!c3R#J;tscTMj*rieiMtK5exC=fps=P&Dh6o?d{(vkhVTA9pO*8~z5Zk{4kJgM!dY-P0jPcjS^wC*L!x0I<{RwN zeg+45MW*ONS@>A>_U`&$2Ksl7RIiAlUa`9@H8Q~r%pw^cpE?raWG>qV%+FS{5V(@P z0zYuCcxTAt6fpVeO8k*`G^kM96M3f^#L4(YDbF4)g42)IdxZSCC$VSeefnq5zC|Z* zR)w)#XlG%89d4?EP*;Tb0)_I;xmZZJo@g_(f(Z)BraHpb_uj+E2{MCe3$ypQTS?Aj ze4f&WzMy60mJ${2#&^o;d41%oarFL+U{_bfm4u7MR~pJyrWoy7M&|=X$D9a?0yKs) z?kttw77$H20O-;Li9BU1S*%-{<JZG^SnI4k4($G_5Lr9$KqMj$O44UN_@|E>U;)Ne)B1J5yjtS9_jLic=OOgeXX|#W-hKXc-k^8Ut z$Z8ufmjtdhviPyYA);a&>^Cm0?1m99+>v(}NGsj&{ExuO z$yV=5l0NBwidtXZs{5WfK1JHPvC zBoh3KT04vn>tRohwX)Yb@T&rH@%-FbJLih<<&-;aw&W)n1#>T`zp9B823;;P#x_eY z&+e3TLH@q`n9>Yj@S6Jc>m_bqPVW2^e6{XefpnN*Hf~1fU)2+_^TL>c!ZuZ_?@ZF-ozg0U55KEdxdA`q&{{NiDB7KsQDUy!aS?sn?pZm9@Bbm!N zrc_$JjlX-bI5L%Zzxp$q;W)XcB`)>ih$r)A!Npte0bYG%tTHn_9sTrdDkRO&f1*2` zj%9`6wtMm^^KzF;Qz;u)q=5z!*{xj0N$?00UIz9vljORd7X5{F!pmFUeB<<6?VG)> zwU8>bk6q`K{TF)RN8nH8yrKHKU(;f&~=e^xqel8khvtb6`I(BZ5i^e9Pto(_Wf=#;vhr?7O6)m1h_c;r!HNqK?eFf>; zoa+B|E9qS-jBQSh@b!5)VCXwWAGK6%LMANtByK$wYwIRN6*mh0@4VhmvZx>MOaDzC_HscUU5 z1P5sWBDphb#&$|vQG&rX^-1-0ZeOyf@N|%cK&|&z_CN9VQ4E&`5Pd_#v+d7(eA&Z$ zv6^y{uW;O@08MY6MIN=gIBD@8IYa`HIY;iFkdO#wBUAsEAbrsU@=-h51X(IpxalX| zI8=^~jBfY(8?kauq4FQToJ2#yvE!Ip8SdN~qtd5D>kr}LYzWwfQAAQ8A-YSx2{t$@?>kWa%cy`&lR}cajHRc5YOyYIS z;_Er81j|0@A@mHQD!qpSI6sb}a|%08e?|6p^A$XjR3&fg#DT*eC7k))E*8D}o@~8{ zSe$|K$C1=xC`lRsIT@KDqiK!Avah!)>xx1HN8cgqvoaakU}d=ce~emf1{?RfrXLp{ z_nVB%C2StwnjgA$bghbQ8twAT*6pRGB+%(7;=GrHk#`qH6neCFq;rZ-#L zxb?<<>D}ANX^@v3lCJjP{2FYh%~oQ!Xz^fhaB%s7qfH%>@+qH;%vWQiCA_&g9QUlC=)V~90&*b$@qgQ) zhJRe(O6)e|R@9RPz^e)Eb^zCXJudb*kN_8XIW#jQO0=O0ed;UpQ(aZ1h6@32tOs_62b|~BPR9E-q)T`28H)8>B*n6mm@)jd=Rokq zvsqehF1#G49v}J~L)skelgje+&I#|{>vTKq&x~1tPFrKI29B(jN*gKfmhRjmvrz}plYr+2n`^e9>^gY8e@bl%4eNZ zcY545nRIv@ty(Z3C0U_z%S5NZ&X%3I@AVJ9k?AE_gJ`qG_gB*JfNH_6@RJzay+yrb zNfuRsm#+*EcSwS?{eg%^PN%!^2}A2}owrL0OpJR{%iOc0YQrtKC|}~n4+R0875?7K z5VPP?CllkTC-rZI!R2kNARx}j3wEZEW2Mkg=`i3ixp|1>{5oE_ASo zt^l)wmP;Ppo@AJV3|$csmy>D@G0Z=V1X zo;-O%YG(35aD_$>6T3dY7)y_x{`1+$$S6q7FD$Ap0w?bo%2CT$@~xJ07bAO0+6IHy zvSNS?p8i8%w%)AOp*)yXC>mtJ^78I2nka=R9N2p?4HC&8o&HQS(YeIQp<2BemDO}2 z%YpAX!h|TSN5-^w&=o_4I_s9aO@U?r#Xn;|{LX_uxF;l-U3SSh0cZhNzg>Qcro=is z;eYAg;eGTBeb7`nSg7(#0q$?{f9%Al-Lo5wfRM@>7gPoqMX@R0kto8`=@F@ z(5ltl*?l_A&nH`4b3Zl$$puif^IxUjy*>u%D{ad_RKf%s6Rr{qGn@s@YMJ76d7$(?ihkm-x(l%JgUrUR}c z%Lu{=UQYO~Yg9!eJHGOSa5h|+r?O;W*yV%8K2LD4TDu0*0QCI~UcN!Ueyg|)4l-t$ zhS5jAo^S5w#ARb4uxIFESzpSX_*u*vM=+{Vp%Pxs;*We}1F%ADnus-RoA5!aV4k@$ zGL?7;DMg|Lbi`X*G(=h+n@h%~JP-qtWt&dbNihB&`0{mrff(j@TLVruHL7=E5z&1l zyXAR{(x{CklH&czutt2me%Vn(o<2%R>>&1!c;0?pn8WJbp4Z{|9u6kR)Oth6qMbs)NV=q0cmijl~}h5<(3R;VBw)0Wx^-_l;=bg>0wnR6`mhPfM4Cv z$oco@AN_8LP}kerNoxYjuW)hQY}a|rP^B!qeBruC)ML8Q-ObJ7;u(TsLb)sFXZ~my zj?Im1e=&YY2C2e0I%Aefa-JLh z-kUjVug9jnm^z|Aq#*;2B@_NWlpV#tUv!vH!~0^<9LXrjJ|}TOb18A-O&>s+L2BcY z6Fj1E&I5$~7->hk>wR@&gM*a+4~H36iV>rNn`1w!zSZJ-ly9kZA;5#>{#V7Aj|1Gp z8m;&>v7yJ0H-?UR^FMu3V$S;;T(Sq>Ruwe?pSawgxhzM5zX3{qT&OI*q#?Ws+#%oG zzcw}L9eozr9~C@K>ie+kz^kq~Z8iep+s(Zw21 z+l{!LrrIy}D*x}Tmz>8C&#n~6(6HwNem+aK+`T+k)xV26 zYuAN`HA(C_R^7U4Lo)~D8m&Kxk+-v7dhvxh-a$e!KW`zgn>SrS<{)~mWvL22t=J!HzTs(T(#Aqbqu zzCoqmw|boPQY*LSmD!F6Y}!P}bt6u>@7oz~TwM#r%SBpt;Fk zoXGh>jl^Iyt{QBYI^u)1xeSJDVblEhq-k8v^UWC&*+5)){7`mxV*2VbW*KsLA8@hM zr0S$#m#%!C^!2Hw<#vt0O8L_ZlOL*h2QPY=U1gz>S@=5NOgfUI&C71oI2{B+-Fj?( ze0_hid3pTHFlJ@O@XL{p^k>-cE^4Pw!{3gRql8N13r`!^vdt!w_%yV#NEIc+!intfH+pu;PFY2yxra$s-=v_x!mY{Z;5F|( zr=qFo^9|Ib2!gc{I3j*$JeMy!J=a!GaX2|>C}9yAFW73%NrPysEV@_-4E2zH#7M}- zB^rZN5O=1fp#(_-^Rzi^e#IX5|LSxzexZAM;U7)R5-{HvK@VT7-iIe%%znr7=i#A+ zk3Oz8sn@s}6-l|6pK)ou&283?T3KAGq85LDA9lP`k;$KNh#mn7EkVnVF47{l4mynp|Qkr{4pdfn= zfbmfQ^E6`QGk!=Qe&XRTC7(;M{`wPS+=3FF|_rASzjYfj?5dU$DE4(-`mMA_7lXh{P6<%Wrnk=jL9? z%FX@VIkTMO(cCYs0<=&fjMnF=Bq`xn)7C(yVF4|4=)cc(WDHm;IVMB(;wQSRn3@SnI9F4=Y#>LgS$9a?OZ8SX`rS%nQ6a;*1^ z@)CSYH>^rV3JSTXeoa^oWoHK--ERb4@u49&u|0p4fDVF@7$|FtzlG@{lEQ@K@F&Y^x=T!oz&-*@#p+ z%n{H;Up*P3r?SnJA6?}4PD9QMEpTJ1f}}@iY}Wi)dBH_q?G(UM#t1+@H92#ddQMQ* zG4-aiJK**-=#H~BXiklX19?@VR!ZU|`-{w;h~P+n7>4N_H}WO0V`CxJ=Kr1dB8Zs+ z5={C*<}QVjz01Z1!M=*e3*sxsAacS z>qsPJ$M-uko%5igA*h(3Iys#*KgI*XxKU(pXeOD& zF_E?h4@`!qn4~83y8v)%kI(2V<8!dsL^QA@5Ddoag$v3j_r`gld49L4xv+yv{YIelg@(of(6So+U}!58k*v7n=8 zm;SeTAnXzv@5{OCnU>Lii?VUO@a;7MyXO+s-IV(`SH~M;ynjM}Ylk@L>D|xPKO4!%yk1hGy+1W-?y7H(hje*cVb23V077-zpTtZEea^_}jk-n5nqX}{+|z%V20Z2O+c z&atR?7SPg}*gwg7^`6!=qaE<&gV;~$bJs9E#udMRuX2`1@|ngzXVp{Alo7$$@uQ+% zK!QlWHSRF|56v^5E7Xll@jvCI9VAhdmCw1e(h#})0N5k|dxin6%!vPEDgvT9H--ID zxeTFlJCiejZ||H>nnG@D_>u^Z&&@pA^2r@s!N8H=_K)WI@?2BWvDu2?f|wZf|2oJl zQ=qkyo$Xb$DN(5y4eC%G6c^keARhc6Cin;02+T^Y_1@IS?g4WH1jaDL7%a z|BGjH)>uBv%)WOb%mvTkbEf>WQyJcmFDH3N4(!p=@EqUca8f+6gWb2QBHEn#vD;-{ z&u+_t4zC|L1Spi`#Xr^tkNd(Ex^oZGe9bq=W=r;}QjWxNAIHDR0)+X6Dxq=Hk|zUQ z_dP&%%vVQEdKVzW=QG!XLb=m%Ku&_)#er|<0<#uVb}{>z-Ts?5qlxbNu$HL#AF)=X z+SM%kRH7(=&U0M~SA4buCV;PIWzb1Hp^R(2SfggRX#Uf%CZRkR~#uKion9Iew18ct1rx_U1MC00aSR6n+l8{MBk%L%(=QMK3V=Xw}zGB20+U zn(Uw4QH^j>L>P1QPfCpHL|FSEYyiHig01p)oTfJP-4b@gvHFS1%uAe_2~7 z`4kiMj_R=~w6v){vCo$l&M7U={yL^*^PlTz&_vdHY%KRnyYiF2>>HCv`rtF%9Ts6@VCV&f zWh8&M`b|)cevfm$O_iOZ?|9JoAF$)Y5)s^1T8OplIj)OhY%CKyQ=#c1*gQJ{xXA+o z;nQ8xl|}-;Y4V}tfql*e__@=apTb!Ble$}_-j$owkN>=?iNvZcoRktuOItSG!Nu7l$7 zR60I^J%1~sYZE@~X^T}i<7YH2_N5te_2{)av@%%O0>Ch=0OI2#W5q(>c08d=N$LQs zsbkRE3UD+Agqv@E`3~u>&>7kv60jcOFUf%3<;X;1Z0_r9@L^YTW#d29LlbcAvw5VN zZ2uGB*!!zH5;C_uSb&}g#RQ_W8{a@q|&_mJT=PtV+=`7$IZgVNap3$QtWYd$Nz8!1>fZKh?iY ze17&OhNt)wPz45~HncFu3Y@9zR<^Mn#&)1$2K!HU#t%X4<_KHR+v35g9TryUEGiJ9 zacq9**RbC)XOZXjM)Q_}-yT19HU8gaZ*9?vd>;!HjE9!hYBtUaw@Ws)wx8wno=EPW z0NnD%Tp1G}4bKaV#lY!7Z1!h)gq1+w()R=dhOYg~Y_@b7si_gcvWgnp*x*b+p?lwk z;u&#_5F_x(2N-cUzL?0|;!t;_Kf7o1oo$XeJK1T)8AVGaTH_bw3;)0*?KxRv1$I%u zNSPgCqbl=~a>nlmdwzlTnJQJX-<}=H_~3kV)8u*?>AL`;qd*`#%MjRC1xZWQ$px5^ z;unyT5}-dAo7^!ACZl~Ip^xwZ#pJ=<-XKoLB5}ocQ7`t%lI?y(0+&HEx9qp!fgmgQ zXwY(8A9JcQ*-p6dakZ5W{N3EOxCkR1S-HXLw5C^ z1Q#XLyzu~*0y+ZzS)u){-kkMDNeuJGAo=fd#~o?* zpU&_*s&rwgWZ}M^eS8~{dFPz$bbz{#l8nU5ql+!0K!uZ!v#v-=Ku+W<41WPV7FRn#*x5TznUwb=CqNtuC$L!}@-8f{GJYfob?6Wzo0bisX zKb$3v2Y9D8@pg&G)0-andT+C4X2wcmV{_Q52cLNnvpM_S0o#Ht`&vJMqdhG1f|{Z{k0w^ z^pr#Q-@(L=OjbHNdc-#6PT1L#^MLWL-Wr9_^f6A(4>R@ZQ8wgys|jmeU32Y(MLOPO z%NY9RO8Awaa8Z`pNef!JG}fM5jc{oG;seun*YrkrpbFQ znFI~N*8!)|>=;Pmq0G?dKjGm13J6UdGgNLf$y|2OyDl9NfKh$vGtlkYd?Z8zTTZE& zOAKC3WPxCU9aH!M2H8T8dPqtX8Kn+26f*ho(f`&o6-m}Z=kPZ{-i6Jq%db<}GK4g- zhngIv5C9WZA7OIf1u@93ycaH(c${+4miuDYF~)YQ(UOkV>8Uqg&-%D9uDb`8f_7M6sE~;8F zIZ*sxK@t(HLE6R6q|YHO!;D<%6)tp2YYle=3;}(;hbjG10Ad9rbw$|3Pvg&g571c7)xvRX#!s;3UNz9fS=Vre+rcn>Hym-ykzs0Ni-K{`kmAY~G} zNJ;sefK^uIUhs)O>{Q}u87y3y13BhO1(Pszt9PN^1=}y<8}%qV@xKr>7n(@YsuMD ze^<&sseGCDw)E|04@C)e+hO|U=~d4JICY^&avy3p$mPXOx_;QuAgQe-%IFAm3(J1v zq%m2}$__a>-}sezc)4*@l(IE?s<^L44%7@z9+LL{UJMl)2T~IEuuz?4LHdk<)*>)1fUF6(>!@E90z?5q6pL_%d zu&O~hh3n%%#SKckq<_7m?Psem_Ll{_7hWY&zV)15CPv9KhB0y|qsRtbc*aglp6pGs zw8<{f=t%=F4C09n zdh0yc{rt(J91+T&8-6)V$pa@%*8bU??<%Zz#)!+5-ChGWDR4@cs}x==3=ZO{S^+O_ zcib;GxQZPm*ek$6huxEJt;14erFAr+8UyhugAWic7sOOBPTBj*#k{R9mOhx3t;3AE zgN5R5g)G}|El)+AYKf1L&RqOC1Ec!LT5;qsVNs%ZFG%1m-?fj^MGTXE3x`^x%ktH6 z%by&@Oopt-ht6dW9IuN4BADQapG*KCTLZ&8#)3(KqGBR@tO0IllI4*dU|CH<-X@gT z6+LM4_FWY4l#4cD(9C9Ud|}Ey$qV@~=e5s-8PiGR}6?Gg5SMKP& zGt=AAlR&hWaxHYvQ7t%Sh+aR<05}qYB~}nu3s%2XjA#ew{p%>@@oN?3dG?+pZNl zxbn2m&=--Upa#6({*aGmgO}`*MHnIT$~roDChpA)VOQ^^*E<^0k?{NQ^OQuqqnTt0=%62}GRlKZP21(k zy+7Sgcq9@r`s3%!yF(dYC=X;CEI$JWHxYAH&mAwPfzx_KdL3Y#U_!EI=qo3uI~)->FuUFUt(!*YhT(9=LB7d>(I_0S>?Z?UK|7XGNLbygR$#(Fc z?866ttztKXUih@BgK3$5n38vHOE$|C(UKA8Q_e6LqxPvuHoF;YRs*IwPP6geHNJiw z0xOVBB@FW$V!Uvz^<|2#X=Wy8a+VDtDz3eWqhPe+VN4To3HiyBU}-q6gxs2x zvsD7w#)q(;m35nuP&*>%`(Q))DN}1V=vbbbov?2ZaIT6}dfLgyjB`JT!DcIlb(_*~ zWXXcL8z|h%Lkn8ozi3}r^MankIaX=deh=aqMkL%skPgZ{mmwjNrT@CNb8czb#klP* zPur!@NN~hhIyrJ6byult_N2CP@d^(GNbA)ks1N zw##8Rp2@j7N)Hy8bu?_rdB|Dp3De`oO@CKR+pPLTrvCDhhb*~lD$NNr)~SYsR$jD) zUtC-mIULsAR8v6DEdi*Y^P?|A`(WbGie?Lf^}e2$FA8dzUJM*`O1>H$B&gvp%}~UA57wH ztySyh6z2|}9)IpINm@^HO30_f=nfgt(k$D;tOM$(U;tTDE1RS&9eJco zzJeQIJ3Qbo3BDaDhdoy|%U;Yh^9r_cGueperERK)FbOg#fcNTYw0O zC*Kmy5$Qm(6Y_7Vrqyg##QjlKWF4XcOq>0fr!D{!&Djz50=8mUNR@s~Wxsn?4p;d$ z*38^@g{6z9#EBBxA^|7_V5_v>f#RU)?om6mOAL%oYx+LfxsyXfd@52i>9spGT~DSj zc`&>YV$;UL@h+P4w2H-?Oh#(>Or&a4hta8sl5U9c7$7U#miU|yf_s`M&!|1)GO87P zK;}&f8qrQm2E#AjB*QmBIf`M3jd~P>_FYen1(B{UJ?wSK@7G+JRGX>W1}Q4<7*Bu3 zhhpgz$PFl)h9a>dVd4k2F&iCGq;^r!pWT^UXgn0d{FQMmG38STJ>TVk!4TJLKoJO&=7aapY0zs>8Iuslz{5 zHe3=NEA_rNux@!jZzl)ovpjmcVBz*pF8WahEs(X|sRIfQfgWwu@{+UgZ;_mzjh_`O zJCRhV!}ao?SnS9@N8Y5pPVI@gm6;91ig_gLy;AP5+Dq#GD2lUh z+12<^UR2PL%vMayMWzs7Fgng?VAh&UNl&GZYDUZZRpvh(fS_7^ks+6VSzoFGO5a)t z)mpXCZ&_vn=5LKzA~5iWjABorL=d;JsXFogJtH~9hu4R|LT1+uoF)6!2j<<6S9Ue9 zpw@rVqZ8+KQ|AaZy5}FR{(hE`Qm%Hr*xXgLkl-{Q86Asro5a+O(`jH$G)G4w27<|u zgd7ieL-45P2_k4rg9;G)R!sWrx*edyE(QURGaX$n?x5}L^%5nI+liy^x;7U?Do>l+ zq!bTJ1&?_r4?X)5gU7&fkti?Ew9g9=;)L*AQDU;gEBgDhV3(Ew(>C3BQOG1>EO|eJ|g&#pV0L5)|k989$e(W1o{VjfdWeudp zBqb3J)0eSf=Oje|f1SA2xLErrJk6=SJ)x25t@7@9!-IqVvI1e@#gJ)ZA@8co+?=-7 z*PlbZj@Kb|4UnVhgk$5%*glUWnmWoBJ|BhXzQN(~#Y!oCN?7bjb#Z$oy16%zKfIv=n&I<=Cy$a=ykb|ENHwXVhvcI3AvF!m?jsbE~9P?Q#^mqMO$-gS zv3HR)&XUI)=RWS%AY5vT?2YJt*4srFzph6XosAL@x*TzJ?t45k;AwP{9^)9Z3zMlF3R5^;8 z-&@F?Ib=!>1SHz7MSf?x(_^KedSV;EV%7SPx_j;DSJvPk(`N{0OC!s<8-A1ZlJ(%U zw9$~%i-g|}J2~?%p)Xkg!}3aaoHR)2@d!=*#zJe;1{a?sG9`_dRfco(?Vx3|2mz$zFL+1(~RgI!sv`nwsBM+;p)Yzguv*TPe{6VYr ztss9Q=hSq)Z+C?U*Nm-1Bv&ZebpzLV?3TfQc|{qVd9_6-P`N09t+x2~bN|o|odb0&~~0pw9cV zfg;ZbNNC3B6(tfrH5-ktn&k88LQq8N)?XcA&bFE;?<3P_wTeG6d<6%7@YSY^6EDr` zWWCVPZ+H3sgf;fL5nbuIPXv%U5XstilI;7G8y&*avT?ue!V*r4yaq3tYA#M|HJ)@&1{9ZCzV- z|4%G-$h^8tBB5{a1>mXw*XY7xv^5GD{r;V1>H{9+qe`H>r#;b34V*IP9*;<7Th9< z=TbCNR8~46DtLMI-RShpiQ^?X0Kpc3Cj$K@o=3B%JV8=jRG<8)9ZpNBv}xN5XbK-Z zS_`~@#>TN-q@?3{N7*X)Z5Ff@dvs9~3Y4jUxL%})_;&CF$9LxWujR8)}F`r<(2 zE`p~o`q-bo6XMifN@N?)kxSxWH&=n~zbEF$;s~DcJ)wxMKuAmT79kva{^tua9nm5l z0I@n@?g%^;wRR{k&vygPuar{2ELxs*U>tE%RY!QE%uv!e#N>dh=m$KT4BBKN*`uI zc7pkfG*h-y^c2hZ!gwa>cs+eiGn7wAJ&NO8RIky|xiyEyllc$pRq9fbnY87xAgzSL zfJ2-rVPz$BQTem`!85XN9FbsApc~*l-HvVxbuNv1K5xjSyhKk=^1x%^9>PAoSvm&}q5rYfS;yz?Gp%76LN+wu zxAQH#=!W$yn>hf+l?i8Sk~`tvk;sz}c(egV|MXl-ZVI^=qSa-7jt=J4DU9-czBMYh ziHmG79;fYA>j4+WB(nnwBN-@ln<@{74{+co!Nw+>7$v-Ej}-aj&MCbSv8LBTSiat!qfo!R=)>dB?gJg-Tb@533YU2z;y%G*l9*s!Y#NIbGDmgN zbreDbqr>jZ)bXt34P<cbBif)YrihD|k@x3ql_fTA5h&Z=;S$HA+1pdde0?B!n~6Di5{m&> zQeX47eKm_6*gE&`uqoZEET4IsV zL6y4`Q4?VC=QwMtd)?|LHD`rlWj_4k*;hA-RoX#HT7M}HZqOtZ$fHz3NTIobI$zGC zwk2T0Wx78_Oo&bO=J|xz7$E_hb0cgHg9SX4)q;Fhr!kE+ETEAm%RsfB?-jw0Tqf~$ zG?a-fGGdZ9IE_{Ds0wIl7FK;=72O6(Pd57QV?0(>;!m*dHrti>jD5)K{OIT_UY9Hy zXAv#d+_;~alHn;F)^iCK1ZBAu{-H5Ldxb1R_!?? z^luKUAHsV5$x`xbE&%z6k2TLlT=GSgF+XBGX_KkCn}J10$46P@U*@N;u{`u>34bO*`I=h}<6QI0PhC~gJG~cp!vRS_%`p`x4 z0_uzpyU&9E;^nSkJ;W)C;hxEQey3GN6`yu?5EEPl53@=$NatNI%%e?b8^0gWui0A@ z@IHEHUqS2)MiLpQ5>0nUMfxHG$Q%1PzltJLR(dJbPyqf^`A5<3AKv$QEqCauemNHw zMIIFUEruNKRroMU?X5WbDRZ(u#oS4ObPrMO_PbDFz>F@wk>hYqqEdHScY2y7yMDDFS8-?GkX#VYoV;3f4L~%M2Z?Dzxo5fi;1~2mm%a@=&6^igA%ku1S%Rz zI-2BLZSof%l_>9?@`PRQ*enK*ju{Y9xYzjbw3Sg@uQU6lw((&%gMINmV8Gi%DgdzX zVeU><#P$xm2|EvAA@2te+*e+9=6Xo&bV{x6Y%DUnvy3g>bb%WL??3=GppvvuPhiS2 z5Ui#3iJpPRfkE95MBJh5l9T)ZIB28UODfsGwa@J7u?)S-Nvr{Gz}H^eS6A7Lkgf|k$BX!nI{W*u6Kbp9fNY7T5+-)zR23{ts{Uq!>*M2vk(_ed)FO{RF0jV_q*g+LZTBfG9n13;q})zhC+px+Cmw>3ql0Sl60yC!awI;UmXuRFuPz(%FALi zdtQoO&1tkKtn77t_eiEhZVNq)H!|Ci$-5(-?FlqMkiq_W!q9Ma024=%y08JtomT(P zN^jBwy0$b&AdE?Lxt}!HFU!fHw0b>o%p}T)gw7MM|0w5f-|f)AGk3`t4}`z0lc&M< z+&@rjX^NIPpX@DnD;I`^GR*m+_8ZQ$zBpyl4+?7BN?gY&-iV5gu)n}<$dFHR`x)v| zNXsZ80a)rcYUkNNw+8^LSd;Mnl0FAAtG|7FghFk6&0DO#ey{{-_|aYRCugc^#^&5vjn@a&V90BH3qYHA>mW2E3;_-E2jq-&9jk|;Pl5??D_jVc0* zg>SG7bbBHkW-azr2PTCCvkaZCA2K`LYHKnHARN#%2%MG_xM=`Y%6*;W;{71p6$U%? zx>LCJ{SD?`T(tb{)g3~OJ;h$FzO~se!}etE=1tyZ!S6|qmoEK!f#jo54)_8)=9htm zTx*#kgx~&Sy@3Lcz5m`!8L$KI`-4n+0Z6vm6-{XQ7++@h`0rTAWuL9{oFZ2d<9$`! zfH67D$0G|)xFu9We6C`j3fuD+M?ICH4gz*X)@z0SlXE-$M8c|ndsF^Ssr~ZBxt1q{ zFU&qZ@vXU#bJ_RPMI)r@Yw99SIR*xEOG`8cpwB;i8L4Z4+5<=QrCEu+`UypDp_iW_ zYrilRhJg?%eGcFzkB|hN+}Zny|Ltf5!p+A{rcd^(u2BrszKf;;-AX+d)T4%nc}3bN zBZp}zENEa4FTV#ZnMs)R#In_v`PCF*Dnr-%NOd7iT1Z7Yp~xgPBEP3{zK8$5-(17& z7AZQe!Gj3D2@UG(SI!cYy+O>n(*WvdN!U*Uf$)Hj4?n(0fy*JCWZ^${0FtuH?#+$bOtTeyYg#u-A;= zcOwTh%c#1rv9Xi?S<4Xk{u_v3wG+hC$ z@BEhdLXJc4P4rrk=S!S0`!MAa^Y@W$(mp8G*Fq1JWQp7i0VKvXWW0)f9Z8Ape{Yt3 zm|Erl@SVN5{n_kuU}r{WFQ{D-=OzJc-ZVl8i#krS{eGiB^t3^-LC6DF@>Yxk zc_K^@pES(w`|}=raDkwM^yS9S|IY>37J)^4)Ff7ed-|4g&x%3}koC_)idEsS^^#o< zo_+nOnk^q>mY+Z!!OWg1;$--*IJ3@J3bc$DEzIgf?Op`IF`6t5k1Ar(ACiZBzZSK@ zhM*tBeN(_Q&kk$9$`Jt*szegDhi49W=yU$*pPZ*5H9En;yqoBI6v0#s|E*g-T@bB@w3~pN8H#fFA#j|xqEp#7&txnI*^Am z#u7?QOa)1Zwan&Ji5ULE7tu`CQ|6w*DHOvY)cqx^f&7^zVToU^wTN+~u9d86MeQfq z{7erI8y_c|#n4OU{NHPmw~Z6uZ@ctT2#1DBk% z8wTY=)(IrlLe}Us>b%mx?a`!;h)-4ne*UMPr}0>};mOYHGx$}Fu3e0o4^DigK_yAL3PD%~>@19z5{~}-dRNKZs{zP_$ z_Y{dZu@b%CRAb~tW|h0YP8eEDH|oj)*-Yr&3-%j6qVn($KL!tR>Cd(4VCo$vrwE9w-ZOw z0fd1JK}RG?5Ns|}WN_{G1JFSrt8po*qtp>l<5$F~Rn*w$nO*#I@qXY3p<3|SI)@-A z>O*R3Y7?GJvSp=^r?*H|+}giu$Vck}__?y5aF&fmSwv$zk*0C<^T{y4$87{VZ8O7R zn@x(dI5liV<`YHVU5FFL{7NfM35MrUA%oiMT-_&yJiY7xe6Qs@tL?6mejd@FLqW?9 zkzf$YsyI?dOAK^4fsu^fy+Pi3_Dtj`S$40Mw*pE-g^ z=Ic7wm8ntW`HI2?^0N!h*O~WqK6^N{mw)9@eMA$R4S{RVGOkVyqC(r`mG!-T*)c^( zAk4{*9#h?5@rlIetM%s5>3WWk*|qhRbNc1nRHD_hc_-&XRga>@TPUU3L8XU> z=U>mDD!(>_$Ie(}eK&=UVg`P3Aqf&b|h#EG0E@tBlsU|kOgQAjCv zjU|8{#-6~Q3{v>4AfPXPlJVfci~%`H^YX^Z4Wi$EIxhXqRaQR#w!$C93y<&2e!D(5eP2L?wD^KSCp~Lqmi7I# z!}4dS)trMvg&&&*gK*s9=3kNfV~Xg5M42Hc&9?+ZB#b3J5;<-J9rm0TVc(5LyZcr9 z;*yxD?4J!Z>qq;miJSgGfEPctxd=!XMb*8X>crQn4uw`rn0T@$M=>;M;QNc5NZU(n zG6lc?Uspc3&x0V^q2R|TT-SAXq>c~pB4eOeFsQZf&)d|Vu6r)4_nNl?BvfSC894X~ z^Fc#;zv6tWBwS1#zejwJbZqo4hbJ%*>5EW!R=U8g&?sr}U2zIbF5*5N1LU<9+Tcy$b<6L?aS2P45PdzNyX^A{1-AVDWOrbK{+J49QqtVN?7HNNVpS7>zBi~ zgUyl56)llMQXm>G?{Y){+m$4pl@S`y5r($WA$wBYzESUeh3OX!KLSW4e8t+r71J6g z8%;)5G=pHAgZ`Muj-pAC4fZ zWe%h+A_7+OY*rUht;deSfImgP73l{00S}-04pUeU73v>J*|^xuHwRt$IqUl!PgBLN z6zOO1d@wChQ@9B*d}rF933GN_{H9`HrjDwsdlg4|z5T96xdl|Vr0|^v5pF6HuCPoaf5D7B|dwYM{dL|_$&nwI8`h|h>cCKmXPq_YO;&GZ6 zq4QB-ibK8W{rkU^pfCl+wBzuw-|Oea?Hk`)%DHle3bs0xm7Tp@3fw$@Z$A$C)DA*k z|8$7oipD-4qu6xgW8cRCsEz~#K`0^t1KWtC6&%6)L3mTGNA5zUxV*M2u}ogz!RwaL zVzoZMi~J1}#?k`CBs6a2T%Q#N`Wfm`Oj16yEe*1~slN<81pUY%Pd;AbTGBTFzmYBmNdq5wdusuEomVKC@C zB4Ni6!XGkRCu(mWcE0pN4vQvOVgN%mr#q9vw6|Y}Y!}l7D0N>C<08U0I^bVrH&Ng< z9G2qq@#gBIccupSE!2QTy&0IiW2JQVekr22#l@v?+$tIBCNL>KGPfZx$zVfuLE?$v z5|R9UbNQhLcTE4LARs~0-C8%m89dgr8fgz#!4xEbx8DIWo=H<$f4C$|^?CD|DHu|; znVqecFo*W+v{+ibgV)F5A}yZFL#0gH(eI4df=@#6hS~`gUK%`=!1UWus zt$VCZwq|1#GR^uGXjj=g@G7|E@ePy-c63!$o1Uk3cO1u;j=!taI%$4#` zJdQ6RL7$)g&L`2AAu={46!2HeYf}0;>`-*f6dVIpRgVn4(f)Qvf4?aB?bpC0CUgxH*>RNJ zz5)D;W+*oE*daboaatKlV*#sh4(vx`dNhzbpo(c|h`Jf)|f0@8yWD;lyKei zg78qSFgz3fpaCpeB7=#bu;tW4M$NFk9{m(=PZE3IwHyFmY?nx}K5pjMHdhJQs2} z0`_oyOG$>P!M!Km98kQ41%ZEJ>zmUvwwSwK{$ql(!)g6v#1JcvTjZ0SwNX}bW!>fM(SD+Z6H_$0K5v307~6Q}Q5=_xTmp{L_!?ZAN*^rOPB zkFO@8t(WPO8PC(#o!hh@Y*IfgpdVxa40>aag_4s11a{+o6AT%QcFM!`z{?tiv5~zS~g4~VURae zX@Eky8ZgEKYK6>cePyw4^e;SXS$;!K7(sR+LB2a&35SMxxMMWo=D3-Fa9G9^6j7+d zg~DwEle|y0$56FN9>39A@@pvTcrT5LrO7En? zIrlMEdEemeT?kdt0o!~t2gg}l@8kz-om|62ov`da(!^miKw+=@L(~|ZoZFm4ubKgg z!8zG+0*!CS??a1OIyOn=(Nd1z?HMwBRH;6}-`t+FL&UN5~aM4id_>PYDhQY zErl73U$i^?W?@d=u#-Rc9DXzLUe#|(WqmSCz*%>~$v3iVMjXOe#d)x@H|Lfx;&T&*JAtKwMd zZ6!IGY*Ch>-vW^;kmSH>^8L5J|-f=|1j zwc&40?{m?wTCo+8(-iJP7oV+2^9hEPjK~n)MI;z3B@Bc>A!$bLbr=Qz(2e%K``mO> z2`gdDtuU81&&@$pl&x0fnMOa_N3fYkrUZeWfWzpDV$hZAk(96@Fr?CXdV4&(tBj){ z>8V)w-0$#TkoI_TmrWBsqJ(1321wTDg2(SQF; zSV#F!==1Zd$<09J=W3c-=F-T>31ixS)8wGvNUdR<9GDcxQT{+D#0w8zN z22O$%5twvA_gqaf^x2MLKJ~E5yz!tdYt_a{duiRiw@}fr-J%=+1%LztXr&ht6*#|^lqok_)|g7Ov-je1i5pwG^9PdeppXaSS}+1L_W z3nT;z6?L;5tI)U(;^!C|IzKkbXZsBq%LVY{_?rT@>od;)#RrIBB0iO_!;@ulq=U_S zkebP_Oa=eH)woFN<(iwRx>rEFqlE<$aFM#t6x|*%US<1MJCI4Zk|~GjGQq(D20qhhk{5O3`A4 zf&zggfPwygG7(k@I@tX`>$nvNZ70x5#w8mD%LtknS_xd6*A8K?F1_Hf< zqkt8W<+^+8bJZ|ZGI1ppQ1(T)1OXH}jLZN>{E5N3%I6Ket1Y{@#1v z%l3=rF$f4Epn^AhcYzqP3`v5aLsVB^3GEByMV@QFa4#z4EBrcwhK${@VgX(ZCox{8 z2;9HUXk3zQw*&b`fMb93_p9Pt9Oa0X?j~h@k1(qX+@lYMahLBRz7k@i-%uVc zIkEgwLdonJ5h4=Xzw0B{&392OR3qvmiczx2Ji~n30>IJfM6eSayi5$uttcHUt3-}5x)zHCu$5-zqNj5>y zP4x%Cz=~2x!9y2;7|jQ-t~E6uH)uMUraqSL*ZJ{VsNb(6xF+G*baaFm3(#u0{w-g2 zGR(R14QfB_W@X{^pVoifNntF$vVC%p>qXGdmv{9Jo4V^=886X`U$3^F(bLmsq?G_8 z2YOGZb!2iB)kFC+MqETLJj2Vpk?ZMWU%U)a=!!EDV65(E;<`y22K2~? zBnlg?yQ8JuKW;Ogo_9^h`xnbxkEXj+Bz}Rw~c5B|19JK+q-h*=r;? ztgXg271xr2=dEf&k2wm*#+dak^Nb9iY7b0%;fH>_muHH!O2hAHwEiRQr#b&U!&NWm zroY8Sl%&XqGYyaLCE5nQ=z!ox*R6=L6P_Dy4U-@cOjp>(-#>~Dzq98oO`~Bdw;6N% zTA$T|xqWMrck{SVZrWhQr5!Owv;^vTNDW}h%fC4q(-_NJX+jXGI|71FUapS$#2%M#Vr`_c3ZlnHH^ z09*B-Eg*Z~l+aPd{h>&I3beio_V4ktvkJOfd!7EqTo9Qzcwd|5Lnd5JNd}+5^Uz_O zq(CSt0mSA?=Cps5JPQ@*pPKtVAue!cBQI4Jm2Xe}dS237TH#uxk0`+gk9)$?(+dh9 zH{=O6QSc|pQ z9#K)AI@oB2|J8Q64$@JyNJ%!1L6I-%HRovne&*W?ZVpJ7x6kG2pG8W*z%b8KQvM8g zbLi0nXIgiFvmk)j0=NAeu>v~TG2OC_)*(L!P)yl2|4eiYe)?LSxsn<_$VBW_bv|9Y z*Pdhkh>ZFTCndbOxXjZ|%Xx;1cGN+Kwy0Ahip~hEsZ0Pp!@XAevNE)DC3qAlxF*o^ zakgwIklXikNe2o2@PX%mO6OZ~fCbBO|Hz}8q_D39x8&#}0{90`&Qh>{ zoyk43+s;J*KTt^uJUn<*(EK6gIj7{;c&g1A$ym92F>JGF!(%=A#c97L0A;UUmq){C^aFg7zDe)(-V!({4sPDv`&Ly2{I@<;)BAI#6%Uz* znDmd$H?KLPm8eu9QzgxRkIH;Heix)JV^m@R1{()UzC+{q)Zpq~L+ObG@3{o6hj$;$ zv2odmMV}_n`7RKI;4jx%s6W5Q)%j5yg~qxq1)sf0;vs&mi9#Z4U}JM7!n&8|=S8?d zUtn3-G5LWe5#1Ij_UBI!!k~!LMq?;EV{#}~lx*OFm*A9F{Tmy2(l~)}B%Yx8;Q40}{R5>~=FIAaIr_EQZGNFjp$c-O}_8*%kM8A|LrxK!0lk8?Vn z>l~a0E#o;-tBImWqUv}k!OVRjxfUA(*0_xYj=pgQzVF92IERhfHQ^ca;2qC_rOw4t z3to1YgZ=i%`Zv|{1?m%oE?r~i{drFNuJzqRS_ zlAYsoiOH1iro6!|o8aShgV6029r~wQv6A<68PE;g7S+Z2`azkYlK4FkVqCKa4+Wi= zxu4qXrDf{`boCtcQ)2+hCWE7qXBBL+>FK_k`hyyE*VzuxWi$ffBM4=3BI%%|IAHO2 zodgT8;Fxyn>_HZi>3>M2{OCpxr`DdmD$qHsnkn~p>69&#&orWX6Io19RPx}lNQM+p z<-lIs(^K;9yw)$V@d**tbWKw7Y(phCiAkA|ixWglgWq$rwH548 zE+l}EMHcfSI-5rSBfb>cR2E}}T~%s^wKJBg!l8&oX(crJjlVdEQVXzRCVEWA^i(MMb+cEz_1b`!u!iAVTe&F>z{4 z7Yhf!jQnE^d}+B&n?Nb_nqjtem{IcDIpJkX3eW&7Uo!Z%7>_Fp2rMCUN*`k?&a$YJ zPtR8Jh7f0PKwY7NHfDJlo0JTDdA^oKtS_-iwENs`R$$z(x#hPAkP@I(cRpl6K|_#` z^o$9^_-pUnL~pQDGiI<@vl4IqZ=m!Eow~(~f}M6Z(PDCglyyByJ+~Gu{n#DZ=`tkS z(gp=NF}Zsg=wi$P?T^;4;-iETKIN(U8GS2LgUPUh;K3}78MO7cm<@j#b|cik$#EmI z>}tKjb3mnDVU2cDRYGl*R}uh%S^aA4eux*(nI`zk7IKp)dOmO-EAA_R@c(RBA26}W z(}(?uE8*N?+AWrXKq8GFu;U?c>uE`lxunFi?XmPKp7bgz_}{~YvG**m*;vs?oT@!4WqKGikIg!pvqhgIM5>EMbCM`7jy>HSd+=))HA*L zs1$X7uY@DOb>|CBCkrum9GV`ZJ?{w2&z1SRjNW;STUB`4?(m3IsW;Y@e|m6-Irtkr z=>0AEWF%xFqVWj;sta3GZXoZ3u_xV{`t~tRWrIK8!1hEJtl(M_)MjY_ z#6}4A=lU$_;wDHQ#J7H&;uoJdHC(we^U{NmbH^(1VIlPW3|*6 z5CaA{-4dvrPM1j%9{5Anzt)yT=A{BZuo&+{9y!CXu6R}=RCl`!qlKIw$RUEfe~c>p z>4P!3=ZAI<4g;M0>00%a-B*RL;CW5IFaB?&I zTQz*Os0oP~RTme#u)OA6{1sQGn*0V=p|+B$wy|$&vtm$CFF7PpEArLd=p>vtcBYG_ zUUF`!@HU!oaw6|ZEK+gy(dobZz?55V>U|*>uu5%lF*ipo6{Q(!zI{%fBaA_M>*?(b z#ykqgeYukY+IoH$iAFIMEeNov&Y~iqB)mj4ZMWUd5i9Ol2~>k{E`!Y1#+k;(q&%SV zhos1zBtQ`jqhWO!*zjl9Un>XmhH;Ufnk!>%>}Bl^^>rF6o>J>mnX295IPnP*4Ml>6 z$VWl)$Y37p&_o!b?H>jAOLm-jA%lztfm>fRVll7)7cI1z0a~-gERlj4Vryd*FO3tM zt4uDYzGE@4HQxV%D`CWIWyBpg;n!NvJ`z z!EGauzWxnN5i~O5#M_Y{P>}N>b;Q{nBCX4VH0PsfKRce2^pHt43_f@cl;h@&(Y`V$ zR6!ebX}sj`?=Y#n@vpYB#MsxZ)(lkt*sqqy=yuhUc=N;fx81}bJI6b!45fG_=%7$n zZ=+N3SVeOIGg42)AqA+-*xj&L!NGeWQ3Cuj(w}rs#Xjr4OKJGnWX&rsZ#|vFHknfR zZtmFLP-CL;WvY}8Ib8W}Xo={<;Zihcyo)BEY*^B-fK2L#6iO}fR;0_sumo3ukT$0p zqE3gRO{q1ELQ3Z6+=DnkKHf#UGiR`%6TG3e_L$e`akrKx49jWG?`s2z9iyuJxN4@2 z_^2p?OT6Tu7#}V`>@ZgRAX2@a2(QqrALFxHP=bPodNK-_GQVsOQ+5EbfgGM+=Tv&q zmEokiG}(RK=Q$^jo@-in-nzB(XS@}AKqj@=Q=giLV3*7uekVKiq5AP3CBB_?g}See zAJX|dwDUbf58O*x+Z6U8-nTmtk#VY(@I*z$rWa9&$J}S=k8abcB{ipRL%Qi|8VB?* zx_Oks^ivf;)_I;$?Y5~R32asQ2~5ixnse$NZKgZ(pQVLO*p=Uaoz)Vaaw$_re%^Wx zS?Ho^3MDBcd$u-)`xEB$`Quznmw1=ax;j0lq^z2Xi`}mpv;3)Mtk2BN z#r&bJZhL6jQ4&&_kT4y0_ToiplQPptIg+;&9efK9(}u(C!nzvYn`rLM=i>;}w6tVK zMC?I-hDrDLg$bHW>{jV1DJ_FTbZFhs-G!LY>e}qQ^4F`ZeXNK%V^He zoh88uQ0l4|(r^?gwa=`9&(^JX%8Qc#p^9SlY^a$c;LG|Hr+hp(H9`rIMKVcOTva)a ze6h`UZp)-(XDXw{`z_6THK^Z!08qo;cw6^wRwE zT`>1)zBi0o1<$|Y)zf=zR1)b`j{u1-KsodBIh5BP7xsjuk!1LAu=^&mmYSRL!^_zU za@oRhrTAnjcTYVG`k57F(~TD*AE|Y>-oNambH}i<&cEvGD!+s~3>G^tfU1ao{x zg6cH&iHzAy?1B8_B=NJkM;c>6XcS%T{rXpB?enVu$ru01*i5>%AIBE7k3QIB26&

&O07NEv#kYpU8`7A%YAl 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�|>j8CI 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

N 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 diff --git a/public/images/mystery-encounters/berry_juice.png b/public/images/items/berry_juice.png similarity index 100% rename from public/images/mystery-encounters/berry_juice.png rename to public/images/items/berry_juice.png diff --git a/public/images/mystery-encounters/berry_juice.json b/public/images/mystery-encounters/pokemon_salesman.json similarity index 57% rename from public/images/mystery-encounters/berry_juice.json rename to public/images/mystery-encounters/pokemon_salesman.json index 1a5331368ad..23d9df44f2b 100644 --- a/public/images/mystery-encounters/berry_juice.json +++ b/public/images/mystery-encounters/pokemon_salesman.json @@ -1,11 +1,11 @@ { "textures": [ { - "image": "berry_juice.png", + "image": "pokemon_salesman.png", "format": "RGBA8888", "size": { - "w": 24, - "h": 23 + "w": 40, + "h": 80 }, "scale": 1, "frames": [ @@ -14,20 +14,20 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 24, - "h": 24 + "w": 80, + "h": 80 }, "spriteSourceSize": { - "x": 1, + "x": 21, "y": 2, - "w": 22, - "h": 21 + "w": 38, + "h": 78 }, "frame": { "x": 1, "y": 1, - "w": 22, - "h": 21 + "w": 38, + "h": 78 } } ] @@ -36,6 +36,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:04685a0eb6ef9095824b65408ec1b38f:9891674d538df100fcddde29330c21ae:927f117bdb1c2a27226a5540ce00ee8b$" + "smartupdate": "$TexturePacker:SmartUpdate:dd57e3db21f3933c15be65bec261f4c1:05c7ef32252a5c2d3ad007b7e26fabd7:ae82f52e471ed81e2558206f05476cd7$" } } diff --git a/public/images/mystery-encounters/pokemon_salesman.png b/public/images/mystery-encounters/pokemon_salesman.png new file mode 100644 index 0000000000000000000000000000000000000000..1251dd8eda7086d43ee2194fc7958a0ac6dab319 GIT binary patch literal 839 zcmV-N1GxN&P)+$qz5oCJQACse00001 zbW%=J06^y0W&i*H32;bRa{vGf6951U69E94oEQKA0}7o*#248`PljH%Yg)0mj5iBt4I6I2FD8=Jhu=zWR;4pCibn*bCNKz;+#h{RAyT73fV z1Pm}D8%P0HFCeTKU>||hBvA%IhGLa|+zER@i?3W)=e>>(#y%g*CDf}(dQh+r(gqc* zjs~vKK4)bP~zkx9)Q)xbG&ZzTF7ar_!=%-_yx=1@W3P zNM}b*%uTX@*B~`zkXd2}fkaBSBxpO&1;l>ep@;>&fPJe`Gg#xE+-mDJ00Ajs1w~FidOH9m8f=QYGnkMD zohC$4gwkeHP$6uBbbzua+!b~7ZE?ZLzkqQl>j0f+v8c|XYHL-?=So7WP1N-%wJ%_x zF$l-SV%EFmJ1FDI#5e-aoa&W*a6sz1T|v9+z|y#9kg~pc?vk}}KcIxzfeX|I52u`& zN#8qN%`bu#WbPLyoI&Ydxf{AB9Z;-Eho8VuMu)(UK{62ZKt&IrIkZ>7M{(pDYNkce zj%QCG6~!X>48n4Nve3^UHV}RV7Z|Jzv>|M#xpHgP^*EkDqVbCu=nB&KWLA2|8s_uH zgXt;r0OiYTc3PkkRs{iGuh*C)ORvVS*lXfkU4KMOQNE7A+mpV2-=F-G{Q+J5C&Ju? RiOB!}002ovPDHLkV1mU^bp`+c literal 0 HcmV?d00001 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 2d142f46d4e..ca181b8d67c 100644 --- a/src/data/mystery-encounters/encounters/fight-or-flight-encounter.ts +++ b/src/data/mystery-encounters/encounters/fight-or-flight-encounter.ts @@ -87,6 +87,7 @@ export const FightOrFlightEncounter: IMysteryEncounter = y: -5, scale: 0.75, isItem: true, + disableAnimation: true }, { spriteKey: bossSpriteKey, diff --git a/src/data/mystery-encounters/encounters/pokemon-salesman-encounter.ts b/src/data/mystery-encounters/encounters/pokemon-salesman-encounter.ts new file mode 100644 index 00000000000..f572f6cf76b --- /dev/null +++ b/src/data/mystery-encounters/encounters/pokemon-salesman-encounter.ts @@ -0,0 +1,291 @@ +import { generateModifierTypeOption, leaveEncounterWithoutBattle, selectPokemonForOption, setEncounterExp, updatePlayerMoney, } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { StatusEffect } from "#app/data/status-effect"; +import Pokemon, { PlayerPokemon } from "#app/field/pokemon"; +import { modifierTypes } from "#app/modifier/modifier-type"; +import { isNullOrUndefined, randSeedInt } from "#app/utils"; +import { MysteryEncounterType } from "#enums/mystery-encounter-type"; +import BattleScene from "../../../battle-scene"; +import IMysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier, } from "../mystery-encounter"; +import { EncounterOptionMode, MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; +import { MoneyRequirement } from "../mystery-encounter-requirements"; +import { getEncounterText, queueEncounterMessage } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; +import { applyDamageToPokemon, getRandomSpeciesByStarterTier } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; +import { getPokemonSpecies, speciesStarters } from "#app/data/pokemon-species"; +import { Species } from "#enums/species"; + +/** the i18n namespace for this encounter */ +const namespace = "mysteryEncounter:pokemonSalesman"; + +/** + * Pokemon Salesman encounter. + * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/36 | GitHub Issue #36} + * @see For biome requirements check {@linkcode mysteryEncountersByBiome} + */ +export const PokemonSalesmanEncounter: IMysteryEncounter = + MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.POKEMON_SALESMAN) + .withEncounterTier(MysteryEncounterTier.ULTRA) + .withSceneWaveRangeRequirement(10, 180) + .withSceneRequirement(new MoneyRequirement(null, 8)) // Some costs may not be as significant, this is the max you'd pay + .withIntroSpriteConfigs([ + { + spriteKey: "pokemon_salesman", + fileRoot: "mystery-encounters", + hasShadow: true + } + ]) + .withIntroDialogue([ + { + text: `${namespace}:intro`, + }, + { + text: `${namespace}:intro_dialogue`, + speaker: `${namespace}:speaker`, + }, + ]) + .withTitle(`${namespace}:title`) + .withDescription(`${namespace}:description`) + .withQuery(`${namespace}:query`) + .withOnInit((scene: BattleScene) => { + const encounter = scene.currentBattle.mysteryEncounter; + + let species = getPokemonSpecies(getRandomSpeciesByStarterTier([0, 5])); + const tries = 0; + + // Reroll any species that don't have HAs + while (isNullOrUndefined(species.abilityHidden) && tries < 5) { + species = getPokemonSpecies(getRandomSpeciesByStarterTier([0, 5])); + } + + + let pokemon; + if (isNullOrUndefined(species.abilityHidden) || randSeedInt(100) === 0) { + // If no HA mon found or you roll 1%, give shiny Magikarp + species = getPokemonSpecies(Species.MAGIKARP); + const hiddenIndex = species.ability2 ? 2 : 1; + pokemon = scene.addPlayerPokemon(species, 5, hiddenIndex, species.formIndex, null, true); + } else { + const hiddenIndex = species.ability2 ? 2 : 1; + pokemon = scene.addPlayerPokemon(species, 5, hiddenIndex, species.formIndex); + } + + const starterTier = speciesStarters[species.speciesId]; + // Prices by starter tier: 8/6.4/4.8/4/4 + let priceMultiplier = 8 * (Math.max(starterTier, 2.5) / 5); + if (pokemon.shiny) { + // Always max price for shiny, and add special message to intro + priceMultiplier = 8; + encounter.setDialogueToken("specialShinyText", `$t(${namespace}:shiny)`); + } else { + encounter.setDialogueToken("specialShinyText", ""); + } + encounter.setDialogueToken("purchasePokemon", pokemon.name); + encounter.setDialogueToken("price", pokemon.name); + encounter.misc = { + money: scene.getWaveMoneyAmount(priceMultiplier), + pokemon: pokemon, + // shiny: pokemon.shiny + }; + + pokemon.calculateStats(); + + return true; + }) + .withSimpleOption({ + buttonLabel: `${namespace}:option:1:label`, + buttonTooltip: `${namespace}:option:1:tooltip`, + selected: [ + { + text: `${namespace}:option:selected`, + }, + ], + }, + async (scene: BattleScene) => { + // Choose Cheap Option + const encounter = scene.currentBattle.mysteryEncounter; + const cost = encounter.misc.money; + // const purchasedPokemon = encounter.misc.pokemon; + + // Update money + updatePlayerMoney(scene, -cost); + + leaveEncounterWithoutBattle(scene); + }) + .withOption( + new MysteryEncounterOptionBuilder() + .withOptionMode(EncounterOptionMode.DEFAULT) + .withSceneMoneyRequirement(0, 2) // Wave scaling money multiplier of 2 + .withDialogue({ + buttonLabel: `${namespace}:option:1:label`, + buttonTooltip: `${namespace}:option:1:tooltip`, + selected: [ + { + text: `${namespace}:option:selected`, + }, + ], + }) + .withPreOptionPhase(async (scene: BattleScene): Promise => { + const encounter = scene.currentBattle.mysteryEncounter; + const onPokemonSelected = (pokemon: PlayerPokemon) => { + // Update money + updatePlayerMoney(scene, -(encounter.options[0].requirements[0] as MoneyRequirement).requiredMoney); + // Calculate modifiers and dialogue tokens + const modifiers = [ + generateModifierTypeOption(scene, modifierTypes.BASE_STAT_BOOSTER).type, + generateModifierTypeOption(scene, modifierTypes.BASE_STAT_BOOSTER).type, + ]; + encounter.setDialogueToken("boost1", modifiers[0].name); + encounter.setDialogueToken("boost2", modifiers[1].name); + encounter.misc = { + chosenPokemon: pokemon, + modifiers: modifiers, + }; + }; + + // Only Pokemon that can gain benefits are above 1/3rd HP with no status + const selectableFilter = (pokemon: Pokemon) => { + // If pokemon meets primary pokemon reqs, it can be selected + const meetsReqs = encounter.pokemonMeetsPrimaryRequirements(scene, pokemon); + if (!meetsReqs) { + return getEncounterText(scene, `${namespace}:invalid_selection`); + } + + return null; + }; + + return selectPokemonForOption(scene, onPokemonSelected, null, selectableFilter); + }) + .withOptionPhase(async (scene: BattleScene) => { + // Choose Cheap Option + const encounter = scene.currentBattle.mysteryEncounter; + const chosenPokemon = encounter.misc.chosenPokemon; + const modifiers = encounter.misc.modifiers; + + for (const modType of modifiers) { + const modifier = modType.newModifier(chosenPokemon); + await scene.addModifier(modifier, true, false, false, true); + } + scene.updateModifiers(true); + + leaveEncounterWithoutBattle(scene); + }) + .withPostOptionPhase(async (scene: BattleScene) => { + // Damage and status applied after dealer leaves (to make thematic sense) + const encounter = scene.currentBattle.mysteryEncounter; + const chosenPokemon = encounter.misc.chosenPokemon; + + // Pokemon takes 1/3 max HP damage + applyDamageToPokemon(scene, chosenPokemon, Math.floor(chosenPokemon.getMaxHp() / 3)); + + // Roll for poison (80%) + if (randSeedInt(10) < 8) { + if (chosenPokemon.trySetStatus(StatusEffect.TOXIC)) { + // Toxic applied + queueEncounterMessage(scene, `${namespace}:bad_poison`); + } else { + // Pokemon immune or something else prevents status + queueEncounterMessage(scene, `${namespace}:damage_only`); + } + } else { + queueEncounterMessage(scene, `${namespace}:damage_only`); + } + + setEncounterExp(scene, [chosenPokemon.id], 100); + + chosenPokemon.updateInfo(); + }) + .build() + ) + .withOption( + new MysteryEncounterOptionBuilder() + .withOptionMode(EncounterOptionMode.DISABLED_OR_DEFAULT) + .withSceneMoneyRequirement(0, 5) // Wave scaling money multiplier of 5 + .withDialogue({ + buttonLabel: `${namespace}:option:2:label`, + buttonTooltip: `${namespace}:option:2:tooltip`, + selected: [ + { + text: `${namespace}:option:selected`, + }, + ], + }) + .withPreOptionPhase(async (scene: BattleScene): Promise => { + const encounter = scene.currentBattle.mysteryEncounter; + const onPokemonSelected = (pokemon: PlayerPokemon) => { + // Update money + updatePlayerMoney(scene, -(encounter.options[1].requirements[0] as MoneyRequirement).requiredMoney); + // Calculate modifiers and dialogue tokens + const modifiers = [ + generateModifierTypeOption(scene, modifierTypes.BASE_STAT_BOOSTER).type, + generateModifierTypeOption(scene, modifierTypes.BASE_STAT_BOOSTER).type, + ]; + encounter.setDialogueToken("boost1", modifiers[0].name); + encounter.setDialogueToken("boost2", modifiers[1].name); + encounter.misc = { + chosenPokemon: pokemon, + modifiers: modifiers, + }; + }; + + // Only Pokemon that can gain benefits are above 1/3rd HP with no status + const selectableFilter = (pokemon: Pokemon) => { + // If pokemon meets primary pokemon reqs, it can be selected + const meetsReqs = encounter.pokemonMeetsPrimaryRequirements(scene, pokemon); + if (!meetsReqs) { + return getEncounterText(scene, `${namespace}:invalid_selection`); + } + + return null; + }; + + return selectPokemonForOption(scene, onPokemonSelected, null, selectableFilter); + }) + .withOptionPhase(async (scene: BattleScene) => { + // Choose Expensive Option + const encounter = scene.currentBattle.mysteryEncounter; + const chosenPokemon = encounter.misc.chosenPokemon; + const modifiers = encounter.misc.modifiers; + + for (const modType of modifiers) { + const modifier = modType.newModifier(chosenPokemon); + await scene.addModifier(modifier, true, false, false, true); + } + scene.updateModifiers(true); + + leaveEncounterWithoutBattle(scene); + }) + .withPostOptionPhase(async (scene: BattleScene) => { + // Status applied after dealer leaves (to make thematic sense) + const encounter = scene.currentBattle.mysteryEncounter; + const chosenPokemon = encounter.misc.chosenPokemon; + + // Roll for poison (20%) + if (randSeedInt(10) < 2) { + if (chosenPokemon.trySetStatus(StatusEffect.POISON)) { + // Poison applied + queueEncounterMessage(scene, `${namespace}:poison`); + } else { + // Pokemon immune or something else prevents status + queueEncounterMessage(scene, `${namespace}:no_bad_effects`); + } + } else { + queueEncounterMessage(scene, `${namespace}:no_bad_effects`); + } + + setEncounterExp(scene, [chosenPokemon.id], 100); + + chosenPokemon.updateInfo(); + }) + .build() + ) + .withSimpleOption( + { + buttonLabel: `${namespace}:option:3:label`, + buttonTooltip: `${namespace}:option:3:tooltip`, + }, + async (scene: BattleScene) => { + // Leave encounter with no rewards or exp + leaveEncounterWithoutBattle(scene, true); + return true; + } + ) + .build(); 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 b199b43e952..7f0521b8263 100644 --- a/src/data/mystery-encounters/encounters/the-strong-stuff-encounter.ts +++ b/src/data/mystery-encounters/encounters/the-strong-stuff-encounter.ts @@ -19,6 +19,11 @@ import { BerryType } from "#enums/berry-type"; /** the i18n namespace for the encounter */ const namespace = "mysteryEncounter:theStrongStuff"; +/** + * Pokemon Salesman encounter. + * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/54 | GitHub Issue #54} + * @see For biome requirements check {@linkcode mysteryEncountersByBiome} + */ export const TheStrongStuffEncounter: IMysteryEncounter = MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.THE_STRONG_STUFF) .withEncounterTier(MysteryEncounterTier.COMMON) @@ -28,12 +33,13 @@ export const TheStrongStuffEncounter: IMysteryEncounter = .withIntroSpriteConfigs([ { spriteKey: "berry_juice", - fileRoot: "mystery-encounters", + fileRoot: "items", hasShadow: true, + isItem: true, scale: 1.5, x: -15, y: 3, - yShadow: 0 + disableAnimation: true }, { spriteKey: Species.SHUCKLE.toString(), diff --git a/src/data/mystery-encounters/mystery-encounters.ts b/src/data/mystery-encounters/mystery-encounters.ts index 7679ab20d58..fb2bc9a2ad8 100644 --- a/src/data/mystery-encounters/mystery-encounters.ts +++ b/src/data/mystery-encounters/mystery-encounters.ts @@ -14,6 +14,7 @@ import IMysteryEncounter from "./mystery-encounter"; import { SafariZoneEncounter } from "#app/data/mystery-encounters/encounters/safari-zone-encounter"; import { FieryFalloutEncounter } from "#app/data/mystery-encounters/encounters/fiery-fallout-encounter"; import { TheStrongStuffEncounter } from "#app/data/mystery-encounters/encounters/the-strong-stuff-encounter"; +import { PokemonSalesmanEncounter } from "#app/data/mystery-encounters/encounters/pokemon-salesman-encounter"; // Spawn chance: (BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT + WIGHT_INCREMENT_ON_SPAWN_MISS * ) / 256 export const BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT = 1; @@ -132,14 +133,14 @@ const nonExtremeBiomeEncounters: MysteryEncounterType[] = [ const humanTransitableBiomeEncounters: MysteryEncounterType[] = [ MysteryEncounterType.MYSTERIOUS_CHALLENGERS, - MysteryEncounterType.SHADY_VITAMIN_DEALER + MysteryEncounterType.SHADY_VITAMIN_DEALER, + MysteryEncounterType.POKEMON_SALESMAN ]; const civilizationBiomeEncounters: MysteryEncounterType[] = [ MysteryEncounterType.DEPARTMENT_STORE_SALE ]; - /** * To add an encounter to every biome possible, use this array */ @@ -225,6 +226,7 @@ export function initMysteryEncounters() { allMysteryEncounters[MysteryEncounterType.LOST_AT_SEA] = LostAtSeaEncounter; allMysteryEncounters[MysteryEncounterType.FIERY_FALLOUT] = FieryFalloutEncounter; allMysteryEncounters[MysteryEncounterType.THE_STRONG_STUFF] = TheStrongStuffEncounter; + allMysteryEncounters[MysteryEncounterType.POKEMON_SALESMAN] = PokemonSalesmanEncounter; // Add extreme encounters to biome map extremeBiomeEncounters.forEach(encounter => { diff --git a/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts b/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts index 2dbbe9f55a1..3510fe37e09 100644 --- a/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts @@ -17,6 +17,7 @@ import { Type } from "#app/data/type"; import PokemonSpecies, { getPokemonSpecies, speciesStarters } from "#app/data/pokemon-species"; import { queueEncounterMessage, showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; import { getPokemonNameWithAffix } from "#app/messages"; +import { modifierTypes } from "#app/modifier/modifier-type"; export interface MysteryEncounterPokemonData { spriteScale?: number @@ -204,13 +205,11 @@ export function applyHealToPokemon(scene: BattleScene, pokemon: PlayerPokemon, h * @param pokemon * @param value */ -export function modifyPlayerPokemonBST(pokemon: PlayerPokemon, value: number) { - pokemon.getSpeciesForm().baseStats = [...pokemon.getSpeciesForm().baseStats].map(v => { - const newVal = Math.floor(v + value); - return Math.max(newVal, 1); - }); +export async function modifyPlayerPokemonBST(pokemon: PlayerPokemon, value: number) { + const modType = modifierTypes.MYSTERY_ENCOUNTER_SHUCKLE_JUICE().generateType(null, [value]); + const modifier = modType.newModifier(pokemon); + await pokemon.scene.addModifier(modifier, false, false, false, true); pokemon.calculateStats(); - pokemon.updateInfo(); } /** @@ -387,7 +386,7 @@ function failCatch(scene: BattleScene, pokemon: EnemyPokemon, originalY: number, }); } -function catchPokemon(scene: BattleScene, pokemon: EnemyPokemon, pokeball: Phaser.GameObjects.Sprite, pokeballType: PokeballType): Promise { +export async function catchPokemon(scene: BattleScene, pokemon: EnemyPokemon, pokeball: Phaser.GameObjects.Sprite, pokeballType: PokeballType): Promise { scene.unshiftPhase(new VictoryPhase(scene, BattlerIndex.ENEMY)); const speciesForm = !pokemon.fusionSpecies ? pokemon.getSpeciesForm() : pokemon.getFusionSpeciesForm(); diff --git a/src/enums/mystery-encounter-type.ts b/src/enums/mystery-encounter-type.ts index d4d0b479f9c..f13f246bac0 100644 --- a/src/enums/mystery-encounter-type.ts +++ b/src/enums/mystery-encounter-type.ts @@ -11,5 +11,6 @@ export enum MysteryEncounterType { SAFARI_ZONE, LOST_AT_SEA, //might be generalized later on FIERY_FALLOUT, - THE_STRONG_STUFF + THE_STRONG_STUFF, + POKEMON_SALESMAN } diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 8b2e65e4abb..a234719bf69 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -10,7 +10,7 @@ import * as Utils from "../utils"; import { Type, TypeDamageMultiplier, getTypeDamageMultiplier, getTypeRgb } from "../data/type"; import { getLevelTotalExp } from "../data/exp"; import { Stat } from "../data/pokemon-stat"; -import { AttackTypeBoosterModifier, DamageMoneyRewardModifier, EnemyDamageBoosterModifier, EnemyDamageReducerModifier, EnemyEndureChanceModifier, EnemyFusionChanceModifier, HiddenAbilityRateBoosterModifier, PokemonBaseStatModifier, PokemonFriendshipBoosterModifier, PokemonHeldItemModifier, PokemonMultiHitModifier, PokemonNatureWeightModifier, ShinyRateBoosterModifier, SurviveDamageModifier, TempBattleStatBoosterModifier, StatBoosterModifier, TerastallizeModifier } from "../modifier/modifier"; +import { AttackTypeBoosterModifier, DamageMoneyRewardModifier, EnemyDamageBoosterModifier, EnemyDamageReducerModifier, EnemyEndureChanceModifier, EnemyFusionChanceModifier, HiddenAbilityRateBoosterModifier, PokemonBaseStatModifier, PokemonFriendshipBoosterModifier, PokemonHeldItemModifier, PokemonMultiHitModifier, PokemonNatureWeightModifier, ShinyRateBoosterModifier, SurviveDamageModifier, TempBattleStatBoosterModifier, StatBoosterModifier, TerastallizeModifier, PokemonBaseStatTotalModifier } from "../modifier/modifier"; import { PokeballType } from "../data/pokeball"; import { Gender } from "../data/gender"; import { initMoveAnim, loadMoveAnimAssets } from "../data/battle-anims"; @@ -731,6 +731,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.stats = [ 0, 0, 0, 0, 0, 0 ]; } const baseStats = this.getSpeciesForm().baseStats.slice(0); + this.scene.applyModifiers(PokemonBaseStatTotalModifier, this.isPlayer(), this, baseStats); if (this.fusionSpecies) { const fusionBaseStats = this.getFusionSpeciesForm().baseStats; for (let s = 0; s < this.stats.length; s++) { diff --git a/src/locales/en/modifier-type.ts b/src/locales/en/modifier-type.ts index 7bbf89388c4..7f8ca139e77 100644 --- a/src/locales/en/modifier-type.ts +++ b/src/locales/en/modifier-type.ts @@ -66,6 +66,16 @@ export const modifierType: ModifierTypeTranslationEntries = { "PokemonBaseStatBoosterModifierType": { description: "Increases the holder's base {{statName}} by 10%. The higher your IVs, the higher the stack limit.", }, + "PokemonBaseStatTotalModifierType": { + name: "Shuckle Juice", + description: "{{increaseDecrease}} all of the holder's base stats by {{statValue}}. You were {{blessCurse}} by the Shuckle.", + extra: { + "increase": "Increases", + "decrease": "Decreases", + "blessed": "blessed", + "cursed": "cursed" + }, + }, "AllPokemonFullHpRestoreModifierType": { description: "Restores 100% HP for all Pokémon.", }, @@ -240,6 +250,8 @@ export const modifierType: ModifierTypeTranslationEntries = { "ENEMY_STATUS_EFFECT_HEAL_CHANCE": { name: "Full Heal Token", description: "Adds a 2.5% chance every turn to heal a status condition." }, "ENEMY_ENDURE_CHANCE": { name: "Endure Token" }, "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" }, }, 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 891d6dc299b..a280ae1cc39 100644 --- a/src/locales/en/mystery-encounter.ts +++ b/src/locales/en/mystery-encounter.ts @@ -11,6 +11,7 @@ import { shadyVitaminDealerDialogue } from "#app/locales/en/mystery-encounters/s import { slumberingSnorlaxDialogue } from "#app/locales/en/mystery-encounters/slumbering-snorlax-dialogue"; import { trainingSessionDialogue } from "#app/locales/en/mystery-encounters/training-session-dialogue"; import { theStrongStuffDialogue } from "#app/locales/en/mystery-encounters/the-strong-stuff-dialogue"; +import { pokemonSalesmanDialogue } from "#app/locales/en/mystery-encounters/pokemon-salesman-dialogue"; /** * Patterns that can be used: @@ -46,4 +47,5 @@ export const mysteryEncounter = { lostAtSea: lostAtSeaDialogue, fieryFallout: fieryFalloutDialogue, theStrongStuff: theStrongStuffDialogue, + pokemonSalesman: pokemonSalesmanDialogue } as const; diff --git a/src/locales/en/mystery-encounters/pokemon-salesman-dialogue.ts b/src/locales/en/mystery-encounters/pokemon-salesman-dialogue.ts new file mode 100644 index 00000000000..7645f96d696 --- /dev/null +++ b/src/locales/en/mystery-encounters/pokemon-salesman-dialogue.ts @@ -0,0 +1,25 @@ +export const pokemonSalesmanDialogue = { + intro: "A chipper elderly man approaches you.", + speaker: "Gentleman", + intro_dialogue: "Hello there! Have I got a deal just for YOU!{{specialShinyText}}", + title: "The Pokémon Salesman", + description: "\"This {{purchasePokemon}} is extremely unique, and carries an ability not normally found on its species! I'll let you have this swell {{purchasePokemon}} for just {{money, money}}!\"\n\n\"What do you say?\"", + query: "What will you do?", + shiny: "$I have SUPER amazing Pokémon that\nanyone would be dying to get!", + option: { + 1: { + label: "Accept", + tooltip: "(-) Pay {{money, money}}\n(+) Gain a {{purchasePokemon}} with its Hidden Ability (also saved in Pokédex data)", + selected_dialogue: `Excellent choice! + $I can see you've a keen eye for business.`, + selected_message: "You paid an outrageous sum and bought the {{purchasePokemon}}.", + selected_dialogue_2: "Oh, yeah...@d{64} Returns not accepted, got that?" + }, + 2: { + label: "Refuse", + tooltip: "(-) No Rewards", + selected: `No?@d{32} You say no? + $I'm only doing this as a favor to you!`, + }, + }, +}; diff --git a/src/modifier/modifier-type.ts b/src/modifier/modifier-type.ts index 250b2953fdf..ae5b1ba0ee8 100644 --- a/src/modifier/modifier-type.ts +++ b/src/modifier/modifier-type.ts @@ -621,6 +621,27 @@ export class PokemonBaseStatBoosterModifierType extends PokemonHeldItemModifierT } } +export class PokemonBaseStatTotalModifierType extends PokemonHeldItemModifierType implements GeneratedPersistentModifierType { + private readonly statModifier: integer; + + constructor(statModifier: integer) { + super("modifierType:ModifierType.MYSTERY_ENCOUNTER_SHUCKLE_JUICE", "berry_juice", (_type, args) => new Modifiers.PokemonBaseStatTotalModifier(this, (args[0] as Pokemon).id, this.statModifier)); + this.statModifier = statModifier; + } + + getDescription(scene: BattleScene): string { + return i18next.t("modifierType:ModifierType.PokemonBaseStatTotalModifierType.description", { + increaseDecrease: i18next.t(this.statModifier >= 0 ? "modifierType:ModifierType.PokemonBaseStatTotalModifierType.extra.increase" : "modifierType:ModifierType.PokemonBaseStatTotalModifierType.extra.decrease"), + blessCurse: i18next.t(this.statModifier >= 0 ? "modifierType:ModifierType.PokemonBaseStatTotalModifierType.extra.blessed" : "modifierType:ModifierType.PokemonBaseStatTotalModifierType.extra.cursed"), + statValue: this.statModifier, + }); + } + + getPregenArgs(): any[] { + return [ this.statModifier ]; + } +} + class AllPokemonFullHpRestoreModifierType extends ModifierType { private descriptionKey: string; @@ -1354,6 +1375,13 @@ export const modifierTypes = { ENEMY_STATUS_EFFECT_HEAL_CHANCE: () => new ModifierType("modifierType:ModifierType.ENEMY_STATUS_EFFECT_HEAL_CHANCE", "wl_full_heal", (type, _args) => new Modifiers.EnemyStatusEffectHealChanceModifier(type, 2.5, 10)), ENEMY_ENDURE_CHANCE: () => new EnemyEndureChanceModifierType("modifierType:ModifierType.ENEMY_ENDURE_CHANCE", "wl_reset_urge", 2), ENEMY_FUSED_CHANCE: () => new ModifierType("modifierType:ModifierType.ENEMY_FUSED_CHANCE", "wl_custom_spliced", (type, _args) => new Modifiers.EnemyFusionChanceModifier(type, 1)), + + MYSTERY_ENCOUNTER_SHUCKLE_JUICE: () => new ModifierTypeGenerator((party: Pokemon[], pregenArgs?: any[]) => { + if (pregenArgs) { + return new PokemonBaseStatTotalModifierType(pregenArgs[0] as integer); + } + return new PokemonBaseStatTotalModifierType(Utils.randSeedInt(20)); + }), }; interface ModifierPool { diff --git a/src/modifier/modifier.ts b/src/modifier/modifier.ts index 6f098ade124..72aaf6cbb41 100644 --- a/src/modifier/modifier.ts +++ b/src/modifier/modifier.ts @@ -708,6 +708,55 @@ export class PokemonBaseStatModifier extends PokemonHeldItemModifier { } } +export class PokemonBaseStatTotalModifier extends PokemonHeldItemModifier { + private statModifier: integer; + + constructor(type: ModifierTypes.PokemonBaseStatTotalModifierType, pokemonId: integer, statModifier: integer, stackCount?: integer) { + super(type, pokemonId, stackCount); + this.statModifier = statModifier; + } + + matchType(modifier: Modifier): boolean { + if (modifier instanceof PokemonBaseStatTotalModifier) { + return (modifier as PokemonBaseStatTotalModifier).statModifier === this.statModifier; + } + return false; + } + + clone(): PersistentModifier { + return new PokemonBaseStatTotalModifier(this.type as ModifierTypes.PokemonBaseStatTotalModifierType, this.pokemonId, this.statModifier, this.stackCount); + } + + getArgs(): any[] { + return super.getArgs().concat(this.statModifier); + } + + shouldApply(args: any[]): boolean { + return super.shouldApply(args) && args.length === 2 && args[1] instanceof Array; + } + + apply(args: any[]): boolean { + args[1].forEach((v, i) => { + const newVal = Math.floor(v + this.statModifier); + args[1][i] = Math.min(Math.max(newVal, 1), 999999); + }); + + return true; + } + + getTransferrable(_withinParty: boolean): boolean { + return false; + } + + getScoreMultiplier(): number { + return 1.2; + } + + getMaxHeldItemCount(pokemon: Pokemon): integer { + return 2; + } +} + /** * Modifier used for held items that apply {@linkcode Stat} boost(s) * using a multiplier. diff --git a/src/overrides.ts b/src/overrides.ts index e19a5bf20dd..d16895b27fa 100644 --- a/src/overrides.ts +++ b/src/overrides.ts @@ -117,9 +117,9 @@ export const EGG_GACHA_PULL_COUNT_OVERRIDE: number = 0; */ // 1 to 256, set to null to ignore -export const MYSTERY_ENCOUNTER_RATE_OVERRIDE: number = null; +export const MYSTERY_ENCOUNTER_RATE_OVERRIDE: number = 256; export const MYSTERY_ENCOUNTER_TIER_OVERRIDE: MysteryEncounterTier = null; -export const MYSTERY_ENCOUNTER_OVERRIDE: MysteryEncounterType = null; +export const MYSTERY_ENCOUNTER_OVERRIDE: MysteryEncounterType = MysteryEncounterType.THE_STRONG_STUFF; /** * MODIFIER / ITEM OVERRIDES From 4aee3553147a29d953fafcd3399cbc4268fdab2f Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Sat, 20 Jul 2024 18:59:21 -0400 Subject: [PATCH 208/270] add dialogue bug fixes --- .../encounters/fight-or-flight-encounter.ts | 4 +++- .../encounters/mysterious-chest-encounter.ts | 2 +- .../encounters/the-strong-stuff-encounter.ts | 2 +- src/locales/en/mystery-encounters/fight-or-flight-dialogue.ts | 3 ++- .../en/mystery-encounters/training-session-dialogue.ts | 2 +- src/overrides.ts | 4 ++-- 6 files changed, 10 insertions(+), 7 deletions(-) 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 ca181b8d67c..3ed7be334ff 100644 --- a/src/data/mystery-encounters/encounters/fight-or-flight-encounter.ts +++ b/src/data/mystery-encounters/encounters/fight-or-flight-encounter.ts @@ -48,7 +48,7 @@ export const FightOrFlightEncounter: IMysteryEncounter = .withIntroSpriteConfigs([]) // Set in onInit() .withIntroDialogue([ { - text: `${namespace}_intro_message`, + text: `${namespace}:intro`, }, ]) .withOnInit((scene: BattleScene) => { @@ -104,8 +104,10 @@ export const FightOrFlightEncounter: IMysteryEncounter = const primaryPokemon = encounter.options[1].primaryPokemon; if (primaryPokemon) { // Use primaryPokemon to execute the thievery + encounter.options[1].dialogue.buttonLabel = `${namespace}:option:2:label_special`; encounter.options[1].dialogue.buttonTooltip = `${namespace}:option:2:tooltip_special`; } else { + encounter.options[1].dialogue.buttonLabel = `${namespace}:option:2:label`; encounter.options[1].dialogue.buttonTooltip = `${namespace}:option:2:tooltip`; } diff --git a/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts b/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts index e8db89a6961..9c4377b22e5 100644 --- a/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts +++ b/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts @@ -34,7 +34,7 @@ export const MysteriousChestEncounter: IMysteryEncounter = ]) .withIntroDialogue([ { - text: "${namespace}:intro:message", + text: "${namespace}:intro", }, ]) .withTitle(`${namespace}:title`) 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 7f0521b8263..05c34ba6973 100644 --- a/src/data/mystery-encounters/encounters/the-strong-stuff-encounter.ts +++ b/src/data/mystery-encounters/encounters/the-strong-stuff-encounter.ts @@ -20,7 +20,7 @@ import { BerryType } from "#enums/berry-type"; const namespace = "mysteryEncounter:theStrongStuff"; /** - * Pokemon Salesman encounter. + * The Strong Stuff encounter. * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/54 | GitHub Issue #54} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ diff --git a/src/locales/en/mystery-encounters/fight-or-flight-dialogue.ts b/src/locales/en/mystery-encounters/fight-or-flight-dialogue.ts index 2ef9d31a821..6d7f8ee5d61 100644 --- a/src/locales/en/mystery-encounters/fight-or-flight-dialogue.ts +++ b/src/locales/en/mystery-encounters/fight-or-flight-dialogue.ts @@ -10,7 +10,8 @@ export const fightOrFlightDialogue = { selected: "You approach the\nPokémon without fear.", }, 2: { - label: "{{option2PrimaryName}} can help", + label: "Steal the item", + label_special: "{{option2PrimaryName}} can help", tooltip: "@[SUMMARY_GREEN]{(35%) Steal Item}\n@[SUMMARY_BLUE]{(65%) Harder Battle}", tooltip_special: "(+) {{option2PrimaryName}} uses {{option2PrimaryMove}}", good_result: `.@d{32}.@d{32}.@d{32} diff --git a/src/locales/en/mystery-encounters/training-session-dialogue.ts b/src/locales/en/mystery-encounters/training-session-dialogue.ts index 12e84dd8d0d..4e2ce979935 100644 --- a/src/locales/en/mystery-encounters/training-session-dialogue.ts +++ b/src/locales/en/mystery-encounters/training-session-dialogue.ts @@ -19,7 +19,7 @@ export const trainingSessionDialogue = { }, 3: { label: "Heavy Training", - tooltip: "(-) Each of your Pokémon lose {{damagePercentage}}% of their total HP", + 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! $Its ability was changed to {{ability}}!`, diff --git a/src/overrides.ts b/src/overrides.ts index d16895b27fa..e19a5bf20dd 100644 --- a/src/overrides.ts +++ b/src/overrides.ts @@ -117,9 +117,9 @@ export const EGG_GACHA_PULL_COUNT_OVERRIDE: number = 0; */ // 1 to 256, set to null to ignore -export const MYSTERY_ENCOUNTER_RATE_OVERRIDE: number = 256; +export const MYSTERY_ENCOUNTER_RATE_OVERRIDE: number = null; export const MYSTERY_ENCOUNTER_TIER_OVERRIDE: MysteryEncounterTier = null; -export const MYSTERY_ENCOUNTER_OVERRIDE: MysteryEncounterType = MysteryEncounterType.THE_STRONG_STUFF; +export const MYSTERY_ENCOUNTER_OVERRIDE: MysteryEncounterType = null; /** * MODIFIER / ITEM OVERRIDES From c775495e1f1d36c3f1c29bf1c7f1636db5039ee9 Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Sat, 20 Jul 2024 19:00:29 -0400 Subject: [PATCH 209/270] add dialogue bug fixes --- .../mystery-encounters/encounters/fight-or-flight-encounter.ts | 2 -- src/locales/en/mystery-encounters/fight-or-flight-dialogue.ts | 1 - 2 files changed, 3 deletions(-) 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 3ed7be334ff..7675b204b50 100644 --- a/src/data/mystery-encounters/encounters/fight-or-flight-encounter.ts +++ b/src/data/mystery-encounters/encounters/fight-or-flight-encounter.ts @@ -104,10 +104,8 @@ export const FightOrFlightEncounter: IMysteryEncounter = const primaryPokemon = encounter.options[1].primaryPokemon; if (primaryPokemon) { // Use primaryPokemon to execute the thievery - encounter.options[1].dialogue.buttonLabel = `${namespace}:option:2:label_special`; encounter.options[1].dialogue.buttonTooltip = `${namespace}:option:2:tooltip_special`; } else { - encounter.options[1].dialogue.buttonLabel = `${namespace}:option:2:label`; encounter.options[1].dialogue.buttonTooltip = `${namespace}:option:2:tooltip`; } diff --git a/src/locales/en/mystery-encounters/fight-or-flight-dialogue.ts b/src/locales/en/mystery-encounters/fight-or-flight-dialogue.ts index 6d7f8ee5d61..a7b8b03aab5 100644 --- a/src/locales/en/mystery-encounters/fight-or-flight-dialogue.ts +++ b/src/locales/en/mystery-encounters/fight-or-flight-dialogue.ts @@ -11,7 +11,6 @@ export const fightOrFlightDialogue = { }, 2: { label: "Steal the item", - label_special: "{{option2PrimaryName}} can help", tooltip: "@[SUMMARY_GREEN]{(35%) Steal Item}\n@[SUMMARY_BLUE]{(65%) Harder Battle}", tooltip_special: "(+) {{option2PrimaryName}} uses {{option2PrimaryMove}}", good_result: `.@d{32}.@d{32}.@d{32} From 792af86f39c41dabaa30e54879d00a5fcbf4dede Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Mon, 22 Jul 2024 15:15:42 -0400 Subject: [PATCH 210/270] add pokemon salesman encounter and affects pokedex UI display --- .../mystery-encounters/encounter_radar.json | 41 +++ .../mystery-encounters/encounter_radar.png | Bin 0 -> 255 bytes src/battle-scene.ts | 6 +- .../encounters/field-trip-encounter.ts | 66 ++++- .../encounters/fight-or-flight-encounter.ts | 2 +- .../mysterious-challengers-encounter.ts | 4 +- .../encounters/mysterious-chest-encounter.ts | 4 +- .../encounters/pokemon-salesman-encounter.ts | 249 ++++-------------- .../encounters/training-session-encounter.ts | 67 +++-- .../mystery-encounter-option.ts | 9 + .../mystery-encounter-requirements.ts | 7 +- .../mystery-encounters/mystery-encounter.ts | 41 ++- .../mystery-encounters/mystery-encounters.ts | 2 +- .../utils/encounter-dialogue-utils.ts | 12 +- .../utils/encounter-phase-utils.ts | 95 +++++-- .../utils/encounter-pokemon-utils.ts | 28 +- src/field/mystery-encounter-intro.ts | 19 +- src/loading-scene.ts | 2 + src/locales/en/battle.ts | 1 + src/locales/en/mystery-encounter.ts | 1 + .../pokemon-salesman-dialogue.ts | 15 +- .../training-session-dialogue.ts | 1 + src/overrides.ts | 4 +- src/ui/mystery-encounter-ui-handler.ts | 61 ++++- 24 files changed, 433 insertions(+), 304 deletions(-) create mode 100644 public/images/mystery-encounters/encounter_radar.json create mode 100644 public/images/mystery-encounters/encounter_radar.png diff --git a/public/images/mystery-encounters/encounter_radar.json b/public/images/mystery-encounters/encounter_radar.json new file mode 100644 index 00000000000..82f16af59f6 --- /dev/null +++ b/public/images/mystery-encounters/encounter_radar.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "encounter_radar.png", + "format": "RGBA8888", + "size": { + "w": 17, + "h": 16 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 15, + "h": 14 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 15, + "h": 14 + }, + "frame": { + "x": 1, + "y": 1, + "w": 15, + "h": 14 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:eb3445f19546ab36edb2909c89b8aa86:c8de156a28ef70ee4ddf70cffe1ba3ba:e7008b81ccf0cb0325145a809afa6165$" + } +} diff --git a/public/images/mystery-encounters/encounter_radar.png b/public/images/mystery-encounters/encounter_radar.png new file mode 100644 index 0000000000000000000000000000000000000000..deb9426c26961785c6b06f67074bc1a9252b37fc GIT binary patch literal 255 zcmeAS@N?(olHy`uVBq!ia0vp^fDVPmGrK@Klj8!=gEtgA2aQK^!h%2=w|@b##j>M7tG-B z>_!@p!&%@FS p.id), 50); @@ -103,6 +109,12 @@ export const FieldTripEncounter: IMysteryEncounter = text: `${namespace}:option:selected`, }, ]; + encounter.dialogue.outro = [ + { + text: `${namespace}:outro_good`, + speaker: `${namespace}:speaker`, + }, + ]; setEncounterExp(scene, [pokemon.id], 100); } encounter.misc = { @@ -161,11 +173,23 @@ export const FieldTripEncounter: IMysteryEncounter = if (!correctMove) { encounter.options[1].dialogue.selected = [ { - text: `${namespace}:incorrect`, - speaker: `${namespace}:speaker`, + text: `${namespace}:option:incorrect`, + speaker: `${namespace}:option:speaker`, }, { - text: `${namespace}:lesson_learned`, + text: `${namespace}:option:lesson_learned`, + }, + ]; + encounter.dialogue.outro = [ + { + text: `${namespace}:outro_bad`, + speaker: `${namespace}:speaker`, + }, + ]; + encounter.dialogue.outro = [ + { + text: `${namespace}:outro_bad`, + speaker: `${namespace}:speaker`, }, ]; setEncounterExp(scene, scene.getParty().map((p) => p.id), 50); @@ -177,6 +201,12 @@ export const FieldTripEncounter: IMysteryEncounter = text: `${namespace}:option:selected`, }, ]; + encounter.dialogue.outro = [ + { + text: `${namespace}:outro_good`, + speaker: `${namespace}:speaker`, + }, + ]; setEncounterExp(scene, [pokemon.id], 100); } encounter.misc = { @@ -235,18 +265,20 @@ export const FieldTripEncounter: IMysteryEncounter = if (!correctMove) { encounter.options[2].dialogue.selected = [ { - text: `${namespace}:incorrect`, - speaker: `${namespace}:speaker`, + text: `${namespace}:option:incorrect`, + speaker: `${namespace}:option:speaker`, }, { - text: `${namespace}:lesson_learned`, + text: `${namespace}:option:lesson_learned`, }, ]; - setEncounterExp( - scene, - scene.getParty().map((p) => p.id), - 50 - ); + encounter.dialogue.outro = [ + { + text: `${namespace}:outro_bad`, + speaker: `${namespace}:speaker`, + }, + ]; + setEncounterExp(scene, scene.getParty().map((p) => p.id), 50); } else { encounter.setDialogueToken("pokeName", pokemon.name); encounter.setDialogueToken("move", move.getName()); @@ -255,6 +287,12 @@ export const FieldTripEncounter: IMysteryEncounter = text: `${namespace}:option:selected`, }, ]; + encounter.dialogue.outro = [ + { + text: `${namespace}:outro_good`, + speaker: `${namespace}:speaker`, + }, + ]; setEncounterExp(scene, [pokemon.id], 100); } encounter.misc = { 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 7675b204b50..5e7d3704fc0 100644 --- a/src/data/mystery-encounters/encounters/fight-or-flight-encounter.ts +++ b/src/data/mystery-encounters/encounters/fight-or-flight-encounter.ts @@ -150,7 +150,7 @@ export const FightOrFlightEncounter: IMysteryEncounter = const primaryPokemon = encounter.options[1].primaryPokemon; if (primaryPokemon) { // Use primaryPokemon to execute the thievery - await showEncounterText(scene, `${namespace}:option:2:steal_result`); + await showEncounterText(scene, `${namespace}:option:2:special_result`); leaveEncounterWithoutBattle(scene); return; } diff --git a/src/data/mystery-encounters/encounters/mysterious-challengers-encounter.ts b/src/data/mystery-encounters/encounters/mysterious-challengers-encounter.ts index 382dc1f212e..f18d7655936 100644 --- a/src/data/mystery-encounters/encounters/mysterious-challengers-encounter.ts +++ b/src/data/mystery-encounters/encounters/mysterious-challengers-encounter.ts @@ -169,7 +169,7 @@ export const MysteriousChallengersEncounter: IMysteryEncounter = // Spawn hard fight with ULTRA/GREAT reward (can improve with luck) const config: EnemyPartyConfig = encounter.enemyPartyConfigs[1]; - setEncounterRewards(scene, { guaranteedModifierTiers: [ModifierTier.ULTRA, ModifierTier.GREAT, ModifierTier.GREAT], fillRemaining: true }); + setEncounterRewards(scene, { guaranteedModifierTiers: [ModifierTier.ULTRA, ModifierTier.ULTRA, ModifierTier.GREAT, ModifierTier.GREAT], fillRemaining: true }); // Seed offsets to remove possibility of different trainers having exact same teams let ret; @@ -197,7 +197,7 @@ export const MysteriousChallengersEncounter: IMysteryEncounter = // To avoid player level snowballing from picking this option encounter.expMultiplier = 0.9; - setEncounterRewards(scene, { guaranteedModifierTiers: [ModifierTier.ROGUE, ModifierTier.ULTRA, ModifierTier.GREAT], fillRemaining: true }); + setEncounterRewards(scene, { guaranteedModifierTiers: [ModifierTier.ROGUE, ModifierTier.ROGUE, ModifierTier.ULTRA, ModifierTier.GREAT], fillRemaining: true }); // Seed offsets to remove possibility of different trainers having exact same teams let ret; diff --git a/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts b/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts index 9c4377b22e5..13c5b9cc1e4 100644 --- a/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts +++ b/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts @@ -34,8 +34,8 @@ export const MysteriousChestEncounter: IMysteryEncounter = ]) .withIntroDialogue([ { - text: "${namespace}:intro", - }, + text: `${namespace}:intro`, + } ]) .withTitle(`${namespace}:title`) .withDescription(`${namespace}:description`) diff --git a/src/data/mystery-encounters/encounters/pokemon-salesman-encounter.ts b/src/data/mystery-encounters/encounters/pokemon-salesman-encounter.ts index f572f6cf76b..8ba7b08feaa 100644 --- a/src/data/mystery-encounters/encounters/pokemon-salesman-encounter.ts +++ b/src/data/mystery-encounters/encounters/pokemon-salesman-encounter.ts @@ -1,21 +1,23 @@ -import { generateModifierTypeOption, leaveEncounterWithoutBattle, selectPokemonForOption, setEncounterExp, updatePlayerMoney, } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import { StatusEffect } from "#app/data/status-effect"; -import Pokemon, { PlayerPokemon } from "#app/field/pokemon"; -import { modifierTypes } from "#app/modifier/modifier-type"; +import { leaveEncounterWithoutBattle, transitionMysteryEncounterIntroVisuals, updatePlayerMoney, } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { isNullOrUndefined, randSeedInt } from "#app/utils"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import BattleScene from "../../../battle-scene"; import IMysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier, } from "../mystery-encounter"; -import { EncounterOptionMode, MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; import { MoneyRequirement } from "../mystery-encounter-requirements"; -import { getEncounterText, queueEncounterMessage } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; -import { applyDamageToPokemon, getRandomSpeciesByStarterTier } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; +import { catchPokemon, getRandomSpeciesByStarterTier } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; import { getPokemonSpecies, speciesStarters } from "#app/data/pokemon-species"; import { Species } from "#enums/species"; +import { PokeballType } from "#app/data/pokeball"; +import { EnemyPokemon, PlayerPokemon } from "#app/field/pokemon"; +import { EncounterOptionMode, MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; +import { showEncounterDialogue } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; +import PokemonData from "#app/system/pokemon-data"; /** the i18n namespace for this encounter */ const namespace = "mysteryEncounter:pokemonSalesman"; +const MAX_POKEMON_PRICE_MULTIPLIER = 6; + /** * Pokemon Salesman encounter. * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/36 | GitHub Issue #36} @@ -25,7 +27,8 @@ export const PokemonSalesmanEncounter: IMysteryEncounter = MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.POKEMON_SALESMAN) .withEncounterTier(MysteryEncounterTier.ULTRA) .withSceneWaveRangeRequirement(10, 180) - .withSceneRequirement(new MoneyRequirement(null, 8)) // Some costs may not be as significant, this is the max you'd pay + .withSceneRequirement(new MoneyRequirement(null, MAX_POKEMON_PRICE_MULTIPLIER)) // Some costs may not be as significant, this is the max you'd pay + .withAutoHideIntroVisuals(false) .withIntroSpriteConfigs([ { spriteKey: "pokemon_salesman", @@ -56,8 +59,7 @@ export const PokemonSalesmanEncounter: IMysteryEncounter = species = getPokemonSpecies(getRandomSpeciesByStarterTier([0, 5])); } - - let pokemon; + let pokemon: PlayerPokemon; if (isNullOrUndefined(species.abilityHidden) || randSeedInt(100) === 0) { // If no HA mon found or you roll 1%, give shiny Magikarp species = getPokemonSpecies(Species.MAGIKARP); @@ -68,219 +70,82 @@ export const PokemonSalesmanEncounter: IMysteryEncounter = pokemon = scene.addPlayerPokemon(species, 5, hiddenIndex, species.formIndex); } + const spriteKey = pokemon.getSpriteId(); + const spriteRoot = pokemon.getSpriteAtlasPath(); + encounter.spriteConfigs.push({ + spriteKey: spriteKey, + fileRoot: spriteRoot, + hasShadow: true, + repeat: true, + isPokemon: true + }); + const starterTier = speciesStarters[species.speciesId]; - // Prices by starter tier: 8/6.4/4.8/4/4 - let priceMultiplier = 8 * (Math.max(starterTier, 2.5) / 5); + // Prices decrease by starter tier less than 5, but only reduces cost by half at max + let priceMultiplier = MAX_POKEMON_PRICE_MULTIPLIER * (Math.max(starterTier, 2.5) / 5); if (pokemon.shiny) { - // Always max price for shiny, and add special message to intro - priceMultiplier = 8; - encounter.setDialogueToken("specialShinyText", `$t(${namespace}:shiny)`); - } else { - encounter.setDialogueToken("specialShinyText", ""); + // Always max price for shiny (flip HA back to normal), and add special messaging + priceMultiplier = MAX_POKEMON_PRICE_MULTIPLIER; + pokemon.abilityIndex = 0; + encounter.dialogue.encounterOptionsDialogue.description = `${namespace}:description_shiny`; + encounter.options[0].dialogue.buttonTooltip = `${namespace}:option:1:tooltip_shiny`; } + const price = scene.getWaveMoneyAmount(priceMultiplier); encounter.setDialogueToken("purchasePokemon", pokemon.name); - encounter.setDialogueToken("price", pokemon.name); + encounter.setDialogueToken("price", price.toString()); encounter.misc = { - money: scene.getWaveMoneyAmount(priceMultiplier), - pokemon: pokemon, - // shiny: pokemon.shiny + money: price, + pokemon: pokemon }; pokemon.calculateStats(); return true; }) - .withSimpleOption({ - buttonLabel: `${namespace}:option:1:label`, - buttonTooltip: `${namespace}:option:1:tooltip`, - selected: [ - { - text: `${namespace}:option:selected`, - }, - ], - }, - async (scene: BattleScene) => { - // Choose Cheap Option - const encounter = scene.currentBattle.mysteryEncounter; - const cost = encounter.misc.money; - // const purchasedPokemon = encounter.misc.pokemon; - - // Update money - updatePlayerMoney(scene, -cost); - - leaveEncounterWithoutBattle(scene); - }) .withOption( new MysteryEncounterOptionBuilder() - .withOptionMode(EncounterOptionMode.DEFAULT) - .withSceneMoneyRequirement(0, 2) // Wave scaling money multiplier of 2 + .withOptionMode(EncounterOptionMode.DEFAULT_OR_SPECIAL) + .withHasDexProgress(true) + .withSceneMoneyRequirement(null, MAX_POKEMON_PRICE_MULTIPLIER) // Wave scaling money multiplier of 2 .withDialogue({ buttonLabel: `${namespace}:option:1:label`, buttonTooltip: `${namespace}:option:1:tooltip`, selected: [ { - text: `${namespace}:option:selected`, - }, + text: `${namespace}:option:1:selected_message`, + } ], }) - .withPreOptionPhase(async (scene: BattleScene): Promise => { - const encounter = scene.currentBattle.mysteryEncounter; - const onPokemonSelected = (pokemon: PlayerPokemon) => { - // Update money - updatePlayerMoney(scene, -(encounter.options[0].requirements[0] as MoneyRequirement).requiredMoney); - // Calculate modifiers and dialogue tokens - const modifiers = [ - generateModifierTypeOption(scene, modifierTypes.BASE_STAT_BOOSTER).type, - generateModifierTypeOption(scene, modifierTypes.BASE_STAT_BOOSTER).type, - ]; - encounter.setDialogueToken("boost1", modifiers[0].name); - encounter.setDialogueToken("boost2", modifiers[1].name); - encounter.misc = { - chosenPokemon: pokemon, - modifiers: modifiers, - }; - }; - - // Only Pokemon that can gain benefits are above 1/3rd HP with no status - const selectableFilter = (pokemon: Pokemon) => { - // If pokemon meets primary pokemon reqs, it can be selected - const meetsReqs = encounter.pokemonMeetsPrimaryRequirements(scene, pokemon); - if (!meetsReqs) { - return getEncounterText(scene, `${namespace}:invalid_selection`); - } - - return null; - }; - - return selectPokemonForOption(scene, onPokemonSelected, null, selectableFilter); - }) .withOptionPhase(async (scene: BattleScene) => { - // Choose Cheap Option const encounter = scene.currentBattle.mysteryEncounter; - const chosenPokemon = encounter.misc.chosenPokemon; - const modifiers = encounter.misc.modifiers; + const cost = encounter.misc.money; + const purchasedPokemon = encounter.misc.pokemon as PlayerPokemon; - for (const modType of modifiers) { - const modifier = modType.newModifier(chosenPokemon); - await scene.addModifier(modifier, true, false, false, true); - } - scene.updateModifiers(true); + // Update money + updatePlayerMoney(scene, -cost, true, false); - leaveEncounterWithoutBattle(scene); - }) - .withPostOptionPhase(async (scene: BattleScene) => { - // Damage and status applied after dealer leaves (to make thematic sense) - const encounter = scene.currentBattle.mysteryEncounter; - const chosenPokemon = encounter.misc.chosenPokemon; + // Show dialogue + await showEncounterDialogue(scene, `${namespace}:option:1:selected_dialogue`, `${namespace}:speaker`); + await transitionMysteryEncounterIntroVisuals(scene); - // Pokemon takes 1/3 max HP damage - applyDamageToPokemon(scene, chosenPokemon, Math.floor(chosenPokemon.getMaxHp() / 3)); + // "Catch" purchased pokemon + const data = new PokemonData(purchasedPokemon); + data.player = false; + await catchPokemon(scene, data.toPokemon(scene) as EnemyPokemon, null, PokeballType.POKEBALL, true); - // Roll for poison (80%) - if (randSeedInt(10) < 8) { - if (chosenPokemon.trySetStatus(StatusEffect.TOXIC)) { - // Toxic applied - queueEncounterMessage(scene, `${namespace}:bad_poison`); - } else { - // Pokemon immune or something else prevents status - queueEncounterMessage(scene, `${namespace}:damage_only`); - } - } else { - queueEncounterMessage(scene, `${namespace}:damage_only`); - } - - setEncounterExp(scene, [chosenPokemon.id], 100); - - chosenPokemon.updateInfo(); - }) - .build() - ) - .withOption( - new MysteryEncounterOptionBuilder() - .withOptionMode(EncounterOptionMode.DISABLED_OR_DEFAULT) - .withSceneMoneyRequirement(0, 5) // Wave scaling money multiplier of 5 - .withDialogue({ - buttonLabel: `${namespace}:option:2:label`, - buttonTooltip: `${namespace}:option:2:tooltip`, - selected: [ - { - text: `${namespace}:option:selected`, - }, - ], - }) - .withPreOptionPhase(async (scene: BattleScene): Promise => { - const encounter = scene.currentBattle.mysteryEncounter; - const onPokemonSelected = (pokemon: PlayerPokemon) => { - // Update money - updatePlayerMoney(scene, -(encounter.options[1].requirements[0] as MoneyRequirement).requiredMoney); - // Calculate modifiers and dialogue tokens - const modifiers = [ - generateModifierTypeOption(scene, modifierTypes.BASE_STAT_BOOSTER).type, - generateModifierTypeOption(scene, modifierTypes.BASE_STAT_BOOSTER).type, - ]; - encounter.setDialogueToken("boost1", modifiers[0].name); - encounter.setDialogueToken("boost2", modifiers[1].name); - encounter.misc = { - chosenPokemon: pokemon, - modifiers: modifiers, - }; - }; - - // Only Pokemon that can gain benefits are above 1/3rd HP with no status - const selectableFilter = (pokemon: Pokemon) => { - // If pokemon meets primary pokemon reqs, it can be selected - const meetsReqs = encounter.pokemonMeetsPrimaryRequirements(scene, pokemon); - if (!meetsReqs) { - return getEncounterText(scene, `${namespace}:invalid_selection`); - } - - return null; - }; - - return selectPokemonForOption(scene, onPokemonSelected, null, selectableFilter); - }) - .withOptionPhase(async (scene: BattleScene) => { - // Choose Expensive Option - const encounter = scene.currentBattle.mysteryEncounter; - const chosenPokemon = encounter.misc.chosenPokemon; - const modifiers = encounter.misc.modifiers; - - for (const modType of modifiers) { - const modifier = modType.newModifier(chosenPokemon); - await scene.addModifier(modifier, true, false, false, true); - } - scene.updateModifiers(true); - - leaveEncounterWithoutBattle(scene); - }) - .withPostOptionPhase(async (scene: BattleScene) => { - // Status applied after dealer leaves (to make thematic sense) - const encounter = scene.currentBattle.mysteryEncounter; - const chosenPokemon = encounter.misc.chosenPokemon; - - // Roll for poison (20%) - if (randSeedInt(10) < 2) { - if (chosenPokemon.trySetStatus(StatusEffect.POISON)) { - // Poison applied - queueEncounterMessage(scene, `${namespace}:poison`); - } else { - // Pokemon immune or something else prevents status - queueEncounterMessage(scene, `${namespace}:no_bad_effects`); - } - } else { - queueEncounterMessage(scene, `${namespace}:no_bad_effects`); - } - - setEncounterExp(scene, [chosenPokemon.id], 100); - - chosenPokemon.updateInfo(); + leaveEncounterWithoutBattle(scene, true); }) .build() ) .withSimpleOption( { - buttonLabel: `${namespace}:option:3:label`, - buttonTooltip: `${namespace}:option:3:tooltip`, + buttonLabel: `${namespace}:option:2:label`, + buttonTooltip: `${namespace}:option:2:tooltip`, + selected: [ + { + text: `${namespace}:option:2:selected`, + }, + ], }, async (scene: BattleScene) => { // Leave encounter with no rewards or exp diff --git a/src/data/mystery-encounters/encounters/training-session-encounter.ts b/src/data/mystery-encounters/encounters/training-session-encounter.ts index 2c09b0a01c7..a3f18395fe2 100644 --- a/src/data/mystery-encounters/encounters/training-session-encounter.ts +++ b/src/data/mystery-encounters/encounters/training-session-encounter.ts @@ -3,7 +3,7 @@ import { EnemyPartyConfig, initBattleWithEnemyConfig, selectPokemonForOption, se import { getNatureName, Nature } from "#app/data/nature"; import { speciesStarters } from "#app/data/pokemon-species"; import { Stat } from "#app/data/pokemon-stat"; -import { PlayerPokemon } from "#app/field/pokemon"; +import Pokemon, { PlayerPokemon } from "#app/field/pokemon"; import { pokemonInfo } from "#app/locales/en/pokemon-info"; import { PokemonHeldItemModifier } from "#app/modifier/modifier"; import { PokemonHeldItemModifierType } from "#app/modifier/modifier-type"; @@ -16,7 +16,7 @@ import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import BattleScene from "../../../battle-scene"; import IMysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier, } from "../mystery-encounter"; import { EncounterOptionMode, MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; -import { queueEncounterMessage } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; +import { getEncounterText, queueEncounterMessage } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; /** The i18n namespace for the encounter */ const namespace = "mysteryEncounter:trainingSession"; @@ -27,11 +27,10 @@ const namespace = "mysteryEncounter:trainingSession"; * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ export const TrainingSessionEncounter: IMysteryEncounter = - MysteryEncounterBuilder.withEncounterType( - MysteryEncounterType.TRAINING_SESSION - ) + MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.TRAINING_SESSION) .withEncounterTier(MysteryEncounterTier.ULTRA) .withSceneWaveRangeRequirement(10, 180) // waves 10 to 180 + .withScenePartySizeRequirement(2, 6, true) // Must have at least 2 unfainted pokemon in party .withHideWildIntroMessage(true) .withIntroSpriteConfigs([ { @@ -46,7 +45,7 @@ export const TrainingSessionEncounter: IMysteryEncounter = .withIntroDialogue([ { text: `${namespace}:intro`, - }, + } ]) .withTitle(`${namespace}:title`) .withDescription(`${namespace}:description`) @@ -54,6 +53,7 @@ export const TrainingSessionEncounter: IMysteryEncounter = .withOption( new MysteryEncounterOptionBuilder() .withOptionMode(EncounterOptionMode.DEFAULT) + .withHasDexProgress(true) .withDialogue({ buttonLabel: `${namespace}:option:1:label`, buttonTooltip: `${namespace}:option:1:tooltip`, @@ -71,7 +71,17 @@ export const TrainingSessionEncounter: IMysteryEncounter = }; }; - return selectPokemonForOption(scene, onPokemonSelected); + // Only Pokemon that are not KOed/legal can be trained + const selectableFilter = (pokemon: Pokemon) => { + const meetsReqs = pokemon.isAllowedInBattle(); + if (!meetsReqs) { + return getEncounterText(scene, `${namespace}:invalid_selection`); + } + + return null; + }; + + return selectPokemonForOption(scene, onPokemonSelected, null, selectableFilter); }) .withOptionPhase(async (scene: BattleScene) => { const encounter = scene.currentBattle.mysteryEncounter; @@ -187,6 +197,7 @@ export const TrainingSessionEncounter: IMysteryEncounter = .withOption( new MysteryEncounterOptionBuilder() .withOptionMode(EncounterOptionMode.DEFAULT) + .withHasDexProgress(true) .withDialogue({ buttonLabel: `${namespace}:option:2:label`, buttonTooltip: `${namespace}:option:2:tooltip`, @@ -220,7 +231,17 @@ export const TrainingSessionEncounter: IMysteryEncounter = }); }; - return selectPokemonForOption(scene, onPokemonSelected); + // Only Pokemon that are not KOed/legal can be trained + const selectableFilter = (pokemon: Pokemon) => { + const meetsReqs = pokemon.isAllowedInBattle(); + if (!meetsReqs) { + return getEncounterText(scene, `${namespace}:invalid_selection`); + } + + return null; + }; + + return selectPokemonForOption(scene, onPokemonSelected, null, selectableFilter); }) .withOptionPhase(async (scene: BattleScene) => { const encounter = scene.currentBattle.mysteryEncounter; @@ -269,6 +290,7 @@ export const TrainingSessionEncounter: IMysteryEncounter = .withOption( new MysteryEncounterOptionBuilder() .withOptionMode(EncounterOptionMode.DEFAULT) + .withHasDexProgress(true) .withDialogue({ buttonLabel: `${namespace}:option:3:label`, buttonTooltip: `${namespace}:option:3:tooltip`, @@ -311,7 +333,17 @@ export const TrainingSessionEncounter: IMysteryEncounter = }); }; - return selectPokemonForOption(scene, onPokemonSelected); + // Only Pokemon that are not KOed/legal can be trained + const selectableFilter = (pokemon: Pokemon) => { + const meetsReqs = pokemon.isAllowedInBattle(); + if (!meetsReqs) { + return getEncounterText(scene, `${namespace}:invalid_selection`); + } + + return null; + }; + + return selectPokemonForOption(scene, onPokemonSelected, null, selectableFilter); }) .withOptionPhase(async (scene: BattleScene) => { const encounter = scene.currentBattle.mysteryEncounter; @@ -393,23 +425,12 @@ export const TrainingSessionEncounter: IMysteryEncounter = ) .build(); -function getEnemyConfig( - scene: BattleScene, - playerPokemon: PlayerPokemon, - segments: number, - modifiers: ModifiersHolder -): EnemyPartyConfig { +function getEnemyConfig(scene: BattleScene, playerPokemon: PlayerPokemon,segments: number,modifiers: ModifiersHolder): EnemyPartyConfig { playerPokemon.resetSummonData(); // Passes modifiers by reference - modifiers.value = scene.findModifiers( - (m) => - m instanceof PokemonHeldItemModifier && - (m as PokemonHeldItemModifier).pokemonId === playerPokemon.id - ) as PokemonHeldItemModifier[]; - const modifierTypes = modifiers.value.map( - (mod) => mod.type - ) as PokemonHeldItemModifierType[]; + modifiers.value = scene.findModifiers((m) => m instanceof PokemonHeldItemModifier && (m as PokemonHeldItemModifier).pokemonId === playerPokemon.id) as PokemonHeldItemModifier[]; + const modifierTypes = modifiers.value.map((mod) => mod.type) as PokemonHeldItemModifierType[]; const data = new PokemonData(playerPokemon); return { diff --git a/src/data/mystery-encounters/mystery-encounter-option.ts b/src/data/mystery-encounters/mystery-encounter-option.ts index c7feb2688c3..8b9b26e2f95 100644 --- a/src/data/mystery-encounters/mystery-encounter-option.ts +++ b/src/data/mystery-encounters/mystery-encounter-option.ts @@ -6,6 +6,7 @@ import * as Utils from "../../utils"; import { Type } from "../type"; import { EncounterPokemonRequirement, EncounterSceneRequirement, MoneyRequirement, TypeRequirement } from "./mystery-encounter-requirements"; import { CanLearnMoveRequirement, CanLearnMoveRequirementOptions } from "./requirements/can-learn-move-requirement"; +import { isNullOrUndefined } from "../../utils"; export enum EncounterOptionMode { /** Default style */ @@ -23,6 +24,9 @@ export type OptionPhaseCallback = (scene: BattleScene) => Promise> { + return Object.assign(this, { hasDexProgress: hasDexProgress }); + } + withSceneRequirement(requirement: EncounterSceneRequirement): this & Required> { this.requirements.push(requirement); return Object.assign(this, { requirements: this.requirements }); diff --git a/src/data/mystery-encounters/mystery-encounter-requirements.ts b/src/data/mystery-encounters/mystery-encounter-requirements.ts index ac1d49c919e..6f0b408e1d9 100644 --- a/src/data/mystery-encounters/mystery-encounter-requirements.ts +++ b/src/data/mystery-encounters/mystery-encounter-requirements.ts @@ -144,20 +144,23 @@ export class WeatherRequirement extends EncounterSceneRequirement { export class PartySizeRequirement extends EncounterSceneRequirement { partySizeRange: [number, number]; + excludeFainted: boolean; /** * Used for specifying a party size requirement * If min and max are equivalent, will check for exact size * @param partySizeRange - [min, max] + * @param excludeFainted */ - constructor(partySizeRange: [number, number]) { + constructor(partySizeRange: [number, number], excludeFainted: boolean) { super(); this.partySizeRange = partySizeRange; + this.excludeFainted = excludeFainted; } meetsRequirement(scene: BattleScene): boolean { if (!isNullOrUndefined(this?.partySizeRange) && this.partySizeRange?.[0] <= this.partySizeRange?.[1]) { - const partySize = scene.getParty().length; + const partySize = this.excludeFainted ? scene.getParty().filter(p => p.isAllowedInBattle()).length : scene.getParty().length; if (partySize >= 0 && (this?.partySizeRange?.[0] >= 0 && this.partySizeRange?.[0] > partySize) || (this?.partySizeRange?.[1] >= 0 && this.partySizeRange?.[1] < partySize)) { return false; } diff --git a/src/data/mystery-encounters/mystery-encounter.ts b/src/data/mystery-encounters/mystery-encounter.ts index b18707968a3..aa9d4ef0997 100644 --- a/src/data/mystery-encounters/mystery-encounter.ts +++ b/src/data/mystery-encounters/mystery-encounter.ts @@ -403,7 +403,7 @@ export class MysteryEncounterBuilder implements Partial { options?: [MysteryEncounterOption, MysteryEncounterOption, ...MysteryEncounterOption[]] = [null, null]; spriteConfigs?: MysteryEncounterSpriteConfig[]; - dialogue?: MysteryEncounterDialogue; + dialogue?: MysteryEncounterDialogue = {}; encounterTier?: MysteryEncounterTier; encounterAnimations?: EncounterAnim[]; requirements?: EncounterSceneRequirement[] = []; @@ -460,6 +460,7 @@ export class MysteryEncounterBuilder implements Partial { * There should be at least 2 options defined and no more than 4. * If complex use {@linkcode MysteryEncounterBuilder.withOption} * + * @param hasDexProgress - * @param dialogue - {@linkcode OptionTextDisplay} * @param callback - {@linkcode OptionPhaseCallback} * @returns @@ -468,6 +469,24 @@ export class MysteryEncounterBuilder implements Partial { return this.withOption(new MysteryEncounterOptionBuilder().withOptionMode(EncounterOptionMode.DEFAULT).withDialogue(dialogue).withOptionPhase(callback).build()); } + /** + * Defines an option + phasefor the encounter. + * Use for easy/streamlined options. + * There should be at least 2 options defined and no more than 4. + * If complex use {@linkcode MysteryEncounterBuilder.withOption} + * + * @param dialogue - {@linkcode OptionTextDisplay} + * @param callback - {@linkcode OptionPhaseCallback} + * @returns + */ + withSimpleDexProgressOption(dialogue: OptionTextDisplay, callback: OptionPhaseCallback): this & Pick { + return this.withOption(new MysteryEncounterOptionBuilder() + .withOptionMode(EncounterOptionMode.DEFAULT) + .withHasDexProgress(true) + .withDialogue(dialogue) + .withOptionPhase(callback).build()); + } + /** * Defines the sprites that will be shown on the enemy field when the encounter spawns * Can be one or more sprites, recommended not to exceed 4 @@ -478,7 +497,7 @@ export class MysteryEncounterBuilder implements Partial { return Object.assign(this, { spriteConfigs: spriteConfigs }); } - withIntroDialogue(dialogue: MysteryEncounterDialogue["intro"] = []) { + withIntroDialogue(dialogue: MysteryEncounterDialogue["intro"] = []): this { this.dialogue = {...this.dialogue, intro: dialogue }; return this; } @@ -550,7 +569,7 @@ export class MysteryEncounterBuilder implements Partial { * @param max optional max wave. If not given, defaults to min => exact wave * @returns */ - withSceneWaveRangeRequirement(min: number, max?: number) { + withSceneWaveRangeRequirement(min: number, max?: number): this & Required> { return this.withSceneRequirement(new WaveRangeRequirement([min, max ?? min])); } @@ -559,10 +578,11 @@ export class MysteryEncounterBuilder implements Partial { * * @param min min wave (or exact size if only min is given) * @param max optional max size. If not given, defaults to min => exact wave + * @param excludeFainted - if true, only counts unfainted mons * @returns */ - withScenePartySizeRequirement(min: number, max?: number) { - return this.withSceneRequirement(new PartySizeRequirement([min, max ?? min])); + withScenePartySizeRequirement(min: number, max?: number, excludeFainted?: boolean): this & Required> { + return this.withSceneRequirement(new PartySizeRequirement([min, max ?? min], excludeFainted)); } /** @@ -700,7 +720,7 @@ export class MysteryEncounterBuilder implements Partial { * @param title - title of the encounter * @returns */ - withTitle(title: string) { + withTitle(title: string): this { const encounterOptionsDialogue = this.dialogue.encounterOptionsDialogue ?? {}; this.dialogue = { @@ -720,7 +740,7 @@ export class MysteryEncounterBuilder implements Partial { * @param description - description of the encounter * @returns */ - withDescription(description: string) { + withDescription(description: string): this { const encounterOptionsDialogue = this.dialogue.encounterOptionsDialogue ?? {}; this.dialogue = { @@ -740,7 +760,7 @@ export class MysteryEncounterBuilder implements Partial { * @param query - query to use for the encounter * @returns */ - withQuery(query: string) { + withQuery(query: string): this { const encounterOptionsDialogue = this.dialogue.encounterOptionsDialogue ?? {}; this.dialogue = { @@ -760,7 +780,7 @@ export class MysteryEncounterBuilder implements Partial { * @param dialogue - outro dialogue/s * @returns */ - withOutroDialogue(dialogue: MysteryEncounterDialogue["outro"] = []) { + withOutroDialogue(dialogue: MysteryEncounterDialogue["outro"] = []): this { this.dialogue = {...this.dialogue, outro: dialogue }; return this; } @@ -768,10 +788,9 @@ export class MysteryEncounterBuilder implements Partial { /** * Builds the mystery encounter * - * @param this - MysteryEncounter * @returns */ - build(this: IMysteryEncounter) { + build(this: IMysteryEncounter): IMysteryEncounter { return new IMysteryEncounter(this); } } diff --git a/src/data/mystery-encounters/mystery-encounters.ts b/src/data/mystery-encounters/mystery-encounters.ts index fb2bc9a2ad8..9c26f54a128 100644 --- a/src/data/mystery-encounters/mystery-encounters.ts +++ b/src/data/mystery-encounters/mystery-encounters.ts @@ -18,7 +18,7 @@ import { PokemonSalesmanEncounter } from "#app/data/mystery-encounters/encounter // Spawn chance: (BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT + WIGHT_INCREMENT_ON_SPAWN_MISS * ) / 256 export const BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT = 1; -export const WIGHT_INCREMENT_ON_SPAWN_MISS = 5; +export const WEIGHT_INCREMENT_ON_SPAWN_MISS = 5; export const AVERAGE_ENCOUNTERS_PER_RUN_TARGET = 15; export const EXTREME_ENCOUNTER_BIOMES = [ diff --git a/src/data/mystery-encounters/utils/encounter-dialogue-utils.ts b/src/data/mystery-encounters/utils/encounter-dialogue-utils.ts index 1042984533d..382b2c7dde8 100644 --- a/src/data/mystery-encounters/utils/encounter-dialogue-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-dialogue-utils.ts @@ -63,10 +63,12 @@ export function showEncounterText(scene: BattleScene, contentKey: string, callba * @param scene * @param textContentKey * @param speakerContentKey - * @param callback + * @param callbackDelay */ -export function showEncounterDialogue(scene: BattleScene, textContentKey: string, speakerContentKey: string, callback?: Function) { - const text: string = getEncounterText(scene, textContentKey); - const speaker: string = getEncounterText(scene, speakerContentKey); - scene.ui.showDialogue(text, speaker, null, callback, 0, 0); +export function showEncounterDialogue(scene: BattleScene, textContentKey: string, speakerContentKey: string, callbackDelay: number = 0): Promise { + return new Promise(resolve => { + const text: string = getEncounterText(scene, textContentKey); + const speaker: string = getEncounterText(scene, speakerContentKey); + scene.ui.showDialogue(text, speaker, null, () => resolve(), callbackDelay); + }); } diff --git a/src/data/mystery-encounters/utils/encounter-phase-utils.ts b/src/data/mystery-encounters/utils/encounter-phase-utils.ts index 40763358b89..37dcca3e412 100644 --- a/src/data/mystery-encounters/utils/encounter-phase-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-phase-utils.ts @@ -1,7 +1,7 @@ import { BattlerIndex, BattleType } from "#app/battle"; import { biomeLinks } from "#app/data/biomes"; import MysteryEncounterOption from "#app/data/mystery-encounters/mystery-encounter-option"; -import { WIGHT_INCREMENT_ON_SPAWN_MISS } from "#app/data/mystery-encounters/mystery-encounters"; +import { WEIGHT_INCREMENT_ON_SPAWN_MISS } from "#app/data/mystery-encounters/mystery-encounters"; import { showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; import Pokemon, { FieldPosition, PlayerPokemon, PokemonMove } from "#app/field/pokemon"; import { ExpBalanceModifier, ExpShareModifier, MultipleParticipantExpBonusModifier, PokemonExpBoosterModifier } from "#app/modifier/modifier"; @@ -317,17 +317,19 @@ export function initCustomMovesForEncounter(scene: BattleScene, moves: Moves | M * @param changeValue * @param playSound */ -export function updatePlayerMoney(scene: BattleScene, changeValue: number, playSound: boolean = true) { - scene.money += changeValue; +export function updatePlayerMoney(scene: BattleScene, changeValue: number, playSound: boolean = true, showMessage: boolean = true) { + scene.money = Math.min(Math.max(scene.money + changeValue, 0), Number.MAX_SAFE_INTEGER); scene.updateMoneyText(); scene.animateMoneyChanged(false); if (playSound) { scene.playSound("buy"); } - if (changeValue < 0) { - scene.queueMessage(i18next.t("mysteryEncounter:paid_money", { amount: -changeValue }), null, true); - } else { - scene.queueMessage(i18next.t("mysteryEncounter:receive_money", { amount: changeValue }), null, true); + if (showMessage) { + if (changeValue < 0) { + scene.queueMessage(i18next.t("mysteryEncounter:paid_money", { amount: -changeValue }), null, true); + } else { + scene.queueMessage(i18next.t("mysteryEncounter:receive_money", { amount: changeValue }), null, true); + } } } @@ -399,6 +401,7 @@ export function selectPokemonForOption(scene: BattleScene, onPokemonSelected: (p }).concat({ label: i18next.t("menu:cancel"), handler: () => { + scene.ui.clearText(); scene.ui.setMode(Mode.MYSTERY_ENCOUNTER); resolve(false); return true; @@ -730,12 +733,18 @@ export function calculateMEAggregateStats(scene: BattleScene, baseSpawnWeight: n const numRuns = 1000; let run = 0; const targetEncountersPerRun = 15; // AVERAGE_ENCOUNTERS_PER_RUN_TARGET + const biomes = Object.keys(Biome).filter(key => isNaN(Number(key))); + const alwaysPickTheseBiomes = [Biome.ISLAND, Biome.ABYSS, Biome.WASTELAND, Biome.FAIRY_CAVE, Biome.TEMPLE, Biome.LABORATORY, Biome.SPACE, Biome.WASTELAND]; - const calculateNumEncounters = (): number[] => { + const calculateNumEncounters = (): any[] => { let encounterRate = baseSpawnWeight; // BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT const numEncounters = [0, 0, 0, 0]; + const encountersByBiome = new Map(biomes.map(b => [b, 0])); + const validMEfloorsByBiome = new Map(biomes.map(b => [b, 0])); let currentBiome = Biome.TOWN; let currentArena = scene.newArena(currentBiome); + scene.setSeed(Utils.randomString(24)); + scene.resetSeed(); for (let i = 10; i < 180; i++) { // Boss if (i % 10 === 0) { @@ -748,10 +757,17 @@ export function calculateMEAggregateStats(scene: BattleScene, baseSpawnWeight: n let biomes: Biome[]; scene.executeWithSeedOffset(() => { biomes = (biomeLinks[currentBiome] as (Biome | [Biome, integer])[]) - .filter(b => !Array.isArray(b) || !Utils.randSeedInt(b[1])) + .filter(b => { + return !Array.isArray(b) || !Utils.randSeedInt(b[1]); + }) .map(b => !Array.isArray(b) ? b : b[0]); - }, i); - currentBiome = biomes[Utils.randSeedInt(biomes.length)]; + }, i * 100); + const specialBiomes = biomes.filter(b => alwaysPickTheseBiomes.includes(b)); + if (specialBiomes.length > 0) { + currentBiome = specialBiomes[Utils.randSeedInt(specialBiomes.length)]; + } else { + currentBiome = biomes[Utils.randSeedInt(biomes.length)]; + } } else if (biomeLinks.hasOwnProperty(currentBiome)) { currentBiome = (biomeLinks[currentBiome] as Biome); } else { @@ -778,6 +794,7 @@ export function calculateMEAggregateStats(scene: BattleScene, baseSpawnWeight: n // Otherwise, roll encounter const roll = Utils.randSeedInt(256); + validMEfloorsByBiome.set(Biome[currentBiome], validMEfloorsByBiome.get(Biome[currentBiome]) + 1); // If total number of encounters is lower than expected for the run, slightly favor a new encounter // Do the reverse as well @@ -803,31 +820,63 @@ export function calculateMEAggregateStats(scene: BattleScene, baseSpawnWeight: n const rareThreshold = totalWeight - tierWeights[0] - tierWeights[1] - tierWeights[2]; // 64 - 32 - 16 - 10 = 6 tierValue > commonThreshold ? ++numEncounters[0] : tierValue > uncommonThreshold ? ++numEncounters[1] : tierValue > rareThreshold ? ++numEncounters[2] : ++numEncounters[3]; + encountersByBiome.set(Biome[currentBiome], encountersByBiome.get(Biome[currentBiome]) + 1); } else { - encounterRate += WIGHT_INCREMENT_ON_SPAWN_MISS; + encounterRate += WEIGHT_INCREMENT_ON_SPAWN_MISS; } } - return numEncounters; + return [numEncounters, encountersByBiome, validMEfloorsByBiome]; }; - const runs = []; + const encounterRuns: number[][] = []; + const encountersByBiomeRuns: Map[] = []; + const validFloorsByBiome: Map[] = []; while (run < numRuns) { scene.executeWithSeedOffset(() => { - const numEncounters = calculateNumEncounters(); - runs.push(numEncounters); + const [numEncounters, encountersByBiome, validMEfloorsByBiome] = calculateNumEncounters(); + encounterRuns.push(numEncounters); + encountersByBiomeRuns.push(encountersByBiome); + validFloorsByBiome.push(validMEfloorsByBiome); }, 1000 * run); run++; } - const n = runs.length; - const totalEncountersInRun = runs.map(run => run.reduce((a, b) => a + b)); + const n = encounterRuns.length; + const totalEncountersInRun = encounterRuns.map(run => run.reduce((a, b) => a + b)); const totalMean = totalEncountersInRun.reduce((a, b) => a + b) / n; const totalStd = Math.sqrt(totalEncountersInRun.map(x => Math.pow(x - totalMean, 2)).reduce((a, b) => a + b) / n); - const commonMean = runs.reduce((a, b) => a + b[0], 0) / n; - const uncommonMean = runs.reduce((a, b) => a + b[1], 0) / n; - const rareMean = runs.reduce((a, b) => a + b[2], 0) / n; - const superRareMean = runs.reduce((a, b) => a + b[3], 0) / n; + const commonMean = encounterRuns.reduce((a, b) => a + b[0], 0) / n; + const uncommonMean = encounterRuns.reduce((a, b) => a + b[1], 0) / n; + const rareMean = encounterRuns.reduce((a, b) => a + b[2], 0) / n; + const superRareMean = encounterRuns.reduce((a, b) => a + b[3], 0) / n; - console.log(`Starting weight: ${baseSpawnWeight}\nAverage MEs per run: ${totalMean}\nStandard Deviation: ${totalStd}\nAvg Commons: ${commonMean}\nAvg Uncommons: ${uncommonMean}\nAvg Rares: ${rareMean}\nAvg Super Rares: ${superRareMean}`); + const encountersPerRunPerBiome = encountersByBiomeRuns.reduce((a, b) => { + for (const biome of a.keys()) { + a.set(biome, a.get(biome) + b.get(biome)); + } + return a; + }); + const meanEncountersPerRunPerBiome: Map = new Map(); + encountersPerRunPerBiome.forEach((value, key) => { + meanEncountersPerRunPerBiome.set(key, value / n); + }); + + const validMEFloorsPerRunPerBiome = validFloorsByBiome.reduce((a, b) => { + for (const biome of a.keys()) { + a.set(biome, a.get(biome) + b.get(biome)); + } + return a; + }); + const meanMEFloorsPerRunPerBiome: Map = new Map(); + validMEFloorsPerRunPerBiome.forEach((value, key) => { + meanMEFloorsPerRunPerBiome.set(key, value / n); + }); + + let stats = `Starting weight: ${baseSpawnWeight}\nAverage MEs per run: ${totalMean}\nStandard Deviation: ${totalStd}\nAvg Commons: ${commonMean}\nAvg Greats: ${uncommonMean}\nAvg Ultras: ${rareMean}\nAvg Rogues: ${superRareMean}\n`; + + const meanEncountersPerRunPerBiomeSorted = [...meanEncountersPerRunPerBiome.entries()].sort((e1, e2) => e2[1] - e1[1]); + meanEncountersPerRunPerBiomeSorted.forEach(value => stats = stats + `${value[0]}: avg valid floors ${meanMEFloorsPerRunPerBiome.get(value[0])}, avg MEs ${value[1]},\n`); + + console.log(stats); } diff --git a/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts b/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts index 3510fe37e09..43e25793f86 100644 --- a/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts @@ -386,7 +386,7 @@ function failCatch(scene: BattleScene, pokemon: EnemyPokemon, originalY: number, }); } -export async function catchPokemon(scene: BattleScene, pokemon: EnemyPokemon, pokeball: Phaser.GameObjects.Sprite, pokeballType: PokeballType): Promise { +export async function catchPokemon(scene: BattleScene, pokemon: EnemyPokemon, pokeball: Phaser.GameObjects.Sprite, pokeballType: PokeballType, isObtain: boolean = false): Promise { scene.unshiftPhase(new VictoryPhase(scene, BattlerIndex.ENEMY)); const speciesForm = !pokemon.fusionSpecies ? pokemon.getSpeciesForm() : pokemon.getFusionSpeciesForm(); @@ -412,14 +412,16 @@ export async function catchPokemon(scene: BattleScene, pokemon: EnemyPokemon, po scene.gameData.updateSpeciesDexIvs(pokemon.species.getRootSpeciesId(true), pokemon.ivs); return new Promise(resolve => { - scene.ui.showText(i18next.t("battle:pokemonCaught", { pokemonName: pokemon.name }), null, () => { + scene.ui.showText(i18next.t(isObtain ? "battle:pokemonObtained" : "battle:pokemonCaught", { pokemonName: pokemon.name }), null, () => { const end = () => { scene.pokemonInfoContainer.hide(); removePb(scene, pokeball); resolve(); }; const removePokemon = () => { - scene.field.remove(pokemon, true); + if (pokemon) { + scene.field.remove(pokemon, true); + } }; const addToParty = () => { const newPokemon = pokemon.addToParty(pokeballType); @@ -470,14 +472,18 @@ export async function catchPokemon(scene: BattleScene, pokemon: EnemyPokemon, po } function removePb(scene: BattleScene, pokeball: Phaser.GameObjects.Sprite) { - scene.tweens.add({ - targets: pokeball, - duration: 250, - delay: 250, - ease: "Sine.easeIn", - alpha: 0, - onComplete: () => pokeball.destroy() - }); + if (pokeball) { + scene.tweens.add({ + targets: pokeball, + duration: 250, + delay: 250, + ease: "Sine.easeIn", + alpha: 0, + onComplete: () => { + pokeball.destroy(); + } + }); + } } export async function doPokemonFlee(scene: BattleScene, pokemon: EnemyPokemon): Promise { diff --git a/src/field/mystery-encounter-intro.ts b/src/field/mystery-encounter-intro.ts index 84f6488c439..620265c0edb 100644 --- a/src/field/mystery-encounter-intro.ts +++ b/src/field/mystery-encounter-intro.ts @@ -17,6 +17,13 @@ type KnownFileRoot = | "mystery-encounters" | "pokeball" | "pokemon" + | "pokemon/back" + | "pokemon/exp" + | "pokemon/female" + | "pokemon/icons" + | "pokemon/input" + | "pokemon/shiny" + | "pokemon/variant" | "statuses" | "trainer" | "ui"; @@ -25,7 +32,7 @@ export class MysteryEncounterSpriteConfig { /** The sprite key (which is the image file name). e.g. "ace_trainer_f" */ spriteKey: string; /** Refer to [/public/images](../../public/images) directorty for all folder names */ - fileRoot: KnownFileRoot & string; + fileRoot: KnownFileRoot & string | string; /** Enable shadow. Defaults to `false` */ hasShadow?: boolean = false; /** Disable animation. Defaults to `false` */ @@ -44,6 +51,8 @@ export class MysteryEncounterSpriteConfig { yShadow?: number; /** Sprite scale. `0` - `n` */ scale?: number; + /** If you are using a Pokemon sprite, set to `true`. This will ensure variant, form, gender, shiny sprites are loaded properly */ + isPokemon?: boolean; /** If you are using an item sprite, set to `true` */ isItem?: boolean; /** The sprites alpha. `0` - `1` The lower the number, the more transparent */ @@ -155,10 +164,12 @@ export default class MysteryEncounterIntroVisuals extends Phaser.GameObjects.Con } this.spriteConfigs.forEach((config) => { - if (!config.isItem) { - this.scene.loadAtlas(config.spriteKey, config.fileRoot); - } else { + if (config.isPokemon) { + this.scene.loadPokemonAtlas(config.spriteKey, config.fileRoot); + } else if (config.isItem) { this.scene.loadAtlas("items", ""); + } else { + this.scene.loadAtlas(config.spriteKey, config.fileRoot); } }); diff --git a/src/loading-scene.ts b/src/loading-scene.ts index 1ce8ed87156..3b62e1dc983 100644 --- a/src/loading-scene.ts +++ b/src/loading-scene.ts @@ -273,6 +273,8 @@ export class LoadingScene extends SceneBase { this.loadAtlas("xbox", "inputs"); this.loadAtlas("keyboard", "inputs"); + this.loadAtlas("encounter_radar", "mystery-encounters"); + this.loadSe("select"); this.loadSe("menu_open"); this.loadSe("hit"); diff --git a/src/locales/en/battle.ts b/src/locales/en/battle.ts index 6deaf4496a0..d4dfb9ba525 100644 --- a/src/locales/en/battle.ts +++ b/src/locales/en/battle.ts @@ -16,6 +16,7 @@ export const battle: SimpleTranslationEntries = { "moneyWon": "You got\n₽{{moneyAmount}} for winning!", "moneyPickedUp": "You picked up ₽{{moneyAmount}}!", "pokemonCaught": "{{pokemonName}} was caught!", + "pokemonObtained": "You got {{pokemonName}}!", "pokemonBrokeFree": "Oh no!\nThe Pokémon broke free!", "pokemonFled": "The wild {{pokemonName}} fled!", "playerFled": "You fled from the {{pokemonName}}!", diff --git a/src/locales/en/mystery-encounter.ts b/src/locales/en/mystery-encounter.ts index a280ae1cc39..f58f18dd65a 100644 --- a/src/locales/en/mystery-encounter.ts +++ b/src/locales/en/mystery-encounter.ts @@ -33,6 +33,7 @@ export const mysteryEncounter = { // General use content "paid_money": "You paid ₽{{amount, number}}.", "receive_money": "You received ₽{{amount, number}}!", + "affects_pokedex": "Affects Pokédex Data", mysteriousChallengers: mysteriousChallengersDialogue, mysteriousChest: mysteriousChestDialogue, diff --git a/src/locales/en/mystery-encounters/pokemon-salesman-dialogue.ts b/src/locales/en/mystery-encounters/pokemon-salesman-dialogue.ts index 7645f96d696..d35e3947a42 100644 --- a/src/locales/en/mystery-encounters/pokemon-salesman-dialogue.ts +++ b/src/locales/en/mystery-encounters/pokemon-salesman-dialogue.ts @@ -1,19 +1,20 @@ export const pokemonSalesmanDialogue = { intro: "A chipper elderly man approaches you.", speaker: "Gentleman", - intro_dialogue: "Hello there! Have I got a deal just for YOU!{{specialShinyText}}", + intro_dialogue: "Hello there! Have I got a deal just for YOU!", title: "The Pokémon Salesman", - description: "\"This {{purchasePokemon}} is extremely unique, and carries an ability not normally found on its species! I'll let you have this swell {{purchasePokemon}} for just {{money, money}}!\"\n\n\"What do you say?\"", + description: "\"This {{purchasePokemon}} is extremely unique and carries an ability not normally found in its species! I'll let you have this swell {{purchasePokemon}} for just {{price, money}}!\"\n\n\"What do you say?\"", + description_shiny: "\"This {{purchasePokemon}} is extremely unique and has a pigment not normally found in its species! I'll let you have this swell {{purchasePokemon}} for just {{price, money}}!\"\n\n\"What do you say?\"", query: "What will you do?", - shiny: "$I have SUPER amazing Pokémon that\nanyone would be dying to get!", option: { 1: { label: "Accept", - tooltip: "(-) Pay {{money, money}}\n(+) Gain a {{purchasePokemon}} with its Hidden Ability (also saved in Pokédex data)", - selected_dialogue: `Excellent choice! - $I can see you've a keen eye for business.`, + 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_2: "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", diff --git a/src/locales/en/mystery-encounters/training-session-dialogue.ts b/src/locales/en/mystery-encounters/training-session-dialogue.ts index 4e2ce979935..66e9d7c9498 100644 --- a/src/locales/en/mystery-encounters/training-session-dialogue.ts +++ b/src/locales/en/mystery-encounters/training-session-dialogue.ts @@ -3,6 +3,7 @@ export const trainingSessionDialogue = { title: "Training Session", description: "These supplies look like they could be used to train a member of your party! There are a few ways you could train your Pokémon, by battling against it with the rest of your team.", query: "How should you train?", + invalid_selection: "Pokémon must be healthy enough.", option: { 1: { label: "Light Training", diff --git a/src/overrides.ts b/src/overrides.ts index e19a5bf20dd..e2d3c73f76d 100644 --- a/src/overrides.ts +++ b/src/overrides.ts @@ -117,9 +117,9 @@ export const EGG_GACHA_PULL_COUNT_OVERRIDE: number = 0; */ // 1 to 256, set to null to ignore -export const MYSTERY_ENCOUNTER_RATE_OVERRIDE: number = null; +export const MYSTERY_ENCOUNTER_RATE_OVERRIDE: number = 256; export const MYSTERY_ENCOUNTER_TIER_OVERRIDE: MysteryEncounterTier = null; -export const MYSTERY_ENCOUNTER_OVERRIDE: MysteryEncounterType = null; +export const MYSTERY_ENCOUNTER_OVERRIDE: MysteryEncounterType = MysteryEncounterType.POKEMON_SALESMAN; /** * MODIFIER / ITEM OVERRIDES diff --git a/src/ui/mystery-encounter-ui-handler.ts b/src/ui/mystery-encounter-ui-handler.ts index 72cce41d55f..e6bcbfd697c 100644 --- a/src/ui/mystery-encounter-ui-handler.ts +++ b/src/ui/mystery-encounter-ui-handler.ts @@ -13,6 +13,7 @@ import { getPokeballAtlasKey } from "../data/pokeball"; import { OptionSelectSettings } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { getEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; import { MysteryEncounterTier } from "#app/data/mystery-encounters/mystery-encounter"; +import i18next from "i18next"; export default class MysteryEncounterUiHandler extends UiHandler { private cursorContainer: Phaser.GameObjects.Container; @@ -29,6 +30,10 @@ export default class MysteryEncounterUiHandler extends UiHandler { private descriptionScrollTween: Phaser.Tweens.Tween; private rarityBall: Phaser.GameObjects.Sprite; + private dexProgressWindow: Phaser.GameObjects.NineSlice; + private dexProgressContainer: Phaser.GameObjects.Container; + private showDexProgress: boolean = false; + private overrideSettings: OptionSelectSettings; private encounterOptions: MysteryEncounterOption[] = []; private optionsMeetsReqs: boolean[]; @@ -50,6 +55,9 @@ export default class MysteryEncounterUiHandler extends UiHandler { this.optionsContainer = this.scene.add.container(12, -38.7); this.optionsContainer.setVisible(false); ui.add(this.optionsContainer); + this.dexProgressContainer = this.scene.add.container(214, -43); + this.dexProgressContainer.setVisible(false); + ui.add(this.dexProgressContainer); this.descriptionContainer = this.scene.add.container(0, -152); this.descriptionContainer.setVisible(false); ui.add(this.descriptionContainer); @@ -65,9 +73,23 @@ export default class MysteryEncounterUiHandler extends UiHandler { this.tooltipWindow = addWindow(this.scene, 0, 0, 110, 48, false, false, 0, 0, WindowVariant.THIN); this.tooltipContainer.add(this.tooltipWindow); + this.dexProgressWindow = addWindow(this.scene, 0, 0, 24, 28, false, false, 0, 0, WindowVariant.THIN); + this.dexProgressContainer.add(this.dexProgressWindow); + this.rarityBall = this.scene.add.sprite(141, 9, "pb"); this.rarityBall.setScale(0.75); this.descriptionContainer.add(this.rarityBall); + + const dexProgressIndicator = this.scene.add.sprite(12, 9, "encounter_radar"); + dexProgressIndicator.setScale(0.85); + this.dexProgressContainer.add(dexProgressIndicator); + this.dexProgressContainer.setInteractive(new Phaser.Geom.Rectangle(0, 0, 24, 28), Phaser.Geom.Rectangle.Contains); + this.dexProgressContainer.on("pointerover", () => { + (this.scene as BattleScene).ui.showTooltip(null, i18next.t("mysteryEncounter:affects_pokedex"), true); + }); + this.dexProgressContainer.on("pointerout", () => { + (this.scene as BattleScene).ui.hideTooltip(); + }); } show(args: any[]): boolean { @@ -81,6 +103,7 @@ export default class MysteryEncounterUiHandler extends UiHandler { this.cursorContainer.setVisible(true); this.descriptionContainer.setVisible(showDescriptionContainer); this.optionsContainer.setVisible(true); + this.dexProgressContainer.setVisible(true); this.displayEncounterOptions(slideInDescription); const cursor = this.getCursor(); if (cursor === (this?.optionsContainer?.length || 0) - 1) { @@ -317,7 +340,7 @@ export default class MysteryEncounterUiHandler extends UiHandler { const queryText: string = getEncounterText(this.scene, mysteryEncounter.dialogue.encounterOptionsDialogue.query, TextStyle.TOOLTIP_CONTENT); // Clear options container (except cursor) - this.optionsContainer.removeAll(); + this.optionsContainer.removeAll(true); // Options Window for (let i = 0; i < this.encounterOptions.length; i++) { @@ -437,6 +460,8 @@ export default class MysteryEncounterUiHandler extends UiHandler { if (isNullOrUndefined(cursor) || cursor > this.optionsContainer.length - 2) { // Ignore hovers on view party button + // Hide dex progress if visible + this.showHideDexProgress(false); return; } @@ -487,6 +512,13 @@ export default class MysteryEncounterUiHandler extends UiHandler { }); } } + + // Dex progress indicator + if (cursorOption.hasDexProgress && !this.showDexProgress) { + this.showHideDexProgress(true); + } else if (!cursorOption.hasDexProgress) { + this.showHideDexProgress(false); + } } clear(): void { @@ -494,6 +526,7 @@ export default class MysteryEncounterUiHandler extends UiHandler { this.overrideSettings = null; this.optionsContainer.setVisible(false); this.optionsContainer.removeAll(true); + this.dexProgressContainer.setVisible(false); this.descriptionContainer.setVisible(false); this.tooltipContainer.setVisible(false); // Keeps container background and pokeball @@ -508,4 +541,30 @@ export default class MysteryEncounterUiHandler extends UiHandler { } this.cursorObj = null; } + + /** + * + * @param show - if true does show, if false does hide + */ + showHideDexProgress(show: boolean) { + if (show && !this.showDexProgress) { + this.showDexProgress = true; + this.scene.tweens.killTweensOf(this.dexProgressContainer); + this.scene.tweens.add({ + targets: this.dexProgressContainer, + y: -63, + ease: "Sine.easeInOut", + duration: 750 + }); + } else if (!show && this.showDexProgress) { + this.showDexProgress = false; + this.scene.tweens.killTweensOf(this.dexProgressContainer); + this.scene.tweens.add({ + targets: this.dexProgressContainer, + y: -43, + ease: "Sine.easeInOut", + duration: 750, + }); + } + } } From 0c45194892247280b3486975f2d2e921844a665f Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Mon, 22 Jul 2024 16:10:26 -0400 Subject: [PATCH 211/270] add unit tests for pokemon salesman --- .../encounters/pokemon-salesman-encounter.ts | 6 +- .../utils/encounter-phase-utils.ts | 1 + src/field/mystery-encounter-intro.ts | 3 + src/loading-scene.ts | 2 - src/overrides.ts | 4 +- .../pokemon-salesman-encounter.test.ts | 171 ++++++++++++++++++ .../the-strong-stuff-encounter.test.ts | 5 +- .../mystery-encounter-utils.test.ts | 2 +- .../utils/mocks/mocksContainer/mockText.ts | 8 + 9 files changed, 193 insertions(+), 9 deletions(-) create mode 100644 src/test/mystery-encounter/encounters/pokemon-salesman-encounter.test.ts diff --git a/src/data/mystery-encounters/encounters/pokemon-salesman-encounter.ts b/src/data/mystery-encounters/encounters/pokemon-salesman-encounter.ts index 8ba7b08feaa..9c8ee2ac91c 100644 --- a/src/data/mystery-encounters/encounters/pokemon-salesman-encounter.ts +++ b/src/data/mystery-encounters/encounters/pokemon-salesman-encounter.ts @@ -94,7 +94,7 @@ export const PokemonSalesmanEncounter: IMysteryEncounter = encounter.setDialogueToken("purchasePokemon", pokemon.name); encounter.setDialogueToken("price", price.toString()); encounter.misc = { - money: price, + price: price, pokemon: pokemon }; @@ -118,11 +118,11 @@ export const PokemonSalesmanEncounter: IMysteryEncounter = }) .withOptionPhase(async (scene: BattleScene) => { const encounter = scene.currentBattle.mysteryEncounter; - const cost = encounter.misc.money; + const price = encounter.misc.price; const purchasedPokemon = encounter.misc.pokemon as PlayerPokemon; // Update money - updatePlayerMoney(scene, -cost, true, false); + updatePlayerMoney(scene, -price, true, false); // Show dialogue await showEncounterDialogue(scene, `${namespace}:option:1:selected_dialogue`, `${namespace}:speaker`); diff --git a/src/data/mystery-encounters/utils/encounter-phase-utils.ts b/src/data/mystery-encounters/utils/encounter-phase-utils.ts index 37dcca3e412..9178747500f 100644 --- a/src/data/mystery-encounters/utils/encounter-phase-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-phase-utils.ts @@ -316,6 +316,7 @@ export function initCustomMovesForEncounter(scene: BattleScene, moves: Moves | M * @param scene - Battle Scene * @param changeValue * @param playSound + * @param showMessage */ export function updatePlayerMoney(scene: BattleScene, changeValue: number, playSound: boolean = true, showMessage: boolean = true) { scene.money = Math.min(Math.max(scene.money + changeValue, 0), Number.MAX_SAFE_INTEGER); diff --git a/src/field/mystery-encounter-intro.ts b/src/field/mystery-encounter-intro.ts index 620265c0edb..d97c267b095 100644 --- a/src/field/mystery-encounter-intro.ts +++ b/src/field/mystery-encounter-intro.ts @@ -173,6 +173,9 @@ export default class MysteryEncounterIntroVisuals extends Phaser.GameObjects.Con } }); + // Load dex progress icon + this.scene.loadAtlas("encounter_radar", "mystery-encounters"); + this.scene.load.once(Phaser.Loader.Events.COMPLETE, () => { this.spriteConfigs.every((config) => { if (config.isItem) { diff --git a/src/loading-scene.ts b/src/loading-scene.ts index 3b62e1dc983..1ce8ed87156 100644 --- a/src/loading-scene.ts +++ b/src/loading-scene.ts @@ -273,8 +273,6 @@ export class LoadingScene extends SceneBase { this.loadAtlas("xbox", "inputs"); this.loadAtlas("keyboard", "inputs"); - this.loadAtlas("encounter_radar", "mystery-encounters"); - this.loadSe("select"); this.loadSe("menu_open"); this.loadSe("hit"); diff --git a/src/overrides.ts b/src/overrides.ts index e2d3c73f76d..e19a5bf20dd 100644 --- a/src/overrides.ts +++ b/src/overrides.ts @@ -117,9 +117,9 @@ export const EGG_GACHA_PULL_COUNT_OVERRIDE: number = 0; */ // 1 to 256, set to null to ignore -export const MYSTERY_ENCOUNTER_RATE_OVERRIDE: number = 256; +export const MYSTERY_ENCOUNTER_RATE_OVERRIDE: number = null; export const MYSTERY_ENCOUNTER_TIER_OVERRIDE: MysteryEncounterTier = null; -export const MYSTERY_ENCOUNTER_OVERRIDE: MysteryEncounterType = MysteryEncounterType.POKEMON_SALESMAN; +export const MYSTERY_ENCOUNTER_OVERRIDE: MysteryEncounterType = null; /** * MODIFIER / ITEM OVERRIDES diff --git a/src/test/mystery-encounter/encounters/pokemon-salesman-encounter.test.ts b/src/test/mystery-encounter/encounters/pokemon-salesman-encounter.test.ts new file mode 100644 index 00000000000..c3045b599eb --- /dev/null +++ b/src/test/mystery-encounter/encounters/pokemon-salesman-encounter.test.ts @@ -0,0 +1,171 @@ +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 Battle from "#app/battle"; +import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { EncounterOptionMode } from "#app/data/mystery-encounters/mystery-encounter-option"; +import { runSelectMysteryEncounterOption } from "#test/mystery-encounter/encounterTestUtils"; +import BattleScene from "#app/battle-scene"; +import { MysteryEncounterTier } from "#app/data/mystery-encounters/mystery-encounter"; +import { PlayerPokemon } from "#app/field/pokemon"; +import { HUMAN_TRANSITABLE_BIOMES } from "#app/data/mystery-encounters/mystery-encounters"; +import { PokemonSalesmanEncounter } from "#app/data/mystery-encounters/encounters/pokemon-salesman-encounter"; + +const namespace = "mysteryEncounter:pokemonSalesman"; +const defaultParty = [Species.LAPRAS, Species.GENGAR, Species.ABRA]; +const defaultBiome = Biome.CAVE; +const defaultWave = 45; + +describe("The Pokemon Salesman - 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.mysteryEncounterTier(MysteryEncounterTier.COMMON); + game.override.startingWave(defaultWave); + game.override.startingBiome(defaultBiome); + + const biomeMap = new Map([ + [Biome.VOLCANO, [MysteryEncounterType.MYSTERIOUS_CHALLENGERS]], + ]); + HUMAN_TRANSITABLE_BIOMES.forEach(biome => { + biomeMap.set(biome, [MysteryEncounterType.POKEMON_SALESMAN]); + }); + vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue(biomeMap); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + vi.clearAllMocks(); + vi.resetAllMocks(); + }); + + it("should have the correct properties", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.POKEMON_SALESMAN, defaultParty); + + expect(PokemonSalesmanEncounter.encounterType).toBe(MysteryEncounterType.POKEMON_SALESMAN); + expect(PokemonSalesmanEncounter.encounterTier).toBe(MysteryEncounterTier.ULTRA); + expect(PokemonSalesmanEncounter.dialogue).toBeDefined(); + expect(PokemonSalesmanEncounter.dialogue.intro).toStrictEqual([ + { text: `${namespace}:intro` }, + { speaker: "mysteryEncounter:pokemonSalesman:speaker", text: "mysteryEncounter:pokemonSalesman:intro_dialogue" } + ]); + expect(PokemonSalesmanEncounter.dialogue.encounterOptionsDialogue.title).toBe(`${namespace}:title`); + expect(PokemonSalesmanEncounter.dialogue.encounterOptionsDialogue.description).toBe(`${namespace}:description`); + expect(PokemonSalesmanEncounter.dialogue.encounterOptionsDialogue.query).toBe(`${namespace}:query`); + expect(PokemonSalesmanEncounter.options.length).toBe(2); + }); + + it("should not spawn outside of HUMAN_TRANSITABLE_BIOMES", async () => { + game.override.startingBiome(Biome.VOLCANO); + await game.runToMysteryEncounter(); + + expect(scene.currentBattle?.mysteryEncounter?.encounterType).not.toBe(MysteryEncounterType.POKEMON_SALESMAN); + }); + + it("should not run below wave 10", async () => { + game.override.startingWave(9); + + await game.runToMysteryEncounter(); + + expect(scene.currentBattle?.mysteryEncounter?.encounterType).not.toBe(MysteryEncounterType.POKEMON_SALESMAN); + }); + + 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 () => { + vi.spyOn(scene, "currentBattle", "get").mockReturnValue({ mysteryEncounter: PokemonSalesmanEncounter } as Battle); + + const { onInit } = PokemonSalesmanEncounter; + + expect(PokemonSalesmanEncounter.onInit).toBeDefined(); + + const onInitResult = onInit(scene); + + expect(PokemonSalesmanEncounter.dialogueTokens?.purchasePokemon).toBeDefined(); + expect(PokemonSalesmanEncounter.dialogueTokens?.price).toBeDefined(); + expect(PokemonSalesmanEncounter.misc.pokemon instanceof PlayerPokemon).toBeTruthy(); + expect(PokemonSalesmanEncounter.misc?.price?.toString()).toBe(PokemonSalesmanEncounter.dialogueTokens?.price); + expect(onInitResult).toBe(true); + }); + + describe("Option 1 - Purchase the pokemon", () => { + it("should have the correct properties", () => { + const option1 = PokemonSalesmanEncounter.options[0]; + expect(option1.optionMode).toBe(EncounterOptionMode.DEFAULT_OR_SPECIAL); + expect(option1.dialogue).toBeDefined(); + expect(option1.dialogue).toStrictEqual({ + buttonLabel: `${namespace}:option:1:label`, + buttonTooltip: `${namespace}:option:1:tooltip`, + selected: [ + { + text: `${namespace}:option:1:selected_message`, + }, + ], + }); + }); + + it("Should update the player's money properly", async () => { + const initialMoney = 20000; + scene.money = initialMoney; + const updateMoneySpy = vi.spyOn(EncounterPhaseUtils, "updatePlayerMoney"); + + await game.runToMysteryEncounter(MysteryEncounterType.POKEMON_SALESMAN, defaultParty); + await runSelectMysteryEncounterOption(game, 1); + + const price = scene.currentBattle.mysteryEncounter.misc.price; + + expect(updateMoneySpy).toHaveBeenCalledWith(scene, -price, true, false); + expect(scene.money).toBe(initialMoney - price); + }); + + it("Should add the Pokemon to the party", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.POKEMON_SALESMAN, defaultParty); + + const initialPartySize = scene.getParty().length; + const pokemonName = scene.currentBattle.mysteryEncounter.misc.pokemon.name; + + await runSelectMysteryEncounterOption(game, 1); + + expect(scene.getParty().length).toBe(initialPartySize + 1); + expect(scene.getParty().find(p => p.name === pokemonName) instanceof PlayerPokemon).toBeTruthy(); + }); + + it("should leave encounter without battle", async () => { + const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); + + await game.runToMysteryEncounter(MysteryEncounterType.POKEMON_SALESMAN, defaultParty); + await runSelectMysteryEncounterOption(game, 1); + + expect(leaveEncounterWithoutBattleSpy).toBeCalled(); + }); + }); + + describe("Option 2 - Leave", () => { + it("should leave encounter without battle", async () => { + const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); + + await game.runToMysteryEncounter(MysteryEncounterType.POKEMON_SALESMAN, defaultParty); + await runSelectMysteryEncounterOption(game, 2); + + expect(leaveEncounterWithoutBattleSpy).toBeCalled(); + }); + }); +}); 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 ed15380b8c9..b57683d3165 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 @@ -22,6 +22,7 @@ import { BattlerTagType } from "#enums/battler-tag-type"; import { PokemonMove } from "#app/field/pokemon"; import { Mode } from "#app/ui/ui"; import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; +import { PokemonBaseStatTotalModifier } from "#app/modifier/modifier"; const namespace = "mysteryEncounter:theStrongStuff"; const defaultParty = [Species.LAPRAS, Species.GENGAR, Species.ABRA]; @@ -153,7 +154,9 @@ describe("The Strong Stuff - Mystery Encounter", () => { await runSelectMysteryEncounterOption(game, 1); const bstsAfter = scene.getParty().map(p => { - return p.getSpeciesForm().getBaseStatTotal(); + const baseStats = p.getSpeciesForm().baseStats.slice(0); + scene.applyModifiers(PokemonBaseStatTotalModifier, true, p, baseStats); + return baseStats.reduce((a, b) => a + b); }); expect(bstsAfter[0]).toEqual(bstsPrior[0] - 20 * 6); diff --git a/src/test/mystery-encounter/mystery-encounter-utils.test.ts b/src/test/mystery-encounter/mystery-encounter-utils.test.ts index cdc7eda180f..a336af41b6b 100644 --- a/src/test/mystery-encounter/mystery-encounter-utils.test.ts +++ b/src/test/mystery-encounter/mystery-encounter-utils.test.ts @@ -298,7 +298,7 @@ describe("Mystery Encounter Utils", () => { const spy = vi.spyOn(game.scene.ui, "showDialogue"); showEncounterDialogue(scene, "mysteryEncounter:unit_test_dialogue", "mysteryEncounter:unit_test_dialogue"); - expect(spy).toHaveBeenCalledWith("valuevalue {{testvalue}} {{test1}} {{test}} {{test\\}} {{test\\}} {test}}", "valuevalue {{testvalue}} {{test1}} {{test}} {{test\\}} {{test\\}} {test}}", null, undefined, 0, 0); + expect(spy).toHaveBeenCalledWith("valuevalue {{testvalue}} {{test1}} {{test}} {{test\\}} {{test\\}} {test}}", "valuevalue {{testvalue}} {{test1}} {{test}} {{test\\}} {{test\\}} {test}}", null, expect.any(Function), 0); }); }); diff --git a/src/test/utils/mocks/mocksContainer/mockText.ts b/src/test/utils/mocks/mocksContainer/mockText.ts index 2e6ed67f21f..2509c38b182 100644 --- a/src/test/utils/mocks/mocksContainer/mockText.ts +++ b/src/test/utils/mocks/mocksContainer/mockText.ts @@ -248,6 +248,14 @@ export default class MockText { }; } + disableInteractive() { + // Disables interaction with this Game Object. + } + + clearTint() { + // Clears tint on this Game Object. + } + add(obj) { // Adds a child to this Game Object. this.list.push(obj); From b9a45e0a0305183dfabb8c9de67042baca32e897 Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Tue, 23 Jul 2024 16:45:23 -0400 Subject: [PATCH 212/270] temp stash --- .../requirements/requirement-groups.ts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/data/mystery-encounters/requirements/requirement-groups.ts b/src/data/mystery-encounters/requirements/requirement-groups.ts index c4d1c592df4..df905f311db 100644 --- a/src/data/mystery-encounters/requirements/requirement-groups.ts +++ b/src/data/mystery-encounters/requirements/requirement-groups.ts @@ -1,4 +1,5 @@ import { Moves } from "#enums/moves"; +import { Abilities } from "#enums/abilities"; export const STEALING_MOVES = [ Moves.PLUCK, @@ -39,3 +40,11 @@ export const PROTECTING_MOVES = [ Moves.OBSTRUCT, Moves.DETECT ]; + +export const EXTORTION_ABILITIES = [ + Abilities.INTIMIDATE, + Abilities.ARENA_TRAP, + Abilities.SHADOW_TAG, + Abilities.SUCTION_CUPS, + Abilities.STICKY_HOLD, +]; From 065ac0e77981146fbd814add1611aaf4e312a25f Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Tue, 23 Jul 2024 20:11:45 -0400 Subject: [PATCH 213/270] add offer you can't refuse --- .../encounters/dark-deal-encounter.ts | 5 +- .../encounters/fight-or-flight-encounter.ts | 7 +- .../mysterious-challengers-encounter.ts | 4 +- .../offer-you-cant-refuse-encounter.ts | 142 ++++++++++++++++++ .../shady-vitamin-dealer-encounter.ts | 10 +- .../slumbering-snorlax-encounter.ts | 4 +- .../mystery-encounters/mystery-encounters.ts | 5 +- .../requirements/requirement-groups.ts | 23 +++ .../utils/encounter-pokemon-utils.ts | 21 +++ src/enums/mystery-encounter-type.ts | 3 +- src/locales/en/mystery-encounter.ts | 4 +- .../offer-you-cant-refuse-dialogue.ts | 34 +++++ .../shady-vitamin-dealer-dialogue.ts | 3 +- src/overrides.ts | 4 +- 14 files changed, 246 insertions(+), 23 deletions(-) create mode 100644 src/data/mystery-encounters/encounters/offer-you-cant-refuse-encounter.ts create mode 100644 src/locales/en/mystery-encounters/offer-you-cant-refuse-dialogue.ts diff --git a/src/data/mystery-encounters/encounters/dark-deal-encounter.ts b/src/data/mystery-encounters/encounters/dark-deal-encounter.ts index 1aba405745a..16c125806b2 100644 --- a/src/data/mystery-encounters/encounters/dark-deal-encounter.ts +++ b/src/data/mystery-encounters/encounters/dark-deal-encounter.ts @@ -4,8 +4,7 @@ import { isNullOrUndefined, randSeedInt } from "#app/utils"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { Species } from "#enums/species"; import BattleScene from "../../../battle-scene"; -import { AddPokeballModifierType } from "#app/modifier/modifier-type"; -import { PokeballType } from "../../pokeball"; +import { modifierTypes } from "#app/modifier/modifier-type"; import { getPokemonSpecies } from "../../pokemon-species"; import IMysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier, } from "../mystery-encounter"; import { EncounterOptionMode, MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; @@ -138,7 +137,7 @@ export const DarkDealEncounter: IMysteryEncounter = }) .withOptionPhase(async (scene: BattleScene) => { // Give the player 5 Rogue Balls - scene.unshiftPhase(new ModifierRewardPhase(scene, () => new AddPokeballModifierType("rb", PokeballType.ROGUE_BALL, 5))); + scene.unshiftPhase(new ModifierRewardPhase(scene, modifierTypes.ROGUE_BALL)); // Start encounter with random legendary (7-10 starter strength) that has level additive const bossTypes = scene.currentBattle.mysteryEncounter.misc as Type[]; 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 5e7d3704fc0..ad693d457d9 100644 --- a/src/data/mystery-encounters/encounters/fight-or-flight-encounter.ts +++ b/src/data/mystery-encounters/encounters/fight-or-flight-encounter.ts @@ -3,7 +3,7 @@ import { EncounterOptionMode, MysteryEncounterOptionBuilder } from "#app/data/my import { EnemyPartyConfig, initBattleWithEnemyConfig, - leaveEncounterWithoutBattle, + leaveEncounterWithoutBattle, setEncounterExp, setEncounterRewards } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { STEALING_MOVES } from "#app/data/mystery-encounters/requirements/requirement-groups"; @@ -38,9 +38,7 @@ const namespace = "mysteryEncounter:fightOrFlight"; * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ export const FightOrFlightEncounter: IMysteryEncounter = - MysteryEncounterBuilder.withEncounterType( - MysteryEncounterType.FIGHT_OR_FLIGHT - ) + MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.FIGHT_OR_FLIGHT) .withEncounterTier(MysteryEncounterTier.COMMON) .withSceneWaveRangeRequirement(10, 180) // waves 10 to 180 .withCatchAllowed(true) @@ -151,6 +149,7 @@ export const FightOrFlightEncounter: IMysteryEncounter = if (primaryPokemon) { // Use primaryPokemon to execute the thievery await showEncounterText(scene, `${namespace}:option:2:special_result`); + setEncounterExp(scene, primaryPokemon.id, encounter.enemyPartyConfigs[0].pokemonConfigs[0].species.baseExp, true); leaveEncounterWithoutBattle(scene); return; } diff --git a/src/data/mystery-encounters/encounters/mysterious-challengers-encounter.ts b/src/data/mystery-encounters/encounters/mysterious-challengers-encounter.ts index f18d7655936..76bbc58a9d9 100644 --- a/src/data/mystery-encounters/encounters/mysterious-challengers-encounter.ts +++ b/src/data/mystery-encounters/encounters/mysterious-challengers-encounter.ts @@ -29,9 +29,7 @@ const namespace = "mysteryEncounter:mysteriousChallengers"; * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ export const MysteriousChallengersEncounter: IMysteryEncounter = - MysteryEncounterBuilder.withEncounterType( - MysteryEncounterType.MYSTERIOUS_CHALLENGERS - ) + MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.MYSTERIOUS_CHALLENGERS) .withEncounterTier(MysteryEncounterTier.GREAT) .withSceneWaveRangeRequirement(10, 180) // waves 10 to 180 .withIntroSpriteConfigs([]) // These are set in onInit() diff --git a/src/data/mystery-encounters/encounters/offer-you-cant-refuse-encounter.ts b/src/data/mystery-encounters/encounters/offer-you-cant-refuse-encounter.ts new file mode 100644 index 00000000000..694acfbdb94 --- /dev/null +++ b/src/data/mystery-encounters/encounters/offer-you-cant-refuse-encounter.ts @@ -0,0 +1,142 @@ +import { leaveEncounterWithoutBattle, setEncounterExp, updatePlayerMoney, } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { modifierTypes } from "#app/modifier/modifier-type"; +import { MysteryEncounterType } from "#enums/mystery-encounter-type"; +import { Species } from "#enums/species"; +import BattleScene from "../../../battle-scene"; +import IMysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier, } from "../mystery-encounter"; +import { EncounterOptionMode, MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; +import { MoveRequirement } from "../mystery-encounter-requirements"; +import { getHighestStatTotalPlayerPokemon } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; +import { ModifierRewardPhase } from "#app/phases"; +import { EXTORTION_MOVES } from "#app/data/mystery-encounters/requirements/requirement-groups"; +import { getPokemonSpecies } from "#app/data/pokemon-species"; + +/** the i18n namespace for this encounter */ +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 For biome requirements check {@linkcode mysteryEncountersByBiome} + */ +export const OfferYouCantRefuseEncounter: IMysteryEncounter = + MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.OFFER_YOU_CANT_REFUSE) + .withEncounterTier(MysteryEncounterTier.GREAT) + .withSceneWaveRangeRequirement(10, 180) + .withScenePartySizeRequirement(2, 6) // Must have at least 2 pokemon in party + .withIntroSpriteConfigs([ + { + spriteKey: Species.LIEPARD.toString(), + fileRoot: "pokemon", + hasShadow: true, + repeat: true, + x: 0, + y: -4, + yShadow: -4 + }, + { + spriteKey: "rich_kid_m", + fileRoot: "trainer", + hasShadow: true, + x: 2, + y: 5, + yShadow: 5 + }, + ]) + .withIntroDialogue([ + { + text: `${namespace}:intro`, + }, + { + text: `${namespace}:intro_dialogue`, + speaker: `${namespace}:speaker`, + }, + ]) + .withTitle(`${namespace}:title`) + .withDescription(`${namespace}:description`) + .withQuery(`${namespace}:query`) + .withOnInit((scene: BattleScene) => { + const pokemon = getHighestStatTotalPlayerPokemon(scene, false); + const price = scene.getWaveMoneyAmount(10); + + scene.currentBattle.mysteryEncounter.setDialogueToken("strongestPokemon", pokemon.name); + scene.currentBattle.mysteryEncounter.setDialogueToken("price", price.toString()); + + // Store pokemon and price + scene.currentBattle.mysteryEncounter.misc = { + pokemon: pokemon, + price: price + }; + return true; + }) + .withOption( + new MysteryEncounterOptionBuilder() + .withOptionMode(EncounterOptionMode.DEFAULT) + .withDialogue({ + buttonLabel: `${namespace}:option:1:label`, + buttonTooltip: `${namespace}:option:1:tooltip`, + selected: [ + { + text: `${namespace}:option:1:selected`, + speaker: `${namespace}:speaker`, + }, + ], + }) + .withPreOptionPhase(async (scene: BattleScene): Promise => { + const encounter = scene.currentBattle.mysteryEncounter; + // Update money and remove pokemon from party + updatePlayerMoney(scene, encounter.misc.price); + scene.removePokemonFromPlayerParty(encounter.misc.pokemon); + return true; + }) + .withOptionPhase(async (scene: BattleScene) => { + // Give the player a Shiny charm + scene.unshiftPhase(new ModifierRewardPhase(scene, modifierTypes.SHINY_CHARM)); + leaveEncounterWithoutBattle(scene, true); + }) + .build() + ) + .withOption( + new MysteryEncounterOptionBuilder() + .withOptionMode(EncounterOptionMode.DISABLED_OR_DEFAULT) + .withPrimaryPokemonRequirement(new MoveRequirement(EXTORTION_MOVES)) + .withDialogue({ + buttonLabel: `${namespace}:option:2:label`, + buttonTooltip: `${namespace}:option:2:tooltip`, + disabledButtonTooltip: `${namespace}:option:2:tooltip_disabled`, + selected: [ + { + text: `${namespace}:option:2:selected`, + }, + ], + }) + .withOptionPhase(async (scene: BattleScene) => { + // Extort the rich kid for money + const encounter = scene.currentBattle.mysteryEncounter; + // Update money and remove pokemon from party + updatePlayerMoney(scene, encounter.misc.price); + + setEncounterExp(scene, encounter.options[1].primaryPokemon.id, getPokemonSpecies(Species.LIEPARD).baseExp, true); + + leaveEncounterWithoutBattle(scene, true); + }) + .build() + ) + .withSimpleOption( + { + buttonLabel: `${namespace}:option:3:label`, + buttonTooltip: `${namespace}:option:3:tooltip`, + selected: [ + { + speaker: `${namespace}:speaker`, + text: `${namespace}:option:2:selected`, + }, + ], + }, + async (scene: BattleScene) => { + // Leave encounter with no rewards or exp + leaveEncounterWithoutBattle(scene, true); + return true; + } + ) + .build(); 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 0325eb2f2a6..6b208cabb61 100644 --- a/src/data/mystery-encounters/encounters/shady-vitamin-dealer-encounter.ts +++ b/src/data/mystery-encounters/encounters/shady-vitamin-dealer-encounter.ts @@ -21,9 +21,7 @@ const namespace = "mysteryEncounter:shadyVitaminDealer"; * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ export const ShadyVitaminDealerEncounter: IMysteryEncounter = - MysteryEncounterBuilder.withEncounterType( - MysteryEncounterType.SHADY_VITAMIN_DEALER - ) + MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.SHADY_VITAMIN_DEALER) .withEncounterTier(MysteryEncounterTier.COMMON) .withSceneWaveRangeRequirement(10, 180) .withPrimaryPokemonStatusEffectRequirement([StatusEffect.NONE]) // Pokemon must not have status @@ -230,6 +228,12 @@ export const ShadyVitaminDealerEncounter: IMysteryEncounter = { buttonLabel: `${namespace}:option:3:label`, buttonTooltip: `${namespace}:option:3:tooltip`, + selected: [ + { + text: `${namespace}:option:3:selected`, + speaker: `${namespace}:speaker` + } + ] }, async (scene: BattleScene) => { // Leave encounter with no rewards or exp diff --git a/src/data/mystery-encounters/encounters/slumbering-snorlax-encounter.ts b/src/data/mystery-encounters/encounters/slumbering-snorlax-encounter.ts index c905e0bd222..269b4ab8c21 100644 --- a/src/data/mystery-encounters/encounters/slumbering-snorlax-encounter.ts +++ b/src/data/mystery-encounters/encounters/slumbering-snorlax-encounter.ts @@ -24,9 +24,7 @@ const namespace = "mysteryEncounter:slumberingSnorlax"; * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ export const SlumberingSnorlaxEncounter: IMysteryEncounter = - MysteryEncounterBuilder.withEncounterType( - MysteryEncounterType.SLUMBERING_SNORLAX - ) + MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.SLUMBERING_SNORLAX) .withEncounterTier(MysteryEncounterTier.GREAT) .withSceneWaveRangeRequirement(10, 180) // waves 10 to 180 .withCatchAllowed(true) diff --git a/src/data/mystery-encounters/mystery-encounters.ts b/src/data/mystery-encounters/mystery-encounters.ts index 9c26f54a128..dacce43919e 100644 --- a/src/data/mystery-encounters/mystery-encounters.ts +++ b/src/data/mystery-encounters/mystery-encounters.ts @@ -15,6 +15,7 @@ import { SafariZoneEncounter } from "#app/data/mystery-encounters/encounters/saf import { FieryFalloutEncounter } from "#app/data/mystery-encounters/encounters/fiery-fallout-encounter"; import { TheStrongStuffEncounter } from "#app/data/mystery-encounters/encounters/the-strong-stuff-encounter"; import { PokemonSalesmanEncounter } from "#app/data/mystery-encounters/encounters/pokemon-salesman-encounter"; +import { OfferYouCantRefuseEncounter } from "#app/data/mystery-encounters/encounters/offer-you-cant-refuse-encounter"; // Spawn chance: (BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT + WIGHT_INCREMENT_ON_SPAWN_MISS * ) / 256 export const BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT = 1; @@ -134,7 +135,8 @@ const nonExtremeBiomeEncounters: MysteryEncounterType[] = [ const humanTransitableBiomeEncounters: MysteryEncounterType[] = [ MysteryEncounterType.MYSTERIOUS_CHALLENGERS, MysteryEncounterType.SHADY_VITAMIN_DEALER, - MysteryEncounterType.POKEMON_SALESMAN + MysteryEncounterType.POKEMON_SALESMAN, + MysteryEncounterType.OFFER_YOU_CANT_REFUSE ]; const civilizationBiomeEncounters: MysteryEncounterType[] = [ @@ -227,6 +229,7 @@ export function initMysteryEncounters() { allMysteryEncounters[MysteryEncounterType.FIERY_FALLOUT] = FieryFalloutEncounter; allMysteryEncounters[MysteryEncounterType.THE_STRONG_STUFF] = TheStrongStuffEncounter; allMysteryEncounters[MysteryEncounterType.POKEMON_SALESMAN] = PokemonSalesmanEncounter; + allMysteryEncounters[MysteryEncounterType.OFFER_YOU_CANT_REFUSE] = OfferYouCantRefuseEncounter; // 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 df905f311db..4e9eb7ad4e5 100644 --- a/src/data/mystery-encounters/requirements/requirement-groups.ts +++ b/src/data/mystery-encounters/requirements/requirement-groups.ts @@ -41,6 +41,29 @@ export const PROTECTING_MOVES = [ Moves.DETECT ]; +export const EXTORTION_MOVES = [ + Moves.BIND, + Moves.CLAMP, + Moves.INFESTATION, + Moves.SAND_TOMB, + Moves.SNAP_TRAP, + Moves.THUNDER_CAGE, + Moves.WRAP, + Moves.SPIRIT_SHACKLE, + Moves.MEAN_LOOK, + Moves.JAW_LOCK, + Moves.BLOCK, + Moves.SPIDER_WEB, + Moves.ANCHOR_SHOT, + Moves.OCTOLOCK, + Moves.PURSUIT, + Moves.CONSTRICT, + Moves.BEAT_UP, + Moves.COIL, + Moves.WRING_OUT, + Moves.STRING_SHOT +]; + export const EXTORTION_ABILITIES = [ Abilities.INTIMIDATE, Abilities.ARENA_TRAP, diff --git a/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts b/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts index 43e25793f86..b33607c6443 100644 --- a/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts @@ -95,6 +95,27 @@ export function getLowestLevelPlayerPokemon(scene: BattleScene, unfainted: boole return pokemon; } +/** + * Ties are broken by whatever mon is closer to the front of the party + * @param scene + * @param unfainted - default false. If true, only picks from unfainted mons. + * @returns + */ +export function getHighestStatTotalPlayerPokemon(scene: BattleScene, unfainted: boolean = false): PlayerPokemon { + const party = scene.getParty(); + let pokemon: PlayerPokemon; + party.every(p => { + if (unfainted && p.isFainted()) { + return true; + } + + pokemon = pokemon ? pokemon?.stats.reduce((a, b) => a + b) < p?.stats.reduce((a, b) => a + b) ? p : pokemon : p; + return true; + }); + + return pokemon; +} + /** * * NOTE: This returns ANY random species, including those locked behind eggs, etc. diff --git a/src/enums/mystery-encounter-type.ts b/src/enums/mystery-encounter-type.ts index f13f246bac0..8ec7d4967d3 100644 --- a/src/enums/mystery-encounter-type.ts +++ b/src/enums/mystery-encounter-type.ts @@ -12,5 +12,6 @@ export enum MysteryEncounterType { LOST_AT_SEA, //might be generalized later on FIERY_FALLOUT, THE_STRONG_STUFF, - POKEMON_SALESMAN + POKEMON_SALESMAN, + OFFER_YOU_CANT_REFUSE } diff --git a/src/locales/en/mystery-encounter.ts b/src/locales/en/mystery-encounter.ts index f58f18dd65a..2454859884b 100644 --- a/src/locales/en/mystery-encounter.ts +++ b/src/locales/en/mystery-encounter.ts @@ -12,6 +12,7 @@ import { slumberingSnorlaxDialogue } from "#app/locales/en/mystery-encounters/sl import { trainingSessionDialogue } from "#app/locales/en/mystery-encounters/training-session-dialogue"; import { theStrongStuffDialogue } from "#app/locales/en/mystery-encounters/the-strong-stuff-dialogue"; import { pokemonSalesmanDialogue } from "#app/locales/en/mystery-encounters/pokemon-salesman-dialogue"; +import { offerYouCantRefuseDialogue } from "#app/locales/en/mystery-encounters/offer-you-cant-refuse-dialogue"; /** * Patterns that can be used: @@ -48,5 +49,6 @@ export const mysteryEncounter = { lostAtSea: lostAtSeaDialogue, fieryFallout: fieryFalloutDialogue, theStrongStuff: theStrongStuffDialogue, - pokemonSalesman: pokemonSalesmanDialogue + pokemonSalesman: pokemonSalesmanDialogue, + offerYouCantRefuse: offerYouCantRefuseDialogue } as const; diff --git a/src/locales/en/mystery-encounters/offer-you-cant-refuse-dialogue.ts b/src/locales/en/mystery-encounters/offer-you-cant-refuse-dialogue.ts new file mode 100644 index 00000000000..dda5810b0a4 --- /dev/null +++ b/src/locales/en/mystery-encounters/offer-you-cant-refuse-dialogue.ts @@ -0,0 +1,34 @@ +export const offerYouCantRefuseDialogue = { + intro: "You're stopped by a rich looking boy.", + speaker: "Rich Kid", + 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, and\nI'll even 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 is an extremely good deal, but can you really bear to part with such a strong team member?", + query: "What will you do?", + option: { + 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}}! + $It's time to show you off to everyone at the yacht club! + $They'll be so jealous!`, + }, + 2: { + label: "Extort the Kid", + tooltip: "(+) Gain {{price, money}}", + tooltip_disabled: "Your Pokémon need to have certain moves or abilities to choose this", + selected: `My word, we're being robbed, Liepard! + $How wonderful! + $Now I'll have an amazing\nstory for the yacht club!`, + }, + 3: { + label: "Leave", + tooltip: "(-) No Rewards", + selected: `What a rotten day... + $Ah, well. Let's return to the yacht club then, Liepard.`, + } + }, +}; diff --git a/src/locales/en/mystery-encounters/shady-vitamin-dealer-dialogue.ts b/src/locales/en/mystery-encounters/shady-vitamin-dealer-dialogue.ts index ecf88577c75..1f2d62751ea 100644 --- a/src/locales/en/mystery-encounters/shady-vitamin-dealer-dialogue.ts +++ b/src/locales/en/mystery-encounters/shady-vitamin-dealer-dialogue.ts @@ -24,8 +24,7 @@ export const shadyVitaminDealerDialogue = { 3: { label: "Leave", tooltip: "(-) No Rewards", - 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.`, + selected: "Heh, wouldn't have figured you for a coward.", }, selected: `The man hands you two bottles and quickly disappears. \${{selectedPokemon}} gained {{boost1}} and {{boost2}} boosts!` diff --git a/src/overrides.ts b/src/overrides.ts index e19a5bf20dd..32a2988641f 100644 --- a/src/overrides.ts +++ b/src/overrides.ts @@ -117,9 +117,9 @@ export const EGG_GACHA_PULL_COUNT_OVERRIDE: number = 0; */ // 1 to 256, set to null to ignore -export const MYSTERY_ENCOUNTER_RATE_OVERRIDE: number = null; +export const MYSTERY_ENCOUNTER_RATE_OVERRIDE: number = 256; export const MYSTERY_ENCOUNTER_TIER_OVERRIDE: MysteryEncounterTier = null; -export const MYSTERY_ENCOUNTER_OVERRIDE: MysteryEncounterType = null; +export const MYSTERY_ENCOUNTER_OVERRIDE: MysteryEncounterType = MysteryEncounterType.OFFER_YOU_CANT_REFUSE; /** * MODIFIER / ITEM OVERRIDES From c2e5a58f591e383e1f26ef13c6602787d0d67ba8 Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Thu, 25 Jul 2024 12:10:22 -0400 Subject: [PATCH 214/270] add unit tests for offer you can't refuse encounter --- src/battle-scene.ts | 6 +- src/battle.ts | 5 +- .../encounters/dark-deal-encounter.ts | 12 +- .../department-store-sale-encounter.ts | 4 +- .../encounters/field-trip-encounter.ts | 31 +-- .../encounters/fiery-fallout-encounter.ts | 10 +- .../encounters/fight-or-flight-encounter.ts | 13 +- .../encounters/lost-at-sea-encounter.ts | 12 +- .../mysterious-challengers-encounter.ts | 10 +- .../encounters/mysterious-chest-encounter.ts | 10 +- .../offer-you-cant-refuse-encounter.ts | 44 +++- .../encounters/pokemon-salesman-encounter.ts | 10 +- .../encounters/safari-zone-encounter.ts | 21 +- .../shady-vitamin-dealer-encounter.ts | 12 +- .../slumbering-snorlax-encounter.ts | 8 +- .../encounters/the-strong-stuff-encounter.ts | 5 +- .../encounters/training-session-encounter.ts | 14 +- .../mystery-encounter-data.ts | 2 +- .../mystery-encounter-option.ts | 42 +-- .../mystery-encounter-requirements.ts | 81 +++++- .../mystery-encounters/mystery-encounter.ts | 73 +++--- .../requirements/requirement-groups.ts | 4 +- .../utils/encounter-phase-utils.ts | 34 +-- src/enums/mystery-encounter-mode.ts | 9 + src/enums/mystery-encounter-option-mode.ts | 10 + src/enums/mystery-encounter-tier.ts | 10 + .../offer-you-cant-refuse-dialogue.ts | 9 +- src/overrides.ts | 8 +- src/phases.ts | 6 +- src/phases/mystery-encounter-phases.ts | 20 +- .../mystery-encounter/encounterTestUtils.ts | 79 +++--- .../department-store-sale-encounter.test.ts | 30 +-- .../fiery-fallout-encounter.test.ts | 45 +++- .../encounters/lost-at-sea-encounter.test.ts | 37 +-- .../offer-you-cant-refuse-encounter.test.ts | 244 ++++++++++++++++++ .../pokemon-salesman-encounter.test.ts | 24 +- .../the-strong-stuff-encounter.test.ts | 24 +- .../phases/mystery-encounter-phase.test.ts | 2 +- src/test/utils/overridesHelper.ts | 2 +- src/test/utils/phaseInterceptor.ts | 5 +- src/ui/mystery-encounter-ui-handler.ts | 15 +- 41 files changed, 727 insertions(+), 315 deletions(-) create mode 100644 src/enums/mystery-encounter-mode.ts create mode 100644 src/enums/mystery-encounter-option-mode.ts create mode 100644 src/enums/mystery-encounter-tier.ts create mode 100644 src/test/mystery-encounter/encounters/offer-you-cant-refuse-encounter.test.ts diff --git a/src/battle-scene.ts b/src/battle-scene.ts index a017b8eb49e..a031ee0bca2 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -66,10 +66,12 @@ import { Species } from "#enums/species"; import { UiTheme } from "#enums/ui-theme"; import { TimedEventManager } from "#app/timed-event-manager.js"; import i18next from "i18next"; -import IMysteryEncounter, { MysteryEncounterTier, MysteryEncounterVariant } from "./data/mystery-encounters/mystery-encounter"; +import IMysteryEncounter from "./data/mystery-encounters/mystery-encounter"; import { allMysteryEncounters, AVERAGE_ENCOUNTERS_PER_RUN_TARGET, BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT, mysteryEncountersByBiome, WEIGHT_INCREMENT_ON_SPAWN_MISS } from "./data/mystery-encounters/mystery-encounters"; import { MysteryEncounterData } from "#app/data/mystery-encounters/mystery-encounter-data"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; +import { MysteryEncounterMode } from "#enums/mystery-encounter-mode"; +import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; export const bypassLogin = import.meta.env.VITE_BYPASS_LOGIN === "1"; @@ -1184,7 +1186,7 @@ export default class BattleScene extends SceneBase { this.arena.removeAllTags(); // If last battle was mystery encounter and no battle occurred, skip return phases - if (lastBattle?.mysteryEncounter?.encounterVariant !== MysteryEncounterVariant.NO_BATTLE) { + if (lastBattle?.mysteryEncounter?.encounterMode !== MysteryEncounterMode.NO_BATTLE) { playerField.forEach((_, p) => this.unshiftPhase(new ReturnPhase(this, p))); for (const pokemon of this.getParty()) { diff --git a/src/battle.ts b/src/battle.ts index 2c033ce38bf..b30b820e628 100644 --- a/src/battle.ts +++ b/src/battle.ts @@ -14,7 +14,8 @@ import { PlayerGender } from "#enums/player-gender"; import { Species } from "#enums/species"; import { TrainerType } from "#enums/trainer-type"; import i18next from "#app/plugins/i18n"; -import IMysteryEncounter, { MysteryEncounterVariant } from "./data/mystery-encounters/mystery-encounter"; +import IMysteryEncounter from "./data/mystery-encounters/mystery-encounter"; +import { MysteryEncounterMode } from "#enums/mystery-encounter-mode"; export enum BattleType { WILD, @@ -205,7 +206,7 @@ export default class Battle { getBgmOverride(scene: BattleScene): string { const battlers = this.enemyParty.slice(0, this.getBattlerCount()); - if (this.battleType === BattleType.TRAINER || this.mysteryEncounter?.encounterVariant === MysteryEncounterVariant.TRAINER_BATTLE) { + if (this.battleType === BattleType.TRAINER || this.mysteryEncounter?.encounterMode === MysteryEncounterMode.TRAINER_BATTLE) { if (!this.started && this.trainer.config.encounterBgm && this.trainer.getEncounterMessages().length) { return `encounter_${this.trainer.getEncounterBgm()}`; } diff --git a/src/data/mystery-encounters/encounters/dark-deal-encounter.ts b/src/data/mystery-encounters/encounters/dark-deal-encounter.ts index 16c125806b2..1e73ffd11c0 100644 --- a/src/data/mystery-encounters/encounters/dark-deal-encounter.ts +++ b/src/data/mystery-encounters/encounters/dark-deal-encounter.ts @@ -3,13 +3,15 @@ import { ModifierRewardPhase } from "#app/phases"; import { isNullOrUndefined, randSeedInt } from "#app/utils"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { Species } from "#enums/species"; -import BattleScene from "../../../battle-scene"; +import BattleScene from "#app/battle-scene"; import { modifierTypes } from "#app/modifier/modifier-type"; -import { getPokemonSpecies } from "../../pokemon-species"; -import IMysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier, } from "../mystery-encounter"; -import { EncounterOptionMode, MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; +import { getPokemonSpecies } from "#app/data/pokemon-species"; +import IMysteryEncounter, { MysteryEncounterBuilder } from "../mystery-encounter"; +import { MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; import { EnemyPartyConfig, EnemyPokemonConfig, initBattleWithEnemyConfig, leaveEncounterWithoutBattle, } from "../utils/encounter-phase-utils"; import { getRandomPlayerPokemon, getRandomSpeciesByStarterTier } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; +import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; +import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; /** i18n namespace for encounter */ const namespace = "mysteryEncounter:darkDeal"; @@ -105,7 +107,7 @@ export const DarkDealEncounter: IMysteryEncounter = .withQuery(`${namespace}:query`) .withOption( new MysteryEncounterOptionBuilder() - .withOptionMode(EncounterOptionMode.DEFAULT) + .withOptionMode(MysteryEncounterOptionMode.DEFAULT) .withDialogue({ buttonLabel: `${namespace}:option:1:label`, buttonTooltip: `${namespace}:option:1:tooltip`, 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 131dc68aa14..610b836ef9e 100644 --- a/src/data/mystery-encounters/encounters/department-store-sale-encounter.ts +++ b/src/data/mystery-encounters/encounters/department-store-sale-encounter.ts @@ -6,11 +6,11 @@ import { modifierTypes } from "#app/modifier/modifier-type"; import { randSeedInt } from "#app/utils"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { Species } from "#enums/species"; -import BattleScene from "../../../battle-scene"; +import BattleScene from "#app/battle-scene"; import IMysteryEncounter, { MysteryEncounterBuilder, - MysteryEncounterTier, } from "../mystery-encounter"; +import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; /** i18n namespace for encounter */ const namespace = "mysteryEncounter:departmentStoreSale"; diff --git a/src/data/mystery-encounters/encounters/field-trip-encounter.ts b/src/data/mystery-encounters/encounters/field-trip-encounter.ts index 525e2b91f8b..9f912be1a35 100644 --- a/src/data/mystery-encounters/encounters/field-trip-encounter.ts +++ b/src/data/mystery-encounters/encounters/field-trip-encounter.ts @@ -1,22 +1,15 @@ import { MoveCategory } from "#app/data/move"; -import { EncounterOptionMode, MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; -import { - generateModifierTypeOption, - leaveEncounterWithoutBattle, - selectPokemonForOption, - setEncounterExp, - setEncounterRewards, -} from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; +import { generateModifierTypeOption, leaveEncounterWithoutBattle, selectPokemonForOption, setEncounterExp, setEncounterRewards } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { TempBattleStat } from "#app/data/temp-battle-stat"; import { PlayerPokemon, PokemonMove } from "#app/field/pokemon"; import { modifierTypes } from "#app/modifier/modifier-type"; import { OptionSelectItem } from "#app/ui/abstact-option-select-ui-handler"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; -import BattleScene from "../../../battle-scene"; -import IMysteryEncounter, { - MysteryEncounterBuilder, - MysteryEncounterTier, -} from "../mystery-encounter"; +import BattleScene from "#app/battle-scene"; +import IMysteryEncounter, { MysteryEncounterBuilder } from "../mystery-encounter"; +import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; +import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; /** i18n namespace for the encounter */ const namespace = "mysteryEncounter:fieldTrip"; @@ -62,7 +55,7 @@ export const FieldTripEncounter: IMysteryEncounter = .withQuery(`${namespace}:query`) .withOption( new MysteryEncounterOptionBuilder() - .withOptionMode(EncounterOptionMode.DEFAULT) + .withOptionMode(MysteryEncounterOptionMode.DEFAULT) .withDialogue({ buttonLabel: `${namespace}:option:1:label`, buttonTooltip: `${namespace}:option:1:tooltip`, @@ -88,7 +81,7 @@ export const FieldTripEncounter: IMysteryEncounter = encounter.options[0].dialogue.selected = [ { text: `${namespace}:option:incorrect`, - speaker: `${namespace}:option:speaker`, + speaker: `${namespace}:speaker`, }, { text: `${namespace}:option:lesson_learned`, @@ -148,7 +141,7 @@ export const FieldTripEncounter: IMysteryEncounter = ) .withOption( new MysteryEncounterOptionBuilder() - .withOptionMode(EncounterOptionMode.DEFAULT) + .withOptionMode(MysteryEncounterOptionMode.DEFAULT) .withDialogue({ buttonLabel: `${namespace}:option:2:label`, buttonTooltip: `${namespace}:option:2:tooltip`, @@ -174,7 +167,7 @@ export const FieldTripEncounter: IMysteryEncounter = encounter.options[1].dialogue.selected = [ { text: `${namespace}:option:incorrect`, - speaker: `${namespace}:option:speaker`, + speaker: `${namespace}:speaker`, }, { text: `${namespace}:option:lesson_learned`, @@ -240,7 +233,7 @@ export const FieldTripEncounter: IMysteryEncounter = ) .withOption( new MysteryEncounterOptionBuilder() - .withOptionMode(EncounterOptionMode.DEFAULT) + .withOptionMode(MysteryEncounterOptionMode.DEFAULT) .withDialogue({ buttonLabel: `${namespace}:option:3:label`, buttonTooltip: `${namespace}:option:3:tooltip`, @@ -266,7 +259,7 @@ export const FieldTripEncounter: IMysteryEncounter = encounter.options[2].dialogue.selected = [ { text: `${namespace}:option:incorrect`, - speaker: `${namespace}:option:speaker`, + speaker: `${namespace}:speaker`, }, { text: `${namespace}:option:lesson_learned`, diff --git a/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts b/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts index d61a0c1ff4e..478a604869b 100644 --- a/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts +++ b/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts @@ -1,9 +1,9 @@ -import { EncounterOptionMode, MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; +import { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; import { EnemyPartyConfig, generateModifierTypeOption, initBattleWithEnemyConfig, initCustomMovesForEncounter, leaveEncounterWithoutBattle, setEncounterExp, setEncounterRewards, transitionMysteryEncounterIntroVisuals } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { modifierTypes, } from "#app/modifier/modifier-type"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; -import BattleScene from "../../../battle-scene"; -import IMysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier, } from "../mystery-encounter"; +import BattleScene from "#app/battle-scene"; +import IMysteryEncounter, { MysteryEncounterBuilder } from "../mystery-encounter"; import { TypeRequirement } from "../mystery-encounter-requirements"; import { Species } from "#enums/species"; import { getPokemonSpecies } from "#app/data/pokemon-species"; @@ -18,6 +18,8 @@ import { isNullOrUndefined, randSeedInt } from "#app/utils"; import { StatusEffect } from "#app/data/status-effect"; import { queueEncounterMessage } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; import { applyDamageToPokemon } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; +import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; +import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; /** the i18n namespace for the encounter */ const namespace = "mysteryEncounter:fieryFallout"; @@ -202,7 +204,7 @@ export const FieryFalloutEncounter: IMysteryEncounter = ) .withOption( new MysteryEncounterOptionBuilder() - .withOptionMode(EncounterOptionMode.DISABLED_OR_SPECIAL) + .withOptionMode(MysteryEncounterOptionMode.DISABLED_OR_SPECIAL) .withPrimaryPokemonRequirement(new TypeRequirement(Type.FIRE, true, 1)) // Will set option3PrimaryName dialogue token automatically .withSecondaryPokemonRequirement(new TypeRequirement(Type.FIRE, true, 1)) // Will set option3SecondaryName dialogue token automatically .withDialogue({ 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 ad693d457d9..f4460de47d7 100644 --- a/src/data/mystery-encounters/encounters/fight-or-flight-encounter.ts +++ b/src/data/mystery-encounters/encounters/fight-or-flight-encounter.ts @@ -1,5 +1,5 @@ import { BattleStat } from "#app/data/battle-stat"; -import { EncounterOptionMode, MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; +import { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; import { EnemyPartyConfig, initBattleWithEnemyConfig, @@ -20,14 +20,13 @@ import { StatChangePhase } from "#app/phases"; import { randSeedInt } from "#app/utils"; import { BattlerTagType } from "#enums/battler-tag-type"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; -import BattleScene from "../../../battle-scene"; -import IMysteryEncounter, { - MysteryEncounterBuilder, - MysteryEncounterTier, -} from "../mystery-encounter"; +import BattleScene from "#app/battle-scene"; +import IMysteryEncounter, { MysteryEncounterBuilder } from "../mystery-encounter"; import { MoveRequirement } from "../mystery-encounter-requirements"; import { queueEncounterMessage, showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; import { getPokemonNameWithAffix } from "#app/messages"; +import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; +import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; /** the i18n namespace for the encounter */ const namespace = "mysteryEncounter:fightOrFlight"; @@ -132,7 +131,7 @@ export const FightOrFlightEncounter: IMysteryEncounter = ) .withOption( new MysteryEncounterOptionBuilder() - .withOptionMode(EncounterOptionMode.DEFAULT_OR_SPECIAL) + .withOptionMode(MysteryEncounterOptionMode.DEFAULT_OR_SPECIAL) .withPrimaryPokemonRequirement(new MoveRequirement(STEALING_MOVES)) // Will set option2PrimaryName and option2PrimaryMove dialogue tokens automatically .withDialogue({ buttonLabel: `${namespace}:option:2:label`, 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 7becc65a160..a4e47311f43 100644 --- a/src/data/mystery-encounters/encounters/lost-at-sea-encounter.ts +++ b/src/data/mystery-encounters/encounters/lost-at-sea-encounter.ts @@ -2,11 +2,13 @@ import { getPokemonSpecies } from "#app/data/pokemon-species.js"; import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species.js"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; -import BattleScene from "../../../battle-scene"; -import MysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier } from "../mystery-encounter"; -import { EncounterOptionMode, MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; +import BattleScene from "#app/battle-scene"; +import MysteryEncounter, { MysteryEncounterBuilder } from "../mystery-encounter"; +import { MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; import { leaveEncounterWithoutBattle, setEncounterExp } from "../utils/encounter-phase-utils"; import { applyDamageToPokemon } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; +import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; +import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; const OPTION_1_REQUIRED_MOVE = Moves.SURF; const OPTION_2_REQUIRED_MOVE = Moves.FLY; @@ -53,7 +55,7 @@ export const LostAtSeaEncounter: MysteryEncounter = MysteryEncounterBuilder.with // Option 1: Use a (non fainted) pokemon that can learn Surf to guide you back/ new MysteryEncounterOptionBuilder() .withPokemonCanLearnMoveRequirement(OPTION_1_REQUIRED_MOVE) - .withOptionMode(EncounterOptionMode.DISABLED_OR_DEFAULT) + .withOptionMode(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT) .withDialogue({ buttonLabel: `${namespace}:option:1:label`, disabledButtonLabel: `${namespace}:option:1:label_disabled`, @@ -72,7 +74,7 @@ export const LostAtSeaEncounter: MysteryEncounter = MysteryEncounterBuilder.with //Option 2: Use a (non fainted) pokemon that can learn fly to guide you back. new MysteryEncounterOptionBuilder() .withPokemonCanLearnMoveRequirement(OPTION_2_REQUIRED_MOVE) - .withOptionMode(EncounterOptionMode.DISABLED_OR_DEFAULT) + .withOptionMode(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT) .withDialogue({ buttonLabel: `${namespace}:option:2:label`, disabledButtonLabel: `${namespace}:option:2:label_disabled`, diff --git a/src/data/mystery-encounters/encounters/mysterious-challengers-encounter.ts b/src/data/mystery-encounters/encounters/mysterious-challengers-encounter.ts index 76bbc58a9d9..ab77f0c4646 100644 --- a/src/data/mystery-encounters/encounters/mysterious-challengers-encounter.ts +++ b/src/data/mystery-encounters/encounters/mysterious-challengers-encounter.ts @@ -13,12 +13,10 @@ import { ModifierTier } from "#app/modifier/modifier-tier"; import { modifierTypes } from "#app/modifier/modifier-type"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { PartyMemberStrength } from "#enums/party-member-strength"; -import BattleScene from "../../../battle-scene"; -import * as Utils from "../../../utils"; -import IMysteryEncounter, { - MysteryEncounterBuilder, - MysteryEncounterTier, -} from "../mystery-encounter"; +import BattleScene from "#app/battle-scene"; +import * as Utils from "#app/utils"; +import IMysteryEncounter, { MysteryEncounterBuilder } from "../mystery-encounter"; +import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; /** the i18n namespace for the encounter */ const namespace = "mysteryEncounter:mysteriousChallengers"; diff --git a/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts b/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts index 13c5b9cc1e4..e418655bbf5 100644 --- a/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts +++ b/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts @@ -4,9 +4,11 @@ import { getHighestLevelPlayerPokemon, koPlayerPokemon } from "#app/data/mystery import { ModifierTier } from "#app/modifier/modifier-tier"; import { randSeedInt } from "#app/utils.js"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; -import BattleScene from "../../../battle-scene"; -import IMysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier, } from "../mystery-encounter"; -import { EncounterOptionMode, MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; +import BattleScene from "#app/battle-scene"; +import IMysteryEncounter, { MysteryEncounterBuilder } from "../mystery-encounter"; +import { MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; +import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; +import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; /** i18n namespace for encounter */ const namespace = "mysteryEncounter:mysteriousChest"; @@ -42,7 +44,7 @@ export const MysteriousChestEncounter: IMysteryEncounter = .withQuery(`${namespace}:query`) .withOption( new MysteryEncounterOptionBuilder() - .withOptionMode(EncounterOptionMode.DEFAULT) + .withOptionMode(MysteryEncounterOptionMode.DEFAULT) .withDialogue({ buttonLabel: `${namespace}:option:1:label`, buttonTooltip: `${namespace}:option:1:tooltip`, diff --git a/src/data/mystery-encounters/encounters/offer-you-cant-refuse-encounter.ts b/src/data/mystery-encounters/encounters/offer-you-cant-refuse-encounter.ts index 694acfbdb94..80510430be3 100644 --- a/src/data/mystery-encounters/encounters/offer-you-cant-refuse-encounter.ts +++ b/src/data/mystery-encounters/encounters/offer-you-cant-refuse-encounter.ts @@ -2,14 +2,16 @@ import { leaveEncounterWithoutBattle, setEncounterExp, updatePlayerMoney, } from import { modifierTypes } from "#app/modifier/modifier-type"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { Species } from "#enums/species"; -import BattleScene from "../../../battle-scene"; -import IMysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier, } from "../mystery-encounter"; -import { EncounterOptionMode, MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; -import { MoveRequirement } from "../mystery-encounter-requirements"; +import BattleScene from "#app/battle-scene"; +import IMysteryEncounter, { MysteryEncounterBuilder } from "../mystery-encounter"; +import { MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; +import { AbilityRequirement, CombinationPokemonRequirement, MoveRequirement } from "../mystery-encounter-requirements"; import { getHighestStatTotalPlayerPokemon } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; import { ModifierRewardPhase } from "#app/phases"; -import { EXTORTION_MOVES } from "#app/data/mystery-encounters/requirements/requirement-groups"; +import { EXTORTION_ABILITIES, EXTORTION_MOVES } from "#app/data/mystery-encounters/requirements/requirement-groups"; import { getPokemonSpecies } from "#app/data/pokemon-species"; +import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; +import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; /** the i18n namespace for this encounter */ const namespace = "mysteryEncounter:offerYouCantRefuse"; @@ -56,22 +58,36 @@ export const OfferYouCantRefuseEncounter: IMysteryEncounter = .withDescription(`${namespace}:description`) .withQuery(`${namespace}:query`) .withOnInit((scene: BattleScene) => { + const encounter = scene.currentBattle.mysteryEncounter; const pokemon = getHighestStatTotalPlayerPokemon(scene, false); const price = scene.getWaveMoneyAmount(10); - scene.currentBattle.mysteryEncounter.setDialogueToken("strongestPokemon", pokemon.name); - scene.currentBattle.mysteryEncounter.setDialogueToken("price", price.toString()); + encounter.setDialogueToken("strongestPokemon", pokemon.name); + encounter.setDialogueToken("price", price.toString()); // Store pokemon and price - scene.currentBattle.mysteryEncounter.misc = { + encounter.misc = { pokemon: pokemon, price: price }; + + // If player meets the combo OR requirements for option 2, populate the token + const opt2Req = encounter.options[1].primaryPokemonRequirements[0]; + if (opt2Req.meetsRequirement(scene)) { + const abilityToken = encounter.dialogueTokens["option2PrimaryAbility"]; + const moveToken = encounter.dialogueTokens["option2PrimaryMove"]; + if (abilityToken) { + encounter.setDialogueToken("moveOrAbility", abilityToken); + } else if (moveToken) { + encounter.setDialogueToken("moveOrAbility", moveToken); + } + } + return true; }) .withOption( new MysteryEncounterOptionBuilder() - .withOptionMode(EncounterOptionMode.DEFAULT) + .withOptionMode(MysteryEncounterOptionMode.DEFAULT) .withDialogue({ buttonLabel: `${namespace}:option:1:label`, buttonTooltip: `${namespace}:option:1:tooltip`, @@ -98,14 +114,18 @@ export const OfferYouCantRefuseEncounter: IMysteryEncounter = ) .withOption( new MysteryEncounterOptionBuilder() - .withOptionMode(EncounterOptionMode.DISABLED_OR_DEFAULT) - .withPrimaryPokemonRequirement(new MoveRequirement(EXTORTION_MOVES)) + .withOptionMode(MysteryEncounterOptionMode.DISABLED_OR_SPECIAL) + .withPrimaryPokemonRequirement(new CombinationPokemonRequirement( + new MoveRequirement(EXTORTION_MOVES), + new AbilityRequirement(EXTORTION_ABILITIES)) + ) .withDialogue({ buttonLabel: `${namespace}:option:2:label`, buttonTooltip: `${namespace}:option:2:tooltip`, disabledButtonTooltip: `${namespace}:option:2:tooltip_disabled`, selected: [ { + speaker: `${namespace}:speaker`, text: `${namespace}:option:2:selected`, }, ], @@ -129,7 +149,7 @@ export const OfferYouCantRefuseEncounter: IMysteryEncounter = selected: [ { speaker: `${namespace}:speaker`, - text: `${namespace}:option:2:selected`, + text: `${namespace}:option:3:selected`, }, ], }, diff --git a/src/data/mystery-encounters/encounters/pokemon-salesman-encounter.ts b/src/data/mystery-encounters/encounters/pokemon-salesman-encounter.ts index 9c8ee2ac91c..76077bf748b 100644 --- a/src/data/mystery-encounters/encounters/pokemon-salesman-encounter.ts +++ b/src/data/mystery-encounters/encounters/pokemon-salesman-encounter.ts @@ -1,17 +1,19 @@ import { leaveEncounterWithoutBattle, transitionMysteryEncounterIntroVisuals, updatePlayerMoney, } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { isNullOrUndefined, randSeedInt } from "#app/utils"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; -import BattleScene from "../../../battle-scene"; -import IMysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier, } from "../mystery-encounter"; +import BattleScene from "#app/battle-scene"; +import IMysteryEncounter, { MysteryEncounterBuilder } from "../mystery-encounter"; import { MoneyRequirement } from "../mystery-encounter-requirements"; import { catchPokemon, getRandomSpeciesByStarterTier } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; import { getPokemonSpecies, speciesStarters } from "#app/data/pokemon-species"; import { Species } from "#enums/species"; import { PokeballType } from "#app/data/pokeball"; import { EnemyPokemon, PlayerPokemon } from "#app/field/pokemon"; -import { EncounterOptionMode, MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; +import { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; import { showEncounterDialogue } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; import PokemonData from "#app/system/pokemon-data"; +import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; +import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; /** the i18n namespace for this encounter */ const namespace = "mysteryEncounter:pokemonSalesman"; @@ -104,7 +106,7 @@ export const PokemonSalesmanEncounter: IMysteryEncounter = }) .withOption( new MysteryEncounterOptionBuilder() - .withOptionMode(EncounterOptionMode.DEFAULT_OR_SPECIAL) + .withOptionMode(MysteryEncounterOptionMode.DEFAULT_OR_SPECIAL) .withHasDexProgress(true) .withSceneMoneyRequirement(null, MAX_POKEMON_PRICE_MULTIPLIER) // Wave scaling money multiplier of 2 .withDialogue({ diff --git a/src/data/mystery-encounters/encounters/safari-zone-encounter.ts b/src/data/mystery-encounters/encounters/safari-zone-encounter.ts index 147ce2a5e2c..f9d4e487ab3 100644 --- a/src/data/mystery-encounters/encounters/safari-zone-encounter.ts +++ b/src/data/mystery-encounters/encounters/safari-zone-encounter.ts @@ -1,8 +1,8 @@ import { initSubsequentOptionSelect, leaveEncounterWithoutBattle, updatePlayerMoney, } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; -import BattleScene from "../../../battle-scene"; -import IMysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier, MysteryEncounterVariant } from "../mystery-encounter"; -import MysteryEncounterOption, { EncounterOptionMode, MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; +import BattleScene from "#app/battle-scene"; +import IMysteryEncounter, { MysteryEncounterBuilder } from "../mystery-encounter"; +import MysteryEncounterOption, { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; import { TrainerSlot } from "#app/data/trainer-config"; import { ScanIvsPhase, SummonPhase, VictoryPhase } from "#app/phases"; import { HiddenAbilityRateBoosterModifier, IvScannerModifier } from "#app/modifier/modifier"; @@ -15,6 +15,9 @@ import { MoneyRequirement } from "#app/data/mystery-encounters/mystery-encounter import { doPlayerFlee, doPokemonFlee, getRandomSpeciesByStarterTier, trainerThrowPokeball } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; import { getEncounterText, showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; import { getPokemonNameWithAffix } from "#app/messages"; +import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; +import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; +import { MysteryEncounterMode } from "#enums/mystery-encounter-mode"; /** the i18n namespace for the encounter */ const namespace = "mysteryEncounter:safariZone"; @@ -50,7 +53,7 @@ export const SafariZoneEncounter: IMysteryEncounter = .withDescription(`${namespace}:description`) .withQuery(`${namespace}:query`) .withOption(new MysteryEncounterOptionBuilder() - .withOptionMode(EncounterOptionMode.DISABLED_OR_DEFAULT) + .withOptionMode(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT) .withSceneRequirement(new MoneyRequirement(0, 2.75)) // Cost equal to 1 Max Revive .withDialogue({ buttonLabel: `${namespace}:option:1:label`, @@ -64,7 +67,7 @@ export const SafariZoneEncounter: IMysteryEncounter = .withOptionPhase(async (scene: BattleScene) => { // Start safari encounter const encounter = scene.currentBattle.mysteryEncounter; - encounter.encounterVariant = MysteryEncounterVariant.CONTINUOUS_ENCOUNTER; + encounter.encounterMode = MysteryEncounterMode.CONTINUOUS_ENCOUNTER; encounter.misc = { safariPokemonRemaining: 3 }; @@ -116,7 +119,7 @@ export const SafariZoneEncounter: IMysteryEncounter = */ const safariZoneGameOptions: MysteryEncounterOption[] = [ new MysteryEncounterOptionBuilder() - .withOptionMode(EncounterOptionMode.DEFAULT) + .withOptionMode(MysteryEncounterOptionMode.DEFAULT) .withDialogue({ buttonLabel: `${namespace}:safari:1:label`, buttonTooltip: `${namespace}:safari:1:tooltip`, @@ -150,7 +153,7 @@ const safariZoneGameOptions: MysteryEncounterOption[] = [ }) .build(), new MysteryEncounterOptionBuilder() - .withOptionMode(EncounterOptionMode.DEFAULT) + .withOptionMode(MysteryEncounterOptionMode.DEFAULT) .withDialogue({ buttonLabel: `${namespace}:safari:2:label`, buttonTooltip: `${namespace}:safari:2:tooltip`, @@ -180,7 +183,7 @@ const safariZoneGameOptions: MysteryEncounterOption[] = [ }) .build(), new MysteryEncounterOptionBuilder() - .withOptionMode(EncounterOptionMode.DEFAULT) + .withOptionMode(MysteryEncounterOptionMode.DEFAULT) .withDialogue({ buttonLabel: `${namespace}:safari:3:label`, buttonTooltip: `${namespace}:safari:3:tooltip`, @@ -209,7 +212,7 @@ const safariZoneGameOptions: MysteryEncounterOption[] = [ }) .build(), new MysteryEncounterOptionBuilder() - .withOptionMode(EncounterOptionMode.DEFAULT) + .withOptionMode(MysteryEncounterOptionMode.DEFAULT) .withDialogue({ buttonLabel: `${namespace}:safari:4:label`, buttonTooltip: `${namespace}:safari:4:tooltip`, 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 6b208cabb61..19248d7a5bd 100644 --- a/src/data/mystery-encounters/encounters/shady-vitamin-dealer-encounter.ts +++ b/src/data/mystery-encounters/encounters/shady-vitamin-dealer-encounter.ts @@ -5,12 +5,14 @@ import { modifierTypes } from "#app/modifier/modifier-type"; import { randSeedInt } from "#app/utils"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { Species } from "#enums/species"; -import BattleScene from "../../../battle-scene"; -import IMysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier, } from "../mystery-encounter"; -import { EncounterOptionMode, MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; +import BattleScene from "#app/battle-scene"; +import IMysteryEncounter, { MysteryEncounterBuilder } from "../mystery-encounter"; +import { MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; import { MoneyRequirement } from "../mystery-encounter-requirements"; import { getEncounterText, queueEncounterMessage } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; import { applyDamageToPokemon } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; +import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; +import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; /** the i18n namespace for this encounter */ const namespace = "mysteryEncounter:shadyVitaminDealer"; @@ -59,7 +61,7 @@ export const ShadyVitaminDealerEncounter: IMysteryEncounter = .withQuery(`${namespace}:query`) .withOption( new MysteryEncounterOptionBuilder() - .withOptionMode(EncounterOptionMode.DISABLED_OR_DEFAULT) + .withOptionMode(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT) .withSceneMoneyRequirement(0, 2) // Wave scaling money multiplier of 2 .withDialogue({ buttonLabel: `${namespace}:option:1:label`, @@ -144,7 +146,7 @@ export const ShadyVitaminDealerEncounter: IMysteryEncounter = ) .withOption( new MysteryEncounterOptionBuilder() - .withOptionMode(EncounterOptionMode.DISABLED_OR_DEFAULT) + .withOptionMode(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT) .withSceneMoneyRequirement(0, 5) // Wave scaling money multiplier of 5 .withDialogue({ buttonLabel: `${namespace}:option:2:label`, diff --git a/src/data/mystery-encounters/encounters/slumbering-snorlax-encounter.ts b/src/data/mystery-encounters/encounters/slumbering-snorlax-encounter.ts index 269b4ab8c21..316416e3809 100644 --- a/src/data/mystery-encounters/encounters/slumbering-snorlax-encounter.ts +++ b/src/data/mystery-encounters/encounters/slumbering-snorlax-encounter.ts @@ -4,8 +4,8 @@ import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { Species } from "#enums/species"; import BattleScene from "#app/battle-scene"; import { StatusEffect } from "#app/data/status-effect"; -import IMysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier, } from "../mystery-encounter"; -import { EncounterOptionMode, MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; +import IMysteryEncounter, { MysteryEncounterBuilder } from "../mystery-encounter"; +import { MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; import { MoveRequirement } from "../mystery-encounter-requirements"; import { EnemyPartyConfig, EnemyPokemonConfig, initBattleWithEnemyConfig, initCustomMovesForEncounter, leaveEncounterWithoutBattle, setEncounterExp, setEncounterRewards, } from "../utils/encounter-phase-utils"; import { queueEncounterMessage } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; @@ -14,6 +14,8 @@ import { BattlerIndex } from "#app/battle"; import { PokemonMove } from "#app/field/pokemon"; import { getPokemonSpecies } from "#app/data/pokemon-species"; import { PartyHealPhase } from "#app/phases"; +import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; +import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; /** i18n namespace for the encounter */ const namespace = "mysteryEncounter:slumberingSnorlax"; @@ -121,7 +123,7 @@ export const SlumberingSnorlaxEncounter: IMysteryEncounter = ) .withOption( new MysteryEncounterOptionBuilder() - .withOptionMode(EncounterOptionMode.DISABLED_OR_SPECIAL) + .withOptionMode(MysteryEncounterOptionMode.DISABLED_OR_SPECIAL) .withPrimaryPokemonRequirement(new MoveRequirement(STEALING_MOVES)) .withDialogue({ buttonLabel: `${namespace}:option:3:label`, 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 05c34ba6973..34967112a72 100644 --- a/src/data/mystery-encounters/encounters/the-strong-stuff-encounter.ts +++ b/src/data/mystery-encounters/encounters/the-strong-stuff-encounter.ts @@ -1,8 +1,8 @@ import { EnemyPartyConfig, generateModifierTypeOption, initBattleWithEnemyConfig, initCustomMovesForEncounter, leaveEncounterWithoutBattle, setEncounterRewards, transitionMysteryEncounterIntroVisuals } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { modifierTypes, PokemonHeldItemModifierType, } from "#app/modifier/modifier-type"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; -import BattleScene from "../../../battle-scene"; -import IMysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier, } from "../mystery-encounter"; +import BattleScene from "#app/battle-scene"; +import IMysteryEncounter, { MysteryEncounterBuilder } from "../mystery-encounter"; import { getPokemonSpecies } from "#app/data/pokemon-species"; import { Species } from "#enums/species"; import { Nature } from "#app/data/nature"; @@ -15,6 +15,7 @@ import { StatChangePhase } from "#app/phases"; import { BattleStat } from "#app/data/battle-stat"; import { BattlerTagType } from "#enums/battler-tag-type"; import { BerryType } from "#enums/berry-type"; +import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; /** the i18n namespace for the encounter */ const namespace = "mysteryEncounter:theStrongStuff"; diff --git a/src/data/mystery-encounters/encounters/training-session-encounter.ts b/src/data/mystery-encounters/encounters/training-session-encounter.ts index a3f18395fe2..02bee131a02 100644 --- a/src/data/mystery-encounters/encounters/training-session-encounter.ts +++ b/src/data/mystery-encounters/encounters/training-session-encounter.ts @@ -13,10 +13,12 @@ import { OptionSelectItem } from "#app/ui/abstact-option-select-ui-handler"; import { randSeedShuffle } from "#app/utils"; import { BattlerTagType } from "#enums/battler-tag-type"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; -import BattleScene from "../../../battle-scene"; -import IMysteryEncounter, { MysteryEncounterBuilder, MysteryEncounterTier, } from "../mystery-encounter"; -import { EncounterOptionMode, MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; +import BattleScene from "#app/battle-scene"; +import IMysteryEncounter, { MysteryEncounterBuilder } from "../mystery-encounter"; +import { MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; import { getEncounterText, queueEncounterMessage } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; +import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; +import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; /** The i18n namespace for the encounter */ const namespace = "mysteryEncounter:trainingSession"; @@ -52,7 +54,7 @@ export const TrainingSessionEncounter: IMysteryEncounter = .withQuery(`${namespace}:query`) .withOption( new MysteryEncounterOptionBuilder() - .withOptionMode(EncounterOptionMode.DEFAULT) + .withOptionMode(MysteryEncounterOptionMode.DEFAULT) .withHasDexProgress(true) .withDialogue({ buttonLabel: `${namespace}:option:1:label`, @@ -196,7 +198,7 @@ export const TrainingSessionEncounter: IMysteryEncounter = ) .withOption( new MysteryEncounterOptionBuilder() - .withOptionMode(EncounterOptionMode.DEFAULT) + .withOptionMode(MysteryEncounterOptionMode.DEFAULT) .withHasDexProgress(true) .withDialogue({ buttonLabel: `${namespace}:option:2:label`, @@ -289,7 +291,7 @@ export const TrainingSessionEncounter: IMysteryEncounter = ) .withOption( new MysteryEncounterOptionBuilder() - .withOptionMode(EncounterOptionMode.DEFAULT) + .withOptionMode(MysteryEncounterOptionMode.DEFAULT) .withHasDexProgress(true) .withDialogue({ buttonLabel: `${namespace}:option:3:label`, diff --git a/src/data/mystery-encounters/mystery-encounter-data.ts b/src/data/mystery-encounters/mystery-encounter-data.ts index 7162450bfc5..81b4f74c04c 100644 --- a/src/data/mystery-encounters/mystery-encounter-data.ts +++ b/src/data/mystery-encounters/mystery-encounter-data.ts @@ -1,7 +1,7 @@ -import { MysteryEncounterTier } from "#app/data/mystery-encounters/mystery-encounter"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT } from "#app/data/mystery-encounters/mystery-encounters"; import { isNullOrUndefined } from "#app/utils"; +import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; export class MysteryEncounterData { encounteredEvents: [MysteryEncounterType, MysteryEncounterTier][] = []; diff --git a/src/data/mystery-encounters/mystery-encounter-option.ts b/src/data/mystery-encounters/mystery-encounter-option.ts index 8b9b26e2f95..e2736327ddb 100644 --- a/src/data/mystery-encounters/mystery-encounter-option.ts +++ b/src/data/mystery-encounters/mystery-encounter-option.ts @@ -1,29 +1,19 @@ import { OptionTextDisplay } from "#app/data/mystery-encounters/mystery-encounter-dialogue"; import { Moves } from "#app/enums/moves"; import { PlayerPokemon } from "#app/field/pokemon"; -import BattleScene from "../../battle-scene"; -import * as Utils from "../../utils"; +import BattleScene from "#app/battle-scene"; +import * as Utils from "#app/utils"; import { Type } from "../type"; import { EncounterPokemonRequirement, EncounterSceneRequirement, MoneyRequirement, TypeRequirement } from "./mystery-encounter-requirements"; import { CanLearnMoveRequirement, CanLearnMoveRequirementOptions } from "./requirements/can-learn-move-requirement"; -import { isNullOrUndefined } from "../../utils"; - -export enum EncounterOptionMode { - /** Default style */ - DEFAULT, - /** Disabled on requirements not met, default style on requirements met */ - DISABLED_OR_DEFAULT, - /** Default style on requirements not met, special style on requirements met */ - DEFAULT_OR_SPECIAL, - /** Disabled on requirements not met, special style on requirements met */ - DISABLED_OR_SPECIAL -} +import { isNullOrUndefined } from "#app/utils"; +import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; export type OptionPhaseCallback = (scene: BattleScene) => Promise; export default interface MysteryEncounterOption { - optionMode: EncounterOptionMode; + optionMode: MysteryEncounterOptionMode; hasDexProgress?: boolean; @@ -114,8 +104,8 @@ export default class MysteryEncounterOption implements MysteryEncounterOption { return false; } } else { - // this means we CAN have the same pokemon be a primary and secondary pokemon, so just choose any qualifying one randomly. - this.primaryPokemon = qualified[Utils.randSeedInt(qualified.length, 0)]; + // Just pick the first qualifying Pokemon + this.primaryPokemon = qualified[0]; return true; } } @@ -145,7 +135,7 @@ export default class MysteryEncounterOption implements MysteryEncounterOption { export class MysteryEncounterOptionBuilder implements Partial { - optionMode?: EncounterOptionMode; + optionMode?: MysteryEncounterOptionMode; requirements?: EncounterSceneRequirement[] = []; primaryPokemonRequirements?: EncounterPokemonRequirement[] = []; secondaryPokemonRequirements ?: EncounterPokemonRequirement[] = []; @@ -156,7 +146,7 @@ export class MysteryEncounterOptionBuilder implements Partial { + withOptionMode(optionMode: MysteryEncounterOptionMode): this & Pick { return Object.assign(this, { optionMode }); } @@ -165,6 +155,10 @@ export class MysteryEncounterOptionBuilder implements Partial> { + if (requirement instanceof EncounterPokemonRequirement) { + Error("Incorrectly added pokemon requirement as scene requirement."); + } + this.requirements.push(requirement); return Object.assign(this, { requirements: this.requirements }); } @@ -190,6 +184,10 @@ export class MysteryEncounterOptionBuilder implements Partial> { + if (requirement instanceof EncounterSceneRequirement) { + Error("Incorrectly added scene requirement as pokemon requirement."); + } + this.primaryPokemonRequirements.push(requirement); return Object.assign(this, { primaryPokemonRequirements: this.primaryPokemonRequirements }); } @@ -218,7 +216,11 @@ export class MysteryEncounterOptionBuilder implements Partial> { + withSecondaryPokemonRequirement(requirement: EncounterPokemonRequirement, excludePrimaryFromSecondaryRequirements: boolean = true): this & Required> { + if (requirement instanceof EncounterSceneRequirement) { + Error("Incorrectly added scene requirement as pokemon requirement."); + } + this.secondaryPokemonRequirements.push(requirement); this.excludePrimaryFromSecondaryRequirements = excludePrimaryFromSecondaryRequirements; return Object.assign(this, { secondaryPokemonRequirements: this.secondaryPokemonRequirements }); diff --git a/src/data/mystery-encounters/mystery-encounter-requirements.ts b/src/data/mystery-encounters/mystery-encounter-requirements.ts index 6f0b408e1d9..863ed9afc30 100644 --- a/src/data/mystery-encounters/mystery-encounter-requirements.ts +++ b/src/data/mystery-encounters/mystery-encounter-requirements.ts @@ -1,6 +1,6 @@ import { PlayerPokemon } from "#app/field/pokemon"; import { ModifierType, PokemonHeldItemModifierType } from "#app/modifier/modifier-type"; -import BattleScene from "../../battle-scene"; +import BattleScene from "#app/battle-scene"; import { isNullOrUndefined } from "#app/utils"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; @@ -21,12 +21,35 @@ export interface EncounterRequirement { } export abstract class EncounterSceneRequirement implements EncounterRequirement { + abstract meetsRequirement(scene: BattleScene): boolean; + abstract getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string]; +} + +export class CombinationSceneRequirement extends EncounterSceneRequirement { + orRequirements: EncounterSceneRequirement[]; + + constructor(... orRequirements: EncounterSceneRequirement[]) { + super(); + this.orRequirements = orRequirements; + } + meetsRequirement(scene: BattleScene): boolean { - throw new Error("Method not implemented."); + for (const req of this.orRequirements) { + if (req.meetsRequirement(scene)) { + return true; + } + } + return false; } getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] { - return ["", ""]; + for (const req of this.orRequirements) { + if (req.meetsRequirement(scene)) { + return req.getDialogueToken(scene, pokemon); + } + } + + return null; } } @@ -40,12 +63,49 @@ export abstract class EncounterPokemonRequirement implements EncounterRequiremen * Returns all party members that are compatible with this requirement. For non pokemon related requirements, the entire party is returned. * @param partyPokemon */ + abstract queryParty(partyPokemon: PlayerPokemon[]): PlayerPokemon[]; + + abstract getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string]; +} + +export class CombinationPokemonRequirement extends EncounterPokemonRequirement { + orRequirements: EncounterPokemonRequirement[]; + + constructor(...orRequirements: EncounterPokemonRequirement[]) { + super(); + this.invertQuery = false; + this.minNumberOfPokemon = 1; + this.orRequirements = orRequirements; + } + + meetsRequirement(scene: BattleScene): boolean { + for (const req of this.orRequirements) { + if (req.meetsRequirement(scene)) { + return true; + } + } + return false; + } + queryParty(partyPokemon: PlayerPokemon[]): PlayerPokemon[] { + for (const req of this.orRequirements) { + const result = req.queryParty(partyPokemon); + if (result?.length > 0) { + return result; + } + } + return []; } getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] { - return ["", ""]; + for (const req of this.orRequirements) { + if (req.meetsRequirement(scene)) { + return req.getDialogueToken(scene, pokemon); + } + } + + return null; } } @@ -56,7 +116,7 @@ export class PreviousEncounterRequirement extends EncounterSceneRequirement { * Used for specifying an encounter that must be seen before this encounter can spawn * @param previousEncounterRequirement */ - constructor(previousEncounterRequirement) { + constructor(previousEncounterRequirement: MysteryEncounterType) { super(); this.previousEncounterRequirement = previousEncounterRequirement; } @@ -497,19 +557,16 @@ export class AbilityRequirement extends EncounterPokemonRequirement { queryParty(partyPokemon: PlayerPokemon[]): PlayerPokemon[] { if (!this.invertQuery) { - return partyPokemon.filter((pokemon) => this.requiredAbilities.filter((abilities) => pokemon.hasAbility(abilities)).length > 0); + return partyPokemon.filter((pokemon) => this.requiredAbilities.some((ability) => pokemon.getAbility().id === ability)); } else { // for an inverted query, we only want to get the pokemon that don't have ANY of the listed abilitiess - return partyPokemon.filter((pokemon) => this.requiredAbilities.filter((abilities) => pokemon.hasAbility(abilities)).length === 0); + return partyPokemon.filter((pokemon) => this.requiredAbilities.filter((ability) => pokemon.getAbility().id === ability).length === 0); } } getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] { - const reqAbilities = this.requiredAbilities.filter((a) => { - pokemon.hasAbility(a); - }); - if (reqAbilities.length > 0) { - return ["ability", Abilities[reqAbilities[0]]]; + if (this.requiredAbilities.some(a => pokemon.getAbility().id === a)) { + return ["ability", pokemon.getAbility().name]; } return null; } diff --git a/src/data/mystery-encounters/mystery-encounter.ts b/src/data/mystery-encounters/mystery-encounter.ts index aa9d4ef0997..895d6bd2da0 100644 --- a/src/data/mystery-encounters/mystery-encounter.ts +++ b/src/data/mystery-encounters/mystery-encounter.ts @@ -2,14 +2,14 @@ import { EnemyPartyConfig } from "#app/data/mystery-encounters/utils/encounter-p import Pokemon, { PlayerPokemon, PokemonMove } from "#app/field/pokemon"; import { isNullOrUndefined } from "#app/utils"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; -import BattleScene from "../../battle-scene"; -import MysteryEncounterIntroVisuals, { MysteryEncounterSpriteConfig } from "../../field/mystery-encounter-intro"; -import * as Utils from "../../utils"; +import BattleScene from "#app/battle-scene"; +import MysteryEncounterIntroVisuals, { MysteryEncounterSpriteConfig } from "#app/field/mystery-encounter-intro"; +import * as Utils from "#app/utils"; import { StatusEffect } from "../status-effect"; import MysteryEncounterDialogue, { OptionTextDisplay } from "./mystery-encounter-dialogue"; -import MysteryEncounterOption, { EncounterOptionMode, MysteryEncounterOptionBuilder, OptionPhaseCallback } from "./mystery-encounter-option"; +import MysteryEncounterOption, { MysteryEncounterOptionBuilder, OptionPhaseCallback } from "./mystery-encounter-option"; import { EncounterPokemonRequirement, EncounterSceneRequirement, @@ -20,27 +20,9 @@ import { } from "./mystery-encounter-requirements"; import { BattlerIndex } from "#app/battle"; import { EncounterAnim } from "#app/data/battle-anims"; - -export enum MysteryEncounterVariant { - DEFAULT, - TRAINER_BATTLE, - WILD_BATTLE, - BOSS_BATTLE, - NO_BATTLE, - /** For spawning new encounter queries instead of continuing to next wave */ - CONTINUOUS_ENCOUNTER -} - -/** - * Enum values are base spawn weights of each tier - */ -export enum MysteryEncounterTier { - COMMON = 64, - GREAT = 40, - ULTRA = 21, - ROGUE = 3, - MASTER = 0 // Not currently used -} +import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; +import { MysteryEncounterMode } from "#enums/mystery-encounter-mode"; +import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; export interface StartOfBattleEffect { sourcePokemon?: Pokemon; @@ -130,7 +112,7 @@ export default interface IMysteryEncounter { * For example, if there is no battle as part of the encounter/selected option, should be set to NO_BATTLE * Defaults to DEFAULT */ - encounterVariant?: MysteryEncounterVariant; + encounterMode?: MysteryEncounterMode; /** * Flag for checking if it's the first time a shop is being shown for an encounter. * Defaults to true so that the first shop does not override the specified rewards. @@ -181,7 +163,7 @@ export default class IMysteryEncounter implements IMysteryEncounter { this.dialogue = this.dialogue ?? {}; // Default max is 1 for ROGUE encounters, 3 for others this.maxAllowedEncounters = this.maxAllowedEncounters ?? this.encounterTier === MysteryEncounterTier.ROGUE ? 1 : 3; - this.encounterVariant = MysteryEncounterVariant.DEFAULT; + this.encounterMode = MysteryEncounterMode.DEFAULT; this.requirements = this.requirements ? this.requirements : []; this.hideBattleIntroMessage = !isNullOrUndefined(this.hideBattleIntroMessage) ? this.hideBattleIntroMessage : false; this.autoHideIntroVisuals = !isNullOrUndefined(this.autoHideIntroVisuals) ? this.autoHideIntroVisuals : true; @@ -314,7 +296,9 @@ export default class IMysteryEncounter implements IMysteryEncounter { if (this.requirements?.length > 0) { for (const req of this.requirements) { const dialogueToken = req.getDialogueToken(scene); - this.setDialogueToken(...dialogueToken); + if (dialogueToken?.length === 2) { + this.setDialogueToken(...dialogueToken); + } } } if (this.primaryPokemon?.length > 0) { @@ -322,7 +306,9 @@ export default class IMysteryEncounter implements IMysteryEncounter { for (const req of this.primaryPokemonRequirements) { if (!req.invertQuery) { const value = req.getDialogueToken(scene, this.primaryPokemon); - this.setDialogueToken("primary" + this.capitalizeFirstLetter(value[0]), value[1]); + if (value?.length === 2) { + this.setDialogueToken("primary" + this.capitalizeFirstLetter(value[0]), value[1]); + } } } } @@ -331,6 +317,9 @@ export default class IMysteryEncounter implements IMysteryEncounter { for (const req of this.secondaryPokemonRequirements) { if (!req.invertQuery) { const value = req.getDialogueToken(scene, this.secondaryPokemon[0]); + if (value?.length === 2) { + this.setDialogueToken("primary" + this.capitalizeFirstLetter(value[0]), value[1]); + } this.setDialogueToken("secondary" + this.capitalizeFirstLetter(value[0]), value[1]); } } @@ -344,7 +333,9 @@ export default class IMysteryEncounter implements IMysteryEncounter { if (opt.requirements?.length > 0) { for (const req of opt.requirements) { const dialogueToken = req.getDialogueToken(scene); - this.setDialogueToken("option" + j + this.capitalizeFirstLetter(dialogueToken[0]), dialogueToken[1]); + if (dialogueToken?.length === 2) { + this.setDialogueToken("option" + j + this.capitalizeFirstLetter(dialogueToken[0]), dialogueToken[1]); + } } } if (opt.primaryPokemonRequirements?.length > 0 && opt.primaryPokemon?.length > 0) { @@ -352,7 +343,9 @@ export default class IMysteryEncounter implements IMysteryEncounter { for (const req of opt.primaryPokemonRequirements) { if (!req.invertQuery) { const value = req.getDialogueToken(scene, opt.primaryPokemon); - this.setDialogueToken("option" + j + "Primary" + this.capitalizeFirstLetter(value[0]), value[1]); + if (value?.length === 2) { + this.setDialogueToken("option" + j + "Primary" + this.capitalizeFirstLetter(value[0]), value[1]); + } } } } @@ -361,7 +354,9 @@ export default class IMysteryEncounter implements IMysteryEncounter { for (const req of opt.secondaryPokemonRequirements) { if (!req.invertQuery) { const value = req.getDialogueToken(scene, opt.secondaryPokemon[0]); - this.setDialogueToken("option" + j + "Secondary" + this.capitalizeFirstLetter(value[0]), value[1]); + if (value?.length === 2) { + this.setDialogueToken("option" + j + "Secondary" + this.capitalizeFirstLetter(value[0]), value[1]); + } } } } @@ -373,7 +368,7 @@ export default class IMysteryEncounter implements IMysteryEncounter { } /** - * If an encounter uses {@link MysteryEncounterVariant.CONTINUOUS_ENCOUNTER}, + * If an encounter uses {@link MysteryEncounterMode.CONTINUOUS_ENCOUNTER}, * should rely on this value for seed offset instead of wave index. * * This offset is incremented for each new {@link MysteryEncounterPhase} that occurs, @@ -466,7 +461,7 @@ export class MysteryEncounterBuilder implements Partial { * @returns */ withSimpleOption(dialogue: OptionTextDisplay, callback: OptionPhaseCallback): this & Pick { - return this.withOption(new MysteryEncounterOptionBuilder().withOptionMode(EncounterOptionMode.DEFAULT).withDialogue(dialogue).withOptionPhase(callback).build()); + return this.withOption(new MysteryEncounterOptionBuilder().withOptionMode(MysteryEncounterOptionMode.DEFAULT).withDialogue(dialogue).withOptionPhase(callback).build()); } /** @@ -481,7 +476,7 @@ export class MysteryEncounterBuilder implements Partial { */ withSimpleDexProgressOption(dialogue: OptionTextDisplay, callback: OptionPhaseCallback): this & Pick { return this.withOption(new MysteryEncounterOptionBuilder() - .withOptionMode(EncounterOptionMode.DEFAULT) + .withOptionMode(MysteryEncounterOptionMode.DEFAULT) .withHasDexProgress(true) .withDialogue(dialogue) .withOptionPhase(callback).build()); @@ -592,6 +587,10 @@ export class MysteryEncounterBuilder implements Partial { * @returns */ withPrimaryPokemonRequirement(requirement: EncounterPokemonRequirement): this & Required> { + if (requirement instanceof EncounterSceneRequirement) { + Error("Incorrectly added scene requirement as pokemon requirement."); + } + this.primaryPokemonRequirements.push(requirement); return Object.assign(this, { primaryPokemonRequirements: this.primaryPokemonRequirements }); } @@ -624,6 +623,10 @@ export class MysteryEncounterBuilder implements Partial { // ex. if your only grass type pokemon, a snivy, is chosen as primary, if the support pokemon requires a grass type, the event won't trigger because // it's already been withSecondaryPokemonRequirement(requirement: EncounterPokemonRequirement, excludePrimaryFromSecondaryRequirements: boolean = false): this & Required> { + if (requirement instanceof EncounterSceneRequirement) { + Error("Incorrectly added scene requirement as pokemon requirement."); + } + this.secondaryPokemonRequirements.push(requirement); this.excludePrimaryFromSupportRequirements = excludePrimaryFromSecondaryRequirements; return Object.assign(this, { excludePrimaryFromSecondaryRequirements: this.excludePrimaryFromSupportRequirements, secondaryPokemonRequirements: this.secondaryPokemonRequirements }); diff --git a/src/data/mystery-encounters/requirements/requirement-groups.ts b/src/data/mystery-encounters/requirements/requirement-groups.ts index 4e9eb7ad4e5..cf23ace2efd 100644 --- a/src/data/mystery-encounters/requirements/requirement-groups.ts +++ b/src/data/mystery-encounters/requirements/requirement-groups.ts @@ -61,7 +61,7 @@ export const EXTORTION_MOVES = [ Moves.BEAT_UP, Moves.COIL, Moves.WRING_OUT, - Moves.STRING_SHOT + Moves.STRING_SHOT, ]; export const EXTORTION_ABILITIES = [ @@ -69,5 +69,5 @@ export const EXTORTION_ABILITIES = [ Abilities.ARENA_TRAP, Abilities.SHADOW_TAG, Abilities.SUCTION_CUPS, - Abilities.STICKY_HOLD, + Abilities.STICKY_HOLD ]; diff --git a/src/data/mystery-encounters/utils/encounter-phase-utils.ts b/src/data/mystery-encounters/utils/encounter-phase-utils.ts index 9178747500f..0064d6a105f 100644 --- a/src/data/mystery-encounters/utils/encounter-phase-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-phase-utils.ts @@ -18,17 +18,17 @@ import { BattlerTagType } from "#enums/battler-tag-type"; import { Biome } from "#enums/biome"; import { TrainerType } from "#enums/trainer-type"; import i18next from "i18next"; -import BattleScene from "../../../battle-scene"; -import Trainer, { TrainerVariant } from "../../../field/trainer"; -import * as Utils from "../../../utils"; -import PokemonSpecies from "../../pokemon-species"; -import { Status, StatusEffect } from "../../status-effect"; -import { TrainerConfig, trainerConfigs, TrainerSlot } from "../../trainer-config"; -import { MysteryEncounterVariant } from "../mystery-encounter"; +import BattleScene from "#app/battle-scene"; +import Trainer, { TrainerVariant } from "#app/field/trainer"; +import * as Utils from "#app/utils"; import { Gender } from "#app/data/gender"; import { Nature } from "#app/data/nature"; import { Moves } from "#enums/moves"; import { initMoveAnim, loadMoveAnimAssets } from "#app/data/battle-anims"; +import { MysteryEncounterMode } from "#enums/mystery-encounter-mode"; +import { Status, StatusEffect } from "#app/data/status-effect"; +import { TrainerConfig, trainerConfigs, TrainerSlot } from "#app/data/trainer-config"; +import PokemonSpecies from "#app/data/pokemon-species"; /** * Animates exclamation sprite over trainer's head at start of encounter @@ -107,7 +107,7 @@ export async function initBattleWithEnemyConfig(scene: BattleScene, partyConfig: const trainerType = partyConfig?.trainerType; let trainerConfig = partyConfig?.trainerConfig; if (trainerType || trainerConfig) { - scene.currentBattle.mysteryEncounter.encounterVariant = MysteryEncounterVariant.TRAINER_BATTLE; + scene.currentBattle.mysteryEncounter.encounterMode = MysteryEncounterMode.TRAINER_BATTLE; if (scene.currentBattle.trainer) { scene.currentBattle.trainer.setVisible(false); scene.currentBattle.trainer.destroy(); @@ -128,7 +128,7 @@ export async function initBattleWithEnemyConfig(scene: BattleScene, partyConfig: battle.enemyLevels = scene.currentBattle.trainer.getPartyLevels(scene.currentBattle.waveIndex); } else { // Wild - scene.currentBattle.mysteryEncounter.encounterVariant = MysteryEncounterVariant.WILD_BATTLE; + scene.currentBattle.mysteryEncounter.encounterMode = MysteryEncounterMode.WILD_BATTLE; battle.enemyLevels = new Array(partyConfig?.pokemonConfigs?.length > 0 ? partyConfig?.pokemonConfigs?.length : doubleBattle ? 2 : 1).fill(null).map(() => scene.currentBattle.getLevelForWave()); } @@ -160,7 +160,7 @@ export async function initBattleWithEnemyConfig(scene: BattleScene, partyConfig: enemySpecies = config.species; isBoss = config.isBoss; if (isBoss) { - scene.currentBattle.mysteryEncounter.encounterVariant = MysteryEncounterVariant.BOSS_BATTLE; + scene.currentBattle.mysteryEncounter.encounterMode = MysteryEncounterMode.BOSS_BATTLE; } } else { enemySpecies = scene.randomSpecies(battle.waveIndex, level, true); @@ -508,7 +508,7 @@ export function setEncounterExp(scene: BattleScene, participantId: integer | int let expValue = Math.floor(baseExpValue * (useWaveIndex ? scene.currentBattle.waveIndex : 1) / 5 + 1); if (participantIds?.length > 0) { - if (scene.currentBattle.mysteryEncounter.encounterVariant === MysteryEncounterVariant.TRAINER_BATTLE) { + if (scene.currentBattle.mysteryEncounter.encounterMode === MysteryEncounterMode.TRAINER_BATTLE) { expValue = Math.floor(expValue * 1.5); } for (const partyMember of nonFaintedPartyMembers) { @@ -609,7 +609,7 @@ export function initSubsequentOptionSelect(scene: BattleScene, optionSelectSetti * @param addHealPhase - when true, will add a shop phase to end of encounter with 0 rewards but healing items are available */ export function leaveEncounterWithoutBattle(scene: BattleScene, addHealPhase: boolean = false) { - scene.currentBattle.mysteryEncounter.encounterVariant = MysteryEncounterVariant.NO_BATTLE; + scene.currentBattle.mysteryEncounter.encounterMode = MysteryEncounterMode.NO_BATTLE; scene.clearPhaseQueue(); scene.clearPhaseQueueSplice(); handleMysteryEncounterVictory(scene, addHealPhase); @@ -626,14 +626,14 @@ export function handleMysteryEncounterVictory(scene: BattleScene, addHealPhase: // If in repeated encounter variant, do nothing // Variant must eventually be swapped in order to handle "true" end of the encounter - if (scene.currentBattle.mysteryEncounter.encounterVariant === MysteryEncounterVariant.CONTINUOUS_ENCOUNTER) { + if (scene.currentBattle.mysteryEncounter.encounterMode === MysteryEncounterMode.CONTINUOUS_ENCOUNTER) { return; - } else if (scene.currentBattle.mysteryEncounter.encounterVariant === MysteryEncounterVariant.NO_BATTLE) { + } else if (scene.currentBattle.mysteryEncounter.encounterMode === MysteryEncounterMode.NO_BATTLE) { scene.pushPhase(new EggLapsePhase(scene)); scene.pushPhase(new MysteryEncounterRewardsPhase(scene, addHealPhase)); - } else if (!scene.getEnemyParty().find(p => scene.currentBattle.mysteryEncounter.encounterVariant !== MysteryEncounterVariant.TRAINER_BATTLE ? p.isOnField() : !p?.isFainted(true))) { + } else if (!scene.getEnemyParty().find(p => scene.currentBattle.mysteryEncounter.encounterMode !== MysteryEncounterMode.TRAINER_BATTLE ? p.isOnField() : !p?.isFainted(true))) { scene.pushPhase(new BattleEndPhase(scene)); - if (scene.currentBattle.mysteryEncounter.encounterVariant === MysteryEncounterVariant.TRAINER_BATTLE) { + if (scene.currentBattle.mysteryEncounter.encounterMode === MysteryEncounterMode.TRAINER_BATTLE) { scene.pushPhase(new TrainerVictoryPhase(scene)); } if (scene.gameMode.isEndless || !scene.gameMode.isWaveFinal(scene.currentBattle.waveIndex)) { @@ -693,7 +693,7 @@ export function transitionMysteryEncounterIntroVisuals(scene: BattleScene, hide: */ export function handleMysteryEncounterBattleStartEffects(scene: BattleScene) { const encounter = scene.currentBattle?.mysteryEncounter; - if (scene.currentBattle.battleType === BattleType.MYSTERY_ENCOUNTER && encounter.encounterVariant !== MysteryEncounterVariant.NO_BATTLE && !encounter.startOfBattleEffectsComplete) { + if (scene.currentBattle.battleType === BattleType.MYSTERY_ENCOUNTER && encounter.encounterMode !== MysteryEncounterMode.NO_BATTLE && !encounter.startOfBattleEffectsComplete) { const effects = encounter.startOfBattleEffects; effects.forEach(effect => { let source; diff --git a/src/enums/mystery-encounter-mode.ts b/src/enums/mystery-encounter-mode.ts new file mode 100644 index 00000000000..03094040ce0 --- /dev/null +++ b/src/enums/mystery-encounter-mode.ts @@ -0,0 +1,9 @@ +export enum MysteryEncounterMode { + DEFAULT, + TRAINER_BATTLE, + WILD_BATTLE, + BOSS_BATTLE, + NO_BATTLE, + /** For spawning new encounter queries instead of continuing to next wave */ + CONTINUOUS_ENCOUNTER +} diff --git a/src/enums/mystery-encounter-option-mode.ts b/src/enums/mystery-encounter-option-mode.ts new file mode 100644 index 00000000000..a994c30581b --- /dev/null +++ b/src/enums/mystery-encounter-option-mode.ts @@ -0,0 +1,10 @@ +export enum MysteryEncounterOptionMode { + /** Default style */ + DEFAULT, + /** Disabled on requirements not met, default style on requirements met */ + DISABLED_OR_DEFAULT, + /** Default style on requirements not met, special style on requirements met */ + DEFAULT_OR_SPECIAL, + /** Disabled on requirements not met, special style on requirements met */ + DISABLED_OR_SPECIAL +} diff --git a/src/enums/mystery-encounter-tier.ts b/src/enums/mystery-encounter-tier.ts new file mode 100644 index 00000000000..b3924b2ff9d --- /dev/null +++ b/src/enums/mystery-encounter-tier.ts @@ -0,0 +1,10 @@ +/** + * Enum values are base spawn weights of each tier + */ +export enum MysteryEncounterTier { + COMMON = 64, + GREAT = 40, + ULTRA = 21, + ROGUE = 3, + MASTER = 0 // Not currently used +} diff --git a/src/locales/en/mystery-encounters/offer-you-cant-refuse-dialogue.ts b/src/locales/en/mystery-encounters/offer-you-cant-refuse-dialogue.ts index dda5810b0a4..7cee39b3ae8 100644 --- a/src/locales/en/mystery-encounters/offer-you-cant-refuse-dialogue.ts +++ b/src/locales/en/mystery-encounters/offer-you-cant-refuse-dialogue.ts @@ -1,10 +1,10 @@ export const offerYouCantRefuseDialogue = { intro: "You're stopped by a rich looking boy.", - speaker: "Rich Kid", + speaker: "Rich Boy", 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, and\nI'll even give you this old bauble!`, + $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 is an extremely good deal, but can you really bear to part with such a strong team member?", query: "What will you do?", @@ -18,11 +18,10 @@ export const offerYouCantRefuseDialogue = { }, 2: { label: "Extort the Kid", - tooltip: "(+) Gain {{price, money}}", + tooltip: "(+) {{option2PrimaryName}} uses {{moveOrAbility}}\n(+) Gain {{price, money}}", tooltip_disabled: "Your Pokémon need to have certain moves or abilities to choose this", selected: `My word, we're being robbed, Liepard! - $How wonderful! - $Now I'll have an amazing\nstory for the yacht club!`, + $You'll be hearing from my lawyers for this!`, }, 3: { label: "Leave", diff --git a/src/overrides.ts b/src/overrides.ts index 32a2988641f..b530032364d 100644 --- a/src/overrides.ts +++ b/src/overrides.ts @@ -9,7 +9,7 @@ import { PokeballType } from "./data/pokeball"; import { Gender } from "./data/gender"; import { StatusEffect } from "./data/status-effect"; import { modifierTypes, SpeciesStatBoosterItem } from "./modifier/modifier-type"; -import { VariantTier } from "./enums/variant-tiers"; +import { VariantTier } from "#enums/variant-tiers"; import { EggTier } from "#enums/egg-type"; import { Abilities } from "#enums/abilities"; import { BerryType } from "#enums/berry-type"; @@ -18,7 +18,7 @@ import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { TimeOfDay } from "#enums/time-of-day"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; // eslint-disable-line @typescript-eslint/no-unused-vars -import { MysteryEncounterTier } from "#app/data/mystery-encounters/mystery-encounter"; // eslint-disable-line @typescript-eslint/no-unused-vars +import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; // eslint-disable-line @typescript-eslint/no-unused-vars /** * Overrides for testing different in game situations @@ -117,9 +117,9 @@ export const EGG_GACHA_PULL_COUNT_OVERRIDE: number = 0; */ // 1 to 256, set to null to ignore -export const MYSTERY_ENCOUNTER_RATE_OVERRIDE: number = 256; +export const MYSTERY_ENCOUNTER_RATE_OVERRIDE: number = null; export const MYSTERY_ENCOUNTER_TIER_OVERRIDE: MysteryEncounterTier = null; -export const MYSTERY_ENCOUNTER_OVERRIDE: MysteryEncounterType = MysteryEncounterType.OFFER_YOU_CANT_REFUSE; +export const MYSTERY_ENCOUNTER_OVERRIDE: MysteryEncounterType = null; /** * MODIFIER / ITEM OVERRIDES diff --git a/src/phases.ts b/src/phases.ts index 0ceff19f059..982cc04031e 100644 --- a/src/phases.ts +++ b/src/phases.ts @@ -65,11 +65,11 @@ import { Moves } from "#enums/moves"; import { PlayerGender } from "#enums/player-gender"; import { Species } from "#enums/species"; import { TrainerType } from "#enums/trainer-type"; -import { MysteryEncounterVariant } from "#app/data/mystery-encounters/mystery-encounter"; import { MysteryEncounterPhase } from "#app/phases/mystery-encounter-phases"; import { doTrainerExclamation, handleMysteryEncounterBattleStartEffects, handleMysteryEncounterVictory } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import ModifierSelectUiHandler, { SHOP_OPTIONS_ROW_LIMIT } from "#app/ui/modifier-select-ui-handler"; import { getEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; +import { MysteryEncounterMode } from "#enums/mystery-encounter-mode"; const { t } = i18next; @@ -866,7 +866,7 @@ export class EncounterPhase extends BattlePhase { } if (!this.loaded) { - this.scene.gameData.setPokemonSeen(enemyPokemon, true, battle.battleType === BattleType.TRAINER || battle?.mysteryEncounter?.encounterVariant === MysteryEncounterVariant.TRAINER_BATTLE); + this.scene.gameData.setPokemonSeen(enemyPokemon, true, battle.battleType === BattleType.TRAINER || battle?.mysteryEncounter?.encounterMode === MysteryEncounterMode.TRAINER_BATTLE); } if (enemyPokemon.species.speciesId === Species.ETERNATUS) { @@ -1550,7 +1550,7 @@ export class SummonPhase extends PartyMemberPokemonPhase { onComplete: () => this.scene.trainer.setVisible(false) }); this.scene.time.delayedCall(750, () => this.summon()); - } else if (this.scene.currentBattle.battleType === BattleType.TRAINER || this.scene?.currentBattle?.mysteryEncounter?.encounterVariant === MysteryEncounterVariant.TRAINER_BATTLE) { + } else if (this.scene.currentBattle.battleType === BattleType.TRAINER || this.scene?.currentBattle?.mysteryEncounter?.encounterMode === MysteryEncounterMode.TRAINER_BATTLE) { const trainerName = this.scene.currentBattle.trainer.getName(!(this.fieldIndex % 2) ? TrainerSlot.TRAINER : TrainerSlot.TRAINER_PARTNER); const pokemonName = this.getPokemon().name; const message = i18next.t("battle:trainerSendOut", { trainerName, pokemonName }); diff --git a/src/phases/mystery-encounter-phases.ts b/src/phases/mystery-encounter-phases.ts index d55bcaad636..1213472c35d 100644 --- a/src/phases/mystery-encounter-phases.ts +++ b/src/phases/mystery-encounter-phases.ts @@ -5,7 +5,6 @@ import { Mode } from "../ui/ui"; import { transitionMysteryEncounterIntroVisuals, OptionSelectSettings } from "../data/mystery-encounters/utils/encounter-phase-utils"; import { CheckSwitchPhase, NewBattlePhase, ReturnPhase, ScanIvsPhase, SelectModifierPhase, SummonPhase, ToggleDoublePositionPhase } from "../phases"; import MysteryEncounterOption, { OptionPhaseCallback } from "../data/mystery-encounters/mystery-encounter-option"; -import { MysteryEncounterVariant } from "../data/mystery-encounters/mystery-encounter"; import { getCharVariantFromDialogue } from "../data/dialogue"; import { TrainerSlot } from "../data/trainer-config"; import { BattleSpec } from "#enums/battle-spec"; @@ -15,6 +14,7 @@ import * as Utils from "../utils"; import { isNullOrUndefined } from "../utils"; import { getEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; import { BattlerTagLapseType } from "#app/data/battler-tags"; +import { MysteryEncounterMode } from "#enums/mystery-encounter-mode"; /** * Will handle (in order): @@ -210,13 +210,13 @@ export class MysteryEncounterBattlePhase extends Phase { getBattleMessage(scene: BattleScene): string { const enemyField = scene.getEnemyField(); - const encounterVariant = scene.currentBattle.mysteryEncounter.encounterVariant; + const encounterMode = scene.currentBattle.mysteryEncounter.encounterMode; if (scene.currentBattle.battleSpec === BattleSpec.FINAL_BOSS) { return i18next.t("battle:bossAppeared", { bossName: enemyField[0].name }); } - if (encounterVariant === MysteryEncounterVariant.TRAINER_BATTLE) { + if (encounterMode === MysteryEncounterMode.TRAINER_BATTLE) { if (scene.currentBattle.double) { return i18next.t("battle:trainerAppearedDouble", { trainerName: scene.currentBattle.trainer.getName(TrainerSlot.NONE, true) }); @@ -231,10 +231,10 @@ export class MysteryEncounterBattlePhase extends Phase { } doMysteryEncounterBattle(scene: BattleScene) { - const encounterVariant = scene.currentBattle.mysteryEncounter.encounterVariant; - if (encounterVariant === MysteryEncounterVariant.WILD_BATTLE || encounterVariant === MysteryEncounterVariant.BOSS_BATTLE) { + const encounterMode = scene.currentBattle.mysteryEncounter.encounterMode; + if (encounterMode === MysteryEncounterMode.WILD_BATTLE || encounterMode === MysteryEncounterMode.BOSS_BATTLE) { // Summons the wild/boss Pokemon - if (encounterVariant === MysteryEncounterVariant.BOSS_BATTLE) { + if (encounterMode === MysteryEncounterMode.BOSS_BATTLE) { scene.playBgm(undefined); } const availablePartyMembers = scene.getEnemyParty().filter(p => !p.isFainted()).length; @@ -248,7 +248,7 @@ export class MysteryEncounterBattlePhase extends Phase { } else { this.endBattleSetup(scene); } - } else if (encounterVariant === MysteryEncounterVariant.TRAINER_BATTLE) { + } else if (encounterMode === MysteryEncounterMode.TRAINER_BATTLE) { this.showEnemyTrainer(); const doSummon = () => { scene.currentBattle.started = true; @@ -296,11 +296,11 @@ export class MysteryEncounterBattlePhase extends Phase { endBattleSetup(scene: BattleScene) { const enemyField = scene.getEnemyField(); - const encounterVariant = scene.currentBattle.mysteryEncounter.encounterVariant; + const encounterMode = scene.currentBattle.mysteryEncounter.encounterMode; // PostSummon and ShinySparkle phases are handled by SummonPhase - if (encounterVariant !== MysteryEncounterVariant.TRAINER_BATTLE) { + if (encounterMode !== MysteryEncounterMode.TRAINER_BATTLE) { const ivScannerModifier = this.scene.findModifier(m => m instanceof IvScannerModifier); if (ivScannerModifier) { enemyField.map(p => this.scene.pushPhase(new ScanIvsPhase(this.scene, p.getBattlerIndex(), Math.min(ivScannerModifier.getStackCount() * 2, 6)))); @@ -327,7 +327,7 @@ export class MysteryEncounterBattlePhase extends Phase { scene.pushPhase(new ToggleDoublePositionPhase(scene, false)); } - if (encounterVariant !== MysteryEncounterVariant.TRAINER_BATTLE && !this.disableSwitch) { + if (encounterMode !== MysteryEncounterMode.TRAINER_BATTLE && !this.disableSwitch) { const minPartySize = scene.currentBattle.double ? 2 : 1; if (availablePartyMembers.length > minPartySize) { scene.pushPhase(new CheckSwitchPhase(scene, 0, scene.currentBattle.double)); diff --git a/src/test/mystery-encounter/encounterTestUtils.ts b/src/test/mystery-encounter/encounterTestUtils.ts index 88233032ccd..24afc428e68 100644 --- a/src/test/mystery-encounter/encounterTestUtils.ts +++ b/src/test/mystery-encounter/encounterTestUtils.ts @@ -13,6 +13,53 @@ import { Status, StatusEffect } from "#app/data/status-effect"; * @param optionNo - human number, not index * @param isBattle - if selecting option should lead to battle, set to true */ +export async function runMysteryEncounterToEnd(game: GameManager, optionNo: number, isBattle: boolean = false) { + await runSelectMysteryEncounterOption(game, optionNo, isBattle); + + // run the selected options phase + game.onNextPrompt("MysteryEncounterOptionSelectedPhase", Mode.MESSAGE, () => { + const uiHandler = game.scene.ui.getHandler(); + uiHandler.processInput(Button.ACTION); + }); + + // If a battle is started, fast forward to end of the battle + game.onNextPrompt("CommandPhase", Mode.COMMAND, () => { + game.scene.clearPhaseQueue(); + game.scene.clearPhaseQueueSplice(); + game.scene.unshiftPhase(new VictoryPhase(game.scene, 0)); + game.endPhase(); + }); + + // Handle end of battle trainer messages + game.onNextPrompt("TrainerVictoryPhase", Mode.MESSAGE, () => { + const uiHandler = game.scene.ui.getHandler(); + uiHandler.processInput(Button.ACTION); + }); + + // Handle egg hatch dialogue + game.onNextPrompt("EggLapsePhase", Mode.MESSAGE, () => { + const uiHandler = game.scene.ui.getHandler(); + uiHandler.processInput(Button.ACTION); + }); + + // Handle modifier reward dialogue + game.onNextPrompt("ModifierRewardPhase", Mode.MESSAGE, () => { + const uiHandler = game.scene.ui.getHandler(); + uiHandler.processInput(Button.ACTION); + }); + + game.onNextPrompt("SelectModifier", Mode.MODIFIER_SELECT, () => { + const uiHandler = game.scene.ui.getHandler(); + uiHandler.processInput(Button.ACTION); + }); + + if (isBattle) { + await game.phaseInterceptor.to(CommandPhase); + } else { + await game.phaseInterceptor.to(MysteryEncounterRewardsPhase); + } +} + export async function runSelectMysteryEncounterOption(game: GameManager, optionNo: number, isBattle: boolean = false) { // Handle any eventual queued messages (e.g. weather phase, etc.) game.onNextPrompt("MessagePhase", Mode.MESSAGE, () => { @@ -53,38 +100,6 @@ export async function runSelectMysteryEncounterOption(game: GameManager, optionN } uiHandler.processInput(Button.ACTION); - - // run the selected options phase - game.onNextPrompt("MysteryEncounterOptionSelectedPhase", Mode.MESSAGE, () => { - const uiHandler = game.scene.ui.getHandler(); - uiHandler.processInput(Button.ACTION); - }); - - // If a battle is started, fast forward to end of the battle - game.onNextPrompt("CommandPhase", Mode.COMMAND, () => { - game.scene.clearPhaseQueue(); - game.scene.clearPhaseQueueSplice(); - game.scene.unshiftPhase(new VictoryPhase(game.scene, 0)); - game.endPhase(); - }); - - // Handle end of battle trainer messages - game.onNextPrompt("TrainerVictoryPhase", Mode.MESSAGE, () => { - const uiHandler = game.scene.ui.getHandler(); - uiHandler.processInput(Button.ACTION); - }); - - // Handle egg hatch dialogue - game.onNextPrompt("EggLapsePhase", Mode.MESSAGE, () => { - const uiHandler = game.scene.ui.getHandler(); - uiHandler.processInput(Button.ACTION); - }); - - if (isBattle) { - await game.phaseInterceptor.to(CommandPhase); - } else { - await game.phaseInterceptor.to(MysteryEncounterRewardsPhase); - } } /** 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 cbc5ab7950e..095d8a109d7 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,15 +5,15 @@ 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 { EncounterOptionMode } from "#app/data/mystery-encounters/mystery-encounter-option"; -import { runSelectMysteryEncounterOption } from "#test/mystery-encounter/encounterTestUtils"; +import { runMysteryEncounterToEnd } from "#test/mystery-encounter/encounterTestUtils"; import { SelectModifierPhase } from "#app/phases"; import BattleScene from "#app/battle-scene"; -import { MysteryEncounterTier } from "#app/data/mystery-encounters/mystery-encounter"; import { Mode } from "#app/ui/ui"; import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; import { DepartmentStoreSaleEncounter } from "#app/data/mystery-encounters/encounters/department-store-sale-encounter"; import { CIVILIZATION_ENCOUNTER_BIOMES } from "#app/data/mystery-encounters/mystery-encounters"; +import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; +import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; const namespace = "mysteryEncounter:departmentStoreSale"; const defaultParty = [Species.LAPRAS, Species.GENGAR, Species.ABRA]; @@ -98,7 +98,7 @@ describe("Department Store Sale - Mystery Encounter", () => { describe("Option 1 - TM Shop", () => { it("should have the correct properties", () => { const option = DepartmentStoreSaleEncounter.options[0]; - expect(option.optionMode).toBe(EncounterOptionMode.DEFAULT); + expect(option.optionMode).toBe(MysteryEncounterOptionMode.DEFAULT); expect(option.dialogue).toBeDefined(); expect(option.dialogue).toStrictEqual({ buttonLabel: `${namespace}:option:1:label`, @@ -108,7 +108,7 @@ describe("Department Store Sale - Mystery Encounter", () => { it("should have shop with only TMs", async () => { await game.runToMysteryEncounter(MysteryEncounterType.DEPARTMENT_STORE_SALE, defaultParty); - await runSelectMysteryEncounterOption(game, 1); + await runMysteryEncounterToEnd(game, 1); expect(scene.getCurrentPhase().constructor.name).toBe(SelectModifierPhase.name); await game.phaseInterceptor.run(SelectModifierPhase); @@ -124,7 +124,7 @@ describe("Department Store Sale - Mystery Encounter", () => { const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); await game.runToMysteryEncounter(MysteryEncounterType.DEPARTMENT_STORE_SALE, defaultParty); - await runSelectMysteryEncounterOption(game, 1); + await runMysteryEncounterToEnd(game, 1); expect(leaveEncounterWithoutBattleSpy).toBeCalled(); }); @@ -133,7 +133,7 @@ describe("Department Store Sale - Mystery Encounter", () => { describe("Option 2 - Vitamin Shop", () => { it("should have the correct properties", () => { const option = DepartmentStoreSaleEncounter.options[1]; - expect(option.optionMode).toBe(EncounterOptionMode.DEFAULT); + expect(option.optionMode).toBe(MysteryEncounterOptionMode.DEFAULT); expect(option.dialogue).toBeDefined(); expect(option.dialogue).toStrictEqual({ buttonLabel: `${namespace}:option:2:label`, @@ -143,7 +143,7 @@ describe("Department Store Sale - Mystery Encounter", () => { it("should have shop with only Vitamins", async () => { await game.runToMysteryEncounter(MysteryEncounterType.DEPARTMENT_STORE_SALE, defaultParty); - await runSelectMysteryEncounterOption(game, 2); + await runMysteryEncounterToEnd(game, 2); expect(scene.getCurrentPhase().constructor.name).toBe(SelectModifierPhase.name); await game.phaseInterceptor.run(SelectModifierPhase); @@ -160,7 +160,7 @@ describe("Department Store Sale - Mystery Encounter", () => { const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); await game.runToMysteryEncounter(MysteryEncounterType.DEPARTMENT_STORE_SALE, defaultParty); - await runSelectMysteryEncounterOption(game, 2); + await runMysteryEncounterToEnd(game, 2); expect(leaveEncounterWithoutBattleSpy).toBeCalled(); }); @@ -169,7 +169,7 @@ describe("Department Store Sale - Mystery Encounter", () => { describe("Option 3 - X Item Shop", () => { it("should have the correct properties", () => { const option = DepartmentStoreSaleEncounter.options[2]; - expect(option.optionMode).toBe(EncounterOptionMode.DEFAULT); + expect(option.optionMode).toBe(MysteryEncounterOptionMode.DEFAULT); expect(option.dialogue).toBeDefined(); expect(option.dialogue).toStrictEqual({ buttonLabel: `${namespace}:option:3:label`, @@ -179,7 +179,7 @@ describe("Department Store Sale - Mystery Encounter", () => { it("should have shop with only X Items", async () => { await game.runToMysteryEncounter(MysteryEncounterType.DEPARTMENT_STORE_SALE, defaultParty); - await runSelectMysteryEncounterOption(game, 3); + await runMysteryEncounterToEnd(game, 3); expect(scene.getCurrentPhase().constructor.name).toBe(SelectModifierPhase.name); await game.phaseInterceptor.run(SelectModifierPhase); @@ -196,7 +196,7 @@ describe("Department Store Sale - Mystery Encounter", () => { const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); await game.runToMysteryEncounter(MysteryEncounterType.DEPARTMENT_STORE_SALE, defaultParty); - await runSelectMysteryEncounterOption(game, 3); + await runMysteryEncounterToEnd(game, 3); expect(leaveEncounterWithoutBattleSpy).toBeCalled(); }); @@ -205,7 +205,7 @@ describe("Department Store Sale - Mystery Encounter", () => { describe("Option 4 - Pokeball Shop", () => { it("should have the correct properties", () => { const option = DepartmentStoreSaleEncounter.options[3]; - expect(option.optionMode).toBe(EncounterOptionMode.DEFAULT); + expect(option.optionMode).toBe(MysteryEncounterOptionMode.DEFAULT); expect(option.dialogue).toBeDefined(); expect(option.dialogue).toStrictEqual({ buttonLabel: `${namespace}:option:4:label`, @@ -215,7 +215,7 @@ describe("Department Store Sale - Mystery Encounter", () => { it("should have shop with only Pokeballs", async () => { await game.runToMysteryEncounter(MysteryEncounterType.DEPARTMENT_STORE_SALE, defaultParty); - await runSelectMysteryEncounterOption(game, 4); + await runMysteryEncounterToEnd(game, 4); expect(scene.getCurrentPhase().constructor.name).toBe(SelectModifierPhase.name); await game.phaseInterceptor.run(SelectModifierPhase); @@ -231,7 +231,7 @@ describe("Department Store Sale - Mystery Encounter", () => { const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); await game.runToMysteryEncounter(MysteryEncounterType.DEPARTMENT_STORE_SALE, defaultParty); - await runSelectMysteryEncounterOption(game, 4); + await runMysteryEncounterToEnd(game, 4); expect(leaveEncounterWithoutBattleSpy).toBeCalled(); }); 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 33845d1dfe5..076159dcd19 100644 --- a/src/test/mystery-encounter/encounters/fiery-fallout-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/fiery-fallout-encounter.test.ts @@ -5,20 +5,21 @@ import { Species } from "#app/enums/species"; import GameManager from "#app/test/utils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { FieryFalloutEncounter } from "#app/data/mystery-encounters/encounters/fiery-fallout-encounter"; -import Battle from "#app/battle"; 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 { EncounterOptionMode } from "#app/data/mystery-encounters/mystery-encounter-option"; -import { runSelectMysteryEncounterOption, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounterTestUtils"; +import { runMysteryEncounterToEnd, runSelectMysteryEncounterOption, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounterTestUtils"; import { CommandPhase, MovePhase, SelectModifierPhase } from "#app/phases"; import { Moves } from "#enums/moves"; import BattleScene from "#app/battle-scene"; import { PokemonHeldItemModifier } from "#app/modifier/modifier"; import { Type } from "#app/data/type"; import { Status, StatusEffect } from "#app/data/status-effect"; -import { MysteryEncounterTier } from "#app/data/mystery-encounters/mystery-encounter"; +import { MysteryEncounterPhase } from "#app/phases/mystery-encounter-phases"; +import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; +import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; +import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; const namespace = "mysteryEncounter:fieryFallout"; /** Arcanine and Ninetails for 2 Fire types. Lapras, Gengar, Abra for burnable mon. */ @@ -94,7 +95,8 @@ describe("Fiery Fallout - Mystery Encounter", () => { }); it("should initialize fully ", async () => { - vi.spyOn(scene, "currentBattle", "get").mockReturnValue({ mysteryEncounter: FieryFalloutEncounter } as Battle); + initSceneWithoutEncounterPhase(scene, defaultParty); + scene.currentBattle.mysteryEncounter = FieryFalloutEncounter; const weatherSpy = vi.spyOn(scene.arena, "trySetWeather").mockReturnValue(true); const moveInitSpy = vi.spyOn(BattleAnims, "initMoveAnim"); const moveLoadSpy = vi.spyOn(BattleAnims, "loadMoveAnimAssets"); @@ -103,6 +105,7 @@ describe("Fiery Fallout - Mystery Encounter", () => { expect(FieryFalloutEncounter.onInit).toBeDefined(); + FieryFalloutEncounter.populateDialogueTokensFromRequirements(scene); const onInitResult = onInit(scene); expect(FieryFalloutEncounter.enemyPartyConfigs).toEqual([ @@ -132,7 +135,7 @@ describe("Fiery Fallout - Mystery Encounter", () => { describe("Option 1 - Fight 2 Volcarona", () => { it("should have the correct properties", () => { const option1 = FieryFalloutEncounter.options[0]; - expect(option1.optionMode).toBe(EncounterOptionMode.DEFAULT); + expect(option1.optionMode).toBe(MysteryEncounterOptionMode.DEFAULT); expect(option1.dialogue).toBeDefined(); expect(option1.dialogue).toStrictEqual({ buttonLabel: `${namespace}:option:1:label`, @@ -149,7 +152,7 @@ describe("Fiery Fallout - Mystery Encounter", () => { const phaseSpy = vi.spyOn(scene, "pushPhase"); await game.runToMysteryEncounter(MysteryEncounterType.FIERY_FALLOUT, defaultParty); - await runSelectMysteryEncounterOption(game, 1, true); + await runMysteryEncounterToEnd(game, 1, true); const enemyField = scene.getEnemyField(); expect(scene.getCurrentPhase().constructor.name).toBe(CommandPhase.name); @@ -166,7 +169,7 @@ describe("Fiery Fallout - Mystery Encounter", () => { it("should give charcoal to lead pokemon", async () => { await game.runToMysteryEncounter(MysteryEncounterType.FIERY_FALLOUT, defaultParty); - await runSelectMysteryEncounterOption(game, 1, true); + await runMysteryEncounterToEnd(game, 1, true); await skipBattleRunMysteryEncounterRewardsPhase(game); await game.phaseInterceptor.to(SelectModifierPhase, false); expect(scene.getCurrentPhase().constructor.name).toBe(SelectModifierPhase.name); @@ -182,7 +185,7 @@ describe("Fiery Fallout - Mystery Encounter", () => { describe("Option 2 - Suffer the weather", () => { it("should have the correct properties", () => { const option1 = FieryFalloutEncounter.options[1]; - expect(option1.optionMode).toBe(EncounterOptionMode.DEFAULT); + expect(option1.optionMode).toBe(MysteryEncounterOptionMode.DEFAULT); expect(option1.dialogue).toBeDefined(); expect(option1.dialogue).toStrictEqual({ buttonLabel: `${namespace}:option:2:label`, @@ -204,7 +207,7 @@ describe("Fiery Fallout - Mystery Encounter", () => { const abra = party.find((pkm) => pkm.species.speciesId === Species.ABRA); vi.spyOn(abra, "isAllowedInBattle").mockReturnValue(false); - await runSelectMysteryEncounterOption(game, 2); + await runMysteryEncounterToEnd(game, 2); const burnablePokemon = party.filter((pkm) => pkm.isAllowedInBattle() && !pkm.getTypes().includes(Type.FIRE)); const notBurnablePokemon = party.filter((pkm) => !pkm.isAllowedInBattle() || pkm.getTypes().includes(Type.FIRE)); @@ -220,7 +223,7 @@ describe("Fiery Fallout - Mystery Encounter", () => { const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); await game.runToMysteryEncounter(MysteryEncounterType.FIERY_FALLOUT, defaultParty); - await runSelectMysteryEncounterOption(game, 2); + await runMysteryEncounterToEnd(game, 2); expect(leaveEncounterWithoutBattleSpy).toBeCalled(); }); @@ -229,7 +232,7 @@ describe("Fiery Fallout - Mystery Encounter", () => { describe("Option 3 - use FIRE types", () => { it("should have the correct properties", () => { const option1 = FieryFalloutEncounter.options[2]; - expect(option1.optionMode).toBe(EncounterOptionMode.DISABLED_OR_SPECIAL); + expect(option1.optionMode).toBe(MysteryEncounterOptionMode.DISABLED_OR_SPECIAL); expect(option1.dialogue).toBeDefined(); expect(option1.dialogue).toStrictEqual({ buttonLabel: `${namespace}:option:3:label`, @@ -245,7 +248,7 @@ describe("Fiery Fallout - Mystery Encounter", () => { it("should give charcoal to lead pokemon", async () => { await game.runToMysteryEncounter(MysteryEncounterType.FIERY_FALLOUT, defaultParty); - await runSelectMysteryEncounterOption(game, 3); + await runMysteryEncounterToEnd(game, 3); // await skipBattleRunMysteryEncounterRewardsPhase(game); await game.phaseInterceptor.to(SelectModifierPhase, false); expect(scene.getCurrentPhase().constructor.name).toBe(SelectModifierPhase.name); @@ -261,9 +264,23 @@ describe("Fiery Fallout - Mystery Encounter", () => { const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); await game.runToMysteryEncounter(MysteryEncounterType.FIERY_FALLOUT, defaultParty); - await runSelectMysteryEncounterOption(game, 3); + await runMysteryEncounterToEnd(game, 3); expect(leaveEncounterWithoutBattleSpy).toBeCalled(); }); + + it("should be disabled if not enough FIRE types are in party", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.FIERY_FALLOUT, [Species.MAGIKARP, Species.ARCANINE]); + await game.phaseInterceptor.to(MysteryEncounterPhase, false); + + const encounterPhase = scene.getCurrentPhase(); + expect(encounterPhase.constructor.name).toBe(MysteryEncounterPhase.name); + const continueEncounterSpy = vi.spyOn((encounterPhase as MysteryEncounterPhase), "continueEncounter"); + + await runSelectMysteryEncounterOption(game, 3); + + expect(scene.getCurrentPhase().constructor.name).toBe(MysteryEncounterPhase.name); + expect(continueEncounterSpy).not.toHaveBeenCalled(); + }); }); }); 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 6d36f47a8c1..aa8d95b39bd 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 @@ -1,6 +1,4 @@ -import Battle from "#app/battle"; import { LostAtSeaEncounter } from "#app/data/mystery-encounters/encounters/lost-at-sea-encounter"; -import { EncounterOptionMode } from "#app/data/mystery-encounters/mystery-encounter-option"; import * as MysteryEncounters from "#app/data/mystery-encounters/mystery-encounters"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { getPokemonSpecies } from "#app/data/pokemon-species.js"; @@ -10,8 +8,11 @@ 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 { runSelectMysteryEncounterOption } from "../encounterTestUtils"; -import { MysteryEncounterTier } from "#app/data/mystery-encounters/mystery-encounter"; +import { runMysteryEncounterToEnd } from "../encounterTestUtils"; +import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; +import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; +import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; +import BattleScene from "#app/battle-scene"; const namespace = "mysteryEncounter:lostAtSea"; /** Blastoise for surf. Pidgeot for fly. Abra for none. */ @@ -22,6 +23,7 @@ const defaultWave = 33; describe("Lost at Sea - Mystery Encounter", () => { let phaserGame: Phaser.Game; let game: GameManager; + let scene: BattleScene; beforeAll(() => { phaserGame = new Phaser.Game({ type: Phaser.HEADLESS }); @@ -29,6 +31,7 @@ describe("Lost at Sea - Mystery Encounter", () => { beforeEach(async () => { game = new GameManager(phaserGame); + scene = game.scene; game.override.mysteryEncounterChance(100); game.override.startingWave(defaultWave); game.override.startingBiome(defaultBiome); @@ -83,14 +86,16 @@ describe("Lost at Sea - Mystery Encounter", () => { expect(game.scene.currentBattle.mysteryEncounter).toBeUndefined(); }); - it("should set the correct dialog tokens during initialization", () => { - vi.spyOn(game.scene, "currentBattle", "get").mockReturnValue({ mysteryEncounter: LostAtSeaEncounter } as Battle); + it("should initialize fully", () => { + initSceneWithoutEncounterPhase(scene, defaultParty); + scene.currentBattle.mysteryEncounter = LostAtSeaEncounter; const { onInit } = LostAtSeaEncounter; expect(LostAtSeaEncounter.onInit).toBeDefined(); - const onInitResult = onInit(game.scene); + LostAtSeaEncounter.populateDialogueTokensFromRequirements(scene); + const onInitResult = onInit(scene); expect(LostAtSeaEncounter.dialogueTokens?.damagePercentage).toBe("25"); expect(LostAtSeaEncounter.dialogueTokens?.option1RequiredMove).toBe(Moves[Moves.SURF]); @@ -101,7 +106,7 @@ describe("Lost at Sea - Mystery Encounter", () => { describe("Option 1 - Surf", () => { it("should have the correct properties", () => { const option1 = LostAtSeaEncounter.options[0]; - expect(option1.optionMode).toBe(EncounterOptionMode.DISABLED_OR_DEFAULT); + expect(option1.optionMode).toBe(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT); expect(option1.dialogue).toBeDefined(); expect(option1.dialogue).toStrictEqual({ buttonLabel: `${namespace}:option:1:label`, @@ -124,7 +129,7 @@ describe("Lost at Sea - Mystery Encounter", () => { const blastoise = party.find((pkm) => pkm.species.speciesId === Species.PIDGEOT); const expBefore = blastoise.exp; - await runSelectMysteryEncounterOption(game, 2); + await runMysteryEncounterToEnd(game, 2); expect(blastoise.exp).toBe(expBefore + Math.floor(laprasSpecies.baseExp * defaultWave / 5 + 1)); }); @@ -134,7 +139,7 @@ describe("Lost at Sea - Mystery Encounter", () => { const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); await game.runToMysteryEncounter(MysteryEncounterType.LOST_AT_SEA, defaultParty); - await runSelectMysteryEncounterOption(game, 1); + await runMysteryEncounterToEnd(game, 1); expect(leaveEncounterWithoutBattleSpy).toBeCalled(); }); @@ -148,7 +153,7 @@ describe("Lost at Sea - Mystery Encounter", () => { it("should have the correct properties", () => { const option2 = LostAtSeaEncounter.options[1]; - expect(option2.optionMode).toBe(EncounterOptionMode.DISABLED_OR_DEFAULT); + expect(option2.optionMode).toBe(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT); expect(option2.dialogue).toBeDefined(); expect(option2.dialogue).toStrictEqual({ buttonLabel: `${namespace}:option:2:label`, @@ -173,7 +178,7 @@ describe("Lost at Sea - Mystery Encounter", () => { const pidgeot = party.find((pkm) => pkm.species.speciesId === Species.PIDGEOT); const expBefore = pidgeot.exp; - await runSelectMysteryEncounterOption(game, 2); + await runMysteryEncounterToEnd(game, 2); expect(pidgeot.exp).toBe(expBefore + Math.floor(laprasBaseExp * defaultWave / 5 + 1)); }); @@ -183,7 +188,7 @@ describe("Lost at Sea - Mystery Encounter", () => { const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); await game.runToMysteryEncounter(MysteryEncounterType.LOST_AT_SEA, defaultParty); - await runSelectMysteryEncounterOption(game, 2); + await runMysteryEncounterToEnd(game, 2); expect(leaveEncounterWithoutBattleSpy).toBeCalled(); }); @@ -197,7 +202,7 @@ describe("Lost at Sea - Mystery Encounter", () => { it("should have the correct properties", () => { const option3 = LostAtSeaEncounter.options[2]; - expect(option3.optionMode).toBe(EncounterOptionMode.DEFAULT); + expect(option3.optionMode).toBe(MysteryEncounterOptionMode.DEFAULT); expect(option3.dialogue).toBeDefined(); expect(option3.dialogue).toStrictEqual({ buttonLabel: `${namespace}:option:3:label`, @@ -219,7 +224,7 @@ describe("Lost at Sea - Mystery Encounter", () => { const abra = party.find((pkm) => pkm.species.speciesId === Species.ABRA); vi.spyOn(abra, "isAllowedInBattle").mockReturnValue(false); - await runSelectMysteryEncounterOption(game, 3); + await runMysteryEncounterToEnd(game, 3); const allowedPkm = party.filter((pkm) => pkm.isAllowedInBattle()); const notAllowedPkm = party.filter((pkm) => !pkm.isAllowedInBattle()); @@ -235,7 +240,7 @@ describe("Lost at Sea - Mystery Encounter", () => { const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); await game.runToMysteryEncounter(MysteryEncounterType.LOST_AT_SEA, defaultParty); - await runSelectMysteryEncounterOption(game, 3); + await runMysteryEncounterToEnd(game, 3); expect(leaveEncounterWithoutBattleSpy).toBeCalled(); }); diff --git a/src/test/mystery-encounter/encounters/offer-you-cant-refuse-encounter.test.ts b/src/test/mystery-encounter/encounters/offer-you-cant-refuse-encounter.test.ts new file mode 100644 index 00000000000..c44b399a39a --- /dev/null +++ b/src/test/mystery-encounter/encounters/offer-you-cant-refuse-encounter.test.ts @@ -0,0 +1,244 @@ +import * as MysteryEncounters from "#app/data/mystery-encounters/mystery-encounters"; +import { HUMAN_TRANSITABLE_BIOMES } 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 * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { runMysteryEncounterToEnd } from "#test/mystery-encounter/encounterTestUtils"; +import BattleScene from "#app/battle-scene"; +import { PlayerPokemon, PokemonMove } from "#app/field/pokemon"; +import { OfferYouCantRefuseEncounter } from "#app/data/mystery-encounters/encounters/offer-you-cant-refuse-encounter"; +import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; +import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; +import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; +import { getPokemonSpecies } from "#app/data/pokemon-species"; +import { Moves } from "#enums/moves"; + +const namespace = "mysteryEncounter:offerYouCantRefuse"; +/** Gyarados for Indimidate */ +const defaultParty = [Species.GYARADOS, Species.GENGAR, Species.ABRA]; +const defaultBiome = Biome.CAVE; +const defaultWave = 45; + +describe("An Offer You Can't Refuse - 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.mysteryEncounterTier(MysteryEncounterTier.COMMON); + game.override.startingWave(defaultWave); + game.override.startingBiome(defaultBiome); + + const biomeMap = new Map([ + [Biome.VOLCANO, [MysteryEncounterType.MYSTERIOUS_CHALLENGERS]], + ]); + HUMAN_TRANSITABLE_BIOMES.forEach(biome => { + biomeMap.set(biome, [MysteryEncounterType.OFFER_YOU_CANT_REFUSE]); + }); + vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue(biomeMap); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + vi.clearAllMocks(); + vi.resetAllMocks(); + }); + + it("should have the correct properties", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.OFFER_YOU_CANT_REFUSE, defaultParty); + + expect(OfferYouCantRefuseEncounter.encounterType).toBe(MysteryEncounterType.OFFER_YOU_CANT_REFUSE); + expect(OfferYouCantRefuseEncounter.encounterTier).toBe(MysteryEncounterTier.GREAT); + expect(OfferYouCantRefuseEncounter.dialogue).toBeDefined(); + expect(OfferYouCantRefuseEncounter.dialogue.intro).toStrictEqual([ + { text: `${namespace}:intro` }, + { speaker: `${namespace}:speaker`, text: `${namespace}:intro_dialogue` } + ]); + expect(OfferYouCantRefuseEncounter.dialogue.encounterOptionsDialogue.title).toBe(`${namespace}:title`); + expect(OfferYouCantRefuseEncounter.dialogue.encounterOptionsDialogue.description).toBe(`${namespace}:description`); + expect(OfferYouCantRefuseEncounter.dialogue.encounterOptionsDialogue.query).toBe(`${namespace}:query`); + expect(OfferYouCantRefuseEncounter.options.length).toBe(3); + }); + + it("should not spawn outside of HUMAN_TRANSITABLE_BIOMES", async () => { + game.override.startingBiome(Biome.VOLCANO); + await game.runToMysteryEncounter(); + + expect(scene.currentBattle?.mysteryEncounter?.encounterType).not.toBe(MysteryEncounterType.OFFER_YOU_CANT_REFUSE); + }); + + it("should not run below wave 10", async () => { + game.override.startingWave(9); + + await game.runToMysteryEncounter(); + + expect(scene.currentBattle?.mysteryEncounter?.encounterType).not.toBe(MysteryEncounterType.OFFER_YOU_CANT_REFUSE); + }); + + 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 = OfferYouCantRefuseEncounter; + + const { onInit } = OfferYouCantRefuseEncounter; + + expect(OfferYouCantRefuseEncounter.onInit).toBeDefined(); + + OfferYouCantRefuseEncounter.populateDialogueTokensFromRequirements(scene); + const onInitResult = onInit(scene); + + expect(OfferYouCantRefuseEncounter.dialogueTokens?.strongestPokemon).toBeDefined(); + expect(OfferYouCantRefuseEncounter.dialogueTokens?.price).toBeDefined(); + expect(OfferYouCantRefuseEncounter.dialogueTokens?.option2PrimaryAbility).toBe("Intimidate"); + expect(OfferYouCantRefuseEncounter.dialogueTokens?.moveOrAbility).toBe("Intimidate"); + expect(OfferYouCantRefuseEncounter.misc.pokemon instanceof PlayerPokemon).toBeTruthy(); + expect(OfferYouCantRefuseEncounter.misc?.price?.toString()).toBe(OfferYouCantRefuseEncounter.dialogueTokens?.price); + expect(onInitResult).toBe(true); + }); + + describe("Option 1 - Sell your Pokemon for money and a Shiny Charm", () => { + it("should have the correct properties", () => { + const option = OfferYouCantRefuseEncounter.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 update the player's money properly", async () => { + const initialMoney = 20000; + scene.money = initialMoney; + const updateMoneySpy = vi.spyOn(EncounterPhaseUtils, "updatePlayerMoney"); + + await game.runToMysteryEncounter(MysteryEncounterType.OFFER_YOU_CANT_REFUSE, defaultParty); + await runMysteryEncounterToEnd(game, 1); + + const price = scene.currentBattle.mysteryEncounter.misc.price; + + expect(updateMoneySpy).toHaveBeenCalledWith(scene, price); + expect(scene.money).toBe(initialMoney + price); + }); + + it("Should remove the Pokemon from the party", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.OFFER_YOU_CANT_REFUSE, defaultParty); + + const initialPartySize = scene.getParty().length; + const pokemonName = scene.currentBattle.mysteryEncounter.misc.pokemon.name; + + await runMysteryEncounterToEnd(game, 1); + + expect(scene.getParty().length).toBe(initialPartySize - 1); + expect(scene.getParty().find(p => p.name === pokemonName)).toBeUndefined(); + }); + + it("should leave encounter without battle", async () => { + const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); + + await game.runToMysteryEncounter(MysteryEncounterType.OFFER_YOU_CANT_REFUSE, defaultParty); + await runMysteryEncounterToEnd(game, 1); + + expect(leaveEncounterWithoutBattleSpy).toBeCalled(); + }); + }); + + describe("Option 2 - Extort the Kid", () => { + it("should have the correct properties", () => { + const option = OfferYouCantRefuseEncounter.options[1]; + expect(option.optionMode).toBe(MysteryEncounterOptionMode.DISABLED_OR_SPECIAL); + expect(option.dialogue).toBeDefined(); + expect(option.dialogue).toStrictEqual({ + buttonLabel: `${namespace}:option:2:label`, + buttonTooltip: `${namespace}:option:2:tooltip`, + disabledButtonTooltip: `${namespace}:option:2:tooltip_disabled`, + selected: [ + { + speaker: `${namespace}:speaker`, + text: `${namespace}:option:2:selected`, + }, + ], + }); + }); + + it("should award EXP to a pokemon with an ability in EXTORTION_ABILITIES", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.OFFER_YOU_CANT_REFUSE, defaultParty); + const party = scene.getParty(); + const gyarados = party.find((pkm) => pkm.species.speciesId === Species.GYARADOS); + const expBefore = gyarados.exp; + + await runMysteryEncounterToEnd(game, 2); + + expect(gyarados.exp).toBe(expBefore + Math.floor(getPokemonSpecies(Species.LIEPARD).baseExp * defaultWave / 5 + 1)); + }); + + it("should award EXP to a pokemon with a move in EXTORTION_MOVES", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.OFFER_YOU_CANT_REFUSE, [Species.ABRA]); + const party = scene.getParty(); + const abra = party.find((pkm) => pkm.species.speciesId === Species.ABRA); + abra.moveset = [new PokemonMove(Moves.BEAT_UP)]; + const expBefore = abra.exp; + + await runMysteryEncounterToEnd(game, 2); + + expect(abra.exp).toBe(expBefore + Math.floor(getPokemonSpecies(Species.LIEPARD).baseExp * defaultWave / 5 + 1)); + }); + + it("Should update the player's money properly", async () => { + const initialMoney = 20000; + scene.money = initialMoney; + const updateMoneySpy = vi.spyOn(EncounterPhaseUtils, "updatePlayerMoney"); + + await game.runToMysteryEncounter(MysteryEncounterType.OFFER_YOU_CANT_REFUSE, defaultParty); + await runMysteryEncounterToEnd(game, 2); + + const price = scene.currentBattle.mysteryEncounter.misc.price; + + expect(updateMoneySpy).toHaveBeenCalledWith(scene, price); + expect(scene.money).toBe(initialMoney + price); + }); + + it("should leave encounter without battle", async () => { + const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); + + await game.runToMysteryEncounter(MysteryEncounterType.OFFER_YOU_CANT_REFUSE, defaultParty); + await runMysteryEncounterToEnd(game, 2); + + expect(leaveEncounterWithoutBattleSpy).toBeCalled(); + }); + }); + + describe("Option 3 - Leave", () => { + it("should leave encounter without battle", async () => { + const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); + + await game.runToMysteryEncounter(MysteryEncounterType.OFFER_YOU_CANT_REFUSE, defaultParty); + await runMysteryEncounterToEnd(game, 3); + + expect(leaveEncounterWithoutBattleSpy).toBeCalled(); + }); + }); +}); diff --git a/src/test/mystery-encounter/encounters/pokemon-salesman-encounter.test.ts b/src/test/mystery-encounter/encounters/pokemon-salesman-encounter.test.ts index c3045b599eb..10b739b47b2 100644 --- a/src/test/mystery-encounter/encounters/pokemon-salesman-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/pokemon-salesman-encounter.test.ts @@ -4,15 +4,15 @@ 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 Battle from "#app/battle"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import { EncounterOptionMode } from "#app/data/mystery-encounters/mystery-encounter-option"; -import { runSelectMysteryEncounterOption } from "#test/mystery-encounter/encounterTestUtils"; +import { runMysteryEncounterToEnd } from "#test/mystery-encounter/encounterTestUtils"; import BattleScene from "#app/battle-scene"; -import { MysteryEncounterTier } from "#app/data/mystery-encounters/mystery-encounter"; import { PlayerPokemon } from "#app/field/pokemon"; import { HUMAN_TRANSITABLE_BIOMES } from "#app/data/mystery-encounters/mystery-encounters"; import { PokemonSalesmanEncounter } from "#app/data/mystery-encounters/encounters/pokemon-salesman-encounter"; +import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; +import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; +import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; const namespace = "mysteryEncounter:pokemonSalesman"; const defaultParty = [Species.LAPRAS, Species.GENGAR, Species.ABRA]; @@ -59,7 +59,7 @@ describe("The Pokemon Salesman - Mystery Encounter", () => { expect(PokemonSalesmanEncounter.dialogue).toBeDefined(); expect(PokemonSalesmanEncounter.dialogue.intro).toStrictEqual([ { text: `${namespace}:intro` }, - { speaker: "mysteryEncounter:pokemonSalesman:speaker", text: "mysteryEncounter:pokemonSalesman:intro_dialogue" } + { speaker: `${namespace}:speaker`, text: `${namespace}:intro_dialogue` } ]); expect(PokemonSalesmanEncounter.dialogue.encounterOptionsDialogue.title).toBe(`${namespace}:title`); expect(PokemonSalesmanEncounter.dialogue.encounterOptionsDialogue.description).toBe(`${namespace}:description`); @@ -91,12 +91,14 @@ describe("The Pokemon Salesman - Mystery Encounter", () => { }); it("should initialize fully ", async () => { - vi.spyOn(scene, "currentBattle", "get").mockReturnValue({ mysteryEncounter: PokemonSalesmanEncounter } as Battle); + initSceneWithoutEncounterPhase(scene, defaultParty); + scene.currentBattle.mysteryEncounter = PokemonSalesmanEncounter; const { onInit } = PokemonSalesmanEncounter; expect(PokemonSalesmanEncounter.onInit).toBeDefined(); + PokemonSalesmanEncounter.populateDialogueTokensFromRequirements(scene); const onInitResult = onInit(scene); expect(PokemonSalesmanEncounter.dialogueTokens?.purchasePokemon).toBeDefined(); @@ -109,7 +111,7 @@ describe("The Pokemon Salesman - Mystery Encounter", () => { describe("Option 1 - Purchase the pokemon", () => { it("should have the correct properties", () => { const option1 = PokemonSalesmanEncounter.options[0]; - expect(option1.optionMode).toBe(EncounterOptionMode.DEFAULT_OR_SPECIAL); + expect(option1.optionMode).toBe(MysteryEncounterOptionMode.DEFAULT_OR_SPECIAL); expect(option1.dialogue).toBeDefined(); expect(option1.dialogue).toStrictEqual({ buttonLabel: `${namespace}:option:1:label`, @@ -128,7 +130,7 @@ describe("The Pokemon Salesman - Mystery Encounter", () => { const updateMoneySpy = vi.spyOn(EncounterPhaseUtils, "updatePlayerMoney"); await game.runToMysteryEncounter(MysteryEncounterType.POKEMON_SALESMAN, defaultParty); - await runSelectMysteryEncounterOption(game, 1); + await runMysteryEncounterToEnd(game, 1); const price = scene.currentBattle.mysteryEncounter.misc.price; @@ -142,7 +144,7 @@ describe("The Pokemon Salesman - Mystery Encounter", () => { const initialPartySize = scene.getParty().length; const pokemonName = scene.currentBattle.mysteryEncounter.misc.pokemon.name; - await runSelectMysteryEncounterOption(game, 1); + await runMysteryEncounterToEnd(game, 1); expect(scene.getParty().length).toBe(initialPartySize + 1); expect(scene.getParty().find(p => p.name === pokemonName) instanceof PlayerPokemon).toBeTruthy(); @@ -152,7 +154,7 @@ describe("The Pokemon Salesman - Mystery Encounter", () => { const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); await game.runToMysteryEncounter(MysteryEncounterType.POKEMON_SALESMAN, defaultParty); - await runSelectMysteryEncounterOption(game, 1); + await runMysteryEncounterToEnd(game, 1); expect(leaveEncounterWithoutBattleSpy).toBeCalled(); }); @@ -163,7 +165,7 @@ describe("The Pokemon Salesman - Mystery Encounter", () => { const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); await game.runToMysteryEncounter(MysteryEncounterType.POKEMON_SALESMAN, defaultParty); - await runSelectMysteryEncounterOption(game, 2); + await runMysteryEncounterToEnd(game, 2); expect(leaveEncounterWithoutBattleSpy).toBeCalled(); }); 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 b57683d3165..d0fd2b92989 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 @@ -4,17 +4,14 @@ 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 Battle from "#app/battle"; 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 { EncounterOptionMode } from "#app/data/mystery-encounters/mystery-encounter-option"; -import { runSelectMysteryEncounterOption, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounterTestUtils"; +import { runMysteryEncounterToEnd, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounterTestUtils"; import { CommandPhase, MovePhase, SelectModifierPhase } from "#app/phases"; import { Moves } from "#enums/moves"; import BattleScene from "#app/battle-scene"; import * as Modifiers from "#app/modifier/modifier"; -import { MysteryEncounterTier } from "#app/data/mystery-encounters/mystery-encounter"; import { TheStrongStuffEncounter } from "#app/data/mystery-encounters/encounters/the-strong-stuff-encounter"; import { Nature } from "#app/data/nature"; import { BerryType } from "#enums/berry-type"; @@ -23,6 +20,9 @@ import { PokemonMove } from "#app/field/pokemon"; import { Mode } from "#app/ui/ui"; import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; import { PokemonBaseStatTotalModifier } 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"; const namespace = "mysteryEncounter:theStrongStuff"; const defaultParty = [Species.LAPRAS, Species.GENGAR, Species.ABRA]; @@ -97,7 +97,8 @@ describe("The Strong Stuff - Mystery Encounter", () => { }); it("should initialize fully ", async () => { - vi.spyOn(scene, "currentBattle", "get").mockReturnValue({ mysteryEncounter: TheStrongStuffEncounter } as Battle); + initSceneWithoutEncounterPhase(scene, defaultParty); + scene.currentBattle.mysteryEncounter = TheStrongStuffEncounter; const moveInitSpy = vi.spyOn(BattleAnims, "loadMoveAnimAssets"); const moveLoadSpy = vi.spyOn(BattleAnims, "loadMoveAnimAssets"); @@ -105,6 +106,7 @@ describe("The Strong Stuff - Mystery Encounter", () => { expect(TheStrongStuffEncounter.onInit).toBeDefined(); + TheStrongStuffEncounter.populateDialogueTokensFromRequirements(scene); const onInitResult = onInit(scene); expect(TheStrongStuffEncounter.enemyPartyConfigs).toEqual([ @@ -134,7 +136,7 @@ describe("The Strong Stuff - Mystery Encounter", () => { describe("Option 1 - Power Swap BSTs", () => { it("should have the correct properties", () => { const option1 = TheStrongStuffEncounter.options[0]; - expect(option1.optionMode).toBe(EncounterOptionMode.DEFAULT); + expect(option1.optionMode).toBe(MysteryEncounterOptionMode.DEFAULT); expect(option1.dialogue).toBeDefined(); expect(option1.dialogue).toStrictEqual({ buttonLabel: `${namespace}:option:1:label`, @@ -151,7 +153,7 @@ describe("The Strong Stuff - Mystery Encounter", () => { await game.runToMysteryEncounter(MysteryEncounterType.THE_STRONG_STUFF, defaultParty); const bstsPrior = scene.getParty().map(p => p.getSpeciesForm().getBaseStatTotal()); - await runSelectMysteryEncounterOption(game, 1); + await runMysteryEncounterToEnd(game, 1); const bstsAfter = scene.getParty().map(p => { const baseStats = p.getSpeciesForm().baseStats.slice(0); @@ -168,7 +170,7 @@ describe("The Strong Stuff - Mystery Encounter", () => { const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); await game.runToMysteryEncounter(MysteryEncounterType.THE_STRONG_STUFF, defaultParty); - await runSelectMysteryEncounterOption(game, 1); + await runMysteryEncounterToEnd(game, 1); expect(leaveEncounterWithoutBattleSpy).toBeCalled(); }); @@ -177,7 +179,7 @@ describe("The Strong Stuff - Mystery Encounter", () => { describe("Option 2 - battle the Shuckle", () => { it("should have the correct properties", () => { const option1 = TheStrongStuffEncounter.options[1]; - expect(option1.optionMode).toBe(EncounterOptionMode.DEFAULT); + expect(option1.optionMode).toBe(MysteryEncounterOptionMode.DEFAULT); expect(option1.dialogue).toBeDefined(); expect(option1.dialogue).toStrictEqual({ buttonLabel: `${namespace}:option:2:label`, @@ -194,7 +196,7 @@ describe("The Strong Stuff - Mystery Encounter", () => { const phaseSpy = vi.spyOn(scene, "pushPhase"); await game.runToMysteryEncounter(MysteryEncounterType.THE_STRONG_STUFF, defaultParty); - await runSelectMysteryEncounterOption(game, 2, true); + await runMysteryEncounterToEnd(game, 2, true); const enemyField = scene.getEnemyField(); expect(scene.getCurrentPhase().constructor.name).toBe(CommandPhase.name); @@ -218,7 +220,7 @@ describe("The Strong Stuff - Mystery Encounter", () => { it("should have Soul Dew in rewards", async () => { await game.runToMysteryEncounter(MysteryEncounterType.THE_STRONG_STUFF, defaultParty); - await runSelectMysteryEncounterOption(game, 2, true); + await runMysteryEncounterToEnd(game, 2, true); await skipBattleRunMysteryEncounterRewardsPhase(game); await game.phaseInterceptor.to(SelectModifierPhase, false); expect(scene.getCurrentPhase().constructor.name).toBe(SelectModifierPhase.name); diff --git a/src/test/phases/mystery-encounter-phase.test.ts b/src/test/phases/mystery-encounter-phase.test.ts index 5c7c9958c80..74ed7ff190d 100644 --- a/src/test/phases/mystery-encounter-phase.test.ts +++ b/src/test/phases/mystery-encounter-phase.test.ts @@ -7,8 +7,8 @@ import {Mode} from "#app/ui/ui"; import {Button} from "#enums/buttons"; import MysteryEncounterUiHandler from "#app/ui/mystery-encounter-ui-handler"; import {MysteryEncounterType} from "#enums/mystery-encounter-type"; -import {MysteryEncounterTier} from "#app/data/mystery-encounters/mystery-encounter"; import MessageUiHandler from "#app/ui/message-ui-handler"; +import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; describe("Mystery Encounter Phases", () => { let phaserGame: Phaser.Game; diff --git a/src/test/utils/overridesHelper.ts b/src/test/utils/overridesHelper.ts index d2011bf4581..400bad716a7 100644 --- a/src/test/utils/overridesHelper.ts +++ b/src/test/utils/overridesHelper.ts @@ -5,9 +5,9 @@ import { MockInstance, vi } from "vitest"; import GameManager from "#test/utils/gameManager"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import * as overrides from "#app/overrides"; -import { MysteryEncounterTier } from "#app/data/mystery-encounters/mystery-encounter"; import * as GameMode from "#app/game-mode"; import { GameModes, getGameMode } from "#app/game-mode"; +import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; /** * Helper to handle overrides in tests diff --git a/src/test/utils/phaseInterceptor.ts b/src/test/utils/phaseInterceptor.ts index 7114d63afa0..4e1f2acf586 100644 --- a/src/test/utils/phaseInterceptor.ts +++ b/src/test/utils/phaseInterceptor.ts @@ -11,13 +11,15 @@ import { LearnMovePhase, LoginPhase, MessagePhase, + ModifierRewardPhase, MoveEffectPhase, MoveEndPhase, MovePhase, NewBattlePhase, NextEncounterPhase, PostSummonPhase, - SelectGenderPhase, SelectModifierPhase, + SelectGenderPhase, + SelectModifierPhase, SelectStarterPhase, SelectTargetPhase, ShinySparklePhase, @@ -105,6 +107,7 @@ export default class PhaseInterceptor { [MysteryEncounterRewardsPhase, this.startPhase], [PostMysteryEncounterPhase, this.startPhase], [LearnMovePhase, this.startPhase], + [ModifierRewardPhase, this.startPhase], // [CommonAnimPhase, this.startPhase] ]; diff --git a/src/ui/mystery-encounter-ui-handler.ts b/src/ui/mystery-encounter-ui-handler.ts index e6bcbfd697c..3d89afcd784 100644 --- a/src/ui/mystery-encounter-ui-handler.ts +++ b/src/ui/mystery-encounter-ui-handler.ts @@ -6,14 +6,15 @@ import { Button } from "#enums/buttons"; import { addWindow, WindowVariant } from "./ui-theme"; import { MysteryEncounterPhase } from "../phases/mystery-encounter-phases"; import { PartyUiMode } from "./party-ui-handler"; -import MysteryEncounterOption, { EncounterOptionMode } from "../data/mystery-encounters/mystery-encounter-option"; +import MysteryEncounterOption from "../data/mystery-encounters/mystery-encounter-option"; import * as Utils from "../utils"; import { isNullOrUndefined } from "../utils"; import { getPokeballAtlasKey } from "../data/pokeball"; import { OptionSelectSettings } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { getEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; -import { MysteryEncounterTier } from "#app/data/mystery-encounters/mystery-encounter"; import i18next from "i18next"; +import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; +import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; export default class MysteryEncounterUiHandler extends UiHandler { private cursorContainer: Phaser.GameObjects.Container; @@ -146,7 +147,7 @@ export default class MysteryEncounterUiHandler extends UiHandler { this.unblockInput(); }, 300); }); - } else if (this.blockInput || (!this.optionsMeetsReqs[cursor] && (selected.optionMode === EncounterOptionMode.DISABLED_OR_DEFAULT || selected.optionMode === EncounterOptionMode.DISABLED_OR_SPECIAL))) { + } else if (this.blockInput || (!this.optionsMeetsReqs[cursor] && (selected.optionMode === MysteryEncounterOptionMode.DISABLED_OR_DEFAULT || selected.optionMode === MysteryEncounterOptionMode.DISABLED_OR_SPECIAL))) { success = false; } else { if ((this.scene.getCurrentPhase() as MysteryEncounterPhase).handleOptionSelect(selected, cursor)) { @@ -290,7 +291,7 @@ export default class MysteryEncounterUiHandler extends UiHandler { this.blockInput = false; for (let i = 0; i < this.optionsContainer.length - 1; i++) { const optionMode = this.encounterOptions[i].optionMode; - if (!this.optionsMeetsReqs[i] && (optionMode === EncounterOptionMode.DISABLED_OR_DEFAULT || optionMode === EncounterOptionMode.DISABLED_OR_SPECIAL)) { + if (!this.optionsMeetsReqs[i] && (optionMode === MysteryEncounterOptionMode.DISABLED_OR_DEFAULT || optionMode === MysteryEncounterOptionMode.DISABLED_OR_SPECIAL)) { continue; } (this.optionsContainer.getAt(i) as Phaser.GameObjects.Text).setAlpha(1); @@ -363,7 +364,7 @@ export default class MysteryEncounterUiHandler extends UiHandler { const optionDialogue = option.dialogue; const label = !this.optionsMeetsReqs[i] && optionDialogue.disabledButtonLabel ? optionDialogue.disabledButtonLabel : optionDialogue.buttonLabel; let text: string; - if (option.hasRequirements() && this.optionsMeetsReqs[i] && (option.optionMode === EncounterOptionMode.DEFAULT_OR_SPECIAL || option.optionMode === EncounterOptionMode.DISABLED_OR_SPECIAL)) { + if (option.hasRequirements() && this.optionsMeetsReqs[i] && (option.optionMode === MysteryEncounterOptionMode.DEFAULT_OR_SPECIAL || option.optionMode === MysteryEncounterOptionMode.DISABLED_OR_SPECIAL)) { // Options with special requirements that are met are automatically colored green text = getEncounterText(this.scene, label, TextStyle.SUMMARY_GREEN); } else { @@ -374,7 +375,7 @@ export default class MysteryEncounterUiHandler extends UiHandler { optionText.setText(text); } - if (!this.optionsMeetsReqs[i] && (option.optionMode === EncounterOptionMode.DISABLED_OR_DEFAULT || option.optionMode === EncounterOptionMode.DISABLED_OR_SPECIAL)) { + if (!this.optionsMeetsReqs[i] && (option.optionMode === MysteryEncounterOptionMode.DISABLED_OR_DEFAULT || option.optionMode === MysteryEncounterOptionMode.DISABLED_OR_SPECIAL)) { optionText.setAlpha(0.5); } if (this.blockInput) { @@ -468,7 +469,7 @@ export default class MysteryEncounterUiHandler extends UiHandler { let text: string; const cursorOption = this.encounterOptions[cursor]; const optionDialogue = cursorOption.dialogue; - if (!this.optionsMeetsReqs[cursor] && (cursorOption.optionMode === EncounterOptionMode.DISABLED_OR_DEFAULT || cursorOption.optionMode === EncounterOptionMode.DISABLED_OR_SPECIAL) && optionDialogue.disabledButtonTooltip) { + if (!this.optionsMeetsReqs[cursor] && (cursorOption.optionMode === MysteryEncounterOptionMode.DISABLED_OR_DEFAULT || cursorOption.optionMode === MysteryEncounterOptionMode.DISABLED_OR_SPECIAL) && optionDialogue.disabledButtonTooltip) { text = getEncounterText(this.scene, optionDialogue.disabledButtonTooltip, TextStyle.TOOLTIP_CONTENT); } else { text = getEncounterText(this.scene, optionDialogue.buttonTooltip, TextStyle.TOOLTIP_CONTENT); From d37e6a6c20195ab79bd47a2b5772619086608eaf Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Thu, 25 Jul 2024 12:25:20 -0400 Subject: [PATCH 215/270] remove unnecessary prompt handlers --- src/test/mystery-encounter/encounterTestUtils.ts | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/src/test/mystery-encounter/encounterTestUtils.ts b/src/test/mystery-encounter/encounterTestUtils.ts index 24afc428e68..57b636ac793 100644 --- a/src/test/mystery-encounter/encounterTestUtils.ts +++ b/src/test/mystery-encounter/encounterTestUtils.ts @@ -42,17 +42,6 @@ export async function runMysteryEncounterToEnd(game: GameManager, optionNo: numb uiHandler.processInput(Button.ACTION); }); - // Handle modifier reward dialogue - game.onNextPrompt("ModifierRewardPhase", Mode.MESSAGE, () => { - const uiHandler = game.scene.ui.getHandler(); - uiHandler.processInput(Button.ACTION); - }); - - game.onNextPrompt("SelectModifier", Mode.MODIFIER_SELECT, () => { - const uiHandler = game.scene.ui.getHandler(); - uiHandler.processInput(Button.ACTION); - }); - if (isBattle) { await game.phaseInterceptor.to(CommandPhase); } else { From 682fcc13280d93b795b183c3e031a7865803e113 Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Thu, 25 Jul 2024 12:27:42 -0400 Subject: [PATCH 216/270] add tests for disabled encounter options --- .../encounters/lost-at-sea-encounter.test.ts | 27 ++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) 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 aa8d95b39bd..600cbdbd751 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,11 +8,12 @@ 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 "../encounterTestUtils"; +import { runMysteryEncounterToEnd, runSelectMysteryEncounterOption } from "../encounterTestUtils"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; import BattleScene from "#app/battle-scene"; +import { MysteryEncounterPhase } from "#app/phases/mystery-encounter-phases"; const namespace = "mysteryEncounter:lostAtSea"; /** Blastoise for surf. Pidgeot for fly. Abra for none. */ @@ -145,7 +146,17 @@ describe("Lost at Sea - Mystery Encounter", () => { }); it("should be disabled if no surfable PKM is in party", async () => { - // TODO + await game.runToMysteryEncounter(MysteryEncounterType.LOST_AT_SEA, [Species.ARCANINE]); + await game.phaseInterceptor.to(MysteryEncounterPhase, false); + + const encounterPhase = scene.getCurrentPhase(); + expect(encounterPhase.constructor.name).toBe(MysteryEncounterPhase.name); + const continueEncounterSpy = vi.spyOn((encounterPhase as MysteryEncounterPhase), "continueEncounter"); + + await runSelectMysteryEncounterOption(game, 1); + + expect(scene.getCurrentPhase().constructor.name).toBe(MysteryEncounterPhase.name); + expect(continueEncounterSpy).not.toHaveBeenCalled(); }); }); @@ -194,7 +205,17 @@ describe("Lost at Sea - Mystery Encounter", () => { }); it("should be disabled if no flyable PKM is in party", async () => { - // TODO + await game.runToMysteryEncounter(MysteryEncounterType.LOST_AT_SEA, [Species.ARCANINE]); + await game.phaseInterceptor.to(MysteryEncounterPhase, false); + + const encounterPhase = scene.getCurrentPhase(); + expect(encounterPhase.constructor.name).toBe(MysteryEncounterPhase.name); + const continueEncounterSpy = vi.spyOn((encounterPhase as MysteryEncounterPhase), "continueEncounter"); + + await runSelectMysteryEncounterOption(game, 1); + + expect(scene.getCurrentPhase().constructor.name).toBe(MysteryEncounterPhase.name); + expect(continueEncounterSpy).not.toHaveBeenCalled(); }); }); From b5bd2dd0581a4c6077a48944061b084e793bbe8f Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Thu, 25 Jul 2024 20:40:06 -0400 Subject: [PATCH 217/270] add delibird-y encounter --- .../encounters/delibirdy-encounter.ts | 247 ++++++++++++ .../encounters/fiery-fallout-encounter.ts | 3 +- .../mystery-encounter-option.ts | 6 +- .../mystery-encounter-requirements.ts | 29 +- .../mystery-encounters/mystery-encounters.ts | 17 +- src/enums/mystery-encounter-type.ts | 4 +- src/field/mystery-encounter-intro.ts | 4 +- src/locales/en/mystery-encounter.ts | 4 +- .../mystery-encounters/delibirdy-dialogue.ts | 31 ++ .../shady-vitamin-dealer-dialogue.ts | 4 - .../mystery-encounter/encounterTestUtils.ts | 49 ++- .../encounters/delibirdy-encounter.test.ts | 373 ++++++++++++++++++ .../fiery-fallout-encounter.test.ts | 4 +- .../encounters/lost-at-sea-encounter.test.ts | 20 +- .../offer-you-cant-refuse-encounter.test.ts | 11 + .../pokemon-salesman-encounter.test.ts | 39 +- .../the-strong-stuff-encounter.test.ts | 4 +- 17 files changed, 808 insertions(+), 41 deletions(-) create mode 100644 src/data/mystery-encounters/encounters/delibirdy-encounter.ts create mode 100644 src/locales/en/mystery-encounters/delibirdy-dialogue.ts create mode 100644 src/test/mystery-encounter/encounters/delibirdy-encounter.test.ts diff --git a/src/data/mystery-encounters/encounters/delibirdy-encounter.ts b/src/data/mystery-encounters/encounters/delibirdy-encounter.ts new file mode 100644 index 00000000000..c58f9775a04 --- /dev/null +++ b/src/data/mystery-encounters/encounters/delibirdy-encounter.ts @@ -0,0 +1,247 @@ +import { leaveEncounterWithoutBattle, selectPokemonForOption, updatePlayerMoney, } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import Pokemon, { PlayerPokemon } from "#app/field/pokemon"; +import { modifierTypes } from "#app/modifier/modifier-type"; +import { MysteryEncounterType } from "#enums/mystery-encounter-type"; +import { Species } from "#enums/species"; +import BattleScene from "#app/battle-scene"; +import IMysteryEncounter, { MysteryEncounterBuilder } from "../mystery-encounter"; +import { MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; +import { HeldItemRequirement, MoneyRequirement } from "../mystery-encounter-requirements"; +import { getEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; +import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; +import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; +import { BerryModifier, PokemonBaseStatModifier, PokemonBaseStatTotalModifier, PokemonHeldItemModifier, PokemonInstantReviveModifier, TerastallizeModifier } from "#app/modifier/modifier"; +import { ModifierRewardPhase } from "#app/phases"; +import { OptionSelectItem } from "#app/ui/abstact-option-select-ui-handler"; + +/** the i18n namespace for this encounter */ +const namespace = "mysteryEncounter:delibirdy"; + +/** Berries only */ +const OPTION_2_ALLOWED_MODIFIERS = [BerryModifier.name, PokemonInstantReviveModifier.name]; + +/** Disallowed items are berries, Reviver Seeds, and Vitamins (form change items and fusion items are not PokemonHeldItemModifiers) */ +const OPTION_3_DISALLOWED_MODIFIERS = [ + BerryModifier.name, + PokemonInstantReviveModifier.name, + TerastallizeModifier.name, + PokemonBaseStatModifier.name, + PokemonBaseStatTotalModifier.name +]; + +/** + * Delibird-y encounter. + * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/57 | GitHub Issue #57} + * @see For biome requirements check {@linkcode mysteryEncountersByBiome} + */ +export const DelibirdyEncounter: IMysteryEncounter = + MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.DELIBIRDY) + .withEncounterTier(MysteryEncounterTier.GREAT) + .withSceneWaveRangeRequirement(10, 180) + .withSceneRequirement(new MoneyRequirement(0, 2.75)) // Must have enough money for it to spawn at the very least + .withIntroSpriteConfigs([ + { + spriteKey: Species.DELIBIRD.toString(), + fileRoot: "pokemon", + hasShadow: true, + repeat: true, + startFrame: 38, + scale: 0.94 + }, + { + spriteKey: Species.DELIBIRD.toString(), + fileRoot: "pokemon", + hasShadow: true, + repeat: true, + scale: 1.06 + }, + { + spriteKey: Species.DELIBIRD.toString(), + fileRoot: "pokemon", + hasShadow: true, + repeat: true, + startFrame: 65, + x: 1, + y: 5, + yShadow: 5 + }, + ]) + .withIntroDialogue([ + { + text: `${namespace}:intro`, + } + ]) + .withTitle(`${namespace}:title`) + .withDescription(`${namespace}:description`) + .withQuery(`${namespace}:query`) + .withOutroDialogue([ + { + text: `${namespace}:outro`, + } + ]) + .withOption( + new MysteryEncounterOptionBuilder() + .withOptionMode(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT) + .withSceneMoneyRequirement(0, 2.75) + .withDialogue({ + buttonLabel: `${namespace}:option:1:label`, + buttonTooltip: `${namespace}:option:1:tooltip`, + selected: [ + { + text: `${namespace}:option:1:selected`, + }, + ], + }) + .withPreOptionPhase(async (scene: BattleScene): Promise => { + const encounter = scene.currentBattle.mysteryEncounter; + updatePlayerMoney(scene, -(encounter.options[0].requirements[0] as MoneyRequirement).requiredMoney, true, false); + return true; + }) + .withOptionPhase(async (scene: BattleScene) => { + // Give the player an Ability Charm + scene.unshiftPhase(new ModifierRewardPhase(scene, modifierTypes.ABILITY_CHARM)); + leaveEncounterWithoutBattle(scene, true); + }) + .build() + ) + .withOption( + new MysteryEncounterOptionBuilder() + .withOptionMode(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT) + .withPrimaryPokemonRequirement(new HeldItemRequirement(OPTION_2_ALLOWED_MODIFIERS)) + .withDialogue({ + buttonLabel: `${namespace}:option:2:label`, + buttonTooltip: `${namespace}:option:2:tooltip`, + secondOptionPrompt: `${namespace}:option:2:select_prompt`, + selected: [ + { + text: `${namespace}:option:2:selected`, + }, + ], + }) + .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((it) => { + return OPTION_2_ALLOWED_MODIFIERS.some(heldItem => it.constructor.name === heldItem); + }); + + return validItems.map((modifier: PokemonHeldItemModifier) => { + const option: OptionSelectItem = { + label: modifier.type.name, + handler: () => { + // Pokemon and item selected + encounter.setDialogueToken("chosenItem", modifier.type.name); + encounter.misc = { + chosenPokemon: pokemon, + chosenModifier: modifier, + }; + return true; + }, + }; + return option; + }); + }; + + // Only Pokemon that can gain benefits are above 1/3rd HP with no status + const selectableFilter = (pokemon: Pokemon) => { + // If pokemon meets primary pokemon reqs, it can be selected + const meetsReqs = encounter.options[1].pokemonMeetsPrimaryRequirements(scene, pokemon); + if (!meetsReqs) { + return getEncounterText(scene, `${namespace}:invalid_selection`); + } + + return null; + }; + + return selectPokemonForOption(scene, onPokemonSelected, null, selectableFilter); + }) + .withOptionPhase(async (scene: BattleScene) => { + const encounter = scene.currentBattle.mysteryEncounter; + const modifier = encounter.misc.chosenModifier; + // Give the player a Candy Jar if they gave a Berry, and a Healing Charm for Reviver Seed + if (modifier.type.name.includes("Berry")) { + scene.unshiftPhase(new ModifierRewardPhase(scene, modifierTypes.CANDY_JAR)); + } else { + scene.unshiftPhase(new ModifierRewardPhase(scene, modifierTypes.HEALING_CHARM)); + } + + // Remove the modifier if its stacks go to 0 + modifier.stackCount -= 1; + if (modifier.stackCount === 0) { + scene.removeModifier(modifier); + } + + leaveEncounterWithoutBattle(scene, true); + }) + .build() + ) + .withOption( + new MysteryEncounterOptionBuilder() + .withOptionMode(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT) + .withPrimaryPokemonRequirement(new HeldItemRequirement(OPTION_3_DISALLOWED_MODIFIERS, 1, true)) + .withDialogue({ + buttonLabel: `${namespace}:option:3:label`, + buttonTooltip: `${namespace}:option:3:tooltip`, + secondOptionPrompt: `${namespace}:option:3:select_prompt`, + selected: [ + { + text: `${namespace}:option:3:selected`, + }, + ], + }) + .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((it) => { + return !OPTION_3_DISALLOWED_MODIFIERS.some(heldItem => it.constructor.name === heldItem); + }); + + return validItems.map((modifier: PokemonHeldItemModifier) => { + const option: OptionSelectItem = { + label: modifier.type.name, + handler: () => { + // Pokemon and item selected + encounter.setDialogueToken("chosenItem", modifier.type.name); + encounter.misc = { + chosenPokemon: pokemon, + chosenModifier: modifier, + }; + return true; + }, + }; + return option; + }); + }; + + // Only Pokemon that can gain benefits are above 1/3rd HP with no status + const selectableFilter = (pokemon: Pokemon) => { + // If pokemon meets primary pokemon reqs, it can be selected + const meetsReqs = encounter.options[2].pokemonMeetsPrimaryRequirements(scene, pokemon); + if (!meetsReqs) { + return getEncounterText(scene, `${namespace}:invalid_selection`); + } + + return null; + }; + + return selectPokemonForOption(scene, onPokemonSelected, null, selectableFilter); + }) + .withOptionPhase(async (scene: BattleScene) => { + const encounter = scene.currentBattle.mysteryEncounter; + const modifier = encounter.misc.chosenModifier; + // Give the player a Berry Pouch + scene.unshiftPhase(new ModifierRewardPhase(scene, modifierTypes.BERRY_POUCH)); + + // Remove the modifier if its stacks go to 0 + modifier.stackCount -= 1; + if (modifier.stackCount === 0) { + scene.removeModifier(modifier); + } + + leaveEncounterWithoutBattle(scene, true); + }) + .build() + ) + .build(); diff --git a/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts b/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts index 478a604869b..2da9ade0ff0 100644 --- a/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts +++ b/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts @@ -80,7 +80,8 @@ export const FieryFalloutEncounter: IMysteryEncounter = repeat: true, hidden: true, hasShadow: true, - x: -20 + x: -20, + startFrame: 20 }, { spriteKey: volcaronaSpecies.getSpriteId(true ), diff --git a/src/data/mystery-encounters/mystery-encounter-option.ts b/src/data/mystery-encounters/mystery-encounter-option.ts index e2736327ddb..6e0e2b83de1 100644 --- a/src/data/mystery-encounters/mystery-encounter-option.ts +++ b/src/data/mystery-encounters/mystery-encounter-option.ts @@ -1,6 +1,6 @@ import { OptionTextDisplay } from "#app/data/mystery-encounters/mystery-encounter-dialogue"; import { Moves } from "#app/enums/moves"; -import { PlayerPokemon } from "#app/field/pokemon"; +import Pokemon, { PlayerPokemon } from "#app/field/pokemon"; import BattleScene from "#app/battle-scene"; import * as Utils from "#app/utils"; import { Type } from "../type"; @@ -57,6 +57,10 @@ export default class MysteryEncounterOption implements MysteryEncounterOption { this.meetsPrimaryRequirementAndPrimaryPokemonSelected(scene); } + pokemonMeetsPrimaryRequirements?(scene: BattleScene, pokemon: Pokemon) { + return !this.primaryPokemonRequirements.some(req => !req.queryParty(scene.getParty()).map(p => p.id).includes(pokemon.id)); + } + meetsPrimaryRequirementAndPrimaryPokemonSelected?(scene: BattleScene) { if (!this.primaryPokemonRequirements) { return true; diff --git a/src/data/mystery-encounters/mystery-encounter-requirements.ts b/src/data/mystery-encounters/mystery-encounter-requirements.ts index 863ed9afc30..b2b0cee5f38 100644 --- a/src/data/mystery-encounters/mystery-encounter-requirements.ts +++ b/src/data/mystery-encounters/mystery-encounter-requirements.ts @@ -1,5 +1,5 @@ import { PlayerPokemon } from "#app/field/pokemon"; -import { ModifierType, PokemonHeldItemModifierType } from "#app/modifier/modifier-type"; +import { ModifierType } from "#app/modifier/modifier-type"; import BattleScene from "#app/battle-scene"; import { isNullOrUndefined } from "#app/utils"; import { Abilities } from "#enums/abilities"; @@ -744,20 +744,20 @@ export class CanEvolveWithItemRequirement extends EncounterPokemonRequirement { } export class HeldItemRequirement extends EncounterPokemonRequirement { - requiredHeldItemModifier: PokemonHeldItemModifierType[]; + requiredHeldItemModifiers: string[]; minNumberOfPokemon: number; invertQuery: boolean; - constructor(heldItem: PokemonHeldItemModifierType | PokemonHeldItemModifierType[], minNumberOfPokemon: number = 1, invertQuery: boolean = false) { + constructor(heldItem: string | string[], minNumberOfPokemon: number = 1, invertQuery: boolean = false) { super(); this.minNumberOfPokemon = minNumberOfPokemon; this.invertQuery = invertQuery; - this.requiredHeldItemModifier = Array.isArray(heldItem) ? heldItem : [heldItem]; + this.requiredHeldItemModifiers = Array.isArray(heldItem) ? heldItem : [heldItem]; } meetsRequirement(scene: BattleScene): boolean { const partyPokemon = scene.getParty(); - if (isNullOrUndefined(partyPokemon) || this?.requiredHeldItemModifier?.length < 0) { + if (isNullOrUndefined(partyPokemon) || this?.requiredHeldItemModifiers?.length < 0) { return false; } return this.queryParty(partyPokemon).length >= this.minNumberOfPokemon; @@ -765,19 +765,26 @@ export class HeldItemRequirement extends EncounterPokemonRequirement { queryParty(partyPokemon: PlayerPokemon[]): PlayerPokemon[] { if (!this.invertQuery) { - return partyPokemon.filter((pokemon) => this.requiredHeldItemModifier.filter((heldItem) => pokemon.getHeldItems().filter((it) => it.type.id === heldItem.id).length > 0).length > 0); + return partyPokemon.filter((pokemon) => this.requiredHeldItemModifiers.some((heldItem) => { + return pokemon.getHeldItems().some((it) => { + return it.constructor.name === heldItem; + }); + })); } else { - // for an inverted query, we only want to get the pokemon that don't have ANY of the listed heldItems - return partyPokemon.filter((pokemon) => this.requiredHeldItemModifier.filter((heldItem) => pokemon.getHeldItems().filter((it) => it.type.id === heldItem.id).length === 0).length === 0); + // 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.requiredHeldItemModifiers.some(heldItem => it.constructor.name === heldItem); + }).length > 0); } } getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] { - const requiredItems = this.requiredHeldItemModifier.filter((a) => { - pokemon.getHeldItems().filter((it) => it.type.id === a.id).length > 0; + const requiredItems = pokemon.getHeldItems().filter((it) => { + return this.requiredHeldItemModifiers.some(heldItem => it.constructor.name === heldItem); }); if (requiredItems.length > 0) { - return ["heldItem", requiredItems[0].name]; + return ["heldItem", requiredItems[0].type.name]; } return null; } diff --git a/src/data/mystery-encounters/mystery-encounters.ts b/src/data/mystery-encounters/mystery-encounters.ts index dacce43919e..1f7ad880fa1 100644 --- a/src/data/mystery-encounters/mystery-encounters.ts +++ b/src/data/mystery-encounters/mystery-encounters.ts @@ -16,6 +16,7 @@ import { FieryFalloutEncounter } from "#app/data/mystery-encounters/encounters/f import { TheStrongStuffEncounter } from "#app/data/mystery-encounters/encounters/the-strong-stuff-encounter"; import { PokemonSalesmanEncounter } from "#app/data/mystery-encounters/encounters/pokemon-salesman-encounter"; import { OfferYouCantRefuseEncounter } from "#app/data/mystery-encounters/encounters/offer-you-cant-refuse-encounter"; +import { DelibirdyEncounter } from "#app/data/mystery-encounters/encounters/delibirdy-encounter"; // Spawn chance: (BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT + WIGHT_INCREMENT_ON_SPAWN_MISS * ) / 256 export const BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT = 1; @@ -150,7 +151,8 @@ const anyBiomeEncounters: MysteryEncounterType[] = [ MysteryEncounterType.FIGHT_OR_FLIGHT, MysteryEncounterType.DARK_DEAL, MysteryEncounterType.MYSTERIOUS_CHEST, - MysteryEncounterType.TRAINING_SESSION + MysteryEncounterType.TRAINING_SESSION, + MysteryEncounterType.DELIBIRDY, ]; /** @@ -163,15 +165,20 @@ const anyBiomeEncounters: MysteryEncounterType[] = [ export const mysteryEncountersByBiome = new Map([ [Biome.TOWN, []], [Biome.PLAINS, [ - MysteryEncounterType.SLUMBERING_SNORLAX + MysteryEncounterType.SLUMBERING_SNORLAX, + MysteryEncounterType.ABSOLUTE_AVARICE ]], [Biome.GRASS, [ MysteryEncounterType.SLUMBERING_SNORLAX, + MysteryEncounterType.ABSOLUTE_AVARICE + ]], + [Biome.TALL_GRASS, [ + MysteryEncounterType.ABSOLUTE_AVARICE ]], - [Biome.TALL_GRASS, []], [Biome.METROPOLIS, []], [Biome.FOREST, [ - MysteryEncounterType.SAFARI_ZONE + MysteryEncounterType.SAFARI_ZONE, + MysteryEncounterType.ABSOLUTE_AVARICE ]], [Biome.SEA, [ @@ -230,6 +237,8 @@ export function initMysteryEncounters() { allMysteryEncounters[MysteryEncounterType.THE_STRONG_STUFF] = TheStrongStuffEncounter; allMysteryEncounters[MysteryEncounterType.POKEMON_SALESMAN] = PokemonSalesmanEncounter; allMysteryEncounters[MysteryEncounterType.OFFER_YOU_CANT_REFUSE] = OfferYouCantRefuseEncounter; + allMysteryEncounters[MysteryEncounterType.DELIBIRDY] = DelibirdyEncounter; + // allMysteryEncounters[MysteryEncounterType.ABSOLUTE_AVARICE] = Abs; // Add extreme encounters to biome map extremeBiomeEncounters.forEach(encounter => { diff --git a/src/enums/mystery-encounter-type.ts b/src/enums/mystery-encounter-type.ts index 8ec7d4967d3..95283e63b36 100644 --- a/src/enums/mystery-encounter-type.ts +++ b/src/enums/mystery-encounter-type.ts @@ -13,5 +13,7 @@ export enum MysteryEncounterType { FIERY_FALLOUT, THE_STRONG_STUFF, POKEMON_SALESMAN, - OFFER_YOU_CANT_REFUSE + OFFER_YOU_CANT_REFUSE, + DELIBIRDY, + ABSOLUTE_AVARICE } diff --git a/src/field/mystery-encounter-intro.ts b/src/field/mystery-encounter-intro.ts index d97c267b095..59cdb90fc30 100644 --- a/src/field/mystery-encounter-intro.ts +++ b/src/field/mystery-encounter-intro.ts @@ -39,6 +39,8 @@ export class MysteryEncounterSpriteConfig { disableAnimation?: boolean = false; /** Repeat the animation. Defaults to `false` */ repeat?: boolean = false; + /** What frame of the animation to start on. Defaults to 0 */ + startFrame?: number = 0; /** Hidden at start of encounter. Defaults to `false` */ hidden?: boolean = false; /** Tint color. `0` - `1`. Higher means darker tint. */ @@ -279,7 +281,7 @@ export default class MysteryEncounterIntroVisuals extends Phaser.GameObjects.Con const trainerAnimConfig = { key: config.spriteKey, repeat: config?.repeat ? -1 : 0, - startFrame: 0 + startFrame: config?.startFrame ?? 0 }; this.tryPlaySprite(sprites[i], tintSprites[i], trainerAnimConfig); diff --git a/src/locales/en/mystery-encounter.ts b/src/locales/en/mystery-encounter.ts index 2454859884b..59931894e6a 100644 --- a/src/locales/en/mystery-encounter.ts +++ b/src/locales/en/mystery-encounter.ts @@ -13,6 +13,7 @@ import { trainingSessionDialogue } from "#app/locales/en/mystery-encounters/trai import { theStrongStuffDialogue } from "#app/locales/en/mystery-encounters/the-strong-stuff-dialogue"; import { pokemonSalesmanDialogue } from "#app/locales/en/mystery-encounters/pokemon-salesman-dialogue"; import { offerYouCantRefuseDialogue } from "#app/locales/en/mystery-encounters/offer-you-cant-refuse-dialogue"; +import { delibirdyDialogue } from "#app/locales/en/mystery-encounters/delibirdy-dialogue"; /** * Patterns that can be used: @@ -50,5 +51,6 @@ export const mysteryEncounter = { fieryFallout: fieryFalloutDialogue, theStrongStuff: theStrongStuffDialogue, pokemonSalesman: pokemonSalesmanDialogue, - offerYouCantRefuse: offerYouCantRefuseDialogue + offerYouCantRefuse: offerYouCantRefuseDialogue, + delibirdy: delibirdyDialogue, } as const; diff --git a/src/locales/en/mystery-encounters/delibirdy-dialogue.ts b/src/locales/en/mystery-encounters/delibirdy-dialogue.ts new file mode 100644 index 00000000000..a77261573a3 --- /dev/null +++ b/src/locales/en/mystery-encounters/delibirdy-dialogue.ts @@ -0,0 +1,31 @@ +export const delibirdyDialogue = { + intro: "A pack of Delibird have appeared!", + title: "Delibird-y", + description: "The Delibirds are looking at you expectantly, as if they want something. Perhaps giving them an item or some money would satisfy them?", + query: "What will you give them?", + invalid_selection: "Pokémon doesn't have that kind of item.", + option: { + 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. + $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. + $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. + $They turn back to you and happily give you a present!`, + }, + }, + outro: `The Delibird pack happily waddles off into the distance. + $What a curious little exchange!` +}; diff --git a/src/locales/en/mystery-encounters/shady-vitamin-dealer-dialogue.ts b/src/locales/en/mystery-encounters/shady-vitamin-dealer-dialogue.ts index 1f2d62751ea..5570cc9b7ad 100644 --- a/src/locales/en/mystery-encounters/shady-vitamin-dealer-dialogue.ts +++ b/src/locales/en/mystery-encounters/shady-vitamin-dealer-dialogue.ts @@ -12,14 +12,10 @@ export const shadyVitaminDealerDialogue = { 1: { label: "The Cheap Deal", tooltip: "(-) Pay {{option1Money, money}}\n(-) Side Effects?\n(+) Chosen Pokémon Gains 2 Random Vitamins", - selected: `{{option1PrimaryName}} swims ahead, guiding you back on track. - \${{option1PrimaryName}} seems to also have gotten stronger in this time of need!`, }, 2: { label: "The Pricey Deal", tooltip: "(-) Pay {{option2Money, money}}\n(-) Side Effects?\n(+) Chosen Pokémon Gains 2 Random Vitamins", - 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: "Leave", diff --git a/src/test/mystery-encounter/encounterTestUtils.ts b/src/test/mystery-encounter/encounterTestUtils.ts index 57b636ac793..aa0551e78e2 100644 --- a/src/test/mystery-encounter/encounterTestUtils.ts +++ b/src/test/mystery-encounter/encounterTestUtils.ts @@ -6,15 +6,21 @@ import { Mode } from "#app/ui/ui"; import GameManager from "../utils/gameManager"; import MessageUiHandler from "#app/ui/message-ui-handler"; import { Status, StatusEffect } from "#app/data/status-effect"; +import { expect, vi } from "vitest"; +import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import PartyUiHandler from "#app/ui/party-ui-handler"; +import OptionSelectUiHandler from "#app/ui/settings/option-select-ui-handler"; /** * Runs a MysteryEncounter to either the start of a battle, or to the MysteryEncounterRewardsPhase, depending on the option selected * @param game * @param optionNo - human number, not index + * @param secondaryOptionSelect - * @param isBattle - if selecting option should lead to battle, set to true */ -export async function runMysteryEncounterToEnd(game: GameManager, optionNo: number, isBattle: boolean = false) { - await runSelectMysteryEncounterOption(game, optionNo, isBattle); +export async function runMysteryEncounterToEnd(game: GameManager, optionNo: number, secondaryOptionSelect: { pokemonNo: number, optionNo: number } = null, isBattle: boolean = false) { + vi.spyOn(EncounterPhaseUtils, "selectPokemonForOption"); + await runSelectMysteryEncounterOption(game, optionNo, secondaryOptionSelect); // run the selected options phase game.onNextPrompt("MysteryEncounterOptionSelectedPhase", Mode.MESSAGE, () => { @@ -49,7 +55,7 @@ export async function runMysteryEncounterToEnd(game: GameManager, optionNo: numb } } -export async function runSelectMysteryEncounterOption(game: GameManager, optionNo: number, isBattle: boolean = false) { +export async function runSelectMysteryEncounterOption(game: GameManager, optionNo: number, secondaryOptionSelect: { pokemonNo: number, optionNo: number } = null) { // Handle any eventual queued messages (e.g. weather phase, etc.) game.onNextPrompt("MessagePhase", Mode.MESSAGE, () => { const uiHandler = game.scene.ui.getHandler(); @@ -73,6 +79,7 @@ export async function runSelectMysteryEncounterOption(game: GameManager, optionN uiHandler.unblockInput(); // input are blocked by 1s to prevent accidental input. Tests need to handle that switch (optionNo) { + default: case 1: // no movement needed. Default cursor position break; @@ -89,6 +96,42 @@ export async function runSelectMysteryEncounterOption(game: GameManager, optionN } uiHandler.processInput(Button.ACTION); + + if (!isNaN(secondaryOptionSelect?.pokemonNo)) { + await handleSecondaryOptionSelect(game, secondaryOptionSelect.pokemonNo, secondaryOptionSelect.optionNo); + } +} + +async function handleSecondaryOptionSelect(game: GameManager, pokemonNo: number, optionNo: number) { + // Handle secondary option selections + const partyUiHandler = game.scene.ui.handlers[Mode.PARTY] as PartyUiHandler; + vi.spyOn(partyUiHandler, "show"); + await vi.waitFor(() => expect(partyUiHandler.show).toHaveBeenCalled()); + + for (let i = 1; i < pokemonNo; i++) { + partyUiHandler.processInput(Button.DOWN); + } + + // Open options on Pokemon + partyUiHandler.processInput(Button.ACTION); + // Click "Select" on Pokemon options + partyUiHandler.processInput(Button.ACTION); + + // If there is a second choice to make after selecting a Pokemon + if (!isNaN(optionNo)) { + // Wait for Summary menu to close and second options to spawn + const secondOptionUiHandler = game.scene.ui.handlers[Mode.OPTION_SELECT] as OptionSelectUiHandler; + vi.spyOn(secondOptionUiHandler, "show"); + await vi.waitFor(() => expect(secondOptionUiHandler.show).toHaveBeenCalled()); + + // Navigate down to the correct option + for (let i = 1; i < optionNo; i++) { + secondOptionUiHandler.processInput(Button.DOWN); + } + + // Select the option + secondOptionUiHandler.processInput(Button.ACTION); + } } /** diff --git a/src/test/mystery-encounter/encounters/delibirdy-encounter.test.ts b/src/test/mystery-encounter/encounters/delibirdy-encounter.test.ts new file mode 100644 index 00000000000..ee6ce0f6705 --- /dev/null +++ b/src/test/mystery-encounter/encounters/delibirdy-encounter.test.ts @@ -0,0 +1,373 @@ +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 * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { runMysteryEncounterToEnd, runSelectMysteryEncounterOption } from "#test/mystery-encounter/encounterTestUtils"; +import BattleScene from "#app/battle-scene"; +import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; +import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; +import { DelibirdyEncounter } from "#app/data/mystery-encounters/encounters/delibirdy-encounter"; +import * as MysteryEncounters from "#app/data/mystery-encounters/mystery-encounters"; +import { MoneyRequirement } from "#app/data/mystery-encounters/mystery-encounter-requirements"; +import { BerryModifier, HealingBoosterModifier, HiddenAbilityRateBoosterModifier, LevelIncrementBoosterModifier, PokemonInstantReviveModifier, PokemonNatureWeightModifier, PreserveBerryModifier } from "#app/modifier/modifier"; +import { MysteryEncounterPhase } from "#app/phases/mystery-encounter-phases"; +import { generateModifierTypeOption } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { modifierTypes } from "#app/modifier/modifier-type"; +import { BerryType } from "#enums/berry-type"; + +const namespace = "mysteryEncounter:delibirdy"; +const defaultParty = [Species.LAPRAS, Species.GENGAR, Species.ABRA]; +const defaultBiome = Biome.CAVE; +const defaultWave = 45; + +describe("Delibird-y - 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.mysteryEncounterTier(MysteryEncounterTier.COMMON); + game.override.startingWave(defaultWave); + game.override.startingBiome(defaultBiome); + + vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue( + new Map([ + [Biome.CAVE, [MysteryEncounterType.DELIBIRDY]], + ]) + ); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + vi.clearAllMocks(); + vi.resetAllMocks(); + }); + + it("should have the correct properties", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.DELIBIRDY, defaultParty); + + expect(DelibirdyEncounter.encounterType).toBe(MysteryEncounterType.DELIBIRDY); + expect(DelibirdyEncounter.encounterTier).toBe(MysteryEncounterTier.GREAT); + expect(DelibirdyEncounter.dialogue).toBeDefined(); + expect(DelibirdyEncounter.dialogue.intro).toStrictEqual([{ text: `${namespace}:intro` }]); + expect(DelibirdyEncounter.dialogue.outro).toStrictEqual([{ text: `${namespace}:outro` }]); + expect(DelibirdyEncounter.dialogue.encounterOptionsDialogue.title).toBe(`${namespace}:title`); + expect(DelibirdyEncounter.dialogue.encounterOptionsDialogue.description).toBe(`${namespace}:description`); + expect(DelibirdyEncounter.dialogue.encounterOptionsDialogue.query).toBe(`${namespace}:query`); + expect(DelibirdyEncounter.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.DELIBIRDY); + }); + + it("should not run above wave 179", async () => { + game.override.startingWave(181); + + await game.runToMysteryEncounter(); + + expect(scene.currentBattle.mysteryEncounter).toBeUndefined(); + }); + + it("should not spawn if player does not have enough money", async () => { + scene.money = 0; + + await game.runToMysteryEncounter(); + + expect(scene.currentBattle?.mysteryEncounter?.encounterType).not.toBe(MysteryEncounterType.DELIBIRDY); + }); + + describe("Option 1 - Give them money", () => { + it("should have the correct properties", () => { + const option1 = DelibirdyEncounter.options[0]; + expect(option1.optionMode).toBe(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT); + expect(option1.dialogue).toBeDefined(); + expect(option1.dialogue).toStrictEqual({ + buttonLabel: `${namespace}:option:1:label`, + buttonTooltip: `${namespace}:option:1:tooltip`, + selected: [ + { + text: `${namespace}:option:1:selected`, + }, + ], + }); + }); + + it("Should update the player's money properly", async () => { + const initialMoney = 20000; + scene.money = initialMoney; + const updateMoneySpy = vi.spyOn(EncounterPhaseUtils, "updatePlayerMoney"); + + await game.runToMysteryEncounter(MysteryEncounterType.DELIBIRDY, defaultParty); + await runMysteryEncounterToEnd(game, 1); + + const price = (scene.currentBattle.mysteryEncounter.options[0].requirements[0] as MoneyRequirement).requiredMoney; + + expect(updateMoneySpy).toHaveBeenCalledWith(scene, -price, true, false); + expect(scene.money).toBe(initialMoney - price); + }); + + it("Should give the player a Hidden Ability Charm", async () => { + scene.money = 200000; + await game.runToMysteryEncounter(MysteryEncounterType.DELIBIRDY, defaultParty); + await runMysteryEncounterToEnd(game, 1); + + const itemModifier = scene.findModifier(m => m instanceof HiddenAbilityRateBoosterModifier) as HiddenAbilityRateBoosterModifier; + + expect(itemModifier).toBeDefined(); + expect(itemModifier.stackCount).toBe(1); + }); + + it("should be disabled if player does not have enough money", async () => { + scene.money = 0; + await game.runToMysteryEncounter(MysteryEncounterType.DELIBIRDY, defaultParty); + 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, 1); + + 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 leave encounter without battle", async () => { + scene.money = 200000; + const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); + + await game.runToMysteryEncounter(MysteryEncounterType.DELIBIRDY, defaultParty); + await runMysteryEncounterToEnd(game, 1); + + expect(leaveEncounterWithoutBattleSpy).toBeCalled(); + }); + }); + + describe("Option 2 - Give Food", () => { + it("should have the correct properties", () => { + const option = DelibirdyEncounter.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`, + secondOptionPrompt: `${namespace}:option:2:select_prompt`, + selected: [ + { + text: `${namespace}:option:2:selected`, + }, + ], + }); + }); + + it("Should decrease Berry stacks and give the player a Candy Jar", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.DELIBIRDY, defaultParty); + + // Set 2 Sitrus berries on party lead + scene.modifiers = []; + const sitrus = generateModifierTypeOption(scene, modifierTypes.BERRY, [BerryType.SITRUS]).type; + const sitrusMod = sitrus.newModifier(scene.getParty()[0]) as BerryModifier; + sitrusMod.stackCount = 2; + await scene.addModifier(sitrusMod, true, false, false, true); + await scene.updateModifiers(true); + + await runMysteryEncounterToEnd(game, 2, { pokemonNo: 1, optionNo: 1}); + + const sitrusAfter = scene.findModifier(m => m instanceof BerryModifier); + const candyJarAfter = scene.findModifier(m => m instanceof LevelIncrementBoosterModifier); + + expect(sitrusAfter.stackCount).toBe(1); + expect(candyJarAfter).toBeDefined(); + expect(candyJarAfter.stackCount).toBe(1); + }); + + it("Should remove Reviver Seed and give the player a Healing Charm", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.DELIBIRDY, defaultParty); + + // Set 1 Reviver Seed on party lead + scene.modifiers = []; + const revSeed = generateModifierTypeOption(scene, modifierTypes.REVIVER_SEED).type; + const modifier = revSeed.newModifier(scene.getParty()[0]) as PokemonInstantReviveModifier; + modifier.stackCount = 1; + await scene.addModifier(modifier, true, false, false, true); + await scene.updateModifiers(true); + + await runMysteryEncounterToEnd(game, 2, { pokemonNo: 1, optionNo: 1}); + + const reviverSeedAfter = scene.findModifier(m => m instanceof PokemonInstantReviveModifier); + const healingCharmAfter = scene.findModifier(m => m instanceof HealingBoosterModifier); + + expect(reviverSeedAfter).toBeUndefined(); + expect(healingCharmAfter).toBeDefined(); + expect(healingCharmAfter.stackCount).toBe(1); + }); + + it("should be disabled if player does not have any proper items", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.DELIBIRDY, defaultParty); + + // Set 1 Soul Dew on party lead + scene.modifiers = []; + const soulDew = generateModifierTypeOption(scene, modifierTypes.SOUL_DEW).type; + const modifier = soulDew.newModifier(scene.getParty()[0]); + await scene.addModifier(modifier, true, false, false, true); + await scene.updateModifiers(true); + + 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 leave encounter without battle", async () => { + const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); + + await game.runToMysteryEncounter(MysteryEncounterType.DELIBIRDY, defaultParty); + + // Set 1 Reviver Seed on party lead + const revSeed = generateModifierTypeOption(scene, modifierTypes.REVIVER_SEED).type; + const modifier = revSeed.newModifier(scene.getParty()[0]) as PokemonInstantReviveModifier; + modifier.stackCount = 1; + await scene.addModifier(modifier, true, false, false, true); + await scene.updateModifiers(true); + + await runMysteryEncounterToEnd(game, 2, { pokemonNo: 1, optionNo: 1}); + + expect(leaveEncounterWithoutBattleSpy).toBeCalled(); + }); + }); + + describe("Option 3 - Give Item", () => { + it("should have the correct properties", () => { + const option = DelibirdyEncounter.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`, + secondOptionPrompt: `${namespace}:option:3:select_prompt`, + selected: [ + { + text: `${namespace}:option:3:selected`, + }, + ], + }); + }); + + it("Should decrease held item stacks and give the player a Berry Pouch", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.DELIBIRDY, defaultParty); + + // Set 2 Soul Dew on party lead + scene.modifiers = []; + const soulDew = generateModifierTypeOption(scene, modifierTypes.SOUL_DEW).type; + const modifier = soulDew.newModifier(scene.getParty()[0]) as PokemonNatureWeightModifier; + modifier.stackCount = 2; + await scene.addModifier(modifier, true, false, false, true); + await scene.updateModifiers(true); + + await runMysteryEncounterToEnd(game, 3, { pokemonNo: 1, optionNo: 1}); + + const soulDewAfter = scene.findModifier(m => m instanceof PokemonNatureWeightModifier); + const berryPouchAfter = scene.findModifier(m => m instanceof PreserveBerryModifier); + + expect(soulDewAfter.stackCount).toBe(1); + expect(berryPouchAfter).toBeDefined(); + expect(berryPouchAfter.stackCount).toBe(1); + }); + + it("Should remove held item and give the player a Berry Pouch", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.DELIBIRDY, defaultParty); + + // Set 1 Soul Dew on party lead + scene.modifiers = []; + const soulDew = generateModifierTypeOption(scene, modifierTypes.SOUL_DEW).type; + const modifier = soulDew.newModifier(scene.getParty()[0]) as PokemonNatureWeightModifier; + modifier.stackCount = 1; + await scene.addModifier(modifier, true, false, false, true); + await scene.updateModifiers(true); + + await runMysteryEncounterToEnd(game, 3, { pokemonNo: 1, optionNo: 1}); + + const soulDewAfter = scene.findModifier(m => m instanceof PokemonNatureWeightModifier); + const berryPouchAfter = scene.findModifier(m => m instanceof PreserveBerryModifier); + + expect(soulDewAfter).toBeUndefined(); + expect(berryPouchAfter).toBeDefined(); + expect(berryPouchAfter.stackCount).toBe(1); + }); + + it("should be disabled if player does not have any proper items", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.DELIBIRDY, defaultParty); + + // Set 1 Reviver Seed on party lead + scene.modifiers = []; + const revSeed = generateModifierTypeOption(scene, modifierTypes.REVIVER_SEED).type; + const modifier = revSeed.newModifier(scene.getParty()[0]); + await scene.addModifier(modifier, true, false, false, true); + await scene.updateModifiers(true); + + 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, 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 leave encounter without battle", async () => { + const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); + + await game.runToMysteryEncounter(MysteryEncounterType.DELIBIRDY, defaultParty); + + // Set 1 Soul Dew on party lead + scene.modifiers = []; + const soulDew = generateModifierTypeOption(scene, modifierTypes.SOUL_DEW).type; + const modifier = soulDew.newModifier(scene.getParty()[0]) as PokemonNatureWeightModifier; + modifier.stackCount = 1; + await scene.addModifier(modifier, true, false, false, true); + await scene.updateModifiers(true); + + await runMysteryEncounterToEnd(game, 3, { pokemonNo: 1, optionNo: 1}); + + expect(leaveEncounterWithoutBattleSpy).toBeCalled(); + }); + }); +}); 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 076159dcd19..43f23b261e6 100644 --- a/src/test/mystery-encounter/encounters/fiery-fallout-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/fiery-fallout-encounter.test.ts @@ -152,7 +152,7 @@ describe("Fiery Fallout - Mystery Encounter", () => { const phaseSpy = vi.spyOn(scene, "pushPhase"); await game.runToMysteryEncounter(MysteryEncounterType.FIERY_FALLOUT, defaultParty); - await runMysteryEncounterToEnd(game, 1, true); + await runMysteryEncounterToEnd(game, 1, null, true); const enemyField = scene.getEnemyField(); expect(scene.getCurrentPhase().constructor.name).toBe(CommandPhase.name); @@ -169,7 +169,7 @@ describe("Fiery Fallout - Mystery Encounter", () => { it("should give charcoal to lead pokemon", async () => { await game.runToMysteryEncounter(MysteryEncounterType.FIERY_FALLOUT, defaultParty); - await runMysteryEncounterToEnd(game, 1, true); + await runMysteryEncounterToEnd(game, 1, null, true); await skipBattleRunMysteryEncounterRewardsPhase(game); await game.phaseInterceptor.to(SelectModifierPhase, false); expect(scene.getCurrentPhase().constructor.name).toBe(SelectModifierPhase.name); 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 600cbdbd751..e1318c79c8a 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 @@ -151,12 +151,17 @@ describe("Lost at Sea - Mystery Encounter", () => { const encounterPhase = scene.getCurrentPhase(); expect(encounterPhase.constructor.name).toBe(MysteryEncounterPhase.name); - const continueEncounterSpy = vi.spyOn((encounterPhase as MysteryEncounterPhase), "continueEncounter"); + const mysteryEncounterPhase = encounterPhase as MysteryEncounterPhase; + vi.spyOn(mysteryEncounterPhase, "continueEncounter"); + vi.spyOn(mysteryEncounterPhase, "handleOptionSelect"); + vi.spyOn(scene.ui, "playError"); await runSelectMysteryEncounterOption(game, 1); expect(scene.getCurrentPhase().constructor.name).toBe(MysteryEncounterPhase.name); - expect(continueEncounterSpy).not.toHaveBeenCalled(); + expect(scene.ui.playError).not.toHaveBeenCalled(); // No error sfx, option is disabled + expect(mysteryEncounterPhase.handleOptionSelect).not.toHaveBeenCalled(); + expect(mysteryEncounterPhase.continueEncounter).not.toHaveBeenCalled(); }); }); @@ -210,12 +215,17 @@ describe("Lost at Sea - Mystery Encounter", () => { const encounterPhase = scene.getCurrentPhase(); expect(encounterPhase.constructor.name).toBe(MysteryEncounterPhase.name); - const continueEncounterSpy = vi.spyOn((encounterPhase as MysteryEncounterPhase), "continueEncounter"); + const mysteryEncounterPhase = encounterPhase as MysteryEncounterPhase; + vi.spyOn(mysteryEncounterPhase, "continueEncounter"); + vi.spyOn(mysteryEncounterPhase, "handleOptionSelect"); + vi.spyOn(scene.ui, "playError"); - await runSelectMysteryEncounterOption(game, 1); + await runSelectMysteryEncounterOption(game, 2); expect(scene.getCurrentPhase().constructor.name).toBe(MysteryEncounterPhase.name); - expect(continueEncounterSpy).not.toHaveBeenCalled(); + expect(scene.ui.playError).not.toHaveBeenCalled(); // No error sfx, option is disabled + expect(mysteryEncounterPhase.handleOptionSelect).not.toHaveBeenCalled(); + expect(mysteryEncounterPhase.continueEncounter).not.toHaveBeenCalled(); }); }); diff --git a/src/test/mystery-encounter/encounters/offer-you-cant-refuse-encounter.test.ts b/src/test/mystery-encounter/encounters/offer-you-cant-refuse-encounter.test.ts index c44b399a39a..0290d32f242 100644 --- a/src/test/mystery-encounter/encounters/offer-you-cant-refuse-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/offer-you-cant-refuse-encounter.test.ts @@ -15,6 +15,7 @@ import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; import { getPokemonSpecies } from "#app/data/pokemon-species"; import { Moves } from "#enums/moves"; +import { ShinyRateBoosterModifier } from "#app/modifier/modifier"; const namespace = "mysteryEncounter:offerYouCantRefuse"; /** Gyarados for Indimidate */ @@ -144,6 +145,16 @@ describe("An Offer You Can't Refuse - Mystery Encounter", () => { expect(scene.money).toBe(initialMoney + price); }); + it("Should give the player a Shiny Charm", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.OFFER_YOU_CANT_REFUSE, defaultParty); + await runMysteryEncounterToEnd(game, 1); + + const itemModifier = scene.findModifier(m => m instanceof ShinyRateBoosterModifier) as ShinyRateBoosterModifier; + + expect(itemModifier).toBeDefined(); + expect(itemModifier.stackCount).toBe(1); + }); + it("Should remove the Pokemon from the party", async () => { await game.runToMysteryEncounter(MysteryEncounterType.OFFER_YOU_CANT_REFUSE, defaultParty); diff --git a/src/test/mystery-encounter/encounters/pokemon-salesman-encounter.test.ts b/src/test/mystery-encounter/encounters/pokemon-salesman-encounter.test.ts index 10b739b47b2..29d17917bcd 100644 --- a/src/test/mystery-encounter/encounters/pokemon-salesman-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/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 } from "#test/mystery-encounter/encounterTestUtils"; +import { runMysteryEncounterToEnd, runSelectMysteryEncounterOption } from "#test/mystery-encounter/encounterTestUtils"; import BattleScene from "#app/battle-scene"; import { PlayerPokemon } from "#app/field/pokemon"; import { HUMAN_TRANSITABLE_BIOMES } from "#app/data/mystery-encounters/mystery-encounters"; @@ -13,6 +13,7 @@ import { PokemonSalesmanEncounter } from "#app/data/mystery-encounters/encounter import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; +import { MysteryEncounterPhase } from "#app/phases/mystery-encounter-phases"; const namespace = "mysteryEncounter:pokemonSalesman"; const defaultParty = [Species.LAPRAS, Species.GENGAR, Species.ABRA]; @@ -108,12 +109,20 @@ describe("The Pokemon Salesman - Mystery Encounter", () => { expect(onInitResult).toBe(true); }); + it("should not spawn if player does not have enough money", async () => { + scene.money = 0; + + await game.runToMysteryEncounter(); + + expect(scene.currentBattle?.mysteryEncounter?.encounterType).not.toBe(MysteryEncounterType.POKEMON_SALESMAN); + }); + describe("Option 1 - Purchase the pokemon", () => { it("should have the correct properties", () => { - const option1 = PokemonSalesmanEncounter.options[0]; - expect(option1.optionMode).toBe(MysteryEncounterOptionMode.DEFAULT_OR_SPECIAL); - expect(option1.dialogue).toBeDefined(); - expect(option1.dialogue).toStrictEqual({ + const option = PokemonSalesmanEncounter.options[0]; + expect(option.optionMode).toBe(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT); + expect(option.dialogue).toBeDefined(); + expect(option.dialogue).toStrictEqual({ buttonLabel: `${namespace}:option:1:label`, buttonTooltip: `${namespace}:option:1:tooltip`, selected: [ @@ -150,6 +159,26 @@ describe("The Pokemon Salesman - Mystery Encounter", () => { expect(scene.getParty().find(p => p.name === pokemonName) instanceof PlayerPokemon).toBeTruthy(); }); + it("should be disabled if player does not have enough money", async () => { + scene.money = 0; + await game.runToMysteryEncounter(MysteryEncounterType.POKEMON_SALESMAN, [Species.ARCANINE]); + 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, 1); + + 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 leave encounter without battle", async () => { const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); 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 d0fd2b92989..91b9d509cbf 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 @@ -196,7 +196,7 @@ describe("The Strong Stuff - Mystery Encounter", () => { const phaseSpy = vi.spyOn(scene, "pushPhase"); await game.runToMysteryEncounter(MysteryEncounterType.THE_STRONG_STUFF, defaultParty); - await runMysteryEncounterToEnd(game, 2, true); + await runMysteryEncounterToEnd(game, 2, null, true); const enemyField = scene.getEnemyField(); expect(scene.getCurrentPhase().constructor.name).toBe(CommandPhase.name); @@ -220,7 +220,7 @@ describe("The Strong Stuff - Mystery Encounter", () => { it("should have Soul Dew in rewards", async () => { await game.runToMysteryEncounter(MysteryEncounterType.THE_STRONG_STUFF, defaultParty); - await runMysteryEncounterToEnd(game, 2, true); + await runMysteryEncounterToEnd(game, 2, null, true); await skipBattleRunMysteryEncounterRewardsPhase(game); await game.phaseInterceptor.to(SelectModifierPhase, false); expect(scene.getCurrentPhase().constructor.name).toBe(SelectModifierPhase.name); From 3ecf02d425da4bccfcf58de62a4568a7b8a7f7c4 Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Thu, 25 Jul 2024 21:34:17 -0400 Subject: [PATCH 218/270] add delibird-y encounter --- .../encounters/pokemon-salesman-encounter.ts | 2 +- .../encounters/pokemon-salesman-encounter.test.ts | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/data/mystery-encounters/encounters/pokemon-salesman-encounter.ts b/src/data/mystery-encounters/encounters/pokemon-salesman-encounter.ts index 76077bf748b..b5625cd349d 100644 --- a/src/data/mystery-encounters/encounters/pokemon-salesman-encounter.ts +++ b/src/data/mystery-encounters/encounters/pokemon-salesman-encounter.ts @@ -106,7 +106,7 @@ export const PokemonSalesmanEncounter: IMysteryEncounter = }) .withOption( new MysteryEncounterOptionBuilder() - .withOptionMode(MysteryEncounterOptionMode.DEFAULT_OR_SPECIAL) + .withOptionMode(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT) .withHasDexProgress(true) .withSceneMoneyRequirement(null, MAX_POKEMON_PRICE_MULTIPLIER) // Wave scaling money multiplier of 2 .withDialogue({ diff --git a/src/test/mystery-encounter/encounters/pokemon-salesman-encounter.test.ts b/src/test/mystery-encounter/encounters/pokemon-salesman-encounter.test.ts index 29d17917bcd..bbd2d92e26c 100644 --- a/src/test/mystery-encounter/encounters/pokemon-salesman-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/pokemon-salesman-encounter.test.ts @@ -148,6 +148,7 @@ describe("The Pokemon Salesman - Mystery Encounter", () => { }); it("Should add the Pokemon to the party", async () => { + scene.money = 20000; await game.runToMysteryEncounter(MysteryEncounterType.POKEMON_SALESMAN, defaultParty); const initialPartySize = scene.getParty().length; @@ -161,7 +162,7 @@ describe("The Pokemon Salesman - Mystery Encounter", () => { it("should be disabled if player does not have enough money", async () => { scene.money = 0; - await game.runToMysteryEncounter(MysteryEncounterType.POKEMON_SALESMAN, [Species.ARCANINE]); + await game.runToMysteryEncounter(MysteryEncounterType.POKEMON_SALESMAN, defaultParty); await game.phaseInterceptor.to(MysteryEncounterPhase, false); const encounterPhase = scene.getCurrentPhase(); @@ -180,6 +181,7 @@ describe("The Pokemon Salesman - Mystery Encounter", () => { }); it("should leave encounter without battle", async () => { + scene.money = 20000; const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); await game.runToMysteryEncounter(MysteryEncounterType.POKEMON_SALESMAN, defaultParty); From b31a23e4017c0c171003e16deb13a00d32564e9b Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Fri, 26 Jul 2024 08:43:25 -0400 Subject: [PATCH 219/270] add absolute avarice encounter --- src/battle-scene.ts | 12 +- .../encounters/absolute-avarice-encounter.ts | 394 ++++++++++++++++++ .../encounters/fight-or-flight-encounter.ts | 2 +- .../mystery-encounter-requirements.ts | 35 +- .../mystery-encounters/mystery-encounter.ts | 2 +- .../mystery-encounters/mystery-encounters.ts | 3 +- .../utils/encounter-phase-utils.ts | 2 +- src/field/mystery-encounter-intro.ts | 18 +- src/locales/en/mystery-encounter.ts | 2 + .../absolute-avarice-dialogue.ts | 27 ++ .../fiery-fallout-dialogue.ts | 6 +- .../lost-at-sea-dialogue.ts | 6 +- .../mysterious-challengers-dialogue.ts | 6 +- .../mysterious-chest-dialogue.ts | 4 +- .../safari-zone-dialogue.ts | 4 +- .../slumbering-snorlax-dialogue.ts | 6 +- .../the-strong-stuff-dialogue.ts | 2 +- src/phases.ts | 2 +- 18 files changed, 492 insertions(+), 41 deletions(-) create mode 100644 src/data/mystery-encounters/encounters/absolute-avarice-encounter.ts create mode 100644 src/locales/en/mystery-encounters/absolute-avarice-dialogue.ts diff --git a/src/battle-scene.ts b/src/battle-scene.ts index a031ee0bca2..c9409d7cab0 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -2684,18 +2684,22 @@ export default class BattleScene extends SceneBase { while (availableEncounters.length === 0 && tier >= 0) { availableEncounters = biomeMysteryEncounters .filter((encounterType) => { - if (allMysteryEncounters[encounterType].encounterTier !== tier) { // Encounter is in tier + const encounterCandidate = allMysteryEncounters[encounterType]; + if (!encounterCandidate) { return false; } - if (!allMysteryEncounters[encounterType]?.meetsRequirements(this)) { // Meets encounter requirements + if (encounterCandidate.encounterTier !== tier) { // Encounter is in tier + return false; + } + if (!encounterCandidate.meetsRequirements(this)) { // Meets encounter requirements return false; } if (!isNullOrUndefined(previousEncounter) && encounterType === previousEncounter) { // Previous encounter was not this one return false; } if (this.mysteryEncounterData.encounteredEvents?.length > 0 && // Encounter has not exceeded max allowed encounters - allMysteryEncounters[encounterType].maxAllowedEncounters > 0 - && this.mysteryEncounterData.encounteredEvents.filter(e => e[0] === encounterType).length >= allMysteryEncounters[encounterType].maxAllowedEncounters) { + encounterCandidate.maxAllowedEncounters > 0 + && this.mysteryEncounterData.encounteredEvents.filter(e => e[0] === encounterType).length >= encounterCandidate.maxAllowedEncounters) { return false; } return true; diff --git a/src/data/mystery-encounters/encounters/absolute-avarice-encounter.ts b/src/data/mystery-encounters/encounters/absolute-avarice-encounter.ts new file mode 100644 index 00000000000..f64d387a7fe --- /dev/null +++ b/src/data/mystery-encounters/encounters/absolute-avarice-encounter.ts @@ -0,0 +1,394 @@ +import { EnemyPartyConfig, generateModifierTypeOption, leaveEncounterWithoutBattle, updatePlayerMoney, } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import Pokemon from "#app/field/pokemon"; +import { modifierTypes, PokemonHeldItemModifierType } from "#app/modifier/modifier-type"; +import { MysteryEncounterType } from "#enums/mystery-encounter-type"; +import { Species } from "#enums/species"; +import BattleScene from "#app/battle-scene"; +import IMysteryEncounter, { MysteryEncounterBuilder } from "../mystery-encounter"; +import { MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; +import { MoneyRequirement, PersistentModifierRequirement } from "../mystery-encounter-requirements"; +import { queueEncounterMessage } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; +import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; +import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; +import { BerryModifier } from "#app/modifier/modifier"; +import { ModifierRewardPhase, StatChangePhase } from "#app/phases"; +import { getPokemonSpecies } from "#app/data/pokemon-species"; +import { Moves } from "#enums/moves"; +import { BattlerTagType } from "#enums/battler-tag-type"; +import { BattleStat } from "#app/data/battle-stat"; + +/** the i18n namespace for this encounter */ +const namespace = "mysteryEncounter:absoluteAvarice"; + +/** + * Delibird-y encounter. + * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/58 | GitHub Issue #58} + * @see For biome requirements check {@linkcode mysteryEncountersByBiome} + */ +export const AbsoluteAvariceEncounter: IMysteryEncounter = + MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.ABSOLUTE_AVARICE) + .withEncounterTier(MysteryEncounterTier.GREAT) + .withSceneWaveRangeRequirement(10, 180) + .withSceneRequirement(new PersistentModifierRequirement(BerryModifier.name, 4)) // Must have at least 4 berries to spawn + .withIntroSpriteConfigs([ + { + spriteKey: Species.GREEDENT.toString(), + fileRoot: "pokemon", + hasShadow: false, + repeat: true, + x: -5 + }, + { + // This sprite has the shadow + spriteKey: Species.GREEDENT.toString(), + fileRoot: "pokemon", + hasShadow: true, + alpha: 0.001, + repeat: true, + x: -5 + }, + { + spriteKey: "lum_berry", + fileRoot: "items", + isItem: true, + x: 7, + y: -14, + hidden: true, + disableAnimation: true + }, + { + spriteKey: "salac_berry", + fileRoot: "items", + isItem: true, + x: 2, + y: 4, + hidden: true, + disableAnimation: true + }, + { + spriteKey: "lansat_berry", + fileRoot: "items", + isItem: true, + x: 32, + y: 5, + hidden: true, + disableAnimation: true + }, + { + spriteKey: "liechi_berry", + fileRoot: "items", + isItem: true, + x: 6, + y: -5, + hidden: true, + disableAnimation: true + }, + { + spriteKey: "sitrus_berry", + fileRoot: "items", + isItem: true, + x: 7, + y: 8, + hidden: true, + disableAnimation: true + }, + { + spriteKey: "petaya_berry", + fileRoot: "items", + isItem: true, + x: 20, + y: -17, + hidden: true, + disableAnimation: true + }, + { + spriteKey: "enigma_berry", + fileRoot: "items", + isItem: true, + x: 26, + y: -4, + hidden: true, + disableAnimation: true + }, + { + spriteKey: "leppa_berry", + fileRoot: "items", + isItem: true, + x: 16, + y: -27, + hidden: true, + disableAnimation: true + }, + { + spriteKey: "ganlon_berry", + fileRoot: "items", + isItem: true, + x: 16, + y: -11, + hidden: true, + disableAnimation: true + }, + { + spriteKey: "apicot_berry", + fileRoot: "items", + isItem: true, + x: 14, + y: -2, + hidden: true, + disableAnimation: true + }, { + spriteKey: "starf_berry", + fileRoot: "items", + isItem: true, + x: 18, + y: 9, + hidden: true, + disableAnimation: true + }, + ]) + .withOnVisualsStart((scene: BattleScene) => { + const encounter = scene.currentBattle.mysteryEncounter; + const greedentSprites = encounter.introVisuals.getSpriteAtIndex(0); + + scene.playSound("Follow Me"); + + // scene.tweens.add({ + // targets: greedentSprites, + // duration: 600, + // ease: "Cubic.easeOut", + // yoyo: true, + // y: "+=50", + // x: "-=60", + // scale: 1.2, + // onComplete: () => { + // // Bounce the Greedent + // scene.tweens.add({ + // targets: greedentSprites, + // duration: 300, + // ease: "Cubic.easeOut", + // yoyo: true, + // y: "-=20", + // loop: 1, + // }); + // } + // }); + + // Slide left + scene.tweens.add({ + targets: greedentSprites, + duration: 500, + ease: "Cubic.easeOut", + x: "-=300", + onComplete: () => { + // Slide back right, lower + greedentSprites[0].y += 80; + greedentSprites[1].y += 80; + scene.tweens.add({ + targets: greedentSprites, + duration: 300, + ease: "Cubic.easeOut", + yoyo: true, + x: "+=140", + onComplete: () => { + // Slide back right, higher + greedentSprites[0].y -= 80; + greedentSprites[1].y -= 80; + scene.tweens.add({ + targets: greedentSprites, + duration: 500, + ease: "Cubic.easeOut", + x: "+=300", + onComplete: () => { + // Bounce the Greedent + scene.tweens.add({ + targets: greedentSprites, + duration: 300, + ease: "Cubic.easeOut", + yoyo: true, + y: "-=20", + loop: 1, + }); + } + }); + } + }); + } + }); + + const berryAddDelay = 200; + + const animationOrder = ["starf", "sitrus", "lansat", "salac", "apicot", "enigma", "liechi", "ganlon", "lum", "petaya", "leppa"]; + + animationOrder.forEach((berry, i) => { + const introVisualsIndex = encounter.spriteConfigs.findIndex(config => config.spriteKey.includes(berry)); + const [ sprite, tintSprite ] = encounter.introVisuals.getSpriteAtIndex(introVisualsIndex); + // const [ sprite, tintSprite ] = [berrySprites[i * 2], berrySprites[i * 2 + 1]]; + scene.time.delayedCall(berryAddDelay * i + 300, () => { + if (sprite) { + sprite.setVisible(true); + } + if (tintSprite) { + tintSprite.setVisible(true); + } + }); + }); + + return true; + }) + .withIntroDialogue([ + { + text: `${namespace}:intro`, + } + ]) + .withTitle(`${namespace}:title`) + .withDescription(`${namespace}:description`) + .withQuery(`${namespace}:query`) + .withOutroDialogue([ + { + text: `${namespace}:outro`, + } + ]) + .withOnInit((scene: BattleScene) => { + const encounter = scene.currentBattle.mysteryEncounter; + + scene.loadSe("Follow Me", "battle_anims", "Follow Me.mp3"); + // scene.loadSe("Follow Me", "battle_anims"); + + // Get all player berry items, remove from party, and store reference + const berryItems = scene.findModifiers(m => m instanceof BerryModifier) as BerryModifier[]; + + // Sort berries by party member ID to more easily re-add later if necessary + const berryItemsMap = new Map(); + scene.getParty().forEach(pokemon => { + const pokemonBerries = berryItems.filter(b => b.pokemonId === pokemon.id); + if (pokemonBerries?.length > 0) { + berryItemsMap.set(pokemon.id, pokemonBerries); + } + }); + + encounter.misc = { berryItemsMap }; + + // Generates copies of the stolen berries to put on the Greedent + const bossModifierTypes: PokemonHeldItemModifierType[] = []; + berryItems.forEach(berryMod => { + // Can't define stack count on a ModifierType, have to just create separate instances for each stack + // Overflow berries will be "lost" on the boss, but it's un-catchable anyway + for (let i = 0; i < berryMod.stackCount; i++) { + const modifierType = generateModifierTypeOption(scene, modifierTypes.BERRY, [berryMod.berryType]).type as PokemonHeldItemModifierType; + bossModifierTypes.push(modifierType); + } + + scene.removeModifier(berryMod); + }); + + // Calculate boss mon + const config: EnemyPartyConfig = { + levelAdditiveMultiplier: 1, + pokemonConfigs: [ + { + species: getPokemonSpecies(Species.GREEDENT), + isBoss: true, + bossSegments: 5, + // nature: Nature.BOLD, + moveSet: [Moves.THRASH, Moves.BODY_PRESS, Moves.STUFF_CHEEKS, Moves.SLACK_OFF], + modifierTypes: bossModifierTypes, + tags: [BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON], + mysteryEncounterBattleEffects: (pokemon: Pokemon) => { + queueEncounterMessage(pokemon.scene, `${namespace}:option:2:stat_boost`); + pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [BattleStat.ATK, BattleStat.DEF, BattleStat.SPATK, BattleStat.SPDEF, BattleStat.SPD], 1)); + } + } + ], + }; + + encounter.enemyPartyConfigs = [config]; + + return true; + }) + .withOption( + new MysteryEncounterOptionBuilder() + .withOptionMode(MysteryEncounterOptionMode.DEFAULT) + .withDialogue({ + buttonLabel: `${namespace}:option:1:label`, + buttonTooltip: `${namespace}:option:1:tooltip`, + selected: [ + { + text: `${namespace}:option:1:selected`, + }, + ], + }) + .withPreOptionPhase(async (scene: BattleScene): Promise => { + const encounter = scene.currentBattle.mysteryEncounter; + updatePlayerMoney(scene, -(encounter.options[0].requirements[0] as MoneyRequirement).requiredMoney, true, false); + return true; + }) + .withOptionPhase(async (scene: BattleScene) => { + // Give the player an Ability Charm + scene.unshiftPhase(new ModifierRewardPhase(scene, modifierTypes.ABILITY_CHARM)); + leaveEncounterWithoutBattle(scene, true); + }) + .build() + ) + .withOption( + new MysteryEncounterOptionBuilder() + .withOptionMode(MysteryEncounterOptionMode.DEFAULT) + .withDialogue({ + buttonLabel: `${namespace}:option:2:label`, + buttonTooltip: `${namespace}:option:2:tooltip`, + secondOptionPrompt: `${namespace}:option:2:select_prompt`, + selected: [ + { + text: `${namespace}:option:2:selected`, + }, + ], + }) + .withOptionPhase(async (scene: BattleScene) => { + const encounter = scene.currentBattle.mysteryEncounter; + const modifier = encounter.misc.chosenModifier; + // Give the player a Candy Jar if they gave a Berry, and a Healing Charm for Reviver Seed + if (modifier.type.name.includes("Berry")) { + scene.unshiftPhase(new ModifierRewardPhase(scene, modifierTypes.CANDY_JAR)); + } else { + scene.unshiftPhase(new ModifierRewardPhase(scene, modifierTypes.HEALING_CHARM)); + } + + // Remove the modifier if its stacks go to 0 + modifier.stackCount -= 1; + if (modifier.stackCount === 0) { + scene.removeModifier(modifier); + } + + leaveEncounterWithoutBattle(scene, true); + }) + .build() + ) + .withOption( + new MysteryEncounterOptionBuilder() + .withOptionMode(MysteryEncounterOptionMode.DEFAULT) + .withDialogue({ + buttonLabel: `${namespace}:option:3:label`, + buttonTooltip: `${namespace}:option:3:tooltip`, + secondOptionPrompt: `${namespace}:option:3:select_prompt`, + selected: [ + { + text: `${namespace}:option:3:selected`, + }, + ], + }) + .withOptionPhase(async (scene: BattleScene) => { + const encounter = scene.currentBattle.mysteryEncounter; + const modifier = encounter.misc.chosenModifier; + // Give the player a Berry Pouch + scene.unshiftPhase(new ModifierRewardPhase(scene, modifierTypes.BERRY_POUCH)); + + // Remove the modifier if its stacks go to 0 + modifier.stackCount -= 1; + if (modifier.stackCount === 0) { + scene.removeModifier(modifier); + } + + leaveEncounterWithoutBattle(scene, true); + }) + .build() + ) + .build(); 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 f4460de47d7..77ef97ace84 100644 --- a/src/data/mystery-encounters/encounters/fight-or-flight-encounter.ts +++ b/src/data/mystery-encounters/encounters/fight-or-flight-encounter.ts @@ -160,7 +160,7 @@ export const FightOrFlightEncounter: IMysteryEncounter = config.pokemonConfigs[0].tags = [BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON]; config.pokemonConfigs[0].mysteryEncounterBattleEffects = (pokemon: Pokemon) => { pokemon.scene.currentBattle.mysteryEncounter.setDialogueToken("enemyPokemon", getPokemonNameWithAffix(pokemon)); - queueEncounterMessage(pokemon.scene, `${namespace}:boss_enraged`); + queueEncounterMessage(pokemon.scene, `${namespace}option:2:boss_enraged`); pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [BattleStat.ATK, BattleStat.DEF, BattleStat.SPATK, BattleStat.SPDEF, BattleStat.SPD], 1)); }; await showEncounterText(scene, `${namespace}:option:2:bad_result`); diff --git a/src/data/mystery-encounters/mystery-encounter-requirements.ts b/src/data/mystery-encounters/mystery-encounter-requirements.ts index b2b0cee5f38..1596cb6b549 100644 --- a/src/data/mystery-encounters/mystery-encounter-requirements.ts +++ b/src/data/mystery-encounters/mystery-encounter-requirements.ts @@ -1,5 +1,4 @@ import { PlayerPokemon } from "#app/field/pokemon"; -import { ModifierType } from "#app/modifier/modifier-type"; import BattleScene from "#app/battle-scene"; import { isNullOrUndefined } from "#app/utils"; import { Abilities } from "#enums/abilities"; @@ -235,28 +234,36 @@ export class PartySizeRequirement extends EncounterSceneRequirement { } export class PersistentModifierRequirement extends EncounterSceneRequirement { - requiredItems?: ModifierType[]; // TODO: not implemented - constructor(item: ModifierType | ModifierType[]) { + requiredHeldItemModifiers: string[]; + minNumberOfItems: number; + + constructor(heldItem: string | string[], minNumberOfItems: number = 1) { super(); - this.requiredItems = Array.isArray(item) ? item : [item]; + this.minNumberOfItems = minNumberOfItems; + this.requiredHeldItemModifiers = Array.isArray(heldItem) ? heldItem : [heldItem]; } meetsRequirement(scene: BattleScene): boolean { - const items = scene.modifiers; - - if (!isNullOrUndefined(items) && this?.requiredItems.length > 0 && this.requiredItems.filter((searchingMod) => - items.filter((itemInScene) => itemInScene.type.id === searchingMod.id).length > 0).length === 0) { + const partyPokemon = scene.getParty(); + if (isNullOrUndefined(partyPokemon) || this?.requiredHeldItemModifiers?.length < 0) { return false; } - return true; + let modifierCount = 0; + this.requiredHeldItemModifiers.forEach(modifier => { + const matchingMods = scene.findModifiers(m => m.constructor.name === modifier); + if (matchingMods?.length > 0) { + matchingMods.forEach(matchingMod => { + modifierCount += matchingMod.stackCount; + }); + } + }); + + return modifierCount >= this.minNumberOfItems; } getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] { - const requiredItemsInInventory = this.requiredItems.filter((a) => { - scene.modifiers.filter((itemInScene) => itemInScene.type.id === a.id).length > 0; - }); - if (requiredItemsInInventory.length > 0) { - return ["requiredItem", requiredItemsInInventory[0].name]; + if (this.requiredHeldItemModifiers.length > 0) { + return ["requiredItem", this.requiredHeldItemModifiers[0]]; } return null; } diff --git a/src/data/mystery-encounters/mystery-encounter.ts b/src/data/mystery-encounters/mystery-encounter.ts index 895d6bd2da0..51815e3ccb7 100644 --- a/src/data/mystery-encounters/mystery-encounter.ts +++ b/src/data/mystery-encounters/mystery-encounter.ts @@ -159,7 +159,7 @@ export default class IMysteryEncounter implements IMysteryEncounter { if (!isNullOrUndefined(encounter)) { Object.assign(this, encounter); } - this.encounterTier = this.encounterTier ? this.encounterTier : MysteryEncounterTier.COMMON; + this.encounterTier = !isNullOrUndefined(this.encounterTier) ? this.encounterTier : MysteryEncounterTier.COMMON; this.dialogue = this.dialogue ?? {}; // Default max is 1 for ROGUE encounters, 3 for others this.maxAllowedEncounters = this.maxAllowedEncounters ?? this.encounterTier === MysteryEncounterTier.ROGUE ? 1 : 3; diff --git a/src/data/mystery-encounters/mystery-encounters.ts b/src/data/mystery-encounters/mystery-encounters.ts index 1f7ad880fa1..c41fd8dfe53 100644 --- a/src/data/mystery-encounters/mystery-encounters.ts +++ b/src/data/mystery-encounters/mystery-encounters.ts @@ -17,6 +17,7 @@ import { TheStrongStuffEncounter } from "#app/data/mystery-encounters/encounters import { PokemonSalesmanEncounter } from "#app/data/mystery-encounters/encounters/pokemon-salesman-encounter"; import { OfferYouCantRefuseEncounter } from "#app/data/mystery-encounters/encounters/offer-you-cant-refuse-encounter"; import { DelibirdyEncounter } from "#app/data/mystery-encounters/encounters/delibirdy-encounter"; +import { AbsoluteAvariceEncounter } from "#app/data/mystery-encounters/encounters/absolute-avarice-encounter"; // Spawn chance: (BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT + WIGHT_INCREMENT_ON_SPAWN_MISS * ) / 256 export const BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT = 1; @@ -238,7 +239,7 @@ export function initMysteryEncounters() { allMysteryEncounters[MysteryEncounterType.POKEMON_SALESMAN] = PokemonSalesmanEncounter; allMysteryEncounters[MysteryEncounterType.OFFER_YOU_CANT_REFUSE] = OfferYouCantRefuseEncounter; allMysteryEncounters[MysteryEncounterType.DELIBIRDY] = DelibirdyEncounter; - // allMysteryEncounters[MysteryEncounterType.ABSOLUTE_AVARICE] = Abs; + allMysteryEncounters[MysteryEncounterType.ABSOLUTE_AVARICE] = AbsoluteAvariceEncounter; // Add extreme encounters to biome map extremeBiomeEncounters.forEach(encounter => { diff --git a/src/data/mystery-encounters/utils/encounter-phase-utils.ts b/src/data/mystery-encounters/utils/encounter-phase-utils.ts index 0064d6a105f..52b67cb4a47 100644 --- a/src/data/mystery-encounters/utils/encounter-phase-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-phase-utils.ts @@ -54,7 +54,7 @@ export function doTrainerExclamation(scene: BattleScene) { } }); - scene.playSound("GEN8- Exclaim.wav", { volume: 0.7 }); + scene.playSound("GEN8- Exclaim", { volume: 0.7 }); } export interface EnemyPokemonConfig { diff --git a/src/field/mystery-encounter-intro.ts b/src/field/mystery-encounter-intro.ts index 59cdb90fc30..467d44c23cd 100644 --- a/src/field/mystery-encounter-intro.ts +++ b/src/field/mystery-encounter-intro.ts @@ -149,7 +149,7 @@ export default class MysteryEncounterIntroVisuals extends Phaser.GameObjects.Con } } - if (alpha) { + if (!isNaN(alpha)) { sprite.setAlpha(alpha); tintSprite.setAlpha(alpha); } @@ -289,6 +289,22 @@ export default class MysteryEncounterIntroVisuals extends Phaser.GameObjects.Con }); } + /** + * Returns a Sprite/TintSprite pair + * @param index + */ + getSpriteAtIndex(index: number): Phaser.GameObjects.Sprite[] { + if (!this.spriteConfigs) { + return; + } + + const ret: Phaser.GameObjects.Sprite[] = []; + ret.push(this.getAt(index * 2)); // Sprite + ret.push(this.getAt(index * 2 + 1)); // Tint Sprite + + return ret; + } + getSprites(): Phaser.GameObjects.Sprite[] { if (!this.spriteConfigs) { return; diff --git a/src/locales/en/mystery-encounter.ts b/src/locales/en/mystery-encounter.ts index 59931894e6a..7cb6cb98178 100644 --- a/src/locales/en/mystery-encounter.ts +++ b/src/locales/en/mystery-encounter.ts @@ -14,6 +14,7 @@ import { theStrongStuffDialogue } from "#app/locales/en/mystery-encounters/the-s import { pokemonSalesmanDialogue } from "#app/locales/en/mystery-encounters/pokemon-salesman-dialogue"; import { offerYouCantRefuseDialogue } from "#app/locales/en/mystery-encounters/offer-you-cant-refuse-dialogue"; import { delibirdyDialogue } from "#app/locales/en/mystery-encounters/delibirdy-dialogue"; +import { absoluteAvariceDialogue } from "#app/locales/en/mystery-encounters/absolute-avarice-dialogue"; /** * Patterns that can be used: @@ -53,4 +54,5 @@ export const mysteryEncounter = { pokemonSalesman: pokemonSalesmanDialogue, offerYouCantRefuse: offerYouCantRefuseDialogue, delibirdy: delibirdyDialogue, + absoluteAvarice: absoluteAvariceDialogue, } as const; diff --git a/src/locales/en/mystery-encounters/absolute-avarice-dialogue.ts b/src/locales/en/mystery-encounters/absolute-avarice-dialogue.ts new file mode 100644 index 00000000000..69796a88d86 --- /dev/null +++ b/src/locales/en/mystery-encounters/absolute-avarice-dialogue.ts @@ -0,0 +1,27 @@ +export const absoluteAvariceDialogue = { + intro: "A Greedent ambushed you\nand stole your party's berries!", + title: "Absolute Avarice", + description: "The Greedent has caught you totally off guard now all your berries are gone!\n\nThe Greedent looks like it's about to eat them when it pauses to look at you, interested.", + query: "What will you do?", + option: { + 1: { + label: "Battle It", + tooltip: "(-) Tough Battle\n(+) Rewards from its Berry Hoard", + selected: "You'll show this Greedent what\nhappens to those who steal from you!", + }, + 2: { + label: "Reason with It", + tooltip: "(+) Regain Some Lost Berries", + 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 stash of berries in a flash! + $Patting its stomach, it looks at you appreciatively. + $Perhaps you could feed it more berries on your adventure... + $The Greedent wants to join your party!`, + }, + } +}; diff --git a/src/locales/en/mystery-encounters/fiery-fallout-dialogue.ts b/src/locales/en/mystery-encounters/fiery-fallout-dialogue.ts index 2fbf5a15bda..c8c5813b25e 100644 --- a/src/locales/en/mystery-encounters/fiery-fallout-dialogue.ts +++ b/src/locales/en/mystery-encounters/fiery-fallout-dialogue.ts @@ -5,20 +5,20 @@ export const fieryFalloutDialogue = { query: "What will you do?", option: { 1: { - label: "Find the source", + 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! $They don't take kindly to the interruption and attack!` }, 2: { - label: "Hunker down", + label: "Hunker Down", tooltip: "(-) Suffer the effects of the weather", 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", + 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! diff --git a/src/locales/en/mystery-encounters/lost-at-sea-dialogue.ts b/src/locales/en/mystery-encounters/lost-at-sea-dialogue.ts index cb1de1315cd..16b7661e174 100644 --- a/src/locales/en/mystery-encounters/lost-at-sea-dialogue.ts +++ b/src/locales/en/mystery-encounters/lost-at-sea-dialogue.ts @@ -5,7 +5,7 @@ export const lostAtSeaDialogue = { query: "What will you do?", option: { 1: { - label: "{{option1PrimaryName}} can help", + label: "{{option1PrimaryName}} Might Help", label_disabled: "Can't {{option1RequiredMove}}", tooltip: "(+) {{option1PrimaryName}} saves you\n(+) {{option1PrimaryName}} gains some EXP", tooltip_disabled: "You have no Pokémon to {{option1RequiredMove}} on", @@ -13,7 +13,7 @@ export const lostAtSeaDialogue = { \${{option1PrimaryName}} seems to also have gotten stronger in this time of need!`, }, 2: { - label: "{{option2PrimaryName}} can help", + 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", @@ -21,7 +21,7 @@ export const lostAtSeaDialogue = { \${{option2PrimaryName}} seems to also have gotten stronger in this time of need!`, }, 3: { - label: "Wander aimlessly", + 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. $You and your Pokémon are fatigued from the whole ordeal.`, diff --git a/src/locales/en/mystery-encounters/mysterious-challengers-dialogue.ts b/src/locales/en/mystery-encounters/mysterious-challengers-dialogue.ts index 56c78e7e5f8..8586a524fb1 100644 --- a/src/locales/en/mystery-encounters/mysterious-challengers-dialogue.ts +++ b/src/locales/en/mystery-encounters/mysterious-challengers-dialogue.ts @@ -5,15 +5,15 @@ export const mysteriousChallengersDialogue = { query: "Who will you battle?", option: { 1: { - label: "A clever, mindful foe", + label: "A Clever, Mindful Foe", tooltip: "(-) Standard Battle\n(+) Move Item Rewards", }, 2: { - label: "A strong foe", + label: "A Strong Foe", tooltip: "(-) Hard Battle\n(+) Good Rewards", }, 3: { - label: "The mightiest foe", + label: "The Mightiest Foe", tooltip: "(-) Brutal Battle\n(+) Great Rewards", }, selected: "The trainer steps forward...", diff --git a/src/locales/en/mystery-encounters/mysterious-chest-dialogue.ts b/src/locales/en/mystery-encounters/mysterious-chest-dialogue.ts index 74a578cfe39..f351851ebaf 100644 --- a/src/locales/en/mystery-encounters/mysterious-chest-dialogue.ts +++ b/src/locales/en/mystery-encounters/mysterious-chest-dialogue.ts @@ -5,7 +5,7 @@ export const mysteriousChestDialogue = { query: "Will you open it?", option: { 1: { - label: "Open it", + label: "Open It", tooltip: "@[SUMMARY_BLUE]{(35%) Something terrible}\n@[SUMMARY_GREEN]{(40%) Okay Rewards}\n@[SUMMARY_GREEN]{(20%) Good Rewards}\n@[SUMMARY_GREEN]{(4%) Great Rewards}\n@[SUMMARY_GREEN]{(1%) Amazing Rewards}", selected: "You open the chest to find...", normal: "Just some normal tools and items.", @@ -16,7 +16,7 @@ export const mysteriousChestDialogue = { $Your {{pokeName}} jumps in front of you\nbut is KOed in the process.`, }, 2: { - label: "It's too risky, leave", + label: "Too Risky, Leave", tooltip: "(-) No Rewards", selected: "You hurry along your way,\nwith a slight feeling of regret.", }, diff --git a/src/locales/en/mystery-encounters/safari-zone-dialogue.ts b/src/locales/en/mystery-encounters/safari-zone-dialogue.ts index ae77aa447b8..20d03567b83 100644 --- a/src/locales/en/mystery-encounters/safari-zone-dialogue.ts +++ b/src/locales/en/mystery-encounters/safari-zone-dialogue.ts @@ -22,12 +22,12 @@ export const safariZoneDialogue = { selected: "You throw a Pokéball!", }, 2: { - label: "Throw bait", + label: "Throw Bait", tooltip: "(+) Increases Capture Rate\n(-) Chance to Increase Flee Rate", selected: "You throw some bait!", }, 3: { - label: "Throw mud", + label: "Throw Mud", tooltip: "(+) Decreases Flee Rate\n(-) Chance to Decrease Capture Rate", selected: "You throw some mud!", }, diff --git a/src/locales/en/mystery-encounters/slumbering-snorlax-dialogue.ts b/src/locales/en/mystery-encounters/slumbering-snorlax-dialogue.ts index 92244573c9b..75e4a4adfb6 100644 --- a/src/locales/en/mystery-encounters/slumbering-snorlax-dialogue.ts +++ b/src/locales/en/mystery-encounters/slumbering-snorlax-dialogue.ts @@ -6,19 +6,19 @@ export const slumberingSnorlaxDialogue = { query: "What will you do?", option: { 1: { - label: "Battle it", + label: "Battle It", tooltip: "(-) Fight Sleeping Snorlax\n(+) Special Reward", selected: "You approach the\nPokémon without fear.", }, 2: { - label: "Wait for it to move", + label: "Wait for It to Move", tooltip: "(-) Wait a Long Time\n(+) Recover Party", 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", + 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}}! diff --git a/src/locales/en/mystery-encounters/the-strong-stuff-dialogue.ts b/src/locales/en/mystery-encounters/the-strong-stuff-dialogue.ts index c65019b539f..c1a35c4f68a 100644 --- a/src/locales/en/mystery-encounters/the-strong-stuff-dialogue.ts +++ b/src/locales/en/mystery-encounters/the-strong-stuff-dialogue.ts @@ -5,7 +5,7 @@ export const theStrongStuffDialogue = { query: "What will you do?", option: { 1: { - label: "Let it touch you", + 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. diff --git a/src/phases.ts b/src/phases.ts index 982cc04031e..6c18a3439f5 100644 --- a/src/phases.ts +++ b/src/phases.ts @@ -903,7 +903,7 @@ export class EncounterPhase extends BattlePhase { loadEnemyAssets.push(battle.mysteryEncounter.introVisuals.loadAssets().then(() => battle.mysteryEncounter.introVisuals.initSprite())); // Load Mystery Encounter Exclamation bubble and sfx loadEnemyAssets.push(new Promise(resolve => { - this.scene.loadSe("GEN8- Exclaim.wav", "battle_anims", "GEN8- Exclaim.wav"); + this.scene.loadSe("GEN8- Exclaim", "battle_anims", "GEN8- Exclaim.wav"); this.scene.loadAtlas("exclaim", "mystery-encounters"); this.scene.load.once(Phaser.Loader.Events.COMPLETE, () => resolve()); if (!this.scene.load.isLoading()) { From 7b2f21dc8c4efb6018c8c6775b1bfc640750c89a Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Fri, 26 Jul 2024 23:02:15 -0400 Subject: [PATCH 220/270] finish absolute avarice encounter --- .../encounters/absolute-avarice-encounter.ts | 388 ++++++++++++------ .../encounters/fiery-fallout-encounter.ts | 9 +- .../encounters/pokemon-salesman-encounter.ts | 2 +- .../shady-vitamin-dealer-encounter.ts | 10 +- .../mystery-encounters/mystery-encounter.ts | 2 +- .../utils/encounter-pokemon-utils.ts | 44 +- .../absolute-avarice-dialogue.ts | 13 +- src/overrides.ts | 4 +- 8 files changed, 312 insertions(+), 160 deletions(-) diff --git a/src/data/mystery-encounters/encounters/absolute-avarice-encounter.ts b/src/data/mystery-encounters/encounters/absolute-avarice-encounter.ts index f64d387a7fe..a63fc527324 100644 --- a/src/data/mystery-encounters/encounters/absolute-avarice-encounter.ts +++ b/src/data/mystery-encounters/encounters/absolute-avarice-encounter.ts @@ -1,21 +1,26 @@ -import { EnemyPartyConfig, generateModifierTypeOption, leaveEncounterWithoutBattle, updatePlayerMoney, } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import Pokemon from "#app/field/pokemon"; -import { modifierTypes, PokemonHeldItemModifierType } from "#app/modifier/modifier-type"; +import { EnemyPartyConfig, generateModifierTypeOption, initBattleWithEnemyConfig, leaveEncounterWithoutBattle, setEncounterRewards, transitionMysteryEncounterIntroVisuals, } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import Pokemon, { PokemonMove } from "#app/field/pokemon"; +import { BerryModifierType, modifierTypes, PokemonHeldItemModifierType } from "#app/modifier/modifier-type"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { Species } from "#enums/species"; import BattleScene from "#app/battle-scene"; import IMysteryEncounter, { MysteryEncounterBuilder } from "../mystery-encounter"; import { MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; -import { MoneyRequirement, PersistentModifierRequirement } from "../mystery-encounter-requirements"; +import { PersistentModifierRequirement } from "../mystery-encounter-requirements"; import { queueEncounterMessage } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { BerryModifier } from "#app/modifier/modifier"; -import { ModifierRewardPhase, StatChangePhase } from "#app/phases"; +import { StatChangePhase } from "#app/phases"; import { getPokemonSpecies } from "#app/data/pokemon-species"; import { Moves } from "#enums/moves"; import { BattlerTagType } from "#enums/battler-tag-type"; import { BattleStat } from "#app/data/battle-stat"; +import { randInt } from "#app/utils"; +import { BattlerIndex } from "#app/battle"; +import { applyModifierTypeToPlayerPokemon, catchPokemon, getHighestLevelPlayerPokemon } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; +import { TrainerSlot } from "#app/data/trainer-config"; +import { PokeballType } from "#app/data/pokeball"; /** the i18n namespace for this encounter */ const namespace = "mysteryEncounter:absoluteAvarice"; @@ -92,15 +97,6 @@ export const AbsoluteAvariceEncounter: IMysteryEncounter = hidden: true, disableAnimation: true }, - { - spriteKey: "petaya_berry", - fileRoot: "items", - isItem: true, - x: 20, - y: -17, - hidden: true, - disableAnimation: true - }, { spriteKey: "enigma_berry", fileRoot: "items", @@ -119,6 +115,15 @@ export const AbsoluteAvariceEncounter: IMysteryEncounter = hidden: true, disableAnimation: true }, + { + spriteKey: "petaya_berry", + fileRoot: "items", + isItem: true, + x: 30, + y: -17, + hidden: true, + disableAnimation: true + }, { spriteKey: "ganlon_berry", fileRoot: "items", @@ -136,7 +141,8 @@ export const AbsoluteAvariceEncounter: IMysteryEncounter = y: -2, hidden: true, disableAnimation: true - }, { + }, + { spriteKey: "starf_berry", fileRoot: "items", isItem: true, @@ -146,92 +152,11 @@ export const AbsoluteAvariceEncounter: IMysteryEncounter = disableAnimation: true }, ]) + .withHideWildIntroMessage(true) + .withAutoHideIntroVisuals(false) .withOnVisualsStart((scene: BattleScene) => { - const encounter = scene.currentBattle.mysteryEncounter; - const greedentSprites = encounter.introVisuals.getSpriteAtIndex(0); - - scene.playSound("Follow Me"); - - // scene.tweens.add({ - // targets: greedentSprites, - // duration: 600, - // ease: "Cubic.easeOut", - // yoyo: true, - // y: "+=50", - // x: "-=60", - // scale: 1.2, - // onComplete: () => { - // // Bounce the Greedent - // scene.tweens.add({ - // targets: greedentSprites, - // duration: 300, - // ease: "Cubic.easeOut", - // yoyo: true, - // y: "-=20", - // loop: 1, - // }); - // } - // }); - - // Slide left - scene.tweens.add({ - targets: greedentSprites, - duration: 500, - ease: "Cubic.easeOut", - x: "-=300", - onComplete: () => { - // Slide back right, lower - greedentSprites[0].y += 80; - greedentSprites[1].y += 80; - scene.tweens.add({ - targets: greedentSprites, - duration: 300, - ease: "Cubic.easeOut", - yoyo: true, - x: "+=140", - onComplete: () => { - // Slide back right, higher - greedentSprites[0].y -= 80; - greedentSprites[1].y -= 80; - scene.tweens.add({ - targets: greedentSprites, - duration: 500, - ease: "Cubic.easeOut", - x: "+=300", - onComplete: () => { - // Bounce the Greedent - scene.tweens.add({ - targets: greedentSprites, - duration: 300, - ease: "Cubic.easeOut", - yoyo: true, - y: "-=20", - loop: 1, - }); - } - }); - } - }); - } - }); - - const berryAddDelay = 200; - - const animationOrder = ["starf", "sitrus", "lansat", "salac", "apicot", "enigma", "liechi", "ganlon", "lum", "petaya", "leppa"]; - - animationOrder.forEach((berry, i) => { - const introVisualsIndex = encounter.spriteConfigs.findIndex(config => config.spriteKey.includes(berry)); - const [ sprite, tintSprite ] = encounter.introVisuals.getSpriteAtIndex(introVisualsIndex); - // const [ sprite, tintSprite ] = [berrySprites[i * 2], berrySprites[i * 2 + 1]]; - scene.time.delayedCall(berryAddDelay * i + 300, () => { - if (sprite) { - sprite.setVisible(true); - } - if (tintSprite) { - tintSprite.setVisible(true); - } - }); - }); + doGreedentSpriteSteal(scene); + doBerrySpritePile(scene); return true; }) @@ -251,8 +176,8 @@ export const AbsoluteAvariceEncounter: IMysteryEncounter = .withOnInit((scene: BattleScene) => { const encounter = scene.currentBattle.mysteryEncounter; + scene.loadSe("PRSFX- Bug Bite", "battle_anims"); scene.loadSe("Follow Me", "battle_anims", "Follow Me.mp3"); - // scene.loadSe("Follow Me", "battle_anims"); // Get all player berry items, remove from party, and store reference const berryItems = scene.findModifiers(m => m instanceof BerryModifier) as BerryModifier[]; @@ -288,13 +213,13 @@ export const AbsoluteAvariceEncounter: IMysteryEncounter = { species: getPokemonSpecies(Species.GREEDENT), isBoss: true, - bossSegments: 5, + bossSegments: 3, // nature: Nature.BOLD, moveSet: [Moves.THRASH, Moves.BODY_PRESS, Moves.STUFF_CHEEKS, Moves.SLACK_OFF], modifierTypes: bossModifierTypes, tags: [BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON], mysteryEncounterBattleEffects: (pokemon: Pokemon) => { - queueEncounterMessage(pokemon.scene, `${namespace}:option:2:stat_boost`); + queueEncounterMessage(pokemon.scene, `${namespace}:option:1:boss_enraged`); pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [BattleStat.ATK, BattleStat.DEF, BattleStat.SPATK, BattleStat.SPDEF, BattleStat.SPD], 1)); } } @@ -317,15 +242,32 @@ export const AbsoluteAvariceEncounter: IMysteryEncounter = }, ], }) - .withPreOptionPhase(async (scene: BattleScene): Promise => { - const encounter = scene.currentBattle.mysteryEncounter; - updatePlayerMoney(scene, -(encounter.options[0].requirements[0] as MoneyRequirement).requiredMoney, true, false); - return true; - }) .withOptionPhase(async (scene: BattleScene) => { - // Give the player an Ability Charm - scene.unshiftPhase(new ModifierRewardPhase(scene, modifierTypes.ABILITY_CHARM)); - leaveEncounterWithoutBattle(scene, true); + // Pick battle + const encounter = scene.currentBattle.mysteryEncounter; + + // Provides 1x Reviver Seed to each party member at end of battle + const revSeed = generateModifierTypeOption(scene, modifierTypes.REVIVER_SEED).type; + const givePartyPokemonReviverSeeds = () => { + const party = scene.getParty(); + party.forEach(p => { + const seedModifier = revSeed.newModifier(p); + scene.addModifier(seedModifier, false, false, false, true); + }); + queueEncounterMessage(scene, `${namespace}:option:1:food_stash`); + }; + + setEncounterRewards(scene, { fillRemaining: true }, null, givePartyPokemonReviverSeeds); + encounter.startOfBattleEffects.push( + { + sourceBattlerIndex: BattlerIndex.ENEMY, + targets: [BattlerIndex.ENEMY], + move: new PokemonMove(Moves.STUFF_CHEEKS), + ignorePp: true + }); + + transitionMysteryEncounterIntroVisuals(scene, true, true, 500); + await initBattleWithEnemyConfig(scene, encounter.enemyPartyConfigs[0]); }) .build() ) @@ -335,7 +277,6 @@ export const AbsoluteAvariceEncounter: IMysteryEncounter = .withDialogue({ buttonLabel: `${namespace}:option:2:label`, buttonTooltip: `${namespace}:option:2:tooltip`, - secondOptionPrompt: `${namespace}:option:2:select_prompt`, selected: [ { text: `${namespace}:option:2:selected`, @@ -344,19 +285,27 @@ export const AbsoluteAvariceEncounter: IMysteryEncounter = }) .withOptionPhase(async (scene: BattleScene) => { const encounter = scene.currentBattle.mysteryEncounter; - const modifier = encounter.misc.chosenModifier; - // Give the player a Candy Jar if they gave a Berry, and a Healing Charm for Reviver Seed - if (modifier.type.name.includes("Berry")) { - scene.unshiftPhase(new ModifierRewardPhase(scene, modifierTypes.CANDY_JAR)); - } else { - scene.unshiftPhase(new ModifierRewardPhase(scene, modifierTypes.HEALING_CHARM)); - } + const berryMap = encounter.misc.berryItemsMap; - // Remove the modifier if its stacks go to 0 - modifier.stackCount -= 1; - if (modifier.stackCount === 0) { - scene.removeModifier(modifier); - } + // Returns 2/5 of the berries stolen from each Pokemon + const party = scene.getParty(); + party.forEach(pokemon => { + const stolenBerries: BerryModifier[] = berryMap.get(pokemon.id); + const berryTypesAsArray = []; + stolenBerries?.forEach(bMod => berryTypesAsArray.push(...new Array(bMod.stackCount).fill(bMod.berryType))); + const returnedBerryCount = Math.floor((berryTypesAsArray.length ?? 0) * 2 / 5); + + if (returnedBerryCount > 0) { + for (let i = 0; i < returnedBerryCount; i++) { + // Shuffle remaining berry types and pop + Phaser.Math.RND.shuffle(berryTypesAsArray); + const randBerryType = berryTypesAsArray.pop(); + + const berryModType = generateModifierTypeOption(scene, modifierTypes.BERRY, [randBerryType]).type as BerryModifierType; + applyModifierTypeToPlayerPokemon(scene, pokemon, berryModType); + } + } + }); leaveEncounterWithoutBattle(scene, true); }) @@ -368,27 +317,196 @@ export const AbsoluteAvariceEncounter: IMysteryEncounter = .withDialogue({ buttonLabel: `${namespace}:option:3:label`, buttonTooltip: `${namespace}:option:3:tooltip`, - secondOptionPrompt: `${namespace}:option:3:select_prompt`, selected: [ { text: `${namespace}:option:3:selected`, }, ], }) + .withPreOptionPhase(async (scene: BattleScene) => { + // Animate berries being eaten + doGreedentEatBerries(scene); + doBerrySpritePile(scene, true); + return true; + }) .withOptionPhase(async (scene: BattleScene) => { - const encounter = scene.currentBattle.mysteryEncounter; - const modifier = encounter.misc.chosenModifier; - // Give the player a Berry Pouch - scene.unshiftPhase(new ModifierRewardPhase(scene, modifierTypes.BERRY_POUCH)); - - // Remove the modifier if its stacks go to 0 - modifier.stackCount -= 1; - if (modifier.stackCount === 0) { - scene.removeModifier(modifier); - } + // Let it have the food + // Greedent joins the team, level equal to 2 below highest party member + const level = getHighestLevelPlayerPokemon(scene).level; + const greedent = scene.addEnemyPokemon(getPokemonSpecies(Species.GREEDENT), level, TrainerSlot.NONE, false); + greedent.moveset = [new PokemonMove(Moves.THRASH), new PokemonMove(Moves.BODY_PRESS), new PokemonMove(Moves.STUFF_CHEEKS), new PokemonMove(Moves.SLACK_OFF)]; + greedent.passive = true; + await catchPokemon(scene, greedent, null, PokeballType.POKEBALL, false); leaveEncounterWithoutBattle(scene, true); }) .build() ) .build(); + +function doGreedentSpriteSteal(scene: BattleScene) { + const shakeDelay = 50; + const slideDelay = 500; + + const greedentSprites = scene.currentBattle.mysteryEncounter.introVisuals.getSpriteAtIndex(0); + + scene.playSound("Follow Me"); + scene.tweens.chain({ + targets: greedentSprites, + tweens: [ + { // Slide Greedent diagonally + duration: slideDelay, + ease: "Cubic.easeOut", + y: "+=75", + x: "-=65", + scale: 1.1 + }, + { // Shake + duration: shakeDelay, + ease: "Cubic.easeOut", + yoyo: true, + x: (randInt(2) > 0 ? "-=" : "+=") + 5, + y: (randInt(2) > 0 ? "-=" : "+=") + 5, + }, + { // Shake + duration: shakeDelay, + ease: "Cubic.easeOut", + yoyo: true, + x: (randInt(2) > 0 ? "-=" : "+=") + 5, + y: (randInt(2) > 0 ? "-=" : "+=") + 5, + }, + { // Shake + duration: shakeDelay, + ease: "Cubic.easeOut", + yoyo: true, + x: (randInt(2) > 0 ? "-=" : "+=") + 5, + y: (randInt(2) > 0 ? "-=" : "+=") + 5, + }, + { // Shake + duration: shakeDelay, + ease: "Cubic.easeOut", + yoyo: true, + x: (randInt(2) > 0 ? "-=" : "+=") + 5, + y: (randInt(2) > 0 ? "-=" : "+=") + 5, + }, + { // Shake + duration: shakeDelay, + ease: "Cubic.easeOut", + yoyo: true, + x: (randInt(2) > 0 ? "-=" : "+=") + 5, + y: (randInt(2) > 0 ? "-=" : "+=") + 5, + }, + { // Shake + duration: shakeDelay, + ease: "Cubic.easeOut", + yoyo: true, + x: (randInt(2) > 0 ? "-=" : "+=") + 5, + y: (randInt(2) > 0 ? "-=" : "+=") + 5, + }, + { // Slide Greedent diagonally + duration: slideDelay, + ease: "Cubic.easeOut", + y: "-=75", + x: "+=65", + scale: 1 + }, + { // Bounce at the end + duration: 300, + ease: "Cubic.easeOut", + yoyo: true, + y: "-=20", + loop: 1, + } + ] + }); +} + +function doGreedentEatBerries(scene: BattleScene) { + const greedentSprites = scene.currentBattle.mysteryEncounter.introVisuals.getSpriteAtIndex(0); + + // scene.playSound("Follow Me"); + let index = 1; + scene.tweens.add({ + targets: greedentSprites, + duration: 150, + ease: "Cubic.easeOut", + yoyo: true, + y: "-=8", + loop: 5, + onStart: () => { + scene.playSound("PRSFX- Bug Bite"); + }, + onLoop: () => { + if (index % 2 === 0) { + scene.playSound("PRSFX- Bug Bite"); + } + index++; + } + }); +} + +/** + * + * @param scene + * @param isEat - default false. Will "create" pile when false, and remove pile when true. + */ +function doBerrySpritePile(scene: BattleScene, isEat: boolean = false) { + const berryAddDelay = 150; + let animationOrder = ["starf", "sitrus", "lansat", "salac", "apicot", "enigma", "liechi", "ganlon", "lum", "petaya", "leppa"]; + if (isEat) { + animationOrder = animationOrder.reverse(); + } + const encounter = scene.currentBattle.mysteryEncounter; + animationOrder.forEach((berry, i) => { + const introVisualsIndex = encounter.spriteConfigs.findIndex(config => config.spriteKey.includes(berry)); + const [ sprite, tintSprite ] = encounter.introVisuals.getSpriteAtIndex(introVisualsIndex); + scene.time.delayedCall(berryAddDelay * i + 400, () => { + if (sprite) { + sprite.setVisible(!isEat); + } + if (tintSprite) { + tintSprite.setVisible(!isEat); + } + + // Animate Petaya berry falling off the pile + if (berry === "petaya" && sprite && tintSprite && !isEat) { + scene.time.delayedCall(200, () => { + doBerryBounce(scene, [sprite, tintSprite], 30, 500); + }); + } + }); + }); +} + +function doBerryBounce(scene: BattleScene, berrySprites: Phaser.GameObjects.Sprite[], yd: number, baseBounceDuration: integer) { + let bouncePower = 1; + let bounceYOffset = yd; + + const doBounce = () => { + scene.tweens.add({ + targets: berrySprites, + y: "+=" + bounceYOffset, + x: { value: "+=" + (bouncePower * bouncePower * 10), ease: "Linear" }, + duration: bouncePower * baseBounceDuration, + ease: "Cubic.easeIn", + onComplete: () => { + bouncePower = bouncePower > 0.01 ? bouncePower * 0.5 : 0; + + if (bouncePower) { + bounceYOffset = bounceYOffset * bouncePower; + + scene.tweens.add({ + targets: berrySprites, + y: "-=" + bounceYOffset, + x: { value: "+=" + (bouncePower * bouncePower * 10), ease: "Linear" }, + duration: bouncePower * baseBounceDuration, + ease: "Cubic.easeOut", + onComplete: () => doBounce() + }); + } + } + }); + }; + + doBounce(); +} diff --git a/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts b/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts index 2da9ade0ff0..c7933129ff9 100644 --- a/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts +++ b/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts @@ -1,6 +1,6 @@ import { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; import { EnemyPartyConfig, generateModifierTypeOption, initBattleWithEnemyConfig, initCustomMovesForEncounter, leaveEncounterWithoutBattle, setEncounterExp, setEncounterRewards, transitionMysteryEncounterIntroVisuals } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import { modifierTypes, } from "#app/modifier/modifier-type"; +import { AttackTypeBoosterModifierType, modifierTypes, } from "#app/modifier/modifier-type"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import BattleScene from "#app/battle-scene"; import IMysteryEncounter, { MysteryEncounterBuilder } from "../mystery-encounter"; @@ -17,7 +17,7 @@ import { WeatherType } from "#app/data/weather"; import { isNullOrUndefined, randSeedInt } from "#app/utils"; import { StatusEffect } from "#app/data/status-effect"; import { queueEncounterMessage } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; -import { applyDamageToPokemon } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; +import { applyDamageToPokemon, applyModifierTypeToPlayerPokemon } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; @@ -246,9 +246,8 @@ function giveLeadPokemonCharcoal(scene: BattleScene) { // Give first party pokemon Charcoal for free at end of battle const leadPokemon = scene.getParty()?.[0]; if (leadPokemon) { - const charcoal = generateModifierTypeOption(scene, modifierTypes.ATTACK_TYPE_BOOSTER, [Type.FIRE]); - scene.addModifier(charcoal.type.newModifier(leadPokemon), true); - scene.updateModifiers(); + const charcoal = generateModifierTypeOption(scene, modifierTypes.ATTACK_TYPE_BOOSTER, [Type.FIRE]).type as AttackTypeBoosterModifierType; + applyModifierTypeToPlayerPokemon(scene, leadPokemon, charcoal); scene.currentBattle.mysteryEncounter.setDialogueToken("leadPokemon", leadPokemon.name); queueEncounterMessage(scene, `${namespace}:found_charcoal`); } diff --git a/src/data/mystery-encounters/encounters/pokemon-salesman-encounter.ts b/src/data/mystery-encounters/encounters/pokemon-salesman-encounter.ts index b5625cd349d..d1750119add 100644 --- a/src/data/mystery-encounters/encounters/pokemon-salesman-encounter.ts +++ b/src/data/mystery-encounters/encounters/pokemon-salesman-encounter.ts @@ -133,7 +133,7 @@ export const PokemonSalesmanEncounter: IMysteryEncounter = // "Catch" purchased pokemon const data = new PokemonData(purchasedPokemon); data.player = false; - await catchPokemon(scene, data.toPokemon(scene) as EnemyPokemon, null, PokeballType.POKEBALL, true); + await catchPokemon(scene, data.toPokemon(scene) as EnemyPokemon, null, PokeballType.POKEBALL, true, true); leaveEncounterWithoutBattle(scene, 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 19248d7a5bd..bd7afdaa832 100644 --- a/src/data/mystery-encounters/encounters/shady-vitamin-dealer-encounter.ts +++ b/src/data/mystery-encounters/encounters/shady-vitamin-dealer-encounter.ts @@ -10,7 +10,7 @@ import IMysteryEncounter, { MysteryEncounterBuilder } from "../mystery-encounter import { MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; import { MoneyRequirement } from "../mystery-encounter-requirements"; import { getEncounterText, queueEncounterMessage } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; -import { applyDamageToPokemon } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; +import { applyDamageToPokemon, applyModifierTypeToPlayerPokemon } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; @@ -110,10 +110,8 @@ export const ShadyVitaminDealerEncounter: IMysteryEncounter = const modifiers = encounter.misc.modifiers; for (const modType of modifiers) { - const modifier = modType.newModifier(chosenPokemon); - await scene.addModifier(modifier, true, false, false, true); + await applyModifierTypeToPlayerPokemon(scene, chosenPokemon, modType); } - scene.updateModifiers(true); leaveEncounterWithoutBattle(scene); }) @@ -195,10 +193,8 @@ export const ShadyVitaminDealerEncounter: IMysteryEncounter = const modifiers = encounter.misc.modifiers; for (const modType of modifiers) { - const modifier = modType.newModifier(chosenPokemon); - await scene.addModifier(modifier, true, false, false, true); + await applyModifierTypeToPlayerPokemon(scene, chosenPokemon, modType); } - scene.updateModifiers(true); leaveEncounterWithoutBattle(scene); }) diff --git a/src/data/mystery-encounters/mystery-encounter.ts b/src/data/mystery-encounters/mystery-encounter.ts index 51815e3ccb7..502d84d9124 100644 --- a/src/data/mystery-encounters/mystery-encounter.ts +++ b/src/data/mystery-encounters/mystery-encounter.ts @@ -167,13 +167,13 @@ export default class IMysteryEncounter implements IMysteryEncounter { this.requirements = this.requirements ? this.requirements : []; this.hideBattleIntroMessage = !isNullOrUndefined(this.hideBattleIntroMessage) ? this.hideBattleIntroMessage : false; this.autoHideIntroVisuals = !isNullOrUndefined(this.autoHideIntroVisuals) ? this.autoHideIntroVisuals : true; - this.startOfBattleEffects = this.startOfBattleEffects ?? []; // Reset any dirty flags or encounter data this.startOfBattleEffectsComplete = false; this.lockEncounterRewardTiers = true; this.dialogueTokens = {}; this.enemyPartyConfigs = []; + this.startOfBattleEffects = []; this.introVisuals = null; this.misc = null; this.expMultiplier = 1; diff --git a/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts b/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts index b33607c6443..a11e65c5c54 100644 --- a/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts @@ -17,7 +17,7 @@ import { Type } from "#app/data/type"; import PokemonSpecies, { getPokemonSpecies, speciesStarters } from "#app/data/pokemon-species"; import { queueEncounterMessage, showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; import { getPokemonNameWithAffix } from "#app/messages"; -import { modifierTypes } from "#app/modifier/modifier-type"; +import { modifierTypes, PokemonHeldItemModifierType } from "#app/modifier/modifier-type"; export interface MysteryEncounterPokemonData { spriteScale?: number @@ -233,6 +233,36 @@ export async function modifyPlayerPokemonBST(pokemon: PlayerPokemon, value: numb pokemon.calculateStats(); } +/** + * Will attempt to add a new modifier to a Pokemon. + * If the Pokemon already has max stacks of that item, it will instead apply 'fallbackModifierType', if specified. + * @param scene + * @param pokemon + * @param modType + * @param fallbackModifierType + */ +export async function applyModifierTypeToPlayerPokemon(scene: BattleScene, pokemon: PlayerPokemon, modType: PokemonHeldItemModifierType, fallbackModifierType?: PokemonHeldItemModifierType) { + // Check if the Pokemon has max stacks of that item already + const existing = scene.findModifier(m => ( + m instanceof PokemonHeldItemModifier && + m.type.id === modType.id && + m.pokemonId === pokemon.id + )) as PokemonHeldItemModifier; + + // At max stacks + if (existing && existing.getStackCount() >= existing.getMaxStackCount(scene)) { + if (!fallbackModifierType) { + return; + } + + // Apply fallback + return applyModifierTypeToPlayerPokemon(scene, pokemon, fallbackModifierType); + } + + const modifier = modType.newModifier(pokemon); + await scene.addModifier(modifier, false, false, false, true); +} + /** * Alternative to using AttemptCapturePhase * Assumes player sprite is visible on the screen (this is intended for non-combat uses) @@ -407,7 +437,7 @@ function failCatch(scene: BattleScene, pokemon: EnemyPokemon, originalY: number, }); } -export async function catchPokemon(scene: BattleScene, pokemon: EnemyPokemon, pokeball: Phaser.GameObjects.Sprite, pokeballType: PokeballType, isObtain: boolean = false): Promise { +export async function catchPokemon(scene: BattleScene, pokemon: EnemyPokemon, pokeball: Phaser.GameObjects.Sprite, pokeballType: PokeballType, showCatchObtainMessage: boolean = true, isObtain: boolean = false): Promise { scene.unshiftPhase(new VictoryPhase(scene, BattlerIndex.ENEMY)); const speciesForm = !pokemon.fusionSpecies ? pokemon.getSpeciesForm() : pokemon.getFusionSpeciesForm(); @@ -433,7 +463,7 @@ export async function catchPokemon(scene: BattleScene, pokemon: EnemyPokemon, po scene.gameData.updateSpeciesDexIvs(pokemon.species.getRootSpeciesId(true), pokemon.ivs); return new Promise(resolve => { - scene.ui.showText(i18next.t(isObtain ? "battle:pokemonObtained" : "battle:pokemonCaught", { pokemonName: pokemon.name }), null, () => { + const doPokemonCatchMenu = () => { const end = () => { scene.pokemonInfoContainer.hide(); removePb(scene, pokeball); @@ -488,7 +518,13 @@ export async function catchPokemon(scene: BattleScene, pokemon: EnemyPokemon, po addToParty(); } }); - }, 0, true); + }; + + if (showCatchObtainMessage) { + scene.ui.showText(i18next.t(isObtain ? "battle:pokemonObtained" : "battle:pokemonCaught", { pokemonName: pokemon.name }), null, doPokemonCatchMenu, 0, true); + } else { + doPokemonCatchMenu(); + } }); } diff --git a/src/locales/en/mystery-encounters/absolute-avarice-dialogue.ts b/src/locales/en/mystery-encounters/absolute-avarice-dialogue.ts index 69796a88d86..5d0935282f6 100644 --- a/src/locales/en/mystery-encounters/absolute-avarice-dialogue.ts +++ b/src/locales/en/mystery-encounters/absolute-avarice-dialogue.ts @@ -7,7 +7,10 @@ export const absoluteAvariceDialogue = { 1: { label: "Battle It", tooltip: "(-) Tough Battle\n(+) Rewards from its Berry Hoard", - selected: "You'll show this Greedent what\nhappens to those who steal from you!", + 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! + $@s{item_fanfare}Each Pokémon in your party gains 1x Reviver Seed!` }, 2: { label: "Reason with It", @@ -18,10 +21,10 @@ export const absoluteAvariceDialogue = { 3: { label: "Let It Have the Food", tooltip: "(-) Lose All Berries\n(?) The Greedent Will Like You", - selected: `The Greedent devours the entire stash of berries in a flash! - $Patting its stomach, it looks at you appreciatively. - $Perhaps you could feed it more berries on your adventure... - $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!`, }, } }; diff --git a/src/overrides.ts b/src/overrides.ts index b530032364d..1d006630983 100644 --- a/src/overrides.ts +++ b/src/overrides.ts @@ -117,9 +117,9 @@ export const EGG_GACHA_PULL_COUNT_OVERRIDE: number = 0; */ // 1 to 256, set to null to ignore -export const MYSTERY_ENCOUNTER_RATE_OVERRIDE: number = null; +export const MYSTERY_ENCOUNTER_RATE_OVERRIDE: number = 256; export const MYSTERY_ENCOUNTER_TIER_OVERRIDE: MysteryEncounterTier = null; -export const MYSTERY_ENCOUNTER_OVERRIDE: MysteryEncounterType = null; +export const MYSTERY_ENCOUNTER_OVERRIDE: MysteryEncounterType = MysteryEncounterType.ABSOLUTE_AVARICE; /** * MODIFIER / ITEM OVERRIDES From 132f5ac343f049b759d496205c46763ee8d37035 Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Sun, 28 Jul 2024 11:56:16 -0400 Subject: [PATCH 221/270] add unit tests and enhancements for item overrides in tests --- src/battle-scene.ts | 4 +- .../encounters/absolute-avarice-encounter.ts | 7 - .../encounters/delibirdy-encounter.ts | 74 ++++- .../utils/encounter-phase-utils.ts | 91 ++++-- src/modifier/modifier-type.ts | 78 +++-- src/modifier/modifier.ts | 10 +- src/overrides.ts | 8 +- .../mystery-encounter/encounterTestUtils.ts | 58 ++-- .../absolute-avarice-encounter.test.ts | 266 ++++++++++++++++++ .../encounters/delibirdy-encounter.test.ts | 111 +++++++- src/test/utils/overridesHelper.ts | 7 + src/test/utils/phaseInterceptor.ts | 11 +- 12 files changed, 634 insertions(+), 91 deletions(-) create mode 100644 src/test/mystery-encounter/encounters/absolute-avarice-encounter.test.ts diff --git a/src/battle-scene.ts b/src/battle-scene.ts index c9409d7cab0..169c024d329 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -1072,12 +1072,14 @@ export default class BattleScene extends SceneBase { this.field.add(newTrainer); } - // TODO: remove this once spawn rates are finalized + // TODO: remove these once ME spawn rates are finalized // let testStartingWeight = 0; // while (testStartingWeight < 3) { // calculateMEAggregateStats(this, testStartingWeight); // testStartingWeight += 2; // } + // calculateRareSpawnAggregateStats(this, 14); + // Check for mystery encounter // Can only occur in place of a standard wild battle, waves 10-180 if (this.gameMode.hasMysteryEncounters && newBattleType === BattleType.WILD && !this.gameMode.isBoss(newWaveIndex) && newWaveIndex < 180 && newWaveIndex > 10) { diff --git a/src/data/mystery-encounters/encounters/absolute-avarice-encounter.ts b/src/data/mystery-encounters/encounters/absolute-avarice-encounter.ts index a63fc527324..9077f0f1ab8 100644 --- a/src/data/mystery-encounters/encounters/absolute-avarice-encounter.ts +++ b/src/data/mystery-encounters/encounters/absolute-avarice-encounter.ts @@ -168,11 +168,6 @@ export const AbsoluteAvariceEncounter: IMysteryEncounter = .withTitle(`${namespace}:title`) .withDescription(`${namespace}:description`) .withQuery(`${namespace}:query`) - .withOutroDialogue([ - { - text: `${namespace}:outro`, - } - ]) .withOnInit((scene: BattleScene) => { const encounter = scene.currentBattle.mysteryEncounter; @@ -423,8 +418,6 @@ function doGreedentSpriteSteal(scene: BattleScene) { function doGreedentEatBerries(scene: BattleScene) { const greedentSprites = scene.currentBattle.mysteryEncounter.introVisuals.getSpriteAtIndex(0); - - // scene.playSound("Follow Me"); let index = 1; scene.tweens.add({ targets: greedentSprites, diff --git a/src/data/mystery-encounters/encounters/delibirdy-encounter.ts b/src/data/mystery-encounters/encounters/delibirdy-encounter.ts index c58f9775a04..dcc37cda8fe 100644 --- a/src/data/mystery-encounters/encounters/delibirdy-encounter.ts +++ b/src/data/mystery-encounters/encounters/delibirdy-encounter.ts @@ -1,18 +1,20 @@ -import { leaveEncounterWithoutBattle, selectPokemonForOption, updatePlayerMoney, } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { generateModifierTypeOption, leaveEncounterWithoutBattle, selectPokemonForOption, updatePlayerMoney, } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import Pokemon, { PlayerPokemon } from "#app/field/pokemon"; -import { modifierTypes } from "#app/modifier/modifier-type"; +import { modifierTypes, PokemonHeldItemModifierType } from "#app/modifier/modifier-type"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { Species } from "#enums/species"; import BattleScene from "#app/battle-scene"; import IMysteryEncounter, { MysteryEncounterBuilder } from "../mystery-encounter"; import { MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; -import { HeldItemRequirement, MoneyRequirement } from "../mystery-encounter-requirements"; -import { getEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; +import { CombinationPokemonRequirement, HeldItemRequirement, MoneyRequirement } from "../mystery-encounter-requirements"; +import { getEncounterText, showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; -import { BerryModifier, PokemonBaseStatModifier, PokemonBaseStatTotalModifier, PokemonHeldItemModifier, PokemonInstantReviveModifier, TerastallizeModifier } from "#app/modifier/modifier"; +import { BerryModifier, HealingBoosterModifier, HiddenAbilityRateBoosterModifier, LevelIncrementBoosterModifier, PokemonBaseStatModifier, PokemonBaseStatTotalModifier, PokemonHeldItemModifier, PokemonInstantReviveModifier, PreserveBerryModifier, TerastallizeModifier } from "#app/modifier/modifier"; import { ModifierRewardPhase } from "#app/phases"; import { OptionSelectItem } from "#app/ui/abstact-option-select-ui-handler"; +import { applyModifierTypeToPlayerPokemon } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; +import i18next from "#app/plugins/i18n"; /** the i18n namespace for this encounter */ const namespace = "mysteryEncounter:delibirdy"; @@ -39,6 +41,10 @@ export const DelibirdyEncounter: IMysteryEncounter = .withEncounterTier(MysteryEncounterTier.GREAT) .withSceneWaveRangeRequirement(10, 180) .withSceneRequirement(new MoneyRequirement(0, 2.75)) // Must have enough money for it to spawn at the very least + .withPrimaryPokemonRequirement(new CombinationPokemonRequirement( // Must also have either option 2 or 3 available to spawn + new HeldItemRequirement(OPTION_2_ALLOWED_MODIFIERS), + new HeldItemRequirement(OPTION_3_DISALLOWED_MODIFIERS, 1, true) + )) .withIntroSpriteConfigs([ { spriteKey: Species.DELIBIRD.toString(), @@ -82,7 +88,7 @@ export const DelibirdyEncounter: IMysteryEncounter = .withOption( new MysteryEncounterOptionBuilder() .withOptionMode(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT) - .withSceneMoneyRequirement(0, 2.75) + .withSceneMoneyRequirement(0, 2.75) // Must have money to spawn .withDialogue({ buttonLabel: `${namespace}:option:1:label`, buttonTooltip: `${namespace}:option:1:tooltip`, @@ -99,7 +105,19 @@ export const DelibirdyEncounter: IMysteryEncounter = }) .withOptionPhase(async (scene: BattleScene) => { // Give the player an Ability Charm - scene.unshiftPhase(new ModifierRewardPhase(scene, modifierTypes.ABILITY_CHARM)); + // Check if the player has max stacks of that item already + const existing = scene.findModifier(m => m instanceof HiddenAbilityRateBoosterModifier) as HiddenAbilityRateBoosterModifier; + + if (existing && existing.getStackCount() >= existing.getMaxStackCount(scene)) { + // At max stacks, give the first party pokemon a Shell Bell instead + const shellBell = generateModifierTypeOption(scene, modifierTypes.SHELL_BELL).type as PokemonHeldItemModifierType; + await applyModifierTypeToPlayerPokemon(scene, scene.getParty()[0], shellBell); + scene.playSound("item_fanfare"); + await showEncounterText(scene, i18next.t("battle:rewardGain", { modifierName: shellBell.name }), null, true); + } else { + scene.unshiftPhase(new ModifierRewardPhase(scene, modifierTypes.ABILITY_CHARM)); + } + leaveEncounterWithoutBattle(scene, true); }) .build() @@ -159,11 +177,34 @@ export const DelibirdyEncounter: IMysteryEncounter = .withOptionPhase(async (scene: BattleScene) => { const encounter = scene.currentBattle.mysteryEncounter; const modifier = encounter.misc.chosenModifier; + // Give the player a Candy Jar if they gave a Berry, and a Healing Charm for Reviver Seed if (modifier.type.name.includes("Berry")) { - scene.unshiftPhase(new ModifierRewardPhase(scene, modifierTypes.CANDY_JAR)); + // Check if the player has max stacks of that Candy Jar already + const existing = scene.findModifier(m => m instanceof LevelIncrementBoosterModifier) as LevelIncrementBoosterModifier; + + if (existing && existing.getStackCount() >= existing.getMaxStackCount(scene)) { + // At max stacks, give the first party pokemon a Shell Bell instead + const shellBell = generateModifierTypeOption(scene, modifierTypes.SHELL_BELL).type as PokemonHeldItemModifierType; + await applyModifierTypeToPlayerPokemon(scene, scene.getParty()[0], shellBell); + scene.playSound("item_fanfare"); + await showEncounterText(scene, i18next.t("battle:rewardGain", { modifierName: shellBell.name }), null, true); + } else { + scene.unshiftPhase(new ModifierRewardPhase(scene, modifierTypes.CANDY_JAR)); + } } else { - scene.unshiftPhase(new ModifierRewardPhase(scene, modifierTypes.HEALING_CHARM)); + // Check if the player has max stacks of that Healing Charm already + const existing = scene.findModifier(m => m instanceof HealingBoosterModifier) as HealingBoosterModifier; + + if (existing && existing.getStackCount() >= existing.getMaxStackCount(scene)) { + // At max stacks, give the first party pokemon a Shell Bell instead + const shellBell = generateModifierTypeOption(scene, modifierTypes.SHELL_BELL).type as PokemonHeldItemModifierType; + await applyModifierTypeToPlayerPokemon(scene, scene.getParty()[0], shellBell); + scene.playSound("item_fanfare"); + await showEncounterText(scene, i18next.t("battle:rewardGain", { modifierName: shellBell.name }), null, true); + } else { + scene.unshiftPhase(new ModifierRewardPhase(scene, modifierTypes.HEALING_CHARM)); + } } // Remove the modifier if its stacks go to 0 @@ -231,8 +272,19 @@ export const DelibirdyEncounter: IMysteryEncounter = .withOptionPhase(async (scene: BattleScene) => { const encounter = scene.currentBattle.mysteryEncounter; const modifier = encounter.misc.chosenModifier; - // Give the player a Berry Pouch - scene.unshiftPhase(new ModifierRewardPhase(scene, modifierTypes.BERRY_POUCH)); + + // Check if the player has max stacks of Berry Pouch already + const existing = scene.findModifier(m => m instanceof PreserveBerryModifier) as PreserveBerryModifier; + + if (existing && existing.getStackCount() >= existing.getMaxStackCount(scene)) { + // At max stacks, give the first party pokemon a Shell Bell instead + const shellBell = generateModifierTypeOption(scene, modifierTypes.SHELL_BELL).type as PokemonHeldItemModifierType; + await applyModifierTypeToPlayerPokemon(scene, scene.getParty()[0], shellBell); + scene.playSound("item_fanfare"); + await showEncounterText(scene, i18next.t("battle:rewardGain", { modifierName: shellBell.name }), null, true); + } else { + scene.unshiftPhase(new ModifierRewardPhase(scene, modifierTypes.BERRY_POUCH)); + } // Remove the modifier if its stacks go to 0 modifier.stackCount -= 1; diff --git a/src/data/mystery-encounters/utils/encounter-phase-utils.ts b/src/data/mystery-encounters/utils/encounter-phase-utils.ts index 52b67cb4a47..a0fe413339d 100644 --- a/src/data/mystery-encounters/utils/encounter-phase-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-phase-utils.ts @@ -1,11 +1,11 @@ import { BattlerIndex, BattleType } from "#app/battle"; -import { biomeLinks } from "#app/data/biomes"; +import { biomeLinks, BiomePoolTier } from "#app/data/biomes"; import MysteryEncounterOption from "#app/data/mystery-encounters/mystery-encounter-option"; import { WEIGHT_INCREMENT_ON_SPAWN_MISS } from "#app/data/mystery-encounters/mystery-encounters"; import { showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; import Pokemon, { FieldPosition, PlayerPokemon, PokemonMove } from "#app/field/pokemon"; import { ExpBalanceModifier, ExpShareModifier, MultipleParticipantExpBonusModifier, PokemonExpBoosterModifier } from "#app/modifier/modifier"; -import { CustomModifierSettings, getModifierPoolForType, ModifierPoolType, ModifierType, ModifierTypeFunc, ModifierTypeGenerator, ModifierTypeOption, modifierTypes, PokemonHeldItemModifierType, regenerateModifierPoolThresholds } from "#app/modifier/modifier-type"; +import { CustomModifierSettings, ModifierPoolType, ModifierType, ModifierTypeFunc, ModifierTypeGenerator, ModifierTypeOption, modifierTypes, PokemonHeldItemModifierType, regenerateModifierPoolThresholds } from "#app/modifier/modifier-type"; import * as Overrides from "#app/overrides"; import { BattleEndPhase, EggLapsePhase, ExpPhase, GameOverPhase, ModifierRewardPhase, MovePhase, SelectModifierPhase, ShowPartyExpBarPhase, TrainerVictoryPhase } from "#app/phases"; import { MysteryEncounterBattlePhase, MysteryEncounterBattleStartCleanupPhase, MysteryEncounterPhase, MysteryEncounterRewardsPhase } from "#app/phases/mystery-encounter-phases"; @@ -344,20 +344,10 @@ export function generateModifierTypeOption(scene: BattleScene, modifier: () => M const modifierId = Object.keys(modifierTypes).find(k => modifierTypes[k] === modifier); let result: ModifierType = modifierTypes[modifierId]?.(); - // Gets tier of item by checking player item pool - const modifierPool = getModifierPoolForType(ModifierPoolType.PLAYER); - Object.keys(modifierPool).every(modifierTier => { - const modType = modifierPool[modifierTier].find(m => { - if (m.modifierType.id === modifierId) { - return m; - } - }); - if (modType) { - result = modType.modifierType; - return false; - } - return true; - }); + // Populates item id and tier (order matters) + result = result + .withIdFromFunc(modifierTypes[modifierId]) + .withTierFromPool(); result = result instanceof ModifierTypeGenerator ? result.generateType(scene.getParty(), pregenArgs) : result; return new ModifierTypeOption(result, 0); @@ -881,3 +871,72 @@ export function calculateMEAggregateStats(scene: BattleScene, baseSpawnWeight: n console.log(stats); } + + +/** + * TODO: remove once encounter spawn rate is finalized + * Just a helper function to calculate aggregate stats for MEs in a Classic run + * @param scene + * @param luckValue - 0 to 14 + */ +export function calculateRareSpawnAggregateStats(scene: BattleScene, luckValue: number) { + const numRuns = 1000; + let run = 0; + + const calculateNumRareEncounters = (): any[] => { + const bossEncountersByRarity = [0, 0, 0, 0]; + scene.setSeed(Utils.randomString(24)); + scene.resetSeed(); + // There are 12 wild boss floors + for (let i = 0; i < 12; i++) { + // Roll boss tier + // luck influences encounter rarity + let luckModifier = 0; + if (!isNaN(luckValue)) { + luckModifier = luckValue * 0.5; + } + const tierValue = Utils.randSeedInt(64 - luckModifier); + const tier = tierValue >= 20 ? BiomePoolTier.BOSS : tierValue >= 6 ? BiomePoolTier.BOSS_RARE : tierValue >= 1 ? BiomePoolTier.BOSS_SUPER_RARE : BiomePoolTier.BOSS_ULTRA_RARE; + + switch (tier) { + default: + case BiomePoolTier.BOSS: + ++bossEncountersByRarity[0]; + break; + case BiomePoolTier.BOSS_RARE: + ++bossEncountersByRarity[1]; + break; + case BiomePoolTier.BOSS_SUPER_RARE: + ++bossEncountersByRarity[2]; + break; + case BiomePoolTier.BOSS_ULTRA_RARE: + ++bossEncountersByRarity[3]; + break; + } + } + + return bossEncountersByRarity; + }; + + const encounterRuns: number[][] = []; + while (run < numRuns) { + scene.executeWithSeedOffset(() => { + const bossEncountersByRarity = calculateNumRareEncounters(); + encounterRuns.push(bossEncountersByRarity); + }, 1000 * run); + run++; + } + + const n = encounterRuns.length; + // const totalEncountersInRun = encounterRuns.map(run => run.reduce((a, b) => a + b)); + // const totalMean = totalEncountersInRun.reduce((a, b) => a + b) / n; + // const totalStd = Math.sqrt(totalEncountersInRun.map(x => Math.pow(x - totalMean, 2)).reduce((a, b) => a + b) / n); + const commonMean = encounterRuns.reduce((a, b) => a + b[0], 0) / n; + const rareMean = encounterRuns.reduce((a, b) => a + b[1], 0) / n; + const superRareMean = encounterRuns.reduce((a, b) => a + b[2], 0) / n; + const ultraRareMean = encounterRuns.reduce((a, b) => a + b[3], 0) / n; + + const stats = `Avg Commons: ${commonMean}\nAvg Rare: ${rareMean}\nAvg Super Rare: ${superRareMean}\nAvg Ultra Rare: ${ultraRareMean}\n`; + + console.log(stats); +} diff --git a/src/modifier/modifier-type.ts b/src/modifier/modifier-type.ts index ae5b1ba0ee8..9a8504f16d3 100644 --- a/src/modifier/modifier-type.ts +++ b/src/modifier/modifier-type.ts @@ -109,11 +109,35 @@ export class ModifierType { return null; } + /** + * Populates item id for ModifierType instance + * @param func + */ withIdFromFunc(func: ModifierTypeFunc): ModifierType { this.id = Object.keys(modifierTypes).find(k => modifierTypes[k] === func); return this; } + /** + * Populates item tier for ModifierType instance + * Tier is a necessary field for items that appear in player shop (determines the Pokeball visual they use) + * To find the tier, this function performs a reverse lookup of the item type in modifier pools + * @param poolType - Default 'ModifierPoolType.PLAYER'. Which pool to lookup item tier from + */ + withTierFromPool(poolType: ModifierPoolType = ModifierPoolType.PLAYER): ModifierType { + const modifierPool = getModifierPoolForType(poolType); + Object.values(modifierPool).every(weightedModifiers => { + weightedModifiers.every(m => { + if (m.modifierType.id === this.id) { + this.tier = m.modifierType.tier; + return false; // Early lookup return if tier found + } + }); + return !this.tier; // Early lookup return if tier found + }); + return this; + } + newModifier(...args: any[]): Modifier { return this.newModifierFunc(this, args); } @@ -1841,6 +1865,21 @@ export function getModifierTypeFuncById(id: string): ModifierTypeFunc { return modifierTypes[id]; } +/** + * Generates modifier options for a SelectModifierPhase + * @param count - Determines the number of items to generate + * @param party - Party is required for generating proper modifier pools + * @param modifierTiers - (Optional) If specified, rolls items in the specified tiers. Commonly used for tier-locking with Lock Capsule. + * @param customModifierSettings - (Optional) If specified, can customize the item shop rewards further. + * - `guaranteedModifierTypeOptions?: ModifierTypeOption[]` - If specified, will override the first X items to be specific modifier options (these should be pre-genned). + * - `guaranteedModifierTypeFuncs?: ModifierTypeFunc[]` - If specified, will override the next X items to be auto-generated from specific modifier functions (these don't have to be pre-genned). + * - `guaranteedModifierTiers?: ModifierTier[]` - If specified, will override the next X items to be the specified tier. These can upgrade with luck. + * - `fillRemaining?: boolean` - Default 'false'. If set to true, will fill the remainder of shop items that were not overridden by the 3 options above, up to the 'count' param value. + * - Example: `count = 4`, `customModifierSettings = { guaranteedModifierTiers: [ModifierTier.GREAT], fillRemaining: true }`, + * - The first item in the shop will be `GREAT` tier, and the remaining 3 items will be generated normally. + * - If `fillRemaining = false` in the same scenario, only 1 `GREAT` tier item will appear in the shop (regardless of `count` value). + * - `rerollMultiplier?: number` - If specified, can adjust the amount of money required for a shop reroll. If set to 0, the shop will not allow rerolls at all. + */ export function getPlayerModifierTypeOptions(count: integer, party: PlayerPokemon[], modifierTiers?: ModifierTier[], customModifierSettings?: CustomModifierSettings): ModifierTypeOption[] { const options: ModifierTypeOption[] = []; const retryCount = Math.min(count * 5, 50); @@ -1849,32 +1888,21 @@ export function getPlayerModifierTypeOptions(count: integer, party: PlayerPokemo options.push(getModifierTypeOptionWithRetry(options, retryCount, party, modifierTiers?.length > i ? modifierTiers[i] : undefined)); }); } else { - // Guaranteed mods first - if (customModifierSettings?.guaranteedModifierTypeOptions?.length) { - customModifierSettings?.guaranteedModifierTypeOptions.forEach((option) => { - options.push(option); - }); + // Guaranteed mod options first + if (customModifierSettings?.guaranteedModifierTypeOptions?.length > 0) { + options.push(...customModifierSettings.guaranteedModifierTypeOptions); } - // Guaranteed mod funcs second - if (customModifierSettings?.guaranteedModifierTypeFuncs?.length) { + // Guaranteed mod functions second + if (customModifierSettings?.guaranteedModifierTypeFuncs?.length > 0) { customModifierSettings?.guaranteedModifierTypeFuncs.forEach((mod, i) => { const modifierId = Object.keys(modifierTypes).find(k => modifierTypes[k] === mod); let guaranteedMod: ModifierType = modifierTypes[modifierId]?.(); - // Gets tier of item by checking player item pool - Object.keys(modifierPool).every(modifierTier => { - const modType = modifierPool[modifierTier].find(m => { - if (m.modifierType.id === modifierId) { - return m; - } - }); - if (modType) { - guaranteedMod = modType.modifierType; - return false; - } - return true; - }); + // Populates item id and tier + guaranteedMod = guaranteedMod + .withIdFromFunc(modifierTypes[modifierId]) + .withTierFromPool(); const modType = guaranteedMod instanceof ModifierTypeGenerator ? guaranteedMod.generateType(party) : guaranteedMod; const option = new ModifierTypeOption(modType, 0); @@ -1883,7 +1911,7 @@ export function getPlayerModifierTypeOptions(count: integer, party: PlayerPokemo } // Guaranteed tiers third - if (customModifierSettings?.guaranteedModifierTiers?.length) { + if (customModifierSettings?.guaranteedModifierTiers?.length > 0) { customModifierSettings?.guaranteedModifierTiers.forEach((tier) => { options.push(getModifierTypeOptionWithRetry(options, retryCount, party, tier)); }); @@ -1900,8 +1928,12 @@ export function getPlayerModifierTypeOptions(count: integer, party: PlayerPokemo // OVERRIDE IF NECESSARY if (Overrides.ITEM_REWARD_OVERRIDE?.length) { options.forEach((mod, i) => { - // @ts-ignore: keeps throwing don't use string as index error in typedoc run - const override = modifierTypes[Overrides.ITEM_REWARD_OVERRIDE[i]]?.(); + let override = modifierTypes[Overrides.ITEM_REWARD_OVERRIDE[i]]?.(); + // Populates item id and tier + override = override + .withIdFromFunc(modifierTypes[Overrides.ITEM_REWARD_OVERRIDE[i]]) + .withTierFromPool(); + mod.type = (override instanceof ModifierTypeGenerator ? override.generateType(party) : override) || mod.type; }); } diff --git a/src/modifier/modifier.ts b/src/modifier/modifier.ts index 72aaf6cbb41..165a1227c4a 100644 --- a/src/modifier/modifier.ts +++ b/src/modifier/modifier.ts @@ -21,7 +21,7 @@ import { VoucherType } from "../system/voucher"; import { FormChangeItem, SpeciesFormChangeItemTrigger } from "../data/pokemon-forms"; import { Nature } from "#app/data/nature"; import * as Overrides from "../overrides"; -import { ModifierType, modifierTypes } from "./modifier-type"; +import { ModifierType, ModifierTypeGenerator, modifierTypes } from "./modifier-type"; import { Command } from "#app/ui/command-ui-handler.js"; import { Species } from "#enums/species"; import i18next from "i18next"; @@ -2683,8 +2683,12 @@ export function overrideModifiers(scene: BattleScene, player: boolean = true): v if (!modifierTypes.hasOwnProperty(modifierName)) { return; } // if the modifier does not exist, we skip it - const modifierType: ModifierType = modifierTypes[modifierName](); - const modifier: PersistentModifier = modifierType.withIdFromFunc(modifierTypes[modifierName]).newModifier() as PersistentModifier; + let modifierType: ModifierType = modifierTypes[modifierName](); + if (modifierType instanceof ModifierTypeGenerator) { + modifierType = (modifierType as ModifierTypeGenerator).generateType(scene.getParty(), [item.type]); + } + modifierType = modifierType.withIdFromFunc(modifierTypes[modifierName]); + const modifier: PersistentModifier = modifierType.newModifier(scene.getParty()[0]) as PersistentModifier; modifier.stackCount = qty; if (player) { scene.addModifier(modifier, true, false, false, true); diff --git a/src/overrides.ts b/src/overrides.ts index 1d006630983..d4e4a65134d 100644 --- a/src/overrides.ts +++ b/src/overrides.ts @@ -117,9 +117,9 @@ export const EGG_GACHA_PULL_COUNT_OVERRIDE: number = 0; */ // 1 to 256, set to null to ignore -export const MYSTERY_ENCOUNTER_RATE_OVERRIDE: number = 256; +export const MYSTERY_ENCOUNTER_RATE_OVERRIDE: number = null; export const MYSTERY_ENCOUNTER_TIER_OVERRIDE: MysteryEncounterTier = null; -export const MYSTERY_ENCOUNTER_OVERRIDE: MysteryEncounterType = MysteryEncounterType.ABSOLUTE_AVARICE; +export const MYSTERY_ENCOUNTER_OVERRIDE: MysteryEncounterType = null; /** * MODIFIER / ITEM OVERRIDES @@ -137,7 +137,7 @@ export const MYSTERY_ENCOUNTER_OVERRIDE: MysteryEncounterType = MysteryEncounter * - BerryType is for BERRY * - SpeciesStatBoosterItem is for SPECIES_STAT_BOOSTER */ -interface ModifierOverride { +export interface ModifierOverride { name: keyof typeof modifierTypes & string, count?: integer type?: TempBattleStat|Stat|Nature|Type|BerryType|SpeciesStatBoosterItem @@ -155,4 +155,4 @@ export const NEVER_CRIT_OVERRIDE: boolean = false; * If less items are listed than rolled, only some items will be replaced * If more items are listed than rolled, only the first X items will be shown, where X is the number of items rolled. */ -export const ITEM_REWARD_OVERRIDE: Array = []; +export const ITEM_REWARD_OVERRIDE: Array = []; diff --git a/src/test/mystery-encounter/encounterTestUtils.ts b/src/test/mystery-encounter/encounterTestUtils.ts index aa0551e78e2..a3eb505c090 100644 --- a/src/test/mystery-encounter/encounterTestUtils.ts +++ b/src/test/mystery-encounter/encounterTestUtils.ts @@ -1,6 +1,6 @@ import { Button } from "#app/enums/buttons"; import { CommandPhase, MessagePhase, VictoryPhase } from "#app/phases"; -import { MysteryEncounterPhase, MysteryEncounterRewardsPhase } from "#app/phases/mystery-encounter-phases"; +import { MysteryEncounterBattlePhase, MysteryEncounterOptionSelectedPhase, MysteryEncounterPhase, MysteryEncounterRewardsPhase } from "#app/phases/mystery-encounter-phases"; import MysteryEncounterUiHandler from "#app/ui/mystery-encounter-ui-handler"; import { Mode } from "#app/ui/ui"; import GameManager from "../utils/gameManager"; @@ -26,29 +26,39 @@ export async function runMysteryEncounterToEnd(game: GameManager, optionNo: numb game.onNextPrompt("MysteryEncounterOptionSelectedPhase", Mode.MESSAGE, () => { const uiHandler = game.scene.ui.getHandler(); uiHandler.processInput(Button.ACTION); - }); - - // If a battle is started, fast forward to end of the battle - game.onNextPrompt("CommandPhase", Mode.COMMAND, () => { - game.scene.clearPhaseQueue(); - game.scene.clearPhaseQueueSplice(); - game.scene.unshiftPhase(new VictoryPhase(game.scene, 0)); - game.endPhase(); - }); - - // Handle end of battle trainer messages - game.onNextPrompt("TrainerVictoryPhase", Mode.MESSAGE, () => { - const uiHandler = game.scene.ui.getHandler(); - uiHandler.processInput(Button.ACTION); - }); - - // Handle egg hatch dialogue - game.onNextPrompt("EggLapsePhase", Mode.MESSAGE, () => { - const uiHandler = game.scene.ui.getHandler(); - uiHandler.processInput(Button.ACTION); - }); + }, () => game.isCurrentPhase(MysteryEncounterBattlePhase) || game.isCurrentPhase(MysteryEncounterRewardsPhase)); if (isBattle) { + game.onNextPrompt("CheckSwitchPhase", Mode.CONFIRM, () => { + game.setMode(Mode.MESSAGE); + game.endPhase(); + }, () => game.isCurrentPhase(CommandPhase)); + + game.onNextPrompt("CheckSwitchPhase", Mode.MESSAGE, () => { + game.setMode(Mode.MESSAGE); + game.endPhase(); + }, () => game.isCurrentPhase(CommandPhase)); + + // If a battle is started, fast forward to end of the battle + game.onNextPrompt("CommandPhase", Mode.COMMAND, () => { + game.scene.clearPhaseQueue(); + game.scene.clearPhaseQueueSplice(); + game.scene.unshiftPhase(new VictoryPhase(game.scene, 0)); + game.endPhase(); + }); + + // Handle end of battle trainer messages + game.onNextPrompt("TrainerVictoryPhase", Mode.MESSAGE, () => { + const uiHandler = game.scene.ui.getHandler(); + uiHandler.processInput(Button.ACTION); + }); + + // Handle egg hatch dialogue + game.onNextPrompt("EggLapsePhase", Mode.MESSAGE, () => { + const uiHandler = game.scene.ui.getHandler(); + uiHandler.processInput(Button.ACTION); + }); + await game.phaseInterceptor.to(CommandPhase); } else { await game.phaseInterceptor.to(MysteryEncounterRewardsPhase); @@ -60,7 +70,7 @@ export async function runSelectMysteryEncounterOption(game: GameManager, optionN game.onNextPrompt("MessagePhase", Mode.MESSAGE, () => { const uiHandler = game.scene.ui.getHandler(); uiHandler.processInput(Button.ACTION); - }); + }, () => game.isCurrentPhase(MysteryEncounterOptionSelectedPhase)); if (game.isCurrentPhase(MessagePhase)) { await game.phaseInterceptor.run(MessagePhase); @@ -70,7 +80,7 @@ export async function runSelectMysteryEncounterOption(game: GameManager, optionN game.onNextPrompt("MysteryEncounterPhase", Mode.MESSAGE, () => { const uiHandler = game.scene.ui.getHandler(); uiHandler.processInput(Button.ACTION); - }); + }, () => game.isCurrentPhase(MysteryEncounterOptionSelectedPhase)); await game.phaseInterceptor.to(MysteryEncounterPhase, true); diff --git a/src/test/mystery-encounter/encounters/absolute-avarice-encounter.test.ts b/src/test/mystery-encounter/encounters/absolute-avarice-encounter.test.ts new file mode 100644 index 00000000000..0df5ec9403f --- /dev/null +++ b/src/test/mystery-encounter/encounters/absolute-avarice-encounter.test.ts @@ -0,0 +1,266 @@ +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 * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { runMysteryEncounterToEnd, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounterTestUtils"; +import BattleScene from "#app/battle-scene"; +import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; +import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; +import * as MysteryEncounters from "#app/data/mystery-encounters/mystery-encounters"; +import { BerryModifier, PokemonHeldItemModifier } from "#app/modifier/modifier"; +import { BerryType } from "#enums/berry-type"; +import { AbsoluteAvariceEncounter } from "#app/data/mystery-encounters/encounters/absolute-avarice-encounter"; +import { CommandPhase, MovePhase, SelectModifierPhase } from "#app/phases"; +import { Moves } from "#enums/moves"; + +const namespace = "mysteryEncounter:absoluteAvarice"; +const defaultParty = [Species.LAPRAS, Species.GENGAR, Species.ABRA]; +const defaultBiome = Biome.PLAINS; +const defaultWave = 45; + +describe("Absolute Avarice - 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.mysteryEncounterTier(MysteryEncounterTier.COMMON); + game.override.startingWave(defaultWave); + game.override.startingBiome(defaultBiome); + + vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue( + new Map([ + [Biome.PLAINS, [MysteryEncounterType.ABSOLUTE_AVARICE]], + [Biome.VOLCANO, [MysteryEncounterType.MYSTERIOUS_CHALLENGERS]], + ]) + ); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + vi.clearAllMocks(); + vi.resetAllMocks(); + }); + + it("should have the correct properties", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.ABSOLUTE_AVARICE, defaultParty); + + expect(AbsoluteAvariceEncounter.encounterType).toBe(MysteryEncounterType.ABSOLUTE_AVARICE); + expect(AbsoluteAvariceEncounter.encounterTier).toBe(MysteryEncounterTier.GREAT); + expect(AbsoluteAvariceEncounter.dialogue).toBeDefined(); + expect(AbsoluteAvariceEncounter.dialogue.intro).toStrictEqual([{ text: `${namespace}:intro` }]); + expect(AbsoluteAvariceEncounter.dialogue.encounterOptionsDialogue.title).toBe(`${namespace}:title`); + expect(AbsoluteAvariceEncounter.dialogue.encounterOptionsDialogue.description).toBe(`${namespace}:description`); + expect(AbsoluteAvariceEncounter.dialogue.encounterOptionsDialogue.query).toBe(`${namespace}:query`); + expect(AbsoluteAvariceEncounter.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.ABSOLUTE_AVARICE); + }); + + it("should not run above wave 179", async () => { + game.override.startingWave(181); + + await game.runToMysteryEncounter(); + + expect(scene.currentBattle.mysteryEncounter).toBeUndefined(); + }); + + it("should not spawn outside of proper biomes", async () => { + game.override.startingBiome(Biome.VOLCANO); + await game.runToMysteryEncounter(); + + expect(game.scene.currentBattle.mysteryEncounter.encounterType).not.toBe(MysteryEncounterType.ABSOLUTE_AVARICE); + }); + + it("should not spawn if player does not have enough berries", async () => { + scene.modifiers = []; + + await game.runToMysteryEncounter(); + + expect(scene.currentBattle?.mysteryEncounter?.encounterType).not.toBe(MysteryEncounterType.ABSOLUTE_AVARICE); + }); + + it("should spawn if player has enough berries", async () => { + game.override.starterHeldItems([{name: "BERRY", count: 2, type: BerryType.SITRUS}, {name: "BERRY", count: 3, type: BerryType.GANLON}]); + + await game.runToMysteryEncounter(); + + expect(scene.currentBattle?.mysteryEncounter?.encounterType).toBe(MysteryEncounterType.ABSOLUTE_AVARICE); + }); + + it("should remove all player's berries at the start of the encounter", async () => { + game.override.starterHeldItems([{name: "BERRY", count: 2, type: BerryType.SITRUS}, {name: "BERRY", count: 3, type: BerryType.GANLON}]); + + await game.runToMysteryEncounter(); + + expect(scene.currentBattle?.mysteryEncounter?.encounterType).toBe(MysteryEncounterType.ABSOLUTE_AVARICE); + expect(scene.modifiers?.length).toBe(0); + }); + + describe("Option 1 - Fight the Greedent", () => { + it("should have the correct properties", () => { + const option1 = AbsoluteAvariceEncounter.options[0]; + expect(option1.optionMode).toBe(MysteryEncounterOptionMode.DEFAULT); + expect(option1.dialogue).toBeDefined(); + expect(option1.dialogue).toStrictEqual({ + buttonLabel: `${namespace}:option:1:label`, + buttonTooltip: `${namespace}:option:1:tooltip`, + selected: [ + { + text: `${namespace}:option:1:selected`, + }, + ], + }); + }); + + it("should start battle against Greedent", async () => { + const phaseSpy = vi.spyOn(scene, "pushPhase"); + + await game.runToMysteryEncounter(MysteryEncounterType.ABSOLUTE_AVARICE, defaultParty); + await runMysteryEncounterToEnd(game, 1, null, true); + + const enemyField = scene.getEnemyField(); + expect(scene.getCurrentPhase().constructor.name).toBe(CommandPhase.name); + expect(enemyField.length).toBe(1); + expect(enemyField[0].species.speciesId).toBe(Species.GREEDENT); + const moveset = enemyField[0].moveset.map(m => m.moveId); + expect(moveset?.length).toBe(4); + expect(moveset).toEqual([Moves.THRASH, Moves.BODY_PRESS, Moves.STUFF_CHEEKS, Moves.SLACK_OFF]); + + const movePhases = phaseSpy.mock.calls.filter(p => p[0] instanceof MovePhase).map(p => p[0]); + expect(movePhases.length).toBe(1); + expect(movePhases.filter(p => (p as MovePhase).move.moveId === Moves.STUFF_CHEEKS).length).toBe(1); // Stuff Cheeks used before battle + }); + + it("should give reviver seed to each pokemon after battle", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.ABSOLUTE_AVARICE, defaultParty); + await runMysteryEncounterToEnd(game, 1, null, true); + await skipBattleRunMysteryEncounterRewardsPhase(game); + await game.phaseInterceptor.to(SelectModifierPhase, false); + expect(scene.getCurrentPhase().constructor.name).toBe(SelectModifierPhase.name); + + for (const partyPokemon of scene.getParty()) { + const pokemonId = partyPokemon.id; + const pokemonItems = scene.findModifiers(m => m instanceof PokemonHeldItemModifier + && (m as PokemonHeldItemModifier).pokemonId === pokemonId, true) as PokemonHeldItemModifier[]; + const revSeed = pokemonItems.find(i => i.type.name === "Reviver Seed"); + expect(revSeed).toBeDefined; + expect(revSeed.stackCount).toBe(1); + } + }); + }); + + describe("Option 2 - Reason with It", () => { + it("should have the correct properties", () => { + const option = AbsoluteAvariceEncounter.options[1]; + expect(option.optionMode).toBe(MysteryEncounterOptionMode.DEFAULT); + expect(option.dialogue).toBeDefined(); + expect(option.dialogue).toStrictEqual({ + buttonLabel: `${namespace}:option:2:label`, + buttonTooltip: `${namespace}:option:2:tooltip`, + selected: [ + { + text: `${namespace}:option:2:selected`, + }, + ], + }); + }); + + it("Should return 3 (2/5ths floored) berries if 8 were stolen", async () => { + game.override.starterHeldItems([{name: "BERRY", count: 2, type: BerryType.SITRUS}, {name: "BERRY", count: 3, type: BerryType.GANLON}, {name: "BERRY", count: 3, type: BerryType.APICOT}]); + + await game.runToMysteryEncounter(MysteryEncounterType.ABSOLUTE_AVARICE, defaultParty); + + expect(scene.currentBattle?.mysteryEncounter?.encounterType).toBe(MysteryEncounterType.ABSOLUTE_AVARICE); + expect(scene.modifiers?.length).toBe(0); + + await runMysteryEncounterToEnd(game, 2); + + const berriesAfter = scene.findModifiers(m => m instanceof BerryModifier); + const berryCountAfter = berriesAfter.reduce((a, b) => a + b.stackCount, 0); + expect(berriesAfter).toBeDefined(); + expect(berryCountAfter).toBe(3); + }); + + it("Should return 2 (2/5ths floored) berries if 7 were stolen", async () => { + game.override.starterHeldItems([{name: "BERRY", count: 2, type: BerryType.SITRUS}, {name: "BERRY", count: 3, type: BerryType.GANLON}, {name: "BERRY", count: 2, type: BerryType.APICOT}]); + + await game.runToMysteryEncounter(MysteryEncounterType.ABSOLUTE_AVARICE, defaultParty); + + expect(scene.currentBattle?.mysteryEncounter?.encounterType).toBe(MysteryEncounterType.ABSOLUTE_AVARICE); + expect(scene.modifiers?.length).toBe(0); + + await runMysteryEncounterToEnd(game, 2); + + const berriesAfter = scene.findModifiers(m => m instanceof BerryModifier); + const berryCountAfter = berriesAfter.reduce((a, b) => a + b.stackCount, 0); + expect(berriesAfter).toBeDefined(); + expect(berryCountAfter).toBe(2); + }); + + it("should leave encounter without battle", async () => { + const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); + + await game.runToMysteryEncounter(MysteryEncounterType.ABSOLUTE_AVARICE, defaultParty); + await runMysteryEncounterToEnd(game, 2); + + expect(leaveEncounterWithoutBattleSpy).toBeCalled(); + }); + }); + + describe("Option 3 - Let it have the food", () => { + it("should have the correct properties", () => { + const option = AbsoluteAvariceEncounter.options[2]; + expect(option.optionMode).toBe(MysteryEncounterOptionMode.DEFAULT); + expect(option.dialogue).toBeDefined(); + expect(option.dialogue).toStrictEqual({ + buttonLabel: `${namespace}:option:3:label`, + buttonTooltip: `${namespace}:option:3:tooltip`, + selected: [ + { + text: `${namespace}:option:3:selected`, + }, + ], + }); + }); + + it("should add Greedent to the party", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.ABSOLUTE_AVARICE, defaultParty); + const partyCountBefore = scene.getParty().length; + + await runMysteryEncounterToEnd(game, 3); + const partyCountAfter = scene.getParty().length; + + expect(partyCountBefore + 1).toBe(partyCountAfter); + const greedent = scene.getParty()[scene.getParty().length - 1]; + expect(greedent.species.speciesId).toBe(Species.GREEDENT); + const moveset = greedent.moveset.map(m => m.moveId); + expect(moveset?.length).toBe(4); + expect(moveset).toEqual([Moves.THRASH, Moves.BODY_PRESS, Moves.STUFF_CHEEKS, Moves.SLACK_OFF]); + }); + + it("should leave encounter without battle", async () => { + const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); + + await game.runToMysteryEncounter(MysteryEncounterType.ABSOLUTE_AVARICE, defaultParty); + await runMysteryEncounterToEnd(game, 3); + + expect(leaveEncounterWithoutBattleSpy).toBeCalled(); + }); + }); +}); diff --git a/src/test/mystery-encounter/encounters/delibirdy-encounter.test.ts b/src/test/mystery-encounter/encounters/delibirdy-encounter.test.ts index ee6ce0f6705..9cee29b130d 100644 --- a/src/test/mystery-encounter/encounters/delibirdy-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/delibirdy-encounter.test.ts @@ -11,7 +11,7 @@ import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; import { DelibirdyEncounter } from "#app/data/mystery-encounters/encounters/delibirdy-encounter"; import * as MysteryEncounters from "#app/data/mystery-encounters/mystery-encounters"; import { MoneyRequirement } from "#app/data/mystery-encounters/mystery-encounter-requirements"; -import { BerryModifier, HealingBoosterModifier, HiddenAbilityRateBoosterModifier, LevelIncrementBoosterModifier, PokemonInstantReviveModifier, PokemonNatureWeightModifier, PreserveBerryModifier } from "#app/modifier/modifier"; +import { BerryModifier, HealingBoosterModifier, HiddenAbilityRateBoosterModifier, HitHealModifier, LevelIncrementBoosterModifier, PokemonInstantReviveModifier, PokemonNatureWeightModifier, PreserveBerryModifier } from "#app/modifier/modifier"; import { MysteryEncounterPhase } from "#app/phases/mystery-encounter-phases"; import { generateModifierTypeOption } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { modifierTypes } from "#app/modifier/modifier-type"; @@ -131,6 +131,28 @@ describe("Delibird-y - Mystery Encounter", () => { expect(itemModifier.stackCount).toBe(1); }); + it("Should give the player a Shell Bell if they have max stacks of Berry Pouches", async () => { + scene.money = 200000; + await game.runToMysteryEncounter(MysteryEncounterType.DELIBIRDY, defaultParty); + + // 5 Healing Charms + scene.modifiers = []; + const abilityCharm = generateModifierTypeOption(scene, modifierTypes.ABILITY_CHARM).type.newModifier() as HiddenAbilityRateBoosterModifier; + abilityCharm.stackCount = 4; + await scene.addModifier(abilityCharm, true, false, false, true); + await scene.updateModifiers(true); + + await runMysteryEncounterToEnd(game, 1); + + const abilityCharmAfter = scene.findModifier(m => m instanceof HiddenAbilityRateBoosterModifier); + const shellBellAfter = scene.findModifier(m => m instanceof HitHealModifier); + + expect(abilityCharmAfter).toBeDefined(); + expect(abilityCharmAfter.stackCount).toBe(4); + expect(shellBellAfter).toBeDefined(); + expect(shellBellAfter.stackCount).toBe(1); + }); + it("should be disabled if player does not have enough money", async () => { scene.money = 0; await game.runToMysteryEncounter(MysteryEncounterType.DELIBIRDY, defaultParty); @@ -221,6 +243,64 @@ describe("Delibird-y - Mystery Encounter", () => { expect(healingCharmAfter.stackCount).toBe(1); }); + it("Should give the player a Shell Bell if they have max stacks of Candy Jars", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.DELIBIRDY, defaultParty); + + // 99 Candy Jars + scene.modifiers = []; + const candyJar = generateModifierTypeOption(scene, modifierTypes.CANDY_JAR).type.newModifier() as LevelIncrementBoosterModifier; + candyJar.stackCount = 99; + await scene.addModifier(candyJar, true, false, false, true); + const sitrus = generateModifierTypeOption(scene, modifierTypes.BERRY, [BerryType.SITRUS]).type; + + // Sitrus berries on party + const sitrusMod = sitrus.newModifier(scene.getParty()[0]) as BerryModifier; + sitrusMod.stackCount = 2; + await scene.addModifier(sitrusMod, true, false, false, true); + await scene.updateModifiers(true); + + await runMysteryEncounterToEnd(game, 2, { pokemonNo: 1, optionNo: 1}); + + const sitrusAfter = scene.findModifier(m => m instanceof BerryModifier); + const candyJarAfter = scene.findModifier(m => m instanceof LevelIncrementBoosterModifier); + const shellBellAfter = scene.findModifier(m => m instanceof HitHealModifier); + + expect(sitrusAfter.stackCount).toBe(1); + expect(candyJarAfter).toBeDefined(); + expect(candyJarAfter.stackCount).toBe(99); + expect(shellBellAfter).toBeDefined(); + expect(shellBellAfter.stackCount).toBe(1); + }); + + it("Should give the player a Shell Bell if they have max stacks of Healing Charms", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.DELIBIRDY, defaultParty); + + // 5 Healing Charms + scene.modifiers = []; + const healingCharm = generateModifierTypeOption(scene, modifierTypes.HEALING_CHARM).type.newModifier() as HealingBoosterModifier; + healingCharm.stackCount = 5; + await scene.addModifier(healingCharm, true, false, false, true); + + // Set 1 Reviver Seed on party lead + const revSeed = generateModifierTypeOption(scene, modifierTypes.REVIVER_SEED).type; + const modifier = revSeed.newModifier(scene.getParty()[0]) as PokemonInstantReviveModifier; + modifier.stackCount = 1; + await scene.addModifier(modifier, true, false, false, true); + await scene.updateModifiers(true); + + await runMysteryEncounterToEnd(game, 2, { pokemonNo: 1, optionNo: 1}); + + const reviverSeedAfter = scene.findModifier(m => m instanceof PokemonInstantReviveModifier); + const healingCharmAfter = scene.findModifier(m => m instanceof HealingBoosterModifier); + const shellBellAfter = scene.findModifier(m => m instanceof HitHealModifier); + + expect(reviverSeedAfter).toBeUndefined(); + expect(healingCharmAfter).toBeDefined(); + expect(healingCharmAfter.stackCount).toBe(5); + expect(shellBellAfter).toBeDefined(); + expect(shellBellAfter.stackCount).toBe(1); + }); + it("should be disabled if player does not have any proper items", async () => { await game.runToMysteryEncounter(MysteryEncounterType.DELIBIRDY, defaultParty); @@ -325,6 +405,35 @@ describe("Delibird-y - Mystery Encounter", () => { expect(berryPouchAfter.stackCount).toBe(1); }); + it("Should give the player a Shell Bell if they have max stacks of Berry Pouches", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.DELIBIRDY, defaultParty); + + // 5 Healing Charms + scene.modifiers = []; + const healingCharm = generateModifierTypeOption(scene, modifierTypes.BERRY_POUCH).type.newModifier() as PreserveBerryModifier; + healingCharm.stackCount = 3; + await scene.addModifier(healingCharm, true, false, false, true); + + // Set 1 Soul Dew on party lead + const soulDew = generateModifierTypeOption(scene, modifierTypes.SOUL_DEW).type; + const modifier = soulDew.newModifier(scene.getParty()[0]) as PokemonNatureWeightModifier; + modifier.stackCount = 1; + await scene.addModifier(modifier, true, false, false, true); + await scene.updateModifiers(true); + + await runMysteryEncounterToEnd(game, 3, { pokemonNo: 1, optionNo: 1}); + + const soulDewAfter = scene.findModifier(m => m instanceof PokemonNatureWeightModifier); + const berryPouchAfter = scene.findModifier(m => m instanceof PreserveBerryModifier); + const shellBellAfter = scene.findModifier(m => m instanceof HitHealModifier); + + expect(soulDewAfter).toBeUndefined(); + expect(berryPouchAfter).toBeDefined(); + expect(berryPouchAfter.stackCount).toBe(3); + expect(shellBellAfter).toBeDefined(); + expect(shellBellAfter.stackCount).toBe(1); + }); + it("should be disabled if player does not have any proper items", async () => { await game.runToMysteryEncounter(MysteryEncounterType.DELIBIRDY, defaultParty); diff --git a/src/test/utils/overridesHelper.ts b/src/test/utils/overridesHelper.ts index 400bad716a7..bd4744503e0 100644 --- a/src/test/utils/overridesHelper.ts +++ b/src/test/utils/overridesHelper.ts @@ -8,6 +8,7 @@ import * as overrides from "#app/overrides"; import * as GameMode from "#app/game-mode"; import { GameModes, getGameMode } from "#app/game-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; +import { ModifierOverride } from "#app/overrides"; /** * Helper to handle overrides in tests @@ -117,6 +118,12 @@ export class OverridesHelper { return spy; } + starterHeldItems(modifiers: ModifierOverride[]) { + const spy = vi.spyOn(Overrides, "STARTING_MODIFIER_OVERRIDE", "get").mockReturnValue(modifiers); + this.log(`Starting modifiers set to ${modifiers.map(m => JSON.stringify(m)).join(", ")}!`); + return spy; + } + private log(...params: any[]) { console.log("Overrides:", ...params); } diff --git a/src/test/utils/phaseInterceptor.ts b/src/test/utils/phaseInterceptor.ts index 4e1f2acf586..a98b462006a 100644 --- a/src/test/utils/phaseInterceptor.ts +++ b/src/test/utils/phaseInterceptor.ts @@ -48,6 +48,14 @@ import { PostMysteryEncounterPhase } from "#app/phases/mystery-encounter-phases"; +export interface PromptHandler { + phaseTarget?; + mode?; + callback?; + expireFn?; + awaitingActionInput?; +} + export default class PhaseInterceptor { public scene; public phases = {}; @@ -56,7 +64,7 @@ export default class PhaseInterceptor { private interval; private promptInterval; private intervalRun; - private prompts; + private prompts: PromptHandler[]; private phaseFrom; private inProgress; private originalSetMode; @@ -337,6 +345,7 @@ export default class PhaseInterceptor { * @param mode - The mode of the UI. * @param callback - The callback function to execute. * @param expireFn - The function to determine if the prompt has expired. + * @param awaitingActionInput */ addToNextPrompt(phaseTarget: string, mode: Mode, callback: () => void, expireFn: () => void, awaitingActionInput: boolean = false) { this.prompts.push({ From 3b36836608a691504f3c864ac4c6b20845e1fcc7 Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Sun, 28 Jul 2024 12:12:11 -0400 Subject: [PATCH 222/270] fix unit test --- .../encounters/absolute-avarice-encounter.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 0df5ec9403f..4aaf5f3d518 100644 --- a/src/test/mystery-encounter/encounters/absolute-avarice-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/absolute-avarice-encounter.test.ts @@ -84,7 +84,7 @@ describe("Absolute Avarice - Mystery Encounter", () => { game.override.startingBiome(Biome.VOLCANO); await game.runToMysteryEncounter(); - expect(game.scene.currentBattle.mysteryEncounter.encounterType).not.toBe(MysteryEncounterType.ABSOLUTE_AVARICE); + expect(game.scene.currentBattle.mysteryEncounter?.encounterType).not.toBe(MysteryEncounterType.ABSOLUTE_AVARICE); }); it("should not spawn if player does not have enough berries", async () => { From 6115fc9b840cf58ece3cef2397ff52d8fcd026eb Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Sun, 28 Jul 2024 15:20:58 -0400 Subject: [PATCH 223/270] cleanup absolute avarice PR --- .../encounters/absolute-avarice-encounter.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/data/mystery-encounters/encounters/absolute-avarice-encounter.ts b/src/data/mystery-encounters/encounters/absolute-avarice-encounter.ts index 9077f0f1ab8..c764589ac42 100644 --- a/src/data/mystery-encounters/encounters/absolute-avarice-encounter.ts +++ b/src/data/mystery-encounters/encounters/absolute-avarice-encounter.ts @@ -26,7 +26,7 @@ import { PokeballType } from "#app/data/pokeball"; const namespace = "mysteryEncounter:absoluteAvarice"; /** - * Delibird-y encounter. + * Absolute Avarice encounter. * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/58 | GitHub Issue #58} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ @@ -209,7 +209,6 @@ export const AbsoluteAvariceEncounter: IMysteryEncounter = species: getPokemonSpecies(Species.GREEDENT), isBoss: true, bossSegments: 3, - // nature: Nature.BOLD, moveSet: [Moves.THRASH, Moves.BODY_PRESS, Moves.STUFF_CHEEKS, Moves.SLACK_OFF], modifierTypes: bossModifierTypes, tags: [BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON], @@ -327,7 +326,7 @@ export const AbsoluteAvariceEncounter: IMysteryEncounter = .withOptionPhase(async (scene: BattleScene) => { // Let it have the food // Greedent joins the team, level equal to 2 below highest party member - const level = getHighestLevelPlayerPokemon(scene).level; + const level = getHighestLevelPlayerPokemon(scene).level - 2; const greedent = scene.addEnemyPokemon(getPokemonSpecies(Species.GREEDENT), level, TrainerSlot.NONE, false); greedent.moveset = [new PokemonMove(Moves.THRASH), new PokemonMove(Moves.BODY_PRESS), new PokemonMove(Moves.STUFF_CHEEKS), new PokemonMove(Moves.SLACK_OFF)]; greedent.passive = true; From aa763998946ba7703361100fc7892de8396e9c02 Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Sun, 28 Jul 2024 18:33:56 -0400 Subject: [PATCH 224/270] small bug fixes with latest sync from main --- public/images/items.json | 7819 +++++++++-------- public/images/items.png | Bin 57723 -> 55976 bytes .../encounters/absolute-avarice-encounter.ts | 2 + .../encounters/safari-zone-encounter.ts | 3 +- .../utils/encounter-phase-utils.ts | 10 +- .../utils/encounter-pokemon-utils.ts | 11 +- src/overrides.ts | 1 - src/phases.ts | 15 +- 8 files changed, 3951 insertions(+), 3910 deletions(-) diff --git a/public/images/items.json b/public/images/items.json index 86792e23cc0..821e44d87d7 100644 --- a/public/images/items.json +++ b/public/images/items.json @@ -4,8 +4,8 @@ "image": "items.png", "format": "RGBA8888", "size": { - "w": 423, - "h": 423 + "w": 426, + "h": 426 }, "scale": 1, "frames": [ @@ -555,6 +555,27 @@ "h": 28 } }, + { + "filename": "ability_capsule", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 9, + "w": 24, + "h": 14 + }, + "frame": { + "x": 0, + "y": 412, + "w": 24, + "h": 14 + } + }, { "filename": "ability_charm", "rotated": false, @@ -787,7 +808,7 @@ } }, { - "filename": "calcium", + "filename": "lock_capsule", "rotated": false, "trimmed": true, "sourceSize": { @@ -795,37 +816,16 @@ "h": 32 }, "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 + "x": 7, + "y": 5, + "w": 19, + "h": 22 }, "frame": { "x": 407, "y": 0, - "w": 16, - "h": 24 - } - }, - { - "filename": "relic_gold", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 9, - "y": 11, - "w": 15, - "h": 11 - }, - "frame": { - "x": 0, - "y": 412, - "w": 15, - "h": 11 + "w": 19, + "h": 22 } }, { @@ -1102,7 +1102,7 @@ } }, { - "filename": "black_glasses", + "filename": "icy_reins_of_unity", "rotated": false, "trimmed": true, "sourceSize": { @@ -1111,57 +1111,15 @@ }, "spriteSourceSize": { "x": 4, - "y": 8, - "w": 23, - "h": 17 - }, - "frame": { - "x": 22, - "y": 406, - "w": 23, - "h": 17 - } - }, - { - "filename": "burn_drive", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 23, - "h": 17 - }, - "frame": { - "x": 45, - "y": 406, - "w": 23, - "h": 17 - } - }, - { - "filename": "ability_capsule", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 9, + "y": 7, "w": 24, - "h": 14 + "h": 20 }, "frame": { - "x": 135, - "y": 22, + "x": 24, + "y": 406, "w": 24, - "h": 14 + "h": 20 } }, { @@ -1178,11 +1136,53 @@ "w": 24, "h": 18 }, + "frame": { + "x": 135, + "y": 22, + "w": 24, + "h": 18 + } + }, + { + "filename": "clefairy_doll", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 24, + "h": 23 + }, "frame": { "x": 29, "y": 55, "w": 24, - "h": 18 + "h": 23 + } + }, + { + "filename": "calcium", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 39, + "y": 78, + "w": 16, + "h": 24 } }, { @@ -1200,12 +1200,33 @@ "h": 24 }, "frame": { - "x": 59, - "y": 27, + "x": 39, + "y": 102, "w": 16, "h": 24 } }, + { + "filename": "catching_charm", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 21, + "h": 24 + }, + "frame": { + "x": 39, + "y": 126, + "w": 21, + "h": 24 + } + }, { "filename": "fist_plate", "rotated": false, @@ -1221,8 +1242,8 @@ "h": 24 }, "frame": { - "x": 75, - "y": 26, + "x": 39, + "y": 150, "w": 24, "h": 24 } @@ -1242,75 +1263,12 @@ "h": 24 }, "frame": { - "x": 99, - "y": 26, + "x": 39, + "y": 174, "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": "clefairy_doll", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 24, - "h": 23 - }, - "frame": { - "x": 135, - "y": 36, - "w": 24, - "h": 23 - } - }, - { - "filename": "catching_charm", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 21, - "h": 24 - }, - "frame": { - "x": 159, - "y": 22, - "w": 21, - "h": 24 - } - }, { "filename": "focus_band", "rotated": false, @@ -1326,8 +1284,8 @@ "h": 24 }, "frame": { - "x": 180, - "y": 21, + "x": 44, + "y": 198, "w": 24, "h": 24 } @@ -1347,12 +1305,33 @@ "h": 24 }, "frame": { - "x": 204, - "y": 21, + "x": 44, + "y": 222, "w": 24, "h": 24 } }, + { + "filename": "silver_powder", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 11, + "w": 24, + "h": 15 + }, + "frame": { + "x": 44, + "y": 246, + "w": 24, + "h": 15 + } + }, { "filename": "gracidea", "rotated": false, @@ -1368,8 +1347,8 @@ "h": 24 }, "frame": { - "x": 228, - "y": 21, + "x": 45, + "y": 261, "w": 24, "h": 24 } @@ -1389,8 +1368,8 @@ "h": 24 }, "frame": { - "x": 252, - "y": 21, + "x": 46, + "y": 285, "w": 24, "h": 24 } @@ -1410,8 +1389,8 @@ "h": 24 }, "frame": { - "x": 276, - "y": 21, + "x": 46, + "y": 309, "w": 24, "h": 24 } @@ -1431,96 +1410,12 @@ "h": 24 }, "frame": { - "x": 300, - "y": 21, + "x": 46, + "y": 333, "w": 24, "h": 24 } }, - { - "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": 46, - "w": 23, - "h": 21 - } - }, - { - "filename": "coin_case", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 24, - "h": 23 - }, - "frame": { - "x": 182, - "y": 45, - "w": 24, - "h": 23 - } - }, - { - "filename": "expert_belt", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 23 - }, - "frame": { - "x": 206, - "y": 45, - "w": 24, - "h": 23 - } - }, - { - "filename": "hearthflame_mask", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 23 - }, - "frame": { - "x": 230, - "y": 45, - "w": 24, - "h": 23 - } - }, { "filename": "iron_plate", "rotated": false, @@ -1536,8 +1431,8 @@ "h": 24 }, "frame": { - "x": 254, - "y": 45, + "x": 46, + "y": 357, "w": 24, "h": 24 } @@ -1557,12 +1452,54 @@ "h": 24 }, "frame": { - "x": 278, - "y": 45, + "x": 46, + "y": 381, "w": 24, "h": 24 } }, + { + "filename": "adamant_crystal", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 23, + "h": 21 + }, + "frame": { + "x": 48, + "y": 405, + "w": 23, + "h": 21 + } + }, + { + "filename": "berry_pouch", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 23, + "h": 23 + }, + "frame": { + "x": 53, + "y": 55, + "w": 23, + "h": 23 + } + }, { "filename": "kings_rock", "rotated": false, @@ -1578,33 +1515,12 @@ "h": 24 }, "frame": { - "x": 302, - "y": 45, + "x": 55, + "y": 78, "w": 23, "h": 24 } }, - { - "filename": "elixir", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 18, - "h": 24 - }, - "frame": { - "x": 324, - "y": 21, - "w": 18, - "h": 24 - } - }, { "filename": "lucky_punch_great", "rotated": false, @@ -1620,8 +1536,8 @@ "h": 24 }, "frame": { - "x": 342, - "y": 20, + "x": 55, + "y": 102, "w": 24, "h": 24 } @@ -1641,75 +1557,12 @@ "h": 24 }, "frame": { - "x": 366, - "y": 20, + "x": 60, + "y": 126, "w": 24, "h": 24 } }, - { - "filename": "lure", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 17, - "h": 24 - }, - "frame": { - "x": 390, - "y": 20, - "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": 407, - "y": 24, - "w": 16, - "h": 24 - } - }, - { - "filename": "ether", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 18, - "h": 24 - }, - "frame": { - "x": 325, - "y": 45, - "w": 18, - "h": 24 - } - }, { "filename": "lucky_punch_ultra", "rotated": false, @@ -1725,8 +1578,8 @@ "h": 24 }, "frame": { - "x": 343, - "y": 44, + "x": 63, + "y": 150, "w": 24, "h": 24 } @@ -1746,98 +1599,14 @@ "h": 24 }, "frame": { - "x": 367, - "y": 44, + "x": 63, + "y": 174, "w": 24, "h": 24 } }, { - "filename": "iron", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 391, - "y": 44, - "w": 16, - "h": 24 - } - }, - { - "filename": "max_repel", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 407, - "y": 48, - "w": 16, - "h": 24 - } - }, - { - "filename": "dragon_scale", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 24, - "h": 18 - }, - "frame": { - "x": 75, - "y": 50, - "w": 24, - "h": 18 - } - }, - { - "filename": "exp_balance", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 24, - "h": 22 - }, - "frame": { - "x": 99, - "y": 50, - "w": 24, - "h": 22 - } - }, - { - "filename": "black_belt", + "filename": "max_revive", "rotated": false, "trimmed": true, "sourceSize": { @@ -1848,55 +1617,13 @@ "x": 5, "y": 4, "w": 22, - "h": 23 + "h": 24 }, "frame": { - "x": 53, - "y": 55, + "x": 68, + "y": 198, "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": 75, - "y": 68, - "w": 24, - "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": 99, - "y": 72, - "w": 24, - "h": 20 + "h": 24 } }, { @@ -1914,14 +1641,14 @@ "h": 24 }, "frame": { - "x": 123, - "y": 59, + "x": 68, + "y": 222, "w": 24, "h": 24 } }, { - "filename": "leppa_berry", + "filename": "candy_overlay", "rotated": false, "trimmed": true, "sourceSize": { @@ -1929,16 +1656,184 @@ "h": 32 }, "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 24, - "h": 23 + "x": 8, + "y": 12, + "w": 16, + "h": 15 }, "frame": { - "x": 123, - "y": 83, - "w": 24, - "h": 23 + "x": 68, + "y": 246, + "w": 16, + "h": 15 + } + }, + { + "filename": "elixir", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 18, + "h": 24 + }, + "frame": { + "x": 69, + "y": 261, + "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": 70, + "y": 285, + "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": 70, + "y": 309, + "w": 18, + "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": 70, + "y": 333, + "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": 70, + "y": 357, + "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": 70, + "y": 381, + "w": 18, + "h": 24 + } + }, + { + "filename": "amulet_coin", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 5, + "w": 23, + "h": 21 + }, + "frame": { + "x": 71, + "y": 405, + "w": 23, + "h": 21 + } + }, + { + "filename": "eviolite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 15, + "h": 15 + }, + "frame": { + "x": 59, + "y": 40, + "w": 15, + "h": 15 } }, { @@ -1956,33 +1851,12 @@ "h": 24 }, "frame": { - "x": 147, - "y": 67, + "x": 74, + "y": 26, "w": 24, "h": 24 } }, - { - "filename": "metal_powder", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 6, - "w": 24, - "h": 20 - }, - "frame": { - "x": 147, - "y": 91, - "w": 24, - "h": 20 - } - }, { "filename": "muscle_band", "rotated": false, @@ -1998,8 +1872,8 @@ "h": 24 }, "frame": { - "x": 171, - "y": 68, + "x": 98, + "y": 26, "w": 24, "h": 24 } @@ -2019,12 +1893,33 @@ "h": 24 }, "frame": { - "x": 195, - "y": 68, + "x": 76, + "y": 50, "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": 100, + "y": 50, + "w": 23, + "h": 24 + } + }, { "filename": "salac_berry", "rotated": false, @@ -2040,14 +1935,14 @@ "h": 24 }, "frame": { - "x": 219, - "y": 68, + "x": 78, + "y": 74, "w": 24, "h": 24 } }, { - "filename": "peat_block", + "filename": "oval_charm", "rotated": false, "trimmed": true, "sourceSize": { @@ -2055,16 +1950,16 @@ "h": 32 }, "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 24, - "h": 22 + "x": 6, + "y": 4, + "w": 21, + "h": 24 }, "frame": { - "x": 171, - "y": 92, - "w": 24, - "h": 22 + "x": 102, + "y": 74, + "w": 21, + "h": 24 } }, { @@ -2082,12 +1977,33 @@ "h": 24 }, "frame": { - "x": 195, - "y": 92, + "x": 79, + "y": 98, "w": 24, "h": 24 } }, + { + "filename": "red_orb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 20, + "h": 24 + }, + "frame": { + "x": 103, + "y": 98, + "w": 20, + "h": 24 + } + }, { "filename": "silk_scarf", "rotated": false, @@ -2103,12 +2019,33 @@ "h": 24 }, "frame": { - "x": 219, - "y": 92, + "x": 84, + "y": 122, "w": 24, "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": 87, + "y": 146, + "w": 21, + "h": 24 + } + }, { "filename": "sky_plate", "rotated": false, @@ -2124,8 +2061,8 @@ "h": 24 }, "frame": { - "x": 243, - "y": 69, + "x": 87, + "y": 170, "w": 24, "h": 24 } @@ -2145,8 +2082,8 @@ "h": 24 }, "frame": { - "x": 267, - "y": 69, + "x": 90, + "y": 194, "w": 24, "h": 24 } @@ -2166,12 +2103,180 @@ "h": 24 }, "frame": { - "x": 291, - "y": 69, + "x": 92, + "y": 218, "w": 24, "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": 108, + "y": 122, + "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": 108, + "y": 146, + "w": 16, + "h": 24 + } + }, + { + "filename": "lure", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 17, + "h": 24 + }, + "frame": { + "x": 111, + "y": 170, + "w": 17, + "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": 114, + "y": 194, + "w": 17, + "h": 24 + } + }, + { + "filename": "max_repel", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 116, + "y": 218, + "w": 16, + "h": 24 + } + }, + { + "filename": "revive", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 10, + "y": 8, + "w": 12, + "h": 17 + }, + "frame": { + "x": 122, + "y": 26, + "w": 12, + "h": 17 + } + }, + { + "filename": "coin_case", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 24, + "h": 23 + }, + "frame": { + "x": 92, + "y": 242, + "w": 24, + "h": 23 + } + }, + { + "filename": "metal_powder", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 24, + "h": 20 + }, + "frame": { + "x": 87, + "y": 265, + "w": 24, + "h": 20 + } + }, { "filename": "stone_plate", "rotated": false, @@ -2187,33 +2292,12 @@ "h": 24 }, "frame": { - "x": 315, - "y": 69, + "x": 88, + "y": 285, "w": 24, "h": 24 } }, - { - "filename": "scope_lens", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 24, - "h": 23 - }, - "frame": { - "x": 243, - "y": 93, - "w": 24, - "h": 23 - } - }, { "filename": "sun_stone", "rotated": false, @@ -2229,8 +2313,8 @@ "h": 24 }, "frame": { - "x": 267, - "y": 93, + "x": 88, + "y": 309, "w": 24, "h": 24 } @@ -2250,8 +2334,8 @@ "h": 24 }, "frame": { - "x": 291, - "y": 93, + "x": 88, + "y": 333, "w": 24, "h": 24 } @@ -2271,35 +2355,14 @@ "h": 24 }, "frame": { - "x": 315, - "y": 93, + "x": 88, + "y": 357, "w": 24, "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": 339, - "y": 69, - "w": 18, - "h": 24 - } - }, - { - "filename": "reveal_glass", + "filename": "expert_belt", "rotated": false, "trimmed": true, "sourceSize": { @@ -2309,18 +2372,18 @@ "spriteSourceSize": { "x": 4, "y": 4, - "w": 23, - "h": 24 + "w": 24, + "h": 23 }, "frame": { - "x": 357, - "y": 68, - "w": 23, - "h": 24 + "x": 88, + "y": 381, + "w": 24, + "h": 23 } }, { - "filename": "twisted_spoon", + "filename": "exp_balance", "rotated": false, "trimmed": true, "sourceSize": { @@ -2331,38 +2394,17 @@ "x": 4, "y": 5, "w": 24, - "h": 23 - }, - "frame": { - "x": 380, - "y": 68, - "w": 24, - "h": 23 - } - }, - { - "filename": "lock_capsule", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 19, "h": 22 }, "frame": { - "x": 404, - "y": 72, - "w": 19, + "x": 94, + "y": 404, + "w": 24, "h": 22 } }, { - "filename": "max_elixir", + "filename": "black_belt", "rotated": false, "trimmed": true, "sourceSize": { @@ -2370,36 +2412,15 @@ "h": 32 }, "spriteSourceSize": { - "x": 7, + "x": 5, "y": 4, - "w": 18, - "h": 24 - }, - "frame": { - "x": 339, - "y": 93, - "w": 18, - "h": 24 - } - }, - { - "filename": "berry_pouch", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 23, + "w": 22, "h": 23 }, "frame": { - "x": 357, - "y": 92, - "w": 23, + "x": 116, + "y": 242, + "w": 22, "h": 23 } }, @@ -2418,138 +2439,12 @@ "h": 20 }, "frame": { - "x": 380, - "y": 91, + "x": 111, + "y": 265, "w": 24, "h": 20 } }, - { - "filename": "metal_coat", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 19, - "h": 22 - }, - "frame": { - "x": 404, - "y": 94, - "w": 19, - "h": 22 - } - }, - { - "filename": "rusted_shield", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 6, - "w": 24, - "h": 20 - }, - "frame": { - "x": 380, - "y": 111, - "w": 24, - "h": 20 - } - }, - { - "filename": "quick_claw", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 19, - "h": 21 - }, - "frame": { - "x": 404, - "y": 116, - "w": 19, - "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": 357, - "y": 115, - "w": 23, - "h": 21 - } - }, - { - "filename": "sacred_ash", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 24, - "h": 20 - }, - "frame": { - "x": 380, - "y": 131, - "w": 24, - "h": 20 - } - }, - { - "filename": "spell_tag", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 19, - "h": 21 - }, - "frame": { - "x": 404, - "y": 137, - "w": 19, - "h": 21 - } - }, { "filename": "dynamax_band", "rotated": false, @@ -2565,8 +2460,8 @@ "h": 23 }, "frame": { - "x": 39, - "y": 78, + "x": 112, + "y": 285, "w": 23, "h": 23 } @@ -2586,14 +2481,35 @@ "h": 23 }, "frame": { - "x": 39, - "y": 101, + "x": 112, + "y": 308, "w": 23, "h": 23 } }, { - "filename": "leek", + "filename": "hearthflame_mask", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 23 + }, + "frame": { + "x": 112, + "y": 331, + "w": 24, + "h": 23 + } + }, + { + "filename": "leppa_berry", "rotated": false, "trimmed": true, "sourceSize": { @@ -2603,18 +2519,18 @@ "spriteSourceSize": { "x": 4, "y": 5, - "w": 23, + "w": 24, "h": 23 }, "frame": { - "x": 39, - "y": 124, - "w": 23, + "x": 112, + "y": 354, + "w": 24, "h": 23 } }, { - "filename": "max_revive", + "filename": "scope_lens", "rotated": false, "trimmed": true, "sourceSize": { @@ -2622,16 +2538,16 @@ "h": 32 }, "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 22, - "h": 24 + "x": 4, + "y": 5, + "w": 24, + "h": 23 }, "frame": { - "x": 39, - "y": 147, - "w": 22, - "h": 24 + "x": 112, + "y": 377, + "w": 24, + "h": 23 } }, { @@ -2649,302 +2565,8 @@ "h": 23 }, "frame": { - "x": 39, - "y": 171, - "w": 22, - "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": 39, - "y": 194, - "w": 24, - "h": 15 - } - }, - { - "filename": "oval_charm", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 21, - "h": 24 - }, - "frame": { - "x": 44, - "y": 209, - "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": 44, - "y": 233, - "w": 21, - "h": 24 - } - }, - { - "filename": "red_orb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 20, - "h": 24 - }, - "frame": { - "x": 45, - "y": 257, - "w": 20, - "h": 24 - } - }, - { - "filename": "dark_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 46, - "y": 281, - "w": 22, - "h": 23 - } - }, - { - "filename": "dragon_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 46, - "y": 304, - "w": 22, - "h": 23 - } - }, - { - "filename": "electric_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 46, - "y": 327, - "w": 22, - "h": 23 - } - }, - { - "filename": "fairy_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 46, - "y": 350, - "w": 22, - "h": 23 - } - }, - { - "filename": "fighting_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 46, - "y": 373, - "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": 62, - "y": 90, - "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": 62, - "y": 113, - "w": 23, - "h": 23 - } - }, - { - "filename": "auspicious_armor", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 23, - "h": 21 - }, - "frame": { - "x": 62, - "y": 136, - "w": 23, - "h": 21 - } - }, - { - "filename": "fire_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 23 - }, - "frame": { - "x": 61, - "y": 157, - "w": 22, - "h": 23 - } - }, - { - "filename": "fire_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 85, - "y": 92, + "x": 118, + "y": 400, "w": 22, "h": 23 } @@ -2964,12 +2586,348 @@ "h": 24 }, "frame": { - "x": 107, - "y": 92, + "x": 123, + "y": 43, "w": 16, "h": 24 } }, + { + "filename": "dark_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 139, + "y": 40, + "w": 22, + "h": 23 + } + }, + { + "filename": "pp_up", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 123, + "y": 67, + "w": 16, + "h": 24 + } + }, + { + "filename": "dragon_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 139, + "y": 63, + "w": 22, + "h": 23 + } + }, + { + "filename": "protein", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 123, + "y": 91, + "w": 16, + "h": 24 + } + }, + { + "filename": "electric_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 139, + "y": 86, + "w": 22, + "h": 23 + } + }, + { + "filename": "repel", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 124, + "y": 115, + "w": 16, + "h": 24 + } + }, + { + "filename": "super_lure", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 17, + "h": 24 + }, + "frame": { + "x": 124, + "y": 139, + "w": 17, + "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": 140, + "y": 109, + "w": 21, + "h": 23 + } + }, + { + "filename": "fairy_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 141, + "y": 132, + "w": 22, + "h": 23 + } + }, + { + "filename": "auspicious_armor", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 23, + "h": 21 + }, + "frame": { + "x": 141, + "y": 155, + "w": 23, + "h": 21 + } + }, + { + "filename": "dragon_scale", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 24, + "h": 18 + }, + "frame": { + "x": 128, + "y": 176, + "w": 24, + "h": 18 + } + }, + { + "filename": "fighting_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 131, + "y": 194, + "w": 22, + "h": 23 + } + }, + { + "filename": "fire_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 23 + }, + "frame": { + "x": 132, + "y": 217, + "w": 22, + "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": 138, + "y": 240, + "w": 16, + "h": 24 + } + }, + { + "filename": "baton", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 7, + "w": 18, + "h": 18 + }, + "frame": { + "x": 152, + "y": 176, + "w": 18, + "h": 18 + } + }, + { + "filename": "fire_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 153, + "y": 194, + "w": 22, + "h": 23 + } + }, { "filename": "flying_tera_shard", "rotated": false, @@ -2985,75 +2943,12 @@ "h": 23 }, "frame": { - "x": 85, - "y": 115, + "x": 154, + "y": 217, "w": 22, "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": 85, - "y": 138, - "w": 23, - "h": 20 - } - }, - { - "filename": "healing_charm", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 23, - "h": 22 - }, - "frame": { - "x": 83, - "y": 158, - "w": 23, - "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": 107, - "y": 116, - "w": 18, - "h": 22 - } - }, { "filename": "focus_sash", "rotated": false, @@ -3069,12 +2964,558 @@ "h": 23 }, "frame": { - "x": 125, - "y": 106, + "x": 154, + "y": 240, "w": 22, "h": 23 } }, + { + "filename": "unknown", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 135, + "y": 265, + "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": 135, + "y": 289, + "w": 16, + "h": 24 + } + }, + { + "filename": "candy", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 11, + "w": 18, + "h": 18 + }, + "frame": { + "x": 135, + "y": 313, + "w": 18, + "h": 18 + } + }, + { + "filename": "ghost_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 136, + "y": 331, + "w": 22, + "h": 23 + } + }, + { + "filename": "grass_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 136, + "y": 354, + "w": 22, + "h": 23 + } + }, + { + "filename": "ground_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 136, + "y": 377, + "w": 22, + "h": 23 + } + }, + { + "filename": "ice_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 140, + "y": 400, + "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": 330, + "y": 20, + "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": 354, + "y": 20, + "w": 24, + "h": 22 + } + }, + { + "filename": "twisted_spoon", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 24, + "h": 23 + }, + "frame": { + "x": 378, + "y": 20, + "w": 24, + "h": 23 + } + }, + { + "filename": "rusted_shield", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 24, + "h": 20 + }, + "frame": { + "x": 402, + "y": 22, + "w": 24, + "h": 20 + } + }, + { + "filename": "sacred_ash", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 24, + "h": 20 + }, + "frame": { + "x": 402, + "y": 42, + "w": 24, + "h": 20 + } + }, + { + "filename": "full_heal", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 9, + "y": 4, + "w": 15, + "h": 23 + }, + "frame": { + "x": 151, + "y": 264, + "w": 15, + "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": 151, + "y": 287, + "w": 17, + "h": 23 + } + }, + { + "filename": "berry_juice", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 24, + "h": 23 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 22, + "h": 21 + }, + "frame": { + "x": 153, + "y": 310, + "w": 22, + "h": 21 + } + }, + { + "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": 331, + "w": 21, + "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": 158, + "y": 354, + "w": 21, + "h": 23 + } + }, + { + "filename": "leek", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 23, + "h": 23 + }, + "frame": { + "x": 158, + "y": 377, + "w": 23, + "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": 162, + "y": 400, + "w": 20, + "h": 23 + } + }, + { + "filename": "never_melt_ice", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 23 + }, + "frame": { + "x": 166, + "y": 263, + "w": 22, + "h": 23 + } + }, + { + "filename": "normal_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 168, + "y": 286, + "w": 22, + "h": 23 + } + }, + { + "filename": "berry_pot", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 5, + "w": 18, + "h": 22 + }, + "frame": { + "x": 175, + "y": 309, + "w": 18, + "h": 22 + } + }, + { + "filename": "petaya_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 23 + }, + "frame": { + "x": 179, + "y": 331, + "w": 22, + "h": 23 + } + }, + { + "filename": "poison_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 179, + "y": 354, + "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": 181, + "y": 377, + "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": 182, + "y": 400, + "w": 23, + "h": 23 + } + }, { "filename": "shadow_reins_of_unity", "rotated": false, @@ -3090,12 +3531,138 @@ "h": 20 }, "frame": { - "x": 147, - "y": 111, + "x": 162, + "y": 21, "w": 24, "h": 20 } }, + { + "filename": "rarer_candy", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 23, + "h": 23 + }, + "frame": { + "x": 161, + "y": 41, + "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": 161, + "y": 64, + "w": 23, + "h": 22 + } + }, + { + "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": 86, + "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": 161, + "y": 109, + "w": 22, + "h": 23 + } + }, + { + "filename": "sharp_beak", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 21, + "h": 23 + }, + "frame": { + "x": 163, + "y": 132, + "w": 21, + "h": 23 + } + }, + { + "filename": "dawn_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 21 + }, + "frame": { + "x": 164, + "y": 155, + "w": 20, + "h": 21 + } + }, { "filename": "soft_sand", "rotated": false, @@ -3111,14 +3678,14 @@ "h": 20 }, "frame": { - "x": 171, - "y": 114, + "x": 186, + "y": 21, "w": 24, "h": 20 } }, { - "filename": "coupon", + "filename": "rusted_sword", "rotated": false, "trimmed": true, "sourceSize": { @@ -3127,19 +3694,19 @@ }, "spriteSourceSize": { "x": 4, - "y": 7, + "y": 5, "w": 23, - "h": 19 + "h": 22 }, "frame": { - "x": 195, - "y": 116, + "x": 184, + "y": 41, "w": 23, - "h": 19 + "h": 22 } }, { - "filename": "golden_mystic_ticket", + "filename": "steel_tera_shard", "rotated": false, "trimmed": true, "sourceSize": { @@ -3147,16 +3714,205 @@ "h": 32 }, "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 23, - "h": 19 + "x": 6, + "y": 4, + "w": 22, + "h": 23 }, "frame": { - "x": 218, - "y": 116, + "x": 184, + "y": 63, + "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": 183, + "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": 183, + "y": 109, + "w": 22, + "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": 184, + "y": 132, + "w": 21, + "h": 23 + } + }, + { + "filename": "binding_band", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, "w": 23, - "h": 19 + "h": 20 + }, + "frame": { + "x": 210, + "y": 21, + "w": 23, + "h": 20 + } + }, + { + "filename": "blank_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 207, + "y": 41, + "w": 22, + "h": 22 + } + }, + { + "filename": "wide_lens", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 206, + "y": 63, + "w": 22, + "h": 23 + } + }, + { + "filename": "bug_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 205, + "y": 86, + "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": 205, + "y": 108, + "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": 205, + "y": 130, + "w": 22, + "h": 22 } }, { @@ -3174,8 +3930,8 @@ "h": 21 }, "frame": { - "x": 241, - "y": 116, + "x": 233, + "y": 21, "w": 23, "h": 21 } @@ -3195,8 +3951,8 @@ "h": 21 }, "frame": { - "x": 264, - "y": 117, + "x": 256, + "y": 21, "w": 23, "h": 21 } @@ -3216,117 +3972,12 @@ "h": 21 }, "frame": { - "x": 287, - "y": 117, + "x": 279, + "y": 21, "w": 23, "h": 21 } }, - { - "filename": "rusted_sword", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 23, - "h": 22 - }, - "frame": { - "x": 310, - "y": 117, - "w": 23, - "h": 22 - } - }, - { - "filename": "blank_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 333, - "y": 117, - "w": 22, - "h": 22 - } - }, - { - "filename": "apicot_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 19, - "h": 20 - }, - "frame": { - "x": 108, - "y": 138, - "w": 19, - "h": 20 - } - }, - { - "filename": "bug_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 106, - "y": 158, - "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": 127, - "y": 129, - "w": 20, - "h": 23 - } - }, { "filename": "wellspring_mask", "rotated": false, @@ -3342,159 +3993,12 @@ "h": 21 }, "frame": { - "x": 147, - "y": 131, + "x": 302, + "y": 21, "w": 23, "h": 21 } }, - { - "filename": "mystic_ticket", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 23, - "h": 19 - }, - "frame": { - "x": 170, - "y": 134, - "w": 23, - "h": 19 - } - }, - { - "filename": "ghost_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 128, - "y": 152, - "w": 22, - "h": 23 - } - }, - { - "filename": "hard_meteorite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 20, - "h": 22 - }, - "frame": { - "x": 150, - "y": 152, - "w": 20, - "h": 22 - } - }, - { - "filename": "charcoal", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 170, - "y": 153, - "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": 193, - "y": 135, - "w": 23, - "h": 19 - } - }, - { - "filename": "dark_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 192, - "y": 154, - "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": 216, - "y": 135, - "w": 23, - "h": 20 - } - }, { "filename": "deep_sea_tooth", "rotated": false, @@ -3510,7 +4014,7 @@ "h": 21 }, "frame": { - "x": 214, + "x": 184, "y": 155, "w": 22, "h": 21 @@ -3531,12 +4035,33 @@ "h": 18 }, "frame": { - "x": 239, - "y": 137, + "x": 170, + "y": 176, "w": 23, "h": 18 } }, + { + "filename": "sachet", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 18, + "h": 23 + }, + "frame": { + "x": 175, + "y": 194, + "w": 18, + "h": 23 + } + }, { "filename": "dire_hit", "rotated": false, @@ -3552,14 +4077,14 @@ "h": 22 }, "frame": { - "x": 236, - "y": 155, + "x": 206, + "y": 152, "w": 22, "h": 22 } }, { - "filename": "chill_drive", + "filename": "potion", "rotated": false, "trimmed": true, "sourceSize": { @@ -3567,16 +4092,37 @@ "h": 32 }, "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 23, - "h": 17 + "x": 8, + "y": 5, + "w": 17, + "h": 23 }, "frame": { - "x": 262, - "y": 138, - "w": 23, - "h": 17 + "x": 176, + "y": 217, + "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": 176, + "y": 240, + "w": 17, + "h": 23 } }, { @@ -3594,33 +4140,12 @@ "h": 22 }, "frame": { - "x": 258, - "y": 155, + "x": 229, + "y": 42, "w": 22, "h": 22 } }, - { - "filename": "douse_drive", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 23, - "h": 17 - }, - "frame": { - "x": 285, - "y": 138, - "w": 23, - "h": 17 - } - }, { "filename": "dragon_memory", "rotated": false, @@ -3636,201 +4161,12 @@ "h": 22 }, "frame": { - "x": 280, - "y": 155, + "x": 251, + "y": 42, "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": 308, - "y": 139, - "w": 23, - "h": 20 - } - }, - { - "filename": "deep_sea_scale", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 20 - }, - "frame": { - "x": 331, - "y": 139, - "w": 22, - "h": 20 - } - }, - { - "filename": "blunder_policy", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 19 - }, - "frame": { - "x": 302, - "y": 159, - "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": 324, - "y": 159, - "w": 22, - "h": 19 - } - }, - { - "filename": "grass_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 63, - "y": 180, - "w": 22, - "h": 23 - } - }, - { - "filename": "ground_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 85, - "y": 180, - "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": 107, - "y": 180, - "w": 21, - "h": 23 - } - }, - { - "filename": "ice_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 128, - "y": 175, - "w": 22, - "h": 23 - } - }, - { - "filename": "sitrus_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 20, - "h": 22 - }, - "frame": { - "x": 150, - "y": 174, - "w": 20, - "h": 22 - } - }, { "filename": "electirizer", "rotated": false, @@ -3846,8 +4182,8 @@ "h": 22 }, "frame": { - "x": 170, - "y": 175, + "x": 273, + "y": 42, "w": 22, "h": 22 } @@ -3867,8 +4203,8 @@ "h": 22 }, "frame": { - "x": 192, - "y": 176, + "x": 295, + "y": 42, "w": 22, "h": 22 } @@ -3888,8 +4224,8 @@ "h": 22 }, "frame": { - "x": 214, - "y": 176, + "x": 228, + "y": 64, "w": 22, "h": 22 } @@ -3909,8 +4245,8 @@ "h": 22 }, "frame": { - "x": 236, - "y": 177, + "x": 227, + "y": 86, "w": 22, "h": 22 } @@ -3930,8 +4266,8 @@ "h": 22 }, "frame": { - "x": 258, - "y": 177, + "x": 250, + "y": 64, "w": 22, "h": 22 } @@ -3951,8 +4287,8 @@ "h": 22 }, "frame": { - "x": 280, - "y": 177, + "x": 227, + "y": 108, "w": 22, "h": 22 } @@ -3972,8 +4308,8 @@ "h": 22 }, "frame": { - "x": 302, - "y": 178, + "x": 227, + "y": 130, "w": 22, "h": 22 } @@ -3993,306 +4329,12 @@ "h": 22 }, "frame": { - "x": 324, - "y": 178, + "x": 249, + "y": 86, "w": 22, "h": 22 } }, - { - "filename": "never_melt_ice", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 23 - }, - "frame": { - "x": 65, - "y": 203, - "w": 22, - "h": 23 - } - }, - { - "filename": "normal_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 87, - "y": 203, - "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": 65, - "y": 226, - "w": 22, - "h": 23 - } - }, - { - "filename": "poison_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 87, - "y": 226, - "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": 65, - "y": 249, - "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": 87, - "y": 249, - "w": 22, - "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": 109, - "y": 203, - "w": 21, - "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": 109, - "y": 226, - "w": 21, - "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": 109, - "y": 249, - "w": 22, - "h": 23 - } - }, - { - "filename": "sharp_beak", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 21, - "h": 23 - }, - "frame": { - "x": 130, - "y": 198, - "w": 21, - "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": 130, - "y": 221, - "w": 22, - "h": 23 - } - }, - { - "filename": "max_ether", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 18, - "h": 24 - }, - "frame": { - "x": 151, - "y": 196, - "w": 18, - "h": 24 - } - }, - { - "filename": "stellar_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 169, - "y": 197, - "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": 152, - "y": 220, - "w": 22, - "h": 23 - } - }, { "filename": "ghost_memory", "rotated": false, @@ -4308,33 +4350,12 @@ "h": 22 }, "frame": { - "x": 191, - "y": 198, + "x": 272, + "y": 64, "w": 22, "h": 22 } }, - { - "filename": "wide_lens", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 174, - "y": 220, - "w": 22, - "h": 23 - } - }, { "filename": "grass_memory", "rotated": false, @@ -4350,8 +4371,8 @@ "h": 22 }, "frame": { - "x": 213, - "y": 198, + "x": 249, + "y": 108, "w": 22, "h": 22 } @@ -4371,8 +4392,8 @@ "h": 22 }, "frame": { - "x": 196, - "y": 220, + "x": 271, + "y": 86, "w": 22, "h": 22 } @@ -4392,8 +4413,8 @@ "h": 22 }, "frame": { - "x": 235, - "y": 199, + "x": 294, + "y": 64, "w": 22, "h": 22 } @@ -4413,8 +4434,8 @@ "h": 22 }, "frame": { - "x": 257, - "y": 199, + "x": 249, + "y": 130, "w": 22, "h": 22 } @@ -4434,33 +4455,12 @@ "h": 22 }, "frame": { - "x": 279, - "y": 199, + "x": 228, + "y": 152, "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": 301, - "y": 200, - "w": 22, - "h": 21 - } - }, { "filename": "magmarizer", "rotated": false, @@ -4476,33 +4476,12 @@ "h": 22 }, "frame": { - "x": 323, - "y": 200, + "x": 271, + "y": 108, "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": 218, - "y": 220, - "w": 17, - "h": 23 - } - }, { "filename": "mini_black_hole", "rotated": false, @@ -4518,8 +4497,8 @@ "h": 22 }, "frame": { - "x": 235, - "y": 221, + "x": 293, + "y": 86, "w": 22, "h": 22 } @@ -4539,8 +4518,8 @@ "h": 22 }, "frame": { - "x": 257, - "y": 221, + "x": 271, + "y": 130, "w": 22, "h": 22 } @@ -4560,8 +4539,8 @@ "h": 22 }, "frame": { - "x": 279, - "y": 221, + "x": 250, + "y": 152, "w": 22, "h": 22 } @@ -4581,8 +4560,8 @@ "h": 22 }, "frame": { - "x": 301, - "y": 221, + "x": 293, + "y": 108, "w": 22, "h": 22 } @@ -4602,33 +4581,12 @@ "h": 22 }, "frame": { - "x": 323, - "y": 222, + "x": 293, + "y": 130, "w": 22, "h": 22 } }, - { - "filename": "whipped_dream", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 21, - "h": 23 - }, - "frame": { - "x": 131, - "y": 244, - "w": 21, - "h": 23 - } - }, { "filename": "scroll_of_darkness", "rotated": false, @@ -4644,8 +4602,8 @@ "h": 22 }, "frame": { - "x": 152, - "y": 243, + "x": 272, + "y": 152, "w": 22, "h": 22 } @@ -4665,8 +4623,8 @@ "h": 22 }, "frame": { - "x": 174, - "y": 243, + "x": 294, + "y": 152, "w": 22, "h": 22 } @@ -4686,8 +4644,8 @@ "h": 22 }, "frame": { - "x": 196, - "y": 242, + "x": 317, + "y": 42, "w": 22, "h": 22 } @@ -4707,8 +4665,8 @@ "h": 22 }, "frame": { - "x": 218, - "y": 243, + "x": 316, + "y": 64, "w": 22, "h": 22 } @@ -4728,8 +4686,8 @@ "h": 22 }, "frame": { - "x": 240, - "y": 243, + "x": 315, + "y": 86, "w": 22, "h": 22 } @@ -4749,8 +4707,8 @@ "h": 22 }, "frame": { - "x": 262, - "y": 243, + "x": 339, + "y": 42, "w": 22, "h": 22 } @@ -4770,33 +4728,12 @@ "h": 22 }, "frame": { - "x": 284, - "y": 243, + "x": 338, + "y": 64, "w": 22, "h": 22 } }, - { - "filename": "max_lure", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 17, - "h": 24 - }, - "frame": { - "x": 306, - "y": 243, - "w": 17, - "h": 24 - } - }, { "filename": "tm_bug", "rotated": false, @@ -4812,8 +4749,8 @@ "h": 22 }, "frame": { - "x": 323, - "y": 244, + "x": 315, + "y": 108, "w": 22, "h": 22 } @@ -4833,8 +4770,8 @@ "h": 22 }, "frame": { - "x": 68, - "y": 272, + "x": 315, + "y": 130, "w": 22, "h": 22 } @@ -4854,8 +4791,8 @@ "h": 22 }, "frame": { - "x": 68, - "y": 294, + "x": 337, + "y": 86, "w": 22, "h": 22 } @@ -4875,8 +4812,8 @@ "h": 22 }, "frame": { - "x": 90, - "y": 272, + "x": 337, + "y": 108, "w": 22, "h": 22 } @@ -4896,8 +4833,8 @@ "h": 22 }, "frame": { - "x": 68, - "y": 316, + "x": 337, + "y": 130, "w": 22, "h": 22 } @@ -4917,8 +4854,8 @@ "h": 22 }, "frame": { - "x": 90, - "y": 294, + "x": 316, + "y": 152, "w": 22, "h": 22 } @@ -4938,12 +4875,54 @@ "h": 22 }, "frame": { - "x": 68, - "y": 338, + "x": 338, + "y": 152, "w": 22, "h": 22 } }, + { + "filename": "metronome", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 5, + "w": 17, + "h": 22 + }, + "frame": { + "x": 361, + "y": 42, + "w": 17, + "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": 378, + "y": 43, + "w": 22, + "h": 21 + } + }, { "filename": "tm_flying", "rotated": false, @@ -4959,8 +4938,8 @@ "h": 22 }, "frame": { - "x": 90, - "y": 316, + "x": 360, + "y": 64, "w": 22, "h": 22 } @@ -4980,8 +4959,8 @@ "h": 22 }, "frame": { - "x": 68, - "y": 360, + "x": 359, + "y": 86, "w": 22, "h": 22 } @@ -5001,8 +4980,8 @@ "h": 22 }, "frame": { - "x": 90, - "y": 338, + "x": 359, + "y": 108, "w": 22, "h": 22 } @@ -5022,369 +5001,12 @@ "h": 22 }, "frame": { - "x": 90, - "y": 360, + "x": 359, + "y": 130, "w": 22, "h": 22 } }, - { - "filename": "max_potion", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 18, - "h": 24 - }, - "frame": { - "x": 112, - "y": 272, - "w": 18, - "h": 24 - } - }, - { - "filename": "sachet", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 18, - "h": 23 - }, - "frame": { - "x": 112, - "y": 296, - "w": 18, - "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": 112, - "y": 319, - "w": 17, - "h": 24 - } - }, - { - "filename": "potion", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 17, - "h": 23 - }, - "frame": { - "x": 112, - "y": 343, - "w": 17, - "h": 23 - } - }, - { - "filename": "shock_drive", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 23, - "h": 17 - }, - "frame": { - "x": 68, - "y": 382, - "w": 23, - "h": 17 - } - }, - { - "filename": "pp_up", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 68, - "y": 399, - "w": 16, - "h": 24 - } - }, - { - "filename": "protein", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 84, - "y": 399, - "w": 16, - "h": 24 - } - }, - { - "filename": "wise_glasses", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 23, - "h": 17 - }, - "frame": { - "x": 91, - "y": 382, - "w": 23, - "h": 17 - } - }, - { - "filename": "repel", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 100, - "y": 399, - "w": 16, - "h": 24 - } - }, - { - "filename": "mega_bracelet", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 16 - }, - "frame": { - "x": 112, - "y": 366, - "w": 20, - "h": 16 - } - }, - { - "filename": "everstone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 17 - }, - "frame": { - "x": 114, - "y": 382, - "w": 20, - "h": 17 - } - }, - { - "filename": "super_repel", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 116, - "y": 399, - "w": 16, - "h": 24 - } - }, - { - "filename": "unknown", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 132, - "y": 399, - "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": 346, - "y": 159, - "w": 16, - "h": 24 - } - }, - { - "filename": "baton", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 18, - "h": 18 - }, - "frame": { - "x": 362, - "y": 136, - "w": 18, - "h": 18 - } - }, - { - "filename": "super_potion", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 17, - "h": 23 - }, - "frame": { - "x": 362, - "y": 154, - "w": 17, - "h": 23 - } - }, - { - "filename": "big_mushroom", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 19, - "h": 19 - }, - "frame": { - "x": 346, - "y": 183, - "w": 19, - "h": 19 - } - }, { "filename": "tm_ice", "rotated": false, @@ -5400,12 +5022,33 @@ "h": 22 }, "frame": { - "x": 345, - "y": 202, + "x": 360, + "y": 152, "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": 382, + "y": 64, + "w": 20, + "h": 22 + } + }, { "filename": "tm_normal", "rotated": false, @@ -5421,159 +5064,12 @@ "h": 22 }, "frame": { - "x": 345, - "y": 224, + "x": 381, + "y": 86, "w": 22, "h": 22 } }, - { - "filename": "fairy_feather", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 22, - "h": 20 - }, - "frame": { - "x": 345, - "y": 246, - "w": 22, - "h": 20 - } - }, - { - "filename": "full_heal", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 15, - "h": 23 - }, - "frame": { - "x": 365, - "y": 177, - "w": 15, - "h": 23 - } - }, - { - "filename": "leftovers", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 15, - "h": 22 - }, - "frame": { - "x": 367, - "y": 200, - "w": 15, - "h": 22 - } - }, - { - "filename": "metronome", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 17, - "h": 22 - }, - "frame": { - "x": 367, - "y": 222, - "w": 17, - "h": 22 - } - }, - { - "filename": "soothe_bell", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 17, - "h": 22 - }, - "frame": { - "x": 367, - "y": 244, - "w": 17, - "h": 22 - } - }, - { - "filename": "malicious_armor", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 20 - }, - "frame": { - "x": 382, - "y": 151, - "w": 22, - "h": 20 - } - }, - { - "filename": "candy_jar", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 19, - "h": 20 - }, - "frame": { - "x": 404, - "y": 158, - "w": 19, - "h": 20 - } - }, { "filename": "tm_poison", "rotated": false, @@ -5589,222 +5085,12 @@ "h": 22 }, "frame": { - "x": 380, - "y": 171, + "x": 381, + "y": 108, "w": 22, "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": 402, - "y": 178, - "w": 21, - "h": 21 - } - }, - { - "filename": "dawn_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 21 - }, - "frame": { - "x": 382, - "y": 193, - "w": 20, - "h": 21 - } - }, - { - "filename": "poison_barb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 21, - "h": 21 - }, - "frame": { - "x": 402, - "y": 199, - "w": 21, - "h": 21 - } - }, - { - "filename": "razor_fang", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 18, - "h": 20 - }, - "frame": { - "x": 384, - "y": 214, - "w": 18, - "h": 20 - } - }, - { - "filename": "shiny_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 21, - "h": 21 - }, - "frame": { - "x": 402, - "y": 220, - "w": 21, - "h": 21 - } - }, - { - "filename": "oval_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 18, - "h": 19 - }, - "frame": { - "x": 384, - "y": 234, - "w": 18, - "h": 19 - } - }, - { - "filename": "zoom_lens", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 21, - "h": 21 - }, - "frame": { - "x": 402, - "y": 241, - "w": 21, - "h": 21 - } - }, - { - "filename": "candy", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 11, - "w": 18, - "h": 18 - }, - "frame": { - "x": 384, - "y": 253, - "w": 18, - "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": 402, - "y": 262, - "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": 131, - "y": 267, - "w": 21, - "h": 18 - } - }, { "filename": "tm_psychic", "rotated": false, @@ -5820,12 +5106,180 @@ "h": 22 }, "frame": { - "x": 130, - "y": 285, + "x": 381, + "y": 130, "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": 403, + "y": 62, + "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": 403, + "y": 82, + "w": 23, + "h": 20 + } + }, + { + "filename": "coupon", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 23, + "h": 19 + }, + "frame": { + "x": 403, + "y": 102, + "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": 403, + "y": 121, + "w": 23, + "h": 19 + } + }, + { + "filename": "mystic_ticket", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 23, + "h": 19 + }, + "frame": { + "x": 403, + "y": 140, + "w": 23, + "h": 19 + } + }, + { + "filename": "dusk_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 21, + "h": 21 + }, + "frame": { + "x": 382, + "y": 152, + "w": 21, + "h": 21 + } + }, + { + "filename": "pair_of_tickets", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 23, + "h": 19 + }, + "frame": { + "x": 403, + "y": 159, + "w": 23, + "h": 19 + } + }, + { + "filename": "leftovers", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 15, + "h": 22 + }, + "frame": { + "x": 193, + "y": 176, + "w": 15, + "h": 22 + } + }, { "filename": "tm_rock", "rotated": false, @@ -5841,8 +5295,8 @@ "h": 22 }, "frame": { - "x": 152, - "y": 265, + "x": 208, + "y": 174, "w": 22, "h": 22 } @@ -5862,8 +5316,8 @@ "h": 22 }, "frame": { - "x": 174, - "y": 265, + "x": 230, + "y": 174, "w": 22, "h": 22 } @@ -5883,75 +5337,12 @@ "h": 22 }, "frame": { - "x": 196, - "y": 264, + "x": 252, + "y": 174, "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": 218, - "y": 265, - "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": 240, - "y": 265, - "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": 262, - "y": 265, - "w": 22, - "h": 21 - } - }, { "filename": "water_memory", "rotated": false, @@ -5967,33 +5358,12 @@ "h": 22 }, "frame": { - "x": 284, - "y": 265, + "x": 274, + "y": 174, "w": 22, "h": 22 } }, - { - "filename": "tera_orb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 20 - }, - "frame": { - "x": 152, - "y": 287, - "w": 22, - "h": 20 - } - }, { "filename": "water_stone", "rotated": false, @@ -6009,8 +5379,8 @@ "h": 22 }, "frame": { - "x": 174, - "y": 287, + "x": 296, + "y": 174, "w": 22, "h": 22 } @@ -6030,8 +5400,8 @@ "h": 22 }, "frame": { - "x": 196, - "y": 286, + "x": 318, + "y": 174, "w": 22, "h": 22 } @@ -6051,12 +5421,96 @@ "h": 22 }, "frame": { - "x": 218, - "y": 286, + "x": 340, + "y": 174, "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": 362, + "y": 174, + "w": 20, + "h": 22 + } + }, + { + "filename": "poison_barb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 21, + "h": 21 + }, + "frame": { + "x": 382, + "y": 173, + "w": 21, + "h": 21 + } + }, + { + "filename": "black_glasses", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 23, + "h": 17 + }, + "frame": { + "x": 403, + "y": 178, + "w": 23, + "h": 17 + } + }, + { + "filename": "metal_coat", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 5, + "w": 19, + "h": 22 + }, + "frame": { + "x": 193, + "y": 198, + "w": 19, + "h": 22 + } + }, { "filename": "x_defense", "rotated": false, @@ -6072,8 +5526,8 @@ "h": 22 }, "frame": { - "x": 240, - "y": 286, + "x": 212, + "y": 196, "w": 22, "h": 22 } @@ -6093,8 +5547,8 @@ "h": 22 }, "frame": { - "x": 262, - "y": 286, + "x": 234, + "y": 196, "w": 22, "h": 22 } @@ -6114,8 +5568,8 @@ "h": 22 }, "frame": { - "x": 284, - "y": 287, + "x": 256, + "y": 196, "w": 22, "h": 22 } @@ -6135,12 +5589,285 @@ "h": 22 }, "frame": { - "x": 306, - "y": 267, + "x": 278, + "y": 196, "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": 300, + "y": 196, + "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": 322, + "y": 196, + "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": 344, + "y": 196, + "w": 22, + "h": 21 + } + }, + { + "filename": "quick_claw", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 19, + "h": 21 + }, + "frame": { + "x": 193, + "y": 220, + "w": 19, + "h": 21 + } + }, + { + "filename": "deep_sea_scale", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 20 + }, + "frame": { + "x": 212, + "y": 218, + "w": 22, + "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": 234, + "y": 218, + "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": 256, + "y": 218, + "w": 22, + "h": 20 + } + }, + { + "filename": "tera_orb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 20 + }, + "frame": { + "x": 278, + "y": 218, + "w": 22, + "h": 20 + } + }, + { + "filename": "shiny_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 21, + "h": 21 + }, + "frame": { + "x": 300, + "y": 217, + "w": 21, + "h": 21 + } + }, + { + "filename": "zoom_lens", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 21, + "h": 21 + }, + "frame": { + "x": 321, + "y": 217, + "w": 21, + "h": 21 + } + }, + { + "filename": "blunder_policy", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 19 + }, + "frame": { + "x": 342, + "y": 217, + "w": 22, + "h": 19 + } + }, + { + "filename": "spell_tag", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 6, + "w": 19, + "h": 21 + }, + "frame": { + "x": 193, + "y": 241, + "w": 19, + "h": 21 + } + }, + { + "filename": "dubious_disc", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 22, + "h": 19 + }, + "frame": { + "x": 212, + "y": 238, + "w": 22, + "h": 19 + } + }, { "filename": "upgrade", "rotated": false, @@ -6156,12 +5883,96 @@ "h": 19 }, "frame": { - "x": 306, - "y": 289, + "x": 234, + "y": 238, "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": 256, + "y": 238, + "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": 279, + "y": 238, + "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": 302, + "y": 238, + "w": 23, + "h": 17 + } + }, + { + "filename": "soothe_bell", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 17, + "h": 22 + }, + "frame": { + "x": 366, + "y": 196, + "w": 17, + "h": 22 + } + }, { "filename": "big_nugget", "rotated": false, @@ -6177,12 +5988,54 @@ "h": 20 }, "frame": { - "x": 328, - "y": 266, + "x": 383, + "y": 194, "w": 20, "h": 20 } }, + { + "filename": "shock_drive", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 23, + "h": 17 + }, + "frame": { + "x": 403, + "y": 195, + "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": 403, + "y": 212, + "w": 23, + "h": 17 + } + }, { "filename": "blue_orb", "rotated": false, @@ -6198,12 +6051,54 @@ "h": 20 }, "frame": { - "x": 348, - "y": 266, + "x": 383, + "y": 214, "w": 20, "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": 364, + "y": 218, + "w": 19, + "h": 20 + } + }, + { + "filename": "big_mushroom", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 19, + "h": 19 + }, + "frame": { + "x": 325, + "y": 238, + "w": 19, + "h": 19 + } + }, { "filename": "gb", "rotated": false, @@ -6219,12 +6114,33 @@ "h": 20 }, "frame": { - "x": 328, - "y": 286, + "x": 344, + "y": 236, "w": 20, "h": 20 } }, + { + "filename": "candy_jar", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 19, + "h": 20 + }, + "frame": { + "x": 364, + "y": 238, + "w": 19, + "h": 20 + } + }, { "filename": "magnet", "rotated": false, @@ -6240,14 +6156,14 @@ "h": 20 }, "frame": { - "x": 348, - "y": 286, + "x": 383, + "y": 234, "w": 20, "h": 20 } }, { - "filename": "mystery_egg", + "filename": "mb", "rotated": false, "trimmed": true, "sourceSize": { @@ -6255,20 +6171,104 @@ "h": 32 }, "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, + "x": 6, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 403, + "y": 229, + "w": 20, + "h": 20 + } + }, + { + "filename": "masterpiece_teacup", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 21, "h": 18 }, "frame": { - "x": 368, - "y": 266, - "w": 16, + "x": 212, + "y": 257, + "w": 21, "h": 18 } }, { - "filename": "dark_stone", + "filename": "metal_alloy", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 7, + "w": 21, + "h": 19 + }, + "frame": { + "x": 233, + "y": 257, + "w": 21, + "h": 19 + } + }, + { + "filename": "hard_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 19, + "h": 20 + }, + "frame": { + "x": 193, + "y": 262, + "w": 19, + "h": 20 + } + }, + { + "filename": "pb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 190, + "y": 282, + "w": 20, + "h": 20 + } + }, + { + "filename": "golden_egg", "rotated": false, "trimmed": true, "sourceSize": { @@ -6277,15 +6277,15 @@ }, "spriteSourceSize": { "x": 7, - "y": 7, - "w": 18, - "h": 18 + "y": 6, + "w": 17, + "h": 20 }, "frame": { - "x": 384, - "y": 271, - "w": 18, - "h": 18 + "x": 193, + "y": 302, + "w": 17, + "h": 20 } }, { @@ -6303,14 +6303,14 @@ "h": 18 }, "frame": { - "x": 402, - "y": 281, + "x": 212, + "y": 275, "w": 21, "h": 18 } }, { - "filename": "abomasite", + "filename": "pb_gold", "rotated": false, "trimmed": true, "sourceSize": { @@ -6318,37 +6318,16 @@ "h": 32 }, "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 + "x": 6, + "y": 6, + "w": 20, + "h": 20 }, "frame": { - "x": 368, - "y": 284, - "w": 16, - "h": 16 - } - }, - { - "filename": "flame_orb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 18, - "h": 18 - }, - "frame": { - "x": 384, - "y": 289, - "w": 18, - "h": 18 + "x": 210, + "y": 293, + "w": 20, + "h": 20 } }, { @@ -6366,8 +6345,8 @@ "h": 18 }, "frame": { - "x": 402, - "y": 299, + "x": 233, + "y": 276, "w": 21, "h": 18 } @@ -6387,14 +6366,14 @@ "h": 19 }, "frame": { - "x": 130, - "y": 307, + "x": 230, + "y": 294, "w": 20, "h": 19 } }, { - "filename": "mb", + "filename": "everstone", "rotated": false, "trimmed": true, "sourceSize": { @@ -6403,78 +6382,15 @@ }, "spriteSourceSize": { "x": 6, - "y": 6, + "y": 8, "w": 20, - "h": 20 + "h": 17 }, "frame": { - "x": 129, - "y": 326, + "x": 210, + "y": 313, "w": 20, - "h": 20 - } - }, - { - "filename": "pb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 129, - "y": 346, - "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": 150, - "y": 307, - "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": 149, - "y": 327, - "w": 20, - "h": 20 + "h": 17 } }, { @@ -6492,35 +6408,14 @@ "h": 19 }, "frame": { - "x": 149, - "y": 347, + "x": 230, + "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": 132, - "y": 366, - "w": 17, - "h": 16 - } - }, - { - "filename": "razor_claw", + "filename": "rb", "rotated": false, "trimmed": true, "sourceSize": { @@ -6529,15 +6424,15 @@ }, "spriteSourceSize": { "x": 6, - "y": 7, + "y": 6, "w": 20, - "h": 19 + "h": 20 }, "frame": { - "x": 149, - "y": 366, + "x": 201, + "y": 330, "w": 20, - "h": 19 + "h": 20 } }, { @@ -6555,12 +6450,33 @@ "h": 20 }, "frame": { - "x": 170, - "y": 309, + "x": 201, + "y": 350, "w": 20, "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": 203, + "y": 370, + "w": 18, + "h": 20 + } + }, { "filename": "strange_ball", "rotated": false, @@ -6576,8 +6492,8 @@ "h": 20 }, "frame": { - "x": 169, - "y": 329, + "x": 221, + "y": 332, "w": 20, "h": 20 } @@ -6597,56 +6513,14 @@ "h": 20 }, "frame": { - "x": 169, - "y": 349, + "x": 221, + "y": 352, "w": 20, "h": 20 } }, { - "filename": "white_herb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 24, - "h": 24 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 20, - "h": 19 - }, - "frame": { - "x": 169, - "y": 369, - "w": 20, - "h": 19 - } - }, - { - "filename": "eviolite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 15, - "h": 15 - }, - "frame": { - "x": 134, - "y": 382, - "w": 15, - "h": 15 - } - }, - { - "filename": "wl_ability_urge", + "filename": "razor_claw", "rotated": false, "trimmed": true, "sourceSize": { @@ -6655,78 +6529,15 @@ }, "spriteSourceSize": { "x": 6, - "y": 8, + "y": 7, "w": 20, - "h": 18 + "h": 19 }, "frame": { - "x": 149, - "y": 385, + "x": 221, + "y": 372, "w": 20, - "h": 18 - } - }, - { - "filename": "hard_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 19, - "h": 20 - }, - "frame": { - "x": 148, - "y": 403, - "w": 19, - "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": 167, - "y": 403, - "w": 17, - "h": 20 - } - }, - { - "filename": "candy_overlay", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 12, - "w": 16, - "h": 15 - }, - "frame": { - "x": 169, - "y": 388, - "w": 16, - "h": 15 + "h": 19 } }, { @@ -6744,14 +6555,14 @@ "h": 20 }, "frame": { - "x": 184, - "y": 403, + "x": 241, + "y": 332, "w": 17, "h": 20 } }, { - "filename": "prism_scale", + "filename": "miracle_seed", "rotated": false, "trimmed": true, "sourceSize": { @@ -6759,57 +6570,78 @@ "h": 32 }, "spriteSourceSize": { - "x": 9, - "y": 8, - "w": 15, - "h": 15 - }, - "frame": { - "x": 185, - "y": 388, - "w": 15, - "h": 15 - } - }, - { - "filename": "absolite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 368, - "y": 300, - "w": 16, - "h": 16 - } - }, - { - "filename": "light_ball", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, + "x": 6, "y": 7, - "w": 18, + "w": 19, + "h": 19 + }, + "frame": { + "x": 241, + "y": 352, + "w": 19, + "h": 19 + } + }, + { + "filename": "white_herb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 24, + "h": 24 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 20, + "h": 19 + }, + "frame": { + "x": 241, + "y": 371, + "w": 20, + "h": 19 + } + }, + { + "filename": "mega_bracelet", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 16 + }, + "frame": { + "x": 403, + "y": 249, + "w": 20, + "h": 16 + } + }, + { + "filename": "wl_ability_urge", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, "h": 18 }, "frame": { - "x": 384, - "y": 307, - "w": 18, + "x": 383, + "y": 254, + "w": 20, "h": 18 } }, @@ -6828,14 +6660,14 @@ "h": 18 }, "frame": { - "x": 402, - "y": 317, + "x": 403, + "y": 265, "w": 20, "h": 18 } }, { - "filename": "miracle_seed", + "filename": "mystery_egg", "rotated": false, "trimmed": true, "sourceSize": { @@ -6843,16 +6675,16 @@ "h": 32 }, "spriteSourceSize": { - "x": 6, - "y": 7, - "w": 19, - "h": 19 + "x": 8, + "y": 8, + "w": 16, + "h": 18 }, "frame": { - "x": 190, - "y": 309, - "w": 19, - "h": 19 + "x": 205, + "y": 390, + "w": 16, + "h": 18 } }, { @@ -6870,12 +6702,117 @@ "h": 18 }, "frame": { - "x": 209, - "y": 308, + "x": 205, + "y": 408, "w": 20, "h": 18 } }, + { + "filename": "relic_band", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 9, + "w": 17, + "h": 16 + }, + "frame": { + "x": 221, + "y": 391, + "w": 17, + "h": 16 + } + }, + { + "filename": "oval_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 7, + "w": 18, + "h": 19 + }, + "frame": { + "x": 225, + "y": 407, + "w": 18, + "h": 19 + } + }, + { + "filename": "abomasite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 238, + "y": 391, + "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": 243, + "y": 407, + "w": 18, + "h": 18 + } + }, + { + "filename": "relic_gold", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 9, + "y": 11, + "w": 15, + "h": 11 + }, + "frame": { + "x": 59, + "y": 27, + "w": 15, + "h": 11 + } + }, { "filename": "wl_burn_heal", "rotated": false, @@ -6891,12 +6828,33 @@ "h": 18 }, "frame": { - "x": 229, - "y": 308, + "x": 344, + "y": 256, "w": 20, "h": 18 } }, + { + "filename": "flame_orb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 7, + "w": 18, + "h": 18 + }, + "frame": { + "x": 364, + "y": 258, + "w": 18, + "h": 18 + } + }, { "filename": "wl_custom_spliced", "rotated": false, @@ -6912,8 +6870,8 @@ "h": 18 }, "frame": { - "x": 249, - "y": 308, + "x": 382, + "y": 272, "w": 20, "h": 18 } @@ -6933,12 +6891,96 @@ "h": 18 }, "frame": { - "x": 328, - "y": 306, + "x": 402, + "y": 283, "w": 20, "h": 18 } }, + { + "filename": "absolite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 254, + "y": 390, + "w": 16, + "h": 16 + } + }, + { + "filename": "light_ball", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 7, + "w": 18, + "h": 18 + }, + "frame": { + "x": 261, + "y": 406, + "w": 18, + "h": 18 + } + }, + { + "filename": "light_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 7, + "w": 18, + "h": 18 + }, + "frame": { + "x": 250, + "y": 294, + "w": 18, + "h": 18 + } + }, + { + "filename": "toxic_orb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 7, + "w": 18, + "h": 18 + }, + "frame": { + "x": 250, + "y": 312, + "w": 18, + "h": 18 + } + }, { "filename": "wl_elixir", "rotated": false, @@ -6954,54 +6996,12 @@ "h": 18 }, "frame": { - "x": 348, - "y": 306, + "x": 254, + "y": 276, "w": 20, "h": 18 } }, - { - "filename": "aerodactylite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 368, - "y": 316, - "w": 16, - "h": 16 - } - }, - { - "filename": "light_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 18, - "h": 18 - }, - "frame": { - "x": 384, - "y": 325, - "w": 18, - "h": 18 - } - }, { "filename": "wl_ether", "rotated": false, @@ -7017,8 +7017,8 @@ "h": 18 }, "frame": { - "x": 402, - "y": 335, + "x": 258, + "y": 330, "w": 20, "h": 18 } @@ -7038,33 +7038,12 @@ "h": 18 }, "frame": { - "x": 269, - "y": 309, + "x": 260, + "y": 348, "w": 20, "h": 18 } }, - { - "filename": "toxic_orb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 18, - "h": 18 - }, - "frame": { - "x": 289, - "y": 309, - "w": 18, - "h": 18 - } - }, { "filename": "wl_full_restore", "rotated": false, @@ -7080,8 +7059,8 @@ "h": 18 }, "frame": { - "x": 307, - "y": 308, + "x": 261, + "y": 366, "w": 20, "h": 18 } @@ -7101,8 +7080,8 @@ "h": 18 }, "frame": { - "x": 209, - "y": 326, + "x": 268, + "y": 294, "w": 20, "h": 18 } @@ -7122,8 +7101,8 @@ "h": 18 }, "frame": { - "x": 229, - "y": 326, + "x": 268, + "y": 312, "w": 20, "h": 18 } @@ -7143,8 +7122,8 @@ "h": 18 }, "frame": { - "x": 249, - "y": 326, + "x": 274, + "y": 276, "w": 20, "h": 18 } @@ -7164,8 +7143,8 @@ "h": 18 }, "frame": { - "x": 269, - "y": 327, + "x": 278, + "y": 330, "w": 20, "h": 18 } @@ -7185,8 +7164,8 @@ "h": 18 }, "frame": { - "x": 289, - "y": 327, + "x": 280, + "y": 348, "w": 20, "h": 18 } @@ -7206,8 +7185,8 @@ "h": 18 }, "frame": { - "x": 309, - "y": 326, + "x": 281, + "y": 366, "w": 20, "h": 18 } @@ -7227,8 +7206,8 @@ "h": 18 }, "frame": { - "x": 329, - "y": 324, + "x": 270, + "y": 384, "w": 20, "h": 18 } @@ -7248,8 +7227,8 @@ "h": 18 }, "frame": { - "x": 189, - "y": 329, + "x": 290, + "y": 384, "w": 20, "h": 18 } @@ -7269,8 +7248,8 @@ "h": 18 }, "frame": { - "x": 189, - "y": 347, + "x": 279, + "y": 402, "w": 20, "h": 18 } @@ -7290,8 +7269,8 @@ "h": 18 }, "frame": { - "x": 209, - "y": 344, + "x": 299, + "y": 402, "w": 20, "h": 18 } @@ -7311,8 +7290,8 @@ "h": 18 }, "frame": { - "x": 189, - "y": 365, + "x": 288, + "y": 294, "w": 20, "h": 18 } @@ -7332,8 +7311,8 @@ "h": 18 }, "frame": { - "x": 229, - "y": 344, + "x": 288, + "y": 312, "w": 20, "h": 18 } @@ -7353,8 +7332,8 @@ "h": 18 }, "frame": { - "x": 249, - "y": 344, + "x": 294, + "y": 276, "w": 20, "h": 18 } @@ -7374,12 +7353,33 @@ "h": 18 }, "frame": { - "x": 209, - "y": 362, + "x": 298, + "y": 330, "w": 20, "h": 18 } }, + { + "filename": "aerodactylite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 300, + "y": 348, + "w": 16, + "h": 16 + } + }, { "filename": "aggronite", "rotated": false, @@ -7395,8 +7395,8 @@ "h": 16 }, "frame": { - "x": 349, - "y": 324, + "x": 301, + "y": 364, "w": 16, "h": 16 } @@ -7416,8 +7416,8 @@ "h": 16 }, "frame": { - "x": 269, - "y": 345, + "x": 308, + "y": 294, "w": 16, "h": 16 } @@ -7437,8 +7437,8 @@ "h": 16 }, "frame": { - "x": 229, - "y": 362, + "x": 308, + "y": 310, "w": 16, "h": 16 } @@ -7458,8 +7458,8 @@ "h": 16 }, "frame": { - "x": 285, - "y": 345, + "x": 310, + "y": 380, "w": 16, "h": 16 } @@ -7479,8 +7479,8 @@ "h": 16 }, "frame": { - "x": 245, - "y": 362, + "x": 316, + "y": 348, "w": 16, "h": 16 } @@ -7500,8 +7500,8 @@ "h": 16 }, "frame": { - "x": 301, - "y": 345, + "x": 317, + "y": 364, "w": 16, "h": 16 } @@ -7521,8 +7521,8 @@ "h": 16 }, "frame": { - "x": 317, - "y": 344, + "x": 326, + "y": 380, "w": 16, "h": 16 } @@ -7542,8 +7542,8 @@ "h": 16 }, "frame": { - "x": 333, - "y": 342, + "x": 319, + "y": 396, "w": 16, "h": 16 } @@ -7563,8 +7563,8 @@ "h": 16 }, "frame": { - "x": 349, - "y": 340, + "x": 335, + "y": 396, "w": 16, "h": 16 } @@ -7584,8 +7584,8 @@ "h": 16 }, "frame": { - "x": 365, - "y": 332, + "x": 256, + "y": 255, "w": 16, "h": 16 } @@ -7605,8 +7605,8 @@ "h": 16 }, "frame": { - "x": 261, - "y": 362, + "x": 272, + "y": 255, "w": 16, "h": 16 } @@ -7626,8 +7626,8 @@ "h": 16 }, "frame": { - "x": 277, - "y": 361, + "x": 288, + "y": 255, "w": 16, "h": 16 } @@ -7647,8 +7647,8 @@ "h": 16 }, "frame": { - "x": 293, - "y": 361, + "x": 304, + "y": 255, "w": 16, "h": 16 } @@ -7668,8 +7668,8 @@ "h": 16 }, "frame": { - "x": 365, - "y": 348, + "x": 320, + "y": 257, "w": 16, "h": 16 } @@ -7689,8 +7689,8 @@ "h": 16 }, "frame": { - "x": 381, - "y": 343, + "x": 314, + "y": 273, "w": 16, "h": 16 } @@ -7709,6 +7709,447 @@ "w": 16, "h": 16 }, + "frame": { + "x": 318, + "y": 326, + "w": 16, + "h": 16 + } + }, + { + "filename": "gengarite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 330, + "y": 274, + "w": 16, + "h": 16 + } + }, + { + "filename": "glalitite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 346, + "y": 274, + "w": 16, + "h": 16 + } + }, + { + "filename": "gyaradosite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 362, + "y": 276, + "w": 16, + "h": 16 + } + }, + { + "filename": "heracronite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 324, + "y": 290, + "w": 16, + "h": 16 + } + }, + { + "filename": "houndoominite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 324, + "y": 306, + "w": 16, + "h": 16 + } + }, + { + "filename": "kangaskhanite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 340, + "y": 290, + "w": 16, + "h": 16 + } + }, + { + "filename": "latiasite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 340, + "y": 306, + "w": 16, + "h": 16 + } + }, + { + "filename": "latiosite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 334, + "y": 322, + "w": 16, + "h": 16 + } + }, + { + "filename": "lopunnite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 356, + "y": 292, + "w": 16, + "h": 16 + } + }, + { + "filename": "lucarionite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 356, + "y": 308, + "w": 16, + "h": 16 + } + }, + { + "filename": "manectite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 350, + "y": 324, + "w": 16, + "h": 16 + } + }, + { + "filename": "mawilite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 372, + "y": 292, + "w": 16, + "h": 16 + } + }, + { + "filename": "medichamite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 372, + "y": 308, + "w": 16, + "h": 16 + } + }, + { + "filename": "metagrossite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 366, + "y": 324, + "w": 16, + "h": 16 + } + }, + { + "filename": "mewtwonite_x", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 334, + "y": 338, + "w": 16, + "h": 16 + } + }, + { + "filename": "mewtwonite_y", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 350, + "y": 340, + "w": 16, + "h": 16 + } + }, + { + "filename": "nugget", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 366, + "y": 340, + "w": 16, + "h": 16 + } + }, + { + "filename": "pidgeotite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 382, + "y": 324, + "w": 16, + "h": 16 + } + }, + { + "filename": "pinsirite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 382, + "y": 340, + "w": 16, + "h": 16 + } + }, + { + "filename": "rayquazite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 333, + "y": 354, + "w": 16, + "h": 16 + } + }, + { + "filename": "sablenite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, "frame": { "x": 349, "y": 356, @@ -7716,447 +8157,6 @@ "h": 16 } }, - { - "filename": "gengarite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 333, - "y": 358, - "w": 16, - "h": 16 - } - }, - { - "filename": "glalitite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 317, - "y": 360, - "w": 16, - "h": 16 - } - }, - { - "filename": "gyaradosite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 365, - "y": 364, - "w": 16, - "h": 16 - } - }, - { - "filename": "heracronite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 381, - "y": 359, - "w": 16, - "h": 16 - } - }, - { - "filename": "houndoominite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 397, - "y": 353, - "w": 16, - "h": 16 - } - }, - { - "filename": "kangaskhanite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 349, - "y": 372, - "w": 16, - "h": 16 - } - }, - { - "filename": "latiasite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 333, - "y": 374, - "w": 16, - "h": 16 - } - }, - { - "filename": "latiosite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 365, - "y": 380, - "w": 16, - "h": 16 - } - }, - { - "filename": "lopunnite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 381, - "y": 375, - "w": 16, - "h": 16 - } - }, - { - "filename": "lucarionite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 397, - "y": 369, - "w": 16, - "h": 16 - } - }, - { - "filename": "manectite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 349, - "y": 388, - "w": 16, - "h": 16 - } - }, - { - "filename": "mawilite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 365, - "y": 396, - "w": 16, - "h": 16 - } - }, - { - "filename": "medichamite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 381, - "y": 391, - "w": 16, - "h": 16 - } - }, - { - "filename": "metagrossite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 381, - "y": 407, - "w": 16, - "h": 16 - } - }, - { - "filename": "mewtwonite_x", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 397, - "y": 385, - "w": 16, - "h": 16 - } - }, - { - "filename": "mewtwonite_y", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 397, - "y": 401, - "w": 16, - "h": 16 - } - }, - { - "filename": "nugget", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 200, - "y": 383, - "w": 16, - "h": 16 - } - }, - { - "filename": "pidgeotite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 201, - "y": 399, - "w": 16, - "h": 16 - } - }, - { - "filename": "pinsirite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 216, - "y": 380, - "w": 16, - "h": 16 - } - }, - { - "filename": "rayquazite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 232, - "y": 378, - "w": 16, - "h": 16 - } - }, - { - "filename": "sablenite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 248, - "y": 378, - "w": 16, - "h": 16 - } - }, { "filename": "salamencite", "rotated": false, @@ -8172,8 +8172,8 @@ "h": 16 }, "frame": { - "x": 264, - "y": 378, + "x": 365, + "y": 356, "w": 16, "h": 16 } @@ -8193,8 +8193,8 @@ "h": 16 }, "frame": { - "x": 280, - "y": 377, + "x": 381, + "y": 356, "w": 16, "h": 16 } @@ -8214,8 +8214,8 @@ "h": 16 }, "frame": { - "x": 296, - "y": 377, + "x": 388, + "y": 301, "w": 16, "h": 16 } @@ -8235,8 +8235,8 @@ "h": 16 }, "frame": { - "x": 217, - "y": 396, + "x": 404, + "y": 301, "w": 16, "h": 16 } @@ -8256,8 +8256,8 @@ "h": 16 }, "frame": { - "x": 233, - "y": 394, + "x": 398, + "y": 317, "w": 16, "h": 16 } @@ -8277,8 +8277,8 @@ "h": 16 }, "frame": { - "x": 249, - "y": 394, + "x": 398, + "y": 333, "w": 16, "h": 16 } @@ -8298,8 +8298,8 @@ "h": 16 }, "frame": { - "x": 265, - "y": 394, + "x": 398, + "y": 349, "w": 16, "h": 16 } @@ -8319,12 +8319,33 @@ "h": 16 }, "frame": { - "x": 281, - "y": 393, + "x": 397, + "y": 365, "w": 16, "h": 16 } }, + { + "filename": "prism_scale", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 9, + "y": 8, + "w": 15, + "h": 15 + }, + "frame": { + "x": 342, + "y": 381, + "w": 15, + "h": 15 + } + }, { "filename": "swampertite", "rotated": false, @@ -8340,8 +8361,8 @@ "h": 16 }, "frame": { - "x": 297, - "y": 393, + "x": 357, + "y": 372, "w": 16, "h": 16 } @@ -8361,8 +8382,8 @@ "h": 16 }, "frame": { - "x": 312, - "y": 376, + "x": 373, + "y": 372, "w": 16, "h": 16 } @@ -8382,8 +8403,8 @@ "h": 16 }, "frame": { - "x": 313, - "y": 392, + "x": 357, + "y": 388, "w": 16, "h": 16 } @@ -8394,6 +8415,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:b317e2cd3502364fcdae296cd439ac4d:ae80196191516a8cb098a8467c6faa2f:110e074689c9edd2c54833ce2e4d9270$" + "smartupdate": "$TexturePacker:SmartUpdate:e5b40a9bd9ade8242224592e0116a6b0:0100946d64a1651a631f504350fdf3eb:110e074689c9edd2c54833ce2e4d9270$" } } diff --git a/public/images/items.png b/public/images/items.png index 831576e45affc29df3eeeba1d8883932f9f2bcfb..f68b96c1975ec192f58c7fa3aa4851e5d5a3ec74 100644 GIT binary patch literal 55976 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%0D7hw8k3jmZloeg~@u>eOjQL{P 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­FG{?GS`Nk>_yiW4eE-~s*gTDA{ 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 diff --git a/src/data/mystery-encounters/encounters/absolute-avarice-encounter.ts b/src/data/mystery-encounters/encounters/absolute-avarice-encounter.ts index 2c8bf2d70cd..2b379bdba86 100644 --- a/src/data/mystery-encounters/encounters/absolute-avarice-encounter.ts +++ b/src/data/mystery-encounters/encounters/absolute-avarice-encounter.ts @@ -301,6 +301,7 @@ export const AbsoluteAvariceEncounter: IMysteryEncounter = } }); + transitionMysteryEncounterIntroVisuals(scene, true, true, 500); leaveEncounterWithoutBattle(scene, true); }) .build() @@ -331,6 +332,7 @@ export const AbsoluteAvariceEncounter: IMysteryEncounter = greedent.moveset = [new PokemonMove(Moves.THRASH), new PokemonMove(Moves.BODY_PRESS), new PokemonMove(Moves.STUFF_CHEEKS), new PokemonMove(Moves.SLACK_OFF)]; greedent.passive = true; + transitionMysteryEncounterIntroVisuals(scene, true, true, 500); await catchPokemon(scene, greedent, null, PokeballType.POKEBALL, false); leaveEncounterWithoutBattle(scene, true); }) diff --git a/src/data/mystery-encounters/encounters/safari-zone-encounter.ts b/src/data/mystery-encounters/encounters/safari-zone-encounter.ts index f9d4e487ab3..7ca2e991305 100644 --- a/src/data/mystery-encounters/encounters/safari-zone-encounter.ts +++ b/src/data/mystery-encounters/encounters/safari-zone-encounter.ts @@ -4,7 +4,7 @@ import BattleScene from "#app/battle-scene"; import IMysteryEncounter, { MysteryEncounterBuilder } from "../mystery-encounter"; import MysteryEncounterOption, { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; import { TrainerSlot } from "#app/data/trainer-config"; -import { ScanIvsPhase, SummonPhase, VictoryPhase } from "#app/phases"; +import { ScanIvsPhase, SummonPhase } from "#app/phases"; import { HiddenAbilityRateBoosterModifier, IvScannerModifier } from "#app/modifier/modifier"; import { EnemyPokemon } from "#app/field/pokemon"; import { PokeballType } from "#app/data/pokeball"; @@ -136,7 +136,6 @@ const safariZoneGameOptions: MysteryEncounterOption[] = [ if (catchResult) { // You caught pokemon - scene.unshiftPhase(new VictoryPhase(scene, 0)); // Check how many safari pokemon left if (scene.currentBattle.mysteryEncounter.misc.safariPokemonRemaining > 0) { await summonSafariPokemon(scene); diff --git a/src/data/mystery-encounters/utils/encounter-phase-utils.ts b/src/data/mystery-encounters/utils/encounter-phase-utils.ts index 8287b664410..9fa24106417 100644 --- a/src/data/mystery-encounters/utils/encounter-phase-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-phase-utils.ts @@ -605,7 +605,13 @@ export function leaveEncounterWithoutBattle(scene: BattleScene, addHealPhase: bo handleMysteryEncounterVictory(scene, addHealPhase); } -export function handleMysteryEncounterVictory(scene: BattleScene, addHealPhase: boolean = false) { +/** + * + * @param scene + * @param addHealPhase - Adds an empty shop phase to allow player to purchase healing items + * @param doNotContinue - default `false`. If set to true, will not end the battle and continue to next wave + */ +export function handleMysteryEncounterVictory(scene: BattleScene, addHealPhase: boolean = false, doNotContinue: boolean = false) { const allowedPkm = scene.getParty().filter((pkm) => pkm.isAllowedInBattle()); if (allowedPkm.length === 0) { @@ -616,7 +622,7 @@ export function handleMysteryEncounterVictory(scene: BattleScene, addHealPhase: // If in repeated encounter variant, do nothing // Variant must eventually be swapped in order to handle "true" end of the encounter - if (scene.currentBattle.mysteryEncounter.encounterMode === MysteryEncounterMode.CONTINUOUS_ENCOUNTER) { + if (scene.currentBattle.mysteryEncounter.encounterMode === MysteryEncounterMode.CONTINUOUS_ENCOUNTER || doNotContinue) { return; } else if (scene.currentBattle.mysteryEncounter.encounterMode === MysteryEncounterMode.NO_BATTLE) { scene.pushPhase(new EggLapsePhase(scene)); diff --git a/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts b/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts index a11e65c5c54..edfb72e6611 100644 --- a/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts @@ -437,8 +437,17 @@ function failCatch(scene: BattleScene, pokemon: EnemyPokemon, originalY: number, }); } +/** + * + * @param scene + * @param pokemon + * @param pokeball + * @param pokeballType + * @param showCatchObtainMessage + * @param isObtain + */ export async function catchPokemon(scene: BattleScene, pokemon: EnemyPokemon, pokeball: Phaser.GameObjects.Sprite, pokeballType: PokeballType, showCatchObtainMessage: boolean = true, isObtain: boolean = false): Promise { - scene.unshiftPhase(new VictoryPhase(scene, BattlerIndex.ENEMY)); + scene.unshiftPhase(new VictoryPhase(scene, BattlerIndex.ENEMY, true)); const speciesForm = !pokemon.fusionSpecies ? pokemon.getSpeciesForm() : pokemon.getFusionSpeciesForm(); diff --git a/src/overrides.ts b/src/overrides.ts index 0133d9a10fe..1196797fac0 100644 --- a/src/overrides.ts +++ b/src/overrides.ts @@ -10,7 +10,6 @@ import { VariantTier } from "#enums/variant-tiers"; import { WeatherType } from "#enums/weather-type"; import { type PokeballCounts } from "./battle-scene"; import { Gender } from "./data/gender"; -import { allSpecies } from "./data/pokemon-species"; // eslint-disable-line @typescript-eslint/no-unused-vars import { Variant } from "./data/variant"; import { type ModifierOverride, type ModifierTypeKeys } from "./modifier/modifier-type"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; diff --git a/src/phases.ts b/src/phases.ts index 95231ae7ec6..7f2933a738a 100644 --- a/src/phases.ts +++ b/src/phases.ts @@ -1787,9 +1787,9 @@ export class SwitchSummonPhase extends SummonPhase { } // TODO: maybe remove this? Not sure if still necessary - if (!pokemon.isActive() || !pokemon.isOnField()) { - this.switchAndSummon(); - } + // if (!pokemon.isActive() || !pokemon.isOnField()) { + // this.switchAndSummon(); + // } this.scene.ui.showText(this.player ? i18next.t("battle:playerComeBack", { pokemonName: getPokemonNameWithAffix(pokemon) }) : @@ -4081,8 +4081,13 @@ export class FaintPhase extends PokemonPhase { } export class VictoryPhase extends PokemonPhase { - constructor(scene: BattleScene, battlerIndex: BattlerIndex) { + /** If true, indicates that the phase is intended for EXP purposes only, and not to continue a battle to next phase */ + isExpOnly: boolean; + + constructor(scene: BattleScene, battlerIndex: BattlerIndex, isExpOnly: boolean = false) { super(scene, battlerIndex); + + this.isExpOnly = isExpOnly; } start() { @@ -4176,7 +4181,7 @@ export class VictoryPhase extends PokemonPhase { } if (this.scene.currentBattle.battleType === BattleType.MYSTERY_ENCOUNTER) { - handleMysteryEncounterVictory(this.scene); + handleMysteryEncounterVictory(this.scene, false, this.isExpOnly); this.end(); return; } From c9aab45b947e830597d4b5a86441d050be28a19e Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Mon, 29 Jul 2024 19:03:53 -0400 Subject: [PATCH 225/270] update visuals loading for safari and stat trainer visuals --- .../mystery-encounters/safari_zone.json | 41 ++ .../images/mystery-encounters/safari_zone.png | Bin 0 -> 1443 bytes public/images/trainer/buck.json | 272 ++++++++++ public/images/trainer/buck.png | Bin 0 -> 1398 bytes public/images/trainer/cheryl.json | 398 +++++++++++++++ public/images/trainer/cheryl.png | Bin 0 -> 1971 bytes public/images/trainer/marley.json | 104 ++++ public/images/trainer/marley.png | Bin 0 -> 1206 bytes public/images/trainer/mira.json | 482 ++++++++++++++++++ public/images/trainer/mira.png | Bin 0 -> 1739 bytes public/images/trainer/riley.json | 461 +++++++++++++++++ public/images/trainer/riley.png | Bin 0 -> 1337 bytes src/data/dialogue.ts | 70 +++ .../encounters/a-trainers-test-encounter.ts | 168 ++++++ .../encounters/absolute-avarice-encounter.ts | 28 +- .../encounters/delibirdy-encounter.ts | 15 +- .../department-store-sale-encounter.ts | 5 +- .../encounters/fiery-fallout-encounter.ts | 14 +- .../encounters/fight-or-flight-encounter.ts | 19 +- .../encounters/lost-at-sea-encounter.ts | 2 +- .../encounters/pokemon-salesman-encounter.ts | 11 +- .../encounters/safari-zone-encounter.ts | 12 +- .../slumbering-snorlax-encounter.ts | 4 +- .../encounters/the-strong-stuff-encounter.ts | 4 +- .../mystery-encounters/mystery-encounter.ts | 18 +- .../mystery-encounters/mystery-encounters.ts | 3 + .../utils/encounter-phase-utils.ts | 2 +- .../utils/encounter-pokemon-utils.ts | 16 +- src/data/trainer-config.ts | 195 ++++++- src/enums/mystery-encounter-type.ts | 3 +- src/enums/trainer-type.ts | 5 + src/field/mystery-encounter-intro.ts | 25 +- src/locales/en/dialogue.ts | 61 +++ src/locales/en/trainers.ts | 5 + src/overrides.ts | 4 +- src/phases.ts | 31 +- 36 files changed, 2401 insertions(+), 77 deletions(-) create mode 100644 public/images/mystery-encounters/safari_zone.json create mode 100644 public/images/mystery-encounters/safari_zone.png create mode 100644 public/images/trainer/buck.json create mode 100644 public/images/trainer/buck.png create mode 100644 public/images/trainer/cheryl.json create mode 100644 public/images/trainer/cheryl.png create mode 100644 public/images/trainer/marley.json create mode 100644 public/images/trainer/marley.png create mode 100644 public/images/trainer/mira.json create mode 100644 public/images/trainer/mira.png create mode 100644 public/images/trainer/riley.json create mode 100644 public/images/trainer/riley.png create mode 100644 src/data/mystery-encounters/encounters/a-trainers-test-encounter.ts diff --git a/public/images/mystery-encounters/safari_zone.json b/public/images/mystery-encounters/safari_zone.json new file mode 100644 index 00000000000..f0c23d43f5a --- /dev/null +++ b/public/images/mystery-encounters/safari_zone.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "safarizone.png", + "format": "RGBA8888", + "size": { + "w": 105, + "h": 83 + }, + "scale": 1, + "frames": [ + { + "filename": "safarizone.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 103, + "h": 81 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 103, + "h": 81 + }, + "frame": { + "x": 1, + "y": 1, + "w": 103, + "h": 81 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:f07e2d44900011048b658765e193a86c:3d91036b9c3943256dd1e4712042ec59:d467a15bea042bd0d310f1cce7d9791f$" + } +} diff --git a/public/images/mystery-encounters/safari_zone.png b/public/images/mystery-encounters/safari_zone.png new file mode 100644 index 0000000000000000000000000000000000000000..03c32d1b955df0ce5a33433072e9b08880c61357 GIT binary patch literal 1443 zcmV;U1zh@xP)q#JlHxAnBYt7FbfEd$HX1PvtO$A z1z4Y=hx51u+N_h7U|EqWNvt!ZTob(X+)UyUhfboCB!K1dSh(6HdHS8RBt)#K$K(Eh zdUVkDlFVjWo)sSVrIwcac~W(fN^k9jPBzmS+(GNFT^ zyXJO1mS;(sYM=$`+yaAVNqO3PiD&5-IPI>JB%W>&W*IM}CrUf}Jvh`)pZwEr#wFquIfIDfv|e&DCX|N|_o+{Ee8yl+zRc%YpAnT0Hs5T0(hyZHKo=nd&4I zN&d=Ni6o@7E0L`O5)zYAv8WPCP)Ig&lvlo$NVGkPR~)|h%MTnxu#f_olqn>eb0ndJ z6yB3CiG*B0s3e&rK~)l0SQU-@Ktei0lA;(%x>tz;#rGsqiCn@;;)zVct%O<*A>yZ! z2iHm*R4-AHI3zqQ@xq`%H4?hykk_8K$QKetJ5op%ODl2iD#^B)=wjHBNF`E9gNj=z zdPuQ}i2>i*qJJYaQhF|>5Iu@U(sGDv=UP5|{u%9#g-PkPBtcaYS}pkMfW0*9ba~M+ z689urCF!X;CXuY}qO4wxggh6weO~SI(<%vPGAW28%brM7dJ22VT8Rdd9rOJ4TT+l2 zOHW~yJ-N2bqE(_=!Xnv`a%nB_a^_`;)@3G@j;SQtkwnw-Q>ktx z?e1C%^jyLskXq9uy@^40%SA$y zaFt>&@%`hrm3oOPDK(NcOptDp*-WC1BtZeStrTl1Z6xX>7s{hbC`X;5ZOJ7luoJCi zb|j^z64sKOdrXpTj$I7;*#mqxL`8~Q3B8Vsq}Pv6B-uUtH6~J#bdOR=h`vTVm+S(t zOost2M5t~J==)6ezLsVchf-d5~q{R3G`rQo|9Y8C(h002ovPDHLkV1mfeo)Q26 literal 0 HcmV?d00001 diff --git a/public/images/trainer/buck.json b/public/images/trainer/buck.json new file mode 100644 index 00000000000..2088fa084f1 --- /dev/null +++ b/public/images/trainer/buck.json @@ -0,0 +1,272 @@ +{ + "textures": [ + { + "image": "buck.png", + "format": "RGBA8888", + "size": { + "w": 120, + "h": 78 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 33, + "y": 4, + "w": 35, + "h": 76 + }, + "frame": { + "x": 1, + "y": 1, + "w": 35, + "h": 76 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 33, + "y": 4, + "w": 35, + "h": 76 + }, + "frame": { + "x": 1, + "y": 1, + "w": 35, + "h": 76 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 33, + "y": 4, + "w": 35, + "h": 76 + }, + "frame": { + "x": 1, + "y": 1, + "w": 35, + "h": 76 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 33, + "y": 4, + "w": 35, + "h": 76 + }, + "frame": { + "x": 1, + "y": 1, + "w": 35, + "h": 76 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 18, + "y": 8, + "w": 44, + "h": 72 + }, + "frame": { + "x": 38, + "y": 1, + "w": 44, + "h": 72 + } + }, + { + "filename": "00010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 15, + "y": 8, + "w": 44, + "h": 72 + }, + "frame": { + "x": 38, + "y": 1, + "w": 44, + "h": 72 + } + }, + { + "filename": "00011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 13, + "y": 8, + "w": 44, + "h": 72 + }, + "frame": { + "x": 38, + "y": 1, + "w": 44, + "h": 72 + } + }, + { + "filename": "0000.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 34, + "y": 5, + "w": 35, + "h": 75 + }, + "frame": { + "x": 84, + "y": 1, + "w": 35, + "h": 75 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 34, + "y": 5, + "w": 35, + "h": 75 + }, + "frame": { + "x": 84, + "y": 1, + "w": 35, + "h": 75 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 34, + "y": 5, + "w": 35, + "h": 75 + }, + "frame": { + "x": 84, + "y": 1, + "w": 35, + "h": 75 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 34, + "y": 5, + "w": 35, + "h": 75 + }, + "frame": { + "x": 84, + "y": 1, + "w": 35, + "h": 75 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 34, + "y": 5, + "w": 35, + "h": 75 + }, + "frame": { + "x": 84, + "y": 1, + "w": 35, + "h": 75 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:bedd2f8769ba9b1430dc6479e53194f2:49cc02f839fd834c23053d7c92ce9e20:3347efe478119141b0e3e6eccdecd0f5$" + } +} diff --git a/public/images/trainer/buck.png b/public/images/trainer/buck.png new file mode 100644 index 0000000000000000000000000000000000000000..2384fb42a3369b69213b8d718aa1b9db15b965c7 GIT binary patch literal 1398 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 literal 0 HcmV?d00001 diff --git a/public/images/trainer/riley.json b/public/images/trainer/riley.json new file mode 100644 index 00000000000..e29f6e02e24 --- /dev/null +++ b/public/images/trainer/riley.json @@ -0,0 +1,461 @@ +{ + "textures": [ + { + "image": "riley.png", + "format": "RGBA8888", + "size": { + "w": 59, + "h": 246 + }, + "scale": 1, + "frames": [ + { + "filename": "0000.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 10, + "y": 0, + "w": 57, + "h": 80 + }, + "frame": { + "x": 1, + "y": 1, + "w": 57, + "h": 80 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 9, + "y": 0, + "w": 57, + "h": 80 + }, + "frame": { + "x": 1, + "y": 1, + "w": 57, + "h": 80 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 10, + "y": 0, + "w": 57, + "h": 80 + }, + "frame": { + "x": 1, + "y": 1, + "w": 57, + "h": 80 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 10, + "y": 0, + "w": 57, + "h": 80 + }, + "frame": { + "x": 1, + "y": 1, + "w": 57, + "h": 80 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 10, + "y": 0, + "w": 57, + "h": 80 + }, + "frame": { + "x": 1, + "y": 1, + "w": 57, + "h": 80 + } + }, + { + "filename": "00010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 10, + "y": 0, + "w": 57, + "h": 80 + }, + "frame": { + "x": 1, + "y": 1, + "w": 57, + "h": 80 + } + }, + { + "filename": "00012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 10, + "y": 0, + "w": 57, + "h": 80 + }, + "frame": { + "x": 1, + "y": 1, + "w": 57, + "h": 80 + } + }, + { + "filename": "00014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 10, + "y": 0, + "w": 57, + "h": 80 + }, + "frame": { + "x": 1, + "y": 1, + "w": 57, + "h": 80 + } + }, + { + "filename": "00016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 10, + "y": 0, + "w": 57, + "h": 80 + }, + "frame": { + "x": 1, + "y": 1, + "w": 57, + "h": 80 + } + }, + { + "filename": "00018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 10, + "y": 0, + "w": 57, + "h": 80 + }, + "frame": { + "x": 1, + "y": 1, + "w": 57, + "h": 80 + } + }, + { + "filename": "00020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 10, + "y": 0, + "w": 57, + "h": 80 + }, + "frame": { + "x": 1, + "y": 1, + "w": 57, + "h": 80 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 11, + "y": 0, + "w": 56, + "h": 80 + }, + "frame": { + "x": 1, + "y": 83, + "w": 56, + "h": 80 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 11, + "y": 0, + "w": 56, + "h": 80 + }, + "frame": { + "x": 1, + "y": 83, + "w": 56, + "h": 80 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 11, + "y": 0, + "w": 56, + "h": 80 + }, + "frame": { + "x": 1, + "y": 83, + "w": 56, + "h": 80 + } + }, + { + "filename": "00011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 11, + "y": 0, + "w": 56, + "h": 80 + }, + "frame": { + "x": 1, + "y": 83, + "w": 56, + "h": 80 + } + }, + { + "filename": "00013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 11, + "y": 0, + "w": 56, + "h": 80 + }, + "frame": { + "x": 1, + "y": 83, + "w": 56, + "h": 80 + } + }, + { + "filename": "00015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 11, + "y": 0, + "w": 56, + "h": 80 + }, + "frame": { + "x": 1, + "y": 83, + "w": 56, + "h": 80 + } + }, + { + "filename": "00017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 11, + "y": 0, + "w": 56, + "h": 80 + }, + "frame": { + "x": 1, + "y": 83, + "w": 56, + "h": 80 + } + }, + { + "filename": "00019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 11, + "y": 0, + "w": 56, + "h": 80 + }, + "frame": { + "x": 1, + "y": 83, + "w": 56, + "h": 80 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 30, + "y": 0, + "w": 39, + "h": 80 + }, + "frame": { + "x": 1, + "y": 165, + "w": 39, + "h": 80 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 29, + "y": 0, + "w": 39, + "h": 80 + }, + "frame": { + "x": 1, + "y": 165, + "w": 39, + "h": 80 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:d0f27c1a776dc776dbc730ec409fafad:7a665e1bfee26403e5d49912c4dad042:cb98d9ba5e960a1d670368dad1073434$" + } +} diff --git a/public/images/trainer/riley.png b/public/images/trainer/riley.png new file mode 100644 index 0000000000000000000000000000000000000000..dd5d3bdd8c9953bb32b87d1ea44842b7d73fba85 GIT binary patch literal 1337 zcmV-91;+Y`P)6aJ|Og8UO$Q0d!JM zQvg8b*k%9#010qNS#tmY3ljhU3ljkVnw%H_00gB;L_t(&-tC(0mYg6AKuJJ%Se$wP z$88csQ9%j2KiX3`+taN(cN4>ha*Huf%~CU+?FX#2(=;K_cl5`p$w_GI3|LU0)84>= zRj@gVfEv``o-$I>7IiGqxHkTWg97e-fd$-~i#H7g(7*i+>uiN2j=%zob`LmB7E1XF z9L_M^;9g}0xn4y$_%~Gg$2x>>$)H##AGpzPKB5#2=_`E05?nx+{d~`uK*oJWL(GzY zCAbjY5adcRE`8Bm1NEle%M1|sGPrlSPz(nNObLLbnkF3>kgL?7Tqr5?nqsPtbL(_t znEC*uvr8~|xk1c^zN7Ky;(c=+9*3{Q-ui|{GW8Cn%EfLQ{~69>|LY5+wN9Tbdq?nx z(4d%o8%`{Ks23b4XcKd%in%~x=`RgzI5yuhp@CS`!Hy;_mkU44T2f9Y&y;rwAxvT%2yJuG!nD?4AJ(8OqsOCOxC?A$zc!Snseps?A<&TeTTfJks00mjk?mn>MSNq-6;UWQ7zoYBO+2 zo0aQCEH%iwVb^Aky%}q>f^y@G7mm9G5B5bv_^i#|G#(L($}PqXi@>oq(?y$A7XwK- zEL3lZ1-fXnnsSpegD6H!)xB!7igJt2Ev~;dbxwyilWon~u^rkh^JYET%nWTdwAs*R zLz@k4HniE$W<#3|Z8o&o&}KuM4Q=+HX)}HR_1dl}L?}518G(@xqfSD{f|1hxvHGtoE8M=`8FLeD;5}<4w#)$*38&?!0f_W+4E@*m~As4`fb@i=}cL6?6Aj_ znSv?nIH0zfGE|8pQDwU+Q*NgK52j41GmfUrYC^-olxfTWwSy^Jx1p`@!IY& { + const encounter = scene.currentBattle.mysteryEncounter; + + // Randomly pick from 1 of the 5 stat trainers to spawn + let trainerType: TrainerType; + let spriteKeys; + switch (randSeedInt(5)) { + default: + case 0: + trainerType = TrainerType.BUCK; + spriteKeys = getSpriteKeysFromSpecies(Species.CLAYDOL); + break; + case 1: + trainerType = TrainerType.CHERYL; + spriteKeys = getSpriteKeysFromSpecies(Species.BLISSEY); + break; + case 2: + trainerType = TrainerType.MARLEY; + spriteKeys = getSpriteKeysFromSpecies(Species.ARCANINE); + break; + case 3: + trainerType = TrainerType.MIRA; + spriteKeys = getSpriteKeysFromSpecies(Species.ALAKAZAM, false, 1); + break; + case 4: + trainerType = TrainerType.RILEY; + spriteKeys = getSpriteKeysFromSpecies(Species.LUCARIO, false, 1); + break; + } + + encounter.misc = { trainerType }; + const trainerConfig = trainerConfigs[trainerType].copy(); + const trainerSpriteKey = trainerConfig.getSpriteKey(); + encounter.enemyPartyConfigs.push({ + levelAdditiveMultiplier: 1, + trainerConfig: trainerConfig + }); + + encounter.spriteConfigs = [ + { + spriteKey: spriteKeys.spriteKey, + fileRoot: spriteKeys.fileRoot, + hasShadow: true, + repeat: true, + isPokemon: true + }, + { + spriteKey: trainerSpriteKey, + fileRoot: "trainer", + hasShadow: true, + disableAnimation: true + } + ]; + + return true; + }) + .withTitle(`${namespace}:title`) + .withDescription(`${namespace}:description`) + .withQuery(`${namespace}:query`) + .withSimpleOption( + { + buttonLabel: `${namespace}:option:1:label`, + buttonTooltip: `${namespace}:option:1:tooltip`, + selected: [ + { + text: `${namespace}:option:selected`, + }, + ], + }, + async (scene: BattleScene) => { + const encounter = scene.currentBattle.mysteryEncounter; + // Spawn standard trainer battle with memory mushroom reward + const config: EnemyPartyConfig = encounter.enemyPartyConfigs[0]; + + setEncounterRewards(scene, { guaranteedModifierTypeFuncs: [modifierTypes.TM_COMMON, modifierTypes.TM_GREAT, modifierTypes.MEMORY_MUSHROOM], fillRemaining: true }); + return initBattleWithEnemyConfig(scene, config); + } + ) + .withSimpleOption( + { + buttonLabel: `${namespace}:option:2:label`, + buttonTooltip: `${namespace}:option:2:tooltip`, + selected: [ + { + text: `${namespace}:option:selected`, + }, + ], + }, + async (scene: BattleScene) => { + const encounter = scene.currentBattle.mysteryEncounter; + // Spawn hard fight with ULTRA/GREAT reward (can improve with luck) + const config: EnemyPartyConfig = encounter.enemyPartyConfigs[1]; + + setEncounterRewards(scene, { guaranteedModifierTiers: [ModifierTier.ULTRA, ModifierTier.ULTRA, ModifierTier.GREAT, ModifierTier.GREAT], fillRemaining: true }); + + // Seed offsets to remove possibility of different trainers having exact same teams + let ret; + scene.executeWithSeedOffset(() => { + ret = initBattleWithEnemyConfig(scene, config); + }, scene.currentBattle.waveIndex * 100); + return ret; + } + ) + .withSimpleOption( + { + buttonLabel: `${namespace}:option:3:label`, + buttonTooltip: `${namespace}:option:3:tooltip`, + selected: [ + { + text: `${namespace}:option:selected`, + }, + ], + }, + async (scene: BattleScene) => { + const encounter = scene.currentBattle.mysteryEncounter; + // Spawn brutal fight with ROGUE/ULTRA/GREAT reward (can improve with luck) + const config: EnemyPartyConfig = encounter.enemyPartyConfigs[2]; + + // To avoid player level snowballing from picking this option + encounter.expMultiplier = 0.9; + + setEncounterRewards(scene, { guaranteedModifierTiers: [ModifierTier.ROGUE, ModifierTier.ROGUE, ModifierTier.ULTRA, ModifierTier.GREAT], fillRemaining: true }); + + // Seed offsets to remove possibility of different trainers having exact same teams + let ret; + scene.executeWithSeedOffset(() => { + ret = initBattleWithEnemyConfig(scene, config); + }, scene.currentBattle.waveIndex * 1000); + return ret; + } + ) + .withOutroDialogue([ + { + text: `${namespace}:outro`, + }, + ]) + .build(); diff --git a/src/data/mystery-encounters/encounters/absolute-avarice-encounter.ts b/src/data/mystery-encounters/encounters/absolute-avarice-encounter.ts index 2b379bdba86..bd39c586ad9 100644 --- a/src/data/mystery-encounters/encounters/absolute-avarice-encounter.ts +++ b/src/data/mystery-encounters/encounters/absolute-avarice-encounter.ts @@ -1,5 +1,5 @@ import { EnemyPartyConfig, generateModifierTypeOption, initBattleWithEnemyConfig, leaveEncounterWithoutBattle, setEncounterRewards, transitionMysteryEncounterIntroVisuals, } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import Pokemon, { PokemonMove } from "#app/field/pokemon"; +import Pokemon, { EnemyPokemon, PokemonMove } from "#app/field/pokemon"; import { BerryModifierType, modifierTypes, PokemonHeldItemModifierType } from "#app/modifier/modifier-type"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { Species } from "#enums/species"; @@ -37,18 +37,20 @@ export const AbsoluteAvariceEncounter: IMysteryEncounter = .withSceneRequirement(new PersistentModifierRequirement("BerryModifier", 4)) // Must have at least 4 berries to spawn .withIntroSpriteConfigs([ { - spriteKey: Species.GREEDENT.toString(), - fileRoot: "pokemon", - hasShadow: false, + // This sprite has the shadow + spriteKey: null, + fileRoot: null, + species: Species.GREEDENT, + hasShadow: true, + alpha: 0.001, repeat: true, x: -5 }, { - // This sprite has the shadow - spriteKey: Species.GREEDENT.toString(), - fileRoot: "pokemon", - hasShadow: true, - alpha: 0.001, + spriteKey: null, + fileRoot: null, + species: Species.GREEDENT, + hasShadow: false, repeat: true, x: -5 }, @@ -328,7 +330,7 @@ export const AbsoluteAvariceEncounter: IMysteryEncounter = // Let it have the food // Greedent joins the team, level equal to 2 below highest party member const level = getHighestLevelPlayerPokemon(scene).level - 2; - const greedent = scene.addEnemyPokemon(getPokemonSpecies(Species.GREEDENT), level, TrainerSlot.NONE, false); + const greedent = new EnemyPokemon(scene, getPokemonSpecies(Species.GREEDENT), level, TrainerSlot.NONE, false, null); greedent.moveset = [new PokemonMove(Moves.THRASH), new PokemonMove(Moves.BODY_PRESS), new PokemonMove(Moves.STUFF_CHEEKS), new PokemonMove(Moves.SLACK_OFF)]; greedent.passive = true; @@ -344,7 +346,7 @@ function doGreedentSpriteSteal(scene: BattleScene) { const shakeDelay = 50; const slideDelay = 500; - const greedentSprites = scene.currentBattle.mysteryEncounter.introVisuals.getSpriteAtIndex(0); + const greedentSprites = scene.currentBattle.mysteryEncounter.introVisuals.getSpriteAtIndex(1); scene.playSound("Follow Me"); scene.tweens.chain({ @@ -418,7 +420,7 @@ function doGreedentSpriteSteal(scene: BattleScene) { } function doGreedentEatBerries(scene: BattleScene) { - const greedentSprites = scene.currentBattle.mysteryEncounter.introVisuals.getSpriteAtIndex(0); + const greedentSprites = scene.currentBattle.mysteryEncounter.introVisuals.getSpriteAtIndex(1); let index = 1; scene.tweens.add({ targets: greedentSprites, @@ -452,7 +454,7 @@ function doBerrySpritePile(scene: BattleScene, isEat: boolean = false) { } const encounter = scene.currentBattle.mysteryEncounter; animationOrder.forEach((berry, i) => { - const introVisualsIndex = encounter.spriteConfigs.findIndex(config => config.spriteKey.includes(berry)); + const introVisualsIndex = encounter.spriteConfigs.findIndex(config => config.spriteKey?.includes(berry)); const [ sprite, tintSprite ] = encounter.introVisuals.getSpriteAtIndex(introVisualsIndex); scene.time.delayedCall(berryAddDelay * i + 400, () => { if (sprite) { diff --git a/src/data/mystery-encounters/encounters/delibirdy-encounter.ts b/src/data/mystery-encounters/encounters/delibirdy-encounter.ts index c1c3fb8c3c8..7d1e7a61035 100644 --- a/src/data/mystery-encounters/encounters/delibirdy-encounter.ts +++ b/src/data/mystery-encounters/encounters/delibirdy-encounter.ts @@ -47,23 +47,26 @@ export const DelibirdyEncounter: IMysteryEncounter = )) .withIntroSpriteConfigs([ { - spriteKey: Species.DELIBIRD.toString(), - fileRoot: "pokemon", + spriteKey: null, + fileRoot: null, + species: Species.DELIBIRD, hasShadow: true, repeat: true, startFrame: 38, scale: 0.94 }, { - spriteKey: Species.DELIBIRD.toString(), - fileRoot: "pokemon", + spriteKey: null, + fileRoot: null, + species: Species.DELIBIRD, hasShadow: true, repeat: true, scale: 1.06 }, { - spriteKey: Species.DELIBIRD.toString(), - fileRoot: "pokemon", + spriteKey: null, + fileRoot: null, + species: Species.DELIBIRD, hasShadow: true, repeat: true, startFrame: 65, 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 610b836ef9e..65873941bd5 100644 --- a/src/data/mystery-encounters/encounters/department-store-sale-encounter.ts +++ b/src/data/mystery-encounters/encounters/department-store-sale-encounter.ts @@ -32,8 +32,9 @@ export const DepartmentStoreSaleEncounter: IMysteryEncounter = x: -20, }, { - spriteKey: Species.FURFROU.toString(), - fileRoot: "pokemon", + spriteKey: null, + fileRoot: null, + species: Species.FURFROU, hasShadow: true, repeat: true, x: 30, diff --git a/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts b/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts index c7933129ff9..20d113bf940 100644 --- a/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts +++ b/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts @@ -1,5 +1,5 @@ import { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; -import { EnemyPartyConfig, generateModifierTypeOption, initBattleWithEnemyConfig, initCustomMovesForEncounter, leaveEncounterWithoutBattle, setEncounterExp, setEncounterRewards, transitionMysteryEncounterIntroVisuals } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { EnemyPartyConfig, generateModifierTypeOption, initBattleWithEnemyConfig, loadCustomMovesForEncounter, leaveEncounterWithoutBattle, setEncounterExp, setEncounterRewards, transitionMysteryEncounterIntroVisuals } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { AttackTypeBoosterModifierType, modifierTypes, } from "#app/modifier/modifier-type"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import BattleScene from "#app/battle-scene"; @@ -75,8 +75,9 @@ export const FieryFalloutEncounter: IMysteryEncounter = // Load hidden Volcarona sprites encounter.spriteConfigs = [ { - spriteKey: volcaronaSpecies.getSpriteId(false), - fileRoot: "pokemon", + spriteKey: null, + fileRoot: null, + species: Species.VOLCARONA, repeat: true, hidden: true, hasShadow: true, @@ -84,8 +85,9 @@ export const FieryFalloutEncounter: IMysteryEncounter = startFrame: 20 }, { - spriteKey: volcaronaSpecies.getSpriteId(true ), - fileRoot: "pokemon", + spriteKey: null, + fileRoot: null, + species: Species.VOLCARONA, repeat: true, hidden: true, hasShadow: true, @@ -94,7 +96,7 @@ export const FieryFalloutEncounter: IMysteryEncounter = ]; // Load animations/sfx for Volcarona moves - initCustomMovesForEncounter(scene, [Moves.FIRE_SPIN, Moves.QUIVER_DANCE]); + loadCustomMovesForEncounter(scene, [Moves.FIRE_SPIN, Moves.QUIVER_DANCE]); scene.arena.trySetWeather(WeatherType.SUNNY, true); 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 77ef97ace84..55e31406cdb 100644 --- a/src/data/mystery-encounters/encounters/fight-or-flight-encounter.ts +++ b/src/data/mystery-encounters/encounters/fight-or-flight-encounter.ts @@ -7,7 +7,7 @@ import { setEncounterRewards } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { STEALING_MOVES } from "#app/data/mystery-encounters/requirements/requirement-groups"; -import Pokemon from "#app/field/pokemon"; +import Pokemon, { EnemyPokemon } from "#app/field/pokemon"; import { ModifierTier } from "#app/modifier/modifier-tier"; import { getPartyLuckValue, @@ -27,6 +27,9 @@ import { queueEncounterMessage, showEncounterText } from "#app/data/mystery-enco import { getPokemonNameWithAffix } from "#app/messages"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; +import { TrainerSlot } from "#app/data/trainer-config"; +import { getSpriteKeysFromPokemon } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; +import PokemonData from "#app/system/pokemon-data"; /** the i18n namespace for the encounter */ const namespace = "mysteryEncounter:fightOrFlight"; @@ -53,9 +56,14 @@ export const FightOrFlightEncounter: IMysteryEncounter = // Calculate boss mon const bossSpecies = scene.arena.randomSpecies(scene.currentBattle.waveIndex, scene.currentBattle.waveIndex, 0, getPartyLuckValue(scene.getParty()), true); + const bossPokemon = new EnemyPokemon(scene, bossSpecies, scene.currentBattle.waveIndex, TrainerSlot.NONE, true, null); const config: EnemyPartyConfig = { levelAdditiveMultiplier: 1, - pokemonConfigs: [{ species: bossSpecies, isBoss: true }], + pokemonConfigs: [{ + species: bossSpecies, + dataSource: new PokemonData(bossPokemon), + isBoss: true + }], }; encounter.enemyPartyConfigs = [config]; @@ -74,7 +82,7 @@ export const FightOrFlightEncounter: IMysteryEncounter = encounter.setDialogueToken("itemName", item.type.name); encounter.misc = item; - const bossSpriteKey = bossSpecies.getSpriteId(false, bossSpecies.forms ? 0 : null, false, bossSpecies.hasVariants() ? 0 : null); + const { spriteKey, fileRoot } = getSpriteKeysFromPokemon(bossPokemon); encounter.spriteConfigs = [ { spriteKey: item.type.iconImage, @@ -87,12 +95,13 @@ export const FightOrFlightEncounter: IMysteryEncounter = disableAnimation: true }, { - spriteKey: bossSpriteKey, - fileRoot: "pokemon", + spriteKey: spriteKey, + fileRoot: fileRoot, hasShadow: true, tint: 0.25, x: -5, repeat: true, + isPokemon: true }, ]; 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 a4e47311f43..40c913584bd 100644 --- a/src/data/mystery-encounters/encounters/lost-at-sea-encounter.ts +++ b/src/data/mystery-encounters/encounters/lost-at-sea-encounter.ts @@ -31,8 +31,8 @@ export const LostAtSeaEncounter: MysteryEncounter = MysteryEncounterBuilder.with .withSceneWaveRangeRequirement(11, 179) .withIntroSpriteConfigs([ { - fileRoot: "mystery-encounters", spriteKey: "buoy", + fileRoot: "mystery-encounters", hasShadow: false, x: 20, y: 3, diff --git a/src/data/mystery-encounters/encounters/pokemon-salesman-encounter.ts b/src/data/mystery-encounters/encounters/pokemon-salesman-encounter.ts index d1750119add..b0cbb454042 100644 --- a/src/data/mystery-encounters/encounters/pokemon-salesman-encounter.ts +++ b/src/data/mystery-encounters/encounters/pokemon-salesman-encounter.ts @@ -4,7 +4,7 @@ import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import BattleScene from "#app/battle-scene"; import IMysteryEncounter, { MysteryEncounterBuilder } from "../mystery-encounter"; import { MoneyRequirement } from "../mystery-encounter-requirements"; -import { catchPokemon, getRandomSpeciesByStarterTier } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; +import { catchPokemon, getRandomSpeciesByStarterTier, getSpriteKeysFromPokemon } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; import { getPokemonSpecies, speciesStarters } from "#app/data/pokemon-species"; import { Species } from "#enums/species"; import { PokeballType } from "#app/data/pokeball"; @@ -66,17 +66,16 @@ export const PokemonSalesmanEncounter: IMysteryEncounter = // If no HA mon found or you roll 1%, give shiny Magikarp species = getPokemonSpecies(Species.MAGIKARP); const hiddenIndex = species.ability2 ? 2 : 1; - pokemon = scene.addPlayerPokemon(species, 5, hiddenIndex, species.formIndex, null, true); + pokemon = new PlayerPokemon(scene, species, 5, hiddenIndex, species.formIndex, null, true, null, null, null, null); } else { const hiddenIndex = species.ability2 ? 2 : 1; - pokemon = scene.addPlayerPokemon(species, 5, hiddenIndex, species.formIndex); + pokemon = new PlayerPokemon(scene, species, 5, hiddenIndex, species.formIndex, null, null, null, null, null, null); } - const spriteKey = pokemon.getSpriteId(); - const spriteRoot = pokemon.getSpriteAtlasPath(); + const { spriteKey, fileRoot } = getSpriteKeysFromPokemon(pokemon); encounter.spriteConfigs.push({ spriteKey: spriteKey, - fileRoot: spriteRoot, + fileRoot: fileRoot, hasShadow: true, repeat: true, isPokemon: true diff --git a/src/data/mystery-encounters/encounters/safari-zone-encounter.ts b/src/data/mystery-encounters/encounters/safari-zone-encounter.ts index 7ca2e991305..d193b5a5d00 100644 --- a/src/data/mystery-encounters/encounters/safari-zone-encounter.ts +++ b/src/data/mystery-encounters/encounters/safari-zone-encounter.ts @@ -36,12 +36,11 @@ export const SafariZoneEncounter: IMysteryEncounter = .withSceneRequirement(new MoneyRequirement(0, 2.75)) // Cost equal to 1 Max Revive .withIntroSpriteConfigs([ { - spriteKey: "chest_blue", + spriteKey: "safari_zone", fileRoot: "mystery-encounters", - hasShadow: true, + hasShadow: false, x: 4, - y: 10, - yShadow: 3 + y: 6 }, ]) .withIntroDialogue([ @@ -52,6 +51,11 @@ export const SafariZoneEncounter: IMysteryEncounter = .withTitle(`${namespace}:title`) .withDescription(`${namespace}:description`) .withQuery(`${namespace}:query`) + // .withEnterIntroVisualsFromRight(true) + // .withOnVisualsStart((scene: BattleScene) => { + // scene.setFieldScale(0.9); + // return true; + // }) .withOption(new MysteryEncounterOptionBuilder() .withOptionMode(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT) .withSceneRequirement(new MoneyRequirement(0, 2.75)) // Cost equal to 1 Max Revive diff --git a/src/data/mystery-encounters/encounters/slumbering-snorlax-encounter.ts b/src/data/mystery-encounters/encounters/slumbering-snorlax-encounter.ts index 316416e3809..dd3a2057502 100644 --- a/src/data/mystery-encounters/encounters/slumbering-snorlax-encounter.ts +++ b/src/data/mystery-encounters/encounters/slumbering-snorlax-encounter.ts @@ -7,7 +7,7 @@ import { StatusEffect } from "#app/data/status-effect"; import IMysteryEncounter, { MysteryEncounterBuilder } from "../mystery-encounter"; import { MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; import { MoveRequirement } from "../mystery-encounter-requirements"; -import { EnemyPartyConfig, EnemyPokemonConfig, initBattleWithEnemyConfig, initCustomMovesForEncounter, leaveEncounterWithoutBattle, setEncounterExp, setEncounterRewards, } from "../utils/encounter-phase-utils"; +import { EnemyPartyConfig, EnemyPokemonConfig, initBattleWithEnemyConfig, loadCustomMovesForEncounter, leaveEncounterWithoutBattle, setEncounterExp, setEncounterRewards, } from "../utils/encounter-phase-utils"; import { queueEncounterMessage } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; import { Moves } from "#enums/moves"; import { BattlerIndex } from "#app/battle"; @@ -66,7 +66,7 @@ export const SlumberingSnorlaxEncounter: IMysteryEncounter = encounter.enemyPartyConfigs = [config]; // Load animations/sfx for Snorlax fight start moves - initCustomMovesForEncounter(scene, [Moves.SNORE]); + loadCustomMovesForEncounter(scene, [Moves.SNORE]); return true; }) 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 34967112a72..f92e33683d6 100644 --- a/src/data/mystery-encounters/encounters/the-strong-stuff-encounter.ts +++ b/src/data/mystery-encounters/encounters/the-strong-stuff-encounter.ts @@ -1,4 +1,4 @@ -import { EnemyPartyConfig, generateModifierTypeOption, initBattleWithEnemyConfig, initCustomMovesForEncounter, leaveEncounterWithoutBattle, setEncounterRewards, transitionMysteryEncounterIntroVisuals } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { EnemyPartyConfig, generateModifierTypeOption, initBattleWithEnemyConfig, loadCustomMovesForEncounter, leaveEncounterWithoutBattle, setEncounterRewards, transitionMysteryEncounterIntroVisuals } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { modifierTypes, PokemonHeldItemModifierType, } from "#app/modifier/modifier-type"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import BattleScene from "#app/battle-scene"; @@ -91,7 +91,7 @@ export const TheStrongStuffEncounter: IMysteryEncounter = encounter.enemyPartyConfigs = [config]; - initCustomMovesForEncounter(scene, [Moves.GASTRO_ACID, Moves.STEALTH_ROCK]); + loadCustomMovesForEncounter(scene, [Moves.GASTRO_ACID, Moves.STEALTH_ROCK]); return true; }) diff --git a/src/data/mystery-encounters/mystery-encounter.ts b/src/data/mystery-encounters/mystery-encounter.ts index 502d84d9124..8eababcfdeb 100644 --- a/src/data/mystery-encounters/mystery-encounter.ts +++ b/src/data/mystery-encounters/mystery-encounter.ts @@ -47,6 +47,7 @@ export default interface IMysteryEncounter { encounterAnimations?: EncounterAnim[]; hideBattleIntroMessage?: boolean; autoHideIntroVisuals?: boolean; + enterIntroVisualsFromRight?: boolean; catchAllowed?: boolean; maxAllowedEncounters?: number; @@ -159,14 +160,15 @@ export default class IMysteryEncounter implements IMysteryEncounter { if (!isNullOrUndefined(encounter)) { Object.assign(this, encounter); } - this.encounterTier = !isNullOrUndefined(this.encounterTier) ? this.encounterTier : MysteryEncounterTier.COMMON; + this.encounterTier = this.encounterTier ?? MysteryEncounterTier.COMMON; this.dialogue = this.dialogue ?? {}; // Default max is 1 for ROGUE encounters, 3 for others this.maxAllowedEncounters = this.maxAllowedEncounters ?? this.encounterTier === MysteryEncounterTier.ROGUE ? 1 : 3; this.encounterMode = MysteryEncounterMode.DEFAULT; this.requirements = this.requirements ? this.requirements : []; - this.hideBattleIntroMessage = !isNullOrUndefined(this.hideBattleIntroMessage) ? this.hideBattleIntroMessage : false; - this.autoHideIntroVisuals = !isNullOrUndefined(this.autoHideIntroVisuals) ? this.autoHideIntroVisuals : true; + this.hideBattleIntroMessage = this.hideBattleIntroMessage ?? false; + this.autoHideIntroVisuals = this.autoHideIntroVisuals ?? true; + this.enterIntroVisualsFromRight = this.enterIntroVisualsFromRight ?? false; // Reset any dirty flags or encounter data this.startOfBattleEffectsComplete = false; @@ -414,6 +416,7 @@ export class MysteryEncounterBuilder implements Partial { hideBattleIntroMessage?: boolean; hideIntroVisuals?: boolean; + enterIntroVisualsFromRight?: boolean; enemyPartyConfigs?: EnemyPartyConfig[] = []; /** @@ -717,6 +720,15 @@ export class MysteryEncounterBuilder implements Partial { return Object.assign(this, { autoHideIntroVisuals: autoHideIntroVisuals }); } + /** + * @param enterIntroVisualsFromRight - If true, will slide in intro visuals from the right side of the screen. If false, slides in from left, as normal + * Default false + * @returns + */ + withEnterIntroVisualsFromRight(enterIntroVisualsFromRight: boolean): this & Required> { + return Object.assign(this, { enterIntroVisualsFromRight: enterIntroVisualsFromRight }); + } + /** * Add a title for the encounter * diff --git a/src/data/mystery-encounters/mystery-encounters.ts b/src/data/mystery-encounters/mystery-encounters.ts index c41fd8dfe53..68f01220793 100644 --- a/src/data/mystery-encounters/mystery-encounters.ts +++ b/src/data/mystery-encounters/mystery-encounters.ts @@ -18,6 +18,7 @@ import { PokemonSalesmanEncounter } from "#app/data/mystery-encounters/encounter import { OfferYouCantRefuseEncounter } from "#app/data/mystery-encounters/encounters/offer-you-cant-refuse-encounter"; import { DelibirdyEncounter } from "#app/data/mystery-encounters/encounters/delibirdy-encounter"; import { AbsoluteAvariceEncounter } from "#app/data/mystery-encounters/encounters/absolute-avarice-encounter"; +import { ATrainersTestEncounter } from "#app/data/mystery-encounters/encounters/a-trainers-test-encounter"; // Spawn chance: (BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT + WIGHT_INCREMENT_ON_SPAWN_MISS * ) / 256 export const BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT = 1; @@ -154,6 +155,7 @@ const anyBiomeEncounters: MysteryEncounterType[] = [ MysteryEncounterType.MYSTERIOUS_CHEST, MysteryEncounterType.TRAINING_SESSION, MysteryEncounterType.DELIBIRDY, + MysteryEncounterType.A_TRAINERS_TEST ]; /** @@ -240,6 +242,7 @@ export function initMysteryEncounters() { allMysteryEncounters[MysteryEncounterType.OFFER_YOU_CANT_REFUSE] = OfferYouCantRefuseEncounter; allMysteryEncounters[MysteryEncounterType.DELIBIRDY] = DelibirdyEncounter; allMysteryEncounters[MysteryEncounterType.ABSOLUTE_AVARICE] = AbsoluteAvariceEncounter; + allMysteryEncounters[MysteryEncounterType.A_TRAINERS_TEST] = ATrainersTestEncounter; // Add extreme encounters to biome map extremeBiomeEncounters.forEach(encounter => { diff --git a/src/data/mystery-encounters/utils/encounter-phase-utils.ts b/src/data/mystery-encounters/utils/encounter-phase-utils.ts index 9fa24106417..21f54059828 100644 --- a/src/data/mystery-encounters/utils/encounter-phase-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-phase-utils.ts @@ -305,7 +305,7 @@ export async function initBattleWithEnemyConfig(scene: BattleScene, partyConfig: * @param scene * @param moves */ -export function initCustomMovesForEncounter(scene: BattleScene, moves: Moves | Moves[]) { +export function loadCustomMovesForEncounter(scene: BattleScene, moves: Moves | Moves[]) { moves = Array.isArray(moves) ? moves : [moves]; return Promise.all(moves.map(move => initMoveAnim(scene, move))) .then(() => loadMoveAnimAssets(scene, moves)); diff --git a/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts b/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts index edfb72e6611..e3dd3106aeb 100644 --- a/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts @@ -3,7 +3,7 @@ import i18next from "i18next"; import { isNullOrUndefined, randSeedInt } from "#app/utils"; import { PokemonHeldItemModifier } from "#app/modifier/modifier"; import { VictoryPhase } from "#app/phases"; -import { EnemyPokemon, PlayerPokemon } from "#app/field/pokemon"; +import Pokemon, { EnemyPokemon, PlayerPokemon } from "#app/field/pokemon"; import { doPokeballBounceAnim, getPokeballAtlasKey, getPokeballCatchMultiplier, getPokeballTintColor, PokeballType } from "#app/data/pokeball"; import { PlayerGender } from "#enums/player-gender"; import { addPokeballCaptureStars, addPokeballOpenParticles } from "#app/field/anims"; @@ -18,11 +18,25 @@ import PokemonSpecies, { getPokemonSpecies, speciesStarters } from "#app/data/po import { queueEncounterMessage, showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; import { getPokemonNameWithAffix } from "#app/messages"; import { modifierTypes, PokemonHeldItemModifierType } from "#app/modifier/modifier-type"; +import { Gender } from "#app/data/gender"; export interface MysteryEncounterPokemonData { spriteScale?: number } +export function getSpriteKeysFromSpecies(species: Species, female?: boolean, formIndex?: integer, shiny?: boolean, variant?: integer): { spriteKey: string, fileRoot: string } { + const spriteKey = getPokemonSpecies(species).getSpriteKey(female ?? false, formIndex ?? 0, shiny ?? false, variant ?? 0); + const fileRoot = getPokemonSpecies(species).getSpriteAtlasPath(female ?? false, formIndex ?? 0, shiny ?? false, variant ?? 0); + return { spriteKey, fileRoot }; +} + +export function getSpriteKeysFromPokemon(pokemon: Pokemon): { spriteKey: string, fileRoot: string } { + const spriteKey = pokemon.getSpeciesForm().getSpriteKey(pokemon.getGender() === Gender.FEMALE, pokemon.formIndex, pokemon.shiny, pokemon.variant); + const fileRoot = pokemon.getSpeciesForm().getSpriteAtlasPath(pokemon.getGender() === Gender.FEMALE, pokemon.formIndex, pokemon.shiny, pokemon.variant); + + return { spriteKey, fileRoot }; +} + /** * * Will never remove the player's last non-fainted Pokemon (if they only have 1) diff --git a/src/data/trainer-config.ts b/src/data/trainer-config.ts index 8b251d59de9..f3e6009e02e 100644 --- a/src/data/trainer-config.ts +++ b/src/data/trainer-config.ts @@ -1,16 +1,16 @@ -import BattleScene, {startingWave} from "../battle-scene"; -import {ModifierTypeFunc, modifierTypes} from "../modifier/modifier-type"; -import {EnemyPokemon} from "../field/pokemon"; +import BattleScene, { startingWave } from "../battle-scene"; +import { ModifierTypeFunc, modifierTypes } from "../modifier/modifier-type"; +import { EnemyPokemon } from "../field/pokemon"; import * as Utils from "../utils"; -import {PokeballType} from "./pokeball"; -import {pokemonEvolutions, pokemonPrevolutions} from "./pokemon-evolutions"; -import PokemonSpecies, {getPokemonSpecies, PokemonSpeciesFilter} from "./pokemon-species"; -import {tmSpecies} from "./tms"; -import {Type} from "./type"; -import {doubleBattleDialogue} from "./dialogue"; -import {PersistentModifier} from "../modifier/modifier"; -import {TrainerVariant} from "../field/trainer"; -import {getIsInitialized, initI18n} from "#app/plugins/i18n"; +import { PokeballType } from "./pokeball"; +import { pokemonEvolutions, pokemonPrevolutions } from "./pokemon-evolutions"; +import PokemonSpecies, { getPokemonSpecies, PokemonSpeciesFilter } from "./pokemon-species"; +import { tmSpecies } from "./tms"; +import { Type } from "./type"; +import { doubleBattleDialogue } from "./dialogue"; +import { PersistentModifier } from "../modifier/modifier"; +import { TrainerVariant } from "../field/trainer"; +import { getIsInitialized, initI18n } from "#app/plugins/i18n"; import i18next from "i18next"; import { Moves } from "#enums/moves"; import { PartyMemberStrength } from "#enums/party-member-strength"; @@ -527,6 +527,44 @@ export class TrainerConfig { return this; } + /** + * Initializes the trainer configuration for a Stat Trainer, as part of the Trainer's Test Mystery Encounter. + * @param {Species | Species[]} signatureSpecies - The signature species for the Elite Four member. + * @param {Type[]} specialtyTypes - The specialty types for the Stat Trainer. + * @param isMale - Whether the Elite Four Member is Male or Female (for localization of the title). + * @returns {TrainerConfig} - The updated TrainerConfig instance. + **/ + initForStatTrainer(signatureSpecies: (Species | Species[])[], isMale: boolean, ...specialtyTypes: Type[]): TrainerConfig { + if (!getIsInitialized()) { + initI18n(); + } + + this.setPartyTemplates(trainerPartyTemplates.ELITE_FOUR); + + signatureSpecies.forEach((speciesPool, s) => { + if (!Array.isArray(speciesPool)) { + speciesPool = [speciesPool]; + } + this.setPartyMemberFunc(-(s + 1), getRandomPartyMemberFunc(speciesPool)); + }); + if (specialtyTypes.length) { + this.setSpeciesFilter(p => specialtyTypes.find(t => p.isOfType(t)) !== undefined); + this.setSpecialtyTypes(...specialtyTypes); + } + const nameForCall = this.name.toLowerCase().replace(/\s/g, "_"); + this.name = i18next.t(`trainerNames:${nameForCall}`); + // this.setTitle(title); + this.setMoneyMultiplier(2); + this.setBoss(); + this.setStaticParty(); + + // TODO: replace with more suitable music? + this.setBattleBgm("battle_trainer"); + this.setVictoryBgm("victory_trainer"); + + return this; + } + /** * Initializes the trainer configuration for an evil team leader. Temporarily hardcoding evil leader teams though. * @param {Species | Species[]} signatureSpecies - The signature species for the evil team leader. @@ -1787,4 +1825,137 @@ export const trainerConfigs: TrainerConfigs = { p.generateAndPopulateMoveset(); p.pokeball = PokeballType.MASTER_BALL; })), + // TODO: use signature species? + [TrainerType.BUCK]: new TrainerConfig(++t).setName("Buck").initForStatTrainer([], true) + .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.CLAYDOL ], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 3); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + })) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.VENUSAUR, Species.COALOSSAL ], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.GREAT_BALL; + if (p.species.speciesId === Species.VENUSAUR) { + p.formIndex = 2; // Gmax + p.abilityIndex = 2; // Venusaur gets Chlorophyll + } else { + p.formIndex = 1; // Gmax + } + p.generateName(); + })) + .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.AGGRON ], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.formIndex = 1; // Mega + p.generateName(); + })) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.TORKOAL ], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.abilityIndex = 1; // Drought + })) + .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.GREAT_TUSK ], TrainerSlot.TRAINER, true)) + .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.HEATRAN ], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.MASTER_BALL; + })), + [TrainerType.CHERYL]: new TrainerConfig(++t).setName("Cheryl").initForStatTrainer([], false) + .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.BLISSEY ], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 3); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + })) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.SNORLAX, Species.LAPRAS ], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.GREAT_BALL; + p.formIndex = 1; // Gmax + p.generateName(); + })) + .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.AUDINO ], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.formIndex = 1; // Mega + p.generateName(); + })) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.GOODRA ], TrainerSlot.TRAINER, true)) + .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.IRON_HANDS ], TrainerSlot.TRAINER, true)) + .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.CRESSELIA, Species.ENAMORUS ], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + if (p.species.speciesId === Species.ENAMORUS) { + p.formIndex = 1; // Therian + p.generateName(); + } + p.pokeball = PokeballType.MASTER_BALL; + })), + [TrainerType.MARLEY]: new TrainerConfig(++t).setName("Marley").initForStatTrainer([], false) + .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.ARCANINE ], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 3); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.ULTRA_BALL; + })) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.CINDERACE, Species.INTELEON ], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.GREAT_BALL; + p.formIndex = 1; // Gmax + p.generateName(); + })) + .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.AERODACTYL ], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.formIndex = 1; // Mega + p.generateName(); + })) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.DRAGAPULT ], TrainerSlot.TRAINER, true)) + .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.IRON_BUNDLE ], TrainerSlot.TRAINER, true)) + .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.REGIELEKI ], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.MASTER_BALL; + })), + [TrainerType.MIRA]: new TrainerConfig(++t).setName("Mira").initForStatTrainer([], false) + .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.ALAKAZAM ], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.formIndex = 1; + p.pokeball = PokeballType.ULTRA_BALL; + p.generateName(); + })) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.GENGAR, Species.HATTERENE ], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.GREAT_BALL; + p.formIndex = p.species.speciesId === Species.GENGAR ? 2 : 1; // Gmax + p.generateName(); + })) + .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.FLUTTER_MANE ], TrainerSlot.TRAINER, true)) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.HYDREIGON ], TrainerSlot.TRAINER, true)) + .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.MAGNEZONE ], TrainerSlot.TRAINER, true)) + .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.LATIOS, Species.LATIAS ], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.MASTER_BALL; + })), + [TrainerType.RILEY]: new TrainerConfig(++t).setName("Riley").initForStatTrainer([], true) + .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.LUCARIO ], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + p.formIndex = 1; + p.pokeball = PokeballType.ULTRA_BALL; + p.generateName(); + })) + .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.RILLABOOM, Species.CENTISKORCH ], TrainerSlot.TRAINER, true, p => { + p.generateAndPopulateMoveset(); + p.pokeball = PokeballType.GREAT_BALL; + p.formIndex = 1; // Gmax + p.generateName(); + })) + .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.TYRANITAR ], TrainerSlot.TRAINER, true)) + .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.ROARING_MOON ], TrainerSlot.TRAINER, true)) + .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.URSALUNA ], TrainerSlot.TRAINER, true)) + .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.REGIGIGAS, Species.LANDORUS ], TrainerSlot.TRAINER, true, p => { + p.setBoss(true, 2); + p.generateAndPopulateMoveset(); + if (p.species.speciesId === Species.LANDORUS) { + p.formIndex = 1; // Therian + p.generateName(); + } + p.pokeball = PokeballType.MASTER_BALL; + })), }; diff --git a/src/enums/mystery-encounter-type.ts b/src/enums/mystery-encounter-type.ts index 95283e63b36..3bb204ab9d8 100644 --- a/src/enums/mystery-encounter-type.ts +++ b/src/enums/mystery-encounter-type.ts @@ -15,5 +15,6 @@ export enum MysteryEncounterType { POKEMON_SALESMAN, OFFER_YOU_CANT_REFUSE, DELIBIRDY, - ABSOLUTE_AVARICE + ABSOLUTE_AVARICE, + A_TRAINERS_TEST } diff --git a/src/enums/trainer-type.ts b/src/enums/trainer-type.ts index 6bd8f567acb..0d3a0771604 100644 --- a/src/enums/trainer-type.ts +++ b/src/enums/trainer-type.ts @@ -70,6 +70,11 @@ export enum TrainerType { GHETSIS_2, LYSANDRE, LYSANDRE_2, + BUCK, + CHERYL, + MARLEY, + MIRA, + RILEY, BROCK = 200, MISTY, diff --git a/src/field/mystery-encounter-intro.ts b/src/field/mystery-encounter-intro.ts index 467d44c23cd..7055d29d45c 100644 --- a/src/field/mystery-encounter-intro.ts +++ b/src/field/mystery-encounter-intro.ts @@ -1,10 +1,11 @@ import { GameObjects } from "phaser"; import BattleScene from "../battle-scene"; import IMysteryEncounter from "../data/mystery-encounters/mystery-encounter"; +import { Species } from "#enums/species"; +import { isNullOrUndefined } from "#app/utils"; +import { getSpriteKeysFromSpecies } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; type KnownFileRoot = - | "trainer" - | "pokemon" | "arenas" | "battle_anims" | "cg" @@ -33,6 +34,8 @@ export class MysteryEncounterSpriteConfig { spriteKey: string; /** Refer to [/public/images](../../public/images) directorty for all folder names */ fileRoot: KnownFileRoot & string | string; + /** Optional replacement for `spriteKey`/`fileRoot`. Just know this defaults to male/genderless, form 0, no shiny */ + species?: Species; /** Enable shadow. Defaults to `false` */ hasShadow?: boolean = false; /** Disable animation. Defaults to `false` */ @@ -69,15 +72,26 @@ export class MysteryEncounterSpriteConfig { export default class MysteryEncounterIntroVisuals extends Phaser.GameObjects.Container { public encounter: IMysteryEncounter; public spriteConfigs: MysteryEncounterSpriteConfig[]; + public enterFromRight: boolean; constructor(scene: BattleScene, encounter: IMysteryEncounter) { super(scene, -72, 76); this.encounter = encounter; + this.enterFromRight = encounter.enterIntroVisualsFromRight ?? false; // Shallow copy configs to allow visual config updates at runtime without dirtying master copy of Encounter this.spriteConfigs = encounter.spriteConfigs.map(config => { - return { + const result = { ...config }; + + if (!isNullOrUndefined(result.species)) { + const keys = getSpriteKeysFromSpecies(result.species); + result.spriteKey = keys.spriteKey; + result.fileRoot = keys.fileRoot; + result.isPokemon = true; + } + + return result; }); if (!this.spriteConfigs) { return; @@ -90,9 +104,10 @@ export default class MysteryEncounterIntroVisuals extends Phaser.GameObjects.Con return ret; }; - const getItemSprite = (spriteKey: string) => { + const getItemSprite = (spriteKey: string, hasShadow?: boolean, yShadow?: number) => { const icon = this.scene.add.sprite(-19, 2, "items", spriteKey); icon.setOrigin(0.5, 1); + icon.setPipeline(this.scene.spritePipeline, { tone: [0.0, 0.0, 0.0, 0.0], hasShadow: !!hasShadow, yShadowOffset: yShadow ?? 0 }); return icon; }; @@ -114,7 +129,7 @@ export default class MysteryEncounterIntroVisuals extends Phaser.GameObjects.Con sprite = getSprite(spriteKey, hasShadow, yShadow); tintSprite = getSprite(spriteKey); } else { - sprite = getItemSprite(spriteKey); + sprite = getItemSprite(spriteKey, hasShadow, yShadow); tintSprite = getItemSprite(spriteKey); } diff --git a/src/locales/en/dialogue.ts b/src/locales/en/dialogue.ts index dda8891b788..50dee033782 100644 --- a/src/locales/en/dialogue.ts +++ b/src/locales/en/dialogue.ts @@ -566,6 +566,67 @@ export const PGMdialogue: DialogueTranslationEntries = { 1: "Fools with no vision will continue to befoul this beautiful world." } }, + "stat_trainer_buck": { + "encounter": { + 1: "...I'm telling you right now. I'm seriously tough. Act surprised!", + 2: "I can feel my Pokémon shivering inside their Pokéballs!" + }, + "victory": { + 1: "Heeheehee!\nSo hot, you!" + }, + "defeat": { + 1: "Whoa! You're all out of gas, I guess." + } + }, + "stat_trainer_cheryl": { + "encounter": { + 1: "My Pokémon have been itching for a battle.", + 2: "I should warn you, my Pokémon can be quite rambunctious." + }, + "victory": { + 1: "Striking the right balance of offense and defense... It's not easy to do." + }, + "defeat": { + 1: "Do your Pokémon need any healing?" + } + }, + "stat_trainer_marley": { + "encounter": { + 1: "... OK.\nI'll do my best.", + 2: "... OK.\nI... won't lose...!" + }, + "victory": { + 1: "... Awww." + }, + "defeat": { + 1: "... Goodbye." + } + }, + "stat_trainer_mira": { + "encounter": { + 1: "You will be shocked by Mira!", + 2: "Mira will show you that Mira doesn't get lost anymore!" + }, + "victory": { + 1: "Mira wonders if she can get very far in this land." + }, + "defeat": { + 1: "Mira knew she would win!" + } + }, + "stat_trainer_riley": { + "encounter": { + 1: "Battling is our way of greeting!", + 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... + $It's great how Trainers can interact.` + }, + "defeat": { + 1: "You put up quite the display.\nBetter luck next time." + } + }, "brock": { "encounter": { 1: "My expertise on Rock-type Pokémon will take you down! Come on!", diff --git a/src/locales/en/trainers.ts b/src/locales/en/trainers.ts index b59cfdc4fda..0581a6698de 100644 --- a/src/locales/en/trainers.ts +++ b/src/locales/en/trainers.ts @@ -270,6 +270,11 @@ export const trainerNames: SimpleTranslationEntries = { "cyrus": "Cyrus", "ghetsis": "Ghetsis", "lysandre": "Lysandre", + "buck": "Buck", + "cheryl": "Cheryl", + "marley": "Marley", + "mira": "Mira", + "riley": "Riley", // Double Names "blue_red_double": "Blue & Red", diff --git a/src/overrides.ts b/src/overrides.ts index 1196797fac0..ff833564899 100644 --- a/src/overrides.ts +++ b/src/overrides.ts @@ -127,9 +127,9 @@ class DefaultOverrides { // ------------------------- // 1 to 256, set to null to ignore - readonly MYSTERY_ENCOUNTER_RATE_OVERRIDE: number = null; + readonly MYSTERY_ENCOUNTER_RATE_OVERRIDE: number = 256; readonly MYSTERY_ENCOUNTER_TIER_OVERRIDE: MysteryEncounterTier = null; - readonly MYSTERY_ENCOUNTER_OVERRIDE: MysteryEncounterType = null; + readonly MYSTERY_ENCOUNTER_OVERRIDE: MysteryEncounterType = MysteryEncounterType.A_TRAINERS_TEST; // ------------------------- // MODIFIER / ITEM OVERRIDES diff --git a/src/phases.ts b/src/phases.ts index 7f2933a738a..b0bfc739ae8 100644 --- a/src/phases.ts +++ b/src/phases.ts @@ -1002,8 +1002,8 @@ export class EncounterPhase extends BattlePhase { const enemyField = this.scene.getEnemyField(); this.scene.tweens.add({ - targets: [this.scene.arenaEnemy, this.scene.currentBattle.trainer, enemyField, this.scene.currentBattle?.mysteryEncounter?.introVisuals, this.scene.arenaPlayer, this.scene.trainer].flat(), - x: (_target, _key, value, fieldIndex: integer) => fieldIndex < 3 + (enemyField.length) ? value + 300 : value - 300, + targets: [this.scene.arenaEnemy, this.scene.currentBattle.trainer, enemyField, this.scene.arenaPlayer, this.scene.trainer].flat(), + x: (_target, _key, value, fieldIndex: integer) => fieldIndex < 2 + (enemyField.length) ? value + 300 : value - 300, duration: 2000, onComplete: () => { if (!this.tryOverrideForBattleSpec()) { @@ -1011,6 +1011,19 @@ export class EncounterPhase extends BattlePhase { } } }); + + const encounterIntroVisuals = this.scene.currentBattle?.mysteryEncounter?.introVisuals; + if (encounterIntroVisuals) { + const enterFromRight = encounterIntroVisuals.enterFromRight; + if (enterFromRight) { + encounterIntroVisuals.x += 500; + } + this.scene.tweens.add({ + targets: encounterIntroVisuals, + x: enterFromRight ? "-=200" : "+=300", + duration: 2000 + }); + } } getEncounterMessage(): string { @@ -1106,8 +1119,6 @@ export class EncounterPhase extends BattlePhase { } const doEncounter = () => { - this.scene.playBgm(undefined); - const doShowEncounterOptions = () => { this.scene.ui.clearText(); this.scene.ui.getMessageHandler().hideNameText(); @@ -1264,7 +1275,17 @@ export class NextEncounterPhase extends EncounterPhase { } const nextEncounterVisuals = this.scene.currentBattle?.mysteryEncounter?.introVisuals; if (nextEncounterVisuals) { - moveTargets.push(nextEncounterVisuals); + const enterFromRight = nextEncounterVisuals.enterFromRight; + if (enterFromRight) { + nextEncounterVisuals.x += 500; + this.scene.tweens.add({ + targets: nextEncounterVisuals, + x: "-=200", + duration: 2000 + }); + } else { + moveTargets.push(nextEncounterVisuals); + } } this.scene.tweens.add({ targets: moveTargets.flat(), From fc163d1beb6431055e163dbf02b2bc65411420f5 Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Mon, 29 Jul 2024 19:04:07 -0400 Subject: [PATCH 226/270] update visuals loading for safari and stat trainer visuals --- .../mystery-encounters/safari_zone.json | 22 +- .../images/mystery-encounters/safari_zone.png | Bin 1443 -> 1517 bytes public/images/trainer/buck.json | 268 ++++++- public/images/trainer/cheryl.json | 18 +- public/images/trainer/marley.json | 185 +++-- public/images/trainer/marley.png | Bin 1206 -> 1344 bytes public/images/trainer/mira.json | 689 ++++++------------ public/images/trainer/mira.png | Bin 1739 -> 1837 bytes public/images/trainer/riley.json | 668 ++++++----------- public/images/trainer/riley.png | Bin 1337 -> 1821 bytes 10 files changed, 778 insertions(+), 1072 deletions(-) diff --git a/public/images/mystery-encounters/safari_zone.json b/public/images/mystery-encounters/safari_zone.json index f0c23d43f5a..fe81d1b9f53 100644 --- a/public/images/mystery-encounters/safari_zone.json +++ b/public/images/mystery-encounters/safari_zone.json @@ -1,33 +1,33 @@ { "textures": [ { - "image": "safarizone.png", + "image": "safari_zone.png", "format": "RGBA8888", "size": { - "w": 105, - "h": 83 + "w": 120, + "h": 84 }, "scale": 1, "frames": [ { - "filename": "safarizone.png", + "filename": "0001.png", "rotated": false, "trimmed": false, "sourceSize": { - "w": 103, - "h": 81 + "w": 118, + "h": 82 }, "spriteSourceSize": { "x": 0, "y": 0, - "w": 103, - "h": 81 + "w": 118, + "h": 82 }, "frame": { "x": 1, "y": 1, - "w": 103, - "h": 81 + "w": 118, + "h": 82 } } ] @@ -36,6 +36,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:f07e2d44900011048b658765e193a86c:3d91036b9c3943256dd1e4712042ec59:d467a15bea042bd0d310f1cce7d9791f$" + "smartupdate": "$TexturePacker:SmartUpdate:6fad7a61e47043b974153148b4fd3997:5ec4d0890f2f03446daf22c8ae8ba77b:87aa745cd95eef6cbf38935230f4e10f$" } } diff --git a/public/images/mystery-encounters/safari_zone.png b/public/images/mystery-encounters/safari_zone.png index 03c32d1b955df0ce5a33433072e9b08880c61357..375d66ebbe9807a0c99ea02290534e0bef96d7d9 100644 GIT binary patch delta 1495 zcmV;|1t|KX3+)RpiBL{Q4GJ0x0000DNk~Le0001Z0000~2m=5B0Dja1tpET3Fi=cX zMF0Q*2q77fEGmC{@b^am0007XQchCu(cb&B&4eP(ZkmK;c$$A4;#p}o6FJRycJKE)!z9m0 zV>q2qHR(U@&hVYajp1vOQ@Z_VI%yJdl(@F=H6L|ykr|((9hF^$i+EGSHz#wWln1IMec(lVAWS<>&M9bmeH=VK5(D@r1bNV=3X~aT;7)a!`1j zYWrw;JRXfZ7S7i^%OW6=Dd}k}4*mcpc}b!Savy)P5bHiT2~Kk5F0Nb%NB&80QXVe=ax=esf*zM%M9>0}X@MZu!{^hQWM=S@-LgGZ+R(8ncb}GZ+JV zg>9fs!0*mrC`>>#0bPM^4o1Rqub@NVO%7}Z<6uZIK=A9J!^dXmeUA6z;2BwlAa8-^ z;B0>in+XhrDP%tF0KEnN;~-taH))W-55knD^<4#{N0x)&0Rx|bf`p$YK$!?Mhs45R zINE(7&c#i>z)9}F^ofv?z^7ySm(p?+=8chlRyJq41=5|8;UqUOFwB4XEQ}oR(KV(G zq<7zmqZx2%fWW{Z11c0at}Tp=AB3qb(yf1gdPgC84cMc?Nd{D+2LlJ}zk(q$474>t zW`GKF$OTM$w}_R$zyY5C^Zx3=a+w#{4PU`1Fd7U6OvhCiwlK)f@&SGcTj(`RA-6DQ zm;#2;FtsZQxq`u9b8S~!E&d+HpsNh1k=8IJx`6fS9&7^s7>oj=z!GxU!odO#Rm6Yf z*$oElPoRL~J{*0p7%NzIR#+Q|W=lCggFXrC!|^rDAr~;{wz8fDEj-KNQY+LMz(E*R zm}|L=m|@+~fm>_^109RHPio2O+xB6YQDM(8w`ztl*D|!QmN0f;-7o3mZ(z?ru4O1v z&3A{kvmnE|Uod_Iqh>{O+<|Rl)5m`jF<8$6?P5Mc2acb^=?L_n61G|{VJ)Q;Zyzr9 z%PSZw7&D9p>&6xs1lB|wjC(MC00UoUZDG`n9TcYXl$CHkRq)i+kgdxMa$_B5Ml&?bw#6Mncgj*O3IPSxjSqp#Fa~1Q!6~+zBAv>%~IFxYQz{v3B(z*&8nBNNwyn!(2 zZ4-y=^s+;jp$EqftixD=p@jKdt1w?M>Z1TVJvzIt#0-Zm3|1ixOt!r9dNtaE`Ig2W zH~?l?F7FB$z&h7kSmV7Ey3D|XCcqWXnB;Y0eVJO80J?B)3HdIA*QI|=^}5oV83^A^}lkrGx&eN{{V5JyEn|4sG|S?002ovPDHLkV1jqZyCMJp delta 1420 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 diff --git a/public/images/trainer/riley.json b/public/images/trainer/riley.json index e29f6e02e24..f0f84a909db 100644 --- a/public/images/trainer/riley.json +++ b/public/images/trainer/riley.json @@ -1,461 +1,209 @@ -{ - "textures": [ - { - "image": "riley.png", - "format": "RGBA8888", - "size": { - "w": 59, - "h": 246 - }, - "scale": 1, - "frames": [ - { - "filename": "0000.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 80, - "h": 80 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 57, - "h": 80 - }, - "frame": { - "x": 1, - "y": 1, - "w": 57, - "h": 80 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 80, - "h": 80 - }, - "spriteSourceSize": { - "x": 9, - "y": 0, - "w": 57, - "h": 80 - }, - "frame": { - "x": 1, - "y": 1, - "w": 57, - "h": 80 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 80, - "h": 80 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 57, - "h": 80 - }, - "frame": { - "x": 1, - "y": 1, - "w": 57, - "h": 80 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 80, - "h": 80 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 57, - "h": 80 - }, - "frame": { - "x": 1, - "y": 1, - "w": 57, - "h": 80 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 80, - "h": 80 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 57, - "h": 80 - }, - "frame": { - "x": 1, - "y": 1, - "w": 57, - "h": 80 - } - }, - { - "filename": "00010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 80, - "h": 80 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 57, - "h": 80 - }, - "frame": { - "x": 1, - "y": 1, - "w": 57, - "h": 80 - } - }, - { - "filename": "00012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 80, - "h": 80 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 57, - "h": 80 - }, - "frame": { - "x": 1, - "y": 1, - "w": 57, - "h": 80 - } - }, - { - "filename": "00014.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 80, - "h": 80 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 57, - "h": 80 - }, - "frame": { - "x": 1, - "y": 1, - "w": 57, - "h": 80 - } - }, - { - "filename": "00016.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 80, - "h": 80 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 57, - "h": 80 - }, - "frame": { - "x": 1, - "y": 1, - "w": 57, - "h": 80 - } - }, - { - "filename": "00018.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 80, - "h": 80 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 57, - "h": 80 - }, - "frame": { - "x": 1, - "y": 1, - "w": 57, - "h": 80 - } - }, - { - "filename": "00020.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 80, - "h": 80 - }, - "spriteSourceSize": { - "x": 10, - "y": 0, - "w": 57, - "h": 80 - }, - "frame": { - "x": 1, - "y": 1, - "w": 57, - "h": 80 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 80, - "h": 80 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 56, - "h": 80 - }, - "frame": { - "x": 1, - "y": 83, - "w": 56, - "h": 80 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 80, - "h": 80 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 56, - "h": 80 - }, - "frame": { - "x": 1, - "y": 83, - "w": 56, - "h": 80 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 80, - "h": 80 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 56, - "h": 80 - }, - "frame": { - "x": 1, - "y": 83, - "w": 56, - "h": 80 - } - }, - { - "filename": "00011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 80, - "h": 80 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 56, - "h": 80 - }, - "frame": { - "x": 1, - "y": 83, - "w": 56, - "h": 80 - } - }, - { - "filename": "00013.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 80, - "h": 80 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 56, - "h": 80 - }, - "frame": { - "x": 1, - "y": 83, - "w": 56, - "h": 80 - } - }, - { - "filename": "00015.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 80, - "h": 80 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 56, - "h": 80 - }, - "frame": { - "x": 1, - "y": 83, - "w": 56, - "h": 80 - } - }, - { - "filename": "00017.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 80, - "h": 80 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 56, - "h": 80 - }, - "frame": { - "x": 1, - "y": 83, - "w": 56, - "h": 80 - } - }, - { - "filename": "00019.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 80, - "h": 80 - }, - "spriteSourceSize": { - "x": 11, - "y": 0, - "w": 56, - "h": 80 - }, - "frame": { - "x": 1, - "y": 83, - "w": 56, - "h": 80 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 80, - "h": 80 - }, - "spriteSourceSize": { - "x": 30, - "y": 0, - "w": 39, - "h": 80 - }, - "frame": { - "x": 1, - "y": 165, - "w": 39, - "h": 80 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 80, - "h": 80 - }, - "spriteSourceSize": { - "x": 29, - "y": 0, - "w": 39, - "h": 80 - }, - "frame": { - "x": 1, - "y": 165, - "w": 39, - "h": 80 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:d0f27c1a776dc776dbc730ec409fafad:7a665e1bfee26403e5d49912c4dad042:cb98d9ba5e960a1d670368dad1073434$" - } +{ "frames": [ + { + "filename": "0000.png", + "frame": { "x": 0, "y": 0, "w": 55, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 0, "w": 55, "h": 80 }, + "sourceSize": { "w": 80, "h": 80 }, + "duration": 100 + }, + { + "filename": "0001.png", + "frame": { "x": 0, "y": 0, "w": 55, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 0, "w": 55, "h": 80 }, + "sourceSize": { "w": 80, "h": 80 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 0, "y": 0, "w": 55, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 0, "w": 55, "h": 80 }, + "sourceSize": { "w": 80, "h": 80 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 0, "y": 0, "w": 55, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 0, "w": 55, "h": 80 }, + "sourceSize": { "w": 80, "h": 80 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 55, "y": 80, "w": 37, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 31, "y": 0, "w": 37, "h": 80 }, + "sourceSize": { "w": 80, "h": 80 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 55, "y": 80, "w": 37, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 31, "y": 0, "w": 37, "h": 80 }, + "sourceSize": { "w": 80, "h": 80 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 55, "y": 80, "w": 37, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 30, "y": 0, "w": 37, "h": 80 }, + "sourceSize": { "w": 80, "h": 80 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 55, "y": 80, "w": 37, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 30, "y": 0, "w": 37, "h": 80 }, + "sourceSize": { "w": 80, "h": 80 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 55, "y": 80, "w": 37, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 28, "y": 0, "w": 37, "h": 80 }, + "sourceSize": { "w": 80, "h": 80 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 55, "y": 80, "w": 37, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 28, "y": 0, "w": 37, "h": 80 }, + "sourceSize": { "w": 80, "h": 80 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 0, "y": 0, "w": 55, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 0, "w": 55, "h": 80 }, + "sourceSize": { "w": 80, "h": 80 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 0, "y": 0, "w": 55, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 10, "y": 0, "w": 55, "h": 80 }, + "sourceSize": { "w": 80, "h": 80 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 0, "y": 0, "w": 55, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 0, "w": 55, "h": 80 }, + "sourceSize": { "w": 80, "h": 80 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 0, "y": 0, "w": 55, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 11, "y": 0, "w": 55, "h": 80 }, + "sourceSize": { "w": 80, "h": 80 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 55, "y": 0, "w": 55, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 0, "w": 55, "h": 80 }, + "sourceSize": { "w": 80, "h": 80 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 55, "y": 0, "w": 55, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 0, "w": 55, "h": 80 }, + "sourceSize": { "w": 80, "h": 80 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 0, "y": 80, "w": 55, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 0, "w": 55, "h": 80 }, + "sourceSize": { "w": 80, "h": 80 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 0, "y": 80, "w": 55, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 0, "w": 55, "h": 80 }, + "sourceSize": { "w": 80, "h": 80 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 55, "y": 0, "w": 55, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 0, "w": 55, "h": 80 }, + "sourceSize": { "w": 80, "h": 80 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 55, "y": 0, "w": 55, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 0, "w": 55, "h": 80 }, + "sourceSize": { "w": 80, "h": 80 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 0, "y": 0, "w": 55, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 0, "w": 55, "h": 80 }, + "sourceSize": { "w": 80, "h": 80 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 0, "y": 0, "w": 55, "h": 80 }, + "rotated": false, + "trimmed": true, + "spriteSourceSize": { "x": 12, "y": 0, "w": 55, "h": 80 }, + "sourceSize": { "w": 80, "h": 80 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.7-x64", + "image": "riley.png", + "format": "I8", + "size": { "w": 110, "h": 160 }, + "scale": "1" + } } diff --git a/public/images/trainer/riley.png b/public/images/trainer/riley.png index dd5d3bdd8c9953bb32b87d1ea44842b7d73fba85..a9f0e3b53a9cd72ec9145b2277fc40a00a903f57 100644 GIT binary patch delta 1783 zcmV2m=5B0NQ7%4FCWD0drDE zLIAGL9O;oEJbw>#QchC<|NsC0|NsC0|NsC0|NrHUo~8f*27^gNK~#90y_*Y{t11kI z4PrYUZU6tzy-C0a4`q|KH|w0WW^6uo1XL`0hT%R&jz-E?v1ytd@lX8U{}@whQgZYI zjr3b=I)XfnAom5#k^3<=xT8}XcgyH7&i(yaFp*KwNYv# zxBR1Z@qdf+r_ZC_x-Ki7?vAP!F!CE#3>|BU;(QXM(0x(``DJ<0qDPX>69SuyJO-{p6@(942FzpfyCaNNoSbb=3|MKRqm>ChWiD;gTZszx%#D}y-9JZ2)11T zO)S^k73JRgeCk+V=&dOiFSrI)Q9Q=*`Fu0BAmG7uVP}##_YPMP#Mv+ujAkrdiTiLFkX+wVSfki>Vo|e zwuAI`!ohVKv4LWpI_`>>2+eEP5}c4&lVeYaD1;94(t~r7Q1Eg!cj+^ zMl9AT&p%%Aj4)`#5^f-mf<|oPMz4U5#eWYm=DgE;uD&QpJLqETXq0ZIU6=S_;omD_i#pxW{Eh9an6X990nRO?Ue1Czz)ucovT!EZrt%c z!gB8X%MY;7DSIZ&8L_lVm@{H|;@l%=#LkHXaYn4{1*}^>!BXx4a7HYfU!f)73Nm6^ z)T87czrkwvR;12Puzt>nDVOJfa(@rGM6{~#*=X(-SBSZH3BuBxKZVrd2P9t@kB%S$*G-p3XAb%OXIWJg06qCV@ZtAWOo+zGOG9eM9-DdZsINjd&*pY->6mGf&FPlmz? z;>7bYIl$Las3FFaJVb8PjgW?~rI523Puv)uhWgz-Y)~1@#*^K+)@e}512&#i@@$f* z@noxP&vP9fhg1+Wo@nBc*Yj0=)(&VqA(!NJ>|3YJpvDtQ^G4eV!hgmSO7hU1&mv&s zNsnk2; zJW29eyZ<+G`)cGg<$o%ANgnIf{=A__ZWpN=PtrX3V&G%78{z4zKCl`6Wff`S)@_OY!WPut_j0Tk~P~(Z!pmN{LrJ2BLP=Cn+HJ%s^Dp{b$6RSa` z*37|O8c&P{m0Bx+@x*FSsWn4)2m0~=HNbdcHK=5P8c(bSl`K%>iPfM|G=n)oj0Tlj zD?l?=gGxmXF`gI=D!CeHJh2*73OUSpVl=3fYLM~7YEUWVAmfSApi)xya)ze*tt- zPE!Ct=GbNc000SaNLh0L01FcU01FcV0GgZ_000D~NklkL>>pwr&K zfmN_Mihvr_;GQy4(iU|r(YQALe}{tt?tOs;+?$Ix4F%A@{SE7Eg(Qx^0*iJJI87Ex z`3fA)Fx}u@Wd^xkML763RQks{gm1~9SSKI2(QiJY6bvUt7`T(S}OE7r3LCl7}qw(kBeRCZihp)um`i4d_^$w-V#cmt_8O~$>>kFi{PM<7$ zNAQQxpqPCdPAq zmNjlI*C(=QI$-!9v%0{re+CBpqOhHTBij*};mGPromiS!%%VE!$uSFkfq6dD%4cGrsM zyW;7QfN3J`oYturs}htb~>Y&kfA4unKq<*7UG>Sb@FoW%GZu zr3|KrJ%;UIA%E#?X5su{P_l4$p*<{hQY$-OqR_->jY}V#uk74Bb;0xmE)8D|d;VM_ z%L~TkbB%?j9=e2We`L9H%k133mgYG$%zi;D>=RsBU(#ybf&KyuT`WC!XWsbT&`{lp z$#r_|sc$-DPw8s#{Vwg{=l2^t-3IXY*uPAh8R#H4ZKiT=XKki%ZWnE)*ec-b)vwK7 z)DGHAv+q7@v+}OrH)*qyIP=B_->1z2f#IsnUTa&m8B{#df7`#81H6NqHmjMWWeE#p zg%mVuGjK_pmFq+-HORVQ*Jh5r8EdnGa^s8_j=Ka8_C-VZtj*pu9ubPlEyfLtz_B*d zMVnO@14%h7RBwm{x@fbSa+5NHC`L@xy=t?Ha*NI_uD>>QPKP#=ZOz)T9oj7OW z3~e^F+0bS~f13?$HniE$W<#3|Z8o&o&}KuM4Q=+HX)}HR_1dl}L?}518G(@xqfSD{f|1hxvHG ztoE8M=`8FLeD;5}<4w#)$f7Z;{dcf?$TG{hy4w!8-Ao^|D zKj}dnl$nAl>o}mcnKD#~BT;3$DN}Bz01u{2sWXnI%xXfz!IWvt0JVcDTeqRD z@WGU&O{iwg+DsXDodQ0Xvgihyd-`C?(r`y5yNMfACcT=nm zspxW3Wd^8x24|*>RxZ_lR^_IwMcmX(8HV6{SgBI*3ixEoRB=zH%=e}|>9lXzl(jxy zil(e}g)f@2#y#`DX3B7wvSG@GDI2D2n6hEYhAC@oe*lgINJB{U?%)6b002ovPDHLk FV1gW$aF+l8 From 4c664f805cb29634b5409fedc432dcef164f795b Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Thu, 1 Aug 2024 10:11:28 -0400 Subject: [PATCH 227/270] update a trainer's test encounter and add unit tests --- src/data/egg.ts | 13 +- .../encounters/a-trainers-test-encounter.ts | 149 +++++++------ .../encounters/absolute-avarice-encounter.ts | 30 +-- ... => an-offer-you-cant-refuse-encounter.ts} | 42 ++-- .../encounters/dark-deal-encounter.ts | 32 +-- .../encounters/delibirdy-encounter.ts | 34 +-- .../department-store-sale-encounter.ts | 30 +-- .../encounters/field-trip-encounter.ts | 88 ++++---- .../encounters/fiery-fallout-encounter.ts | 39 ++-- .../encounters/fight-or-flight-encounter.ts | 36 ++-- .../encounters/lost-at-sea-encounter.ts | 36 ++-- .../mysterious-challengers-encounter.ts | 28 +-- .../encounters/mysterious-chest-encounter.ts | 30 +-- .../encounters/safari-zone-encounter.ts | 59 +++-- .../shady-vitamin-dealer-encounter.ts | 46 ++-- .../slumbering-snorlax-encounter.ts | 30 +-- ...r.ts => the-pokemon-salesman-encounter.ts} | 34 +-- .../encounters/the-strong-stuff-encounter.ts | 24 +-- .../encounters/training-session-encounter.ts | 42 ++-- .../mystery-encounters/mystery-encounters.ts | 12 +- .../utils/encounter-phase-utils.ts | 21 +- src/enums/mystery-encounter-type.ts | 4 +- src/field/pokemon.ts | 2 +- src/locales/en/egg.ts | 1 + src/locales/en/mystery-encounter.ts | 10 +- .../a-trainers-test-dialogue.ts | 67 ++++++ ...s => an-offer-you-cant-refuse-dialogue.ts} | 2 +- ...ue.ts => the-pokemon-salesman-dialogue.ts} | 2 +- src/overrides.ts | 4 +- .../a-trainers-test-encounter.test.ts | 203 ++++++++++++++++++ .../absolute-avarice-encounter.test.ts | 26 +-- ...n-offer-you-cant-refuse-encounter.test.ts} | 90 ++++---- .../encounters/delibirdy-encounter.test.ts | 32 +-- .../department-store-sale-encounter.test.ts | 28 +-- .../fiery-fallout-encounter.test.ts | 28 +-- .../encounters/lost-at-sea-encounter.test.ts | 34 +-- ...=> the-pokemon-salesman-encounter.test.ts} | 66 +++--- .../the-strong-stuff-encounter.test.ts | 20 +- 38 files changed, 884 insertions(+), 590 deletions(-) rename src/data/mystery-encounters/encounters/{offer-you-cant-refuse-encounter.ts => an-offer-you-cant-refuse-encounter.ts} (83%) rename src/data/mystery-encounters/encounters/{pokemon-salesman-encounter.ts => the-pokemon-salesman-encounter.ts} (87%) create mode 100644 src/locales/en/mystery-encounters/a-trainers-test-dialogue.ts rename src/locales/en/mystery-encounters/{offer-you-cant-refuse-dialogue.ts => an-offer-you-cant-refuse-dialogue.ts} (96%) rename src/locales/en/mystery-encounters/{pokemon-salesman-dialogue.ts => the-pokemon-salesman-dialogue.ts} (96%) create mode 100644 src/test/mystery-encounter/encounters/a-trainers-test-encounter.test.ts rename src/test/mystery-encounter/encounters/{offer-you-cant-refuse-encounter.test.ts => an-offer-you-cant-refuse-encounter.test.ts} (67%) rename src/test/mystery-encounter/encounters/{pokemon-salesman-encounter.test.ts => the-pokemon-salesman-encounter.test.ts} (70%) diff --git a/src/data/egg.ts b/src/data/egg.ts index bf4d6577dd7..a924298c014 100644 --- a/src/data/egg.ts +++ b/src/data/egg.ts @@ -60,13 +60,16 @@ export interface IEggOptions { /** Defines if the egg will hatch with the hidden ability of this species. * If no hidden ability exist, a random one will get choosen. */ - overrideHiddenAbility?: boolean + overrideHiddenAbility?: boolean, + + /** If Egg is of {@link EggSourceType.EVENT}, can customize the message displayed for where the egg was obtained */ + eventEggTypeDescriptor?: string; } export class Egg { //// - // #region Privat properties + // #region Private properties //// private _id: number; @@ -82,6 +85,8 @@ export class Egg { private _overrideHiddenAbility: boolean; + private _eventEggTypeDescriptor: string; + //// // #endregion //// @@ -179,6 +184,8 @@ export class Egg { this.increasePullStatistic(eggOptions.scene); this.addEggToGameData(eggOptions.scene); } + + this._eventEggTypeDescriptor = eggOptions.eventEggTypeDescriptor ?? null; } //// @@ -273,6 +280,8 @@ export class Egg { return i18next.t("egg:gachaTypeShiny"); case EggSourceType.GACHA_MOVE: return i18next.t("egg:gachaTypeMove"); + case EggSourceType.EVENT: + return this._eventEggTypeDescriptor ?? i18next.t("egg:eventType"); } } 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 c2cd13690f9..9a69a85d722 100644 --- a/src/data/mystery-encounters/encounters/a-trainers-test-encounter.ts +++ b/src/data/mystery-encounters/encounters/a-trainers-test-encounter.ts @@ -1,7 +1,5 @@ -import { EnemyPartyConfig, initBattleWithEnemyConfig, setEncounterRewards, } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { EnemyPartyConfig, initBattleWithEnemyConfig, leaveEncounterWithoutBattle, setEncounterRewards, transitionMysteryEncounterIntroVisuals, } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { trainerConfigs, } from "#app/data/trainer-config"; -import { ModifierTier } from "#app/modifier/modifier-tier"; -import { modifierTypes } from "#app/modifier/modifier-type"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import BattleScene from "#app/battle-scene"; import IMysteryEncounter, { MysteryEncounterBuilder } from "../mystery-encounter"; @@ -10,6 +8,11 @@ import { TrainerType } from "#enums/trainer-type"; import { Species } from "#enums/species"; import { getSpriteKeysFromSpecies } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; import { randSeedInt } from "#app/utils"; +import i18next from "i18next"; +import { PartyHealPhase } from "#app/phases"; +import { IEggOptions } from "#app/data/egg"; +import { EggSourceType } from "#enums/egg-source-types"; +import { EggTier } from "#enums/egg-type"; /** the i18n namespace for the encounter */ const namespace = "mysteryEncounter:aTrainersTest"; @@ -26,40 +29,71 @@ export const ATrainersTestEncounter: IMysteryEncounter = .withIntroSpriteConfigs([]) // These are set in onInit() .withIntroDialogue([ { - text: `${namespace}:intro`, + text: `${namespace}.intro`, }, ]) + .withAutoHideIntroVisuals(false) .withOnInit((scene: BattleScene) => { const encounter = scene.currentBattle.mysteryEncounter; // Randomly pick from 1 of the 5 stat trainers to spawn let trainerType: TrainerType; let spriteKeys; + let trainerNameKey: string; switch (randSeedInt(5)) { default: case 0: trainerType = TrainerType.BUCK; spriteKeys = getSpriteKeysFromSpecies(Species.CLAYDOL); + trainerNameKey = "buck"; break; case 1: trainerType = TrainerType.CHERYL; spriteKeys = getSpriteKeysFromSpecies(Species.BLISSEY); + trainerNameKey = "cheryl"; break; case 2: trainerType = TrainerType.MARLEY; spriteKeys = getSpriteKeysFromSpecies(Species.ARCANINE); + trainerNameKey = "marley"; break; case 3: trainerType = TrainerType.MIRA; spriteKeys = getSpriteKeysFromSpecies(Species.ALAKAZAM, false, 1); + trainerNameKey = "mira"; break; case 4: trainerType = TrainerType.RILEY; spriteKeys = getSpriteKeysFromSpecies(Species.LUCARIO, false, 1); + trainerNameKey = "riley"; break; } - encounter.misc = { trainerType }; + // Dialogue and tokens for trainer + encounter.dialogue.intro = [ + { + speaker: `trainerNames:${trainerNameKey}`, + text: `${namespace}.${trainerNameKey}.intro_dialogue` + } + ]; + encounter.options[0].dialogue.selected = [ + { + speaker: `trainerNames:${trainerNameKey}`, + text: `${namespace}.${trainerNameKey}.accept` + } + ]; + encounter.options[1].dialogue.selected = [ + { + speaker: `trainerNames:${trainerNameKey}`, + text: `${namespace}.${trainerNameKey}.decline` + } + ]; + + encounter.setDialogueToken("statTrainerName", i18next.t(`trainerNames:${trainerNameKey}`)); + const eggDescription = i18next.t(`${namespace}.title`) + ":\n" + i18next.t(`trainerNames:${trainerNameKey}`); + encounter.misc = { trainerType, trainerNameKey, trainerEggDescription: eggDescription }; + + // Trainer config const trainerConfig = trainerConfigs[trainerType].copy(); const trainerSpriteKey = trainerConfig.getSpriteKey(); encounter.enemyPartyConfigs.push({ @@ -73,91 +107,80 @@ export const ATrainersTestEncounter: IMysteryEncounter = fileRoot: spriteKeys.fileRoot, hasShadow: true, repeat: true, - isPokemon: true + isPokemon: true, + x: 22, + y: -2, + yShadow: -2 }, { spriteKey: trainerSpriteKey, fileRoot: "trainer", hasShadow: true, - disableAnimation: true + disableAnimation: true, + x: -24, + y: 4, + yShadow: 4 } ]; return true; }) - .withTitle(`${namespace}:title`) - .withDescription(`${namespace}:description`) - .withQuery(`${namespace}:query`) + .withTitle(`${namespace}.title`) + .withDescription(`${namespace}.description`) + .withQuery(`${namespace}.query`) + .withIntroDialogue() .withSimpleOption( { - buttonLabel: `${namespace}:option:1:label`, - buttonTooltip: `${namespace}:option:1:tooltip`, - selected: [ - { - text: `${namespace}:option:selected`, - }, - ], + buttonLabel: `${namespace}.option.1.label`, + buttonTooltip: `${namespace}.option.1.tooltip` }, async (scene: BattleScene) => { const encounter = scene.currentBattle.mysteryEncounter; // Spawn standard trainer battle with memory mushroom reward const config: EnemyPartyConfig = encounter.enemyPartyConfigs[0]; - setEncounterRewards(scene, { guaranteedModifierTypeFuncs: [modifierTypes.TM_COMMON, modifierTypes.TM_GREAT, modifierTypes.MEMORY_MUSHROOM], fillRemaining: true }); + let eggTier; + if (randSeedInt(64) >= 54) { + eggTier = EggTier.MASTER; + } else { + eggTier = EggTier.ULTRA; + } + + await transitionMysteryEncounterIntroVisuals(scene); + + const eggOptions: IEggOptions = { + scene, + pulled: false, + sourceType: EggSourceType.EVENT, + eventEggTypeDescriptor: encounter.misc.trainerEggDescription, + tier: eggTier + }; + encounter.setDialogueToken("eggType", i18next.t(`${namespace}.eggTypes.${eggTier === EggTier.ULTRA ? "epic" : "legendary"}`)); + setEncounterRewards(scene, { fillRemaining: true }, [eggOptions]); + return initBattleWithEnemyConfig(scene, config); } ) .withSimpleOption( { - buttonLabel: `${namespace}:option:2:label`, - buttonTooltip: `${namespace}:option:2:tooltip`, - selected: [ - { - text: `${namespace}:option:selected`, - }, - ], + buttonLabel: `${namespace}.option.2.label`, + buttonTooltip: `${namespace}.option.2.tooltip` }, async (scene: BattleScene) => { const encounter = scene.currentBattle.mysteryEncounter; - // Spawn hard fight with ULTRA/GREAT reward (can improve with luck) - const config: EnemyPartyConfig = encounter.enemyPartyConfigs[1]; + // Full heal party + scene.unshiftPhase(new PartyHealPhase(scene, true)); - setEncounterRewards(scene, { guaranteedModifierTiers: [ModifierTier.ULTRA, ModifierTier.ULTRA, ModifierTier.GREAT, ModifierTier.GREAT], fillRemaining: true }); - - // Seed offsets to remove possibility of different trainers having exact same teams - let ret; - scene.executeWithSeedOffset(() => { - ret = initBattleWithEnemyConfig(scene, config); - }, scene.currentBattle.waveIndex * 100); - return ret; - } - ) - .withSimpleOption( - { - buttonLabel: `${namespace}:option:3:label`, - buttonTooltip: `${namespace}:option:3:tooltip`, - selected: [ - { - text: `${namespace}:option:selected`, - }, - ], - }, - async (scene: BattleScene) => { - const encounter = scene.currentBattle.mysteryEncounter; - // Spawn brutal fight with ROGUE/ULTRA/GREAT reward (can improve with luck) - const config: EnemyPartyConfig = encounter.enemyPartyConfigs[2]; - - // To avoid player level snowballing from picking this option - encounter.expMultiplier = 0.9; - - setEncounterRewards(scene, { guaranteedModifierTiers: [ModifierTier.ROGUE, ModifierTier.ROGUE, ModifierTier.ULTRA, ModifierTier.GREAT], fillRemaining: true }); - - // Seed offsets to remove possibility of different trainers having exact same teams - let ret; - scene.executeWithSeedOffset(() => { - ret = initBattleWithEnemyConfig(scene, config); - }, scene.currentBattle.waveIndex * 1000); - return ret; + const eggOptions: IEggOptions = { + scene, + pulled: false, + sourceType: EggSourceType.EVENT, + eventEggTypeDescriptor: encounter.misc.trainerEggDescription, + tier: EggTier.GREAT + }; + encounter.setDialogueToken("eggType", i18next.t(`${namespace}.eggTypes.rare`)); + setEncounterRewards(scene, { fillRemaining: false, rerollMultiplier: 0 }, [eggOptions]); + leaveEncounterWithoutBattle(scene); } ) .withOutroDialogue([ diff --git a/src/data/mystery-encounters/encounters/absolute-avarice-encounter.ts b/src/data/mystery-encounters/encounters/absolute-avarice-encounter.ts index bd39c586ad9..3f7f86ef744 100644 --- a/src/data/mystery-encounters/encounters/absolute-avarice-encounter.ts +++ b/src/data/mystery-encounters/encounters/absolute-avarice-encounter.ts @@ -164,12 +164,12 @@ export const AbsoluteAvariceEncounter: IMysteryEncounter = }) .withIntroDialogue([ { - text: `${namespace}:intro`, + text: `${namespace}.intro`, } ]) - .withTitle(`${namespace}:title`) - .withDescription(`${namespace}:description`) - .withQuery(`${namespace}:query`) + .withTitle(`${namespace}.title`) + .withDescription(`${namespace}.description`) + .withQuery(`${namespace}.query`) .withOnInit((scene: BattleScene) => { const encounter = scene.currentBattle.mysteryEncounter; @@ -215,7 +215,7 @@ export const AbsoluteAvariceEncounter: IMysteryEncounter = modifierTypes: bossModifierTypes, tags: [BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON], mysteryEncounterBattleEffects: (pokemon: Pokemon) => { - queueEncounterMessage(pokemon.scene, `${namespace}:option:1:boss_enraged`); + queueEncounterMessage(pokemon.scene, `${namespace}.option.1.boss_enraged`); pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [BattleStat.ATK, BattleStat.DEF, BattleStat.SPATK, BattleStat.SPDEF, BattleStat.SPD], 1)); } } @@ -230,11 +230,11 @@ export const AbsoluteAvariceEncounter: IMysteryEncounter = new MysteryEncounterOptionBuilder() .withOptionMode(MysteryEncounterOptionMode.DEFAULT) .withDialogue({ - buttonLabel: `${namespace}:option:1:label`, - buttonTooltip: `${namespace}:option:1:tooltip`, + buttonLabel: `${namespace}.option.1.label`, + buttonTooltip: `${namespace}.option.1.tooltip`, selected: [ { - text: `${namespace}:option:1:selected`, + text: `${namespace}.option.1.selected`, }, ], }) @@ -250,7 +250,7 @@ export const AbsoluteAvariceEncounter: IMysteryEncounter = const seedModifier = revSeed.newModifier(p); scene.addModifier(seedModifier, false, false, false, true); }); - queueEncounterMessage(scene, `${namespace}:option:1:food_stash`); + queueEncounterMessage(scene, `${namespace}.option.1.food_stash`); }; setEncounterRewards(scene, { fillRemaining: true }, null, givePartyPokemonReviverSeeds); @@ -271,11 +271,11 @@ export const AbsoluteAvariceEncounter: IMysteryEncounter = new MysteryEncounterOptionBuilder() .withOptionMode(MysteryEncounterOptionMode.DEFAULT) .withDialogue({ - buttonLabel: `${namespace}:option:2:label`, - buttonTooltip: `${namespace}:option:2:tooltip`, + buttonLabel: `${namespace}.option.2.label`, + buttonTooltip: `${namespace}.option.2.tooltip`, selected: [ { - text: `${namespace}:option:2:selected`, + text: `${namespace}.option.2.selected`, }, ], }) @@ -312,11 +312,11 @@ export const AbsoluteAvariceEncounter: IMysteryEncounter = new MysteryEncounterOptionBuilder() .withOptionMode(MysteryEncounterOptionMode.DEFAULT) .withDialogue({ - buttonLabel: `${namespace}:option:3:label`, - buttonTooltip: `${namespace}:option:3:tooltip`, + buttonLabel: `${namespace}.option.3.label`, + buttonTooltip: `${namespace}.option.3.tooltip`, selected: [ { - text: `${namespace}:option:3:selected`, + text: `${namespace}.option.3.selected`, }, ], }) diff --git a/src/data/mystery-encounters/encounters/offer-you-cant-refuse-encounter.ts b/src/data/mystery-encounters/encounters/an-offer-you-cant-refuse-encounter.ts similarity index 83% rename from src/data/mystery-encounters/encounters/offer-you-cant-refuse-encounter.ts rename to src/data/mystery-encounters/encounters/an-offer-you-cant-refuse-encounter.ts index 80510430be3..0bf3145ea7e 100644 --- a/src/data/mystery-encounters/encounters/offer-you-cant-refuse-encounter.ts +++ b/src/data/mystery-encounters/encounters/an-offer-you-cant-refuse-encounter.ts @@ -21,8 +21,8 @@ const namespace = "mysteryEncounter:offerYouCantRefuse"; * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/72 | GitHub Issue #72} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ -export const OfferYouCantRefuseEncounter: IMysteryEncounter = - MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.OFFER_YOU_CANT_REFUSE) +export const AnOfferYouCantRefuseEncounter: IMysteryEncounter = + MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.AN_OFFER_YOU_CANT_REFUSE) .withEncounterTier(MysteryEncounterTier.GREAT) .withSceneWaveRangeRequirement(10, 180) .withScenePartySizeRequirement(2, 6) // Must have at least 2 pokemon in party @@ -47,16 +47,16 @@ export const OfferYouCantRefuseEncounter: IMysteryEncounter = ]) .withIntroDialogue([ { - text: `${namespace}:intro`, + text: `${namespace}.intro`, }, { - text: `${namespace}:intro_dialogue`, - speaker: `${namespace}:speaker`, + text: `${namespace}.intro_dialogue`, + speaker: `${namespace}.speaker`, }, ]) - .withTitle(`${namespace}:title`) - .withDescription(`${namespace}:description`) - .withQuery(`${namespace}:query`) + .withTitle(`${namespace}.title`) + .withDescription(`${namespace}.description`) + .withQuery(`${namespace}.query`) .withOnInit((scene: BattleScene) => { const encounter = scene.currentBattle.mysteryEncounter; const pokemon = getHighestStatTotalPlayerPokemon(scene, false); @@ -89,12 +89,12 @@ export const OfferYouCantRefuseEncounter: IMysteryEncounter = new MysteryEncounterOptionBuilder() .withOptionMode(MysteryEncounterOptionMode.DEFAULT) .withDialogue({ - buttonLabel: `${namespace}:option:1:label`, - buttonTooltip: `${namespace}:option:1:tooltip`, + buttonLabel: `${namespace}.option.1.label`, + buttonTooltip: `${namespace}.option.1.tooltip`, selected: [ { - text: `${namespace}:option:1:selected`, - speaker: `${namespace}:speaker`, + text: `${namespace}.option.1.selected`, + speaker: `${namespace}.speaker`, }, ], }) @@ -120,13 +120,13 @@ export const OfferYouCantRefuseEncounter: IMysteryEncounter = new AbilityRequirement(EXTORTION_ABILITIES)) ) .withDialogue({ - buttonLabel: `${namespace}:option:2:label`, - buttonTooltip: `${namespace}:option:2:tooltip`, - disabledButtonTooltip: `${namespace}:option:2:tooltip_disabled`, + buttonLabel: `${namespace}.option.2.label`, + buttonTooltip: `${namespace}.option.2.tooltip`, + disabledButtonTooltip: `${namespace}.option.2.tooltip_disabled`, selected: [ { - speaker: `${namespace}:speaker`, - text: `${namespace}:option:2:selected`, + speaker: `${namespace}.speaker`, + text: `${namespace}.option.2.selected`, }, ], }) @@ -144,12 +144,12 @@ export const OfferYouCantRefuseEncounter: IMysteryEncounter = ) .withSimpleOption( { - buttonLabel: `${namespace}:option:3:label`, - buttonTooltip: `${namespace}:option:3:tooltip`, + buttonLabel: `${namespace}.option.3.label`, + buttonTooltip: `${namespace}.option.3.tooltip`, selected: [ { - speaker: `${namespace}:speaker`, - text: `${namespace}:option:3:selected`, + speaker: `${namespace}.speaker`, + text: `${namespace}.option.3.selected`, }, ], }, diff --git a/src/data/mystery-encounters/encounters/dark-deal-encounter.ts b/src/data/mystery-encounters/encounters/dark-deal-encounter.ts index 1e73ffd11c0..e8a8272df0e 100644 --- a/src/data/mystery-encounters/encounters/dark-deal-encounter.ts +++ b/src/data/mystery-encounters/encounters/dark-deal-encounter.ts @@ -92,32 +92,32 @@ export const DarkDealEncounter: IMysteryEncounter = ]) .withIntroDialogue([ { - text: `${namespace}:intro`, + text: `${namespace}.intro`, }, { - speaker: `${namespace}:speaker`, - text: `${namespace}:intro_dialogue`, + speaker: `${namespace}.speaker`, + text: `${namespace}.intro_dialogue`, }, ]) .withSceneWaveRangeRequirement(30, 180) // waves 30 to 180 .withScenePartySizeRequirement(2, 6) // Must have at least 2 pokemon in party .withCatchAllowed(true) - .withTitle(`${namespace}:title`) - .withDescription(`${namespace}:description`) - .withQuery(`${namespace}:query`) + .withTitle(`${namespace}.title`) + .withDescription(`${namespace}.description`) + .withQuery(`${namespace}.query`) .withOption( new MysteryEncounterOptionBuilder() .withOptionMode(MysteryEncounterOptionMode.DEFAULT) .withDialogue({ - buttonLabel: `${namespace}:option:1:label`, - buttonTooltip: `${namespace}:option:1:tooltip`, + buttonLabel: `${namespace}.option.1.label`, + buttonTooltip: `${namespace}.option.1.tooltip`, selected: [ { - speaker: `${namespace}:speaker`, - text: `${namespace}:option:1:selected_dialogue`, + speaker: `${namespace}.speaker`, + text: `${namespace}.option.1.selected_dialogue`, }, { - text: `${namespace}:option:1:selected_message`, + text: `${namespace}.option.1.selected_message`, }, ], }) @@ -164,12 +164,12 @@ export const DarkDealEncounter: IMysteryEncounter = ) .withSimpleOption( { - buttonLabel: `${namespace}:option:2:label`, - buttonTooltip: `${namespace}:option:2:tooltip`, + buttonLabel: `${namespace}.option.2.label`, + buttonTooltip: `${namespace}.option.2.tooltip`, selected: [ { - speaker: `${namespace}:speaker`, - text: `${namespace}:option:2:selected`, + speaker: `${namespace}.speaker`, + text: `${namespace}.option.2.selected`, }, ], }, @@ -181,7 +181,7 @@ export const DarkDealEncounter: IMysteryEncounter = ) .withOutroDialogue([ { - text: `${namespace}:outro` + text: `${namespace}.outro` } ]) .build(); diff --git a/src/data/mystery-encounters/encounters/delibirdy-encounter.ts b/src/data/mystery-encounters/encounters/delibirdy-encounter.ts index 7d1e7a61035..bcab1b4bd02 100644 --- a/src/data/mystery-encounters/encounters/delibirdy-encounter.ts +++ b/src/data/mystery-encounters/encounters/delibirdy-encounter.ts @@ -77,15 +77,15 @@ export const DelibirdyEncounter: IMysteryEncounter = ]) .withIntroDialogue([ { - text: `${namespace}:intro`, + text: `${namespace}.intro`, } ]) - .withTitle(`${namespace}:title`) - .withDescription(`${namespace}:description`) - .withQuery(`${namespace}:query`) + .withTitle(`${namespace}.title`) + .withDescription(`${namespace}.description`) + .withQuery(`${namespace}.query`) .withOutroDialogue([ { - text: `${namespace}:outro`, + text: `${namespace}.outro`, } ]) .withOption( @@ -93,11 +93,11 @@ export const DelibirdyEncounter: IMysteryEncounter = .withOptionMode(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT) .withSceneMoneyRequirement(0, 2.75) // Must have money to spawn .withDialogue({ - buttonLabel: `${namespace}:option:1:label`, - buttonTooltip: `${namespace}:option:1:tooltip`, + buttonLabel: `${namespace}.option.1.label`, + buttonTooltip: `${namespace}.option.1.tooltip`, selected: [ { - text: `${namespace}:option:1:selected`, + text: `${namespace}.option.1.selected`, }, ], }) @@ -130,12 +130,12 @@ export const DelibirdyEncounter: IMysteryEncounter = .withOptionMode(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT) .withPrimaryPokemonRequirement(new HeldItemRequirement(OPTION_2_ALLOWED_MODIFIERS)) .withDialogue({ - buttonLabel: `${namespace}:option:2:label`, - buttonTooltip: `${namespace}:option:2:tooltip`, - secondOptionPrompt: `${namespace}:option:2:select_prompt`, + buttonLabel: `${namespace}.option.2.label`, + buttonTooltip: `${namespace}.option.2.tooltip`, + secondOptionPrompt: `${namespace}.option.2.select_prompt`, selected: [ { - text: `${namespace}:option:2:selected`, + text: `${namespace}.option.2.selected`, }, ], }) @@ -225,12 +225,12 @@ export const DelibirdyEncounter: IMysteryEncounter = .withOptionMode(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT) .withPrimaryPokemonRequirement(new HeldItemRequirement(OPTION_3_DISALLOWED_MODIFIERS, 1, true)) .withDialogue({ - buttonLabel: `${namespace}:option:3:label`, - buttonTooltip: `${namespace}:option:3:tooltip`, - secondOptionPrompt: `${namespace}:option:3:select_prompt`, + buttonLabel: `${namespace}.option.3.label`, + buttonTooltip: `${namespace}.option.3.tooltip`, + secondOptionPrompt: `${namespace}.option.3.select_prompt`, selected: [ { - text: `${namespace}:option:3:selected`, + text: `${namespace}.option.3.selected`, }, ], }) @@ -264,7 +264,7 @@ export const DelibirdyEncounter: IMysteryEncounter = // If pokemon meets primary pokemon reqs, it can be selected const meetsReqs = encounter.options[2].pokemonMeetsPrimaryRequirements(scene, pokemon); if (!meetsReqs) { - return getEncounterText(scene, `${namespace}:invalid_selection`); + return getEncounterText(scene, `${namespace}.invalid_selection`); } return null; 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 65873941bd5..fa27c31c273 100644 --- a/src/data/mystery-encounters/encounters/department-store-sale-encounter.ts +++ b/src/data/mystery-encounters/encounters/department-store-sale-encounter.ts @@ -42,21 +42,21 @@ export const DepartmentStoreSaleEncounter: IMysteryEncounter = ]) .withIntroDialogue([ { - text: `${namespace}:intro`, + text: `${namespace}.intro`, }, { - text: `${namespace}:intro_dialogue`, - speaker: `${namespace}:speaker`, + text: `${namespace}.intro_dialogue`, + speaker: `${namespace}.speaker`, }, ]) .withAutoHideIntroVisuals(false) - .withTitle(`${namespace}:title`) - .withDescription(`${namespace}:description`) - .withQuery(`${namespace}:query`) + .withTitle(`${namespace}.title`) + .withDescription(`${namespace}.description`) + .withQuery(`${namespace}.query`) .withSimpleOption( { - buttonLabel: `${namespace}:option:1:label`, - buttonTooltip: `${namespace}:option:1:tooltip`, + buttonLabel: `${namespace}.option.1.label`, + buttonTooltip: `${namespace}.option.1.tooltip`, }, async (scene: BattleScene) => { // Choose TMs @@ -81,8 +81,8 @@ export const DepartmentStoreSaleEncounter: IMysteryEncounter = ) .withSimpleOption( { - buttonLabel: `${namespace}:option:2:label`, - buttonTooltip: `${namespace}:option:2:tooltip`, + buttonLabel: `${namespace}.option.2.label`, + buttonTooltip: `${namespace}.option.2.tooltip`, }, async (scene: BattleScene) => { // Choose Vitamins @@ -105,8 +105,8 @@ export const DepartmentStoreSaleEncounter: IMysteryEncounter = ) .withSimpleOption( { - buttonLabel: `${namespace}:option:3:label`, - buttonTooltip: `${namespace}:option:3:tooltip`, + buttonLabel: `${namespace}.option.3.label`, + buttonTooltip: `${namespace}.option.3.tooltip`, }, async (scene: BattleScene) => { // Choose X Items @@ -129,8 +129,8 @@ export const DepartmentStoreSaleEncounter: IMysteryEncounter = ) .withSimpleOption( { - buttonLabel: `${namespace}:option:4:label`, - buttonTooltip: `${namespace}:option:4:tooltip`, + buttonLabel: `${namespace}.option.4.label`, + buttonTooltip: `${namespace}.option.4.tooltip`, }, async (scene: BattleScene) => { // Choose Pokeballs @@ -157,7 +157,7 @@ export const DepartmentStoreSaleEncounter: IMysteryEncounter = ) .withOutroDialogue([ { - text: `${namespace}:outro`, + text: `${namespace}.outro`, } ]) .build(); diff --git a/src/data/mystery-encounters/encounters/field-trip-encounter.ts b/src/data/mystery-encounters/encounters/field-trip-encounter.ts index 9f912be1a35..e67aaa1ffad 100644 --- a/src/data/mystery-encounters/encounters/field-trip-encounter.ts +++ b/src/data/mystery-encounters/encounters/field-trip-encounter.ts @@ -42,27 +42,27 @@ export const FieldTripEncounter: IMysteryEncounter = ]) .withIntroDialogue([ { - text: `${namespace}:intro`, + text: `${namespace}.intro`, }, { - text: `${namespace}:intro_dialogue`, - speaker: `${namespace}:speaker`, + text: `${namespace}.intro_dialogue`, + speaker: `${namespace}.speaker`, }, ]) .withAutoHideIntroVisuals(false) - .withTitle(`${namespace}:title`) - .withDescription(`${namespace}:description`) - .withQuery(`${namespace}:query`) + .withTitle(`${namespace}.title`) + .withDescription(`${namespace}.description`) + .withQuery(`${namespace}.query`) .withOption( new MysteryEncounterOptionBuilder() .withOptionMode(MysteryEncounterOptionMode.DEFAULT) .withDialogue({ - buttonLabel: `${namespace}:option:1:label`, - buttonTooltip: `${namespace}:option:1:tooltip`, - secondOptionPrompt: `${namespace}:second_option_prompt`, + buttonLabel: `${namespace}.option.1.label`, + buttonTooltip: `${namespace}.option.1.tooltip`, + secondOptionPrompt: `${namespace}.second_option_prompt`, selected: [ { - text: `${namespace}:option:selected`, + text: `${namespace}.option.selected`, }, ], }) @@ -80,17 +80,17 @@ export const FieldTripEncounter: IMysteryEncounter = if (!correctMove) { encounter.options[0].dialogue.selected = [ { - text: `${namespace}:option:incorrect`, - speaker: `${namespace}:speaker`, + text: `${namespace}.option.incorrect`, + speaker: `${namespace}.speaker`, }, { - text: `${namespace}:option:lesson_learned`, + text: `${namespace}.option.lesson_learned`, }, ]; encounter.dialogue.outro = [ { - text: `${namespace}:outro_bad`, - speaker: `${namespace}:speaker`, + text: `${namespace}.outro_bad`, + speaker: `${namespace}.speaker`, }, ]; setEncounterExp(scene, scene.getParty().map((p) => p.id), 50); @@ -99,13 +99,13 @@ export const FieldTripEncounter: IMysteryEncounter = encounter.setDialogueToken("move", move.getName()); encounter.options[0].dialogue.selected = [ { - text: `${namespace}:option:selected`, + text: `${namespace}.option.selected`, }, ]; encounter.dialogue.outro = [ { - text: `${namespace}:outro_good`, - speaker: `${namespace}:speaker`, + text: `${namespace}.outro_good`, + speaker: `${namespace}.speaker`, }, ]; setEncounterExp(scene, [pokemon.id], 100); @@ -143,12 +143,12 @@ export const FieldTripEncounter: IMysteryEncounter = new MysteryEncounterOptionBuilder() .withOptionMode(MysteryEncounterOptionMode.DEFAULT) .withDialogue({ - buttonLabel: `${namespace}:option:2:label`, - buttonTooltip: `${namespace}:option:2:tooltip`, - secondOptionPrompt: `${namespace}:second_option_prompt`, + buttonLabel: `${namespace}.option.2.label`, + buttonTooltip: `${namespace}.option.2.tooltip`, + secondOptionPrompt: `${namespace}.second_option_prompt`, selected: [ { - text: `${namespace}:option:selected`, + text: `${namespace}.option.selected`, }, ], }) @@ -166,23 +166,23 @@ export const FieldTripEncounter: IMysteryEncounter = if (!correctMove) { encounter.options[1].dialogue.selected = [ { - text: `${namespace}:option:incorrect`, - speaker: `${namespace}:speaker`, + text: `${namespace}.option.incorrect`, + speaker: `${namespace}.speaker`, }, { - text: `${namespace}:option:lesson_learned`, + text: `${namespace}.option.lesson_learned`, }, ]; encounter.dialogue.outro = [ { - text: `${namespace}:outro_bad`, - speaker: `${namespace}:speaker`, + text: `${namespace}.outro_bad`, + speaker: `${namespace}.speaker`, }, ]; encounter.dialogue.outro = [ { - text: `${namespace}:outro_bad`, - speaker: `${namespace}:speaker`, + text: `${namespace}.outro_bad`, + speaker: `${namespace}.speaker`, }, ]; setEncounterExp(scene, scene.getParty().map((p) => p.id), 50); @@ -191,13 +191,13 @@ export const FieldTripEncounter: IMysteryEncounter = encounter.setDialogueToken("move", move.getName()); encounter.options[1].dialogue.selected = [ { - text: `${namespace}:option:selected`, + text: `${namespace}.option.selected`, }, ]; encounter.dialogue.outro = [ { - text: `${namespace}:outro_good`, - speaker: `${namespace}:speaker`, + text: `${namespace}.outro_good`, + speaker: `${namespace}.speaker`, }, ]; setEncounterExp(scene, [pokemon.id], 100); @@ -235,12 +235,12 @@ export const FieldTripEncounter: IMysteryEncounter = new MysteryEncounterOptionBuilder() .withOptionMode(MysteryEncounterOptionMode.DEFAULT) .withDialogue({ - buttonLabel: `${namespace}:option:3:label`, - buttonTooltip: `${namespace}:option:3:tooltip`, - secondOptionPrompt: `${namespace}:second_option_prompt`, + buttonLabel: `${namespace}.option.3.label`, + buttonTooltip: `${namespace}.option.3.tooltip`, + secondOptionPrompt: `${namespace}.second_option_prompt`, selected: [ { - text: `${namespace}:option:selected`, + text: `${namespace}.option.selected`, }, ], }) @@ -258,17 +258,17 @@ export const FieldTripEncounter: IMysteryEncounter = if (!correctMove) { encounter.options[2].dialogue.selected = [ { - text: `${namespace}:option:incorrect`, - speaker: `${namespace}:speaker`, + text: `${namespace}.option.incorrect`, + speaker: `${namespace}.speaker`, }, { - text: `${namespace}:option:lesson_learned`, + text: `${namespace}.option.lesson_learned`, }, ]; encounter.dialogue.outro = [ { - text: `${namespace}:outro_bad`, - speaker: `${namespace}:speaker`, + text: `${namespace}.outro_bad`, + speaker: `${namespace}.speaker`, }, ]; setEncounterExp(scene, scene.getParty().map((p) => p.id), 50); @@ -277,13 +277,13 @@ export const FieldTripEncounter: IMysteryEncounter = encounter.setDialogueToken("move", move.getName()); encounter.options[2].dialogue.selected = [ { - text: `${namespace}:option:selected`, + text: `${namespace}.option.selected`, }, ]; encounter.dialogue.outro = [ { - text: `${namespace}:outro_good`, - speaker: `${namespace}:speaker`, + text: `${namespace}.outro_good`, + speaker: `${namespace}.speaker`, }, ]; setEncounterExp(scene, [pokemon.id], 100); diff --git a/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts b/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts index 20d113bf940..71311481ed1 100644 --- a/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts +++ b/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts @@ -46,7 +46,7 @@ export const FieryFalloutEncounter: IMysteryEncounter = .withAutoHideIntroVisuals(false) .withIntroDialogue([ { - text: `${namespace}:intro`, + text: `${namespace}.intro`, }, ]) .withOnInit((scene: BattleScene) => { @@ -117,28 +117,23 @@ export const FieryFalloutEncounter: IMysteryEncounter = return true; }) - .withTitle(`${namespace}:title`) - .withDescription(`${namespace}:description`) - .withQuery(`${namespace}:query`) + .withTitle(`${namespace}.title`) + .withDescription(`${namespace}.description`) + .withQuery(`${namespace}.query`) .withSimpleOption( { - buttonLabel: `${namespace}:option:1:label`, - buttonTooltip: `${namespace}:option:1:tooltip`, + buttonLabel: `${namespace}.option.1.label`, + buttonTooltip: `${namespace}.option.1.tooltip`, selected: [ { - text: `${namespace}:option:1:selected`, + text: `${namespace}.option.1.selected`, }, ], }, async (scene: BattleScene) => { // Pick battle const encounter = scene.currentBattle.mysteryEncounter; - setEncounterRewards(scene, - { fillRemaining: true }, - null, - () => { - giveLeadPokemonCharcoal(scene); - }); + setEncounterRewards(scene, { fillRemaining: true }, null, () => giveLeadPokemonCharcoal(scene)); encounter.startOfBattleEffects.push( { @@ -170,11 +165,11 @@ export const FieryFalloutEncounter: IMysteryEncounter = ) .withSimpleOption( { - buttonLabel: `${namespace}:option:2:label`, - buttonTooltip: `${namespace}:option:2:tooltip`, + buttonLabel: `${namespace}.option.2.label`, + buttonTooltip: `${namespace}.option.2.tooltip`, selected: [ { - text: `${namespace}:option:2:selected`, + text: `${namespace}.option.2.selected`, }, ], }, @@ -197,7 +192,7 @@ export const FieryFalloutEncounter: IMysteryEncounter = if (chosenPokemon.trySetStatus(StatusEffect.BURN)) { // Burn applied encounter.setDialogueToken("burnedPokemon", chosenPokemon.name); - queueEncounterMessage(scene, `${namespace}:option:2:target_burned`); + queueEncounterMessage(scene, `${namespace}.option.2.target_burned`); } } @@ -211,12 +206,12 @@ export const FieryFalloutEncounter: IMysteryEncounter = .withPrimaryPokemonRequirement(new TypeRequirement(Type.FIRE, true, 1)) // Will set option3PrimaryName dialogue token automatically .withSecondaryPokemonRequirement(new TypeRequirement(Type.FIRE, true, 1)) // Will set option3SecondaryName dialogue token automatically .withDialogue({ - buttonLabel: `${namespace}:option:3:label`, - buttonTooltip: `${namespace}:option:3:tooltip`, - disabledButtonTooltip: `${namespace}:option:3:disabled_tooltip`, + buttonLabel: `${namespace}.option.3.label`, + buttonTooltip: `${namespace}.option.3.tooltip`, + disabledButtonTooltip: `${namespace}.option.3.disabled_tooltip`, selected: [ { - text: `${namespace}:option:3:selected`, + text: `${namespace}.option.3.selected`, }, ], }) @@ -251,6 +246,6 @@ function giveLeadPokemonCharcoal(scene: BattleScene) { const charcoal = generateModifierTypeOption(scene, modifierTypes.ATTACK_TYPE_BOOSTER, [Type.FIRE]).type as AttackTypeBoosterModifierType; applyModifierTypeToPlayerPokemon(scene, leadPokemon, charcoal); scene.currentBattle.mysteryEncounter.setDialogueToken("leadPokemon", leadPokemon.name); - queueEncounterMessage(scene, `${namespace}:found_charcoal`); + queueEncounterMessage(scene, `${namespace}.found_charcoal`); } } 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 55e31406cdb..a60c4ff4c05 100644 --- a/src/data/mystery-encounters/encounters/fight-or-flight-encounter.ts +++ b/src/data/mystery-encounters/encounters/fight-or-flight-encounter.ts @@ -48,7 +48,7 @@ export const FightOrFlightEncounter: IMysteryEncounter = .withIntroSpriteConfigs([]) // Set in onInit() .withIntroDialogue([ { - text: `${namespace}:intro`, + text: `${namespace}.intro`, }, ]) .withOnInit((scene: BattleScene) => { @@ -110,23 +110,23 @@ export const FightOrFlightEncounter: IMysteryEncounter = const primaryPokemon = encounter.options[1].primaryPokemon; if (primaryPokemon) { // Use primaryPokemon to execute the thievery - encounter.options[1].dialogue.buttonTooltip = `${namespace}:option:2:tooltip_special`; + encounter.options[1].dialogue.buttonTooltip = `${namespace}.option.2.tooltip_special`; } else { - encounter.options[1].dialogue.buttonTooltip = `${namespace}:option:2:tooltip`; + encounter.options[1].dialogue.buttonTooltip = `${namespace}.option.2.tooltip`; } return true; }) - .withTitle(`${namespace}:title`) - .withDescription(`${namespace}:description`) - .withQuery(`${namespace}:query`) + .withTitle(`${namespace}.title`) + .withDescription(`${namespace}.description`) + .withQuery(`${namespace}.query`) .withSimpleOption( { - buttonLabel: `${namespace}:option:1:label`, - buttonTooltip: `${namespace}:option:1:tooltip`, + buttonLabel: `${namespace}.option.1.label`, + buttonTooltip: `${namespace}.option.1.tooltip`, selected: [ { - text: `${namespace}:option:1:selected`, + text: `${namespace}.option.1.selected`, }, ], }, @@ -143,8 +143,8 @@ export const FightOrFlightEncounter: IMysteryEncounter = .withOptionMode(MysteryEncounterOptionMode.DEFAULT_OR_SPECIAL) .withPrimaryPokemonRequirement(new MoveRequirement(STEALING_MOVES)) // Will set option2PrimaryName and option2PrimaryMove dialogue tokens automatically .withDialogue({ - buttonLabel: `${namespace}:option:2:label`, - buttonTooltip: `${namespace}:option:2:tooltip`, + buttonLabel: `${namespace}.option.2.label`, + buttonTooltip: `${namespace}.option.2.tooltip`, }) .withOptionPhase(async (scene: BattleScene) => { // Pick steal @@ -156,7 +156,7 @@ export const FightOrFlightEncounter: IMysteryEncounter = const primaryPokemon = encounter.options[1].primaryPokemon; if (primaryPokemon) { // Use primaryPokemon to execute the thievery - await showEncounterText(scene, `${namespace}:option:2:special_result`); + await showEncounterText(scene, `${namespace}.option.2.special_result`); setEncounterExp(scene, primaryPokemon.id, encounter.enemyPartyConfigs[0].pokemonConfigs[0].species.baseExp, true); leaveEncounterWithoutBattle(scene); return; @@ -169,15 +169,15 @@ export const FightOrFlightEncounter: IMysteryEncounter = config.pokemonConfigs[0].tags = [BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON]; config.pokemonConfigs[0].mysteryEncounterBattleEffects = (pokemon: Pokemon) => { pokemon.scene.currentBattle.mysteryEncounter.setDialogueToken("enemyPokemon", getPokemonNameWithAffix(pokemon)); - queueEncounterMessage(pokemon.scene, `${namespace}option:2:boss_enraged`); + queueEncounterMessage(pokemon.scene, `${namespace}option.2.boss_enraged`); pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [BattleStat.ATK, BattleStat.DEF, BattleStat.SPATK, BattleStat.SPDEF, BattleStat.SPD], 1)); }; - await showEncounterText(scene, `${namespace}:option:2:bad_result`); + await showEncounterText(scene, `${namespace}.option.2.bad_result`); await initBattleWithEnemyConfig(scene, config); } else { // Steal item (37.5%) // Display result message then proceed to rewards - await showEncounterText(scene, `${namespace}:option:2:good_result`); + await showEncounterText(scene, `${namespace}.option.2.good_result`); leaveEncounterWithoutBattle(scene); } }) @@ -185,11 +185,11 @@ export const FightOrFlightEncounter: IMysteryEncounter = ) .withSimpleOption( { - buttonLabel: `${namespace}:option:3:label`, - buttonTooltip: `${namespace}:option:3:tooltip`, + buttonLabel: `${namespace}.option.3.label`, + buttonTooltip: `${namespace}.option.3.tooltip`, selected: [ { - text: `${namespace}:option:3:selected`, + text: `${namespace}.option.3.selected`, }, ], }, 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 40c913584bd..02f2393811a 100644 --- a/src/data/mystery-encounters/encounters/lost-at-sea-encounter.ts +++ b/src/data/mystery-encounters/encounters/lost-at-sea-encounter.ts @@ -38,7 +38,7 @@ export const LostAtSeaEncounter: MysteryEncounter = MysteryEncounterBuilder.with y: 3, }, ]) - .withIntroDialogue([{ text: `${namespace}:intro` }]) + .withIntroDialogue([{ text: `${namespace}.intro` }]) .withOnInit((scene: BattleScene) => { const { mysteryEncounter } = scene.currentBattle; @@ -48,22 +48,22 @@ export const LostAtSeaEncounter: MysteryEncounter = MysteryEncounterBuilder.with return true; }) - .withTitle(`${namespace}:title`) - .withDescription(`${namespace}:description`) - .withQuery(`${namespace}:query`) + .withTitle(`${namespace}.title`) + .withDescription(`${namespace}.description`) + .withQuery(`${namespace}.query`) .withOption( // Option 1: Use a (non fainted) pokemon that can learn Surf to guide you back/ new MysteryEncounterOptionBuilder() .withPokemonCanLearnMoveRequirement(OPTION_1_REQUIRED_MOVE) .withOptionMode(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT) .withDialogue({ - buttonLabel: `${namespace}:option:1:label`, - disabledButtonLabel: `${namespace}:option:1:label_disabled`, - buttonTooltip: `${namespace}:option:1:tooltip`, - disabledButtonTooltip: `${namespace}:option:1:tooltip_disabled`, + buttonLabel: `${namespace}.option.1.label`, + disabledButtonLabel: `${namespace}.option.1.label_disabled`, + buttonTooltip: `${namespace}.option.1.tooltip`, + disabledButtonTooltip: `${namespace}.option.1.tooltip_disabled`, selected: [ { - text: `${namespace}:option:1:selected`, + text: `${namespace}.option.1.selected`, }, ], }) @@ -76,13 +76,13 @@ export const LostAtSeaEncounter: MysteryEncounter = MysteryEncounterBuilder.with .withPokemonCanLearnMoveRequirement(OPTION_2_REQUIRED_MOVE) .withOptionMode(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT) .withDialogue({ - buttonLabel: `${namespace}:option:2:label`, - disabledButtonLabel: `${namespace}:option:2:label_disabled`, - buttonTooltip: `${namespace}:option:2:tooltip`, - disabledButtonTooltip: `${namespace}:option:2:tooltip_disabled`, + buttonLabel: `${namespace}.option.2.label`, + disabledButtonLabel: `${namespace}.option.2.label_disabled`, + buttonTooltip: `${namespace}.option.2.tooltip`, + disabledButtonTooltip: `${namespace}.option.2.tooltip_disabled`, selected: [ { - text: `${namespace}:option:2:selected`, + text: `${namespace}.option.2.selected`, }, ], }) @@ -92,11 +92,11 @@ export const LostAtSeaEncounter: MysteryEncounter = MysteryEncounterBuilder.with .withSimpleOption( // Option 3: Wander aimlessly { - buttonLabel: `${namespace}:option:3:label`, - buttonTooltip: `${namespace}:option:3:tooltip`, + buttonLabel: `${namespace}.option.3.label`, + buttonTooltip: `${namespace}.option.3.tooltip`, selected: [ { - text: `${namespace}:option:3:selected`, + text: `${namespace}.option.3.selected`, }, ], }, @@ -116,7 +116,7 @@ export const LostAtSeaEncounter: MysteryEncounter = MysteryEncounterBuilder.with ) .withOutroDialogue([ { - text: `${namespace}:outro`, + text: `${namespace}.outro`, }, ]) .build(); diff --git a/src/data/mystery-encounters/encounters/mysterious-challengers-encounter.ts b/src/data/mystery-encounters/encounters/mysterious-challengers-encounter.ts index ab77f0c4646..368b18b11c0 100644 --- a/src/data/mystery-encounters/encounters/mysterious-challengers-encounter.ts +++ b/src/data/mystery-encounters/encounters/mysterious-challengers-encounter.ts @@ -33,7 +33,7 @@ export const MysteriousChallengersEncounter: IMysteryEncounter = .withIntroSpriteConfigs([]) // These are set in onInit() .withIntroDialogue([ { - text: `${namespace}:intro`, + text: `${namespace}.intro`, }, ]) .withOnInit((scene: BattleScene) => { @@ -122,16 +122,16 @@ export const MysteriousChallengersEncounter: IMysteryEncounter = return true; }) - .withTitle(`${namespace}:title`) - .withDescription(`${namespace}:description`) - .withQuery(`${namespace}:query`) + .withTitle(`${namespace}.title`) + .withDescription(`${namespace}.description`) + .withQuery(`${namespace}.query`) .withSimpleOption( { - buttonLabel: `${namespace}:option:1:label`, - buttonTooltip: `${namespace}:option:1:tooltip`, + buttonLabel: `${namespace}.option.1.label`, + buttonTooltip: `${namespace}.option.1.tooltip`, selected: [ { - text: `${namespace}:option:selected`, + text: `${namespace}.option.selected`, }, ], }, @@ -152,11 +152,11 @@ export const MysteriousChallengersEncounter: IMysteryEncounter = ) .withSimpleOption( { - buttonLabel: `${namespace}:option:2:label`, - buttonTooltip: `${namespace}:option:2:tooltip`, + buttonLabel: `${namespace}.option.2.label`, + buttonTooltip: `${namespace}.option.2.tooltip`, selected: [ { - text: `${namespace}:option:selected`, + text: `${namespace}.option.selected`, }, ], }, @@ -177,11 +177,11 @@ export const MysteriousChallengersEncounter: IMysteryEncounter = ) .withSimpleOption( { - buttonLabel: `${namespace}:option:3:label`, - buttonTooltip: `${namespace}:option:3:tooltip`, + buttonLabel: `${namespace}.option.3.label`, + buttonTooltip: `${namespace}.option.3.tooltip`, selected: [ { - text: `${namespace}:option:selected`, + text: `${namespace}.option.selected`, }, ], }, @@ -205,7 +205,7 @@ export const MysteriousChallengersEncounter: IMysteryEncounter = ) .withOutroDialogue([ { - text: `${namespace}:outro`, + text: `${namespace}.outro`, }, ]) .build(); diff --git a/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts b/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts index e418655bbf5..5f6f235efc2 100644 --- a/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts +++ b/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts @@ -36,21 +36,21 @@ export const MysteriousChestEncounter: IMysteryEncounter = ]) .withIntroDialogue([ { - text: `${namespace}:intro`, + text: `${namespace}.intro`, } ]) - .withTitle(`${namespace}:title`) - .withDescription(`${namespace}:description`) - .withQuery(`${namespace}:query`) + .withTitle(`${namespace}.title`) + .withDescription(`${namespace}.description`) + .withQuery(`${namespace}.query`) .withOption( new MysteryEncounterOptionBuilder() .withOptionMode(MysteryEncounterOptionMode.DEFAULT) .withDialogue({ - buttonLabel: `${namespace}:option:1:label`, - buttonTooltip: `${namespace}:option:1:tooltip`, + buttonLabel: `${namespace}.option.1.label`, + buttonTooltip: `${namespace}.option.1.tooltip`, selected: [ { - text: `${namespace}:option:1:selected`, + text: `${namespace}.option.1.selected`, }, ], }) @@ -75,7 +75,7 @@ export const MysteriousChestEncounter: IMysteryEncounter = ], }); // Display result message then proceed to rewards - queueEncounterMessage(scene, `${namespace}:option:1:normal`); + queueEncounterMessage(scene, `${namespace}.option.1.normal`); leaveEncounterWithoutBattle(scene); } else if (roll > 40) { // Choose between 3 ULTRA tier items (20%) @@ -87,7 +87,7 @@ export const MysteriousChestEncounter: IMysteryEncounter = ], }); // Display result message then proceed to rewards - queueEncounterMessage(scene, `${namespace}:option:1:good`); + queueEncounterMessage(scene, `${namespace}.option.1.good`); leaveEncounterWithoutBattle(scene); } else if (roll > 36) { // Choose between 2 ROGUE tier items (4%) @@ -95,7 +95,7 @@ export const MysteriousChestEncounter: IMysteryEncounter = guaranteedModifierTiers: [ModifierTier.ROGUE, ModifierTier.ROGUE], }); // Display result message then proceed to rewards - queueEncounterMessage(scene, `${namespace}:option:1:great`); + queueEncounterMessage(scene, `${namespace}.option.1.great`); leaveEncounterWithoutBattle(scene); } else if (roll > 35) { // Choose 1 MASTER tier item (1%) @@ -103,7 +103,7 @@ export const MysteriousChestEncounter: IMysteryEncounter = guaranteedModifierTiers: [ModifierTier.MASTER], }); // Display result message then proceed to rewards - queueEncounterMessage(scene, `${namespace}:option:1:amazing`); + queueEncounterMessage(scene, `${namespace}.option.1.amazing`); leaveEncounterWithoutBattle(scene); } else { // Your highest level unfainted Pok�mon gets OHKO. Progress with no rewards (35%) @@ -116,7 +116,7 @@ export const MysteriousChestEncounter: IMysteryEncounter = scene.currentBattle.mysteryEncounter.setDialogueToken("pokeName", highestLevelPokemon.name); // Show which Pokemon was KOed, then leave encounter with no rewards // Does this synchronously so that game over doesn't happen over result message - await showEncounterText(scene, `${namespace}:option:1:bad`).then(() => { + await showEncounterText(scene, `${namespace}.option.1.bad`).then(() => { leaveEncounterWithoutBattle(scene); }); } @@ -125,11 +125,11 @@ export const MysteriousChestEncounter: IMysteryEncounter = ) .withSimpleOption( { - buttonLabel: `${namespace}:option:2:label`, - buttonTooltip: `${namespace}:option:2:tooltip`, + buttonLabel: `${namespace}.option.2.label`, + buttonTooltip: `${namespace}.option.2.tooltip`, selected: [ { - text: `${namespace}:option:2:selected`, + text: `${namespace}.option.2.selected`, }, ], }, diff --git a/src/data/mystery-encounters/encounters/safari-zone-encounter.ts b/src/data/mystery-encounters/encounters/safari-zone-encounter.ts index d193b5a5d00..e110d43fc50 100644 --- a/src/data/mystery-encounters/encounters/safari-zone-encounter.ts +++ b/src/data/mystery-encounters/encounters/safari-zone-encounter.ts @@ -45,26 +45,21 @@ export const SafariZoneEncounter: IMysteryEncounter = ]) .withIntroDialogue([ { - text: `${namespace}:intro`, + text: `${namespace}.intro`, }, ]) - .withTitle(`${namespace}:title`) - .withDescription(`${namespace}:description`) - .withQuery(`${namespace}:query`) - // .withEnterIntroVisualsFromRight(true) - // .withOnVisualsStart((scene: BattleScene) => { - // scene.setFieldScale(0.9); - // return true; - // }) + .withTitle(`${namespace}.title`) + .withDescription(`${namespace}.description`) + .withQuery(`${namespace}.query`) .withOption(new MysteryEncounterOptionBuilder() .withOptionMode(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT) .withSceneRequirement(new MoneyRequirement(0, 2.75)) // Cost equal to 1 Max Revive .withDialogue({ - buttonLabel: `${namespace}:option:1:label`, - buttonTooltip: `${namespace}:option:1:tooltip`, + buttonLabel: `${namespace}.option.1.label`, + buttonTooltip: `${namespace}.option.1.tooltip`, selected: [ { - text: `${namespace}:option:1:selected`, + text: `${namespace}.option.1.selected`, }, ], }) @@ -90,11 +85,11 @@ export const SafariZoneEncounter: IMysteryEncounter = ) .withSimpleOption( { - buttonLabel: `${namespace}:option:2:label`, - buttonTooltip: `${namespace}:option:2:tooltip`, + buttonLabel: `${namespace}.option.2.label`, + buttonTooltip: `${namespace}.option.2.tooltip`, selected: [ { - text: `${namespace}:option:2:selected`, + text: `${namespace}.option.2.selected`, }, ], }, @@ -125,11 +120,11 @@ const safariZoneGameOptions: MysteryEncounterOption[] = [ new MysteryEncounterOptionBuilder() .withOptionMode(MysteryEncounterOptionMode.DEFAULT) .withDialogue({ - buttonLabel: `${namespace}:safari:1:label`, - buttonTooltip: `${namespace}:safari:1:tooltip`, + buttonLabel: `${namespace}.safari.1.label`, + buttonTooltip: `${namespace}.safari.1.tooltip`, selected: [ { - text: `${namespace}:safari:1:selected`, + text: `${namespace}.safari.1.selected`, } ], }) @@ -158,11 +153,11 @@ const safariZoneGameOptions: MysteryEncounterOption[] = [ new MysteryEncounterOptionBuilder() .withOptionMode(MysteryEncounterOptionMode.DEFAULT) .withDialogue({ - buttonLabel: `${namespace}:safari:2:label`, - buttonTooltip: `${namespace}:safari:2:tooltip`, + buttonLabel: `${namespace}.safari.2.label`, + buttonTooltip: `${namespace}.safari.2.tooltip`, selected: [ { - text: `${namespace}:safari:2:selected`, + text: `${namespace}.safari.2.selected`, }, ], }) @@ -176,9 +171,9 @@ const safariZoneGameOptions: MysteryEncounterOption[] = [ // 80% chance to increase flee stage +1 const fleeChangeResult = tryChangeFleeStage(scene, 1, 8); if (!fleeChangeResult) { - await showEncounterText(scene, getEncounterText(scene, `${namespace}:safari:busy_eating`), 1000, false ); + await showEncounterText(scene, getEncounterText(scene, `${namespace}.safari.busy_eating`), 1000, false ); } else { - await showEncounterText(scene, getEncounterText(scene, `${namespace}:safari:eating`), 1000, false); + await showEncounterText(scene, getEncounterText(scene, `${namespace}.safari.eating`), 1000, false); } await doEndTurn(scene, 1); @@ -188,11 +183,11 @@ const safariZoneGameOptions: MysteryEncounterOption[] = [ new MysteryEncounterOptionBuilder() .withOptionMode(MysteryEncounterOptionMode.DEFAULT) .withDialogue({ - buttonLabel: `${namespace}:safari:3:label`, - buttonTooltip: `${namespace}:safari:3:tooltip`, + buttonLabel: `${namespace}.safari.3.label`, + buttonTooltip: `${namespace}.safari.3.tooltip`, selected: [ { - text: `${namespace}:safari:3:selected`, + text: `${namespace}.safari.3.selected`, }, ], }) @@ -205,9 +200,9 @@ const safariZoneGameOptions: MysteryEncounterOption[] = [ // 80% chance to decrease catch stage -1 const catchChangeResult = tryChangeCatchStage(scene, -1, 8); if (!catchChangeResult) { - await showEncounterText(scene, getEncounterText(scene, `${namespace}:safari:beside_itself_angry`), 1000, false ); + await showEncounterText(scene, getEncounterText(scene, `${namespace}.safari.beside_itself_angry`), 1000, false ); } else { - await showEncounterText(scene, getEncounterText(scene, `${namespace}:safari:angry`), 1000, false ); + await showEncounterText(scene, getEncounterText(scene, `${namespace}.safari.angry`), 1000, false ); } await doEndTurn(scene, 2); @@ -217,8 +212,8 @@ const safariZoneGameOptions: MysteryEncounterOption[] = [ new MysteryEncounterOptionBuilder() .withOptionMode(MysteryEncounterOptionMode.DEFAULT) .withDialogue({ - buttonLabel: `${namespace}:safari:4:label`, - buttonTooltip: `${namespace}:safari:4:tooltip`, + buttonLabel: `${namespace}.safari.4.label`, + buttonTooltip: `${namespace}.safari.4.tooltip`, }) .withOptionPhase(async (scene: BattleScene) => { // Flee option @@ -241,7 +236,7 @@ async function summonSafariPokemon(scene: BattleScene) { const encounter = scene.currentBattle.mysteryEncounter; // Message pokemon remaining encounter.setDialogueToken("remainingCount", encounter.misc.safariPokemonRemaining); - scene.queueMessage(getEncounterText(scene, `${namespace}:safari:remaining_count`), null, true); + scene.queueMessage(getEncounterText(scene, `${namespace}.safari.remaining_count`), null, true); // Generate pokemon using safariPokemonRemaining so they are always the same pokemon no matter how many turns are taken // Safari pokemon roll twice on shiny and HA chances, but are otherwise normal @@ -495,7 +490,7 @@ async function doEndTurn(scene: BattleScene, cursorIndex: number) { leaveEncounterWithoutBattle(scene, true); } } else { - scene.queueMessage(getEncounterText(scene, `${namespace}:safari:watching`), 0, null, 1000); + scene.queueMessage(getEncounterText(scene, `${namespace}.safari.watching`), 0, null, 1000); initSubsequentOptionSelect(scene, { overrideOptions: safariZoneGameOptions, startingCursorIndex: cursorIndex, hideDescription: 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 bd7afdaa832..86a8a614ba6 100644 --- a/src/data/mystery-encounters/encounters/shady-vitamin-dealer-encounter.ts +++ b/src/data/mystery-encounters/encounters/shady-vitamin-dealer-encounter.ts @@ -49,26 +49,26 @@ export const ShadyVitaminDealerEncounter: IMysteryEncounter = ]) .withIntroDialogue([ { - text: `${namespace}:intro`, + text: `${namespace}.intro`, }, { - text: `${namespace}:intro_dialogue`, - speaker: `${namespace}:speaker`, + text: `${namespace}.intro_dialogue`, + speaker: `${namespace}.speaker`, }, ]) - .withTitle(`${namespace}:title`) - .withDescription(`${namespace}:description`) - .withQuery(`${namespace}:query`) + .withTitle(`${namespace}.title`) + .withDescription(`${namespace}.description`) + .withQuery(`${namespace}.query`) .withOption( new MysteryEncounterOptionBuilder() .withOptionMode(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT) .withSceneMoneyRequirement(0, 2) // Wave scaling money multiplier of 2 .withDialogue({ - buttonLabel: `${namespace}:option:1:label`, - buttonTooltip: `${namespace}:option:1:tooltip`, + buttonLabel: `${namespace}.option.1.label`, + buttonTooltip: `${namespace}.option.1.tooltip`, selected: [ { - text: `${namespace}:option:selected`, + text: `${namespace}.option.selected`, }, ], }) @@ -127,13 +127,13 @@ export const ShadyVitaminDealerEncounter: IMysteryEncounter = if (randSeedInt(10) < 8) { if (chosenPokemon.trySetStatus(StatusEffect.TOXIC)) { // Toxic applied - queueEncounterMessage(scene, `${namespace}:bad_poison`); + queueEncounterMessage(scene, `${namespace}.bad_poison`); } else { // Pokemon immune or something else prevents status - queueEncounterMessage(scene, `${namespace}:damage_only`); + queueEncounterMessage(scene, `${namespace}.damage_only`); } } else { - queueEncounterMessage(scene, `${namespace}:damage_only`); + queueEncounterMessage(scene, `${namespace}.damage_only`); } setEncounterExp(scene, [chosenPokemon.id], 100); @@ -147,11 +147,11 @@ export const ShadyVitaminDealerEncounter: IMysteryEncounter = .withOptionMode(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT) .withSceneMoneyRequirement(0, 5) // Wave scaling money multiplier of 5 .withDialogue({ - buttonLabel: `${namespace}:option:2:label`, - buttonTooltip: `${namespace}:option:2:tooltip`, + buttonLabel: `${namespace}.option.2.label`, + buttonTooltip: `${namespace}.option.2.tooltip`, selected: [ { - text: `${namespace}:option:selected`, + text: `${namespace}.option.selected`, }, ], }) @@ -178,7 +178,7 @@ export const ShadyVitaminDealerEncounter: IMysteryEncounter = // If pokemon meets primary pokemon reqs, it can be selected const meetsReqs = encounter.pokemonMeetsPrimaryRequirements(scene, pokemon); if (!meetsReqs) { - return getEncounterText(scene, `${namespace}:invalid_selection`); + return getEncounterText(scene, `${namespace}.invalid_selection`); } return null; @@ -207,13 +207,13 @@ export const ShadyVitaminDealerEncounter: IMysteryEncounter = if (randSeedInt(10) < 2) { if (chosenPokemon.trySetStatus(StatusEffect.POISON)) { // Poison applied - queueEncounterMessage(scene, `${namespace}:poison`); + queueEncounterMessage(scene, `${namespace}.poison`); } else { // Pokemon immune or something else prevents status - queueEncounterMessage(scene, `${namespace}:no_bad_effects`); + queueEncounterMessage(scene, `${namespace}.no_bad_effects`); } } else { - queueEncounterMessage(scene, `${namespace}:no_bad_effects`); + queueEncounterMessage(scene, `${namespace}.no_bad_effects`); } setEncounterExp(scene, [chosenPokemon.id], 100); @@ -224,12 +224,12 @@ export const ShadyVitaminDealerEncounter: IMysteryEncounter = ) .withSimpleOption( { - buttonLabel: `${namespace}:option:3:label`, - buttonTooltip: `${namespace}:option:3:tooltip`, + buttonLabel: `${namespace}.option.3.label`, + buttonTooltip: `${namespace}.option.3.tooltip`, selected: [ { - text: `${namespace}:option:3:selected`, - speaker: `${namespace}:speaker` + text: `${namespace}.option.3.selected`, + speaker: `${namespace}.speaker` } ] }, diff --git a/src/data/mystery-encounters/encounters/slumbering-snorlax-encounter.ts b/src/data/mystery-encounters/encounters/slumbering-snorlax-encounter.ts index dd3a2057502..6d56f2cde46 100644 --- a/src/data/mystery-encounters/encounters/slumbering-snorlax-encounter.ts +++ b/src/data/mystery-encounters/encounters/slumbering-snorlax-encounter.ts @@ -44,7 +44,7 @@ export const SlumberingSnorlaxEncounter: IMysteryEncounter = ]) .withIntroDialogue([ { - text: `${namespace}:intro`, + text: `${namespace}.intro`, }, ]) .withOnInit((scene: BattleScene) => { @@ -70,16 +70,16 @@ export const SlumberingSnorlaxEncounter: IMysteryEncounter = return true; }) - .withTitle(`${namespace}:title`) - .withDescription(`${namespace}:description`) - .withQuery(`${namespace}:query`) + .withTitle(`${namespace}.title`) + .withDescription(`${namespace}.description`) + .withQuery(`${namespace}.query`) .withSimpleOption( { - buttonLabel: `${namespace}:option:1:label`, - buttonTooltip: `${namespace}:option:1:tooltip`, + buttonLabel: `${namespace}.option.1.label`, + buttonTooltip: `${namespace}.option.1.tooltip`, selected: [ { - text: `${namespace}:option:1:selected`, + text: `${namespace}.option.1.selected`, }, ], }, @@ -105,11 +105,11 @@ export const SlumberingSnorlaxEncounter: IMysteryEncounter = ) .withSimpleOption( { - buttonLabel: `${namespace}:option:2:label`, - buttonTooltip: `${namespace}:option:2:tooltip`, + buttonLabel: `${namespace}.option.2.label`, + buttonTooltip: `${namespace}.option.2.tooltip`, selected: [ { - text: `${namespace}:option:2:selected`, + text: `${namespace}.option.2.selected`, }, ], }, @@ -117,7 +117,7 @@ export const SlumberingSnorlaxEncounter: IMysteryEncounter = // Fall asleep waiting for Snorlax // Full heal party scene.unshiftPhase(new PartyHealPhase(scene, true)); - queueEncounterMessage(scene, `${namespace}:option:2:rest_result`); + queueEncounterMessage(scene, `${namespace}.option.2.rest_result`); leaveEncounterWithoutBattle(scene); } ) @@ -126,12 +126,12 @@ export const SlumberingSnorlaxEncounter: IMysteryEncounter = .withOptionMode(MysteryEncounterOptionMode.DISABLED_OR_SPECIAL) .withPrimaryPokemonRequirement(new MoveRequirement(STEALING_MOVES)) .withDialogue({ - buttonLabel: `${namespace}:option:3:label`, - buttonTooltip: `${namespace}:option:3:tooltip`, - disabledButtonTooltip: `${namespace}:option:3:disabled_tooltip`, + buttonLabel: `${namespace}.option.3.label`, + buttonTooltip: `${namespace}.option.3.tooltip`, + disabledButtonTooltip: `${namespace}.option.3.disabled_tooltip`, selected: [ { - text: `${namespace}:option:3:selected` + text: `${namespace}.option.3.selected` } ] }) diff --git a/src/data/mystery-encounters/encounters/pokemon-salesman-encounter.ts b/src/data/mystery-encounters/encounters/the-pokemon-salesman-encounter.ts similarity index 87% rename from src/data/mystery-encounters/encounters/pokemon-salesman-encounter.ts rename to src/data/mystery-encounters/encounters/the-pokemon-salesman-encounter.ts index b0cbb454042..26ddf86719d 100644 --- a/src/data/mystery-encounters/encounters/pokemon-salesman-encounter.ts +++ b/src/data/mystery-encounters/encounters/the-pokemon-salesman-encounter.ts @@ -25,8 +25,8 @@ const MAX_POKEMON_PRICE_MULTIPLIER = 6; * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/36 | GitHub Issue #36} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ -export const PokemonSalesmanEncounter: IMysteryEncounter = - MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.POKEMON_SALESMAN) +export const ThePokemonSalesmanEncounter: IMysteryEncounter = + MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.THE_POKEMON_SALESMAN) .withEncounterTier(MysteryEncounterTier.ULTRA) .withSceneWaveRangeRequirement(10, 180) .withSceneRequirement(new MoneyRequirement(null, MAX_POKEMON_PRICE_MULTIPLIER)) // Some costs may not be as significant, this is the max you'd pay @@ -40,16 +40,16 @@ export const PokemonSalesmanEncounter: IMysteryEncounter = ]) .withIntroDialogue([ { - text: `${namespace}:intro`, + text: `${namespace}.intro`, }, { - text: `${namespace}:intro_dialogue`, - speaker: `${namespace}:speaker`, + text: `${namespace}.intro_dialogue`, + speaker: `${namespace}.speaker`, }, ]) - .withTitle(`${namespace}:title`) - .withDescription(`${namespace}:description`) - .withQuery(`${namespace}:query`) + .withTitle(`${namespace}.title`) + .withDescription(`${namespace}.description`) + .withQuery(`${namespace}.query`) .withOnInit((scene: BattleScene) => { const encounter = scene.currentBattle.mysteryEncounter; @@ -88,8 +88,8 @@ export const PokemonSalesmanEncounter: IMysteryEncounter = // Always max price for shiny (flip HA back to normal), and add special messaging priceMultiplier = MAX_POKEMON_PRICE_MULTIPLIER; pokemon.abilityIndex = 0; - encounter.dialogue.encounterOptionsDialogue.description = `${namespace}:description_shiny`; - encounter.options[0].dialogue.buttonTooltip = `${namespace}:option:1:tooltip_shiny`; + encounter.dialogue.encounterOptionsDialogue.description = `${namespace}.description_shiny`; + encounter.options[0].dialogue.buttonTooltip = `${namespace}.option.1.tooltip_shiny`; } const price = scene.getWaveMoneyAmount(priceMultiplier); encounter.setDialogueToken("purchasePokemon", pokemon.name); @@ -109,11 +109,11 @@ export const PokemonSalesmanEncounter: IMysteryEncounter = .withHasDexProgress(true) .withSceneMoneyRequirement(null, MAX_POKEMON_PRICE_MULTIPLIER) // Wave scaling money multiplier of 2 .withDialogue({ - buttonLabel: `${namespace}:option:1:label`, - buttonTooltip: `${namespace}:option:1:tooltip`, + buttonLabel: `${namespace}.option.1.label`, + buttonTooltip: `${namespace}.option.1.tooltip`, selected: [ { - text: `${namespace}:option:1:selected_message`, + text: `${namespace}.option.1.selected_message`, } ], }) @@ -126,7 +126,7 @@ export const PokemonSalesmanEncounter: IMysteryEncounter = updatePlayerMoney(scene, -price, true, false); // Show dialogue - await showEncounterDialogue(scene, `${namespace}:option:1:selected_dialogue`, `${namespace}:speaker`); + await showEncounterDialogue(scene, `${namespace}.option.1.selected_dialogue`, `${namespace}.speaker`); await transitionMysteryEncounterIntroVisuals(scene); // "Catch" purchased pokemon @@ -140,11 +140,11 @@ export const PokemonSalesmanEncounter: IMysteryEncounter = ) .withSimpleOption( { - buttonLabel: `${namespace}:option:2:label`, - buttonTooltip: `${namespace}:option:2:tooltip`, + buttonLabel: `${namespace}.option.2.label`, + buttonTooltip: `${namespace}.option.2.tooltip`, selected: [ { - text: `${namespace}:option:2:selected`, + text: `${namespace}.option.2.selected`, }, ], }, 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 f92e33683d6..e3e410b5b93 100644 --- a/src/data/mystery-encounters/encounters/the-strong-stuff-encounter.ts +++ b/src/data/mystery-encounters/encounters/the-strong-stuff-encounter.ts @@ -55,7 +55,7 @@ export const TheStrongStuffEncounter: IMysteryEncounter = ]) // Set in onInit() .withIntroDialogue([ { - text: `${namespace}:intro`, + text: `${namespace}.intro`, }, ]) .withOnInit((scene: BattleScene) => { @@ -82,7 +82,7 @@ export const TheStrongStuffEncounter: IMysteryEncounter = ], tags: [BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON], mysteryEncounterBattleEffects: (pokemon: Pokemon) => { - queueEncounterMessage(pokemon.scene, `${namespace}:option:2:stat_boost`); + queueEncounterMessage(pokemon.scene, `${namespace}.option.2.stat_boost`); pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [BattleStat.DEF, BattleStat.SPDEF], 2)); } } @@ -95,16 +95,16 @@ export const TheStrongStuffEncounter: IMysteryEncounter = return true; }) - .withTitle(`${namespace}:title`) - .withDescription(`${namespace}:description`) - .withQuery(`${namespace}:query`) + .withTitle(`${namespace}.title`) + .withDescription(`${namespace}.description`) + .withQuery(`${namespace}.query`) .withSimpleOption( { - buttonLabel: `${namespace}:option:1:label`, - buttonTooltip: `${namespace}:option:1:tooltip`, + buttonLabel: `${namespace}.option.1.label`, + buttonTooltip: `${namespace}.option.1.tooltip`, selected: [ { - text: `${namespace}:option:1:selected` + text: `${namespace}.option.1.selected` } ] }, @@ -148,7 +148,7 @@ export const TheStrongStuffEncounter: IMysteryEncounter = } encounter.setDialogueToken("highBstPokemon", highestBst.name); - await showEncounterText(scene, `${namespace}:option:1:selected_2`, null, true); + await showEncounterText(scene, `${namespace}.option.1.selected_2`, null, true); setEncounterRewards(scene, { fillRemaining: true }); leaveEncounterWithoutBattle(scene, true); @@ -157,11 +157,11 @@ export const TheStrongStuffEncounter: IMysteryEncounter = ) .withSimpleOption( { - buttonLabel: `${namespace}:option:2:label`, - buttonTooltip: `${namespace}:option:2:tooltip`, + buttonLabel: `${namespace}.option.2.label`, + buttonTooltip: `${namespace}.option.2.tooltip`, selected: [ { - text: `${namespace}:option:2:selected`, + text: `${namespace}.option.2.selected`, }, ], }, diff --git a/src/data/mystery-encounters/encounters/training-session-encounter.ts b/src/data/mystery-encounters/encounters/training-session-encounter.ts index 02bee131a02..c6cd93068b9 100644 --- a/src/data/mystery-encounters/encounters/training-session-encounter.ts +++ b/src/data/mystery-encounters/encounters/training-session-encounter.ts @@ -46,22 +46,22 @@ export const TrainingSessionEncounter: IMysteryEncounter = ]) .withIntroDialogue([ { - text: `${namespace}:intro`, + text: `${namespace}.intro`, } ]) - .withTitle(`${namespace}:title`) - .withDescription(`${namespace}:description`) - .withQuery(`${namespace}:query`) + .withTitle(`${namespace}.title`) + .withDescription(`${namespace}.description`) + .withQuery(`${namespace}.query`) .withOption( new MysteryEncounterOptionBuilder() .withOptionMode(MysteryEncounterOptionMode.DEFAULT) .withHasDexProgress(true) .withDialogue({ - buttonLabel: `${namespace}:option:1:label`, - buttonTooltip: `${namespace}:option:1:tooltip`, + buttonLabel: `${namespace}.option.1.label`, + buttonTooltip: `${namespace}.option.1.tooltip`, selected: [ { - text: `${namespace}:option:selected`, + text: `${namespace}.option.selected`, }, ], }) @@ -77,7 +77,7 @@ export const TrainingSessionEncounter: IMysteryEncounter = const selectableFilter = (pokemon: Pokemon) => { const meetsReqs = pokemon.isAllowedInBattle(); if (!meetsReqs) { - return getEncounterText(scene, `${namespace}:invalid_selection`); + return getEncounterText(scene, `${namespace}.invalid_selection`); } return null; @@ -182,7 +182,7 @@ export const TrainingSessionEncounter: IMysteryEncounter = scene.addModifier(mod, true, false, false, true); } scene.updateModifiers(true); - queueEncounterMessage(scene, `${namespace}:option:1:finished`); + queueEncounterMessage(scene, `${namespace}.option.1.finished`); }; setEncounterRewards( @@ -201,12 +201,12 @@ export const TrainingSessionEncounter: IMysteryEncounter = .withOptionMode(MysteryEncounterOptionMode.DEFAULT) .withHasDexProgress(true) .withDialogue({ - buttonLabel: `${namespace}:option:2:label`, - buttonTooltip: `${namespace}:option:2:tooltip`, - secondOptionPrompt: `${namespace}:option:2:select_prompt`, + buttonLabel: `${namespace}.option.2.label`, + buttonTooltip: `${namespace}.option.2.tooltip`, + secondOptionPrompt: `${namespace}.option.2.select_prompt`, selected: [ { - text: `${namespace}:option:selected`, + text: `${namespace}.option.selected`, }, ], }) @@ -237,7 +237,7 @@ export const TrainingSessionEncounter: IMysteryEncounter = const selectableFilter = (pokemon: Pokemon) => { const meetsReqs = pokemon.isAllowedInBattle(); if (!meetsReqs) { - return getEncounterText(scene, `${namespace}:invalid_selection`); + return getEncounterText(scene, `${namespace}.invalid_selection`); } return null; @@ -265,7 +265,7 @@ export const TrainingSessionEncounter: IMysteryEncounter = scene.removePokemonFromPlayerParty(playerPokemon, false); const onBeforeRewardsPhase = () => { - queueEncounterMessage(scene, `${namespace}:option:2:finished`); + queueEncounterMessage(scene, `${namespace}.option.2.finished`); // Add the pokemon back to party with Nature change playerPokemon.setNature(encounter.misc.chosenNature); scene.gameData.setPokemonCaught(playerPokemon, false); @@ -294,12 +294,12 @@ export const TrainingSessionEncounter: IMysteryEncounter = .withOptionMode(MysteryEncounterOptionMode.DEFAULT) .withHasDexProgress(true) .withDialogue({ - buttonLabel: `${namespace}:option:3:label`, - buttonTooltip: `${namespace}:option:3:tooltip`, - secondOptionPrompt: `${namespace}:option:3:select_prompt`, + buttonLabel: `${namespace}.option.3.label`, + buttonTooltip: `${namespace}.option.3.tooltip`, + secondOptionPrompt: `${namespace}.option.3.select_prompt`, selected: [ { - text: `${namespace}:option:selected`, + text: `${namespace}.option.selected`, }, ], }) @@ -339,7 +339,7 @@ export const TrainingSessionEncounter: IMysteryEncounter = const selectableFilter = (pokemon: Pokemon) => { const meetsReqs = pokemon.isAllowedInBattle(); if (!meetsReqs) { - return getEncounterText(scene, `${namespace}:invalid_selection`); + return getEncounterText(scene, `${namespace}.invalid_selection`); } return null; @@ -371,7 +371,7 @@ export const TrainingSessionEncounter: IMysteryEncounter = scene.removePokemonFromPlayerParty(playerPokemon, false); const onBeforeRewardsPhase = () => { - queueEncounterMessage(scene, `${namespace}:option:3:finished`); + queueEncounterMessage(scene, `${namespace}.option.3.finished`); // Add the pokemon back to party with ability change const abilityIndex = encounter.misc.abilityIndex; if (!!playerPokemon.getFusionSpeciesForm()) { diff --git a/src/data/mystery-encounters/mystery-encounters.ts b/src/data/mystery-encounters/mystery-encounters.ts index 68f01220793..c4a3251e6af 100644 --- a/src/data/mystery-encounters/mystery-encounters.ts +++ b/src/data/mystery-encounters/mystery-encounters.ts @@ -14,8 +14,8 @@ import IMysteryEncounter from "./mystery-encounter"; import { SafariZoneEncounter } from "#app/data/mystery-encounters/encounters/safari-zone-encounter"; import { FieryFalloutEncounter } from "#app/data/mystery-encounters/encounters/fiery-fallout-encounter"; import { TheStrongStuffEncounter } from "#app/data/mystery-encounters/encounters/the-strong-stuff-encounter"; -import { PokemonSalesmanEncounter } from "#app/data/mystery-encounters/encounters/pokemon-salesman-encounter"; -import { OfferYouCantRefuseEncounter } from "#app/data/mystery-encounters/encounters/offer-you-cant-refuse-encounter"; +import { ThePokemonSalesmanEncounter } from "#app/data/mystery-encounters/encounters/the-pokemon-salesman-encounter"; +import { AnOfferYouCantRefuseEncounter } from "#app/data/mystery-encounters/encounters/an-offer-you-cant-refuse-encounter"; import { DelibirdyEncounter } from "#app/data/mystery-encounters/encounters/delibirdy-encounter"; import { AbsoluteAvariceEncounter } from "#app/data/mystery-encounters/encounters/absolute-avarice-encounter"; import { ATrainersTestEncounter } from "#app/data/mystery-encounters/encounters/a-trainers-test-encounter"; @@ -138,8 +138,8 @@ const nonExtremeBiomeEncounters: MysteryEncounterType[] = [ const humanTransitableBiomeEncounters: MysteryEncounterType[] = [ MysteryEncounterType.MYSTERIOUS_CHALLENGERS, MysteryEncounterType.SHADY_VITAMIN_DEALER, - MysteryEncounterType.POKEMON_SALESMAN, - MysteryEncounterType.OFFER_YOU_CANT_REFUSE + MysteryEncounterType.THE_POKEMON_SALESMAN, + MysteryEncounterType.AN_OFFER_YOU_CANT_REFUSE ]; const civilizationBiomeEncounters: MysteryEncounterType[] = [ @@ -238,8 +238,8 @@ export function initMysteryEncounters() { allMysteryEncounters[MysteryEncounterType.LOST_AT_SEA] = LostAtSeaEncounter; allMysteryEncounters[MysteryEncounterType.FIERY_FALLOUT] = FieryFalloutEncounter; allMysteryEncounters[MysteryEncounterType.THE_STRONG_STUFF] = TheStrongStuffEncounter; - allMysteryEncounters[MysteryEncounterType.POKEMON_SALESMAN] = PokemonSalesmanEncounter; - allMysteryEncounters[MysteryEncounterType.OFFER_YOU_CANT_REFUSE] = OfferYouCantRefuseEncounter; + allMysteryEncounters[MysteryEncounterType.THE_POKEMON_SALESMAN] = ThePokemonSalesmanEncounter; + allMysteryEncounters[MysteryEncounterType.AN_OFFER_YOU_CANT_REFUSE] = AnOfferYouCantRefuseEncounter; allMysteryEncounters[MysteryEncounterType.DELIBIRDY] = DelibirdyEncounter; allMysteryEncounters[MysteryEncounterType.ABSOLUTE_AVARICE] = AbsoluteAvariceEncounter; allMysteryEncounters[MysteryEncounterType.A_TRAINERS_TEST] = ATrainersTestEncounter; diff --git a/src/data/mystery-encounters/utils/encounter-phase-utils.ts b/src/data/mystery-encounters/utils/encounter-phase-utils.ts index 21f54059828..deb65ff5774 100644 --- a/src/data/mystery-encounters/utils/encounter-phase-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-phase-utils.ts @@ -5,8 +5,8 @@ import { WEIGHT_INCREMENT_ON_SPAWN_MISS } from "#app/data/mystery-encounters/mys import { showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; import Pokemon, { FieldPosition, PlayerPokemon, PokemonMove } from "#app/field/pokemon"; import { ExpBalanceModifier, ExpShareModifier, MultipleParticipantExpBonusModifier, PokemonExpBoosterModifier } from "#app/modifier/modifier"; -import { CustomModifierSettings, ModifierPoolType, ModifierType, ModifierTypeFunc, ModifierTypeGenerator, ModifierTypeOption, modifierTypes, PokemonHeldItemModifierType, regenerateModifierPoolThresholds } from "#app/modifier/modifier-type"; -import { BattleEndPhase, EggLapsePhase, ExpPhase, GameOverPhase, ModifierRewardPhase, MovePhase, SelectModifierPhase, ShowPartyExpBarPhase, TrainerVictoryPhase } from "#app/phases"; +import { CustomModifierSettings, ModifierPoolType, ModifierType, ModifierTypeGenerator, ModifierTypeOption, modifierTypes, PokemonHeldItemModifierType, regenerateModifierPoolThresholds } from "#app/modifier/modifier-type"; +import { BattleEndPhase, EggLapsePhase, ExpPhase, GameOverPhase, MovePhase, SelectModifierPhase, ShowPartyExpBarPhase, TrainerVictoryPhase } from "#app/phases"; import { MysteryEncounterBattlePhase, MysteryEncounterBattleStartCleanupPhase, MysteryEncounterPhase, MysteryEncounterRewardsPhase } from "#app/phases/mystery-encounter-phases"; import PokemonData from "#app/system/pokemon-data"; import { OptionSelectConfig, OptionSelectItem } from "#app/ui/abstact-option-select-ui-handler"; @@ -29,6 +29,7 @@ import { Status, StatusEffect } from "#app/data/status-effect"; import { TrainerConfig, trainerConfigs, TrainerSlot } from "#app/data/trainer-config"; import PokemonSpecies from "#app/data/pokemon-species"; import Overrides from "#app/overrides"; +import { Egg, IEggOptions } from "#app/data/egg"; /** * Animates exclamation sprite over trainer's head at start of encounter @@ -436,10 +437,10 @@ export function selectPokemonForOption(scene: BattleScene, onPokemonSelected: (p * Can have shop displayed or skipped * @param scene - Battle Scene * @param customShopRewards - adds a shop phase with the specified rewards / reward tiers - * @param nonShopPlayerItemRewards - will add a non-shop reward phase for each specified item/modifier (can happen in addition to a shop) + * @param eggRewards * @param preRewardsCallback - can execute an arbitrary callback before the new phases if necessary (useful for updating items/party/injecting new phases before MysteryEncounterRewardsPhase) */ -export function setEncounterRewards(scene: BattleScene, customShopRewards?: CustomModifierSettings, nonShopPlayerItemRewards?: ModifierTypeFunc[], preRewardsCallback?: Function) { +export function setEncounterRewards(scene: BattleScene, customShopRewards?: CustomModifierSettings, eggRewards?: IEggOptions[], preRewardsCallback?: Function) { scene.currentBattle.mysteryEncounter.doEncounterRewards = (scene: BattleScene) => { if (preRewardsCallback) { preRewardsCallback(); @@ -451,14 +452,12 @@ export function setEncounterRewards(scene: BattleScene, customShopRewards?: Cust scene.tryRemovePhase(p => p instanceof SelectModifierPhase); } - if (nonShopPlayerItemRewards?.length > 0) { - nonShopPlayerItemRewards.forEach((reward) => { - scene.unshiftPhase(new ModifierRewardPhase(scene, reward)); + if (eggRewards) { + eggRewards.forEach(eggOptions => { + const egg = new Egg(eggOptions); + egg.addEggToGameData(scene); + // queueEncounterMessage(scene, `You gained a ${egg.getEggTypeDescriptor(scene)} Egg!`); }); - } else { - while (!isNullOrUndefined(scene.findPhase(p => p instanceof ModifierRewardPhase))) { - scene.tryRemovePhase(p => p instanceof ModifierRewardPhase); - } } return true; diff --git a/src/enums/mystery-encounter-type.ts b/src/enums/mystery-encounter-type.ts index 3bb204ab9d8..e054b03c33b 100644 --- a/src/enums/mystery-encounter-type.ts +++ b/src/enums/mystery-encounter-type.ts @@ -12,8 +12,8 @@ export enum MysteryEncounterType { LOST_AT_SEA, //might be generalized later on FIERY_FALLOUT, THE_STRONG_STUFF, - POKEMON_SALESMAN, - OFFER_YOU_CANT_REFUSE, + THE_POKEMON_SALESMAN, + AN_OFFER_YOU_CANT_REFUSE, DELIBIRDY, ABSOLUTE_AVARICE, A_TRAINERS_TEST diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 49561db4b54..f396367e491 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -1728,7 +1728,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { hideInfo(): Promise { return new Promise(resolve => { - if (this.battleInfo.visible) { + if (this.battleInfo && this.battleInfo.visible) { this.scene.tweens.add({ targets: [ this.battleInfo, this.battleInfo.expMaskRect ], x: this.isPlayer() ? "+=150" : `-=${!this.isBoss() ? 150 : 246}`, diff --git a/src/locales/en/egg.ts b/src/locales/en/egg.ts index 9f699ce0fdc..cfa6375fe2e 100644 --- a/src/locales/en/egg.ts +++ b/src/locales/en/egg.ts @@ -13,6 +13,7 @@ export const egg: SimpleTranslationEntries = { "gachaTypeLegendary": "Legendary Rate Up", "gachaTypeMove": "Rare Egg Move Rate Up", "gachaTypeShiny": "Shiny Rate Up", + "eventType": "Mystery Event", "selectMachine": "Select a machine.", "notEnoughVouchers": "You don't have enough vouchers!", "tooManyEggs": "You have too many eggs!", diff --git a/src/locales/en/mystery-encounter.ts b/src/locales/en/mystery-encounter.ts index 7cb6cb98178..6d03e5b3eb6 100644 --- a/src/locales/en/mystery-encounter.ts +++ b/src/locales/en/mystery-encounter.ts @@ -11,10 +11,11 @@ import { shadyVitaminDealerDialogue } from "#app/locales/en/mystery-encounters/s import { slumberingSnorlaxDialogue } from "#app/locales/en/mystery-encounters/slumbering-snorlax-dialogue"; import { trainingSessionDialogue } from "#app/locales/en/mystery-encounters/training-session-dialogue"; import { theStrongStuffDialogue } from "#app/locales/en/mystery-encounters/the-strong-stuff-dialogue"; -import { pokemonSalesmanDialogue } from "#app/locales/en/mystery-encounters/pokemon-salesman-dialogue"; -import { offerYouCantRefuseDialogue } from "#app/locales/en/mystery-encounters/offer-you-cant-refuse-dialogue"; +import { thePokemonSalesmanDialogue } from "#app/locales/en/mystery-encounters/the-pokemon-salesman-dialogue"; +import { anOfferYouCantRefuseDialogue } from "#app/locales/en/mystery-encounters/an-offer-you-cant-refuse-dialogue"; import { delibirdyDialogue } from "#app/locales/en/mystery-encounters/delibirdy-dialogue"; import { absoluteAvariceDialogue } from "#app/locales/en/mystery-encounters/absolute-avarice-dialogue"; +import { aTrainersTestDialogue } from "#app/locales/en/mystery-encounters/a-trainers-test-dialogue"; /** * Patterns that can be used: @@ -51,8 +52,9 @@ export const mysteryEncounter = { lostAtSea: lostAtSeaDialogue, fieryFallout: fieryFalloutDialogue, theStrongStuff: theStrongStuffDialogue, - pokemonSalesman: pokemonSalesmanDialogue, - offerYouCantRefuse: offerYouCantRefuseDialogue, + pokemonSalesman: thePokemonSalesmanDialogue, + offerYouCantRefuse: anOfferYouCantRefuseDialogue, delibirdy: delibirdyDialogue, absoluteAvarice: absoluteAvariceDialogue, + aTrainersTest: aTrainersTestDialogue, } as const; diff --git a/src/locales/en/mystery-encounters/a-trainers-test-dialogue.ts b/src/locales/en/mystery-encounters/a-trainers-test-dialogue.ts new file mode 100644 index 00000000000..13fe8209c19 --- /dev/null +++ b/src/locales/en/mystery-encounters/a-trainers-test-dialogue.ts @@ -0,0 +1,67 @@ +export const aTrainersTestDialogue = { + intro: "An extremely strong trainer approaches you...", + buck: { + 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. + $Here, let me help with that.` + }, + cheryl: { + 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. + $Here, let me help with that.` + }, + marley: { + 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. + $Your Pokémon look hurt...\nLet me help.` + }, + mira: { + 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! + $Here, Mira will heal your team!` + }, + riley: { + 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. + $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.", + query: "What will you do?", + option: { + 1: { + label: "Accept the Challenge", + tooltip: "(-) Tough Battle\n(+) Gain a @[TOOLTIP_TITLE]{Very Rare Egg}" + }, + 2: { + label: "Refuse the Challenge", + tooltip: "(+) Full Heal Party\n(+) Gain an @[TOOLTIP_TITLE]{Egg}", + }, + }, + eggTypes: { + rare: "a Rare Egg", + epic: "an Epic Egg", + legendary: "a Legendary Egg" + }, + outro: "{{statTrainerName}} gave you {{eggType}}!" +}; diff --git a/src/locales/en/mystery-encounters/offer-you-cant-refuse-dialogue.ts b/src/locales/en/mystery-encounters/an-offer-you-cant-refuse-dialogue.ts similarity index 96% rename from src/locales/en/mystery-encounters/offer-you-cant-refuse-dialogue.ts rename to src/locales/en/mystery-encounters/an-offer-you-cant-refuse-dialogue.ts index 7cee39b3ae8..00ca2f5f309 100644 --- a/src/locales/en/mystery-encounters/offer-you-cant-refuse-dialogue.ts +++ b/src/locales/en/mystery-encounters/an-offer-you-cant-refuse-dialogue.ts @@ -1,4 +1,4 @@ -export const offerYouCantRefuseDialogue = { +export const anOfferYouCantRefuseDialogue = { intro: "You're stopped by a rich looking boy.", speaker: "Rich Boy", intro_dialogue: `Good day to you. diff --git a/src/locales/en/mystery-encounters/pokemon-salesman-dialogue.ts b/src/locales/en/mystery-encounters/the-pokemon-salesman-dialogue.ts similarity index 96% rename from src/locales/en/mystery-encounters/pokemon-salesman-dialogue.ts rename to src/locales/en/mystery-encounters/the-pokemon-salesman-dialogue.ts index d35e3947a42..00b1f4beb6a 100644 --- a/src/locales/en/mystery-encounters/pokemon-salesman-dialogue.ts +++ b/src/locales/en/mystery-encounters/the-pokemon-salesman-dialogue.ts @@ -1,4 +1,4 @@ -export const pokemonSalesmanDialogue = { +export const thePokemonSalesmanDialogue = { intro: "A chipper elderly man approaches you.", speaker: "Gentleman", intro_dialogue: "Hello there! Have I got a deal just for YOU!", diff --git a/src/overrides.ts b/src/overrides.ts index ff833564899..1196797fac0 100644 --- a/src/overrides.ts +++ b/src/overrides.ts @@ -127,9 +127,9 @@ class DefaultOverrides { // ------------------------- // 1 to 256, set to null to ignore - readonly MYSTERY_ENCOUNTER_RATE_OVERRIDE: number = 256; + readonly MYSTERY_ENCOUNTER_RATE_OVERRIDE: number = null; readonly MYSTERY_ENCOUNTER_TIER_OVERRIDE: MysteryEncounterTier = null; - readonly MYSTERY_ENCOUNTER_OVERRIDE: MysteryEncounterType = MysteryEncounterType.A_TRAINERS_TEST; + readonly MYSTERY_ENCOUNTER_OVERRIDE: MysteryEncounterType = null; // ------------------------- // MODIFIER / ITEM OVERRIDES 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 new file mode 100644 index 00000000000..083d6c6985f --- /dev/null +++ b/src/test/mystery-encounter/encounters/a-trainers-test-encounter.test.ts @@ -0,0 +1,203 @@ +import * as MysteryEncounters from "#app/data/mystery-encounters/mystery-encounters"; +import { HUMAN_TRANSITABLE_BIOMES } 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 * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { runMysteryEncounterToEnd, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounterTestUtils"; +import BattleScene from "#app/battle-scene"; +import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; +import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; +import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; +import { ATrainersTestEncounter } from "#app/data/mystery-encounters/encounters/a-trainers-test-encounter"; +import { CommandPhase, PartyHealPhase, SelectModifierPhase } from "#app/phases"; +import { EggTier } from "#enums/egg-type"; + +const namespace = "mysteryEncounter:aTrainersTest"; +const defaultParty = [Species.LAPRAS, Species.GENGAR, Species.ABRA]; +const defaultBiome = Biome.CAVE; +const defaultWave = 45; + +describe("A Trainer's Test - 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.mysteryEncounterTier(MysteryEncounterTier.COMMON); + game.override.startingWave(defaultWave); + game.override.startingBiome(defaultBiome); + + const biomeMap = new Map([ + [Biome.VOLCANO, [MysteryEncounterType.MYSTERIOUS_CHALLENGERS]], + ]); + HUMAN_TRANSITABLE_BIOMES.forEach(biome => { + biomeMap.set(biome, [MysteryEncounterType.A_TRAINERS_TEST]); + }); + vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue(biomeMap); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + vi.clearAllMocks(); + vi.resetAllMocks(); + }); + + it("should have the correct properties", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.A_TRAINERS_TEST, defaultParty); + + expect(ATrainersTestEncounter.encounterType).toBe(MysteryEncounterType.A_TRAINERS_TEST); + expect(ATrainersTestEncounter.encounterTier).toBe(MysteryEncounterTier.ROGUE); + expect(ATrainersTestEncounter.dialogue).toBeDefined(); + expect(ATrainersTestEncounter.dialogue.intro).toBeDefined(); + expect(ATrainersTestEncounter.dialogue.intro[0].speaker).toBeDefined(); + expect(ATrainersTestEncounter.dialogue.intro[0].text).toBeDefined(); + expect(ATrainersTestEncounter.dialogue.encounterOptionsDialogue.title).toBe(`${namespace}.title`); + expect(ATrainersTestEncounter.dialogue.encounterOptionsDialogue.description).toBe(`${namespace}.description`); + expect(ATrainersTestEncounter.dialogue.encounterOptionsDialogue.query).toBe(`${namespace}.query`); + expect(ATrainersTestEncounter.options.length).toBe(2); + }); + + it("should not run below wave 10", async () => { + game.override.startingWave(9); + + await game.runToMysteryEncounter(); + + expect(scene.currentBattle?.mysteryEncounter?.encounterType).not.toBe(MysteryEncounterType.A_TRAINERS_TEST); + }); + + 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 = ATrainersTestEncounter; + + const { onInit } = ATrainersTestEncounter; + + expect(ATrainersTestEncounter.onInit).toBeDefined(); + + ATrainersTestEncounter.populateDialogueTokensFromRequirements(scene); + const onInitResult = onInit(scene); + + expect(ATrainersTestEncounter.dialogueTokens?.statTrainerName).toBeDefined(); + expect(ATrainersTestEncounter.misc.trainerType).toBeDefined(); + expect(ATrainersTestEncounter.misc.trainerNameKey).toBeDefined(); + expect(ATrainersTestEncounter.misc.trainerEggDescription).toBeDefined(); + expect(ATrainersTestEncounter.dialogue.intro).toBeDefined(); + expect(ATrainersTestEncounter.options[1].dialogue.selected).toBeDefined(); + expect(onInitResult).toBe(true); + }); + + describe("Option 1 - Accept the Challenge", () => { + it("should have the correct properties", () => { + const option = ATrainersTestEncounter.options[0]; + expect(option.optionMode).toBe(MysteryEncounterOptionMode.DEFAULT); + expect(option.dialogue).toBeDefined(); + expect(option.dialogue.buttonLabel).toStrictEqual(`${namespace}.option.1.label`); + expect(option.dialogue.buttonTooltip).toStrictEqual(`${namespace}.option.1.tooltip`); + }); + + it("Should start battle against the trainer", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.A_TRAINERS_TEST, defaultParty); + await runMysteryEncounterToEnd(game, 1, null, true); + + const enemyField = scene.getEnemyField(); + expect(scene.getCurrentPhase().constructor.name).toBe(CommandPhase.name); + expect(enemyField.length).toBe(1); + expect(scene.currentBattle.trainer).toBeDefined(); + expect(["buck", "cheryl", "marley", "mira", "riley"].includes(scene.currentBattle.trainer.config.name.toLowerCase())).toBeTruthy(); + expect(enemyField[0]).toBeDefined(); + }); + + it("Should reward the player with an Epic or Legendary egg", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.A_TRAINERS_TEST, defaultParty); + + const eggsBefore = scene.gameData.eggs; + expect(eggsBefore).toBeDefined(); + const eggsBeforeLength = eggsBefore.length; + + await runMysteryEncounterToEnd(game, 1, null, true); + await skipBattleRunMysteryEncounterRewardsPhase(game); + await game.phaseInterceptor.to(SelectModifierPhase, false); + expect(scene.getCurrentPhase().constructor.name).toBe(SelectModifierPhase.name); + + const eggsAfter = scene.gameData.eggs; + expect(eggsAfter).toBeDefined(); + expect(eggsBeforeLength + 1).toBe(eggsAfter.length); + const eggTier = eggsAfter[eggsAfter.length - 1].tier; + expect(eggTier === EggTier.ULTRA || eggTier === EggTier.MASTER).toBeTruthy(); + }); + }); + + describe("Option 2 - Decline the Challenge", () => { + beforeEach(() => { + // Mock sound object + vi.spyOn(scene, "playSoundWithoutBgm").mockImplementation(() => { + return { + totalDuration: 1, + destroy: () => null + } as Phaser.Sound.NoAudioSound; + }); + }); + + it("should have the correct properties", () => { + const option = ATrainersTestEncounter.options[1]; + expect(option.optionMode).toBe(MysteryEncounterOptionMode.DEFAULT); + expect(option.dialogue).toBeDefined(); + expect(option.dialogue.buttonLabel).toStrictEqual(`${namespace}.option.2.label`); + expect(option.dialogue.buttonTooltip).toStrictEqual(`${namespace}.option.2.tooltip`); + }); + + it("Should fully heal the party", async () => { + const phaseSpy = vi.spyOn(scene, "unshiftPhase"); + + await game.runToMysteryEncounter(MysteryEncounterType.A_TRAINERS_TEST, defaultParty); + await runMysteryEncounterToEnd(game, 2); + + const partyHealPhases = phaseSpy.mock.calls.filter(p => p[0] instanceof PartyHealPhase).map(p => p[0]); + expect(partyHealPhases.length).toBe(1); + }); + + it("Should reward the player with a Rare egg", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.A_TRAINERS_TEST, defaultParty); + + const eggsBefore = scene.gameData.eggs; + expect(eggsBefore).toBeDefined(); + const eggsBeforeLength = eggsBefore.length; + + await runMysteryEncounterToEnd(game, 2); + await game.phaseInterceptor.to(SelectModifierPhase, false); + expect(scene.getCurrentPhase().constructor.name).toBe(SelectModifierPhase.name); + + const eggsAfter = scene.gameData.eggs; + expect(eggsAfter).toBeDefined(); + expect(eggsBeforeLength + 1).toBe(eggsAfter.length); + const eggTier = eggsAfter[eggsAfter.length - 1].tier; + expect(eggTier).toBe(EggTier.GREAT); + }); + + it("should leave encounter without battle", async () => { + const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); + + await game.runToMysteryEncounter(MysteryEncounterType.A_TRAINERS_TEST, defaultParty); + await runMysteryEncounterToEnd(game, 2); + + expect(leaveEncounterWithoutBattleSpy).toBeCalled(); + }); + }); +}); 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 4aaf5f3d518..7b0c7a2dd7e 100644 --- a/src/test/mystery-encounter/encounters/absolute-avarice-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/absolute-avarice-encounter.test.ts @@ -57,10 +57,10 @@ describe("Absolute Avarice - Mystery Encounter", () => { expect(AbsoluteAvariceEncounter.encounterType).toBe(MysteryEncounterType.ABSOLUTE_AVARICE); expect(AbsoluteAvariceEncounter.encounterTier).toBe(MysteryEncounterTier.GREAT); expect(AbsoluteAvariceEncounter.dialogue).toBeDefined(); - expect(AbsoluteAvariceEncounter.dialogue.intro).toStrictEqual([{ text: `${namespace}:intro` }]); - expect(AbsoluteAvariceEncounter.dialogue.encounterOptionsDialogue.title).toBe(`${namespace}:title`); - expect(AbsoluteAvariceEncounter.dialogue.encounterOptionsDialogue.description).toBe(`${namespace}:description`); - expect(AbsoluteAvariceEncounter.dialogue.encounterOptionsDialogue.query).toBe(`${namespace}:query`); + expect(AbsoluteAvariceEncounter.dialogue.intro).toStrictEqual([{ text: `${namespace}.intro` }]); + expect(AbsoluteAvariceEncounter.dialogue.encounterOptionsDialogue.title).toBe(`${namespace}.title`); + expect(AbsoluteAvariceEncounter.dialogue.encounterOptionsDialogue.description).toBe(`${namespace}.description`); + expect(AbsoluteAvariceEncounter.dialogue.encounterOptionsDialogue.query).toBe(`${namespace}.query`); expect(AbsoluteAvariceEncounter.options.length).toBe(3); }); @@ -118,11 +118,11 @@ describe("Absolute Avarice - Mystery Encounter", () => { expect(option1.optionMode).toBe(MysteryEncounterOptionMode.DEFAULT); expect(option1.dialogue).toBeDefined(); expect(option1.dialogue).toStrictEqual({ - buttonLabel: `${namespace}:option:1:label`, - buttonTooltip: `${namespace}:option:1:tooltip`, + buttonLabel: `${namespace}.option.1.label`, + buttonTooltip: `${namespace}.option.1.tooltip`, selected: [ { - text: `${namespace}:option:1:selected`, + text: `${namespace}.option.1.selected`, }, ], }); @@ -171,11 +171,11 @@ describe("Absolute Avarice - Mystery Encounter", () => { expect(option.optionMode).toBe(MysteryEncounterOptionMode.DEFAULT); expect(option.dialogue).toBeDefined(); expect(option.dialogue).toStrictEqual({ - buttonLabel: `${namespace}:option:2:label`, - buttonTooltip: `${namespace}:option:2:tooltip`, + buttonLabel: `${namespace}.option.2.label`, + buttonTooltip: `${namespace}.option.2.tooltip`, selected: [ { - text: `${namespace}:option:2:selected`, + text: `${namespace}.option.2.selected`, }, ], }); @@ -229,11 +229,11 @@ describe("Absolute Avarice - Mystery Encounter", () => { expect(option.optionMode).toBe(MysteryEncounterOptionMode.DEFAULT); expect(option.dialogue).toBeDefined(); expect(option.dialogue).toStrictEqual({ - buttonLabel: `${namespace}:option:3:label`, - buttonTooltip: `${namespace}:option:3:tooltip`, + buttonLabel: `${namespace}.option.3.label`, + buttonTooltip: `${namespace}.option.3.tooltip`, selected: [ { - text: `${namespace}:option:3:selected`, + text: `${namespace}.option.3.selected`, }, ], }); diff --git a/src/test/mystery-encounter/encounters/offer-you-cant-refuse-encounter.test.ts b/src/test/mystery-encounter/encounters/an-offer-you-cant-refuse-encounter.test.ts similarity index 67% rename from src/test/mystery-encounter/encounters/offer-you-cant-refuse-encounter.test.ts rename to src/test/mystery-encounter/encounters/an-offer-you-cant-refuse-encounter.test.ts index 0290d32f242..fe7e5b676a3 100644 --- a/src/test/mystery-encounter/encounters/offer-you-cant-refuse-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/an-offer-you-cant-refuse-encounter.test.ts @@ -9,7 +9,7 @@ import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encount import { runMysteryEncounterToEnd } from "#test/mystery-encounter/encounterTestUtils"; import BattleScene from "#app/battle-scene"; import { PlayerPokemon, PokemonMove } from "#app/field/pokemon"; -import { OfferYouCantRefuseEncounter } from "#app/data/mystery-encounters/encounters/offer-you-cant-refuse-encounter"; +import { AnOfferYouCantRefuseEncounter } from "#app/data/mystery-encounters/encounters/an-offer-you-cant-refuse-encounter"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; @@ -44,7 +44,7 @@ describe("An Offer You Can't Refuse - Mystery Encounter", () => { [Biome.VOLCANO, [MysteryEncounterType.MYSTERIOUS_CHALLENGERS]], ]); HUMAN_TRANSITABLE_BIOMES.forEach(biome => { - biomeMap.set(biome, [MysteryEncounterType.OFFER_YOU_CANT_REFUSE]); + biomeMap.set(biome, [MysteryEncounterType.AN_OFFER_YOU_CANT_REFUSE]); }); vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue(biomeMap); }); @@ -56,26 +56,26 @@ describe("An Offer You Can't Refuse - Mystery Encounter", () => { }); it("should have the correct properties", async () => { - await game.runToMysteryEncounter(MysteryEncounterType.OFFER_YOU_CANT_REFUSE, defaultParty); + await game.runToMysteryEncounter(MysteryEncounterType.AN_OFFER_YOU_CANT_REFUSE, defaultParty); - expect(OfferYouCantRefuseEncounter.encounterType).toBe(MysteryEncounterType.OFFER_YOU_CANT_REFUSE); - expect(OfferYouCantRefuseEncounter.encounterTier).toBe(MysteryEncounterTier.GREAT); - expect(OfferYouCantRefuseEncounter.dialogue).toBeDefined(); - expect(OfferYouCantRefuseEncounter.dialogue.intro).toStrictEqual([ - { text: `${namespace}:intro` }, - { speaker: `${namespace}:speaker`, text: `${namespace}:intro_dialogue` } + expect(AnOfferYouCantRefuseEncounter.encounterType).toBe(MysteryEncounterType.AN_OFFER_YOU_CANT_REFUSE); + expect(AnOfferYouCantRefuseEncounter.encounterTier).toBe(MysteryEncounterTier.GREAT); + expect(AnOfferYouCantRefuseEncounter.dialogue).toBeDefined(); + expect(AnOfferYouCantRefuseEncounter.dialogue.intro).toStrictEqual([ + { text: `${namespace}.intro` }, + { speaker: `${namespace}.speaker`, text: `${namespace}.intro_dialogue` } ]); - expect(OfferYouCantRefuseEncounter.dialogue.encounterOptionsDialogue.title).toBe(`${namespace}:title`); - expect(OfferYouCantRefuseEncounter.dialogue.encounterOptionsDialogue.description).toBe(`${namespace}:description`); - expect(OfferYouCantRefuseEncounter.dialogue.encounterOptionsDialogue.query).toBe(`${namespace}:query`); - expect(OfferYouCantRefuseEncounter.options.length).toBe(3); + expect(AnOfferYouCantRefuseEncounter.dialogue.encounterOptionsDialogue.title).toBe(`${namespace}.title`); + expect(AnOfferYouCantRefuseEncounter.dialogue.encounterOptionsDialogue.description).toBe(`${namespace}.description`); + expect(AnOfferYouCantRefuseEncounter.dialogue.encounterOptionsDialogue.query).toBe(`${namespace}.query`); + expect(AnOfferYouCantRefuseEncounter.options.length).toBe(3); }); it("should not spawn outside of HUMAN_TRANSITABLE_BIOMES", async () => { game.override.startingBiome(Biome.VOLCANO); await game.runToMysteryEncounter(); - expect(scene.currentBattle?.mysteryEncounter?.encounterType).not.toBe(MysteryEncounterType.OFFER_YOU_CANT_REFUSE); + expect(scene.currentBattle?.mysteryEncounter?.encounterType).not.toBe(MysteryEncounterType.AN_OFFER_YOU_CANT_REFUSE); }); it("should not run below wave 10", async () => { @@ -83,7 +83,7 @@ describe("An Offer You Can't Refuse - Mystery Encounter", () => { await game.runToMysteryEncounter(); - expect(scene.currentBattle?.mysteryEncounter?.encounterType).not.toBe(MysteryEncounterType.OFFER_YOU_CANT_REFUSE); + expect(scene.currentBattle?.mysteryEncounter?.encounterType).not.toBe(MysteryEncounterType.AN_OFFER_YOU_CANT_REFUSE); }); it("should not run above wave 179", async () => { @@ -96,36 +96,36 @@ describe("An Offer You Can't Refuse - Mystery Encounter", () => { it("should initialize fully ", async () => { initSceneWithoutEncounterPhase(scene, defaultParty); - scene.currentBattle.mysteryEncounter = OfferYouCantRefuseEncounter; + scene.currentBattle.mysteryEncounter = AnOfferYouCantRefuseEncounter; - const { onInit } = OfferYouCantRefuseEncounter; + const { onInit } = AnOfferYouCantRefuseEncounter; - expect(OfferYouCantRefuseEncounter.onInit).toBeDefined(); + expect(AnOfferYouCantRefuseEncounter.onInit).toBeDefined(); - OfferYouCantRefuseEncounter.populateDialogueTokensFromRequirements(scene); + AnOfferYouCantRefuseEncounter.populateDialogueTokensFromRequirements(scene); const onInitResult = onInit(scene); - expect(OfferYouCantRefuseEncounter.dialogueTokens?.strongestPokemon).toBeDefined(); - expect(OfferYouCantRefuseEncounter.dialogueTokens?.price).toBeDefined(); - expect(OfferYouCantRefuseEncounter.dialogueTokens?.option2PrimaryAbility).toBe("Intimidate"); - expect(OfferYouCantRefuseEncounter.dialogueTokens?.moveOrAbility).toBe("Intimidate"); - expect(OfferYouCantRefuseEncounter.misc.pokemon instanceof PlayerPokemon).toBeTruthy(); - expect(OfferYouCantRefuseEncounter.misc?.price?.toString()).toBe(OfferYouCantRefuseEncounter.dialogueTokens?.price); + expect(AnOfferYouCantRefuseEncounter.dialogueTokens?.strongestPokemon).toBeDefined(); + expect(AnOfferYouCantRefuseEncounter.dialogueTokens?.price).toBeDefined(); + expect(AnOfferYouCantRefuseEncounter.dialogueTokens?.option2PrimaryAbility).toBe("Intimidate"); + expect(AnOfferYouCantRefuseEncounter.dialogueTokens?.moveOrAbility).toBe("Intimidate"); + expect(AnOfferYouCantRefuseEncounter.misc.pokemon instanceof PlayerPokemon).toBeTruthy(); + expect(AnOfferYouCantRefuseEncounter.misc?.price?.toString()).toBe(AnOfferYouCantRefuseEncounter.dialogueTokens?.price); expect(onInitResult).toBe(true); }); describe("Option 1 - Sell your Pokemon for money and a Shiny Charm", () => { it("should have the correct properties", () => { - const option = OfferYouCantRefuseEncounter.options[0]; + const option = AnOfferYouCantRefuseEncounter.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`, + buttonLabel: `${namespace}.option.1.label`, + buttonTooltip: `${namespace}.option.1.tooltip`, selected: [ { - speaker: `${namespace}:speaker`, - text: `${namespace}:option:1:selected`, + speaker: `${namespace}.speaker`, + text: `${namespace}.option.1.selected`, }, ], }); @@ -136,7 +136,7 @@ describe("An Offer You Can't Refuse - Mystery Encounter", () => { scene.money = initialMoney; const updateMoneySpy = vi.spyOn(EncounterPhaseUtils, "updatePlayerMoney"); - await game.runToMysteryEncounter(MysteryEncounterType.OFFER_YOU_CANT_REFUSE, defaultParty); + await game.runToMysteryEncounter(MysteryEncounterType.AN_OFFER_YOU_CANT_REFUSE, defaultParty); await runMysteryEncounterToEnd(game, 1); const price = scene.currentBattle.mysteryEncounter.misc.price; @@ -146,7 +146,7 @@ describe("An Offer You Can't Refuse - Mystery Encounter", () => { }); it("Should give the player a Shiny Charm", async () => { - await game.runToMysteryEncounter(MysteryEncounterType.OFFER_YOU_CANT_REFUSE, defaultParty); + await game.runToMysteryEncounter(MysteryEncounterType.AN_OFFER_YOU_CANT_REFUSE, defaultParty); await runMysteryEncounterToEnd(game, 1); const itemModifier = scene.findModifier(m => m instanceof ShinyRateBoosterModifier) as ShinyRateBoosterModifier; @@ -156,7 +156,7 @@ describe("An Offer You Can't Refuse - Mystery Encounter", () => { }); it("Should remove the Pokemon from the party", async () => { - await game.runToMysteryEncounter(MysteryEncounterType.OFFER_YOU_CANT_REFUSE, defaultParty); + await game.runToMysteryEncounter(MysteryEncounterType.AN_OFFER_YOU_CANT_REFUSE, defaultParty); const initialPartySize = scene.getParty().length; const pokemonName = scene.currentBattle.mysteryEncounter.misc.pokemon.name; @@ -170,7 +170,7 @@ describe("An Offer You Can't Refuse - Mystery Encounter", () => { it("should leave encounter without battle", async () => { const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); - await game.runToMysteryEncounter(MysteryEncounterType.OFFER_YOU_CANT_REFUSE, defaultParty); + await game.runToMysteryEncounter(MysteryEncounterType.AN_OFFER_YOU_CANT_REFUSE, defaultParty); await runMysteryEncounterToEnd(game, 1); expect(leaveEncounterWithoutBattleSpy).toBeCalled(); @@ -179,24 +179,24 @@ describe("An Offer You Can't Refuse - Mystery Encounter", () => { describe("Option 2 - Extort the Kid", () => { it("should have the correct properties", () => { - const option = OfferYouCantRefuseEncounter.options[1]; + const option = AnOfferYouCantRefuseEncounter.options[1]; expect(option.optionMode).toBe(MysteryEncounterOptionMode.DISABLED_OR_SPECIAL); expect(option.dialogue).toBeDefined(); expect(option.dialogue).toStrictEqual({ - buttonLabel: `${namespace}:option:2:label`, - buttonTooltip: `${namespace}:option:2:tooltip`, - disabledButtonTooltip: `${namespace}:option:2:tooltip_disabled`, + buttonLabel: `${namespace}.option.2.label`, + buttonTooltip: `${namespace}.option.2.tooltip`, + disabledButtonTooltip: `${namespace}.option.2.tooltip_disabled`, selected: [ { - speaker: `${namespace}:speaker`, - text: `${namespace}:option:2:selected`, + speaker: `${namespace}.speaker`, + text: `${namespace}.option.2.selected`, }, ], }); }); it("should award EXP to a pokemon with an ability in EXTORTION_ABILITIES", async () => { - await game.runToMysteryEncounter(MysteryEncounterType.OFFER_YOU_CANT_REFUSE, defaultParty); + await game.runToMysteryEncounter(MysteryEncounterType.AN_OFFER_YOU_CANT_REFUSE, defaultParty); const party = scene.getParty(); const gyarados = party.find((pkm) => pkm.species.speciesId === Species.GYARADOS); const expBefore = gyarados.exp; @@ -207,7 +207,7 @@ describe("An Offer You Can't Refuse - Mystery Encounter", () => { }); it("should award EXP to a pokemon with a move in EXTORTION_MOVES", async () => { - await game.runToMysteryEncounter(MysteryEncounterType.OFFER_YOU_CANT_REFUSE, [Species.ABRA]); + await game.runToMysteryEncounter(MysteryEncounterType.AN_OFFER_YOU_CANT_REFUSE, [Species.ABRA]); const party = scene.getParty(); const abra = party.find((pkm) => pkm.species.speciesId === Species.ABRA); abra.moveset = [new PokemonMove(Moves.BEAT_UP)]; @@ -223,7 +223,7 @@ describe("An Offer You Can't Refuse - Mystery Encounter", () => { scene.money = initialMoney; const updateMoneySpy = vi.spyOn(EncounterPhaseUtils, "updatePlayerMoney"); - await game.runToMysteryEncounter(MysteryEncounterType.OFFER_YOU_CANT_REFUSE, defaultParty); + await game.runToMysteryEncounter(MysteryEncounterType.AN_OFFER_YOU_CANT_REFUSE, defaultParty); await runMysteryEncounterToEnd(game, 2); const price = scene.currentBattle.mysteryEncounter.misc.price; @@ -235,7 +235,7 @@ describe("An Offer You Can't Refuse - Mystery Encounter", () => { it("should leave encounter without battle", async () => { const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); - await game.runToMysteryEncounter(MysteryEncounterType.OFFER_YOU_CANT_REFUSE, defaultParty); + await game.runToMysteryEncounter(MysteryEncounterType.AN_OFFER_YOU_CANT_REFUSE, defaultParty); await runMysteryEncounterToEnd(game, 2); expect(leaveEncounterWithoutBattleSpy).toBeCalled(); @@ -246,7 +246,7 @@ describe("An Offer You Can't Refuse - Mystery Encounter", () => { it("should leave encounter without battle", async () => { const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); - await game.runToMysteryEncounter(MysteryEncounterType.OFFER_YOU_CANT_REFUSE, defaultParty); + await game.runToMysteryEncounter(MysteryEncounterType.AN_OFFER_YOU_CANT_REFUSE, defaultParty); await runMysteryEncounterToEnd(game, 3); expect(leaveEncounterWithoutBattleSpy).toBeCalled(); diff --git a/src/test/mystery-encounter/encounters/delibirdy-encounter.test.ts b/src/test/mystery-encounter/encounters/delibirdy-encounter.test.ts index 9cee29b130d..0da778d793c 100644 --- a/src/test/mystery-encounter/encounters/delibirdy-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/delibirdy-encounter.test.ts @@ -58,11 +58,11 @@ describe("Delibird-y - Mystery Encounter", () => { expect(DelibirdyEncounter.encounterType).toBe(MysteryEncounterType.DELIBIRDY); expect(DelibirdyEncounter.encounterTier).toBe(MysteryEncounterTier.GREAT); expect(DelibirdyEncounter.dialogue).toBeDefined(); - expect(DelibirdyEncounter.dialogue.intro).toStrictEqual([{ text: `${namespace}:intro` }]); - expect(DelibirdyEncounter.dialogue.outro).toStrictEqual([{ text: `${namespace}:outro` }]); - expect(DelibirdyEncounter.dialogue.encounterOptionsDialogue.title).toBe(`${namespace}:title`); - expect(DelibirdyEncounter.dialogue.encounterOptionsDialogue.description).toBe(`${namespace}:description`); - expect(DelibirdyEncounter.dialogue.encounterOptionsDialogue.query).toBe(`${namespace}:query`); + expect(DelibirdyEncounter.dialogue.intro).toStrictEqual([{ text: `${namespace}.intro` }]); + expect(DelibirdyEncounter.dialogue.outro).toStrictEqual([{ text: `${namespace}.outro` }]); + expect(DelibirdyEncounter.dialogue.encounterOptionsDialogue.title).toBe(`${namespace}.title`); + expect(DelibirdyEncounter.dialogue.encounterOptionsDialogue.description).toBe(`${namespace}.description`); + expect(DelibirdyEncounter.dialogue.encounterOptionsDialogue.query).toBe(`${namespace}.query`); expect(DelibirdyEncounter.options.length).toBe(3); }); @@ -96,11 +96,11 @@ describe("Delibird-y - Mystery Encounter", () => { expect(option1.optionMode).toBe(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT); expect(option1.dialogue).toBeDefined(); expect(option1.dialogue).toStrictEqual({ - buttonLabel: `${namespace}:option:1:label`, - buttonTooltip: `${namespace}:option:1:tooltip`, + buttonLabel: `${namespace}.option.1.label`, + buttonTooltip: `${namespace}.option.1.tooltip`, selected: [ { - text: `${namespace}:option:1:selected`, + text: `${namespace}.option.1.selected`, }, ], }); @@ -190,12 +190,12 @@ describe("Delibird-y - Mystery Encounter", () => { 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`, - secondOptionPrompt: `${namespace}:option:2:select_prompt`, + buttonLabel: `${namespace}.option.2.label`, + buttonTooltip: `${namespace}.option.2.tooltip`, + secondOptionPrompt: `${namespace}.option.2.select_prompt`, selected: [ { - text: `${namespace}:option:2:selected`, + text: `${namespace}.option.2.selected`, }, ], }); @@ -352,12 +352,12 @@ describe("Delibird-y - Mystery Encounter", () => { 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`, - secondOptionPrompt: `${namespace}:option:3:select_prompt`, + buttonLabel: `${namespace}.option.3.label`, + buttonTooltip: `${namespace}.option.3.tooltip`, + secondOptionPrompt: `${namespace}.option.3.select_prompt`, selected: [ { - text: `${namespace}:option:3:selected`, + text: `${namespace}.option.3.selected`, }, ], }); 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 095d8a109d7..2eb1b6176bc 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 @@ -60,15 +60,15 @@ describe("Department Store Sale - Mystery Encounter", () => { expect(DepartmentStoreSaleEncounter.encounterTier).toBe(MysteryEncounterTier.COMMON); expect(DepartmentStoreSaleEncounter.dialogue).toBeDefined(); expect(DepartmentStoreSaleEncounter.dialogue.intro).toStrictEqual([ - { text: `${namespace}:intro` }, + { text: `${namespace}.intro` }, { - speaker: `${namespace}:speaker`, - text: `${namespace}:intro_dialogue`, + speaker: `${namespace}.speaker`, + text: `${namespace}.intro_dialogue`, } ]); - expect(DepartmentStoreSaleEncounter.dialogue.encounterOptionsDialogue.title).toBe(`${namespace}:title`); - expect(DepartmentStoreSaleEncounter.dialogue.encounterOptionsDialogue.description).toBe(`${namespace}:description`); - expect(DepartmentStoreSaleEncounter.dialogue.encounterOptionsDialogue.query).toBe(`${namespace}:query`); + expect(DepartmentStoreSaleEncounter.dialogue.encounterOptionsDialogue.title).toBe(`${namespace}.title`); + expect(DepartmentStoreSaleEncounter.dialogue.encounterOptionsDialogue.description).toBe(`${namespace}.description`); + expect(DepartmentStoreSaleEncounter.dialogue.encounterOptionsDialogue.query).toBe(`${namespace}.query`); expect(DepartmentStoreSaleEncounter.options.length).toBe(4); }); @@ -101,8 +101,8 @@ describe("Department Store Sale - Mystery Encounter", () => { expect(option.optionMode).toBe(MysteryEncounterOptionMode.DEFAULT); expect(option.dialogue).toBeDefined(); expect(option.dialogue).toStrictEqual({ - buttonLabel: `${namespace}:option:1:label`, - buttonTooltip: `${namespace}:option:1:tooltip`, + buttonLabel: `${namespace}.option.1.label`, + buttonTooltip: `${namespace}.option.1.tooltip`, }); }); @@ -136,8 +136,8 @@ describe("Department Store Sale - Mystery Encounter", () => { expect(option.optionMode).toBe(MysteryEncounterOptionMode.DEFAULT); expect(option.dialogue).toBeDefined(); expect(option.dialogue).toStrictEqual({ - buttonLabel: `${namespace}:option:2:label`, - buttonTooltip: `${namespace}:option:2:tooltip`, + buttonLabel: `${namespace}.option.2.label`, + buttonTooltip: `${namespace}.option.2.tooltip`, }); }); @@ -172,8 +172,8 @@ describe("Department Store Sale - Mystery Encounter", () => { expect(option.optionMode).toBe(MysteryEncounterOptionMode.DEFAULT); expect(option.dialogue).toBeDefined(); expect(option.dialogue).toStrictEqual({ - buttonLabel: `${namespace}:option:3:label`, - buttonTooltip: `${namespace}:option:3:tooltip`, + buttonLabel: `${namespace}.option.3.label`, + buttonTooltip: `${namespace}.option.3.tooltip`, }); }); @@ -208,8 +208,8 @@ describe("Department Store Sale - Mystery Encounter", () => { expect(option.optionMode).toBe(MysteryEncounterOptionMode.DEFAULT); expect(option.dialogue).toBeDefined(); expect(option.dialogue).toStrictEqual({ - buttonLabel: `${namespace}:option:4:label`, - buttonTooltip: `${namespace}:option:4:tooltip`, + buttonLabel: `${namespace}.option.4.label`, + buttonTooltip: `${namespace}.option.4.tooltip`, }); }); 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 43f23b261e6..00ae3a37139 100644 --- a/src/test/mystery-encounter/encounters/fiery-fallout-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/fiery-fallout-encounter.test.ts @@ -64,10 +64,10 @@ describe("Fiery Fallout - Mystery Encounter", () => { expect(FieryFalloutEncounter.encounterType).toBe(MysteryEncounterType.FIERY_FALLOUT); expect(FieryFalloutEncounter.encounterTier).toBe(MysteryEncounterTier.COMMON); expect(FieryFalloutEncounter.dialogue).toBeDefined(); - expect(FieryFalloutEncounter.dialogue.intro).toStrictEqual([{ text: `${namespace}:intro` }]); - expect(FieryFalloutEncounter.dialogue.encounterOptionsDialogue.title).toBe(`${namespace}:title`); - expect(FieryFalloutEncounter.dialogue.encounterOptionsDialogue.description).toBe(`${namespace}:description`); - expect(FieryFalloutEncounter.dialogue.encounterOptionsDialogue.query).toBe(`${namespace}:query`); + expect(FieryFalloutEncounter.dialogue.intro).toStrictEqual([{ text: `${namespace}.intro` }]); + expect(FieryFalloutEncounter.dialogue.encounterOptionsDialogue.title).toBe(`${namespace}.title`); + expect(FieryFalloutEncounter.dialogue.encounterOptionsDialogue.description).toBe(`${namespace}.description`); + expect(FieryFalloutEncounter.dialogue.encounterOptionsDialogue.query).toBe(`${namespace}.query`); expect(FieryFalloutEncounter.options.length).toBe(3); }); @@ -138,11 +138,11 @@ describe("Fiery Fallout - Mystery Encounter", () => { expect(option1.optionMode).toBe(MysteryEncounterOptionMode.DEFAULT); expect(option1.dialogue).toBeDefined(); expect(option1.dialogue).toStrictEqual({ - buttonLabel: `${namespace}:option:1:label`, - buttonTooltip: `${namespace}:option:1:tooltip`, + buttonLabel: `${namespace}.option.1.label`, + buttonTooltip: `${namespace}.option.1.tooltip`, selected: [ { - text: `${namespace}:option:1:selected`, + text: `${namespace}.option.1.selected`, }, ], }); @@ -188,11 +188,11 @@ describe("Fiery Fallout - Mystery Encounter", () => { expect(option1.optionMode).toBe(MysteryEncounterOptionMode.DEFAULT); expect(option1.dialogue).toBeDefined(); expect(option1.dialogue).toStrictEqual({ - buttonLabel: `${namespace}:option:2:label`, - buttonTooltip: `${namespace}:option:2:tooltip`, + buttonLabel: `${namespace}.option.2.label`, + buttonTooltip: `${namespace}.option.2.tooltip`, selected: [ { - text: `${namespace}:option:2:selected`, + text: `${namespace}.option.2.selected`, }, ], }); @@ -235,12 +235,12 @@ describe("Fiery Fallout - Mystery Encounter", () => { expect(option1.optionMode).toBe(MysteryEncounterOptionMode.DISABLED_OR_SPECIAL); expect(option1.dialogue).toBeDefined(); expect(option1.dialogue).toStrictEqual({ - buttonLabel: `${namespace}:option:3:label`, - buttonTooltip: `${namespace}:option:3:tooltip`, - disabledButtonTooltip: `${namespace}:option:3:disabled_tooltip`, + buttonLabel: `${namespace}.option.3.label`, + buttonTooltip: `${namespace}.option.3.tooltip`, + disabledButtonTooltip: `${namespace}.option.3.disabled_tooltip`, selected: [ { - text: `${namespace}:option:3:selected`, + text: `${namespace}.option.3.selected`, }, ], }); 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 e1318c79c8a..dd892ee8a9d 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 @@ -57,10 +57,10 @@ describe("Lost at Sea - Mystery Encounter", () => { expect(LostAtSeaEncounter.encounterType).toBe(MysteryEncounterType.LOST_AT_SEA); expect(LostAtSeaEncounter.encounterTier).toBe(MysteryEncounterTier.COMMON); expect(LostAtSeaEncounter.dialogue).toBeDefined(); - expect(LostAtSeaEncounter.dialogue.intro).toStrictEqual([{ text: `${namespace}:intro` }]); - expect(LostAtSeaEncounter.dialogue.encounterOptionsDialogue.title).toBe(`${namespace}:title`); - expect(LostAtSeaEncounter.dialogue.encounterOptionsDialogue.description).toBe(`${namespace}:description`); - expect(LostAtSeaEncounter.dialogue.encounterOptionsDialogue.query).toBe(`${namespace}:query`); + expect(LostAtSeaEncounter.dialogue.intro).toStrictEqual([{ text: `${namespace}.intro` }]); + expect(LostAtSeaEncounter.dialogue.encounterOptionsDialogue.title).toBe(`${namespace}.title`); + expect(LostAtSeaEncounter.dialogue.encounterOptionsDialogue.description).toBe(`${namespace}.description`); + expect(LostAtSeaEncounter.dialogue.encounterOptionsDialogue.query).toBe(`${namespace}.query`); expect(LostAtSeaEncounter.options.length).toBe(3); }); @@ -110,13 +110,13 @@ describe("Lost at Sea - Mystery Encounter", () => { expect(option1.optionMode).toBe(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT); expect(option1.dialogue).toBeDefined(); expect(option1.dialogue).toStrictEqual({ - buttonLabel: `${namespace}:option:1:label`, - disabledButtonLabel: `${namespace}:option:1:label_disabled`, - buttonTooltip: `${namespace}:option:1:tooltip`, - disabledButtonTooltip: `${namespace}:option:1:tooltip_disabled`, + buttonLabel: `${namespace}.option.1.label`, + disabledButtonLabel: `${namespace}.option.1.label_disabled`, + buttonTooltip: `${namespace}.option.1.tooltip`, + disabledButtonTooltip: `${namespace}.option.1.tooltip_disabled`, selected: [ { - text: `${namespace}:option:1:selected`, + text: `${namespace}.option.1.selected`, }, ], }); @@ -172,13 +172,13 @@ describe("Lost at Sea - Mystery Encounter", () => { expect(option2.optionMode).toBe(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT); expect(option2.dialogue).toBeDefined(); expect(option2.dialogue).toStrictEqual({ - buttonLabel: `${namespace}:option:2:label`, - disabledButtonLabel: `${namespace}:option:2:label_disabled`, - buttonTooltip: `${namespace}:option:2:tooltip`, - disabledButtonTooltip: `${namespace}:option:2:tooltip_disabled`, + buttonLabel: `${namespace}.option.2.label`, + disabledButtonLabel: `${namespace}.option.2.label_disabled`, + buttonTooltip: `${namespace}.option.2.tooltip`, + disabledButtonTooltip: `${namespace}.option.2.tooltip_disabled`, selected: [ { - text: `${namespace}:option:2:selected`, + text: `${namespace}.option.2.selected`, }, ], }); @@ -236,11 +236,11 @@ describe("Lost at Sea - Mystery Encounter", () => { expect(option3.optionMode).toBe(MysteryEncounterOptionMode.DEFAULT); expect(option3.dialogue).toBeDefined(); expect(option3.dialogue).toStrictEqual({ - buttonLabel: `${namespace}:option:3:label`, - buttonTooltip: `${namespace}:option:3:tooltip`, + buttonLabel: `${namespace}.option.3.label`, + buttonTooltip: `${namespace}.option.3.tooltip`, selected: [ { - text: `${namespace}:option:3:selected`, + text: `${namespace}.option.3.selected`, }, ], }); diff --git a/src/test/mystery-encounter/encounters/pokemon-salesman-encounter.test.ts b/src/test/mystery-encounter/encounters/the-pokemon-salesman-encounter.test.ts similarity index 70% rename from src/test/mystery-encounter/encounters/pokemon-salesman-encounter.test.ts rename to src/test/mystery-encounter/encounters/the-pokemon-salesman-encounter.test.ts index bbd2d92e26c..93686ecc64b 100644 --- a/src/test/mystery-encounter/encounters/pokemon-salesman-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/the-pokemon-salesman-encounter.test.ts @@ -9,7 +9,7 @@ import { runMysteryEncounterToEnd, runSelectMysteryEncounterOption } from "#test import BattleScene from "#app/battle-scene"; import { PlayerPokemon } from "#app/field/pokemon"; import { HUMAN_TRANSITABLE_BIOMES } from "#app/data/mystery-encounters/mystery-encounters"; -import { PokemonSalesmanEncounter } from "#app/data/mystery-encounters/encounters/pokemon-salesman-encounter"; +import { ThePokemonSalesmanEncounter } from "#app/data/mystery-encounters/encounters/the-pokemon-salesman-encounter"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; @@ -41,7 +41,7 @@ describe("The Pokemon Salesman - Mystery Encounter", () => { [Biome.VOLCANO, [MysteryEncounterType.MYSTERIOUS_CHALLENGERS]], ]); HUMAN_TRANSITABLE_BIOMES.forEach(biome => { - biomeMap.set(biome, [MysteryEncounterType.POKEMON_SALESMAN]); + biomeMap.set(biome, [MysteryEncounterType.THE_POKEMON_SALESMAN]); }); vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue(biomeMap); }); @@ -53,26 +53,26 @@ describe("The Pokemon Salesman - Mystery Encounter", () => { }); it("should have the correct properties", async () => { - await game.runToMysteryEncounter(MysteryEncounterType.POKEMON_SALESMAN, defaultParty); + await game.runToMysteryEncounter(MysteryEncounterType.THE_POKEMON_SALESMAN, defaultParty); - expect(PokemonSalesmanEncounter.encounterType).toBe(MysteryEncounterType.POKEMON_SALESMAN); - expect(PokemonSalesmanEncounter.encounterTier).toBe(MysteryEncounterTier.ULTRA); - expect(PokemonSalesmanEncounter.dialogue).toBeDefined(); - expect(PokemonSalesmanEncounter.dialogue.intro).toStrictEqual([ - { text: `${namespace}:intro` }, - { speaker: `${namespace}:speaker`, text: `${namespace}:intro_dialogue` } + expect(ThePokemonSalesmanEncounter.encounterType).toBe(MysteryEncounterType.THE_POKEMON_SALESMAN); + expect(ThePokemonSalesmanEncounter.encounterTier).toBe(MysteryEncounterTier.ULTRA); + expect(ThePokemonSalesmanEncounter.dialogue).toBeDefined(); + expect(ThePokemonSalesmanEncounter.dialogue.intro).toStrictEqual([ + { text: `${namespace}.intro` }, + { speaker: `${namespace}.speaker`, text: `${namespace}.intro_dialogue` } ]); - expect(PokemonSalesmanEncounter.dialogue.encounterOptionsDialogue.title).toBe(`${namespace}:title`); - expect(PokemonSalesmanEncounter.dialogue.encounterOptionsDialogue.description).toBe(`${namespace}:description`); - expect(PokemonSalesmanEncounter.dialogue.encounterOptionsDialogue.query).toBe(`${namespace}:query`); - expect(PokemonSalesmanEncounter.options.length).toBe(2); + expect(ThePokemonSalesmanEncounter.dialogue.encounterOptionsDialogue.title).toBe(`${namespace}.title`); + expect(ThePokemonSalesmanEncounter.dialogue.encounterOptionsDialogue.description).toBe(`${namespace}.description`); + expect(ThePokemonSalesmanEncounter.dialogue.encounterOptionsDialogue.query).toBe(`${namespace}.query`); + expect(ThePokemonSalesmanEncounter.options.length).toBe(2); }); it("should not spawn outside of HUMAN_TRANSITABLE_BIOMES", async () => { game.override.startingBiome(Biome.VOLCANO); await game.runToMysteryEncounter(); - expect(scene.currentBattle?.mysteryEncounter?.encounterType).not.toBe(MysteryEncounterType.POKEMON_SALESMAN); + expect(scene.currentBattle?.mysteryEncounter?.encounterType).not.toBe(MysteryEncounterType.THE_POKEMON_SALESMAN); }); it("should not run below wave 10", async () => { @@ -80,7 +80,7 @@ describe("The Pokemon Salesman - Mystery Encounter", () => { await game.runToMysteryEncounter(); - expect(scene.currentBattle?.mysteryEncounter?.encounterType).not.toBe(MysteryEncounterType.POKEMON_SALESMAN); + expect(scene.currentBattle?.mysteryEncounter?.encounterType).not.toBe(MysteryEncounterType.THE_POKEMON_SALESMAN); }); it("should not run above wave 179", async () => { @@ -93,19 +93,19 @@ describe("The Pokemon Salesman - Mystery Encounter", () => { it("should initialize fully ", async () => { initSceneWithoutEncounterPhase(scene, defaultParty); - scene.currentBattle.mysteryEncounter = PokemonSalesmanEncounter; + scene.currentBattle.mysteryEncounter = ThePokemonSalesmanEncounter; - const { onInit } = PokemonSalesmanEncounter; + const { onInit } = ThePokemonSalesmanEncounter; - expect(PokemonSalesmanEncounter.onInit).toBeDefined(); + expect(ThePokemonSalesmanEncounter.onInit).toBeDefined(); - PokemonSalesmanEncounter.populateDialogueTokensFromRequirements(scene); + ThePokemonSalesmanEncounter.populateDialogueTokensFromRequirements(scene); const onInitResult = onInit(scene); - expect(PokemonSalesmanEncounter.dialogueTokens?.purchasePokemon).toBeDefined(); - expect(PokemonSalesmanEncounter.dialogueTokens?.price).toBeDefined(); - expect(PokemonSalesmanEncounter.misc.pokemon instanceof PlayerPokemon).toBeTruthy(); - expect(PokemonSalesmanEncounter.misc?.price?.toString()).toBe(PokemonSalesmanEncounter.dialogueTokens?.price); + expect(ThePokemonSalesmanEncounter.dialogueTokens?.purchasePokemon).toBeDefined(); + expect(ThePokemonSalesmanEncounter.dialogueTokens?.price).toBeDefined(); + expect(ThePokemonSalesmanEncounter.misc.pokemon instanceof PlayerPokemon).toBeTruthy(); + expect(ThePokemonSalesmanEncounter.misc?.price?.toString()).toBe(ThePokemonSalesmanEncounter.dialogueTokens?.price); expect(onInitResult).toBe(true); }); @@ -114,20 +114,20 @@ describe("The Pokemon Salesman - Mystery Encounter", () => { await game.runToMysteryEncounter(); - expect(scene.currentBattle?.mysteryEncounter?.encounterType).not.toBe(MysteryEncounterType.POKEMON_SALESMAN); + expect(scene.currentBattle?.mysteryEncounter?.encounterType).not.toBe(MysteryEncounterType.THE_POKEMON_SALESMAN); }); describe("Option 1 - Purchase the pokemon", () => { it("should have the correct properties", () => { - const option = PokemonSalesmanEncounter.options[0]; + const option = ThePokemonSalesmanEncounter.options[0]; expect(option.optionMode).toBe(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT); expect(option.dialogue).toBeDefined(); expect(option.dialogue).toStrictEqual({ - buttonLabel: `${namespace}:option:1:label`, - buttonTooltip: `${namespace}:option:1:tooltip`, + buttonLabel: `${namespace}.option.1.label`, + buttonTooltip: `${namespace}.option.1.tooltip`, selected: [ { - text: `${namespace}:option:1:selected_message`, + text: `${namespace}.option.1.selected_message`, }, ], }); @@ -138,7 +138,7 @@ describe("The Pokemon Salesman - Mystery Encounter", () => { scene.money = initialMoney; const updateMoneySpy = vi.spyOn(EncounterPhaseUtils, "updatePlayerMoney"); - await game.runToMysteryEncounter(MysteryEncounterType.POKEMON_SALESMAN, defaultParty); + await game.runToMysteryEncounter(MysteryEncounterType.THE_POKEMON_SALESMAN, defaultParty); await runMysteryEncounterToEnd(game, 1); const price = scene.currentBattle.mysteryEncounter.misc.price; @@ -149,7 +149,7 @@ describe("The Pokemon Salesman - Mystery Encounter", () => { it("Should add the Pokemon to the party", async () => { scene.money = 20000; - await game.runToMysteryEncounter(MysteryEncounterType.POKEMON_SALESMAN, defaultParty); + await game.runToMysteryEncounter(MysteryEncounterType.THE_POKEMON_SALESMAN, defaultParty); const initialPartySize = scene.getParty().length; const pokemonName = scene.currentBattle.mysteryEncounter.misc.pokemon.name; @@ -162,7 +162,7 @@ describe("The Pokemon Salesman - Mystery Encounter", () => { it("should be disabled if player does not have enough money", async () => { scene.money = 0; - await game.runToMysteryEncounter(MysteryEncounterType.POKEMON_SALESMAN, defaultParty); + await game.runToMysteryEncounter(MysteryEncounterType.THE_POKEMON_SALESMAN, defaultParty); await game.phaseInterceptor.to(MysteryEncounterPhase, false); const encounterPhase = scene.getCurrentPhase(); @@ -184,7 +184,7 @@ describe("The Pokemon Salesman - Mystery Encounter", () => { scene.money = 20000; const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); - await game.runToMysteryEncounter(MysteryEncounterType.POKEMON_SALESMAN, defaultParty); + await game.runToMysteryEncounter(MysteryEncounterType.THE_POKEMON_SALESMAN, defaultParty); await runMysteryEncounterToEnd(game, 1); expect(leaveEncounterWithoutBattleSpy).toBeCalled(); @@ -195,7 +195,7 @@ describe("The Pokemon Salesman - Mystery Encounter", () => { it("should leave encounter without battle", async () => { const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); - await game.runToMysteryEncounter(MysteryEncounterType.POKEMON_SALESMAN, defaultParty); + await game.runToMysteryEncounter(MysteryEncounterType.THE_POKEMON_SALESMAN, defaultParty); await runMysteryEncounterToEnd(game, 2); expect(leaveEncounterWithoutBattleSpy).toBeCalled(); 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 91b9d509cbf..78610b76863 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 @@ -66,10 +66,10 @@ describe("The Strong Stuff - Mystery Encounter", () => { expect(TheStrongStuffEncounter.encounterType).toBe(MysteryEncounterType.THE_STRONG_STUFF); expect(TheStrongStuffEncounter.encounterTier).toBe(MysteryEncounterTier.COMMON); expect(TheStrongStuffEncounter.dialogue).toBeDefined(); - expect(TheStrongStuffEncounter.dialogue.intro).toStrictEqual([{ text: `${namespace}:intro` }]); - expect(TheStrongStuffEncounter.dialogue.encounterOptionsDialogue.title).toBe(`${namespace}:title`); - expect(TheStrongStuffEncounter.dialogue.encounterOptionsDialogue.description).toBe(`${namespace}:description`); - expect(TheStrongStuffEncounter.dialogue.encounterOptionsDialogue.query).toBe(`${namespace}:query`); + expect(TheStrongStuffEncounter.dialogue.intro).toStrictEqual([{ text: `${namespace}.intro` }]); + expect(TheStrongStuffEncounter.dialogue.encounterOptionsDialogue.title).toBe(`${namespace}.title`); + expect(TheStrongStuffEncounter.dialogue.encounterOptionsDialogue.description).toBe(`${namespace}.description`); + expect(TheStrongStuffEncounter.dialogue.encounterOptionsDialogue.query).toBe(`${namespace}.query`); expect(TheStrongStuffEncounter.options.length).toBe(2); }); @@ -139,11 +139,11 @@ describe("The Strong Stuff - Mystery Encounter", () => { expect(option1.optionMode).toBe(MysteryEncounterOptionMode.DEFAULT); expect(option1.dialogue).toBeDefined(); expect(option1.dialogue).toStrictEqual({ - buttonLabel: `${namespace}:option:1:label`, - buttonTooltip: `${namespace}:option:1:tooltip`, + buttonLabel: `${namespace}.option.1.label`, + buttonTooltip: `${namespace}.option.1.tooltip`, selected: [ { - text: `${namespace}:option:1:selected`, + text: `${namespace}.option.1.selected`, }, ], }); @@ -182,11 +182,11 @@ describe("The Strong Stuff - Mystery Encounter", () => { expect(option1.optionMode).toBe(MysteryEncounterOptionMode.DEFAULT); expect(option1.dialogue).toBeDefined(); expect(option1.dialogue).toStrictEqual({ - buttonLabel: `${namespace}:option:2:label`, - buttonTooltip: `${namespace}:option:2:tooltip`, + buttonLabel: `${namespace}.option.2.label`, + buttonTooltip: `${namespace}.option.2.tooltip`, selected: [ { - text: `${namespace}:option:2:selected`, + text: `${namespace}.option.2.selected`, }, ], }); From a231f853b86311ed53b1190cc5d3eaaac4b3e60a Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Thu, 1 Aug 2024 13:39:14 -0400 Subject: [PATCH 228/270] add Trash to Treasure encounter --- public/images/items.json | 10625 ++++++++-------- public/images/items.png | Bin 55976 -> 57028 bytes public/images/items/black_sludge.png | Bin 0 -> 1026 bytes .../encounters/trash-to-treasure-encounter.ts | 222 + .../mystery-encounters/mystery-encounters.ts | 5 +- .../utils/encounter-phase-utils.ts | 1 - src/enums/mystery-encounter-type.ts | 3 +- src/locales/en/modifier-type.ts | 1 + src/locales/en/mystery-encounter.ts | 2 + .../trash-to-treasure-dialogue.ts | 22 + src/modifier/modifier-type.ts | 2 + src/modifier/modifier.ts | 22 + src/overrides.ts | 4 +- src/phases/mystery-encounter-phases.ts | 7 +- .../the-strong-stuff-encounter.test.ts | 2 +- .../trash-to-treasure-encounter.test.ts | 219 + src/ui/modifier-select-ui-handler.ts | 5 +- 17 files changed, 5831 insertions(+), 5311 deletions(-) create mode 100644 public/images/items/black_sludge.png create mode 100644 src/data/mystery-encounters/encounters/trash-to-treasure-encounter.ts create mode 100644 src/locales/en/mystery-encounters/trash-to-treasure-dialogue.ts create mode 100644 src/test/mystery-encounter/encounters/trash-to-treasure-encounter.test.ts diff --git a/public/images/items.json b/public/images/items.json index 821e44d87d7..ae9bbf39302 100644 --- a/public/images/items.json +++ b/public/images/items.json @@ -4,8 +4,8 @@ "image": "items.png", "format": "RGBA8888", "size": { - "w": 426, - "h": 426 + "w": 425, + "h": 425 }, "scale": 1, "frames": [ @@ -555,27 +555,6 @@ "h": 28 } }, - { - "filename": "ability_capsule", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 9, - "w": 24, - "h": 14 - }, - "frame": { - "x": 0, - "y": 412, - "w": 24, - "h": 14 - } - }, { "filename": "ability_charm", "rotated": false, @@ -808,7 +787,7 @@ } }, { - "filename": "lock_capsule", + "filename": "elixir", "rotated": false, "trimmed": true, "sourceSize": { @@ -817,15 +796,15 @@ }, "spriteSourceSize": { "x": 7, - "y": 5, - "w": 19, - "h": 22 + "y": 4, + "w": 18, + "h": 24 }, "frame": { "x": 407, "y": 0, - "w": 19, - "h": 22 + "w": 18, + "h": 24 } }, { @@ -1101,4059 +1080,6 @@ "h": 24 } }, - { - "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": 24, - "y": 406, - "w": 24, - "h": 20 - } - }, - { - "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": 22, - "w": 24, - "h": 18 - } - }, - { - "filename": "clefairy_doll", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 24, - "h": 23 - }, - "frame": { - "x": 29, - "y": 55, - "w": 24, - "h": 23 - } - }, - { - "filename": "calcium", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 39, - "y": 78, - "w": 16, - "h": 24 - } - }, - { - "filename": "carbos", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 39, - "y": 102, - "w": 16, - "h": 24 - } - }, - { - "filename": "catching_charm", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 21, - "h": 24 - }, - "frame": { - "x": 39, - "y": 126, - "w": 21, - "h": 24 - } - }, - { - "filename": "fist_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 39, - "y": 150, - "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": 39, - "y": 174, - "w": 24, - "h": 24 - } - }, - { - "filename": "focus_band", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 44, - "y": 198, - "w": 24, - "h": 24 - } - }, - { - "filename": "golden_punch", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 44, - "y": 222, - "w": 24, - "h": 24 - } - }, - { - "filename": "silver_powder", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 11, - "w": 24, - "h": 15 - }, - "frame": { - "x": 44, - "y": 246, - "w": 24, - "h": 15 - } - }, - { - "filename": "gracidea", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 45, - "y": 261, - "w": 24, - "h": 24 - } - }, - { - "filename": "grip_claw", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 46, - "y": 285, - "w": 24, - "h": 24 - } - }, - { - "filename": "icicle_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 46, - "y": 309, - "w": 24, - "h": 24 - } - }, - { - "filename": "insect_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 46, - "y": 333, - "w": 24, - "h": 24 - } - }, - { - "filename": "iron_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 46, - "y": 357, - "w": 24, - "h": 24 - } - }, - { - "filename": "lucky_punch", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 46, - "y": 381, - "w": 24, - "h": 24 - } - }, - { - "filename": "adamant_crystal", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 6, - "w": 23, - "h": 21 - }, - "frame": { - "x": 48, - "y": 405, - "w": 23, - "h": 21 - } - }, - { - "filename": "berry_pouch", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 23, - "h": 23 - }, - "frame": { - "x": 53, - "y": 55, - "w": 23, - "h": 23 - } - }, - { - "filename": "kings_rock", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 23, - "h": 24 - }, - "frame": { - "x": 55, - "y": 78, - "w": 23, - "h": 24 - } - }, - { - "filename": "lucky_punch_great", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 55, - "y": 102, - "w": 24, - "h": 24 - } - }, - { - "filename": "lucky_punch_master", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 60, - "y": 126, - "w": 24, - "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": 63, - "y": 150, - "w": 24, - "h": 24 - } - }, - { - "filename": "lustrous_globe", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 63, - "y": 174, - "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": 68, - "y": 198, - "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": 68, - "y": 222, - "w": 24, - "h": 24 - } - }, - { - "filename": "candy_overlay", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 12, - "w": 16, - "h": 15 - }, - "frame": { - "x": 68, - "y": 246, - "w": 16, - "h": 15 - } - }, - { - "filename": "elixir", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 18, - "h": 24 - }, - "frame": { - "x": 69, - "y": 261, - "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": 70, - "y": 285, - "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": 70, - "y": 309, - "w": 18, - "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": 70, - "y": 333, - "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": 70, - "y": 357, - "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": 70, - "y": 381, - "w": 18, - "h": 24 - } - }, - { - "filename": "amulet_coin", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 23, - "h": 21 - }, - "frame": { - "x": 71, - "y": 405, - "w": 23, - "h": 21 - } - }, - { - "filename": "eviolite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 15, - "h": 15 - }, - "frame": { - "x": 59, - "y": 40, - "w": 15, - "h": 15 - } - }, - { - "filename": "mind_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 74, - "y": 26, - "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": 98, - "y": 26, - "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": 76, - "y": 50, - "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": 100, - "y": 50, - "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": 78, - "y": 74, - "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": 74, - "w": 21, - "h": 24 - } - }, - { - "filename": "scanner", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 79, - "y": 98, - "w": 24, - "h": 24 - } - }, - { - "filename": "red_orb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 20, - "h": 24 - }, - "frame": { - "x": 103, - "y": 98, - "w": 20, - "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": 84, - "y": 122, - "w": 24, - "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": 87, - "y": 146, - "w": 21, - "h": 24 - } - }, - { - "filename": "sky_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 87, - "y": 170, - "w": 24, - "h": 24 - } - }, - { - "filename": "splash_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 90, - "y": 194, - "w": 24, - "h": 24 - } - }, - { - "filename": "spooky_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 92, - "y": 218, - "w": 24, - "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": 108, - "y": 122, - "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": 108, - "y": 146, - "w": 16, - "h": 24 - } - }, - { - "filename": "lure", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 17, - "h": 24 - }, - "frame": { - "x": 111, - "y": 170, - "w": 17, - "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": 114, - "y": 194, - "w": 17, - "h": 24 - } - }, - { - "filename": "max_repel", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 116, - "y": 218, - "w": 16, - "h": 24 - } - }, - { - "filename": "revive", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 12, - "h": 17 - }, - "frame": { - "x": 122, - "y": 26, - "w": 12, - "h": 17 - } - }, - { - "filename": "coin_case", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 24, - "h": 23 - }, - "frame": { - "x": 92, - "y": 242, - "w": 24, - "h": 23 - } - }, - { - "filename": "metal_powder", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 6, - "w": 24, - "h": 20 - }, - "frame": { - "x": 87, - "y": 265, - "w": 24, - "h": 20 - } - }, - { - "filename": "stone_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 88, - "y": 285, - "w": 24, - "h": 24 - } - }, - { - "filename": "sun_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 88, - "y": 309, - "w": 24, - "h": 24 - } - }, - { - "filename": "toxic_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 88, - "y": 333, - "w": 24, - "h": 24 - } - }, - { - "filename": "zap_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 88, - "y": 357, - "w": 24, - "h": 24 - } - }, - { - "filename": "expert_belt", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 23 - }, - "frame": { - "x": 88, - "y": 381, - "w": 24, - "h": 23 - } - }, - { - "filename": "exp_balance", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 24, - "h": 22 - }, - "frame": { - "x": 94, - "y": 404, - "w": 24, - "h": 22 - } - }, - { - "filename": "black_belt", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 116, - "y": 242, - "w": 22, - "h": 23 - } - }, - { - "filename": "quick_powder", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 6, - "w": 24, - "h": 20 - }, - "frame": { - "x": 111, - "y": 265, - "w": 24, - "h": 20 - } - }, - { - "filename": "dynamax_band", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 23, - "h": 23 - }, - "frame": { - "x": 112, - "y": 285, - "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": 112, - "y": 308, - "w": 23, - "h": 23 - } - }, - { - "filename": "hearthflame_mask", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 23 - }, - "frame": { - "x": 112, - "y": 331, - "w": 24, - "h": 23 - } - }, - { - "filename": "leppa_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 24, - "h": 23 - }, - "frame": { - "x": 112, - "y": 354, - "w": 24, - "h": 23 - } - }, - { - "filename": "scope_lens", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 24, - "h": 23 - }, - "frame": { - "x": 112, - "y": 377, - "w": 24, - "h": 23 - } - }, - { - "filename": "bug_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 118, - "y": 400, - "w": 22, - "h": 23 - } - }, - { - "filename": "pp_max", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 123, - "y": 43, - "w": 16, - "h": 24 - } - }, - { - "filename": "dark_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 139, - "y": 40, - "w": 22, - "h": 23 - } - }, - { - "filename": "pp_up", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 123, - "y": 67, - "w": 16, - "h": 24 - } - }, - { - "filename": "dragon_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 139, - "y": 63, - "w": 22, - "h": 23 - } - }, - { - "filename": "protein", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 123, - "y": 91, - "w": 16, - "h": 24 - } - }, - { - "filename": "electric_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 139, - "y": 86, - "w": 22, - "h": 23 - } - }, - { - "filename": "repel", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 124, - "y": 115, - "w": 16, - "h": 24 - } - }, - { - "filename": "super_lure", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 17, - "h": 24 - }, - "frame": { - "x": 124, - "y": 139, - "w": 17, - "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": 140, - "y": 109, - "w": 21, - "h": 23 - } - }, - { - "filename": "fairy_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 141, - "y": 132, - "w": 22, - "h": 23 - } - }, - { - "filename": "auspicious_armor", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 23, - "h": 21 - }, - "frame": { - "x": 141, - "y": 155, - "w": 23, - "h": 21 - } - }, - { - "filename": "dragon_scale", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 24, - "h": 18 - }, - "frame": { - "x": 128, - "y": 176, - "w": 24, - "h": 18 - } - }, - { - "filename": "fighting_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 131, - "y": 194, - "w": 22, - "h": 23 - } - }, - { - "filename": "fire_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 23 - }, - "frame": { - "x": 132, - "y": 217, - "w": 22, - "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": 138, - "y": 240, - "w": 16, - "h": 24 - } - }, - { - "filename": "baton", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 18, - "h": 18 - }, - "frame": { - "x": 152, - "y": 176, - "w": 18, - "h": 18 - } - }, - { - "filename": "fire_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 153, - "y": 194, - "w": 22, - "h": 23 - } - }, - { - "filename": "flying_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 154, - "y": 217, - "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": 154, - "y": 240, - "w": 22, - "h": 23 - } - }, - { - "filename": "unknown", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 135, - "y": 265, - "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": 135, - "y": 289, - "w": 16, - "h": 24 - } - }, - { - "filename": "candy", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 11, - "w": 18, - "h": 18 - }, - "frame": { - "x": 135, - "y": 313, - "w": 18, - "h": 18 - } - }, - { - "filename": "ghost_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 136, - "y": 331, - "w": 22, - "h": 23 - } - }, - { - "filename": "grass_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 136, - "y": 354, - "w": 22, - "h": 23 - } - }, - { - "filename": "ground_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 136, - "y": 377, - "w": 22, - "h": 23 - } - }, - { - "filename": "ice_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 140, - "y": 400, - "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": 330, - "y": 20, - "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": 354, - "y": 20, - "w": 24, - "h": 22 - } - }, - { - "filename": "twisted_spoon", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 24, - "h": 23 - }, - "frame": { - "x": 378, - "y": 20, - "w": 24, - "h": 23 - } - }, - { - "filename": "rusted_shield", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 6, - "w": 24, - "h": 20 - }, - "frame": { - "x": 402, - "y": 22, - "w": 24, - "h": 20 - } - }, - { - "filename": "sacred_ash", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 24, - "h": 20 - }, - "frame": { - "x": 402, - "y": 42, - "w": 24, - "h": 20 - } - }, - { - "filename": "full_heal", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 15, - "h": 23 - }, - "frame": { - "x": 151, - "y": 264, - "w": 15, - "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": 151, - "y": 287, - "w": 17, - "h": 23 - } - }, - { - "filename": "berry_juice", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 24, - "h": 23 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 22, - "h": 21 - }, - "frame": { - "x": 153, - "y": 310, - "w": 22, - "h": 21 - } - }, - { - "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": 331, - "w": 21, - "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": 158, - "y": 354, - "w": 21, - "h": 23 - } - }, - { - "filename": "leek", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 23, - "h": 23 - }, - "frame": { - "x": 158, - "y": 377, - "w": 23, - "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": 162, - "y": 400, - "w": 20, - "h": 23 - } - }, - { - "filename": "never_melt_ice", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 23 - }, - "frame": { - "x": 166, - "y": 263, - "w": 22, - "h": 23 - } - }, - { - "filename": "normal_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 168, - "y": 286, - "w": 22, - "h": 23 - } - }, - { - "filename": "berry_pot", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 18, - "h": 22 - }, - "frame": { - "x": 175, - "y": 309, - "w": 18, - "h": 22 - } - }, - { - "filename": "petaya_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 23 - }, - "frame": { - "x": 179, - "y": 331, - "w": 22, - "h": 23 - } - }, - { - "filename": "poison_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 179, - "y": 354, - "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": 181, - "y": 377, - "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": 182, - "y": 400, - "w": 23, - "h": 23 - } - }, - { - "filename": "shadow_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": "rarer_candy", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 23, - "h": 23 - }, - "frame": { - "x": 161, - "y": 41, - "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": 161, - "y": 64, - "w": 23, - "h": 22 - } - }, - { - "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": 86, - "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": 161, - "y": 109, - "w": 22, - "h": 23 - } - }, - { - "filename": "sharp_beak", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 21, - "h": 23 - }, - "frame": { - "x": 163, - "y": 132, - "w": 21, - "h": 23 - } - }, - { - "filename": "dawn_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 21 - }, - "frame": { - "x": 164, - "y": 155, - "w": 20, - "h": 21 - } - }, - { - "filename": "soft_sand", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 24, - "h": 20 - }, - "frame": { - "x": 186, - "y": 21, - "w": 24, - "h": 20 - } - }, - { - "filename": "rusted_sword", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 23, - "h": 22 - }, - "frame": { - "x": 184, - "y": 41, - "w": 23, - "h": 22 - } - }, - { - "filename": "steel_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 184, - "y": 63, - "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": 183, - "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": 183, - "y": 109, - "w": 22, - "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": 184, - "y": 132, - "w": 21, - "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": 210, - "y": 21, - "w": 23, - "h": 20 - } - }, - { - "filename": "blank_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 207, - "y": 41, - "w": 22, - "h": 22 - } - }, - { - "filename": "wide_lens", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 206, - "y": 63, - "w": 22, - "h": 23 - } - }, - { - "filename": "bug_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 205, - "y": 86, - "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": 205, - "y": 108, - "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": 205, - "y": 130, - "w": 22, - "h": 22 - } - }, - { - "filename": "moon_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 6, - "w": 23, - "h": 21 - }, - "frame": { - "x": 233, - "y": 21, - "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": 256, - "y": 21, - "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": 279, - "y": 21, - "w": 23, - "h": 21 - } - }, - { - "filename": "wellspring_mask", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 23, - "h": 21 - }, - "frame": { - "x": 302, - "y": 21, - "w": 23, - "h": 21 - } - }, - { - "filename": "deep_sea_tooth", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 21 - }, - "frame": { - "x": 184, - "y": 155, - "w": 22, - "h": 21 - } - }, - { - "filename": "relic_crown", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 23, - "h": 18 - }, - "frame": { - "x": 170, - "y": 176, - "w": 23, - "h": 18 - } - }, - { - "filename": "sachet", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 18, - "h": 23 - }, - "frame": { - "x": 175, - "y": 194, - "w": 18, - "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": 206, - "y": 152, - "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": 176, - "y": 217, - "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": 176, - "y": 240, - "w": 17, - "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": 229, - "y": 42, - "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": 251, - "y": 42, - "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": 273, - "y": 42, - "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": 295, - "y": 42, - "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": 228, - "y": 64, - "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": 227, - "y": 86, - "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": 250, - "y": 64, - "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": 227, - "y": 108, - "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": 227, - "y": 130, - "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": 249, - "y": 86, - "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": 272, - "y": 64, - "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": 249, - "y": 108, - "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": 271, - "y": 86, - "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": 294, - "y": 64, - "w": 22, - "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": 249, - "y": 130, - "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": 228, - "y": 152, - "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": 271, - "y": 108, - "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": 293, - "y": 86, - "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": 271, - "y": 130, - "w": 22, - "h": 22 - } - }, - { - "filename": "protector", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 250, - "y": 152, - "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": 293, - "y": 108, - "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": 293, - "y": 130, - "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": 272, - "y": 152, - "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": 294, - "y": 152, - "w": 22, - "h": 22 - } - }, - { - "filename": "shed_shell", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 317, - "y": 42, - "w": 22, - "h": 22 - } - }, - { - "filename": "starf_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 316, - "y": 64, - "w": 22, - "h": 22 - } - }, - { - "filename": "steel_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 315, - "y": 86, - "w": 22, - "h": 22 - } - }, - { - "filename": "thick_club", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 339, - "y": 42, - "w": 22, - "h": 22 - } - }, - { - "filename": "thunder_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 338, - "y": 64, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_bug", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 315, - "y": 108, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_dark", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 315, - "y": 130, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_dragon", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 337, - "y": 86, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_electric", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 337, - "y": 108, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_fairy", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 337, - "y": 130, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_fighting", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 316, - "y": 152, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_fire", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 338, - "y": 152, - "w": 22, - "h": 22 - } - }, - { - "filename": "metronome", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 17, - "h": 22 - }, - "frame": { - "x": 361, - "y": 42, - "w": 17, - "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": 378, - "y": 43, - "w": 22, - "h": 21 - } - }, - { - "filename": "tm_flying", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 360, - "y": 64, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_ghost", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 359, - "y": 86, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_grass", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 359, - "y": 108, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_ground", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 359, - "y": 130, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_ice", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 360, - "y": 152, - "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": 382, - "y": 64, - "w": 20, - "h": 22 - } - }, - { - "filename": "tm_normal", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 381, - "y": 86, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_poison", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 381, - "y": 108, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_psychic", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 381, - "y": 130, - "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": 403, - "y": 62, - "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": 403, - "y": 82, - "w": 23, - "h": 20 - } - }, { "filename": "coupon", "rotated": false, @@ -5169,8 +1095,8 @@ "h": 19 }, "frame": { - "x": 403, - "y": 102, + "x": 22, + "y": 406, "w": 23, "h": 19 } @@ -5190,14 +1116,14 @@ "h": 19 }, "frame": { - "x": 403, - "y": 121, + "x": 45, + "y": 406, "w": 23, "h": 19 } }, { - "filename": "mystic_ticket", + "filename": "ability_capsule", "rotated": false, "trimmed": true, "sourceSize": { @@ -5206,40 +1132,19 @@ }, "spriteSourceSize": { "x": 4, - "y": 7, - "w": 23, - "h": 19 + "y": 9, + "w": 24, + "h": 14 }, "frame": { - "x": 403, - "y": 140, - "w": 23, - "h": 19 + "x": 135, + "y": 22, + "w": 24, + "h": 14 } }, { - "filename": "dusk_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 21, - "h": 21 - }, - "frame": { - "x": 382, - "y": 152, - "w": 21, - "h": 21 - } - }, - { - "filename": "pair_of_tickets", + "filename": "choice_specs", "rotated": false, "trimmed": true, "sourceSize": { @@ -5248,19 +1153,19 @@ }, "spriteSourceSize": { "x": 4, - "y": 7, - "w": 23, - "h": 19 + "y": 8, + "w": 24, + "h": 18 }, "frame": { - "x": 403, - "y": 159, - "w": 23, - "h": 19 + "x": 29, + "y": 55, + "w": 24, + "h": 18 } }, { - "filename": "leftovers", + "filename": "calcium", "rotated": false, "trimmed": true, "sourceSize": { @@ -5269,19 +1174,250 @@ }, "spriteSourceSize": { "x": 8, - "y": 5, - "w": 15, - "h": 22 + "y": 4, + "w": 16, + "h": 24 }, "frame": { - "x": 193, - "y": 176, - "w": 15, - "h": 22 + "x": 59, + "y": 27, + "w": 16, + "h": 24 } }, { - "filename": "tm_rock", + "filename": "fist_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 75, + "y": 26, + "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": 99, + "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": "clefairy_doll", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 24, + "h": 23 + }, + "frame": { + "x": 135, + "y": 36, + "w": 24, + "h": 23 + } + }, + { + "filename": "carbos", + "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": "focus_band", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 175, + "y": 21, + "w": 24, + "h": 24 + } + }, + { + "filename": "golden_punch", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 199, + "y": 21, + "w": 24, + "h": 24 + } + }, + { + "filename": "gracidea", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 223, + "y": 21, + "w": 24, + "h": 24 + } + }, + { + "filename": "grip_claw", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 247, + "y": 21, + "w": 24, + "h": 24 + } + }, + { + "filename": "icicle_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 271, + "y": 21, + "w": 24, + "h": 24 + } + }, + { + "filename": "insect_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 295, + "y": 21, + "w": 24, + "h": 24 + } + }, + { + "filename": "catching_charm", "rotated": false, "trimmed": true, "sourceSize": { @@ -5290,19 +1426,19 @@ }, "spriteSourceSize": { "x": 5, - "y": 5, - "w": 22, - "h": 22 + "y": 4, + "w": 21, + "h": 24 }, "frame": { - "x": 208, - "y": 174, - "w": 22, - "h": 22 + "x": 319, + "y": 21, + "w": 21, + "h": 24 } }, { - "filename": "tm_steel", + "filename": "iron_plate", "rotated": false, "trimmed": true, "sourceSize": { @@ -5310,125 +1446,1742 @@ "h": 32 }, "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 230, - "y": 174, - "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": 252, - "y": 174, - "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": 274, - "y": 174, - "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": 296, - "y": 174, - "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": 318, - "y": 174, - "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 + "x": 4, + "y": 4, + "w": 24, + "h": 24 }, "frame": { "x": 340, - "y": 174, - "w": 22, + "y": 20, + "w": 24, + "h": 24 + } + }, + { + "filename": "lucky_punch", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 364, + "y": 20, + "w": 24, + "h": 24 + } + }, + { + "filename": "lock_capsule", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 5, + "w": 19, + "h": 22 + }, + "frame": { + "x": 388, + "y": 20, + "w": 19, "h": 22 } }, { - "filename": "sitrus_berry", + "filename": "ether", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 18, + "h": 24 + }, + "frame": { + "x": 407, + "y": 24, + "w": 18, + "h": 24 + } + }, + { + "filename": "abomasite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 159, + "y": 46, + "w": 16, + "h": 16 + } + }, + { + "filename": "coin_case", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 24, + "h": 23 + }, + "frame": { + "x": 175, + "y": 45, + "w": 24, + "h": 23 + } + }, + { + "filename": "expert_belt", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 23 + }, + "frame": { + "x": 199, + "y": 45, + "w": 24, + "h": 23 + } + }, + { + "filename": "hearthflame_mask", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 23 + }, + "frame": { + "x": 223, + "y": 45, + "w": 24, + "h": 23 + } + }, + { + "filename": "leppa_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 24, + "h": 23 + }, + "frame": { + "x": 247, + "y": 45, + "w": 24, + "h": 23 + } + }, + { + "filename": "lucky_punch_great", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 271, + "y": 45, + "w": 24, + "h": 24 + } + }, + { + "filename": "lucky_punch_master", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 295, + "y": 45, + "w": 24, + "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": 319, + "y": 45, + "w": 23, + "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": 342, + "y": 44, + "w": 24, + "h": 24 + } + }, + { + "filename": "lustrous_globe", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 366, + "y": 44, + "w": 24, + "h": 24 + } + }, + { + "filename": "lure", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 17, + "h": 24 + }, + "frame": { + "x": 390, + "y": 42, + "w": 17, + "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": 407, + "y": 48, + "w": 18, + "h": 24 + } + }, + { + "filename": "relic_gold", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 9, + "y": 11, + "w": 15, + "h": 11 + }, + "frame": { + "x": 0, + "y": 412, + "w": 15, + "h": 11 + } + }, + { + "filename": "dragon_scale", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 24, + "h": 18 + }, + "frame": { + "x": 75, + "y": 50, + "w": 24, + "h": 18 + } + }, + { + "filename": "exp_balance", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 24, + "h": 22 + }, + "frame": { + "x": 99, + "y": 50, + "w": 24, + "h": 22 + } + }, + { + "filename": "berry_juice", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 24, + "h": 23 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 22, + "h": 21 + }, + "frame": { + "x": 53, + "y": 55, + "w": 22, + "h": 21 + } + }, + { + "filename": "exp_share", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 24, + "h": 22 + }, + "frame": { + "x": 75, + "y": 68, + "w": 24, + "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": 99, + "y": 72, + "w": 24, + "h": 20 + } + }, + { + "filename": "meadow_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 123, + "y": 59, + "w": 24, + "h": 24 + } + }, + { + "filename": "metal_powder", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 24, + "h": 20 + }, + "frame": { + "x": 123, + "y": 83, + "w": 24, + "h": 20 + } + }, + { + "filename": "mind_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 147, + "y": 62, + "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": 147, + "y": 86, + "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": 171, + "y": 68, + "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": 195, + "y": 68, + "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": 219, + "y": 68, + "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": 243, + "y": 68, + "w": 24, + "h": 24 + } + }, + { + "filename": "scope_lens", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 24, + "h": 23 + }, + "frame": { + "x": 267, + "y": 69, + "w": 24, + "h": 23 + } + }, + { + "filename": "sky_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 291, + "y": 69, + "w": 24, + "h": 24 + } + }, + { + "filename": "splash_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 315, + "y": 69, + "w": 24, + "h": 24 + } + }, + { + "filename": "peat_block", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 24, + "h": 22 + }, + "frame": { + "x": 171, + "y": 92, + "w": 24, + "h": 22 + } + }, + { + "filename": "spooky_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 195, + "y": 92, + "w": 24, + "h": 24 + } + }, + { + "filename": "stone_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 219, + "y": 92, + "w": 24, + "h": 24 + } + }, + { + "filename": "sun_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 243, + "y": 92, + "w": 24, + "h": 24 + } + }, + { + "filename": "toxic_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 267, + "y": 92, + "w": 24, + "h": 24 + } + }, + { + "filename": "twisted_spoon", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 24, + "h": 23 + }, + "frame": { + "x": 291, + "y": 93, + "w": 24, + "h": 23 + } + }, + { + "filename": "zap_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 315, + "y": 93, + "w": 24, + "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": 339, + "y": 69, + "w": 16, + "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": 355, + "y": 68, + "w": 23, + "h": 24 + } + }, + { + "filename": "iron", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 339, + "y": 93, + "w": 16, + "h": 24 + } + }, + { + "filename": "berry_pouch", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 23, + "h": 23 + }, + "frame": { + "x": 355, + "y": 92, + "w": 23, + "h": 23 + } + }, + { + "filename": "max_elixir", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 4, + "w": 18, + "h": 24 + }, + "frame": { + "x": 378, + "y": 68, + "w": 18, + "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": 378, + "y": 92, + "w": 22, + "h": 23 + } + }, + { + "filename": "quick_powder", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 24, + "h": 20 + }, + "frame": { + "x": 396, + "y": 72, + "w": 24, + "h": 20 + } + }, + { + "filename": "bug_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 400, + "y": 92, + "w": 22, + "h": 23 + } + }, + { + "filename": "rusted_shield", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 24, + "h": 20 + }, + "frame": { + "x": 355, + "y": 115, + "w": 24, + "h": 20 + } + }, + { + "filename": "sacred_ash", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 24, + "h": 20 + }, + "frame": { + "x": 379, + "y": 115, + "w": 24, + "h": 20 + } + }, + { + "filename": "max_revive", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 22, + "h": 24 + }, + "frame": { + "x": 403, + "y": 115, + "w": 22, + "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": 39, + "y": 90, + "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": 39, + "y": 114, + "w": 18, + "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": 39, + "y": 138, + "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": 39, + "y": 162, + "w": 21, + "h": 24 + } + }, + { + "filename": "dark_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 39, + "y": 186, + "w": 22, + "h": 23 + } + }, + { + "filename": "max_lure", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 17, + "h": 24 + }, + "frame": { + "x": 44, + "y": 209, + "w": 17, + "h": 24 + } + }, + { + "filename": "red_orb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 20, + "h": 24 + }, + "frame": { + "x": 44, + "y": 233, + "w": 20, + "h": 24 + } + }, + { + "filename": "sachet", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 18, + "h": 23 + }, + "frame": { + "x": 57, + "y": 76, + "w": 18, + "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": 57, + "y": 99, + "w": 21, + "h": 23 + } + }, + { + "filename": "mega_bracelet", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 16 + }, + "frame": { + "x": 57, + "y": 122, + "w": 20, + "h": 16 + } + }, + { + "filename": "super_lure", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 17, + "h": 24 + }, + "frame": { + "x": 60, + "y": 138, + "w": 17, + "h": 24 + } + }, + { + "filename": "max_repel", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 60, + "y": 162, + "w": 16, + "h": 24 + } + }, + { + "filename": "pp_max", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 61, + "y": 186, + "w": 16, + "h": 24 + } + }, + { + "filename": "dragon_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 61, + "y": 210, + "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": 64, + "y": 233, + "w": 23, + "h": 23 + } + }, + { + "filename": "electric_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 45, + "y": 257, + "w": 22, + "h": 23 + } + }, + { + "filename": "fairy_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 67, + "y": 256, + "w": 22, + "h": 23 + } + }, + { + "filename": "fighting_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 46, + "y": 280, + "w": 22, + "h": 23 + } + }, + { + "filename": "fire_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 23 + }, + "frame": { + "x": 46, + "y": 303, + "w": 22, + "h": 23 + } + }, + { + "filename": "fire_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 46, + "y": 326, + "w": 22, + "h": 23 + } + }, + { + "filename": "flying_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 46, + "y": 349, + "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": 46, + "y": 372, + "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": 68, + "y": 279, + "w": 22, + "h": 23 + } + }, + { + "filename": "grass_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 68, + "y": 302, + "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": 68, + "y": 325, + "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": 68, + "y": 348, + "w": 23, + "h": 23 + } + }, + { + "filename": "rare_candy", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 23, + "h": 23 + }, + "frame": { + "x": 68, + "y": 371, + "w": 23, + "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": 78, + "y": 90, + "w": 21, + "h": 23 + } + }, + { + "filename": "shadow_reins_of_unity", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 24, + "h": 20 + }, + "frame": { + "x": 99, + "y": 92, + "w": 24, + "h": 20 + } + }, + { + "filename": "silver_powder", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 11, + "w": 24, + "h": 15 + }, + "frame": { + "x": 123, + "y": 103, + "w": 24, + "h": 15 + } + }, + { + "filename": "soft_sand", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 24, + "h": 20 + }, + "frame": { + "x": 147, + "y": 110, + "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": 171, + "y": 114, + "w": 23, + "h": 21 + } + }, + { + "filename": "amulet_coin", "rotated": false, "trimmed": true, "sourceSize": { @@ -5438,18 +3191,165 @@ "spriteSourceSize": { "x": 6, "y": 5, - "w": 20, + "w": 23, + "h": 21 + }, + "frame": { + "x": 194, + "y": 116, + "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": 217, + "y": 116, + "w": 23, + "h": 21 + } + }, + { + "filename": "healing_charm", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 23, "h": 22 }, "frame": { - "x": 362, - "y": 174, - "w": 20, + "x": 240, + "y": 116, + "w": 23, "h": 22 } }, { - "filename": "poison_barb", + "filename": "rarer_candy", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 23, + "h": 23 + }, + "frame": { + "x": 263, + "y": 116, + "w": 23, + "h": 23 + } + }, + { + "filename": "ground_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 286, + "y": 116, + "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": 308, + "y": 117, + "w": 23, + "h": 22 + } + }, + { + "filename": "blank_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 331, + "y": 117, + "w": 22, + "h": 22 + } + }, + { + "filename": "ice_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 68, + "y": 394, + "w": 22, + "h": 23 + } + }, + { + "filename": "binding_band", "rotated": false, "trimmed": true, "sourceSize": { @@ -5459,14 +3359,77 @@ "spriteSourceSize": { "x": 5, "y": 6, - "w": 21, - "h": 21 + "w": 23, + "h": 20 }, "frame": { - "x": 382, - "y": 173, - "w": 21, - "h": 21 + "x": 78, + "y": 113, + "w": 23, + "h": 20 + } + }, + { + "filename": "bug_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 101, + "y": 112, + "w": 22, + "h": 22 + } + }, + { + "filename": "never_melt_ice", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 23 + }, + "frame": { + "x": 77, + "y": 133, + "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": 99, + "y": 134, + "w": 22, + "h": 22 } }, { @@ -5484,14 +3447,14 @@ "h": 17 }, "frame": { - "x": 403, - "y": 178, + "x": 123, + "y": 118, "w": 23, "h": 17 } }, { - "filename": "metal_coat", + "filename": "moon_stone", "rotated": false, "trimmed": true, "sourceSize": { @@ -5499,396 +3462,18 @@ "h": 32 }, "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 19, - "h": 22 - }, - "frame": { - "x": 193, - "y": 198, - "w": 19, - "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": 212, - "y": 196, - "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": 234, - "y": 196, - "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": 256, - "y": 196, - "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": 278, - "y": 196, - "w": 22, - "h": 22 - } - }, - { - "filename": "sweet_apple", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, + "x": 4, "y": 6, - "w": 22, + "w": 23, "h": 21 }, "frame": { - "x": 300, - "y": 196, - "w": 22, + "x": 121, + "y": 135, + "w": 23, "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": 322, - "y": 196, - "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": 344, - "y": 196, - "w": 22, - "h": 21 - } - }, - { - "filename": "quick_claw", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 19, - "h": 21 - }, - "frame": { - "x": 193, - "y": 220, - "w": 19, - "h": 21 - } - }, - { - "filename": "deep_sea_scale", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 20 - }, - "frame": { - "x": 212, - "y": 218, - "w": 22, - "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": 234, - "y": 218, - "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": 256, - "y": 218, - "w": 22, - "h": 20 - } - }, - { - "filename": "tera_orb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 20 - }, - "frame": { - "x": 278, - "y": 218, - "w": 22, - "h": 20 - } - }, - { - "filename": "shiny_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 21, - "h": 21 - }, - "frame": { - "x": 300, - "y": 217, - "w": 21, - "h": 21 - } - }, - { - "filename": "zoom_lens", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 21, - "h": 21 - }, - "frame": { - "x": 321, - "y": 217, - "w": 21, - "h": 21 - } - }, - { - "filename": "blunder_policy", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 19 - }, - "frame": { - "x": 342, - "y": 217, - "w": 22, - "h": 19 - } - }, - { - "filename": "spell_tag", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 19, - "h": 21 - }, - "frame": { - "x": 193, - "y": 241, - "w": 19, - "h": 21 - } - }, - { - "filename": "dubious_disc", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 22, - "h": 19 - }, - "frame": { - "x": 212, - "y": 238, - "w": 22, - "h": 19 - } - }, - { - "filename": "upgrade", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 22, - "h": 19 - }, - "frame": { - "x": 234, - "y": 238, - "w": 22, - "h": 19 - } - }, { "filename": "burn_drive", "rotated": false, @@ -5904,8 +3489,8 @@ "h": 17 }, "frame": { - "x": 256, - "y": 238, + "x": 77, + "y": 156, "w": 23, "h": 17 } @@ -5925,12 +3510,726 @@ "h": 17 }, "frame": { - "x": 279, - "y": 238, + "x": 100, + "y": 156, "w": 23, "h": 17 } }, + { + "filename": "black_sludge", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 24, + "h": 24 + }, + "spriteSourceSize": { + "x": 1, + "y": 2, + "w": 22, + "h": 19 + }, + "frame": { + "x": 123, + "y": 156, + "w": 22, + "h": 19 + } + }, + { + "filename": "normal_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 77, + "y": 173, + "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": 99, + "y": 173, + "w": 22, + "h": 23 + } + }, + { + "filename": "n_lunarizer", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 23, + "h": 21 + }, + "frame": { + "x": 121, + "y": 175, + "w": 23, + "h": 21 + } + }, + { + "filename": "poison_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 83, + "y": 196, + "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": 105, + "y": 196, + "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": 127, + "y": 196, + "w": 17, + "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": 87, + "y": 219, + "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": 109, + "y": 219, + "w": 22, + "h": 23 + } + }, + { + "filename": "full_heal", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 9, + "y": 4, + "w": 15, + "h": 23 + }, + "frame": { + "x": 131, + "y": 219, + "w": 15, + "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": 89, + "y": 242, + "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": 111, + "y": 242, + "w": 22, + "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": 133, + "y": 242, + "w": 21, + "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": 90, + "y": 265, + "w": 22, + "h": 23 + } + }, + { + "filename": "wide_lens", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 90, + "y": 288, + "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": 112, + "y": 265, + "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": 112, + "y": 287, + "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": 134, + "y": 265, + "w": 20, + "h": 23 + } + }, + { + "filename": "dawn_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 21 + }, + "frame": { + "x": 134, + "y": 288, + "w": 20, + "h": 21 + } + }, + { + "filename": "sharp_beak", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 21, + "h": 23 + }, + "frame": { + "x": 91, + "y": 311, + "w": 21, + "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": 112, + "y": 309, + "w": 22, + "h": 22 + } + }, + { + "filename": "whipped_dream", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 21, + "h": 23 + }, + "frame": { + "x": 91, + "y": 334, + "w": 21, + "h": 23 + } + }, + { + "filename": "dragon_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 112, + "y": 331, + "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": 91, + "y": 357, + "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": 134, + "y": 309, + "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": 134, + "y": 331, + "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": 113, + "y": 353, + "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": 135, + "y": 353, + "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": 91, + "y": 379, + "w": 22, + "h": 19 + } + }, + { + "filename": "fire_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 113, + "y": 375, + "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": 135, + "y": 375, + "w": 22, + "h": 22 + } + }, + { + "filename": "mystic_ticket", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 23, + "h": 19 + }, + "frame": { + "x": 90, + "y": 398, + "w": 23, + "h": 19 + } + }, + { + "filename": "n_solarizer", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 23, + "h": 21 + }, + "frame": { + "x": 113, + "y": 397, + "w": 23, + "h": 21 + } + }, + { + "filename": "deep_sea_tooth", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 21 + }, + "frame": { + "x": 136, + "y": 397, + "w": 22, + "h": 21 + } + }, { "filename": "douse_drive", "rotated": false, @@ -5946,14 +4245,14 @@ "h": 17 }, "frame": { - "x": 302, - "y": 238, + "x": 146, + "y": 130, "w": 23, "h": 17 } }, { - "filename": "soothe_bell", + "filename": "ganlon_berry", "rotated": false, "trimmed": true, "sourceSize": { @@ -5961,20 +4260,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 8, + "x": 5, "y": 5, - "w": 17, + "w": 22, "h": 22 }, "frame": { - "x": 366, - "y": 196, - "w": 17, + "x": 145, + "y": 147, + "w": 22, "h": 22 } }, { - "filename": "big_nugget", + "filename": "pair_of_tickets", "rotated": false, "trimmed": true, "sourceSize": { @@ -5982,18 +4281,165 @@ "h": 32 }, "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, + "x": 4, + "y": 7, + "w": 23, + "h": 19 + }, + "frame": { + "x": 169, + "y": 135, + "w": 23, + "h": 19 + } + }, + { + "filename": "relic_crown", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 23, + "h": 18 + }, + "frame": { + "x": 192, + "y": 137, + "w": 23, + "h": 18 + } + }, + { + "filename": "reviver_seed", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 8, + "w": 23, "h": 20 }, "frame": { - "x": 383, - "y": 194, - "w": 20, + "x": 215, + "y": 137, + "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": 238, + "y": 138, + "w": 23, + "h": 20 + } + }, + { + "filename": "wellspring_mask", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 23, + "h": 21 + }, + "frame": { + "x": 261, + "y": 139, + "w": 23, + "h": 21 + } + }, + { + "filename": "ghost_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 284, + "y": 139, + "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": 306, + "y": 139, + "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": 328, + "y": 139, + "w": 22, + "h": 22 + } + }, { "filename": "shock_drive", "rotated": false, @@ -6009,8 +4455,8 @@ "h": 17 }, "frame": { - "x": 403, - "y": 195, + "x": 167, + "y": 154, "w": 23, "h": 17 } @@ -6030,12 +4476,1083 @@ "h": 17 }, "frame": { - "x": 403, - "y": 212, + "x": 190, + "y": 155, "w": 23, "h": 17 } }, + { + "filename": "deep_sea_scale", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 20 + }, + "frame": { + "x": 213, + "y": 157, + "w": 22, + "h": 20 + } + }, + { + "filename": "dubious_disc", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 22, + "h": 19 + }, + "frame": { + "x": 235, + "y": 158, + "w": 22, + "h": 19 + } + }, + { + "filename": "fairy_feather", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 22, + "h": 20 + }, + "frame": { + "x": 257, + "y": 160, + "w": 22, + "h": 20 + } + }, + { + "filename": "guard_spec", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 279, + "y": 161, + "w": 22, + "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": 301, + "y": 161, + "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": 323, + "y": 161, + "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": 145, + "y": 169, + "w": 22, + "h": 21 + } + }, + { + "filename": "magmarizer", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 144, + "y": 190, + "w": 22, + "h": 22 + } + }, + { + "filename": "malicious_armor", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 20 + }, + "frame": { + "x": 167, + "y": 171, + "w": 22, + "h": 20 + } + }, + { + "filename": "mini_black_hole", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 166, + "y": 191, + "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": 189, + "y": 172, + "w": 22, + "h": 22 + } + }, + { + "filename": "protector", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 188, + "y": 194, + "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": 211, + "y": 177, + "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": 233, + "y": 177, + "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": 255, + "y": 180, + "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": 277, + "y": 183, + "w": 22, + "h": 22 + } + }, + { + "filename": "shed_shell", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 299, + "y": 183, + "w": 22, + "h": 22 + } + }, + { + "filename": "starf_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 321, + "y": 183, + "w": 22, + "h": 22 + } + }, + { + "filename": "steel_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 210, + "y": 199, + "w": 22, + "h": 22 + } + }, + { + "filename": "thick_club", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 232, + "y": 199, + "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": 254, + "y": 202, + "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": 276, + "y": 205, + "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": 298, + "y": 205, + "w": 22, + "h": 21 + } + }, + { + "filename": "thunder_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 320, + "y": 205, + "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": 146, + "y": 212, + "w": 20, + "h": 22 + } + }, + { + "filename": "tm_bug", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 166, + "y": 213, + "w": 22, + "h": 22 + } + }, + { + "filename": "tera_orb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 20 + }, + "frame": { + "x": 188, + "y": 216, + "w": 22, + "h": 20 + } + }, + { + "filename": "tm_dark", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 210, + "y": 221, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_dragon", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 232, + "y": 221, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_electric", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 254, + "y": 223, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_fairy", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 276, + "y": 226, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_fighting", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 298, + "y": 226, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_fire", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 320, + "y": 227, + "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": 345, + "y": 161, + "w": 18, + "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": 343, + "y": 183, + "w": 20, + "h": 22 + } + }, + { + "filename": "tm_flying", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 342, + "y": 205, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_ghost", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 342, + "y": 227, + "w": 22, + "h": 22 + } + }, + { + "filename": "leftovers", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 15, + "h": 22 + }, + "frame": { + "x": 350, + "y": 139, + "w": 15, + "h": 22 + } + }, + { + "filename": "tm_grass", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 365, + "y": 135, + "w": 22, + "h": 22 + } + }, + { + "filename": "pp_up", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 387, + "y": 135, + "w": 16, + "h": 24 + } + }, + { + "filename": "tm_ground", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 403, + "y": 139, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_ice", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 365, + "y": 157, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_normal", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 363, + "y": 179, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_poison", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 364, + "y": 201, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_psychic", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 364, + "y": 223, + "w": 22, + "h": 22 + } + }, + { + "filename": "protein", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 387, + "y": 159, + "w": 16, + "h": 24 + } + }, + { + "filename": "tm_rock", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 403, + "y": 161, + "w": 22, + "h": 22 + } + }, + { + "filename": "masterpiece_teacup", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 21, + "h": 18 + }, + "frame": { + "x": 385, + "y": 183, + "w": 21, + "h": 18 + } + }, + { + "filename": "metal_coat", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 5, + "w": 19, + "h": 22 + }, + "frame": { + "x": 406, + "y": 183, + "w": 19, + "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": 386, + "y": 201, + "w": 20, + "h": 20 + } + }, + { + "filename": "quick_claw", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 19, + "h": 21 + }, + "frame": { + "x": 406, + "y": 205, + "w": 19, + "h": 21 + } + }, { "filename": "blue_orb", "rotated": false, @@ -6051,12 +5568,54 @@ "h": 20 }, "frame": { - "x": 383, - "y": 214, + "x": 386, + "y": 221, "w": 20, "h": 20 } }, + { + "filename": "spell_tag", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 6, + "w": 19, + "h": 21 + }, + "frame": { + "x": 406, + "y": 226, + "w": 19, + "h": 21 + } + }, + { + "filename": "everstone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 17 + }, + "frame": { + "x": 386, + "y": 241, + "w": 20, + "h": 17 + } + }, { "filename": "apicot_berry", "rotated": false, @@ -6072,14 +5631,14 @@ "h": 20 }, "frame": { - "x": 364, - "y": 218, + "x": 406, + "y": 247, "w": 19, "h": 20 } }, { - "filename": "big_mushroom", + "filename": "tm_steel", "rotated": false, "trimmed": true, "sourceSize": { @@ -6087,16 +5646,16 @@ "h": 32 }, "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 19, - "h": 19 + "x": 5, + "y": 5, + "w": 22, + "h": 22 }, "frame": { - "x": 325, - "y": 238, - "w": 19, - "h": 19 + "x": 364, + "y": 245, + "w": 22, + "h": 22 } }, { @@ -6114,8 +5673,8 @@ "h": 20 }, "frame": { - "x": 344, - "y": 236, + "x": 386, + "y": 258, "w": 20, "h": 20 } @@ -6135,56 +5694,14 @@ "h": 20 }, "frame": { - "x": 364, - "y": 238, + "x": 406, + "y": 267, "w": 19, "h": 20 } }, { - "filename": "magnet", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 383, - "y": 234, - "w": 20, - "h": 20 - } - }, - { - "filename": "mb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 403, - "y": 229, - "w": 20, - "h": 20 - } - }, - { - "filename": "masterpiece_teacup", + "filename": "tm_water", "rotated": false, "trimmed": true, "sourceSize": { @@ -6193,19 +5710,19 @@ }, "spriteSourceSize": { "x": 5, - "y": 7, - "w": 21, - "h": 18 + "y": 5, + "w": 22, + "h": 22 }, "frame": { - "x": 212, - "y": 257, - "w": 21, - "h": 18 + "x": 154, + "y": 235, + "w": 22, + "h": 22 } }, { - "filename": "metal_alloy", + "filename": "water_memory", "rotated": false, "trimmed": true, "sourceSize": { @@ -6213,20 +5730,167 @@ "h": 32 }, "spriteSourceSize": { - "x": 6, - "y": 7, - "w": 21, - "h": 19 + "x": 5, + "y": 5, + "w": 22, + "h": 22 }, "frame": { - "x": 233, + "x": 154, "y": 257, - "w": 21, - "h": 19 + "w": 22, + "h": 22 } }, { - "filename": "hard_stone", + "filename": "water_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 154, + "y": 279, + "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": 156, + "y": 301, + "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": 156, + "y": 323, + "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": 157, + "y": 345, + "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": 157, + "y": 367, + "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": 158, + "y": 389, + "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": 176, + "y": 236, + "w": 22, + "h": 22 + } + }, + { + "filename": "dusk_stone", "rotated": false, "trimmed": true, "sourceSize": { @@ -6236,18 +5900,18 @@ "spriteSourceSize": { "x": 6, "y": 6, - "w": 19, - "h": 20 + "w": 21, + "h": 21 }, "frame": { - "x": 193, - "y": 262, - "w": 19, - "h": 20 + "x": 176, + "y": 258, + "w": 21, + "h": 21 } }, { - "filename": "pb", + "filename": "poison_barb", "rotated": false, "trimmed": true, "sourceSize": { @@ -6255,16 +5919,79 @@ "h": 32 }, "spriteSourceSize": { - "x": 6, + "x": 5, "y": 6, - "w": 20, - "h": 20 + "w": 21, + "h": 21 }, "frame": { - "x": 190, - "y": 282, - "w": 20, - "h": 20 + "x": 176, + "y": 279, + "w": 21, + "h": 21 + } + }, + { + "filename": "potion", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 17, + "h": 23 + }, + "frame": { + "x": 178, + "y": 300, + "w": 17, + "h": 23 + } + }, + { + "filename": "metronome", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 5, + "w": 17, + "h": 22 + }, + "frame": { + "x": 178, + "y": 323, + "w": 17, + "h": 22 + } + }, + { + "filename": "repel", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 179, + "y": 345, + "w": 16, + "h": 24 } }, { @@ -6282,12 +6009,243 @@ "h": 20 }, "frame": { - "x": 193, - "y": 302, + "x": 179, + "y": 369, "w": 17, "h": 20 } }, + { + "filename": "soothe_bell", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 17, + "h": 22 + }, + "frame": { + "x": 180, + "y": 389, + "w": 17, + "h": 22 + } + }, + { + "filename": "super_repel", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 195, + "y": 300, + "w": 16, + "h": 24 + } + }, + { + "filename": "unknown", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 195, + "y": 324, + "w": 16, + "h": 24 + } + }, + { + "filename": "shiny_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 21, + "h": 21 + }, + "frame": { + "x": 195, + "y": 348, + "w": 21, + "h": 21 + } + }, + { + "filename": "magnet", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 196, + "y": 369, + "w": 20, + "h": 20 + } + }, + { + "filename": "zoom_lens", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 21, + "h": 21 + }, + "frame": { + "x": 197, + "y": 389, + "w": 21, + "h": 21 + } + }, + { + "filename": "candy_overlay", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 12, + "w": 16, + "h": 15 + }, + "frame": { + "x": 197, + "y": 410, + "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": 213, + "y": 410, + "w": 15, + "h": 15 + } + }, + { + "filename": "upgrade", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 22, + "h": 19 + }, + "frame": { + "x": 198, + "y": 243, + "w": 22, + "h": 19 + } + }, + { + "filename": "metal_alloy", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 7, + "w": 21, + "h": 19 + }, + "frame": { + "x": 220, + "y": 243, + "w": 21, + "h": 19 + } + }, + { + "filename": "mb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 197, + "y": 262, + "w": 20, + "h": 20 + } + }, { "filename": "sharp_meteorite", "rotated": false, @@ -6303,12 +6261,54 @@ "h": 18 }, "frame": { - "x": 212, - "y": 275, + "x": 197, + "y": 282, "w": 21, "h": 18 } }, + { + "filename": "pb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 217, + "y": 262, + "w": 20, + "h": 20 + } + }, + { + "filename": "big_mushroom", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 19, + "h": 19 + }, + "frame": { + "x": 218, + "y": 282, + "w": 19, + "h": 19 + } + }, { "filename": "pb_gold", "rotated": false, @@ -6324,96 +6324,12 @@ "h": 20 }, "frame": { - "x": 210, - "y": 293, + "x": 211, + "y": 301, "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": 233, - "y": 276, - "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": 230, - "y": 294, - "w": 20, - "h": 19 - } - }, - { - "filename": "everstone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 17 - }, - "frame": { - "x": 210, - "y": 313, - "w": 20, - "h": 17 - } - }, - { - "filename": "power_herb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 24, - "h": 24 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 20, - "h": 19 - }, - "frame": { - "x": 230, - "y": 313, - "w": 20, - "h": 19 - } - }, { "filename": "rb", "rotated": false, @@ -6429,14 +6345,77 @@ "h": 20 }, "frame": { - "x": 201, - "y": 330, + "x": 211, + "y": 321, "w": 20, "h": 20 } }, { - "filename": "smooth_meteorite", + "filename": "zinc", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 216, + "y": 341, + "w": 16, + "h": 24 + } + }, + { + "filename": "super_potion", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 17, + "h": 23 + }, + "frame": { + "x": 216, + "y": 365, + "w": 17, + "h": 23 + } + }, + { + "filename": "hard_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 19, + "h": 20 + }, + "frame": { + "x": 218, + "y": 388, + "w": 19, + "h": 20 + } + }, + { + "filename": "lucky_egg", "rotated": false, "trimmed": true, "sourceSize": { @@ -6446,13 +6425,13 @@ "spriteSourceSize": { "x": 7, "y": 6, - "w": 20, + "w": 17, "h": 20 }, "frame": { - "x": 201, - "y": 350, - "w": 20, + "x": 231, + "y": 301, + "w": 17, "h": 20 } }, @@ -6471,12 +6450,33 @@ "h": 20 }, "frame": { - "x": 203, - "y": 370, + "x": 231, + "y": 321, "w": 18, "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": 232, + "y": 341, + "w": 20, + "h": 20 + } + }, { "filename": "strange_ball", "rotated": false, @@ -6492,8 +6492,8 @@ "h": 20 }, "frame": { - "x": 221, - "y": 332, + "x": 233, + "y": 361, "w": 20, "h": 20 } @@ -6513,12 +6513,75 @@ "h": 20 }, "frame": { - "x": 221, - "y": 352, + "x": 237, + "y": 381, "w": 20, "h": 20 } }, + { + "filename": "lum_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 7, + "w": 20, + "h": 19 + }, + "frame": { + "x": 237, + "y": 401, + "w": 20, + "h": 19 + } + }, + { + "filename": "unremarkable_teacup", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 21, + "h": 18 + }, + "frame": { + "x": 241, + "y": 245, + "w": 21, + "h": 18 + } + }, + { + "filename": "power_herb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 24, + "h": 24 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 20, + "h": 19 + }, + "frame": { + "x": 237, + "y": 263, + "w": 20, + "h": 19 + } + }, { "filename": "razor_claw", "rotated": false, @@ -6534,33 +6597,12 @@ "h": 19 }, "frame": { - "x": 221, - "y": 372, + "x": 237, + "y": 282, "w": 20, "h": 19 } }, - { - "filename": "lucky_egg", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 17, - "h": 20 - }, - "frame": { - "x": 241, - "y": 332, - "w": 17, - "h": 20 - } - }, { "filename": "miracle_seed", "rotated": false, @@ -6576,12 +6618,33 @@ "h": 19 }, "frame": { - "x": 241, - "y": 352, + "x": 248, + "y": 301, "w": 19, "h": 19 } }, + { + "filename": "oval_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 7, + "w": 18, + "h": 19 + }, + "frame": { + "x": 249, + "y": 320, + "w": 18, + "h": 19 + } + }, { "filename": "white_herb", "rotated": false, @@ -6597,33 +6660,12 @@ "h": 19 }, "frame": { - "x": 241, - "y": 371, + "x": 252, + "y": 339, "w": 20, "h": 19 } }, - { - "filename": "mega_bracelet", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 16 - }, - "frame": { - "x": 403, - "y": 249, - "w": 20, - "h": 16 - } - }, { "filename": "wl_ability_urge", "rotated": false, @@ -6639,98 +6681,14 @@ "h": 18 }, "frame": { - "x": 383, - "y": 254, + "x": 253, + "y": 358, "w": 20, "h": 18 } }, { - "filename": "wl_antidote", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 403, - "y": 265, - "w": 20, - "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": 205, - "y": 390, - "w": 16, - "h": 18 - } - }, - { - "filename": "wl_awakening", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 205, - "y": 408, - "w": 20, - "h": 18 - } - }, - { - "filename": "relic_band", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 9, - "w": 17, - "h": 16 - }, - "frame": { - "x": 221, - "y": 391, - "w": 17, - "h": 16 - } - }, - { - "filename": "oval_stone", + "filename": "baton", "rotated": false, "trimmed": true, "sourceSize": { @@ -6741,17 +6699,17 @@ "x": 7, "y": 7, "w": 18, - "h": 19 + "h": 18 }, "frame": { - "x": 225, - "y": 407, + "x": 257, + "y": 376, "w": 18, - "h": 19 + "h": 18 } }, { - "filename": "abomasite", + "filename": "candy", "rotated": false, "trimmed": true, "sourceSize": { @@ -6759,16 +6717,16 @@ "h": 32 }, "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 + "x": 7, + "y": 11, + "w": 18, + "h": 18 }, "frame": { - "x": 238, - "y": 391, - "w": 16, - "h": 16 + "x": 257, + "y": 394, + "w": 18, + "h": 18 } }, { @@ -6786,54 +6744,12 @@ "h": 18 }, "frame": { - "x": 243, - "y": 407, + "x": 257, + "y": 263, "w": 18, "h": 18 } }, - { - "filename": "relic_gold", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 9, - "y": 11, - "w": 15, - "h": 11 - }, - "frame": { - "x": 59, - "y": 27, - "w": 15, - "h": 11 - } - }, - { - "filename": "wl_burn_heal", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 344, - "y": 256, - "w": 20, - "h": 18 - } - }, { "filename": "flame_orb", "rotated": false, @@ -6849,12 +6765,96 @@ "h": 18 }, "frame": { - "x": 364, - "y": 258, + "x": 257, + "y": 281, "w": 18, "h": 18 } }, + { + "filename": "prism_scale", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 9, + "y": 8, + "w": 15, + "h": 15 + }, + "frame": { + "x": 262, + "y": 248, + "w": 15, + "h": 15 + } + }, + { + "filename": "wl_antidote", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 277, + "y": 248, + "w": 20, + "h": 18 + } + }, + { + "filename": "wl_awakening", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 297, + "y": 248, + "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": 275, + "y": 266, + "w": 20, + "h": 18 + } + }, { "filename": "wl_custom_spliced", "rotated": false, @@ -6870,8 +6870,8 @@ "h": 18 }, "frame": { - "x": 382, - "y": 272, + "x": 295, + "y": 266, "w": 20, "h": 18 } @@ -6891,96 +6891,12 @@ "h": 18 }, "frame": { - "x": 402, - "y": 283, + "x": 275, + "y": 284, "w": 20, "h": 18 } }, - { - "filename": "absolite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 254, - "y": 390, - "w": 16, - "h": 16 - } - }, - { - "filename": "light_ball", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 18, - "h": 18 - }, - "frame": { - "x": 261, - "y": 406, - "w": 18, - "h": 18 - } - }, - { - "filename": "light_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 18, - "h": 18 - }, - "frame": { - "x": 250, - "y": 294, - "w": 18, - "h": 18 - } - }, - { - "filename": "toxic_orb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 18, - "h": 18 - }, - "frame": { - "x": 250, - "y": 312, - "w": 18, - "h": 18 - } - }, { "filename": "wl_elixir", "rotated": false, @@ -6996,8 +6912,8 @@ "h": 18 }, "frame": { - "x": 254, - "y": 276, + "x": 295, + "y": 284, "w": 20, "h": 18 } @@ -7017,8 +6933,8 @@ "h": 18 }, "frame": { - "x": 258, - "y": 330, + "x": 317, + "y": 249, "w": 20, "h": 18 } @@ -7038,8 +6954,8 @@ "h": 18 }, "frame": { - "x": 260, - "y": 348, + "x": 337, + "y": 249, "w": 20, "h": 18 } @@ -7059,8 +6975,8 @@ "h": 18 }, "frame": { - "x": 261, - "y": 366, + "x": 315, + "y": 267, "w": 20, "h": 18 } @@ -7080,8 +6996,8 @@ "h": 18 }, "frame": { - "x": 268, - "y": 294, + "x": 335, + "y": 267, "w": 20, "h": 18 } @@ -7101,8 +7017,8 @@ "h": 18 }, "frame": { - "x": 268, - "y": 312, + "x": 315, + "y": 285, "w": 20, "h": 18 } @@ -7122,8 +7038,8 @@ "h": 18 }, "frame": { - "x": 274, - "y": 276, + "x": 335, + "y": 285, "w": 20, "h": 18 } @@ -7143,8 +7059,8 @@ "h": 18 }, "frame": { - "x": 278, - "y": 330, + "x": 355, + "y": 267, "w": 20, "h": 18 } @@ -7164,8 +7080,8 @@ "h": 18 }, "frame": { - "x": 280, - "y": 348, + "x": 355, + "y": 285, "w": 20, "h": 18 } @@ -7185,8 +7101,8 @@ "h": 18 }, "frame": { - "x": 281, - "y": 366, + "x": 267, + "y": 302, "w": 20, "h": 18 } @@ -7206,8 +7122,8 @@ "h": 18 }, "frame": { - "x": 270, - "y": 384, + "x": 287, + "y": 302, "w": 20, "h": 18 } @@ -7227,8 +7143,8 @@ "h": 18 }, "frame": { - "x": 290, - "y": 384, + "x": 267, + "y": 320, "w": 20, "h": 18 } @@ -7248,8 +7164,8 @@ "h": 18 }, "frame": { - "x": 279, - "y": 402, + "x": 287, + "y": 320, "w": 20, "h": 18 } @@ -7269,8 +7185,8 @@ "h": 18 }, "frame": { - "x": 299, - "y": 402, + "x": 272, + "y": 338, "w": 20, "h": 18 } @@ -7290,12 +7206,96 @@ "h": 18 }, "frame": { - "x": 288, - "y": 294, + "x": 273, + "y": 356, "w": 20, "h": 18 } }, + { + "filename": "light_ball", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 7, + "w": 18, + "h": 18 + }, + "frame": { + "x": 275, + "y": 374, + "w": 18, + "h": 18 + } + }, + { + "filename": "light_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 7, + "w": 18, + "h": 18 + }, + "frame": { + "x": 275, + "y": 392, + "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": 292, + "y": 338, + "w": 16, + "h": 18 + } + }, + { + "filename": "toxic_orb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 7, + "w": 18, + "h": 18 + }, + "frame": { + "x": 293, + "y": 356, + "w": 18, + "h": 18 + } + }, { "filename": "wl_reset_urge", "rotated": false, @@ -7311,8 +7311,8 @@ "h": 18 }, "frame": { - "x": 288, - "y": 312, + "x": 293, + "y": 374, "w": 20, "h": 18 } @@ -7332,8 +7332,8 @@ "h": 18 }, "frame": { - "x": 294, - "y": 276, + "x": 293, + "y": 392, "w": 20, "h": 18 } @@ -7353,12 +7353,54 @@ "h": 18 }, "frame": { - "x": 298, - "y": 330, + "x": 307, + "y": 303, "w": 20, "h": 18 } }, + { + "filename": "relic_band", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 9, + "w": 17, + "h": 16 + }, + "frame": { + "x": 307, + "y": 321, + "w": 17, + "h": 16 + } + }, + { + "filename": "absolite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 327, + "y": 303, + "w": 16, + "h": 16 + } + }, { "filename": "aerodactylite", "rotated": false, @@ -7374,8 +7416,8 @@ "h": 16 }, "frame": { - "x": 300, - "y": 348, + "x": 343, + "y": 303, "w": 16, "h": 16 } @@ -7395,8 +7437,8 @@ "h": 16 }, "frame": { - "x": 301, - "y": 364, + "x": 359, + "y": 303, "w": 16, "h": 16 } @@ -7417,7 +7459,7 @@ }, "frame": { "x": 308, - "y": 294, + "y": 337, "w": 16, "h": 16 } @@ -7437,8 +7479,8 @@ "h": 16 }, "frame": { - "x": 308, - "y": 310, + "x": 311, + "y": 353, "w": 16, "h": 16 } @@ -7458,8 +7500,8 @@ "h": 16 }, "frame": { - "x": 310, - "y": 380, + "x": 313, + "y": 369, "w": 16, "h": 16 } @@ -7479,8 +7521,8 @@ "h": 16 }, "frame": { - "x": 316, - "y": 348, + "x": 313, + "y": 385, "w": 16, "h": 16 } @@ -7500,8 +7542,8 @@ "h": 16 }, "frame": { - "x": 317, - "y": 364, + "x": 313, + "y": 401, "w": 16, "h": 16 } @@ -7521,8 +7563,8 @@ "h": 16 }, "frame": { - "x": 326, - "y": 380, + "x": 375, + "y": 278, "w": 16, "h": 16 } @@ -7542,8 +7584,8 @@ "h": 16 }, "frame": { - "x": 319, - "y": 396, + "x": 375, + "y": 294, "w": 16, "h": 16 } @@ -7563,8 +7605,8 @@ "h": 16 }, "frame": { - "x": 335, - "y": 396, + "x": 375, + "y": 310, "w": 16, "h": 16 } @@ -7584,8 +7626,8 @@ "h": 16 }, "frame": { - "x": 256, - "y": 255, + "x": 324, + "y": 321, "w": 16, "h": 16 } @@ -7605,8 +7647,8 @@ "h": 16 }, "frame": { - "x": 272, - "y": 255, + "x": 324, + "y": 337, "w": 16, "h": 16 } @@ -7626,8 +7668,8 @@ "h": 16 }, "frame": { - "x": 288, - "y": 255, + "x": 327, + "y": 353, "w": 16, "h": 16 } @@ -7647,8 +7689,8 @@ "h": 16 }, "frame": { - "x": 304, - "y": 255, + "x": 340, + "y": 319, "w": 16, "h": 16 } @@ -7668,8 +7710,8 @@ "h": 16 }, "frame": { - "x": 320, - "y": 257, + "x": 340, + "y": 335, "w": 16, "h": 16 } @@ -7689,8 +7731,8 @@ "h": 16 }, "frame": { - "x": 314, - "y": 273, + "x": 356, + "y": 319, "w": 16, "h": 16 } @@ -7710,8 +7752,8 @@ "h": 16 }, "frame": { - "x": 318, - "y": 326, + "x": 356, + "y": 335, "w": 16, "h": 16 } @@ -7731,8 +7773,8 @@ "h": 16 }, "frame": { - "x": 330, - "y": 274, + "x": 329, + "y": 369, "w": 16, "h": 16 } @@ -7752,8 +7794,8 @@ "h": 16 }, "frame": { - "x": 346, - "y": 274, + "x": 329, + "y": 385, "w": 16, "h": 16 } @@ -7773,8 +7815,8 @@ "h": 16 }, "frame": { - "x": 362, - "y": 276, + "x": 329, + "y": 401, "w": 16, "h": 16 } @@ -7794,8 +7836,8 @@ "h": 16 }, "frame": { - "x": 324, - "y": 290, + "x": 343, + "y": 351, "w": 16, "h": 16 } @@ -7815,8 +7857,8 @@ "h": 16 }, "frame": { - "x": 324, - "y": 306, + "x": 372, + "y": 326, "w": 16, "h": 16 } @@ -7836,8 +7878,8 @@ "h": 16 }, "frame": { - "x": 340, - "y": 290, + "x": 359, + "y": 351, "w": 16, "h": 16 } @@ -7857,8 +7899,8 @@ "h": 16 }, "frame": { - "x": 340, - "y": 306, + "x": 345, + "y": 367, "w": 16, "h": 16 } @@ -7878,8 +7920,8 @@ "h": 16 }, "frame": { - "x": 334, - "y": 322, + "x": 345, + "y": 383, "w": 16, "h": 16 } @@ -7899,8 +7941,8 @@ "h": 16 }, "frame": { - "x": 356, - "y": 292, + "x": 345, + "y": 399, "w": 16, "h": 16 } @@ -7920,8 +7962,8 @@ "h": 16 }, "frame": { - "x": 356, - "y": 308, + "x": 361, + "y": 367, "w": 16, "h": 16 } @@ -7941,8 +7983,8 @@ "h": 16 }, "frame": { - "x": 350, - "y": 324, + "x": 361, + "y": 383, "w": 16, "h": 16 } @@ -7962,8 +8004,8 @@ "h": 16 }, "frame": { - "x": 372, - "y": 292, + "x": 361, + "y": 399, "w": 16, "h": 16 } @@ -7983,8 +8025,8 @@ "h": 16 }, "frame": { - "x": 372, - "y": 308, + "x": 375, + "y": 342, "w": 16, "h": 16 } @@ -8004,8 +8046,8 @@ "h": 16 }, "frame": { - "x": 366, - "y": 324, + "x": 388, + "y": 326, "w": 16, "h": 16 } @@ -8025,8 +8067,8 @@ "h": 16 }, "frame": { - "x": 334, - "y": 338, + "x": 391, + "y": 342, "w": 16, "h": 16 } @@ -8046,8 +8088,8 @@ "h": 16 }, "frame": { - "x": 350, - "y": 340, + "x": 377, + "y": 358, "w": 16, "h": 16 } @@ -8067,8 +8109,8 @@ "h": 16 }, "frame": { - "x": 366, - "y": 340, + "x": 377, + "y": 374, "w": 16, "h": 16 } @@ -8088,8 +8130,8 @@ "h": 16 }, "frame": { - "x": 382, - "y": 324, + "x": 377, + "y": 390, "w": 16, "h": 16 } @@ -8109,8 +8151,8 @@ "h": 16 }, "frame": { - "x": 382, - "y": 340, + "x": 393, + "y": 358, "w": 16, "h": 16 } @@ -8130,8 +8172,8 @@ "h": 16 }, "frame": { - "x": 333, - "y": 354, + "x": 409, + "y": 287, "w": 16, "h": 16 } @@ -8151,8 +8193,8 @@ "h": 16 }, "frame": { - "x": 349, - "y": 356, + "x": 393, + "y": 374, "w": 16, "h": 16 } @@ -8172,8 +8214,8 @@ "h": 16 }, "frame": { - "x": 365, - "y": 356, + "x": 409, + "y": 303, "w": 16, "h": 16 } @@ -8193,8 +8235,8 @@ "h": 16 }, "frame": { - "x": 381, - "y": 356, + "x": 393, + "y": 390, "w": 16, "h": 16 } @@ -8214,8 +8256,8 @@ "h": 16 }, "frame": { - "x": 388, - "y": 301, + "x": 409, + "y": 319, "w": 16, "h": 16 } @@ -8235,8 +8277,8 @@ "h": 16 }, "frame": { - "x": 404, - "y": 301, + "x": 409, + "y": 335, "w": 16, "h": 16 } @@ -8256,8 +8298,8 @@ "h": 16 }, "frame": { - "x": 398, - "y": 317, + "x": 409, + "y": 351, "w": 16, "h": 16 } @@ -8277,8 +8319,8 @@ "h": 16 }, "frame": { - "x": 398, - "y": 333, + "x": 409, + "y": 367, "w": 16, "h": 16 } @@ -8298,8 +8340,8 @@ "h": 16 }, "frame": { - "x": 398, - "y": 349, + "x": 409, + "y": 383, "w": 16, "h": 16 } @@ -8319,33 +8361,12 @@ "h": 16 }, "frame": { - "x": 397, - "y": 365, + "x": 409, + "y": 399, "w": 16, "h": 16 } }, - { - "filename": "prism_scale", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 9, - "y": 8, - "w": 15, - "h": 15 - }, - "frame": { - "x": 342, - "y": 381, - "w": 15, - "h": 15 - } - }, { "filename": "swampertite", "rotated": false, @@ -8361,8 +8382,8 @@ "h": 16 }, "frame": { - "x": 357, - "y": 372, + "x": 377, + "y": 406, "w": 16, "h": 16 } @@ -8382,8 +8403,8 @@ "h": 16 }, "frame": { - "x": 373, - "y": 372, + "x": 393, + "y": 406, "w": 16, "h": 16 } @@ -8403,8 +8424,8 @@ "h": 16 }, "frame": { - "x": 357, - "y": 388, + "x": 391, + "y": 287, "w": 16, "h": 16 } @@ -8415,6 +8436,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:e5b40a9bd9ade8242224592e0116a6b0:0100946d64a1651a631f504350fdf3eb:110e074689c9edd2c54833ce2e4d9270$" + "smartupdate": "$TexturePacker:SmartUpdate:4d7c13d737ed237c9bae1222ce873452:256c2ba728cb839ce479bac6b53a7ed1:110e074689c9edd2c54833ce2e4d9270$" } } diff --git a/public/images/items.png b/public/images/items.png index f68b96c1975ec192f58c7fa3aa4851e5d5a3ec74..51cdae6cfe15e1a1f4db9e84d65bb0f639867ad9 100644 GIT binary patch literal 57028 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[yS;!^}r~q`wva` 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%0D7hw8k3jmZloeg~@u>eOjQL{P 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 literal 0 HcmV?d00001 diff --git a/src/data/mystery-encounters/encounters/trash-to-treasure-encounter.ts b/src/data/mystery-encounters/encounters/trash-to-treasure-encounter.ts new file mode 100644 index 00000000000..20765605006 --- /dev/null +++ b/src/data/mystery-encounters/encounters/trash-to-treasure-encounter.ts @@ -0,0 +1,222 @@ +import { EnemyPartyConfig, EnemyPokemonConfig, generateModifierTypeOption, initBattleWithEnemyConfig, leaveEncounterWithoutBattle, loadCustomMovesForEncounter, setEncounterRewards, transitionMysteryEncounterIntroVisuals, } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { modifierTypes, PokemonHeldItemModifierType } from "#app/modifier/modifier-type"; +import { MysteryEncounterType } from "#enums/mystery-encounter-type"; +import BattleScene from "#app/battle-scene"; +import IMysteryEncounter, { MysteryEncounterBuilder } from "../mystery-encounter"; +import { MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; +import { ModifierRewardPhase } from "#app/phases"; +import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; +import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; +import { Species } from "#enums/species"; +import { HitHealModifier, PokemonHeldItemModifier, RemoveHealShopModifier, TurnHealModifier } from "#app/modifier/modifier"; +import { applyModifierTypeToPlayerPokemon } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; +import { showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; +import i18next from "#app/plugins/i18n"; +import { ModifierTier } from "#app/modifier/modifier-tier"; +import { getPokemonSpecies } from "#app/data/pokemon-species"; +import { Moves } from "#enums/moves"; +import { BattlerIndex } from "#app/battle"; +import { PokemonMove } from "#app/field/pokemon"; + +/** the i18n namespace for this encounter */ +const namespace = "mysteryEncounter:trashToTreasure"; + +const SOUND_EFFECT_WAIT_TIME = 700; + +/** + * Trash to Treasure encounter. + * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/74 | GitHub Issue #74} + * @see For biome requirements check {@linkcode mysteryEncountersByBiome} + */ +export const TrashToTreasureEncounter: IMysteryEncounter = + MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.TRASH_TO_TREASURE) + .withEncounterTier(MysteryEncounterTier.ULTRA) + .withSceneWaveRangeRequirement(10, 180) + .withMaxAllowedEncounters(1) + .withIntroSpriteConfigs([ + { + spriteKey: Species.GARBODOR.toString() + "-gigantamax", + fileRoot: "pokemon", + hasShadow: false, + disableAnimation: true, + scale: 1.5, + y: 8 + } + ]) + .withAutoHideIntroVisuals(false) + .withIntroDialogue([ + { + text: `${namespace}.intro`, + }, + ]) + .withTitle(`${namespace}.title`) + .withDescription(`${namespace}.description`) + .withQuery(`${namespace}.query`) + .withOnInit((scene: BattleScene) => { + const encounter = scene.currentBattle.mysteryEncounter; + const blackSludge = scene.findModifier(m => m instanceof RemoveHealShopModifier); + scene.removeModifier(blackSludge); + scene.updateModifiers(true, true); + + // Calculate boss mon + const bossSpecies = getPokemonSpecies(Species.GARBODOR); + const pokemonConfig: EnemyPokemonConfig = { + species: bossSpecies, + isBoss: true, + formIndex: 1, // Gmax + bossSegmentModifier: 1, // +1 Segment from normal + moveSet: [Moves.PAYBACK, Moves.GUNK_SHOT, Moves.STOMPING_TANTRUM, Moves.DRAIN_PUNCH] + }; + const config: EnemyPartyConfig = { + levelAdditiveMultiplier: 1, + pokemonConfigs: [pokemonConfig], + disableSwitch: true + }; + encounter.enemyPartyConfigs = [config]; + + // Load animations/sfx for Garbodor fight start moves + loadCustomMovesForEncounter(scene, [Moves.TOXIC, Moves.AMNESIA]); + + scene.loadSe("PRSFX- Dig2", "battle_anims", "PRSFX- Dig2.wav"); + scene.loadSe("PRSFX- Venom Drench", "battle_anims", "PRSFX- Venom Drench.wav"); + return true; + }) + .withOption( + new MysteryEncounterOptionBuilder() + .withOptionMode(MysteryEncounterOptionMode.DEFAULT) + .withDialogue({ + buttonLabel: `${namespace}.option.1.label`, + buttonTooltip: `${namespace}.option.1.tooltip`, + selected: [ + { + text: `${namespace}.option.1.selected`, + }, + ], + }) + .withPreOptionPhase(async (scene: BattleScene) => { + // Play Dig2 and then Venom Drench sfx + doGarbageDig(scene); + }) + .withOptionPhase(async (scene: BattleScene) => { + // Gain 2 Leftovers and 2 Shell Bell + transitionMysteryEncounterIntroVisuals(scene); + await tryApplyDigRewardItems(scene); + + // Give the player the Black Sludge curse + scene.unshiftPhase(new ModifierRewardPhase(scene, modifierTypes.MYSTERY_ENCOUNTER_BLACK_SLUDGE)); + leaveEncounterWithoutBattle(scene, true); + }) + .build() + ) + .withOption( + new MysteryEncounterOptionBuilder() + .withOptionMode(MysteryEncounterOptionMode.DEFAULT) + .withDialogue({ + buttonLabel: `${namespace}.option.2.label`, + buttonTooltip: `${namespace}.option.2.tooltip`, + selected: [ + { + text: `${namespace}.option.2.selected`, + }, + ], + }) + .withOptionPhase(async (scene: BattleScene) => { + // Investigate garbage, battle Gmax Garbodor + scene.setFieldScale(0.75); + await showEncounterText(scene, `${namespace}.option.2.selected_2`); + transitionMysteryEncounterIntroVisuals(scene); + + const encounter = scene.currentBattle.mysteryEncounter; + + setEncounterRewards(scene, { guaranteedModifierTiers: [ModifierTier.ROGUE, ModifierTier.ROGUE, ModifierTier.ULTRA, ModifierTier.GREAT], fillRemaining: true }); + encounter.startOfBattleEffects.push( + { + sourceBattlerIndex: BattlerIndex.ENEMY, + targets: [BattlerIndex.PLAYER], + move: new PokemonMove(Moves.TOXIC), + ignorePp: true + }, + { + sourceBattlerIndex: BattlerIndex.ENEMY, + targets: [BattlerIndex.ENEMY], + move: new PokemonMove(Moves.AMNESIA), + ignorePp: true + }); + await initBattleWithEnemyConfig(scene, encounter.enemyPartyConfigs[0]); + }) + .build() + ) + .build(); + +async function tryApplyDigRewardItems(scene: BattleScene) { + const shellBell = generateModifierTypeOption(scene, modifierTypes.SHELL_BELL).type as PokemonHeldItemModifierType; + const leftovers = generateModifierTypeOption(scene, modifierTypes.LEFTOVERS).type as PokemonHeldItemModifierType; + + const party = scene.getParty(); + + // Iterate over the party until an item was successfully given + // First leftovers + for (const pokemon of party) { + const heldItems = scene.findModifiers(m => m instanceof PokemonHeldItemModifier + && m.pokemonId === pokemon.id, true) as PokemonHeldItemModifier[]; + const existingLeftovers = heldItems.find(m => m instanceof TurnHealModifier) as TurnHealModifier; + + if (!existingLeftovers || existingLeftovers.getStackCount() < existingLeftovers.getMaxStackCount(scene)) { + await applyModifierTypeToPlayerPokemon(scene, pokemon, leftovers); + break; + } + } + + // Second leftovers + for (const pokemon of party) { + const heldItems = scene.findModifiers(m => m instanceof PokemonHeldItemModifier + && m.pokemonId === pokemon.id, true) as PokemonHeldItemModifier[]; + const existingLeftovers = heldItems.find(m => m instanceof TurnHealModifier) as TurnHealModifier; + + if (!existingLeftovers || existingLeftovers.getStackCount() < existingLeftovers.getMaxStackCount(scene)) { + await applyModifierTypeToPlayerPokemon(scene, pokemon, leftovers); + break; + } + } + + scene.playSound("item_fanfare"); + await showEncounterText(scene, i18next.t("battle:rewardGain", { modifierName: "2 " + leftovers.name }), null, true); + + // First Shell bell + for (const pokemon of party) { + const heldItems = scene.findModifiers(m => m instanceof PokemonHeldItemModifier + && m.pokemonId === pokemon.id, true) as PokemonHeldItemModifier[]; + const existingShellBell = heldItems.find(m => m instanceof HitHealModifier) as HitHealModifier; + + if (!existingShellBell || existingShellBell.getStackCount() < existingShellBell.getMaxStackCount(scene)) { + await applyModifierTypeToPlayerPokemon(scene, pokemon, shellBell); + break; + } + } + + // Second Shell bell + for (const pokemon of party) { + const heldItems = scene.findModifiers(m => m instanceof PokemonHeldItemModifier + && m.pokemonId === pokemon.id, true) as PokemonHeldItemModifier[]; + const existingShellBell = heldItems.find(m => m instanceof HitHealModifier) as HitHealModifier; + + if (!existingShellBell || existingShellBell.getStackCount() < existingShellBell.getMaxStackCount(scene)) { + await applyModifierTypeToPlayerPokemon(scene, pokemon, shellBell); + break; + } + } + + scene.playSound("item_fanfare"); + await showEncounterText(scene, i18next.t("battle:rewardGain", { modifierName: "2 " + shellBell.name }), null, true); +} + +async function doGarbageDig(scene: BattleScene) { + scene.playSound("PRSFX- Dig2"); + scene.time.delayedCall(SOUND_EFFECT_WAIT_TIME, () => { + scene.playSound("PRSFX- Dig2"); + scene.playSound("PRSFX- Venom Drench", { volume: 2 }); + }); + scene.time.delayedCall(SOUND_EFFECT_WAIT_TIME * 2, () => { + scene.playSound("PRSFX- Dig2"); + }); +} diff --git a/src/data/mystery-encounters/mystery-encounters.ts b/src/data/mystery-encounters/mystery-encounters.ts index c4a3251e6af..3a9c411830b 100644 --- a/src/data/mystery-encounters/mystery-encounters.ts +++ b/src/data/mystery-encounters/mystery-encounters.ts @@ -19,6 +19,7 @@ import { AnOfferYouCantRefuseEncounter } from "#app/data/mystery-encounters/enco import { DelibirdyEncounter } from "#app/data/mystery-encounters/encounters/delibirdy-encounter"; import { AbsoluteAvariceEncounter } from "#app/data/mystery-encounters/encounters/absolute-avarice-encounter"; import { ATrainersTestEncounter } from "#app/data/mystery-encounters/encounters/a-trainers-test-encounter"; +import { TrashToTreasureEncounter } from "#app/data/mystery-encounters/encounters/trash-to-treasure-encounter"; // Spawn chance: (BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT + WIGHT_INCREMENT_ON_SPAWN_MISS * ) / 256 export const BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT = 1; @@ -155,7 +156,8 @@ const anyBiomeEncounters: MysteryEncounterType[] = [ MysteryEncounterType.MYSTERIOUS_CHEST, MysteryEncounterType.TRAINING_SESSION, MysteryEncounterType.DELIBIRDY, - MysteryEncounterType.A_TRAINERS_TEST + MysteryEncounterType.A_TRAINERS_TEST, + MysteryEncounterType.TRASH_TO_TREASURE ]; /** @@ -243,6 +245,7 @@ export function initMysteryEncounters() { allMysteryEncounters[MysteryEncounterType.DELIBIRDY] = DelibirdyEncounter; allMysteryEncounters[MysteryEncounterType.ABSOLUTE_AVARICE] = AbsoluteAvariceEncounter; allMysteryEncounters[MysteryEncounterType.A_TRAINERS_TEST] = ATrainersTestEncounter; + allMysteryEncounters[MysteryEncounterType.TRASH_TO_TREASURE] = TrashToTreasureEncounter; // Add extreme encounters to biome map extremeBiomeEncounters.forEach(encounter => { diff --git a/src/data/mystery-encounters/utils/encounter-phase-utils.ts b/src/data/mystery-encounters/utils/encounter-phase-utils.ts index deb65ff5774..ed050f6eb77 100644 --- a/src/data/mystery-encounters/utils/encounter-phase-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-phase-utils.ts @@ -456,7 +456,6 @@ export function setEncounterRewards(scene: BattleScene, customShopRewards?: Cust eggRewards.forEach(eggOptions => { const egg = new Egg(eggOptions); egg.addEggToGameData(scene); - // queueEncounterMessage(scene, `You gained a ${egg.getEggTypeDescriptor(scene)} Egg!`); }); } diff --git a/src/enums/mystery-encounter-type.ts b/src/enums/mystery-encounter-type.ts index e054b03c33b..de4ab055e89 100644 --- a/src/enums/mystery-encounter-type.ts +++ b/src/enums/mystery-encounter-type.ts @@ -16,5 +16,6 @@ export enum MysteryEncounterType { AN_OFFER_YOU_CANT_REFUSE, DELIBIRDY, ABSOLUTE_AVARICE, - A_TRAINERS_TEST + A_TRAINERS_TEST, + TRASH_TO_TREASURE } diff --git a/src/locales/en/modifier-type.ts b/src/locales/en/modifier-type.ts index aee0f17334d..662d4d10e76 100644 --- a/src/locales/en/modifier-type.ts +++ b/src/locales/en/modifier-type.ts @@ -257,6 +257,7 @@ export const modifierType: ModifierTypeTranslationEntries = { "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." }, }, 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 6d03e5b3eb6..6a47b84c590 100644 --- a/src/locales/en/mystery-encounter.ts +++ b/src/locales/en/mystery-encounter.ts @@ -16,6 +16,7 @@ import { anOfferYouCantRefuseDialogue } from "#app/locales/en/mystery-encounters import { delibirdyDialogue } from "#app/locales/en/mystery-encounters/delibirdy-dialogue"; import { absoluteAvariceDialogue } from "#app/locales/en/mystery-encounters/absolute-avarice-dialogue"; import { aTrainersTestDialogue } from "#app/locales/en/mystery-encounters/a-trainers-test-dialogue"; +import { trashToTreasureDialogue } from "#app/locales/en/mystery-encounters/trash-to-treasure-dialogue"; /** * Patterns that can be used: @@ -57,4 +58,5 @@ export const mysteryEncounter = { delibirdy: delibirdyDialogue, absoluteAvarice: absoluteAvariceDialogue, aTrainersTest: aTrainersTestDialogue, + trashToTreasure: trashToTreasureDialogue } as const; diff --git a/src/locales/en/mystery-encounters/trash-to-treasure-dialogue.ts b/src/locales/en/mystery-encounters/trash-to-treasure-dialogue.ts new file mode 100644 index 00000000000..a9e369270ad --- /dev/null +++ b/src/locales/en/mystery-encounters/trash-to-treasure-dialogue.ts @@ -0,0 +1,22 @@ +export const trashToTreasureDialogue = { + intro: "It's a massive pile of garbage!\nWhere did this come from?", + title: "Trash to Treasure", + description: "The garbage heap looms over you, and you can spot some items of value buried amidst the refuse. Are you sure you want to get covered in filth to get them, though?", + query: "What will you do?", + option: { + 1: { + label: "Dig for Valuables", + tooltip: "(-) Become Covered in Filth\n(+) Gain Amazing Items", + 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", + tooltip: "(?) Find the Source of the Garbage", + selected: "You wander around the heap, searching for any indication as to how this might have appeared here...", + selected_2: "Suddenly, the garbage shifts! It wasn't just garbage, it's a Pokémon!" + }, + }, +}; diff --git a/src/modifier/modifier-type.ts b/src/modifier/modifier-type.ts index 82238ca7220..3e52f080c94 100644 --- a/src/modifier/modifier-type.ts +++ b/src/modifier/modifier-type.ts @@ -1474,6 +1474,8 @@ export const modifierTypes = { } return new PokemonBaseStatTotalModifierType(Utils.randSeedInt(20)); }), + + MYSTERY_ENCOUNTER_BLACK_SLUDGE: () => new ModifierType("modifierType:ModifierType.MYSTERY_ENCOUNTER_BLACK_SLUDGE", "black_sludge", (type, _args) => new Modifiers.RemoveHealShopModifier(type)), }; interface ModifierPool { diff --git a/src/modifier/modifier.ts b/src/modifier/modifier.ts index 89d322ca591..07aa1ea803f 100644 --- a/src/modifier/modifier.ts +++ b/src/modifier/modifier.ts @@ -2268,6 +2268,28 @@ export class LockModifierTiersModifier extends PersistentModifier { } } +export class RemoveHealShopModifier extends PersistentModifier { + constructor(type: ModifierType, stackCount?: integer) { + super(type, stackCount); + } + + match(modifier: Modifier): boolean { + return modifier instanceof RemoveHealShopModifier; + } + + clone(): RemoveHealShopModifier { + return new RemoveHealShopModifier(this.type, this.stackCount); + } + + apply(args: any[]): boolean { + return true; + } + + getMaxStackCount(scene: BattleScene): integer { + return 1; + } +} + export class SwitchEffectTransferModifier extends PokemonHeldItemModifier { constructor(type: ModifierType, pokemonId: integer, stackCount?: integer) { super(type, pokemonId, stackCount); diff --git a/src/overrides.ts b/src/overrides.ts index 1196797fac0..4ce80eabeee 100644 --- a/src/overrides.ts +++ b/src/overrides.ts @@ -127,9 +127,9 @@ class DefaultOverrides { // ------------------------- // 1 to 256, set to null to ignore - readonly MYSTERY_ENCOUNTER_RATE_OVERRIDE: number = null; + readonly MYSTERY_ENCOUNTER_RATE_OVERRIDE: number = 256; readonly MYSTERY_ENCOUNTER_TIER_OVERRIDE: MysteryEncounterTier = null; - readonly MYSTERY_ENCOUNTER_OVERRIDE: MysteryEncounterType = null; + readonly MYSTERY_ENCOUNTER_OVERRIDE: MysteryEncounterType = MysteryEncounterType.TRASH_TO_TREASURE; // ------------------------- // MODIFIER / ITEM OVERRIDES diff --git a/src/phases/mystery-encounter-phases.ts b/src/phases/mystery-encounter-phases.ts index 1213472c35d..fe6de6973da 100644 --- a/src/phases/mystery-encounter-phases.ts +++ b/src/phases/mystery-encounter-phases.ts @@ -3,7 +3,7 @@ import BattleScene from "../battle-scene"; import { Phase } from "../phase"; import { Mode } from "../ui/ui"; import { transitionMysteryEncounterIntroVisuals, OptionSelectSettings } from "../data/mystery-encounters/utils/encounter-phase-utils"; -import { CheckSwitchPhase, NewBattlePhase, ReturnPhase, ScanIvsPhase, SelectModifierPhase, SummonPhase, ToggleDoublePositionPhase } from "../phases"; +import { CheckSwitchPhase, NewBattlePhase, PostTurnStatusEffectPhase, ReturnPhase, ScanIvsPhase, SelectModifierPhase, SummonPhase, ToggleDoublePositionPhase } from "../phases"; import MysteryEncounterOption, { OptionPhaseCallback } from "../data/mystery-encounters/mystery-encounter-option"; import { getCharVariantFromDialogue } from "../data/dialogue"; import { TrainerSlot } from "../data/trainer-config"; @@ -183,6 +183,11 @@ export class MysteryEncounterBattleStartCleanupPhase extends Phase { pokemon.lapseTags(BattlerTagLapseType.TURN_END); }); + // Remove any status tick phases + while (!!this.scene.findPhase(p => p instanceof PostTurnStatusEffectPhase)) { + this.scene.tryRemovePhase(p => p instanceof PostTurnStatusEffectPhase); + } + super.end(); } } 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 78610b76863..105fbb3fd6b 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 @@ -99,7 +99,7 @@ describe("The Strong Stuff - Mystery Encounter", () => { it("should initialize fully ", async () => { initSceneWithoutEncounterPhase(scene, defaultParty); scene.currentBattle.mysteryEncounter = TheStrongStuffEncounter; - const moveInitSpy = vi.spyOn(BattleAnims, "loadMoveAnimAssets"); + const moveInitSpy = vi.spyOn(BattleAnims, "initMoveAnim"); const moveLoadSpy = vi.spyOn(BattleAnims, "loadMoveAnimAssets"); const { onInit } = TheStrongStuffEncounter; 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 new file mode 100644 index 00000000000..9cd1d477a22 --- /dev/null +++ b/src/test/mystery-encounter/encounters/trash-to-treasure-encounter.test.ts @@ -0,0 +1,219 @@ +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 { 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 { CommandPhase, MovePhase, SelectModifierPhase } from "#app/phases"; +import { Moves } from "#enums/moves"; +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 { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; +import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; +import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; +import { TrashToTreasureEncounter } from "#app/data/mystery-encounters/encounters/trash-to-treasure-encounter"; +import { ModifierTier } from "#app/modifier/modifier-tier"; + +const namespace = "mysteryEncounter:trashToTreasure"; +const defaultParty = [Species.LAPRAS, Species.GENGAR, Species.ABRA]; +const defaultBiome = Biome.CAVE; +const defaultWave = 45; + +describe("Trash to Treasure - 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.mysteryEncounterTier(MysteryEncounterTier.COMMON); + game.override.startingWave(defaultWave); + game.override.startingBiome(defaultBiome); + + vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue( + new Map([ + [Biome.CAVE, [MysteryEncounterType.TRASH_TO_TREASURE]], + [Biome.MOUNTAIN, [MysteryEncounterType.MYSTERIOUS_CHALLENGERS]], + ]) + ); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + vi.clearAllMocks(); + vi.resetAllMocks(); + }); + + it("should have the correct properties", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.TRASH_TO_TREASURE, defaultParty); + + expect(TrashToTreasureEncounter.encounterType).toBe(MysteryEncounterType.TRASH_TO_TREASURE); + expect(TrashToTreasureEncounter.encounterTier).toBe(MysteryEncounterTier.ULTRA); + expect(TrashToTreasureEncounter.dialogue).toBeDefined(); + expect(TrashToTreasureEncounter.dialogue.intro).toStrictEqual([{ text: `${namespace}.intro` }]); + expect(TrashToTreasureEncounter.dialogue.encounterOptionsDialogue.title).toBe(`${namespace}.title`); + expect(TrashToTreasureEncounter.dialogue.encounterOptionsDialogue.description).toBe(`${namespace}.description`); + expect(TrashToTreasureEncounter.dialogue.encounterOptionsDialogue.query).toBe(`${namespace}.query`); + expect(TrashToTreasureEncounter.options.length).toBe(2); + }); + + it("should not run below wave 10", async () => { + game.override.startingWave(9); + + await game.runToMysteryEncounter(); + + expect(scene.currentBattle?.mysteryEncounter?.encounterType).not.toBe(MysteryEncounterType.TRASH_TO_TREASURE); + }); + + 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 = TrashToTreasureEncounter; + const moveInitSpy = vi.spyOn(BattleAnims, "initMoveAnim"); + const moveLoadSpy = vi.spyOn(BattleAnims, "loadMoveAnimAssets"); + + const { onInit } = TrashToTreasureEncounter; + + expect(TrashToTreasureEncounter.onInit).toBeDefined(); + + TrashToTreasureEncounter.populateDialogueTokensFromRequirements(scene); + const onInitResult = onInit(scene); + + expect(TrashToTreasureEncounter.enemyPartyConfigs).toEqual([ + { + levelAdditiveMultiplier: 1, + disableSwitch: true, + pokemonConfigs: [ + { + species: getPokemonSpecies(Species.GARBODOR), + isBoss: true, + formIndex: 1, + bossSegmentModifier: 1, + moveSet: [Moves.PAYBACK, Moves.GUNK_SHOT, Moves.STOMPING_TANTRUM, Moves.DRAIN_PUNCH], + } + ], + } + ]); + await vi.waitFor(() => expect(moveInitSpy).toHaveBeenCalled()); + await vi.waitFor(() => expect(moveLoadSpy).toHaveBeenCalled()); + expect(onInitResult).toBe(true); + }); + + describe("Option 1 - Dig for Valuables", () => { + it("should have the correct properties", () => { + const option1 = TrashToTreasureEncounter.options[0]; + expect(option1.optionMode).toBe(MysteryEncounterOptionMode.DEFAULT); + expect(option1.dialogue).toBeDefined(); + expect(option1.dialogue).toStrictEqual({ + buttonLabel: `${namespace}.option.1.label`, + buttonTooltip: `${namespace}.option.1.tooltip`, + selected: [ + { + text: `${namespace}.option.1.selected`, + }, + ], + }); + }); + + it("should give 2 Leftovers, 2 Shell Bell, and Black Sludge", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.TRASH_TO_TREASURE, defaultParty); + await runMysteryEncounterToEnd(game, 1); + await game.phaseInterceptor.to(SelectModifierPhase, false); + expect(scene.getCurrentPhase().constructor.name).toBe(SelectModifierPhase.name); + + const leftovers = scene.findModifier(m => m instanceof TurnHealModifier) as TurnHealModifier; + expect(leftovers).toBeDefined(); + expect(leftovers.stackCount).toBe(2); + + const shellBell = scene.findModifier(m => m instanceof HitHealModifier) as HitHealModifier; + expect(shellBell).toBeDefined(); + expect(shellBell.stackCount).toBe(2); + + const blackSludge = scene.findModifier(m => m instanceof RemoveHealShopModifier) as RemoveHealShopModifier; + expect(blackSludge).toBeDefined(); + expect(blackSludge.stackCount).toBe(1); + }); + + it("should leave encounter without battle", async () => { + const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); + + await game.runToMysteryEncounter(MysteryEncounterType.TRASH_TO_TREASURE, defaultParty); + await runMysteryEncounterToEnd(game, 1); + + expect(leaveEncounterWithoutBattleSpy).toBeCalled(); + }); + }); + + describe("Option 2 - Battle Garbodor", () => { + it("should have the correct properties", () => { + const option1 = TrashToTreasureEncounter.options[1]; + expect(option1.optionMode).toBe(MysteryEncounterOptionMode.DEFAULT); + expect(option1.dialogue).toBeDefined(); + expect(option1.dialogue).toStrictEqual({ + buttonLabel: `${namespace}.option.2.label`, + buttonTooltip: `${namespace}.option.2.tooltip`, + selected: [ + { + text: `${namespace}.option.2.selected`, + }, + ], + }); + }); + + it("should start battle against Garbodor", async () => { + const phaseSpy = vi.spyOn(scene, "pushPhase"); + + await game.runToMysteryEncounter(MysteryEncounterType.TRASH_TO_TREASURE, defaultParty); + await runMysteryEncounterToEnd(game, 2, null, true); + + const enemyField = scene.getEnemyField(); + expect(scene.getCurrentPhase().constructor.name).toBe(CommandPhase.name); + expect(enemyField.length).toBe(1); + expect(enemyField[0].species.speciesId).toBe(Species.GARBODOR); + expect(enemyField[0].moveset).toEqual([new PokemonMove(Moves.PAYBACK), new PokemonMove(Moves.GUNK_SHOT), new PokemonMove(Moves.STOMPING_TANTRUM), new PokemonMove(Moves.DRAIN_PUNCH)]); + + // Should have used moves pre-battle + const movePhases = phaseSpy.mock.calls.filter(p => p[0] instanceof MovePhase).map(p => p[0]); + expect(movePhases.length).toBe(2); + expect(movePhases.filter(p => (p as MovePhase).move.moveId === Moves.TOXIC).length).toBe(1); + expect(movePhases.filter(p => (p as MovePhase).move.moveId === Moves.AMNESIA).length).toBe(1); + }); + + it("should have 2 Rogue, 1 Ultra, 1 Great in rewards", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.TRASH_TO_TREASURE, defaultParty); + await runMysteryEncounterToEnd(game, 2, null, true); + await skipBattleRunMysteryEncounterRewardsPhase(game); + await game.phaseInterceptor.to(SelectModifierPhase, false); + 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(4); + expect(modifierSelectHandler.options[0].modifierTypeOption.type.tier - modifierSelectHandler.options[0].modifierTypeOption.upgradeCount).toEqual(ModifierTier.ROGUE); + expect(modifierSelectHandler.options[1].modifierTypeOption.type.tier - modifierSelectHandler.options[1].modifierTypeOption.upgradeCount).toEqual(ModifierTier.ROGUE); + expect(modifierSelectHandler.options[2].modifierTypeOption.type.tier - modifierSelectHandler.options[2].modifierTypeOption.upgradeCount).toEqual(ModifierTier.ULTRA); + expect(modifierSelectHandler.options[3].modifierTypeOption.type.tier - modifierSelectHandler.options[3].modifierTypeOption.upgradeCount).toEqual(ModifierTier.GREAT); + }); + }); +}); diff --git a/src/ui/modifier-select-ui-handler.ts b/src/ui/modifier-select-ui-handler.ts index 25e2e837c82..88e38ab284d 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 } from "../modifier/modifier"; +import { LockModifierTiersModifier, PokemonHeldItemModifier, RemoveHealShopModifier } from "../modifier/modifier"; import { handleTutorial, Tutorial } from "../tutorial"; import { Button } from "#enums/buttons"; import MoveInfoOverlay from "./move-info-overlay"; @@ -166,7 +166,8 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { this.updateRerollCostText(); const typeOptions = args[1] as ModifierTypeOption[]; - const shopTypeOptions = !this.scene.gameMode.hasNoShop + const removeHealShop = this.scene.gameMode.hasNoShop || !!this.scene.findModifier(m => m instanceof RemoveHealShopModifier); + const shopTypeOptions = !removeHealShop ? getPlayerShopModifierTypeOptionsForWave(this.scene.currentBattle.waveIndex, this.scene.getWaveMoneyAmount(1)) : []; const optionsYOffset = shopTypeOptions.length >= SHOP_OPTIONS_ROW_LIMIT ? -8 : -24; From 3030fc6c9d3c6670713a5ecef7f5a2c41bc78bcb Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Thu, 1 Aug 2024 13:56:42 -0400 Subject: [PATCH 229/270] clean up trash to treasure encounter --- .../encounters/trash-to-treasure-encounter.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) 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 20765605006..7fa433b17af 100644 --- a/src/data/mystery-encounters/encounters/trash-to-treasure-encounter.ts +++ b/src/data/mystery-encounters/encounters/trash-to-treasure-encounter.ts @@ -8,7 +8,7 @@ import { ModifierRewardPhase } from "#app/phases"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { Species } from "#enums/species"; -import { HitHealModifier, PokemonHeldItemModifier, RemoveHealShopModifier, TurnHealModifier } from "#app/modifier/modifier"; +import { HitHealModifier, PokemonHeldItemModifier, TurnHealModifier } from "#app/modifier/modifier"; import { applyModifierTypeToPlayerPokemon } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; import { showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; import i18next from "#app/plugins/i18n"; @@ -54,9 +54,6 @@ export const TrashToTreasureEncounter: IMysteryEncounter = .withQuery(`${namespace}.query`) .withOnInit((scene: BattleScene) => { const encounter = scene.currentBattle.mysteryEncounter; - const blackSludge = scene.findModifier(m => m instanceof RemoveHealShopModifier); - scene.removeModifier(blackSludge); - scene.updateModifiers(true, true); // Calculate boss mon const bossSpecies = getPokemonSpecies(Species.GARBODOR); From 6c074352e4a9d3b2c69d6d56569ece890ac8782c Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Thu, 1 Aug 2024 13:58:56 -0400 Subject: [PATCH 230/270] clean up trash to treasure encounter --- src/overrides.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/overrides.ts b/src/overrides.ts index 4ce80eabeee..1196797fac0 100644 --- a/src/overrides.ts +++ b/src/overrides.ts @@ -127,9 +127,9 @@ class DefaultOverrides { // ------------------------- // 1 to 256, set to null to ignore - readonly MYSTERY_ENCOUNTER_RATE_OVERRIDE: number = 256; + readonly MYSTERY_ENCOUNTER_RATE_OVERRIDE: number = null; readonly MYSTERY_ENCOUNTER_TIER_OVERRIDE: MysteryEncounterTier = null; - readonly MYSTERY_ENCOUNTER_OVERRIDE: MysteryEncounterType = MysteryEncounterType.TRASH_TO_TREASURE; + readonly MYSTERY_ENCOUNTER_OVERRIDE: MysteryEncounterType = null; // ------------------------- // MODIFIER / ITEM OVERRIDES From 3b6e8a86ee549a130002211108b327bd6714a739 Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Thu, 1 Aug 2024 22:36:25 -0400 Subject: [PATCH 231/270] add berries abound encounter --- src/battle-scene.ts | 2 +- .../encounters/berries-abound-encounter.ts | 331 ++++++++++++++++++ .../encounters/trash-to-treasure-encounter.ts | 3 +- .../mystery-encounters/mystery-encounter.ts | 1 + .../mystery-encounters/mystery-encounters.ts | 5 +- src/enums/mystery-encounter-type.ts | 5 +- src/locales/en/mystery-encounter.ts | 4 +- .../an-offer-you-cant-refuse-dialogue.ts | 2 +- .../berries-abound-dialogue.ts | 32 ++ .../fight-or-flight-dialogue.ts | 4 +- .../the-strong-stuff-dialogue.ts | 2 +- .../trash-to-treasure-dialogue.ts | 4 +- src/modifier/modifier-type.ts | 19 +- .../berries-abound-encounter.test.ts | 273 +++++++++++++++ .../fight-or-flight-encounter.test.ts | 255 ++++++++++++++ .../trash-to-treasure-encounter.test.ts | 1 - 16 files changed, 922 insertions(+), 21 deletions(-) create mode 100644 src/data/mystery-encounters/encounters/berries-abound-encounter.ts create mode 100644 src/locales/en/mystery-encounters/berries-abound-dialogue.ts create mode 100644 src/test/mystery-encounter/encounters/berries-abound-encounter.test.ts create mode 100644 src/test/mystery-encounter/encounters/fight-or-flight-encounter.test.ts diff --git a/src/battle-scene.ts b/src/battle-scene.ts index 249ddebdd60..2b01b777a64 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -1430,7 +1430,7 @@ export default class BattleScene extends SceneBase { const wave = waveIndex || this.currentBattle?.waveIndex || 0; this.waveSeed = Utils.shiftCharCodes(this.seed, wave); Phaser.Math.RND.sow([ this.waveSeed ]); - console.log("Wave Seed:", this.waveSeed, wave); + // console.log("Wave Seed:", this.waveSeed, wave); this.rngCounter = 0; } diff --git a/src/data/mystery-encounters/encounters/berries-abound-encounter.ts b/src/data/mystery-encounters/encounters/berries-abound-encounter.ts new file mode 100644 index 00000000000..5f0d180ccab --- /dev/null +++ b/src/data/mystery-encounters/encounters/berries-abound-encounter.ts @@ -0,0 +1,331 @@ +import { BattleStat } from "#app/data/battle-stat"; +import { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; +import { + EnemyPartyConfig, generateModifierTypeOption, + initBattleWithEnemyConfig, + leaveEncounterWithoutBattle, setEncounterExp, + setEncounterRewards +} from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { STEALING_MOVES } from "#app/data/mystery-encounters/requirements/requirement-groups"; +import Pokemon, { EnemyPokemon } from "#app/field/pokemon"; +import { + BerryModifierType, + getPartyLuckValue, + ModifierPoolType, + ModifierTypeOption, modifierTypes, + regenerateModifierPoolThresholds, +} from "#app/modifier/modifier-type"; +import { StatChangePhase } from "#app/phases"; +import { randSeedInt } from "#app/utils"; +import { BattlerTagType } from "#enums/battler-tag-type"; +import { MysteryEncounterType } from "#enums/mystery-encounter-type"; +import BattleScene from "#app/battle-scene"; +import IMysteryEncounter, { MysteryEncounterBuilder } from "../mystery-encounter"; +import { MoveRequirement } from "../mystery-encounter-requirements"; +import { queueEncounterMessage, showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; +import { getPokemonNameWithAffix } from "#app/messages"; +import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; +import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; +import { TrainerSlot } from "#app/data/trainer-config"; +import { applyModifierTypeToPlayerPokemon, getSpriteKeysFromPokemon } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; +import PokemonData from "#app/system/pokemon-data"; +import { BerryModifier } from "#app/modifier/modifier"; +import i18next from "#app/plugins/i18n"; +import { BerryType } from "#enums/berry-type"; + +/** the i18n namespace for the encounter */ +const namespace = "mysteryEncounter:berriesAbound"; + +/** + * Berries Abound encounter. + * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/24 | GitHub Issue #24} + * @see For biome requirements check {@linkcode mysteryEncountersByBiome} + */ +export const BerriesAboundEncounter: IMysteryEncounter = + MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.BERRIES_ABOUND) + .withEncounterTier(MysteryEncounterTier.COMMON) + .withSceneWaveRangeRequirement(10, 180) // waves 10 to 180 + .withCatchAllowed(true) + .withHideWildIntroMessage(true) + .withIntroSpriteConfigs([ + { + spriteKey: "lum_berry", + fileRoot: "items", + isItem: true, + x: 7, + y: -14, + disableAnimation: true + }, + { + spriteKey: "salac_berry", + fileRoot: "items", + isItem: true, + x: 2, + y: 4, + disableAnimation: true + }, + { + spriteKey: "lansat_berry", + fileRoot: "items", + isItem: true, + x: 32, + y: 5, + disableAnimation: true + }, + { + spriteKey: "liechi_berry", + fileRoot: "items", + isItem: true, + x: 6, + y: -5, + disableAnimation: true + }, + { + spriteKey: "sitrus_berry", + fileRoot: "items", + isItem: true, + x: 7, + y: 8, + disableAnimation: true + }, + { + spriteKey: "enigma_berry", + fileRoot: "items", + isItem: true, + x: 26, + y: -4, + disableAnimation: true + }, + { + spriteKey: "leppa_berry", + fileRoot: "items", + isItem: true, + x: 16, + y: -27, + disableAnimation: true + }, + { + spriteKey: "petaya_berry", + fileRoot: "items", + isItem: true, + x: 30, + y: -17, + disableAnimation: true + }, + { + spriteKey: "ganlon_berry", + fileRoot: "items", + isItem: true, + x: 16, + y: -11, + disableAnimation: true + }, + { + spriteKey: "apicot_berry", + fileRoot: "items", + isItem: true, + x: 14, + y: -2, + disableAnimation: true + }, + { + spriteKey: "starf_berry", + fileRoot: "items", + isItem: true, + x: 18, + y: 9, + disableAnimation: true + }, + ]) // Set in onInit() + .withIntroDialogue([ + { + text: `${namespace}.intro`, + }, + ]) + .withOnInit((scene: BattleScene) => { + const encounter = scene.currentBattle.mysteryEncounter; + + // Calculate boss mon + const bossSpecies = scene.arena.randomSpecies(scene.currentBattle.waveIndex, scene.currentBattle.waveIndex, 0, getPartyLuckValue(scene.getParty()), true); + const bossPokemon = new EnemyPokemon(scene, bossSpecies, scene.currentBattle.waveIndex, TrainerSlot.NONE, true, null); + const config: EnemyPartyConfig = { + levelAdditiveMultiplier: 1, + pokemonConfigs: [{ + species: bossSpecies, + dataSource: new PokemonData(bossPokemon), + isBoss: true + }], + }; + encounter.enemyPartyConfigs = [config]; + + // Calculate the number of extra berries that player receives + // 10-60 GREAT, 60-110 ULTRA, 110-160 ROGUE, 160-180 MASTER + const numBerries = + scene.currentBattle.waveIndex > 160 ? 7 + : scene.currentBattle.waveIndex > 110 ? 5 + : scene.currentBattle.waveIndex > 60 ? 4 : 2; + regenerateModifierPoolThresholds(scene.getParty(), ModifierPoolType.PLAYER, 0); + encounter.misc = { numBerries }; + + const { spriteKey, fileRoot } = getSpriteKeysFromPokemon(bossPokemon); + encounter.spriteConfigs.push({ + spriteKey: spriteKey, + fileRoot: fileRoot, + hasShadow: true, + tint: 0.25, + x: -5, + repeat: true, + isPokemon: true + }); + + // If player has a stealing move, they succeed automatically + encounter.options[1].meetsRequirements(scene); + const primaryPokemon = encounter.options[1].primaryPokemon; + if (primaryPokemon) { + // Use primaryPokemon to execute the thievery + encounter.options[1].dialogue.buttonTooltip = `${namespace}.option.2.tooltip_special`; + } else { + encounter.options[1].dialogue.buttonTooltip = `${namespace}.option.2.tooltip`; + } + + return true; + }) + .withTitle(`${namespace}.title`) + .withDescription(`${namespace}.description`) + .withQuery(`${namespace}.query`) + .withSimpleOption( + { + buttonLabel: `${namespace}.option.1.label`, + buttonTooltip: `${namespace}.option.1.tooltip`, + selected: [ + { + text: `${namespace}.option.1.selected`, + }, + ], + }, + async (scene: BattleScene) => { + // Pick battle + const encounter = scene.currentBattle.mysteryEncounter; + const numBerries = encounter.misc.numBerries; + + const doBerryRewards = async () => { + const berryText = numBerries + " " + i18next.t(`${namespace}.berries`); + + scene.playSound("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 + for (let i = 0; i < numBerries; i++) { + await tryGiveBerry(scene); + } + }; + + const shopOptions: ModifierTypeOption[] = []; + for (let i = 0; i < 5; i++) { + // Generate shop berries + shopOptions.push(generateModifierTypeOption(scene, modifierTypes.BERRY)); + } + + setEncounterRewards(scene, { guaranteedModifierTypeOptions: shopOptions, fillRemaining: false }, null, doBerryRewards); + await initBattleWithEnemyConfig(scene, scene.currentBattle.mysteryEncounter.enemyPartyConfigs[0]); + } + ) + .withOption( + new MysteryEncounterOptionBuilder() + .withOptionMode(MysteryEncounterOptionMode.DEFAULT_OR_SPECIAL) + .withPrimaryPokemonRequirement(new MoveRequirement(STEALING_MOVES)) // Will set option2PrimaryName and option2PrimaryMove dialogue tokens automatically + .withDialogue({ + buttonLabel: `${namespace}.option.2.label`, + buttonTooltip: `${namespace}.option.2.tooltip`, + }) + .withOptionPhase(async (scene: BattleScene) => { + // Pick steal + const encounter = scene.currentBattle.mysteryEncounter; + const numBerries = encounter.misc.numBerries; + + const doBerryRewards = async () => { + const berryText = numBerries + " " + i18next.t(`${namespace}.berries`); + + scene.playSound("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 + for (let i = 0; i < numBerries; i++) { + await tryGiveBerry(scene); + } + }; + + const shopOptions: ModifierTypeOption[] = []; + for (let i = 0; i < 5; i++) { + // Generate shop berries + shopOptions.push(generateModifierTypeOption(scene, modifierTypes.BERRY)); + } + + setEncounterRewards(scene, { guaranteedModifierTypeOptions: shopOptions, fillRemaining: false }, null, doBerryRewards); + + // If player has a stealing move, they succeed automatically + const primaryPokemon = encounter.options[1].primaryPokemon; + if (primaryPokemon) { + // Use primaryPokemon to execute the thievery + await showEncounterText(scene, `${namespace}.option.2.special_result`); + setEncounterExp(scene, primaryPokemon.id, encounter.enemyPartyConfigs[0].pokemonConfigs[0].species.baseExp, true); + leaveEncounterWithoutBattle(scene); + return; + } + + const roll = randSeedInt(16); + if (roll > 6) { + // Noticed and attacked by boss, gets +1 to all stats at start of fight (62.5%) + const config = scene.currentBattle.mysteryEncounter.enemyPartyConfigs[0]; + config.pokemonConfigs[0].tags = [BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON]; + config.pokemonConfigs[0].mysteryEncounterBattleEffects = (pokemon: Pokemon) => { + pokemon.scene.currentBattle.mysteryEncounter.setDialogueToken("enemyPokemon", getPokemonNameWithAffix(pokemon)); + queueEncounterMessage(pokemon.scene, `${namespace}option.2.boss_enraged`); + pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [BattleStat.ATK, BattleStat.DEF, BattleStat.SPATK, BattleStat.SPDEF, BattleStat.SPD], 1)); + }; + await showEncounterText(scene, `${namespace}.option.2.bad_result`); + await initBattleWithEnemyConfig(scene, config); + } else { + // Steal item (37.5%) + // Display result message then proceed to rewards + await showEncounterText(scene, `${namespace}.option.2.good_result`); + leaveEncounterWithoutBattle(scene); + } + }) + .build() + ) + .withSimpleOption( + { + buttonLabel: `${namespace}.option.3.label`, + buttonTooltip: `${namespace}.option.3.tooltip`, + selected: [ + { + text: `${namespace}.option.3.selected`, + }, + ], + }, + async (scene: BattleScene) => { + // Leave encounter with no rewards or exp + leaveEncounterWithoutBattle(scene, true); + return true; + } + ) + .build(); + +async function tryGiveBerry(scene: BattleScene) { + const berryType = randSeedInt(Object.keys(BerryType).filter(s => !isNaN(Number(s))).length) as BerryType; + const berry = generateModifierTypeOption(scene, modifierTypes.BERRY, [berryType]).type as BerryModifierType; + + const party = scene.getParty(); + + // Iterate over the party until berry was successfully given + for (const pokemon of party) { + const heldBerriesOfType = scene.findModifier(m => m instanceof BerryModifier + && m.pokemonId === pokemon.id && (m as BerryModifier).berryType === berryType, true) as BerryModifier; + + if (!heldBerriesOfType || heldBerriesOfType.getStackCount() < heldBerriesOfType.getMaxStackCount(scene)) { + await applyModifierTypeToPlayerPokemon(scene, pokemon, berry); + break; + } + } +} 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 7fa433b17af..0ea9d42ca63 100644 --- a/src/data/mystery-encounters/encounters/trash-to-treasure-encounter.ts +++ b/src/data/mystery-encounters/encounters/trash-to-treasure-encounter.ts @@ -40,7 +40,8 @@ export const TrashToTreasureEncounter: IMysteryEncounter = hasShadow: false, disableAnimation: true, scale: 1.5, - y: 8 + y: 8, + tint: 0.4 } ]) .withAutoHideIntroVisuals(false) diff --git a/src/data/mystery-encounters/mystery-encounter.ts b/src/data/mystery-encounters/mystery-encounter.ts index 8eababcfdeb..be496fe1133 100644 --- a/src/data/mystery-encounters/mystery-encounter.ts +++ b/src/data/mystery-encounters/mystery-encounter.ts @@ -162,6 +162,7 @@ export default class IMysteryEncounter implements IMysteryEncounter { } this.encounterTier = this.encounterTier ?? MysteryEncounterTier.COMMON; this.dialogue = this.dialogue ?? {}; + this.spriteConfigs = this.spriteConfigs ? [...this.spriteConfigs] : []; // Default max is 1 for ROGUE encounters, 3 for others this.maxAllowedEncounters = this.maxAllowedEncounters ?? this.encounterTier === MysteryEncounterTier.ROGUE ? 1 : 3; this.encounterMode = MysteryEncounterMode.DEFAULT; diff --git a/src/data/mystery-encounters/mystery-encounters.ts b/src/data/mystery-encounters/mystery-encounters.ts index 3a9c411830b..6d49e6d014f 100644 --- a/src/data/mystery-encounters/mystery-encounters.ts +++ b/src/data/mystery-encounters/mystery-encounters.ts @@ -20,6 +20,7 @@ import { DelibirdyEncounter } from "#app/data/mystery-encounters/encounters/deli import { AbsoluteAvariceEncounter } from "#app/data/mystery-encounters/encounters/absolute-avarice-encounter"; import { ATrainersTestEncounter } from "#app/data/mystery-encounters/encounters/a-trainers-test-encounter"; import { TrashToTreasureEncounter } from "#app/data/mystery-encounters/encounters/trash-to-treasure-encounter"; +import { BerriesAboundEncounter } from "#app/data/mystery-encounters/encounters/berries-abound-encounter"; // Spawn chance: (BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT + WIGHT_INCREMENT_ON_SPAWN_MISS * ) / 256 export const BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT = 1; @@ -157,7 +158,8 @@ const anyBiomeEncounters: MysteryEncounterType[] = [ MysteryEncounterType.TRAINING_SESSION, MysteryEncounterType.DELIBIRDY, MysteryEncounterType.A_TRAINERS_TEST, - MysteryEncounterType.TRASH_TO_TREASURE + MysteryEncounterType.TRASH_TO_TREASURE, + MysteryEncounterType.BERRIES_ABOUND ]; /** @@ -246,6 +248,7 @@ export function initMysteryEncounters() { allMysteryEncounters[MysteryEncounterType.ABSOLUTE_AVARICE] = AbsoluteAvariceEncounter; allMysteryEncounters[MysteryEncounterType.A_TRAINERS_TEST] = ATrainersTestEncounter; allMysteryEncounters[MysteryEncounterType.TRASH_TO_TREASURE] = TrashToTreasureEncounter; + allMysteryEncounters[MysteryEncounterType.BERRIES_ABOUND] = BerriesAboundEncounter; // Add extreme encounters to biome map extremeBiomeEncounters.forEach(encounter => { diff --git a/src/enums/mystery-encounter-type.ts b/src/enums/mystery-encounter-type.ts index de4ab055e89..6cf2c1b4fb2 100644 --- a/src/enums/mystery-encounter-type.ts +++ b/src/enums/mystery-encounter-type.ts @@ -9,7 +9,7 @@ export enum MysteryEncounterType { SHADY_VITAMIN_DEALER, FIELD_TRIP, SAFARI_ZONE, - LOST_AT_SEA, //might be generalized later on + LOST_AT_SEA, // Might be generalized later on FIERY_FALLOUT, THE_STRONG_STUFF, THE_POKEMON_SALESMAN, @@ -17,5 +17,6 @@ export enum MysteryEncounterType { DELIBIRDY, ABSOLUTE_AVARICE, A_TRAINERS_TEST, - TRASH_TO_TREASURE + TRASH_TO_TREASURE, + BERRIES_ABOUND } diff --git a/src/locales/en/mystery-encounter.ts b/src/locales/en/mystery-encounter.ts index 6a47b84c590..099802a5f53 100644 --- a/src/locales/en/mystery-encounter.ts +++ b/src/locales/en/mystery-encounter.ts @@ -17,6 +17,7 @@ import { delibirdyDialogue } from "#app/locales/en/mystery-encounters/delibirdy- import { absoluteAvariceDialogue } from "#app/locales/en/mystery-encounters/absolute-avarice-dialogue"; import { aTrainersTestDialogue } from "#app/locales/en/mystery-encounters/a-trainers-test-dialogue"; import { trashToTreasureDialogue } from "#app/locales/en/mystery-encounters/trash-to-treasure-dialogue"; +import { berriesAboundDialogue } from "#app/locales/en/mystery-encounters/berries-abound-dialogue"; /** * Patterns that can be used: @@ -58,5 +59,6 @@ export const mysteryEncounter = { delibirdy: delibirdyDialogue, absoluteAvarice: absoluteAvariceDialogue, aTrainersTest: aTrainersTestDialogue, - trashToTreasure: trashToTreasureDialogue + trashToTreasure: trashToTreasureDialogue, + berriesAbound: berriesAboundDialogue } as const; diff --git a/src/locales/en/mystery-encounters/an-offer-you-cant-refuse-dialogue.ts b/src/locales/en/mystery-encounters/an-offer-you-cant-refuse-dialogue.ts index 00ca2f5f309..1148b5c1425 100644 --- a/src/locales/en/mystery-encounters/an-offer-you-cant-refuse-dialogue.ts +++ b/src/locales/en/mystery-encounters/an-offer-you-cant-refuse-dialogue.ts @@ -6,7 +6,7 @@ export const anOfferYouCantRefuseDialogue = { $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 is an extremely good deal, but can you really bear to part with such a strong team member?", + 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?", option: { 1: { diff --git a/src/locales/en/mystery-encounters/berries-abound-dialogue.ts b/src/locales/en/mystery-encounters/berries-abound-dialogue.ts new file mode 100644 index 00000000000..803da26406d --- /dev/null +++ b/src/locales/en/mystery-encounters/berries-abound-dialogue.ts @@ -0,0 +1,32 @@ +export const berriesAboundDialogue = { + intro: "There's a huge berry bush\nnear that Pokémon!", + title: "Berries Abound", + description: "It looks like there's a strong Pokémon guarding a berry bush. Battling is the straightforward approach, but this Pokémon looks strong. You could also try to sneak around, though the Pokémon might catch you.", + query: "What will you do?", + berries: "Berries!", + option: { + 1: { + label: "Battle the Pokémon", + tooltip: "(-) Hard Battle\n(+) New Item", + selected: "You approach the\nPokémon without fear.", + }, + 2: { + label: "Steal the Berries", + tooltip: "@[SUMMARY_GREEN]{(35%) Steal Item}\n@[SUMMARY_BLUE]{(65%) Harder Battle}", + tooltip_special: "(+) {{option2PrimaryName}} uses {{option2PrimaryMove}}", + good_result: `.@d{32}.@d{32}.@d{32} + $You manage to sneak your way\npast and grab the berries!`, + special_result: `.@d{32}.@d{32}.@d{32} + $Your {{option2PrimaryName}} helps you out and uses {{option2PrimaryMove}}! + $You nabbed the berries!`, + bad_result: `.@d{32}.@d{32}.@d{32} + $The Pokémon catches you\nas you try to sneak around!`, + boss_enraged: "The opposing {{enemyPokemon}} has become enraged!" + }, + 3: { + label: "Leave", + tooltip: "(-) No Rewards", + selected: "You leave the strong Pokémon\nwith its prize and continue on.", + }, + } +}; diff --git a/src/locales/en/mystery-encounters/fight-or-flight-dialogue.ts b/src/locales/en/mystery-encounters/fight-or-flight-dialogue.ts index a7b8b03aab5..1eb4a984b21 100644 --- a/src/locales/en/mystery-encounters/fight-or-flight-dialogue.ts +++ b/src/locales/en/mystery-encounters/fight-or-flight-dialogue.ts @@ -10,14 +10,14 @@ export const fightOrFlightDialogue = { selected: "You approach the\nPokémon without fear.", }, 2: { - label: "Steal the item", + label: "Steal the Item", tooltip: "@[SUMMARY_GREEN]{(35%) Steal Item}\n@[SUMMARY_BLUE]{(65%) Harder Battle}", tooltip_special: "(+) {{option2PrimaryName}} uses {{option2PrimaryMove}}", good_result: `.@d{32}.@d{32}.@d{32} $You manage to sneak your way\npast and grab the item!`, special_result: `.@d{32}.@d{32}.@d{32} $Your {{option2PrimaryName}} helps you out and uses {{option2PrimaryMove}}! - $ You nabbed the item!`, + $You nabbed the item!`, bad_result: `.@d{32}.@d{32}.@d{32} $The Pokémon catches you\nas you try to sneak around!`, boss_enraged: "The opposing {{enemyPokemon}} has become enraged!" diff --git a/src/locales/en/mystery-encounters/the-strong-stuff-dialogue.ts b/src/locales/en/mystery-encounters/the-strong-stuff-dialogue.ts index c1a35c4f68a..baaca049f08 100644 --- a/src/locales/en/mystery-encounters/the-strong-stuff-dialogue.ts +++ b/src/locales/en/mystery-encounters/the-strong-stuff-dialogue.ts @@ -10,7 +10,7 @@ export const theStrongStuffDialogue = { selected: "You black out.", 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! - $It's base stats were reduced by 20 in each stat! + $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!` }, diff --git a/src/locales/en/mystery-encounters/trash-to-treasure-dialogue.ts b/src/locales/en/mystery-encounters/trash-to-treasure-dialogue.ts index a9e369270ad..9242058b128 100644 --- a/src/locales/en/mystery-encounters/trash-to-treasure-dialogue.ts +++ b/src/locales/en/mystery-encounters/trash-to-treasure-dialogue.ts @@ -6,7 +6,7 @@ export const trashToTreasureDialogue = { option: { 1: { label: "Dig for Valuables", - tooltip: "(-) Become Covered in Filth\n(+) Gain Amazing Items", + tooltip: "(-) Lose Healing Items in Shops\n(+) Gain Amazing Items", 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. @@ -16,7 +16,7 @@ export const trashToTreasureDialogue = { label: "Investigate Further", tooltip: "(?) Find the Source of the Garbage", selected: "You wander around the heap, searching for any indication as to how this might have appeared here...", - selected_2: "Suddenly, the garbage shifts! It wasn't just garbage, it's a Pokémon!" + selected_2: "Suddenly, the garbage shifts! It wasn't just garbage, it was a Pokémon!" }, }, }; diff --git a/src/modifier/modifier-type.ts b/src/modifier/modifier-type.ts index 3e52f080c94..f430a0a118b 100644 --- a/src/modifier/modifier-type.ts +++ b/src/modifier/modifier-type.ts @@ -127,15 +127,18 @@ export class ModifierType { */ withTierFromPool(poolType: ModifierPoolType = ModifierPoolType.PLAYER): ModifierType { const modifierPool = getModifierPoolForType(poolType); - Object.values(modifierPool).every(weightedModifiers => { - weightedModifiers.every(m => { - if (m.modifierType.id === this.id) { - this.tier = m.modifierType.tier; - return false; // Early lookup return if tier found + + for (const weightedModifiers of Object.values(modifierPool)) { + for (const mod of weightedModifiers) { + if (mod.modifierType.id === this.id) { + this.tier = mod.modifierType.tier; + return this; } - }); - return !this.tier; // Early lookup return if tier found - }); + } + } + + // Fallback to COMMON tier if no tier found + this.tier = ModifierTier.COMMON; return this; } diff --git a/src/test/mystery-encounter/encounters/berries-abound-encounter.test.ts b/src/test/mystery-encounter/encounters/berries-abound-encounter.test.ts new file mode 100644 index 00000000000..9bd17702f74 --- /dev/null +++ b/src/test/mystery-encounter/encounters/berries-abound-encounter.test.ts @@ -0,0 +1,273 @@ +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, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounterTestUtils"; +import { CommandPhase, SelectModifierPhase } from "#app/phases"; +import { Moves } from "#enums/moves"; +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 { BerryModifier } 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"; +import { BerriesAboundEncounter } from "#app/data/mystery-encounters/encounters/berries-abound-encounter"; +import * as Utils from "utils"; +import { isNullOrUndefined } from "utils"; +import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import * as EncounterDialogueUtils from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; + +const namespace = "mysteryEncounter:berriesAbound"; +const defaultParty = [Species.LAPRAS, Species.GENGAR, Species.ABRA]; +const defaultBiome = Biome.CAVE; +const defaultWave = 45; + +describe("Berries Abound - 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.mysteryEncounterTier(MysteryEncounterTier.COMMON); + game.override.startingWave(defaultWave); + game.override.startingBiome(defaultBiome); + + vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue( + new Map([ + [Biome.CAVE, [MysteryEncounterType.BERRIES_ABOUND]], + ]) + ); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + vi.clearAllMocks(); + vi.resetAllMocks(); + }); + + it("should have the correct properties", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.BERRIES_ABOUND, defaultParty); + + expect(BerriesAboundEncounter.encounterType).toBe(MysteryEncounterType.BERRIES_ABOUND); + expect(BerriesAboundEncounter.encounterTier).toBe(MysteryEncounterTier.COMMON); + expect(BerriesAboundEncounter.dialogue).toBeDefined(); + expect(BerriesAboundEncounter.dialogue.intro).toStrictEqual([{ text: `${namespace}.intro` }]); + expect(BerriesAboundEncounter.dialogue.encounterOptionsDialogue.title).toBe(`${namespace}.title`); + expect(BerriesAboundEncounter.dialogue.encounterOptionsDialogue.description).toBe(`${namespace}.description`); + expect(BerriesAboundEncounter.dialogue.encounterOptionsDialogue.query).toBe(`${namespace}.query`); + expect(BerriesAboundEncounter.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.BERRIES_ABOUND); + }); + + 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 = BerriesAboundEncounter; + + const { onInit } = BerriesAboundEncounter; + + expect(BerriesAboundEncounter.onInit).toBeDefined(); + + BerriesAboundEncounter.populateDialogueTokensFromRequirements(scene); + const onInitResult = onInit(scene); + + const config = BerriesAboundEncounter.enemyPartyConfigs[0]; + expect(config).toBeDefined(); + expect(config.levelAdditiveMultiplier).toBe(1); + expect(config.pokemonConfigs[0].isBoss).toBe(true); + expect(onInitResult).toBe(true); + }); + + describe("Option 1 - Fight", () => { + it("should have the correct properties", () => { + const option1 = BerriesAboundEncounter.options[0]; + expect(option1.optionMode).toBe(MysteryEncounterOptionMode.DEFAULT); + expect(option1.dialogue).toBeDefined(); + expect(option1.dialogue).toStrictEqual({ + buttonLabel: `${namespace}.option.1.label`, + buttonTooltip: `${namespace}.option.1.tooltip`, + selected: [ + { + text: `${namespace}.option.1.selected`, + }, + ], + }); + }); + + it("should start a fight against the boss", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.BERRIES_ABOUND, defaultParty); + + const config = game.scene.currentBattle.mysteryEncounter.enemyPartyConfigs[0]; + const speciesToSpawn = config.pokemonConfigs[0].species.speciesId; + + await runMysteryEncounterToEnd(game, 1, null, true); + + const enemyField = scene.getEnemyField(); + expect(scene.getCurrentPhase().constructor.name).toBe(CommandPhase.name); + expect(enemyField.length).toBe(1); + expect(enemyField[0].species.speciesId).toBe(speciesToSpawn); + }); + + it("should reward the player with X berries based on wave", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.BERRIES_ABOUND, defaultParty); + + const numBerries = game.scene.currentBattle.mysteryEncounter.misc.numBerries; + + await runMysteryEncounterToEnd(game, 1, null, true); + await skipBattleRunMysteryEncounterRewardsPhase(game); + await game.phaseInterceptor.to(SelectModifierPhase, false); + expect(scene.getCurrentPhase().constructor.name).toBe(SelectModifierPhase.name); + + const berriesAfter = scene.findModifiers(m => m instanceof BerryModifier) as BerryModifier[]; + const berriesAfterCount = berriesAfter.reduce((a, b) => a + b.stackCount, 0); + + expect(numBerries).toBe(berriesAfterCount); + }); + + it("should spawn a shop with 5 berries", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.BERRIES_ABOUND, defaultParty); + await runMysteryEncounterToEnd(game, 1, null, true); + await skipBattleRunMysteryEncounterRewardsPhase(game); + await game.phaseInterceptor.to(SelectModifierPhase, false); + 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(5); + for (const option of modifierSelectHandler.options) { + expect(option.modifierTypeOption.type.id).toContain("BERRY"); + } + }); + }); + + describe("Option 2 - Attempt to Steal", () => { + it("should have the correct properties", () => { + const option1 = BerriesAboundEncounter.options[1]; + expect(option1.optionMode).toBe(MysteryEncounterOptionMode.DEFAULT_OR_SPECIAL); + expect(option1.dialogue).toBeDefined(); + expect(option1.dialogue).toStrictEqual({ + buttonLabel: `${namespace}.option.2.label`, + buttonTooltip: `${namespace}.option.2.tooltip`, + }); + }); + + it("should start battle on failing to steal", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.BERRIES_ABOUND, defaultParty); + + const config = game.scene.currentBattle.mysteryEncounter.enemyPartyConfigs[0]; + const speciesToSpawn = config.pokemonConfigs[0].species.speciesId; + + const realFn = Utils.randSeedInt; + vi.spyOn(Utils, "randSeedInt").mockImplementation((range, min) => { + if (range === 16 && isNullOrUndefined(min)) { + // Mock the steal roll + return 12; + } else { + return realFn(range, min); + } + }); + + await runMysteryEncounterToEnd(game, 2, null, true); + + const enemyField = scene.getEnemyField(); + expect(scene.getCurrentPhase().constructor.name).toBe(CommandPhase.name); + expect(enemyField.length).toBe(1); + expect(enemyField[0].species.speciesId).toBe(speciesToSpawn); + + // Should be enraged + expect(enemyField[0].summonData.battleStats).toEqual([1, 1, 1, 1, 1, 0, 0]); + }); + + it("Should skip battle when succeed on steal", async () => { + const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); + + await game.runToMysteryEncounter(MysteryEncounterType.BERRIES_ABOUND, defaultParty); + + const realFn = Utils.randSeedInt; + vi.spyOn(Utils, "randSeedInt").mockImplementation((range, min) => { + if (range === 16 && isNullOrUndefined(min)) { + // Mock the steal roll + return 6; + } else { + return realFn(range, min); + } + }); + + await runMysteryEncounterToEnd(game, 2); + await game.phaseInterceptor.to(SelectModifierPhase, false); + 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(5); + for (const option of modifierSelectHandler.options) { + expect(option.modifierTypeOption.type.id).toContain("BERRY"); + } + + expect(leaveEncounterWithoutBattleSpy).toBeCalled(); + }); + + it("Should skip fight when special requirements are met", async () => { + const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); + const encounterTextSpy = vi.spyOn(EncounterDialogueUtils, "showEncounterText"); + + await game.runToMysteryEncounter(MysteryEncounterType.BERRIES_ABOUND, defaultParty); + + // Mock moveset + scene.getParty()[0].moveset = [new PokemonMove(Moves.KNOCK_OFF)]; + + await runMysteryEncounterToEnd(game, 2); + await game.phaseInterceptor.to(SelectModifierPhase, false); + 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(5); + for (const option of modifierSelectHandler.options) { + expect(option.modifierTypeOption.type.id).toContain("BERRY"); + } + + expect(encounterTextSpy).toHaveBeenCalledWith(expect.any(BattleScene), `${namespace}.option.2.special_result`); + expect(leaveEncounterWithoutBattleSpy).toBeCalled(); + }); + }); + + describe("Option 3 - Leave", () => { + it("should leave encounter without battle", async () => { + const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); + + await game.runToMysteryEncounter(MysteryEncounterType.BERRIES_ABOUND, defaultParty); + await runMysteryEncounterToEnd(game, 3); + + expect(leaveEncounterWithoutBattleSpy).toBeCalled(); + }); + }); +}); 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 new file mode 100644 index 00000000000..70978c90834 --- /dev/null +++ b/src/test/mystery-encounter/encounters/fight-or-flight-encounter.test.ts @@ -0,0 +1,255 @@ +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, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounterTestUtils"; +import { CommandPhase, SelectModifierPhase } from "#app/phases"; +import { Moves } from "#enums/moves"; +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 { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; +import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; +import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; +import * as Utils from "utils"; +import { isNullOrUndefined } from "utils"; +import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import * as EncounterDialogueUtils from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; +import { FightOrFlightEncounter } from "#app/data/mystery-encounters/encounters/fight-or-flight-encounter"; + +const namespace = "mysteryEncounter:fightOrFlight"; +const defaultParty = [Species.LAPRAS, Species.GENGAR, Species.ABRA]; +const defaultBiome = Biome.CAVE; +const defaultWave = 45; + +describe("Fight or Flight - 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.mysteryEncounterTier(MysteryEncounterTier.COMMON); + game.override.startingWave(defaultWave); + game.override.startingBiome(defaultBiome); + + vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue( + new Map([ + [Biome.CAVE, [MysteryEncounterType.FIGHT_OR_FLIGHT]], + ]) + ); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + vi.clearAllMocks(); + vi.resetAllMocks(); + }); + + it("should have the correct properties", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.FIGHT_OR_FLIGHT, defaultParty); + + expect(FightOrFlightEncounter.encounterType).toBe(MysteryEncounterType.FIGHT_OR_FLIGHT); + expect(FightOrFlightEncounter.encounterTier).toBe(MysteryEncounterTier.COMMON); + expect(FightOrFlightEncounter.dialogue).toBeDefined(); + expect(FightOrFlightEncounter.dialogue.intro).toStrictEqual([{ text: `${namespace}.intro` }]); + expect(FightOrFlightEncounter.dialogue.encounterOptionsDialogue.title).toBe(`${namespace}.title`); + expect(FightOrFlightEncounter.dialogue.encounterOptionsDialogue.description).toBe(`${namespace}.description`); + expect(FightOrFlightEncounter.dialogue.encounterOptionsDialogue.query).toBe(`${namespace}.query`); + expect(FightOrFlightEncounter.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.FIGHT_OR_FLIGHT); + }); + + 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 = FightOrFlightEncounter; + + const { onInit } = FightOrFlightEncounter; + + expect(FightOrFlightEncounter.onInit).toBeDefined(); + + FightOrFlightEncounter.populateDialogueTokensFromRequirements(scene); + const onInitResult = onInit(scene); + + const config = FightOrFlightEncounter.enemyPartyConfigs[0]; + expect(config).toBeDefined(); + expect(config.levelAdditiveMultiplier).toBe(1); + expect(config.pokemonConfigs[0].isBoss).toBe(true); + expect(onInitResult).toBe(true); + }); + + describe("Option 1 - Fight", () => { + it("should have the correct properties", () => { + const option1 = FightOrFlightEncounter.options[0]; + expect(option1.optionMode).toBe(MysteryEncounterOptionMode.DEFAULT); + expect(option1.dialogue).toBeDefined(); + expect(option1.dialogue).toStrictEqual({ + buttonLabel: `${namespace}.option.1.label`, + buttonTooltip: `${namespace}.option.1.tooltip`, + selected: [ + { + text: `${namespace}.option.1.selected`, + }, + ], + }); + }); + + it("should start a fight against the boss", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.FIGHT_OR_FLIGHT, defaultParty); + + const config = game.scene.currentBattle.mysteryEncounter.enemyPartyConfigs[0]; + const speciesToSpawn = config.pokemonConfigs[0].species.speciesId; + + await runMysteryEncounterToEnd(game, 1, null, true); + + const enemyField = scene.getEnemyField(); + expect(scene.getCurrentPhase().constructor.name).toBe(CommandPhase.name); + expect(enemyField.length).toBe(1); + expect(enemyField[0].species.speciesId).toBe(speciesToSpawn); + }); + + it("should reward the player with the item based on wave", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.FIGHT_OR_FLIGHT, defaultParty); + + const item = game.scene.currentBattle.mysteryEncounter.misc; + + await runMysteryEncounterToEnd(game, 1, null, true); + await skipBattleRunMysteryEncounterRewardsPhase(game); + await game.phaseInterceptor.to(SelectModifierPhase, false); + 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(1); + expect(item.type.name).toBe(modifierSelectHandler.options[0].modifierTypeOption.type.name); + }); + }); + + describe("Option 2 - Attempt to Steal", () => { + it("should have the correct properties", () => { + const option1 = FightOrFlightEncounter.options[1]; + expect(option1.optionMode).toBe(MysteryEncounterOptionMode.DEFAULT_OR_SPECIAL); + expect(option1.dialogue).toBeDefined(); + expect(option1.dialogue).toStrictEqual({ + buttonLabel: `${namespace}.option.2.label`, + buttonTooltip: `${namespace}.option.2.tooltip`, + }); + }); + + it("should start battle on failing to steal", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.FIGHT_OR_FLIGHT, defaultParty); + + const config = game.scene.currentBattle.mysteryEncounter.enemyPartyConfigs[0]; + const speciesToSpawn = config.pokemonConfigs[0].species.speciesId; + + const realFn = Utils.randSeedInt; + vi.spyOn(Utils, "randSeedInt").mockImplementation((range, min) => { + if (range === 16 && isNullOrUndefined(min)) { + // Mock the steal roll + return 12; + } else { + return realFn(range, min); + } + }); + + await runMysteryEncounterToEnd(game, 2, null, true); + + const enemyField = scene.getEnemyField(); + expect(scene.getCurrentPhase().constructor.name).toBe(CommandPhase.name); + expect(enemyField.length).toBe(1); + expect(enemyField[0].species.speciesId).toBe(speciesToSpawn); + + // Should be enraged + expect(enemyField[0].summonData.battleStats).toEqual([1, 1, 1, 1, 1, 0, 0]); + }); + + it("Should skip battle when succeed on steal", async () => { + const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); + + await game.runToMysteryEncounter(MysteryEncounterType.FIGHT_OR_FLIGHT, defaultParty); + + const item = game.scene.currentBattle.mysteryEncounter.misc; + const realFn = Utils.randSeedInt; + vi.spyOn(Utils, "randSeedInt").mockImplementation((range, min) => { + if (range === 16 && isNullOrUndefined(min)) { + // Mock the steal roll + return 6; + } else { + return realFn(range, min); + } + }); + + await runMysteryEncounterToEnd(game, 2); + await game.phaseInterceptor.to(SelectModifierPhase, false); + 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(1); + expect(item.type.name).toBe(modifierSelectHandler.options[0].modifierTypeOption.type.name); + + expect(leaveEncounterWithoutBattleSpy).toBeCalled(); + }); + + it("Should skip fight when special requirements are met", async () => { + const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); + const encounterTextSpy = vi.spyOn(EncounterDialogueUtils, "showEncounterText"); + + await game.runToMysteryEncounter(MysteryEncounterType.FIGHT_OR_FLIGHT, defaultParty); + + // Mock moveset + scene.getParty()[0].moveset = [new PokemonMove(Moves.KNOCK_OFF)]; + const item = game.scene.currentBattle.mysteryEncounter.misc; + + await runMysteryEncounterToEnd(game, 2); + await game.phaseInterceptor.to(SelectModifierPhase, false); + 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(1); + expect(item.type.name).toBe(modifierSelectHandler.options[0].modifierTypeOption.type.name); + + expect(encounterTextSpy).toHaveBeenCalledWith(expect.any(BattleScene), `${namespace}.option.2.special_result`); + expect(leaveEncounterWithoutBattleSpy).toBeCalled(); + }); + }); + + describe("Option 3 - Leave", () => { + it("should leave encounter without battle", async () => { + const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); + + await game.runToMysteryEncounter(MysteryEncounterType.FIGHT_OR_FLIGHT, defaultParty); + await runMysteryEncounterToEnd(game, 3); + + expect(leaveEncounterWithoutBattleSpy).toBeCalled(); + }); + }); +}); 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 9cd1d477a22..df3a3471548 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 @@ -46,7 +46,6 @@ describe("Trash to Treasure - Mystery Encounter", () => { vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue( new Map([ [Biome.CAVE, [MysteryEncounterType.TRASH_TO_TREASURE]], - [Biome.MOUNTAIN, [MysteryEncounterType.MYSTERIOUS_CHALLENGERS]], ]) ); }); From de8a5b8987ffef2e590350627e0d974bda5f7ac0 Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Sat, 3 Aug 2024 13:38:06 -0400 Subject: [PATCH 232/270] start clowning around encounter --- src/battle-scene.ts | 2 +- .../encounters/clowing-around-encounter.ts | 181 ++++++++++++++++++ .../mystery-encounters/mystery-encounters.ts | 7 +- .../utils/encounter-phase-utils.ts | 14 +- src/enums/mystery-encounter-type.ts | 3 +- src/locales/en/mystery-encounter.ts | 4 +- .../clowning-around-dialogue.ts | 33 ++++ src/overrides.ts | 4 +- 8 files changed, 239 insertions(+), 9 deletions(-) create mode 100644 src/data/mystery-encounters/encounters/clowing-around-encounter.ts create mode 100644 src/locales/en/mystery-encounters/clowning-around-dialogue.ts diff --git a/src/battle-scene.ts b/src/battle-scene.ts index 2b01b777a64..249ddebdd60 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -1430,7 +1430,7 @@ export default class BattleScene extends SceneBase { const wave = waveIndex || this.currentBattle?.waveIndex || 0; this.waveSeed = Utils.shiftCharCodes(this.seed, wave); Phaser.Math.RND.sow([ this.waveSeed ]); - // console.log("Wave Seed:", this.waveSeed, wave); + console.log("Wave Seed:", this.waveSeed, wave); this.rngCounter = 0; } diff --git a/src/data/mystery-encounters/encounters/clowing-around-encounter.ts b/src/data/mystery-encounters/encounters/clowing-around-encounter.ts new file mode 100644 index 00000000000..a3f1d78da89 --- /dev/null +++ b/src/data/mystery-encounters/encounters/clowing-around-encounter.ts @@ -0,0 +1,181 @@ +import { + EnemyPartyConfig, + initBattleWithEnemyConfig, + setEncounterRewards, +} from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { + trainerConfigs, + TrainerPartyCompoundTemplate, + TrainerPartyTemplate, +} from "#app/data/trainer-config"; +import { ModifierTier } from "#app/modifier/modifier-tier"; +import { modifierTypes } from "#app/modifier/modifier-type"; +import { MysteryEncounterType } from "#enums/mystery-encounter-type"; +import { PartyMemberStrength } from "#enums/party-member-strength"; +import BattleScene from "#app/battle-scene"; +import IMysteryEncounter, { MysteryEncounterBuilder } from "../mystery-encounter"; +import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; +import { Species } from "#enums/species"; +import { TrainerType } from "#enums/trainer-type"; +import { getPokemonSpecies } from "#app/data/pokemon-species"; + +/** the i18n namespace for the encounter */ +const namespace = "mysteryEncounter:clowningAround"; + +/** + * Clowning Around encounter. + * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/69 | GitHub Issue #69} + * @see For biome requirements check {@linkcode mysteryEncountersByBiome} + */ +export const ClowningAroundEncounter: IMysteryEncounter = + MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.CLOWNING_AROUND) + .withEncounterTier(MysteryEncounterTier.ULTRA) + .withSceneWaveRangeRequirement(10, 180) // waves 10 to 180 + .withIntroSpriteConfigs([ + { + spriteKey: Species.MR_MIME.toString(), + fileRoot: "pokemon", + hasShadow: true, + repeat: true, + x: -25, + tint: 0.3, + y: -3, + yShadow: -3 + }, + { + spriteKey: Species.BLACEPHALON.toString(), + fileRoot: "pokemon/exp", + hasShadow: true, + repeat: true, + x: 25, + tint: 0.3, + y: -3, + yShadow: -3 + }, + { + spriteKey: "harlequin", + fileRoot: "trainer", + hasShadow: true, + x: 0 + }, + ]) + .withIntroDialogue([ + { + text: `${namespace}.intro`, + }, + { + text: `${namespace}.intro_dialogue`, + speaker: `${namespace}.speaker` + }, + ]) + .withOnInit((scene: BattleScene) => { + const encounter = scene.currentBattle.mysteryEncounter; + + // Clown trainer is pulled from pool of boss trainers (gym leaders) for the biome + // They are given an E4 template team, so will be stronger than usual boss encounter and always have 6 mons + const clownTrainerType = TrainerType.HARLEQUIN; + const clownPartyTemplate = new TrainerPartyCompoundTemplate( + new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), + new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER), + new TrainerPartyTemplate(1, PartyMemberStrength.STRONG)); + const clownConfig = trainerConfigs[clownTrainerType].copy(); + clownConfig.setPartyTemplates(clownPartyTemplate); + clownConfig.partyTemplateFunc = null; // Overrides party template func + + encounter.enemyPartyConfigs.push({ + trainerConfig: clownConfig, + pokemonConfigs: [ // Overrides first 2 pokemon to be Mr. Mime and Blacephalon + { + species: getPokemonSpecies(Species.MR_MIME), + isBoss: false + }, + { + species: getPokemonSpecies(Species.BLACEPHALON), + isBoss: true + }, + ] + }); + + return true; + }) + .withTitle(`${namespace}.title`) + .withDescription(`${namespace}.description`) + .withQuery(`${namespace}.query`) + .withSimpleOption( + { + buttonLabel: `${namespace}.option.1.label`, + buttonTooltip: `${namespace}.option.1.tooltip`, + selected: [ + { + text: `${namespace}.option.selected`, + }, + ], + }, + async (scene: BattleScene) => { + const encounter = scene.currentBattle.mysteryEncounter; + // Spawn battle + const config: EnemyPartyConfig = encounter.enemyPartyConfigs[0]; + + setEncounterRewards(scene, { guaranteedModifierTypeFuncs: [modifierTypes.TM_COMMON, modifierTypes.TM_GREAT, modifierTypes.MEMORY_MUSHROOM], fillRemaining: true }); + await initBattleWithEnemyConfig(scene, config); + } + ) + .withSimpleOption( + { + buttonLabel: `${namespace}.option.2.label`, + buttonTooltip: `${namespace}.option.2.tooltip`, + selected: [ + { + text: `${namespace}.option.selected`, + }, + ], + }, + async (scene: BattleScene) => { + const encounter = scene.currentBattle.mysteryEncounter; + // Spawn hard fight with ULTRA/GREAT reward (can improve with luck) + const config: EnemyPartyConfig = encounter.enemyPartyConfigs[1]; + + setEncounterRewards(scene, { guaranteedModifierTiers: [ModifierTier.ULTRA, ModifierTier.ULTRA, ModifierTier.GREAT, ModifierTier.GREAT], fillRemaining: true }); + + // Seed offsets to remove possibility of different trainers having exact same teams + let ret; + scene.executeWithSeedOffset(() => { + ret = initBattleWithEnemyConfig(scene, config); + }, scene.currentBattle.waveIndex * 100); + return ret; + } + ) + .withSimpleOption( + { + buttonLabel: `${namespace}.option.3.label`, + buttonTooltip: `${namespace}.option.3.tooltip`, + selected: [ + { + text: `${namespace}.option.selected`, + }, + ], + }, + async (scene: BattleScene) => { + const encounter = scene.currentBattle.mysteryEncounter; + // Spawn brutal fight with ROGUE/ULTRA/GREAT reward (can improve with luck) + const config: EnemyPartyConfig = encounter.enemyPartyConfigs[2]; + + // To avoid player level snowballing from picking this option + encounter.expMultiplier = 0.9; + + setEncounterRewards(scene, { guaranteedModifierTiers: [ModifierTier.ROGUE, ModifierTier.ROGUE, ModifierTier.ULTRA, ModifierTier.GREAT], fillRemaining: true }); + + // Seed offsets to remove possibility of different trainers having exact same teams + let ret; + scene.executeWithSeedOffset(() => { + ret = initBattleWithEnemyConfig(scene, config); + }, scene.currentBattle.waveIndex * 1000); + return ret; + } + ) + .withOutroDialogue([ + { + text: `${namespace}.outro`, + }, + ]) + .build(); diff --git a/src/data/mystery-encounters/mystery-encounters.ts b/src/data/mystery-encounters/mystery-encounters.ts index 6d49e6d014f..53cf834dcad 100644 --- a/src/data/mystery-encounters/mystery-encounters.ts +++ b/src/data/mystery-encounters/mystery-encounters.ts @@ -21,6 +21,7 @@ import { AbsoluteAvariceEncounter } from "#app/data/mystery-encounters/encounter import { ATrainersTestEncounter } from "#app/data/mystery-encounters/encounters/a-trainers-test-encounter"; import { TrashToTreasureEncounter } from "#app/data/mystery-encounters/encounters/trash-to-treasure-encounter"; import { BerriesAboundEncounter } from "#app/data/mystery-encounters/encounters/berries-abound-encounter"; +import { ClowningAroundEncounter } from "#app/data/mystery-encounters/encounters/clowing-around-encounter"; // Spawn chance: (BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT + WIGHT_INCREMENT_ON_SPAWN_MISS * ) / 256 export const BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT = 1; @@ -141,7 +142,7 @@ const humanTransitableBiomeEncounters: MysteryEncounterType[] = [ MysteryEncounterType.MYSTERIOUS_CHALLENGERS, MysteryEncounterType.SHADY_VITAMIN_DEALER, MysteryEncounterType.THE_POKEMON_SALESMAN, - MysteryEncounterType.AN_OFFER_YOU_CANT_REFUSE + MysteryEncounterType.AN_OFFER_YOU_CANT_REFUSE, ]; const civilizationBiomeEncounters: MysteryEncounterType[] = [ @@ -159,7 +160,8 @@ const anyBiomeEncounters: MysteryEncounterType[] = [ MysteryEncounterType.DELIBIRDY, MysteryEncounterType.A_TRAINERS_TEST, MysteryEncounterType.TRASH_TO_TREASURE, - MysteryEncounterType.BERRIES_ABOUND + MysteryEncounterType.BERRIES_ABOUND, + MysteryEncounterType.CLOWNING_AROUND ]; /** @@ -249,6 +251,7 @@ export function initMysteryEncounters() { allMysteryEncounters[MysteryEncounterType.A_TRAINERS_TEST] = ATrainersTestEncounter; allMysteryEncounters[MysteryEncounterType.TRASH_TO_TREASURE] = TrashToTreasureEncounter; allMysteryEncounters[MysteryEncounterType.BERRIES_ABOUND] = BerriesAboundEncounter; + allMysteryEncounters[MysteryEncounterType.CLOWNING_AROUND] = ClowningAroundEncounter; // Add extreme encounters to biome map extremeBiomeEncounters.forEach(encounter => { diff --git a/src/data/mystery-encounters/utils/encounter-phase-utils.ts b/src/data/mystery-encounters/utils/encounter-phase-utils.ts index ed050f6eb77..c166f287030 100644 --- a/src/data/mystery-encounters/utils/encounter-phase-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-phase-utils.ts @@ -12,6 +12,7 @@ import PokemonData from "#app/system/pokemon-data"; import { OptionSelectConfig, OptionSelectItem } from "#app/ui/abstact-option-select-ui-handler"; import { PartyOption, PartyUiMode } from "#app/ui/party-ui-handler"; import { Mode } from "#app/ui/ui"; +import * as Utils from "#app/utils"; import { isNullOrUndefined } from "#app/utils"; import { BattlerTagType } from "#enums/battler-tag-type"; import { Biome } from "#enums/biome"; @@ -19,7 +20,6 @@ import { TrainerType } from "#enums/trainer-type"; import i18next from "i18next"; import BattleScene from "#app/battle-scene"; import Trainer, { TrainerVariant } from "#app/field/trainer"; -import * as Utils from "#app/utils"; import { Gender } from "#app/data/gender"; import { Nature } from "#app/data/nature"; import { Moves } from "#enums/moves"; @@ -152,7 +152,17 @@ export async function initBattleWithEnemyConfig(scene: BattleScene, partyConfig: let isBoss = false; if (!loaded) { if (trainerType || trainerConfig) { - battle.enemyParty[e] = battle.trainer.genPartyMember(e); + // Allows overriding a trainer's pokemon to use specific species/data + if (e < partyConfig?.pokemonConfigs?.length) { + const config = partyConfig?.pokemonConfigs?.[e]; + level = config.level ? config.level : level; + dataSource = config.dataSource; + enemySpecies = config.species; + isBoss = config.isBoss; + battle.enemyParty[e] = scene.addEnemyPokemon(enemySpecies, level, TrainerSlot.TRAINER, isBoss, dataSource); + } else { + battle.enemyParty[e] = battle.trainer.genPartyMember(e); + } } else { if (e < partyConfig?.pokemonConfigs?.length) { const config = partyConfig?.pokemonConfigs?.[e]; diff --git a/src/enums/mystery-encounter-type.ts b/src/enums/mystery-encounter-type.ts index 6cf2c1b4fb2..d82a0075d46 100644 --- a/src/enums/mystery-encounter-type.ts +++ b/src/enums/mystery-encounter-type.ts @@ -18,5 +18,6 @@ export enum MysteryEncounterType { ABSOLUTE_AVARICE, A_TRAINERS_TEST, TRASH_TO_TREASURE, - BERRIES_ABOUND + BERRIES_ABOUND, + CLOWNING_AROUND } diff --git a/src/locales/en/mystery-encounter.ts b/src/locales/en/mystery-encounter.ts index 099802a5f53..11e6887b3e0 100644 --- a/src/locales/en/mystery-encounter.ts +++ b/src/locales/en/mystery-encounter.ts @@ -18,6 +18,7 @@ import { absoluteAvariceDialogue } from "#app/locales/en/mystery-encounters/abso import { aTrainersTestDialogue } from "#app/locales/en/mystery-encounters/a-trainers-test-dialogue"; import { trashToTreasureDialogue } from "#app/locales/en/mystery-encounters/trash-to-treasure-dialogue"; import { berriesAboundDialogue } from "#app/locales/en/mystery-encounters/berries-abound-dialogue"; +import { clowningAroundDialogue } from "#app/locales/en/mystery-encounters/clowning-around-dialogue"; /** * Patterns that can be used: @@ -60,5 +61,6 @@ export const mysteryEncounter = { absoluteAvarice: absoluteAvariceDialogue, aTrainersTest: aTrainersTestDialogue, trashToTreasure: trashToTreasureDialogue, - berriesAbound: berriesAboundDialogue + berriesAbound: berriesAboundDialogue, + clowningAround: clowningAroundDialogue } as const; diff --git a/src/locales/en/mystery-encounters/clowning-around-dialogue.ts b/src/locales/en/mystery-encounters/clowning-around-dialogue.ts new file mode 100644 index 00000000000..4b70c39eefb --- /dev/null +++ b/src/locales/en/mystery-encounters/clowning-around-dialogue.ts @@ -0,0 +1,33 @@ +export const clowningAroundDialogue = { + intro: "It's...@d{64} a clown?", + speaker: "Clown", + intro_dialogue: `Bumbling buffoon,\nbrace for a brilliant battle! + $You’ll be beaten by this brawling busker!\nBring it!`, + title: "Clowning Around", + description: "The clown seems eager to goad you into a battle, but to what end?\n\nSomething is off about this encounter.", + query: "What will you do?", + option: { + 1: { + label: "Battle the Clown", + tooltip: "(-) Strange Battle\n(?) Affects Pokémon Abilities", + selected: "Your pitiful Pokémon are poised for a pathetic performance!" + }, + 2: { + label: "Remain Unprovoked", + tooltip: "(-) Upsets the Clown\n(?) Affects Pokémon Items", + selected: "Dismal dodger, you deny a delightful duel?\nFeel my fury!", + selected_2: `The clown's Blacephalon uses Trick! + All of your {{switchPokemon}}'s items were randomly swapped!`, + selected_3: "Flustered fool, fall for my flawless deception!", + }, + 3: { + label: "Return the Insults", + tooltip: "(-) Upsets the Clown\n(?) Affects Pokémon Types", + selected: "I'm appalled at your absurd antics!\nTaste my temper!", + selected_2: `The clown's Blacephalon uses\na move you've never seen before! + All of your team's types were randomly swapped!`, + selected_3: "Flustered fool, fall for my flawless deception!", + }, + }, + outro: "The clown and his cohorts\ndisappear in a puff of smoke." +}; diff --git a/src/overrides.ts b/src/overrides.ts index 1196797fac0..8e83692925d 100644 --- a/src/overrides.ts +++ b/src/overrides.ts @@ -127,9 +127,9 @@ class DefaultOverrides { // ------------------------- // 1 to 256, set to null to ignore - readonly MYSTERY_ENCOUNTER_RATE_OVERRIDE: number = null; + readonly MYSTERY_ENCOUNTER_RATE_OVERRIDE: number = 256; readonly MYSTERY_ENCOUNTER_TIER_OVERRIDE: MysteryEncounterTier = null; - readonly MYSTERY_ENCOUNTER_OVERRIDE: MysteryEncounterType = null; + readonly MYSTERY_ENCOUNTER_OVERRIDE: MysteryEncounterType = MysteryEncounterType.CLOWNING_AROUND; // ------------------------- // MODIFIER / ITEM OVERRIDES From afe101509404b2100f3457a5dda659cf2d526d37 Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Mon, 5 Aug 2024 16:14:05 -0400 Subject: [PATCH 233/270] first implementation pass at clowning around --- .../battle-anims/encounter-smokescreen.json | 1694 +++++++++++++++++ src/data/battle-anims.ts | 9 +- .../an-offer-you-cant-refuse-encounter.ts | 2 +- .../encounters/clowing-around-encounter.ts | 181 -- .../encounters/clowning-around-encounter.ts | 469 +++++ .../encounters/dark-deal-encounter.ts | 2 +- .../encounters/field-trip-encounter.ts | 6 +- .../encounters/fiery-fallout-encounter.ts | 4 +- .../encounters/mysterious-chest-encounter.ts | 2 +- .../the-pokemon-salesman-encounter.ts | 2 +- .../encounters/the-strong-stuff-encounter.ts | 5 +- .../mystery-encounter-pokemon-data.ts | 16 + .../mystery-encounters/mystery-encounter.ts | 8 +- .../mystery-encounters/mystery-encounters.ts | 2 +- .../utils/encounter-phase-utils.ts | 28 +- .../utils/encounter-pokemon-utils.ts | 14 +- src/enums/battler-tag-type.ts | 2 +- src/field/pokemon.ts | 16 +- .../clowning-around-dialogue.ts | 19 +- src/overrides.ts | 4 +- src/phases.ts | 2 +- src/system/pokemon-data.ts | 11 + 22 files changed, 2265 insertions(+), 233 deletions(-) create mode 100644 public/battle-anims/encounter-smokescreen.json delete mode 100644 src/data/mystery-encounters/encounters/clowing-around-encounter.ts create mode 100644 src/data/mystery-encounters/encounters/clowning-around-encounter.ts create mode 100644 src/data/mystery-encounters/mystery-encounter-pokemon-data.ts diff --git a/public/battle-anims/encounter-smokescreen.json b/public/battle-anims/encounter-smokescreen.json new file mode 100644 index 00000000000..00e552dc503 --- /dev/null +++ b/public/battle-anims/encounter-smokescreen.json @@ -0,0 +1,1694 @@ +{ + "graphic": "PRAS- Smokescreen", + "frames": [ + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": -1, + "focus": 3 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": -1, + "focus": 3 + }, + { + "x": 15.5, + "y": 12.5, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 0, + "opacity": 100, + "priority": -1, + "focus": 2 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": -1, + "focus": 3 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": -1, + "focus": 3 + }, + { + "x": 15.5, + "y": 8.5, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 0, + "opacity": 150, + "priority": -1, + "focus": 2 + }, + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 8, + "opacity": 50, + "priority": -1, + "focus": 2 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": -1, + "focus": 3 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": -1, + "focus": 3 + }, + { + "x": 15.5, + "y": 0.5, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 1, + "opacity": 150, + "priority": -1, + "focus": 2 + }, + { + "x": 0, + "y": -4, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 8, + "opacity": 100, + "priority": -1, + "focus": 2 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": -1, + "focus": 3 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": -1, + "focus": 3 + }, + { + "x": 15.5, + "y": -3.5, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 2, + "opacity": 150, + "priority": -1, + "focus": 2 + }, + { + "x": 0, + "y": -4, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 8, + "opacity": 150, + "priority": -1, + "focus": 2 + }, + { + "x": -11, + "y": 21.5, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 0, + "opacity": 50, + "priority": -1, + "focus": 2 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": -1, + "focus": 3 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": -1, + "focus": 3 + }, + { + "x": 15.5, + "y": -7.5, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 2, + "opacity": 150, + "priority": -1, + "focus": 2 + }, + { + "x": 0, + "y": -8, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 7, + "opacity": 150, + "priority": -1, + "focus": 2 + }, + { + "x": -11, + "y": 17.5, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 0, + "opacity": 100, + "priority": -1, + "focus": 2 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": -1, + "focus": 3 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": -1, + "focus": 3 + }, + { + "x": 15.5, + "y": -11.5, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 3, + "opacity": 150, + "priority": -1, + "focus": 2 + }, + { + "x": 0, + "y": -12, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 6, + "opacity": 150, + "priority": -1, + "focus": 2 + }, + { + "x": -11, + "y": 13.5, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 0, + "opacity": 150, + "priority": -1, + "focus": 2 + }, + { + "x": 11, + "y": 21, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 8, + "opacity": 50, + "priority": -1, + "focus": 2 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": -1, + "focus": 3 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": -1, + "focus": 3 + }, + { + "x": 15.5, + "y": -15.5, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 4, + "opacity": 150, + "priority": -1, + "focus": 2 + }, + { + "x": 0, + "y": -16, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 6, + "opacity": 150, + "priority": -1, + "focus": 2 + }, + { + "x": -11, + "y": 5.5, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 1, + "opacity": 150, + "priority": -1, + "focus": 2 + }, + { + "x": 11, + "y": 17, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 8, + "opacity": 100, + "priority": -1, + "focus": 2 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": -1, + "focus": 3 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": -1, + "focus": 3 + }, + { + "x": 15.5, + "y": -19.5, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 4, + "opacity": 100, + "priority": -1, + "focus": 2 + }, + { + "x": 0, + "y": -20, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 5, + "opacity": 150, + "priority": -1, + "focus": 2 + }, + { + "x": -11, + "y": 0.5, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 2, + "opacity": 150, + "priority": -1, + "focus": 2 + }, + { + "x": 11, + "y": 13, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 8, + "opacity": 150, + "priority": -1, + "focus": 2 + }, + { + "x": -12.5, + "y": 8.5, + "zoomX": 100, + "zoomY": 100, + "mirror": true, + "visible": true, + "target": 2, + "graphicFrame": 8, + "opacity": 50, + "priority": -1, + "focus": 2 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": -1, + "focus": 3 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": -1, + "focus": 3 + }, + { + "x": 15.5, + "y": -23.5, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 4, + "opacity": 50, + "priority": -1, + "focus": 2 + }, + { + "x": 0, + "y": -24, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 5, + "opacity": 150, + "priority": -1, + "focus": 2 + }, + { + "x": -11, + "y": -2.5, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 2, + "opacity": 150, + "priority": -1, + "focus": 2 + }, + { + "x": 11, + "y": 9, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 7, + "opacity": 150, + "priority": -1, + "focus": 2 + }, + { + "x": -12.5, + "y": 4.5, + "zoomX": 100, + "zoomY": 100, + "mirror": true, + "visible": true, + "target": 2, + "graphicFrame": 8, + "opacity": 100, + "priority": -1, + "focus": 2 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": -1, + "focus": 3 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": -1, + "focus": 3 + }, + { + "x": -11, + "y": -6.5, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 3, + "opacity": 150, + "priority": -1, + "focus": 2 + }, + { + "x": 0, + "y": -28, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 4, + "opacity": 150, + "priority": -1, + "focus": 2 + }, + { + "x": 11, + "y": 5, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 6, + "opacity": 150, + "priority": -1, + "focus": 2 + }, + { + "x": -12.5, + "y": 0.5, + "zoomX": 100, + "zoomY": 100, + "mirror": true, + "visible": true, + "target": 2, + "graphicFrame": 8, + "opacity": 150, + "priority": -1, + "focus": 2 + }, + { + "x": 4.5, + "y": 23, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 0, + "opacity": 50, + "priority": -1, + "focus": 2 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": -1, + "focus": 3 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": -1, + "focus": 3 + }, + { + "x": -11, + "y": -10.5, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 4, + "opacity": 150, + "priority": -1, + "focus": 2 + }, + { + "x": 0, + "y": -32, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 4, + "opacity": 100, + "priority": -1, + "focus": 2 + }, + { + "x": 11, + "y": 1, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 6, + "opacity": 150, + "priority": -1, + "focus": 2 + }, + { + "x": -12.5, + "y": -3.5, + "zoomX": 100, + "zoomY": 100, + "mirror": true, + "visible": true, + "target": 2, + "graphicFrame": 7, + "opacity": 150, + "priority": -1, + "focus": 2 + }, + { + "x": 4.5, + "y": 19, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 0, + "opacity": 100, + "priority": -1, + "focus": 2 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": -1, + "focus": 3 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": -1, + "focus": 3 + }, + { + "x": -11, + "y": -14.5, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 4, + "opacity": 100, + "priority": -1, + "focus": 2 + }, + { + "x": 0, + "y": -36, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 4, + "opacity": 50, + "priority": -1, + "focus": 2 + }, + { + "x": 11, + "y": -3, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 5, + "opacity": 150, + "priority": -1, + "focus": 2 + }, + { + "x": -12.5, + "y": -7.5, + "zoomX": 100, + "zoomY": 100, + "mirror": true, + "visible": true, + "target": 2, + "graphicFrame": 6, + "opacity": 150, + "priority": -1, + "focus": 2 + }, + { + "x": 4.5, + "y": 15, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 0, + "opacity": 150, + "priority": -1, + "focus": 2 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": -1, + "focus": 3 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": -1, + "focus": 3 + }, + { + "x": -11, + "y": -18.5, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 4, + "opacity": 50, + "priority": -1, + "focus": 2 + }, + { + "x": 11, + "y": -7, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 4, + "opacity": 150, + "priority": -1, + "focus": 2 + }, + { + "x": -12.5, + "y": -11.5, + "zoomX": 100, + "zoomY": 100, + "mirror": true, + "visible": true, + "target": 2, + "graphicFrame": 6, + "opacity": 150, + "priority": -1, + "focus": 2 + }, + { + "x": 4.5, + "y": 7, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 1, + "opacity": 150, + "priority": -1, + "focus": 2 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": -1, + "focus": 3 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": -1, + "focus": 3 + }, + { + "x": -12.5, + "y": -15.5, + "zoomX": 100, + "zoomY": 100, + "mirror": true, + "visible": true, + "target": 2, + "graphicFrame": 5, + "opacity": 150, + "priority": -1, + "focus": 2 + }, + { + "x": 11, + "y": -11, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 4, + "opacity": 100, + "priority": -1, + "focus": 2 + }, + { + "x": 4.5, + "y": 3, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 2, + "opacity": 150, + "priority": -1, + "focus": 2 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": -1, + "focus": 3 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": -1, + "focus": 3 + }, + { + "x": -12.5, + "y": -19.5, + "zoomX": 100, + "zoomY": 100, + "mirror": true, + "visible": true, + "target": 2, + "graphicFrame": 5, + "opacity": 100, + "priority": -1, + "focus": 2 + }, + { + "x": 11, + "y": -15, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 4, + "opacity": 50, + "priority": -1, + "focus": 2 + }, + { + "x": 4.5, + "y": -1, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 2, + "opacity": 150, + "priority": -1, + "focus": 2 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": -1, + "focus": 3 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": -1, + "focus": 3 + }, + { + "x": -12.5, + "y": -23.5, + "zoomX": 100, + "zoomY": 100, + "mirror": true, + "visible": true, + "target": 2, + "graphicFrame": 5, + "opacity": 50, + "priority": -1, + "focus": 2 + }, + { + "x": 4.5, + "y": -5, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 3, + "opacity": 150, + "priority": -1, + "focus": 2 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": -1, + "focus": 3 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": -1, + "focus": 3 + }, + { + "x": 4.5, + "y": -9, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 4, + "opacity": 150, + "priority": -1, + "focus": 2 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": -1, + "focus": 3 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": -1, + "focus": 3 + }, + { + "x": 4.5, + "y": -13, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 4, + "opacity": 100, + "priority": -1, + "focus": 2 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": -1, + "focus": 3 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": -1, + "focus": 3 + }, + { + "x": 4.5, + "y": -17, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 2, + "graphicFrame": 4, + "opacity": 50, + "priority": -1, + "focus": 2 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": -1, + "focus": 3 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": -1, + "focus": 3 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": -1, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": -1, + "focus": 1 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": -1, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": -1, + "focus": 1 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": -1, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": -1, + "focus": 1 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": -1, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": -1, + "focus": 1 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": -1, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": -1, + "focus": 1 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": -1, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": -1, + "focus": 1 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": -1, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": -1, + "focus": 1 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": -1, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": -1, + "focus": 1 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": -1, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": -1, + "focus": 1 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": -1, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": -1, + "focus": 1 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": -1, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": -1, + "focus": 1 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": -1, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": -1, + "focus": 1 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": -1, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": -1, + "focus": 1 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": -1, + "focus": 2 + }, + { + "x": 128, + "y": -64, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 1, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": -1, + "focus": 1 + } + ] + ], + "frameTimedEvents": { + "0": [ + { + "frameIndex": 0, + "resourceName": "PRSFX- Haze.wav", + "volume": 100, + "pitch": 85, + "eventType": "AnimTimedSoundEvent" + }, + { + "frameIndex": 0, + "resourceName": "Explosion1.m4a", + "volume": 100, + "pitch": 85, + "eventType": "AnimTimedSoundEvent" + } + ] + }, + "position": 2, + "hue": 0 +} \ No newline at end of file diff --git a/src/data/battle-anims.ts b/src/data/battle-anims.ts index 6f2f293d099..6af8fedae8a 100644 --- a/src/data/battle-anims.ts +++ b/src/data/battle-anims.ts @@ -110,7 +110,8 @@ export enum CommonAnim { */ export enum EncounterAnim { MAGMA_BG, - MAGMA_SPOUT + MAGMA_SPOUT, + SMOKESCREEN } export class AnimConfig { @@ -533,16 +534,16 @@ export function initMoveAnim(scene: BattleScene, move: Moves): Promise { export async function initEncounterAnims(scene: BattleScene, encounterAnim: EncounterAnim | EncounterAnim[]): Promise { const anims = Array.isArray(encounterAnim) ? encounterAnim : [encounterAnim]; const encounterAnimNames = Utils.getEnumKeys(EncounterAnim); - const encounterAnimIds = Utils.getEnumValues(EncounterAnim); + // const encounterAnimIds = Utils.getEnumValues(EncounterAnim); const encounterAnimFetches = []; for (const anim of anims) { if (encounterAnims.has(anim) && !isNullOrUndefined(encounterAnims.get(anim))) { continue; } - const encounterAnimId = encounterAnimIds[anim]; + // const encounterAnimId = encounterAnimIds[anim]; encounterAnimFetches.push(scene.cachedFetch(`./battle-anims/encounter-${encounterAnimNames[anim].toLowerCase().replace(/\_/g, "-")}.json`) .then(response => response.json()) - .then(cas => encounterAnims.set(encounterAnimId, new AnimConfig(cas)))); + .then(cas => encounterAnims.set(anim, new AnimConfig(cas)))); } await Promise.allSettled(encounterAnimFetches); } 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 0bf3145ea7e..8eabbbd8d05 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 @@ -62,7 +62,7 @@ export const AnOfferYouCantRefuseEncounter: IMysteryEncounter = const pokemon = getHighestStatTotalPlayerPokemon(scene, false); const price = scene.getWaveMoneyAmount(10); - encounter.setDialogueToken("strongestPokemon", pokemon.name); + encounter.setDialogueToken("strongestPokemon", pokemon.getNameToRender()); encounter.setDialogueToken("price", price.toString()); // Store pokemon and price diff --git a/src/data/mystery-encounters/encounters/clowing-around-encounter.ts b/src/data/mystery-encounters/encounters/clowing-around-encounter.ts deleted file mode 100644 index a3f1d78da89..00000000000 --- a/src/data/mystery-encounters/encounters/clowing-around-encounter.ts +++ /dev/null @@ -1,181 +0,0 @@ -import { - EnemyPartyConfig, - initBattleWithEnemyConfig, - setEncounterRewards, -} from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import { - trainerConfigs, - TrainerPartyCompoundTemplate, - TrainerPartyTemplate, -} from "#app/data/trainer-config"; -import { ModifierTier } from "#app/modifier/modifier-tier"; -import { modifierTypes } from "#app/modifier/modifier-type"; -import { MysteryEncounterType } from "#enums/mystery-encounter-type"; -import { PartyMemberStrength } from "#enums/party-member-strength"; -import BattleScene from "#app/battle-scene"; -import IMysteryEncounter, { MysteryEncounterBuilder } from "../mystery-encounter"; -import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; -import { Species } from "#enums/species"; -import { TrainerType } from "#enums/trainer-type"; -import { getPokemonSpecies } from "#app/data/pokemon-species"; - -/** the i18n namespace for the encounter */ -const namespace = "mysteryEncounter:clowningAround"; - -/** - * Clowning Around encounter. - * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/69 | GitHub Issue #69} - * @see For biome requirements check {@linkcode mysteryEncountersByBiome} - */ -export const ClowningAroundEncounter: IMysteryEncounter = - MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.CLOWNING_AROUND) - .withEncounterTier(MysteryEncounterTier.ULTRA) - .withSceneWaveRangeRequirement(10, 180) // waves 10 to 180 - .withIntroSpriteConfigs([ - { - spriteKey: Species.MR_MIME.toString(), - fileRoot: "pokemon", - hasShadow: true, - repeat: true, - x: -25, - tint: 0.3, - y: -3, - yShadow: -3 - }, - { - spriteKey: Species.BLACEPHALON.toString(), - fileRoot: "pokemon/exp", - hasShadow: true, - repeat: true, - x: 25, - tint: 0.3, - y: -3, - yShadow: -3 - }, - { - spriteKey: "harlequin", - fileRoot: "trainer", - hasShadow: true, - x: 0 - }, - ]) - .withIntroDialogue([ - { - text: `${namespace}.intro`, - }, - { - text: `${namespace}.intro_dialogue`, - speaker: `${namespace}.speaker` - }, - ]) - .withOnInit((scene: BattleScene) => { - const encounter = scene.currentBattle.mysteryEncounter; - - // Clown trainer is pulled from pool of boss trainers (gym leaders) for the biome - // They are given an E4 template team, so will be stronger than usual boss encounter and always have 6 mons - const clownTrainerType = TrainerType.HARLEQUIN; - const clownPartyTemplate = new TrainerPartyCompoundTemplate( - new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), - new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER), - new TrainerPartyTemplate(1, PartyMemberStrength.STRONG)); - const clownConfig = trainerConfigs[clownTrainerType].copy(); - clownConfig.setPartyTemplates(clownPartyTemplate); - clownConfig.partyTemplateFunc = null; // Overrides party template func - - encounter.enemyPartyConfigs.push({ - trainerConfig: clownConfig, - pokemonConfigs: [ // Overrides first 2 pokemon to be Mr. Mime and Blacephalon - { - species: getPokemonSpecies(Species.MR_MIME), - isBoss: false - }, - { - species: getPokemonSpecies(Species.BLACEPHALON), - isBoss: true - }, - ] - }); - - return true; - }) - .withTitle(`${namespace}.title`) - .withDescription(`${namespace}.description`) - .withQuery(`${namespace}.query`) - .withSimpleOption( - { - buttonLabel: `${namespace}.option.1.label`, - buttonTooltip: `${namespace}.option.1.tooltip`, - selected: [ - { - text: `${namespace}.option.selected`, - }, - ], - }, - async (scene: BattleScene) => { - const encounter = scene.currentBattle.mysteryEncounter; - // Spawn battle - const config: EnemyPartyConfig = encounter.enemyPartyConfigs[0]; - - setEncounterRewards(scene, { guaranteedModifierTypeFuncs: [modifierTypes.TM_COMMON, modifierTypes.TM_GREAT, modifierTypes.MEMORY_MUSHROOM], fillRemaining: true }); - await initBattleWithEnemyConfig(scene, config); - } - ) - .withSimpleOption( - { - buttonLabel: `${namespace}.option.2.label`, - buttonTooltip: `${namespace}.option.2.tooltip`, - selected: [ - { - text: `${namespace}.option.selected`, - }, - ], - }, - async (scene: BattleScene) => { - const encounter = scene.currentBattle.mysteryEncounter; - // Spawn hard fight with ULTRA/GREAT reward (can improve with luck) - const config: EnemyPartyConfig = encounter.enemyPartyConfigs[1]; - - setEncounterRewards(scene, { guaranteedModifierTiers: [ModifierTier.ULTRA, ModifierTier.ULTRA, ModifierTier.GREAT, ModifierTier.GREAT], fillRemaining: true }); - - // Seed offsets to remove possibility of different trainers having exact same teams - let ret; - scene.executeWithSeedOffset(() => { - ret = initBattleWithEnemyConfig(scene, config); - }, scene.currentBattle.waveIndex * 100); - return ret; - } - ) - .withSimpleOption( - { - buttonLabel: `${namespace}.option.3.label`, - buttonTooltip: `${namespace}.option.3.tooltip`, - selected: [ - { - text: `${namespace}.option.selected`, - }, - ], - }, - async (scene: BattleScene) => { - const encounter = scene.currentBattle.mysteryEncounter; - // Spawn brutal fight with ROGUE/ULTRA/GREAT reward (can improve with luck) - const config: EnemyPartyConfig = encounter.enemyPartyConfigs[2]; - - // To avoid player level snowballing from picking this option - encounter.expMultiplier = 0.9; - - setEncounterRewards(scene, { guaranteedModifierTiers: [ModifierTier.ROGUE, ModifierTier.ROGUE, ModifierTier.ULTRA, ModifierTier.GREAT], fillRemaining: true }); - - // Seed offsets to remove possibility of different trainers having exact same teams - let ret; - scene.executeWithSeedOffset(() => { - ret = initBattleWithEnemyConfig(scene, config); - }, scene.currentBattle.waveIndex * 1000); - return ret; - } - ) - .withOutroDialogue([ - { - text: `${namespace}.outro`, - }, - ]) - .build(); diff --git a/src/data/mystery-encounters/encounters/clowning-around-encounter.ts b/src/data/mystery-encounters/encounters/clowning-around-encounter.ts new file mode 100644 index 00000000000..7f8f622c41f --- /dev/null +++ b/src/data/mystery-encounters/encounters/clowning-around-encounter.ts @@ -0,0 +1,469 @@ +import { EnemyPartyConfig, generateModifierTypeOption, initBattleWithEnemyConfig, leaveEncounterWithoutBattle, loadCustomMovesForEncounter, selectPokemonForOption, setEncounterRewards, transitionMysteryEncounterIntroVisuals, } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { trainerConfigs, TrainerPartyCompoundTemplate, TrainerPartyTemplate, } from "#app/data/trainer-config"; +import { ModifierTier } from "#app/modifier/modifier-tier"; +import { BerryModifierType, modifierTypes, PokemonHeldItemModifierType } from "#app/modifier/modifier-type"; +import { MysteryEncounterType } from "#enums/mystery-encounter-type"; +import { PartyMemberStrength } from "#enums/party-member-strength"; +import BattleScene from "#app/battle-scene"; +import IMysteryEncounter, { MysteryEncounterBuilder } from "../mystery-encounter"; +import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; +import { Species } from "#enums/species"; +import { TrainerType } from "#enums/trainer-type"; +import { getPokemonSpecies } from "#app/data/pokemon-species"; +import { Abilities } from "#enums/abilities"; +import { applyModifierTypeToPlayerPokemon } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; +import { Type } from "#app/data/type"; +import { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; +import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; +import { randSeedInt, randSeedShuffle } from "#app/utils"; +import { showEncounterDialogue, showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; +import { Mode } from "#app/ui/ui"; +import i18next from "i18next"; +import { OptionSelectConfig } from "#app/ui/abstact-option-select-ui-handler"; +import { PlayerPokemon, PokemonMove } from "#app/field/pokemon"; +import { Ability } from "#app/data/ability"; +import { BerryModifier } from "#app/modifier/modifier"; +import { BerryType } from "#enums/berry-type"; +import { BattlerIndex } from "#app/battle"; +import { Moves } from "#enums/moves"; +import { EncounterAnim, EncounterBattleAnim } from "#app/data/battle-anims"; +import { MoveCategory } from "#app/data/move"; +import { MysteryEncounterPokemonData } from "#app/data/mystery-encounters/mystery-encounter-pokemon-data"; + +/** the i18n namespace for the encounter */ +const namespace = "mysteryEncounter:clowningAround"; + +const RANDOM_ABILITY_POOL = [ + Abilities.STURDY, + Abilities.PICKUP, + Abilities.INTIMIDATE, + Abilities.GUTS, + Abilities.DROUGHT, + Abilities.DRIZZLE, + Abilities.SNOW_WARNING, + Abilities.SAND_STREAM, + Abilities.ELECTRIC_SURGE, + Abilities.PSYCHIC_SURGE, + Abilities.GRASSY_SURGE, + Abilities.MISTY_SURGE, + Abilities.MAGICIAN, + Abilities.SHEER_FORCE, + Abilities.PRANKSTER +]; + +/** + * Clowning Around encounter. + * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/69 | GitHub Issue #69} + * @see For biome requirements check {@linkcode mysteryEncountersByBiome} + */ +export const ClowningAroundEncounter: IMysteryEncounter = + MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.CLOWNING_AROUND) + .withEncounterTier(MysteryEncounterTier.ULTRA) + .withSceneWaveRangeRequirement(80, 180) + .withAnimations(EncounterAnim.SMOKESCREEN) + .withAutoHideIntroVisuals(false) + .withIntroSpriteConfigs([ + { + spriteKey: Species.MR_MIME.toString(), + fileRoot: "pokemon", + hasShadow: true, + repeat: true, + x: -25, + tint: 0.3, + y: -3, + yShadow: -3 + }, + { + spriteKey: Species.BLACEPHALON.toString(), + fileRoot: "pokemon/exp", + hasShadow: true, + repeat: true, + x: 25, + tint: 0.3, + y: -3, + yShadow: -3 + }, + { + spriteKey: "harlequin", + fileRoot: "trainer", + hasShadow: true, + x: 0, + y: 2, + yShadow: 2 + }, + ]) + .withIntroDialogue([ + { + text: `${namespace}.intro`, + }, + { + text: `${namespace}.intro_dialogue`, + speaker: `${namespace}.speaker` + }, + ]) + .withOnInit((scene: BattleScene) => { + const encounter = scene.currentBattle.mysteryEncounter; + + // Clown trainer is pulled from pool of boss trainers (gym leaders) for the biome + // They are given an E4 template team, so will be stronger than usual boss encounter and always have 6 mons + const clownTrainerType = TrainerType.HARLEQUIN; + const clownPartyTemplate = new TrainerPartyCompoundTemplate( + new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), + new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER)); + const clownConfig = trainerConfigs[clownTrainerType].copy(); + clownConfig.setPartyTemplates(clownPartyTemplate); + clownConfig.setDoubleOnly(); + clownConfig.partyTemplateFunc = null; // Overrides party template func + + // Generate random ability for Blacephalon from pool + const ability = RANDOM_ABILITY_POOL[randSeedInt(RANDOM_ABILITY_POOL.length)]; + encounter.setDialogueToken("ability", new Ability(ability, 3).name); + encounter.misc = { ability }; + + encounter.enemyPartyConfigs.push({ + trainerConfig: clownConfig, + pokemonConfigs: [ // Overrides first 2 pokemon to be Mr. Mime and Blacephalon + { + species: getPokemonSpecies(Species.MR_MIME), + isBoss: true, + moveSet: [Moves.TEETER_DANCE, Moves.ALLY_SWITCH, Moves.DAZZLING_GLEAM, Moves.PSYCHIC] + }, + { // Blacephalon has the random ability from pool, and 2 entirely random types to fit with the theme of the encounter + species: getPokemonSpecies(Species.BLACEPHALON), + ability: ability, + mysteryEncounterData: new MysteryEncounterPokemonData(null, null, null, [randSeedInt(18), randSeedInt(18)]), + isBoss: true, + moveSet: [Moves.TRICK, Moves.HYPNOSIS, Moves.SHADOW_BALL, Moves.MIND_BLOWN] + }, + ], + doubleBattle: true + }); + + // Load animations/sfx for start of fight moves + loadCustomMovesForEncounter(scene, [Moves.ROLE_PLAY, Moves.TAUNT]); + + // These have to be defined at runtime so that modifierTypes exist + encounter.misc.RANDOM_ULTRA_POOL = [ + modifierTypes.REVIVER_SEED, + modifierTypes.GOLDEN_PUNCH, + modifierTypes.ATTACK_TYPE_BOOSTER, + modifierTypes.QUICK_CLAW, + modifierTypes.WIDE_LENS, + modifierTypes.WHITE_HERB + ]; + + encounter.misc.RANDOM_ROGUE_POOL = [ + modifierTypes.LEFTOVERS, + modifierTypes.SHELL_BELL, + modifierTypes.SOUL_DEW, + modifierTypes.SOOTHE_BELL, + modifierTypes.SCOPE_LENS, + modifierTypes.BATON, + modifierTypes.FOCUS_BAND, + modifierTypes.KINGS_ROCK, + modifierTypes.GRIP_CLAW + ]; + + return true; + }) + .withTitle(`${namespace}.title`) + .withDescription(`${namespace}.description`) + .withQuery(`${namespace}.query`) + .withOption( + new MysteryEncounterOptionBuilder() + .withOptionMode(MysteryEncounterOptionMode.DEFAULT) + .withDialogue({ + buttonLabel: `${namespace}.option.1.label`, + buttonTooltip: `${namespace}.option.1.tooltip`, + selected: [ + { + text: `${namespace}.option.1.selected`, + speaker: `${namespace}.speaker` + }, + ], + }) + .withOptionPhase(async (scene: BattleScene) => { + const encounter = scene.currentBattle.mysteryEncounter; + // Spawn battle + const config: EnemyPartyConfig = encounter.enemyPartyConfigs[0]; + + setEncounterRewards(scene, { guaranteedModifierTypeFuncs: [modifierTypes.TM_COMMON, modifierTypes.TM_GREAT, modifierTypes.MEMORY_MUSHROOM], fillRemaining: true }); + + // TODO: when Magic Room and Wonder Room are implemented, add those to start of battle + encounter.startOfBattleEffects.push( + { // Mr. Mime copies the Blacephalon's random ability + sourceBattlerIndex: BattlerIndex.ENEMY, + targets: [BattlerIndex.ENEMY_2], + move: new PokemonMove(Moves.ROLE_PLAY), + ignorePp: true + }, + { + sourceBattlerIndex: BattlerIndex.ENEMY_2, + targets: [BattlerIndex.PLAYER], + move: new PokemonMove(Moves.TAUNT), + ignorePp: true + }, + { + sourceBattlerIndex: BattlerIndex.ENEMY_2, + targets: [BattlerIndex.PLAYER_2], + move: new PokemonMove(Moves.TAUNT), + ignorePp: true + }); + + await transitionMysteryEncounterIntroVisuals(scene); + await initBattleWithEnemyConfig(scene, config); + }) + .withPostOptionPhase(async (scene: BattleScene): Promise => { + // After the battle, offer the player the opportunity to permanently swap ability + const abilityWasSwapped = await handleSwapAbility(scene); + if (abilityWasSwapped) { + await scene.ui.setMode(Mode.MESSAGE); + await showEncounterText(scene, `${namespace}.option.1.ability_gained`); + } + + // Play animations once ability swap is complete + // Trainer sprite that is shown at end of battle is not the same as mystery encounter intro visuals + scene.tweens.add({ + targets: scene.currentBattle.trainer, + x: "+=16", + y: "-=16", + alpha: 0, + ease: "Sine.easeInOut", + duration: 250 + }); + const background = new EncounterBattleAnim(EncounterAnim.SMOKESCREEN, scene.getPlayerPokemon(), scene.getPlayerPokemon()); + background.playWithoutTargets(scene, 230, 40, 2); + return true; + }) + .build() + ) + .withOption( + new MysteryEncounterOptionBuilder() + .withOptionMode(MysteryEncounterOptionMode.DEFAULT) + .withDialogue({ + buttonLabel: `${namespace}.option.2.label`, + buttonTooltip: `${namespace}.option.2.tooltip`, + selected: [ + { + text: `${namespace}.option.2.selected`, + speaker: `${namespace}.speaker` + }, + { + text: `${namespace}.option.2.selected_2`, + }, + { + text: `${namespace}.option.2.selected_3`, + speaker: `${namespace}.speaker` + }, + ], + }) + .withPreOptionPhase(async (scene: BattleScene) => { + // Swap player's items on pokemon with the most items + // Item comparisons look at whichever Pokemon has the greatest number of TRANSFERABLE, non-berry items + // So Vitamins, form change items, etc. are not included + const encounter = scene.currentBattle.mysteryEncounter; + + const party = scene.getParty(); + let mostHeldItemsPokemon = party[0]; + let count = mostHeldItemsPokemon.getHeldItems() + .filter(m => m.isTransferrable && !(m instanceof BerryModifier)) + .reduce((v, m) => v + m.stackCount, 0); + + party.forEach(pokemon => { + const nextCount = pokemon.getHeldItems() + .filter(m => m.isTransferrable && !(m instanceof BerryModifier)) + .reduce((v, m) => v + m.stackCount, 0); + if (nextCount > count) { + mostHeldItemsPokemon = pokemon; + count = nextCount; + } + }); + + encounter.setDialogueToken("switchPokemon", mostHeldItemsPokemon.getNameToRender()); + + const items = mostHeldItemsPokemon.getHeldItems(); + + // Shuffles Berries (if they have any) + const berries = items.filter(m => m instanceof BerryModifier); + + berries.forEach(berry => { + const stackCount = berry.stackCount; + scene.removeModifier(berry); + const newBerry = generateModifierTypeOption(scene, modifierTypes.BERRY, [randSeedInt(Object.keys(BerryType).filter(s => !isNaN(Number(s))).length) as BerryType]).type as BerryModifierType; + for (let i = 0; i < stackCount; i++) { + applyModifierTypeToPlayerPokemon(scene, mostHeldItemsPokemon, newBerry); + } + }); + + // Shuffle Transferable held items in the same tier (only shuffles Ultra and Rogue atm) + const transferableItems = items.filter(m => m.isTransferrable && !(m instanceof BerryModifier)); + + transferableItems.forEach(transferableItem => { + const stackCount = transferableItem.stackCount; + transferableItem.type.withTierFromPool(); + + // Lucky Eggs and other items that do not appear in item pools are treated as Ultra rarity + const tier = transferableItem.type.tier ?? ModifierTier.ULTRA; + + if (tier === ModifierTier.ULTRA) { + scene.removeModifier(transferableItem); + for (let i = 0; i < stackCount; i++) { + const newItemType = encounter.misc.RANDOM_ULTRA_POOL[randSeedInt(encounter.misc.RANDOM_ULTRA_POOL.length)]; + const newMod = generateModifierTypeOption(scene, newItemType).type as PokemonHeldItemModifierType; + applyModifierTypeToPlayerPokemon(scene, mostHeldItemsPokemon, newMod); + } + } else if (tier === ModifierTier.ROGUE) { + scene.removeModifier(transferableItem); + for (let i = 0; i < stackCount; i++) { + const newItemType = encounter.misc.RANDOM_ROGUE_POOL[randSeedInt(encounter.misc.RANDOM_ROGUE_POOL.length)]; + const newMod = generateModifierTypeOption(scene, newItemType).type as PokemonHeldItemModifierType; + applyModifierTypeToPlayerPokemon(scene, mostHeldItemsPokemon, newMod); + } + } + }); + + }) + .withOptionPhase(async (scene: BattleScene) => { + leaveEncounterWithoutBattle(scene, true); + }) + .withPostOptionPhase(async (scene: BattleScene) => { + // Play animations + const background = new EncounterBattleAnim(EncounterAnim.SMOKESCREEN, scene.getPlayerPokemon(), scene.getPlayerPokemon()); + background.playWithoutTargets(scene, 230, 40, 2); + await transitionMysteryEncounterIntroVisuals(scene); + }) + .build() + ) + .withOption( + new MysteryEncounterOptionBuilder() + .withOptionMode(MysteryEncounterOptionMode.DEFAULT) + .withDialogue({ + buttonLabel: `${namespace}.option.3.label`, + buttonTooltip: `${namespace}.option.3.tooltip`, + selected: [ + { + text: `${namespace}.option.3.selected`, + speaker: `${namespace}.speaker` + }, + { + text: `${namespace}.option.3.selected_2`, + }, + { + text: `${namespace}.option.3.selected_3`, + speaker: `${namespace}.speaker` + }, + ], + }) + .withPreOptionPhase(async (scene: BattleScene) => { + // Swap player's types on all party pokemon + // If a Pokemon had a single type prior, they will still have a single type after + for (const pokemon of scene.getParty()) { + const originalTypes = pokemon.getTypes(false, false, true); + + // If the Pokemon has non-status moves that don't match the Pokemon's type, prioritizes those as the new type + // Makes the "randomness" of the shuffle slightly less punishing + let priorityTypes = pokemon.moveset + .filter(move => !originalTypes.includes(move.getMove().type) && move.getMove().category !== MoveCategory.STATUS) + .map(move => move.getMove().type); + if (priorityTypes?.length > 0) { + priorityTypes = [...new Set(priorityTypes)]; + randSeedShuffle(priorityTypes); + } + + let newTypes; + if (!originalTypes || originalTypes.length < 1) { + newTypes = priorityTypes?.length > 0 ? [priorityTypes.pop()] : [(randSeedInt(18) as Type)]; + } else { + newTypes = originalTypes.map(m => { + if (priorityTypes?.length > 0) { + const ret = priorityTypes.pop(); + randSeedShuffle(priorityTypes); + return ret; + } + + return randSeedInt(18) as Type; + }); + } + + if (!pokemon.mysteryEncounterData) { + pokemon.mysteryEncounterData = new MysteryEncounterPokemonData(null, null, null, newTypes); + } else { + pokemon.mysteryEncounterData.types = newTypes; + } + } + }) + .withOptionPhase(async (scene: BattleScene) => { + leaveEncounterWithoutBattle(scene, true); + }) + .withPostOptionPhase(async (scene: BattleScene) => { + // Play animations + const background = new EncounterBattleAnim(EncounterAnim.SMOKESCREEN, scene.getPlayerPokemon(), scene.getPlayerPokemon()); + background.playWithoutTargets(scene, 230, 40, 2); + await transitionMysteryEncounterIntroVisuals(scene); + }) + .build() + ) + .withOutroDialogue([ + { + text: `${namespace}.outro`, + }, + ]) + .build(); + +async function handleSwapAbility(scene: BattleScene) { + return new Promise(async resolve => { + await showEncounterDialogue(scene, `${namespace}.option.1.apply_ability_dialogue`, `${namespace}.speaker`); + await showEncounterText(scene, `${namespace}.option.1.apply_ability_message`); + + scene.ui.setMode(Mode.MESSAGE).then(() => { + displayYesNoOptions(scene, resolve); + }); + }); +} + +function displayYesNoOptions(scene: BattleScene, resolve) { + showEncounterText(scene, `${namespace}.option.1.ability_prompt`, 500, false); + const fullOptions = [ + { + label: i18next.t("menu:yes"), + handler: () => { + onYesAbilitySwap(scene, resolve); + return true; + } + }, + { + label: i18next.t("menu:no"), + handler: () => { + resolve(false); + return true; + } + } + ]; + + const config: OptionSelectConfig = { + options: fullOptions, + maxOptions: 7, + yOffset: 0 + }; + scene.ui.setModeWithoutClear(Mode.OPTION_SELECT, config, null, true); +} + +function onYesAbilitySwap(scene: BattleScene, resolve) { + const onPokemonSelected = (pokemon: PlayerPokemon) => { + // Do ability swap + if (!pokemon.mysteryEncounterData) { + pokemon.mysteryEncounterData = new MysteryEncounterPokemonData(null, Abilities.AERILATE); + } + pokemon.mysteryEncounterData.ability = scene.currentBattle.mysteryEncounter.misc.ability; + scene.currentBattle.mysteryEncounter.setDialogueToken("chosenPokemon", pokemon.getNameToRender()); + resolve(true); + }; + + const onPokemonNotSelected = () => { + scene.ui.setMode(Mode.MESSAGE).then(() => { + displayYesNoOptions(scene, resolve); + }); + }; + + selectPokemonForOption(scene, onPokemonSelected, onPokemonNotSelected); +} diff --git a/src/data/mystery-encounters/encounters/dark-deal-encounter.ts b/src/data/mystery-encounters/encounters/dark-deal-encounter.ts index e8a8272df0e..fde28a2ab00 100644 --- a/src/data/mystery-encounters/encounters/dark-deal-encounter.ts +++ b/src/data/mystery-encounters/encounters/dark-deal-encounter.ts @@ -127,7 +127,7 @@ export const DarkDealEncounter: IMysteryEncounter = const removedPokemon = getRandomPlayerPokemon(scene, false, true); scene.removePokemonFromPlayerParty(removedPokemon); - scene.currentBattle.mysteryEncounter.setDialogueToken("pokeName", removedPokemon.name); + scene.currentBattle.mysteryEncounter.setDialogueToken("pokeName", removedPokemon.getNameToRender()); // Store removed pokemon types scene.currentBattle.mysteryEncounter.misc = [ diff --git a/src/data/mystery-encounters/encounters/field-trip-encounter.ts b/src/data/mystery-encounters/encounters/field-trip-encounter.ts index e67aaa1ffad..93e2d71aa1a 100644 --- a/src/data/mystery-encounters/encounters/field-trip-encounter.ts +++ b/src/data/mystery-encounters/encounters/field-trip-encounter.ts @@ -95,7 +95,7 @@ export const FieldTripEncounter: IMysteryEncounter = ]; setEncounterExp(scene, scene.getParty().map((p) => p.id), 50); } else { - encounter.setDialogueToken("pokeName", pokemon.name); + encounter.setDialogueToken("pokeName", pokemon.getNameToRender()); encounter.setDialogueToken("move", move.getName()); encounter.options[0].dialogue.selected = [ { @@ -187,7 +187,7 @@ export const FieldTripEncounter: IMysteryEncounter = ]; setEncounterExp(scene, scene.getParty().map((p) => p.id), 50); } else { - encounter.setDialogueToken("pokeName", pokemon.name); + encounter.setDialogueToken("pokeName", pokemon.getNameToRender()); encounter.setDialogueToken("move", move.getName()); encounter.options[1].dialogue.selected = [ { @@ -273,7 +273,7 @@ export const FieldTripEncounter: IMysteryEncounter = ]; setEncounterExp(scene, scene.getParty().map((p) => p.id), 50); } else { - encounter.setDialogueToken("pokeName", pokemon.name); + encounter.setDialogueToken("pokeName", pokemon.getNameToRender()); encounter.setDialogueToken("move", move.getName()); encounter.options[2].dialogue.selected = [ { diff --git a/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts b/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts index 71311481ed1..5b4b582da01 100644 --- a/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts +++ b/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts @@ -191,7 +191,7 @@ export const FieryFalloutEncounter: IMysteryEncounter = const chosenPokemon = burnable[roll]; if (chosenPokemon.trySetStatus(StatusEffect.BURN)) { // Burn applied - encounter.setDialogueToken("burnedPokemon", chosenPokemon.name); + encounter.setDialogueToken("burnedPokemon", chosenPokemon.getNameToRender()); queueEncounterMessage(scene, `${namespace}.option.2.target_burned`); } } @@ -245,7 +245,7 @@ function giveLeadPokemonCharcoal(scene: BattleScene) { if (leadPokemon) { const charcoal = generateModifierTypeOption(scene, modifierTypes.ATTACK_TYPE_BOOSTER, [Type.FIRE]).type as AttackTypeBoosterModifierType; applyModifierTypeToPlayerPokemon(scene, leadPokemon, charcoal); - scene.currentBattle.mysteryEncounter.setDialogueToken("leadPokemon", leadPokemon.name); + scene.currentBattle.mysteryEncounter.setDialogueToken("leadPokemon", leadPokemon.getNameToRender()); queueEncounterMessage(scene, `${namespace}.found_charcoal`); } } diff --git a/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts b/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts index 5f6f235efc2..f0a96356eef 100644 --- a/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts +++ b/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts @@ -113,7 +113,7 @@ export const MysteriousChestEncounter: IMysteryEncounter = ); koPlayerPokemon(scene, highestLevelPokemon); - scene.currentBattle.mysteryEncounter.setDialogueToken("pokeName", highestLevelPokemon.name); + scene.currentBattle.mysteryEncounter.setDialogueToken("pokeName", highestLevelPokemon.getNameToRender()); // Show which Pokemon was KOed, then leave encounter with no rewards // Does this synchronously so that game over doesn't happen over result message await showEncounterText(scene, `${namespace}.option.1.bad`).then(() => { 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 26ddf86719d..80b7354b747 100644 --- a/src/data/mystery-encounters/encounters/the-pokemon-salesman-encounter.ts +++ b/src/data/mystery-encounters/encounters/the-pokemon-salesman-encounter.ts @@ -92,7 +92,7 @@ export const ThePokemonSalesmanEncounter: IMysteryEncounter = encounter.options[0].dialogue.buttonTooltip = `${namespace}.option.1.tooltip_shiny`; } const price = scene.getWaveMoneyAmount(priceMultiplier); - encounter.setDialogueToken("purchasePokemon", pokemon.name); + encounter.setDialogueToken("purchasePokemon", pokemon.getNameToRender()); encounter.setDialogueToken("price", price.toString()); encounter.misc = { price: price, 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 e3e410b5b93..36ac31f8046 100644 --- a/src/data/mystery-encounters/encounters/the-strong-stuff-encounter.ts +++ b/src/data/mystery-encounters/encounters/the-strong-stuff-encounter.ts @@ -16,6 +16,7 @@ import { BattleStat } from "#app/data/battle-stat"; import { BattlerTagType } from "#enums/battler-tag-type"; import { BerryType } from "#enums/berry-type"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; +import { MysteryEncounterPokemonData } from "#app/data/mystery-encounters/mystery-encounter-pokemon-data"; /** the i18n namespace for the encounter */ const namespace = "mysteryEncounter:theStrongStuff"; @@ -70,7 +71,7 @@ export const TheStrongStuffEncounter: IMysteryEncounter = species: getPokemonSpecies(Species.SHUCKLE), isBoss: true, bossSegments: 5, - spriteScale: 1.5, + mysteryEncounterData: new MysteryEncounterPokemonData(1.5), nature: Nature.BOLD, moveSet: [Moves.INFESTATION, Moves.SALT_CURE, Moves.GASTRO_ACID, Moves.HEAL_ORDER], modifierTypes: [ @@ -147,7 +148,7 @@ export const TheStrongStuffEncounter: IMysteryEncounter = modifyPlayerPokemonBST(pokemon, 10); } - encounter.setDialogueToken("highBstPokemon", highestBst.name); + encounter.setDialogueToken("highBstPokemon", highestBst.getNameToRender()); await showEncounterText(scene, `${namespace}.option.1.selected_2`, null, true); setEncounterRewards(scene, { fillRemaining: true }); diff --git a/src/data/mystery-encounters/mystery-encounter-pokemon-data.ts b/src/data/mystery-encounters/mystery-encounter-pokemon-data.ts new file mode 100644 index 00000000000..cab6d1ce82f --- /dev/null +++ b/src/data/mystery-encounters/mystery-encounter-pokemon-data.ts @@ -0,0 +1,16 @@ +import { Abilities } from "#enums/abilities"; +import { Type } from "#app/data/type"; + +export class MysteryEncounterPokemonData { + public spriteScale: number; + public ability: Abilities; + public passive: Abilities; + public types: Type[] = []; + + constructor(spriteScale?: number, ability?: Abilities, passive?: Abilities, types?: Type[]) { + this.spriteScale = spriteScale; + this.ability = ability; + this.passive = passive; + this.types = types; + } +} diff --git a/src/data/mystery-encounters/mystery-encounter.ts b/src/data/mystery-encounters/mystery-encounter.ts index be496fe1133..b1b47cef8ef 100644 --- a/src/data/mystery-encounters/mystery-encounter.ts +++ b/src/data/mystery-encounters/mystery-encounter.ts @@ -305,7 +305,7 @@ export default class IMysteryEncounter implements IMysteryEncounter { } } if (this.primaryPokemon?.length > 0) { - this.setDialogueToken("primaryName", this.primaryPokemon.name); + this.setDialogueToken("primaryName", this.primaryPokemon.getNameToRender()); for (const req of this.primaryPokemonRequirements) { if (!req.invertQuery) { const value = req.getDialogueToken(scene, this.primaryPokemon); @@ -316,7 +316,7 @@ export default class IMysteryEncounter implements IMysteryEncounter { } } if (this.secondaryPokemonRequirements?.length > 0 && this.secondaryPokemon?.length > 0) { - this.setDialogueToken("secondaryName", this.secondaryPokemon[0].name); + this.setDialogueToken("secondaryName", this.secondaryPokemon[0].getNameToRender()); for (const req of this.secondaryPokemonRequirements) { if (!req.invertQuery) { const value = req.getDialogueToken(scene, this.secondaryPokemon[0]); @@ -342,7 +342,7 @@ export default class IMysteryEncounter implements IMysteryEncounter { } } if (opt.primaryPokemonRequirements?.length > 0 && opt.primaryPokemon?.length > 0) { - this.setDialogueToken("option" + j + "PrimaryName", opt.primaryPokemon.name); + this.setDialogueToken("option" + j + "PrimaryName", opt.primaryPokemon.getNameToRender()); for (const req of opt.primaryPokemonRequirements) { if (!req.invertQuery) { const value = req.getDialogueToken(scene, opt.primaryPokemon); @@ -353,7 +353,7 @@ export default class IMysteryEncounter implements IMysteryEncounter { } } if (opt.secondaryPokemonRequirements?.length > 0 && opt.secondaryPokemon?.length > 0) { - this.setDialogueToken("option" + j + "SecondaryName", opt.secondaryPokemon[0].name); + this.setDialogueToken("option" + j + "SecondaryName", opt.secondaryPokemon[0].getNameToRender()); for (const req of opt.secondaryPokemonRequirements) { if (!req.invertQuery) { const value = req.getDialogueToken(scene, opt.secondaryPokemon[0]); diff --git a/src/data/mystery-encounters/mystery-encounters.ts b/src/data/mystery-encounters/mystery-encounters.ts index 53cf834dcad..b1c4ada12e7 100644 --- a/src/data/mystery-encounters/mystery-encounters.ts +++ b/src/data/mystery-encounters/mystery-encounters.ts @@ -21,7 +21,7 @@ import { AbsoluteAvariceEncounter } from "#app/data/mystery-encounters/encounter import { ATrainersTestEncounter } from "#app/data/mystery-encounters/encounters/a-trainers-test-encounter"; import { TrashToTreasureEncounter } from "#app/data/mystery-encounters/encounters/trash-to-treasure-encounter"; import { BerriesAboundEncounter } from "#app/data/mystery-encounters/encounters/berries-abound-encounter"; -import { ClowningAroundEncounter } from "#app/data/mystery-encounters/encounters/clowing-around-encounter"; +import { ClowningAroundEncounter } from "#app/data/mystery-encounters/encounters/clowning-around-encounter"; // Spawn chance: (BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT + WIGHT_INCREMENT_ON_SPAWN_MISS * ) / 256 export const BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT = 1; diff --git a/src/data/mystery-encounters/utils/encounter-phase-utils.ts b/src/data/mystery-encounters/utils/encounter-phase-utils.ts index c166f287030..675e864f976 100644 --- a/src/data/mystery-encounters/utils/encounter-phase-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-phase-utils.ts @@ -30,6 +30,8 @@ import { TrainerConfig, trainerConfigs, TrainerSlot } from "#app/data/trainer-co import PokemonSpecies from "#app/data/pokemon-species"; import Overrides from "#app/overrides"; import { Egg, IEggOptions } from "#app/data/egg"; +import { Abilities } from "#enums/abilities"; +import { MysteryEncounterPokemonData } from "#app/data/mystery-encounters/mystery-encounter-pokemon-data"; /** * Animates exclamation sprite over trainer's head at start of encounter @@ -63,7 +65,7 @@ export interface EnemyPokemonConfig { isBoss: boolean; bossSegments?: number; bossSegmentModifier?: number; // Additive to the determined segment number - spriteScale?: number; + mysteryEncounterData?: MysteryEncounterPokemonData; formIndex?: number; level?: number; gender?: Gender; @@ -71,6 +73,8 @@ export interface EnemyPokemonConfig { moveSet?: Moves[]; nature?: Nature; ivs?: [integer, integer, integer, integer, integer, integer]; + ability?: Abilities; + shiny?: boolean; /** Can set just the status, or pass a timer on the status turns */ status?: StatusEffect | [StatusEffect, number]; mysteryEncounterBattleEffects?: (pokemon: Pokemon) => void; @@ -210,11 +214,14 @@ export async function initBattleWithEnemyConfig(scene: BattleScene, partyConfig: enemyPokemon.formIndex = config.formIndex; } - // Set scale - if (!isNullOrUndefined(config.spriteScale)) { - enemyPokemon.mysteryEncounterData = { - spriteScale: config.spriteScale - }; + // Set shiny + if (!isNullOrUndefined(config.shiny)) { + enemyPokemon.shiny = config.shiny; + } + + // Set custom mystery encounter data fields (such as sprite scale, custom abilities, types, etc.) + if (!isNullOrUndefined(config.mysteryEncounterData)) { + enemyPokemon.mysteryEncounterData = config.mysteryEncounterData; } // Set Boss @@ -252,6 +259,11 @@ export async function initBattleWithEnemyConfig(scene: BattleScene, partyConfig: // Set summon data fields + // Set ability + if (!isNullOrUndefined(config.ability)) { + enemyPokemon.summonData.ability = config.ability; + } + // Set gender if (!isNullOrUndefined(config.gender)) { enemyPokemon.gender = config.gender; @@ -381,7 +393,7 @@ export function selectPokemonForOption(scene: BattleScene, onPokemonSelected: (p const pokemon = scene.getParty()[slotIndex]; const secondaryOptions = onPokemonSelected(pokemon); if (!secondaryOptions) { - scene.currentBattle.mysteryEncounter.setDialogueToken("selectedPokemon", pokemon.name); + scene.currentBattle.mysteryEncounter.setDialogueToken("selectedPokemon", pokemon.getNameToRender()); resolve(true); return; } @@ -395,7 +407,7 @@ export function selectPokemonForOption(scene: BattleScene, onPokemonSelected: (p const onSelect = option.handler; option.handler = () => { onSelect(); - scene.currentBattle.mysteryEncounter.setDialogueToken("selectedPokemon", pokemon.name); + scene.currentBattle.mysteryEncounter.setDialogueToken("selectedPokemon", pokemon.getNameToRender()); resolve(true); return true; }; diff --git a/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts b/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts index e3dd3106aeb..03066314a5b 100644 --- a/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts @@ -20,10 +20,6 @@ import { getPokemonNameWithAffix } from "#app/messages"; import { modifierTypes, PokemonHeldItemModifierType } from "#app/modifier/modifier-type"; import { Gender } from "#app/data/gender"; -export interface MysteryEncounterPokemonData { - spriteScale?: number -} - export function getSpriteKeysFromSpecies(species: Species, female?: boolean, formIndex?: integer, shiny?: boolean, variant?: integer): { spriteKey: string, fileRoot: string } { const spriteKey = getPokemonSpecies(species).getSpriteKey(female ?? false, formIndex ?? 0, shiny ?? false, variant ?? 0); const fileRoot = getPokemonSpecies(species).getSpriteAtlasPath(female ?? false, formIndex ?? 0, shiny ?? false, variant ?? 0); @@ -447,7 +443,7 @@ function failCatch(scene: BattleScene, pokemon: EnemyPokemon, originalY: number, scene.currentBattle.lastUsedPokeball = pokeballType; removePb(scene, pokeball); - scene.ui.showText(i18next.t("battle:pokemonBrokeFree", { pokemonName: pokemon.name }), null, () => resolve(), null, true); + scene.ui.showText(i18next.t("battle:pokemonBrokeFree", { pokemonName: pokemon.getNameToRender() }), null, () => resolve(), null, true); }); } @@ -516,7 +512,7 @@ export async function catchPokemon(scene: BattleScene, pokemon: EnemyPokemon, po Promise.all([pokemon.hideInfo(), scene.gameData.setPokemonCaught(pokemon)]).then(() => { if (scene.getParty().length === 6) { const promptRelease = () => { - scene.ui.showText(i18next.t("battle:partyFull", { pokemonName: pokemon.name }), null, () => { + scene.ui.showText(i18next.t("battle:partyFull", { pokemonName: pokemon.getNameToRender() }), null, () => { scene.pokemonInfoContainer.makeRoomForConfirmUi(); scene.ui.setMode(Mode.CONFIRM, () => { scene.ui.setMode(Mode.PARTY, PartyUiMode.RELEASE, 0, (slotIndex: integer, _option: PartyOption) => { @@ -544,7 +540,7 @@ export async function catchPokemon(scene: BattleScene, pokemon: EnemyPokemon, po }; if (showCatchObtainMessage) { - scene.ui.showText(i18next.t(isObtain ? "battle:pokemonObtained" : "battle:pokemonCaught", { pokemonName: pokemon.name }), null, doPokemonCatchMenu, 0, true); + scene.ui.showText(i18next.t(isObtain ? "battle:pokemonObtained" : "battle:pokemonCaught", { pokemonName: pokemon.getNameToRender() }), null, doPokemonCatchMenu, 0, true); } else { doPokemonCatchMenu(); } @@ -581,7 +577,7 @@ export async function doPokemonFlee(scene: BattleScene, pokemon: EnemyPokemon): onComplete: () => { pokemon.setVisible(false); scene.field.remove(pokemon, true); - showEncounterText(scene, i18next.t("battle:pokemonFled", { pokemonName: pokemon.name }), 600, false) + showEncounterText(scene, i18next.t("battle:pokemonFled", { pokemonName: pokemon.getNameToRender() }), 600, false) .then(() => { resolve(); }); @@ -604,7 +600,7 @@ export function doPlayerFlee(scene: BattleScene, pokemon: EnemyPokemon): Promise onComplete: () => { pokemon.setVisible(false); scene.field.remove(pokemon, true); - showEncounterText(scene, i18next.t("battle:playerFled", { pokemonName: pokemon.name }), 600, false) + showEncounterText(scene, i18next.t("battle:playerFled", { pokemonName: pokemon.getNameToRender() }), 600, false) .then(() => { resolve(); }); diff --git a/src/enums/battler-tag-type.ts b/src/enums/battler-tag-type.ts index c6e638c2426..b50cc4f7f10 100644 --- a/src/enums/battler-tag-type.ts +++ b/src/enums/battler-tag-type.ts @@ -64,5 +64,5 @@ export enum BattlerTagType { STOCKPILING = "STOCKPILING", RECEIVE_DOUBLE_DAMAGE = "RECEIVE_DOUBLE_DAMAGE", ALWAYS_GET_HIT = "ALWAYS_GET_HIT", - MYSTERY_ENCOUNTER_POST_SUMMON = "MYSTERY_ENCOUNTER_POST_SUMMON" // Provides effects on post-summon for MEs + MYSTERY_ENCOUNTER_POST_SUMMON = "MYSTERY_ENCOUNTER_POST_SUMMON", // Provides effects on post-summon for MEs } diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index e812d47fe1a..feca608038a 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -51,7 +51,7 @@ import { Biome } from "#enums/biome"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { getPokemonNameWithAffix } from "#app/messages.js"; -import { MysteryEncounterPokemonData } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; +import { MysteryEncounterPokemonData } from "#app/data/mystery-encounters/mystery-encounter-pokemon-data"; export enum FieldPosition { CENTER, @@ -187,6 +187,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.fusionVariant = dataSource.fusionVariant || 0; this.fusionGender = dataSource.fusionGender; this.fusionLuck = dataSource.fusionLuck; + this.mysteryEncounterData = dataSource.mysteryEncounterData; } else { this.id = Utils.randSeedInt(4294967296); this.ivs = ivs || Utils.getIvsFromId(this.id); @@ -233,6 +234,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } this.luck = (this.shiny ? this.variant + 1 : 0) + (this.fusionShiny ? this.fusionVariant + 1 : 0); this.fusionLuck = this.luck; + this.mysteryEncounterData = new MysteryEncounterPokemonData(); } this.generateName(); @@ -927,7 +929,10 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } if (!types.length || !includeTeraType) { - if (!ignoreOverride && this.summonData?.types) { + if (this.mysteryEncounterData?.types?.length > 0) { + // "Permanent" override for a Pokemon's normal types, currently only used by Mystery Encounters + this.mysteryEncounterData.types.forEach(t => types.push(t)); + } else if (!ignoreOverride && this.summonData?.types) { this.summonData.types.forEach(t => types.push(t)); } else { const speciesForm = this.getSpeciesForm(ignoreOverride); @@ -994,6 +999,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { if (Overrides.OPP_ABILITY_OVERRIDE && !this.isPlayer()) { return allAbilities[Overrides.OPP_ABILITY_OVERRIDE]; } + if (this.mysteryEncounterData?.ability) { + return allAbilities[this.mysteryEncounterData.ability]; + } if (this.isFusion()) { return allAbilities[this.getFusionSpeciesForm(ignoreOverride).getAbility(this.fusionAbilityIndex)]; } @@ -1018,6 +1026,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { if (Overrides.OPP_PASSIVE_ABILITY_OVERRIDE && !this.isPlayer()) { return allAbilities[Overrides.OPP_PASSIVE_ABILITY_OVERRIDE]; } + if (this.mysteryEncounterData?.passive) { + return allAbilities[this.mysteryEncounterData.passive]; + } let starterSpeciesId = this.species.speciesId; while (pokemonPrevolutions.hasOwnProperty(starterSpeciesId)) { @@ -4059,6 +4070,7 @@ export class PokemonSummonData { public speciesForm: PokemonSpeciesForm; public fusionSpeciesForm: PokemonSpeciesForm; public ability: Abilities = Abilities.NONE; + public passiveAbility: Abilities = Abilities.NONE; public gender: Gender; public fusionGender: Gender; public stats: integer[]; diff --git a/src/locales/en/mystery-encounters/clowning-around-dialogue.ts b/src/locales/en/mystery-encounters/clowning-around-dialogue.ts index 4b70c39eefb..dd7797a3035 100644 --- a/src/locales/en/mystery-encounters/clowning-around-dialogue.ts +++ b/src/locales/en/mystery-encounters/clowning-around-dialogue.ts @@ -1,31 +1,32 @@ export const clowningAroundDialogue = { intro: "It's...@d{64} a clown?", speaker: "Clown", - intro_dialogue: `Bumbling buffoon,\nbrace for a brilliant battle! - $You’ll be beaten by this brawling busker!\nBring it!`, + intro_dialogue: "Bumbling buffoon, brace for a brilliant battle!\nYou’ll be beaten by this brawling busker!", title: "Clowning Around", - description: "The clown seems eager to goad you into a battle, but to what end?\n\nSomething is off about this encounter.", + description: "Something is off about this encounter. The clown seems eager to goad you into a battle, but to what end?\n\nThe Blacephalon is especially strange, like it has @[TOOLTIP_TITLE]{weird types and ability.}", query: "What will you do?", option: { 1: { label: "Battle the Clown", tooltip: "(-) Strange Battle\n(?) Affects Pokémon Abilities", - selected: "Your pitiful Pokémon are poised for a pathetic performance!" + selected: "Your pitiful Pokémon are poised for a pathetic performance!", + apply_ability_dialogue: "A sensational showcase!\nYour savvy suits a sensational skill as spoils!", + apply_ability_message: "The clown is offering to permanently Skill Swap one of your Pokémon's ability to {{ability}}!", + ability_prompt: "Would you like to permanently teach a Pokémon the {{ability}} ability?", + ability_gained: "@s{level_up_fanfare}{{chosenPokemon}} gained the {{ability}} ability!" }, 2: { label: "Remain Unprovoked", tooltip: "(-) Upsets the Clown\n(?) Affects Pokémon Items", selected: "Dismal dodger, you deny a delightful duel?\nFeel my fury!", - selected_2: `The clown's Blacephalon uses Trick! - All of your {{switchPokemon}}'s items were randomly swapped!`, + selected_2: "The clown's Blacephalon uses Trick!\nAll of your {{switchPokemon}}'s items were randomly swapped!", selected_3: "Flustered fool, fall for my flawless deception!", }, 3: { label: "Return the Insults", tooltip: "(-) Upsets the Clown\n(?) Affects Pokémon Types", - selected: "I'm appalled at your absurd antics!\nTaste my temper!", - selected_2: `The clown's Blacephalon uses\na move you've never seen before! - All of your team's types were randomly swapped!`, + selected: "Dismal dodger, you deny a delightful duel?\nFeel my fury!", + selected_2: "The clown's Blacephalon uses a strange move!\nAll of your team's types were randomly swapped!", selected_3: "Flustered fool, fall for my flawless deception!", }, }, diff --git a/src/overrides.ts b/src/overrides.ts index 8e83692925d..1196797fac0 100644 --- a/src/overrides.ts +++ b/src/overrides.ts @@ -127,9 +127,9 @@ class DefaultOverrides { // ------------------------- // 1 to 256, set to null to ignore - readonly MYSTERY_ENCOUNTER_RATE_OVERRIDE: number = 256; + readonly MYSTERY_ENCOUNTER_RATE_OVERRIDE: number = null; readonly MYSTERY_ENCOUNTER_TIER_OVERRIDE: MysteryEncounterTier = null; - readonly MYSTERY_ENCOUNTER_OVERRIDE: MysteryEncounterType = MysteryEncounterType.CLOWNING_AROUND; + readonly MYSTERY_ENCOUNTER_OVERRIDE: MysteryEncounterType = null; // ------------------------- // MODIFIER / ITEM OVERRIDES diff --git a/src/phases.ts b/src/phases.ts index b0bfc739ae8..56206a97f1a 100644 --- a/src/phases.ts +++ b/src/phases.ts @@ -1369,7 +1369,7 @@ export class PostSummonPhase extends PokemonPhase { } this.scene.arena.applyTags(ArenaTrapTag, pokemon); - // If this is fight or flight mystery encounter and is enemy pokemon summon phase, add enraged tag + // If this is mystery encounter and has post summon phase tag, apply post summon effects if (pokemon.findTags(t => t instanceof MysteryEncounterPostSummonTag)) { pokemon.lapseTag(BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON); } diff --git a/src/system/pokemon-data.ts b/src/system/pokemon-data.ts index 7e8f1e21c07..0601e883878 100644 --- a/src/system/pokemon-data.ts +++ b/src/system/pokemon-data.ts @@ -12,6 +12,7 @@ import { loadBattlerTag } from "../data/battler-tags"; import { Biome } from "#enums/biome"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; +import { MysteryEncounterPokemonData } from "#app/data/mystery-encounters/mystery-encounter-pokemon-data"; export default class PokemonData { public id: integer; @@ -54,6 +55,7 @@ export default class PokemonData { public bossSegments?: integer; public summonData: PokemonSummonData; + public mysteryEncounterData: MysteryEncounterPokemonData; constructor(source: Pokemon | any, forHistory: boolean = false) { const sourcePokemon = source instanceof Pokemon ? source : null; @@ -108,6 +110,7 @@ export default class PokemonData { this.status = sourcePokemon.status; if (this.player) { this.summonData = sourcePokemon.summonData; + this.mysteryEncounterData = sourcePokemon.mysteryEncounterData; } } } else { @@ -137,6 +140,14 @@ export default class PokemonData { this.summonData.tags = []; } } + + this.mysteryEncounterData = new MysteryEncounterPokemonData(); + if (!forHistory && source.mysteryEncounterData) { + this.mysteryEncounterData.spriteScale = source.mysteryEncounterData.spriteScale; + this.mysteryEncounterData.ability = source.mysteryEncounterData.ability; + this.mysteryEncounterData.passive = source.mysteryEncounterData.passive; + this.mysteryEncounterData.types = source.mysteryEncounterData.types; + } } } From 42eadcb36cc64bee9b9c5d84446fb3659d8bb19b Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Wed, 7 Aug 2024 22:52:12 -0400 Subject: [PATCH 234/270] add unit tests for clowning around --- .../mystery-encounters/encounter_radar.json | 41 -- public/images/mystery-encounters/exclaim.json | 41 -- src/data/battle-anims.ts | 2 - .../encounters/clowning-around-encounter.ts | 154 +++++--- .../utils/encounter-phase-utils.ts | 8 +- src/field/mystery-encounter-intro.ts | 3 - src/loading-scene.ts | 3 + src/overrides.ts | 4 +- src/phases.ts | 2 +- .../clowning-around-encounter.test.ts | 374 ++++++++++++++++++ .../the-strong-stuff-encounter.test.ts | 3 +- src/ui/mystery-encounter-ui-handler.ts | 4 +- 12 files changed, 480 insertions(+), 159 deletions(-) delete mode 100644 public/images/mystery-encounters/encounter_radar.json delete mode 100644 public/images/mystery-encounters/exclaim.json create mode 100644 src/test/mystery-encounter/encounters/clowning-around-encounter.test.ts diff --git a/public/images/mystery-encounters/encounter_radar.json b/public/images/mystery-encounters/encounter_radar.json deleted file mode 100644 index 82f16af59f6..00000000000 --- a/public/images/mystery-encounters/encounter_radar.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "textures": [ - { - "image": "encounter_radar.png", - "format": "RGBA8888", - "size": { - "w": 17, - "h": 16 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 15, - "h": 14 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 15, - "h": 14 - }, - "frame": { - "x": 1, - "y": 1, - "w": 15, - "h": 14 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:eb3445f19546ab36edb2909c89b8aa86:c8de156a28ef70ee4ddf70cffe1ba3ba:e7008b81ccf0cb0325145a809afa6165$" - } -} diff --git a/public/images/mystery-encounters/exclaim.json b/public/images/mystery-encounters/exclaim.json deleted file mode 100644 index 31231910097..00000000000 --- a/public/images/mystery-encounters/exclaim.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "textures": [ - { - "image": "exclaim.png", - "format": "RGBA8888", - "size": { - "w": 32, - "h": 32 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 32, - "h": 32 - }, - "frame": { - "x": 0, - "y": 0, - "w": 32, - "h": 32 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:895f0a79b89fa0fb44167f4584fd9a22:357b46953b7e17c6b2f43a62d52855d8:cc1ed0e4f90aaa9dcf1b39a0af1283b0$" - } -} diff --git a/src/data/battle-anims.ts b/src/data/battle-anims.ts index 6af8fedae8a..ffc39efedac 100644 --- a/src/data/battle-anims.ts +++ b/src/data/battle-anims.ts @@ -534,13 +534,11 @@ export function initMoveAnim(scene: BattleScene, move: Moves): Promise { export async function initEncounterAnims(scene: BattleScene, encounterAnim: EncounterAnim | EncounterAnim[]): Promise { const anims = Array.isArray(encounterAnim) ? encounterAnim : [encounterAnim]; const encounterAnimNames = Utils.getEnumKeys(EncounterAnim); - // const encounterAnimIds = Utils.getEnumValues(EncounterAnim); const encounterAnimFetches = []; for (const anim of anims) { if (encounterAnims.has(anim) && !isNullOrUndefined(encounterAnims.get(anim))) { continue; } - // const encounterAnimId = encounterAnimIds[anim]; encounterAnimFetches.push(scene.cachedFetch(`./battle-anims/encounter-${encounterAnimNames[anim].toLowerCase().replace(/\_/g, "-")}.json`) .then(response => response.json()) .then(cas => encounterAnims.set(anim, new AnimConfig(cas)))); diff --git a/src/data/mystery-encounters/encounters/clowning-around-encounter.ts b/src/data/mystery-encounters/encounters/clowning-around-encounter.ts index 7f8f622c41f..c03508a5700 100644 --- a/src/data/mystery-encounters/encounters/clowning-around-encounter.ts +++ b/src/data/mystery-encounters/encounters/clowning-around-encounter.ts @@ -1,7 +1,7 @@ import { EnemyPartyConfig, generateModifierTypeOption, initBattleWithEnemyConfig, leaveEncounterWithoutBattle, loadCustomMovesForEncounter, selectPokemonForOption, setEncounterRewards, transitionMysteryEncounterIntroVisuals, } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { trainerConfigs, TrainerPartyCompoundTemplate, TrainerPartyTemplate, } from "#app/data/trainer-config"; import { ModifierTier } from "#app/modifier/modifier-tier"; -import { BerryModifierType, modifierTypes, PokemonHeldItemModifierType } from "#app/modifier/modifier-type"; +import { modifierTypes, PokemonHeldItemModifierType } from "#app/modifier/modifier-type"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { PartyMemberStrength } from "#enums/party-member-strength"; import BattleScene from "#app/battle-scene"; @@ -104,16 +104,14 @@ export const ClowningAroundEncounter: IMysteryEncounter = .withOnInit((scene: BattleScene) => { const encounter = scene.currentBattle.mysteryEncounter; - // Clown trainer is pulled from pool of boss trainers (gym leaders) for the biome - // They are given an E4 template team, so will be stronger than usual boss encounter and always have 6 mons const clownTrainerType = TrainerType.HARLEQUIN; + const clownConfig = trainerConfigs[clownTrainerType].copy(); const clownPartyTemplate = new TrainerPartyCompoundTemplate( new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER)); - const clownConfig = trainerConfigs[clownTrainerType].copy(); clownConfig.setPartyTemplates(clownPartyTemplate); clownConfig.setDoubleOnly(); - clownConfig.partyTemplateFunc = null; // Overrides party template func + clownConfig.partyTemplateFunc = null; // Overrides party template func if it exists // Generate random ability for Blacephalon from pool const ability = RANDOM_ABILITY_POOL[randSeedInt(RANDOM_ABILITY_POOL.length)]; @@ -142,28 +140,6 @@ export const ClowningAroundEncounter: IMysteryEncounter = // Load animations/sfx for start of fight moves loadCustomMovesForEncounter(scene, [Moves.ROLE_PLAY, Moves.TAUNT]); - // These have to be defined at runtime so that modifierTypes exist - encounter.misc.RANDOM_ULTRA_POOL = [ - modifierTypes.REVIVER_SEED, - modifierTypes.GOLDEN_PUNCH, - modifierTypes.ATTACK_TYPE_BOOSTER, - modifierTypes.QUICK_CLAW, - modifierTypes.WIDE_LENS, - modifierTypes.WHITE_HERB - ]; - - encounter.misc.RANDOM_ROGUE_POOL = [ - modifierTypes.LEFTOVERS, - modifierTypes.SHELL_BELL, - modifierTypes.SOUL_DEW, - modifierTypes.SOOTHE_BELL, - modifierTypes.SCOPE_LENS, - modifierTypes.BATON, - modifierTypes.FOCUS_BAND, - modifierTypes.KINGS_ROCK, - modifierTypes.GRIP_CLAW - ]; - return true; }) .withTitle(`${namespace}.title`) @@ -187,7 +163,7 @@ export const ClowningAroundEncounter: IMysteryEncounter = // Spawn battle const config: EnemyPartyConfig = encounter.enemyPartyConfigs[0]; - setEncounterRewards(scene, { guaranteedModifierTypeFuncs: [modifierTypes.TM_COMMON, modifierTypes.TM_GREAT, modifierTypes.MEMORY_MUSHROOM], fillRemaining: true }); + setEncounterRewards(scene, { fillRemaining: true }); // TODO: when Magic Room and Wonder Room are implemented, add those to start of battle encounter.startOfBattleEffects.push( @@ -217,7 +193,6 @@ export const ClowningAroundEncounter: IMysteryEncounter = // After the battle, offer the player the opportunity to permanently swap ability const abilityWasSwapped = await handleSwapAbility(scene); if (abilityWasSwapped) { - await scene.ui.setMode(Mode.MESSAGE); await showEncounterText(scene, `${namespace}.option.1.ability_gained`); } @@ -284,44 +259,33 @@ export const ClowningAroundEncounter: IMysteryEncounter = const items = mostHeldItemsPokemon.getHeldItems(); // Shuffles Berries (if they have any) - const berries = items.filter(m => m instanceof BerryModifier); + let numBerries = 0; + items.filter(m => m instanceof BerryModifier) + .forEach(m => { + numBerries += m.stackCount; + scene.removeModifier(m); + }); - berries.forEach(berry => { - const stackCount = berry.stackCount; - scene.removeModifier(berry); - const newBerry = generateModifierTypeOption(scene, modifierTypes.BERRY, [randSeedInt(Object.keys(BerryType).filter(s => !isNaN(Number(s))).length) as BerryType]).type as BerryModifierType; - for (let i = 0; i < stackCount; i++) { - applyModifierTypeToPlayerPokemon(scene, mostHeldItemsPokemon, newBerry); - } - }); + generateItemsOfTier(scene, mostHeldItemsPokemon, numBerries, "Berries"); // Shuffle Transferable held items in the same tier (only shuffles Ultra and Rogue atm) - const transferableItems = items.filter(m => m.isTransferrable && !(m instanceof BerryModifier)); - - transferableItems.forEach(transferableItem => { - const stackCount = transferableItem.stackCount; - transferableItem.type.withTierFromPool(); - - // Lucky Eggs and other items that do not appear in item pools are treated as Ultra rarity - const tier = transferableItem.type.tier ?? ModifierTier.ULTRA; - - if (tier === ModifierTier.ULTRA) { - scene.removeModifier(transferableItem); - for (let i = 0; i < stackCount; i++) { - const newItemType = encounter.misc.RANDOM_ULTRA_POOL[randSeedInt(encounter.misc.RANDOM_ULTRA_POOL.length)]; - const newMod = generateModifierTypeOption(scene, newItemType).type as PokemonHeldItemModifierType; - applyModifierTypeToPlayerPokemon(scene, mostHeldItemsPokemon, newMod); + let numUltra = 0; + let numRogue = 0; + items.filter(m => m.isTransferrable && !(m instanceof BerryModifier)) + .forEach(m => { + const type = m.type.withTierFromPool(); + const tier = type.tier ?? ModifierTier.ULTRA; + if (type.id === "LUCKY_EGG" || tier === ModifierTier.ULTRA) { + numUltra += m.stackCount; + scene.removeModifier(m); + } else if (type.id === "GOLDEN_EGG" || tier === ModifierTier.ROGUE) { + numRogue += m.stackCount; + scene.removeModifier(m); } - } else if (tier === ModifierTier.ROGUE) { - scene.removeModifier(transferableItem); - for (let i = 0; i < stackCount; i++) { - const newItemType = encounter.misc.RANDOM_ROGUE_POOL[randSeedInt(encounter.misc.RANDOM_ROGUE_POOL.length)]; - const newMod = generateModifierTypeOption(scene, newItemType).type as PokemonHeldItemModifierType; - applyModifierTypeToPlayerPokemon(scene, mostHeldItemsPokemon, newMod); - } - } - }); + }); + generateItemsOfTier(scene, mostHeldItemsPokemon, numUltra, ModifierTier.ULTRA); + generateItemsOfTier(scene, mostHeldItemsPokemon, numRogue, ModifierTier.ROGUE); }) .withOptionPhase(async (scene: BattleScene) => { leaveEncounterWithoutBattle(scene, true); @@ -456,7 +420,7 @@ function onYesAbilitySwap(scene: BattleScene, resolve) { } pokemon.mysteryEncounterData.ability = scene.currentBattle.mysteryEncounter.misc.ability; scene.currentBattle.mysteryEncounter.setDialogueToken("chosenPokemon", pokemon.getNameToRender()); - resolve(true); + scene.ui.setMode(Mode.MESSAGE).then(() => resolve(true)); }; const onPokemonNotSelected = () => { @@ -467,3 +431,67 @@ function onYesAbilitySwap(scene: BattleScene, resolve) { selectPokemonForOption(scene, onPokemonSelected, onPokemonNotSelected); } + +function generateItemsOfTier(scene: BattleScene, pokemon: PlayerPokemon, numItems: integer, tier: ModifierTier | "Berries") { + // These pools have to be defined at runtime so that modifierTypes exist + // Pools have instances of the modifier type equal to the max stacks that modifier can be applied to any one pokemon + // This is to prevent "over-generating" a random item of a certain type during item swaps + const ultraPool = [ + [modifierTypes.REVIVER_SEED, 1], + [modifierTypes.GOLDEN_PUNCH, 5], + [modifierTypes.ATTACK_TYPE_BOOSTER, 99], + [modifierTypes.QUICK_CLAW, 3], + [modifierTypes.WIDE_LENS, 3], + [modifierTypes.WHITE_HERB, 2] + ]; + + const roguePool = [ + [modifierTypes.LEFTOVERS, 4], + [modifierTypes.SHELL_BELL, 4], + [modifierTypes.SOUL_DEW, 10], + [modifierTypes.SOOTHE_BELL, 3], + [modifierTypes.SCOPE_LENS, 5], + [modifierTypes.BATON, 1], + [modifierTypes.FOCUS_BAND, 5], + [modifierTypes.KINGS_ROCK, 3], + [modifierTypes.GRIP_CLAW, 5] + ]; + + const berryPool = [ + [BerryType.APICOT, 3], + [BerryType.ENIGMA, 2], + [BerryType.GANLON, 3], + [BerryType.LANSAT, 3], + [BerryType.LEPPA, 2], + [BerryType.LIECHI, 3], + [BerryType.LUM, 2], + [BerryType.PETAYA, 3], + [BerryType.SALAC, 2], + [BerryType.SITRUS, 2], + [BerryType.STARF, 3] + ]; + + let pool: any[]; + if (tier === "Berries") { + pool = berryPool; + } else { + pool = tier === ModifierTier.ULTRA ? ultraPool : roguePool; + } + + for (let i = 0; i < numItems; i++) { + const randIndex = randSeedInt(pool.length); + const newItemType = pool[randIndex]; + let newMod; + if (tier === "Berries") { + newMod = generateModifierTypeOption(scene, modifierTypes.BERRY, [newItemType[0]]).type as PokemonHeldItemModifierType; + } else { + newMod = generateModifierTypeOption(scene, newItemType[0]).type as PokemonHeldItemModifierType; + } + applyModifierTypeToPlayerPokemon(scene, pokemon, newMod); + // Decrement max stacks and remove from pool if at max + newItemType[1]--; + if (newItemType[1] <= 0) { + pool.splice(randIndex, 1); + } + } +} diff --git a/src/data/mystery-encounters/utils/encounter-phase-utils.ts b/src/data/mystery-encounters/utils/encounter-phase-utils.ts index 675e864f976..05ddf07d1e8 100644 --- a/src/data/mystery-encounters/utils/encounter-phase-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-phase-utils.ts @@ -38,7 +38,7 @@ import { MysteryEncounterPokemonData } from "#app/data/mystery-encounters/myster * @param scene */ export function doTrainerExclamation(scene: BattleScene) { - const exclamationSprite = scene.addFieldSprite(0, 0, "exclaim"); + const exclamationSprite = scene.add.sprite(0, 0, "exclaim"); exclamationSprite.setName("exclamation"); scene.field.add(exclamationSprite); scene.field.moveTo(exclamationSprite, scene.field.getAll().length - 1); @@ -386,10 +386,12 @@ export function generateModifierTypeOption(scene: BattleScene, modifier: () => M */ export function selectPokemonForOption(scene: BattleScene, onPokemonSelected: (pokemon: PlayerPokemon) => void | OptionSelectItem[], onPokemonNotSelected?: () => void, selectablePokemonFilter?: (pokemon: PlayerPokemon) => string): Promise { return new Promise(resolve => { + const modeToSetOnExit = scene.ui.getMode(); + // Open party screen to choose pokemon to train scene.ui.setMode(Mode.PARTY, PartyUiMode.SELECT, -1, (slotIndex: integer, option: PartyOption) => { if (slotIndex < scene.getParty().length) { - scene.ui.setMode(Mode.MYSTERY_ENCOUNTER).then(() => { + scene.ui.setMode(modeToSetOnExit).then(() => { const pokemon = scene.getParty()[slotIndex]; const secondaryOptions = onPokemonSelected(pokemon); if (!secondaryOptions) { @@ -443,7 +445,7 @@ export function selectPokemonForOption(scene: BattleScene, onPokemonSelected: (p }); }); } else { - scene.ui.setMode(Mode.MYSTERY_ENCOUNTER).then(() => { + scene.ui.setMode(modeToSetOnExit).then(() => { if (onPokemonNotSelected) { onPokemonNotSelected(); } diff --git a/src/field/mystery-encounter-intro.ts b/src/field/mystery-encounter-intro.ts index 7055d29d45c..0f13f486eb2 100644 --- a/src/field/mystery-encounter-intro.ts +++ b/src/field/mystery-encounter-intro.ts @@ -190,9 +190,6 @@ export default class MysteryEncounterIntroVisuals extends Phaser.GameObjects.Con } }); - // Load dex progress icon - this.scene.loadAtlas("encounter_radar", "mystery-encounters"); - this.scene.load.once(Phaser.Loader.Events.COMPLETE, () => { this.spriteConfigs.every((config) => { if (config.isItem) { diff --git a/src/loading-scene.ts b/src/loading-scene.ts index 3d62248f693..54acc2dd0d3 100644 --- a/src/loading-scene.ts +++ b/src/loading-scene.ts @@ -275,6 +275,9 @@ export class LoadingScene extends SceneBase { } } + // Load Mystery Encounter dex progress icon + this.loadImage("encounter_radar", "mystery-encounters"); + this.loadAtlas("dualshock", "inputs"); this.loadAtlas("xbox", "inputs"); this.loadAtlas("keyboard", "inputs"); diff --git a/src/overrides.ts b/src/overrides.ts index 1196797fac0..6632dfeab6f 100644 --- a/src/overrides.ts +++ b/src/overrides.ts @@ -127,9 +127,9 @@ class DefaultOverrides { // ------------------------- // 1 to 256, set to null to ignore - readonly MYSTERY_ENCOUNTER_RATE_OVERRIDE: number = null; + readonly MYSTERY_ENCOUNTER_RATE_OVERRIDE: number = 256; readonly MYSTERY_ENCOUNTER_TIER_OVERRIDE: MysteryEncounterTier = null; - readonly MYSTERY_ENCOUNTER_OVERRIDE: MysteryEncounterType = null; + readonly MYSTERY_ENCOUNTER_OVERRIDE: MysteryEncounterType = MysteryEncounterType.TRAINING_SESSION; // ------------------------- // MODIFIER / ITEM OVERRIDES diff --git a/src/phases.ts b/src/phases.ts index 56206a97f1a..c6b238c5d79 100644 --- a/src/phases.ts +++ b/src/phases.ts @@ -915,7 +915,7 @@ export class EncounterPhase extends BattlePhase { // Load Mystery Encounter Exclamation bubble and sfx loadEnemyAssets.push(new Promise(resolve => { this.scene.loadSe("GEN8- Exclaim", "battle_anims", "GEN8- Exclaim.wav"); - this.scene.loadAtlas("exclaim", "mystery-encounters"); + this.scene.loadImage("exclaim", "mystery-encounters"); this.scene.load.once(Phaser.Loader.Events.COMPLETE, () => resolve()); if (!this.scene.load.isLoading()) { this.scene.load.start(); diff --git a/src/test/mystery-encounter/encounters/clowning-around-encounter.test.ts b/src/test/mystery-encounter/encounters/clowning-around-encounter.test.ts new file mode 100644 index 00000000000..1f2c02cf03e --- /dev/null +++ b/src/test/mystery-encounter/encounters/clowning-around-encounter.test.ts @@ -0,0 +1,374 @@ +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 { 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 { generateModifierTypeOption } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { runMysteryEncounterToEnd, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounterTestUtils"; +import { CommandPhase, MovePhase, NewBattlePhase, SelectModifierPhase } from "#app/phases"; +import { Moves } from "#enums/moves"; +import BattleScene from "#app/battle-scene"; +import Pokemon, { 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 { ModifierTier } from "#app/modifier/modifier-tier"; +import { ClowningAroundEncounter } from "#app/data/mystery-encounters/encounters/clowning-around-encounter"; +import { TrainerType } from "#enums/trainer-type"; +import { Abilities } from "#enums/abilities"; +import { PostMysteryEncounterPhase } from "#app/phases/mystery-encounter-phases"; +import { Button } from "#enums/buttons"; +import PartyUiHandler from "#app/ui/party-ui-handler"; +import OptionSelectUiHandler from "#app/ui/settings/option-select-ui-handler"; +import { modifierTypes, PokemonHeldItemModifierType } from "#app/modifier/modifier-type"; +import { BerryType } from "#enums/berry-type"; +import { PokemonHeldItemModifier } from "#app/modifier/modifier"; +import { Type } from "#app/data/type"; + +const namespace = "mysteryEncounter:clowningAround"; +const defaultParty = [Species.LAPRAS, Species.GENGAR, Species.ABRA]; +const defaultBiome = Biome.CAVE; +const defaultWave = 45; + +describe("Clowning Around - 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.mysteryEncounterTier(MysteryEncounterTier.COMMON); + game.override.startingWave(defaultWave); + game.override.startingBiome(defaultBiome); + + vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue( + new Map([ + [Biome.CAVE, [MysteryEncounterType.CLOWNING_AROUND]], + ]) + ); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + vi.clearAllMocks(); + vi.resetAllMocks(); + }); + + it("should have the correct properties", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.CLOWNING_AROUND, defaultParty); + + expect(ClowningAroundEncounter.encounterType).toBe(MysteryEncounterType.CLOWNING_AROUND); + expect(ClowningAroundEncounter.encounterTier).toBe(MysteryEncounterTier.ULTRA); + expect(ClowningAroundEncounter.dialogue).toBeDefined(); + expect(ClowningAroundEncounter.dialogue.intro).toStrictEqual([ + { text: `${namespace}.intro` }, + { + speaker: `${namespace}.speaker`, + text: `${namespace}.intro_dialogue`, + }, + ]); + expect(ClowningAroundEncounter.dialogue.encounterOptionsDialogue.title).toBe(`${namespace}.title`); + expect(ClowningAroundEncounter.dialogue.encounterOptionsDialogue.description).toBe(`${namespace}.description`); + expect(ClowningAroundEncounter.dialogue.encounterOptionsDialogue.query).toBe(`${namespace}.query`); + expect(ClowningAroundEncounter.options.length).toBe(3); + }); + + it("should not run below wave 80", async () => { + game.override.startingWave(79); + + await game.runToMysteryEncounter(); + + expect(scene.currentBattle?.mysteryEncounter?.encounterType).not.toBe(MysteryEncounterType.CLOWNING_AROUND); + }); + + 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 = ClowningAroundEncounter; + const moveInitSpy = vi.spyOn(BattleAnims, "initMoveAnim"); + const moveLoadSpy = vi.spyOn(BattleAnims, "loadMoveAnimAssets"); + + const { onInit } = ClowningAroundEncounter; + + expect(ClowningAroundEncounter.onInit).toBeDefined(); + + ClowningAroundEncounter.populateDialogueTokensFromRequirements(scene); + const onInitResult = onInit(scene); + const config = ClowningAroundEncounter.enemyPartyConfigs[0]; + + expect(config.doubleBattle).toBe(true); + expect(config.trainerConfig.trainerType).toBe(TrainerType.HARLEQUIN); + expect(config.pokemonConfigs[0]).toEqual({ + species: getPokemonSpecies(Species.MR_MIME), + isBoss: true, + moveSet: [Moves.TEETER_DANCE, Moves.ALLY_SWITCH, Moves.DAZZLING_GLEAM, Moves.PSYCHIC] + }); + expect(config.pokemonConfigs[1]).toEqual({ + species: getPokemonSpecies(Species.BLACEPHALON), + ability: expect.any(Number), + mysteryEncounterData: expect.anything(), + isBoss: true, + moveSet: [Moves.TRICK, Moves.HYPNOSIS, Moves.SHADOW_BALL, Moves.MIND_BLOWN] + }); + expect(config.pokemonConfigs[1].mysteryEncounterData.types.length).toBe(2); + expect([ + Abilities.STURDY, + Abilities.PICKUP, + Abilities.INTIMIDATE, + Abilities.GUTS, + Abilities.DROUGHT, + Abilities.DRIZZLE, + Abilities.SNOW_WARNING, + Abilities.SAND_STREAM, + Abilities.ELECTRIC_SURGE, + Abilities.PSYCHIC_SURGE, + Abilities.GRASSY_SURGE, + Abilities.MISTY_SURGE, + Abilities.MAGICIAN, + Abilities.SHEER_FORCE, + Abilities.PRANKSTER + ]).toContain(config.pokemonConfigs[1].ability); + expect(ClowningAroundEncounter.misc.ability).toBe(config.pokemonConfigs[1].ability); + await vi.waitFor(() => expect(moveInitSpy).toHaveBeenCalled()); + await vi.waitFor(() => expect(moveLoadSpy).toHaveBeenCalled()); + expect(onInitResult).toBe(true); + }); + + describe("Option 1 - Battle the Clown", () => { + it("should have the correct properties", () => { + const option = ClowningAroundEncounter.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 double battle against the clown", async () => { + const phaseSpy = vi.spyOn(scene, "pushPhase"); + + await game.runToMysteryEncounter(MysteryEncounterType.CLOWNING_AROUND, defaultParty); + await runMysteryEncounterToEnd(game, 1, null, true); + + const enemyField = scene.getEnemyField(); + expect(scene.getCurrentPhase().constructor.name).toBe(CommandPhase.name); + expect(enemyField.length).toBe(2); + expect(enemyField[0].species.speciesId).toBe(Species.MR_MIME); + expect(enemyField[0].moveset).toEqual([new PokemonMove(Moves.TEETER_DANCE), new PokemonMove(Moves.ALLY_SWITCH), new PokemonMove(Moves.DAZZLING_GLEAM), new PokemonMove(Moves.PSYCHIC)]); + expect(enemyField[1].species.speciesId).toBe(Species.BLACEPHALON); + expect(enemyField[1].moveset).toEqual([new PokemonMove(Moves.TRICK), new PokemonMove(Moves.HYPNOSIS), new PokemonMove(Moves.SHADOW_BALL), new PokemonMove(Moves.MIND_BLOWN)]); + + // Should have used moves pre-battle + const movePhases = phaseSpy.mock.calls.filter(p => p[0] instanceof MovePhase).map(p => p[0]); + expect(movePhases.length).toBe(3); + expect(movePhases.filter(p => (p as MovePhase).move.moveId === Moves.ROLE_PLAY).length).toBe(1); + expect(movePhases.filter(p => (p as MovePhase).move.moveId === Moves.TAUNT).length).toBe(2); + }); + + it("should let the player gain the ability after battle completion", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.CLOWNING_AROUND, defaultParty); + await runMysteryEncounterToEnd(game, 1, null, true); + await skipBattleRunMysteryEncounterRewardsPhase(game); + await game.phaseInterceptor.to(SelectModifierPhase, false); + expect(scene.getCurrentPhase().constructor.name).toBe(SelectModifierPhase.name); + await game.phaseInterceptor.run(SelectModifierPhase); + const abilityToTrain = scene.currentBattle.mysteryEncounter.misc.ability; + + game.onNextPrompt("PostMysteryEncounterPhase", Mode.MESSAGE, () => { + game.scene.ui.getHandler().processInput(Button.ACTION); + }); + + // Run to ability train option selection + const optionSelectUiHandler = game.scene.ui.handlers[Mode.OPTION_SELECT] as OptionSelectUiHandler; + vi.spyOn(optionSelectUiHandler, "show"); + const partyUiHandler = game.scene.ui.handlers[Mode.PARTY] as PartyUiHandler; + vi.spyOn(partyUiHandler, "show"); + game.endPhase(); + await game.phaseInterceptor.to(PostMysteryEncounterPhase); + expect(scene.getCurrentPhase().constructor.name).toBe(PostMysteryEncounterPhase.name); + + // Wait for Yes/No confirmation to appear + await vi.waitFor(() => expect(optionSelectUiHandler.show).toHaveBeenCalled()); + // Select "Yes" on train ability + optionSelectUiHandler.processInput(Button.ACTION); + // Select first pokemon in party to train + await vi.waitFor(() => expect(partyUiHandler.show).toHaveBeenCalled()); + partyUiHandler.processInput(Button.ACTION); + // Click "Select" on Pokemon + partyUiHandler.processInput(Button.ACTION); + // Stop next battle before it runs + await game.phaseInterceptor.to(NewBattlePhase, false); + + const leadPokemon = scene.getParty()[0]; + expect(leadPokemon.mysteryEncounterData.ability).toBe(abilityToTrain); + }); + }); + + describe("Option 2 - Remain Unprovoked", () => { + it("should have the correct properties", () => { + const option = ClowningAroundEncounter.options[1]; + expect(option.optionMode).toBe(MysteryEncounterOptionMode.DEFAULT); + expect(option.dialogue).toBeDefined(); + expect(option.dialogue).toStrictEqual({ + buttonLabel: `${namespace}.option.2.label`, + buttonTooltip: `${namespace}.option.2.tooltip`, + selected: [ + { + speaker: `${namespace}.speaker`, + text: `${namespace}.option.2.selected`, + }, + { + text: `${namespace}.option.2.selected_2`, + }, + { + speaker: `${namespace}.speaker`, + text: `${namespace}.option.2.selected_3`, + }, + ], + }); + }); + + it("should randomize held items of the Pokemon with the most items, and not the held items of other pokemon", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.CLOWNING_AROUND, defaultParty); + + // 2 Sitrus Berries on lead + scene.modifiers = []; + let itemType = generateModifierTypeOption(scene, modifierTypes.BERRY, [BerryType.SITRUS]).type as PokemonHeldItemModifierType; + await addItemToPokemon(scene, scene.getParty()[0], 2, itemType); + // 2 Ganlon Berries on lead + itemType = generateModifierTypeOption(scene, modifierTypes.BERRY, [BerryType.GANLON]).type as PokemonHeldItemModifierType; + await addItemToPokemon(scene, scene.getParty()[0], 2, itemType); + // 5 Golden Punch on lead (ultra) + itemType = generateModifierTypeOption(scene, modifierTypes.GOLDEN_PUNCH).type as PokemonHeldItemModifierType; + await addItemToPokemon(scene, scene.getParty()[0], 5, itemType); + // 5 Lucky Egg on lead (ultra) + itemType = generateModifierTypeOption(scene, modifierTypes.LUCKY_EGG).type as PokemonHeldItemModifierType; + await addItemToPokemon(scene, scene.getParty()[0], 5, itemType); + // 5 Soul Dew on lead (rogue) + itemType = generateModifierTypeOption(scene, modifierTypes.SOUL_DEW).type as PokemonHeldItemModifierType; + await addItemToPokemon(scene, scene.getParty()[0], 5, itemType); + // 2 Golden Egg on lead (rogue) + itemType = generateModifierTypeOption(scene, modifierTypes.GOLDEN_EGG).type as PokemonHeldItemModifierType; + await addItemToPokemon(scene, scene.getParty()[0], 2, itemType); + + // 5 Soul Dew on second party pokemon (these should not change) + itemType = generateModifierTypeOption(scene, modifierTypes.SOUL_DEW).type as PokemonHeldItemModifierType; + await addItemToPokemon(scene, scene.getParty()[1], 5, itemType); + + await runMysteryEncounterToEnd(game, 2); + + const leadItemsAfter = scene.getParty()[0].getHeldItems(); + const ultraCountAfter = leadItemsAfter + .filter(m => m.type.tier === ModifierTier.ULTRA) + .reduce((a, b) => a + b.stackCount, 0); + const rogueCountAfter = leadItemsAfter + .filter(m => m.type.tier === ModifierTier.ROGUE) + .reduce((a, b) => a + b.stackCount, 0); + expect(ultraCountAfter).toBe(10); + expect(rogueCountAfter).toBe(7); + + const secondItemsAfter = scene.getParty()[1].getHeldItems(); + expect(secondItemsAfter.length).toBe(1); + expect(secondItemsAfter[0].type.id).toBe("SOUL_DEW"); + expect(secondItemsAfter[0].stackCount).toBe(5); + }); + + it("should leave encounter without battle", async () => { + const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); + + await game.runToMysteryEncounter(MysteryEncounterType.CLOWNING_AROUND, defaultParty); + await runMysteryEncounterToEnd(game, 2); + + expect(leaveEncounterWithoutBattleSpy).toBeCalled(); + }); + }); + + describe("Option 3 - Return the Insults", () => { + it("should have the correct properties", () => { + const option = ClowningAroundEncounter.options[2]; + expect(option.optionMode).toBe(MysteryEncounterOptionMode.DEFAULT); + expect(option.dialogue).toBeDefined(); + expect(option.dialogue).toStrictEqual({ + buttonLabel: `${namespace}.option.3.label`, + buttonTooltip: `${namespace}.option.3.tooltip`, + selected: [ + { + speaker: `${namespace}.speaker`, + text: `${namespace}.option.3.selected`, + }, + { + text: `${namespace}.option.3.selected_2`, + }, + { + speaker: `${namespace}.speaker`, + text: `${namespace}.option.3.selected_3`, + }, + ], + }); + }); + + it("should randomize the pokemon types of the party", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.CLOWNING_AROUND, defaultParty); + + // Same type moves on lead + scene.getParty()[0].moveset = [new PokemonMove(Moves.ICE_BEAM), new PokemonMove(Moves.SURF)]; + // Different type moves on second + scene.getParty()[1].moveset = [new PokemonMove(Moves.GRASS_KNOT), new PokemonMove(Moves.ELECTRO_BALL)]; + // No moves on third + scene.getParty()[2].moveset = []; + await runMysteryEncounterToEnd(game, 3); + + const leadTypesAfter = scene.getParty()[0].mysteryEncounterData.types; + const secondaryTypesAfter = scene.getParty()[1].mysteryEncounterData.types; + const thirdTypesAfter = scene.getParty()[2].mysteryEncounterData.types; + + expect(leadTypesAfter.length).toBe(2); + expect(leadTypesAfter).not.toBe([Type.ICE, Type.WATER]); + expect(secondaryTypesAfter.length).toBe(2); + expect(secondaryTypesAfter.includes(Type.GRASS)).toBeTruthy(); + expect(secondaryTypesAfter.includes(Type.ELECTRIC)).toBeTruthy(); + expect(thirdTypesAfter.length).toBe(1); + }); + + it("should leave encounter without battle", async () => { + const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); + + await game.runToMysteryEncounter(MysteryEncounterType.CLOWNING_AROUND, defaultParty); + await runMysteryEncounterToEnd(game, 3); + + expect(leaveEncounterWithoutBattleSpy).toBeCalled(); + }); + }); +}); + +async function addItemToPokemon(scene: BattleScene, pokemon: Pokemon, stackCount: integer, itemType: PokemonHeldItemModifierType) { + const itemMod = itemType.newModifier(pokemon) as PokemonHeldItemModifier; + itemMod.stackCount = stackCount; + await scene.addModifier(itemMod, true, false, false, true); + await scene.updateModifiers(true); +} 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 105fbb3fd6b..db89e15b33f 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 @@ -23,6 +23,7 @@ import { PokemonBaseStatTotalModifier } 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"; +import { MysteryEncounterPokemonData } from "#app/data/mystery-encounters/mystery-encounter-pokemon-data"; const namespace = "mysteryEncounter:theStrongStuff"; const defaultParty = [Species.LAPRAS, Species.GENGAR, Species.ABRA]; @@ -118,7 +119,7 @@ describe("The Strong Stuff - Mystery Encounter", () => { species: getPokemonSpecies(Species.SHUCKLE), isBoss: true, bossSegments: 5, - spriteScale: 1.5, + mysteryEncounterData: new MysteryEncounterPokemonData(1.5), nature: Nature.BOLD, moveSet: [Moves.INFESTATION, Moves.SALT_CURE, Moves.GASTRO_ACID, Moves.HEAL_ORDER], modifierTypes: expect.any(Array), diff --git a/src/ui/mystery-encounter-ui-handler.ts b/src/ui/mystery-encounter-ui-handler.ts index 3d89afcd784..04642bec37b 100644 --- a/src/ui/mystery-encounter-ui-handler.ts +++ b/src/ui/mystery-encounter-ui-handler.ts @@ -81,8 +81,8 @@ export default class MysteryEncounterUiHandler extends UiHandler { this.rarityBall.setScale(0.75); this.descriptionContainer.add(this.rarityBall); - const dexProgressIndicator = this.scene.add.sprite(12, 9, "encounter_radar"); - dexProgressIndicator.setScale(0.85); + const dexProgressIndicator = this.scene.add.sprite(12, 10, "encounter_radar"); + dexProgressIndicator.setScale(0.80); this.dexProgressContainer.add(dexProgressIndicator); this.dexProgressContainer.setInteractive(new Phaser.Geom.Rectangle(0, 0, 24, 28), Phaser.Geom.Rectangle.Contains); this.dexProgressContainer.on("pointerover", () => { From 9f4a0d24758cc39da34a20375657a5d96bd893b3 Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Wed, 7 Aug 2024 22:55:39 -0400 Subject: [PATCH 235/270] add unit tests for clowning around --- src/overrides.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/overrides.ts b/src/overrides.ts index 6632dfeab6f..1196797fac0 100644 --- a/src/overrides.ts +++ b/src/overrides.ts @@ -127,9 +127,9 @@ class DefaultOverrides { // ------------------------- // 1 to 256, set to null to ignore - readonly MYSTERY_ENCOUNTER_RATE_OVERRIDE: number = 256; + readonly MYSTERY_ENCOUNTER_RATE_OVERRIDE: number = null; readonly MYSTERY_ENCOUNTER_TIER_OVERRIDE: MysteryEncounterTier = null; - readonly MYSTERY_ENCOUNTER_OVERRIDE: MysteryEncounterType = MysteryEncounterType.TRAINING_SESSION; + readonly MYSTERY_ENCOUNTER_OVERRIDE: MysteryEncounterType = null; // ------------------------- // MODIFIER / ITEM OVERRIDES From db2fb6e54d0d856e1b2d40ce2f19c6510032a50c Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Thu, 8 Aug 2024 09:24:07 -0400 Subject: [PATCH 236/270] clean up ME unit tests --- .../encounters/a-trainers-test-encounter.test.ts | 2 +- .../encounters/absolute-avarice-encounter.test.ts | 4 ++-- .../encounters/an-offer-you-cant-refuse-encounter.test.ts | 2 +- .../encounters/berries-abound-encounter.test.ts | 2 +- .../encounters/clowning-around-encounter.test.ts | 2 +- .../mystery-encounter/encounters/delibirdy-encounter.test.ts | 2 +- .../encounters/department-store-sale-encounter.test.ts | 1 - .../encounters/fiery-fallout-encounter.test.ts | 2 +- .../encounters/fight-or-flight-encounter.test.ts | 2 +- .../encounters/lost-at-sea-encounter.test.ts | 1 + .../encounters/the-pokemon-salesman-encounter.test.ts | 2 +- .../encounters/the-strong-stuff-encounter.test.ts | 2 +- .../encounters/trash-to-treasure-encounter.test.ts | 2 +- 13 files changed, 13 insertions(+), 13 deletions(-) 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 083d6c6985f..74effa3b29d 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 @@ -33,9 +33,9 @@ describe("A Trainer's Test - Mystery Encounter", () => { game = new GameManager(phaserGame); scene = game.scene; game.override.mysteryEncounterChance(100); - game.override.mysteryEncounterTier(MysteryEncounterTier.COMMON); game.override.startingWave(defaultWave); game.override.startingBiome(defaultBiome); + game.override.disableTrainerWaves(true); const biomeMap = new Map([ [Biome.VOLCANO, [MysteryEncounterType.MYSTERIOUS_CHALLENGERS]], 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 7b0c7a2dd7e..e80b5821dbf 100644 --- a/src/test/mystery-encounter/encounters/absolute-avarice-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/absolute-avarice-encounter.test.ts @@ -33,9 +33,9 @@ describe("Absolute Avarice - Mystery Encounter", () => { game = new GameManager(phaserGame); scene = game.scene; game.override.mysteryEncounterChance(100); - game.override.mysteryEncounterTier(MysteryEncounterTier.COMMON); game.override.startingWave(defaultWave); game.override.startingBiome(defaultBiome); + game.override.disableTrainerWaves(true); vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue( new Map([ @@ -106,7 +106,7 @@ describe("Absolute Avarice - Mystery Encounter", () => { it("should remove all player's berries at the start of the encounter", async () => { game.override.starterHeldItems([{name: "BERRY", count: 2, type: BerryType.SITRUS}, {name: "BERRY", count: 3, type: BerryType.GANLON}]); - await game.runToMysteryEncounter(); + await game.runToMysteryEncounter(MysteryEncounterType.ABSOLUTE_AVARICE, defaultParty); expect(scene.currentBattle?.mysteryEncounter?.encounterType).toBe(MysteryEncounterType.ABSOLUTE_AVARICE); expect(scene.modifiers?.length).toBe(0); 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 fe7e5b676a3..6b4405a779b 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 @@ -36,9 +36,9 @@ describe("An Offer You Can't Refuse - Mystery Encounter", () => { game = new GameManager(phaserGame); scene = game.scene; game.override.mysteryEncounterChance(100); - game.override.mysteryEncounterTier(MysteryEncounterTier.COMMON); game.override.startingWave(defaultWave); game.override.startingBiome(defaultBiome); + game.override.disableTrainerWaves(true); const biomeMap = new Map([ [Biome.VOLCANO, [MysteryEncounterType.MYSTERIOUS_CHALLENGERS]], 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 9bd17702f74..6164c32418c 100644 --- a/src/test/mystery-encounter/encounters/berries-abound-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/berries-abound-encounter.test.ts @@ -39,9 +39,9 @@ describe("Berries Abound - Mystery Encounter", () => { game = new GameManager(phaserGame); scene = game.scene; game.override.mysteryEncounterChance(100); - game.override.mysteryEncounterTier(MysteryEncounterTier.COMMON); game.override.startingWave(defaultWave); game.override.startingBiome(defaultBiome); + game.override.disableTrainerWaves(true); vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue( new Map([ 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 1f2c02cf03e..3acd8d1ef99 100644 --- a/src/test/mystery-encounter/encounters/clowning-around-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/clowning-around-encounter.test.ts @@ -48,9 +48,9 @@ describe("Clowning Around - Mystery Encounter", () => { game = new GameManager(phaserGame); scene = game.scene; game.override.mysteryEncounterChance(100); - game.override.mysteryEncounterTier(MysteryEncounterTier.COMMON); game.override.startingWave(defaultWave); game.override.startingBiome(defaultBiome); + game.override.disableTrainerWaves(true); vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue( new Map([ diff --git a/src/test/mystery-encounter/encounters/delibirdy-encounter.test.ts b/src/test/mystery-encounter/encounters/delibirdy-encounter.test.ts index 0da778d793c..8934dbb5f5c 100644 --- a/src/test/mystery-encounter/encounters/delibirdy-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/delibirdy-encounter.test.ts @@ -35,9 +35,9 @@ describe("Delibird-y - Mystery Encounter", () => { game = new GameManager(phaserGame); scene = game.scene; game.override.mysteryEncounterChance(100); - game.override.mysteryEncounterTier(MysteryEncounterTier.COMMON); game.override.startingWave(defaultWave); game.override.startingBiome(defaultBiome); + game.override.disableTrainerWaves(true); vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue( new Map([ 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 2eb1b6176bc..016dbcee964 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 @@ -33,7 +33,6 @@ describe("Department Store Sale - Mystery Encounter", () => { game = new GameManager(phaserGame); scene = game.scene; game.override.mysteryEncounterChance(100); - game.override.mysteryEncounterTier(MysteryEncounterTier.COMMON); game.override.startingWave(defaultWave); game.override.startingBiome(defaultBiome); game.override.disableTrainerWaves(true); 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 00ae3a37139..31f41a32701 100644 --- a/src/test/mystery-encounter/encounters/fiery-fallout-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/fiery-fallout-encounter.test.ts @@ -40,9 +40,9 @@ describe("Fiery Fallout - Mystery Encounter", () => { game = new GameManager(phaserGame); scene = game.scene; game.override.mysteryEncounterChance(100); - game.override.mysteryEncounterTier(MysteryEncounterTier.COMMON); game.override.startingWave(defaultWave); game.override.startingBiome(defaultBiome); + game.override.disableTrainerWaves(true); vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue( new Map([ 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 70978c90834..b44acc6d027 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 @@ -38,9 +38,9 @@ describe("Fight or Flight - Mystery Encounter", () => { game = new GameManager(phaserGame); scene = game.scene; game.override.mysteryEncounterChance(100); - game.override.mysteryEncounterTier(MysteryEncounterTier.COMMON); game.override.startingWave(defaultWave); game.override.startingBiome(defaultBiome); + game.override.disableTrainerWaves(true); vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue( new Map([ 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 dd892ee8a9d..0e4d56c9fc1 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 @@ -36,6 +36,7 @@ describe("Lost at Sea - Mystery Encounter", () => { game.override.mysteryEncounterChance(100); game.override.startingWave(defaultWave); game.override.startingBiome(defaultBiome); + game.override.disableTrainerWaves(true); vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue( new Map([ 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 93686ecc64b..966d9763440 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 @@ -33,9 +33,9 @@ describe("The Pokemon Salesman - Mystery Encounter", () => { game = new GameManager(phaserGame); scene = game.scene; game.override.mysteryEncounterChance(100); - game.override.mysteryEncounterTier(MysteryEncounterTier.COMMON); game.override.startingWave(defaultWave); game.override.startingBiome(defaultBiome); + game.override.disableTrainerWaves(true); const biomeMap = new Map([ [Biome.VOLCANO, [MysteryEncounterType.MYSTERIOUS_CHALLENGERS]], 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 db89e15b33f..bcfdad48ad3 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 @@ -43,9 +43,9 @@ describe("The Strong Stuff - Mystery Encounter", () => { game = new GameManager(phaserGame); scene = game.scene; game.override.mysteryEncounterChance(100); - game.override.mysteryEncounterTier(MysteryEncounterTier.COMMON); game.override.startingWave(defaultWave); game.override.startingBiome(defaultBiome); + game.override.disableTrainerWaves(true); vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue( new Map([ 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 df3a3471548..3d4cd8855cd 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 @@ -39,9 +39,9 @@ describe("Trash to Treasure - Mystery Encounter", () => { game = new GameManager(phaserGame); scene = game.scene; game.override.mysteryEncounterChance(100); - game.override.mysteryEncounterTier(MysteryEncounterTier.COMMON); game.override.startingWave(defaultWave); game.override.startingBiome(defaultBiome); + game.override.disableTrainerWaves(true); vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue( new Map([ From ba637e80e280250766f33261c8276d9f9a4353c0 Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Thu, 8 Aug 2024 16:04:14 -0400 Subject: [PATCH 237/270] clean up unit tests --- .../mysterious-challengers-encounter.test.ts | 269 ++++++++++++++++++ 1 file changed, 269 insertions(+) create mode 100644 src/test/mystery-encounter/encounters/mysterious-challengers-encounter.test.ts diff --git a/src/test/mystery-encounter/encounters/mysterious-challengers-encounter.test.ts b/src/test/mystery-encounter/encounters/mysterious-challengers-encounter.test.ts new file mode 100644 index 00000000000..94a7161a9cd --- /dev/null +++ b/src/test/mystery-encounter/encounters/mysterious-challengers-encounter.test.ts @@ -0,0 +1,269 @@ +import * as MysteryEncounters from "#app/data/mystery-encounters/mystery-encounters"; +import { HUMAN_TRANSITABLE_BIOMES } 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, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounterTestUtils"; +import { CommandPhase, SelectModifierPhase } from "#app/phases"; +import BattleScene from "#app/battle-scene"; +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 { ModifierTier } from "#app/modifier/modifier-tier"; +import { MysteriousChallengersEncounter } from "#app/data/mystery-encounters/encounters/mysterious-challengers-encounter"; +import { TrainerConfig, TrainerPartyCompoundTemplate, TrainerPartyTemplate } from "#app/data/trainer-config"; +import { PartyMemberStrength } from "#enums/party-member-strength"; +import { MysteryEncounterMode } from "#enums/mystery-encounter-mode"; +import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; +import IMysteryEncounter from "#app/data/mystery-encounters/mystery-encounter"; + +const namespace = "mysteryEncounter:mysteriousChallengers"; +const defaultParty = [Species.LAPRAS, Species.GENGAR, Species.ABRA]; +const defaultBiome = Biome.CAVE; +const defaultWave = 45; + +describe("Mysterious Challengers - 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(true); + + const biomeMap = new Map([ + [Biome.VOLCANO, [MysteryEncounterType.FIGHT_OR_FLIGHT]], + ]); + HUMAN_TRANSITABLE_BIOMES.forEach(biome => { + biomeMap.set(biome, [MysteryEncounterType.MYSTERIOUS_CHALLENGERS]); + }); + vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue(biomeMap); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + vi.clearAllMocks(); + vi.resetAllMocks(); + }); + + it("should have the correct properties", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.MYSTERIOUS_CHALLENGERS, defaultParty); + + expect(MysteriousChallengersEncounter.encounterType).toBe(MysteryEncounterType.MYSTERIOUS_CHALLENGERS); + expect(MysteriousChallengersEncounter.encounterTier).toBe(MysteryEncounterTier.GREAT); + expect(MysteriousChallengersEncounter.dialogue).toBeDefined(); + expect(MysteriousChallengersEncounter.dialogue.intro).toStrictEqual([{ text: `${namespace}.intro` }]); + expect(MysteriousChallengersEncounter.dialogue.encounterOptionsDialogue.title).toBe(`${namespace}.title`); + expect(MysteriousChallengersEncounter.dialogue.encounterOptionsDialogue.description).toBe(`${namespace}.description`); + expect(MysteriousChallengersEncounter.dialogue.encounterOptionsDialogue.query).toBe(`${namespace}.query`); + expect(MysteriousChallengersEncounter.options.length).toBe(3); + }); + + it("should not spawn outside of HUMAN_TRANSITABLE_BIOMES", async () => { + game.override.startingBiome(Biome.VOLCANO); + await game.runToMysteryEncounter(); + + expect(scene.currentBattle?.mysteryEncounter?.encounterType).not.toBe(MysteryEncounterType.MYSTERIOUS_CHALLENGERS); + }); + + it("should not run below wave 10", async () => { + game.override.startingWave(9); + + await game.runToMysteryEncounter(); + + expect(scene.currentBattle?.mysteryEncounter?.encounterType).not.toBe(MysteryEncounterType.MYSTERIOUS_CHALLENGERS); + }); + + it("should not run above wave 179", async () => { + game.override.mysteryEncounterTier(MysteryEncounterTier.GREAT); + game.override.startingWave(181); + + await game.runToMysteryEncounter(); + + expect(scene.currentBattle.mysteryEncounter).toBeUndefined(); + }); + + it("should initialize fully", async () => { + initSceneWithoutEncounterPhase(scene, defaultParty); + scene.currentBattle.mysteryEncounter = new IMysteryEncounter(MysteriousChallengersEncounter); + const encounter = scene.currentBattle.mysteryEncounter; + scene.currentBattle.waveIndex = defaultWave; + + const { onInit } = encounter; + + expect(encounter.onInit).toBeDefined(); + + encounter.populateDialogueTokensFromRequirements(scene); + const onInitResult = onInit(scene); + + expect(encounter.enemyPartyConfigs).toBeDefined(); + expect(encounter.enemyPartyConfigs.length).toBe(3); + expect(encounter.enemyPartyConfigs).toEqual([ + { + trainerConfig: expect.any(TrainerConfig), + female: expect.any(Boolean), + }, + { + trainerConfig: expect.any(TrainerConfig), + levelAdditiveMultiplier: 0.5, + female: expect.any(Boolean), + }, + { + trainerConfig: expect.any(TrainerConfig), + levelAdditiveMultiplier: 1, + female: expect.any(Boolean), + } + ]); + expect(encounter.enemyPartyConfigs[1].trainerConfig.partyTemplates[0]).toEqual(new TrainerPartyCompoundTemplate( + new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER, false, true), + new TrainerPartyTemplate(3, PartyMemberStrength.AVERAGE, false, true) + )); + expect(encounter.enemyPartyConfigs[2].trainerConfig.partyTemplates[0]).toEqual(new TrainerPartyCompoundTemplate( + new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE), + new TrainerPartyTemplate(3, PartyMemberStrength.STRONG), + new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER)) + ); + expect(encounter.spriteConfigs).toBeDefined(); + expect(encounter.spriteConfigs.length).toBe(3); + expect(onInitResult).toBe(true); + }); + + describe("Option 1 - Normal Battle", () => { + it("should have the correct properties", () => { + const option = MysteriousChallengersEncounter.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: [ + { + text: `${namespace}.option.selected`, + }, + ], + }); + }); + + it("should start battle against the trainer", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.MYSTERIOUS_CHALLENGERS, defaultParty); + await runMysteryEncounterToEnd(game, 1, null, true); + + expect(scene.getCurrentPhase().constructor.name).toBe(CommandPhase.name); + expect(scene.currentBattle.trainer).toBeDefined(); + expect(scene.currentBattle.mysteryEncounter.encounterMode).toBe(MysteryEncounterMode.TRAINER_BATTLE); + }); + + it("should have normal trainer rewards after battle", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.MYSTERIOUS_CHALLENGERS, defaultParty); + await runMysteryEncounterToEnd(game, 1, null, true); + await skipBattleRunMysteryEncounterRewardsPhase(game); + await game.phaseInterceptor.to(SelectModifierPhase, false); + 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).toContain("TM_COMMON"); + expect(modifierSelectHandler.options[1].modifierTypeOption.type.id).toContain("TM_GREAT"); + expect(modifierSelectHandler.options[2].modifierTypeOption.type.id).toContain("MEMORY_MUSHROOM"); + }); + }); + + describe("Option 2 - Hard Battle", () => { + it("should have the correct properties", () => { + const option = MysteriousChallengersEncounter.options[1]; + expect(option.optionMode).toBe(MysteryEncounterOptionMode.DEFAULT); + expect(option.dialogue).toBeDefined(); + expect(option.dialogue).toStrictEqual({ + buttonLabel: `${namespace}.option.2.label`, + buttonTooltip: `${namespace}.option.2.tooltip`, + selected: [ + { + text: `${namespace}.option.selected`, + }, + ], + }); + }); + + it("should start battle against the trainer", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.MYSTERIOUS_CHALLENGERS, defaultParty); + await runMysteryEncounterToEnd(game, 2, null, true); + + expect(scene.getCurrentPhase().constructor.name).toBe(CommandPhase.name); + expect(scene.currentBattle.trainer).toBeDefined(); + expect(scene.currentBattle.mysteryEncounter.encounterMode).toBe(MysteryEncounterMode.TRAINER_BATTLE); + }); + + it("should have hard trainer rewards after battle", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.MYSTERIOUS_CHALLENGERS, defaultParty); + await runMysteryEncounterToEnd(game, 2, null, true); + await skipBattleRunMysteryEncounterRewardsPhase(game); + await game.phaseInterceptor.to(SelectModifierPhase, false); + 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(4); + expect(modifierSelectHandler.options[0].modifierTypeOption.type.tier - modifierSelectHandler.options[0].modifierTypeOption.upgradeCount).toBe(ModifierTier.ULTRA); + expect(modifierSelectHandler.options[1].modifierTypeOption.type.tier - modifierSelectHandler.options[1].modifierTypeOption.upgradeCount).toBe(ModifierTier.ULTRA); + expect(modifierSelectHandler.options[2].modifierTypeOption.type.tier - modifierSelectHandler.options[2].modifierTypeOption.upgradeCount).toBe(ModifierTier.GREAT); + expect(modifierSelectHandler.options[3].modifierTypeOption.type.tier - modifierSelectHandler.options[3].modifierTypeOption.upgradeCount).toBe(ModifierTier.GREAT); + }); + }); + + describe("Option 3 - Brutal Battle", () => { + it("should have the correct properties", () => { + const option = MysteriousChallengersEncounter.options[2]; + expect(option.optionMode).toBe(MysteryEncounterOptionMode.DEFAULT); + expect(option.dialogue).toBeDefined(); + expect(option.dialogue).toStrictEqual({ + buttonLabel: `${namespace}.option.3.label`, + buttonTooltip: `${namespace}.option.3.tooltip`, + selected: [ + { + text: `${namespace}.option.selected`, + }, + ], + }); + }); + + it("should start battle against the trainer", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.MYSTERIOUS_CHALLENGERS, defaultParty); + await runMysteryEncounterToEnd(game, 3, null, true); + + expect(scene.getCurrentPhase().constructor.name).toBe(CommandPhase.name); + expect(scene.currentBattle.trainer).toBeDefined(); + expect(scene.currentBattle.mysteryEncounter.encounterMode).toBe(MysteryEncounterMode.TRAINER_BATTLE); + }); + + it("should have brutal trainer rewards after battle", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.MYSTERIOUS_CHALLENGERS, defaultParty); + await runMysteryEncounterToEnd(game, 3, null, true); + await skipBattleRunMysteryEncounterRewardsPhase(game); + await game.phaseInterceptor.to(SelectModifierPhase, false); + 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(4); + expect(modifierSelectHandler.options[0].modifierTypeOption.type.tier - modifierSelectHandler.options[0].modifierTypeOption.upgradeCount).toBe(ModifierTier.ROGUE); + expect(modifierSelectHandler.options[1].modifierTypeOption.type.tier - modifierSelectHandler.options[1].modifierTypeOption.upgradeCount).toBe(ModifierTier.ROGUE); + expect(modifierSelectHandler.options[2].modifierTypeOption.type.tier - modifierSelectHandler.options[2].modifierTypeOption.upgradeCount).toBe(ModifierTier.ULTRA); + expect(modifierSelectHandler.options[3].modifierTypeOption.type.tier - modifierSelectHandler.options[3].modifierTypeOption.upgradeCount).toBe(ModifierTier.GREAT); + }); + }); +}); From de928e5d7ebce79dc3bf1727cfa068a676eb7c87 Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Thu, 8 Aug 2024 17:38:41 -0400 Subject: [PATCH 238/270] update unit tests --- src/battle-scene.ts | 13 +++++++++++-- .../encounters/absolute-avarice-encounter.test.ts | 2 ++ .../an-offer-you-cant-refuse-encounter.test.ts | 1 + .../department-store-sale-encounter.test.ts | 1 + .../encounters/lost-at-sea-encounter.test.ts | 1 + .../mysterious-challengers-encounter.test.ts | 2 +- .../the-pokemon-salesman-encounter.test.ts | 1 + .../encounters/the-strong-stuff-encounter.test.ts | 1 + 8 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/battle-scene.ts b/src/battle-scene.ts index 249ddebdd60..80a1ae9e8ae 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -2760,7 +2760,7 @@ export default class BattleScene extends SceneBase { const previousEncounter = this.mysteryEncounterData.encounteredEvents?.length > 0 ? this.mysteryEncounterData.encounteredEvents[this.mysteryEncounterData.encounteredEvents.length - 1][0] : null; const biomeMysteryEncounters = mysteryEncountersByBiome.get(this.arena.biomeType) ?? []; // If no valid encounters exist at tier, checks next tier down, continuing until there are some encounters available - while (availableEncounters.length === 0 && tier >= 0) { + while (availableEncounters.length === 0 && tier !== null) { availableEncounters = biomeMysteryEncounters .filter((encounterType) => { const encounterCandidate = allMysteryEncounters[encounterType]; @@ -2784,7 +2784,16 @@ export default class BattleScene extends SceneBase { return true; }) .map((m) => (allMysteryEncounters[m])); - tier--; + // Decrement tier + if (tier === MysteryEncounterTier.ROGUE) { + tier = MysteryEncounterTier.ULTRA; + } else if (tier === MysteryEncounterTier.ULTRA) { + tier = MysteryEncounterTier.GREAT; + } else if (tier === MysteryEncounterTier.GREAT) { + tier = MysteryEncounterTier.COMMON; + } else { + tier = null; // Ends loop + } } // If absolutely no encounters are available, spawn 0th encounter 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 e80b5821dbf..d21421cde2b 100644 --- a/src/test/mystery-encounter/encounters/absolute-avarice-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/absolute-avarice-encounter.test.ts @@ -81,6 +81,7 @@ describe("Absolute Avarice - Mystery Encounter", () => { }); it("should not spawn outside of proper biomes", async () => { + game.override.mysteryEncounterTier(MysteryEncounterTier.GREAT); game.override.startingBiome(Biome.VOLCANO); await game.runToMysteryEncounter(); @@ -96,6 +97,7 @@ describe("Absolute Avarice - Mystery Encounter", () => { }); it("should spawn if player has enough berries", async () => { + game.override.mysteryEncounterTier(MysteryEncounterTier.GREAT); game.override.starterHeldItems([{name: "BERRY", count: 2, type: BerryType.SITRUS}, {name: "BERRY", count: 3, type: BerryType.GANLON}]); await game.runToMysteryEncounter(); 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 6b4405a779b..128a4c109dc 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 @@ -72,6 +72,7 @@ describe("An Offer You Can't Refuse - Mystery Encounter", () => { }); it("should not spawn outside of HUMAN_TRANSITABLE_BIOMES", async () => { + game.override.mysteryEncounterTier(MysteryEncounterTier.GREAT); game.override.startingBiome(Biome.VOLCANO); await game.runToMysteryEncounter(); 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 016dbcee964..1ffd1708523 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 @@ -72,6 +72,7 @@ describe("Department Store Sale - Mystery Encounter", () => { }); it("should not spawn outside of CIVILIZATION_ENCOUNTER_BIOMES", async () => { + game.override.mysteryEncounterTier(MysteryEncounterTier.COMMON); game.override.startingBiome(Biome.VOLCANO); await game.runToMysteryEncounter(); 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 0e4d56c9fc1..c9d2d276ecb 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 @@ -66,6 +66,7 @@ describe("Lost at Sea - Mystery Encounter", () => { }); it("should not spawn outside of sea biome", async () => { + game.override.mysteryEncounterTier(MysteryEncounterTier.COMMON); game.override.startingBiome(Biome.MOUNTAIN); await game.runToMysteryEncounter(); 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 94a7161a9cd..7fe6b1a3f95 100644 --- a/src/test/mystery-encounter/encounters/mysterious-challengers-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/mysterious-challengers-encounter.test.ts @@ -71,6 +71,7 @@ describe("Mysterious Challengers - Mystery Encounter", () => { }); it("should not spawn outside of HUMAN_TRANSITABLE_BIOMES", async () => { + game.override.mysteryEncounterTier(MysteryEncounterTier.GREAT); game.override.startingBiome(Biome.VOLCANO); await game.runToMysteryEncounter(); @@ -86,7 +87,6 @@ describe("Mysterious Challengers - Mystery Encounter", () => { }); it("should not run above wave 179", async () => { - game.override.mysteryEncounterTier(MysteryEncounterTier.GREAT); game.override.startingWave(181); await game.runToMysteryEncounter(); 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 966d9763440..833503e2636 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 @@ -69,6 +69,7 @@ describe("The Pokemon Salesman - Mystery Encounter", () => { }); it("should not spawn outside of HUMAN_TRANSITABLE_BIOMES", async () => { + game.override.mysteryEncounterTier(MysteryEncounterTier.ULTRA); game.override.startingBiome(Biome.VOLCANO); await game.runToMysteryEncounter(); 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 bcfdad48ad3..21d0678c858 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 @@ -75,6 +75,7 @@ describe("The Strong Stuff - Mystery Encounter", () => { }); it("should not spawn outside of CAVE biome", async () => { + game.override.mysteryEncounterTier(MysteryEncounterTier.COMMON); game.override.startingBiome(Biome.MOUNTAIN); await game.runToMysteryEncounter(); From f90d8b057592c5c3ae1a2a63d6af99807eaa8fd6 Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Sun, 11 Aug 2024 22:41:22 -0400 Subject: [PATCH 239/270] add part timer and dancing lessons encounters --- public/battle-anims/encounter-dance.json | 951 ++++++++++++++++++ src/battle-scene.ts | 2 +- src/data/battle-anims.ts | 12 +- .../encounters/absolute-avarice-encounter.ts | 13 +- .../encounters/dancing-lessons-encounter.ts | 279 +++++ .../encounters/part-timer-encounter.ts | 327 ++++++ .../mystery-encounters/mystery-encounters.ts | 29 +- .../requirements/requirement-groups.ts | 30 + .../utils/encounter-phase-utils.ts | 21 +- src/enums/mystery-encounter-type.ts | 4 +- src/locales/en/mystery-encounter.ts | 29 +- .../absolute-avarice-dialogue.ts | 2 +- .../dancing-lessons-dialogue.ts | 30 + .../mystery-encounters/part-timer-dialogue.ts | 34 + src/overrides.ts | 4 +- src/phases.ts | 21 +- .../encounters/part-timer-encounter.test.ts | 254 +++++ 17 files changed, 1991 insertions(+), 51 deletions(-) create mode 100644 public/battle-anims/encounter-dance.json create mode 100644 src/data/mystery-encounters/encounters/dancing-lessons-encounter.ts create mode 100644 src/data/mystery-encounters/encounters/part-timer-encounter.ts create mode 100644 src/locales/en/mystery-encounters/dancing-lessons-dialogue.ts create mode 100644 src/locales/en/mystery-encounters/part-timer-dialogue.ts create mode 100644 src/test/mystery-encounter/encounters/part-timer-encounter.test.ts diff --git a/public/battle-anims/encounter-dance.json b/public/battle-anims/encounter-dance.json new file mode 100644 index 00000000000..4be7f0756ee --- /dev/null +++ b/public/battle-anims/encounter-dance.json @@ -0,0 +1,951 @@ +{ + "id": 686, + "graphic": "PRAS- Dragon Dance", + "frames": [ + [ + { + "x": 4, + "y": -8, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "priority": 1, + "focus": 2 + }, + { + "x": 12, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "blendType": 1, + "target": 2, + "graphicFrame": 0, + "opacity": 70, + "tone": [ + 0, + 0, + 0, + 255 + ], + "priority": 1, + "focus": 3 + }, + { + "x": -12, + "y": -0.5, + "zoomX": 100, + "zoomY": 100, + "mirror": true, + "visible": true, + "blendType": 1, + "target": 2, + "graphicFrame": 0, + "opacity": 70, + "tone": [ + 0, + 0, + 0, + 255 + ], + "priority": 1, + "focus": 3 + } + ], + [ + { + "x": 12, + "y": -12, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "priority": 1, + "focus": 2 + }, + { + "x": 16, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "blendType": 1, + "target": 2, + "graphicFrame": 0, + "opacity": 155, + "tone": [ + 0, + 0, + 0, + 255 + ], + "priority": 1, + "focus": 3 + }, + { + "x": -16, + "y": -0.5, + "zoomX": 100, + "zoomY": 100, + "mirror": true, + "visible": true, + "blendType": 1, + "target": 2, + "graphicFrame": 0, + "opacity": 155, + "tone": [ + 0, + 0, + 0, + 255 + ], + "priority": 1, + "focus": 3 + } + ], + [ + { + "x": 24, + "y": -12, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "priority": 1, + "focus": 2 + }, + { + "x": 20, + "y": 0, + "zoomX": 108, + "zoomY": 100, + "visible": true, + "blendType": 1, + "target": 2, + "graphicFrame": 0, + "opacity": 155, + "tone": [ + 0, + 0, + 0, + 255 + ], + "priority": 1, + "focus": 3 + }, + { + "x": -20, + "y": -0.5, + "zoomX": 108, + "zoomY": 100, + "mirror": true, + "visible": true, + "blendType": 1, + "target": 2, + "graphicFrame": 0, + "opacity": 155, + "tone": [ + 0, + 0, + 0, + 255 + ], + "priority": 1, + "focus": 3 + } + ], + [ + { + "x": 32, + "y": -8, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "priority": 1, + "focus": 2 + }, + { + "x": 24, + "y": 0, + "zoomX": 108, + "zoomY": 100, + "visible": true, + "blendType": 1, + "target": 2, + "graphicFrame": 0, + "opacity": 155, + "tone": [ + 0, + 0, + 0, + 255 + ], + "priority": 1, + "focus": 3 + }, + { + "x": -24, + "y": -0.5, + "zoomX": 108, + "zoomY": 100, + "mirror": true, + "visible": true, + "blendType": 1, + "target": 2, + "graphicFrame": 0, + "opacity": 155, + "tone": [ + 0, + 0, + 0, + 255 + ], + "priority": 1, + "focus": 3 + } + ], + [ + { + "x": 36, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "priority": 1, + "focus": 2 + }, + { + "x": 28, + "y": 0, + "zoomX": 108, + "zoomY": 100, + "visible": true, + "blendType": 1, + "target": 2, + "graphicFrame": 0, + "opacity": 70, + "tone": [ + 0, + 0, + 0, + 255 + ], + "priority": 1, + "focus": 3 + }, + { + "x": -28, + "y": -0.5, + "zoomX": 108, + "zoomY": 100, + "mirror": true, + "visible": true, + "blendType": 1, + "target": 2, + "graphicFrame": 0, + "opacity": 70, + "tone": [ + 0, + 0, + 0, + 255 + ], + "priority": 1, + "focus": 3 + } + ], + [ + { + "x": 36, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "priority": 1, + "focus": 2 + } + ], + [ + { + "x": 36, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "priority": 1, + "focus": 2 + } + ], + [ + { + "x": 32, + "y": -8, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "priority": 1, + "focus": 2 + } + ], + [ + { + "x": 24, + "y": -12, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "priority": 1, + "focus": 2 + } + ], + [ + { + "x": 12, + "y": -12, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "priority": 1, + "focus": 2 + } + ], + [ + { + "x": 4, + "y": -8, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "priority": 1, + "focus": 2 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 2 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 2 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 2 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 2 + } + ], + [ + { + "x": -4, + "y": -8, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "priority": 1, + "focus": 2 + }, + { + "x": 12, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "blendType": 1, + "target": 2, + "graphicFrame": 0, + "opacity": 70, + "tone": [ + 0, + 0, + 0, + 255 + ], + "priority": 1, + "focus": 3 + }, + { + "x": -12, + "y": -0.5, + "zoomX": 100, + "zoomY": 100, + "mirror": true, + "visible": true, + "blendType": 1, + "target": 2, + "graphicFrame": 0, + "opacity": 70, + "tone": [ + 0, + 0, + 0, + 255 + ], + "priority": 1, + "focus": 3 + } + ], + [ + { + "x": -12, + "y": -12, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "priority": 1, + "focus": 2 + }, + { + "x": 16, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "blendType": 1, + "target": 2, + "graphicFrame": 0, + "opacity": 155, + "tone": [ + 0, + 0, + 0, + 255 + ], + "priority": 1, + "focus": 3 + }, + { + "x": -16, + "y": -0.5, + "zoomX": 100, + "zoomY": 100, + "mirror": true, + "visible": true, + "blendType": 1, + "target": 2, + "graphicFrame": 0, + "opacity": 155, + "tone": [ + 0, + 0, + 0, + 255 + ], + "priority": 1, + "focus": 3 + } + ], + [ + { + "x": -24, + "y": -12, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "priority": 1, + "focus": 2 + }, + { + "x": 20, + "y": 0, + "zoomX": 108, + "zoomY": 100, + "visible": true, + "blendType": 1, + "target": 2, + "graphicFrame": 0, + "opacity": 155, + "tone": [ + 0, + 0, + 0, + 255 + ], + "priority": 1, + "focus": 3 + }, + { + "x": -20, + "y": -0.5, + "zoomX": 108, + "zoomY": 100, + "mirror": true, + "visible": true, + "blendType": 1, + "target": 2, + "graphicFrame": 0, + "opacity": 155, + "tone": [ + 0, + 0, + 0, + 255 + ], + "priority": 1, + "focus": 3 + } + ], + [ + { + "x": -32, + "y": -8, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "priority": 1, + "focus": 2 + }, + { + "x": 24, + "y": 0, + "zoomX": 108, + "zoomY": 100, + "visible": true, + "blendType": 1, + "target": 2, + "graphicFrame": 0, + "opacity": 155, + "tone": [ + 0, + 0, + 0, + 255 + ], + "priority": 1, + "focus": 3 + }, + { + "x": -24, + "y": -0.5, + "zoomX": 108, + "zoomY": 100, + "mirror": true, + "visible": true, + "blendType": 1, + "target": 2, + "graphicFrame": 0, + "opacity": 155, + "tone": [ + 0, + 0, + 0, + 255 + ], + "priority": 1, + "focus": 3 + } + ], + [ + { + "x": -36, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "priority": 1, + "focus": 2 + }, + { + "x": 28, + "y": 0, + "zoomX": 108, + "zoomY": 100, + "visible": true, + "blendType": 1, + "target": 2, + "graphicFrame": 0, + "opacity": 70, + "tone": [ + 0, + 0, + 0, + 255 + ], + "priority": 1, + "focus": 3 + }, + { + "x": -28, + "y": -0.5, + "zoomX": 108, + "zoomY": 100, + "mirror": true, + "visible": true, + "blendType": 1, + "target": 2, + "graphicFrame": 0, + "opacity": 70, + "tone": [ + 0, + 0, + 0, + 255 + ], + "priority": 1, + "focus": 3 + } + ], + [ + { + "x": -36, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "priority": 1, + "focus": 2 + } + ], + [ + { + "x": -36, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "priority": 1, + "focus": 2 + } + ], + [ + { + "x": -32, + "y": -8, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "priority": 1, + "focus": 2 + } + ], + [ + { + "x": -24, + "y": -12, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "priority": 1, + "focus": 2 + } + ], + [ + { + "x": -12, + "y": -12, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "priority": 1, + "focus": 2 + } + ], + [ + { + "x": -4, + "y": -8, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "priority": 1, + "focus": 2 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 2 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 2 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 2 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 2 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 2 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 2 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 2 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 2 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 2 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 2 + } + ], + [ + { + "x": 0, + "y": 0, + "zoomX": 100, + "zoomY": 100, + "visible": true, + "target": 0, + "graphicFrame": 0, + "opacity": 255, + "locked": true, + "priority": 1, + "focus": 2 + } + ] + ], + "frameTimedEvents": { + "0": [ + { + "frameIndex": 0, + "resourceName": "PRSFX- Attract.wav", + "volume": 100, + "pitch": 100, + "eventType": "AnimTimedSoundEvent" + } + ], + "1": [ + { + "frameIndex": 0, + "resourceName": "PRSFX- Ally Switch.wav", + "volume": 80, + "pitch": 100, + "eventType": "AnimTimedSoundEvent" + } + ] + }, + "position": 4, + "hue": 0 +} \ No newline at end of file diff --git a/src/battle-scene.ts b/src/battle-scene.ts index 80a1ae9e8ae..2b1c4ba719e 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -66,7 +66,7 @@ import { Species } from "#enums/species"; import { UiTheme } from "#enums/ui-theme"; import { TimedEventManager } from "#app/timed-event-manager.js"; import i18next from "i18next"; -import {TrainerType} from "#enums/trainer-type"; +import { TrainerType } from "#enums/trainer-type"; import IMysteryEncounter from "./data/mystery-encounters/mystery-encounter"; import { allMysteryEncounters, AVERAGE_ENCOUNTERS_PER_RUN_TARGET, BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT, mysteryEncountersByBiome, WEIGHT_INCREMENT_ON_SPAWN_MISS } from "./data/mystery-encounters/mystery-encounters"; import { MysteryEncounterData } from "#app/data/mystery-encounters/mystery-encounter-data"; diff --git a/src/data/battle-anims.ts b/src/data/battle-anims.ts index ffc39efedac..66e7543c7ec 100644 --- a/src/data/battle-anims.ts +++ b/src/data/battle-anims.ts @@ -7,6 +7,7 @@ import { BattlerIndex } from "../battle"; import { Element } from "json-stable-stringify"; import { Moves } from "#enums/moves"; import { isNullOrUndefined } from "../utils"; +import Phaser from "phaser"; //import fs from 'vite-plugin-fs/browser'; export enum AnimFrameTarget { @@ -111,7 +112,8 @@ export enum CommonAnim { export enum EncounterAnim { MAGMA_BG, MAGMA_SPOUT, - SMOKESCREEN + SMOKESCREEN, + DANCE } export class AnimConfig { @@ -1264,11 +1266,13 @@ export class MoveChargeAnim extends MoveAnim { export class EncounterBattleAnim extends BattleAnim { public encounterAnim: EncounterAnim; + public oppAnim: boolean; - constructor(encounterAnim: EncounterAnim, user: Pokemon, target?: Pokemon) { - super(user, target || user); + constructor(encounterAnim: EncounterAnim, user: Pokemon, target?: Pokemon, oppAnim?: boolean) { + super(user, target || user, true); this.encounterAnim = encounterAnim; + this.oppAnim = oppAnim ?? false; } getAnim(): AnimConfig { @@ -1276,7 +1280,7 @@ export class EncounterBattleAnim extends BattleAnim { } isOppAnim(): boolean { - return false; + return this.oppAnim; } } diff --git a/src/data/mystery-encounters/encounters/absolute-avarice-encounter.ts b/src/data/mystery-encounters/encounters/absolute-avarice-encounter.ts index 3f7f86ef744..45645a6b17f 100644 --- a/src/data/mystery-encounters/encounters/absolute-avarice-encounter.ts +++ b/src/data/mystery-encounters/encounters/absolute-avarice-encounter.ts @@ -254,13 +254,12 @@ export const AbsoluteAvariceEncounter: IMysteryEncounter = }; setEncounterRewards(scene, { fillRemaining: true }, null, givePartyPokemonReviverSeeds); - encounter.startOfBattleEffects.push( - { - sourceBattlerIndex: BattlerIndex.ENEMY, - targets: [BattlerIndex.ENEMY], - move: new PokemonMove(Moves.STUFF_CHEEKS), - ignorePp: true - }); + encounter.startOfBattleEffects.push({ + sourceBattlerIndex: BattlerIndex.ENEMY, + targets: [BattlerIndex.ENEMY], + move: new PokemonMove(Moves.STUFF_CHEEKS), + ignorePp: true + }); transitionMysteryEncounterIntroVisuals(scene, true, true, 500); await initBattleWithEnemyConfig(scene, encounter.enemyPartyConfigs[0]); diff --git a/src/data/mystery-encounters/encounters/dancing-lessons-encounter.ts b/src/data/mystery-encounters/encounters/dancing-lessons-encounter.ts new file mode 100644 index 00000000000..fbf4c05e136 --- /dev/null +++ b/src/data/mystery-encounters/encounters/dancing-lessons-encounter.ts @@ -0,0 +1,279 @@ +import { EnemyPartyConfig, initBattleWithEnemyConfig, leaveEncounterWithoutBattle, selectPokemonForOption, transitionMysteryEncounterIntroVisuals, } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import Pokemon, { PlayerPokemon, PokemonMove } from "#app/field/pokemon"; +import { MysteryEncounterType } from "#enums/mystery-encounter-type"; +import { Species } from "#enums/species"; +import BattleScene from "#app/battle-scene"; +import IMysteryEncounter, { MysteryEncounterBuilder } from "../mystery-encounter"; +import { MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; +import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; +import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; +import { getPokemonSpecies } from "#app/data/pokemon-species"; +import { Moves } from "#enums/moves"; +import { TrainerSlot } from "#app/data/trainer-config"; +import PokemonData from "#app/system/pokemon-data"; +import { Biome } from "#enums/biome"; +import { EncounterAnim, EncounterBattleAnim } from "#app/data/battle-anims"; +import { BattlerTagType } from "#enums/battler-tag-type"; +import { getEncounterText, queueEncounterMessage } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; +import { LearnMovePhase, StatChangePhase } from "#app/phases"; +import { BattleStat } from "#app/data/battle-stat"; +import { MoveRequirement } from "#app/data/mystery-encounters/mystery-encounter-requirements"; +import { DANCING_MOVES } from "#app/data/mystery-encounters/requirements/requirement-groups"; +import { OptionSelectItem } from "#app/ui/abstact-option-select-ui-handler"; +import { BattlerIndex } from "#app/battle"; +import { catchPokemon } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; +import { PokeballType } from "#enums/pokeball"; + +/** the i18n namespace for this encounter */ +const namespace = "mysteryEncounter:dancingLessons"; + +// Fire form +const BAILE_STYLE_BIOMES = [ + Biome.VOLCANO, + Biome.BEACH, + Biome.ISLAND, + Biome.WASTELAND, + Biome.MOUNTAIN, + Biome.BADLANDS, + Biome.DESERT +]; + +// Electric form +const POM_POM_STYLE_BIOMES = [ + Biome.CONSTRUCTION_SITE, + Biome.POWER_PLANT, + Biome.FACTORY, + Biome.LABORATORY, + Biome.SLUM, + Biome.METROPOLIS, + Biome.DOJO +]; + +// Psychic form +const PAU_STYLE_BIOMES = [ + Biome.JUNGLE, + Biome.FAIRY_CAVE, + Biome.MEADOW, + Biome.PLAINS, + Biome.GRASS, + Biome.TALL_GRASS, + Biome.FOREST +]; + +// Ghost form +const SENSU_STYLE_BIOMES = [ + Biome.RUINS, + Biome.SWAMP, + Biome.CAVE, + Biome.ABYSS, + Biome.GRAVEYARD, + Biome.LAKE, + Biome.TEMPLE +]; + +/** + * Dancing Lessons encounter. + * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/130 | GitHub Issue #130} + * @see For biome requirements check {@linkcode mysteryEncountersByBiome} + */ +export const DancingLessonsEncounter: IMysteryEncounter = + MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.DANCING_LESSONS) + .withEncounterTier(MysteryEncounterTier.GREAT) + .withSceneWaveRangeRequirement(10, 180) + .withIntroSpriteConfigs([]) // Uses a real Pokemon sprite instead of ME Intro Visuals + .withAnimations(EncounterAnim.DANCE) + .withHideWildIntroMessage(true) + .withAutoHideIntroVisuals(false) + .withCatchAllowed(true) + .withOnVisualsStart((scene: BattleScene) => { + const danceAnim = new EncounterBattleAnim(EncounterAnim.DANCE, scene.getEnemyPokemon(), scene.getPlayerPokemon()); + danceAnim.play(scene); + + return true; + }) + .withIntroDialogue([ + { + text: `${namespace}.intro`, + } + ]) + .withTitle(`${namespace}.title`) + .withDescription(`${namespace}.description`) + .withQuery(`${namespace}.query`) + .withOnInit((scene: BattleScene) => { + const encounter = scene.currentBattle.mysteryEncounter; + + const species = getPokemonSpecies(Species.ORICORIO); + const enemyPokemon = scene.addEnemyPokemon(species, scene.currentBattle.enemyLevels[0], TrainerSlot.NONE, false); + if (!enemyPokemon.moveset.some(m => m.getMove().id === Moves.REVELATION_DANCE)) { + if (enemyPokemon.moveset.length < 4) { + enemyPokemon.moveset.push(new PokemonMove(Moves.REVELATION_DANCE)); + } else { + enemyPokemon.moveset[0] = new PokemonMove(Moves.REVELATION_DANCE); + } + } + + // Set the form index based on the biome + // Defaults to Baile style if somehow nothing matches + const currentBiome = scene.arena.biomeType; + if (BAILE_STYLE_BIOMES.includes(currentBiome)) { + enemyPokemon.formIndex = 0; + } else if (POM_POM_STYLE_BIOMES.includes(currentBiome)) { + enemyPokemon.formIndex = 1; + } else if (PAU_STYLE_BIOMES.includes(currentBiome)) { + enemyPokemon.formIndex = 2; + } else if (SENSU_STYLE_BIOMES.includes(currentBiome)) { + enemyPokemon.formIndex = 3; + } else { + enemyPokemon.formIndex = 0; + } + + const oricorioData = new PokemonData(enemyPokemon); + + // Adds a real Pokemon sprite to the field (required for the animation) + scene.currentBattle.enemyParty[0] = enemyPokemon; + scene.field.add(enemyPokemon); + + const config: EnemyPartyConfig = { + levelAdditiveMultiplier: 1, + pokemonConfigs: [{ + species: species, + dataSource: oricorioData, + isBoss: true, + // Gets +1 to all stats on battle start + tags: [BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON], + mysteryEncounterBattleEffects: (pokemon: Pokemon) => { + queueEncounterMessage(pokemon.scene, `${namespace}.option.1.boss_enraged`); + pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [BattleStat.ATK, BattleStat.DEF, BattleStat.SPATK, BattleStat.SPDEF, BattleStat.SPD], 1)); + } + }], + }; + encounter.enemyPartyConfigs = [config]; + encounter.misc = { + oricorioData + }; + + return true; + }) + .withOption( + new MysteryEncounterOptionBuilder() + .withOptionMode(MysteryEncounterOptionMode.DEFAULT) + .withDialogue({ + buttonLabel: `${namespace}.option.1.label`, + buttonTooltip: `${namespace}.option.1.tooltip`, + selected: [ + { + text: `${namespace}.option.1.selected`, + }, + ], + }) + .withOptionPhase(async (scene: BattleScene) => { + // Pick battle + const encounter = scene.currentBattle.mysteryEncounter; + + transitionMysteryEncounterIntroVisuals(scene, true, true, 500); + + encounter.startOfBattleEffects.push({ + sourceBattlerIndex: BattlerIndex.ENEMY, + targets: [BattlerIndex.PLAYER], + move: new PokemonMove(Moves.REVELATION_DANCE), + ignorePp: true + }); + + await initBattleWithEnemyConfig(scene, encounter.enemyPartyConfigs[0]); + }) + .build() + ) + .withOption( + new MysteryEncounterOptionBuilder() + .withOptionMode(MysteryEncounterOptionMode.DEFAULT) + .withDialogue({ + buttonLabel: `${namespace}.option.2.label`, + buttonTooltip: `${namespace}.option.2.tooltip`, + selected: [ + { + text: `${namespace}.option.2.selected`, + }, + ], + }) + .withPreOptionPhase(async (scene: BattleScene) => { + // Learn its Dance + const encounter = scene.currentBattle.mysteryEncounter; + + const onPokemonSelected = (pokemon: PlayerPokemon) => { + encounter.setDialogueToken("selectedPokemon", pokemon.getNameToRender()); + scene.unshiftPhase(new LearnMovePhase(scene, scene.getParty().indexOf(pokemon), Moves.REVELATION_DANCE)); + + // Play animation again to "learn" the dance + const danceAnim = new EncounterBattleAnim(EncounterAnim.DANCE, scene.getEnemyPokemon(), scene.getPlayerPokemon()); + danceAnim.play(scene); + }; + + return selectPokemonForOption(scene, onPokemonSelected); + }) + .withOptionPhase(async (scene: BattleScene) => { + // Learn its Dance + leaveEncounterWithoutBattle(scene, true); + }) + .build() + ) + .withOption( + new MysteryEncounterOptionBuilder() + .withOptionMode(MysteryEncounterOptionMode.DISABLED_OR_SPECIAL) + .withPrimaryPokemonRequirement(new MoveRequirement(DANCING_MOVES)) // Will set option3PrimaryName and option3PrimaryMove dialogue tokens automatically + .withDialogue({ + buttonLabel: `${namespace}.option.3.label`, + buttonTooltip: `${namespace}.option.3.tooltip`, + disabledButtonTooltip: `${namespace}.option.3.tooltip`, + secondOptionPrompt: `${namespace}.option.3.select_prompt`, + selected: [ + { + text: `${namespace}.option.3.selected`, + }, + ], + }) + .withPreOptionPhase(async (scene: BattleScene) => { + // Open menu for selecting pokemon with a Dancing move + const encounter = scene.currentBattle.mysteryEncounter; + const onPokemonSelected = (pokemon: PlayerPokemon) => { + // Return the options for nature selection + return pokemon.moveset + .filter(move => DANCING_MOVES.includes(move.getMove().id)) + .map((move: PokemonMove) => { + const option: OptionSelectItem = { + label: move.getName(), + handler: () => { + // Pokemon and second option selected + encounter.setDialogueToken("selectedPokemon", pokemon.getNameToRender()); + encounter.setDialogueToken("selectedMove", move.getName()); + return true; + }, + }; + return option; + }); + }; + + // Only Pokemon that have a Dancing move can be selected + const selectableFilter = (pokemon: Pokemon) => { + // If pokemon meets primary pokemon reqs, it can be selected + const meetsReqs = encounter.options[2].pokemonMeetsPrimaryRequirements(scene, pokemon); + if (!meetsReqs) { + return getEncounterText(scene, `${namespace}.invalid_selection`); + } + + return null; + }; + + return selectPokemonForOption(scene, onPokemonSelected, null, selectableFilter); + }) + .withOptionPhase(async (scene: BattleScene) => { + // Show the Oricorio a dance, and recruit it + const oricorio = scene.currentBattle.mysteryEncounter.misc.oricorioData.toPokemon(scene); + oricorio.passive = true; + + transitionMysteryEncounterIntroVisuals(scene, true, true, 500); + await catchPokemon(scene, oricorio, null, PokeballType.POKEBALL, false); + leaveEncounterWithoutBattle(scene, true); + }) + .build() + ) + .build(); diff --git a/src/data/mystery-encounters/encounters/part-timer-encounter.ts b/src/data/mystery-encounters/encounters/part-timer-encounter.ts new file mode 100644 index 00000000000..1b1671e4a27 --- /dev/null +++ b/src/data/mystery-encounters/encounters/part-timer-encounter.ts @@ -0,0 +1,327 @@ +import { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; +import { leaveEncounterWithoutBattle, selectPokemonForOption, setEncounterRewards, transitionMysteryEncounterIntroVisuals, updatePlayerMoney } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { MysteryEncounterType } from "#enums/mystery-encounter-type"; +import BattleScene from "#app/battle-scene"; +import IMysteryEncounter, { MysteryEncounterBuilder } from "../mystery-encounter"; +import { MoveRequirement } from "../mystery-encounter-requirements"; +import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; +import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; +import { Stat } from "#enums/stat"; +import { CHARMING_MOVES } from "#app/data/mystery-encounters/requirements/requirement-groups"; +import { getEncounterText, showEncounterDialogue, showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; +import i18next from "i18next"; +import Pokemon, { PlayerPokemon } from "#app/field/pokemon"; + +/** the i18n namespace for the encounter */ +const namespace = "mysteryEncounter:partTimer"; + +/** + * Part Timer encounter. + * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/82 | GitHub Issue #82} + * @see For biome requirements check {@linkcode mysteryEncountersByBiome} + */ +export const PartTimerEncounter: IMysteryEncounter = + MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.PART_TIMER) + .withEncounterTier(MysteryEncounterTier.COMMON) + .withSceneWaveRangeRequirement(10, 180) + .withIntroSpriteConfigs([ + { + spriteKey: "worker_f", + fileRoot: "trainer", + hasShadow: true, + x: -20 + }, + { + spriteKey: "training_gear", + fileRoot: "mystery-encounters", + hasShadow: true, + y: 6, + x: 20, + yShadow: -2 + } + ]) + .withAutoHideIntroVisuals(false) + .withIntroDialogue([ + { + text: `${namespace}.intro`, + }, + { + speaker: `${namespace}.speaker`, + text: `${namespace}.intro_dialogue`, + }, + ]) + .withOnInit((scene: BattleScene) => { + // Load sfx + scene.loadSe("PRSFX- Horn Drill1", "battle_anims", "PRSFX- Horn Drill1.wav"); + scene.loadSe("PRSFX- Horn Drill3", "battle_anims", "PRSFX- Horn Drill3.wav"); + scene.loadSe("PRSFX- Guillotine2", "battle_anims", "PRSFX- Guillotine2.wav"); + scene.loadSe("PRSFX- Heavy Slam2", "battle_anims", "PRSFX- Heavy Slam2.wav"); + + scene.loadSe("PRSFX- Agility", "battle_anims", "PRSFX- Agility.wav"); + scene.loadSe("PRSFX- Extremespeed1", "battle_anims", "PRSFX- Extremespeed1.wav"); + scene.loadSe("PRSFX- Accelerock1", "battle_anims", "PRSFX- Accelerock1.wav"); + + scene.loadSe("PRSFX- Captivate", "battle_anims", "PRSFX- Captivate.wav"); + scene.loadSe("PRSFX- Attract2", "battle_anims", "PRSFX- Attract2.wav"); + scene.loadSe("PRSFX- Aurora Veil2", "battle_anims", "PRSFX- Aurora Veil2.wav"); + + return true; + }) + .withTitle(`${namespace}.title`) + .withDescription(`${namespace}.description`) + .withQuery(`${namespace}.query`) + .withOption(new MysteryEncounterOptionBuilder() + .withOptionMode(MysteryEncounterOptionMode.DEFAULT) + .withDialogue({ + buttonLabel: `${namespace}.option.1.label`, + buttonTooltip: `${namespace}.option.1.tooltip`, + selected: [ + { + text: `${namespace}.option.1.selected` + } + ] + }) + .withPreOptionPhase(async (scene: BattleScene) => { + const encounter = scene.currentBattle.mysteryEncounter; + + const onPokemonSelected = (pokemon: PlayerPokemon) => { + encounter.setDialogueToken("selectedPokemon", pokemon.getNameToRender()); + + // Calculate the "baseline" stat value (100 base stat, 31 IVs, neutral nature, same level as pokemon) to compare + // Resulting money is 2.5 * (% difference from baseline), with minimum of 1 and maximum of 4. + // Calculation from Pokemon.calculateStats + const baselineValue = Math.floor(((2 * 100 + 31) * pokemon.level) * 0.01) + 5; + const percentDiff = (pokemon.getStat(Stat.SPD) - baselineValue) / baselineValue; + const moneyMultiplier = Math.min(Math.max(2.5 * (1+ percentDiff), 1), 4); + + encounter.misc = { + moneyMultiplier + }; + + // Reduce all PP to 2 (if they started at greater than 2) + pokemon.moveset.forEach(move => { + const newPpUsed = move.getMovePp() - 2; + move.ppUsed = move.ppUsed < newPpUsed ? newPpUsed : move.ppUsed; + }); + + // Hide intro visuals + transitionMysteryEncounterIntroVisuals(scene, true, false); + // Play sfx for "working" + doDeliverySfx(scene); + }; + + // Only Pokemon non-KOd pokemon can be selected + const selectableFilter = (pokemon: Pokemon) => { + if (!pokemon.isAllowedInBattle()) { + return getEncounterText(scene, `${namespace}:invalid_selection`); + } + + return null; + }; + + return selectPokemonForOption(scene, onPokemonSelected, null, selectableFilter); + }) + .withOptionPhase(async (scene: BattleScene) => { + // Pick Deliveries + // Bring visuals back in + await transitionMysteryEncounterIntroVisuals(scene, false, false); + + const moneyMultiplier = scene.currentBattle.mysteryEncounter.misc.moneyMultiplier; + + // Give money and do dialogue + if (moneyMultiplier > 2.5) { + await showEncounterDialogue(scene, `${namespace}.job_complete_good`, `${namespace}.speaker`); + } else { + await showEncounterDialogue(scene, `${namespace}.job_complete_bad`, `${namespace}.speaker`); + } + const moneyChange = scene.getWaveMoneyAmount(moneyMultiplier); + updatePlayerMoney(scene, moneyChange, true, false); + await showEncounterText(scene, i18next.t("mysteryEncounter:receive_money", { amount: moneyChange })); + await showEncounterText(scene, `${namespace}.pokemon_tired`); + + setEncounterRewards(scene, { fillRemaining: true }); + leaveEncounterWithoutBattle(scene); + }) + .build() + ) + .withOption(new MysteryEncounterOptionBuilder() + .withOptionMode(MysteryEncounterOptionMode.DEFAULT) + .withDialogue({ + buttonLabel: `${namespace}.option.2.label`, + buttonTooltip: `${namespace}.option.2.tooltip`, + selected: [ + { + text: `${namespace}.option.2.selected` + } + ] + }) + .withPreOptionPhase(async (scene: BattleScene) => { + const encounter = scene.currentBattle.mysteryEncounter; + + const onPokemonSelected = (pokemon: PlayerPokemon) => { + encounter.setDialogueToken("selectedPokemon", pokemon.getNameToRender()); + + // Calculate the "baseline" stat value (100 base stat, 31 IVs, neutral nature, same level as pokemon) to compare + // Resulting money is 2.5 * (% difference from baseline), with minimum of 1 and maximum of 4. + // Calculation from Pokemon.calculateStats + const baselineHp = Math.floor(((2 * 80 + 31) * pokemon.level) * 0.01) + pokemon.level + 10; + const baselineAtkDef = Math.floor(((2 * 80 + 31) * pokemon.level) * 0.01) + 5; + const baselineValue = baselineHp + 1.5 * (baselineAtkDef * 2); + const strongestValue = pokemon.getStat(Stat.HP) + 1.5 * (pokemon.getStat(Stat.ATK) + pokemon.getStat(Stat.DEF)); + const percentDiff = (strongestValue - baselineValue) / baselineValue; + const moneyMultiplier = Math.min(Math.max(2.5 * (1+ percentDiff), 1), 4); + + encounter.misc = { + moneyMultiplier + }; + + // Reduce all PP to 2 (if they started at greater than 2) + pokemon.moveset.forEach(move => { + const newPpUsed = move.getMovePp() - 2; + move.ppUsed = move.ppUsed < newPpUsed ? newPpUsed : move.ppUsed; + }); + + // Hide intro visuals + transitionMysteryEncounterIntroVisuals(scene, true, false); + // Play sfx for "working" + doStrongWorkSfx(scene); + }; + + // Only Pokemon non-KOd pokemon can be selected + const selectableFilter = (pokemon: Pokemon) => { + if (!pokemon.isAllowedInBattle()) { + return getEncounterText(scene, `${namespace}:invalid_selection`); + } + + return null; + }; + + return selectPokemonForOption(scene, onPokemonSelected, null, selectableFilter); + }) + .withOptionPhase(async (scene: BattleScene) => { + // Pick Move Warehouse items + // Bring visuals back in + await transitionMysteryEncounterIntroVisuals(scene, false, false); + + const moneyMultiplier = scene.currentBattle.mysteryEncounter.misc.moneyMultiplier; + + // Give money and do dialogue + if (moneyMultiplier > 2.5) { + await showEncounterDialogue(scene, `${namespace}.job_complete_good`, `${namespace}.speaker`); + } else { + await showEncounterDialogue(scene, `${namespace}.job_complete_bad`, `${namespace}.speaker`); + } + const moneyChange = scene.getWaveMoneyAmount(moneyMultiplier); + updatePlayerMoney(scene, moneyChange, true, false); + await showEncounterText(scene, i18next.t("mysteryEncounter:receive_money", { amount: moneyChange })); + await showEncounterText(scene, `${namespace}.pokemon_tired`); + + setEncounterRewards(scene, { fillRemaining: true }); + leaveEncounterWithoutBattle(scene); + }) + .build() + ) + .withOption( + new MysteryEncounterOptionBuilder() + .withOptionMode(MysteryEncounterOptionMode.DISABLED_OR_SPECIAL) + .withPrimaryPokemonRequirement(new MoveRequirement(CHARMING_MOVES)) // Will set option3PrimaryName and option3PrimaryMove dialogue tokens automatically + .withDialogue({ + buttonLabel: `${namespace}.option.3.label`, + buttonTooltip: `${namespace}.option.3.tooltip`, + disabledButtonTooltip: `${namespace}.option.3.disabled_tooltip`, + selected: [ + { + text: `${namespace}.option.3.selected`, + }, + ], + }) + .withPreOptionPhase(async (scene: BattleScene) => { + const encounter = scene.currentBattle.mysteryEncounter; + const selectedPokemon = encounter.selectedOption.primaryPokemon; + encounter.setDialogueToken("selectedPokemon", selectedPokemon.getNameToRender()); + + // Reduce all PP to 2 (if they started at greater than 2) + selectedPokemon.moveset.forEach(move => { + const newPpUsed = move.getMovePp() - 2; + move.ppUsed = move.ppUsed < newPpUsed ? newPpUsed : move.ppUsed; + }); + + // Hide intro visuals + transitionMysteryEncounterIntroVisuals(scene, true, false); + // Play sfx for "working" + doSalesSfx(scene); + return true; + }) + .withOptionPhase(async (scene: BattleScene) => { + // Assist with Sales + // Bring visuals back in + await transitionMysteryEncounterIntroVisuals(scene, false, false); + + // Give money and do dialogue + 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, `${namespace}.pokemon_tired`); + + setEncounterRewards(scene, { fillRemaining: true }); + leaveEncounterWithoutBattle(scene); + }) + .build() + ) + .withOutroDialogue([ + { + speaker: `${namespace}.speaker`, + text: `${namespace}.outro`, + } + ]) + .build(); + +function doStrongWorkSfx(scene: BattleScene) { + scene.playSound("PRSFX- Horn Drill1"); + scene.playSound("PRSFX- Horn Drill1"); + + scene.time.delayedCall(1000, () => { + scene.playSound("PRSFX- Guillotine2"); + }); + + scene.time.delayedCall(2000, () => { + scene.playSound("PRSFX- Heavy Slam2"); + }); + + scene.time.delayedCall(2500, () => { + scene.playSound("PRSFX- Guillotine2"); + }); +} + +function doDeliverySfx(scene: BattleScene) { + scene.playSound("PRSFX- Accelerock1"); + + scene.time.delayedCall(1500, () => { + scene.playSound("PRSFX- Extremespeed1"); + }); + + scene.time.delayedCall(2000, () => { + scene.playSound("PRSFX- Extremespeed1"); + }); + + scene.time.delayedCall(2250, () => { + scene.playSound("PRSFX- Agility"); + }); +} + +function doSalesSfx(scene: BattleScene) { + scene.playSound("PRSFX- Captivate"); + + scene.time.delayedCall(1500, () => { + scene.playSound("PRSFX- Attract2"); + }); + + scene.time.delayedCall(2000, () => { + scene.playSound("PRSFX- Aurora Veil2"); + }); + + scene.time.delayedCall(3000, () => { + scene.playSound("PRSFX- Attract2"); + }); +} diff --git a/src/data/mystery-encounters/mystery-encounters.ts b/src/data/mystery-encounters/mystery-encounters.ts index b1c4ada12e7..6c3c2dd6008 100644 --- a/src/data/mystery-encounters/mystery-encounters.ts +++ b/src/data/mystery-encounters/mystery-encounters.ts @@ -22,6 +22,8 @@ import { ATrainersTestEncounter } from "#app/data/mystery-encounters/encounters/ import { TrashToTreasureEncounter } from "#app/data/mystery-encounters/encounters/trash-to-treasure-encounter"; import { BerriesAboundEncounter } from "#app/data/mystery-encounters/encounters/berries-abound-encounter"; import { ClowningAroundEncounter } from "#app/data/mystery-encounters/encounters/clowning-around-encounter"; +import { PartTimerEncounter } from "#app/data/mystery-encounters/encounters/part-timer-encounter"; +import { DancingLessonsEncounter } from "#app/data/mystery-encounters/encounters/dancing-lessons-encounter"; // Spawn chance: (BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT + WIGHT_INCREMENT_ON_SPAWN_MISS * ) / 256 export const BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT = 1; @@ -135,7 +137,8 @@ export const allMysteryEncounters: { [encounterType: number]: IMysteryEncounter const extremeBiomeEncounters: MysteryEncounterType[] = []; const nonExtremeBiomeEncounters: MysteryEncounterType[] = [ - MysteryEncounterType.FIELD_TRIP + MysteryEncounterType.FIELD_TRIP, + MysteryEncounterType.DANCING_LESSONS, // Is also in BADLANDS, DESERT, VOLCANO, WASTELAND, ABYSS ]; const humanTransitableBiomeEncounters: MysteryEncounterType[] = [ @@ -146,7 +149,8 @@ const humanTransitableBiomeEncounters: MysteryEncounterType[] = [ ]; const civilizationBiomeEncounters: MysteryEncounterType[] = [ - MysteryEncounterType.DEPARTMENT_STORE_SALE + MysteryEncounterType.DEPARTMENT_STORE_SALE, + MysteryEncounterType.PART_TIMER ]; /** @@ -200,23 +204,32 @@ export const mysteryEncountersByBiome = new Map([ [Biome.LAKE, []], [Biome.SEABED, []], [Biome.MOUNTAIN, []], - [Biome.BADLANDS, []], + [Biome.BADLANDS, [ + MysteryEncounterType.DANCING_LESSONS + ]], [Biome.CAVE, [ MysteryEncounterType.THE_STRONG_STUFF ]], - [Biome.DESERT, []], + [Biome.DESERT, [ + MysteryEncounterType.DANCING_LESSONS + ]], [Biome.ICE_CAVE, []], [Biome.MEADOW, []], [Biome.POWER_PLANT, []], [Biome.VOLCANO, [ - MysteryEncounterType.FIERY_FALLOUT + MysteryEncounterType.FIERY_FALLOUT, + MysteryEncounterType.DANCING_LESSONS ]], [Biome.GRAVEYARD, []], [Biome.DOJO, []], [Biome.FACTORY, []], [Biome.RUINS, []], - [Biome.WASTELAND, []], - [Biome.ABYSS, []], + [Biome.WASTELAND, [ + MysteryEncounterType.DANCING_LESSONS + ]], + [Biome.ABYSS, [ + MysteryEncounterType.DANCING_LESSONS + ]], [Biome.SPACE, []], [Biome.CONSTRUCTION_SITE, []], [Biome.JUNGLE, [ @@ -252,6 +265,8 @@ export function initMysteryEncounters() { allMysteryEncounters[MysteryEncounterType.TRASH_TO_TREASURE] = TrashToTreasureEncounter; allMysteryEncounters[MysteryEncounterType.BERRIES_ABOUND] = BerriesAboundEncounter; allMysteryEncounters[MysteryEncounterType.CLOWNING_AROUND] = ClowningAroundEncounter; + allMysteryEncounters[MysteryEncounterType.PART_TIMER] = PartTimerEncounter; + allMysteryEncounters[MysteryEncounterType.DANCING_LESSONS] = DancingLessonsEncounter; // 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 cf23ace2efd..235c9910ef0 100644 --- a/src/data/mystery-encounters/requirements/requirement-groups.ts +++ b/src/data/mystery-encounters/requirements/requirement-groups.ts @@ -10,6 +10,36 @@ export const STEALING_MOVES = [ Moves.SWITCHEROO ]; +export const CHARMING_MOVES = [ + Moves.CHARM, + Moves.FLATTER, + Moves.DRAGON_CHEER, + Moves.ALLURING_VOICE, + Moves.ATTRACT, + Moves.SWEET_SCENT, + Moves.CAPTIVATE, + Moves.AROMATIC_MIST +]; + +/** + * Moves for the Dancer ability + */ +export const DANCING_MOVES = [ + Moves.AQUA_STEP, + Moves.CLANGOROUS_SOUL, + Moves.DRAGON_DANCE, + Moves.FEATHER_DANCE, + Moves.FIERY_DANCE, + Moves.LUNAR_DANCE, + Moves.PETAL_DANCE, + Moves.REVELATION_DANCE, + Moves.QUIVER_DANCE, + Moves.SWORDS_DANCE, + Moves.TEETER_DANCE, + Moves.VICTORY_DANCE, + Moves.KNOCK_OFF +]; + export const DISTRACTION_MOVES = [ Moves.FAKE_OUT, Moves.FOLLOW_ME, diff --git a/src/data/mystery-encounters/utils/encounter-phase-utils.ts b/src/data/mystery-encounters/utils/encounter-phase-utils.ts index 05ddf07d1e8..a4be81a3e08 100644 --- a/src/data/mystery-encounters/utils/encounter-phase-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-phase-utils.ts @@ -423,7 +423,7 @@ export function selectPokemonForOption(scene: BattleScene, onPokemonSelected: (p return true; }, onHover: () => { - scene.ui.showText("Return to encounter option select."); + scene.ui.showText(i18next.t("mysteryEncounter:cancel_option")); } }); @@ -671,18 +671,22 @@ export function handleMysteryEncounterVictory(scene: BattleScene, addHealPhase: export function transitionMysteryEncounterIntroVisuals(scene: BattleScene, hide: boolean = true, destroy: boolean = true, duration: number = 750): Promise { return new Promise(resolve => { const introVisuals = scene.currentBattle.mysteryEncounter.introVisuals; + const enemyPokemon = scene.getEnemyField(); + if (enemyPokemon) { + scene.currentBattle.enemyParty = []; + } if (introVisuals) { if (!hide) { // Make sure visuals are in proper state for showing introVisuals.setVisible(true); - introVisuals.x += 16; - introVisuals.y -= 16; + introVisuals.x = 244; + introVisuals.y = 60; introVisuals.alpha = 0; } // Transition scene.tweens.add({ - targets: introVisuals, + targets: [introVisuals, enemyPokemon], x: `${hide? "+" : "-"}=16`, y: `${hide ? "-" : "+"}=16`, alpha: hide ? 0 : 1, @@ -690,9 +694,12 @@ export function transitionMysteryEncounterIntroVisuals(scene: BattleScene, hide: duration, onComplete: () => { if (hide && destroy) { - scene.field.remove(introVisuals); - introVisuals.setVisible(false); - introVisuals.destroy(); + scene.field.remove(introVisuals, true); + + enemyPokemon.forEach(pokemon => { + scene.field.remove(pokemon, true); + }); + scene.currentBattle.mysteryEncounter.introVisuals = null; } resolve(true); diff --git a/src/enums/mystery-encounter-type.ts b/src/enums/mystery-encounter-type.ts index d82a0075d46..b3d4fd8be6f 100644 --- a/src/enums/mystery-encounter-type.ts +++ b/src/enums/mystery-encounter-type.ts @@ -19,5 +19,7 @@ export enum MysteryEncounterType { A_TRAINERS_TEST, TRASH_TO_TREASURE, BERRIES_ABOUND, - CLOWNING_AROUND + CLOWNING_AROUND, + PART_TIMER, + DANCING_LESSONS } diff --git a/src/locales/en/mystery-encounter.ts b/src/locales/en/mystery-encounter.ts index 11e6887b3e0..9821971b11e 100644 --- a/src/locales/en/mystery-encounter.ts +++ b/src/locales/en/mystery-encounter.ts @@ -19,19 +19,23 @@ import { aTrainersTestDialogue } from "#app/locales/en/mystery-encounters/a-trai import { trashToTreasureDialogue } from "#app/locales/en/mystery-encounters/trash-to-treasure-dialogue"; import { berriesAboundDialogue } from "#app/locales/en/mystery-encounters/berries-abound-dialogue"; import { clowningAroundDialogue } from "#app/locales/en/mystery-encounters/clowning-around-dialogue"; +import { partTimerDialogue } from "#app/locales/en/mystery-encounters/part-timer-dialogue"; +import { dancingLessonsDialogue } from "#app/locales/en/mystery-encounters/dancing-lessons-dialogue"; /** - * Patterns that can be used: - * '$' will be treated as a new line for Message and Dialogue strings - * '@d{}' will add a time delay to text animation for Message and Dialogue strings + * Injection patterns that can be used: + * - `$` will be treated as a new line for Message and Dialogue strings. + * - `@d{}` will add a time delay to text animation for Message and Dialogue strings. + * - `@s{}` will play a specified sound effect for Message and Dialogue strings. + * - `@f{}` will fade the screen to black for the given duration, then fade back in for Message and Dialogue strings. + * - `{{}}` will auto-inject the matching dialogue token value that is stored in {@link IMysteryEncounter.dialogueTokens}. + * - (see [i18next interpolations](https://www.i18next.com/translation-function/interpolation)) for more details. + * - `@[]{}` will auto-color the given text to a specified {@link TextStyle} (e.g. `TextStyle.SUMMARY_GREEN`). * - * '{{}}' will auto-inject the matching token value for the specified Encounter that is stored in dialogueTokens - * (see [i18next interpolations](https://www.i18next.com/translation-function/interpolation)) - * - * '@[]{}' will auto-color the given text to a specified TextStyle (e.g. TextStyle.SUMMARY_GREEN) - * - * Any '(+)' or '(-)' type of tooltip will auto-color to green/blue respectively. THIS ONLY OCCURS FOR OPTION TOOLTIPS, NOWHERE ELSE - * Other types of '(...)' tooltips will have to specify the text color manually by using '@[SUMMARY_GREEN]{}' pattern + * For Option tooltips ({@link OptionTextDisplay.buttonTooltip}): + * - Any tooltip that starts with `(+)` or `(-)` at the beginning of a newline will auto-color to green/blue respectively. + * - Note, this only occurs for option tooltips, nowhere else. + * - Other types of `(...)` tooltips will have to specify the text color manually by using the `@[SUMMARY_GREEN]{}` pattern. */ export const mysteryEncounter = { // DO NOT REMOVE @@ -41,6 +45,7 @@ export const mysteryEncounter = { "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, @@ -62,5 +67,7 @@ export const mysteryEncounter = { aTrainersTest: aTrainersTestDialogue, trashToTreasure: trashToTreasureDialogue, berriesAbound: berriesAboundDialogue, - clowningAround: clowningAroundDialogue + clowningAround: clowningAroundDialogue, + partTimer: partTimerDialogue, + dancingLessons: dancingLessonsDialogue } as const; diff --git a/src/locales/en/mystery-encounters/absolute-avarice-dialogue.ts b/src/locales/en/mystery-encounters/absolute-avarice-dialogue.ts index 5d0935282f6..afd1597219d 100644 --- a/src/locales/en/mystery-encounters/absolute-avarice-dialogue.ts +++ b/src/locales/en/mystery-encounters/absolute-avarice-dialogue.ts @@ -1,5 +1,5 @@ export const absoluteAvariceDialogue = { - intro: "A Greedent ambushed you\nand stole your party's berries!", + intro: "A Greedent ambushes you\nand steals your party's berries!", title: "Absolute Avarice", description: "The Greedent has caught you totally off guard now all your berries are gone!\n\nThe Greedent looks like it's about to eat them when it pauses to look at you, interested.", query: "What will you do?", diff --git a/src/locales/en/mystery-encounters/dancing-lessons-dialogue.ts b/src/locales/en/mystery-encounters/dancing-lessons-dialogue.ts new file mode 100644 index 00000000000..23e0bd60650 --- /dev/null +++ b/src/locales/en/mystery-encounters/dancing-lessons-dialogue.ts @@ -0,0 +1,30 @@ +export const dancingLessonsDialogue = { + intro: "An Oricorio dances sadly alone, without a partner.", + title: "Dancing Lessons", + description: "The Oricorio doesn't seem aggressive, if anything it seems sad.\n\nMaybe it just wants someone to dance with...", + query: "What will you do?", + option: { + 1: { + label: "Battle It", + tooltip: "(-) Tough Battle\n(+) Gain a Baton", + selected: "The Oricorio is distraught and moves to defend itself!", + boss_enraged: "The Oricorio's fear boosted its stats!" + }, + 2: { + label: "Learn Its Dance", + tooltip: "(+) Teach a Pokémon 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}}! + $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/part-timer-dialogue.ts b/src/locales/en/mystery-encounters/part-timer-dialogue.ts new file mode 100644 index 00000000000..ea7f50fbc08 --- /dev/null +++ b/src/locales/en/mystery-encounters/part-timer-dialogue.ts @@ -0,0 +1,34 @@ +export const partTimerDialogue = { + intro: "A busy worker flags you down.", + speaker: "Worker", + 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?", + invalid_selection: "Pokémon must be healthy enough.", + option: { + 1: { + label: "Make Deliveries", + tooltip: "(-) Your Pokémon Uses its Speed\n(+) Earn @[MONEY]{Money}", + selected: "Your {{selectedPokemon}} works a shift delivering orders to customers.", + }, + 2: { + label: "Warehouse Work", + tooltip: "(-) Your Pokémon Uses its Strength and Endurance\n(+) Earn @[MONEY]{Money}", + selected: "Your {{selectedPokemon}} works a shift moving items around the warehouse.", + }, + 3: { + label: "Sales Assistant", + tooltip: "(-) Your {{option3PrimaryName}} uses {{option3PrimaryMove}}\n(+) Earn @[MONEY]{Money}", + disabled_tooltip: "Your Pokémon need to know certain moves for this job", + 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! + $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!" +}; diff --git a/src/overrides.ts b/src/overrides.ts index 1196797fac0..50aa3a0b280 100644 --- a/src/overrides.ts +++ b/src/overrides.ts @@ -127,9 +127,9 @@ class DefaultOverrides { // ------------------------- // 1 to 256, set to null to ignore - readonly MYSTERY_ENCOUNTER_RATE_OVERRIDE: number = null; + readonly MYSTERY_ENCOUNTER_RATE_OVERRIDE: number = 256; readonly MYSTERY_ENCOUNTER_TIER_OVERRIDE: MysteryEncounterTier = null; - readonly MYSTERY_ENCOUNTER_OVERRIDE: MysteryEncounterType = null; + readonly MYSTERY_ENCOUNTER_OVERRIDE: MysteryEncounterType = MysteryEncounterType.DANCING_LESSONS; // ------------------------- // MODIFIER / ITEM OVERRIDES diff --git a/src/phases.ts b/src/phases.ts index c6b238c5d79..56cfd1d2448 100644 --- a/src/phases.ts +++ b/src/phases.ts @@ -1,11 +1,12 @@ import BattleScene, { bypassLogin } from "./battle-scene"; import { DamageResult, default as Pokemon, EnemyPokemon, FieldPosition, HitResult, MoveResult, PlayerPokemon, PokemonMove, TurnMove } from "./field/pokemon"; import * as Utils from "./utils"; -import { allMoves, applyMoveAttrs, BypassSleepAttr, ChargeAttr, applyFilteredMoveAttrs, HitsTagAttr, MissEffectAttr, MoveAttr, MoveEffectAttr, MoveFlags, MultiHitAttr, OverrideMoveEffectAttr, MoveTarget, getMoveTargets, MoveTargetSet, MoveEffectTrigger, CopyMoveAttr, AttackMove, SelfStatusMove, PreMoveMessageAttr, HealStatusEffectAttr, NoEffectAttr, BypassRedirectAttr, FixedDamageAttr, PostVictoryStatChangeAttr, ForceSwitchOutAttr, VariableTargetAttr, IncrementMovePriorityAttr } from "./data/move"; +import { isNullOrUndefined } from "./utils"; +import { allMoves, applyFilteredMoveAttrs, applyMoveAttrs, AttackMove, BypassRedirectAttr, BypassSleepAttr, ChargeAttr, CopyMoveAttr, FixedDamageAttr, ForceSwitchOutAttr, getMoveTargets, HealStatusEffectAttr, HitsTagAttr, IncrementMovePriorityAttr, MissEffectAttr, MoveAttr, MoveEffectAttr, MoveEffectTrigger, MoveFlags, MoveTarget, MoveTargetSet, MultiHitAttr, NoEffectAttr, OverrideMoveEffectAttr, PostVictoryStatChangeAttr, PreMoveMessageAttr, SelfStatusMove, VariableTargetAttr } from "./data/move"; import { Mode } from "./ui/ui"; import { Command } from "./ui/command-ui-handler"; import { Stat } from "./data/pokemon-stat"; -import { BerryModifier, ContactHeldItemTransferChanceModifier, EnemyAttackStatusEffectChanceModifier, EnemyPersistentModifier, EnemyStatusEffectHealChanceModifier, EnemyTurnHealModifier, ExpBalanceModifier, ExpBoosterModifier, ExpShareModifier, ExtraModifierModifier, FlinchChanceModifier, HealingBoosterModifier, HitHealModifier, LapsingPersistentModifier, MapModifier, Modifier, MultipleParticipantExpBonusModifier, PersistentModifier, PokemonExpBoosterModifier, PokemonHeldItemModifier, PokemonInstantReviveModifier, SwitchEffectTransferModifier, TurnHealModifier, TurnHeldItemTransferModifier, MoneyMultiplierModifier, MoneyInterestModifier, IvScannerModifier, LapsingPokemonHeldItemModifier, PokemonMultiHitModifier, overrideModifiers, overrideHeldItems, BypassSpeedChanceModifier, TurnStatusEffectModifier, PokemonResetNegativeStatStageModifier } from "./modifier/modifier"; +import { BerryModifier, BypassSpeedChanceModifier, ContactHeldItemTransferChanceModifier, EnemyAttackStatusEffectChanceModifier, EnemyPersistentModifier, EnemyStatusEffectHealChanceModifier, EnemyTurnHealModifier, ExpBalanceModifier, ExpBoosterModifier, ExpShareModifier, ExtraModifierModifier, FlinchChanceModifier, HealingBoosterModifier, HitHealModifier, IvScannerModifier, LapsingPersistentModifier, LapsingPokemonHeldItemModifier, MapModifier, Modifier, MoneyInterestModifier, MoneyMultiplierModifier, MultipleParticipantExpBonusModifier, overrideHeldItems, overrideModifiers, PersistentModifier, PokemonExpBoosterModifier, PokemonHeldItemModifier, PokemonInstantReviveModifier, PokemonMultiHitModifier, PokemonResetNegativeStatStageModifier, SwitchEffectTransferModifier, TurnHealModifier, TurnHeldItemTransferModifier, TurnStatusEffectModifier } from "./modifier/modifier"; import PartyUiHandler, { PartyOption, PartyUiMode } from "./ui/party-ui-handler"; import { doPokeballBounceAnim, getPokeballAtlasKey, getPokeballCatchMultiplier, getPokeballTintColor, PokeballType } from "./data/pokeball"; import { CommonAnim, CommonBattleAnim, initEncounterAnims, initMoveAnim, loadEncounterAnimAssets, loadMoveAnimAssets, MoveAnim } from "./data/battle-anims"; @@ -23,10 +24,12 @@ import { BattlerTagLapseType, CenterOfAttentionTag, EncoreTag, MysteryEncounterP import { getPokemonMessage, getPokemonNameWithAffix } from "./messages"; import { Starter } from "./ui/starter-select-ui-handler"; import { Gender } from "./data/gender"; -import { Weather, WeatherType, getRandomWeatherType, getTerrainBlockMessage, getWeatherDamageMessage, getWeatherLapseMessage } from "./data/weather"; +import { getRandomWeatherType, getTerrainBlockMessage, getWeatherDamageMessage, getWeatherLapseMessage, Weather, WeatherType } from "./data/weather"; import { ArenaTagSide, ArenaTrapTag, MistTag, TrickRoomTag } from "./data/arena-tag"; -import { CheckTrappedAbAttr, PostAttackAbAttr, PostBattleAbAttr, PostDefendAbAttr, PostSummonAbAttr, PostTurnAbAttr, PostWeatherLapseAbAttr, PreSwitchOutAbAttr, PreWeatherDamageAbAttr, ProtectStatAbAttr, RedirectMoveAbAttr, BlockRedirectAbAttr, RunSuccessAbAttr, StatChangeMultiplierAbAttr, SuppressWeatherEffectAbAttr, SyncEncounterNatureAbAttr, applyAbAttrs, applyCheckTrappedAbAttrs, applyPostAttackAbAttrs, applyPostBattleAbAttrs, applyPostDefendAbAttrs, applyPostSummonAbAttrs, applyPostTurnAbAttrs, applyPostWeatherLapseAbAttrs, applyPreStatChangeAbAttrs, applyPreSwitchOutAbAttrs, applyPreWeatherEffectAbAttrs, IncrementMovePriorityAbAttr, applyPostVictoryAbAttrs, PostVictoryAbAttr, BlockNonDirectDamageAbAttr as BlockNonDirectDamageAbAttr, applyPostKnockOutAbAttrs, PostKnockOutAbAttr, PostBiomeChangeAbAttr, applyPostFaintAbAttrs, PostFaintAbAttr, IncreasePpAbAttr, PostStatChangeAbAttr, applyPostStatChangeAbAttrs, AlwaysHitAbAttr, PreventBerryUseAbAttr, StatChangeCopyAbAttr, PokemonTypeChangeAbAttr, applyPreAttackAbAttrs, applyPostMoveUsedAbAttrs, PostMoveUsedAbAttr, MaxMultiHitAbAttr, HealFromBerryUseAbAttr, IgnoreMoveEffectsAbAttr, BlockStatusDamageAbAttr, BypassSpeedChanceAbAttr, AddSecondStrikeAbAttr } from "./data/ability"; -import { Unlockables, getUnlockableName } from "./system/unlockables"; +import { + AddSecondStrikeAbAttr, AlwaysHitAbAttr, applyAbAttrs, applyCheckTrappedAbAttrs, applyPostAttackAbAttrs, applyPostBattleAbAttrs, applyPostDefendAbAttrs, applyPostFaintAbAttrs, applyPostKnockOutAbAttrs, applyPostMoveUsedAbAttrs, applyPostStatChangeAbAttrs, applyPostSummonAbAttrs, applyPostTurnAbAttrs, applyPostVictoryAbAttrs, applyPostWeatherLapseAbAttrs, applyPreAttackAbAttrs, applyPreStatChangeAbAttrs, applyPreSwitchOutAbAttrs, applyPreWeatherEffectAbAttrs, BlockNonDirectDamageAbAttr as BlockNonDirectDamageAbAttr, BlockRedirectAbAttr, BlockStatusDamageAbAttr, BypassSpeedChanceAbAttr, CheckTrappedAbAttr, HealFromBerryUseAbAttr, IgnoreMoveEffectsAbAttr, IncreasePpAbAttr, IncrementMovePriorityAbAttr, MaxMultiHitAbAttr, PokemonTypeChangeAbAttr, PostAttackAbAttr, PostBattleAbAttr, PostBiomeChangeAbAttr, PostDefendAbAttr, PostFaintAbAttr, PostKnockOutAbAttr, PostMoveUsedAbAttr, PostStatChangeAbAttr, PostSummonAbAttr, PostTurnAbAttr, PostVictoryAbAttr, PostWeatherLapseAbAttr, PreSwitchOutAbAttr, PreventBerryUseAbAttr, PreWeatherDamageAbAttr, ProtectStatAbAttr, RedirectMoveAbAttr, RunSuccessAbAttr, StatChangeCopyAbAttr, StatChangeMultiplierAbAttr, SuppressWeatherEffectAbAttr, SyncEncounterNatureAbAttr +} from "./data/ability"; +import { getUnlockableName, Unlockables } from "./system/unlockables"; import { getBiomeKey } from "./field/arena"; import { BattlerIndex, BattleType, TurnCommand } from "./battle"; import { achvs, ChallengeAchv, HealAchv, LevelAchv } from "./system/achv"; @@ -48,7 +51,7 @@ import { fetchDailyRunSeed, getDailyRunStarters } from "./data/daily-run"; import { GameMode, GameModes, getGameMode } from "./game-mode"; import PokemonSpecies, { getPokemonSpecies, speciesStarters } from "./data/pokemon-species"; import i18next from "./plugins/i18n"; -import { TextStyle, addTextObject } from "./ui/text"; +import { addTextObject, TextStyle } from "./ui/text"; import { Type } from "./data/type"; import { BerryUsedEvent, EncounterPhaseEvent, MoveUsedEvent, TurnEndEvent, TurnInitEvent } from "./events/battle-scene"; import { Abilities } from "#enums/abilities"; @@ -69,7 +72,6 @@ import ModifierSelectUiHandler, { SHOP_OPTIONS_ROW_LIMIT } from "#app/ui/modifie import { getEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; import { MysteryEncounterMode } from "#enums/mystery-encounter-mode"; import Overrides from "#app/overrides"; -import { isNullOrUndefined } from "./utils"; const { t } = i18next; @@ -859,7 +861,7 @@ export class EncounterPhase extends BattlePhase { if (!this.loaded) { if (battle.battleType === BattleType.TRAINER) { battle.enemyParty[e] = battle.trainer.genPartyMember(e); - } else { + } else if (battle.battleType !== BattleType.MYSTERY_ENCOUNTER) { const enemySpecies = this.scene.randomSpecies(battle.waveIndex, level, true); 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) { @@ -949,8 +951,7 @@ export class EncounterPhase extends BattlePhase { enemyPokemon.setVisible(false); this.scene.currentBattle.trainer.tint(0, 0.5); } else if (battle.battleType === BattleType.MYSTERY_ENCOUNTER) { - enemyPokemon.setVisible(false); - this.scene.currentBattle?.trainer?.tint(0, 0.5); + // TODO: this may not be necessary, but leaving as placeholder } if (battle.double) { enemyPokemon.setFieldPosition(e ? FieldPosition.RIGHT : FieldPosition.LEFT); diff --git a/src/test/mystery-encounter/encounters/part-timer-encounter.test.ts b/src/test/mystery-encounter/encounters/part-timer-encounter.test.ts new file mode 100644 index 00000000000..8bbfeb1d054 --- /dev/null +++ b/src/test/mystery-encounter/encounters/part-timer-encounter.test.ts @@ -0,0 +1,254 @@ +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 * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { runMysteryEncounterToEnd } from "#test/mystery-encounter/encounterTestUtils"; +import { SelectModifierPhase } from "#app/phases"; +import BattleScene from "#app/battle-scene"; +import { Mode } from "#app/ui/ui"; +import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; +import { CIVILIZATION_ENCOUNTER_BIOMES } from "#app/data/mystery-encounters/mystery-encounters"; +import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; +import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; +import { PartTimerEncounter } from "#app/data/mystery-encounters/encounters/part-timer-encounter"; + +const namespace = "mysteryEncounter:departmentStoreSale"; +const defaultParty = [Species.LAPRAS, Species.GENGAR, Species.ABRA]; +const defaultBiome = Biome.PLAINS; +const defaultWave = 37; + +describe("Department Store Sale - 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(true); + + const biomeMap = new Map([ + [Biome.VOLCANO, [MysteryEncounterType.MYSTERIOUS_CHALLENGERS]], + ]); + CIVILIZATION_ENCOUNTER_BIOMES.forEach(biome => { + biomeMap.set(biome, [MysteryEncounterType.PART_TIMER]); + }); + vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue(biomeMap); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + vi.clearAllMocks(); + vi.resetAllMocks(); + }); + + it("should have the correct properties", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.PART_TIMER, defaultParty); + + expect(PartTimerEncounter.encounterType).toBe(MysteryEncounterType.PART_TIMER); + expect(PartTimerEncounter.encounterTier).toBe(MysteryEncounterTier.COMMON); + expect(PartTimerEncounter.dialogue).toBeDefined(); + expect(PartTimerEncounter.dialogue.intro).toStrictEqual([ + { text: `${namespace}.intro` }, + { + speaker: `${namespace}.speaker`, + text: `${namespace}.intro_dialogue`, + } + ]); + expect(PartTimerEncounter.dialogue.encounterOptionsDialogue.title).toBe(`${namespace}.title`); + expect(PartTimerEncounter.dialogue.encounterOptionsDialogue.description).toBe(`${namespace}.description`); + expect(PartTimerEncounter.dialogue.encounterOptionsDialogue.query).toBe(`${namespace}.query`); + expect(PartTimerEncounter.options.length).toBe(3); + }); + + it("should not spawn outside of CIVILIZATION_ENCOUNTER_BIOMES", async () => { + game.override.mysteryEncounterTier(MysteryEncounterTier.COMMON); + game.override.startingBiome(Biome.VOLCANO); + await game.runToMysteryEncounter(); + + expect(scene.currentBattle?.mysteryEncounter?.encounterType).not.toBe(MysteryEncounterType.PART_TIMER); + }); + + it("should not run below wave 10", async () => { + game.override.startingWave(9); + + await game.runToMysteryEncounter(); + + expect(scene.currentBattle?.mysteryEncounter?.encounterType).not.toBe(MysteryEncounterType.PART_TIMER); + }); + + it("should not run above wave 179", async () => { + game.override.startingWave(181); + + await game.runToMysteryEncounter(); + + expect(scene.currentBattle.mysteryEncounter).toBeUndefined(); + }); + + describe("Option 1 - Make Deliveries", () => { + it("should have the correct properties", () => { + const option = PartTimerEncounter.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: [ + { + text: `${namespace}.option.1.selected` + } + ] + }); + }); + + it("should have shop with only TMs", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.PART_TIMER, defaultParty); + await runMysteryEncounterToEnd(game, 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(4); + for (const option of modifierSelectHandler.options) { + expect(option.modifierTypeOption.type.id).toContain("TM_"); + } + }); + + it("should leave encounter without battle", async () => { + const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); + + await game.runToMysteryEncounter(MysteryEncounterType.PART_TIMER, defaultParty); + await runMysteryEncounterToEnd(game, 1); + + expect(leaveEncounterWithoutBattleSpy).toBeCalled(); + }); + }); + + describe("Option 2 - Vitamin Shop", () => { + it("should have the correct properties", () => { + const option = PartTimerEncounter.options[1]; + expect(option.optionMode).toBe(MysteryEncounterOptionMode.DEFAULT); + expect(option.dialogue).toBeDefined(); + expect(option.dialogue).toStrictEqual({ + buttonLabel: `${namespace}.option.2.label`, + buttonTooltip: `${namespace}.option.2.tooltip`, + selected: [ + { + text: `${namespace}.option.2.selected` + } + ] + }); + }); + + it("should have shop with only Vitamins", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.PART_TIMER, 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(3); + for (const option of modifierSelectHandler.options) { + expect(option.modifierTypeOption.type.id.includes("PP_UP") || + option.modifierTypeOption.type.id.includes("BASE_STAT_BOOSTER")).toBeTruthy(); + } + }); + + it("should leave encounter without battle", async () => { + const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); + + await game.runToMysteryEncounter(MysteryEncounterType.PART_TIMER, defaultParty); + await runMysteryEncounterToEnd(game, 2); + + expect(leaveEncounterWithoutBattleSpy).toBeCalled(); + }); + }); + + describe("Option 3 - Assist with Sales", () => { + it("should have the correct properties", () => { + const option = PartTimerEncounter.options[2]; + expect(option.optionMode).toBe(MysteryEncounterOptionMode.DEFAULT); + expect(option.dialogue).toBeDefined(); + expect(option.dialogue).toStrictEqual({ + buttonLabel: `${namespace}.option.3.label`, + buttonTooltip: `${namespace}.option.3.tooltip`, + selected: [ + { + text: `${namespace}.option.3.selected` + } + ] + }); + }); + + it("should have shop with only X Items", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.PART_TIMER, defaultParty); + await runMysteryEncounterToEnd(game, 3); + 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(5); + for (const option of modifierSelectHandler.options) { + expect(option.modifierTypeOption.type.id.includes("DIRE_HIT") || + option.modifierTypeOption.type.id.includes("TEMP_STAT_BOOSTER")).toBeTruthy(); + } + }); + + it("should leave encounter without battle", async () => { + const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); + + await game.runToMysteryEncounter(MysteryEncounterType.PART_TIMER, defaultParty); + await runMysteryEncounterToEnd(game, 3); + + expect(leaveEncounterWithoutBattleSpy).toBeCalled(); + }); + }); + + describe("Option 4 - Pokeball Shop", () => { + it("should have the correct properties", () => { + const option = PartTimerEncounter.options[3]; + expect(option.optionMode).toBe(MysteryEncounterOptionMode.DEFAULT); + expect(option.dialogue).toBeDefined(); + expect(option.dialogue).toStrictEqual({ + buttonLabel: `${namespace}.option.4.label`, + buttonTooltip: `${namespace}.option.4.tooltip`, + }); + }); + + it("should have shop with only Pokeballs", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.PART_TIMER, defaultParty); + await runMysteryEncounterToEnd(game, 4); + 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(4); + for (const option of modifierSelectHandler.options) { + expect(option.modifierTypeOption.type.id).toContain("BALL"); + } + }); + + it("should leave encounter without battle", async () => { + const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); + + await game.runToMysteryEncounter(MysteryEncounterType.PART_TIMER, defaultParty); + await runMysteryEncounterToEnd(game, 4); + + expect(leaveEncounterWithoutBattleSpy).toBeCalled(); + }); + }); +}); From 7c9d34a2bb220065ad8d1473b521d0aaa52e8e5a Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Mon, 12 Aug 2024 10:35:17 -0400 Subject: [PATCH 240/270] add unit tests for Dancing Lessons and Part-Timer --- .../encounters/dancing-lessons-encounter.ts | 23 +- .../encounters/part-timer-encounter.ts | 20 +- src/overrides.ts | 4 +- src/phases.ts | 2 +- .../mystery-encounter/encounterTestUtils.ts | 6 +- .../dancing-lessons-encounter.test.ts | 246 ++++++++++++++++++ .../encounters/part-timer-encounter.test.ts | 199 ++++++++------ 7 files changed, 404 insertions(+), 96 deletions(-) create mode 100644 src/test/mystery-encounter/encounters/dancing-lessons-encounter.test.ts diff --git a/src/data/mystery-encounters/encounters/dancing-lessons-encounter.ts b/src/data/mystery-encounters/encounters/dancing-lessons-encounter.ts index fbf4c05e136..5b127984880 100644 --- a/src/data/mystery-encounters/encounters/dancing-lessons-encounter.ts +++ b/src/data/mystery-encounters/encounters/dancing-lessons-encounter.ts @@ -1,4 +1,4 @@ -import { EnemyPartyConfig, initBattleWithEnemyConfig, leaveEncounterWithoutBattle, selectPokemonForOption, transitionMysteryEncounterIntroVisuals, } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { EnemyPartyConfig, initBattleWithEnemyConfig, leaveEncounterWithoutBattle, selectPokemonForOption, setEncounterRewards, transitionMysteryEncounterIntroVisuals, } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import Pokemon, { PlayerPokemon, PokemonMove } from "#app/field/pokemon"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { Species } from "#enums/species"; @@ -23,6 +23,7 @@ import { OptionSelectItem } from "#app/ui/abstact-option-select-ui-handler"; import { BattlerIndex } from "#app/battle"; import { catchPokemon } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; import { PokeballType } from "#enums/pokeball"; +import { modifierTypes } from "#app/modifier/modifier-type"; /** the i18n namespace for this encounter */ const namespace = "mysteryEncounter:dancingLessons"; @@ -179,6 +180,7 @@ export const DancingLessonsEncounter: IMysteryEncounter = ignorePp: true }); + setEncounterRewards(scene, { guaranteedModifierTypeFuncs: [modifierTypes.BATON], fillRemaining: true }); await initBattleWithEnemyConfig(scene, encounter.enemyPartyConfigs[0]); }) .build() @@ -223,7 +225,7 @@ export const DancingLessonsEncounter: IMysteryEncounter = .withDialogue({ buttonLabel: `${namespace}.option.3.label`, buttonTooltip: `${namespace}.option.3.tooltip`, - disabledButtonTooltip: `${namespace}.option.3.tooltip`, + disabledButtonTooltip: `${namespace}.option.3.disabled_tooltip`, secondOptionPrompt: `${namespace}.option.3.select_prompt`, selected: [ { @@ -242,9 +244,11 @@ export const DancingLessonsEncounter: IMysteryEncounter = const option: OptionSelectItem = { label: move.getName(), handler: () => { - // Pokemon and second option selected + // Pokemon and second option selected encounter.setDialogueToken("selectedPokemon", pokemon.getNameToRender()); encounter.setDialogueToken("selectedMove", move.getName()); + encounter.misc.selectedMove = move; + return true; }, }; @@ -267,9 +271,20 @@ export const DancingLessonsEncounter: IMysteryEncounter = }) .withOptionPhase(async (scene: BattleScene) => { // Show the Oricorio a dance, and recruit it - const oricorio = scene.currentBattle.mysteryEncounter.misc.oricorioData.toPokemon(scene); + const encounter = scene.currentBattle.mysteryEncounter; + const oricorio = encounter.misc.oricorioData.toPokemon(scene); oricorio.passive = true; + // Ensure the Oricorio's moveset gains the Dance move the player used + const move = encounter.misc.selectedMove?.getMove().id; + if (!oricorio.moveset.some(m => m.getMove().id === move)) { + if (oricorio.moveset.length < 4) { + oricorio.moveset.push(new PokemonMove(move)); + } else { + oricorio.moveset[3] = new PokemonMove(move); + } + } + transitionMysteryEncounterIntroVisuals(scene, true, true, 500); await catchPokemon(scene, oricorio, null, PokeballType.POKEBALL, false); leaveEncounterWithoutBattle(scene, true); diff --git a/src/data/mystery-encounters/encounters/part-timer-encounter.ts b/src/data/mystery-encounters/encounters/part-timer-encounter.ts index 1b1671e4a27..a7f53976bbb 100644 --- a/src/data/mystery-encounters/encounters/part-timer-encounter.ts +++ b/src/data/mystery-encounters/encounters/part-timer-encounter.ts @@ -1,5 +1,5 @@ import { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; -import { leaveEncounterWithoutBattle, selectPokemonForOption, setEncounterRewards, transitionMysteryEncounterIntroVisuals, updatePlayerMoney } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { leaveEncounterWithoutBattle, selectPokemonForOption, setEncounterExp, setEncounterRewards, transitionMysteryEncounterIntroVisuals, updatePlayerMoney } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import BattleScene from "#app/battle-scene"; import IMysteryEncounter, { MysteryEncounterBuilder } from "../mystery-encounter"; @@ -87,10 +87,10 @@ export const PartTimerEncounter: IMysteryEncounter = const onPokemonSelected = (pokemon: PlayerPokemon) => { encounter.setDialogueToken("selectedPokemon", pokemon.getNameToRender()); - // Calculate the "baseline" stat value (100 base stat, 31 IVs, neutral nature, same level as pokemon) to compare + // Calculate the "baseline" stat value (90 base stat, 16 IVs, neutral nature, same level as pokemon) to compare // Resulting money is 2.5 * (% difference from baseline), with minimum of 1 and maximum of 4. // Calculation from Pokemon.calculateStats - const baselineValue = Math.floor(((2 * 100 + 31) * pokemon.level) * 0.01) + 5; + const baselineValue = Math.floor(((2 * 90 + 16) * pokemon.level) * 0.01) + 5; const percentDiff = (pokemon.getStat(Stat.SPD) - baselineValue) / baselineValue; const moneyMultiplier = Math.min(Math.max(2.5 * (1+ percentDiff), 1), 4); @@ -104,6 +104,8 @@ export const PartTimerEncounter: IMysteryEncounter = move.ppUsed = move.ppUsed < newPpUsed ? newPpUsed : move.ppUsed; }); + setEncounterExp(scene, pokemon.id, 100); + // Hide intro visuals transitionMysteryEncounterIntroVisuals(scene, true, false); // Play sfx for "working" @@ -161,15 +163,15 @@ export const PartTimerEncounter: IMysteryEncounter = const onPokemonSelected = (pokemon: PlayerPokemon) => { encounter.setDialogueToken("selectedPokemon", pokemon.getNameToRender()); - // Calculate the "baseline" stat value (100 base stat, 31 IVs, neutral nature, same level as pokemon) to compare + // Calculate the "baseline" stat value (75 base stat, 16 IVs, neutral nature, same level as pokemon) to compare // Resulting money is 2.5 * (% difference from baseline), with minimum of 1 and maximum of 4. // Calculation from Pokemon.calculateStats - const baselineHp = Math.floor(((2 * 80 + 31) * pokemon.level) * 0.01) + pokemon.level + 10; - const baselineAtkDef = Math.floor(((2 * 80 + 31) * pokemon.level) * 0.01) + 5; + const baselineHp = Math.floor(((2 * 75 + 16) * pokemon.level) * 0.01) + pokemon.level + 10; + const baselineAtkDef = Math.floor(((2 * 75 + 16) * pokemon.level) * 0.01) + 5; const baselineValue = baselineHp + 1.5 * (baselineAtkDef * 2); const strongestValue = pokemon.getStat(Stat.HP) + 1.5 * (pokemon.getStat(Stat.ATK) + pokemon.getStat(Stat.DEF)); const percentDiff = (strongestValue - baselineValue) / baselineValue; - const moneyMultiplier = Math.min(Math.max(2.5 * (1+ percentDiff), 1), 4); + const moneyMultiplier = Math.min(Math.max(2.5 * (1 + percentDiff), 1), 4); encounter.misc = { moneyMultiplier @@ -181,6 +183,8 @@ export const PartTimerEncounter: IMysteryEncounter = move.ppUsed = move.ppUsed < newPpUsed ? newPpUsed : move.ppUsed; }); + setEncounterExp(scene, pokemon.id, 100); + // Hide intro visuals transitionMysteryEncounterIntroVisuals(scene, true, false); // Play sfx for "working" @@ -246,6 +250,8 @@ export const PartTimerEncounter: IMysteryEncounter = move.ppUsed = move.ppUsed < newPpUsed ? newPpUsed : move.ppUsed; }); + setEncounterExp(scene, selectedPokemon.id, 100); + // Hide intro visuals transitionMysteryEncounterIntroVisuals(scene, true, false); // Play sfx for "working" diff --git a/src/overrides.ts b/src/overrides.ts index 50aa3a0b280..1196797fac0 100644 --- a/src/overrides.ts +++ b/src/overrides.ts @@ -127,9 +127,9 @@ class DefaultOverrides { // ------------------------- // 1 to 256, set to null to ignore - readonly MYSTERY_ENCOUNTER_RATE_OVERRIDE: number = 256; + readonly MYSTERY_ENCOUNTER_RATE_OVERRIDE: number = null; readonly MYSTERY_ENCOUNTER_TIER_OVERRIDE: MysteryEncounterTier = null; - readonly MYSTERY_ENCOUNTER_OVERRIDE: MysteryEncounterType = MysteryEncounterType.DANCING_LESSONS; + readonly MYSTERY_ENCOUNTER_OVERRIDE: MysteryEncounterType = null; // ------------------------- // MODIFIER / ITEM OVERRIDES diff --git a/src/phases.ts b/src/phases.ts index 56cfd1d2448..24cf33a98f6 100644 --- a/src/phases.ts +++ b/src/phases.ts @@ -861,7 +861,7 @@ export class EncounterPhase extends BattlePhase { if (!this.loaded) { if (battle.battleType === BattleType.TRAINER) { battle.enemyParty[e] = battle.trainer.genPartyMember(e); - } else if (battle.battleType !== BattleType.MYSTERY_ENCOUNTER) { + } else { const enemySpecies = this.scene.randomSpecies(battle.waveIndex, level, true); 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) { diff --git a/src/test/mystery-encounter/encounterTestUtils.ts b/src/test/mystery-encounter/encounterTestUtils.ts index a3eb505c090..791c96b3437 100644 --- a/src/test/mystery-encounter/encounterTestUtils.ts +++ b/src/test/mystery-encounter/encounterTestUtils.ts @@ -18,7 +18,7 @@ import OptionSelectUiHandler from "#app/ui/settings/option-select-ui-handler"; * @param secondaryOptionSelect - * @param isBattle - if selecting option should lead to battle, set to true */ -export async function runMysteryEncounterToEnd(game: GameManager, optionNo: number, secondaryOptionSelect: { pokemonNo: number, optionNo: number } = null, isBattle: boolean = false) { +export async function runMysteryEncounterToEnd(game: GameManager, optionNo: number, secondaryOptionSelect: { pokemonNo: number, optionNo?: number } = null, isBattle: boolean = false) { vi.spyOn(EncounterPhaseUtils, "selectPokemonForOption"); await runSelectMysteryEncounterOption(game, optionNo, secondaryOptionSelect); @@ -65,7 +65,7 @@ export async function runMysteryEncounterToEnd(game: GameManager, optionNo: numb } } -export async function runSelectMysteryEncounterOption(game: GameManager, optionNo: number, secondaryOptionSelect: { pokemonNo: number, optionNo: number } = null) { +export async function runSelectMysteryEncounterOption(game: GameManager, optionNo: number, secondaryOptionSelect: { pokemonNo: number, optionNo?: number } = null) { // Handle any eventual queued messages (e.g. weather phase, etc.) game.onNextPrompt("MessagePhase", Mode.MESSAGE, () => { const uiHandler = game.scene.ui.getHandler(); @@ -112,7 +112,7 @@ export async function runSelectMysteryEncounterOption(game: GameManager, optionN } } -async function handleSecondaryOptionSelect(game: GameManager, pokemonNo: number, optionNo: number) { +async function handleSecondaryOptionSelect(game: GameManager, pokemonNo: number, optionNo?: number) { // Handle secondary option selections const partyUiHandler = game.scene.ui.handlers[Mode.PARTY] as PartyUiHandler; vi.spyOn(partyUiHandler, "show"); diff --git a/src/test/mystery-encounter/encounters/dancing-lessons-encounter.test.ts b/src/test/mystery-encounter/encounters/dancing-lessons-encounter.test.ts new file mode 100644 index 00000000000..89afd9d43aa --- /dev/null +++ b/src/test/mystery-encounter/encounters/dancing-lessons-encounter.test.ts @@ -0,0 +1,246 @@ +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 * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { runMysteryEncounterToEnd, runSelectMysteryEncounterOption, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounterTestUtils"; +import BattleScene from "#app/battle-scene"; +import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; +import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; +import * as MysteryEncounters from "#app/data/mystery-encounters/mystery-encounters"; +import { CommandPhase, LearnMovePhase, MovePhase, SelectModifierPhase } from "#app/phases"; +import { Moves } from "#enums/moves"; +import { DancingLessonsEncounter } from "#app/data/mystery-encounters/encounters/dancing-lessons-encounter"; +import { Mode } from "#app/ui/ui"; +import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; +import { PokemonMove } from "#app/field/pokemon"; +import { MysteryEncounterPhase } from "#app/phases/mystery-encounter-phases"; + +const namespace = "mysteryEncounter:dancingLessons"; +const defaultParty = [Species.LAPRAS, Species.GENGAR, Species.ABRA]; +const defaultBiome = Biome.PLAINS; +const defaultWave = 45; + +describe("Dancing Lessons - 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(true); + + vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue( + new Map([ + [Biome.PLAINS, [MysteryEncounterType.DANCING_LESSONS]], + [Biome.SPACE, [MysteryEncounterType.MYSTERIOUS_CHALLENGERS]], + ]) + ); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + vi.clearAllMocks(); + vi.resetAllMocks(); + }); + + it("should have the correct properties", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.DANCING_LESSONS, defaultParty); + + expect(DancingLessonsEncounter.encounterType).toBe(MysteryEncounterType.DANCING_LESSONS); + expect(DancingLessonsEncounter.encounterTier).toBe(MysteryEncounterTier.GREAT); + expect(DancingLessonsEncounter.dialogue).toBeDefined(); + expect(DancingLessonsEncounter.dialogue.intro).toStrictEqual([{ text: `${namespace}.intro` }]); + expect(DancingLessonsEncounter.dialogue.encounterOptionsDialogue.title).toBe(`${namespace}.title`); + expect(DancingLessonsEncounter.dialogue.encounterOptionsDialogue.description).toBe(`${namespace}.description`); + expect(DancingLessonsEncounter.dialogue.encounterOptionsDialogue.query).toBe(`${namespace}.query`); + expect(DancingLessonsEncounter.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.DANCING_LESSONS); + }); + + it("should not run above wave 179", async () => { + game.override.startingWave(181); + + await game.runToMysteryEncounter(); + + expect(scene.currentBattle.mysteryEncounter).toBeUndefined(); + }); + + it("should not spawn outside of proper biomes", async () => { + game.override.mysteryEncounterTier(MysteryEncounterTier.GREAT); + game.override.startingBiome(Biome.SPACE); + await game.runToMysteryEncounter(); + + expect(game.scene.currentBattle.mysteryEncounter?.encounterType).not.toBe(MysteryEncounterType.DANCING_LESSONS); + }); + + describe("Option 1 - Fight the Oricorio", () => { + it("should have the correct properties", () => { + const option1 = DancingLessonsEncounter.options[0]; + expect(option1.optionMode).toBe(MysteryEncounterOptionMode.DEFAULT); + expect(option1.dialogue).toBeDefined(); + expect(option1.dialogue).toStrictEqual({ + buttonLabel: `${namespace}.option.1.label`, + buttonTooltip: `${namespace}.option.1.tooltip`, + selected: [ + { + text: `${namespace}.option.1.selected`, + }, + ], + }); + }); + + it("should start battle against Oricorio", async () => { + const phaseSpy = vi.spyOn(scene, "pushPhase"); + + await game.runToMysteryEncounter(MysteryEncounterType.DANCING_LESSONS, defaultParty); + await runMysteryEncounterToEnd(game, 1, null, true); + + const enemyField = scene.getEnemyField(); + expect(scene.getCurrentPhase().constructor.name).toBe(CommandPhase.name); + expect(enemyField.length).toBe(1); + expect(enemyField[0].species.speciesId).toBe(Species.ORICORIO); + expect(enemyField[0].summonData.battleStats).toEqual([1, 1, 1, 1, 1, 0, 0]); + const moveset = enemyField[0].moveset.map(m => m.moveId); + expect(moveset.some(m => m === Moves.REVELATION_DANCE)).toBeTruthy(); + + const movePhases = phaseSpy.mock.calls.filter(p => p[0] instanceof MovePhase).map(p => p[0]); + expect(movePhases.length).toBe(1); + expect(movePhases.filter(p => (p as MovePhase).move.moveId === Moves.REVELATION_DANCE).length).toBe(1); // Revelation Dance used before battle + }); + + it("should have a Baton in the rewards after battle", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.DANCING_LESSONS, defaultParty); + await runMysteryEncounterToEnd(game, 1, null, true); + await skipBattleRunMysteryEncounterRewardsPhase(game); + await game.phaseInterceptor.to(SelectModifierPhase, false); + 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); // Should fill remaining + expect(modifierSelectHandler.options[0].modifierTypeOption.type.id).toContain("BATON"); + }); + }); + + describe("Option 2 - Learn its Dance", () => { + it("should have the correct properties", () => { + const option = DancingLessonsEncounter.options[1]; + expect(option.optionMode).toBe(MysteryEncounterOptionMode.DEFAULT); + expect(option.dialogue).toBeDefined(); + expect(option.dialogue).toStrictEqual({ + buttonLabel: `${namespace}.option.2.label`, + buttonTooltip: `${namespace}.option.2.tooltip`, + selected: [ + { + text: `${namespace}.option.2.selected`, + }, + ], + }); + }); + + it("Should select a pokemon to learn Revelation Dance", async () => { + const phaseSpy = vi.spyOn(scene, "unshiftPhase"); + + await game.runToMysteryEncounter(MysteryEncounterType.DANCING_LESSONS, defaultParty); + await runMysteryEncounterToEnd(game, 2, { pokemonNo: 1 }); + + const movePhases = phaseSpy.mock.calls.filter(p => p[0] instanceof LearnMovePhase).map(p => p[0]); + expect(movePhases.length).toBe(1); + expect(movePhases.filter(p => (p as LearnMovePhase)["moveId"] === Moves.REVELATION_DANCE).length).toBe(1); // Revelation Dance taught to pokemon + }); + + it("should leave encounter without battle", async () => { + const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); + + await game.runToMysteryEncounter(MysteryEncounterType.DANCING_LESSONS, defaultParty); + await runMysteryEncounterToEnd(game, 2, { pokemonNo: 1 }); + + expect(leaveEncounterWithoutBattleSpy).toBeCalled(); + }); + }); + + describe("Option 3 - Teach it a Dance", () => { + it("should have the correct properties", () => { + const option = DancingLessonsEncounter.options[2]; + expect(option.optionMode).toBe(MysteryEncounterOptionMode.DISABLED_OR_SPECIAL); + expect(option.dialogue).toBeDefined(); + expect(option.dialogue).toStrictEqual({ + buttonLabel: `${namespace}.option.3.label`, + buttonTooltip: `${namespace}.option.3.tooltip`, + disabledButtonTooltip: `${namespace}.option.3.disabled_tooltip`, + secondOptionPrompt: `${namespace}.option.3.select_prompt`, + selected: [ + { + text: `${namespace}.option.3.selected`, + }, + ], + }); + }); + + it("should add Oricorio to the party", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.DANCING_LESSONS, defaultParty); + const partyCountBefore = scene.getParty().length; + scene.getParty()[0].moveset = [new PokemonMove(Moves.DRAGON_DANCE)]; + await runMysteryEncounterToEnd(game, 3, {pokemonNo: 1, optionNo: 1}); + const partyCountAfter = scene.getParty().length; + + expect(partyCountBefore + 1).toBe(partyCountAfter); + const oricorio = scene.getParty()[scene.getParty().length - 1]; + expect(oricorio.species.speciesId).toBe(Species.ORICORIO); + const moveset = oricorio.moveset.map(m => m.moveId); + expect(moveset?.some(m => m === Moves.REVELATION_DANCE)).toBeTruthy(); + expect(moveset?.some(m => m === Moves.DRAGON_DANCE)).toBeTruthy(); + }); + + it("should NOT be selectable if the player doesn't have a Dance type move", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.DANCING_LESSONS, defaultParty); + const partyCountBefore = scene.getParty().length; + scene.getParty().forEach(p => p.moveset = []); + 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, 3); + const partyCountAfter = scene.getParty().length; + + 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(); + expect(partyCountBefore).toBe(partyCountAfter); + }); + + it("should leave encounter without battle", async () => { + const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); + + await game.runToMysteryEncounter(MysteryEncounterType.DANCING_LESSONS, defaultParty); + scene.getParty()[0].moveset = [new PokemonMove(Moves.DRAGON_DANCE)]; + await runMysteryEncounterToEnd(game, 3, {pokemonNo: 1, optionNo: 1}); + + expect(leaveEncounterWithoutBattleSpy).toBeCalled(); + }); + }); +}); 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 8bbfeb1d054..95e358bb6ae 100644 --- a/src/test/mystery-encounter/encounters/part-timer-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/part-timer-encounter.test.ts @@ -5,22 +5,23 @@ 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 { SelectModifierPhase } from "#app/phases"; +import { runMysteryEncounterToEnd, runSelectMysteryEncounterOption } from "#test/mystery-encounter/encounterTestUtils"; import BattleScene from "#app/battle-scene"; -import { Mode } from "#app/ui/ui"; -import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; import { CIVILIZATION_ENCOUNTER_BIOMES } from "#app/data/mystery-encounters/mystery-encounters"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; import { PartTimerEncounter } from "#app/data/mystery-encounters/encounters/part-timer-encounter"; +import { PokemonMove } from "#app/field/pokemon"; +import { Moves } from "#enums/moves"; +import { MysteryEncounterPhase } from "#app/phases/mystery-encounter-phases"; -const namespace = "mysteryEncounter:departmentStoreSale"; -const defaultParty = [Species.LAPRAS, Species.GENGAR, Species.ABRA]; +const namespace = "mysteryEncounter:partTimer"; +// Pyukumuku for lowest speed, Regieleki for highest speed, Feebas for lowest "bulk", Melmetal for highest "bulk" +const defaultParty = [Species.PYUKUMUKU, Species.REGIELEKI, Species.FEEBAS, Species.MELMETAL]; const defaultBiome = Biome.PLAINS; const defaultWave = 37; -describe("Department Store Sale - Mystery Encounter", () => { +describe("Part-Timer - Mystery Encounter", () => { let phaserGame: Phaser.Game; let game: GameManager; let scene: BattleScene; @@ -111,17 +112,42 @@ describe("Department Store Sale - Mystery Encounter", () => { }); }); - it("should have shop with only TMs", async () => { - await game.runToMysteryEncounter(MysteryEncounterType.PART_TIMER, defaultParty); - await runMysteryEncounterToEnd(game, 1); - expect(scene.getCurrentPhase().constructor.name).toBe(SelectModifierPhase.name); - await game.phaseInterceptor.run(SelectModifierPhase); + it("should give the player 1x money multiplier money with max slowest Pokemon", async () => { + vi.spyOn(EncounterPhaseUtils, "updatePlayerMoney"); - 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(4); - for (const option of modifierSelectHandler.options) { - expect(option.modifierTypeOption.type.id).toContain("TM_"); + await game.runToMysteryEncounter(MysteryEncounterType.PART_TIMER, defaultParty); + // Override party levels to 50 so stats can be fully reflective + scene.getParty().forEach(p => { + p.level = 50; + p.calculateStats(); + }); + await runMysteryEncounterToEnd(game, 1, { pokemonNo: 1 }); + + expect(EncounterPhaseUtils.updatePlayerMoney).toHaveBeenCalledWith(scene, scene.getWaveMoneyAmount(1), true, false); + // Expect PP of mon's moves to have been reduced to 2 + const moves = scene.getParty()[0].moveset; + for (const move of moves) { + expect(move.getMovePp() - move.ppUsed).toBe(2); + } + }); + + it("should give the player 4x money multiplier money with max fastest Pokemon", async () => { + vi.spyOn(EncounterPhaseUtils, "updatePlayerMoney"); + + await game.runToMysteryEncounter(MysteryEncounterType.PART_TIMER, defaultParty); + // Override party levels to 50 so stats can be fully reflective + scene.getParty().forEach(p => { + p.level = 50; + p.ivs = [20,20,20,20,20,20]; + p.calculateStats(); + }); + await runMysteryEncounterToEnd(game, 1, { pokemonNo: 2 }); + + expect(EncounterPhaseUtils.updatePlayerMoney).toHaveBeenCalledWith(scene, scene.getWaveMoneyAmount(4), true, false); + // Expect PP of mon's moves to have been reduced to 2 + const moves = scene.getParty()[1].moveset; + for (const move of moves) { + expect(move.getMovePp() - move.ppUsed).toBe(2); } }); @@ -129,13 +155,13 @@ describe("Department Store Sale - Mystery Encounter", () => { const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); await game.runToMysteryEncounter(MysteryEncounterType.PART_TIMER, defaultParty); - await runMysteryEncounterToEnd(game, 1); + await runMysteryEncounterToEnd(game, 1, { pokemonNo: 1 }); expect(leaveEncounterWithoutBattleSpy).toBeCalled(); }); }); - describe("Option 2 - Vitamin Shop", () => { + describe("Option 2 - Help in the Warehouse", () => { it("should have the correct properties", () => { const option = PartTimerEncounter.options[1]; expect(option.optionMode).toBe(MysteryEncounterOptionMode.DEFAULT); @@ -151,18 +177,42 @@ describe("Department Store Sale - Mystery Encounter", () => { }); }); - it("should have shop with only Vitamins", async () => { - await game.runToMysteryEncounter(MysteryEncounterType.PART_TIMER, defaultParty); - await runMysteryEncounterToEnd(game, 2); - expect(scene.getCurrentPhase().constructor.name).toBe(SelectModifierPhase.name); - await game.phaseInterceptor.run(SelectModifierPhase); + it("should give the player 1x money multiplier money with least bulky Pokemon", async () => { + vi.spyOn(EncounterPhaseUtils, "updatePlayerMoney"); - 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); - for (const option of modifierSelectHandler.options) { - expect(option.modifierTypeOption.type.id.includes("PP_UP") || - option.modifierTypeOption.type.id.includes("BASE_STAT_BOOSTER")).toBeTruthy(); + await game.runToMysteryEncounter(MysteryEncounterType.PART_TIMER, defaultParty); + // Override party levels to 50 so stats can be fully reflective + scene.getParty().forEach(p => { + p.level = 50; + p.calculateStats(); + }); + await runMysteryEncounterToEnd(game, 2, { pokemonNo: 3 }); + + expect(EncounterPhaseUtils.updatePlayerMoney).toHaveBeenCalledWith(scene, scene.getWaveMoneyAmount(1), true, false); + // Expect PP of mon's moves to have been reduced to 2 + const moves = scene.getParty()[2].moveset; + for (const move of moves) { + expect(move.getMovePp() - move.ppUsed).toBe(2); + } + }); + + it("should give the player 4x money multiplier money with bulkiest Pokemon", async () => { + vi.spyOn(EncounterPhaseUtils, "updatePlayerMoney"); + + await game.runToMysteryEncounter(MysteryEncounterType.PART_TIMER, defaultParty); + // Override party levels to 50 so stats can be fully reflective + scene.getParty().forEach(p => { + p.level = 50; + p.ivs = [20,20,20,20,20,20]; + p.calculateStats(); + }); + await runMysteryEncounterToEnd(game, 2, { pokemonNo: 4 }); + + expect(EncounterPhaseUtils.updatePlayerMoney).toHaveBeenCalledWith(scene, scene.getWaveMoneyAmount(4), true, false); + // Expect PP of mon's moves to have been reduced to 2 + const moves = scene.getParty()[3].moveset; + for (const move of moves) { + expect(move.getMovePp() - move.ppUsed).toBe(2); } }); @@ -170,7 +220,7 @@ describe("Department Store Sale - Mystery Encounter", () => { const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); await game.runToMysteryEncounter(MysteryEncounterType.PART_TIMER, defaultParty); - await runMysteryEncounterToEnd(game, 2); + await runMysteryEncounterToEnd(game, 2, { pokemonNo: 1 }); expect(leaveEncounterWithoutBattleSpy).toBeCalled(); }); @@ -179,11 +229,12 @@ describe("Department Store Sale - Mystery Encounter", () => { describe("Option 3 - Assist with Sales", () => { it("should have the correct properties", () => { const option = PartTimerEncounter.options[2]; - expect(option.optionMode).toBe(MysteryEncounterOptionMode.DEFAULT); + expect(option.optionMode).toBe(MysteryEncounterOptionMode.DISABLED_OR_SPECIAL); 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` @@ -192,18 +243,43 @@ describe("Department Store Sale - Mystery Encounter", () => { }); }); - it("should have shop with only X Items", async () => { - await game.runToMysteryEncounter(MysteryEncounterType.PART_TIMER, defaultParty); - await runMysteryEncounterToEnd(game, 3); - expect(scene.getCurrentPhase().constructor.name).toBe(SelectModifierPhase.name); - await game.phaseInterceptor.run(SelectModifierPhase); + it("Should NOT be selectable when requirements are not met", async () => { + vi.spyOn(EncounterPhaseUtils, "updatePlayerMoney"); - 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(5); - for (const option of modifierSelectHandler.options) { - expect(option.modifierTypeOption.type.id.includes("DIRE_HIT") || - option.modifierTypeOption.type.id.includes("TEMP_STAT_BOOSTER")).toBeTruthy(); + await game.runToMysteryEncounter(MysteryEncounterType.PART_TIMER, defaultParty); + // Mock movesets + scene.getParty().forEach(p => p.moveset = []); + 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, 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(); + expect(EncounterPhaseUtils.updatePlayerMoney).not.toHaveBeenCalled(); + }); + + it("should be selectable and give the player 2.5x money multiplier money with requirements met", async () => { + vi.spyOn(EncounterPhaseUtils, "updatePlayerMoney"); + + await game.runToMysteryEncounter(MysteryEncounterType.PART_TIMER, defaultParty); + // Mock moveset + scene.getParty()[0].moveset = [new PokemonMove(Moves.ATTRACT)]; + await runMysteryEncounterToEnd(game, 3); + + expect(EncounterPhaseUtils.updatePlayerMoney).toHaveBeenCalledWith(scene, scene.getWaveMoneyAmount(2.5), true, false); + // Expect PP of mon's moves to have been reduced to 2 + const moves = scene.getParty()[0].moveset; + for (const move of moves) { + expect(move.getMovePp() - move.ppUsed).toBe(2); } }); @@ -211,42 +287,7 @@ describe("Department Store Sale - Mystery Encounter", () => { const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); await game.runToMysteryEncounter(MysteryEncounterType.PART_TIMER, defaultParty); - await runMysteryEncounterToEnd(game, 3); - - expect(leaveEncounterWithoutBattleSpy).toBeCalled(); - }); - }); - - describe("Option 4 - Pokeball Shop", () => { - it("should have the correct properties", () => { - const option = PartTimerEncounter.options[3]; - expect(option.optionMode).toBe(MysteryEncounterOptionMode.DEFAULT); - expect(option.dialogue).toBeDefined(); - expect(option.dialogue).toStrictEqual({ - buttonLabel: `${namespace}.option.4.label`, - buttonTooltip: `${namespace}.option.4.tooltip`, - }); - }); - - it("should have shop with only Pokeballs", async () => { - await game.runToMysteryEncounter(MysteryEncounterType.PART_TIMER, defaultParty); - await runMysteryEncounterToEnd(game, 4); - 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(4); - for (const option of modifierSelectHandler.options) { - expect(option.modifierTypeOption.type.id).toContain("BALL"); - } - }); - - it("should leave encounter without battle", async () => { - const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); - - await game.runToMysteryEncounter(MysteryEncounterType.PART_TIMER, defaultParty); - await runMysteryEncounterToEnd(game, 4); + await runMysteryEncounterToEnd(game, 2, { pokemonNo: 1 }); expect(leaveEncounterWithoutBattleSpy).toBeCalled(); }); From e554f6ee4ad977acd1e21cc1a4d93450d48f1a47 Mon Sep 17 00:00:00 2001 From: InnocentGameDev Date: Thu, 15 Aug 2024 00:42:56 +0200 Subject: [PATCH 241/270] reordered biome list and adjusted redirection for project and labels --- .github/ISSUE_TEMPLATE/mystery_event.yml | 113 ++++++++++++----------- 1 file changed, 59 insertions(+), 54 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/mystery_event.yml b/.github/ISSUE_TEMPLATE/mystery_event.yml index 3791026e778..ecb396a1928 100644 --- a/.github/ISSUE_TEMPLATE/mystery_event.yml +++ b/.github/ISSUE_TEMPLATE/mystery_event.yml @@ -1,15 +1,15 @@ -name: Mystery Event -description: Propose a new mystery event -title: "[Event] " -labels: ["event proposal", "balance review"] -projects: ["AsdarDevelops/1"] +name: Mysterious Encounter +description: Propose a new mysterious encounter +title: "[M.E.] (Rarity)" +labels: ["New Mystery Encounter", "Balance Adjustment"] +projects: ["AsdarDevelops/MEs / Events Project"] body: - type: input id: name attributes: - label: Event Name - description: Name of the event - placeholder: e.g. "Fight or Flight" + label: M.E. Name + description: Name of the M.E. Remember to check out the [M.E. Proposal Guide](https://github.com/AsdarDevelops/PokeRogue-Events/blob/mystery-battle-events/MEs_Proposal_Guide.md) if you have not yet! + placeholder: e.g. "Fight or Flight" or "No matter how small (Three Beast Trio - Part 1)" validations: required: true - type: markdown # SEPARATOR @@ -20,7 +20,7 @@ body: id: rarity attributes: label: Rarity Tier - description: Check out the [Event Proposal Guide](https://github.com/AsdarDevelops/PokeRogue-Events/blob/mystery-battle-events/MEs_Proposal_Guide.md) if you have not yet! + description: Check out the [M.E. Proposal Guide](https://github.com/AsdarDevelops/PokeRogue-Events/blob/mystery-battle-events/MEs_Proposal_Guide.md) to better know how to propose a tier. multiple: false options: - Common @@ -46,8 +46,8 @@ body: id: waves attributes: label: Waves - description: Classic/Challenge ranges 1-200. Currently only 11-179 is supported. - placeholder: 11-179 + description: Classic/Challenge ranges 1-200. Currently only 10-180 are supported. + placeholder: i.e. "10-180" or "40-180, only on the three first waves of each biome" validations: required: true - type: markdown # SEPARATOR @@ -58,8 +58,8 @@ body: id: description attributes: label: Description - description: Describe the event you are proposing. Explain its theme and how it's different from others. If the Event has any requirements to even trigger, detail them here too. - placeholder: e.g. "Fight or Flight is a common event where the player can fight a boss PKMN of the biome. The PKMN is stronger than usual, but also holds an item that's better than usual." + description: Describe the M.E. you are proposing. Explain its theme and how it's different from others. If the M.E. has any requirements to even trigger, detail them here too. If the M.E. is part of a Quest, link the other issues or edit them in later. + placeholder: e.g. "Fight or Flight is a common M.E. where the player can fight a boss PKMN of the biome. The PKMN is stronger than usual, but also holds an item that's better than usual." validations: required: true - type: markdown # SEPARATOR @@ -70,47 +70,48 @@ body: id: biomes attributes: label: Biomes - description: Select all biomes where the event can occur. "ANY, NON-EXTREME, CIVILIZATION and HUMAN are groups of biomes. Check the [Biomes part of the guide](https://github.com/AsdarDevelops/PokeRogue-Events/blob/mystery-battle-events/MEs_Proposal_Guide.md#biomes)." + description: Select all biomes where the M.E. can occur. "ANY", "NON-EXTREME", "CIVILIZATION" and "HUMAN" are groups of biomes. Check the [Biomes part of the guide](https://github.com/AsdarDevelops/PokeRogue-Events/blob/mystery-battle-events/MEs_Proposal_Guide.md#biomes)." multiple: true options: - ANY - NON-EXTREME - HUMAN - CIVILIZATION - - TOWN - - PLAINS - - GRASS - - TALL_GRASS - - METROPOLIS - - FOREST - - SEA - - SWAMP - - BEACH - - LAKE - - SEABED - - MOUNTAIN + - ABYSS + - ANCIENT_RUINS - BADLANDS + - BEACH - CAVE + - CONSTRUCTION_SITE - DESERT - - ICE_CAVE - - MEADOW - - POWER_PLANT - - VOLCANO - - GRAVEYARD - DOJO - FACTORY - - RUINS - - WASTELAND - - ABYSS - - SPACE - - CONSTRUCTION_SITE - - JUNGLE - FAIRY_CAVE - - TEMPLE + - FOREST + - GRASSY_FIELDS + - GRAVEYARD + - ICE_CAVE + - ISLAND + - JUNGLE + - LABORATORY + - LAKE + - MEADOW + - METROPOLIS + - MOUNTAIN + - PLAINS + - POWER_PLANT + - RUINS + - SEA + - SEABED - SLUM - SNOWY_FOREST - - ISLAND - - LABORATORY + - SPACE + - SWAMP + - TALL_GRASS + - TEMPLE + - VOLCANO + - WASTELAND + - TOWN - END - OTHER (please specify) validations: @@ -120,8 +121,8 @@ body: id: biome-other attributes: label: Biome - Other. Please Specify - description: If you chose `Other` on the `Biome` please specify it here - placeholder: e.g. "I would like to only trigger at Graveyard at night!" + description: If `Other`, please specify here. Avoid adding more than 2-3 specific biomes. + placeholder: Good examples - "HUMAN + Volcano" (Group + Biome), or "Sea + Volcano" (Two Biomes).\nBad examples - "Forest" + "Jungle" + "Tall Grass" + "Sea" (Too many specific biomes). validations: required: false - type: markdown # SEPARATOR @@ -135,14 +136,18 @@ body: description: A maximum of four options can be displayed at a time placeholder: Remember that only up to four options can be displayed at a time value: | - - [ ] OPTION-1 Label - - _OPTION-1 description._ - - [ ] OPTION-2 Label - - _OPTION-2 description._ - - [ ] OPTION-3 Label - - _OPTION-3 description._ - - [ ] OPTION-4 Label - - _OPTION-4 description._ + - Option-1 Label + - Option-1 description. + - Option 1 outcome. + - Option-2 Label + - Option-2 description. + - Option 2 outcome. + - Option-3 Label + - Option-3 description. + - Option 3 outcome. + - Option-4 Label + - Option-4 description. + - Option 4 outcome. validations: required: true - type: markdown # SEPARATOR @@ -153,8 +158,8 @@ body: id: design-notes attributes: label: Explanation/Notes on Design - description: Explain why you think this design is right and what this Event brings to the table - placeholder: e.g. "We need more simple Events that mix slightly higher stakes with slightly better rewards" + description: Explain why you think this design is right and what this M.E. brings to the table + placeholder: e.g. "We need more simple M.E.s that mix slightly higher stakes with slightly better rewards" validations: required: true - type: markdown # SEPARATOR @@ -165,8 +170,8 @@ body: id: artist-notes attributes: label: Notes to Artists - description: Does your Event need custom spriting? If so, please detail them here (reference screenshots are helpful) - placeholder: Ie. "We currently don't have a Cynthia sprite while dressed in a Garchomp costume. RAWR! This is highly needed for my Event!" + description: Does your M.E. need custom spriting? If so, please detail them here (reference screenshots are helpful) + placeholder: Ie. "We currently don't have a Cynthia sprite while dressed in a Garchomp costume. RAWR! This is highly needed for my M.E.!" validations: required: false - type: markdown # SEPARATOR From 6fe16ff0badd8fe40afb631857144874ebe2b2f2 Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Thu, 15 Aug 2024 12:47:50 -0400 Subject: [PATCH 242/270] Add Weird Dream encounter and slight reworks to Berries Abound/Fight or Flight --- .../bgm/mystery_encounter_weird_dream.mp3 | Bin 0 -> 5587662 bytes public/images/items.json | 7443 +++++++++-------- public/images/items.png | Bin 57028 -> 56766 bytes public/images/items/old_gateau.png | Bin 0 -> 240 bytes public/images/mystery-encounters/buoy.png | Bin 1721 -> 1705 bytes .../images/mystery-encounters/girawitch.json | 41 + .../images/mystery-encounters/girawitch.png | Bin 0 -> 1021 bytes .../mystery-encounters/starry_background.png | Bin 0 -> 10232 bytes .../encounters/berries-abound-encounter.ts | 116 +- .../encounters/fight-or-flight-encounter.ts | 68 +- .../encounters/weird-dream-encounter.ts | 541 ++ .../mystery-encounters/mystery-encounters.ts | 5 +- .../utils/encounter-pokemon-utils.ts | 23 + .../encounter-transformation-sequence.ts | 330 + src/enums/mystery-encounter-type.ts | 3 +- src/locales/en/modifier-type.ts | 5 + src/locales/en/mystery-encounter.ts | 4 +- .../berries-abound-dialogue.ts | 21 +- .../fight-or-flight-dialogue.ts | 11 +- .../weird-dream-dialogue.ts | 29 + src/modifier/modifier-type.ts | 67 +- src/modifier/modifier.ts | 60 +- src/system/game-data.ts | 35 +- .../berries-abound-encounter.test.ts | 82 +- .../fight-or-flight-encounter.test.ts | 96 +- .../encounters/weird-dream-encounter.test.ts | 219 + src/test/utils/mocks/mockTextureManager.ts | 8 + .../mocks/mocksContainer/mockContainer.ts | 4 + .../utils/mocks/mocksContainer/mockVideo.ts | 26 + src/ui/mystery-encounter-ui-handler.ts | 20 +- 30 files changed, 5252 insertions(+), 4005 deletions(-) create mode 100644 public/audio/bgm/mystery_encounter_weird_dream.mp3 create mode 100644 public/images/items/old_gateau.png create mode 100644 public/images/mystery-encounters/girawitch.json create mode 100644 public/images/mystery-encounters/girawitch.png create mode 100644 public/images/mystery-encounters/starry_background.png create mode 100644 src/data/mystery-encounters/encounters/weird-dream-encounter.ts create mode 100644 src/data/mystery-encounters/utils/encounter-transformation-sequence.ts create mode 100644 src/locales/en/mystery-encounters/weird-dream-dialogue.ts create mode 100644 src/test/mystery-encounter/encounters/weird-dream-encounter.test.ts create mode 100644 src/test/utils/mocks/mocksContainer/mockVideo.ts diff --git a/public/audio/bgm/mystery_encounter_weird_dream.mp3 b/public/audio/bgm/mystery_encounter_weird_dream.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..a630fe549db8d7654514ff0ffc8efd203d9529c2 GIT binary patch literal 5587662 zcmdqIWmjBH@GrUt9bh211<2s;9wc~hm!QGj9TLLe?(XgqJOqNfy9R};SKCUzzcPVP?Z3KlkQ9(EQ`x&Mhfvf7wg z|0lJ1A$9-DU~S{-1XVJzFgMW@SCn`uE&u>P@Ml%P39thW0f(2TBLD@I03W~&a0e^^ z*OwR+kODkj_*O6UfAY649BIHCa0cvOXxINq<@UmJ0xVy?HC{^kFAoEt@*=Z&$z}7B z$K)mLe=?{4Darh$Y}Xf_*-KhRKvP#*{iP|$FM*4LLr_ynUGo1XB~_GPNbHyJ-o(KI zs^R3}XzuQ6VrHkQE~)UsMSTf;yzHDjobbnZ^B3a(6CZ3GtzHtm{Kj-!fR=bLfQXEW z4#C2~BP4lE0i~j)XJX~x<`sA=@=iiZR$fU(T~kNT(Adnv+Sb9z#of#I^Ou02knqTu z_{8M2jO^U};?jz$+PcP;*7nYxzQN(KiRrn;<)7=DJ9`I5r{|Y9clVD^FZHP^iYrNT zvvG28AbtPe?c;^gAc!depw0i<;qc&~`o9JLzkR|VyQTi;<@`ec0Q}Mm7x@4Pk`P7R z+5!XRa+&j!PJ@Whq$MF6chqQ%%a$R^61og6k} zM=a7W#mSC{k5ec;hpDj7Rj@yA77QFN>(H`}iP7 z`R<3_Zk5j1UF55wf?_L!%u}C70w&E6jd_n1Z!q$(l8jhn^la*c!riG}{Fsk|i06Rl zW$C>5z51Vk`Lwm{Zz&2hzpgBQbY=WW{TmZqMw_-CTKA9bR(WnKaXqcN6Py0$5Q|%t zxW?n-8#v5n)W$VOX^{xv5ZA-g6tzKw2Swzs7ELjPvjD+u0tUD~s>Ig#2pKG~L6(g0o>64Yxj3$oN z?byt{4{~W`(O-YcV4WmTX*!$>4v5NnaJZSkQ5q{#uue0`VZ_m#W+R$mOFB6A;I9$N zcOG85vT&HnlQ$5~Na#nqZJShQ^Y`hdPJ-uvTC=M9R$k*4sMkjzmocja1_kb0@{#gt zV)4I?cP2~-!@z$<41b(9zlDM0LR6mZz=17eM{mXlpmZi1a(_Eup!9khe~M`UxC}wb zY$(T2{JyU#d=ye2820{^CghFIK`Ln-;JGOq@p)#^dq7=L6}u;+dw7#FSzLV6B_Rzb zU92*a7#bDHq(-QLY^;IDOc}B2Pr?|D+kTI3fYJIOSD=`eYhIIRo~~;MX&HYz zi*Opkt9|F^s-zo0dgAhBz=+soFu8ZF(u&hnIChtH*@t;%Aj87S)0dZTofQkz%pa(s zopO94A&w-HW}wJAH~+=TPTSY4&LYCGw5+q`tBmd>KSzzD?x=%i(}^_WiB^@bBh{f) z?VggO(_7n_>S~P^nJkunT*(#}!kurzHa+9VDD~2;{5473DBM1s!=L}RW<0=`&h~}= z<)cOW7Lk33h$I$|kCITVa&4LmiykHdsR!J6&npcyAW}%3R?8`KpdkS{9QI8?3?5xx z?d^=pxhX_9OXoN5x>kNZVQoC;C@5!S<+(G9%iVqK`n_b7qx==F*OvFErukt?KBDVo zup8RQFY#DN_-Lpr*}G{oy^>lU915FSXqu3NtYzauWbv)?rHoK2sZ0@2sH9+X^lBKe z^pJZFgNYc3taV?YG6%R5TAF$>Fa&|x)Cb|oR!9KEHXJrK8(On}pg);3W5?|~K>>&W zqbC=-9%(~1{tU^lhbEi0S&fm;9mmbvCX=_?T0E)o3&o>i^pIzPsBN7Yq#PqCY8;+3MU?>j{b&aSs`Fh?a7-J{vjZ3VLei%apth+^TRt zjcosJ8!MuoSo7VWOLy+)p!RVCAx{a@I%0M2$i15x*`Q*Yn()~iwFL+bKYs@o%LoM-`kJG4B+)Mr7kL3gPeJTK z12hf|Bt*z}H1{Kv%~MCKQCPb^vy>&{VSAl+{#=?MKF+Y1u=?yVkx=sA5Sj$%`4!$T zIW*zn%XEr3oN|`G6OhTG|FFHrZL~J#0zjl#+11i}d`OrKpp#z7j0OihG*le5gZ>Uq z%cJblFI#nCh~F+ER+f*wgJkVDjK&Tt3QC*KRx0dNdG+)K2X!@!EaVnMQr|{MuGp-4 z6|@p^TUM8>xSFguWTab?_pwyGz>KG z7Z`l%8Y1&&-Ai-%C9v~2^jhGW^}1`kVa&tHEVc{I@-5ZF#{MXab+5YN9DdHyo_1Et zCqLNM%R7IczV`7G`w#QL`cIDali`eQ_ieQhX9} zBN`(E=eb;n#6s*%M?bp|ijir){4+`6^U6PFljZA^Eqr95M0!&>k&cfl+3izLL+fu< z~p7dfEQJilc8waD5FwGJnPfe^Y@#S+oPrOf)6qQsz^s`wE0(2s#I>v%@GSz&y@7M)>k z^5F|PM1Y+Kgd)s7+L+FQHK1FPHTs)N`L;HxnZzn_!t_9Uta~0h z%Kq;z(lm?HNf}i63Z%?sHs(CfUvN@zM&s3rlIgFTYz5!8y6G_MWv^*WRAb0n6636V zC<)*F+d^}0!n`gM{A-Kk1Yv`4`fJ&=P20#L{O)oC4*$p7^)dpt^RZE|(b#8NBA5GU zFj4DcAwI{&;zDj;`+~{hg?S0G(wjlpmvARIPq{ZaefHV@35xISAp9}^WfnqyV>)we zFH^3!ujeN$`HAp$O0rhCc}oq8{^p4_8kYi!A}uD-4NYb;*^4q*8rO*4CqB>qr`Pi7 zqzInrrxxsIOwa!1r~g1nXUQMZPP@L+f^hJe9syVkTuw4E?Xy2)?HA$ysAv@mwduV&*3T$$*l=)5 z)|tIN&8*)@;1=L8$$C}15ac&f$}=y5v-MvCTR5#!aqcP!jc4#~^qitqPSS&01(oT^U8o=a63hljuf#^N$7JIiHJTEp%Z7KqeJ_qh(JNwnV9FRkFT<7a|s^?;OkFg8`4jNbW8D-*_V7VHtU+9d{^ zZkuiUpbxI010+8&_^#KC#^e=mTc|=(4AGuj9+Vqup_f%dhNAJ)J_H#HMY84b*jcD9m;{wN#QY~NDhbDkX^lIncQPR8T23g|$WEeJ z(H>6?{;HcyB(C(HI98{*D@Fd$nsq{HA-&OZx5|U+ZRx=4?PcBma1Eqs)iu(-1aW3e zS*`NoiQrL1* zx=QhwsiO@8F<=t80^-VGD!PNax4|1;k53;jtuaup(P&?cRhhgo7vq1nXB&nzZaRBx z$+j%KUGZeS??o^X_5PIPHS{{PoHwl4zE0ce&(g=3V(dP|ZmKXQ6k&s3>GwCWbGx!2J$Tf^(Z4eVH=OS^7~k9Uj*?6nG> z>>KK4?-^~enpyFa6B%iW6XZyfD{bE^DQV8n&u6>f#RxRU2o%Zl6pacOMlr68vu19s z9Bs3`0J{Ncm`7`a(Rs z$Ac%(JRNqWG8ZIH%s}jbMWgBow#Cmm6?9IN^E&Ip<(3U~BUud(ow<7F`9`&x$e`#x zEE$2`S?HwW&r>Iz&Z6%-y4h_Rq<4QSBQn14J9=AiZ$$^V#S-W7!dC%cnz;D;TtvY* zq`^1&coxcc=SnKFR2Ze(f^|=%-V13$p!1Ph$_lP59qi&6BUd&j6^ z7oWp>hNuLMx-L#mA8D`%-K-D;21ZPEvvcuA&g+c5_rD6O9$Q&mcK57bQVk@o-X^!* z{uu}hd#<~v$FsD$Gp21_C# zAmDpL$nxkA>8HV9t$wTaUrW9-#D8#powNr30`hP1u|v!W-WcAs8&8;W!;tAOL77-- zy|V?!3?~DW17f))dDXuIN<;dp(Xg$3$wH};&}-X`>0Nu&h@;~Y64Js;g3&d=V8#Y2 zzaUe$V{BYbf?;e^=(_|wnf8;TKj8V(@XJr0D(u$b0RVb;IzL`!R0CBP3t;FvJEmKjk0ZKT{@UE`@k zE~LQrR;O9tuEF<|*r2UGgs(sa1>J1s(Vo}0 zu3G+`4PBY)LX^rWhm$Q%w#+M&Gm^({@660 zo22zJnvNgsR}HJ?IZv-_K4G1yY(1q^B&pQ8yHa}Ldo!9O;qgBizLgtV?V)1 zzl#r%M-4H(nL*qVZ)4uAWt8b#ZW`z4T6XSxFP7r*uz z!Uwiz7Z$!bEXFk)DKr|MQfjlNd0(1C`Kz;XFWn#NU3`tOYF=r_i7+cYbpGP!IM8(0 zP$MQxKReEy{InP|JDywXFgWot^Qij2ye|9-0H{IW_jdpS%73F zD>J8#!55$6t^IMmg^Wt)-a*V`JB_F1tXB2KTa1Tiy*YVGwkDFcMeAQbrxMLmGa{m? zm_%RUEd8xcn<_5u+UX{$|4S7w@IwJ-b%ckJ?}A{V;+(fX$k1fPb}-~`zL*Ung;WhmWvni_{|!Ox zRox%MX`6U`p$N92Ls!1otdC*D!O~tCppjt^0=9}o;FdUa*#R3mYyc&~OGd)OjS9ic zh7ci5AfN`D1v|`wi+p3s17~KV*#?Rd5!~I1Y@x1v^QPSZ832y^7a@|U-Y%zS1_09;+pX!RMxKBb>eh=;^SHex{U$^{yR=s0?^<3jJCHb-3N!S<9h^gZ4+#m?DJ1CfL+Tt= z^O>5Gext1%l&9};EVN6JadY2Cj@SIq9x|$W{nRQck%6@`HHaehnZ}Of3Hv-WEEiIz z85%`WUzEVsl>G5+a-cD}Bx*L#<@-PuZ{vjC@N_oS`DD5%&WOz=+7Q9ts=ujAufA%{ z27PzIxZ1yJf$M9C@|_8PH@xDj$khuoW@2HIt$Y1o#{ff7g^u{0dJd$?W}Es#7Uvi3 zl@VBWXLwJ+rC*H#xaNnJ=e3JPTujC5F?IO<7zoCa&y%2W!oC zWoXN!F;9f=q@dH&R+bLi`LVVIaHG`KYE}#ut?WmCiMO{>ue)5Dh-G*ulaX%b`0y4( zd4$AHeR-#8c8qwpyH|6D#126+lK5I0Q?in%(d1_3h)Kr2UACmg|J|Qkf1+xCfa+_8 zn#RWmSz`e4S=TOBZL>Ylhj21-VXu?%Q@06r_rJ z5tsezPX~0&`TpL8R|ZX^{SadFVfn99sRkXD^*kg|qQz`JCdB!iN{;XF1!u~Yrob)& z*8r+C?d)o#dOhNsuoxNLWF#xq&w^+Q<-efBq z)iQ1vP0W~Qgj;;BP7IkVYQD1kA$H&a<24r&P=H;DVaoYpOuNmW0Ay0rNjoPgSyL)K zOko?h4;gtPH65HZ+QKx4)pWNx{8;tH0or??bBo3lGhuy}s(&M~Euu!>RD9dlA`CU3 zI{j_C#?26;I%dJae2VUAj-@5k&UZGHR}d6|&n97pfR$%SSq?=TWkZp7LJWpt+zcD< zO(51ST}BAow_&;%((4xY>S~HE7CI_o?})Kgo&4b~*Vm2YJ^V(8{w0@zWGg7AyuFdd zwUn&Xio`Fj-cgdq*+xPjlt%*!j(N#SIAK)k+YKiN^hMW+W%b$XlfB`~ED|F@`&c+k zso9dH5$}U&W|llJ&5u;3+Je^d=8cZoG-qPpzp^Xq1Rp7mW?jtBj=SIGbP^8`smp(3 zIL_mVZ?@GeY%@&TbZ09mWs?@J$U(C{y!o3OS24wPa1~Huq^(W{03=f<)~M~_UU<5T ziN)h|nQGGdq82(JZ0A#cZwoUp`ndx}JC)m4JXX%)`p#dUCgjCRXyoxsH6AA$%`yk; z-%RK4+X2;{=g;tnJ0|GBevynssX}O$d-A}NSo-!3YN;zLu!wh1#ZT;r7LKI~1kdZa<9i!nc~PwrvMGoF?wfdYaBVYBU+dv`Ezv za)c4X*$o1&=EhMPg$sg$dNNFVdlfU3#ky~_Z6YX=1|c|au3A8~YhYD%dd(qGp(m%+ z4X6s*`?R9ll8>MK(#wFSHXjFGX;^jYite^70AV`#eVFjNUGu+n!fzPTwCRkU9J#N= zE=i@iOc;?|k@QL3!sbOBJ;No*t_7(rR9qTHqkoeqC!I7WoQ@qAFIe2yD}{)AJ8dey z(|rmw1ofbII>wKps6yKH51A9731h3=_4@AT+XLA>lv2hlnf{W94`c$<(H;Mc9w;4m z&s^}_na-?3aQNNAA1HO)yad9P_Y5Z~t%F}A;VB#MZ`i&siQv`he?JtEHoTFXVg5d} zMXA&Irw=b&=8Z%;2z8DZN=g=!kGE{i@et|R_xOHXaD5YjlvHA2->KaH&%aT%)bMq8 zu`A0bvy)Q(88{oi8UT|{yaK~TyFP0|9KTH!w#{};vA!ni-Ef}rGAdCfS#;U({P@h( zo-5T(I2&CiKLl?-=N%s-(xqK>7~A!KSK?L~x~^6D{yip{2$K|rO9}y`9yF{}A-X7d z*#(C`q&YpW-Y3^ULFJ|+C1(;WpIa1ZF8)c#BNx!2qiM6${Ql2t;1Y%uVK(*2o}5WN zl+ntD$_LwpQSy|=-6oWTwjwy@rXds3-Fmwlab(UY=83r!&TJZUTJE|vFEB&r?{ycD z>cx2YNpL-oVf^z|b;cKp)z>1281zz;5*p@g-BZ}u94z@^U>8el9v|K7pWN&8YTs5) zZ{t6iQII>lQcHL}Ihm)3jXI1+2S(gNkQzsoc=PNvJ@teHSc1p+A2^Vr6q!s3tfG!n=2Hf$>~!9)?+m&P=E-~=HkasZ zn0RNkky>P0W@Us%#GICt4MI>At1zaaYq;#kFB;7@!|i_?aOCtd(XA`0JgXT84Ln;1 zkpzf!2jS-`^MwtfaZX{+dzuD}KR9nCVREYzONO zX+*H;+u(G?c|y`RhShtVc`fP>k^(XnJFN1gWzkF0TEj4l$pq#E{B%-AjvE&X_@z@nPNCI;XeApN&D0kr#WArpKdFJHAMOQpC#oh5gcnaX0j-y?glwb5RX(9 zsbUH^x$aV3J0h}>DL4WbpGG#-x>{RTTRT!kDY;okIyfsLQ#9-JXMJ>wdaQz(YjmZc zl7EK2|GU;cPhR+o8ZFp=x(Qy_WdLB30NP)^i9+Gf%22F*?@BRa4}cT;VZg(I3XffX zmjOu_yr{QTCmsasC61Jh>SsHuCgZFLwJFm69lMP)US7N&&4u$PP91Qsd7>qiAP_N)y4Os+u#+@35~uR8JEyTdgdUM9?;zeC z9AR5t4*?^n4HnAM@_iB~PEbo^l}ktd8Pnz%UAs={Okx^Qz{P#;?N_E|Zpa8xVHCEWU`_k%QTzt0gL5N&(9SXT zwiuQ7kNrRHMRXT2m4#O2U?YOct!LUuT;dXQ1qZ=A6< zg+qcPHigYXh8tB9@N+~7qU(#ltQBsnZC1k1F2{@?2oW>tbx&n3t(xtfHuJ-z|6EVg zOBrlj2sI0(Kh2c{8@uArs%m*wV6g1-(3{37!F-c6wj*nA2vJ*4;{! zTG`#*s1(`5@k}T=f~t9l4QH`+GgY#Fp?zw#?6JGvM-lD`6Q?YtFB$gxMeQu5ykrB~ zR(fv<^wbN5D`zW}7>%^v`=~9K$DS^iGm*9WC4XiwEv>>25o2cB>04)7soF9t3thlE0#pH?t+w6uJ=oFQ!(NC;niu+_w zJT?Oqh$3+ibx$VRv>&movWM7KCke2`l@^?Z2zDCmsqXACWcYb?c*%0f&OEFa*-8HK z?x+;f-dT{;WC(uyRTYcWYR(cZi#6c6;Q`ZF*7V_oXJkNh=^SP^0xSdY_h+&D zF1*Q@GI+2!cw7lkBSE}DH~<4#+=&#+tBhcdH&uV5;-i7&1^w0+Cpk-_IlwH`nDJ4%WC?6H~jceso`xfY?`%DfbkHe=kI z$~aBt(b~SqUCC@kxuZy7164EG7f(bOvgnj4ps3cMdSSA%2M^J=>}ROwTO+qmXncZO z62zv=WY{V8WdFG1AN`ZEE}l+|kbxWCUt*++=56Q!8g6bySgihUf%ON5NFa_~lZ^J|6oD+`gd@PETUtt;~2@IMPBagy{B6p4kc%>kf&A}W4sN2S{c zKqRIWcY=>GvQ*)>IZmq2+W-W~08A7`nzawpWejuQF~ACy0tUyEi^1!HuZY(!>TObL zZk&Xcwps<7g@2~I6tJ**;xphx8HWQ@nMk$9*0cuw*q#9tEC>v*kO_703DJ@csgxpN=T>F8~<`%y{IC5EXW;j@9qh+uvhkZzd*-6AA2K`v4EAP!*c zmlENK8eYrybhpw82l!_1DVjhk7;GZ4KR5+C?gNZG#49o-G4F9n87q~ZmgBOmp*^3cCNJz%Rf+PBw ziXq0=v08$9Vh6Wm4Wr3PfgcNbPqoe%j z?l=T)0(LZ3@2|=iGX^{zE~b|1Rr-oa%SSThKO^Qc$#%bMR>g(hD!4X7ZRnJ>5%34~ z4Pv$AevJ3lqh-EaCR#sSn(An;dpKqJZm)c8scD=2)jIwGZ@+2a^!W7i(dy%5MHkUg z>MxJe7q1S(Cnx>e7SZM(PD=tU&we$T|E%5|{c89;ySmY0^KuX)bpS&WVHiDD zA(KrGIrOs$DkC;*r*8fRW6}C}bX#L}{LeoFW$}*u0}O}53UDSpK9)k{MnDP5 z(D=SV86%p`Fq0g^_&pF*nqaHODOMn-9?JxwBvaIiB5+RU@ynj%JxIArYG;@=*nXn1 zao6NQNw5wF~p>NGLrYZNrvg6 z{e|bS-g>UlwYZfrJfBM~gqu1cQ^I~K=izm?#x01cHfm*|={~n$W2d20(wjQK`#o!Z zv2wM_vYB_)P{TIsWXrDgnnJr-d$P)K%zG0y}^AZCmW21dt#gHpYI@+-UQo)H=qUoT7&FKt0>OO|R2UF>nPLt;^zqITo~0oMIuh7?}OQGylC2Oe;Hl{m$fIXJ0y zWR!MgjS-qT#|Pawz}V1kTrrKv)R&8cT^3=yj#T5fyFwox#q3g!(U;7))(0xBf)buwr-U=I+zo+7i%tpm zRKJN9UpJrFL{!8O@1OXPHSRh1W5kd^QSANrAWz*S$AyGi#*uhNa5(WKKk+kXdZi$7 zH+!a|d1k&cu^yQCA~={rhPh&pCyY)lA(RoYv`#36gvl@=mLQ@=R?`JTixBWE!LSg_eM>vQpS`;G)1q@J&wdWcebM=g)pdkld8n+@L1d8*0 zK|mN0zoEwiVm=En%90@bFsMEeKrxO~{n)V7=6pYlP`8f|V6C7QkWUE$|9Wa@^}!W~ zX@J93yX~3*EL|8B=FF8H=bOxc$f|4!^voXyz5<;(bg4_XNZ;UyM6|?|yK~T>ks=bT zg34d_*ZFUvp^2g50U!rKyHfqm?RQbPu_HQ#c!OdtP_$cR&?Xu`dD#gmK#YXiH`=@W zA+neH2hvPo?Q3?uNIob?kNYpB2kAbh;Ig=ua-0%!9}6%xli0LR&X(})?*OH{s(oBX zNyytcx-GYj|LJG=^Fq=`L9;k!MW$mT?V}HV{|^`b%yrbpyvVe^$lTp)q+`>oX|3_% z@1bojlUm#jeNlxG&)*q{94T*6xn(LsOV#60kZ|eZV^A0a2KhTJDS|>@4_a{|mQn_y z!emQ-ZkU7`9Mbl^70Y&C{7xkSXul4*YS zMN3CRwb{eO#g^L2L>}EXNHGLkcIA-PJ)x2MlNKE&xdy-5{H>Zal4i!Lb@5@2&t7Su z9^JmXLALs&LImU5-^zw(OFso(@rlev+O(LF7Jv92f_?X2(PK8ESubw*v-1L8dGf@E z8JXZ)d=6&>Lf`j65}uw7>Mg3#NOv@6Hr6s&bPn4dvkYj7mSsaEbp6pFv6^vwVw^jo zSCCk7$`&y7_ckn8sB#X=fTWhYKt^x3B(&s_j1~weIR-q{%b6IyEot0Os3qLEEC<9w z(xD3XPcm}`=EzZ9I0MV+HCGv&p#1(P)(C8-_@Ki@ocYvV=yJ7i=~so)f8TA{)^sOb z!j)bdq-spd(7*Z8NVvuMy7EX_Y+@*p=_YaMOdO&cYa#OPO+bk{DYNRXwt@;vM(H>9 zuU`b!heQ(-#=;J+%gVx7-c94%l6>ctqskb$J9nFUx8Egl@b{m#Oi{KeVUxvm z!O7Ng+1cSgd6dk63ZyjB*{Wg_2$KA9K9;rw7xpa;C?8Q2)mxU33dKGBUWp&05@iWf zQ*?sv%sPOGF4Fwiompu{8a?SZX@aZq#R+4n9MQO<{Flm46}8PaU*(9@rz>uz({tVW z=hBkcYQMI#KHQMTL^Cq+TIhYE9NCOW2|jqm!7}~d{l*#$4arjNi<3D}RQ|v|F&&Rv z&#(Jb3NT?-m&5C(kud|VQ#7yOvjJ@VLJP7~-2C5k**0&w)$$oJz{Y(c-Nd~rPdA9p zOag)@b1C#0HpavgLB*EzP3F~^V}=HAW=fim{d~&ms+AihG&U9lBT6>L+YSC1nBV?Q zX|_8yc+}rtY?)jtv*Y{MwCLc}Y{%U^n0ubNSK3i~TiTdp=U}m~g#|0d$Ar{KRuWzL-Ev}4v%q85S|YFtIow(fpIX05pV`Pu>} z0ykZD4l%rAq{nKjBqzmoU+f2d6R8f9#4Y?}f63L>2 zTBMK~ht>XIAS`OfvuDKN=<_PiE8kyi%%U#HXUmA&nWe{T4oWKJ8+eWFOx$zQxzehZ z)MKoSi!nb=jYj^*te?W~vAO}68NxRg05vZdsVC*DwewE;qBR;YBb5yNrHmY%PNHWi zvV|G%e83=!V-4OFYj6rhL2LA{8jkPx{2**|kX`xT9_0y!?CUl@SIsWq5+>MXUHT1= zV1~C=xN)m6W6z_h62gQ{@};E%JJ1GUqrGF|?=XjNNf*3ewF`c$RqnaYQsIuSkg6XH zMiS##|GH4b94xCeNRFS5&tQx#gd|abjci(x4pnttjyIiQOQ;K{AZBEPPWS42X8fD) z)L}RHR%j4~?MKb)Su9Dz=k-=NI$M>8b8@-b{2YVM`yyW?#fsnGDuG*g`r{M=t=gZl z`ztP+n1AO7un}CH8}F*%ZZ15Pjc(`Y&8x3F_bEQr8=nFc=JZ=UWcf?B)(bQIeXg8@ zMl`-7IL3&^J^Fplfxol(3V-+~J-X;U&CNhVoXDliGO%UL0qGV)SONzWa>#K2&J3QU zYPkR`KhqBreIUFP9RcGNRJJ-YHd9cJUGak}=~w1tMvW1EmIbf+z1K#*)TurBJS^lH zo#c6eLl`_Qo?Cv`L8D)ddiu^N?CdTcf`RypTF>(Gx0LA=v{(yCsC^5Ue3s-CEG6ff z^(&JherJFCUk+G=;t|Ryu`E?_90Rd~Uz*H?qg=j#AvBZnlyx(8^Tcwj)Ft!4Y5NuA zP%Z|%d=#8kIeN)RDM(7O$|Hg|5e_7S(iK6a-J9B`ySBz)HYpTsD+Uk;F}fUoprb22 zZo4|UH&i!Mp_$N7pR7oCoq)xZ+~VRys=UhMt@D3-l#Lfna95g(WA*NI^l@_uY^Ug$ z;jjI%v|Za|<WWWyg`1_@hp_bQWTLzJq{}!4bN@y||gw@qhf}7OlopG=0aZ@?*4z3);Y;uQ=D!?kWsquY^ zC-2mTO)1tYRq5v-zjq2m*GYEtHI{fybCImT&V}FW*p~AYpHYf_1ijrJ^^K~EvY`uE z>^n;0S}iV-qAb zj8O3BHnl>si>AvIu{YIr+|{)s+MeHkG1ZXHJ$@BbR6`kMg))m2orKF*x}L>h0JCQS zXK{PCMu1zzh*0sP z*$i3RHM*EQ%|`9oAN;;#bJ0oqqjv3$Z!_+*^Hb-VDohom!S-kkOSm7Am3F=WJ4>#K zQT1fwUZhCIxLzPz9uRuk1lB<`5!>bybyE)|#_h+xfy+$let66N7|GJ&saATGgd7}3 z(Uu?Vn*7&KMCuy2HnhWv;nMiZvp*+iN;@~*mmkXDj!b~BklD?I35>xPmR`E>7BI$x zSKAAWbEI&}j>HqIV)Y|S#vjYFuS$^3GvI*PG?3EN!^OuS)8)sK>RD&=N`|h3`KmCP zMdPmatb3<(JV-pHaFOPRTd1r6Tn)#7;^1U@c%ane@PCp`rKThq^$Lr~Wgjb&4kxfaq2J38 z5^gS3YNPXLLca-y7^25}Z z1^m6@9cE-qOyFnR+grp7h+sOJ~>pGGX;kqmL2$8!k_a{764)Z=bPsp z9kwlp$@ou6V+JI$vXA>H7`45RAPLEWYuyiu2pD#WVB|wf8fOs3=O#{DI5aR|oHCI=gX1{HVMGo~+R|89`J#!vNm9Dz23Y2@@r z%%6@nPgD3dkBf4|yN3rT>LVao=C4KA6=l+0(MWsExfV>IcUsYKCkFq|oYmV&EBFzp5C#F&8ePesxQ&Y8u#zz zKsxF5Mu=Thu0k*T# zzs88ha=2ZmGzk5J*aD*QlhUBP#1ZFwAT+EiU$MPN~TOmLMoo&4~FRq$AxzxQQ;Um9%Hgij)?0!|3 zw>?|q#2Utl(|T8dG+5%JofIa$44Lu}4P~h~`d}Q!7AT*gK-GMY1hEGJ6nu;m*&{Ka zJB*r`2<(b|J}H!Aiyf*~<1$=tWc)%*WRYq%Lwb40tydB&7SCP8OZ4f@L8u&=N9L#` zKX3U+#%Psz?4!7$v|9eMsW~~p1gfcQc_#!zs_;APpAseIRUzky`tGdrRsE+yMwHgL zIEAr=^roB;89G^;ZJ+el9fy*re5eS`0W7e|RGg?xT`h z4p%pSMJI@WoTSTTg)PnTMe7PBHJ4`M z_b=;7b(+lmv;WB$sXLY5=~-VA7A=as**$mh;WP*nmEYQ44050GT_AqqBn%)X&Oqx+ zzv3NKQOSIs0Vj5zv^5j!0uttENv0!7pA}&s@hWJyRN$0|&B`NQ0uFMczTNf(3VShVpLY>rj`b28# zCYa`UteQ(n-2s62a_HV1g-o(j_{qAOP6y;o(A)*T8~r+HLYBZltX+}>$_s}221rsS zNl58Js(8Cl< zIE|BM7?B&Q%A|I#Q$`dG-g22IZqM5Gsuv}Wg;>oxB?BlUc@2LR{lDx-JMP zqO>r6c~}-kGR_a+lwm?Jp~46b%?HGJ009h1HK0tq9i_s>s5ELdv)5xBl5_ zP;)kFv}57ti1-y823s;+Z4@D=H_*q*&)ba@TN;IsxylhIMj=u~;K>%I;LFDbW#F3= zO)Ab?^6u+1pD+6QWT$11R=yx(gwIj|C7@_jLy`PhKk+`|5I%1l160>0*>%*hUn2#6 zS-(IhuXlaNi2EcpKJ;2Bf>|AyAuLU`b?^FYty`|EK{I@Jl8><6BaKA>Y9+u##-P9& z%wgU_VH_9L!siVO!>ZXZE=Po})sMm9Vm(lFoBoJbcyZ7YP(nB?D1%dzAeq=s9H0(@ z2ocxaO&*K0KMWzE?jjE0I(rMOwpL!tBkf9V=e*Uy_GTvONhM;bWa~fTG0~HYGTjf< zmPwv3aXmzKttFZ1Nsi_&{5zN&(Cez_G4a1>y2_}ix^O)V0}MTM9SU>#R5S8_)afzwt^g5E>E^>I1a6 zPrNXpV2y`WSH~y-6^h=HOyEhM#bAZHA;xA+>`3L0JJW2%K|o$CilB+sDF^Ot<*P=E z-tlW6sW7D!3&*I)M(xAvn!zswkX=8W>iirNEg z+YVp~0yGAR+LD)rS_$^uHBml?Y|bk*092W8`gP<+l*0tP3>+^MHOKXnW@N!+<~U9X z*-cO>Z&xn$hC_V(=FghRaI9i~5OzJI{Q^{;-3WvQm8W_U99=A;Kqr&jh9V;! zNyefC8g^$;P$Xek0)8dRVPS7p=Ei%;-j_ny6K)=B%i^O3HcB>Nc_mj)4WXoK&6xD- z1i!9WhE+JYUZiO`R26#0_Aivm@AMCq7iw=O!5Z%#-zKI64L)xFQIMDTqJZ@`K6cmS z_G%*vxv^dN_@jA0^Y54W@TIQ5=Q%%`L%Q9%KL?zz1FigJ{;Hr9RidCZ`M3aik{jNP zu`BvWUS6>J|jB>`}+fthQ8K3{tX(Bj>NQTTjN;Ok1vSGuf$P$odWD zB~X3e=GwTCtkzT=eGqf=HoZ@3G5lKmX8!89#XqyuZMBEbfutt9TJF1`gSl12_wTOU zBQE~t%XbnDuAlB9hgX*`R|?0-sabt>iYs+}>f)1<1`3E#Yo7u++Z6y>yyM&xH0rgs zG~0s}gOzTwj#5hofUSY-;JPUZ1n*sHHUCN?^T#d<*i`P-`Pvel5hjF(AIx4k&on_) zouPl9X~A_PP=AmbgPTei8$)oF7nkgtbWLvB?3=NmQ8Tn)uB!IhwCInz_H>AKS!Upa zm)*)BeJOpZu4{5Bzwk@5C>o^4h29fC1dLRGbXHI5$w{J$>0QDRsFAfgeY&0?fVGez z7WqJ!RMc*ATrDJyfyc*{#}?=WguEWqWHoFy=o2K6M$E{(C(U8-0%7C4pc6;SM@!*^ z`anq(>DNM}!I*!<3;yB)Pf$y7tl2{1EC7Y6wqjl=jSaL#o*X4yikReP{X=+k&&VRA z82Es{e2nbA8h+ry0lw}s<))ups$wg0JYZw|eTBRn$?vv69_1O&*`}2~jrbtVH0(q> z={xK#kPpf$8$rmaeAN;{$+0R`qHqtSGynn&w@p~uB|d6F zuC+A&uBD~jBGB_SiF`0Fu2^KSA}_H+&PCzggrJSGz!u;490TRrtS>>gsrY{jBuD=< zL*(6WK-)2%t1N2plR0 zC5AkM#>v=HN?HLzUC`3Ne{o<$c&1|GQ0(U7OX@`U zSl|~Wqq9*E5CSY%CL?5y?87Idur35fJn%VDn|Js1~0Js#rPWU0fInQX$@Qe5j>E*D#BU8uX62jhdW(IDMZRE(F- zjv4j2GA9mWk27(m)HSHMk;taB@|75en6lBVGRxo0C+029Lv;M*;W< zX?>Ekkx3LfzvxAeDQWT!#eCcg3=q)=nmlgU9i9B~yI{`!y%8_ti_i>mGjY!n0VutEdaEAuh zG=Q0xzhD*M(6J#3y1Qh4!G=t;i->0YC-Nn{*sfom^`sLX3pgng+gzTwJY(8_{Cjni zXr(Jb{jA9%sPa2kab%rHd3mLZQSQ3KVCv24N9I?xi{-tq&h6lzpr(kIbgdV8=QW6v4 z)E*0{z`o&~W*7-C{Z`>Zp__`qwVa$xSTQ!6(==n)%A2(VON|%y`IW7#=1~;N)f}$Nd`S4?xBAr#yJECS4{of34tZg5&5q{!0Wz)4pZRC%ROVjOAzmm5%;rfI#%N90s)c>W`|2RO z9w~A)Ev7AwYWEz>NnhcfjS$NzeDy5ENG`ba$aJY%24%N<*@&fBmJRv5GOLIAz8& zaINh++Pi|3_Eu06w(P1puSnqsp}>}#dT*VTZ?BHr8XqkCogGP)K)4z}%Vv#^3fJGu zQzkX?Wlv-6H}4-AvdkQsFnDfQ(?}KA?SGG-mPiNE&yB5L2OD`pus%aOwjBwq$-+AB zRM&A;qz;4eJ2JS{jLosg-0-|^TIM}jJdVn{!&Y`n!hIUO#PFpYm_PuvSgHhz$2Qg| zW4=$e3_LP^!Ewx}Ty*B^F+W8k_4!bTSJ@2zz|9R+oorP|vpEp&y^0Ko9?HMSUiXCc z@JzRwck-s~$9r6j{2GD%95k3exg<8+A*X8a4lDljaiZ%c2j(VU+Yab#K zi^SfZI-?N8Akg_4Lvc#=?f?W-ei1@Xjhqn`OF=5pbCNOg%&yqj2xg9M9V^k%eJG;$ zOnkAB^=)#r3MGq5x7_z)B5K$c;35}I0;V(6Wp5VwrwJPX5VeB(A_t$pU_aZI?5nHc_IV^Ug&?L;!a5+ z*uaTN2@Tx%#JfcNpq#}fxO9-J&$<#sq*TcIu_&crr|uO1eCXWLc^XOzf|nA`VR612 zt5gj(badffiX-th7b9tst@s3L8%PXN{HY6%sDY#4V&joA`p6c*s4}R1T*CC)yWL51 za?}u3*jcOvs3_0pz0PZ$L57Gm+c|L7NS*_<>K97ihnF1S)Rz`cwpd%4!v@hXOgYVt za>HN8KmQ0*oZ=2*CwJOaObMY$d%cKQrw@MV^DdZguo+{75leiM%85|Z?#qeX6xT?i z0zGAf2*1`h=Ln;m4miFY^cM`#5MCsWNGVArGmZz-y0krD>U`(QAP@dy?2cr>UcxEf z*#|iH&Q4t{smf=FA!hjuvR{xHHz_fnTF;HyFLDTEQBcsVQ@G~S)X<9$pt=o*koFr| zLP7Yz2xf{Y0J$4;dTXNb2c-(m67=2{!is9smYE=l-+@#!nFlS11STWhKUO~T)ikbatWAv`n+){RHuDkVPGm7Lkny6y#?^(Wtqrc5 zl9NmiO_}DivFLkZ#i9_h#%k#i1$F_A-+7-0@YI>^;{J-GSv+$u+FFAE;@CyrK5ihg z(s8wa1*R)Un4=9$B+I{f(eq^=e%!Oo)2AXTr}De{^6~OQA~4=w-b(?Gz=Q_)N<6^{ zkZdd)+51@%jB6)S5chf!9VI0l^~KLW2o6(7nj=d*$i!4uN}|FqdR}QS z6rp8MmS_d_7#NMu7AO+Rv$J>08?tU)61Klr#(Y@8jyHwnhCiW|is^#4N?vRF+9YZk zvt=?~>;1DlL6mVjP(!!XCT?>((P8YG3UICGgJ5VXCJ(t{0}Mv8j0z!)dIFW;*xu`3 z_qEGnh*q^}{9=6<>f403%98RkOz`c|L&Ag?zKbr|KT}-=fY7AWU4#@*#4&`oCF$EK zm>h&_oPr&@!3TeT#^txQPV-^Nh{oaxO{VNLYDi=Qkt@2Bfhloor*o@`=Nh zEajBHKA;8X+kF{vkfOJq@0AvP@ZSRh7$|h?K0mYoMe_7)3EyQ20^dktbToe?Eig=oWqBr?yT;Xfpo7B-5Ovn<-Gd?b51LObjt9gUT>8qL5FiZJ;B%Wh2b6fc?Z<8Io=af>)i}c|Ilk zQY|~Cm=sXn=k!Ee)nFs{h)o6|1;(wt4f=Obl&LHq<|)f47WBP=I3d`04Q_LiVG1e}|eb@D}Gd3?*fZT*k{9#01SXR7A_P?+-UDF@#Mcfm1Ite%9h zTScm-#G7><^{@-kpv!L6%HW)9dwFrLomTe4%lWU_cXxw}zz@cY?As15vvP`?omdv7 zw^cJ6DSO|i-|_|BoQwQCC8Sh|eO%kV>ouuel=FHTvgZjEdVkiT$l2`Y74qfhS$k*^ z&qLi>m+`l85 zJ@vN&#{b-s0RSlc*kgDAQmphCQ*!F(T8wX|B)T_SWTwC*fk5f+ z$sh*E=;&!$MfWjI< zC2`vg!8DC$K??B#db}m#wCx{dGVETqN`4c)IO0j};y;-zo`@lH&b|2%6g1nN`R0GK zDCEQ76Kmav$EWSTb@O=E_#l}V)&K#Zt%VX+P=cxyInbgIsD{>{tnns|2>HMqXbe=tc;cDhags#S;?Goz zm2tLkRq-KHU#a7OG*i`>IN1QHp#ygxt5HxH<8;J(U0iZ%G0yhvVDgtQgFlezPM~8d zO+{Ny6@%T6yJ{UMP>i6FzW>K~;ocsYnz(2*AAX+&Vs<42H@uNNT1p1-n^M5kr6 zD?(MU7m}rZkryEX$N)$x+P0OEW0j6z;jt4#NM<&iX_(*r0 z%_E~GiF`mFL67%+?friR=qGXfohkeFW1-s2i)Zlvx$2NNyc3xz zxBQ(0GOy!RTR^8a2;e^~-Z}zTCQ?1n&k`{QxmBBL2C!)p=-k$%pnTwRkpLD+KIM__ zU-`$Q-qessN1cAh1UrJ_)%Q!1h_ESootuMaSt95AV3JZQ{cen5AdS%U%!v?nDIp<+ z94lT3v_X(f=mV~0D_SrySD_RBS1s_f(3=fPtym*m7r z^m3TS$UmOla8OCjt)(>Fi&}k?QeMl3?G)4e_SNqP3dxb6VU=s0Oe;=!jJla|0M4VGR zcg7&{L|fYjM{7tpLn@&k z@Wbl|lbF!3Z+(WusQxrFi#l9K`J=lqN)Vs|MiAC`&v3xI9fZ7Y6T5gbc+gc;??>Va z00ZOfv~~*epHeaG&I_C=0W$T=cwbF_CRM1XF*j%_dPU>Oq)x4R zh+?PIbe*%?RMk4p`HaLg>pJyxy%Vf; ziJUVZUapN?4ZHpAwo>ncyzXhbp8sfp47ppG`Dl@Aba`sL_NS#c)Xc`>>&jze&uL=L zN$+2e1I}8HN0*pW(v}Y|XzJ&s)59s1Di%GLT)sT8i&>+iQVCh{7&NW444|*6+k#LT zVv-jc6pxb2MPDq}*o}U%V6QUPh*|tyj(oy|OoXLK=VzMcQW2AY+C6RW^xDz$q~^-v&$hp+QO8CDnp$|C z2rFZxW)g@VOO_|znS6tMAydYO5MMyMNrK;-ytJ#-ID_%EEHe@L3XKY8jx@$z#^HCut2}+e)QE zg2_ICM99FQp=b9Iv$WVGg%Ry~c7s;Z2w6H`r5B-#*d$c8UxitQoNe9=B&elM$KVh! zkLXs%Kf~hUR>=2Z)}x$sa%@S!lP&4y?Kgm|j4bK;p{g(+pW()zXD7VA&2OOQ%}Abi z_?95?6vsF`1|gLnQEHJtpa4W49Mk>&R+%^fV5(P9w;BLtP&VCw%7&7RPZYD z{HgV1T3Wx+a{V-<->QK;eR?fYrwpAx5?`!;Ek^c>q=Q&5hO)Dl$-d7_gV3bH%EA83muS; zkMFY@)QafBIR3rDl+(Vs&3V|QM{vh8>qjprIt91Bsc&TP%h=Cx!R7G`Yc^+}ye z=fbHao1f!s+5E2lD%@hGu0*i@s?jk(ay2`Zk4p2oa4F5Klb9eM9>jUBkBHQRdKx_F z$p|xpdd6$mVO}3Ji@|Zq(r7L7kQsA?=6X$CYodQiuWr)dEoDHjZWz7fxcP}{_9=%- znh}p{+g9`U+pH+&zzcL7$;l89_&G-t2on8qJT-Av4Str`*48QO7XS$%+{J+nr3~Z9 zuniCYQrv7BK77Nu^;>2y2ppAIL~ro>!(>O`^%;`u?{VjLpFVcT4vrkhHu5hi$Ma@l zr9Lhj7E8&UC*LEx3joPG%$+K6jHOH+Ke&!|6Y_shs-YmN(&9VjFQNVWygBW-xnQTP zXxUKL59728+M9T9;|%RyXz+or3%WUt9K z&f!VUj~r%a1w*i#FsK%RVX&06Acv`@mTS|j_^H?Mm*2D|lY3SuH{hrU{V4mcPkq(8 zo$>zpvwn$xXUp$j8T|A*!2qvS*WWc9$Rzg5Mz&z3n6cy8ObrguVHErO!09B9a1;%# zWt6B&9ez!^*QQL|CCZoC2V&k^>XWa z&a}(-Fw2)TfEzXK-r8LW& z_w=^0a<5f79+BVbk!8rkg!)r(9nyzR>jzW2U+Zr}g0GQ72a8|+L*ET=lrt<=`07MArT^z_WDYWMWcY$!gG zkEo6avZ>ysl^R!*d?Zm`kFzhLOSz;F*4s{xF^e(9Lew%3>kD#i|4=51;}{x{S%z6k zS3Mt)Vv3OD8I2L}bOdIHpvX(=_IeCirKvFZG-5wjWzM z6*>Rfra57RXI}B9B?uY#<+$yE{fRE{@m8lDbJ6(OzX<8Co}6k;d++ChZ!kqk)*9jt zIs&uGYhuhN7HrH_dVDYtkvVDRp%}K`Qqbm(UK08=t45ez39#buwN!=WNXCOJg`(e~ zamqy(n=5D7N$W%@&I=5sv~j5yD=J=KX@wUo;W5^|C_k(FNCU1axw_1wu3<3`VBJUw zcXeR0Pji(JtsIZZMkUC(R#O?UoPWKJ=Cvh$&P8+>_`e)a5p_T$vg zlucPl9*N&c0O%#vbgD<&^wF^aE_~mk$XAJ$en^&0l6Sy?ij?DKf9s@^WT12deH5sj zV1blv?&);9{HF<92+)dy=AsklA63;mZYybDo#78kKX?eN9G^}hL`>JR20&b;LabG_9mxuddGsQUcvN3eW=T~)}}=sL#~bh;rL z&{a`5p+1dw3(Ik_g3|^EE=gcMrtkN|(v0)zvCB~&<^fwBYYYxa1cH=B4j+!u>Wn3s z4EG0NYD00B7Fga^mVSz1&9E+eb85WzsPvqVz)DV^((I;_b0a~hrv%T9G+V9BLmc-_ zR>YRhu>1LSzQGpF`6FVey^LPByIu#$bno4IfZI^IBLq(+D>U6^|tsKb^CU(zC0ejQX4o| z8sh9qkdUSA*&iunQ>>L2rkgSse|k~QA+H|Hrgp>=a1&b+Y7;-Lgakj2KaM7rrdg?Y z>1o4)x;;bGbKe&(l>Yl5>fj0imuG=1_2qUY&10>?19<%o)d+jdrm=&!$T1m-k^yP8 z*HeoMEbIZ}vaRg`Tl!j7nkNpclSUryrwm#ivl1d>@68>=^>jBf`{du*I4V~m`VrBF z~suv{=ZprEnuOGKM~sEszLARxWK@JJ?+)8Ni4fWkMsM}J^eJ2Faooa zRagCuQWkE3y1h4h9#tVY$28*8DBNM;l#SZollhL@mf@`qO};`cqxZ2wm}5ZNP8d3R$#HQZkJ1)O zj+_P8EJ?5+NIIAf|?EC0qri$%8*t{k@D*;u+`)qCGT3`xey*b%SNmJtcj1fyk? z3K9DECRMaA`>`aW*d1B;?>4Bp$o(+@Fl`XYB}1Jzg90HqBT{b{{oyvKW;Z_IdZ#kbgF6y8trtKhP(!6Fh zvMU%sC**pq+`gsu#PoQ?`RZYo<{XJE1z9~R*drf0Qn2l5F-bGs)z( zaJVBwQX45HM=PG)sBtY>W2Oy)&1XBTXT>gY=!zhN81DI5&VfFdyO^~ppu$jZdbt-9RznMVkXY~ALg2G1=fojJ()n@^i4op>@9!1PiG36^K z7wFHOv4mb#R^QyaPJ}FF#fNY3X-RqGEP?=taeV;o55^0zCyE5)(t6R>hfZs7Oo~TU zjP^nFE^L6Y|C&Mx$bpL}m=|4R{h0M@DzDo5widH+^^3dCB;hKqscTPnfY65EwlAI{N*suXg5|~IW9A@jXuU9yKND;!$(z*< zAVn;ivH`#_geu85NG)r=2i;49a+1BZ+tx5w(h_d*Fb*RWHVzEDJUd4{w3FN=Pgz9V zf=2$Esk&@4<*|C~m{Te7v@LR}+#JI_@37ONovFAcuzxOI7`4v9G7^$tnkii1mt^ zBzM^gG7|6CA5S?Pil1{k+av>J8J!upkY{0qS!Lg$n&i^bAtT~PM`0*v!^!*+6MZre zlaxtXR=a!GxI0n4_FI!}l+n^czoNiH)?etL$O>7=HpPFap3ev%Xs_7n7aY_4!PJrjjh zscB5L*Q$`bwm7M+v5nS%QMj}QXFUmqnAXv9Ui(!O&hJZ;B=9bjVcT6n@bee4U|D@R z;~-LbcdI_f+#SL&^*(s=u8j+M0-AEDsye-UiF0-5-9j`KI_W0z-a>4EwS_eikX5V3 z5`=tA8pH{mz=$A~QV9-aYJWW%Mam@<4IA_cF<+_Ee}-lED;l>130yT0filHb*q?2z zJom_;dlA?g?t-<;&Bmo)o2TP?Qvi{0WJL1^*ExhSC4LzkjvI*^0b`dvCho#|& zYJFT!IKA1fqqO_rnc-3IhugHUzub;h()^f^;LD}I6wz*qbt&G_b#Z+lLNo%V?YExt z!JlNwP{VznLm{T$8h^Y#F;CZ%p8VkYSVdyvBMcW-tbBpI_d))eadSZd7s;lT-kq4( z2&LA1{ig}v0BEre^QTJu{$hn#;u1J~gzXASPjN!UJZeSPuP$9w9IPEX<$LBI2+iyU(m^%;auZ(gSphUTtTTzA)?&aFb=K=2bcUDoQnbQ@@kV2&`Tq9ea2TANr|GF z;f;~Tu=Hdxeq#=id3sq2Se9Z76=Iyy)7y3llZcXyQHJVduj*ZPd6v2Duj}HYgwF#R_BM?-zWYIWy?)pbnMY+ZkDcfC!!Ks!w#!=^LvBkkYMfxGE zN@Tb4cLx77r!lq8Ri>6RPPG$gj16_JZDZjYjq3QGGj2i#LpFO{XoQLQ*IPD%c3G5u(2`}t$CZg>_d3WYT4T%2@ozgnBtP{f?&tZ5PKN?=<)A{(1KO{-NRbvW63nl9nw zm_sA>bxakwe^<6^G;u@+E`VFXEZ6U@2!dgNt&l>vv~wbSiTdx0UxH6Fn1afOq%9+( zN?YqjivL=xcL20e$GKBX_#ZiFhnl4;3855|LQTW;QGLjfZ*Yz3%yH`h*fV_w_oe7` z>vua3C4zl!D$TBiR59}*-oq;EQ`}Xd&+5`A9X1@^4wg_e=&9VY138|K8OM}5?FF0E zT+6quh3Ey0lHx{~tWutAewx%^fm{C=tryjt#AmyuE>|;~>)Rmi{U2>VVm--$Sh&1J zM(&Thu#jfuh?s_GV^A_a6DC^3a+KrhoM~(b(cM19#E3*nz2LY7EV$so9>sq5~fg3tRNs~uC|n}ck1tS z+n%>6(zdT6+!<-Hc+sH|En#cop~m*uXhO2xEqd&_oweVj(Si{pC&1eb0*0#AtXd#9 zjvTALe9R}!QL7-&8HL(t7s~Q{g(kC+DI0ZBQkcbVD!$EIT}kaSr2s=HEEc}N0xPaR zYambb{+a3q0*&8({!|t2F9N-j5aS>sw6jsEfz7jFqaJnr?9%1bv-;HHCM0t*^QG9(LXl*kW@KjJO?Jd{VMezPt%xuZ!7gqruBZ~_5Eqo-A~X%)=`YZ1 zANUc=DN6IBnzZ|8H|dLvS~kb?UGp+CD=Z<>a1h;^GY=02nHh@6207xJaYVmy`m4H> z24k$k?$@W4IXij2-iBPnaDmpsKcX++1c>Awv@x+U27F#`LI5h2C~Mlze-aZfa4!A% z@{AS19$&gqlJSP4srZQMaD0_Ei*{c{)Zp6Jsiy5%ti5asGmGnM{Mk1*cq%HXTrs`d z^w~PqKx(j*DYhh@6$)K=0y>XXUEdtV*F%2;XH9Y%e5v*H$nYEfZhhL+Ld{mXJ5MdX zan?>+9H;t5=8dzIH?eAIj)RY~sx5zAa_HT^mqbu|wPs)Nd2en%8XH~O^!%oLHn;7( z;;@+O>%GnQayG9l=%eeYQ|%qK8gADErpcToKnbU6)uOed;~9gyyyk^1dF;}{eFVFg z7yB#6(Yjx95FGsLrVlPTU%9tltmfS5d7tQKawC?JhayI1Cn!zjT4XQogK)EO-UCpE zc}lp)V{%SSnIz?;om}*)D~g0Ucq4|3xlM`BP3?&1sI-paar-8c(GBP*9COO{q@$x- zcSRw<-O8AMrg{MYwd*Xna8TWe*`MHx(R&c!swjPj&FoyG9=-dyqnfMfrz6E09sgQH zp{dkhM2=XsS;-ZS`U*+_oTsL2KeATLwyMOkLysw>k0!p}+*jSR(jr$Yx}u&8;qe#d z++Fxq8|U+JaU3Z&)v(8+3qU$_{`WM ztW!eVe^WifyvJGCw}^&@+bFaA8;YKrA(?guB!uG^u*00>8Y!);Y?!(*L^7vv`Ljfv zRg5<6$`m(FChhUVm@=*lED7lZXd|Rbu$yR8?NcpXc=w9<^MOF`E!{WbMdLphmdiT% z3FsojnB@T;QqopW*B6$O3s`*+`8u4&$85kLtUzze@AH z+QTER)HF`j-+?_2`f%en6ANwi=4F@#+b(%Z|i)xvK+nDD!)) z!>=-&S@a_>s+1wNFw5a0e!A$!CNGXqoK14CUxrW>Yi~d)8Br(H?3i2;j4m=cpsT>b zcDTHEV34sWmF|o@mU;QutFQl>U$^l&CIMAbt8(vKBmo!-I5rjPBZi)+ew&O~z%)RI zYN~w7bONoGOl%sX%k&itDGz*BJt?1>nV2<7HLUpT6FWm|KCv+P!S|HTG>306$_z?7 zG~C;3w&nX++G}V;L-yU`dN#|vwl?E_l%})w`Nnoy@9gO%?u|VQw=k7K%e}eZH=S!Cmpdh`4Qyjhx69uCQOJ+ABDbas36|6a^j*nRY&|SSA0Ky7|q5_%h znt;iYsD$PTI5BXQtS^8|Yb_5h;M-P9NtYrHAcs}xD0{Yx>n*GO$8LCnNtH0p5iI>yWx!v!p(k!dC3nLy}&F#7=n`NiB zYLsn!&TqcuOdi{bA!h@SE0l-3y=8xc3?C&nJs)iz&c98;zBJ9^&mu2Zs2{BogZ?X< zB9TEoNC}C5h@Agj2`%-H`gvXmN%W4sEP^cD3^h9h0D%53#}c+xaa9n?tj^>(oi!h+ z?>gI3{)N1YG|6D;L{9{M4p#!Pf7S}F?10gA_aFasMtXmA4Q0KZZhh7xxSyp9h|2(G zu}1AB3p^n=aBwh%2A6nMpAj|;xw6FB4i61=3CFnvLk53yslGwPDf;5rhI`)cr}So>>)&~fiB{arbB@L=cV7=^T8PrNLkloucjJxSUx>T_i}kedslo>FT!%wIAbzGHhNsK4+C!s|Yy_pdO>NkhVFD{t&-px>;dhN2?PF+#*Lrk4GyK8i$3>YrI;NX2!YsJl}a zRHCSJ-F+Hhsatvi?EFq6o>$R2n!Y!=m5X^}B2P_Kq+0pz-eR_|ucOi_ z;QVyGcW>M!$iDixmz?HCC`~9k;f90?z=z(qADh!>aN*-v_|6gv(HI^OvcR7Q2mHCqiQrnSGyC1qdbkdIftu$=}9p9|~=ijTsM) zkbGA_vk2Crr9~r%D4-BYGcqMWyYia=0;$D{9IhF-Un}sx2A`ukGi)beDO=^3ro>`O?PixkSc0VQCsKqt0OM7 zj<%rh#{dA8f=od+zcodhq$O&B4UR(ov@hJdlzYF*Y^|hFxsu&{>qt`dmArdxk8;tK zMm_TMILb2QjNj~}?i{)3fJ9#FlKWi1vn%u4T)aNXqo6BQm&o%pOuvczhrs#-09V-R zo_T{2G6yl7BVYuFF@s?H7D7g2$j%Qw2Y@zq+b6fHdcx9ptj2^`Q+eyOQQwrKPakxk z9Jq&-Wq<~xh38Nz!*(2>$l*IECv2$rtiI_YltO|0fJ6fFEC@`KQCe2=-EbHka45nM z?>W$hUa1KvzyocbM-#*+%mPzHLBl{`j3~*8LS_K59m?_1JcV#lDmtX=$dp$Ak4}aN zglomBtI22;Qh_F)0+5~K_0Bh} zhJol~A6+KY6sQB}NSg`mtLaWMgg{&bX4yzY$49gq%oJl=nSDcHrE3zs)qixih{rD_uR{ze1pnV=eYb6?NoD9sU+zflGd_-r4utU zDdXR%S2}L+_nkVDmy9tPua`BD4?5AJlzeP%$j1pOMM}FBK3?aiFVO^|CF#Kz)|;0n zY9NEjro#Z)!9|WmsN}%BA+-SARR038k~2ifre6qV0>QGU!ay9v4QR$G;lp4M6pPSl zM>=|xj1@(NdCQ$EuA&qi94MaKaO5+~eGnmTEow-KW?%X&eq-AGtI4{VY?&VrP8<}W z1ovWAS9fDpu_V!n^ZuV(s1|{g-r@-@7)QO)kPUeX8PiPBq)qVs?BE>3i#G*Wg1%k4 z7jL9(KDPhKThd{(^Jg>bo}T2{tTs!V*lmAjUF&yYbkQ-dT4PXD-saxiOEF`omR^}F zU@_{&i}Xzz^G;KK|=((QBtxEmyS{35X$f$@|Xr` z@J!C1#;=4}=#(3L^t^i&NAHN=)f?^U%62(qc!%viuzhj6H~ZCXd_DYZuaa!=FkB@=mS48H35;jTbE&>0J)gu6=qyK!MpClqHy7FPV3&KSB zOr?DTDD@@RSx}%aYNZVm_WcR%h07aP2?pTUvE%dtWhGHUrBUMgq7$_Hgod$ao&dS8 za31hde~wu}`;xlA=xF#reoJpn)b|k^=whrS)YOuNVMj!i(49%kZ2+t0D#S4;loZ7h zu|ApRtKK)3JVxaKu6(FCKg3 z-M7+)g8Dwlxf;=bOJldnk&MJzdzVWTiN%z>z&9ATWMnfRV+)T;9?aomY>Y;sUL5!$ zf;OZ=6jn?YH~eX+@N6aR2+2$TLpe&8#DZz5ED`QQx+;6{BG0< zKs2|)N6^G16L!n`(di;MHgh^oi#tPGKuA4PJF797M60tVSGGfivTRg0fOu_~kycA~ zXbTk{BhM9s<@-VM#6@-3c0&HSNb@v-T&fa_Nj6*D)O0ex994ny_Y!j>rT95J;or}- zmYx8j1lki^A&YXav|<+g*|n2=^2^s(o@$qQWgnL^@_JAn^ZsdJumy5EbXYlVNwvS$ zvRv9S)#R}YhrgCW`ENP1eB!pjsq!nocbQi#H!l^wps)h0(A;`9i8ENaTy_iQfs(J> zffVXsMg&1zuHCq_e}oK9a0G*+>@vGHos{3#_zDiTprTnow>r zJ#qNwUf-BU(M!#lTcrTwfY3;W%s_Gv)7%5ek&Vbi^7jd+<^lW8ogFm>#wA3|Ur$BR zssv!{G7xqVM&lP}RwIs<+mN6ObP;o9=cT2se>ut!A_CW8{@fh_=9W@6J1jvV4k%Wt zZSdZy4m+y&wWG^h^+tjqe{W(94OxLhYVxCC*%ccP-O}Lg(=-+q(!6U)Z>{|ypP%Xm z`9rvz;xV?X{9*L1gfW_|7)5LA&)wT#^aCOw5uIWvSe}Ctrbv-Rh!~ZQ07rv?+8N)6 z#t|rzl*JL1Y@avHI&tDVhUqpG(DvCPVgx1|Q(loO?Pra%8(OX56+Y9do215zh8D9Y zIJroXU2<~Ya#}V;%5+oDh){fYLPfP5=pJRLtvspKt98!k-c*FKt;=x4ed~Lm%s=r7la-Z~ zKSTD=pZyP0Ul|q0^F+G~i@Qs3cX#)o!3huu?(PHvS=`+vxVyW%26qb@BuLPp`!>J# zf9JgZvNJnp=1X@~S5@D8>*C_llu8`(H#|H%skz!UT}{0{|ww zySqPO#5ww)%NlTX16c?Q3j+fXyUaGzdpeC@b4^+-ZUY8UMJ_)#|J7$ao>S z%jD94@C;7BQt&h>A){WW$e9`joHXQm+?7iyxX$(zaP{ z*Cc)iMwEx497x@afwM?}wa;Lu`_%xrz#i&_6wn zsi~=NS8Ev=+S=M$y-yWY(EC0~ZKbs!0Qi3+02vw5rUo4h47G2=aB#@T$ifikzyL`} z*>8}1WMy1j9moqFP?Dn4v)7eM5*@=B;9e&moX$z1FEvAgctS33d}Py4+HqJOK1Whx zi5&TXN(;x1CA&{-z_YtsW-tsR$=T#D8ZUlcDXM8WNzwVG3qtaE)Jcvqvq@w)=wp=S z7lpNmG}Gpb9md`KjA$PXKGQ^zjKf^3STf0!ep4U&AD4t`G2Oj(FRL@LS4Q8C%(yN; z-)%n+UXw!3!$Cm6H;5W^3G|gZxd!59AOs&H4bM!0O)PJ+j@;|g2w>yH!)m)**E;#8 zJJ8Z41Fo;ypP-^HkWW4UNmw97WmRJY3Zces6Mp*Ncn*1iV0p^wv}%)q0Qj^QT#yQ{ z_tNT(yG$CN!z*hl+zY&Gxj4rwXA zggQa%*r`Z!Je*+HQ}p7wVSTQ#tp$P{!$Uar_jEeh#`|WisnZ#JUU*#7&F}fQAMRT2 zjSj|3auu|6=^ouHvk@6)vY}w9iWsm#L8?P< zIihay&hsaaEp6e)_IFL2lNv3C)lr0jwm{%N-?It`zO$HLP~eg0%@-n-SjEHREqq^H zG?&){YvX?PGrA0qF7>J}ufZfIIU`R^SB3-ATOm+FiUSvvp8W;e4%=5UayDKP_C0X- z>#?`aNU8}%i+BpTufZpp=tk9mz%dsq+sR{M_&hEd)nK}CUK65FtM#U zOU;*9na$O~pIwK-zaG;F*4E;E^3PW={ap7n#=iG;t5}+g2s15y?D~eWK^nJ!G89g% zqk(X7xFU+QRBuID_vB6RRtJCqa22LPWznX584nODA2fnlnXWS0Jx?Vh^rbbHr*+8b ztI@3KHiT;A|9pC{IlHVMJB!1z-Au=?2I$i;F1BoSW&j36p>-3+3r2)Ca#E%AtSal0 z+N8(-b;;Ug3;%3{c3XU9A=5`lW`|B^EkZ;Ke@4fsfo?mm^RYkPV@sSUfs#)Tr`hGP zHbhy$O%NA3p1v-b6Jm-@V~$l5G(fAq!m(rjDwrR$^zxB){g=`2GxUX+4eeH; zT($Od15YO>oI7~7%;wzEUSBf<&6#!^2W>D25r~!k!S4v+XI<;z`Mp_iw1XBcL{F}>R28Ws-7y#s_PP40(TKpMkN4TfZ0tQQ2GPp0^cnh4{zH+$0#P&8;3}Ak3`|2Fj`ud%2_pd}gK+@FPj{%U1OH0l6><9!9 z3`kKZUezs{!jZ_B&?vSCLJ?2JNF(Ph6T2J1lg!ef!vYyvfwe6{V-l9Wxo$(hF$-dl zxoNpA?S)h7$K0oh-;JTp^d@B)t{aNBshj*72|hY+*@LZJUN*rJMc?5m`S)fFI4|6q z9EMKfZdg}xiXY!l25~Z2sxqj)%Lwuf-EdwSrVojp;U(a7W~AXmjvOBj%}4|Qm~azW z4U@jcQo-)d?Nbkq2-H_Rq@UE5us6KJ-OexX|C#Cv01nAw?#zZqQQ_y4p~yH6u3(B% zHOJfuR*((PLmf!eU|0c*9#SfVLjWfmhprQMQrGxnw&fjeJv`D%`;>e*D)JHlr74ZQ zuR2yuag=H$Eb~Yyv&~gV!|A;A)lm-9214iz%IOh4 zf9f?~Xe<&+dg)@bx$iSCId1~B8|S#y1CgM}gP1qVR?bBMN{rM4Nx89qvtp?V7~r(Fsu22Dq&4ej6(AduQOCaviz6 z|81p5Q&sUrUsmYzddn1P|1v6SlVndh1x86l?t z7+5~$dx(iJGec7wX~J6r|CYXzT&0lTyua*g_<=o~4(v99~AgnX3yij(XcTq`_ELN$nzS@c}*LVQy$}WQ4=RT+-|7T zuA9kggtfj4649dYDt>|i0usbMqi_uql=j+^)#Prv*$(iq&ua~N7BRZ@xntUCeWA=t!t<_Yy)5g0)h;3uM`Ry$!+mbHp zQRe@v+@rS4BuD;Tvbz06NbmiQd85C*V?N*))EQI2HMc^lvEau}J1U)o0rc0U3;rI8 zAM5YZVLk3IR>rkgR4b1m3JoZdD`rU!7rV|Se3+<$(q`zqJDd{mQc6R{y4L+oyM|cB zK7Z&dXIxzdBim6sGC$E4#q1=pw!24>tf9*$n+^!_R$ma0)ni@x+f}UCnjJ*pQLsl* zIpXMKX*y6Suf3~{unP!)%dpYI3XOh+;*S5G(y6OE^8lTgs=3ERF( z!Vh&Gv%RPj$I;ofW|Y2%R8?Pe=l9t=1YbP-Gu1f&=*4PYQ-Md95pb#^!bpw7nxI-u z<9WOfHPx%SXh#!E(>{qS=RHblsz8c?+bG8|4?ANC&;SCc;){~{XD1T;zLPZoiS7wk zNE4pyQ=EKB}5LJ@6}7>so~-xL;sbi%5j6fHh>w-1bwL$n)F^;_Vml) zs>6T~u?pp4h( zPnwnO13Ux7h9c3t7Wm`Grtr+V&F?=l8niNFSe+tL?h<5?k2FLyMSuuhcyfI#OE-(Z zL5ndBcvxaM$8g92Z-zC`zHpL7N>sR0Z5}*$n9x92ogXGJF{Q@s@0;0CCNeH`U_*oA z|NkPL;onNQ2ZJ(97VPZbJtdrWpc&g3srPfMR~5OO#KYQJCr6{vu|u~1NSeVx2TWjK zV9@`&hw{<3ThKVclg=d8)69Um<9mlF{L zlnR{kw!x7GOVJjFQzgQjx^UseM=)TO`&lL>>%MESKyl2H0SCvO`E?v^gkt%#8~(9b zX~;k8YB(7M0~5fUqe&D>67nUqZ`mt^_kPm9%@#$6G*uaPNA?J(nddtjo6mpH;(n-l zo^Q37IFZzqbkifxxfJW^vbvvO3tKE^9Y_XYrm9x$K!Q!H8-WKMeUgYW+RK{@g9hd< zq2Q!mA5VG>|BlB2(oS@-;%z;YcGg*dMJFYl)7@4OOme_6Fe@-h3Kf&Gk1K!H0U)G% zwZewxbjDFKuX|A5bSJkv-%l@ySRBIm`NI-^z{5HRE=L?+!K)Y^!lPV_Om>LYQiPNO z5)x85oi43GfR<+^imWsNUQvxG&Q84LeuIUrI$o^+TdLge3;<10bfee8Aug$M{-1Th zF9wsfz5}($*!p%y@}ZBiEH|bq(qLHFPb|x?f1^Fag9jfP!nQEUqPp!P6G(nt*uH;i zIsQcw^>tD$YneSTCRxZKe0rSm+VfWm#aK%OE!+J?-U!}%SL2Jq!3iRZL4wJOIw)Nz z-h3MX2X72Tb#R|@Qb2vedmJ2vLKP@H_vd1e_3fV`EybZ$KP8#Ms6UzX2I9z8e>Q6I z=is-<;K)B|8BkQna3(vKpr_gAXsS=^36Y{DeMlSA);fwPI5v*8ojReNvz|^dJ>qoN zI)e6K#et_7wUJjAULeg@64l_NvPo8oCsKFWK2EgdG5t}N9xJtR>U^{qteTC^Ij{m% zp#g@_G_195dXLD)6iARyMLXj^=66l-Y~YpL}3#h@@H{-!{w(Vi<*{LVTvm>?q3Ijnr z36{psgyOIWNdORjGrfUY=jq1$92lmssThv~(?mI26^^R8RY2$RJocXeyxhxC`Tu8eVK|8v?R*|8oz(tfwWu`BCbt3ThW~)+(S7V zSB({R>g@{bP)(2f7f#6BS`yU#e)|Mqh{>YqZs}|_qjjsMK8UwIKPJNeFs)diC+jy>-p3M7#Ra4Knm9mgzh})&n*X1zJ*z>v>y_PlJgNVPC?{_S(Jhlog zS(Vx9HS~2(sZ9i&b;&3IfVlJ8iJ)O2tm=X}Vs9?K(l9dXt8X;cq30|sOOS=tXK@d< zJIEs(oa!Qhc+1f$v$aoY#PBY57qOg%PxsGM zuK>73R*O(nhb>FrgaZXF9=63N)vBU7>!Ki=rucN_RFRx`{+P40_5o-YEX8R)g!WvO zfXa7SAt5#ybT!XQs;YC8Q%~A^SQVvHW9=DQ8vU>w07QQK20!;gz%DbZ$tiNe*Fci* z^-hlGmS8kl{obWpJBZfl&ijYkyiB&CtZ#k~l8xvTdvHKw4j2#xOqkN~Fc7T2D#62> z$T-+@T{}=fYphE^qWZ49UfEsOlBlxKxl{c8Bzw*jvj*E z>ek8H*4Ol$VoxD(hDv4&rMt}?$%;;sQ#lqMLW@3Lq3)_N(i{{qFM8v9)v|@v#s4Pg z5)7)foL^uhd18=QXQiR1#u4;Vt>(li%MN1X(L@BnDLf@S?~}4*nP05C7mW+9p4UfQ z{~U5cY0{&m(Ur^VIlQ5%iC)Ot>ip=n9LKNsd~~k<<00*N|K*}B4?u%iQ|q@w501*@sG-C;$SEKuXn`KhST zVvNYsO(?l~dzDluGs07J+p1+N6yDqX#v1spp$9;c3}z}irAEK{(k3+%Y*WZkI6Z#d z{m$JxD4gNJgg-yCyk+w3BP8siww@9OO}Wx@0RSR9G2ijK19PrkV(@tD$aAn4w*6vx zXNv=h;V4um$kyL(x?OMPgMOEVM79zhd{%Jri|+D0ftln^U2o8h3ac+dDk1bvMX1rJ+wM=^plZY<-vmKB zWbIpNKC^J2vh_`tzLW8E zFzt5Ux}6PyWMmZ0OqZ->Egn|^uxVWtSpL*YTcA$5ijfrR_G@S0Z6>}p)lX$rI+=OT zCVI3njg(iPzRf@go+OMvQiu>L0Yi$$ohg)Wqi(p`rYg|5uVx2MaQIQCW!N|<4n_ik z5P_)SlpJc_(}xm>yip;t7V{k50%MNBsQvE4l_)tcz%&FvezDZXedZRp9|_%X@dtaM z5Su;;%8nj_xoIdtK#0iIzLwxVs-vs^67V+3Xz|kT9k+zt9gPR}S8E*?dVF*W7L@Q> zy+LMUh3lX=ivUyq2nE}Ph$Pz)x&JOawX4h-R*X~lj`#wXoLsPbo>`3?XM zV5R9`0Y+q#I7KT00~sQA)!U~EfHXlTUW71!EnepNgXZwXW%Mqyee_>AoYm{WVt>5+ zn_RXHFZSOC*R28CYSB$;SZ_Ai%?Xkx#u3YyxGiTlzTgp%&gARz8}4&d#5{(albx34o(ngPQ7y z$L4?{meZR-aU%VWT>hvHfIiuelnF{##?cwGbRZi%XO{zM6=MpzQ%sH?xN&QXDh9;) zh0PUIWGD!t zh^l2g1XySXK@vjaQaS(?6&zM;Sa(xtoo3tz-UJ@$EISZ{cBc5Ao z`P)eVBtwOIhY-PxF=wjnU0`5=aOF2_X9ZB+UuiHng8@vF{#4I za<}<*y1-nDFwAQk5ggL0ZoXM*4x-8c9nb2xxCb#3$ z>;Ej{ZR>FAOWa$l83>?ZP3fuP0V{}woPkTzMBt$JopoOz8f)aDcqV65basfzmiJCa z@JStadBVqGUov$v+oop6DwlIxzVEAdG!97o_shr(m5T}PLHVM&(`trk(6^(^uy2OY zkniam1hN5vyw_%NqLq|~c+%57yan$ECGvde!=VsB%`<_GhEsx*6!g?!CBCv&PHw8R zBaytvz$d~bb|B`spVnSfNEAys6Y2&qs`=X4bs~+QF550_Y-rL~_!_K|XO&0ciowreJXs(*nUrsG)pYieT@>A1TW>D z)NkEdo*6a1WJF77TQiG zP^aC8?DP`=#9`D^g%Sg-TY{|Ju|QMuM#rSD#M&u4QerpFXR?ytM2rFv*t!&%I3qIW z1f_f}h|DGtCKD!GS6we_cZz>b^xF<%Z6Y|=uj!v{p}g&>nJ=iVTF2gTN2_1(IT zO^zZfXlnfAS{-VibNrG?UP-W$=?m)qOra^-kgiTDwV#8Tb23ih$v32h8f^ zpKHeHdg(2$eQ9T#tGrpe4zYqT{!TgKQc|oxGM7>OO8NoOPd~w}iFK=H6NSS1hX9

}!b*_JN@~&ifPT!%!{uuF0Vrput67yt_)%QuDJdFJ>Z6LECC^y}X< z6rk5y_g*-ik>O-9^vn62-C9F@{WX9z2ElaDEHKav4OaxN28+-cDlqz==DK2#`_EMONGL1`FVUTqbcJS2b&{qAxDIl2+ouPHJ8QGDo$)dQ0ShwIQ;HXZh z-<~=sBc{kc+VfamE$7oOivX9Umx5@WYwgCIgIm3d5xm$=2QRFnk;Okheh)>4z+_;c z-W#dy8Qh71Ddei`;OQIm)x$f~|9stHatUirCSv9KE_?Y-hkI*M0vO;EI+ISx$f@0OP46ufU8YLeEWX& z2RTHfPzqPIM=kphr0>ZVbQXA61%a%lWL&a*=w;w~ew_fqFAbTr!^HgD+@@?Czv@d; zliClh*{ed_%w-)^BKGj;pLK6TKPt3xz2MjCu*z-70N|R;r7Q*cIwOZo-5tsZ*@*BR zuJ^VGb%as(KC!ne#G@Tf5YyYiqB-wwR|`K}5rYme7kQ|DHil7h9T0xsIl1%=N&o60 zb!L&)_|7wj5r|C*0%SE@1RiDosS)!+rp(U*nDkK#!=uC}!BV7V_XogIsbQjxs+%BU zVob@BtIyu)$C2g#UBHjkqtiZg7NIWtps9J@3AaL1Oei@P`>QOX!#DV!slI?g;s2$O zK3qT74M8SISi1qxx}Tek1n8ve`@xW<)rNz!HswLxAK%s~A)3g0DqhfyHC8b}SPJrF zsZ3f3eX!Kr*_xT3iG_k3nX`m!wuvP+$7EqT_d2V3LMaa0E>U8~R^meV9#(@{(}!)$ zfj$7BKrLM1Tkl=rfstV7)jm?dQUGb0YJnu;CORqH69&|H`m~If<;{;S2|(hwVw8*{C&l$gtM1-55r8;WE!w^-L9B&106bX|@zDew$} zGR@=%3oL{si(rdg3J;3hB*h7&@>!9uT%(w20QqAPt_3B_;588s1B-{SB>O&&-MOH8 ztk;!Pf7hf@1sVpN-J_bj$u(m?B@em}92X{6`m(t!QHmNZgvsoxuhry7rscRXG&XY0 zX|bULMH`{z!nAHN8}o^)uY1pf)0P{HU!TPd{s3SF@VM|VA9ii9xv82i^&aZferMbH z5e-D4X_eYXy(~2{pYa>j+G;mIe!aWImo6XfuD#F%Q5VvTJGNZe)&F= z(e`OEL^HDkNEKjVFiALz=_(C8lh1#D3sQnvmYjE)r5)T2MuYY!beB;CyTI!N*b*tq z>SE!vhL>CMjDM*ENvRpN&Tl4xw6zTj|R6knq30h0wI=_5+4 z0dh2F3&uo|#)S4k7RcJz8cbJ1P=>?6R&r#xddxdHir4tgbx2CUt8kjVmOb*Tc&z>A zuKd^frR_^aG-cFl;pXsh6c)ZdD9R>;;9KXP1et0xDW6!X-+|dGI%0_t?$gN=S}|<5 z`J$>n<^#<7J3}{Pis@r8sRD*40TyeV*Uoe6ZP z!9*=aamwW z+(s{BEUPMfDfm0ZM`1t~05~4g>EChZFNsai1$$djavwYxJ*g(IadwL5d$}o~ZOz`? zZyesnp)8^D3ugX!rh6o`7;j*JE0HR~<3>SXY`L2+`&8{a%<3m8`TsB~P_dgH=&p)H z@+A86Nkzn)8hh7H9ZFq3Q4TucO%*XHQLCGE<=~V`p~C&O z0+qCdn9Z;*vK+S3@)ouBFX#74me94aPwp~8 z@^$a#H?*!ruPwiYx-KF9A~xTH_FMbdvSzvBh>tNsDAGd2x0uQ1o_EExW@DR+_gvlE zj_N_`-#gaQ`}DD}dZTN;!tw;SEF6(vUzW&o!`qumibi3Ni6dUtjOLhwqMjXqG>a`S zQN?;7R4^+Xdfxc-xfhr4<3KTPNU4df*(xW}djBywmD+0YYgu)9q4Rv2=ZR8w0*!nE zwJNKhe~*7ngWjQcCvSX*TRL<6ot0k7qaTgDSw?k@h`OU_=p5EyPxl#VjA8txHIs8h z(Q^BGZ4hbNN4P8gs`E_WA-hD)MU_Q{_>NLu#f zYR3+beZ$omBaAEq@8V@2rVOuyzs<57sd-jTdDYykC9oWOg)$y8h+Vje{?3Y%`}WWp zv!NX0N!M`RaC{xJ+!^Ym`*CdI1`_`FGEPO{>Ce9X{=I}802p={JMNb(9jw|`k!@pR zi`pD(e2DIXovGeB``panHbT$O|Ix|oEvyz|fLd-RQ`)-Wl7?I!_CXBD45Nr4t%oHG zubf~q(}#>*Om+O*ikcNGUqZP>+Ym28ELK+1rgDDDmk5M646ZVcXjqOZV*vvO=1@n2 zVQ};=Y(nib-6928oD87SVgtoDm;^g&evT!qB05%P9&pqNZI()IX@VQPd7BkpS0~A9 zlU9(f4l1$N)I}`i9_*qpuF~?}>R`f-E#95y#%Pgsefg~Qf%fI^%#0OVvF?0rAA-(o zlI#81tbPl0bVBYt89UgZ8d-P}p-s+aZ1;}Lz}Z}RBMq}84x8JC0?JZFSUH^%RE>a5 zb#4FULPZyxn87+hou-3BDP3jMFloFMa8`2;E1o{OlGO5thRTe9)qfLo1_n)7ESzC* z+p-uli9&a4>|#~*s;)`v5%7sS767yti6*`-Y}>OhWYbc_?!NFYFzs{t*%@t^s95{b z+NSE`a$(AJA#n;fgJQ7P%`XAH{` ztpvf}iJfTXO9d#M_tk_upP!yJA-&&R>qTYPhFzUrF1LCi8^z?1Zx>yl=;q|YjjfJ( z4pjwXZws0EA~YH_ruRBumAS%3Q}#axb7AL8jIHh!Gezp@Zi2FsvtyWC<~)$yvCU#c z%&zYQtsb!9slFT&defGcNbA#V(b~dc+EZUNqm|`&N_vT@vaZB_ta&CQZfNijn)|)O zxjUcOP`U6c7d;Ci*v;1~y8mEzUUJZ*^R{IQrb*IR6;?z1eVA(3vhv5czj62K@s`Az z(x$@o4{#uuIn6N#!S(u5N4lC_9hvC;A)ku?8HH;CPP^BGUg=v1AdQtF@x0@rBbX9A z%_D)y2L2hcqzz8pMT2zaXD$v26H!p@d;9=kU7(kOrIahZDR*=$b=iJ}#*XAz$vNLFRF@%kjV zZ#AUb0LJ0^QbM6E3D}D$C@7I4?}F&nIc!YFQ)r|-1+HPt0gVa?xz)7Pt>uAjWgU}m zd|>R^#SFKm1}rM|EbCt|+S)80sTAt7#S5yL6yc6m5mF895wN@^v0qLU4=lAC>GN8N zMr9cc_D3ckuZwrPS6 z45qt%X-M6ekv&TS7d>BcyrgqK)@sL;cIx}D+>Y;$zrP@U>6omb_!pP10YI6?|IVJC zH1qWJX?KAdco~{dz(Cm^bh87BXl3x(472XMg_Q_1nAFo$vFjqKY{LOb$pL2UNS3Iu zTGycoHht~P#bG-Y48%S;QAql>e6`fZY29$~HOdkI9Eq*N`T;{!PgVw=@>KPB zY4)MFI<_WzE5zpZM^;6w7NneN14C>}D zA%s_jl(xV1eu|X>51%fm%+oN% zkHUw+(g{SI>)A|zVp#cd71*6oz*NHxw-T0p${4H$G{t#yXP zn=USiY-H|)hjaK%9eT)hyaELg_0wqCu33DUspV>(XjT%vful2Lcg}QU6g*^f)IOI> z&uGFo?6@(Zv0K|6Ys@#7VWryqg8PT|xxE_VL}mh+PWw88Y0pk9vNFY|_s)0ai+kgY z!Dsfyu7mc!8OC9`y|Brq04#fLmEMIfN32ZBH~EzJmyD-ZB4@OsYCAs<>-6-V z)yKZg9Isx9Rft1iI6N+}!O3n#iLG{CvFS720Y`9pRPrIbMkAP%Dq$>{Uvtsc#JZK<%j0TbWSInG zQfZ4%?--8)BVEBMh+9;$<+S}_q)J}9k2&V*0`kGP!Y07k4~?s>2mD22b$@fc#E64T zZj%Mq;e-IV%$+J?&ye?^T6tuC*%-20-bn|Cbt)-1F()sly50@{tfG1KK=(M^Hmp|M zUkM31!jNYru@FotUU_O-I*7w|o=YiapN#^Libu+f#UiMnq6~3Z_1^?RO|{r?(GJ?9 zf(Hx*WHRDmizY!$)#-Q}_P=9d6ZVwJ)1Y`7e)iyQo+avtqWBYlE-QUO0uU#|q8`>{ zFQ88}=1*!iMlhx{U3|W`{ED8YLQ|od;l$&I6|Q3`B3iXQMir?DOREyR7G|vvo`1Ci z(&$Ar*?zBlH!}!M_>rpU%C0XRYW8=m$CLYzD@XGe)|vA%6CkdNUVUd`f6 zs4nEXYWTW&EolDw&hL}Q#oJ6Fq|@jg*<=At3AM8^qP3#}*BV6vo{&(Q1&5Gdh#Unz z&XfZQ*6s@J{TB`@$0crZAj&ke9FK)G(CsuLFjNndbb5GPa!-aacPfq&v*9m8C01#F zUWQpdYoipNo&pRvJ%NZX+&0NLaR3_y4$EUx~l<-n>kE!E*OrJ^)`TYdHI!{#B z|AXVZ=6YLg5o&I>Jcwr7w`a$pI|@_nsz7%{ZL2agwQzxbHVv{`d-)ozG%1*S2d!9~ z)&5pn=bOj};^4DjZmoRIk`ves=5p?5rAB6$0c)Y>0}w@msRI8^&<`M}OlRpCis)d? z({}(#0=c5hqCAru9VAN7{6UiOiZIH$*|o!x@FSA(orCU9=TSBOfRIp!`Sj-l zPg~E_smB=2txj_*rno6gJ+%3pTpu8(Lv-dtaup2Hmx-6oPmD3aF|Nz~KDsVZXw*%? zADh4OnxkzK^$fMz1 zw^L;3Urv>B(rtf{#q1C57LI*g#2KK96F8fVRp&o_A z(s3foV_m4H*ACC27!2PpT~TI+1%tkYGO?1N9>|mMH}tm^1&rCsB2m`T9YTZN&Sjal zs1>>adg=r70TVia5^<^`^Q@(_3Wx4S)hAwUL10S%Y5wIt&T-}0-@{#1BaX1P`2P1= z?L)n2Ys{IH(xwe9-_r#Hn3jWIk}pG+DS!T_KuQZPZZ~Z&>wgmj0L7{=LW?k`OcIKs zAY&l5sD)+~jaykCnDHw#8bR^D;Qa#Y>$2H40-$(8C7>ms(L#$H;WkjPc^5Fu`-wKm zL(FydJC!e}z&(Z~BBrL(PuYE+_)GYs&WT&edTK3(Wr1WsnU-s^2!p+eqhFOR+UG1} z&~2=u-K+|_Izs8Lcs{9IE!@(&|H;jyA&%p9_$(qz_OepTeGrXw*J-RMVViP&60OiV zkh|jNAz3N=nU|4M&cbW%8AVEza`NHEXD)C>pO|o$jkyCdYMpE_9@8AQYv94Q5|Nv5 zlK6B=+7P+78Ge$2YhRyQ{!xiE&fyB9Pebs&LN!wVuZ@tACHg^N}(8Ihfp7?QNsL(+`NAIv_|EAc4NCTx5y_C~76)(vc;M<5m# zFNB!kjr5F=vPyd*Q$q>sL*+-zE5(+v1%Zn@l>#-n=tVBfjLdE+lku!uAm17%@wA;H z_OmLkx@Mk&%cZ(WgJrT?>4eM$MnByC`bNDp9CG> zYFp|1vxNinJZwOW*dm3%w45WayD{?a5IcUjzLJnJRC(78cRR_J1>r?y z`?5B6E3hlSlP0B!m*rc-c6(*=XXHo4Sq;FLtIhFW2hV8$T&VTJk`0tQ*r%wH4*)WJ zKoM@=0w9_5o_yn21QI2FtOYq5F~!cWm4+QU!@l+J{;g)l@XwBjytjWn!&aKbDU@dH zM4dhTU17_pfN7Crqr3If8~E36I}HWpFT}=oW@oECr~W+KH;gy;@>?8cUMJk8ZKQb_ z?$#2RDz1WgU^QFG4>AdP4DE&dZx}uQI{UWs|L&gT1w{W&0RVDHfGW(q(q>^w34k#m z0AtCnqi1rJe!r?}byCFLQq>1NMQbUqYeABA8F0(0E_3HpZDjdL^C@M^en$G$Y3cud z?_$vx^8D}m>F%9YAQQKeghE$hDNoAwz|=?FpV_!V&D^LV?(x-oh?>X?dMICI-|{{JzhTk%_q&(b{5rk`j(c>)t=oty`6TQyuX{K z^*#xmwL4AfTiQ-GSNHzPs31$K#DjJ_I9xvGTS-hW-{^zm>B`P<1uc=C<2%x7`}c&t z*^Tr*i9@3@h|V;CIA#$jF%}_ve%R$s2W{lTF{jT)ZM>#LE*%LZ=asAeBNsTGadW>h za@e1AfIRb|sU8evu@JAN6?@ERJyLi_5No#$OixJ4Zui~o#JDr~(*IPaEASYfugvoK zqk=Y%miwtVx9Z-4UFbMiijg=Cm{85l*qQoeP2uA!y49pT;~$Ji8$ZH%QaU>%idS1T z06ZWQf4cXNV)I?DSB@4X!T{n@Ht&`qNk+ci^{omBGsG{amvM5pUAi)vw|YxMV@8v` zRp<*0N0E+(!V&|oMo~cId52^{1@ZQgveP_s-0g##b?zuFq?n?>o~4*?!;u=Lte!E~GR!SPw_qd$ckTZIKV_y5i zTc>`=qAOD0&b3zltZzzypJt(>C_?3@HqWFNXd`=*NhR4fgt3lni8OyIP#|)mnY>@t zA!N!)BwEi0%Z_5S~JDOzwc(t$lR%XGj<3OXq&&weHZ3A*J zm^%6=wP&{m0Eo8cckFc<44>FMQ)7uY5y~;5!Aer$mpb^KBcJ^{L8s-uJ@f6m-98bAD@I4hp zK8qkjajtgq&V<2uRUjCM4wT>Te72|W>w|r1`M?q;{a}jOdPGv~Poigt*xLM>Gt<&m zp_a2n4rzU>g+T6dK(QSEQq>;-P>|KX&0$@XlGuSAgBu4aS5q0fIZT6Wx`T{yLmV4! zoj4;UmEkAS>m>4uB`5ns3T91L^t2X;T$`+7LVx_2>i(b=;%0fHh=Cd#fZe^daQfxu zWrWdkzwJ7^Rsqzu6qupOl|gAU=!qV_i85v?n+h zN<{9)YM;Qc%#W08#|R^boAkw3R8|+TJ1f-)hj?Uv7HRI>QmCwd7cE3)YM{fNXN59S zVZK-G&&mgf6t~srt#LI|YM%bdjwI65sEgxO^;#)L{TivW=6MLHJ-oov#u$iVjv}n& zCo>k|e|DvK-tbEUv;C4JO7rx#V5nPGAE%^JC?{&O`OM+borGTU5^`HX0bi`Zb+~-7 z5b+&>1BXbRfMpQN6hSTugu*?a&jdd@xw@G_aUmk7408e#PC!04S9B6kzo0b53>%(m zdm|$L!THXhG+l?i`SG8r-hzWit+X_ic_z3_i2c~1;-V?J&`ik9_z_gzbYqNrSp7!G z;_&p~_z7=Cx_>lY*>(tZ_q_gh8ubY_eZ>~j=P=FH$MK2}pRx9>GV6mI5C-;$sLF`m z=}hde+TBK8qLECFt2er*kcg9L4D$}?xGhoukn5;aCNEY-^tD;Gs+H(EdXPk&iKy!q zQL)uZWWSLYfHq&r?R&BoZ|YcZ`0}6%*$yX(8_yq~T?<|zExC7)XQ#W%Zc(SaG|D`B zR?x+UV~X6*0gk>y*fa*~Ra_>+y*waH&*_hj$u0&BE}kHhX*F&ZDXs?H$XJraS8UL3 zCid2{iI|`bFJe{a)^bHwv$oR)nh`mE+hY2g!={(%@Or_`8SgJGMY%kitMB|d^4*8a zIE;9LOP$4H&t}`#++qd#*ujzs?Yq^7x<8&DC^a2!-d#TA>N~98`*&Xsp5KLrVgi7| z)f;{f^-@IG3=Au@4XWPhl~JOf=qi2uyK`Iphu!_eayL|8#URJWtUx+@n^OL#w-I<; zGeQdhHiLI-JZ8cWG*yMFzk)$KR*PpW(oae(Pv6Y{sleP^F4Q}ueY1|E>SqD(YRdBZbk%vL z^{Q<6B!@JyLvmB~=&-DX`hl4iuJvDM>y`krkA$6)Va^YtE7ZGz%1UD@G+d@Dj=$G7 z-IMNECMQy4leMWAiZK14yCklu=gn-pAvl*BM2}jhh&t;Z9dz{jLAFZ?s-M1pB#mTNT35N0 z3-ZbOEQzG6VQYqn-<_I{} z;7a8>IbA*#pW%&&G%*sNOE_GLFnolqJPg7QXb;Aa=0Z@A85N2U5L5^*S15>0))S2C z9ZQ!RKf3iwPFg(Z=K5!<5NOfDYUvD##D|fh!vO?E=Eme|Ls<^iyFeQ#h6qHax3jq{ zbHB2^#Q$pEQOichhW&jjmpJnCr}D<$30AAE?&L79@1#sX0Chym;ku&>gT*8|pJ<%U zp%nvJoKWfW!Q92l=Cl+wLFujE?ZJAowc{xt(?Hi)jy;zo?O5jjVd|@c+HQlb0|bf} zcW4N1E$(fDySux)7k8K94#nMF3&pj#yF0W+3x(Y9-aGSsnM^XtpTB)}pOtgYVoW}- z3sYu(p%-=u4DASGWje7z9unFu6LP|T>bv4lhr@2Cv}iToMjj;wN@?ST)AWdnGO@-d z@_soBdUu@&x4B$l|u2B z+^BdvG{EOgX+;`&DYqx)a#70;OdvvBOa6vwWI|?2 zeb_FCoZuhrG*dXFQSzTJ#x$ohuI0AzKyZfKyeaFhH}m=eq8H?AXI~BU0DvuYn4d%8)a2Nf)_bjqt3Sh<7B0uLa8^y& zA;7#WMt^b2XuUtE@zEuqkv!X~RN{DLmdFVPD|?urx)RqtCZ(*+?fLkZ4fY{R5;er3RbSR%y(g%U^WYKr zKAvV+u<1N>#JKT{;ho&^o=5Ap7k}(MEkp4ev@|j-b^_YMT1n6TJlTJdkyj3NwRxj*Y^WLWDTpg@OTYTrk4qGmU9sOuD zcR3dgpC2v+uD+w?Om)~>RCAdB6R3V;B`wTenrg5EgYWmVV{Y)dNt-S~t0vzI38JzWrS{RG#dw zX`($(p(@6(w93Nohn(HJ>RdDs+iNU61pxPq=T%@$3o*!;oS-o-9)6*M9P7-^r}ADb3fgeT-yu2#VI^2A_;eAS?GeRmEq) zX(m*{ON--;pjK!-J9x4!CSfDUkb>Kq6En=k<>VN>z6)fL8%IM0WBZH{kvZ^%5Yc;O z$&j0mgE*u@l+I#)h2{tj5FRT?#zqDYI&W@HYEx1C(%VqEW5=oF;or|s7W%XdK+UEZ z{jgXS9U%DCa*>)j%WmHs6rK4#%2HRo0X((5@4AputENR+i~CkmsgL#d7=6C9-Q{Z7 z=R1GsY@fHBw76c&KgN+5U`4pFoyIDD6$lUj1aS`g}ofOvPBfj3A& zvRyM#HtmV#KP$$U@@*r=DTZt3$HD4v&<@x+#S>OJ^EfJ$8$@Gjl``(n`&yHm$=OYR zESmgXN$0-C5y#fUE`Nk7q?t#UIKij$Oh#B&JX~S(DX9Ox=6LeC*f?nI$jIclgdX~y z(gSFDfW+5;ph5HxBXRiD%KxQ30APdZ>#WA>V;+ps2U}A7yHEpms~S-toP12~ zQe{M!?4%t@Ya$VL6RTA#CZ;)Q^PSn4lt5@$c`R*4>J{O7BU3`_rCeoerN#p$)NDS( z^9Kb~D!U5K-+-0t<=;flJBuGsMwX{GCwAh1}1Zbri z&@Mf9ziC2PvupqiC1S8OS5=f5U0TryySof`K3-{%vlz}O>4>igPo4VTdl+1v=m<{U zW&je^CF5Jx>^IQsk^;Vrl0%UHZbenzihcF~?i-?xv!85_TIoKDKI}yG8j`b~#y*qW-up>qE|w zDQ*yWn~3e_Tiu^SsEa5**Yl~VwodNC^dXr`JvNHlfJJ95*O!ZNfU#CH?HdORus;3L z^uFD?MXUdG=KDryr~mEUGxQ#MdI|#XTL#_U+kYDZ)wL?!>^R$C@|)FFO0ohm15#r2 zQaXw+;m`T-h?54*MTLV)##5O;q|`)%j^5vB@7X3!qaDd~VzaJjo}ZC?jOE{yL>WtM zuc(}yL;rJ8$;i5Iz8_bKLTB;4c4+NS)Kfu&8E~@lOXfzyyq>Tp|MbE}?(vv(=Ff-6 z=dq79OiX86za!4XvF~@mdZ~(l0Je^*CA&7of)KVJD#JGI@#Oj$ef;yTroNShFZNo^ z8e(0;kFIz8rQK@++a4>;*(m@HYRSa=CH;bcVRY>Yl@OW+DyjVucNxI|MW>VfMEV5y zT6G$sP^x+OzVfdb(NuB5sc$jGNYRwU zvK0rfE)Jy~I%DZ1rE6>vfv>Lm4*;BlodhYe2gba|SP(NlF0qSRHS1K_cp$?oawJj+ zIH@g(9E%;S1c#zPX>J>4xSV*BfZf))YTorMeLfV3#DMXIf}>~e3;e|nqci}Kk4)ai z%r6)j6+@935}{V`+c`-bui}pS3Z&=BL_X14Pp#}L~x2fTgRfok1osVJvpy8BjNbV1p~fZax>r(UkA_wN z2pZ+M-b3|y;Zn=*W|B1leb1Qa?bDF}nm-C*==Cy+ONOST>9wN$?@AA?=^Y`OoM6$_ zZAdu^0vgEFHC7ai)&6QA7z(e|=)X=g?>4_2Is^{q_8TmgIvwx5raeGlOIA?vJbnoa zkh*d&M#Ic`Lv&Gy)5VCHL^G#jOC@P-H6}?k6a_V6bIvKK1RRU^w}LYBf)rmSP%DD!@-Qye?6uaCf_lyYwREIX%Lj?jrd-dKB+wc#h=C>yyJ zM!9}c*JM7Dri))*()W|KCKMs}j2$a3X`cRA3S3HRB3>TDAW&ABL|wFY_Vip6u-q?{ z(;zU&rQh&rpd9OKqMwZHPKJ0>?RfTynU4m~)TL$#OzJ9`1k6W!w`xWiY>^stkj!|9 z+AZ#63NH5f>X12OaAOUvgx;@8$rrDd7{X^9nP)PBBqT zgHyx^gXZKMUJbMjK*Tb8HP9nR9={zB0*5Q~O{*&18`K`iAczY9>W%UT4dwrU>r)~p z+x`6>7~GiVd7L}ak=tps?M2iDHbT9YYO$BLUAHx?P*2*y55p?63e6(wjjd7g)Sx%H z!~qZ}N2h0Zo{yg&Jc@=1{wV#?_V5=or$Mc=*xA8+P-{8X+_*w_EU{Wid`cmnym;|$K9ME zFN{n!|I0Y6zdwoA3@A=dFAhgvlDsU_KGPMdSrgW$WH&~|%;RIiiWF9dfP-kBx^{8@ zsJNtQ0hqTd6-%03#TON8ti1Q*xvG5GxGcBPQ2+TA3UvcyW>Ldmtl4Lk2qL3@dPA(+ zwc~{KrSpocPO8V++ z^U~K=3T^ZR$r*2c3nh+btm_U7RWMMi=o`c{rd=xY{#9>6t6ppWX45@tA!h%gBdD>i zvGQ<%W9|?29CGEbO-H1}ao763p^+=HSS zglcE)A|A_hYgVPS9;;wPh6I)SxFvZFR%K;(XJAI{fCA9hAL#_>`8RH=~w3d zXw_G6w;r6saeH;<7tsjp_`PA8zF2&bOA`yEPJuD1*0YW0p1J3HsKhgO-a}Hk?m?9> z7_Z1SiEB$=jRg_1m19hb!r*L&4~Zox*Tl|IT|uSl(-TL)gs?o7JxdndtBF)(zYP*6 zNqVcN%tb0;7davhXHykO)ZutMqHUJGbARgWN>1ERbvLTqEx!Ke?pbArk8@|=xPrZk zdJZ$ZmhaV7Ujl%Gudd3u$^(%0eT}6oP8u+nBz;Sul_e~edM%6rO-)CFVt8~sWK6&# z#n!}6Q{j>iv8G)bwAZ{=jP>R08SBp>@j}j{viDnl^nrAX^%KU0LVqPM!FqxcEAv}V zU7b&AbI?1L^Lzi(X3IPTjCyLkw6iwVnS@ahUUb%3)d0y}s-XyMQ5PTJsgL@T<qdFEX*&ULUXqldjdAiyHoinH6#JgaNyQNrJ zeox{T2GrZdD}s07ZLPH>oxY`6j<=mEc(IjS2BbGFe!DQ?T26My}zNvkh!m>o~h9qa860|1ar*-7rJBqu;@X>y?Xw}PR|W)I(Q4*q+o z8duN@=(DQpy?<KV4|?H(l3Ypf&kbk4`VqdiWHIugHe-JMH#W^ftEC~+t`%ohC(9A zuLime0M=WooiV&-Bhs(26tCVztvM}#z68MVJqQ3q+N8tjwy5rPWT%X;pO!Ya59i84 zwPK{mj0+m;D3O#_q=&ngr&0Hx)^in4`NBp}bR%+xA53Rbn05Q!MjqF>bgdKHmJRV* zPWpFaDvj|qR=4>ZV}ioke@S%*=}C6j^}xQpxwdAqLZ>qOW=kfe=RfA%8LKNQ+C~0! zmS#%Y%=Z1$=<4VpDr0ADSkxs-GH-04_g|f!UtrQs{x8sPsa}UYfB*gC`R-S}$v<1h zT?EbkSopF5{3ME-5(lt>he3>S_ATQoEknFq}42;B5?GpiT@CcS3L;%2jkhbu&I{ zij>h`;DIO8+i!U>+>%8D>M{&Z*WA1HQkcr8a;MM0xhd_Ro#q=q{XhTTL;dgTX$lJM z`S1O|{~q4o!yw2+A;XAp2#MNxApqbv_9pd9<@qWfrC~%8T#5v@@PaEm3bN9V<#4WO z4a7NgIyZh>JCR?$*}jT7y}sn&;FJkj6Mz5!n*f1|SbE+(e)e&y;1I{aa=hl+FysZl zYXv6EFRZwTW2Hdx<%luL*iiN?K z#>>t+R?ImHk&aDp)M}JKXYu)+NP&li1&^mQGWR4N-2S`HUXEyo+C&Z%h{DB;jA{}e z0Z8BJ3xE%pXfR?n#)jnQL4v7-#v>4#7chdN!c#)fW8xKmVdwP<_bLS-fbz>{>A40a z0;es#;!iJJ5CFl5d1R^q5mtyX%}}*v0EWrVW>X~C%r`I1F2?Wg-iar zn{^uad8}$xw7RX=sGVm%-!pyw?~(uS$M~;B!T;~)*1O}J061;EjdDenL=D&(1^5sf z!y}fVkRXsPVWhHXqI_6*74csPK-UeMe(?~+YWT|FJHZK{BVRK5+m#5<$6@=KbsmzR z(9mLd$~@CcnmsggEh8DhJZINI`38{W1w>s(Ev8}mkzB`!c%TscA6zC>uVxyas9->u~5VQ@1C<=97=*}uWn zvaPC<)QMs^qLY>s$`13l)1z#cd(3UpL}2^*_X~7(Qs+U|oI>&1l@^a%DtfKjGfKA| zC}p!jOv+*!ZY)*RGD5Us)Xn~xj1X}xQ!&khHHGmvtg1Q$5CJ4cLs1aR6Be>@$kz*+ zurB%e;t!}Is{!d=!iuz6%>q0_GB{oKi!)*AD?Np zLfQ}2bJMH4&e%-XRzG~cYNi9)XK1FvkLwl_*wN}s; zdq2MPFR?P%^i4S*pDM{+WI6Fw+uR3K8BrILekPV5z3f|94@U&8Pg{TzGZQ*%>14br zDZ9Z;B*Y^lPN@=)%e?TItk=#Pt^a6@#1!}BL=dR~WEN5q@Oae{c>bNu?)v{!9yp&d zM;keX7?hYZFDLw7ONX%lM3C_^6b7|m4nVzv5zBGx@-?bhowiRx89A}?k{=?Sa9`{O ztCTAMc*lm+#Y^(|Si%wcy`LsrQ>^0Rf6&7;w71c~C|n%`cf8B8I4Q-rhL*@QCa6`| zc6(rI5Sc=eiTE@Y_uXj)d_g%_Vd&2+JHQl&2Up7T-rZa zjQAzX=e}l7L%);VN}&i0EKi#K3r}i&F2cxv&?2XCwV=JAog}`RQo1RUSV|9to+|>V zfHe5;TW;vkJ|PvonU#k1BTx%^u@bx08%$f>21Bbg7x6mJ&@*WEScNF`Fbj&D?n&cu zNfWi)im^*XFQ%5c6v*$m2%{2jJ`)NM56hxaioYW$O8&m1Ox+)5sw0XKJk+CD*j`5T z!FGf>GS@@lC%ZvK$fv}_X}5KvYfR_8&P`hD%#sQtF3k^Lv@cOY3-=rkXDPPc(J3AP zssc-C8-C~a@r9k8&|NYsV)BmNw2Xhl106lRT+Dpxj;nXqH@oqbIml|>YH6YqN&ns- z%&5!=2xc{cZ&`CdB@o=j+eWS<#sd{a18RQH&JQBJEB4dEPztUQ7Fj}|hTLvA;*rk# zQ#-j~pOGXAv_#>)W~P?_;E1srtaQ+3&u8>Srz6IVEmW(j$2Q!6fzc_un2)1%Ba2H@ zUw$)LUWX@qqYG&nTe$OJR8j0W>Wo(ABNH(3+td=bD~Uy>m1&k*J)nS8F_bj(3wgJB z4Z$sXXU9(d3Ej1jg(7JjPcCY0Ht6{BJWh2a3w&I%f$EZCkz5Ls0N}Q<%*MNVs6@;Q z_v7wRlwa)ZryBkBGnLNfE7z|YZ`@q{x0cRttO$%c2M03~>5u}Du_2TZsCqS*>GVpda8^iVqPd#082j$V4g_&hbceCkf&iY5>V5y0HFwc?3t19eq@YBfInc4ou+;X zPDG5;wJ?7%mCY$V`pWC97VE2S?>eDRKR6Gd2Ee;`Tw6szkSlM<2;^0A{51<&$>~_$ zULj!IQDP-6U{bmT=6xgf7Zy9I>KVLj5CrrQF($> z-O)xhTDOMEWS)`>amP_vjkl`LJ7~@-0+*u>M_bN>N>WEhqkIu^PC7bUXBFi)$FSOP z9ZhQQoG2J5^W|g+OWE5@zCndRJo!hmI5~&_F)*U* zx$b*^vl6~uI`~O_Og_ILoFdLg_oGP@Xn=vJErrKndPzx5Wy8ACQuX=^*m&dqfT!r( zfcf}DAn7Q7Z4I`{^8GQ+#+TV`V1OjXn)zL2F~nLNE@q>3fe}8(84aBAcRaUu%E6d? zF${aF#cgSKRIb_U=Y#Y`3DtVmx<*tCh9Ja|04??neTOJsp=9#SpG(y*k)~d%p&E=- z))|S+IQaYvkwCQelD0{*S!r+ zY?maThk6j_jw6785E@|7dED(R1a<4+HZa#yiJk%zJE_RBdi$HE8ETw~?Vz8<-0kU0 zZ8KCo_R;%_`ZsFtPXM7xSQIJ=qaj>lfojXy-1@-8GC*?TYf4UrZ7Ic9a9IGNKdO4Vq|7w-FY zr`R{5Y&F{>6hoQ!Pgk7k^p{opK03IdW54m%t(Va~(7%j?rQZC<^?j-haeoP@`PF&$ z>D3pgyUlwhIapHF0T;{{Qc$vZMMn|vPUO2;0CSns)B!(oA|>TQL) zPZ}Z~OpLp$P7CeTK!*Xq0<(oPbTThUpqBzGGZ(H^j*4uNM_DDX!WBOmxFV`#ik(@V zP#fEV9#c=^ab7e?N7Cn=3zE_(YEscX<^E_VZoQir`Vc=>MnCggO1Mmg{Ef>ZX1#MU ztK7UXFz(QG0-WXDX@RlC?HRmg%8|0b%kpDE)vP!b*TvlX_Ks5t}R=>8Afc zBuQ*3UojlM+fj7~HU99vylUrT3zdr6^S68G)m^z>CInGZk-FTjvtb)vBEUo|-MF-u zZ((!(jfjd6ku1ifROEe!cu-PvBmy)cQ# z8$Kgi_7htYuMk0n18!~g>m3423M<_Ul# z8(3y~4Ybn#dSj};3?5vnB&Pq{)fKd2W&kK99Vg(ZP>I2Hf<<_^f>;$D%T{sJWqNS~ zei@F@f1>c^N{Tae*J}7ZeoHn1N{hQ(Jk*qpy;v(|J55FIyjT3Z%%&6+{$mHeIU!r|GC z+sYJ=;{9{t7@ie2+TKwu%pyu2Y1cF{O`L1Hlya3HZ;E+r6-Sk3k# zYTqbHDAi0gIB=KtB0vn#ZYLbrZ?7g|o{TQ*v|7c?j`@*GgOEmfq$qMyTADySF;bi( zR9L(FyyfKiRDr>jRRLe12lrd(!#cKX2>&Uo7Xh6JSHkzH2ppPRi%*5g;6G|_grjoA zJ~>{Ge)dM%2C(=@MTnup~O3-1v6i6yAs?g@n(9u z8O+{3yU8Ml7gt(+zVrJwbGgm?{eJUccb_1~iM0f3x9k|&r1%cDkViB?O%vHNIX4y% zCDs*Ia19o5)0q4ivTYV5YF&VxL@WJnUDHWZgxWxrBvF_k_Na`EVHAgl5;JliPcb+G zk3fG{`3%X~DK??j61H|+a?G6y*W2>b6qCQn$r1MVKe>zk?Jp)qoA-B@Lxmvg>mdcU zz=}|*GzAr za~E8*M`F4jOF7uJ5|C#bNZ*FCp9MBV5++(TO?!W@-__svIh3Wq939;dPMjJg1Pn-J z%C5!tSQC|)To2m>2!_J@k$j5BdS_ITzgcL4Lv1TTJX;ojvn#0-ieqQL!gp-atkrPv zo=I36lo$4DAXvvVRDSUc*3#zs!RQO3A;$jAqXVOI(fbIcdp}nw*UMpO=VfZ|M`nh}Y-@U`kv#*L*-0b-n!absZTW5+GQr_Dp zo`5=S%(C3i?Y%KWBFcK$O-kIo;J1Qfb6K*qopv?=(D{~P}7Xml_R05i3gwtNS^zx`4DM=NVtRHcO8d5 zVoIxC1~9V6Jm_P8$({*cXvehS>CwNngg*L(3x){c8{agaS81Mf03vNA@oJvzS&3f5IP^B9MV(Fk&4ML`w$)t5D5tNcUZGJqODL%Qo7HIXe*{LX*`nKoIi%DlGiAYAn z^-8&GY{7H{;$eC^KwqOp*m%&I1&&bsE#*_r2J-L(r>v>)bMAOIHD<_5j1f8sko5Qw?)bjY%jPucHz z%yM$pn$R>#Z=RPh2wm21N=mz$d5R@inXH%2kjuSE?5&u3(D zkg*0o?nQWLs^AciLuR*T$CJb%^XA#{ADzpX$%w53;|&!!Kv%Y93ARc`hUCbQopO0R z$5gyJdP*x2S}iT952V4Rdwfb9K)F1s*biAY^>g$J@300;=*ciiD50u4vQ9!K_@egQ z?Uuqx%0@HQKS2X1LaOtMq8a2h?~;;J6B;sphnQ@TECXnRs)|`!yc`qr6YzQZ0%4tI z@yuN2_K#VHXr`em5W=SK5A~@SGDdJu_GTI!=f}@MS58%R*B}D&&rUx^+$f`VlsITx z?NzDCP+kj%od86_SF}FoDQ|#wEbs>$uGLpHn9R)y09ejx7-4#<^^-Cg3xHKF0|+j` zl9Pp?c77PIC=N)ELl{2-Y+nmE$yL9jVk)L)@=Y2ko0>C;aFR9eT#-J*a{LOBAo2O8 zP)N|BMcSy$d*{7{%yreH&*Qr>W7p^tZZR1>-2InYNg9xY`)!|F&(ystIj=O@!9^p^ zpfzD z(n->&$UcJgTLcw>1%Wq0xWYPLq*a`8_Fb1}Nh%)TlIl@i~M;O5iT`JKNVkH7h$K(md4 z37Iw`^hJ87my$$0QFqN?8-$M(@aDmA9w|eFvqGrhFQsv6Ggn84siO;gnn>eB5%&9d zB8au|h%jgtD{@1GYM1XKiv>ZKMq$-7kp8OJesz>@gD#&@j>mRkciw3TQ`yp`9w5d_ zY#jPYnJum|T!+!_Pc>WGzXp*i#`*~&Kyomz)1YB&6OUU&Nc?YvjDKGoWH`?=Y{iA~ z(SSp1-(3*tF-6mKIldd`-wf~0tbX!$?(7-TxUqG3Mv4H3b&GllA!fZzF(gCgEJVh5 zLn6w7S^?-cR|2*?Ue3UWA^I^}sB?wP`Zc2H9(gd;RA`Y{pyqnj{ynHD z#B+521pt-VrKUtL5e6VVS|9gqd)nBkaz-x!cVp|`Dh<0#6cgp^v{ z|0C^?J4mQkhXmK4HOEQ*yP}U>#mwyXA6hJ!emNpWo)S7p+vZ&)E0~5zEL{&9UJ)eW zRbiA`-da*YRF;;j>#S_DE7wPZZ%~tMBto>89V<#3{?>+EH6kK;Xw>ScrABc&V+ox; zb}u8UeBYDm2Nxr@YfQBMUzDb4vSCF8@eyo(a;3B8*6iMWMNX?DP?xdpabl`H39e`9 zR)NNhc&1murGmryMrk4{8k~)2n1Ni%)?k+%E)Xc36e@D8unAEB{QT&A%|J^X*3Yu`X za6#W%U93_7%HV}SWm*pMFSF4VZ-Ngb3&Sd&lxGFT{PJ}52B*-|mx~FVdq4SzvBA-J zE7pO$l*%^G0C?#J>GxN5dqqTlGVMv}^S&hSGd86#qNe83CkK@$27S>DtPrdP%993y za`4A=&wjvZIhoG1Hde$U?m0^|5zt3bTCpqt$l+fa7Y^ESYI~5cu~1@BC{7wYNy=b2G25@G0cA@) z(bvKMHtogYrD5zV;s0eh6vYz);tM44YVYkcgmDJ5-#(ZP zRG=Z(xgrMaG#IKb$Vml;ND}YKI&Q5n6w@MN^YiTK(Zgy!N3o z^-wWAjhV`;zd zbhn{rFrNGFxP&|T_^rVTeQnsz*NYfae}9ypp54*?8X3+SzyCB_$`=|5MTz|cJ+o+B zIsN|g>FKKzjpLK(UeF~V(6SG z-MTX$&1)GZO%Jloqy)B=Psv2>{}2+?Q%uN>wRZ)?;5wPukaJ@R3V|n zIXjoo=linbF6zc%0|H)IP=yEh1E^+77@PDZw|29-$^DTZz6S~&9HBhPqAm{;VzcD< ziH51iZY%^YKIUU>2hm6(M1RG_;FHhHOi4wPz?NnQh3J|SrlxLaZe+bX?)G?>y)K(!YXE)R+d2Dzr2l%MIt3_%^UcSFOvLa)V3=k=OczEgMz^AyYKIv9Zz_r=Y5AH zmX!@wa{qhC8oj!GV>ezDqm$v>zj^NQE5T?O3lOv+S4`8Q03RA> z*w65uMFvy#{+cnms`5|HhPB0X)xvi<)*tz~-{v%+1^LMgDSV^g_f|$}N7lISpfCI@ z1VRaKat);uXp{(?{E;!A$+3w<)v*e3x)tuBqUiPgl#!zkk&9-bq_pQRcoNB5u{u}Ko(l2W zdB)Aw$?ptTb}D|F3MiWZhL6Ba-~vM&)6gQn70ie zG*^dH-x?>^?D&{s;^Ts0o6z?hG7V5Fr`BY_f~Q80ca4=bT9hCu`9}KTB8fTSsIRR! zd%)KDv|G)^Tcu?WdLkc}EC7}fUAIU+!)#xztn#ef z#o`5PGc6k#AYE$2v{9-J1z2n7v-qZ_T;rROHA`YtNkZaiRO_~Qretn%d zAbmDhKV$a!!q%(p3o{VTLAX{G>lFR(V1^s42t0Ewg!M1_1s^EeQKZ*fFwZ2LwudVy z0aVEFDJ`4)mWqy8+ih^@@KLDgU!|hhO?a96;LIb!#Nwz{$Q)|qLJzd!E33qbzBa^( zi3N3)>BBM{y01fRtisY`^Ge>f47r^^G-~Myk_0ACu~};4?@F4hQ#5<&#u9yEl*qqV?vQVUu}^05&W_%C7xr~~2gZq_eK(uFszF9z>*DQsh~FqK<1! z@2>l(%ZVZ2xc3D9Fbt(;gG`%!)Xh>CYNZi7Ot;q+RTHu3rOGJaD<)$fuwas5;yaMe z&WJ!7K?V>fw7ai41CKljC=V{{FAz}k%Zc-8JjKt&Q@uKW#lr6nXH3^jQtaQccbPd9 zntDh?FCbdG5;`p2>#hUtK$B$BMuza0e5gYN=;#6s*%i*cWjO@O*Cy|+90xs=|8v#j z07MiRi}VABHc#)EFFGwg&I&A+7C9ZyA~4*rMhv)d$n5dMcSQN@=&dyDJ}3A2Wfb2o zrqxj3h?w#I?cME&C1-KNoM1RsxvjkQnZY+SU~aj6R8#7?n<~%)sy0SziDsVLJQAOP z#;_<64KUw%IZ67$%a>SW4N&pJu%z8d%k$Q|HNPxV41B~#xIIW>V!y2s3_$DsLTyUq2f*O zOvu*89ymB}5(RsP2B@eeX*jopbQ!_IRG##=6*AVfo0#7K+0Sc6f3A!#X=3((A;Z^J zEAPYKcDc#UHQ%;2sqh_+msVY1vtKt%;0GU8UkmnkTF;*{wc7Lv!i zPOF`T=?k&k8s}u-pZ;rk!Jm&=$0%529ix{|?z5A=j;yn>6||m`psS_pPglj?5D-LT z5a>dj{2sauu%OSfE05K}h`>EleEW_+s(~eMZWQuPtbiuqQdNdD)emWCG&j7rWc*P)_*s=L5!B`Rps|H&PI|F%IyGu`!tKN= zeJbqjdn}H9Ux_VP9%8o;6tqH7U>KCakDx>DveF6_C2JPFFpu4>}2cV?=hvZF2?n23M{f zmshoeOx~!3$_nSCg+56(wUdnaR_NgR7-gP{WyuFKZIXln_I`iR!lXQ<>fGdvj>;{@ zYYe!khc)^s_*ohS^WgPayF`6>GA1klERU7{q6I&rCeKpWU05Di` z(Hn(}pE+PG2M9*Q$+!7$;&6<>;0kNP6e4GknK@oI)--HRqXvLzZwiqjCL)Y!(B*-$ z=TWX7W5LVs*`p)KoR#_d+9eb{iplTUQ_y3I_!1L?Ih|V{-!pKs1asLQ$^wwlXq-2i zy88m(u(u>dEWR(p)3C`d6m?MS<1D6nYgC=vTvt9NG3C{B3SGiF^(`%?Dj^6BfRhIc zsd%?a&0%WVqI^tH3h9I2St`KFi|FBPE)mxAbW!$My(xxTO1~GR#!aAUn3mi9#Gr1) zdK-KrKgv1+3FhJsks=LMu8~rw7f*1p>W;8}2<0WqEfP(^u@@t5osTJ)JMJVzc@}xs zWM6(n{dSUj2=vR(yTx4JqaXfm158+oB}MPbBrV+Z^4wD%p(bYHd-470nWuMIiWg8s z<=k@AagSzrZHtfR1&kYt4v#9IQFT(eeKsf#aw^B;A866}(~%xIguanDdzx}f;Cik5 z0k*wMy!WQ+Y<0F87RoC@{oQXY^5NZ$-qY zjqcJ^N1i|0OB5=HDS^L>yU?wwRThXERS7#|qVlv7-x5fc|Gw>Wst`VJ(W1q&O6#O( zQYKJ^N4=U8cD9&B`55vJ;%)oOe-eF>oKB@jTWN(t3No?pbPxbQp0i?U?N0`2aR+~O zU#fV{$$CC>^V(QFZT9y5##prJgzj7gg_hpyZ$vT!q!#0)b#6D~``@znh7Q%$?Ltb; zQt5%;OvMO6j$%L4YS;5w-cLg&)avdMC-YRtg|Woy`NUa7Y-oKLca#)q(BdzdXZIvk zM5PO=rnaKpW<)wiyP|OD$QB87suSmUWM);tdQQdE4Kig z&eh(k=wIk%zSIos-S}+&4^L+m)@Ijr>i~h`1T9dC26t_d7N@woySr-%?(XjH?(SOL ztu3xC+Cm{ayx)KA9OW>{eAdcZbB=qAuo3^~PBlQ_jUudP<{)WA^A-GhahL)CEA?Ny zWRJ|R#8^KZE`E*%Eb;WX3GTnEH$!-#tSJD2J}k1hO-Rb}9MUhux*1+D*G{x%ZLCDd zg4zfA?gpWvEUc=Il}s}YNkJB_l@#8{9F~$C+F7EcP7?~K)E393i|v#KJKoyGb@NU6 zWqm+!aB*+yOY;+XSMTK@J5rNPvN~E+@S~`ube+jz(SerCTD!+@0FV;`wAx0gcU^}=d zUQ~eI z5$QdV_;n>GsmL&Aj)UBkrgFs(pig%rl;bq)8P z8)tgD)_xLB6e`euXrWm;K4W(3{xYGnk&+k^~xrM!*FGT_Y8RiHuTXvMt9oe^ z^buTc+12wugCoKN<6XAee}wCS`+^wEY!!;ChRTMm0xy&V_)<)%j)DO4TAvsyA&&>E z-{35sRvW5n+pAc0b(~=rblzf-zt7eA{Ecgtr3($FouQ|#mh+&g61Dk6w#9LXI`}VWXu0Ifv*Yt}e#rY3b=6J(P8lMGLV))n5z{{$!i4JMt|D=8zu{yE%btgtJJxJ$ z$XvDG^@N^YMlxLBm}X(R;V9*puDZA=BX81UbPZ{PikbaEo=(U1ui>AzpOW!VjaQ0| zcvMjkU|Ds@7Se@t<`PCiMFS}q$oYX1gggNl(~IQ+k1V`*8~6VhqNF(bw2_7R2e;uQ zZBQyG;t`wNJ8gPbJxN4yN;-^NXbL0zm>OFiw2zW|gFQOWh(qi=Ei zY;>yY9bm373|ufPTRLOWBJwD)?04!?M3|8cq7nE6j66~yOtJF}3eyDTdrr*D$3vl* zZZej^O{kh4nNNhG*3rRVR6FFiz#pt|Kjipbdr5s>5Ylx1<^bJwCqPmNsuJ01{g}RffY{*k?QMJ*RA1ZR~z(U`)}O!zm_Fe$Vp0}NSa++==4o2<*Z>0Vg`Ga zCmpe4IrWUhzLhxb^_!5UYgV)`i`*e`6_q3Bj9BryA?VB9-IytSRHXtoOz&&#q8bgv z{OfmPm!I_{g3oKFcqP=;qM6YHP|Q|`g$xaiP~I#7`{T!d{#e$NC>;M6z3Q|P47nDy zZiF{%18EV6fEy2OCtZan-YVa{{EOnLS!(dt$&D{)^rwFVS#+ktDI?2`}akmm&HOe8JIiR^d= zjOS(XY{t71;Dpze-y5+}F-C|R|DLc92lNv_#u)@&3j{kZHW;X#p^JKR0#N;4SI|Tl ztc~e#yb7U*g`@#{P!+i{L-rE_CtCGd9XQ}UaSK(4cVZ~+ltz;hB{yS=duMDV0#Y{h zybk`<@5}U`V$5uH49eB`eVh-ZLZ(v-C)Dy87}X_;r$k|4k;HPb*)^s8t}(S1JL2-W z*V+aS(}0JbwF1U+?bv7Cy2R_crsY!7x)#)M;TQ0KJ!frFIZ7SmFzCC3Le ztTXEk6Ns9sTc6i6Sf-QN^xO8CIRJKDG2M-xMd~LFQg#dFRcevP`Q~;~pEqP}e@oy@ z!Qm9owD?8`^G`$(gsg^&TJq+)HqSLyP7$a^IuJC2P!hrXkB2TZC#UanfY(y}aFJTL zaocvq*mS8Fu7+9?r@c`R4Yf<8RJjh94ljMCH-d8N(8fNfN2L&zj%?$>gZ)QapstLj zq+xxkDjs3?J7SWg? zw8k=%Y*H0%;WeVdOynx>bgYv4y+D^tYcs>R#^i4>H7_5Bf+tC4d1e)faN5!tES@f- zGWnim#{?=cr7s~U*B5$ePqkpS1eWUxFeB!%8`%dE|bkx|&h*ccl zT*@d*BRY)Enau~vzkb|M>D?6Ao3G1o(70xiPM^M=c3QY5D|d$36j?7~IO32Rx*mk&U! zTtNWf*e~;$9rezfRc4{^Pd#o28@ldBGRdOAiXYl(Xv_M4gJq7?Se@<@Gx_ewR1lrx zn0JRD3Sddp_c8T&ZySLj@3wt(VP^~N$Al^)M4T#*nlJi zzzs4yF48~{W-wg-aQ{Gg|6KE3xNDea^6eoKkU+d6Fqg)b1T7X-%S=jGDNT+cZ>|HS za8j#1xS=p0n7W8l*aM|IHDnAex)Nk^Td||OM^Iq6XtwG~9_F?e!lLnr98i!Jf#SF* ztd~gG6#~ckHjI!oCyu4#ug~+lK$9q^{^1ph=Kg?-^|?W<&U*$v@zNecECrLD>z zipt{beKHt}3#U!bfWCNBiQMkCR_l>pead=tsphM+78h;e^McCH)-qZq?lu00e?5Mc zOnzIta{JfUyVRht#W=j@!}j7h%`J|6`Ld8&wIPuMGLJGX9IAGH zcTd`uGL04q`e(VfuH^D$4yo`)v{ZULYMyu3Ci!M!F{!Ous{WPUU3r6J!~L`IL6ifK zj$oY8U>`^ZS#K6k8aXbxX{49&VzuEIcT-_{*P`G)b;EC-`SFRR%)7Z)Pg}z}i-Gq3 zl2duj+CU1u6*%BY?OcA|%E}3+JZi#SD|pG(^~pqr`GEf~VG~x@uXi1w6s@hqtah9C zSHF*-P{IHES;?*r9`qdk67B)u$CNU~#&P(VA7k`|3V_6e$@ZD=a^7RQ5GAH?*DdEx zZ|mgz%e@yXUA#!?>*OhgiY6{KBsu{xsi2Iee2crTFN0j@5nw6RP0cYvCsg-z zNdOfW4!ilp+zB>5OgwLbZlo8oK@d%hm4qj~kviU5otq@V~@<4j^RAr+{xti~{pr&4(^~_)2 zrG~AnfSi?Q6Q(uQsjc5b_Ke>?MQ8lg?GxnGP>vKhGO_y%2qTx$>-fj(Bf#Vxz{rs( zpYqO*u&aCawBO3JWACHM|9_tUdt+cw4LzF9mgNBekSLIlA^pe_sp2LxYn5+i`jx#K z6Xu=#hVDh|h_=ezo<~~^iG*TfVJo$m%_!W$KF0IO z>!ZC6K`C=re{ldpAhD;=k@9@Jziw*VsQ^G8fT0fp0FpYJ0^TsdlLO$zkO2__8y{k@ zGX>}=tN)}A1dGwbMVVI3M0eGmBU3^WGkn9VB{bX6G_*?J&{85tXQ<1)cis@;;ROe* zTAWSwA~2@saCHn5Mu!VerHksi!*?dg3?c%hW~ zw|Ws4pEI2A`+YX)hJ4NMlWI$GxD5^yRW|)_i6$%Xj73aeqDhg^I^nr|WM{{l zVasHJ?-W|nbZ1Ak$rmYSQ;|VAB;;+r?>;1ojN?VmSPx>rkejsE6y@RgT~~?oZZWmj z-Lo)tCO3sbGZ?>S74PE3zCT@xzz8*g(X#2xW2d%l@mW69=Q*#mXZPx$Pdu-#W>tdF zClQc*CW%whrhh|t2>AO35Ni@F(Tu=_FBBZ5|)1Wu`JeAr@$`{w{Pc`f%|f zb@F0Y@QQC^y(_QltO)BG8fx!uVjRTFyaqdrUSW0U?=~sn}a8#6#t2VIgtgVG`FI4@LI!O9FUu*k{k1J%w>!w`53* zo>8h}yE;_d3{?&;&uIP|C@Wg>a@UPVd?^=QWcy#QlXG3b1Itw?sQ7B`9A)bodY*NW_svEh=bxOM)60|=NAF!Qpw~QyqjE}~2gc}cP9@d*cpFu(32>kLRDYIh`W4VL*7hC6Rfquj8 zkQT4-Z71_yryNk?4NeBk@g6o`9}hff1{IUs261OERpJGFev`^fl{~eyGOS^0$s~pl zt8*cP-Wrr~cwHK7x-KD@b~7(s(V4>fWj_(|?V7!LRfZu1&W?iD4l09@>J<|mL@rUR z2`ufIZR+wT zQ@lw8ceHHA79l9V3B$bAW*aPq`<^Np2<9p=PKwx@AT31%4q(5*c&XEx)?84Km7tW5 zWeBSrq}taM5o@1-vo&U?@cN^|AjN$c|9#Kv%juc)lAgdME-#@5XiPUVel8&fBMP=v z3AF4^>mq^BrNXOEYBh2Gm{Liui0r&uR|`KiwbQpmE)e zFalg^J}U8ep4ZAeIhT|{ym;JV&#r~pk~h@Hug|p3UJC@Xeog$( zPtsEy&?!wwkBegmYm16e@aOo&XSW zwGaE>s}TL%4?>^CP)G8cz(&s=S9fxM3k)*nWD7R03#7&2568q(4V{{a3nmk^I;0P{89Izj5-V3_m+EQHu9nXlZqUbmCk<_ish-vH@8J!_n#?Aj zg3u}5CPVo`sytAqB}PdWwusFsuRF1d=El<s2WLk?N|7tdVKiLt1`~7&NUl#w5c?t`* zi+yp{yG_}@>*roL65s`#w9er+HkZ7fpRlGDe(BFHFP0C1^388iKC|*ye)IG@KIy;C z%f9E%g+i;!u3l>0gl;ZC{&|d6QNAyf%?js|BrzHNN&V z7c|JE!1%0po>>5PpQN6pS7%7Vif1r)<_!E4qNV=SNDjwbtedIx4FNe#$FX5F$g-5- zfKQ=QR$n2eFZkVBR68Fp8Cih~#4u6USWH^(A}=!lt1jV+@`Lg0b3QctSohvXs!_9660? zHQ{)wKKuiNJ(D~GpI9<8N;sw1~W$$vIgpVz4%Tgz!0$vvyMS&0XC*^ zcmlO%8dya&YD%SV)nd-0>JE~QJ3?le9Xo8hQ0!9XX-HB? znCSp&5-TNgc@eTQu3G8U1E%ZEjJAI$Om5anqALVIIcj5si=cs9TmGm(iy$*r+WJOj z?L;K>Pi^%TroU6L*`?Tdm`vZm!LLy?W6FxmWFPw(2EQ)VX9&>U7&a3kITgzHmL?oP z!0GV#?@1U8uxjQ60+~T-f)I%_LO?%JfMN>q^gzOoO~#P7mVOJ|B7Z>k9{AX@l}(4t zcnHn!V*AM>a#yBWHV59DtoTiqKJ)Qez1zNrwn0}#80v0c;-J+)uv4*Y)^=wFp=%)k z-h5iKz8-|E!QBuLln-uGN(9kZ$CUCkcgV6rFAno<+h(lOMmBZbCd+DsxikUf2hZPnTMtl+uqBzA zY0U;1{n$QKu>ReOTb8yJy=_}RSLm^;lhO}XbhBnaKZ(IjNx6cMmClyevA_7%t znm_X0qXG>qr~`U#;&dwSqzlnwQ99`D5MW6Tiui|`fK|BBc-}H9FvF-Bo~4r!-hyNZ z5l8g(4>SFZUt`A6!P&(qrtv4OBbOj5a5VSF^P&GcjYP`6HcYK4APh0EEMHu`B8?h$ zjJ+0Efs}%Q=5NwAKwfM7BmCabkfKD05jh1Q3i&Z85-wOl36rj#J0%s82)UDnG@z z7j}RyR#Vxu3dOhGa-~4=ehiP^Oeq{8q{>7p8Y>Zqv~A7GhK7=M+qKv-4NgCv`MfIB zxpF?8owaS=R6D)!ZADDktqS5?S|#Wa%jW9pGGm-CCN6y)>eXl+U$ITzzJK~_d>D`^ z0WcP!bG6_6ls5Uj367levs4oMJ}PTC`Y1{A9hY02-|q6|ZwKhT_4Dq_8r-xDw;F(9 zlPU1x@iM^hfJo6f{Q?yUGruq@6{+xTG&|;uA0GuXV)jJAG@)-JYLtZcctRx&79C5@ zC!6fIYK?f}qmr4?Y2Kq){|b{*wl1(3rHEe(1hdTjX1=^g&o$2az0v?kkA+M9%5lvd z4DbkrsIYq=vOw1E8Et_FTgt#$9dSe#7o2{FdfUp z39kl2G)0yrxlx(V*@lRuh3I84O_lG{Ukd~?fXMzYYvYelMW!@5RUOWJ#D4;a!vHH+ z7$&r6xi4ryhrnbfr`Y1N-biFK< zR7p>F!(K63%l1`FGrxMDPzTtkYK<%^;Kn(d{!imBKk4?v3$IY^aTQzbZ}|3x^FEQPNg`7{2M7r4G%x7>Hy2d!Jh z&}lGjX;tZnzU{eX02H1}20y^g^ZBL=5a2S*Oh@YdBl7r zf&eeSjpXp63q-NwigS_+2bcr~QZ#t1G&0nicaG_PxcC*o>1tuD$O2}vBR)z=;>K{^ zpRD)&qZ%JNW>ZnFqM`qeS|WqV_zyL8jzokNmxrv8QX5;~_D^IpBkMyF+*D)8jY%`V zsK(+Xr&~;}%hLBXw5WaZ5`Ow!UpMj?KM-^c|z@9s) zYJtRMqO-~A=cvudM{MZYh@VK;1N0o~2W=5aq@DVt8id6m-MZcLg9a-Ai>*Jdeh=4C zmV*N)n@NJCl>P!OM~m}Hw__b~JQbPMQW6UeB*a8%<(}P}^wG2P=U3&ihj=;`y@v7{ z5lId&HpP>Emf>S|$@dX85%{0=S%)7@6*7HQN#ka|=8jFO9mmk~GMjF=`+?`6c$+1> zx8r`s+eaQ3eBBj>~8a#uFxZMPx~A`*k0hs(WlGVJD_ z5eb9uWy;QS>W-D$pywNLS1*}xnuZ}Xjd!G6Z{C2iv4h5f6Jp5a?oM@@zw0y7hnEH1 z?EO)tt2kLtAlD&duzfZZYq0qm=ohg%ja8HXPen5=Jv6Kb^+)02nJ9@P;g_=?blhI# z>;9Gp&0`f?TZMy0G;<96*oAXPMKH)A-t-;8uhyxYg;&o3{dg1-&sYpfWz8QS6j z0S$tC)19?qv2lG}n+b1b=Tno$^^(ZSI;;*a^(uC{rKG>8SDByYI3aTy95( zq#AA|{ezoIJac;Ae=n?X@>DUp@&(ZwV7X zNW@X1<$PvanEIAv-W?pz1Fj4diyD3>|M6l;ZYN29$FyyAj3 z_9ue*K+c`)JHn~)!vas6M*Ja#5B{^eDG)$FqB4sPYXLCQ<-ORd*XN;?a&Psc^UHgO zg>AByxK5v<=f|}ujpu6fVs6QXlyU%$Dj+aT%X4CoUDgXy7RMw;&UfnwLVnBUiMU0F zcfd&{{D*;+KAJzCtL1*MMrd;2z1A17#izNovF%Shu9`irPlGv|4;f{1acQN6;oy5$LF2~4t%5E6#x(b-eyai`-%%F6a$<&TM0uJd#tPp_u20- zABo4%j)l&8=o2t>-ulU{*9ZvT`;R=i%s`a^A@7jk4`B=sXe^0kK(YyyTSkU1;^Y(q zm5H5rm2zLw^6ae-)8~NiNu^ zz~Gw^bBsE`g8jPDJ26!)fZGQ(Df4+bwbH+}`@(G~Dv1Q?Ez35b;mxv7FLn+XX7;LN z94R$TR(uxU%~~lK%X_AKgeGihZ~o4|u=9<-_-?DX&)gjFb)Va${La1jeRgoP$;USF zJpl&*XkWCGqUs(ng6Mw7*)OeSW)#1iHF)Ui4Ld3OR(EclVdMWCxA_mBxU>NtB3eK2 zvosf9cy1C7zrvEYZqr@N$P=CJmi!Yr65XE>pr~EcLR!eymtRZr*b2zhl=;DuOds6k z2`ZDvFVLx-e-=_%F!hxvPbl_ytZiT`)Wx@(A8|f3dSpJRsHq6yR{vRS-q*`cIS@{Q zN$488l6AP!eAn2v)j8{f70f+qd}F@)s>s`SyGKA*{zi}9IArb=ZXW%OBOV>Z=m%c8 zO9JpC$Lv?ON8;Ecr3zEz+MGG;jqXCSCp0fH+S{Fy{cqLQGw+(NKh{iu?Ow=fD8`=eY#8r`v!lHUiEGjZ*wS5zkKWzs}b ziuW?jN|VQyp9O!YouGR>{=3Fqr$>yp^Y`Bn^12c+uDSa*auXpv+%-O5L-61ydA?3? zdZ{~7-GX#>@4>(6T}2V;ARu~%2c35jW1_!!m@eYb*a?I`aLIU z`gpGL!iAA!Sye1UTcwO<^TV*A@5d;ZGg4$?6J)xs*=UcLCy!WdqDg#I?=cNxWVuo` z@HGTFiQJ1RO+W*YHh25<++agu5!2GtzcmdK z19_rf3S~F)I6AflDsEz8(Iwou=Kf6xC6<#!A~VDEWn3c2?Ct2CaBzEUUSAQ~2@Q|2 zK8~vYAZI9+rLm2R5rQRH!JOkDz}5ePJ0JNVoqU8;*m&!CYAvAvx)uNf4+H=lkVKR0 ziGIO}wIu0DQ~Z@hVJ}=FFV15TjZL@26~)Z4Nh4Bt(`Ks2k^owu&g?(6zpCbcT+N^y zN#MLMtSx(&qGl4#bN%I%>b;E(`k7$ONKgF2Bzg9>pT3{Npner---32U4NG>lB8Tbc z;d*P0)n4xZ^vl?em`2aE4^B+?8|{}j zn>Sm$b6cwU^+#rI?&91So%Un*jh%PtuiK=84_7M?pzCtGcQ$k%0eJYiO87c3_b>p4 zItde`akBh{OPx+}l3)OJEHDbLvg=_!1he-~I47MBx;7~#9W3uQ5>bc^If$XZ=K}jkaC9V4D*SB-*de9 z`y-SxuJoJE7Zbt@+!%a_jev&VLKnZn4;|vb};Ruua;(RQEKy}G>$n_;P^~%>9U&-GI&4;OoJy>VcV2%*%ZUVq8uNDxKI$yX_ZMWK2K3N z6*AY!NLr;t*4DM5VDiDu|KUNs-c>nsTSn6@AO4&vS#M)z`xj1`(||xa{P38#*-Sp& zwK0)(B@>R035Q~oQKq>q%3s`AIHx;Rr}(9Tu!;<`1ZvhEo$QQMvu%48-;rj*txqCa z)q`!-claqY1SAe(llLTl){T{Ubv~?Zi?SVyfY{h-*MvtyzvE}0jK%(LU!j$MRFYm* zMpp$Hn%-`-R=#xzWugmAlFFDHRHPC`6JB#1szrq*s}|F5-tW+o1mStvi7}K!ook3k zn-N;^So^ClAM?-o@#k@*&Gq#@ck%u0Elri$&l{l-7v?rBZ((_|FOFmq0B{a5wJ-0Z zu;4S1;}cEEf6E3AwfV8EyzV{c5JVB36$i6DR9D`Z`?#8qKW~_|%4jH4CH^bdd8GDHO)z4JI6%i7ZzfrX>mz-u&!=AskV>yn~|4 zSgKfht_o7jYuoGu54kE&i;`0s=?q%=qMaV@Gx4?)i%4D{;zqC|vTIX@$v>S;pq#fdPp}CrfC2?C=#1J^`w9FbBG_b}u012jmJRg9;i6 zn+PvPIYpF`_v1!pB!IbLp)eiS zmE1xZEBGPBYUcaSKNAtyM0#f8j5y^1dLy4>)?xFS@mAYXSWN*a^&3B49^RC z*(;@PaMf4hI$@5;kT}|*B{AFzJt{^C^$oih?NjR z3kti~G{%XT z|D_~#9mdW5<>9$QfbQmVhqjn`mtNE$Y_x?hgcLAsAF|;@P#z=|Se<3TG0zNUXjwKE zn@|BdD*ZQ(eg*(nVC^fIVwOAqe*~PJhDMDM)$t7s98c&@{z5Woode#iJH;oC>2-TA zF~YS)G5(u$@h!(igPY9S46jk150T^*EPgj=FsTg?*RWOAu9A zASP_`JU9r1psevA{BY6wTtxxD?%RQN&-?ETDYE%%jvGhj;@3Mj#k{UBd?~0;V-nBR z9?#kx8!Z4Kdo~&MzxGi?XJH!%=_DDZLIqAqAYw=Z#fEi2JNi6BVx#6+-*m*!>b<9Ub0oU@whoOw-BX^(6xym@ET7O>J5o2wLto#5Gl#(8!^B*!W&V=d?ZW-^M&`x zgpdPzlk86~?klCFmC*(CT%AuTdCDY&Inq8Sa!`iuH2XcZw%#l=tCnmpLyMN*yE%=^ z(l0tFc*iB%edMvt&S7O1!e?{@!xEl2@Yr~#39JL)P%8@};WOcd2OtOm)fyO7i-Dqe zfRNX{^aucqQTz|E5(w~)6KE&GnF)aHr7kBZAr)>Rd#2Gn3ML3v^{XcMcfz!7bl&zd z)I^eyVI4U0u!8u&X?mqa#eYVD%JMSlR%Gj5er!L*vBUx|-xT5&EYp&I5+U-!S7G2t zS#z_-0-97cDtn*y#P3OmQY<-zQS*b4s>n#KTI~uY@y}V_v6&bphu{QF7|b>7!L;w_ z38~qQ^7|Vc!Q55!Tk+=RSH1{@hHuN?>}i2Bof0ppOC0WdCJ4={i_jQq(ys7)wyRou zz*8#sd{0ztQx6*;&Hja>{XBJY2>WXd^Zw4jM~@Iol**JW>-n3I}NZL&76w zyQdCDd+V|0@;R)~IhcB!n2&|-4ID_;oz**rlI22|rHIyNuiu>nXsBd1u1uUvlCw<< zerX1#b5l(<-cD3#S+r2()qe0b&RAS|4o`BxI^cB_UH|MwDDutyM#r+l$)c-^FHdWs z+rm!|s`Gqg;WPI2ezn(qo$C8kKY1gW`2)1~cYXuXW0dGQZKVo?4XZv*y!M-I)Ptq} zfBi*RpBbi@m3+S@ZDg$=;J}UBkOCV=FC32{R=VD?6)QV<%|ty%J!R+_bUi}Tp=ZkY zLdaE4u<~E3dG!qtBR*Fo*z#ihBxT*q45T!r5%vtF2*j+QX-r#jzde<1V&fc^!5cTZ z(B`IS)M0)!9LkbkVXfKXT5pXscS;IT^{k>!YrPI)t#Vo%_367m@+B2|^yy|UuX+%x zqi#V!0f9Tz&g|U1+D_ZYt^YnzmU1!)qD+1?HBt5WfmTkUm39mdFy`1#?eaMeNoQ{2 zWGyw1G{nzB3_3-&&^}(p)@Qi8Y=5jNXv>7&`)r?gmB`?JJ)4NUg(&#!1emySLM&jTfcf&DFfZu-^lTLrY^){4;PzSr_ZUAibHbGk z?y1I1+rW;Ld%3x~!at4#weLd+jb!7g(9P++iH096LM@l3%)nm=2(TpkMLwD>gnbkh zwzfx4&f~}UhN&x$HaON8!s1wLv^BV;hWu>}cE6Xyt8u=C<#uyOCM~cta&xR^3d9~K zTy#B)yB$0C`NbU6Z2m=D_>^Gv9q1?C{wLddF z23x|#lL1orD7iHE&$S347~zt6ZjpxfJNwGA!4s8lOLBIpckiG4Pnw{ovry>VfYC|@ z%JcoUR!lJ3HJKu{M|K7nBr^r*gX}F8sD=auP}$HhJoK>*o}yeWyP4igNE=U9YLzs% z@R!7?*MzM1m05AY)M_J*XHj&W$sudUMJp>+d}Lv11^j647B)UC=B3zyVYteOL96^D z>@y)Zm5|&q9wH{L#lVa;_9mzCzgyo|roT5!o)hTp@xa2RNZ`(QDS<3KeQ8%OzuSjH z8)jM%Q`i}9@3pS{Nbfm2^NKW9GWETvbR;i!p9PnHjOxsWiVy(UwMpsDv(bO=M5XDPPH$y)pk~Ag1Sp#tq^d#U&1(XJv^Memwn?MU+iC( zD$ENyRbBlIo%58DoH!2lZ-&!i1%p+cj@#j^U16~5$*9_m=%g3v{i=Ktg7FVt&K|mo zw%K?DUMa^1(X4!O!V(uNyIqH$!d z0E19%rB?<-=?@#5e1v4$cMDMD;t~Ue%L*-(oLBnV3DGfLlVovEX_E#UI z+yf@VPtc_5jADZ52rbXwummO@O~YD_>so*M2PT?QRK#SuD6#^;(&;h(FHBQ+nWbPzEc;7Q0f*_5A<^fAsEA~E zi%`*HrR4@}$0R8t;3ARZWwp$~!xRJ-27uPjEkccg4F+#jE{MsWZ zbchhCjP+Zj-cC|zE%I|uW2^AIk!e3o(e4dZ+m61*P&%PiwavE$uKT0q za>Ojp`ohIsT7$fPYGtX%x!~#8DKso6`NT6ErEETJ1A|6|)KTP-4bH39$7$5;Qw@vZ zO@mdr0kld0fNtYXoP;TTFRGL9+kH*Tg{4X~06Yyjs9(E?Pw1f|YHa4UK)+tcs!NNo zi-YiYYd^wn|+fo_tN%(1^D;g!NFJ!9Dz`37CerN;}=M3nlzk4PO;Y`$x^2U3kw5+oE# z$>lM|4JOH#B2S;e=8Rw8wU!s>ufgCID)+^WL>!HeK{&+vEc&L8a-tzxY<{&_t(t2c znZ?tdMpCvwU%j+2FhPq^>W-JDOFfdlIJv;}puOHWfH05>uhvF2JUt)2*-IASf@2si z`CDE0eN>9#Xp-!OqMa$4-@S0W=!ZC>_k;8CPf8#F0CO{QonI+D9*Gcw$)&o?^)p}$ zM^rm)^~#6rNvpz4>#@?pU~%pK{NlPO6CB6H#FU&ycT3hE3HQcWvgH5HrHf`uXR@59 zTyWk7g!HsH>tD30!A{2qFbCkb;Xs;=%Y|vFQ2;64PzdwRw6HLIRnEv-x@n##sb|#S7{*pJH0}5QSUL-~DA;Zb4={9hOC#MSIdmi4-Ho)A z)X*W_-KlhUcQ?}ABBdbA8Q<^xhJEcP_Fn5=VaqhP)t>F69$h=?W64CHi_U2IP}>HJ z+)A!B-d^s^0vvIr6O*Cd82<(d03b9;U7jpoi-b7?!pQam>$5O&vFo8?_bEflvwEx8 zLo_tKqZeXFvH2pC;^7OP7T#;@Z!DXm8k+}A@^&V5c%<01S(Rmjr$h6J(LOh#`FsY~ z17eib>+oY&Hnm>}8BpkP6B5shpm3*bj8C_H_OT3lR%2UpoCB1sujumJoWB1Zbf*OD#%+FwxTyDUX)FA0^#N<}N37iE*i*7YrvkH#FOPxSGkwhTm(AE22(SUjpe4(lW) zEU55$E(es_zF^!0XTPgjr5*;I63*0*M;cyK)L*rpyL&IAzO(7EW&LYaC|Cak%863q zw&yqVRi-_b#$C^aw(7iXKQvCrG*T(Qkt7XoP{$~?;;fXY93;Az^QllC3^+0(E{Q*2 zq{0Toc*=a1>CU~j_g{r*%rvCY?#jX2|NX4c+=^(*R>_D%Ii&X!$P6{Q)mg=DI^{$n z%em58u4N&N(F&$1TzeBH(cU*C1mu3v?$rpZ{C@59+|k=nQRITcRxMwDj~bN#Q!xST zyxxr07W9j(j?m2N!z~s71O?G$RhQzz7~}d|YG}@pdI^Z~x_Y5j)mb4wt}-_&wB5r} z3uV@=F5fq*rWkjsW3d-wuwqW5a!h#KZW|0u@&&$H4_KuM{Ozdqx^@&@{gFleG6&iN z$8nVv+^4m_@@KFft(RHnT(m^5gVyu1XKyyMvHk=y8{I#u#_{Km0FW}FL~G~EK`hgxogfx)SS`pTgnhlUWwdrl;&N$ez#IiyA6BVIyZ-vk*ulD|wDzrN#)`A4zwt3|ig z+BP9+TT&X9Tj9tpiyYOv^p4+Uq{lj@&*qi!3-MkS3!jvZBaG~<+w}0?=Z_PjYf&R& zCHKK<0RZBHm+q5%A;mGAdm!`W9#lJhHND&~&jDE`r@ddITKKO!=U;?ay;nPJ2<{U? z67kl(16nODwsXdaLNf~ExL{dRaVa(NiQ$8!OZ6DSCNt2?R*FOR8}xwOjFAR~K|3Dd z8D$gQn|_liNy?arJdu2Yoh);_sC+z?_6wlOImVKtQTohZJfpl!$r;7#RG8%Y=cCx} zdqeww6`RDdbAp=+Eme7V+L9Yq=MIJYLpsS$Bw1S!0Duxh z=ZnW}Di6*WS^Y^`Cu_YSLy(;4UM$}7&fB@zhr8le-S4X|4>#WsRx6cu07OS<&8&|% zatK(lFnoP<<$a7}=!Ys;!I`H>yji6jZDv*l8Xq+jEbcoSCjS)(DmhQo`PV^XY=A5y zBy%|258gU889oesFlYDJXuu~cJ+F6%zcdxDQ3GyemDJv`EhpyIp6kxntu*VRWLhU{ zciTQXuGn@!J~6D@owX(pE^RhJQ2<|Egbn&f*lQd%+GcL$@ScZTV_k4{{Dxb5b1kl0 zerF4e&ba0-dawR26Km#vsy#7i9o-gjfl_%J-cYhPfNCX@nJ3Kn0G1y#wJjl&hxM=e>AK#z;}$Q%vN3n$h0 zlLu=JOFt%jRJ@Bjvkw?)XDWdfCZ^TpFD3VZlEu`4Y^m4u=VBQd;Wk1*l)k}(%w;X% zaDFSIUg~u3lpv-TO|#}ZnRVLnV0~1p+HF{;gLP(9N|g$Fsty3%#F>s;7uuASuh zIF~aWeLD)*`yve464iCjSY9EyqKmEiRN<(G43ThDpN24!0x_VEtU7pnw=Gj70DwaV z16W#jy8QXn+%#-E3jWXu_=1`%b7nyQ#fTctbJgO2Iy!H>Y|J;Gha843$L#j^W&!6&B$D zu>eKxToMGqrlygF;@TQS?yC}$L4?1NE;mk9VH|l7W7}k)5}Ss5>P15f#&BbBhRsLl zca>XRb@+oW&^47`2fN4OJJ}CTt@?J9s0d~UZ09>-VTJE>rq|}H8KG*g&0!<&@Zd2s?A^dhTj{kh^THgtV58`j~ysdh@#`jJe%+Gh72qo2pA zz4n=%X%LM|E2{*XZdW>yBZn#r%i!TuM(7Wm50A2l4h&owi(HoR|M1cr(A0A>&uHa~ zCdq#wsYM%LWVlkasvpZH*vC3wV>W7 z2lgErkjM*%h}XilBIpa+kSy0$g`JPluYDTJ+`rmqX2-UWb>p|j(EM+qnzvn{w9ZtSWurIlJUz6zk)(2Qzpsq?#p)UI~-hk+6w z=8+vPagu00u-VqWj-G8r&-bFylSbH`FtW^^Xs7959_bu&SM#o(myk-TCH8TR=03QX zwfjp)bkCGJo2eZHW;dn`ko|Fr8#Wt3f(*T9A7V9jr6X_G_|Wd?@=oFOjQ9TWsJYZ_ z%^odjwDKjF7xTjhS$TenD4C<*>pvQXC;#F=e!B$)nKdCHMPL=)bh!fh&tbFCX+}d1 zbhA1|`I}`hs#=-$48M7J2r-}D`Tp^OILnJ&=cY^zNJd(j4A!?#6B!CLeLBHFfd2hY z1M3=~X49i{0KN@hS-6xbmuETMh?el*!DJZS!P0P80t0tUAeR=U+*~q%kq0l!%#@Of z8x5CpFXT3t`2gJ`bO0YIqmKar5rG6?Czpx{FOH0)#Py5-Yl=~2RFY$dOsWzdqcXcv zW0ptI#UVfp*HOq=guzj4^(Ts5TJVVpQxze2<+CyT(y|7A6yK~vv1=}ftCEWVgtPiu zz}4csKg%x9EN}mdL5E^B^**K{O|<}36%U>F&@qm4-Jil!y;6hC+S_P3INWRl+gulajEc*iDT&bjia@DP7cfqW3mN^e zBZSzKd4LItx5cI&lgycBLz&u(q8txyZGpZM?0~)Da|k<2>5t#dx}VVbCq(3AWXi18 z@_Jv4AYeSGH&zx5%`)YqpwXRN3w#a~BcXeGxTJ9rD~IgPL+(CaKr9mMWDOXZojNB~ zm@&@|L0W`;BU&9TQUJC)PV?DpV#h1qqH2xfU|x*|u3~cz;eUte4ggusO6Sc*3Sg}? z5j}_oz?b(k=#B_tn1`|V4hH}S-AT#tTTZ5s+__KSTW7OfF($P27XzZg4vA{Maq1N+ zGGpkOUh6k<%H#_*k(_^?ZzaB4YgyraLcS!vNw0GtSR3ZPwYw;<`_f9wBpZP0ddFAU zX(71Ua@!T?w`d~tGGZn^!rBFSKqc%peU;g+?bYoVQmt(B;?He>W0hM?|Vmi zqFc}KGXyNFSQ8DJi{7OqHLz8neP;@jK!P29`TMx8YW(1u9zEv$JO8$AxQB8Cgb8`e zkU|loysu_VSBEiFH9t- z#PW`aZU1^IDgvH0d>jUAd!rj-{>AU%d@jP^`L(wAkDBlN;Emd(N_+_%&=Xd%_o@Rv z(vie;mjxxOKd%M}F<-LFQnkd$FU`WeD?RD)yE@-HY#Pv7?ieW>dL*(2iCc@0HtOdn zVta<-jKo5&aP%VotExh|j6u0hDO;8POM%pcygxQKjvv*32Ev4I4@`{yc);ULifWhy zoBt(`Nq-z)T(L7YcGGPX7ZwfdZRC+?-pUrm7cT~k6*AWw%!u@Sl5ger`i(z~I7=2C z37c;G$iS-=(ERdO;}eM;U1SNy$@`BIBF<&ta{np^f!5V>3xc|Xe}C0k0QmNQ!cXo3 zeFbECXq1B;bcZruaTk2Xz*z^Zpl=0_pkREuT{fdWw4;CAbOyD@Q2qcl&-cj}1HASq z#c9B%C|L|8QLKIlz?Tjj-B7QuYLf)|Ku0dk9K8ZP6k0j-+w^bt*d$3T_cI<0tHNi= zEfMd0rt{4mzjusyv*Pv0IxOjr&+1F6IS>e;8E;yVdk4ZLFOXw!qPl1CM3kXZaL04K zYnZ_oah*?G7!Y;CoICODod}~fC;;FjZS}mk9CP%cebx+xo0WF;{D3%qe%3J~S<0dX z`PRJy*||dc3VD48DFtiPbKz}Xwe8dQ?Y{LL5QWl>@zCQtvf+s0!^ku&(`eB8ST4<6 zYQLi=!l$yZ{XF)J$Fi`PlSbEs`N3{%uhdm8KJJ^U6*xl`c7nBeLrrehU-@#Tnf3!t zTPY)H&Os~|L#ZqZ$p$$QcYP?W8>)1qc|v5sCQ!*Wo8(a4h+LPAy}QL#p6BcXkBU~b zqh8cB*^=^f0t|}4b}yv25DpoHb6{w;8K%EJjqc}b{{5Tgl2*9NnE}7Tugg<=9>e%D zKUd}S*0<dHmGOPxvT*dh~F`Znh%%@fL=*l6i7L!LO>OfGDPgrH?giDBNwWVh-Y33{Ps9av}7A3i|ibhGr9I8~(TMWHGg` z1xmo+O#jb2xC8@@zC{CuS;kS9Efv466{}W?Gwv_gSaP*9>m?+U(&^f4tymGV&7u_0 ziKxbg5_3jlNO2s$msv}g8S88Kd`3lwKxkv?XjjKue7lN833>pbv?x!yKtOc@e-VzN z3w{poMJlIW$trkwyx#kH*k7`%H)G;kDu!Vrd~RY$R#L>(Z$4Yw8Epb;-Z!Ld8g*F? zcx)pPGFpa4qP6Go7WGvYF%U6e9Vb#bGag0Qn%awDVNKYbHY(SA5h_mo5a#E7llof@ZjNd*{{6GzpPS8 zO)7m>N;|WPAQRFqh}2Ui?KR)9DbQPNGroMWTLS>7qA)VEZV$uR>{ztC^o7O~(`2I6 zPiyQLi>Hr01X?(4t|wo0Jd543N|KDSEs3xgr)jsNWJ!_1iNG#XW)gbxTtVKZ!fS+3 zxaECdK#8h9)*>0CbC@jYZqzNLXcVSc;7w1X@$)3?{uK!7ciAxgZ|=t*bRJDqLxp|B z4V|33R6N3+d02Llg}G%_gRQ8ehle%fGI?q~@vSMAb6u-Hc9aPjFwooeIBqO2a5n0p zS$$)Y(15e88ptS;0yDg

KX(jXPxrY(r|mORi4eY94cpUMcENAvVtx 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 z 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

|fKgwhgw& z^jOt8Tkbi_gqGCh?r5nBxu3l**)CJYu}tN6RA^?G&Xu;dKt~@rTTM+&-s85*nN1Ue zVV0vOl1E$pW6gV}7Tb{Ix<(WQvG24&Jr5zJ{e);4x$nIkASPvv&U9TAB?8&yc)WJ3 zLKCg6v0QS(ZeTsuKQD-K;|4M67iDCa65{Qdgs!hbwv(_!a?i9A!wIh4@lD=F)_V{$ z^~;Rf3pf)oDl3frOyi1J(gkbK6L!F5j5kD{TTfq6 zXJ)1>63DHBULmjjJ=uw~V$K6Ro+Yj4-o&YncGB#6s!F}-cjE7botT2muJtt6DbU0+MGQJRsC)UiRjJW1AuFW5Qj1jZSUyKSo4t%%#v(~KltkYM(t%!GUCwz zxcC5{zfPs*E4|g`4(5vEx#oJ%PR=tY_NJY!b+pq`S4*d#gkZ=<-x3&()AyRUWA~|19Sti;@+FWjS zbJZ8Tpj|K8O0nxD#bcsAedtVz$)tmMU(O&oL-A2l>B}0JlNeDYUZOdEhEvC*#V_$~ zL|GG+u^C;_qIY{P(@m>)qbrqrcdnAB&WUO@y0E3ve$^myL1>kg_e*9sLHZHq;Q#riT^!8jD=N@NzV-@aq=0=IH`c*8jT)tekt79#s47#Q>s z%1Rbmq2!doR%{r&UGl11NdH_fDvlMEKHf9F+qkUh`?u88Anu^mZJZQ3`z1gVccjWB|U*OG;gJrK$=TYYhq%jKhi&Y>;H9 z;z^6JEL0%a+QTu>f&`JAQWpQ)dv*eV%>OAb87{)7AnK>_3S|%^V@lz2fX@u!gJU-j zcMJua9--Rjt!*6NXxFxsSm}>sm3PFP@M_w!MPPsC*SVtM=#QG_-Jy{}V;R8Ka+fft zR7l;DZ&_6Nw~wRpKyabUcg8lPT?L}1SGE)KS-@8HM2}3cL5>2KP~sIU01wk{1|_78 ze^xT6!;${hu4vRI?5Dxnx4#<@4aoR8bNH2#RNG7XE_y5QA(PgB5#rZf?z{SnN#JXJ z#Ay4>@SJ~X%4zGip#HJxaqp##Lxr!q6Db+bZpFj9k<;r{&1M_@XRp5K*J~e-*daou zEjO1}fgVqxreCGZUR`nHVtZ&&67sSn>7>AP#^eWVL`AYek((eiY&BU8N+>e~@KuYq znu-T`8omLCB#9_Jo`avWq$>hMgxuIA)V!-et!R1Oxxmq2Hl6wSSVuVcm`=8nvR68G z!yY;PXx#EC4OyKw!L9ks)7zsXOF2>&SjgJ=JF0zuBtteh72*< zN~M_bxB@eJ$OVKxmC6xaZY|T*s6rAd=VY<(uba0()2mjf%fX7Pr8RG@)Qg~E2qJN2He zh{T>&n^necsJ>a8E_fofp4}lBWe4MJUaJe(?u=Qrw5<7{;f(+ z`bj)IBO~pP=cR;r1Y_`~=pul_?Uo|aYH$vrVklgj$ z$iH&;SzSIHp8DUd_#@xXHS}D1wD35c?>4}fTUe&PAP!GP$K&caq!XqZY;}w4RC-wZ zSXKAczu+{Ituye?Ggg57SIA_?;ZH~jRiRl^uz~xW&B(?mv{pQ|TO*&Agjt_Kf?a_) zxXKcXB=xc0Sz3sdi<7wJd=AfVlQTNC8*@poTCp`quBrRn)QOdIp4>u&pk09^Su58c zWdgcB%iNy+JC9WbdU9(NDik#R#(@Te=9nC3^CO*pXgXqfBx|(uH#W(w(^%ekl50Ss zV%-IcWEyLm3!R44P?>i!9yqb-99n&&dM>uFlcUsKCf;_H{R9%&aWH>PEY%K(4lR2 zy*E1P{V07W-f}a{xvpZ0^f zND2J1Ewq+*b?k)JdhQuFW?j+yJz*sP%7aQyb;mO(65dRP2T@r&!Yu_>8(Rud4htMW zDCi{*n>jJx3y#0e_>K?L9HHQ>z9XSP8Zy6v6~G6ZhWL z_jd2T9EFsm6opL8&&fq0cjMm16&Y29&g8NmmK2bwl8J{kuqT;Z5EbG}U5Rr7)iHyd zup7V&3*@2=75%K!@+twan+S=4GC?G@$Z{tQ`ZgePN>&sBOa3iQ#0B0|4Va8kPDPfc zLa2N+^QVQ$$%!+YqL8<=q^UOElfduTvQ1cZ!txvCq5dMUhds*tnCCV;5!)no0X@~u z_1?mgK3ckvgN6pW%P%zr1I5s~HxA-WW3+c#BBqBq>%a`9JXzwT_;5An~&y_Yj8!Oa)Dp_pRB(Wr$vQeTHD7uxH&Vou>hGn9>3u8$Mp9WvXp9fY_rAP zGBLKG5GVvtjEr<3wuGpPBt1(WyHwG|b5T=Rn9O_`hYy$gW7MBNxcD8{SBCm| z7`vObG`=j&8?&-|6KE^<=7-Ed%LrI7-4AZZU?$Hd}V*man-4yLQZ>mB>6U6zv$ zOX&{&_M`e5IH5_TH${dL6p;m|Jn1Y{18+Igs&YBf{&%tXhYb3!o~(8fZILW#3X(s# z;rS~(mIpGn1CdjtS#4y=E2pUW<*um(qWdVpb012kw&@>x71tkrHUkrDa4cj+0=_{% zflLT=0djFu-@6groxfzmz`-()VL>}1&K6?HR&n?bz~t|2o~`wp#)B&_c6;dx_uM;7u=cx1?U$qWJpV z(r-6w7{zic>)+mPTkeOV>fK@V5HtFmyM1Jq z9rp98Q_RV)%y}q&TS`jDCLd>7`Fh5(ZJK!*T{d%(Xl1Xej^JAAOQ%MvfIP2ys=@}K zqpSgjw-{^$=c$D>@4Ta97t`v0hF?FtC#5KnLkg8~~4r#s*EvaUC~7 zs4&>>CJKdOuE;XjKjb*1f*ngh%*G}%8(K&q8x}M)$TH#GI99NKV4TrT#ewjNY5JE8 zi}7y~M6-F`nD9wkif=6AloOwT!^UKQ^N{{gXqb37f}~%HDa@Y$_;aHq;3qzWcnKBQoxN;q_>|3*I6)q%OQbxE^g zN|@2fkCLFwEm_tjO6P8S4>D5xT3kUhhQwo$&n=#6m!WlYv+wk~#`8({lrs+7ttIpy zR%!Q6XU;Cc+Q-w!P0Oi&PQEYxM;viC05DK6ZcajoGZ`!vFz^Wz2QK1Msh3Vnpn{Yj z+n?%5R&fCs6jVNzOa>BYmr&M(!NIviV`T)nYAPUl+_Uk1M!>)TLOLFsv?P8TTH((# z(_q9R(UI|}Lg>3-`IMJNcxbFO{NRfj;ck)?cT{<DUVQw3nWox_O|Co5s0SHpI-`?E|S=QVycMx{(Rg#yj6+1y?lJ^?HxYvetmws>)Tsn zI!Ag}Mz*J-MlJ^c+{sLVY2swG_|`JW8ZgtX1jxo5A_`D31n8ZUnIS`>@dY+v`>fF> z-jM_N@wT$zBHjW0w6QSr%2=!lSO6duR7K_&IQR^zI+LHy77>|=r9^oBO&CC)%y1%e z_3)H0BulA^EsnBT{RFP4L9#GmDJ*IhSOH79zuec{&QUnnNGV9v3Y9t2R%}_h((d_D z%_NkqL5u0^xH}8RGIx|dJCc3hkSnr#(1SN_PyUupjVOe$OmS$yI@)bNxz_Aa2UeBWNj?aT~)> zDr041EIqqzFu@aWE><#L*WcQOmp1nuf}j~Bncq3Mphsp zoquKnKw}g<4sW;7GJKVQ!Zw!V;9?O-9$3fc5CTe=BO>ZJZC+S}Wmwry*>0Ek;rQ0+6O1 znml&Iqy$$RrKzP1o5KuUb=(NM>Au^~i4)h}JBH`g+tpj7G;Vn&My|W|wUs{vf6O+y zms?6Id|p1zADpZ4Y?p+!oE^Q)`c^`J*OrMcGDd|6uhaj42p(TXL7ttXpzjwQ zJ#K%h8vJ}tmw2aXwt@+*6iUU+J7Q8vj4gxV&7ou-`U*mNL-cUb5JKx=6`SI@G_YA> z;4Pa74A@itiIuR)ArY)pGFtvVOz#$+N>aF6)ojKL)JFJx&{B2#cVihbeK+{pZuJV< z)D(#(NlCY4Av#{Z+~(t@Ut$aZjJI5MGBJkFN9xSI5`a?af#iGe{#CNFU$lfoT`T!M zKWJ{wH9b+c-KgE5&sdH62NSXkE_9G~9KQdH?TDSRs-ee}|3i=Hp3SQ;vSFR$aAKyFDd-sIl#~mp#Bne`tD;p&{IiqZPbqQ_ZJqCm_SBY`#i)`FUr7$d`(7n53Uw?#Z3XGLiJNT67=^ zKCoq~-Efj@n|mv3FiPUN6`359`H0;$H$TX-9szb!)Gu{Lhcr0;i{chOCiD~3@fMxC z`e&?{no^Z}*%~Sgvy#s5AQa2=B!|K>U!`=5PIT*=>XoKRSz>Jbl&cuYs;;+d+|j6_ z(0nQXUsrre@G#BI*~#+l`*IDOJCUDByvAv6Lg5$AR}z`YX$ts>0&WD!OOT)v*}@~` zlMx4}PGpwM9{HN-$i+#uKQ&sHBOm17spRTFD4Ex-5RYpHRu= zI1&ZH(3bH?0%6+WB=}Mcf3goDj?-QuiWKCkGM#jkF#=0m-KJxXZsO1n&P20SwhdK% ztq<|IF_Kfdn4mpRE&lcE(Eo{jA*Tw2WD3t{9fR0e1F=U`3G~&w!p8$^aM*%UvdnRd zb7wOCp5Dwwjcv@mKkkzM{(kXyfxB`RF5cnkZtdppYh071(2sHIGgebb{!!j5*^O)Y z@jWUqoqzh1ecH_eqBfe?cKVKL4R92P-rYWU0$WU(S~TBclIKb(35Iu9i$N};nWlI+ z^ijAm$mZ(3tFqB^Gw8!EUYB0ikWMLqDMd|5>ZVq+rVW{Gk7sgiax$aS)8A-hS+%hn`tLB<8r=Is_~l6`gaCgTQ)zx7aj|_wlt2{BVVkeKnXJwT*-j471-ur;Gy3e5g5q82x&gcZQxvfkK0q{ zcakN@BXgN%l+Wn^PHJ#-5$D9)t}Nzo*j4D?mD84&^yIzK`kQgEmx5CdQ470wI#?!c zL}JcxE>ft=KX{N!8)%mGchRIMLIeGtRJ2%${MC`y_pxQBEVrJFvEi&a>d}|3MMf=k zi+62EOIZ*yc&Z4}Tl5&@5DU^}j@tCL9j2}h%eGKszThpn$P*!O5}RQ~cJ z35{q8OHqF12)JiyQ%>|pE3~w}?ENS^^4wct+*u`wyIST94DyDtWn~XY;e@{Ka@yE; z!60fCozu1?aYfH7Wg8+BWeS2%oGI8U@kI&MLLte-zbsJZxxE}}jyq%n?d6Qn1aTzs zih6FRs%4SQrDA0^>)3tHsCR(0rq#*n>?vcNF3-+7p7ter!p5A8$6Fj657!!hPHWk( zWx~^f;e92g|#{g`Ex#!)Z# zmy5EyJjszKVYU%7Mc$By!@Kq8-RY&?cJE!>@DLL5w%;bRyw;AeQs*-1{IMvyr+@}k zL(;7NmRMs=tV8Vksge4nj6|f$7f9cWS3Ti@C!|B zmPykEUPNQ1^FS?Gr$b~?poQEd#)qtqRLwpT3*Q{ z%nCKA6`@j`w0ZtNZr4QY`uY{R2M!m{YfL?cZq6~GEtxC~MW2>tN@$~7-nQ_D95M2~ zxi^lzs;J2*7H^WArQ-F@Cc54cMyJ~^|Eli+RQM zi;XK&>d?PBn+`~tg%kwz%lwD9T>wzdK=TDbd_7toQYsF0!l;3iidiwqAf;kZ8kxCj zf~;h>A!{KXo&6$7do@umR{<9($LMk>g~DU#_|zXHU7@*6rt7mhx2paz&ktcrKCxG& zvRK07`Hg7OoB1C?CQsSlBg_z?Zo3g=X`+9lq&}N=U(3 zw?Dzz?@&L1*H!ITB$V|q0p}KfzfC_McRv;ql`sy1A`ityXM*K0<^gk}wq`eQ8Yz+p zFG_tks!Knl=XV*QQMzktEY6$N_BCtrDan#rYyIc02#c&dcXhn?2A42ZH<~^t~u8up6k%R#As`E zp`#-RIO6&5_DRU1IeMzAY*RCw9|q4>nBQtltku=#LhGaz$5&f#-(SWaDQ0a=HbY9? z2tA5y6*+>pjWF6MQ})u|L|mh_!!SC@myl9~MAbAnLJE%O2wuv>E-#0?%^OC+>jt*& z-P@qQQVtE_BGtKKFDqjv@>E3)ptG&Zme(n=UtVtW(n*Zr=7>?EG#SqIisnw=E9mJY zJ-taXO;8kMuJ(R8xb9V#rmQmvT)?Lnl-H%gQ|jFa$tD z=p3&|isy*^8wa%~q@%Vui9u>qxugy;Xw>r|1e^Cy>`ds|LF6^Truk!q$O!ZTN8J0j72`tNyFFQxGyO19cx{p|@NFxHzDsLdg#pYsNHBV#8+b7f#&j zF}+j;9ZaOj)8%S^uS(om8o)=rDHfL%z=A&KZt200f;)C7ynlbe!7gjb@jJ2uz>*c6 zUSw`uZAG}n@NR{ifV?G6dQK72NIHjxd_o}SJ4`Ss=Zj^$|j7I^G={e?V_1BqJrI}}=bPJIWhFuJrr;(Dh{dOiu1dGaig%Fbr}-Y<=P4 z*D1>g0zJn_7&VUK6FW(urAJ@(5y+aR6=&L^mqqnxvYop$+9xy>d8dE7 z1Feq0{KfNVvzn_&ASfwBr8dd0Coq@-Q+Nz#0%d}Dv5EbxDM{(nAw+#x-3uyqtwl$S zGbOifg8)QID0K47R%e#)4zW3x`ub9GN?k18$a%~h=)Npg+AFD*W3fDp$+CmBB*8~8 zW`rch6cOrvG!_>YG&p6IadqvHfRWqH+{%rb_J+(b0w(}JU$D(~`?TZ8tT-%2NU{uP zS_%vlT0103wM;D-hN7TsBwS{fIW7dUe~ImJZ?hs7Pb3}yUHc%y1Qc75UoxCxj?$); z$4C{;3ZJ-I*au2rw;i)r9qo?|e+Mx&S(|#21;nV+B9E2?pt^t~&%N>>F8OsE9j^0A>{zSTLc;R~#1-+*==a zc6;`fS2uATR&fZg|D?L^2=}%KibN&>T>EO|6w&=LsSZh zeR)8`qa{yydh5gK_n83SaF#V}QQbD*e$ly8NGu9h5a?ujV6aJ52HK4ro#ctHts9wB z=UR2?n5*l{v2KZB=+b#h7Y35@OlKDc8!dO!nqlxOIB&Q0D9tiP9W~!{!l75EiBW_% z=i77OfRPFl2qP|}clIV(5Xw@D z(&qVbB&0>b5JqAUTkGeL@Qa_M3Mi=l=!DmoHz(u$*@p!~M?6LEm`M1@;g3We}A-J+2tr9HOQ#1ijgzU^Y?T#Pqh*9+zZk0Su}}kl(rxfuJ4+6X7I7s zM@Y8{YaxM7E*2(-ME_b9aAG@I`(o{8OCV!k;y{tLU_)#yTvgIU2Vp6cMQ!yasgyuo zY@L*r=$&PNH*$&uTW;jwLI5+2MWRoSDAI##q=}mrb0^BZzeL{;FBTT2RQAn(-xyJG zf+bWi4p$u-MlcG8QR?!X%fDQzbQPW&xf+Q}CGjvt-P66@VK98{5P^&&EV;Pozeg`| zV0bwau4zGy&a|?f!!=i6>sfpakEF_pqTyfr_Q30Qg3jv@R3wv6+DXVIfi5D zrfpq93U&>-x4B`8n8k;U;U=;>SgyLe->WMhuix*ZNHJFSmK3YOoZC9DCU(p7w&N+? zJY|cdKL7dd6BD;aH0k_vk*zE3li%;@!kqcHs5yZ5-({4kwKLZwLI+(=A|DQkEZwha zlw3Av5J*8fA+j*g!o~*>Ci3W2yjrs?13&EAWuqQI_4#_TPwK2OGMzMWsE&Ucv%6?) zQfrke6%t!^ZRtHUy-E^3xK62Gx;AZzix83&`ptB+r_v?QR9u=zMK<%h+N~>x8|RH1 z&j{=Cs z{$L=$KonQI4jm#=@a&ESnJ-fMXUn+Xjb(;yC12*dk7BWZkv_DnXS|=x?7UXh_M`*v zU2O&+-qDqxz2Cz|OJiM|mSi_`<6@JK{Pk`GqJnv5dE71W9%*W7v?LJi&ZlcUX1v?y zVG%nUG4K8;l1oea$3m0u`_BlET7~`=6mpVbqDtN`hAh5k6_froOdOdQsH{%Z-azD> zzMO))qcG1yIVdlvFiO<9Qg7={8oJ0#4?2DR>#&kE?$#d{^|7v6El5-d~ecGbL&5Fbw2_k9*BaT zKEDQmaxa8l)C5yb0L$#Xw3KC32tgp?TR;(nqRS{<*byRRG`iFV+o;@{(kl9csdS{M zZ$CC9E#Wu2If=DaN3)8pk)xV@8{3rM4LvtXf|{gJfrAVex7Drf=j=TF^!;Nu8dAS@ zX{xkF_1wwN0IKx)56?&+`F6W zW=$iiAchE=35mfda8&nECPRKqJUpM(~nJW6d8Ok_XQ9QF%J; zcx5H-8$(jq-OrSgYEO?WO7lcX1VxajrR|{fP20t!1i`}PJ~o5@(!WPX-mPS=`E=T< z%+H|rW_SN%esL}Ra99g-_Rck?CKY8J=bP`dNR?MSru!wX+!oQ7H*yF&%hXpgD3sL^ z+P3-5Fe_5Cz?gY_L-0Onk^Cx1kW52OVxRhjE|5)B*7Fdx@g4QByhxl5gwZ9L6Dm=NAuiF} zwHiCu;JPV&f=O{+-i=zI0bsBQ+#GfHzj7BtOBMRnYM4gf9?%AZOJWl?hhSAd+D+5N zc5+g#TdQVz_}JVT@^|4#6{{&&v=aN=lgeRvb$NLz6?wN*s%Rdj0@hKLnHreLd0l45 zrgJ-^(79X;_pXpSo>M*JKdW`IP595vRCV8+>U=!Khg9CF@H`}0OEdDc8jOFw-sv`6 z=!~Idu8-`JCe_>#v$WlTO;;!|YXl|ujylssQGw3JEJ>t&a?Y)4BnS7Usc6zcWi#nR$RophQtF=?5Y zNUuA?X8!AJbIk}}9KFr65JL4GXti535VaRGaM~IRr)VB)}@;8KN3VS zc>um0%|aWsFPQ#d`(hE1s(JY?8v<>E5(oJP%`hE53e&n7rXC?VG(Nva((vIaR847J zi-@+WPJA9e8Vv!7wz9vM=YXA+#c9)piHb%-L1FKzh7|S zn=v&psFK9Ol6KvGxKL=`36c*=6$C*vPe_FJ;9+6TlWwS!99&Fol0073#C(C`e$C)M zH|vUK7w_hsF77-GO#PnqHcSJR-}y#6+B^C>IznJ?SreKo#<2Q%Y7lp!q)#6FB))n5 zPY;g^F&#A!Cui|QcAJf?G$m^ZXJeeQw0}~}C?QwBn-_n{7c*ze4RZ`Sj@72e|AR`D zlCm+IlW$(XuiIxm5^;F_lZF1^BRs!|t@1gd)}_3T*EnqNmR`rnPOxfcKvdDzWAl@W zqPwQ&{2FEy%QXKXox?3*n_KB4s7`PFsganfIk9wP#KGLiB;yry2Pz1(ZdP?CN{7kA z>>DoIi(WpYRyYz8!ZvPlj{MKmJn`bwLIT+sWtB*KHHG%GS59kH&%f0jEs^&uXMlI< z;SUge6xcL6fY=aD;WOznb=LAlF8mHZWf0sJ1`%^?3P-F%oxr>ewVo$iU_^ocmjURZ zVBnaP*d+OGpC4f>1^)cQJ zODX>7XjEpckA@QYa(4TLIBwSNzxnC`cw=e+6!GAB$6NvDtD!z6E1+bR%*C3z#hN`F z@nbTf%et$6&`aC;8c0ptO_OuH7!B5q(0!bwy-IebPB8jC@*P^{z;FwKRz%BSX<=m! z=CScTh^T2B`yTW5eHJ2&DNI3bIZnFv)gB?A`3tk?x4D|2X<{nOn5YPRDj%+J?rO!m z&zL5vj&?3CBWPoI+rZrqE@HYVJzC>s&}E41OCEv=Sto=|I8}@q67R_lTsExTShAnk z62fjy9aw2g?AK3xBi`#aH*0s+)dC&r_s~3uDn`&^(XrBzEexl(f7{bzaQ9U^Q(_zJ z1-`gK3emtBMODZ<&nA0WmR@n?=YwFOqP!^JU@kzy#8O4vNmr(^IBIW2gBBdDTwLrV z1)=84^}t9cluXjDSEgD>;1g&wHI zzcq~(I@l>ed7!$3NmR!W1W6+!o1HUW{y&4NU*lO<40>Jmx|tw{9RrshrEkS3LRfoK$@Og$^nJZwj`9eEOq9(5!jp}ni-8cKKsgt(@OgAhw%>oTW|P3vjv297h0W?I zog_Bk`-V5cd%{o#G_ry&psfTUsX}6$fSw&i&$HZz*Ki^-TYBq&RjcB%Rm^@%q(r@} zb$zEooa-bahFI$zPJ!MfK?qc6%9iv4-CQJ^%wm+e(y^tc#Xv%gc`Ei^iphr*Ce0M@ zxHaJ|4c~A6d$fYIk4qDl*Yzx3X-vrt>_U>Gv(HBQ{H>xg`}Yn_pksEmnf%PD*HK4G z@odl>Zz4Krhy80DzBG9vM;$GU;LfZaY71xy)zYp;jkj|zyfQ7~FQslv-Q9ubu=lyg zS)X6QPuK?ccoaqIqazL_K_YkSV*wpa7cHGR449I5logPloE^d`WH} zk1A?qky`aWW2tKLTIVAuTGi&%X@oJ?b(rFcq>Y01B>NZkR8xV1e?`%b7?k8(dEs z8P~2#W@zxgDBnJ}Eem9LJa(PlQT%*U(GeZY-}m9%9bcdS@^beMa|$R+Lw!2)7!y35 zzbUrb_VIvmx0@H(s_T>sqHf#VtHBdk7wL{f#UPu7kRs@KI>c=L08Ml?E5-nH$`{jt zrDip5rG_MUzB;3J$b?#JLhQdhtQz%+az6?mb7V2v#+MLC{Q8%U<#Jg& z5`mN&Qn}G@Z{B867sVfKYQZBpJ~OQ5JHpZ(7c(XFz`+d&9wjY&sE%LiFS}T_EcH%M z=qBRphRqrKasQ1z|7#-@EaZs={eJ>NU^KQN5SM_WKTnkVZ@zLs1I|~#cv@otpwuBW z+wA7On3M$#&T&y(6OgVfEP0eH3deyP&sZAQo}e4L>WSakiUP^2JY7Q-u52cGqtIOI znp%Jrpo<#a0hyWe#!IQ5=IoVTd5htRs^9)>btTk`74^Pu%Pr&XgmNAF$Bt@Q&_2ZTH=}a^oi=E!$T0Z?R2Uh|pt_oqX-OU({5*sHh~; zX}OR=G)qvGENhm#s%Vkv;8cY+f;b~5!Ebh9>mv{9jgi5@93*iK3Zg{X2_#?l!X;o&i%KQ6qPu`4L)aKsrlHP(0(;f<@!L~-KmkVx01Q#qy{flI$e zIJC2q^*R7>R8hV@B8$?QzNSQ_$yj#a>b-=^nyLEXv@}8F%%>3y^&7??l__gv^V;1# z+UX(%PE&W1L3R~c$tt&fDoIlH<<%DqpAgxKBiMqUlcLAI)0ZpQj0j<>LIZd|`$pu= zsB*Yzd(YPx*|V(U%YRf0cx&%27Kp4^M?v4g|488VuTA{B0PrR`a@S%+VVgini->v! zd93@90T=l!|;bY5}iC??B35 z2-Yr^AvK}WGgkO4xO)S%pp$hgD5)Gb7Q>MAzEhgVPHi8%x@5JxMNL9W-9fm|rjiy_ z^l{TFOHa>_+`RaSz51uf-g*1{6$~|pPfP7vb%_K^DWly8p8$jMGjj^sL};@1+k-Hq zcvDFTDhPAuAhK|4oXQq;v)Mvs-Q+T`>IAs!zQx>~8!TaHJIXKxJT+8f4=#O8oA`~f z7>Q1?po+v=QTSRNqQ8tSmr-7oHr05tuKivYNcX(8Y^onW^N!S8TL(H84acpQ`q-8{ z-3wk*Q)4o-$%JzyDcevs-L-|+MB&9jSZvI$QU?>!2M-hmwXvV*gdcqH{*nuv*Cw)H zQ%@WbK0eRD?!Yp3+J7d1s_P5OEXSqfdnb+v4G&}5JY5eO|zd)JiGS~!z;T2($#-dBL zi73;kJ5j0ge3>z1DANL(8pAk@o3JEYR4EKxpzB;xiw)t1Gu6*qIjer zpM2r%Epk`*7<~4>6dd@o;^%w^Y}quzxDM}Kt|`k!TGOsOi>LY=!c`rt3ML=d=kICG z)sbmh*RhIg?;35C<u%n1h7Pdq#~$$gVNY?} zhe;hjT-vu!kw=YR8V|iMGUoq%( z;?iZLKayw25?L(`0Y@w$f|=1!q&RF-WQeSilBo=UJjfp);Da!>q165ev`1_xzXBm) z>Cl*pW0{jchV_})w8cP$gEENeAs``aQn+yiiIj;jMu&3;Rf`Nmel1raPJt6M!N8KB z^ELFu=I!`T1hSPc14Lr?THGRgD0JYOD#Xv%TDX#gqUdgV>5|;0%MiKR?cS(6pYl5V zmw{86!4xjM9WKl03{QQ(Lo&!3yyP{s!EVqSb*sWLxu4Cc?i44wrTSIKuTbwGB9(v=+G zbZ>x!EP?OuzFTg+GtPqN=eM&*zJTwqp7-z5rs;w2x4X~1+v`D0zHt4K=#KC2^B&w# zNgIYp%TU8I_I^3@6!pz2%B~*sr0@yYtP7(QXd*XWCH@>Hy*uqRH3p zNFIoy@>)%}QmFJy?+HPrruEFqKj&0LADW>fAY(!(j$=YIrTBtONCwbQI9;f*@o4x- zRK$x`$Pk6aoIydcrYNoeNw%Q~I4DSw7=1(GDmW-Inveu=2#D$&Py{*{B=uP04VbnQ zVMrQggHd(kt!*0%?k3L%DzITU5_F-4nMsN|H?jImhPF7`kGhu1b zq03C=)SzMg%K-Q{{rA)dJZCEZ-{*htFWh zU@n*tj*{|*7r0KWT$UHj&Knfgx%f`U)uvp(P_i=FkRu_6c?Lt6K)}(3iEIl&W@cAM ziV#6(NPKA!j7ZB30kg59OiO{&pd=_I#6M(BJ48Ze8Y{KSW@Ot$iRCVB+gol^W?pH| z%zS^&d8Fy&;2&al>(k_SiA?o|9c4ZGE&i?k!_kutdu)ymm+a7kWnRdSJ zPS;DnR&iFN3npK7Y2K3Zd+!zK`k0;d=>B-PbDr9B$Nk%DG-UC8 zZyNpm7NZ6#NFwK?!6B%U*_&Y%uG%;uDl3aHI5X1;*hQDqJl?lNBvYLY`UP$Xeh^dw z&j*g0pQ9CCj#IQiod`2k#jrqoFoPtD`UlN0P12pv67xVyq!yxs1({jiDmJu{D47;% z76Svq3S_2MwYASRt2nKVY(ei&d!N@7G|G{h-rOULLqYio0(MYYk8R$UL@RoF5hQ9K zZQaB+84YrrwjTP%I1!a-->fOZe?37p5OybI<;#H#WX1t*e|Dh|qsm7uFC7Hd6qfe8 zIT4~+fYNU#e)?8Kt!B2T{^nIITC*?e>_Ld+^M79ASk2B!Ea{K>1&;EswDA;*wt<+!$>S5c;(JE1bVj&|E72dc_uAh# zT358^I>_?Ybsa6M>dXCY;BWivGrtjzrcNGzjn7Y(_Rr9wx%h;RIx z#SBjb`zS;ZSKtS@@=rJ1Yf_3o!45Qv~+B=p9*qoXl<5RYx3JF=()9< z+xDjU*4pRR%iHqY+j1>xw7%-hEo@j5Trn_I3myfkoqJ}1$t$oFv3Hfs8DxW?f1zRv zppYq5ji=x;!Gy{6N521o38{t*2~UJ9{o_T9N&>Tj@7X)!wDbN(FtBf}yK8R#@im5B z$HlJRhNKNw*~rGgpp4N%(ot=N<(ddl+PoJbC@XtlVilRRFi8B1*uXjQccE)sMe{U@ z>R$o|XPP$ev>N@soNc}^4;#e5U@R<9t5k%iEMBSPV1hzH#n2ECRs=IhT+lKPW)ZTq z)R;ive5NVsOl1W9W!kf zUZ0%F#~?$gflAJt-f=MEiVw$4!Ppdk!iaK)8>YaPy0KR3x??XtX=edNmTu+L$>`=% zq1hx#9>&b8KN8CvW8A3KVweS%X79t9MyuKy0CmBi(`EPZHZfKY3%b+(&CSo`)ep{f z_h&zFj*LDRiPe68%$qw*BPOVIeNWkKZOu2Fx>t4{u2S}=q&LOc**PzWf9iB9qmvJBTx^Ct41BC z$GLG!BdD~A%1Y(?^w_sw*SiO1r72e|HYWGMYfx1}!p?Y`k+Vb>5sd6A_>Yv^@#FYz zi5SjC(EsfylOPcGma8`4>@RV#aDGMzZCmbjj*W60KZFC5 zd#h7Q3Y1Edi3^L+wjm1dy|8=)D~pT%@`NgiXdTwxje^{eXAugDf9{a4}p*Ej`NeUWN$^ z#2Usrvpl&IrJBYjn{)|{5uy7Ez4bawS|;U#AgH6KO3U?Tj`}x!?U*c^^loli4PZRrVD^y_G>+RP6RFVpfgET7$FJ zDZjD>TL>RvW_*eAbe)oPBiHa-zDVk?hWcVzNlpx^Yn~7xZYQfyqbM~}qOQU5^i?bY zApM~9)2WS)HHsr0g^Kx^KxG)P=F~2>+r&gGo6fC|s3}HQBGoWWC1O0ySi!PpVk7o? zTQ+XG=Rd+h%|4w)ojTh;}SCd%xf@^MF&`BCz&MZco-5-)h}&< zfQ8HXTZ+JQ5yJ1tJhE*1l{hM{UzT2&Zos zl$%Ed*|ZM9mU*b6d{CcNwEh7tKRx3!wmO%ujMg!Q46-bBe`4@j8F7tabOTasbsPZW zPZ|1VKP3h#)hKg9?3Q2tJk>|*1P@mhhaW)!82v6jjy)C7527O4`}h-ouS^8cZG8b(N=(sSn736ivd5d z5?<8CQV14>n&805J>86w@|%E*TsBLvekE%)Ynsi*^S&OnaWkILPscXJ!&27mnYqf+ z`KhZa`{YN?#f2Ama1j-q`L$tYswceSE6Zj+W3XCB6-t{+(HQAgIwK~43HYe58Ah~~ z+hzdLjRKt#PhkW#={CYnL#SyWOmV?Y%&+!V+3fw+QZFH|`{m*ZcPKhiWafoH`B*|) zGey)RsuhTk$7itqD`}Tv(}krf^ghzQ>*Zr0btcp7aCs(gHQB?h9I|9{-fnG0*8?ZPFY;x|<}oH9@+JY)Zw$doq05 zk}Mc2=F{t{(kM_sAv=*lvfx~Wo$ABqhO%?0d0By!nOJ$5$7v;-J0nan^_sG}eVd_{ zJg!AuJtc^3Gg-NZ^pw$Ae1HVbzkl=^VdN(`3EKO%aR$vcux7XNZgXAOB)-`_SNsz*^U)C~>Ai*&W8{~q3 z%ljYameX1j#YA_tIiG`9CZ5Z{6dz)7WoQ{65he*$?^r@F(2j>YG< zov0*s4!#(@Udu8LD{LA{Cv4N~Vws;MXd68eSzbs|dI?=pynjNrdE952#8mV3liTcb z&gLv~!vqH=Y8f-Q;$%D9$>}#ejoCN5N-K1#6c<=V=2)DdFZ7hJ0jFcd~R{PYI}B%L!XIZdkAs3iVtjYWlm zxaz8^zq$PH=I;&!0?&N)9f5!f7-J9QO4cbs`Y8Pu{-n})3ADDj(K@+5+*ta_*Q2C7 z4^q{{Crv8hGjk*6k1O82^rX42c18?dxEg(_G&2sbBV{WzF{47wE-i<;R9!twC$!NS z!%8=!IFVr$Ei8w{3`$bTigukozabQ;q}s?nb!}F70uhG5fbTeC5ibW?46U8!FkMD( z0{>kTHwymDr#u#d=9*Y%PNu1p%FzWwY7#mpM8+zw;FTr5fNfKv2K5t0 zbXtH!cSqlz1v+<}6ozp?8{x0ZrG%)!TnB3JOoaKh8hoa)l<+u}97!NXAU%c7n|e_9Ui##fm^^e?weRFRx4YSF;< z!>lT7>&+)b6=MiNQR=%6MgB;9G0Qo`yE@60^B&%10A}-gYuj`ze{Ji-b$>{<3)iRg z#-_l+(@NHwRmDH$?G%*BkN1*J#gH0nuwPkUAya`0~>N&&fS zFf70rxN%V!kj&LnZk*9j4AlrI6i|I*a5yMi*8~$AJi9Enf6dcnaz;riw=>#d$3(KL zzGe5-`8k?>OsZ^zSGa!Y@(Msx?qi$4` zhRLN>Y_em3z30DRUsUszcWN=oAiB#2Gm;z(qdcWLW=tA_hHAf3INyNR$F6*#2K35O zq#r6(BXJVh_Fwj}*LNIVIwyql@QQ=QPOU5f_2mq*X){=ucB`P&?md17B{TP!h#V&U zOh-dZ7sd#Gz*hF4^-PLMu(rLjv2vv6OS`6qvEm&A1qa(UtE-#hq*V6m8nD=ol&q=? z8(+nl5K+S*Ou)*Eu{4L!-s;tT5cxBr%RrVz5vMGw{h+2u9ZMNF$!b zg%bC8Nw0#tiIP#1i2TIR4BUo)dfE3iiu_lCQL`06&;g)^b}+-rk$n)o zfdX<KtEPlfR*p1XU+)@zv2rj6lD)99L1xWD*mU{OtA1iK%#t{k#l7GCgsfc+Q><%q}=XnM*w#)DEI;lY?uDEWh#pbc!#v0EyyoiE<>caziQH0ip2=| z(zj;#K97zXUuT9k=w9Q{5ZcntYVWs}%Uxmi-S_g;Pqt1J>cb*MdijP`4_Mz)um z6|!p^ZVx?C)Y-q5NI=qM>Mv{QnwwDqx#fsq&-6-QIM5;UNQOpBEhtscEe?#&^51N9D<$#>Ahe-nsi`%7@Ltdvxu{efT_qh zsA8uqm#ZLK;eQo(0OV=`jmQy1yc27;>`bTYl!yZ~uE`ND`IxHNBeG045;I(x5Q(|P zp*!XgaTJe>`@A4U3~d^5lYanrsyRur(!vLbdkXrNP51GTFjD75n!(bzT$a7 zU3E&yas<%DwB^R?5WaKi?Fctdrk+Vf#LD&Uavt9IqL#D@jKaQYDt{t}kTYYn;Urje zjq>Ndp6rP$e#>6=oX6$1dW~NH!F2LWfNI0ex2iF!u$K5hq+rZrl+u>;xc~jFWhawF z{7*z)%kJ|Tk*NiY>Jcr~6B(vNcY>?8Mm)(_U(}}-;o#9n+zB;JQqZhjUAsm@?<-Cs z+)xWjDO@@tJAp3DvP@lt0(EV_Z}l%TuJTU3PmtUwwY~HYx{dAho~WqzmDIvLujTB^0S-nf9pID0cutEz!_`nG$wW z;}U5zFh=3B_$F(*$=joX>ys|&c)ji4v)bC1_p$oFfH~Jn@$z|j#qu>;8XM>8%Y^N4 z<&ptX{DR~1Eq{CKwmdIvy{EcE+WquyPAfDmBUJHgvqv}2+14o${1v^`q>k##`07=- zp+RQ;Y%4p#Pq_;EX8ZfdjiS&=`@)&PF*PO@((a9m8`EHe2`?LUXm zrR0VT7hYBEk2;*3k0$1yGyJw~DxaU9oU`Tub-5ST>2=wjn?vOS|tH;Y}>sK955Fgw`#Wh$DTwj*?M^^<>wZGt_! znB)aYUdQ#HrK5kG+lxWe{#^=%$!HT?OR4PG&9HjE{Y3YUs;`UqY}Qm7iGDUE#(Jet zSH_K4b}(5nL71;ah$%?=HeZj$s_5&jLw3_3;favJ1sI-(L%Y26Vj)*Wfktbks&(6a z6X5uXl^YZu6t`l95ScYn+(IaEWGgS&{4=W5MOVN^2}Qw0&c8?RUqO|RD(Fm9%4%xe z)}E_6s8M!H;*Q>Vm{{u9PWf=OzE;a#(X1LjRX55iLM2qzH1{BrM#_c>uY{ueWy?ff zU5in4Z7o=>z(`43aKg7l$>&a>L;f|JVxrL5Tw6Np2g7?<0%t4ZPM+F%He8V zf=45ZYzuLQc1TG(8^r-UDuKUXd|}O}F#@j|Ba<4=f~G{1U}-!t8$A zWc$>58sB|8@V{;c0Dp)>^@m))0^Tn1?k7-Gg+LJO8n!E$so+U~RCY}fNECcG$2LqO z{~u=iI#@C>e6o^n2-GuD^EfW}G}79kRb#5@lU>SW%Ox(Vb94fz=nE&+5x9DDjJSfY z7Bx~j*{ofz&L{MidI|0&T2^pf{-aklcR5{sI(L_%KSvotZlQ}Z|B+8c3$?6XfWe>t zIp^sjnE*2hJ4)xPu<#T$O}0yF8iS*9qB34h-~EJ9v|*w{4W_ciaa~cf z@N3}Su~8Zmb^hx;z$j@K%M~E2<2(ZqSI&qk3$@Ef?HcfWNZkOmEhM}NB5~0P$O2)9 zS5jkxMXM_-K>}ZfqQYl+&B#7VP1{tnX^m4ldvBg@KbgMZEqE2H+Z#3$Ko<@fuG{JV zD1$w7BUa(a%A|-bkzsBpzPt4qXhWEvi~t|=DQTvBX^l*NPh9vrORv0m>gX*8*U|Fx zh?dz(L4=O;s=IYaQ7zGN*SO(U&tgHlER27K+@#(A1>_f-@Ldc};Fzog6^0z%sHo2K zgt>%J^ehX;|=?7*xISl3O%JdL03zhXI0WQylN>E2-6xBZ_z7O96 z9fj9{h^3;c>2iC4*x-NAJv;-ORtQ*vZo@a6LptZTA#VId31kgU`>YX_qW&#G>w}_! zqplF@>GyFgfzesWm@#0)9D%FoxMyW!JER=_9DlhpHJZ6D(N#NV1n}tvy0LMZP^J9T z*10lAF$3K&L@>p3S7FUy0t6#|*B)Y-ni1mwv7#BnAw)u%PWK%5kz|oIPt-Um#so}| z=t4AjdS!;90`T(oSa=9SCK+W_D6WOr5pu&}9P9H%1Z=OS>7O>B!*C&j>TWdm9_cDj zc^)J$&vYq(Y`?oo{}XCkClZ1jlbbQVp64E3*V_^`CCc^s*2>!|B3poU@$8DQuAYW^ zJAbU^BA5LoS9x$wkwFj?l_PZ;lUV=NS!F}chZjhc2~q1w%L`Mb*g49H2@A|mDM=}; z^92!d8)j zQ=+n5>dQ9^|Fm<;O#$Zk5y#tW!5Ouyp@Zf=?F%u2#J{_fnr(BP;#kbP@np(>Dr#Y+ zek+is?bpqyj*@1bo)d~A!qw2k7s*(os9D}?N;LO};DtsoUZlOmF3UkIdaH z@^_N5=j@ev-{sQMd#476#kXf_b?d`-RP@gVeBaM6SBil__b3q%oq}A$<9)AI4far$qfE7D0{4>VF_fk4L+a}(Xq0X zXi>yyJ1(gF@Lgt#-W?+)I@u`ai63U$9<2ISAXQPu-X@j5;eA=Y^wG?IT9+?U>mI^7 zK57zi>=Ug~exPuVmEOXUinkueS$NZCU|l6GSY~yR+do2?X8id6(OkJ|uRvnH4VnQKKrb}pIcAwz?;Uub-p-J2v&v$y85 z4DrZTa5LNT`a|5@>k2!y>glCY0cqHblW;3%I4`Sv81ZfGnB9vypPWr4H%8hQPFmSu zuN3z8-(KLAR1>V9Il@(sF6_Z#bG4X7V75Ar{XoD$5sXq;oHlybB5vzz5!(Pm zi=3qbFN`beD)jFgfLso>3~i=#d{Y|ZlbS$H{)U}bNr7q>gqPh$O`{u*ux>*u8Wc6i zsN(eBU6LszIDy4~rRFN6%HGnhlfy-7q!CdNl%hyXgeY;uwl^JQPv<-h>5_&6Qq*M4 zUr&%rsm3CIg43apCQzQK2O~7=`1p-#Y&brw5sS?nV=F?ZK|ZQM+093`U@J#Z75&On zeCWHU`CMU=)9g5-q{w&XWIhVIH{@vZriEC~f0wlpO$11h)T= zskaVmqYM7NgIl1u6R8H4lRg#sEs3{YM z#51d?oX>)+$&8-s#W8zgl9EDXsfW&RbyU?P+FK|Z>mOV6xvQ0N$UUzb7&;e7+b-qs zs(VTUK_fAaj>&$F^{Ivm)f~TpmbN=p_$-RW5~e|9g9`ofId|M2a)?-D2r03;Ov6gN z=Sz@!9|%!QFiTkbPN56sq6m~>WboOUbKB%3{h_o=A(YA(vg%gS4a}+Q*3&*2Q}pX! zS&84$T8VZxhFrIKV3aPhgeJPe++_(*s`t1xgh}^Ptae!4vOah}?48gaH}I|3F9Jxi^c&8d*2 z+2-}Vp^RG_KhRyO&f-AzQ{6x7r-)-lc3Z0*-aigV8bzXx^R!fnP9JG*-Ob9aF|=3l z2!*NLLx0IdsPP%ERW&zXJJa~~)VUN+K1Nd-X^V>%7#w@0B0dHhsqF=5r5Tq}-RYyd zy`y%*+Xr1vGkxBLJYQv!-A~KbQb9J04B-RLzX~6OJxBWYvh0q&Z%?{V#^Pd7iF4C= zkIcE;h|jNOUC{q`j;leEYSUpmz znD}#T;Dz|ngZab;dSd*5iWZZEDhl_9B`k`r<3~S_>As!Yh?|!e?`8w0cRn4H0L|H- zKoH&C2sN6|tIANFmU-oG@uvjG(L49A#6QDqCbn_aO@4qsQa3*Mqc?Gh#&gWVnV;QE zB+RC>a4BMJvC=TMAEAY?p5egf2Z~!0pd|iAV~CTCW=_GPKrFSPdtPLFhhyD|V@c;I zSiRqSZx3(CySGOct||}`Q$^9ZT`*BWws&SJCL34JYc@DqK3mDinyqwIvAOYQq?DMa z@FymMWSbSLBou=bAJ+CXyhLnO6GcES|IIzeVE8`6rAwd$LzX>%fC*iex<;1DeFT6Z zu*8Qc&?<>oHc$Cfaq z^&(tkk$8m-jkv3(%Bp=!T=5H=(O-3F+}&D#bDLH{$FCpr#I}KJ1k3HaUmcE~TV1~D zup+)g0f?(V$ao!|WTZCRdvR6Rs;RU+%0ChJLA75(9jyLZ4KwNSuk`w}U2c9``v-k< zfC$dKwLyHnVh?+Ff1VSu$sf^EBI;5|_I z$O-$yFuB-}uf`G0NDxK(hnT=<h%WKrw(AD<2pY z2a&KL*h)CVQl3tK6r98tkbZ#`98IW9Ul~n1Ak2=b$DqE@Dtb6{e9T-fLL@B9&Tg4# z43KA5qdIuUaA+~=rLszwH9uZ^*1M}H@|3(;vbWxsNLI>`dVv&(YWyAgzNd+^{o<>E zX%u4W^xgjR+IEqsqu5Ey9y8?b47xR-PaH7l__AEN{CAS!{O{!seKb&1)6>XU+k1Ra z%?J!3qzA#KPaKj1nD~(b2PiAy$pD(h09*_JN+3K^Y@j3zxD*3`HRhu&4E9Cjx!Uf> zq!%hUIt>3T4dK?uuOC=r@E4d#z|r@FzRa6108r>GRo~pq!MlY{1m>?b z3-3*(U#}LeRL|fC{f$iRw9>=T=6D^`{uqV5jmU@nffy!Y-QL|h+ZI3UxQ0F>ht0kV zbdRi)EvOJzwEd~y(@2lu!0dOsfaq7Vi@#Odml`z!pYQcAJs(;h?+u)|YMrcwyu&{d zEIVkOZuzvbJ4_X+L`71_Wx~)?9dAX1(q=m6paFFIS4QETdDZo|GC;v=BB8kPo*8@# z+q5C|XmF^Gw2{S*_EOZC(q`K~Hh~iqnaRc}xXaBu2DpY%3o3~orBTVzx={~mwyV#n z%^A8GjWgh6b9svOKaZT;XoO6(q$Rn@I*PP- z(#va4)Z1EmPTVD-mo+_)VcHqzecT;d-U`O~XLV!v+)>oV-jJro<)Jbov9X>PcK%-L+ z6rXP)AeFB9_yvi@1S_GVs+o3C*PD6&h6jmok_Yn;(NYGVLO`a3W1{*QsNyj*0T)3r zPBX>9#Gg^!-@|D>9WN21;>I~Wb(7FN+&jgZ)x(c*SJB`ytuu}LZN4-LX~6=7lzU!K zds&+>rXsL2Idk%*v(*5^LGj}IQ`dr4r>%<_=bSkCG_Ip3qqQ`1UZ?IIG>Q~Y4#4F6 ztY3K!YUT#gHO~j7Dx+{t$U)eqCFM!vP0vn%09%YOK673cA|P%w948JF5`L{l=z$yg zILntNQVRBxG@tfFL%Vcw15AA_3qM$KC5`tX^k0W(56fkTcdlgN)rC_vCyWt&lE~j~ zuz0Sx^&?NdG>2KmjVR93n%XYYl1k{qiudF{tI5Cl6i*42pH^!w2!p7V{snFYRG8Y` zx{6@l?aonP^I>S&%H+^RpR?9KkKyt&LAC7JC-qWJ>i*UC$lFaY|NgUbeyLZIy4+%C ztmCxGdCXLQc1+Q~n_6zVhO{eA1cgy^SHTtMISmuf$)yt>!p zFhaNNF|VdPk3A^#o|euW065vVCf2v;5-gtS7YVU+Mn)H-XJ^NCb7p0`W!pdGJ46zO zF&OGW&J-T$FHChO)iy;mMYh61wI*B_qXkZ~k(&hl2!t5~7m?lJmPmIn2;8K~Z*?(nh^SC>2EEV1&JHwS> ztI5{X_Ct$;X>Mw%rg7Kl^g(`R#vxe80HO{e0u9KWZGq!vp{l3B@FK4_mLz zBjQb$^pP!9o+SyKm3e3C*cQ=~4nH$-JQEyvcGMm*oP%{a&ky`+G-a{eN zE%9SRis>ZUxJO_ZL`g{jOY&*};c_M$n+1Ice16gf-!Q!j1siGNu8M|3;}mv*@!_1@ z=4$4Ox^q(bOBzA&Dh#7h+J8f+5{#s&q2y>M41m`7{G8bbVBcmb^@M^c+}Y>@-m8Ur z=(v6Ni0P1utQjI9Y>9=mt_4U3D+!!pSl#DfG8S2aEu!hJoI6M z)PYQvTVUzBib3Gqfn3t623b`lm2l+Be~PDJb0}ik!SjTBGpBj=yk+S{qT0{0F5vd| zGmif5)(-~m@Z{cF_2Tt&3F4?uU0ZMa<;A*MoGLbrM$?VM3!%3Us_$J@rj4=MkGqBj zra_#B@@G|K_26{AK(^>N1Y5ZL@et}pG6ZbFVHA>nU5VJVpsrjElGKPdX?D=qp<$|N zOB+6}tx!(`B1;p@?8?*JEMwNQ@6sB($6ck7;nT?XM~np1%a@5PCB#KX!Q)RkW z*1kZ8vcYlvT&y3#oiq>|kBUB)>09}BY8G*FGIGD44~>!p2en@ z_~3A*z)!d*vG%>9_mE4bebZPEv0_+&zTW@-N@ari0v@4idHaJLau!1Ti9IBrxm~A0 za-I-j104mi2Tm)Bu1YttS&Ao~P?199=!vSzp$?HgXZfmMgW%XBTf~p%Ya7?Yx&-p- z*tJEUpKffozvgHGHy78I6T1?={0(cD+%l`@Ta7>?o;xO&+o@8#Xh`+92cxlDTFbTA zq^Qs&m!cJq^<_#4-UK>b4wTfXx&siE=%Ee*x-l!eg^G*V4YH(RzBDP<#?%rBZ%B59 zI80@u%Xdlo^}O0-+@x!_Wb|EZ(f>Y#;K7zlmnh=eQH;+HCbW5~f>|n8gnFieb@V;& zTeBb9x*22{k7cOK?m?DurwcTVKRSA++SW|G%57x7xRRCb#G0aHq$7H^7WhwU9{#N9 zxoYc$;k$oIQ%4db{ql6&9gkwr>CkYL9f-s+h z`m|^|G~Fv3Cv#N3wP5c(w4gfEGa6r+>W-fEQ*{4s*GYs+9v;adQHYYKzV$4jOqN3PI+S`SjU(&4jvzo&Y(a=m48%^f)*=e8*HkZ$OdRjDeBvd@V1@MTKLz;W|UvW@quNWDs2FvpgmQB~+s zys%s;zG`05P;A}dOpu^jwp__J$5H@pcra%*{#kXL_P`fTPqETdh2GinV=5uflu@Nc ztUII!Bh)2Dji-c3;<>I7k$+pjBHQ>cDn0|iYrkhakp-XPqMwb-C%aTPvJ_gvz!bu@ z?@{qQ{I)OKUnZHs;vsg@(0Ij=cASMx4oqy8G=yw@YqU_UD8( zT=Z22H0&AtOhq>#P|-GxxMK6@@&&6Ih{4UxnjfWRodI6@XWf{0Wu|L%BGk*(#6ScKKVF73rMM>GoU_z+AO{oB_+ouu5DG+5HP4*G3!On2P>SoMr zATILiUjt%r0Bi&xmAG=gF~!QbDHQ_ppjahJpkyLO&;Vr$8uLabNL-QQJJKh*;2n%G z=_0n_D}$~M7Qgm?On=hA^y?hjzDorK-M_~Y8R4YoZ+1m6%uO1`bDq9pxKhN4Tk7!f z!7UEmroKL;$`xW{qxjN2_G2DNnx-Bd)&5I8UU$^dMVmrxIQ@+lc-8qkLU22NbBNg~ zd+o4hWe#|s#=d)uckJ46=E{s)haCAc@86v6)F-d^9Sd!plM zdsx*p`hPn`|KI0_z5n<7R+Ca_XS(|6&c;hW0EsIQaBJ|iOmBv@lw#4}{WunAS+kFuis zxD2%^h7Q;lfg=!e* zJ*LjRL2{>L3dgLEE9GQ-_8%C_)(nm(JlP4t>F>Z9@(QnGbOFiF6+AMkT15#IoPE7VrH-=N` zKj}AFPdBb*{qFPsqF3xC>HVL7q+{>R?i=*YD)-mw#|{Hi*w4@~5CL?5Aec%V^R6G( z`u3-t=Tt6R<2! zXao#Wpf;H$157+JY8gz>{;o5VIWrZrHvk4@7>gJVl?07|1pI^m4>OFo4jEO45e*;z z3^vZ6g2%(+k1EI$m!u*T5uw8tf6^_`#ek7ckgra1KE3P7kOUO`NGou{Zdrr7zZ*P_n`qpIhW4C(!*j_XbdV34q zdkUyn7ZyGnmf^lnvgoydJK;`)|I@FRe5Rh*R`0`c~rj|%M_l^XLzT3SV|T5}FE6&O@_QCc_kl)|wW z_cMp9pNtQ-_I_*m?w&TM{9S!Cc)iJ*rEgBHBH)kiJmkL*S-EJ@x6-?B{WVvv>=tve zQR-2C>)eBks%%@TPh3#b5ud;G1=dfY?$%+1xY7i(M3m6p44a|?N8NWw^Eia5O$QW2x%c~ zWBt#;ng=7mS}s9N_EAeOGmZXhA0gwXawUjPL0?bblbrgkF?I5F=#fO>{#SgFMmV-S zT}d2fWx4%ud9>^0TxXWj@Le5=pHBjGWR?om$LUqoSvbf!3W>^dtJ5mB7-YkaDNGB{ z2p&K{2UCTJV8Cyv1gY87%I14svy|9=Nh}-``Sm2N!0AWp=EFIb5bEwa?YF=CsO3{MuBJ3pm>$;ZgMP1kw5b(J9 z4@7lZA#-FyY~;zv2u?~`IJ6P~%dJnh8X8WR*r-$Q?7B+c+v(sy+c#a(4RXPtU3aB7 z`!Sc<(Gj$yuyL?}WcpG3&lI;r9ARd+4khF4#}TRR4wMO=B+UbKiPtsHAxU+dX<|!4 z>{hZJw=tpD36F|IGWgnl;Vf63+bC`H1`S=DM&nBHNu@wxe`RL8RBU+FGgpAN;j(FZ zr)(SD@Y*o5)Tc;)ug2>j96NTF@kZ&1p$NQCdsAW&;u%KiIl*#2^a}63++=FE zP4!o2I$!OzRLsE21!r%?m$(n*&SAIizl&D13&cYS2uu!wX)GBd3)BoU60h7#Hpe^+ zQ(UQjxdPjL}m_SSVx*d?=(n~;ECM1`dU|JUVotgD_YdD#zRJ4-Hy z$I0(ISpOxU;D@Z2{OBckA&l=1)<_q2PSJm+Z7R%G!Ihk;ap-_k4q@HxiDrHCYs3i>F?$xquR$n zu8AXRe5a-%&dQb|FlVwEJ$L3#zeu{=l(ZUBA)TN(1u$G_^T)Ve6y zPcQDNCas>kKd7sm9{O2NHC4KibM_m~LUh&O6J6h9Lw&Cxoj{HAS`;_JC7%3O5-2mI zw4(O7<5+&QaV0-msbqDL**npVlD!Q<$FP*l+B9 zbfu&T(?YUj(q6=zZ9Q0Q<@W3CnN%uW9$etV1M-gzH>=N8%JzuL5U_ddmahyraR6RQ^j9(Yt#~rG z2r(en4jwqlN ztYQDp)t&~xa~m%E(XjBwR!u4xk4-4&_$ghHwV5)%N0CYRS0z;X6EHRMs5};He=eD= z+2E6!akU`@ScQXMD!!4s_g>a~Fy+c98_vS0ocq_xHDP!dd!^gtQ#G7@l!X_9$mKn9 zMnuGWch7^Gs1s@nvF@_-yqDx2{H*0;XuXt=nWo`GJVQO>YBTYj#$lAQ{t!L~R>{1k zm5J$!&B(}JGRPx9VdTJEgj;~%As62_T#PNu0{cD{x>DW(t_Hd5N?eF82SW}IGT^6M z4@(K0hFN(w^aFShtc?DOruQoaP3!A3^93=Y42PaEnd`)JU3qF~UJHCAkkX>vu2LIg z{3b`)*&rr`(ZILoM5HYZngA7XoQbyGs2aJpVYY&fnY)!W|-Bw5IugV$H(6 zf!s%l9#{Hc(TF%=(t-`}bB1#fmn8ZZ1A(OTF8I$GTudh?9SG7VE zFk;ITsK>^JLZvP9W;;iEtGnx~fGhKPqr_zgtGpEgsZH9$00O>qCz%rFX(P5t`&b07 z%Z9^pUSnR^qZhC#K4^rKZ(!g5Zk`0Q5O z$@gX_=x8b7GI7a5Y3pTx{JvNukjl2C=rhAQxr3xDN;H;pek?ELH)>jIK6silw3rB+Bmxzg&p_nL=}YZ8sz=axu&dOgECU0QfG-?w*4=6twTBk{UI z+r56qJca&x5X!aMyzPY!W0XvN-6stO2}_$(U1#n@Gs#lx$0VJ3b&In_aL%SBxO`vL zqWykCpx38)@(Z1csJiC!-vXPp$?OWnzDL95YTw-k{LQw}oGf>Y`>e;7+-Ft4Ts~6* z<-)L!-&$_>kjKX*@)v#*Oeu1Hh3z$?;be6ro7|KwlV5(4VmR4#=}k*JB(C&2Xdc8) zTqb02m7{sb!$M%NkSL3>%K0!)lqV(i;R&m?zJ;_&D$BAqarecZb-*`m#-VRWtE=Lb z=l`Jj)1J69Z-#S1cm30H_MkxL!7Bz|9l^MT93jp4Hkc{wtP)XM=)r7~&FuFJ#3)2C zrnGwgqH0u~Gf((6f*;Oj;{aaVu3t`|tm@Q1VBq}=EKicYDtL9&0>mQ$8A2jfC-Ld%e zXRZR1lgI52q(tWRd;bO8I^dm^g;*SzW;Nf>3e7Ij@Mt6rX8*h?by7}qjIf& z+{<4t>{Wxb$B%rFsTjoZ)gJw6iS_(Pu}K02XChsh4+J@OsX=wd`hR8{297x$z-{Jf z)b)$5{hyx4svd%TIY>ld5(Kzh_I%ym{9n_h(IEgV2I)82_P($wY9@JLy8w;{=OW zTt4ukq6y@z%;4L_`i~cFTBKBE(3Z!x1CImksDXood@&(1i=4p0v?Q~DO#`pcyse}M~^4&?RK2vQnDPwDdWdU@xl5)s^ze&jB#dG_X)c(lY|xBj@w zsPeL;5=c3l2G>U}b|w~o2TiP8k$q^7@u^imsV+=`_}pbZx7$I-`@1%5t_Vc2g+eCN z8w`|YoNr4k$CAqes$c0x7_>)+M=qD2E4aNZSyxN>W^h69X2>oZ=Nlj3Pcf?=?9Lc1 zzvrG{WFC<93h3mR`XU8cBZ471t1&P8Tr(`xA>{VM{a8e$_b32;!}+@<2S$INpWC&^1idU=}1;@oUqNumG=$gx4)`n(&-09q1TfNYJ_avU0A7GZ9^AU ztoa%_MEdps?17}(c~{vr-rnFMlfH~L+!@GdeexKqSFB83;2V<*yQrRO?r0jC6!LGi z$;$!K8IXE)b2Gxn3)Z$jB7*ebiut4%nGQTp~AG~0~{+$ojLfGu#irO zygb{J@)z|3!G9Ka1ctY=T=1j8*N&FkG_s)1!#sbtI5Ld`@>(0gcmGN-2gooZn5nh) zN!BNDiU~#Tv3R3Nrc9gZ!1KsQkX+H$q4gTWu;sX@+S2KEeR4vdEcK4A@9cCg%PfyXH{$9WCE$e=WE@`C*V*)FL*UC=$t-yOX=c^%O!@cKvvBdU6yF4fy^v zlilui%aCip>PwxDt6?(ILDgo;a486jCtb|pzTa;q%Wdf&V>&omR1xD<_eytLx1UbH znzOvoT=i-kg(IHZ z_ya7Wdd3q?rG%gGx#%Mq%dy&O(*Fhn?xv3Zy~yRiiaSH0LWTDOfd=D>6CSO1VdyJ( zRETnP@bPGfq%>4mnJvG6wAe9|?gs6=Xy7~MM_Ms-EURo+(Ym)Lj!;v`E2K{LhN8Up;S&uOUzkXIW6&m@EKc+=1G8kV>Rn9P+0MTgr(T1ykvy~p zFos4e)K9hYRwv7vLU(D?s{1U9T5XPaCJB4wQfg4mRB8B-7m)gP*)-#zz4XvATZoVJ z;YX#`s{NE?c403|{9`|dh>=f@$A)8LViEh%C7Qp4rSfpCF4Q#Xo_cNs%R8y0wrPC6 zq-f`!vz+2xk3Duj2Rz5MhNzc_vL~63?#=oBioE#d>*W=M;!cytCu270ViWHXpEl!~ z(9~d;{MIrTlSj0Y;-{A5NXp{XJj`dHQ`e-snx}qqRdm}INmmR969&N7O%w{b@E1J= zXCy`(imQr%$qbs8afGOfN@luWZUk+)`LZkiRj+f@Zs*H3FKf|%+KSC!OOBENq@+`t z_N2cq+?k8V2RSr2abQljMb6P_cy#KXL;R~7(P<@{OPs9hHi%YD3LzWFBtl;^@JEfIEMPyF$U(Fs`5*mP6) zQ}|nbjEJ&0Kr&|D|K^@WFg%;l;tL|acFZ*~>wl}A2#?HFu@?m&b9qm4p~Yn$ns_NC zC=Krf&KZuW-Un8uk&Lc!dSJ=AhP+3vr!ot1rhe4+DodrWxk8OUwy?dDj?lNzd_khs zI8cm`Jiwt&)i!5!-a!j%I)jCUqcPL1GDmB9J$#4NmpC;}anZ^^sZup73tPg3!a(WY zI+&b=_9^zH{WFC2@adoQB{wQ#m(V)5L1m~oLaGO9cB)=vUD_4XHj^@6M^V1c5F0YF zBNH9`S_Vx!3}PVss{`gdoM;dVnN1jMzZeQ+K4(;*J&^54*#)Ombc(R}LPE4dA_lks zqE%I+edQNn|9;johgUbbJ5Jq+R4UVos+pU}2`pbS#yS6^UiG2*J`( zvCmXTPx#u5sYh;6vuX_)n53CXix*OH+*%L?=xlI?AtwN7j8urtznd zkxJz-j(VIx{!NxLIWY~u7#o3GM_d@*ny%=aOj&+ZN9md>S$$+^T7YU0ILYwA=4vtq zGA^AgO-y2YU;#He2tehN&1a8HXe~{qCQe|ZphE7ak%UiyhjE#wZ#4-dkA?{v<+epe zNk@hk#)Jib4rBRGTzCjT=+$5NZVN`PlyE$+Qe?u z@U&Ytn5*X0xBK$8y+m5}E@IIJ5(1H7g-{Luut}q2i@84iISSmglYb*_5+i~LbJaX* z^8H)ms{JpA_TO>kByh^J`4gw_scF|zMR_5kPBDXQCaS;DGe)A&jCvS&(drEWV%vks zg>%|3uGq@AQ85tFMiB?7$rr%x5yoVQTuGS1{bzu3V_S{DT9%J=JoWJ0Fm3<`H3(TJ z8A*HiCo-@x1Yk`rfnLndz9{_>2V<5U4htsq6R02_h;M11_*ER${I-Fg7q}=Pr~9?g zy;yt<%X>RwGjqqYB1JWp+R}r+LU%={(nC*IF$lTz;!-iIKt@h?<=H)V3?*`YR<0c$ z!3~FrO@LE9lR*Bobz{>6eenT&Kv~Iq5yd}Y zyhBE58NCi9(k_oh!N#d86V1@w2=mHW=1Tpqp5kkay*Kcw2yKQObncm#1H>s}Yf#mj zH|*W|i|%la7RK4#f)2Chd746%r`U6*jo`d>PfE{e*~Faqp;dYtAI8XUEb9LhM%Ki+ zpXZL9+`PB-J}^@<#DM6C2K$nGx!}aD`=HRr|9RK{b9oAYLf_B-|9BhyoO*BTAW+n9 za68RO%|`Z7lU}0VoDzVB0z>gfjhre&+0^)lHbC7}gby6(R$xrefjbcBCIpY~^B%13 zo40^b8bX)e?1ZsPfRh2U%CIydSvr4f0I*@ARYE+VcfNd$B$~)qqWbiC00nHiG!_C- z_Uq6Q0z!BzSwu)bs<@u$n#3R(*>RdO$?w2>E-IUz((2}m@0EQl6%+?D8k>FdG#}J> z9J}sq4O%>%3}2X6U(e~UY~F$cpq9_Ch;AGbWQk~;rA-jay!S`CpB9*sldRSQQA|_0 z>dTeosOGYOa7Khv<}i%V)5rAMKVsvuWU)xeWcI)->S*vkytQ;{z0W@%}bfqaaEjF*U-bQ^6iiO?^%i4Go22 z2tCBGX8M_;r-0iaPkEIa=1hkCCqkL;)NNzu={#6ewcNU~Aw^6$?vvH9+L0QHw_6w% z7VcBc{GgUJr5gFQgAL7sx|)~^InB)LI=k1_=kKOW`nqqeF+`c%Hu?k6N_7Z-oa}V& ztMZ(xzJJs0TqZSLT+^z3M}^w2;=eIEY;M#t5;u?7X|wq=Cf763lJ0ekp}%!_$d)7` zxJA-m#T>g!p{QRk59cG?&Lo62X&J$)?4GCy^iT$O_ru2HSRAS@MrT4)1w;A=5^Rk` zK0n^SwJd1PEE{m@L>AiHen0|H&0=6t+dI;Q+)`&`b{q1%D&qCNr@4;oJfH zdvH>%&8c~e$@gp!#!fa9b2QICEVE@xp$Xw0KlYwnG+EO-(~{hh@QvI@qkW;*c&^qffG?3MJT7z#;|l z81o4tk@B@UDeN!bHT=)A^o}5>RvA|-3Ms-XC6io+mR1d}63|My77eFFF5TbuvjWp; zms+nH8u}|*J`}_#&{xwb6U_LQUAbMucN}YK83kST5XO=yt;81l_!xsRa)aL5;jH7Q z<0ToG?#^tXb}zGx(_cW&gz!X?T#PyvHFo^1r8L{aaW{PlrqK@widIsL?x`Ig6}aeX zT-z9D1eIP&mLxmyDwkyiZHj!?%C28EWAlFmb~c_@aWtYEH=;&>VQM={eo$p1<6AeW z82^9~BZ|WWApnsRkZ}kRGAkQZbN|U{du0Mc1=Gx|rGWy#=f2ib)~|^-j#`{q)q-4` zdJe&+>2e-|TFlU|P$%99I=Wdleg@Tuza9RfJr4%FuEhm4cr(*{aOhSkbj}c$!Ufa9 z!P}V{`-YWi{pA!@>W)_g$Yph7F&$Ovv0h^~GQzTX6fOa6ja@LcCaX;U`=!u8Ns~sZ!p(ZI!TZP^! zOQp&8`NWFb~e$6J+A&&1??%$NHYU(0r-S!>#?nUq#)m3N@$ zB@?b{V*}Q&IH+1VqgePw+(e{;0hxd>S<0U@f6V4gs_M%f8+@c>z_1k1yXZ9$?iLq9t|D1SnMhNNosh7)_da1SRZeusfTw)cl?dmYXD~9ke;BoJ?Go+#vg^U`#nGQIWtt*uu}XQH^~~?RLA*FjZFg>-Wm%z*U_h2I9f{%u&o5?ERZx^` zxvyT4$kyO9IhD0WKh6jJo83fML?IlyweHhy1XbSUTb%gKTgY?$a=X1G2oZ;lip(ru z)bDKaM6e^Lk54O0TFEu-H~shs|L96;W?nwIwix*^TSlH-Sc-kE0n*X8^#Glz+p)k9 zled(AZyER)AX7jwfKaeFc~IH}8Q33*9j1p#gM$}>TF8NkJ^+y1@er2P6b5|pafvIU zWc7@$KW>CWjzmQYCc{5OjsIH7L%vep^%NcBDWw%4^L13q$Z0o8&dTs)m7I+v%YZSjYxO1c<_!odZ|xG10!|Jo-_E8> zuTjN})we2^qw5NgJGD0f@rnkg{-)>gkC!%~_qiq%wtL?s&@R;pCu~iv13e{Q+WgCZ zRk-GV!3a9ms&HrbiPPNfT+0_&5#w2e@Mwx}*M6BBTers~ zLaF#{Cv}FW2EGqh{qah7gTnDXrRKlQ6*7|MuAHgx4^2$RxSH-JZSOB%LlgR>@cAAM z7J3N*>OFxHEJp?7b+k-sWE7${bs`lH@F&_69Lj7md=DvLovvp+5kGrI}QHy9R5 zGb3#PhZ5lY+0*F$_FZD-9Z6k|ubELl6zGBLNbv24*OrT>kokLkyAO=w_38K5qnBFz zf}s-GY;w@lt<&1sIcnjsGVe3Mm;9k*dnVo1 z)M7GRdY=-C3POkharR{UZ|U5x)ro@G#l@AimDM9y9Gh9vndK=QKDbOrmVz0bmBp1M zMCpg@7sVRlzhQ`)P#I7e=&HkxaM$VUC6sZ06$Og;qV<=BlHz778zPY4s^h8|ccXf% zEQq)m)5eo;a5dftyhTa!(UCF@h=q_&b}lRA^wdXGu?spAQ+MB6gZ00wUX1_n|5(^%cuB@WY9(kawTf&bzpl+i zg55WQ7DuhYm3>~a6Zjmz|6!9Vgd{YW5{|%r2{AO?(Hfhpb~4@sOT%?sZCgQQYF12~1&KxZ<_yu2r4Lj19^(T(NXiAyi3} z+11UDEBq3*UO8DWd(cZ&Tf3(!Y451prEkKj|DG9)t+X9C9$p*?!(_>TwLky_^&@h4 z!V@pMmU8+yu%U!XMmgJ>#_*--azQPhn2BAO#&2tv`lPQtm?#y3;W$i#k2h_O5 z(J&jlW}lwS<(f}o+cvA7k7%dM@pcIx?@}mVXYR=3BjxFNE2N4IO?gHf)L#z8Nxy9c zjSpN}73whUWxe(o|Q*1HSH9TUduM;wIi85Yo ze-f6ixTsS56Q$Ttp!U?vws&e;XRg?(Di|PwV)sQE)-S^xTB$Rc7L{oE`T^q9v3jk0 z3+I$6rQe%Gchf9)j3^(A|Bol9UPW|>v)e6aF z_)QaFnDw4@$Txoiz`t29+1YbSyGVDw=h)kDD&CjxV}u_|EazOo_(w!)0WMMZUOkoH zzH|>;tHs~kujVl16kAwoYB3;izG)W3*>bc9S|nZWFk^it?Iv(cO%WEul&Q*Y{Kqtn z0RyUcc@jqoCGDpuC1k>2*48A%{0=)r4lCJ*{>j3HF6gR!Q7p(%I*8JSM#2?ubFN0v zH0ZoVxiOE-%1?~E_#1Tokac~KOXaaMc3?aiGI5rIzep#teBG3sRgG=>hM zuLAbnAE;02Oj4c4N121=NMq*+ZGc)bFb^WPj+-bnqCNnC2?bkgtZ z&IG>)Ib^U%!Xb^<4tt^%n!t4SLOd}H(ThoNr0@})P4dX<8W*YU3L_V50cOkeM#ozuUViF>9?wrb?_U1;ALrlA8nRQ$RGg97qUZ^3>WwA@0!lxdB2KU- zWWnP_wo)Ph12dip+Z+Gzr@Q(7FPgprs;w^AIzVs>?hxE*aBp#U*WwVgxD*TS?(P&V z?zB*>xVscBTA(dfXd!>T_uhZjN^)0LZq}7Kv**m+v*$y$lJ!-4IF2qk+(=b6ttT@s zn0r7@?=3RN8S>x7Bv=C3ucIu{3GF?>ivRpjeg$ckpn5b?*^+T*WogmkfJ?d?sQ{6Tl_PvG7Lok z+YquGqnsrX?sR>hl?ysYI5^qh4dm6>01QVl$U-X#1~t$Vp@#f*-flqcJ4_Urym@$S z*ksWl`foT{*6Z#D>+Ze`(Ik9m(sA9+LQL9`3c+#U&~n-VGpW zrT$eVMIdv>UC?uAbMx;sE|?7z{QU0z1uFzhKt9Y(1;Nh4Nk;uD1G@qJia_a_#l~Wm zP!;jrZi!z`3F2r_Fc*H09)j8}{j;k%^#oK?wt`;U2 zZLSQL1Uws6!B06OCmK-SIgKCR-jSqnfGO%>3a>(*wod3PE3+NRq-7_hvlkdrGd+?U zGPM<;cyqjYK~D>oj+6FpBbKlsrve_UWIXMCD_I}grg9{I@Cz~^{o;^`K++<`*_Wwn zwj0-_#&YKjkG2&ic*_|P#NKQXztU8z$sRPHuaWUQTJLn)v<&nZemxj-?i;>kI)%qCQPFdEn zo?ZcS{K)-IROdjIeUv4o-UdM$QmvHmN$#Lv$rP|%%DoqxakA^qT=-jomkrI3q@gXN z$f{=amfqvNpjG|e`{tbHi|eD*!4v0>2%F*dm#oLLDP=^pq=98+q}q znpvTDVF}bngtTEQ14+hp|Dp*6!<9_r@W(>=Rn_07?bX`-4fK&@$ev%)I8nRY!WC*? zlJTRM!%_sl)e)gMwVNQTVn3}^EpqvW$eCQKd!6b#7a@t7l6U66-28O`~ctA1Y;xgA60pG+iY*}33Ii!hIb<4|udR!q&OL!zPkb=02xZ*s$?KmM*D zM2@V)sU(M1YRiyBXR<;>_)sJLCDJlu=`fi4?X=T8AIbDyPaWhRg$f(rY#jPr9`Bx5 zzns}`91EJh9wCXH?;`c7spAf;RQXs@nVenDQE{G*x%a(J=^`&)sjBbP3q?&X!_;@{ zang{>pPKj-ReQl*VBO;k$mr}p*g3%7!)KxOhEzB{Y8$_E4jry)Cvtwl z_u<^@L8`xH)(=hhhn(^4%FVmBOuMl~qqIa}44(KY@|>ig8U-PCWKqDcskj) zQGbn>q`Ky3+rw+YS0VX&W7sG(rF0n_Zx(-Nh9Mu*x;;D^+P|Tfjei^nmrLxB-6Xam zVaN5;VP%j5Ej5jwsN{wyvEg50lz7d(9UgA~rAWNcoHm~3{tllaEO@dw)Db&*} zOf(-+J7CRr%jSOYclRwcD!vibKdvy@MjY-*?N%n=Uw4TY@6M_lPMpWht?US(OL`RF zB-`nwN9f|7>!jyqW|o6aEWCL=yuJ~AcPRP~RuQ^*E6~LYP1){X&P_?%;Vzw|0`*3S zZ*4J+qfZ3h^eZ_38EuJMTD>f$RC&xOYlOp0mVaA}4}0$J-+RA*`C6?0U|ZA9)yv`f zSRiUJGE9C92Op1LR<=8VUQ<`V0;?ewn_}mKw>6ftxjW1YYca*Y8MXV%Yl7`kE`>Ye zg&Iix^qZI-=y-XSO6A|&cXa6B1`3NfPo^KMTmrzfA01@QleJ5Jp`IV zt5ZRkutJAya~$KqjkM#7^U@$F?7T9(b*`l#C+C5jEwFE1vIEymD$P@7!j|0O@!K}+ z*C{-+Z#yy~$&ba^4ZiR5=!c<@3*fdWpcz%5;Mm}^??C~Yj*Zo4DG3=8zR@UovA5-E zKVusP#~-WCQlL^Yv6FQf@vvc`mrr~h@r~S89W~z?>rm}tYq&-^b#fIkL^7O~iJsJr zHI8jgp3fHs^RYk)&_Sf>DLL>g4|OJ%|Tg$H322th|O1aaT$c_fvP{6 z-_;&*oCascSB+P-*9etEO9+-y`7 zq{yPk8cRcAjCI;sOIfd}3Ez6U7}(;h5KAkRsnQ=GDX}RnFL+)*pAK@Qg4Z{J8%xh~ z<#q)-pCr|Qz|jhJOb#XvJT!m;4!RA!R{8`Zt6(CP<4R>3^ACG$(Azu@oV$$o#VIJY zWDGP+r>+Id)oZQwc?kt}&&MnYuHrs4w~`5vC#~n|x{OLACM|`^N^CaIqvEQ5Yo#iQ z6@O{_L`XC;?6edrB0y}(_NI?QYsRfYk?hm3XXt&OSN|71c~#04>-cY697I|djDbL~ zsXV#B7zgbVknh?33WLC7c_c9Hk~AfK<9tfdJxY_OwZKOs+1Vv7Ut-xqA6Lc5N}0w| zN6<{4qsB>Ta#FW4hMriE<+zGhtj$Iy{zrB2s0udw5-zdFH1(*WXtS2XPuBIXJp58~ zTLi|koX<^L+Lc4}40P2{E&+K^uFiWBWT9E5QyuWf&FlhQ*UG13b}_Rl8vDB4Ty=%C zU%0q$)EU#n&Y}*ssu#0abG%n>j>k$Etn}$nhm8fwHao?twRqji!#2j!W${(x5r^p%4?gY3~QTf zKFFf8IAzSPO&p1lk9K@td9wJMtqCE=Q!-5XAFbmN0Hjfwzfhz46Nw>aZWj@(-9aVY zD2Z>4R#Ee*8qci7ss(FujA=WIPcvRC@y|d+#J>C>$yZS=4UZ3Lv0vnUWUS__aDuwUf$|p)akqO3Ls;@Zec7=A=Dz~vMI9CT; zvkOhacjrQUKJ8xRY%ICmVDF0u@N9;-`1(c+P!1%VaOGe;Io^}uvzJ{Ed251<7cWy=J0}CN23I%MKS;!7ZdD@4_`E5jkwgkV7r|t#t zv6P7+tE~Gu;jF&+35RP@<1Oa;tshJ8Qo+%&V<)y}gOk)V*3Rui(R8WdF~O*Lv79mf zG=HLc+^%BdF$nk*+{5u0yzw&n4-ZiFPSX+Lkev_|Nz3!B7>UTL0x{UD1u7?ILmrtKO+! zGWpi#vDNrQV|oh(2=W9e=944<+`cMdm|iv(X^cB=1dUehu%OLxPWu}LHhi>%n<4-?w72BPHLq} z&MEcEh=`n4k6eIK2(mD^WFhb^D?j|~0iBap?k?s)XG}GxAypSqo>i-~*Z9pTJ(5qM zcg6Jby$O%g$CU(U9trKYzwCUb)y&xmR)q~#^zu?{eDv(^-!XG$@SgY970?+s8clmd z&^pRm`8C8(4%Smm_;!MsW z87p&Olp`yk9~`56Kb3xYWlUquo?TdK0{imQw@Q`{X|&bcxn7+2^N8L~jFsoNVlleF zhTg@FBI{RG@RG-&`RA(4wpTpq8~iU6#qtdN8ie#)jk?vBklUd`=CXGn`4L~*%O zxqSQOkMtylk$Q&UC_F6aye==q{fMH2oO_q@P>Uh-PbYE(}?PNLU#5uy6# zQPPdgt5#zqHNn|<)J(FO!XytwY?isDg`a^UC|ZLp49N2>yeKNVI$4qlUdcA9D=^!r zR9{i<&aGq&Su}SAEhw^HWuU>U_lDqhAv1C;ES@Rm!bNf|QMz<9N3<%MG^xvmh`jXo zKejHuIMc8#-zC~nZ5Yrn>N(Y{^rxQYwshQ>D<@|_SgI%+bnMNOTQkqxbC+}1s)~$! zl6=LqDuP^nwsdBqzTu}IUco<3zDpGe#+(SJ|@jUYAL{G&WRWBn_(@r8%% zu|WV2$Vf4p2ubNXWh%{q`^}=>V8DTUr#lgE-kv)*4db{yHS5d2xW5Dc(*A7qKQ}W` zN^wwkU3XUak)tM{=`u9&M&NCe&|`4p{pKS(IH*HT8LC`rp0~kAhh!!z6JgWHLX~Ny zPH4<26Dh2KrhVbDsi+hIts%rKsrAG{!^B92qZ%zQguAZYJs5`Yf^ZQ`j_pyz^O(6Qa+rs+XyMHtv3;e-KVKw51e z)9q=v2Sshf8E`T-Vrc=rl^`a=8na!2R#WXg&<^&<>h!RvG9+Nhe{93pqdz3TkQWc^}x?Qc_4_RjY2&Da!$;shFp zs@Bz|zWmPxWXu1S#gD5#U%RS?ymEDIR2tdc7^^xS^0%Bn50Cc??droPC1H|fCqYAs z#*C_$DYMHgl(G~+Vv^^8^gY006layMdPbmlSUkD_1}Zh|7Da^wnfN`Sv^8j9L^<}S z@B%J`{EG@frCK4&L^=4i91~gPFCJMmDchNe-yHH$vt!j?5xS@x#jjmXbCPS*d5u4Y zL{SQ)dmBu!%;@;_LfPjvn-C34z2{|n!j<_j;RrNBRN*3gPl~zLvz;YYUVT1YLpzcg zZ-?OHBnTy<|9h7xLO94;1rs}GWC^<&~eNjurhL~m! zAtMwqrae(16y9S}^z`i6Ff?{tTsk#EF@e~i!M!ErcvSpjF>0i3CA1Yb%tSOWfYQH| zx>8Xl9oK+{fR@hkD@rmMz!+i;I6&&LvfU2^Nb&xpu;l}|h6N30(E-;N7$PFQq8f@p znNkFEpwwbw3ZwbY^2ub1^KA6{-Ch=@!NGhe0QZ$)!wP&X`t~F)5f`~{2TaHMhE(;x5G;eP#XY{q8h%_ za5k+RBnJRE;$${*&$CYQsFj~!F|>dCBk|JP@1N zdcKGrRyml3GQPSyOs_e^CR1u8;;ozvZ14+=It)Z=J#S1bV&3_-XHE8CX4ene4cHs) z(JL*bAEb-fp(FmHPQLWJ_j}{t(Tptq>joVQ#-;4F&BMeAYN7n8{e%@aU4uSVH(r}F zb}pseDPASF_vo=2`a}ArZ6e>QKg``U6;nT{wm!XIoXobndw0Rnz0tGX^=V%>`)1c~ zQw=hecO!}DY93ll{gtcroA^pYpP~5fjMcl>55dE@&V|Flb3a#ab`hNE{~7<9JCcQ* zy?U-C|L+U9um#tH3$nHhKnfW!=^i`%)`Eo{VFToxwZ=Ue_r*qK3Ckt9rH}<2=_aH( zYksM52awaU$NXjj;tKsJL}WJ?ORd_GDuU2>_X;B{0mG#mU?>3AZ23I6OpLY>qh&gB z#Sa8w#1UBv!=$AXar<3k#u$;~@VIe)x}#_r0-d;0UG@TzoJOE@r6Y70Nqj~PvJ;CL zxhd(Ys~Kc}EnLyQ5QKDwt-btnZOrsc>nI|OqvGEF_BZquI zWgjY73JCJTR~~Y&IR#JbC~+%HZk9he=2hpFRfPWiIPNqrjpDtU?*@&5zw}{+f1Ow@E>j*y~;=<5CO^jRt z(H>SsWuQkiDU${bTGpyiAxWvXgIfr#PLQNih078bwjGzldRpp5bCJA^2n%FYwutb| zq&ySY1QdKWKdHZ7H_duD%lyD$U3GDZzS)BFwmf@zlA?_!?#ddR_2^?8ZoA`2O4z<1nifKn^y# znQ!IvrYn$22?l^z4^Po|J3^Eg)0z6p$6=_t93E6QB8so)=hatTCmLjS*hX7K`P>!-5JFOqd&) zUg0kQ$Bh&ncW{^cR8sZ4wZMp54ehFpQ{#J?{7@zS&Hwuj{NfRwB~bTK>?@@?EnR=M z2?JIUCw$0M2o4`A{{=~aZ+pFL=2`)S6{Sr4E3=Iz1H4zD6hH+jJVm~LfGd9da=f=( zTpxZ7Cx;iR{}50b1ekdtSH_Q7yW#SP&m*dgDY+nd5u!YN3{o|}5|H>>EC~UOU@{aE z1Xs+KdQcA01o5?0h4dJ$9zu|z6avApj5!Hs#>$B%9pBU1 zV~4m?rMQMGVWNR*i~#O99Y0+#v0Ub<#Dm?3E+vAu(kiiC<})z^nptHm0+zExQ#k7* z%OTI(@v^t~7q$=eU!CCA&BPoA5!`R}v7@<^ncww2*i$7e_PyKA-#$Y7C#|t8uwXn1 znv?06*x6jkZ#G+d33w>^-4|N&5-`d9D^3A~-8x-b(}7cM%+?2w9=I@mxyk+i6ZQW- z_fsAucUu~|xTcqcZ&#i0Vzz&ns$fG1F z0kL&PXiyC8aq&51b*TN`as&g7=_gV{CrlHSEJt+`{n@_FW}oGjf+wPcv8BoLHr8uN zoHZ;#03AR17_2YF0Bhvra3RpN$Sqnf3erf{-?6%I*(7NARb^Tzv2@)ht`(zLlxFJ} zp4dSU17BUhhzYMfV6d9Q9FGtOrx+wi#P0oS$p*tkO_a9uNdzmi6H2>Eb5}jJ&iS$d z%@0a?iO%LPJk%Yhc~5qY);&q1Z2Am*lRT9|kvJgeXwB;^;K#hY)ug$Z@45f4-YSqY z{mMLH!s5xKgL`p*`pzU!;)QM?=48W;`6Ab$SYJGb|M{Z(#@N9y_poWIcaqw3AMUr) zP4h4NZPI27{`S?KdnOIqz%OT5=+!+;P=0h&pF@-gIU%kc;eqtALNR5@=p*MTc|GEy z>myLHOvjYmnL5S7-I>r(%RS=1ST3f|b0ROH&Qc8u7s_a7gPHWd8ORfxFVtpNpsTCs zY>?L5Ihk-?xV|$~$aq#?wmim)oMN|tZ`^vrL%-)5G<_axdl9C9*M<2oVK)2YO}rP7 zjh8D->X3mUgYk%YJ*7PN%QDbB$sr($W@Fgu#B`0waC#g%MvEHt;K3SfxGYZ536y+x z%V0G|Q9iy*ZUnSU6-~0W*Nnwr!7yV~g-D@bVT|-Ll(FvFg;5|C_JSp-I~`?W6c)s_ zg_fz*8gWJW^Dn53ku3MN?m9rgN9?t z*5EgO7^korQdJ>8?sOI-Me?&Q*Zd{W6)4sH{qY9BesT~Y%-mfrW4HMH*czwWSnLiiDeD=04SNmM_s~F2({$Mf-;!l zkEyFpN zzGXER7{TCfCDHQvn(8*kYqsS3^C$M~uNA_K`V~3@U*Q3M4_moL!#{WZdYx}X)i&x? zy=X${;3d}&&vX6%M5kYm1-~pg6^N~!dDaK|y6NmAgeKqIZTI|nz`2`!DEW8%|9Ry% zf9yg!_1afF+7ObI|2vkSuk$BmqtAXJ13k%M&k7F2#p-?S;-+wBh?^xx5cDs zuw(t~LCq%p$0y^eHsAS{l4+lmJmR$;VH}uo0iYN_X~2y8*3_8AR*`@ZAUd*ur?mgQ zD31vmR;64e7^v5KwwmPS!w#*C$I?-icB@=5ZB(mbFLJKDXl$se?+C3f(3`6jU|p=t zSBp=RcNKJUsiOC}V`wj8QFqq+l4=3JP1U|(R?ovc8i2R%FzWnHB0vAifjBo1dX!>T zPnRioOQ#lKjA4(UfrOT4zkc=Epjagk%mUh* zc*uYR`!X`c14cy?o4#uptToz{Laos9$=4!ozmV!xGU_Q}z1&IsTGA0aLKn@lI+dNp z;SwFcUUB*Mv)0rKVU85{(+}rVMvIW|7tf~Pm8Xd{8xtQxv+B{hjs0kSr?<*~ch#A~$=*#mvM7q6b- z4@D<$N*=Gft)_3r(yt89IIo`LS6%GM zK@yyP@sdLRmAcV1t465*r9}2q7mUG||M;Q(Cy)>o@Dsq-j?#^ygLHr+B^B`vFBLx! zZ4h}0Fa|h`LgqV|pgI^QIbh5 zo-UeKFQRO+u+jxx<84`@YfjLRzutO-J7w_)YQ?BCyTOOM%}s zOqO;OJ*_?P`tER=cQ4!pIfa zWWK(qznv3fhG1@ab8BR1|9z$t@XDkmRAP7^qCj*e!uP+i<&E0*2l zj3i%8{M%o?$a=Mt(`2=G#u;jmbmZAlcWCx0+qiUS8@f>X{-3(aRY%dCBe(TxZ$!7j zZ`Yd(gJvI-FEbv_ZmUtw_PsxS>ehrh%S_#wzxgycoX|ZvJlo%#e_Q{9I6`N!**EaR zQ20ye+|%46{Q3!w0t;QjzzDnOYJr^*K$>x4Ah}6^V{~8ypbQ8GDGgTbZ=JcP{euCz z)G)aDlq9#So!_mvP+&;$s1x0Y8R&0~a#T=h>i6=MH(4BHZ^&btEMb1!7qry)>z6-w z_2eXRE%E1D*{l9a&Bhs?49HLZ7!UxC%dp@{B(yC9lo4dG>$xRdnZ>lH zW*#iZg(Wi(Vjv^wB%FQfqG=MUlRBZ0K9fk*GN@v*whSj9 zX}j8fX{eAK>jwVL*X{s!{)Yaue!a?Xdkd|icPZkP(CGoLW3WdlN^2fnq{zVhpx(y@{AYk zlscKBHNsjL9sQ$+i1jQIOeu8~M_Uev8bQhi9tLWMV?RkiWh|v*6}i)RVdaD2^vlGU z(tG8|<;k%yg2O=>)KLPgw`G>tEDQul%unbbGGL?t5k4{k9p-J90Kh?qS@DF|6QP>y zV()rnNn5^(Yd{_jyt+>WJLzx9!N^+knQ`FKl~0PfPKCAQUCq^4pH{{GxN*1M>iX;r znh-u%C0thV>wm1qrD>EYQgj2v*t#8lKzgH@@%e|=Afj=^&)4%@uaCq$&iL<7r8C>+ zhC6@Bo0$GNRdfvr{U4Cq9cp?pfxnpN&b8`f5nj!#DrwC-&`&|{#D1xo)H8*lkpARIzR#rzyG1v z>qIjV(uxd>$&B`8yD<4QE$+3q`55xF5ZjZKdtb5wz6uU`4%DA$x_krIgv+~9Gr-}e zW@1w6ohLKhdu-iNY%nDbBajj!o&y-nq=TJAJvHH*UH2rN$($1?WU#PfiB1rneJV+? z8O^p4t$(AfBcjYjxT8m%)yj-b5!*RaXiPNQ;_OBGIyS!tO54RY)~?Q1RWF-t7gO!9 zW9_uBy^`Z+kZEUQAD`I~?%m;BtzEe}vcxsI{K|RwKlkA#z%zaOy>E7LB%#rpgE3`LkbHr_&`&&kjyjpQtKJWm{(c z%+*`4)MLb8sFSWY#l%ZD8I`v*I%h7ZGP0?SYD8oP4=7iB%mS|qYE0cl7?wMIq01N@)~{!7F$ z?82A-7W@gxV}11}6lXGn)QKj@(~D|^QM>5yxRM5et`rYAR*K94RuV{u=dc-^(v z)wsomF|(@fhOv64Nck+NUkGq#=_w5bRQ?vK&w`m){i9U=%W5~mfYc6)&PrT=qNg7( z9Z^d_NJXlRI9=AlZ6_TSWCA^9hQi(&`Ajl+PefJXX~}-#Wvn#}1j*ja<6b?KS7iqT z8XhwA9QStc=TLU<5B3FPwZ}cF#%q#@t@U!h7v1 z5+ezfm1#0A|8;F6bib3=WX7*x-Y!|@_x4r5QN^==3eEMgsbSMyh|F(~`ZOu_SGW2$ zt?V<`&s$Df=02GajRmj@yGDeXk_>?PAD0mh0q6UiyT^wUk>m5hzTw>a#J8f!up5ka zd`RMX2E>e^ZPU@fZbg1%^{v2_v$(CXW{=B_vHM+)haefgDe2OUQIoOD-&8Y6yXo1{ z$A%91w(@O;T3=C6wVfTm&)tT$d0md()np+OqZDt_&hwg)9L)to>RT-ghcA;fTbS{V}Hr1h!R;N=D|~xcY0lB z@{yG7EBU=^;(I6WY(swoMdbv=xbwX_I-Qi{@~JNS^?ft_k>YDr7T8oBO!1%ZdBGd_`EI=w zfW(%UvO|GtbI<_(xrC01N|X#xgh|(#kg|(Ft5CIoC+?Q0Nj=ooZp+pGdjAj@ zc4Q0G;VlttEPW`u|(FP*U2~T=(*kn?iy|rjc$y5-oY347XVU`AW+(N`fsRTJOa(E1gkVclY;8)Zu*G>g<^28!}kgh21 zW=^zB9X>>g%vldov-`>x7=0ef8V@>|6w3Mi-VDXAQBQx)N~~!pN+O?C0|h*I}`^1vB=q^O3PyUX4>_|vw8fxyL%4k!^2~x zV=XrjLg==AJ)Qv$Wdv0oRPqdR%!Sv!*N7y8UcRHw{hDXn<PNb;_ruP z{N9(c^0D>AJ-`SzBP;v@GiD5PAd)OfMG1o(KN&U-W3B+BkTad;T7Nm%uf07EJs8fS zjcO=ti0i`mND=+*EcpEJizYq0t#jU=*5>7NLE<>8_c+ma2776;(>WKrxFo#vdEuDyjtyCac)1 z(tlF?w0RuW1UC5k32MV2cTUPkUTvTZQ}QtVyge?;&pkiv_`M6M755JECsiywY}<&I z(`o|(rQzRUdHd9XjT9-6kq_KVrE!-Q2~ zC6B!K@#Vo^*WE}tde#aVTZrD@9;k}}z!-zl*OHBG9y4s=YQxZr!d-Lak~Z?5xu(w1!ErM(&-DXO(8J@+#hVa#Nb7hSp}-|D-!E|2TZWDmepd%z zF8*+=oSF*xiY?W~P z!?6-qvy8rwP-qiOyx-1rW*&dqSV{ZtJKVCASr`AHaCy5~@^@fCmJJyfrM!0P`USQz zVv-R&#E9joJvFL^YiZU?)2sYC@s1fME!)!Qb8r;W&9h0I43~DGJZU>iH5P!9+!){w zEtbXRJ@_z^13+!iF1Vyf35U_n=>f-*$D`D^wDd^1&Ju|Vuoh?(6uLv zHA^**)Z|sz+C=f0;rDnn6rm3!piGfX zWSx+diVzsa@F7ZyO~i5V=NFMoE=FqP@G=Dg675q}4$H~xBRO`K$p$)^IA6@H{`Kdi zw__jD6Il&Sv)nTKDvKmI^$@8}aH>>U)>d#cfro5HV^R`vB&nXB?jTk&8Fo=c{%gd8 zTA+PQ|GpJ~kHel*q<5-6-q>%!gB=Y^oXhTtME|RNuDq=iyo5{Zf1?K0kBsPr$a?S1~{9jdNcdU!fL$nsYzyqI$uiwv+0C0y6i%f5i=V;qL^K z=Zu?9PF^S;uHBuLF{G8HDPFWQ%OQZ6uNc6l`xAMgMIB3;j^Bm=h+pNl%nQZX1gORB8aY0dv2sTWyNFr_DHna-d7LT-7qc6dkiresom$maL& zzYaX^@wO%ie5MDS|{13Q~@l5m$xGDiT1ccpRC}{VEfeHPPUImT&_DRyiyNvh%OM zi^(g3vIG$PDw1uee78@A!6q4vsRnj10#oCFP^mG9ogA;M73PfG+i0Yt=Gb${Ve>UV z^xS%G4ei=)p+doHspJCNQ}pwLf8W{JSs)<%G%fwVLw4ue83De> zf5U5-d;aH7MBWz|S_44Z-`~IPcmMel3HWAS3IL!jfd}K`v@oDw?v&#iQS9 z5pP;t0GE@0rvoO_D*@QZ*_be*C;nMS{LY|YQdUAU=>ng8lLSw+@IL0s+G?<}zE+Av zyV)TkZ`TruLo%fI2G}Pwk|<9#e~~b>Q$T$e6ON;}*Kpf6M$Y&iNElwTZoROWuS+n) z(K9O0($(-`LbOcuYx?J`lOx4Ua_+d#JU~W>oQ+weXkkXLYR}ND44ZuxoUaiB^#(Os zHcvt5YAblp+5|hY&YF#|?0e`hhcT2X!*jW2Vs-f(v}0pCla9}St?Bv2o+&DcunC0O zw^;1$bxa?ND(foiap1k}_Vza7j|BqESamFm5_M^8TK`$XBMhkJpy}*Fbn0ErfopY2 zrrTKZrm@oNY>NK$8J28U9%0gz8A-xN1>eDh=%mBlNZ9mocJDV@Pg!@q}+EhR;dBUmH1f80D@uYoF|WXD4QSJa|S;dDH!JR@0lazQT33IvWX4LRR9u zPA#akzXb+i-V_gA-5)p|4`AEH{1x$qUmg!j_{vFx7%at*Whu*dy8S_=V#Y zKG z`5URJmG5=c{RaI2K z-U)gcwm%;w5aA_A)C8oBI6etGEmDEh_30S}PI{X`>qB*nVqpY!a&jpWc1CTAG;D%c zgSA`&O)nx_)w-82mp}Wa#KL0t#;@-~cZtuWwabXIJo-On7zNSn?)=-N$Ki%X9{)8$ zBXv+HL86aS2~SgsRBbh_z=2UOO07j&5}Vt!uDrxX6T$zc+I|NBwZ!HwjFg_F_St6~ zA4v$JIK>-V@XHt?Sw1!7nv1Zh^zgGyt~vn)fd+v(mBs|-v4tLDi;0-Qq(^#h0}mE7>-t1TwSBZp|Nc$fhK>&-BxB1I_hp{IWm2FQFcqVRm#b!#y#15TD(A z0!Z5p*YCD_hdawsx&tzS>>Pr8$-yp2kZG567p~`mx>D`fNI)q*D2IE}%@)gTzG~rz z49kaH^w@^ppy=fD3(t|&Z(lnve{5rCLKp4d-7n~dJ4fHX=yoggTb{l?QzF?P{SER~ z#ulMLN~1&BXEmVyWaAUf>e8%^Mej&uO2WXqYmqGU{$?dcuB~GD#*b9U-`_0~8NIbf zE7zMrNK;LXU);>pa_=+qpwX+0)x2DCnN7lkT$++HQnDr)h~?mqV(&Pd&M%MJHmpC` zT#bW+&{H3WG4)=FTaC?aY7NC|uE&XW(s|gttCVmPym(<0+4FuWxV_jFE8^G4`!Hv5 z(hGI8$khH4s6~4V%+}`HCTcHgETcR)cDuMEg$Eg z>-6NPWs;3nVb*A6Cz7RkI}l36p)nZqq*d8q43ISEa7XUKTy{rxYfJV*_Ny<3KpqTP zmO4NVn?=VJuOvbJivBLule7?gKR^F|GC{o|94}9aF64klM8>K=ZVzZ;+a}}g>07uU zq$B>vT0w^6LT+b!HV+qIZyB#AjL42>cSmRqAw@8ravc3be}#v-KoI7Gn!NzP!8IQR zJCM9&pbhaT(B^V2oA4y&71Tz?8F7U`2rqPmDa1UO)8r@A##`({cy_J4m9jc2Pf-X7 zK{`Qv8IpRWAl(W)l3Ysc%0cNuk*yUalGsg2V(a936*a{zj2wlS;V1P!_D^r?FX8Eb zgKRi@2=`ILTBUV3h*!5lIwzYbIkCu4dtbATCsiHSRnMB82I1=7a&mPrWMwa=$m=Yd zs*uM~K%)(AaZ$~%>4+_*yc46E^`(^$ph1-B3)9BxC@AQWV1=kwrjIX|CKPEHl&Rg| zMYXcjpTq^yYPw2BlPdjZ7`+*nIa4M_ls~1fU8bAgEEKy|PJw>=b^1PyEC;myaD;?0 zE=n{PCYSW_=2GUP84M{A@P-R*HXq1o!#aiqb5k{@$TwtC+x&#>{lVIpxLBBY)gjy~ z6beugL8dcjL2rQ%kw}>6utUK&eH_Eu5L7_!2yS}e=P@dB{#wFBM8S&I(N_bI%%FZy zu0ZwO_>#n=o@u+@?^RmcDV#Rv*6f-_5|K(rk6! zDo$m3RiS^fEgt-SG)#gR2OaeFS^t`6)PzAy4yuU&Oy~cB!z}<<>!9_Qo!UuT>IvT} zmxxeW{!K%rmz4{ZeFrS517kGd)m|jQ;pem%rtmObxxJcz^!9RHzyU9S2QwU1NJCN% z5o+ntrq0_#d4;m^ioq%ugdtr^EpP%9*qndiZL2Jx#G0YLe&Y%f4w!k3vMlY~61k zYf~VuE}iTte(!j_EF6}f6&@`F`YCgKoPN8p=<39?5LiZ7?EVmg_jNz_&i+$|p_V(g zwy#~gQ(19-UnP?Y`vE>xm7j|kk0$Y&)j!RvzasRV_waBwYk%MM8&f}UJEm2-k~=a- z_`xJ>NFaKg2`tB3E~SMWmm3BKEd18w0~iB-;@0=PVNMef^A}4zFqog9KLW=lZ%Wb0 zQ!pi!#*q|P+Iz?(R#vd9bZ1oWp95Bu#U4rAyOd~%zplkRAY(TG5!97!W^bqW`T^< z1~%8It?hC^B0oEOt64_bb#JD1BUGd2HrCS@M zmaO~SVeRayfyV1li&X%reYWc7X24#Jv@1E+AIiRdA7YA@*1RY^jWGj-BHX6|xITn8 zO^*R>7w)RoF-D5gj|5U${2rfq2hc%gk(lvL_8}8Dc=zp>@-O#F!PMpQ>JF|F%x1>u zCQ((3_ACX;qw;s+Rh@kPyH;TF*{k-w zhN4F2%<1x+F2pi2BN~sKRdT85m&bVWhiZ$e}}!?(SAPr9lu>x-}+_!Em}lwUWuWBR8} z0ez+w;^wkawEB4aJS5*fpYc~QPO>ZAsNtHF&%6lu^^~_oF$GQ zA}MRmzPAYk^X_yYN&|r~UNVKh-4I|ptwVsI7l7-L->b@Fd-<2Ap0yx#$B#CJ6#Z6{ z2gG~C)BocVMs#im{6h9X1^kPYkVidYrdLhV2!%q1LaGUf>f!hrH%bx+P2d5hYa{OMqgw3z|ka#&W=Y{Z{j*jCXN&`MEe-rcC%Wze`UNe*J z+2N=Ao?J-dE_T)5ihRZ~+1VMye0hqbl(LP!y`YU84*nFkds21+>s=NQNsnFM$sgg|f*9&-T|N9my(vouO+ zF#tA-qQ&Vp%BOCPMar*ifo|RBG)fKuqrV!HrUNLAR(?ds$03!Z1)If?vVIG|Kuv)% zRR#f?!}%@fRH&8s8(cJnsq8=~1gHZxVUi-6p}vHWtO7uDUP>Dgr?)2>B(AVg zv6?s8JLz1QnPYBXSuTq}A6s7O4&MmF? z1mICqqT+V)3JB>Q49e;*;^CrW6%7(Qxau4+#44BjyO%U=a6X53T@I-xx3>o;NhNlKm}Df(QwOb2^MLofxyb0zzl zzPWo!SdNyb9AoS>;l!9XA)Cx${r6g>!=YbZv0QH7T;i0KTey)#pC{F4l0(OXs7#EG zB~ez0*;Ta9U(%8))5mELkBkbWk?B$zP|YeNdT9Qs0Ms!?IibxZ+T1FuR(YSG(%ieK zB2mW%B99xviD}M&V#Sh{qaq9-$hTJw9iZjeQ5Cz0Jbddu#P5`bwwIM;W8aUas)#B` z7L`SZN;d?ON&iS{BJ)LM6_?iU9a}XEmnbZeIFL*xDYdl6&>)2khmwO5_-N0z1|n^q z@Ozk`Ee-UkZu$i#6-I4sp?7@UGKyLNw1L6AqT}R?5(EzMaTlJ)H;J*MOh-Vwcl7Ov zLXJ2BYX^BU*y434;=at~qHTF;=-L;2ZzAkAo#ykY`_WU6^L66^emV2CR^J$lIJ>Vf zO4dw{BQQ_ttuK@=sKM08WX#d@uuHYf#M1A}+8^UKC61-GH}i_@T^IXt*B|I2y|<0i zYe&p}XD#O$r5o(T=|&lOXZ?u!h8WEMKW#x?9|sYL-v9rccfRr@=VNJW>LV#bJSFe+ z#x@3U8ASgUBLe;yNBq7dKv7Ff$+fPQqC@ zn@Z)lJh?VwR61k4z~`E}Sli>2mh<_^*{J5{O}an(y8~yZ#cKBMbibv$DaR>0PM2ec z>X{=I4YgiQf#JM+afi&dpM95%8@`|Y!7x&>pTf~{&=Q91Ez_TbF?g4eE;NE{ySt_y zVNp?YJ)6Pf#?hbr7ZeNdrtfsytYZ}l8zqL`%B#Exzx~0`rzW?lRrmR|b(N6$W}?c^ zHuvgfEy?QRObjtNtHl@G3`xFU5;{0S7A;!ds$a30kEYd4z0#J`~Q%^CC9myVNCJ)Fd-?q)kmUP9Qxhe?4X-H(zAp zWXd3+!hkKg+LX||!t9o!`j{DnK-gSkAaRvbI+QZHr=V@fSsIQG#;I_>z1{2>LgUZq z@fiNy{kyYoy)YO;+VBfsE9KuVG!Y0oe7WRm5r`tcOCI+F0EE6x*Fd@njuxLP#hc?> zp3^bOYeRk5@;A+&J}I2Qc#sQ5{_dy6SwYBbIXZSOG`^Rb-~E>bmiwyB7F~23v0ki@ zqF#l%qmJ^F+{ZDE=Q*0gg}n8-@=L}#9g(L*exANkE+8_gW9eL`PM2$&620J@`qJkK zxQt~toYF0SZm@Pnd5~O~c|b+r>$E3?ivT4#T)5I!RyH&y9W)aRC1l0Y^e4qOc6J;w zsp2af3uv>OS0NvuSLSbvPY#pe^D?m>2bx$@K4fL4F6K5@w3}D6-K5J8Rhi;xoFIw3V^M34a(wGmZ0nmS=UIKGImR2jCW7lQ}dOU1(L@CpURi8iIBOr0u>r4 z2PHo1eGEEEm43;>E+r)&j?Ezkr}89}nk`mKL(?TAjTtKcYHCDle;5qx#e3DwST|B6 ze&;ARTCwwXj?O%?GFXKi)d&N~fF`Lu<~d$s!6Sz~5D8A|=+ZLs*Bm#ZHc80sz4nY} zr8@w%S{yJh2@YpY%rhhzt*1G@F&s#-&3Y$&l}ZC|Y!-(6i-9GFG-nfZ5;V& zyp!yCUM`;h!f(V=&h3rke`3g!Kr}-8IVUClKkCSeffI(+vzrK+A7_|_23dA3l~EgO zD`vFj*AwCIZ@>M=JUw-yv5~W8v?3g3Rl6ap5bZ~N3P@;ZD2sFI3Py&sx9&$J$~G#j zx5ib`Ni({C+?^6K20>Nfy1{9|8QSi5ZOL+5Gm=khuYDrci+)9oY^lXj%u~S?mn+*( z?O)UIJ0v+PRh+t`=^TsWm7EZ}BK#viT%X^c=h2U5vH|W7J2|p=UjyL5c<)UqxGa*$ z8*ET8Q$JF`>9f8|w(g^WGM2Hh$V!TjS=GIT(C{qN*$N`>t~BvQ;9e2m+${zi8CuZk zSfxhOey3wZ3Y;SSWv7gMce7lrU;7iVvMlO%gem!pFGZ~~USDwWH}BUfs5wq|BqZan zi$@4|MrH4%Lszxl-_YFtda!>>-^{ApDC5#f#t6%$^|^1jK;KDFWU^cP7BmV#W9R;3 ziaSKf>IO!kMJFV5Zv;roaJv-vOBR0OqNsNCj(elmJxVmB49F-E zwJeT)pg*A_1n><~*vRm2-1h_kBGH<4Qj)b#9ama*icxrGRxDM^==sf~j7W` zRa8Jnby1cjK)3Nv((l$!!U(i%h)j*vZ(VIHWy7m3)G{Io{)E0d?WXKDgl{&Xt}d)# z-S`Xc+^Lx&53iu6#vvrQR7fOX+6rvBHEh>&T%BVg2v^oiFWKa63CSv?{H#%}x}m0i z5v4^yu!va9f9m48HA42|^e+OqP$Dsy?|9EBnkH)wC;?g+!4>t6kVW&j(79w6#JZlr1^=(pEP%lv?#ngR%Mq!Uy>CRdq z?+F8vWv0f7T=t<-n0#6H0S<$0qB!xC5Hkkut4h$qHI`3eu@m1W|6<4+|TTHLGgE^n9>U@o1K+;!G2nGicP z1WL`Rp|TX14-EX~#X*G1JMKyFj2d9XOFmFAj0ccq?s-`xrzdX$n&YpCZwgz<2`j#a zc|W-{z*V}YiaNh^#-5acx~R!evFTTItSGO-XzMG!MJsF9%*Z(qY?ND5vtzYizH7EM{Ck`8Z7+?jO8Ok+?C+5H-8* zXXA}}F^vZs+bZBhryX1Vm%sWR7}kZfJ*on}7PhO8*2OV|&c$-I4Rf^L!|c5-_hW%3 zDUnfzwTF7xl!J?H)zwLJ@6YJ@^;dU4x{U}7GTci%-2_N4O3Fw=L-}tJu7iyP6fhBM zL!MwfI#DyCCuua@*a#^`Rc0ZLELRY~G)xm~bd<%T-4C~bn{baULJ{Aar23Sk^H#wC zFLnw~-7NGh&Dfz^g3~AkmBKEwwlpt+952&lB^YOvpFY!WOS~j~zRYlRa-u!1tt)o9 zJN9q5O2y;RW0Q|zINi5T9(8+fj}MzZ7C>mJaWIVw-mS@?MDt?chX>sJ3dFPrExq?8 z;YXoeyeiMCyBSe)MF835i!w=KOrK1b=#b^%&W5&K>RVF17R!4k8DEped@3+n za!i{lBs&i<%~j;6n90d??8K=N`&6wIToLTltDO-Wx{k|)g44~5*-Wz;LL9nv$gU*! z(qMu9b$!^M>+KJzB$tbh@th*@RfMR@*1Wz8m$cTj1vCI2 ze}>Zn=rt8B))5cVkcTM!^{1(W9<4YY=s~yh!IZTTixhYI)xLq~6vFq!P5~|CRBb%{ z_o(;S+Xa!M1&-R^d9U-=v;Jwq4gifz?;pg{sPwKel^q8*bkk0$mT>_l!t%X4Fz&&t zO=GGaVS*m~iN6Ysn535E&GrYAMpN8mWoE1TFFAQ)-D+iAG0mCL4AAl;<|y;GE7gMI2w4IieBa*v+1csOUFW@I{SgI+GYq}eb_Jtuy{xe{8$M zXJEwr8wW{2>coulyC*Tyf0}TH%w*cmArobe(!*p^)(inq%yb3hF62;Ic_dJfCDxA* z?7>cFhXe(gj}u~nrk3FZ^Kb>YTmI0li~9Y!^5k~AN&$x$i&965hJ zw}A6@f2PXg=gY8G6IWZFiBkm|^hy#L)t8C7}V!X+vCM<)!CgHDvP z=k2!;p5>XRe7)+yqpb5X)XOb&WT9r9g{nSkn8?ch{i$)QP;&(cUXs{_xW7@Q&&j2A zkPIA+WQ(I>HOBK%{jHelG#56c31uUWU|2!PBOYqSv{S(&uD2(0WMv)4V>%`I(WW=h zKE2EQ zZOfxt>)E-=n9nv}(TCj4^+KQ2Wah31u@9_Q3qm&hU>{l2-c#vE4r%@`CYA0LoB0Qv zz^LHioT+5kipg*3=+l>AgwGww9=Qd`U-L^sc#cqO5x&ci{mn@GJ+v@FjrrW**^e@ zvRRH21$n3i!R35HGC2OFOp&;@?{tx#Ddn0ZohXeRx)wA{MWLo)>X(h1D03PWKh#8Ar_Ism1HTzea0kA>xPU+C2qjn_e_8vuJ;mT7%6WKB76bsN0|L+~6p08zl(7FrJ( z{1!n_A8k*fI8?Ed^Hdy7YRc8naUnH;{>;HIoUqJTu7jcf=MeI5((JA$|I+5;FeAkV7A{}JB?6f@OWUBm)%N?Msdd1 z93ww845koNJ+*(AS)8tPh)xHi5}9Y3_6s>`wd2@4HZAA>o^`P{7e%wpl~ zW5Dbv5v2gtgyw(%khNkOoRzalr_GY=;`?Wm$fHuvJyarrm!ThA8dn6wxJ}pNqskwe zS27G}W^xToYOkL&F4Ywb4fyruos?8pHGki)EoErByz|Dm6>q=6#T>f!Wy%hN4PY4)a7nVMb|2Hj38P)>f=a#>zvHO>&FqRaFk*=u$Rm zWaCv)Sv+i2mtlV1k2a}#TdodIEeHF6BvlmtAF0I19vEDbbsPhH+_%+}rbIZ}nNy2u zsy zsVEMYOi&j@VfYI8QkD9>P$sSPJOd5d#5Y=2EiDEVH*A{`ISRWQA(gK!W@b1&GZ!bY zMeDa4HFA4a+Ul(Ckd9m*a;c)7+0ULi1cIGxm2qogf!53nFr$q?;5jp^gkX{6!PZk- zp2?Po>-*)eB}*j!dGFdhv3e(rJacDW^&Z}*`8^^Iw$5+DDeu&M#GbYqmL;wpeQ1`S z{|)$0%!xq!3Yd5p!TaF%-^VAX=l9c#+lR#50C;n?Jr)>3HXhjLCQJx$Bw&!WeP6<# z=UE*gY|jWL;TJ4ua&(9IGN-Hnu>x5bi9f`|4PE<41Nx}>5Qqx&wI1OjoC&w_)3MuBYeKI3$fDCR{17x3y} z1K?2fvFuSvQouIZohQw7*r9m9ORvZ8gGafZ4U%k(*!W7urKEd1%mvmSZ z>v17|0v3R%yFqE}y2HBB+&Y)GNhs5jHYty3D;-1V6yHRIAgPI^v#XXn__8K4zquk+ zg%JqKB1I3iNC(aEB*y0mgzV_w#KvfOmRPlbKcSKQ9EwClh^GX5RYgYTCv65x0$<_DJ3JIpE8t3EHtwg(dj^F*B#Fz`jT~lg9bieYa* zog4A8J$~3;zkkuV*I|WC@)bq;j_+$@LuM={Q7i*5==(?u z;gM=m`-$dm8F7U{gGPwQgDPOVb3E(sb(g+SXO_Pxu~N7d`gZ6r|* z!`CzDAG$)Oa-_-o#tCgbiDI>uX_`7zGP0zysHTUAEWsn+PP&klMmnfraQ|e4&BU1tDP=%bm=O_mV*b=C$6vDZL9;>LR${e}DP^;|R817#DThYKLZnQcq`cvz{<1RA+Ube*a?W z#Wq6Y-r%E#FXy1A(Fb}ko6;ZZA}oDZmRc$#VY0>fUa=|X)%|;c zLh{^L7H))#ipb~hTsAn#q>QnIrTroNg_1)y%|y>)Ao#$xn%dFw4`$_-9(e~;9HDro zIK!w6<7Hpg8*IFl@gNi_&Tq_jCHy#BFx6`ExK3I02n3bo%Bt31e*Dq;NiWn`y2~L} z{GWh+2ZA!~=T4O<|F8wFJ~HE=L09t?{xuEsq1t=(HRxg}JDsSp6}^Cdx}_O>?eyb$ zqqpS9L+<04NmlKG^|1C};&%1ZEZwfIpXnb-v6O zn7nKR?s(ZDD&Yqj{Tz1;e%GMS<3;}5Tf zrj{2)DW&3-JPAq4FFVy+4Q0g>tbIPn63W|=LO$=dmk$=mtC}Qcw}{JLdM6Kv#jF63zL49x%HFmIQ|;5%kO-DIm{^ZPfC|g8fkC6u!fsYrmp0c2bvZ7S~^u zzun>!!J(szTXUXBpFiVegajotxTO<+RJFW$yD=;*%~m3ml9rgb&%=vWmLm>Q{PE9{ z6jpx>a3kl#h?5*Qd;bM07WhItVziLI%KGQy=d1+3?j$1S<>OU#as3*+=+dndg1EJL zuCuno=jd+>ciU=Wy|jkpLYaFsNnzgFFcC`^f0^*T*?Ul!f+@Hrn3IbMwLb$$FCRA} zzjmZrRP+<#Js7{ttglA`}=V18Rm;%#@lG zrjM{v>gHAm7%o7Eq>+WA{Fb96ZK6Y^ZneZ$ylM^?xO%+yd;4rzNYnnMQ3AkxRiN|S z9D)^hgBrSMPF5ksI}@I_;5_??mWQ}>$(DE&5JD7!*r}Bm&+lD&g4j_+M)If?r*$+{ zEGD7QXf)*}Q+L|NzpIQ`m)cXpiEk}W>I5&WsYr?F@`1805nZQ>SzJBfSQe)M%uHY71;e}1h!^aW; zfZ4ugP6BZn#>%G&ch;CV!-pfuHClVlt1HUT~=TA?Ma2bEMaB-x$Hs*!fKo+bB?0M%h7fV z>z_#ny%oawEE~+-RvO(=vt-(kc3r!C(8J!YSo@!V zz9G?O)#pz!Det%d;}RU~Lrc+1~x54!nJ15SuF?!Ev zxA+Msx1|E=reRq`Z@vHg%9KRx@6NVAL*ysu zIDtecN)&02tQN}r=8%MF-+5@~v3p}gVl>%%nyy`?UzcNMdd$r{mS>0)008r~G#wr` z)9IX{IVv+WmYI+Tcco8NMl@oQ(i4J@8icAFBAcQLeNOa@6e8NMx&ek8QuYlrw9_iB z+QiaXktR$6dCjTYCt=%qv#4f@x9Iu=s-W8fRqVAX^D%@bWP4 zsduJ@qwbTZoAG<4;dvv{q5(ag%JJ(4XS8h1*XwBA+T!|2W_)Db8UdnY?;c}sxBgY6 zzX8z6Z0DVAcCgrXL^%rsfeejDA{|pGK)i$_A#^xkW_qP4VPUL8hg$8F^I+QbRt0f4 z^Dj(z9KPkP?lRgQ=`fl=AUgjyPC(w}|L@(uv&!~F`}|tr4h*ps2%;limkZu#Q!z)z z!z2+}z>usWozd*6*M2(R{%)7wkmf-PT_y)`C_|I`rqV4^uv3ieky!cv_hXN`$niNe zNnH_76J{&D^laDh+s;3WbgD|=X>HsehCzP@(G?P7H5o;(aXyerb5xOPf>HQA_+0G- zz|YjhP=c{>oB#;}&uB%^s!##sfLCsCkAjHUcGeG!K-H*_D-7;_LtFi|f~)vyr`S>( zL{V6yJUtGm>N}(P&=)9yVaoJXNZZ}VuAd$c+)V>5w&Eb?-S_3M1o6W-9`qtUpNi;G zE!j4$b=iHCRKHG>65Q`iPP+QRKjTKk0D7|&Eml`!EEoB9KEPt-5l62>xiAx|)C6+l z^b6_yZPET7fK8BEhBX&xPO2)k>}C6nGn{SHd32wsL@TRppXk>N_UeSl-C*XjS;NB; zq-s_DYhabUl|kW}iN}U#w_zkdh?g2iF5rG3lpnKVU5j#KYr(%gLlaO|XEQj|pAc{L zP1-^W*Hr>8HAoGDccVslpF_`q0;u&5&!^u9zWehj6s)6X?Fcr#$u?e`wkZ5gF`*aW!oyXWH`Fld3V~PHsJhf*?mj! zn8V`kKwQG@$N?r2etwi1XSET4|6e_R^r7_GUVcJ`v;R4sd=U3F0uK#@fC87W6u04z z?|aPZ&)s0b0C1%9u2eh#2BZsL2vdJmnbu(a$!L6pnc#Ky8N^(wG7mLe701L=&kH{H ztcioq`^X6VwGi)&=nRMD!QPJtP6~~c5exvvb*ko$~+m&SU%44k&XrhZh!7l`3P%S zYj|+^kc>OQ^enLx(}v0D{krz}63?OWL_mD6_S5gYyp5)j-EiNdaKiw;r`_p)dh_qN zD4*$lY>W_kXv;rJBj4;QnwApDkRuUVe*!`WW4I_~w6D>ICN$;0r4r689`Gr#RY?`R z<42|3VdnbgUZrLgMSu|#DP%9igGo?UqCj70Kp^*3Um?!BVBdFFOUstfiJJHAQmvq4 zsh-{vr-Tn@VrCIJu~SFucZW~PRjJN4M3;~pxn||@T5sa+XSyZ*U&TE+IF>DqGNBq z7ODk4;p=9i}$SY z=ry*?%Tus3^lUlZz8_7xA)MfK_N{vHG*Gl=8A(rBnP18KxAo^$`ar-9pWx0MBje(n zQV}Cgx|?Enz)CN8D#~MvJ>W8QnVYUA+1Dr+LWC%m0Fq_r$Bl$MAzZdJ6u{R*^u&AvpA7X-;>#fFVZ#UlAkLOa~b-vY|h?gZFxR z9_HFCU=#mRQAsJ~PLq@cTJF87NNn5^&Kf8R04tPyw%-`&!%4URk(OIXg0{HFaTz=) z+6-z3p#Xtcv>SasuoQOXXRw#!7y7@(MHLyV8EW5Q%%sbXZ~m73y|P{Ge$8pZLhp?B z*teeVsvN*?R1p@5CB>LZr=8oFsg&iVOBFK>>?aj5|CDZti3+3KxVLUgW^qZV4Q;4SoAVuXiVfQIE@9VV_Ruu- zgQmGX)USBYcirb(YQlF$dRcZB#hgD2+8!A}%}#^@dS8QspPcIyi;Y@JYuQW4(jdo< z!k(wCLdlJ%>XV)CXZAk3HuDEqZ+3|xsVaugbn214ZLRl-+e-xO`IFkDQM{OaUi7=Z z_<`E$VUW6cujtlyih-Ew0Eqe+*KTkhZEV!PE*0b$Tr@H!hEe(!#F4W(ANms*X(-h& z&RD8f9t)JjTMyV27ZYxnV>;_@`ZH;-6<9kP{=6l}#92&kWNyJ{&VCllAjtnU7c5o8 z+rKMdpeaU9Q`u^ouxGf{T&;Gh8CnK38YWADlQMyjpoO@lHa4j=GCCZ_bTv(7)?X@E zk}?Z*Jtby)r1(6fRl`DsMHEI90#(u+3Wu}p?bWyl(FiZx1Q0iifDA(mRHn9-#2h?a-XN-*E8J6CWzO70m z8*XqgpfFK-F zwqQ`Yba=lfOfi|k#_r`Vl?9J#==7s^*(+RWsK!XY$Y~zf4)HZubsiwy3iDnLC&EeW zi*q(NkKIRE=+Gft{vzUPOD5%jE1bZiXz^WB5Bq(8XS<$FFS z+Ey;ixKqzOcUp@Gp-06;fMGy4qR|G?Pp^^3jxUqyN^5VVYh?@^-s9ubzMVI`xXoms4; z#^_!s9DZ!iOv>-TxPysLr)21`s4fqqgXkWUdhyd!i}BMN&Cb0}v^Y{E_763C(Rfzd zDn2^hsNqQjhly=dIkF=b8{<{b7Nv|J%EX9!msiD%@O~MNtjb7ra4>liYgstc@GF8$ zciLwVbrxYf0+hglS;&iD1n!t`H82%-R>^@OsBOQKvH1;~))6dt?m zUsVT_Sw4I95^kc$+2A#mMmdE&t@~kMuSIy7T8%>PYP%<5s(*@arpYqVLxF}Kq@?`) z9Sl_Rn=!5=SG3qVitucCX8vj|ohLg!yO8sVC~5ZYZ~I68yvr`FpU?FWwda4I!=#Rm zK(kqX?3xKcY36m;rw4Qp8NSoEcOg_l&QU#!rgz32&flr?+dkdJxqKM^Hh+yHY}y}_gKGiHzO*QCC!+-qYVsV|w1%6XkYB7U zotg_zKi3vtbXT^ozWq=?I}=k%?XaK0EJ#k*@wgs2&g1r66qgEXtO7kMQh0HTG)YL3 zt%RShnJs%L{EoU@J9mb>)SGVwLM>sa*}jHEYATvLXejK`L1oXHzEl#cOE0^!BV$=m zV@SQO)N9rIT__y@#VfFK>f$-c3i!OopS0yF=BPs>QWKzJN4UxEJVkRVVe+NzOkf{D zSYxulv*+eoE~M<3DwAOPXF%;`R;U`h@gAET0J4`HgKoZG(Pb9NtxtEi;~CNCz{;nI zYUWhG7UX^uf8VQcdF$5Gt=m-M06;FBmt>PDN`&Mo1*2 z(vlv?+8oOI6b%4DZQivu>1qPzI#IEyaX{9*3ACeEG71#9DC~T0pK(4A^JE4Z(&OPo z#tq}bjTjfK3+VahP#I*o;5=|0NF?QxD&8M4&6)vOLd;dEuOvVSFd-vG(Mn?w9}T@{ zqQxW_px5Y|g3j(|R{C1YzPfP-ZRLDy_0C=JYFrbJ0^O1uP5%+p?a21>ub{%T4C6uf zxbtdmX4K%tB8N*fN_K=r5IF{ZIVqZ>qUl=!VjE7p_QV`_KtRlIw2_TdO z7NN{-9rG~;8U>4q{Z<5F2;%7Yzrza)8W0V?;qy4K} z;-#&+iEd{hg!$d@i{?A}96E_dv@(|vz6u{qS%Yw2hqy$nI4KjvHGzq5kn2n8ZyKvt3-Zii|2 zjd{KI{O|DFd65O$)Y3Be3<|FtxPZQZHk8)#KNaa)0LGBU)RU(h1XXwyf*Os$JD5H8dLC|P#S73MP9w_&T8Y_pFQ89XCo8%}W~VReawaDG ztsjXo^=v7$-yXlbeesLkBfYk1ax?tHU*aXq{Ij&XtRG~L4s}y@G-oALTqfrjGfRtE zPYWM>s^3kxJP0o?8`ye|%Q+46{K)H>_Gjp$T(dz-yvcBQxlqX3IkA~6H#b%iyX(B?A9-xPur!R>aic$Fi%w?J6xB&s(6QSbQ>8t z!CxW)$q_@q&_HY)nFdl`NtmJgnAgHfkG=Y0V2p}&AW7sX{%1Yl(LC{JLHh^6N?S4x zSynUsOKT3J4dpM2?#emCcA(8&2p|Hhg3@x%}Dz&quyj|QbMr%(ShZ2L=mCa zEBd!sK3{%ndJgFgcp2Mph}cz>7LxT+UGzZ-MO3i-JF-$711up5aFM@yr z5b2IYg>Axegok%qmG6P@0Gg5p1jNBb^l+~4i>w;5D2%dAxWJ&?(hoW=(Lh()8txqSC+1SmS1gwSoh2QnjXAuoWedcaZ zyxXh#^)r(OMY#^d2@LhACZ~bXCNA(l?Q8(S$)xtYW(a`x=HV zuxx&5`sq72m%jvGT4`1)4)^mEUBoqH`O3hND543{P!L)$K$fw|Y{xJ#0tG;WA>9(y zn;ph@$BuG!y1K9=9eN;Ishsh#Bou%I^j*O296F%;&AO*aL+IX6t%|utgN_GWqJe<> zciw?Xx$z_MFqViV+Z%F%`b6BKe2AeMuUdX;1xM0a@Mq1kX-jVI0Py}m%9K&4uHkba zuJiS3h7gyJ-{k>ga#N}NtVF1a;B>g|ymm7u8uax?9m2F$M%9MWON$!$ZMCqpuL&c_ z{-tE&4QPdJm(~0qV>Z+gxD*geNQ!-B9#YHuPmK_eFj61r=69 zX|W*@3(H*dkQ_k?|1q?Y^Xg?jE-g2T;0r}?g+Z$fPhcdvs1)%L3eer!z?JSp{!imN zw$<>W*NA1r-1l?)^pj=5ufatO=8anExRU+j=9R3@#5Ye{p`So~tCTH~s*<64ra&T- zuv9-yurw+r5qa&!9&O_)Yp|4RXZVD^;47wo{>T&3j#(}^!6@!bf3y}Mx~FF09WDHBo$k}CszCvs7baUaak8-lYz6nc5~~~prDvB#W^DSU z=sz#s(0XSgXAiYX4nGgSLXe%)OWbFkAO5skzJIx1+!kPOtN4UF8}=TQM|Sy`(=sWk z2tX}n7eE1_*pBOr%Y+0ckJBp2TAt#E455%2mZ7Rb0%hfVR-E#qZ@;AW&WmchULSk9 z^5;H$o_GD5oEtzM7-Y)s%fcBClv)+bp(UoLKH)t(E9SN&=lxB0c5cOOEXI00PP>0` zJxRMiPum10R*$sc$5)SJrLx9o#AK%Ik4V_{l0qHpy8!$lpKJ`;y-p_N3#IMoxxOLL)TE z!#axrkXz#@Uqei(B?On8^>e@G`%PqvukgR*`3kayQRClIJ;`G0ShEQa&<^w0s9|)k z#0;%$HjfR}{8-shTGZz2sT27Wi3Dl{v>&Xi{T;*9R&OYF0t6Q)Dak~%-#Ao$EKz3K z@QtD$&aW83&fkRTNl$%5kM@hb8i~ZMOL4)#)Cwr& z18^!hfn5#7H?T?mhR4ZCO1Ao?IUUi9zHnC%q%MkWct*vcq!ioJStj;}s)bPs*Kl1= z(~my;1r(q383v2j0?Vr<>@UNV(EO94gMm#6C*a8}dzeuv=f?=k5z#vDs+=?P{rwTh zk_b`N!;!0f>a}UW0Rp8#eUoo;IPT zn-p_OKq@*0(oduV6ljJO6k0BeW_1%BC@FXk#;(Q-U6C(jj-Bei#`^1BbG&$CmdoN2 zGWH`DWCXqIlY4g}*C0j4UsfW)ZA*yzz<(y;jT%zpDDF7Sl{G+;KkuTc=Cl*`2ZF>W zGu&T|UNI^>GbA_@L)yN6G31FNd=!UWwu)2g#g0ToJd_uGN6;5Wt9kRxKVP?t_b$Y& zr1)e_Rf`5O-!fS!E~EJVjk`75N?^~mnrHs-Db}*>{)_jM&#&{`?LDafoy$s0wPkzl zd6vG!@2Q)I1;2Zpd;jj94&ZsOmR5eF%N%fFgpKGrc<)9oLC$7hGka1llN#?&6rH{)mS+(!^V>gKKrZY z1BDe2phZSA@QncdgkIfItp4J-%iLJKg+$B^LyPv!YQWFBo79^7ctqCO>7S!It5>Nl zUG0lcR`-Yr#O*d>DOYRt zYTIUN+pBGBHCEfU+ts#hb6xFq)z+@flik1nlXrQOPm=S!j?Z;D`_3Rj*TU|UnDqbG z+Xvriv4E)?09*iBz({Re3jnZo!y(2q>o3INY*6LQGkLZEb*HY|ssIPgfv(@ z38A{6Z3i4wjeP~)1?VZ5%o)llA^jUA?E>IOwP*U=NC9$3FT`WWiBxT5Y`U`m=ooVA zK<;0n-ty5=3XNBm@~e>2?VJ0Ec1>BvfI~L(5r?JsK_h{z1V1sLUYp~y4t~Uv#w>*# z6f7vYjWEE(@h{b_cRsHz=j*bfgd5iCwP@QRS10KA$^3iyvHJYcs9^D^py?@WmBC6WxL`MmQ9qSuIw$zD`p&n{ZcO^g6V z$XdujpU-uGc?0@norMrd>pF-IMS(unYVs9tSv?PTea+cm#d?H=e=MM;wDY?~OPSmK zU5>gzN=C7*e>(YL!F@sAn_1eBxe$#?4rWSr*P4s{;Wpvg>TDAmcN-g5L*W0u4HDr5 z+Me1i-KW*x#)~O%!N!QU;5E#Tf*)Xt`@w{w9hzo@#A!yaryjr{?#2`P(U{o9$$K+%qJ< zaeZFd7HKebt414-3DkI5I==`4gbZTTHN84wNuo5Rqntdw?3kWaBYYtiI-9KTrvfV~ zgS*cz_N({H3v^S-%i5BioV<>xfM4hfLx54Tu}p{;VHy-8Uo}?4glSKqWeO%zgd$^+ zOOg(ulOC6_=&iB+00-<7gG9O#t4=p~rN|!z_BP+UpvDrBf@^{>rN!)thKI;VgX0Ou zFG%Qw?uO{+@n;IMyU-~#!|IJEkaE#wpqXYru?ekaY+Ig)}xymRg4` z+ME&5A&^sOnx2LK--1S#^75@o5E7#ay~t@06vnRlzZAxJG|WbDvBw~rPSUuGT}wrd z|0mNQ-{*1dIDK_0@_OT=+t1`*G%0#FnIFIW=;Qos;#2)|De^2XBlb%-s9TC`+K!%Q zj3IOcfd~8Pp;#MyK#41|e+J+L$ok&ozxEvxz|4lL4V8%~B}N+x*sIV!O=*ltM$*Yf zc7J=~aB6j7ysW3p>o*hPe`J>tRRT`TsAu@KV?!-Nr{EhqhewbbOAJLSEm0^`k3vNx z$yV}2`cTT`PG5hZw=irfH5JE1YK9gjIalrG5mgry{LUuqUE%e~={sM&`=2Z6mEfgs z`q&8$cJgpA!ZagPLgi!aaEyWain`Ce`x<3jP6^%W>-x2db~+_*mVe@mGWAxB3SyKK zYOH+fntRPK+H<#Wp63Es6lePlZZ>AmJGt&IyI#L+YwfvJgQ5Wn-%DNfAE2EFjJ#=@ zU+mT3LKtrSfpyk3s!7Ylp< z)F8V55Q|JK!s5|G=;{Ol1-;4bBB|B~?j`IEJhHD{Xs_6bwV8Px{=z26#jeXUtypz3 zIu)i0yCm7MQg|7{^CKc2BeCO@^0?9{YXR5Nr@}{`*Qh=wPWW3-bWDd{bmt#(Tx0kc z-~ErT9CvQLp8R~DovXB;Ypv<%m6qrKihLLjeBINV7FlxvPJ}#z*J+6@YHwOX_Adx6 z1|b?n$gg>cLTd&`qs@K?&@_Hi{KqWRR!Q5B4*-ypiLzp(LN%*n;KGnWLn$c8(1OTV z>_-MPz5vlF#TdU{AzREC>#dkInsM7)?LQnMh-j$@VSIa9OBEN@<9_4eiVT{BL; z9=rm8l$Y#bpfC$$x>-W=mH~y{j;6{k@ZZ#&ybdV5kZAQPjx#&8xze+$)Hd<5(#K7w zQV=qN3wPTKgZj#)-;$!7QfVGlUB3gjlU;eM0F#iG(VOCnm!8K;ww9QCf<0wrZ%M)R z`$OP+VZwVgh8A|ImrzqFH|l1~i~VWOP&gDD-|C!+u{4Y$=k_oZ33RPo5i`K-L=dXQ zSWlhZpdpgjJ&S!?@r2V9497srO$1Ta{Z_H05k=09gd(6*gKp#uAcaAZHgA(^GL^!E zC|udwa(dAz&?SqeFr~ZG0`NqM$X=g4cFi`_1!(Q>OS@w}b&O!#EovK^qSo*mt5Dn$ z29n=(&`lYyEWliK&ERpWF$eq4AZUEc38XcKw}gw6r^?Cn&yuIhm>IK}X{_bX_#}e? zKsp$S)XgqW*STgyedDrAmIQVF+#ouY4ua#dmnGjow~EtkW}Vd)*UUtyXgu&OB>j;n9t8Yyu6<>+b+0`+;un7{9+<9)^Ju} z)ACH~8ge}P*_FcWAi(;8FPZCH^ZYFKVLBWuadWKZI=~KJ(^tn!z`w@Vi$s8_`J&N4 zmqB-SFdn3Z6FFY0xCfU=ok6Z>OJ$UP2|E8a;FsQ|`3xn|(#++hEz+8f`-|0^nF5^W zZr5MjH3AqwahQly15N-i<1+xFr6^0{7}lBMP1x!DWh}1O{VZ&PtaTsF{CpiAUi3Z} zfGeC1Mt>Enjf5G!kxbg=tb)P6S`m?m%uBDgZa%w+=dPfK?BgQwuk6ABdZpb)vNm`* z?R_G+niRe^70he@sL^D7W|&-IoH|u-A!g|}52duq9=;IP?%$&ra8rlSB-PkXm&MjR zaxO1l7tQJ44$dCv9@*MvCfM9{Z3$iGU7}}~?Fjx=1Nv$6)jh+Xz&%DW)qPRhZvXQ% zKcC+^Y8e-q=8xNS=`m`f_+x$Vj#=34JwV9Ce;F?_CQ5AvgOxMYX8ZX2kGxak9>Dqs z&9KB*!lgMV2FGneaQhVa?Guah%f`heEs)VV;^yh5&;&blgn;flrb4274YRmwWNb8h z5+Z_m8fr6UYO`%4s|HF=2^V&9bh7cr5zGgy#2?A_PI`x<^CdMU=P~$(wYu&z`nglv zTrEd5|EBj(h^m z$R1{8YQ$%LjY;SOw*Uw_$H@+lt5IiZMXdH>lFxNRBb8Gef6M|sx^A!MYGG|-9F4N~ zdp%wR0^j7IA}B1ePhTCUicJ5T0&ZJ0eh)ym-n-$r;7V+v^5)3Tq0%xy*Q538_zfoLKR`KY9ygog@wR`!C+`a!D&v@_lx@alH4AaxU1%JVZ)~h@#W7zt$eL+_?XKK~GoB5L?0g>S$#f;a{txCl;yYU1ws zXP^}TaNm0Q5}D&SGijG1kQ@t(sX( z;0H8^20M#mmtL10jV`gb&qMnO-JHCBopkxmgdvq8NUj7?5vRilGa-?kA=g16NBpj2 zf;rPN)TB)LHFFu^=T0&jYa`HxBSn3q5nd=YQ~7l|bL>OtF3W`v zN-=B73^t_{ItCwWk_x9{N#lf%vA6mku`iQ)Zila3zS2x%Z=IGr5dC;!{t>&w^xm!- zrNLKb@wW>iK&jQhY4ETdf1>G9ES|Zpd@)yDt%8^7@d&YFGDkURTmifN8yY{T_(9~l zjs#Y=a8|!ggNpvm zU1o!TE|C5hBGH-2AVC~{0)<*D#6XQ`Rn%lv{tZ!o$5^tzGhzy~!)5ooS;nYC_mA*Bk1)kO?LZpBoaKv$62T<}+S!Gej2dTY!?Uwtto6W3Bz;F9T z4C1VX$RfsVH!pLkrj4B)`fD|lpdj)g`t8u&#^ zgiQeO*y_KMOYZ8$$mEAQmP?-MRl{Nxck?+{V$|FFOzh*cB6D@}F^%$N^ZFC`1@d>S zRyMym9rzR?myy-A*k`cpzi($tgbW0l(cn`+6xmPFi5y-4$Q?|I`X4V9Qd>IURX?8p z`8LQD>4scwoLeVl+OpI2laN&}M}?o9v$K4OQjyxy#Liw&(lo^uBhNg$B*qNMowIlB z&Hq^?8b@a=RzitEQ3~Ilx&+acj1Vv%B(4GL2Wf3@o@9Yt3tp{O`PUd&TDZl#v_Vo*css5}A zOS)>!ME{);|7?(O)Qjk+DNxKDxdL&P(vaUO;O_`}>Eh=vhpz$<`(Pq<%Xb=6$VxyZ zSE`zjM@WP~*v8%RzTTl@>}A1!Zd1l_RDmUR*VSr~Ge|N}Wz=$>o=htD?YrMI^zkL$ z;0avN{-{nHjT&I6ho0cfUuXP?`uWoS9-Z7Xu`@tli{Gc3+mD-P2odvgCalmjf{>jK zJ#*J!yiGRWD^3fd-8g)TbfGF!O>|Q2x*GWspjU(soe3J$iqd4-egnIqwRHV7^U%VZ z(6Xl5N}uGul)B(?JpEWxTPSvM9DYGKBr6HwY^oD%x;O9vs5g#q%%};x~dRmA>B6=t1!4=-bf;^ z>%Ksdli5{iet~3_&vNr&O{4OLF*>zwv!!>-|G78-ExVEn$#9UTnImuB9rg^NnKYrg z>A^YL?J4sSDf+Y6a4I%5@7mVgrPVG8A%##LUTNz(?EA3ok55c6 zOAl%EsZ^M0jsK_$oxO15Q>j}1qQ{OWc*C@VNH}GOV@X%R-8bcNYue1uU8+mSQ&-1u zpvirTu)W}r-9cmAoP>#>loii|?V2?G#k5tUC(Z6j@rz!Y0jo(vk*WfjxcG&DU;-9^ zoWkYN^wSuFoloJ$8Ierb32`ECr+TWW+*jk zmCIUi_N6AEI4?5fasBhu2p#cY$RHysWg!=?bqT#YIs>9w8nIgUg`_al;0P4*zwrGB z030{cu#+X;(j}Ku6r{Go;)+p*Oy$phMcTL<$C)bwlhrI8^PtDC7+EdGHo5HXYhO^u ztlHV5zPzFv7Uwt+R|S{FbF2j)&IokAY5FiH2x z9*sS@a*w@^lurh$e@!~>biX$h-JHnIptVS7i{B;qMc6fcwf@%kAW+JVVO>~PC5&aU zidr=A%{NI;FR8f9p%J|8WuZ}(=2ri$^Ap&q{Uuz6JPiYuudh8Bi7e=ivaAdf3XfNi z8w$}HO{&2`^$RQ4A2{Jgn#twr%7?xS9T!Dqc`M<=xsc2!64eIRNTLShaSkO?{uu}& zWSVNFVaG`Ln|(kIB4rPSxtO8)531F{betGLKt;JK@{;0o0Sx%P;Z1q`v1#-ML;#3I zijtZMza!pM@N)vPK`--?FJ&0^hKgdxHv4Q>>f0<2uIj8@O2L*TmgdZuv8hB(u^>A= z749cPaIwmJqMU#0^5k0Wvy5%H#iC#rczG5p{Z;i_Am0T$I+S>3YLBBL0W66tnON>> z2XBeTR;SSF#WIy)lQ3l1!`3YFX4Jj_$rIH496C!eFzp-i8U_dk@=-jbWu!F9bg#M$)&e`oFd% z^~oroeE$Aj*qn1&Ti`=?8Rshlfe3C0|khh?42=>-mLq@r?$Y zbeiF@{ov4ARYf7i^aLJjbf==Bj7iuC+!TwB0g!@8EsfRS{*$_yg93X0 zmtS2l8+X1?4ntv9l|U*Kx9`h&X!0ju>Xw!Nkm9{)m;b4molD8Q5^ z7F)dUhLjQ*e+?rIU{_EXkg-K#1j@Rzl2dlh4ZGXam6GFIs|UMD*^ziM#24Yyx^n-Z z=9GjNR7w`7uvl+d;Gup^*uqc?hsg1eiC6lo#Z7S4P1_LIm2WK@+9`4$ZQ)poqKuyD zTFaD;OqJx`#~a5D^^l%)6VbVo84;k%Us->^p+3((w&n)_q zn&jQPE@>=Jdqc6!uqwl(or5)!10O}TY)pZ*=#jG+>1^ILUfCXn**6B*H^WiYQaIGa zqN>@s3h;MA9Z2Z1m}BcSm7tD}VCXwb=x#GjaixY;I-IMmwIh~wwq#4lTG)ST2C*_L zkhAIwuJ3w^2oR`B%B%m|Yk`5WasSz%KyFAy;_dC6etNMihv}2t>1eA>MXsG?Bj>=< z!jZCfa+$m1Z27Hw*7fW0Y%Pvh zgJ(aWeD`JD>;2+!f9y?b`4x5VP<5~cv2km`@wWa-kaD21p!l=P6W;*}8bVl+hQL&D zNi7@0wl_JE#c%%EbcBxg+LI*=G0WNV*dUz{Rhi9)UpENDGb=ke4nI=7#_)W|mkcgp zR5ORTa(8xq&q7yKwj48NJ2=|5m24`;%BgzF&-wkbOQOu0L_M--B(_k0E-f7x|NMga z+kgiu?!l$s1KH^~9&-SY;o0r~^qw1jFcQ~kvc9)#zS&_nj-KBU`qayGBmOckl;r@s zdhr&h__AHm{l*!&e1b!Yt4SGDwza2231qdgdJ!FrjKcu|WmF`;aN0H0Yrz&%Cm;Im z>tZdUTeuPQ)qq&|$kj!S$rVb{!v)u9#fy&22an8ux!$1VYq7lPll*u0eggm|nyo^Z zBQ7|Cri=t-aWI)A)N3KZZZVjyH9QE&Kf_?f$T)Su1jJyYbF2(GG_uo7Q4mgEsQBdi zp+oS2o2^PcJc%!>KulVVIAY={p?TzE3XyZN%Ba!?p6p@bg>b|eoPxwPk~L&!0j`@W z{?aQ|QZyC$m?O~`0#G>%%TJS+|m%z#r>LIHe z_8~RaK}8%YHMo?9KS|lW3PQoN;?g0~!>o2&VwTMc<@6T@YdoK&;|_FK0q7@7`d)nr zA2fTg^-O5}4nrKGv^tZ_7wfnEK{drUR?C@2w|9!G%@5U3+|8hn>usmT8p#P>SysSD zT0A_n6IDbd%2eba*YlD}B!`7XA68=HuxOwyar|kOT*RrSK8kUx{XYbq1OYb9V<=@PYvkcA6F5>z9oFlqFi|bmbTS?6wn5H{8B9ccK5O~ zD+*aM#a?;YU2&c`K$^+cB6DjosY{NV#2u~-nTy43*p!kgh2h64T&;+{veeYel=&1z zki6$o0Hp*Kp37i%?CJhr?9$l8sc}OXeS)xUJW?(9ogcaEp7dtd| zxl2CVyJX|0y)$OnQ*N7RCVGGdXPPZz3ChC$>YabIemS2qh@r2Du(&W#R738`a?(y+aKGGw-%uCK-)oKx#}x+j2yO1 z-@6Pcsc|rq;#6zd&?+~Bs@z!tz%IE1wFXr2sUOMW5~Vhzj3&@WGanVjRDXDmzsA_3 z=8h+sWyk(tz~)_}jT#kTjgQ5Fp$NgeuslA!ReF5BPsJgM~i5kU+>2;sKEpx1xe1&$L155ThPL3L=jzC*FHS#ojQ zUGuoB8#sR<0e0XbW+42&JKe(xQ$G$zu0Pnpk*kjVcu{z#>TlzCp441yJ~*PhAQoPm zM1TFTpXqZzD-K`Qn@nx%`*L+>M`X&ka~0s88!EwV#hmw7=(20U^|6Ml`Pl5qdz3`P zN!~I4H4JKj2k8a2>Ade$1BPw0F30ZnKzigFn)8CLxesjisYY3Oc{8Bk$*;kNP~lzD zycz&)Ad79WcJr8H;LLYs${watHKrpd`zykOD+%gF^LjQ=!U@8}4oMdw2(nm(#Goyv z0RlrH017i$S`*TavrY=4dw@(n$dNy*(S7I$a#2NCJVW~$ZyRR3)hjcsSaQmkd8o6P zGWoufB}s^lQkT@_gwx?opvGyEfH1ibr4&Dsl_tBgFRclyX*Snl2)=bwa#|Ag6X2>Q zX3Q^W*BCBbn~!Vx{W)&Xj(nj7UiUP6#TZFK9ssSRU$N~FKyM%O`LPJ`qeFsX7hoFi zf@N%@|HkPd&<_J#KDU;zl>ol>2LUb|NMpCQ$K`ocD89sfHx{3Z93p3x8xf@^NMMx{ z&E-a8Z}N(_nf>m827js~d{#z(Qi_AKrSdty17eX6aXub#$ztUW>L*(3I z6h$(GT%cp;dBW$PG#O$$0C*+FQy`9NfD8Pn4&P) zX~ZQtC|O7?u+ikz%eN_|xmmL{Ief6N;zXa#7>yW;7!TIWQhV?69FNFZ8EnRDq;il zF=_hv>;`@;b=~o0Zl0aIrSnfWtFK%!{;xU};HpN*elIAP*|6;=qMU?Ip~VBdL8#re z78ziXI8nxe3Ew2YV=~HwcLjDNJdwUG%L;jyDWR;>`-x%S+SS0owPTSZy}fA`E1_6E zELVn}MK$Z^M?>j(EAmKy%tJYWwQMi*nLt<&jK$1_c{zPO{c?|K69bvx_$;7z;gX1&A$Kan8aBPrpghq7*t?ZtAcpq4fw}v zYv7~%qVn!x{|mUVWg;D+}vX_LvmlR)`~HyZY14Pyi5dQnDb#?dL60hJ#i0BI$MyX_hU-Z zGj&-UYHYkLp6sMO*+-FS`dQXq)me1Y3&9?HT1`kr3|IR49RHvS4gxk9{A)22*sSc@$FdkI6sD`%knkzf~PTQa&G?tZ!|%# zM&z+wDPI3=ree7e0NICD4}#lWe|y~Io=HpGLPmZZ*ny74tesd@ z7!kywrX^r}K$k*Qk^ml}Q_9%R*wVi+|Bj>_Ku=~=e2wVR zTn4YYYUOo{7rn=u$gn2psg^&#V<=3V9vooC6Q_YoepmU}&j2@+(qZAKQ^!t&A zYKiBTHy2ADs~>IQR9TN8_}eriZ;IEI8!v>YvG+xu06g7syc>8=bT@wcEcAZe9JR9( z%~*oV#m2aE@&JCas{yY8po2olL=W10VPS$rvDp9qgX((_Y_`>kgGCS$TLe9EQ6v-@ zY?ef44}>%V*7}*19pIL3!e-X=HPuyZR_D-iE2P-ObPcb?UX&Z4MV)SIL-w_Q7rcZY zIxg~uGY|~^!PqK_PLCPA9d%6Ky=#?$E;Bh61Va#~Q8*2e1cQhbg^7t$YkXw8SI7Ut zip}M2VIuh(UN(%hL^e7rS_OSs90uDQh})wZRLP`CI0VF1Ah$?ORWu35HSs9hUV*dF zUl#}Bii>k=b>d4jmD{j+hUrlUM4-e4bz@?lw`NGrD~A6)JL#^jvS84T>qm+59$ONV z+aMnv)3!^4Q5Qe`^eZGcqN%S`7P)+Z5r-^eNyCp6QHqi)Vf& z#^&fj-G*(x=Wek)E9w*vk%k}uP{{`;N^Tlbn6%B3(g43vJm{;wm&*0s8e|PbRBua1 zb?3u@$&#s7k;e$9hVp)i7i`+S@QcnmE~tqzDg_^|Z4tgP6P^Sl`BWR~k1wL7=!HUitN3_9DzKsRKj;#=#!{h>}HqaRlLJ`-rKd#)=a}= z_UFwtmuR8A%YMj_;pf!3W@?T&|;y)(-8CqL=uH=mMF2e4t{0pQUAlFaR%Pb1BD*8#RQ9=xFlS$p}_uksO&_ddRq zZSP$CQ_Fi*@uj*JIEK=<(vv(M3T2#6SBILU(VQ~S7TY&u*t2-2l)1*n!MS9w2vF9 z+$kguGp52iO@Go=CF_^{r!z&*eOZICk$cS0{21dMzSBEUbI_ejVwf;}g$@b#&F<^5 ztLVQ$TK)XD?vK>8`t5ZR{<8zYOSnEe*4|xf&h;`80J=;RPD!!P;{bPw zp7?EL8-o6-*x%b&<$PBbP3N4CbZ;K!t4D2Yb$>U%Sp$c&jB&Wz-Ivi7-a{KA6d1#n zP{nB?$wOeMfVSMkLbzX&vEO?jYMX#yDNyWLYMO=`J63F>=-p?KccvteE}79kFdRSi zgH&BGmdxNCj6YXASMgcQH)Ks%OZGYm^$wo8aZF>A@N(z8v~ZwM;cxu74}p>*iz#^Z? zuQaA9;T7t!`58t0^pbog2Te^Ws9!>CV& zfqSoJt(I)z@7K@KdoUYq@iV*9K3D<(u#3byZhE(EhWi^tt%9!_v*4u21&%m7{NOFt zxFvMEFs|}^WjG=A+F$l*@h)}^+x3@nnfaLf!rcp|UKGt()MO-L)lgQl+HU;?FF=LS zS{ITWA&VpM4m~DODyU}BgEH(VOaj?G4{*L7RIK6K{@H?acA(0^3Pp;hF%_3nNpxMe zX*5ql|LDM4WUj8JPZOuddwxm=4`RP7ZYvcAeeAy3u12+b=G`ZVm%?cz@u=bI4a|!X z>oX1N_G)CHijtTf#@0VkCAtNFzN!+wXVqbY&=Cd!0H{$49_P$ylh~%FEGR?zS?%a) z5jKUU$81r^LX3@>gahFiLB15itrRMLP3}sNg(kXgPEKGxN2rtwah*h|h z2JNRa2KorkqyO1qhS7EVLxmyO@c<5f*cw_uI*39L4f@}c@G}T_W~B+q=wBqr_!R}c zaWEALwXaH-E(r6^Jd&EYD86%2aEA@d{6t3n6bj8@4a)mO1B7omz!9zXv`OQ7b^L0^ z>B1XDsL&9d@|$;{OFmB!0hGmky-bit!OSClS^T1)speu9;wi+^nDG@x))CbiFt|=xrd*V5@6eBVP zdKPQVN%`s?mOQr*(&E%Yfk$U|Tn|vlA;ME>>Gqbh3E@uLr4t#js-qSgMAgaQhGQM= zV@t|sQh1Sntjs)!c^D%hnZY2a=t!>hV`0-EZRaM;?(FtkRjq!e?m_XCiKY;@AG$(; z{?=lNZpT5*VuWlgLp(mf%xOW)Qr1+IjR(V%yGHCh3S?Ng^g}8v6wf~k9X?3W-qidA zC#gIYVPKJ@K5UJAqJ~V}NmjskkhCccDO{7j6*g&#D5w)lp$4HX%_zqnl&->ysv2sG z$#tKGdse@HhjDyYD)L&B2YbW?RxKg{zmXmU#+4ibhd-A}LicJhcA9V-($`vJI6p>6gg=>yE_gX+pXqwi2RKT|jDh zY}f)-h0?{d*8d&J{MIw=;tD5#1>#2Ep-uMUzSnmg^_=^rjWbYM_G>ugo_nOvq~hf6lqz@4TCO~u%|EtT z_O>CjIlcA%?X0zJ^gR&@r2<>shR3RCP06~fQFFR>I1z{(HP(7kZzfH~#U5OF<1N-D zvUicvy6zL=#VXYkj&Qjp78~b$miP!=3kVMjifxl0#SBp*ZlEy_b^|CPmFieGl(}*O zr0CS8mJn@gu#|0Zj(i&QzO>9%othORI$wnzKW@r{I!?o%Ql?q>uX7sodl}p;u3b4} za&^j=@inJ!Z_EBlnBF|>_2;;eQ2c=Dm>QVTnNwhd!8VeIRS40J4Fm<6n8%kR(5=nO z)`SL|2xGFt^P{`svfdz`ar974rn?|B129%f%f5Zyz_YU{3CB&wU5y$mx($lp3r{*L zF4B9;p#@i2NqyKhwK%UBd0&!mx5Z#TDl$7ztp3kwLx@jJS0S^S7h%yYMLftZOi_Vq z9jnXPcNjWa<46!RjsS@EdhO;R6FIR|L=;#;tI}k#EvBWzn_Vhz`W->ijrg}vr)VYjC;PyRuL&P!l%xG429&b)y8Y4!uXebu|rDSAYUgBLmZKlA+zb|icAZJ zYWUX^c9QGFuW-DU)N{!mF$I?%(|ewtY$r26K;J{s0mqdyQy?3NJC-eVbAYfnvDW@Y zCASs@hz0Q2_psCetBxtY&QxJ!Q+-?c#dU1<2sPlkx(WF{E@Q^D}?5k0g~{z5{dE193ju~aA(`l{e$W~09b1A&uL#U4*1F;NI+rQIB3>E z!uNTo&BI`(Mxj>nhGcf~g}yyW2P0-r2VRjCOyR@KOzqnIoQ)Dqa6-0HOM!9j?@sm1;ME0qG6>Gkms zEr3-VHVh8iImljvN-u-qxNKs&Jas)fB=N-h6B;5EtN5Yx1%Em|PVYw*7~>k1Uv?di z#vz=VE#%$XUHU-W58mMqWn2TKx((40*tCoY*rga75o;Vf1uR5$9rDvd6yxp1SW5I_ z;>9F+C2T&+?xiF2+fC(V6GuN+zTbTy_DTD5=<@WmdMa;F{)Vi^nS@+uwK!8Z~H0W zAacH%EHc*`x_k?=*WxCQz-~;6OoR`G=!)?VsuuvDtE%R|;@coHngF6ajd`rE`ERUx z4pY^0Z>&LX7zfNhGY+w43KUvt!`CKAmv+lrr-t@%= zRL017T1I)6(gZyDsJ7EzNi|8fdO7#()8U%p;K;h=-^ti7;X2O~d<0qp5b4ISd zDCg(4Yw*;jo)H*ZQdXzj{wln;ot^MxNgH?;rwSO+1H!Ycd%$pN;2~echG85@iejc> z5Bdhr(G~Lvq9e8M=i9NLGo}-j4f$wTV=*+7!ch+0Gc?K4r6gu!B;!)ZDKwPCbhM6! zZQF+jnO8fouWoviwxQyTAoJ8~x{;1VP`3v>X1BtCsHp7C7_UA_m66$T4;@^Tc87+aWg1 zkM^zmd?ex(a((nC)t|DXyvJ+0M%bWAz7I7wfe1eI~H@-iS(J2!~a zK7aW6JvLb?YPK*kIz_95PjW3cx$9jUJ7_tKIrS~5{|*da=6`m1`>y6t{ATUJ|9p$q z?+QSYGts7aEscyY*cpG?;z!by=l(wTjF5#L2d%VSF6B;q83BBjKo+By zhwUi5!bK>wbyk%O(kpV*?`ohFK>G@f$Vm}MMP07olPh}Ww!gSsGzZ^DPybO(u&+nA zRKR-ckMoov5%kQmfDPfgvjFJ{V1KjyxS6V>YDpC!I@@d=q=LhIalvSxn zR25aO{NR{TkyKTNO%O8dm>hy49RuVLCDHsk2xu$1W``_4r9tnjXie^StzFloaUnaYfFunHuI`}<;3iXUSG1Wzy zl5{lY0@jhM)Q1-AiJH5vF!h=xb(Y%N7w_J#HSe2AV8Q_+pO!_Rd-hU9lQ_97*rI9v zQ`1;&Qp92tUoT<|Pv~an(C_erc)+A&NL!v97AcRnt@Xu9=R#}6_BT!~>pJVL;=XcV zjkx#qO=&&&5giw?NnFjrNunt7JN8ct@ltjd49dmIEYS%&xmty&K|h^l$E8o1T%Faz zk(n%QoS-D1kcxd_Y2Fcony6A&87%H^N~o&ExaH$<^!P-jZUwz^0@%oShGki5%F?o{ zb4t;?hvU&EKQg(oaEP_x%v_Kt@UHt81I4=-wAk`&>u7f1BTZn$%tK94G+Zjx7?6G-wDbdkzo} z!dXs*0+tkI7Isk%QiwC9#cyKZ3oWlI{WH*F5HQ7XRh?17mTiDP@860_T#hDW?tNAS zu=zK0(D%q)%ZOF&4lPt^@HVcX^yRdLi8+TyW2-VZrJ}8pGJbkhm!%$-z0?Q^n=oxF z?^b*Z>@iIH6m|9a%>Ui|&i8~(0NRV4lFf1qKEx#`cp9GC!I~2B@Pmn2Hy?&`y%_QZ zTfEEd%*GHpC5q!4$us5k6BIJ#^XjET&x8y)ulW!x(RpM)L*F;gQMC2dh5q(lk!fvk z#ps*a7bC&vLQRY8(hrT)a`gL-$3xuOu#t8nxQKeAD)6yLcW8qu6#hs9wQclQJ5jtS z{1dgEjhMeHy*EI*K2uBHO<-d2>M1o&pP~ zWM++F2PN>e!zhleiyw!P^3=*duXzqa@MqsG_2~wKOi+C1N4mYcla`+8m%WY_nw4ny z)Fd9kKYT%wrVcF~tnDHP^A)%IBKfQJOQS0^^WJxHnj}VkmppCrC_hW~F>{>k3BQqT z%BCuetav%ONv?IhLd8!L#se6zPR*jt1zES7Si&pXnP;qcX;3tLsg(9{xy%2CB#4 zFj`?M@{=Xb{=l2{#;7qR&9*Ka;c3DlRQ02gdEj+IU&so;Kqn=oSL^sO2E>6WY>f37 zX)-ZvY-CJ$WO1M6)!&K`1x}i2ZPxWdWNlWVt>SZN4@}k9xEMH{iI7mE<&i#ED@)^u zw{i3ydi8A@iL_67zPyhHOtn;#Vx~)m96vj1P>wiApotTxtRUmDh6LjbpiBFk(kyER zW8=ckE;zb2pohguK*{_rmE5%uaBFpwwcJx_*t(bH{0ee5UH7i42ypmBxXmd}7o8FW9wctzNRQzc3gR#6hM{SSIq?|Dd`HMdywM0JaMb zlMAY5eBNpB69P`;DO;{yHgYr5-_(8ElS9@^G_#+Vi@f1(pIw_C^u^ z!n|4An~+&VLtp=bN2=jkdHK^D`Y*zu$~sX`?bwIvc2MI;c5Ygzuw)XMXyh|adW_dv-Q{j)+jSNlGnbfpa80NcZu#*y7Ln@k!udtli8zOfjDX1w{|SUs~lQS#ru{U17EmX7l1)>qA0p7 z&4%Fp5|RqK>JOw$JfP(GB5HxrB+f|(kF(vr45M-GC@s!-CgD_Tkw@^~uWufr`hYaY zwZ}wjL2^nA@)&q-O{NVfg2f?d@8s5MEkm`hYdl;)o272W6wa0iJfs;sL75VBd($PE zEWj2<`=$BLRAnUEp2x;N13{!2{z6JfI!<5K?_0K{)D&23ftm^p^Jh~qww#Hj8qpZP zvZ^(9Reg}|zm()#tY2y8+*(m>Zhmw_Nf9sd65M?x=`9;0?G!V|#VZ2)hD9l3? z_=ql`4l@-chpKY27Q)Z_VF{wiOH92R=+)LULN~B9}Qr8lMA%aQ@G+*4Bhl-LWAC+}H@zjzsf0gUU(} zW{L>9A8#Cu!F5b`;?X5Rv*IWhug43vFYJoP+MjhDe5wo*)&+(|HjS1*` zpjMS|(fN=2ONSGaA*B~9M$HgYY6Ac7w%DYszeydE{+0 zp&bQBgBi%EHovVM#j7|5G&o88bMD4(X>15n+m=34Q${;FwkL*bu7++ZbP{)^@B+Hk zIl5~|sHCVeH~B@CHx)3uierEMHr&;DNluy3OznkpfO%6fX#Pd=Wsv-_^jzs#G5;a4 zJkF`>EdIDFU_Ql)#KexD$bA(_iaPz<`1@ zR+Z#x0Fh}b_gJr~e~n#qdYrmXQNp_a3J{Ze{IY=PQL{WQAniLP_GmkOjcRRmKZ8d$ zZ5~l*{9KS(W21gfi4D|Pq)pBZkdIxj8wHd+RuP5aJfFjal3{iY~@)% zjN)@s$w>X~Ez3N9^F$?F9*G3W+)n-Mv3#z`nsPja-@leu2f!kfnH4}g+An#2{z4}iu&LPf4T!6{v8Vjhh3VtU?E9-(rohz21s%@Tb8i}^8iX6=rI{z` zFP_#yY0xaT%l;{RKONa)Y8)$8+&8epwQyxk;!o2Lx3fA#_Pnx{fS~J-H=yLN=qBe7U`gjN$+M%gcEd2mm#lqX!8>3rMIK_*Ekl-XIvMLhlVJ+o5aOFTRfO8koypq`h196Astb;#yl&?D*eTY`uJhn12GP%lA{ zSFFHHH#@KHRjJ4<5?C7MBq6~v@@8mumH`6|san}_nE+U}o-;u3If?t_LREWMKt=F^ zy6i{Hz%&3fJ^&wv?~g_h+(Y;qH($bSQbHo`)uVw{gj$gv>!07_eSlzKxP$~y!osN! zU#;@whP9-DmOwf~mzJ*wFt^8;JWi+D{);&7n$46~mLz$*R@n4u7+fop-LjcAU@+AX zEA6GCbZ)^>2s72-m@|=n6GPgq!}80osN?njkNjgY+#p3H{mcLT@Xw93;~`b<4uGz4 zj?OlY%66XE+5_N1Vy!?TDt8a^p(_XF*r9uJfSrlOfhLx9iwb5Z*?so5QPQ!KzkG!a`rP?Sly_#NAeeni>9H@#STZuIT8b($MlH6+&wu!t z>J#rfAGI0Q4z%5cRCdfV9+S93sh0+EN5QR@9{RvtvZPT44Usx%51i@W{+GLn|CI7+ z01RJCo#*8lX7&%c1I#euSGgZLg87WZ+SjkweX_@F^^V+rtVO()2@CXE5T0+Nf)z-%_JD4%))?<8O}R_3Dabk zC51ZeaRI(FQW63Iv|`K{p*>DnPM>-&Faliz+>PJ)X3*8mNz-CU&h`!M6Fb%2?;Ak0 zR5~Tx*e;dq5-OCa1~DTt4f^>Kwd&Z|*qVRSxJc_OPb@Y!RYj8u6{e?WMDc0sG)GWy z?bX{4Vu>XvHNLN~pWK+5VRL`6>Fl7>Frhw!4&?6HQCF<`R@KazKQX~jgPjQ8!wXXo z6^U5cjI)CmmKJ8$!VyBYS-8x*V_VutuuU+>(pj+_%lF0*3R9D5+P)v?lM@i?7o_cb zMgUqSy2#;pZassaBWV4NNOOK2p*er3qsjWQl|QINz3LBGIz6<>w{-W3ZoYXH_M{AhH}jOw~%V7??V2#uoEZ@6^NF;}3HpR3v*&7DhmQ*MkDhU(deiAi3u=^l3(@u4z zeEqwRPw)>T{KMfaP$fs6Kko>2DKF02v>#(7<+qId;8?(@a^uAA9DWd#PC#Z7$YvIX zn$Lxg@Wu!*kN-#B4&1W^K@{g(EJ8&Q(U0*Kb?@J$&hgSARL` z^3TEdZtH9cmUM^0WJ80jLId8SM`#0>@MV%t*WYLT(23rg+8LHLwEo9G-b9K$g0EHr z*~kW3zbyX@T+*b0?d=~H_`cSA?^ds0?}zk*`r{xWM38I+ZV%_B)+m?7SipKNOm7gT zjruyr2=ECCq>RRfQV=WVYN|jyZ3s%NH>|>g^cJi65q{Pw8fT|%(-SeVf8QK?Id`pd zvoE$r6Rn|{IeYbaP%J9p1j$$;Q6#X0NLB|K-iM>STZlM-Rxtm?;;nF&=Sct8BvESv2Q(1E~K1$uv0{H zYBkb!D1(f5&3(u6&CP%P1R#sxAC3EMmof6T4E;HXTe=*^-1zZD*J=03z)soaBNNB0 z(eTdIF+8F-HuLaITR)EA1o`wtV^K^XGu zFCtvNA4GweN)S#8VwFN&1UmSAKFF4jh>fb64NH|Lz|4s*`jrcmSoU|yo3|YMq@VII z(N-j6+JfI}xXpH`qT*8gG00@+{sOs~C&83VPH$DGA)r=CYpOLV>agi%Zahs_BoMY# zUfUHm8nt*ta} zeVBj;*=u3_RcIWYfCM0q^054RJM(MBMNTI`pC7BK9$fm$vm?Jl)^C$7;(1Jluwmb^ zUer|NTal3zi6FNjBK$3nXzgapR!|SG_^~&5OC9_9c&{j*Jo&S)EDVm}4VQS|B94G% zdNu_m2w|9X2zefigTv{n>>ERR9A*dx5pDu(audJKHL>aX=UbUqtdDNt zmcpj}_8Ar4B_-8cuH7|721OF3HCyXRn#3H6g4(Wjr7x8aujKc_=6AE4Y5Nb7y*XS} zBk-#M$*w?#rL$N$Y{gn9(ts{(MY>+|Ks0PU)7kOyl4Q=+FKX=^PeYkmGg(ASf9yg= z`vYW${*_PEf>2M~d}SnfxGL9Jr)jDDg(H0m{quug^4SVzE7XTfQtn{TPU)vw9MYwi z+~?c;#811+3L8sBn6!F)JaYP~?i*W10!GC2=|W;Z@TXO4wo&MnaiFB*|o1}j$UXs+Athj91b7) zRYdW3O=XAF(iLA)&QINEZ>z4x++E|mhSx8YS4~9#05gtI`?+mz(fUHrVuQ2kVu z;-OnYpFrgp$EipiwUP$`y4rt<@b{7W^#^y2GblbZArqZ@f4-5T9G`Bmfabo+yC%6& z@`Fbem;q3_SNP!}`iZ6?a{?ZQ$m6u3Yf{Hj=8zGLS@swvg?xov&SjRT&!VjKXmPLf zkOp>G5}UH|+pV);shVpKq!QV@K?++-uXSlR#vH!r+?#LG$KK>VtqWi6ut$h%J5;{V z>9{+plCcyhM)lNFn?5$T_<`Lm?6NVrZ@_JiKEndAlCy3>pt)y7WiQi2*ZC$~|E4A8 zW@h0)PAPcZyHA_8WvV{N?>F6g!0D}C9nE9~HRL=nw%ZyDr8%J1z~A$XKBwv;05oF0 zqzUC46PCnu;9@2tOwQF+fw+GE5d{7F``f!1?jekSJdDv2B;+6%dL{s${=~?iyBYgY z|25kY8(6AArw&|3Z`{GdD98R7_=rw_Q|`=on)?Z zG^Im~CT1r@OqPl93UR9FZ<6DH*eGTR>yD3Bk}&3t(s#Uvk1?Dtq4p+W#WvOFrGS?q z)H=DJ#L1Fu13`SIIQ-i$jZONHlaf+j@8VQTghcj{WJ(N~IVE#Gp5>NEg8{KKJOolv zVpPUXINV4&arL75N@jhgI7)7_Sc|ZW@QCrqEdf3D7BvGC#KL4Dx=LmgrB^v($@9HZLQS zSIVBsPP6|*JHH=mQEB7PYU>s|HWLEh?}l6L9RW$~WRj|vKR{4~`2D98uOP%E zV5DX=|2P0K<%bX!!{DN|PA7<{#YQMb6o&c>3Cmt5nK&-3KdiPhB~gFM)1FiH4gflN z_l#{kNcl%(L+D8eiwg}AK>qgw*imO702GiGr5DJhCRX;ZN(q)O&qS!pFT~@c7&TP0 z;IbH!8`hBAI`1#_$-allXcqZvtBdz|M|u%4Z-hT`%(CXYhkZ7@&q?w)QjN`>%U0gd zp8K>SgXq6`7|ea&k#dxpcUlhTv4djy-KkW41v?XB2ZCslTDGemHgeA%aXlIbYAN^D zY__-QpUCo8zxJxw+A0C4RUmIZ_|~fD)rAP-ndy2nS8kW!Dz4HdDP>^OKCX zropsUqaaK&GUd{C$0NWW%7V3hb77Pf>9xeX`7{QR0{YVhg7S-y8p9HeZZXC;a@QJc zvj)cc^7&tJSCwc<^HY^jEMpl(jdGdzr_=SgUHswc%R8zns9=w^#E&B-t%p&|Fm{ zBmTOmds{pxIju@!Z`%f0^#5U1C1Lj zBK8n@3-qiRp_l>*Dd_e8gB(CmH&|4X3>m5kOWwuIR@yR*GX2_4cq{eS>pu8xXr|F;RGHr||Fncf9X1k$ z1*!E)nG#5~d#KcUkFVr#c{?mP>bk1FvXd+$ks9anF0-L*Mn9QZh~trJXWBXy5o(tN zyVhUs;};Qni++v0`WUo}(u2X0402;Cm>GzqBUS0uw=Szv;m&LV5UGh0r<}Id(P*bL z50;Qbrt&+A8(#ksuvyzYe!7{Miza47@ijfaj$D+hDDG~aj;KHxk@$}aGXn!%TQ1Bi z^FHwUV|qgvDTsj2@U82?2*~EjDao9n)$NJjSoQMvCEIU*f}~j>L_DyyyNj~bUD`V3|OA6LFWcl`x=yOJq ze%jCFl+cZJw4#%-VmE zB@wtP_I9&r`B~5|=-7Rxv4l+Qoe~(~f{bZ`{zE2icj=5LiKp&5-${=4kf#^FV44G& z81yaXk`W8pC0%Tw8E%n)7Q}&siw;bWXP)O2LtkIgI_txs2b5zf4p>W%3Ex;q35;eI zr4-Sw&4l`!FS{Jug=P`BTOyWw-Dbj3Kpy zofj(c6-tZA;KHs==$8~YC?X1*`6Pr~D;%8Y&Mr+%`SvB0n}(C?^VM^zUIRb}W()Id zybmHkN_ld6dZONE*4k{@eh?y6)66TiYOAX3RG5BxrECdhp0ax22L}(&m6}AdfABKy znIXo-bs>l$`aEQB(idtl7QU2z$AnuWhXXFUidd)Kg>po(nNt&xx9GSe@?H|crs;n4 z+^@cvW}voD1CT#4d~ERmW1iddJ`}oP7xQ<6i^U9zItk%Fb8_J|4QQ{lkDt18CbgDo zC*p~C3N$?JS{u;5uc>@QqRp*57?7sbzt=Y^iYl_IPEHq`OpL%?7v=bb>A*7oSL(^hqUkeGQ(TJd*oL?YId6=Bp8d5@b_-cB18Cs z1BZ0j&_@Pk`H-~o2>SfNT*hvd-mBx%?z#b#c^CFT)agn+{z*H*M0o47zx#I!; zv^5)vde%mIvZuQYci)zE56byQ=CO3~H3}+3i(5L7Kfn}1oG9~Lm#)A-l_uJVYUD@^ zOsPapM?nO2)kioCly&*rx)B6{&<*ckAcEJdstcGu#BZ1o{B)laIaWD_7incqpdvU| zwd}enZsuDKw=pM$ESZt}8;aEnE^2ghb&iH$RYIN`kQ6;?l0_9IUuY4J+8HEWdjgCG z;+px^oX}1(5q>ffd)Oy3;N{}?CEo(GYiP~cLooX7H`N`dOlkmu#mKML~2iCJf>1oes-9ik^!u)gT6PVdC zGV*Ep@=0?Q#sbs1(G?Q|XfzLhBpa#8@v2no!?*yZjH?dg?@o|D{Zw#D(wf8DY}SP$ z)sTg7l$@PSSB~qvsjTgISpOGOLf53viYeVtM&@r|ZcT`2(CNN0*rax(C(b)M5LSRBY(3yjEZ4;ZVk zumO{_)EA*=h3W<{OTO;&w5D{gKC94 zPsI0`6g6mu7$&%uO(B>T^Z-y>Uwa*q@U7J*jw~usrU}7nYK-tkeaK*M+ouC2?w|*PY9XWpKw623_r^B_t2_$ zCSP;B(o9vI&Fx`_fxksyX>XE1n6VVZe5}jK8Ko{2tVJ%AiJCW#p5u{No^X@hrhoj=?5IYtL?BesI+1Ne^H zF?@+OmDN6x{qbxcR>c(58*G+DE=0;;+~R5uLRexJt6uFEWZO95$QOs&63Dzz3rlc7 znZ@bCa3-pY5LrHh^N6UO3(V67SFP|P>+?L=~A5t=OKVWn-8XSv{pa9Jt|?h7_OQ@WkRZgCAtIocJSYLutncM28}2tl zv%}Za^wE%ln2&=hMoRdho?s5s&AA*B9G^)3`P}k&TgRCQ8mS^uKB)VeuqZ7TgMAKQE{?(3@h2L^%}S8zKpU7_RLIflcEW8nxzbO-@G?9a9htVA>w1lfQv8F! zZ@mRvIk;Yy9}RG4_#{hBZoJ$kc-+5XZ!T_r;CIx~a|RtEoJIAQ?4UA7P>KICh$uc+ zAHn-98v@w6A(Zlja#f_MKaGX?ik?i8^b|xoi zvSc@*WPi%1e`_twGq=qr5}xf+{VBH&{1IE0=|bsa-)$iKE3;V1;l)#v&as@;SoZz5 z8dLzqnxDeP0=a>Nby8r|L?a!2S4I z@h^1TOfUnqvtu^RCRgS~hY=J09&lE=Y)-CRVqoTXc8v!P(U&!QG$p>EG*t;%)B=TI z02|-X3i|p?GX|>h=eB|q`jWgJ@0*pS7%e4E2bP{v{{GPAPkStKZ&x$jv3&P>1^d+Y z-@)QZV98i^Ocap^GUT{;4k{{;R}1L2JHbv4g1rezG!IILS&J z-Wh4x%mPEg(3x1=XNtQ}FO6P1k>+$KZ!!9F_ww=l{N~HztPiZGISz@J zLKdSW(+f!uLLebQE+|dFTVL0{yHAV%i9n4ojqo`@n=sI})$_d6me1Im1-l3`5Qkp2iaFztj%L;$SEZOr=foG0_B7>pc}mPPLK4Q3QWP00K`xkju}SxO z4X#Ar)2AazvYDlrS7xKO61j@XgRBPWoye)r z5ucj1j#&JD{aJOyi`4*%Kz{xmO81D8XYjjW^(4I)&`A9VN9DOASU~(7{P47+3WYe*YK?>Y9&nK;}n_4nZ-`v#8O)6eSuFc-2VA*Ql@|JKfM%tJX`Y zj%<$v0=r>`2ZJC=t;yI-4vhDo5(@*15es><-+d3x3bXYx_rnlQYoyla@zn}$;8hOJ zkKp^Um2WCKRg5XjQXxbw%13-8Cs0DZg_F)W;YmXAuf*D;>}|6O^;5n~i|0$VADR>` zt%T{#*X@!`S4*|AD%&rD4M&P0!~^x~)a{#N|2xnw)7L>Z!T zvd!me1O(zr;A506QB%6gqzla^uHbjLHW-Om>QJ<e~arA#2S&TW@ut3OQMyI4}_5 zs{sg9Dezsld?etG=fQsIzm7r+hJ?dtm9_vFUZLpq3yO_x)L$rHtSiz*=oNN*!-q|0 zMD=5|dJbbTTd4>_IZUj}{tko*}Nd?gk7)h0ALA)_o&*(i;$NJFlrZ6#eU}43WpfGnK4(rR#jZJDjz^fGZoW$fpoBHP)KHca zgJdNH>%VO~xSU?Px##|u>ru?u6%LOp2Jr!uayxGD#@l4q_{2!R95?I3|6O-4gCWE+ zA)9MwdVsRt2Af_$g;ZcgSo}bb#Lr=g=Tu#Xfxf;++@;iO+{Q}TAY&jAf3*Gyg7^6= z*}5z)+|9z2&)OunCXBjRaAiORJ^iGl0cEnudi|AN={j+SI(~7;5Jpd)x_-({=~#zA zHg_H^&-`oCwnm1WAqqTJt#q=~2~IomOI}q7Jt)Vk*`c-L(d+HMr>C>kPr4g1kJ+@Z zIYRiDem?Tcult7F4c)btgzSiO?q$>)BLyG@=@sT0-D~-TlfJEm(>Oks?zyu91AKH5?>}8bDXMS$7z8XBZ&35c3;j0(2xQ1 zx?(Pb#G_>rxrG*q*}&w?FOoMzpcV(^R{8uBq*E;u@oyGFNRk6cmwEnJG4oT8Yg%CU zByKfd^$77)#4i=FO~+d6>Z@}ssx%Ui&$rL+b-W&C>ul)Av@`?R(T?#jd zPvNuI9@eXun9*BD$;Mw3ZHTLv&gu{j0|@L1(KtL)wE2`cddFh1p}L62?pfq;&=PQX zg`Y-+0ofyO(!#xK4@m>!(m8$i1>-20N6vAttmn;buRH8HhlGU@;0Ma$#K`;^0!0@Z z6+qD(1}&vFxS}-N!-SL2wKYtTL-2WaT`dF_j2L#_^QbSBoKTdR#fO-$K%@n(g>e** z8wkM%i$J<>`~$c_JB>H_tCc3BjOkMr-qER_6H`S_mo>-pP5^+af-T3tPJ7Kb16&o% zq>x$6sfvL%YBx9V@!#7=d&QWT>BcMf&!ZYh{A+zb(CQ;FGx#JWAag-+DlMB!=@GCI zCZgSGY+n#6It-vaBErH~@3w8J&gowxXNcojgIf~c;12xN!S#c}?GdEfabevtd#_Tl zBQweTSv<03K2A|qDcuo=tA=BP!3$$S&dT3 zG5%P}nO>=n#IaBoUe0N>y>?c5VXMeQ-^Ck!HgIC7*?C_^%ZTC+lTo8L*Lz}~u8wvu zLTsFV{37r98{J@@KFRi-TCDAMgwt;hN>$%#(gWt5iaaqk8wg@UlyG`qSktgR2)QLN z5?v093V#e@&5W$4w4;|QN4>gF2YDJ{xAe`|0NkzSRhUZODU7DliMQ{dACfl^#_f?9 z`y+9#(u+Fkg;TIK%b75!S1S!E=RT+E9Uv&r>bZqH5HM~RA%_wXLS3Kh(t|Z*8)mL3 z<&>Y*Tdi2Z17ZyhT%FiAkPV;3M_v@oXniDWop^{Dss^d6CLK?8xwe@`+;DCy_^#sN z0DYwFrU6Zx5)}8Z#ix7w#+q&_K+{}~aMp}wj_EKTd-z|jZL2!mtm+7U@+Fe<@$pH5 zb~Om5m9oC5JVwSRfi~4tz=)JjnBR?$#BS#zmEsF3xym1f?Z2>EK|zCDDHF07y+H4U znaNn;SB#n+;h?$x| zQo8G^pp~K$27^-mWw{T1{s_3h7AqWWwXd+~u>oBua)py?gFXB|CIZljOL+61Z zE?+a!A$rshAQwRkDo#0@jSdLx6&`0vQSKpkA`2R&oNA1r zB+|eoo_L*~rPk5rAFer*gd*U5q#<-fi}f~7Zq;iXA60#72OFh`JO2+IW^>^FHvy+KmtyM8ut|e}XWnYlYc9cXl2cI>?Hoqy1&a1WEPsC|gdNIC4b`W`EK?D}?0&o~F zB+25)jKoB7i)pUI(&QwAjX|ILbJ0TRE<&{A*B|qu0!PIr73@Q1flQ0b{IzkI1feb@ z!Oqhe38u!<%C?9ly)&7^S;aJ1Tj{-4;)}Wd@Fi{*emd$ao?e~raDqV&1XVe`V0<_$ zEHRM4pX!-#!gzk{rU9UZ|1qg!hGEt|t58rf5s;9pb-zEf2@C+`up|_P1zLfl9n4$l zrdX`CwS4@;e5j?$Pbhw@CQzYUzljX`Q?P(V5IpjpGNDRE+FQh@P1PWd5#m%Nq3jK^ zhHC65u!y3+RqvN>WO5fq`9KtbEv%L*FQ)8F9xbmlzf|}!yLINl<&jeQ&+1qhG*^A$ zcXa4|e4LFEPw;VPgWZus3EeK=+;oox5itNAlKRFS{sk2r#XXfUTu|uPWw>;j;R0W+ zi0#zd40hG3&iT<+-M$PT(P(GsDcOu0b$on}lYl!wwIV7MrdL;RgB(fD&DxZY6wTEe z=gP(~tka6K=~*zUD77#8hc&6u-9ab*&9)b{U$rRrSN`1$Asz`5w9wugg;kg@frx#{ zkK~yQIj6OH_j-!@2!0{Uven^232BdD8W|~!SN%aWtmSQ)(v0jf=@<;;xAN}6LhzS+ zR_IyH==a=YHX|PD>EtB4X9cZlJ0GGq>QM5|Q{Q@S--lbGrClqK;Rtl@u#90WnHNrZ zYrqw{$~t@nA4=nEEqo~n%x0Rd-26KEX+t(7;)<75wWyYq6{PPE_0#Zwg?XScCR^&U z7zbVHDOzLVsqHtsMQter2A_ONZjAM!birUCiDijS94A*oPtmKH&gTrLlT`~(e@XNM zSfpTCb+kH<5>HSC`^mGI}=ut(uOlA1f6Z2QvjW0C1Y6|UYVeW0WfQ*grj)0nSWxWU$Ly+ z#tEelBN+pjR!Xp_{L>lhiYmeTvIR#iZ;5n#!R|!O6VVieQ+}~*_AOLeP0I;47Jf{+ zK~zfE%2rbKC(OntKVbEPXZ{jvw45xZkuJ<%oD#qkFQmho4K#2tB#gYhq;9^2<(x53 zOeFt3VUtyf7=LA+@CKKSo<`W&vngl6ENNI^P(h$&ZmSgj!NG2SE2&ie%hg>i-2GeS z2PHr%B`lx>;d~4X0lp#FkgLW_U#;w~s}t(tqJPS-`)Nn+SRKWfw?_-@2*`6}(|0;;6Gjpil*azl_c7Zv z+-Rh0P0jrkamb_MAgTTRj*Q%5wXE{_BnLVG!-X-!bKMsYDNBs7{#UghXJfT^reVsu za-rq064b5AMDLk(v zbdd$zoB3T96y*v_{jI)Lo^wY8s!gUPMTTVhTB$W1ztpX#S$pwI#)!8i?n$;|;*r*- zmWh8y)#Sd-x8g(oYRD;i&EmA=QwBPSz;3qOz5RCp?TW-4CR%t#-k*5x)%a`p!g)i^ zsmB+e^7UKqM|V|)pA(-N9up;qEf_$>YiDHm%ovxdb>RuMzV+0KV2+JW^?W2nWp~x&E{7Ses zZdKh}%#@l$tD2pE4n>esG^1y&y5YmVUp_|AYvZ1>2m=5S#rRnnn_G=I$mDSg7J({+ z8Sr?}Y9LAI0!Ivnjt3T9Bl1@*i99DhH4mnl8f&RPfz?&D&JcqJ2?7Cw_p#K2?7`n1 zbck*A(UA91yP+RZg4C4PF^uCVcF~6rV}lu=e%jvKF9ZE|p~oU@uVC{sjdJ zSks`iPuuZ%*aTK15t%E*YcN>7pB55vOMzVcY)P+pZ=t^Hm;ZrKoBNc@qx``+s%%Qv zdXytnUv=;YDDF-F^dHwxU!!&xw(K_OXC;yk)TG?^Ki{3)_G}%5NdVN_hO`paKVx!* zpwpBQDvS2h-{MC^^y9E8q&+-u;fh(l=2DbQ~_2pT(JGk6x9z zmAH-0F*j!OnCJ5WCql+2MT>tdnXN1M0hB_FUVXtSyuP;VaJ|9Sz!X)rJOI`mwP zOu;}g8qckF1`n;05jFy;5te_hMh=#M&?W*HD2rBdoq|$N4O@hdJ`~?P=A3FuC zbAufYNW@Mo4^Eb;G-pL-(@w*RA}n8q+VSK=WmK|h!CDGNQ6dx%zl#?KY?PRtL}>A^ z4+Q*Wq;+tMFs0NKe#o=1zl~EVEojUL;D$h2jUNK+E9KWmsW&fyikEPo_}6W@foq4c zBLL>=k@bY}&w6=1*P#pa-p8`;S@Yh_%1>{Gt=BTEJLFD1TJr+Cb~zSxySiPn##sCP z|BNubhzn3@pB_NQE^{t`s)rFI=_8|~@JN&5gG6=JcbdHt>idg|b;vf8J6me!2wDu% zdfd`Nq!(bnptPCxM5C0|@giJd!IbGFX*NJYT5IEEfjwE0dch4F(y7lod!?4{PEIKT zkD4a#(tqQfMc;6yr-KExF(AZTV~Wx>RTO&OeQ|f8p)$4i@ZC_t5bT?7Ts-71K;{R+ zo%$_H0CuB>a~{h__XZG^_|>{40y3EITwHi;vR7j1toT^`Qf&I~DOPT8*>W`N=kF1~ zNg1Tw8aHvC3sp)$^9-}4cv>KA44tfq9B2^^kV=*tELOkw`F<{0_il=;FMu0x@4FHj z5EwyD(2q$MACEnV1#uxskckVY5R|DmGHD3fHxIYBOuz8I%CtZ=w@{kn|8JMsBjO~; zJa=|$e0d^9&j$Vo&Nt#Dl&$(hnGw|pbLG6BuC^Or#M=e(BbC<<8{wHHt=g4ZC6#(B zy?@_CrZkc`=qqcS{ZzT}tdL<84vq}%b2Ctvlnm!0hVsQJy|KIqi;xZEWlE6}4mWE` zbn4W(KmE{p0#All!r!0ex~#eK{dpfQfb3s{&$wQFSYjrd4M4>yFvp+)VWS2rgYkR5 z*H$ooJ3JeGx6*2Xv!-afzAke$WVc$iCSzW6h#zQ;odu?Qm-%iqImxW5d?p=QeZvGh}=;n&&p_jr*Q%Dp&RyB=JQGjbM= z>ZCk+Kk-WAQs5{AI6E$EM;elnn@zf0#1tSP49}V(34M?&BlL|tX-VB;X|}+uah?tz zpIG(#TVFoEphbf_%xcH$jwkWLaus&da8eq@p@7~V2M7y*)Cf^bt!?GzZDZT-dLB^y zCM?+L!GZ}N=`g4eyyT!;bD}tpNs6BeW;!W!xDMXh_5P0 zsXyH*7ab4b%G}W50C$uc4jI)dhAL@5?bSC!yzAfmn`CQ&-+oU0SNgAZzV_PMge6N6 zbp7Z^D#P~Gv4=ebnN*CWPn>)prHYt`rp7c6`^gx3FN}E8mUiA|eVZGcjCvvQ*(=40 zdx(WSB0i?1MA1Zr?Xaz&PQVwVnJA3PhcP0bIB9gPh(M`nbW~;gWt5;mQBuwC@K@TE zl&#kql7=*VnCpQ-mrCXFJXyBG7}Tp`5jusK?=trLqwdSgupb42)>DND<3X8!TRqn9 zQDs7k`YBh|s40&>{_G|-(7YHtetcctnc4qkT6f;ELiSX#@4U0`XAMt9ls0WU4O`L1 z`ZgdFKXa5IE@LN@+?cW#4Sx#5KXi65m3t96WGP2|lw_4wyK-hF&hj}x2!cwS*y1ss zQacnt>5K3*CITZcJH%Z&;crt$1OmYl49$&%L}QJb`@M7=hP8$I`|``7WFCtj35I{Y z*jAE>{Mgp%{HeW#R@UF!aVgr`XF8CS*K6rwZ<$>p}UfL5O^A1)*32>1RVP($k1{R8#WAm^{a*O zG-*yZ#@E}up6|QlbZzZWOsmai=ke;w<&dQs-9d)K={M|V#@%!PK(sCk+1~X2eo&pSl!NU$T zh{&P5pu09eA(NIaBj4KQ{k&net@vV)eVtQ~?Fo41%ZY5puGu% zRw#6b0q|jQU{N8d&RUq05IKNLEHS>Vh(u^^wi~K(TE|kNW>|iN8B4{2omVA>7Ru~# zeq{~6fWwRa2E2yDAG9TCS;sIy7GUF*_gUQig27SZ{9NS|6B3E$MyenKMxit+1$y+r z0LJ7Ol-Occ;2&YAAV33{B5iaCNE(8jlsErfI_>7)r+iDyV|3XM6MXnWYI(+QdJRHQ ztn=b26^^6_MMloj_Oh5A50$_(v6vh%4d=2nE1a)*|5DfBL>WwwG} zQQ4!gX-Ez56cgylnGwxAEzf(g`MB;Eb9(qfH)Tk@;jJ!FWTaN9 zk$K-kQBd(g{u~k|ilLHwL})0|{y=0@Vr3*S?h625hzNj#9vuIyj^2P_z$`V-Txs!j zhbtUq;OBNZN(>Qe{g`~M0*#C3V?Oz3HXcYf1~m}vC0>7xW08!x73#frV&pL#dF9o}$g z8D*EN;;=ArEJ?f=X3#maKoeLbP`6f;)1|Zmnn$xe?-l(gM&!6KrQ5SqII)0iD^1K} z6g6P_w@T6~?i}kybNc_Ue^;DG&yUXk_rjIVq^Q^#?A?|)CPD<+JPuAjD0a=llbB$7 zxH(Dh!p_}T+1@zM`7Ob;9QQ-sTTJ)pj#SPeIe_UWUc3y(CXFV5?pVWQ>x{y^i!QRP zY-s$Iz5Oo>&je=WH_ranzePMahb=Ibf8@4Z**`fPPuCS0`SGv3ym^6a`Q{RG9{|Bk zEqWpIWuJ)ks-ARAH>lv>^-cDG$`PA%}i> zIQ+_2wbJ1DYe%-}zosnZ8m4%)f+Ve9f9j zHq<9KsBTV7(Zpdi-+t-X5L(>7OY&CU*#XpeG6Z;w=GRz^ayEvUDybQkj3o%5G`lne zy=ssiJ^#>zmO%@LxM*XDN`zRL)2!%*vIu?d?@M;Jmx`<%ZcQp@W;EoZ5;yyc6G}?u zY#(DYKo%m0$s1aU`XdRyrqhQUJ~CH`gGb#PaS*8r2Sw+{Hfml@D3bxmokojtw%dTW zW0_Oi5pcXT{)JU|+#X=}4-RO53{rhc{~3t-L81Qg$>=w?-u==Y5~tR36AmmVBHsU5 z4>o406_8yl4=jB&R#bQsTuB)bnu1oKZ;@r`Tk^5O=p%R9HGZRVI>3E(+;LJq&VmqEQX%<`ao6 z%0TdtRYTKDX>7HdaP_v)eY_n@xPkk>3I zW5os5AHj`4fBd8}pTnF@8&$b$u*J*dkDLEOt!3+fs*?4!v6$}2AKoTUD>?}8B2*mN z4gyrh`}ZjWxDbj^lyoJmzN9COWrBUlvg!X`h}Peh%qL50=^!TG66Wi+^u?SgsSy3F zH;$L+fK>M-8K`*sRYYS6$cIK9u)0x^Ysb`AIFd4VJ#@y%)M(MxtT26?O+f^!JK*SB zXO}i4kTF+bY9L<3SfEc@poUzDR6ry)Ktt*ZfzKpgh(x2vz@yxv6D2jQ>G=Sv4)-s9 z)nkM4)`lp8shtmc5E+|g0XQyv>{h<)?r)^;TXp0Qd*61;OvO;*0QwF4y!IL$Z+wY~ zLS~tjHw4Ox1&D0_GKuo@>*R!X-&Q#aV$ebJ)rV!hd5|Q|$;*7T9RU0WM|)n}XT(Wj zU*@Y1MR0o{*X_z+re@A`&E(1Q`J{CrHxa=|lp3M@@+K@M zo4W|VcBAGLGrk2ecT*W){-m?^Q*DlSu|-BAZPMGc@7F=Ui5o_P&iGt~GWRIjM!%6C zLY+*o*N_rq832sZmKr9G?b#kk9fBQ}q3_*Uj(Eze4UrEMEVWxnLN*4lUq%Orqz%_J>6l9GJemn1Z`fZyLQ?mYCK5nc6ou2^o z33@sJ{r%o;sAMC3T*{Un;gFcy*FXbXGm0*T_NtI^OwksJ%xDkK` zE&5=Ty`>ZwRv77RM-Ab}48^8wp1#Ps{YDFFQQ0@-Ta8$8R1mT6G1MR;d_n@?;VP1P z**l{ZbqpHzAqx)Ki$^lpeW}{$zAkA5>xCM}!_!_oFy{U|%?NH>I&a8ILG6^~E}>NA zMRdTN{Q@$A?i6QsL+}J9dTCf7a$z~Tz+GMC-Pe}_!3n^5n#=Hru?Ob-bw^Bi zK+@7ntGXWlK(cMdji4j)-SqmQKuo1IBqV(;ueKM1{i@use|bMflcL8>sOR&;(BT*J z9STMhjWgE$^q?D$yV*rw`4%1ZvKtxv_0M!EK_bN>y5Bm~a;c0PGMebyi@3*i?;^Z_ zpvqj;*&3 zl`C5dr&XJJ1!`YbX7X(oLvoX-@NI$&8m8-_UL*EJtgxVEpm2XEO?ky(M;0zgR9TFz zMDn^|+riERcXS}y9QS@LkK6LEJNlAUY2~@56^Fnm9=m$N3QCE|A1Y;ZH;dzMWNUaM zUdu9!HZm*=R-L%;4e$LoW~6OXz9bhA%h`seTM_?PJX>k@L(>O9WrQ|58NApr3xY{KR`qDwZT>0yEn6&tK zCs`WGa0-20@Tmv9gLs>Hh2;qSbP0;>D7{BUvE-9tYE`oh5$srn#h)5Kxjk$tNS+9* z;g`tUb|^TiGVsT9%l^9&Db7SP#HSV?K-PpGNWrr}6874sg!Z==5n6`Nahllw4&eJA?M3 zZbaTy@nk2z6)-P1nu`lTWsnV#K%RHLn<(U$Ak=`26FXF#HgV(WTC27MNLQvjsFPF? zpzZ;6(1&rtP$SZsa*(%IU6F!Q>^utm;-c1%!23%}e%VnOXabe+bziVY=JRTMkE{r4ky#P}mKY()#>e-AqVXdbS@M&q^N>pOKsWq5^Ok^CY@ zDsKyBy5)?}%qv-@UaX`>IdBLnft%aA+j1Ua2c?ghBB66yU~)g@OGM*i3o>5>ffdWB z>=Qt-NloqFEomIbj)wHTCvMwg87FnTzoFw~QFG=M&(Z|DNB>v~RUy|OJHn_a{?drM z=uDrIni6HXUTXYKiK`SmWwg}03pxMA{!?QZ*L!8E%{n^X_d@xK@-s1Xz2-1y;(MMy zTgKrE7}m-I^J%#cPoD*H-)0$HZG4n+PYP24kF4GgN;wd;?`}@t*4?(iU}Z&*A06A= zzHR*8ygzPl2fVSMd*!s^BQYl<#DAeTST9n-`$`@uh`Cq2ltRw3$%&`=o9AHAf!MDl zT4|_Ct5SM-ES?@gQnz7D$S(gZyBXFxgSt}M1DM7tM0yl=g5BzxXymY3%Lz+!JN1}T`%`c$ z-o7=yV7w8>5qYx=xlfs6GZifnrzB#L#)h9&|3iB=p;~ZY_LLp49t)I^z+3vF^D_2i z08X0WaGXvUhcLR_bS}n)liktsqDpSAsMpoz5nfem{Jd~Wk6&7rmGd*neck6DU1#>^ ze5dhxR;q!LHe)Uq*Hi%jUPl3(wC1{98*p+9 zFOWsu+os6|gAJz1NV|xdoJyyE!?gIjCKesqIZj6VpKN@8wM4%Q-0^$rkF-meV1_yU z)Wd5N(XmCKLPS?5CjDbNIV5e^Y|C_Jto>r!<42$tR%k`Ap}NG+w!Ibkyf@ z!~kSu$rN^5>lCx^)aBY^ShbBTK3`Iu@|b?iz_aL?n@S=tv*4ryY;fUJ3-K(7PzV6zJgv(0&o2B*wxE&~@F1S_X}SnR0oDx;GB(EkzRo9CngmVq4+(<5*?q^s~>Vl@0NUF zzrTN7aW}EpBJgtaYc3EDmsvdsl3C>cds9pk!lzYU2wL7)U0XkTL(b}eYW-!~W{%2q zcj$9^psz-vTSKb2B$gbIYc=yc43%b(`)MkKZ@%VON1r?U(|mDt8ke1Q&zJH7`kPA3 z#db;R0*^P+T7I7$pE=C@BLdjj7TkN<`P?c>n^7a5(v@~Zmqs6 zAUGHe#W2wnN2|R;k=+9Mr9gWCV7JlBH1fa?j|_fs<|Rml$2B@1-@#Qv@ZHmc*QWev z5K@HHYzFT(djS`M*ZPPbdk4#V#^{Lf*r8K1c?sOG~3cx%Ng{k34;&uC3dq3z5+=yB7l5of#r(S$#2|`BmnokOqA#IbGR5G!twF#T&IDvGL zU19Pn_7w-kl3$dzibu!r)M}%#FaAhAlqMyv<@_2UttfR;hc(bG(zL&ph!cVmkZ-{s zl(4IXUt!HuPn_k@p38Tx>kz3<3xWd?YX9tMa_ig#=Le)qotBvrf2oVyTO0oQM$DNH z`T*Q$d{2!)eHPz18Mz*>_k})^*njh`SYAE~y+Ox+x!Kxrq3${0m+oeaD)NO{Q5zee zjD!tXz3fyZD^d!Vas5YC8ic;Ag#L1fE9Akqw|E^z@b$WD{RD3I=>;);Lgc8wkD$a$*D$RU#L!U`;)eR~^~$bi44(0zJFI1BM$)J{ zfDuW>kK-aZQY>iRI`7Cw63&IrO}Z0}As|B(^q`kiV9PiPf_KIM4^9}OL8Gk#QOm%Y zM12<^n7Kk2S62B=cm?antB_5DQPGc|<1VUBL9=r%-0KgjXc_vD3jdWhPR{!4Fy6*K zG;ACIiHa$r!2aL~4b$@jw=4#+-y5?wS$TP+-fb>!gnb&MF#r=d4h`p=fsGNVGEde9 zN^e;?!w$v&jT4v0&p`kVRbZ*eR$u1aaxJwQ`r~M5exh6GDjOLx7p;F-B*^N@VqR4& zE#cuoD=CP!-5EY*>_CyH^JW*9^)DJKE%utXcf45KxXh2Z0Gv35gSMw`gz5HI7L*|D z3yKjI3BF$t8m zf0$Vh$-KeQP1RxB^E7Z6p^!u|{*#n~bih|yQSz?(wglbndzP&f96IQ#ADZ`9y<& zmV|gy-#ka8m#w>V-f^TH!1w6BR$ULKhS@?dUat#Vbr zpD3?s0TR^W0&pp60S@)AARMyx1VK~R#P{MjZc?w2GnLBF;!EuDJ+s)#4_|LI&eCEk zt7N2x!c$r+kx@@#>VYG^!|2B zBG{Iry9-M_K8)n$*{HS(giecElrNs)C8d1Gh>$pHDF$iWe#2h1H2 zv(=&iuyXreviFH>d9eQP(#diuyrCkf-JP=n{^^#^nMbhiTev;ib79xYMhR6qn{;}0 z>z1I4us4n}GycF3swye~**iqK&Mv@w7N`0WJ+K+&@Sw|$k>MOId)2Y2iGZ43c%6>N zNE&show#WKr9k@uz^~@Z_N-FtjC~6F@I5|0H1)p%RsYZ1dWy|Ko<`bcu7+?`I+mXP zj9v)Fyt>=8B^oLzl1Ftvk>jY8%CKTgs;BXu6YuCaL|NR{PzdYJ37a(c z7y+$J#FxPg_rU2D6dO}OuP4G(|hR%9pOg*VKE;D>1QS82dw;l0Qrjbs%M0R*3A>jI2LRwfUw2+l#3x7YA zi9J!&2Wx%Ejv~GqbQU6lM6$k8cA)sj>SQtUW_fQm+Wcd^=yX{Ed5JZ3=68> zMZ;U&<`_jM(GpCEA%xShR>TSoTVO-vw?g?EKqjff$n(+bRT!nW>&NH?k*MyR z{>w)_S^YXeD28!abm0>#CKo&GjNr#~m$1QtBeEYl6>16sie=*uK~9i3h1GS$m^Goo zI-CiUZ@Co!EcxHVPM*0_8I`6^{o;TAS~CIv*dRG#Ot1^z?1bTo_NWyvpK+Ss#!6dlCMB|h9GHm}h1kaN_lgX5rJ>;hEir#9N&*21+d(W9Ns@U4y+t;?+X@0j=u%M1k4GKd; z@lfsfv;9HRU&!gfX>lz*PmQZ;qT$-0us0EPy^w8iowKR2npXF{CV!C4 z!#(4qSRnWNpJZ>?s)48pl%pc*$EcWG5@u+_A#dhsd9$>=V3tNq?M4 z#nD+7{{>|U0RAVA?(v6@J+8-f2qzw#5z^-K3;OSkX`8VFM{s4)(U}rlU1F3_H7Ooi z*Mut?78g)%W8z~_`4HkaY7vl0q0`Qn58)*cp>G{hdz;b8!toWkWN*%d3O3#vKj$BP zQrm6wsbssl``md4kaEhGR6ncJ;vofW05B7VK7N2?;~Xwh=pKuIM_!+<0Pp8=>7zP$ zeBS^v;=Ea)e?1L${8pespGv%cXG> z!HIC?#3Q+3^5DJyo}(U!RM0vF)w*8Dd;p0BEsn=<%v{$o@z-eM`G+2aw73+ zdeA#TI73ylF;x351uX&dD31S)$t7j&!Y zpFq~tgqnfGufy_au|;dpY%s*_8itvSDijU;nlF^~%K~$4;KR^ETF#>S0bad1+unHBC^V+=d=ZXd|lMR^-#1=eyQH=sHHm) zg3l{n)r2_Dz!E&`Cp#2qq)~>mQVo(|Am5s46#L} z2m3?gds+96y2OLBf5nv@XB-LrxaNBmRd#3ci#LQxr_%0!BG7{Cqm@D*12Zl_-_sQW@sb*`=(p8O8rQ zdV@lfb*i~o%WM93FI`Z1yT*G_;JZY>#>d{U`79v<7g@j}ID_g3fT+}zUhB4(){Uqv zYkYG6VgV{i-rJk;Wc^tQ3>d|F=EZhk2oBun9T3`w9%4NGi6eiNBg{jfN3 zls32_S&@5YW5`M0yS-GwHq(P(Ozi`Fe0|NZ5s8SE_C?n znHVyu9@Q`=fY-iKC6&e7a(^9*`%Mo-*9ZhUt~f=AXU6=M)QrMJo;S}>iKiY&WVo#P z1RMs~b;H%`lk*^aM$0|b)B2m@ZSESo_&!U`MnQ-DIGdwmRSO&LIl%^GyCx9{2yqB% z1wqbPcrl~v0;(xbZtaY8Y?qYe`ZNDVCT^UKoZ&d=&$yvna6;%Pa^R`-8m>@Ku?<7X zR27|jBMNGs51pWp?eD@gWF+p4>yxErxaPSI)_L`N;nvuz*ZVv7PzAkLjv`QIz?KvY zF#i1`*OVpTwy2(}0k9twiO5P~5QejRol;2b=V0t^`~?q!t&AvLJ(SoisfNfrY#E4M z=HWK4`+9geFIeMUZ)bfRn1wU+Ad|6iY*{Xgw3$gMMmh{6Go~TXm|S=urzCa2@5n`3 zh-^7st9Qdr5tpX!8hJN8dNTd-X4a^pNBVq{C{-vgHIg9mE#H+*cGyKKxe8A?Ef8(o zp?C6*KtcU|3VT;Y*v<_y2|Eq#hf2=NO|;0FnzT=&hrL^Ew+6CxIas(Bq{_uO%2B|G z;|RK=tEk74fvVwdxYze6b-*cYG-joT@Yo=jEcodAWVU3UF)$Um{EEB~5b` z2w$Z|7Ju(g*Sk=KXsNwgVHJ-RhQ>mw2%u-W>$yIkPp)`S zqrG_;1lKD@8)W$CPS#J>;xrrTghR_+@o(cMUX5EH62a^~hTAbyqQAuokGw~bbg`Ch zr$H8Ub(*rTg+2~_+K{{Qx>!1A$tx5QP6z@xMViHJd7eXBKnz;PDPjU46xF4=g z9)zSn=YIXofq(h++-d852`XOjlgb$;3-FkA34f2OrB?D+>5VIN;RxQ~0mZ(R@IpAqj{lKKJk~-Z`L?IKzB3IbIcp?WZ^e;(NF`T4kOX8 zBt4}wKH1IhMu@i?xeYEa`?oP-lX6<8mC*2`btYdyb=U-Im&*3lJTB)8Uue~HLpbCLwBmdd4cEdHxaPaCStLA0b=~|?r#5rR+17xzn zi2<^287rWTMI?oprYWGXNmQaqj#uNL((y+Ot)04Qr!6$D?sYK1<>?E{9}P03_}OOM z!h(+x@x>`xr~zYmMLvVUyV-i6;Vk=Ya{?36i72q9kh6GNs1i>`M0-`~1oTT?Fl+R>jX7 z9$6C9wBtzNW!8nl@|N3uBD&lzr6TxgXU+Hn<@4|3b8DCeW&W#coRmj{6KrXc%szrx@h#3Q3%RSL-t1>E|Sn#qo2synti zIOQd@;12bH-*CTSZ4j;uuH@jOL=|XXcdK(-Tuk&_yu3CtbO%>@=amE!>L%%%Zo)!# z`n&YQZ`icsoi7;N#igzM3=;_6-zcz!o-~Ah0nbwb09c|xGcN!#&+StgmO#O01 z07mYmP)Z5_sO04uF@iOo>6(Gqr*+zESDV|B%voMu6+9A{xEmbQC#6uX*OB==vvm8Q zL4{e(LhfA-QJS+}WFSPX6i-Q|3vzsz*5uTe`;z|mCb=&NGsIAVlU|OP53D80TW_5N z$O$m3M>?`%a1AMzlhNlv&Jc+H?__ru0Bo^Zwr3zeWuroWNiD)ljn`44bKkK>KIzUm zQ9_N>f(m5Izx%yTZ6qj15nC{pm$c+_+ijV+kH$EU+8UqwOQVU1YA_SU%rweudsKXc zO7{2dX?AJ2WKuRyxCwX5%$fX2s>s4D*+Cv92007Yxnbhmd*^99& zy_(JhbFaHT7+`)FQ0yc5-KS0e*Tj$s@x(A+Q%4rAJNudzQkC7})~#pjh*gT8GJ${; zk*OZ|S0B!z4W4H2#_V5wmk;r9ovsp1j7nM(wi%8VwJO%PAk?Xg_Y3{8{d*CU&Krh< zwu~xZPD01Ddha9~i}LtXNu`MSrSGij%4_!=6|ChIe7|rgbOTd$ZhVNTOGi_Tgx)Gy zj6)^bQ=J2q*U$?uhV*Rlrc5XnSUP_g0; zH8Zk?Esn~kz|e$cSr$sz@C6TYNRyM7MBBWG@peDE2OHsy0{^trZjbIX^5aa&;-~Fq z_Sr#O*fRVyS@#C9_1O4iF8_GJ zW?yZMscd?lJ4{Lt52qXV+ZTY}D`9<%R;oY=1bxEcT25owaPwr!A;zlcpL*jqiP)?# ziE1^BTg}Q{E*+B$QRql-mi%-kDSOC0u~#q*7LXo{F9cyyVX6vJ(W<}kC_zM@$VAgY zc&-tm!^{tmD9YDvhy23|Q1=y3+smz0v0b0|L6Ie*p`IR2t55Y;V1kNG2T2_jJJ6wm zt!=ETZlJT7$#!q!lLgDI9br?8M=A4-n7RO!+cH&)RcEsy~*SarHRd}oR{HI?3D<(lAY{p4|7yI$0RhbAwD)>UT4Si&A zY0YTZ@34wY%e3a1?tGb#7{>GJ^L%^rl2ZsCBIUZu7}CtJeC+;~xkDUpmdX9jzr8^x zytxN{SNypk?1)*bu!hc)SnBKnuzg`F`C&^@$ygy^_4hX2K z44CLjmY=&~!x46a<=8s{5U5USsX$*DQ9|iI;c~YX9OxU)aM`Tjc9_|P|^dRIui6O8zTVM)*5guMw?AH(2gM}b-x4L!Y0Azkm8HRKB zzCMV=v5Qu`d2T5_YyZ3zbNrK7m5ES8EAr~eNO#?1^|$Bvb?IM=h0u9k+W_1&h3kxs@b zq?IRzre|8ll7LAwT8x!ghYSPL>-|Jzlyn!7%zpa-=9h?@=ukIfV`zhc)w0{)$)A4T z*=|Wxm6cibRvZuBJ6$9eFZk#$=w8X>CGX7SKFqBbIyP)@`=n>t>0IadH;@00qYk=L z7M?7B!>(g+3G-j)qkF}mC?)fwlXRK!8)Jl68_fBQf`H(Gi14Sns`s$lNjnU9)YN(jj1Up`eT&+Ug#Q!{7gH>h7Xkh=KwA&GlbR@9 zcvj5X2zjk=_>e+RJZM*Er4kz@qo9GNnIwy>lcG!Ve1sGxs-OT`%|#ozuem7w$FXDw%(V`n_U#uE&-Ty^&&sKL3^ z>$wzz+7@|tc$QNNe|`W4pOs!ISTCr_smBPgVM2T+=Txz1b+<+oWc zFB}@;ycvwFNg;?^5`9(Pg&PUdY&at4Ov9F2*>FD&lu|)gVf1c8@Xt5DtUi$l8)(*{S+kXl{)T^Qx-xf~eJ!-zB6 zhS!-Q&2xrNnA^i)hcs1_`X*cNw?kH=QW@l{Sr)($W!MM?*__BxL zOcQF=!i1?sM*k&xz?XyJT5v8I`8qE^U*QGNc6|wqm@&vOvaIcbQJB*Cf(obqjs7nhr6h!BLgLnjFQ z**|h&Ux`g%HMibh=hkwVj50;U&aAttkSb?4doO|pl|nSE1YM9-QSrplvJ=L?1F=o4 zI+JVGq@eK@qrRUp%-(~r_v(ziR((?N=pE5q+Wv+0m<6gF#rQ2&hRp8Yi#irY{?YTn zQSYC6h9ZG4GQ_-7)nW2sLZ8h@Hm{EH5thMX;*=NbIsE zx71JjM=Jy^@|LX&b8WxS>|lu-CdM0tijaUGCii(GNKX2w&ywoCRZUFH*KpuK%RO>! zg8uYG7M=}QMp1nlggE(m^k}B2GNmQ0kCZptHYCM#^qf6X=2h-20e_qKP70z^2xg!Z z)wYBlYP!U$d^TWuK4x-xpB%}mh{BGkLo<$M z*5hf^$$+`UB9-GbQx~;4*F047sLpA6NO7*93u0DDDSY{`H{7zNKzm%<8pwkG$E?y6 zvCID`_ycqF( z?7kb}*dtFu3hIXhvE48g$e*7lOKM%l{dx-?|wPlR$1)Sw$ z@|8ghKVpLp)-P$&?F+i*hE=1cCC5Rulk}3YAW7Z(6fkBqZU!A)w%ya$=CQb&hO(ZnB$;0BAJ=G7UMGgVLla2WV6TCW7LatkH&lEmH7KY9?!nkYW;h^YSwaUEzYk=wqxeAL7m-q=W57rms4bbnrCmSMsau0#k) zazX3ROM!j?fCVNmGI?Kt0um!I2QeO#7+jb(S3VWO)SL*m)YDdM;qD@CelB3O+|n*k zE;+jRmT!UYzVs`6?T;TaMN5lh%((-WIfYbXLxxXRj*~JC@aFt;aOhT`0D{&j02Pym zChf$lHR_Yh+eT!PvQ0W}X5rhX>+qE2vd*({+efzd(HMAL4=h?Ey1!i;lMD{d<(W~c zAHmFAQS?l;U8%SNw|xC_+vW)UF(i7;in=_Yw9c+fUdKD_km4HtRT~)z5K5MA%!zC+ zN&#H9YUdNj`#WPDe;S}=$ZkF*;C z9C}UN3|7)mY3vR8($^hD`LaVijHFjJE;EOIA85yHD6 z53GfET*^@KAR{aKn|RqUxQrnTx*Y_L>gzcrsZYX~89aQ}`ka^kl$L=)p&Rioh<4aR z^QAy=s#1Z;f5d4aYIH|dS|YrD_{O2wHGes)C>*KUdd52+;rV`p+ScJy_V9bYq2^HCHA}-N zrVn9E=Ja`55rq7V92_ziPn1g+uw!`UA6g47>l@G3yBjaOcT(J#AS^CZ0G(!u3FKR>57e+kzoShps7?i&O2LdqhX5V`ki_1a7kaN+lV*HW zwN-X@{u`F^e&zTfQY@N;m5vMnkllLDh%l~}+CGbdZm%ib7@UTwOl`JP_*`71;I{Ts zAh^-Q^?&?_2lfEp93U+MUQPTT->K+Okp3KZbvAm7L zS$DVKY9@BS)L%?9W+m&MuPSU0l!Y!kkLuz}r+AIa&4#C2d}Z?g>d;c)O|C7e+0%9B zrs_T&%FB9yc_W~q!*=SUtrEkcu~`zQ5i%u<216drb}m~*RvB+D1&VC|2+D$+3s?W3 zv8Fr41x$;7wj^7sDwJz}Oh1x|VKVf@E6N;QKs%}o8lQYyHQF{$`)fIAojPw6f?rYA zJaQt_BxsJ@hAfjHq9YN~&|~uGv;rv>6VPiAii$k!9aqCqrv~OT3f!!hHhg|D7wiW3jH_!+~fOI@fO!) z6MAsbe^nRhKK*%vdD!{p@JHe(jLX*ldy3Q;saBQ|>|rri`*!#sQC2+x5S z%v{0osw`^-CZs&&|Fwaz%P${*h>3<|rrMSJeB@bc@he>u-6a++e6k4H0ts1(^)()T zhGn{$x~c@wn-E8c1r0GVfQFd@+=myzN;MzTmoNtpvv{3++&<0C70gIxm@p@+{xfHf|u_U7yMxfl4hY)oQ#-2B=o?n znFuh7ThA0HVv}&WDipwRNQ1$f@B;_TAyVp`auhR`CuibK_0ARR)k3Jjx11p^cS03;bJL!7`6AYkzT31vzNm6H*5 zaF@ykwZ{qrB{e*T>XoW1Kro*Skuo4`N0qajJ{bIo7&{tm>K(vWk?J2_Kpf1NlNt5AYASHPoUTZ)O34&XFRvN2TPB|r!C1DZvm5OKcwFzVZ(hC&!1 zk>2G@REsTw0aOLEfdG0+N`Q?}2IpcdXMj?FU@$OjiXE96h#C;mcWoMoU=}>rNWFln?Y5EO@;pVg@a_O*XuCs-k z=Q8(@s5qZfl4r!4k8Gl5ceF;gHr+f!<2Q;uFV{B3-c%ehIkcFrbGd65UI89yMrXj25tX<^C2I`Q|Gfr# zCgRWz@Dbdd6ozkuQE<7X-DESR0{{rJg{Qq5bRBujOp+OcBe9Twa1&JJLPfiVQ>Ub) zK8pcPELn@OkT>#-&+73>sBTa&@{J;t8fWKbh6;(rxHB6NjNJHy zVb-#DC^S}9O-y6(b9mY8AM()!R+36)gXOB~ zu`Obuc9PrFoHWA)mpak(Oh>KTzoGFF@3LU}Jh!(sT%%qyPJSk6L+b(>ITNt=IqixGY+-3?QV;IA{56v2k*nZ*Xn#tf_~MO^0fPe$3SB)k65m8%8w+urI^ zyLUHl1*}ciR_X4W&!WHfIWv8m1&MOw=R5G`3t&OF8l(53kgGoJ}MZvZO~HA4fsDnXYuFd|=@b zno1GRWs7Jq1nik<7Cb3UU1>w}tN z!d*1pFr!M!3!dneI3?;p$hMf_`RQqbPdu|mOj z(+b3RQR#Lv8J*Ge9!+BgT?m7(H4AR@%SMRPn<#3qgjFhonu(So1{3drEoP>u|3Vu? z8i|3P$W0Wb+G{*+VTM@?9<2;{2en6V14Hdn3$-_!KRl1Ojy~t+HX}0?$K5Pp9^AuC zZfk*=E*9Jq*Sfkmb+zRCt!hnekJMK_I^(y`C@tH7l};?LeRPxUA}5&zm>{F z5?NW(Rx7qIj3wby$IuCatmltPE{=M-W#47qu@UP%O!6DOrCV)Exc zL%?JM{?5CUPq61^L`yH41UT`~W<(aLk|;y%d}mm!nnrv-i7AlxP9f$}^3rSsDZs`Q zIVHbdd7#r%MJw+$!{C{S`}&dhZP@j?hUUA-<@n{^kmqHd^cDxj%y*qDgf%$^?kmRc zgmrK54w~LBUA5rcJKA087+szneQI8^vej+l7X99|2@he&Y?Gh(VVlK0f97bBdwKe; z*S*o`8J6|bCY;sfzqz^gz4dCc834e<%g*%9lm%Q)|H=ON%`R;PYVq*c*!9>|f=l^S z_xYm7Ux82TJlyZ%d4@XuR=tBkyOY-T!oTGHW8GQNvWGtH8ogoTMZFZFDVRfPFsi?~e7$FVG3z=0eb^5qKlU|`BnNnk-L*hT~lNgCyT+fED((`89U7lMk0Kz&Tg zCf=mf}Tm5xOJBZ9dB^Ad&&T;NYt1@mpZnZNHpdoPAGoN}Lp_NS&MG#wLVPP;6ovhfuDzZ&jaSxBPt>~Uoz zGoOp_g9orkB42sP*2snwIbUeb*^n0`O4F3BLJ{787 z5rr{%`ZqNtsF+yWh66BL#E%h%LTOsC4cZS=7sTkV5{-{>e3?fZfRzKikj9fKwY(-Z z_v09!_nAL4AH=UZS~C7T7$1GvHv>pi30o11Qfw%iyo$*8sQZPjJ&2%5?30!jPB)l? zqDxS?jVz&SaZaN}4rSCj4FM#O0<=opF`STQVL|35f!FFvqdUoO!uJm}T{FRE0Kgvq zn!o%u?G$9t$A>MDa0r=4w^kD1`Dom+)@kzeO49VRske~f&BsTV2d%?j$i`eYAp{2w z;$=>DfYOBxh&==CzZ)=-OzV1ptw^qN7Pws z$@8`jQ%3%pnoON8ahPEE42u_$Aqy)@rjod2#OF?bF@yz{t5$xN{Vpmp{04785mM0o4S0s0xrI~;By=9T{msk($zDV`CrEDBh%B<5 zd(||Q^yP$98`Da=^MkFnJ6Gk$!;zh;_pr|}X(K2RCJ;r*I0V$Ms0vV-6Fah&$9gHR zmbEQ~wY(t5>FjfsHNi51(gU4R+u@%tz&BXq9+8X{oXyU&!C!Kyi%ycob6Ic3g+>nT zDcR@ena_Ulo@SU^1`^XqucrQtsrXd((%%6|j=*Dre$cWl!B$jL(wxrQk7e3Um(DjX zd?g_6W5w@i-UAoTU+#3a`QMI2nhz)i^Qr}#+ifgkxOC^=PiC}a!*AQ}^M|@_2kdP^ z6abVGtEz^ln>vy<8DU|OvW+il68XveS{!G~`NwWsIT6toI(D}oAAS9upR}^!Pvae+ z@FJyPhSrV7ID0(Q#UmnHW>{fAWSi#Jq#b|Rp)s8eKXmyjg$A0|YRuSxWWXOqaS4L_ zC5Z+*ZB0yL^$`3k)q4PN!0bPOsS4mBkl}!jh~r<(&#c`r!tb5S0MtR+9T+17$+s?P zsl^m2%L3z@Yh3A)XRI#0nu~H&y;@!l@wtHSl;&&M+Z$Sy<8H{lPrEdP${6&(US1DQ zxkoBy(+Ybe$Q5#^Kd1;suaSS2kS>vt(WIn>9La<#>j7wJf#ozVcVAhJ5@CO1;;5a9 zfQ>a#324@GSaHwXpC>zlFiO!ICPL?(XOA%SG%1XO+RES2-s(Mti_)?6d)h zf}zWSV1&Qy9Zqgoglp)ddgvjH}hj*Gez*CtbRfgkqT1tT34d8}d)_+<6@qsxwB z!|S*sO@p3?fYNoV>93{>Mi!4{&u*WX^es(YZHb4BMWi>AN|X^ejgfdKAE{$hskbX5$jCPx@dHQH6$(+r_XN}Ix z$;ssRjJdXgdFXu{jb9Z9X1Ja5@rRMQlJZSzna0s{n6(MbaduggL6=i=lxrkY`jwQ! zX4)|^))enDQSsT2qjQX()T|Ok-1z9E_)D#Y6_V_c~*tRs_VV*T)ne4=j#QY zSm`$B&aTNEnx_uWY^`9}Xe^fSQF%UcqM}N?4CCJd^uV^n2%c?Z1U$?FlUcdhgCIdV)i=aMu9n!i`*eu!pxwVQ}R;I*CT-XyPUoMIXBou@>#jI!kN(#l7IW)z9^1ZB|+TPn+nv z7Ba^2QAijVX?h%7R04)48#s~gxY4jxhn;qn#RlXuCDjKE-*TYsaSqI8X~z;1+xi-> zum?@XJgMNr>rW&E)JA^8pZ96sR$E2a-u~jo2&W&!*X%C=Pxa9+BWD^T54R9|X_O;E z9Ia_dL3kELM~MiajNVoBi}CQ7AF3o}20>Y`cT-Mp(8phnNzBGnd%iVk&!Mbz->>U6 zoV;WCSE>(CV1e;GLUisgQTX}|&yF}@pr^Jnxp&0?$`SRIm=*wPgaMUmhEx=5S-C>C zBGs&Iam|k61)^nHTbA#21x=E3NhfebHOU81)Euj|T)L&^KU*HqyZe}TJyrqGm)dgSY|)L|pr=USmQ4dNSlHi5RX zs9?;ohMR^0ehYwn5v7Pn3E{95nRGgz?M2;K3GPgh+sj^Pq75YS&;U0ijyli2c(^h) z&!|yI|E&BkW08a@uAcee#o6%31MAb!BR)L#lMJpmh5{~&8B=dav03pWO30~5uvqv! z#itg*9<(Ky>dj>pl`kj8Mdq2Qv!<(OV3+P&OyoqYmHWn20rG_=VwAw-)vvKp5>28g zA+Y9nvl6(f=G8}Kxb?@v9J|?Z-47oZ4LgV$eg0OskS*CNOTS%&6dteM*4Tl?} z{nr9M0l*qm5knNJ2i}6QYzlf5BBTsm1bybP1?A|F2m_p$@lFY)AHSc!W^N=`lSF`# zMB2hID`-XCsxoqbTUUczS@q6zoW5nNR>yxc?fI-GHL0eiTlsb0wnN8xlQ@HSG6~&{H;=Cbjp}`$ zHrw^xTvn8PKeTxvrD91*(UFImiNbnubWl6}rghQobH=%vzgo>orf2uTJP{qRSjIF#19^PCx^MZ~_=};r?OzdAT_M|7^IBg;(Rb$?l0&u1 zoLEjDUXT_Y?b$SCdZIu~3BlpM{KvQiR34vuGyZDi`4aBQo*-C19o0}M5Fin!?9(|3 zx^z7oP$(+aEdB8b&;0!BB474hoX15uZSQ*~uh zG$q?>%3zB|OHv3ugO+PS_0dbc%K$}8U$Pek%Y8a+^BxI?sjRlM z>h{55clDDmCE}hl=CLdCij5A3*l3>W2-Y_Z^OeRne(0O@+>ZU2=rVAvao-pH)v4}F z`Jp^((Ymq{(L~LAA)PA@!>Tzhu> z(?c)R<8D!;*!@xcF_6sv>=gd7BKZhVt<8vRa(i}@DThA7#t*Y&Z-<(FX3BcsQ;JXW z>E8k&_)X(h+K4dhW8vP{vfv63Q62(r@^!jm3f+O9J8qz7Lf+f}=HT6_L4<7{B2G<} zf=kmF<(VQpXD3_N8UN|0hhaNz;JC!5w1LlWoU!Uf|G8g+d9HmkS77vXALiesyn?J- zAuQo$%sA#YP3DRQWxG8#XVHPN(N;1c$8?E_GGB%;9H^Q%2wqCrxJ9naeDrvo*Q!hU z*jEfi(k(kV+Y~2JoFgB8yW>pufi)Eg`^7DBH;8oof$tfvy9u|1tHSFxEqL4jaS#lK zRmLL~YwnM|KG>|nMb?$14apOGoB%a~n_n5+kACD%mz6yMN;vJ9X@nG3jTlwv3lb(k zCC1|T9bqE&8y}JHla#B1H3GjB&YDe5r%w2U$YBDz7mNar4$Xs=6eMiInT@RKjmwcM6R&KI=Dtq3 z)BI%oS{c@3rsiWFnkLz9weKJ|iD%M9YG@yj%gYf?*D-{_ z8Xhe&y29=t?wiV&9=qxp z78E{h(v)^fY3h`FR+6AHOC-CJyvx}yMPBja*iDVsWw&~MB@seu{03<9hKiH-iKBnG zL>@2T-?^LX_Dep*dq2Uxwl*p+vG{kGc3L-L{;gDS^T5@jE3=u*Od7`a^+nN)zpQcO zg&_XN>C7gcNYWM3J#QV~OXMquLLJ6AyIW1;85xnJ!V80w@~5hgOL3diaNOeh7?X-V zZvZtGEz~G^Lzp1TOk1rav>#{^3r*GJCQK4g9s4W2KnqjtPb5kS;hs_;P-HAf3A-GS z{Q=>n%y6($g(RcIaXhpT5y5Vz*(FRi2j;5-dvPADU$&lLcYPfKWq^%#M7^~GzYG2= z)jv?6w=KecKyC24kTsCvfQO(Ip%_4Dnx_yufu0(yndT6oQh%V-k*hpRK1wgp8nu^o zgl?-iCjBAv^m8ISd!>v)!Kux!hJRM>*ndMQgepStQ`21gSj@-=9w@X2&_e&o(mX0^ ztRlUy@)3(-%P|I<+gMXUGfXgWHQ#rdRsZNzncCsZ7cS88T{DyS*DEd0r7%D=R097! zw92_a-P5_<3|eV%f%OuH#yxThgwZ3Gs0CpC;$Amc)^NtBO%vUoAqgTRlq8A7rX|TF z{4&Pl`A}@&5osRQ8;SM4h6F@}*4bbo`NOa^bMRL?iW>nT|4+uxUJDQY82HN6V_$`I zwdS#seTlLu`4k3o>{-Z9k1IEd-cY6aX0IxaE>`^Lq&L{gSAT?MY{Ox-3^`J*rT%Tsd0w|-bZWe(lXplO# z0Fg* z`~;UmB&>f_KK=1U{Upb-t|3>(N+3DHp>vscbHen^a&BeXqpa<_Qg9CijC%U5NGR~)j{dI{(&qiT5dChr{ z)Y0vx3$d-5pq<4}4(H}6GN*j_AgeS<06HGyDDb7>Ntuj~%5d}K1SqyO8K1TZ-r}Dj z-emt=S@cYWyR*UVU*^hu0o-UdnZd_r&tU|Vwp=rW^|EHbpnYlsUai|=*Sjd zWBs(->QZ@1``(NtHemTA8pggr54K8%+gTcB;Q1}#V;fdjS>^zLMk!0=>iV@uu$ALs zc+i-CR(4ii?c6oG6GS-g+{fM(O&ji}`@f~)#EA&Y_OR=^a_rB$TzOn?X0r3Ktqj-M z9Fktty2I>2CI_^GKlg0q3OAw?H~G#suRvUOiZ^vzFq^s6 znCyHjueY-$QA2Qvco3Q!v2n8vSY-uY39$9lMW!-m8on`%A#~^jTrJEYk?zPWcUkp` zW=iJFm}JE>XBg)r>=&1|#Lrehq{_Maj$*M1%5cL;vYtjml(#R&;>F@FO5u*1){Kny3T8B&I8gmbYKcO2_#66UfBMLTBgWS6yEw zJj&40>QKpO31sP2k)wwmRN&{h(|x+!pfk&t z1!IW3kH!3e3c!59=>*fK#3Xp)x0Ewhnbo7>P1I;ghN?KVq#Y4ph6+3&;Cl%56?EXU z0V1uO-+;gOwIu~A6X6XaMF!zk-HfnT>c>hC`s*8;MXAc;(_B~T~;2xX#A=*uxd%+19ENTbvU1n-i1zA^QbZSQxl=bWBau_MkpRao0*y>7Y+#U&tP;0P{W`(1K z)29fU>|h_a+j)(rx+&WoYkeOZ`<5I2Vf4NFWC!KDWZP5GGi2rVdK82}17nBx^!Hz^ z8L=e1SLYPPecIdK=_GRB)hKi>E>cJY+UUIbbsH`4(B7E(#sS_@a_o*q`maqIGoyhiJB9H{#gKEE`w^fATgbt#Ky3IXkP2w_zGrmNnamrI=+$ zm642Y69=mep}}w@NFORBi6Sw2M1-MOR>7d6kmPYqi+*`T=8P0}0u%HgN1`pdLjU#4 z5;UB5Xr%n1WS}+am7}l-OtdgF)m3BKtNX6fsW4*QcPh;(3~Nf(nO5l^5?K)0^t;pc z_+A^kI3YYAq@EsYpE)fESGMQR2su%6#iSu)U?emZB4`P>Bsri0=1mTPjR%Mrw4#zEO8viW^1O27{;lGl>M3v+%<3p(DJh4FJU_7 z@YFQ<@ub>98oHHB6x$lLvI?wdjy_&Ytf*<%n)9!j@Cv|V*vH*T+yCXNthYTl` z#umNN`5~iAODwvZguf#r*p%2v0OD-T9XI*pUeuHH^BS?fi*o+h6b#mg2!IDe{TYgn ztFdYOyN`;Ts=v;rEFAJl>v6#zgxjMp3ocsH2|_Hys~~6v%*Z7RCfZ?dAatQIaE%eSVyqNJBPp^vjaWC|X#D<}PckuN9ihCITuO%-v^C1$% zFR*4_(3p{1jvs<`WdnOcI_M>mc%ru3i$O*|R%{pB_=ir33WZ!sB8T>=Q)GM$)}!j6 z<SV9<@!S@BwdVwBRXf)C$Y~X75=#P=M?zYb|;%gdAi17mhk132uub|=gsH4 z&(Gh)YPE#MP@!ofiozD$gcg_*!IsKfMBMllBaT&4gwa%UZ@z>dF)|h+3Oze!tnqxTxV`RQRV9;~L^#vWhGNCI(S3PdhBL8=2-y;EG z2-hV$mA}9?Ycvkx0xX}QTU+8;favyI6JZd)FAOCe^N^FO;^eehb$+XDu0!`l&O7Ng zF_7u-9M{`uNLz!|!!JsckOb z&PiauySO_V$}chHy-#x;g~RXPEzOlplrA>?^8aaQ^y6nAM|Gb5gWyd1W~EBfIXv9h z=<)|?uzGVQ>T2DZn zn4GpJ`J}DD5YX{*HI8Sfk+o5W!^?&48zW&%mSShtuX>LU8Hw<^{FfDtoA6a{tQT~A zz)&qd+PqcM>BI4UL4{a(yG#f^_bm{aw0R)%_0c#woxenHt$ZgJMaGf0Q1ib9I!DZ& zY!R3n$rWX1EMG8vK9Tsxe`zQc{h`N3;8-QWfywB^(X3ua>o8d5s&hRcuumo#dnFbO>u5xSj(vPKPfOW)Y(lj8>e8cPNbeAkn1n%ma&(vypKQ^}RvpSa( z_&e_P6sXOqhBX1kwdhnP^~zp7lLvc9J_BIp03dRHKHH}8io(=jG!m=|5pMTWXVK#E z46{x0>G#of9cE}MCq|Oi+mYP6V&y6S_)%5Ww%gZNCQn+8pp8IUG^n$1jRj7)BqN;$6+;Re&)nZC9qn{bBP3s#@sMA0KILR!)Km=F_!+pg$iJ=kCjV zCeCfZ3)64DIq<~Uq+Wu3E7`z|hr8C{(LN)78Y~bXVj{!5*Y-osy%=xEzuvsTSRo|w zP_)3)L3`0`ePi*UQ@_&qZJlZ|iS;|l_>au+jZ<$HX5%e1j!?`D3z&fUzq1tahSFf5 z^C-{%<&8L29`0`v!fi#wQ}stBAkx11A}W^El7athF-X`xLVZSfL0lYwfstaf4<(O0 zKU*oV9k&ko-X&ozcW5i60oom&C?Fm@#+yhYi~no&Bd}QR)ZqO>!^)){IlEn|3sHzN z$e8I@6ib9oK98G5g3E%oO{>qL3xm6-9Gs$pfHiP~DlUJZIcMjCDE}C*wzYzuMzF0N zMyaInQaYPSQ$WB@^YFde2puhfkh9NEfFppr%w!5G0tDtRpdH5(ejC;4)+t|w`A%(r ze9(lq6}Q41;m^MzLe_;MEsGtrz=>uQNMIB$kTHB4l^tVC=>_i(hDV7OSC!7yp#Xk* zn_}4gms}3=;y}Fe8Ecw#i(0-avg!_t*VHvp(iRESIa4Ek6hGgPe#X78Byoc96tHM7 zlY%GM@nQYlsJM{^Yz`BWU+BcK`q)dQ*}hK1?no{qn}#bm)z~ZI3(XVE&G)|vGm#sx zz^`%X2_{B1^yy;weO{xe;60jawVEquT*GAZyq;fg{W7|vYE9{Dl;hjld|5cWzD@u+ zzqFib^RCB!x)V2LMhz;$on#5^9V0BI>tUoU)WUzPnfX25P_CbTsV?QMuMDPeW+t(Wq^A!?!q^__TFiIY!?%oHt-$$`;H%#MB1+z_WzaY6%-hY z5DXw*g?K=$wYWGWgx)FoN)4WN9Vo{Yq+lFua#nnpYH^lyu3S8E@QBNiTg!gqDCT%h zj&SbJCGQN@T&s%{oX(&L zNGRhFjb0$G>0aYn4$75FUaO$LK&Kd=6#s1F^GadA;Hm*_Pwh>)1Dnn2#?O7;tIb^W zNbQwB?E2*o-K&o$5B9ybB~djD07*4K7~`YK4&jgYVxU%T7i7P`KV(FxDC8Bh5*hPN zxm}h662Bu4-fa4MXTWdaH}GSMQplGaW?0$7nH*2L9d%KE-4Ri*bSMGGYtHiV>}n1D zoDQ|VNiTgTk_x|#y@JnnY8iygu@p9#FEIpSc04^=Ih>V}DdI~=$R}3G5Q>gOtKU%I zoZf;a3;znw)>K7{PFjtvYc6@Kvea$# zxAt_Jwyc#@a|O-6XWOaLc~&dmsZ~a&&_{JOC-Cbs#Y+r9q?3KUsxXIOT7TRRJ`tv# z(K7!^sY8_{DlVj+#rZ@+!&NC7ufo{SUZ{m;ESytp^m7f3*Z#xvEI4!7aS7kkA4AP| znz7mSTWouJ8;|-m#Tq?HoFw7)0GfwYq)lqhV@D{(0kU{JY6^J=4U#ed6^Q{?X5T7- z#Y(~5ad`az1*aY_5;o{EHSp*BJneBRo8et0z20m0h@O^llIn|%G4jP)>COn}jRmt? znh3k6zDP8?b6fv1@vpSpWk6(VNG~3CYBe&omZvlypI=_!vQzvFsE@Y>Hlm7jAa}<$ z;{%seOq-_9`uK@!BAXgOi;v3E2ER@ol2gCPZGke;IGD?Ck?c^-beFwh(SZq3nEINz z9JhzjG!5v09l6TQZG(n0`PK8OI2Q10IX?IC7Q z);b7M>Vqs&wkEfQCE;k2;V*9YiUVL(GjSxf0`G}{L3QwuwM&W|)MYH|FR0CDt)~Pf zp@0B+$4ejzS3#K#Ch^s7yQMM}hm`XxV~IVI9Tj1+1bZ(E3!C!>hnO;pYO#)9^83~I zdrJXoYrIK3Z=0G@J@)7&Ej%XWBBDJCQ=)5~%*}eIhIo))vv(=Ul$hC9M^9B+l67#DRDhUuPnKOqZqK{E+U55cR5dHY#c&x-Y#OVH6ij^61t@; zZWm&nS*$<3JGr*aH&jz-o?+;0Sxv^W$P`$fQDa7OM3u!L=Ei3Ml#pk$);H7p?Vq$_ zJ1&$)hL18V>eh5;q>;FZ@QK<%gzRxj3{0h7d3)n5MFo-vVxhY_44Y~-il)9B9H|g@ zXeudyVM5RY3}xoFa|MejDlQGMSVJ@s1LZHl$iSiyAkM_fEU)vZr@AOHAFp(0TJ`cB znES|$PcJlD@o&v*gy{z=2M88y`n}X!9MXr2UL9wS9i`ZhMMLvi-zKISk#6`eMFzO0 z`446L@UFKi5H$>!$k`R~u=BKAhaCqvAt{yDGwRcJtoQhB^oW#FBDztiaFZ{{QyOzv*IckLCu8^Xm*$_N;+db{ zd3w7vpU;J_SKYKanffwuw8Tmj`E7|gnw>eq7^BvkyJ0Ha|I^5oY)t3`gh`m znnwJrW)=NhMN)LRq1=0Y6EY_=S`tlK#0pAN_%v~m-_#_+oY^w=(^rG|y)ylS=H0p# z?jThyMYV2vOJ+D~GLW9gyR*0ARQxnj$%UoNIk0|FBUY+;N$#MB#L~OWUQ(Q%$-d(+ z+Uk;0z%{WO7t*~!^rZ>1X&#Ud5&%G)Y`7PT8!t>uzO`(bafqNwMCXst&tXkJOqp0mZeEr(NtjtKMgbcVeSC|Xq;tx31Q z>e`j#f5*eX_iM46BZDSqr?v8?i`ek-;kCs@{ddRd`PyjX#>QvMzdxcszs|bN|Ksy5 zAI^1u8XmH{uvspCdrEGiNZem+Ct+yQ;o7{W>|gWrX)NRME@RPgNySN{`Lx`F=s8b& zt@^P9%it+a;^9Kbr}a_;SwXhIRU$!+KN?TigER?q%05&`5Th&C-NhT$~%fBJACP<`d?iRStN*+y0 z|E>X0Q7nBP!F?ylqp7YORDheTK@dvA=%D5Xi;@bbF|Ykyr)i`SZt_T8bQCRy#%cyp zA|{W1wOYz@SoHYI?3;b%3&_Av+CUr!0;`hUICK|y5G$ydoE3%m=bt`|FjSSANgQf5 zwd5xw36j|t)6H#2q0*G#S7A2pm&Xm;uey0v3zzgd=WTXi#qTEgp{>Mm zF0XYTI{Fxy+EB7}`Ks=M(p&XtnKsl(e6#VHV6A~s7Gs}v&D=vg`AF+}R0yUOnABSq z`x0uVo|Z%%{ld9Il72qKDwcKqIP`}#`Fq}WVWGF}m=h&*{+z7(z1zH)xz>boWNl@8 z9<~^$1=TMMY5Q_eIpPCt$9+4#-+owD8$F6mRQ<-eQs9ojT);x>!x%HF zC$k}1tb~o0N2V=UHm#=4AGb4WKFnuaMX$Xu%%k8Jjp+IlB=c#K$lBtCQvI>!8A%NpV z8Atg@$6yq7_EyS+gO=st671}E?;8iphC~kSwb)B(vZ&=z6y<|#Vbx5!l#}Y}9Q+oP z9;?OlKb3HDR5o^_Upo&5Idr}HI~nhw7K`A$-~ifdS4XtYpCwV>8!AE@z{pIie@=y~ z6J4%Nr%x4LojH(tH**h{(wNj+tLyz zzy0c+lDeXwgC@z={+TKv*KG%Fb{R}Who6A;q3MvNEXrotirCLmIV`&K1KImdUv@@X zErk+NNEmIa^S+EU^QG6j!SSMxmcQ^#3Bd@FHS-Z(3ru3L?6TYlYa(&EdZ=Ol`_3%hy+vxGb5EPAZq*v;)a<8`l zY{=LHFiyoDZJ|;Yyp%9#5IFcNl2XS$dxi0ZmrhWNf;SkKxZjy-iCw{o*q(6sU#VU| zflWF(h`!&LU~fk)Y7`2QzOH@^13@J^+A%X(2{ltJjSC0)5L->)uWJnxDV->tr2W&H zyiuD-P@`hN(}zJ3RA2nwzrq>BJ&fk^p7`VqX?#t{JWZT$ETe5x{iQp7cS)A9XEiM% z&uWe_Q@IFRnF32KXaQ(aQ0h-7g>$1a+Vmgaa9NK|(9#|5hg0F2T$$x5yw07>x7aCL zwV_0lKq70paQXAs$WPn5zP(<|Rqu$sD@^vs87Wk#W)M~dTX1-mQs zVwjhZ8_Q)vzwiQe4)VlZaMIKV05F)9wX;AVT$0)s&jTp{!GCdP)b23}K<=K-UNm=JpbjZv1v1 z>fRj7f+Nb4w}AkMX}VRXk8?XxX%5$G%Mm#NfDiyUeR-=IOS=@DSoy;all~2|vJJ9Y zBPvJdxUq(|xc6f1i}thXI{^~-?9QIWHmuyD+M?mVdIhxa>iTtn2B2L9kZxKryHoA+72>U(K_ajCqKwp1(*kb@;bIwCfb)$5X@X zR4gKoYc{m3p&OYH*fgq)I-y~8*)I3;b4<E92wf1XfOrCzoU@%R1Jh5q&?k;mGUsOd9^dUU}r#AcUB>Hx(s$-VcjZapx359zF z52IyHpDuf&zy7>li+bV6A-Sq-oAwGA|u{$PH4_w9C|}gUyJib z=F*_@T1GmU-and27FSwkeB&%y@sVKX+|!v9U@UTWUER{cd&NItVxPVd z=To~NnTXlb1N(x(8Bu!msxqccdcCUr+5MNZivmyrktTM~dMTB=^g^FzfPoSKO#n$| z$xW{qc6}Q4X#=OSb9l*Esxy25*VJO+W6TyPeIidhQb_V~rk$si3YJt7J$!ucYCnJO zt}h>*CL5@*cu}Hxs&qx5ul#9Po0OsGQ#||YX7WKL?qVSjM~hSNS(obhCUXg%arRJk zCU5Liq(VCjPu6=!KCQ%&!?)^%I|YapaG22MNywVOm=@Ym&Q0#WZQzFy_GI!hfZ@iD17P z|A!WpL1C?8*pVg-Mx=UxJqtx*jw-G&=bCXz#gFmH1QFYNkkMLgUQVt=qK2Ffg>Wv4 z{r)Yf81htcd}9+)oO1bJJF4R9`SufwmzTzEHQyq)G0Uu3>%Ma>>lF%1*TlRqIl%R; z&*Dx|pMBv$5Xd@_C4k9T+R1@1r8cw^+iVd*#=gHBSz z_GBqCxFa)o>Ts|ex8riT`%}Nw)wTL#Lf|fc`H)b3#|c&K)m`9EiWop52B)FR4NnNI zm{W$tIfwN`Z5uPlLe8&TISO2$JA9tcl1i||#_{Phr9x2+9;*r^d< zV1&kxo-BPS{HmBGag_M|m0ebt427_MHBqLdUWVH1SmF161xZSjiR?a>5G0LaZWe&n z=aLmpGZrzdBviB}68BOo8;vj1;%f`wyEx{o^9F+1QS?}l9vX5vM4Xn)=`^;Xr83uU zNhS{Oo3i&$v-(cAC|=T+>9Letw8e3>j{FVvc62W~<&)p0(G#7mCI32MpAA}|Byu_B z)*~gpg7~iGoJ~~Ksq0OMNYVxF-JZ!C)^tehYC~x{ezRTim~WOPn{%d&v9R^WOKGTm zXU?+Pf6I}L6{ig?8Ld|Cymc=rdrai4om(fZJ!A3V5+!QwSPu9rq*^wpbdfhVd)@c7_4VI=|3Ou3#Ot5M79*W$YNU#Yh(oB%X9lye3#6ze zB~C2xs0}9I@L2#MEy9E#BWK6~j@27n8=BCGRZuG#>;Wo$0Q?=&Q&8f9>h;e-aHyo_ z`tZ48rTVu9aKz-0zVwrmOc;bz^y~4&vV^+zPGH6pD~%N^dt&H^&2W^9tbc@iN9*^oD!AwMarYw6m1hg%*1B^v$BA z@oDgsGyt~Fj|w1Et4JYX7!WMfUIrw!LJ(Ar6@*QKE`$Mq7P4N{W->>?(2GHFG4GrZ zYA)JdcRpk+RFq6|b!Y@O!pIaREg2chEz&_gWyWka092H+qVL(=yP(EKLaX5u!N&ze z7>pD8R4%^f=V!%Z2b;QsT3&>k$~Bo(Rq2pVVStHgrDZAqKuN9BxkDJ3(QU;cP6mMAg$kvq3@Hp{C1Ik zZ7fkgk3RS0j?AiHieHlx<fF%8>hKvhJcS|Lh!Efdb(mbxV42tbPS zJtVgWh2L?4-!rac5}k=sE0H46QQ{Z~c!3{Ocp3HsyVsfkM1}L-0MO0YPlqd{B<=}B z?c?d^7MI3?VDEy1sFD;*#X-fm*6d!HI4y7FSri1Vk z0~wr{?k6EQT=HQ(AO80UzTh8$`=DT%E<^t&JHwtamq)l?SOx6_c?bu%HY78V2pf!; z*y0}ARi*~dqN8F%d$tIB3-B9|s&a4*&Vz`1M%>)TgI_?3P^x*6hFBA03xjzNB1kwa z&X7SJENLA!&80_)pQ%Pm7&*Nz%D>YsgE%x!5| z*hapA?gQE2fzvA5=cO6CRve>U-;J3kqOU}|!xlGIGvs6P{1&4XS@K3wZH!Y+S>lA8 zCkCCAfAn0&%%$c=Fs}PDL@-{Se0YW7L*bL&vbY2VqdDWXarpb6AoV2`TF1R=W4s$o9*(>8&=hNJ5Og3RWp4j#x9*x9*5nlg=gS5IycH9hfTG9gg?v! z6x9S$jgo&zfT)36s20{{v^%gVu>tcU{1qzd$a3V{)z~fFcT@e6#KR6@tl95#%l&iT zSJ>*MwO01wNHTyjo#S?o2Kr?0UsS*@tuuMPE5K*9tSNJ9~O0+nYHUTp53DtgeIn4Yj!^x zd~fTHIlc{}+TDHMdUXJJ0gxu5Z&g*08BK@*L*=Lyu40ZBC#=P9iKpMzy4Y#fh5x#4 zeE0fG^?d0k4)}hjsWuB1Rlx6sXlYi4;L$`@M8p6X>LU^(Oo5Lj)`uGkWah|?O@xm4 zyi($qO8pvvFmk_)Lq>{*a{7DuXlX2aVScJ^W>&oX_Y_KkqN>>~x>|2xh;19J|BOW< z(*E%8!f5x5>d-s^9^k9~bGEwAJ40BSuok5@wUaqZg?9a-g0(I8s~*OR+?HPPsjEI# z_AqNrGCz*{_o&*maP41)2ZBDUt}Fu%rMP)cneU%2nz{qEL94_4CW*FjnqP1I!`vf} z@Od6IAb<*F3{DZRV=AL?W+gYG?9i9^iEBu2b7=I91{sQ)EW|p~H`5mnjqN_(u5LTh zXsEOQ9=YJVUAw*6=?WIFFt3``3jg_NB1dlAV_>mM!HiPD{=%OI6@bQoyQ87yqM*xi z@}5j-FkG$EyiFe|WJS(jzAA19G!2YgxL_40or?M{7_TnV-E8%h=xWkzPY#YT-2&5KPHDAw6QrPA4*rA*0YdDc6pGJvLcMd0qa_yoQw=6Byyd z_yqp=O`jhg3$Q{Ah%sGO&bN|Muy22Pi%QLW9OIYBjNyDkk(}1xy`OexHVZ*8+sTX-f2FAJ!H@ztx1hL<7bysa)J_md3sNU}K5sC0sy5riC3nHfqa@}K_l zR4~S`tHsuci7vaRaadcSFop&+e}0}ya=LJIwrLx?SFQin*=<*!x4W7-OY-K*;l(=r zb?cl}jdG$%vBVsaap^Lms|3IWuee)J#gPg#{4oN=ClL#{5fqGYgEUsYR<*>vC{+pS z)~)Y^Wfmk#t;*N|J{I>0KjZ5UBocp_zg&*n~8;l zh$RkzuAF9mL`-WkVztiJ!YZk}P?zvS+2?F=aDk%-SQtP;h0mymIj`he+vO>=(Hy^2 zi)EL7^OjHEQS6$g(VTp>o{o7|+t!-PAr%AJB$~0IdzZB;lP|wLU8r}i zKg0cWITAE{pb!XBhlpr&)}uY69B;(bN08$ex-a~M$Hg7Lbyg|nR-d{zHe!lpSdnZ$ z3Ax<39>be{Kg&J`eM=}=xfZsYr6tO-rdwY%UPV&xna>epbo;?XE8a6tN^XtPRF{8? zk3{|QYTo3WhWjt*l0ft2PGz z`IDk~Twyh?QIK4=bDF@VMCkTKas>B00cMti_|NaE9bCWicj&vQf~H+N1%l(e2$~p@ zPH&zcY}ajEKRq+JC=`yLaOiWH(*b&b$a{4Gy+NHX3DVY`wTzBSjoy77R#dca&@Fs| z`^2nQu6s?}RmZSvA}?gWdtQ7>72Txw8$?~=tY{G@UuGcQzub_JWP>~aYx8pD6bDBn zyh#c2&=X$~g(p2wCAGc3S~h|F-0TqUx64&UhRkq@|NO57jEMT#wnI$51%x3|{@G#{ zxCQhxL_UIS`t~8@urmrGOdis21WxZErrJ9p-*eS?lBPlUO1x(OaI+w%Z zO$0hmUa|T8eWzU(TlqjoG~!|b-hD5qjcSh3|79;W)!(GsGzd0R-&W;#4S(+5fPcLH zKdQbes12@*Hb8Jnai;_bF2#!$2=4CgR-{1DQrz9$-HN-rQ{1J+9g52bx#>T5?##_w zUUSag*=Ow~98=134PzUv^Q!X>$-<898kWGIEk85@0*R2(sfm+Zg;Z zlBpoC7jeKSp-Z7Lkcvt?0C8p%$9FUU=aK_aBY@eHZyy;5pW!%rl8=UZ^9QYb=XT4> za*%(MR#Bdb%zoFCg!$g5ug9kfP$Z?4S|fZ9&ARQ`j)l$(PwL+PD^(cvGwC1UkL*N= z1MRRr?0H-q}0JA)5us4lUoB zO$x*_(e!72=hM&3z!P1gl7^{AQ6}(WnIW37^g+9ixL=aXndkpdd?lk2Ae1PDc}P@Hyk@NMh{Y#VUO#9)&$%ur((f6a33)_V&&7 z@jq+H=4O>)^sm}mARl5Xa|S9fEE(?n?Qgbi54=TTBP9zE06LK$pkhQ<7iC0iwewl7IbLf^gX^=A-d-(Y3$zP(8j*Mt2 zUt$dK2Pk7kj~t5zvA`8{-i=5(g`uK-@#Sxq&v-3`{FRpwh{lMEa^k2Olb2I@y^!`{c&65q~DLy{<{gVyy23U6DoBu zNs_z&;fPA?4f-tw|av*m9a0QDd4wsJRASUPCCKjLqL;WCGXJY(e-r&tL^GSN z7~Y=3bZ9lW;^WgaBC@lK_=O#FH4#)ItN0p+g^FKkqP%gk`~yKBPve z;;9VFlQa|)|NA3_Sgq$HDbG8=S6kfp+p~_NWIkWvd>=j?^X%*>@>e_Y3?P7_|)i;9o{A>ZTG|R8O*!DVzKam1#pVTj^tRZqn={1sZl`w zN)p;MgbwMY-fTT|!IWS&Xl{pD6i^PG{J03}p32n|zoOyy4$n<$|;AzBi#Vll4!60DH z6}cT-Ga+g2cId`j`1d|E=-8!$ zNoPj|PrhPP@G4WGaDF-n7OO+{s-E>#tfc~Qn+(Q(Ub+Ob7nTp~AF%*ygMJdfPv37= z7_3$3E4Vr8$e4m@+ESWtP<)$wx+tJGP@{X(D879b%W@)nAS~}C*>aVj=vKLX3IkYX zE$UVzBBS=~AepPhV8o=1V3btRNc%qYKjkV;lwRZ*9?`HoM%UkT#mNlhk;Q8ICm3o! zw{kMSFwUbhC-Ap1-maNqG%}cC$f}6K8TXf?X9lFApkcW@$~JxfY##J;2(_9~ErU3n z?91=3Gbz~n+{;Wl3WOc0`mm+lqh#;V1^~VY3scYVZ=yBc*?3ERpX9#%-%gK^vZooC zp~bSB(i%49;#T(iAEy+t6g}+PYd4>91V@xsp;ZQ*2JdhQ(v&4sdqtF8EM z>&`$~x)0I>Y@+!PWPnL7L`qBIA6`g_WvHIen<@U1$-rWs0P!$De#=X4q3wHb|kxDknb~ll=37337Gd z=s^*dQ0dPF-NB7)woRHR@Ovqj{(O{qm&h}fD9iJ;m|5Ajc{KRFJuD2dD$ceK`S1vB zB%Kce1m;2f4}#az^XuM``b+&_8o%q_kDT!SG}r6!UQc* zPPQe;>&NSN6b*pyN5BK*B)wl_JjjlUws96yTwg1vwJ(nGW5W#|MkeDJ#0tdW|a9TiM3?Ksza#vRYMxfAEp%Nq{rwNcM#;DZ3j)y=nY zHCeLtSHaX4%Jx_-;W$Ragf`@|KP6);C?yJNY4&L2nuXqHM56t){#UC1NWfNFY7FGI zGBg#{#-`tJzozQJ9D*1~f={__;M6}-Fl;@Byx#q_RDs1j+2Q%P&oOzO021Aqf|+Oo%>Rcc=3heJ|P+=URbu05|+~go6_YB_SA@P| zHWY54Tq-x2_BBW#o02=1G8?6fnb0jew{|?T+}UD*?)y<0xx%oGZkqBsl{9`Y@a7+z0ca>PF`7cu5V24Wgt zBhe)0%%l?~hlR7t@MV^Z0fRDCEFs2p^f4#+0}UX43^V7+nzBvXIh4hV9sq+b|R_b)wlgMnaP{yM~$Oo?8UI=X-ZfIL!(+%Vkr1Ct0;1> z=_oPu6<=h|FX+7aI7jK>(Rz%+i&v{43QX0I=E;HffW~ ze*UA|B@{q|YXZ9oY%XOtVYb${;dnP7Mg1(lMi-|&LJ4wA>9Ha=2!#wXB2$gCwx-bR ze8jm-tWK;Yd5n!4SI%n9$L0xTN`kBkU5(XY&2p*<$^7g@;`HB*wBz9nnFKcRUf(2f z1R7n^XQ}K8`O@Ydi4SWGM)zEzCPxGamLj@kZqHkP+-iXs>E8KF(vZB(Oq`^J#pp1X`{i(kpK7QEF4?&uCuLW&1obNL#!E~;Oc?mlm` z*XR<`LU6>T#W$O~d=N}^M9=_~B&s~HO*~dQ!dN7cxcX03c3zV7$O+3F0>|z+woarB zbwcFZ{@}AEqAf`w-gr^o>f-1^L!Ks1+Qs;|y9nhzv6&Fj$f81y+amq@L*!pXk?#r< zfcquyH@}%h+WNV$D6%7BG_K83xh7Zh(EQ?|S}9`uAtU{l`JAIP-blfPx&099fvSKK z0P|KNrpg?a!AATu_pRRCXVrO@agG910R%PwIZbFJ9qw`8a;jGSSE@4r#P=}b8Z(!* zFr02R@eVr9R3R)>)8!8tYQ?wEC}wOl@|H%XmRDvOrIrGJ@kYM|Ml`Oc7Ujz2=)G+{ z4U-H^3B2O_i*4c)WM|Alyzs#jfk;J5tOl8YNSTZicMyv~TXLGq-(|Sw)BzFevC)ta zm_;sV6;}}(lN!RKkcP?E8h;_r$68=>BG`5oOPxg;u8w_Ln_-7Jg{xF=nGm4fWzJBQ zMJ3XtL>T$Cb+nVusR52{y8RnQ(CD<-`%e7@_ROq=WwkOdju8C@3Q61}ih2R01t37j z2?PKcwyf@{W&3lQ(kTM9=pRw9{d_pB>s!_X{C7=7@^?;tT))^^S9)oizE`$fAKwgg9*!Dr@Yt+TzFLjnk+|seh$$E3 zK=3#-n>Gi8$0;HA4`Ibp{hkvf^epJT;+X@_8Vu-~VTGegU4`?S>7~rfi%BExB-Kgr z82Gh)FtiHa4^Lz47#PZ%0leDrlg{#w@8B397It4GBn<^Ne8501!;?r0`mTq>aHJfRQsR7-?R81 z-5yc~WE_>$e;Zuun~)0E8zDSN;|kM7V^@Sw=JD0wecB7zROjmA(vKWrSoacPg1Qns z6KpJEknmI5=_$OdUh&}%TJfPWB=6;u1|&`B0^q=)y%;ZUm0Nbe&>#H6(H$f+N*PYS zsK~FNAu^Aer}&6IF}9%3kZ^MO$z1X4gLCxwDBHXlcV-#Ykjlp! zs5QPjrKij%3x6!`7iicyFpVeB<(mD?dmTv4lXXy<@${a>fGk<3?GraUUC0xN^Y{Cg$uDWW{e?0a|_%%8v9NU^Zj-ee6nu)be@NupH|c6 z62k5DjujHO!u0gJNj}`yZP6#elCeq_J6t;0ZT9$-mqh1WoE0vf(#{p`ZcJKSn)P~E z_W$N)6W9BJ+C`979ku{>iGhgq6pi{ep7bDeM)QyB?#VT(Yt`;}_;J^3TDR0EJw3DM zQZIrjcML|i>ea>?@(E{47yWQF0ppAul>ulPqVWAvjlBSyWLoKxAC=`)YLRZ-j8<%0 z>Un^qxjOArY9!_OYYbj58|3~u$xxL(VFD4h{E*4!`i7FrCmE{w6#ZR)42^&~kU}I1 zA@ECIuiuq(s~5L3L9z{tA$#Z5X?Bo`Om-s}bah0pPT0>VlJtjV)$p!#sqOiD05Uz< z2LKS{1OVvKy!0nF>zMjD+u>J~;J~{PA|xzFdoGq_zW7!0{fMof+J5Ck)d(m{QLE?n z_FOoA^*sS$`}1I7sW-2$&PE(Di{b4drMwD7iOLYMBmXPa4L{(BB@Alj8t3)*nnH|4 z#ZigZgJt7b9|hY9YSogl%pc5ZKY1o4Mayo5dX5BIoEwhBPKBasnK<#ZwP4yJVq20* z9>5)|;^)%iu#KtXOtq@+MWzM1qrRRQvc`KVLNj%UHABB*-W>x1(oXb>!gKE4dAJI{ ztJa8LQOV7or!_^^{FKH-RT7SIHIB-ODxb5;238gUcC?BZ`K;d;dnfY$r-Q<^H|ar& z<`=8QaNm%(E@A2G?kr^YRORchIBwg1I6W$K9fv;(^J5qd{Hr9p&2CX;H zqs%j_pjI+O=>{b}NxZwWLYT`+E%IQ4SS6%n$8WPY;7p`|bEdx5@_Z_)P38$>W^7Dd z=Tga5B#s^B*C96QOVABi&lL#i+PA6IdFR1PfW z9e~9~;?N6Hyhm5r!&4#-Bi~r9cDZ?)-0C^>HTU@S-@oc40GObx`2yPo2=D7o2~uU^ zbiqos$i;Xjgo!>G9F^h=9cT21>3Q(ZVJuS*8u&zi6GREN5F&2Wd}AUAeHF){CP%%N zL0F}+WUH6Dq8rlu?l*QG^D|T96H^)XWy78<+#UVd13s&50qkTW#SHE4cYKi|J9eN0 zUuj8&h3RaL*v3x@@EL}*g`;hh*18$02ZJwAXteLPcTM-_x^?n!(*D>|-(8nO*;3n2 z94BuXRhQAw$K}04wG9zBfOr{D^0d0A1ewQpZo>|Tig2Oozb$AWLiX%&K#tkVz5tZ6$VxsG{cde5KAzo2O_R>pkk?q$GLTC zgGIVETC=gzAezJgkF48ZP*T!iwz!HS$bngx6t)i!v*06gA1mZhGPi%K5txjnUL>0; zq_gohaQi)Y*z&5|&}sSe-bEo=vB90xpJqDEJXd-R4TszT!&fv)N?EGtJb_X&Kj>C+ zCa)~3E}qmyIo{>OM6hVdJufs>B(1tYiu(Ijir#M=02nSW6kKn_=8TwMv4R%c$bX{3 zpvan+fSpvXz~;EQE$gFBNscz7U>O&!%d`CaMX`&*crCLr$G|;8XN83_EbB{Bsk3aU zh&AdcvZ9}uv2$4^ulA}Zy@Y9r3oig^DFvHSd-PwaUikrknJ(KgbLsNX>ZR^(q z9a>Kt*V)fgXU{eBrONm1#Udj3%5ed`vik2LxMf0YeH)H1e`Bx5Mm5BTyZdi{`gnq;JNeqPu<9GX0A)&()IF)+*_rzbQ^@ZNC_`pWdH5{3TblzB}<~{2#0|2LSFGz?L;!Ya(!7mo&enaMHaE zs*1jqU5DCQmlo-Nv~T@IaJx*jR42dRNzKxHYsjvJ_+5-BIpjnnz&{@jPMc~uRKG+H zEfp5h?nz8k$Cfs)Yg)e)`MFwI{wII|PH*)$9=#Ml?Yygnc7*Z5n9YHa0;XS`9%fQJJZofCe%3$nD%;l0z(3z4RQ!9`X;*P@5|3P?cvYUBb7ymr z{&JbyVYM1|YB_y-*_^FA)%4@;bD6Z4A1DK0UN1~J?e8?*ji!DSMUweGDIql0jKIWA z^X>9Q>?qel>Q2Xnw7CI*AEQdo_^uUYwb^s=xJiE*y46nE?ydQ8;M$6w9*>M+-EBPx z>^6sOlc5%79>6~*lV5c0&6K{B7rQ5_CcPT&v5fJ;j1q&5`bku6R7#OD8W?yPw9@GM z)C|fK>2k_Z|H^Rcz)W9lqOgB!(;sHRHRp^iUhLX8G!`jfnG7_TOE_9k;^ry@x*ayp5wD`_-j(Yt%I;Pfr@|f5xTUjqvZ$2N`(ra5KCj!93 z@uOO#Jk9uKX@d2DgfZtYQ>+PjF&-;!OG0X@>WTXB_{>4lE>2MuL{B+qsdu{@ zx|m{_t&>&qy$54cIpql!4DBvlv|m=UjI?lLhs{3`c+|XneHV596wbGNgXtMsy2;g8 zO^LvRB4^+7Um{+k2a}J>RHB1aLaIPs_@?08>QC=t5AwjTJY7Kt&PSyn{J)gEsP>h!HhO)IO>J;2-EO%k~?`9*@LKXqa_acfbdO zhp*cF@2pm|^pd$haE9F!zLDm6ytaQ}Xe<9?1i|?!&uuX`2nv)cRRQB?HL`wf94)1A zThsVP7C=kAyT(60`?al(P7%I5Ct2OtRoBuULuM~Zf}F)PeSL0brrb7CaH2#Zsl;CT zawTJik>CMb145v2@_rGx z0MSu?-Fs?m5F%6aeiU7MMf?))NGFNY(`VHEnfs?zcctnJ*K*ji&bjA)(dr}D5{^VB9kes5Xr1BxSt{(p%)*SM?a;5 z0AsKZ3C()O0=UHp@3D|G^dYBW+?&gzDoY)ML}Zk7F+y8fA`Z@=@~PkBYu=B<%kLE5 zW&P-3I($VPx-=9-Ja`qzkv1bn0vDw(`<$??P7YjpbSGR=y=Q4i86q0aR4PJHU+KO+dBsGF;9BWi0j8Zu}WJ~beD|uV8dyu$}90d6Jdgk>) z<05o+U?ysJl7mN4yBPC8MgLz3f{UO@!=>aGbsK~I%ppswtCXD4(gqZUj2`~m@kWD5 z9=TkxbPvldqIrv6>^XFCg{qb(lydgk@%iQdyhx^*1#ex8=zsTBev-W_r`KKMu#t60 z_3|+~fAOt^LRXhXNFqeBs-Zu4K^6!7fECaxr1_-^5} z$P!(FHWh|d5P&j*SRLFMBz#VWu^L|7)hQsOgS*_NCySgkIlN}5en?qK*&nWJ)FXWNf3eMs?Pv5_ARw&7&Xe~phyDqkrMjW6YI4N5mI@rqK#EagD z8rV|G=JxgP)jwhlS4ai&Wo>c6@HOtsJ$92wsMEFK=%vz5J+= z?24{&{H06dCH-QczbsdmGi+zF}A%E=cWS8}YU3)y2f5k@pMFf^=%QJXRI2ZHcDg!I#bgK{RW%osu@8xIcD z<`wN!lW42%*_)bht?3->b6X^1unGtFT_DlYJi!mziFezvT5bsp<+L+>U$C}$oa$Jn z>eY;sp&Q|B;%-D!m#T<+lwpD;-sgNvu&a)t6e%Hu6&$%B(A1rTOWJRGuM+cV7M^*!e;96mU zdlQ4w1_+#@shgil{>a&JuO(U5CMPzO#`Ca@Up4f+N$Y(t{fym1HV+O*kzVb^NJ9k) zbg$3mhiid6_ym+G=#ZMzo;SW#h8y0k>ip8!?6_nYT3L%+`y9Ix(p9IY_p-R|d;hvQ z$fqt}yV-ueLYy3!&n?(wnNN9qCk7HzwPG=6mR<(8lXxzngr8;T@lO3P4q62TVUG&p z$p+wLoP)qcW7Jp$5%RmUvnd@y5$w#S%&ZA>f2XU}^Ew2` zA1Nt=@jKR6s!-T(W`dw1!YxAYZMlDH)NmI|a(@4sLVf(y)2+UgF`x%shpOgP&Zz})SOJQ7#2#Y0{hUbKjGNKDO28ZLH`ww8u zTSc;SwMxcwZnD-tkj$OrLG7&c)Pjf}IQbBR4Bv5mkmE)tqM*?Wjn3D=jufXGvhkA@;!+Dh*tTGskymxgXYzFL*aA8LT>vbhszKK!g=k%@y<#AMQ;;?!96 z+PW=Uey(R2`@Qq$k3J~JAa!DWj1A2MSxRTc)z*0zlG}F2i`Z-Chz-9`nV-7~c%jIy zh5P*wl*TcMGB;EMNlcYT1R$M+MdogIuJs{yshygG%r4Znsc=sp%q#DjkW(Z1lgZ~* z?s;n!`V8X(S8l8B$IPG(Axls31Tz|}|LdjGe!yxCm>v>lpbTd_MZ-XYqXX-uFbV`| z#z`Y#nBdlS9e>YrZW|bEix>}p-)nx6@_WDVlEjE3Q{7L6*7OTQVDPOwEFWHhO*^8^ z|Cu~p2P4%o>m###lyu$Byk1A?g-Ks3uZDvLXRY=W18Ufse@GOv5XUOrk)r2k7Yn7L zLLM`vsjYbMJwiUc`{ih3bJA>aA*tI&ZbZTOZb@_CE&VoARD;ayQS)RIa zttiL3qm&q(Up|_)DQXTH$}$E#f_!6ewuuu}cGvBcK~m4{PcHZeRe5sTF!3)CDR~Z1 zKyg#b0yD!H;n1DK9s;gK!DL~Vmh|M$=A0?rhytftc4lHSP6VgAf+7vVb5TuoV8y=4 zX&$9lpoUl6oFrmDuY-9BXG#UZQuU|IfpuX`;*<;_QS-U@bvCbkh!_UIoSq24v)^-M z&N=l1DEHnN|jzA;lku{M{R7kjoSr+D*pZftDEn(7SE?J#w5-~yQDV(e3>ZuiZ#E=+3n4p|`=$A51wB!Z9W0FA}2-BwyYGm{{fae!Dz#T;*xE?^ORLXmBq_kpvJ>U=H)#=Z%h%$BD@n z&wm|9Y2tX3jGKH`OB4($R7R1IVGY?EZl$S7U)sLe{5~;f{V*jVk*0eBf=2=XirbBx zFsXqVOgyF)MuWk`>X6+SdM7NMOHaL}YRyO7f-dU&7|@;ZyTUAlGW+e0*AJHv24|ec zn0kdTV8I)D4Ri~_A05s&@RsoYL;X@XtzmrW!&KM=qZoMbL_*QSuj!CWcMA)(wuj&F zK`%Ie#H9RwbHqb}=9M$rAhloj!Fm#^El8wZd=epL;zTBHw8MFja0Du69!bPjfJ91p zM@X!3s_7qkH@!YqR~8jX6aDGEs!&n7rm+}%A9I0(AD8hL>dPP7bdv&(BOK83+1CK@ zhyb{sP+uS|kE~RmrHl9X&8nXrUQy^)l7^KhaM`5Qdg0}ZBq<1OrZ{F{;|wCo0Civj zDseT+?QUaWa@vnW6{vB{fkz=HBT* z`h_M5UBn0wed{YgPLO`hE$~AAkaHY80uc^Cw3+du{Rkbuk%D-2-3Ob%H-3oV&_k zYAsDOzq>Di^a%o~*nEF_bIL7;ITKav_ZJDJk7$yH)3O93N)!G8-Hf^uOQS&Tl^4 z&FC?!2B>*E;ze=pSPfKSqrJdI6Qsd2Nq>|MLn*+~gZJO%)d2M32h`U-TEGL~!FbrT zQrJ$)(|I_UJ(!=sgGv4a$lRly>zR^NUhaF6OgPo`;$xxU2pe;i0*fdEu1rO3cc-l= zX>;>OYBQMEjXC=(9bTkq(6Z^|MCkk4+?pe;E#1A7h}5w*?C0R@5OZyP3I8jAA0j}2 zWvh*tzeFyAgUm*Ya%x0#l;~a7>zSsHfrC_qnZt{Bg#{+WjA!j*B*VPz!rTG?4`tnF z3JP7C-e|?;UUmj3pi04`#JA%9E7c7Eutj584Fg6t7S;V_JRpWMlnO&Fz8>AfV5I>D zJgU6jL=lmu{=1Y-k$HF`^~J1ZTjl?xsK*IG4tUX!cR6V#(P$==c&Y|p+mtk9srUDV zELr*j=J+U(K&+N)G}LTmozs25w)s7luXh1sq`E}2jKelH!XNE#vaP9-QInFMH;-e2 z==?NUoy^e3Sdj8VgGKZPNe%4nEhqUe)_p(WDhv_VA>yVRjFGj)XR_9ERqcKv*m3W! z_z-Sybvr~@cT-u>7jDw3`E%rT>4PVss49e!81dbN7?A8&2q#Si%82@uI#x`22Hwxf z>5FJfaO4~c<2^}L%oj`^ASa5!w!k0_nRL&ov3e4~4{0OuxXY=GcNXz8dJwLU$a`a> zBB?;Rewl9+^P7z{QBLTN`rm7eAW^=NsH)@H87>Jy-?ffks}jIEWQw&m`#aNYln5GT z%@rn8hc6CU{iwtcK7eS%fB2M6aCAY1e?-_e7;O{h7gSs#8^PV2pHGCJ6R`SmwhTik-oigvhINq!xgjrLBSJPZBd+#HG_#o;U%A*KBokY!bG1s@)RYUlEb2nbHfZ(Y zr~_D=6&jn-EFld=(H7SUG4+qP*#@~HlG>q@vv;+tt}OFlXJeJ=_#lh#`73Kdu4ATu z*RK`&oEfT_jZ^?Y000;)bi_`5BvBGmQ{-Vnu%KPVP%st$Hs~{~j7NzrUy{v{Q1uCS zV;`*LywiETm|1Fcd6L`GQ_}S61AT?wDlO*5&+L^a>)Ul<+m=-|y4r#MJ9OyY8Ns|L zRcQ?mg2YkMhlzxvAR_%X=lRA+sVH0BhlYwVA1)zccN>DjfSbs06j&#;?7oLjGEx7i zsQMw|a6uHX%7_zKEg7vJ(_M97zW7n0QYA98h0`bA`fcHDTzv3tWzDo8fUV;jRO+q-RQguSwdE0xkjQs>{A1t|JzAINhGrVSA z4mXNRySB~k%_s6VH{7kYx9ndpo%IK{!Jd#Xwvssu8ovpRC#;vko{-=Q}wL3KA0&CP^#A}(gefrbuS%GWHhTBo53o&G4b8O44ItCf$FN+I|o79`S*Yg|2}NW#7Re~ zyKj!?(1#ao0IKE~qTbK9q+aH6dLd7{k#t8xH;zXJ42%etXmo1-9cVU!aqh6Wn8XW-=jU8m#UR+d0m6 z2%f%_Gs6=qc3(ngN8DU~l>WO3n*iVdOt`_oB`xh=QDgFv2DdmDh5*mfKcO)GdkX!i zJP}PPl;&!Aargz;z@@hy95>}Bmjl5uF+x%x&BavkwMfU17Y5ocFh9-bQ>M5hHC{^G zVC?qJ`Q+LdAzW^=e_&tbLD0OLzU%=MG}}rr_9shTSzW28=+`Yecz--6 zw;EVK4V~56+jD(eOJ;3DQP3ih+AO~g#c8uI&OhPny4s5M-6l07iFhckJ6!5&o$iSr zX}r~mR!k&iIU)X@H?tYGIr2lBIiJBhMIJpQqX``u%MOLo{9B9whWoIEq|*vfb1z^3 zK)vSJ0-_(|MMheD@{O(H8zWWpR=3H&;HElXb8G@-)=?)SUu8LwXWpNB z)EY<%P-URppUOBl3ANH_C;~zIJnT_G?ZGbS>bHwFY{K?bDKjK zUi0+`=C38~x7YXIpitTi`?pN*HCzt834~hAfZx)#xOoYTZj|9>D`()KnVxFOn2yKG z-CkvRsQ0EJ6OBdzRxmXrTZ;mlbaj1oZ~nt^>hrIshpndE2$2N==tFF^qpG;0)efZ| z##TN85VnGbraBgx^;U_aY*a;{Sqxka(^FR@x#eJ%n_6z$9z!qR9I4Y{q!!gY+cM(V z!s@KC{-9pdy9B-?5$e^7q|ciLeYX*1t5vpnh={7nu!Tx>VIkwiP^s4m%sEY9(?+!s z!GYPamH{ey@Bq16HjSN0N(>HZd=niUTn`W-DsprjsanJ*jO23w9`%>~$dAiLl+^|_*jee>XDdbg>yG*@K)Og!`1j&#fA?X~I4&`>8~!}!`g z*RwzTWAGQBgLj1^u_V9#={qL?h(ji@1N#1~IW%6)CKgFR9BI@P>PLTtSaF|I3pAvd zT=^)&4te3@eJ(R)5w?fCzr5^3XXuea9Vfp2RqQuU}*A|Q+LW@)OG*d z|D92XIYe{2_4{(hl<{)UsOlznv!&cIc|{H8v|?jx2TTr5pVD&3t@DS2a~l!U z=E|j%Et{FsCQgEgfxoG$WPun|A=rq9@9;nPi__2DiGE{X6HV5tjBJv5uQsbPGo|L1 zVi2u|>&~hw{UFA&L>!7#NwR6<(uQmOF_TwcarbRC)fWnV^Yj(|{}k8%@5}i`Zl?*+ zUjP8EmoH>Bu7SnAh{6(N3Xd(O5jhRPQVpaPghvBdw&d9?Ibzq%635&-Q>nlGkfj4T3A5dtuhuzrT*T0 zL>`;vK0oyNf?i3QyikG#_gf3}n|c5M&L18GKtnB;4H+W>R9QLO62`xu%2i<>B^#vt z7xI1Mho&E-=HLi|_bE83p86d}?|`e)HU*H$46AVG=mnUd#Pu52iU>|hP~#^{iUB|- zQU0QlDi-;{!L$G(Cr&-AejG$~WPTz7i{5~+#*}`;;9y29b`hQVBzd@P^)nhoz3>1O zeG_VH+mYW+))E(~l|dflWNkJeZXzS_vF=w1j*mCg3C%Y8$sz`%7q&)?i$T_GKtqmO zX7}{GCg^Fb1gb{NHLb|k**@{{dC6MOAmvNktq50u*0aC!e)^mF792) zN4fOfs!5&6W;c=$ZFJpKX4|PHjz7ZJF{+E9CTT^Jk}Q9puZhb%CjyMdmNKQp1eD}( zoQ!pO(FEM|MB7{|T@&=17`8Y)FEc7FtB+6WU$=`}a$2C((1+ard#=wT8E=mN?~I{0 zBWO>1aJ6vCU=S(*M@GliQ|>Jj8<}HpA4LEl;_uJ?n^=hMWEO& zJx;pWgyUld%%kyVw`ss*5Z1(e`dK*aP^i z090NCSCZN@DT^-Y#a2{Y$jo{40xwJf`wh2$vQ0?-G^K>oqHg({j)Ln$E(<3DoGq}4 z%Ei~S@HjH}!<$RZzzcu3t4fA(yPQ4iS5~c=xQ$D~Pm)aE?bt1qf3Z2UtW@=3&RECF zldyj7+_Y1P+t;5a*L5;=;QII@SZL0I>llEAOavhOlKME_bVKh$WXmr1Z@wA>AnICa zURwM{6YFd5Im3X%VF>;QD;>R|oVeab?FEiVqQ=jv-lsViWMnhv4jPR{x)0AR=rK?a9Iqz<=}1QA_xiDY^S zM~@H4bmaVbPA2MfVzcym^FQ^j-8g}`y>A?9xO?iOjHVwMf262rHX$^*b5+VI5CsSd zc4}zXqZV`xO8q1TcXGfykF3PRmexXk+LJ`wsdVkrqyXKLaS_AN8&YCFqf>xG9N%87 z_-%yg38^#~Wu-C}?tox`AAE0MyU6BZLCA9W{hs%QkxfMS!;HQXMgllA*lv|P3JS^yvY3-0z!z3@Z$hn zyfL)SbLb#y5$y7SUOYGyGfX>IUy5{2VN?pz=G6=77q( z%Lp9xniG5Nq|@TEGkqh>iS~phs)`QvBE6UK`@jGP01CW}MR%ZA2}BJ-m~UoDh|eb# zbGuT+n(*i9Dgjq^D=Tr{q3h*&>(m}n8GSFX5;^XJ?lj@RoNM8ejZyJ`@vCl_m->Hm)l{OUo@Jf z29u(!be*eDQcUB$Q^ZVD?TY_e(e?H1%F&MYI)^!^!atv5KOX~vJK+SmLZ8_XZsJ~PcK zc~q8{Kq-2Pf9w0KTvXQdOHt_19)cBI9wl{cb5wrNYZ-#dT*%;TF zXn2^Ej4q@cKk4jALd>l}e?Okywtj(^XLdhsi$CEGP0UxT}30 zuRB<3N>9*dVUBA6+oRp$w6b1!i#&Pz$tv8g`p1!~&orptzU?z98CD~Gd^Yc=HpfC2 zV#7nGPtIMo`#YCI&tXm0F9iwdd%4~E;5ReLS5FG)scVii9!)~ z`KP&dOcrQyC3L)T4A;Hot4y#YX5B54$IqRWkSIxQa4*DEjY}Pe<=>=z0}yYs`e&Qq z0ikUF2an(`!r&3`Qn?_L&E!?YE9tFceUIIOSl>wcd-L6gkc0vgdRhZ_WsTM1S0&Ab znR+|OO^{m3?GKpSe zk_0(NuCAV#^@N;+p1#t2lXLF28m0V5#bNg zPwi9dROFW`!&3ZR+h0ErLrE8|oJshge^jKM5g@7?7=Cs+YeC`Na^l>!Nv*GU*H|bg z^0NJfLUga%@73KSv9S)r(YQUHGne4vL~S0h4OoZC?%w|cBRQnmTN#eShax6x=8dJ zwKVp8C9e(xt5?JWMdM8IfY4tb{&Q!&a|FCUHh8>?A&o&EqREnP%V!>idqH)lo$@#0 z0<7y7=xOShm_>a`BIGuAon?>>jdQ7%Ra=ASd9&^;1I##acVgXtr8*55T(N{f&0M-7 z`4x%yut+mvN297@T+lBhCXB$esJU|J1hdhPC5`8M*9s6mF>{c`vSXoNNSKvvN+F6W zd=PiFH_JCf<8b=eDM_jk;z%1`2^FEQ9pGpgjiqKOjH+7R2ozR<86T6$YYKMim4a|p zwV;Co{T@2}pJQ&zu4>wNUAHx?6PMieK27V24w=*AQx^txi^1z=$0UzSr&elR5IrS{ zBtXdbCi>sqR^33K`bRhqgC#5gD9M+t@75aQ8k5|63HZA~@drkHK2t?O^x#lJIiXN4 z!kYdH_J%@asn1%?TdpItN|AsO}v!%&V))IBZPJF{SWCK~X44 zBrSIBk7)E9J6YUVcf60{z{SE&6}v)*Qt!A558y0SaQ#io2;6XSrJhP7A&tcCZt zOPXpBIIU>>e~3EEsJ6N;S_ds!+-V8H-Cc?VcXxMpZ7J?j+@0X=?ogZp#l5&&krya% z!*}l(H@`CS_nft}_F8j3b8{_t{*#;FToLAyKr2;<^DYlY(-b)(yH3Je`8g=sp)DOn z%j+tF^po^YNQ~0Y5t%c>eT-F}tT4`Msf5HQo?;lB?Xq%_@ZV`-C8~t*^)FRDUp>j?vE)=APos;x#Kse??u$9-OWJI`7li*MUkH}=0x~er1k(QpEholr2HDC2&KXmyxj?}~P$}6HviqKA($_-C$2e!pgH;;Vi7FW0X>UQ@L;$JFO zLHH!(83t}|v*=iuEVBu2RfzE{)XdQOy2iBEi~3l7<0P>5^WyaKKp@TR>zNp%b_&Wj ztO)UK1g6}#vkxW3LD)u$`sKn&r7m#!^2`YMEGETs7W1rg6qkMu>g9p0w>p7HB;MKq zFcCVW77VwGLJUyh^)Yi6iPVDI%Nc>5&G6@^m-#YO&UyqQ%E46iXk1u8182TQ&(tXI z7>^9%xDMpSgVe&4iZVphxsY7tuvLu#iydK72FCLOSQn`?)+8G^#v|YJdn_^HM%soQ zemAP(`eqEA`M2((><7wz;n26Vv3%tqM6<9@vK3%YWK-EoRKoK1_y#Z!dxs;MuY1AK z*Y47d)epk=e~DxU>HHFu|b6lVk-tNMQeVdlYgvuzC8DR{r;9B z%#*Z9w(A5x0wv(Ww zUfq1o)Hc>;g7nLO(87zD<38O|z!(a&aD->}tBcJX;-|hAs4l-GM=+A z1oAzU4X4-MNp@px{8XaSu=h;rUbwdOM0L;TgxS(tvnfs-ApuBP>ezAv2M+pZU&E%Z zEP|lUyK~kV#U5sF&g!8!t{X(yCt*Cu4WwrJ!VKj7-h)L{B$r1o&NA6jy@&?evd)}( zPShC9EYR~j!Q^E!M>>^kd6jP>jR`VkJ%AFFS+C5b(MD+LY1ehEVBhR0!b4gyGV2_e z5+@ifyTQ}VJz&U{9@rt8{jwvL1*vev_vE8&Ulk=T{2J2+V9XcaA4JBF&}1R%iwHiW zBx>t)`EO=FgIkE7Mr|jM2)jynqu%6Sny(rr~NW8C^#iJ5a2 zhs7&e^nVlFbnp^LOR92zXd6p*W11d%b#V`9uNWiR{Dm?c7kV|f>BHj=4SA&p+r~d%S>R>Z~CTGLfHOX z`Kg}d!0&+jPU-cgRWQtgIWbK{G{GNqSo1IXH90r>?S?VDcz67n&pS*@%Pm;vJULhM z(ekR_Qgg&*9GgNN*xCF5y+IlvUYEMCgAs=$bwHG*wm+(^#le2sMeerBlrqSt>Gha? zr!o{p&8(v5>e6H&mpM}`-gVu?4UANRo;{k{$E^i`s(YcOvE zu+n00I9wwk38N_-2A4;q8zS z-akJ|M@+(K_T*D7v{yNOHOLAHG$j$$Af|%>&_R|al|TGYAaBSYO&HR|MmU6TGmYmZ zK58?N%#AhsCA!u9R^8j3=UAfjcA55e{tR+BTlF`3a({be9a>rQp}to7ar%6K;7yAx z_D4F{vDGsI8QM{gXPW2kPk)pSRS07?)1lp`w_nU?(4WWvqcd2KO9^nGv&&Q<8&pn3 zG1y8|JEF6x%lv3wkacqbiMHJ=TaaK%Q~`gU(lnzQ%G8yV@^oOI`hE*h~!pYLTY&vVMy=<-BH_ul}#0L!eh{sWZFr?diLmhlo3}NPtC>;TmE6 z_I1E~KP*5h8g|GmL}XFbIbB4hr7we?quI7NQY>qMzaU0gu^GvC(m-4#@#G*RUi3SJ zfC3!pGjOW_Nyj1|=%lODCDdhv=swO%p)HtIU!p~quQ2*Wn#P@Jf=`PNYHRI4VK$34 z*rXXl8D#P?VlwK!qC)(JtK>=!p^(sa4${2`GEE;{x7^FS*J}IlFayWN)A6d3q=1j= zpif$My?_4j{ef=F0pKm!Rf%fORSa0%@1DhxxuvYEN<;~N4VMB$!rE+@PORkUU%vm+ zYmj2m`0{o&k0>V2MC7sMB3gov$*L1Z+#n8@ZVKaSDIyk=3@3YUqu9L=q(|s@_ML1Z zP$mVYjF~Qz69E~o2`)a`>QmWJ85WVY*u>~`Py(~~|=|yXM*-wZiHabZYkB&>>tySL1v1Ku_6ZgNXv$9gM{8s*)_-_4t zak77=GqnUjCxpUN)sMz63lnQ|7`*348LwEF?w@prHdol6KY+ZW?wl@;vD%Z1hfD{# zd+=FaD=S{e%wpOTEUZ^MSpGDP%3~kQ=_7>!*i{7K%SQ81BLVRrhyXv{OZ60hKxesd zDi2-d2d!?CPBToCxmi?Qtm&eby^m^l=^yW%VQFpJa zW*{YGJ0@K=i`3g~ltV}l#SY*1@JIk%H*qjX&STulL)f;xNXp1mZHb19{X^_X9}KA@ z*HsexPHNtWK_^Iu00f*vscDuZ;E5Bam$W26j+GFb2_4(GToB%FR}9~r~2R2fBBPT z05LHDoadUi-m=o3{~&tA_JC@vgDK2`g@)_PW+TC+N^nqfd2x!EGcw0}sY3I9`Ykk1 zcO}FVM{R94 za3#3}b-0h^Dt6!f8;<|vmAg42JaxEno9y#!C%|&=)UGuZSEiU_+rjD_C=n(B;IlAr z$0Z~djR$=Id-h{e(-LJEJ5WWNU>XhMBrEp2A^3NHi}rVp zbQQY7Bs7OI=mAwSAA%$Kx(2_6DZyP&g+49Q*sT0aP4!hl%GX;*+mbh2_6A#uhMRpT zl&(pm0E|k=fseNfn|Oc@0|e=RdIRw=#Vk#WhlL)tr6{901NfX;`vSVfxwfAMu={)n z@fLv9Q7Q$GPQ07VuN)^YHTW_mM9?eG52e@SuR<|L7vkS45P6j&k}cQ1{|YK+AI0HR zKOpO-%9H} zh@C4?cbw{&4M+5Us^;xw_=+QZN>WKTUdKlazvN5>yiv-W6Q{Bw7o2nj%h^OdhP}kT zhhm*jj>OjPURSkoor%M3(Z`4k62DifsRIfYpB{=^H`B8T6?xOfov&q{Ey5DvqTYUyfsS)}FtMb?x53(wNa=il>9vg%U@YLqc4{U%KZE= zB*#4Hy(6@m0u9~4eBO1dlx@DeCNPT>@S zAR#$YFlRfiWm%l`qI4s(gKN{Dn_G`y#_hG4geHR?HmffLIiRR?ZNT#~cJ9y2h(j+y znkchazcKaL!iC_r7N?xPxQ_EEb$ljF4M25Rdn`yv>GCNq*B7$ec}@=MHJOecC_uF} z%f)xIGJK&+xTx>CqRLcZo96pn^+axR z)lAUT3tJ-R-GK`w23C*`q7P}1BaNE}H7_|QU7|cKQ#^Yi%C@W(_R!h552p8~@F3 zY^pdR_PmG}6ls7Cvx}zpGFA2mVSt>L7jdZ(??CVQl&}tj+56Cb&=% zUAY6zI1&v{8-+qiqKTK`tGS{ji<1VveNd-<@EtnGxXIlZ7=$?cJm~ZaI}HNo9SI{ zXPq1KC#o0cvB}Vpd!e?Mjo$MbylP2%>3vsce%3Sl`ERn3cg@U=Zs)M(g4WJ8vEHwi z{j`MqON9AU3!TCSE<%8tb=eURU~c5Gwwn`!4R7B6Sg{ej27Rd z=6S2*Mj;fRBz%!Ya6uOB$ToAQ_+M?Yeoeeid%v2UQvi&#yjtcw8V4hiaehjJ>o_C7 zTD|2#bJ+%R$rQp6kpAgD)NU8E|HxJH7xS@WqJ6)aEu+XLOY=t++ia3#in5>aP3=KB z**bquzVc6ZRV|MUDJ?gX8YWaH z*-?{TKvC)@C1RIFtN{-M(#&n`9Fhs}8n-?9B1CaEvF{0eMhfQQDb;MtvG%zq?lKgi zlX_d~p?fO=d7Fs`O~}qc-cE%sd5x2cr9<`?H$j2w{k5z>r1w&Vnz;s`1_VYfSs~HY zZW9m<)))=+hO$6=6@GGrkH%PfUlpt3X&OH#U^?T zJ`~;S;N|zCk(_1KSD&3_DzeeTFSFXfQjuTPosiT%3%Z)RH|BQAPEWor6&|=2U`iym z-1_Qa7dfpa>DWT@`j)1-FTcQ?(L4Hxb@%pa)S9L6(8JeuPPX-S$7cq6@eKh0KnMV2 zn0Ib)mltB?lK4u*G>DW(wx{dcC96<{O9}2&Z``_ncEKl4W_Un*Y5%!et8fHgsv3@m zpB6b-S&v5B z7Mqx0&`wHOgz$LLr#ptRs6^9b7Z`i9c&tqAE^~v=1evt@e{yA*a%Jnet|wDej`p$_ zC7pI?+FXp0jOH<&H-MF0r@hb{QAfsKA(DRWkJJ(%t4#O2$es`~bqDV= z00#g-+2M4$eEWw2U%dl{6_IMT^7A*T>1Jk+Kfhux#Wsz`jum>p%ulmFH(1>Xygk)k zY@=w9=)_sndyQw3(-9t7(^LqNeE(sq6F_^6g~vU&nLX%;eRSM{$)=KK-iDl*w!g=c zs3R2juR2R#k%5GR9CgTJg6s?x&UA^_a5$?DSX{6DLw6XeEywe0%P^iqi;AqqVvOoIzwkz+xA#)r0wADRyvw3&75+Sh zQ|OgoC%B%)g4U1QpUWw zK!MTxNv0QhE#ZRs5E_*1tlou{rhv_ZzOp$+sGAM$`FQG&dKrQ`oLvh1u*{@8oD8{|~t!DgI3y`(O$O zS5SmiB=%vMj@c}meH`OAAD;d!o^EIwOGL#T^YQh(i^1ZqO~uaLvnqY69-ePw3^if> z!Dsczv?9I(G-<7Wg_}v7rk&Qyed&Y%U4`Bb8+W?6h7y^6EDFBLucX4mp+7zZM#*Er z^FmZAa^S)Sx%|Q$Z#@=nF($v?m57TQlt-o4HY$niS2b)g)9TQ`orpqqq#+w?j@Kke zH~{k!z4$A!Uj%|J5W6^;k%ge*i)zdB5C3W1SG+m_SCGf;SG`s=ajZ;bu>swk`86gcq_FVsN z44X3@Q$te9PqgaH)WfK!XwQsDN*?yu+>;g$KJ-bUV{F=pk3`51S&<`)WGp{rpX{kz zvietX*==Se5Sb9Rt zd~4iPdJg;gmi+kRYZ@$koeqLr_d0l63LzB)D+bfR4g(61(lDy%Y#K=Jk5?8ex@fgj zot67DdiBx5MVfiM6b`LPCpAT`IN<9FXC(6r5Aml&Nwvs{U|r5~WGd`>;xpF{|yvHyN!l@Uj2Jp#{27JhA&hFUp;0v=HTZv z`P`{`#N=Vx{p27iJAlVNYeZDWI!Ny3O#R~=Yax@T7yC2( z54l8F1vEF$yN+Z(`!qF_Ol4!_6!utJ#RDSAKncO16mp9Hf!&}C##p`gz3LN}sB8zq zG4lI{{e4+Ol2C!>iDVuLd;fG%I6xFo1t`x6U0`Zo4xN@)LyGQd*|5^@VI9mB;SCOz z{)2-e9-)$ow!F(gV$08-6gg;5DPG?qB|e6HbPdZ6%Y9Capegl9F~*B}7*vKihV57% z#7i5iZ_u(`5WzHzFHSo<5JF7UE}33YCM}FAT&bSuQRKV$W0rYOea+PX=%P8{9wHwe zMjVK0f^CPRpLk!*4}cAaM|NuU#Qiv_mwZFWC=GZ1g#!53(NYGd^7Ox7rv>8$l&CLx zhy08euR7ni-kz-8s2OaS?$-jq7=&}MkPqcjnWOheT_0%^5%8}e{6EbWwr|t|0*u;> zk9h1|8R$541H60TJ!Yx|A`x+9f5*g8I`MYSDSj;kEjqFRPh^pU5{F=v;F%_w_B|Iq zgZ3=tDRPf4AS zz;sD~`m@19hv1!46D5`UvJ)`mC?T<}S6_0tf-YunwL**t+5p`A+I`A$?6$em^Kd zedMRn6c@7pU@h*Q$(-e?lllT>g+sdp!G8z!x&Nm>NPwj25216F~= z`!+5A1uBc8iQp7RQtTRP4}{B3WQburIl{m>mJGdn^XRGH((;C_-9mJPauLVo zp~h?POYdy==HmWW4@~*g7LeX^Ya$UEu?mTLyoy9H^NksHpkb`ai*q8D+>RrIxyG+= zt18#9RMUMYH!A<7Cz!s8dJ?;Tdv2T{KHpcT>5#PWS*d6cD^+8XY-|tBn4+sDU$}5* zh^v;E(RFM~9g#h>zsE3`7)Rr&csha8x4*Qc0 zR1NNO{1FNnpn;HTm{mDfz@S6`5C|#R0!WcU9fYDd53~agayON#`Ieo1io#*tiap@Q zzA;h;yJKJLPj;QQN>0!=8|TyM5nIg74xH3b{w6m4$O;+im|nDjYpu7zInJr#v%17t zT{9W4F`mNyiBY+{FnY8%uac3XL7JLg@2W9KK)}5*$LN&A{jsYUhe3KO6|sP$#{C8u zC5sK8@fMn z@Eq9NCxoTN#-S5@%rLPl0(1-F!nR7w3Et+_)1i76H06$L30eRg$1DB@f}f5E5QYdA z;u0tfew!H_<<1pcEnXRHVkGR6~CSe908~HHBEM+S(6au$d~(a@DzruUd9dgJMDpdDmaHt;6Uxp zSCjS>UfhWIdYrfLfi+q#FOS2G=gax`9=uhLZZ%s1iEi4zSMelw6nu8dL*d>MW=Paf*W47FU&)?yOsBl%j9pF(QAl^w-)=P!&VxMCU?L!>$yIk=l8 zuf57xwE5J@qOg{$n*jAm{YxNvd`#k2M0{-Ad#P?fvsa)Gh>o*ExRAeE5afaNC;@GI z=8g`K>9Yx97~^BdGDDHio|yJ!^CzO_jy>3m3PZFh@v*eO{av8~+KR}Owm8g!Eet=C zC0lrlvbjS}t~Egc^J>vGCSur(C-cU}mWC7%y-W7S+gaomO=j>~b-zp38 zY?rTR174e8a$G+KIemgZnplB@4_cu=#^9^Lub4sx01b}6YW50s$Qf?i64V5oHexPM z{CwivTEB)gmk`;r@zzb8dir{?x7=B2-MqkH(DCM!_x9qywN-ok$WriHKCQY!6jer! zFThW2dOJ+g(eCQmam^Kt6(vEb6hdzTOq(j&^dQ#`**AuYytPqXthgaxx& z`i#0C4VA2VK6?7EsssRdhz@~%6e;4=tLZf8Igl zz%1sslHyEuMRDIn=Khmy<1+UJVmX>B>7ZJY_fmZg2&uDzz6qpHa#gEpLO~3wHcC43 zP%_L8;)#12Bzw(%vL(|5d!jMCe$GF%)UEW?xXG|czAz<$%zcUPoP#0Vj8o%0`)}(W zq!G*3CM`zN=;9#F$qlV+K%C@ravLlRCVAc#SpfPN<6mUpEj>E2;a!9lIXS+%Jzf}W zPi9m|Fsy{2>R|aZ>l33YX@$za!|qE~LR>VIByQ;ZnC^4+miqJHwgfy3BEndfuywy! z5DYU58yzqZeN&al1HgE(w!PCq1d-b3!*B&};5-Xa1r!_Uq<7ja?j`caZH* zQgvR*nu^nQx$|hEn;-v&5+&Q4t#W%9_mo zaKVh4C7xQjT%upAa*sUm@y=kT8|K*I*HE`*X>l|%^0wClFS@S_2(9r^BSK!|$|+eF zau&8iUV{Ue_>`b2(@kw+Fus3X`(|?afD4MPX6b)@@+l9~=irK>zVUssV#UKs zJ+t$c&Vg8NlBUJks^G6bAKx;4etldM=(Q;R>s}-k06-0ZNp)xqvhVv!Uo*nRSdb#R zS7z2{4jM`koqWBjz%t7$vs#XZ0|YSz1jMnwYhgksF?r zrjwR=khJa=vqyo)bbFBNFf%rbQAMO2cx1nqKNtmHTuc2$-~Nm!oT38Y5s=`R z7B3^U9Ly7*NwJ6bN!zWBXresw66BID=4dr?Qn|S{n_n*4Uxt}gg)6>XPl_%McXank z8997uMM=DTzEH;vxS9^M0CaK;ONwlV$9Y7TjB02k6c2iJQ%|*~seefQmML9Cr48h~ zQ=*kpbnu@-&i-cOovTvb4#yPll)Y0Hp^nyopOB>cm;&x77HcHRj|A$u(mILqKYA|a z>FQ>4-_yz{t~WG_)F0iCiy<9(_k8MVKrJY&%EX%DoYD^yKI7@EOtt8mW2=LS0#JC$ z+)OIdufxg)WL(1@OM%0IIKkUeXua|g>qsu_@~(stsfdbFfGBH@-F~Fb?#X?B z>5+J!KtVzxXnn$lB{!2koZ*dK73y4Rwhg9sMrM8jk(C9F)dnA!?H-{J+n0@w3tD_k zEZB?1&7U#DsHR`j(YfYB^N#sj?EobyL0=EO;ob&*I= zePdc0OwkcfBlPu}$1=;&qXfq@ih1ZoFUZLI*x*fANAZ;7{;g9@-ghdO9simx+>%i(FOO1T+Z6 zbsJ-3GzKh{&%55BahyX$a9N7g6jD0*Gwl7)egeQJYyMC9DH^C-YjO;S{Rf)D1M#5a zZnBB_iyTAZ2lFAb65m4k-awl#l%zd-2XM&~M$LeD1Z* zvGdn;M+>jijFq|42fwf6q_Q{4$@Mi~YQopNu66Ym>J^t1UzRZK)|w84d+fcQ90Gta z3Z+vcrak651pzf3!PAUoR1ud{TO|v3wGWz8=c6M_tt=iZ zV+p0c{BLhhc5i-K58X*GR1RE2o4<36x2IPo&1W&`DM6Tvd zk!v})WYc3i<&Uv2nTtdq&^+A;KaQe-+IES_Exq0g-9GgZOPqGM%9!1TD=FEQ4Se>25o7)a1f+gvK zUKlWTV7nW4xkNcug{_;>GEr#Wy<;t=#QBp(TDcx1}_IbW=<+^QVBsc2sXk5CCj@Kn+dv{{&^|8$q$z`B1n$ zs_67_eJ)oD_UssSIJoiKhk1Mb18%E(>4U_H@MZ|1o1-tc71|YLq2vVynRNSf-eSW^ zR?%aj>Lxt03xP0Ky~5@0i{WouB{J_U-YPw(lgCXbr|RF{Ps8QM?XP}b57krI&pY=1 z*-s*m-CMS4&!zWE&&9_bN?#Av19xWtA}tfOqq0Ru-Zc2;!AuzHF4DULc&x0A=B-6& z(cK#EH)Kxtn%S{T0>fEm6;a=Rth_1BKfwcFfq2p|Qm%_H%&CK6>Rj=KMB=={yvsOr zdN8tqiE)Iq{RF?ztZ{P1aSL(u=_- zx#<9SR<?jPB=WpLE=K&hJZi# zrV<|mW@xC4DL->TUK-gL3__mW7r^=Mh32gPrr698BLj5Y_%gLlkh2YHBv3g8uw|rRW+`6=yYZ&2W0LB#QWLxd7#DdI~tV zk`jpi`eVKHUllKfhjJ>=!mNas1u-$9Jk2_cGrPTXm^>G2V>E`wwMzfi4oqUCiaHFO z&D)!M8#I!I3W+ufC0{|VgohyM07{9UF<%Nm23V?GH~|5EkW9ZR`FJYiMy{!;&4YZ>|~Q! zEph=cFJby6(i(_LQ*m@71Z+v847T_J}5>$Jadv? z(Wd29>ulvzAHh=uUf2J1eVia|*I!^nIhU_GIERx57hd6IHuQk2)N}`QK&`=luzEp} z5)41HG&gDd(Ky;&e`@%=J^p>W@Oq<%0)jtbI!XeJRT}IZYGm9M)EXaBI-37;Nte^; zz@6K{6b&H%X<_mK1ptQ=7hJMCleSQ$Q&Q4$F=lU3{oTk2Ma7t{RBW1Z5d~YhoF*BL zHgbmrk!2oJ?Vc*mdZ%WsQSNgK>p#Gz*Q>B!_#-iNM~+}jM=K_ZwbqS!*Suo$^c9R&#};SXX9Owg>r97 zrao*+FbpSb{xAwa7A}0j_+x$mb{&f)&;&iL*i%&+90)7YcU{&Y5|0-+^H_sS^qHQN zO2M{2Z6@9baZW`eB5mbk1^;k@MnJ=&Y~S9s*20$PFk`8jr1L81i4K1X3(u5JP{$Uv zX5B4nu(4XWNp)Y55Ay)?@6h1-$N-#iZD)dKxCUKGLv0yi%7p*n)|e&k)tf;J8RZYw z1K%3cn%M9~CY@XnmSAUyxzgRZPK-sp_TGR@7{E`PpPrh6(`jpD$MCuDO!PlHr@w|K zzvc@O+YyGzG*(|1m;B%I-v0k5{1E#6@zwwT{nCA(WHj09?;j9=0+6GVt7{zyI}>;^%8f^Tu|QQ$zN4&kCD}32a6Tqnm#m{ zSO1K8293r}rg~@xp)}Y&w?58A+`OSWH|}J2vK#yM&$VQt-R}Bls$N{B>dMw%#!5A_ zr;C%nj8(hiZ7YqFy}lFl^DEyCmbhO2^}b!djkkQMYPdKy$0(__9C^N3yTEG zdVLM4;xF0+xqAAEwDuPhR~ud6P=bAHLXM&!2>UIn&4VAmHRhEw>7i{k=h4Lbauwze zd+G0&zK}uHoNu8L=C+~?de&j*ix=U2B!MEPNTGdVp}5Kc(lYts(SCIj$u7yVnaR$w zABTv48tdsK6gy(_G$HF`ClEFn$$-dYQVcWbnSbGxX?jl$r=tP(HN#tw)&@U#!KZvm zI7FCfXV5K~Zpgu$kCLGRUXGhLDN3Dqu(}5sybwIjRTe2t0dHjYiou5;FU3q zVPr@*uUI44-9I#vBOCO8&5<(!r0dv;T^h96#+BdJ5!cms<9qrC8yG#;>58K8xugM=ZC z&GH1Ls+^J5mwb~|1lDDsPtPu_mPfY)mn3Y1?5~W+6~}?!av20>!_qpP#v5po$LEC! zKjcz0-4^h(U}|a|>dX>&T4fDF3hzsN{$}XvtTEl3Wf4rYPTWu`9CjJE;z{%eT>(T8 z_p$~eW8fXJd2PLMZL?*M;xx##t%YgaRH#+=o(ZF0KI=IMExxR1wN&SC#ahtM}FAXQ6}BP1A3LERCoT z+4$#%_swNb#8rG?)E(*Jhgn)M8L2pCG3^o zfK_aVsGVr%jAr&|c}uI~YrY;*|C1610DyNFY1!}(k**)Z{ihWn zS2i#&(Kkf&F;e*k&F9WTCiNKbQP(xOY9O;iqh|n_M3Q_ZDP!)&oFA-*j81-y(J;il2oxBY=#0u|Q`-x2 zy)uT4$P1nhBa(!#ob^Yx87v6DROlX(hLmQ707YT zVFh>-SlNVR;M~-gFEm%QjQkDBz>IX*V9+P_ZS|aC?VnovRIAm4-}fJH3bvGO>2!F^ z_ZQ23Q!v}MkOKdpS`DlAM$1*fc0|gauE;-+mrd(OZ+( zXjElek$d;G)BeqJjm=`MdBauYJ3OxW;uaz?qo+*Ri7Sc-TVV@e7y`k(CV!gf(spf4 zQm95~F6^sMV-+NeXEe^hwC7G{HEzcYLmQf3kCsaQPKDTF3sL^96^Tu1Lo4f{9CIwD zRY21`)BY{mzCeO=TozrFKQj+ElqecSPEFPalctuOp{)xCPGnaY`0{DrVjOpnQ$H|8 zUPm=`ES}#SLO6xgE$xY+41ftK2-0%w4UESmP)~#pMLQrGMw#qfUR@JikpsF-8m6M- z^VvF-K4CevYSz|df3NiSUwFEGZOJeOkxGX+u5MBQn?^=K2)Gb$-2M-YjOG$-242%Q z8ic0e(Rkp3=Vr^L_Xo5C#nEfMi(!1ZMd>?`SrBm8a?Q6*^m z_>7A#&9d@hf!J(&hYpqIR{AddAW0$u0kS%AVsvs-X+-2ju<}03!36!zn332}PR4H) zb9rDho_(;QLRdqZ4EFs91?!(sz8bhFGETO_KLx0I`SkLV5uSS%MBuugxbr#pC3>+$ zvs>YjjG>LG&=xXFgU|f+?X4BnFy%8-qKV_^RCO6e0m zeHg{jFTYUhHJJXx$ei62#9YA!8wQ-7bq`)g180#NsPm^VRxkzH`9*2x3 zJnZu+Rehf3hAIj=NxmPnI_U2=XOE{=8+t27W805+u-2?A{#98oCzf(}ZuGD{D2`VQ zSy{21_Hb}*7A~)~BslhgfUu5y-=$%wEU16z;RW?ACdrOhvWs)KHB*jaAm@>|s7Mts ziei~gTSk*eWc)8L;CBE5I`mRZ_h}ir6}n{G*TUWihfXbKj;X@vjvmspw~9Ir1&n65 ztg1Do42Lqx8Sw~#v8gk>D_V#g0|!CFhG4l^@hlcbp>=t~sD-BVE^13pEFVf4wtc7eVB}f`{LcuE zN6!sZk-OWO4~@~fd=0L8vGEJazDAfowzMZ5u9JP#q$x17idn>~4>=yK1$c68zCIo6 z9pWi?7UiZKTr8}da&%>;(GcC2PovjT007vLt@rBKhjl3oJ6-Xgss4ph6b-^eAzj6J zd~MCMpc)XUO=uU*jA`G}mC|;+{F^hd^ql2-_xwW4yAzl~>P9GP0ggmTrPcOD)C5*~ zv_`?>3^GDxPXM3MD-_m2?6L?n72*s~Uw*=~Q$E)M`btb+UHWKw=!1_In7`K|$j`5M zw~pjCk}H-H|~XQYPgQ0uK|zEeQWy=J=!eJL=5Q$%qW-_01Gf^Q1}zD z_9tn5nZn$z=067(HvZr(d0s;k-M1w)W{z`cS{#QeO-G*9?Pw*`)|#4<6h3>K+#G-q z7#FVChg7dT*{*(&9?PPwr|Dsq5A?*Enw~_a-_=qpC72JX*IkIps!eG4Fu$`O9@j9z zW8YPNsL_{7m}#K3?r>yxS;KNnMF7EU(56h`BCVYP_PwMqn%!5Y65nOaYW%P|L>bNS z`Mvx@+A>Na@i$F176xw#D{DB1c^?!=mY?%_{`7~_JnBrWLJ%9H$+h~(g>P`sK!fBZ zPZ`&+FD3l4yD;V@uerGCIKoIpD33WL8fa32 zUH4OANw4z@*<|qka?wgBn~JBD|5C393g3EhABIymg>rR^O02ey-kQmv;EJ2+bd`{! z-gyNP4iN&#_2_r%QX4ZSA@bTm&xce_aum$6k8Oesm}AxQDhwtkATr6)4^dwDYce|2 z;U8s0;*-!**%g<1@Ax9XDya7OH5bj#hKf?G6%R;dzRK`rE0Nd-PZyK0lbHGegTW{f zBKzLh2j87JnY18#gbPjrl~c?98Dcr28+Et4aJ)dK3tYw^wusN*f#Y)LT zgt}?F=5c+Cn7ZY@_yzX8SEjJE98Q}0hbx8@*+WmRl6tJ#6?pgN9PMI0;*#cY>d$(Y0OE#;7j(Hf)Mn_%8Dv2#qLpwu{!!M{|9zmJfQVw)_z9K5LHIzS5*9pyYYf|Ahq=LVP^)L}63QF`tly2! z$JgBqnpqW~Ic!J}o0S4VN;*JmT!9jN~! z1;Ea&Y&Gut1g3le{+Zp(IO#dsV0g&n8LA9FEu`i*V1UOD51>wwjP=Jn_Q)Ke;X?31XiIyLh1L+EZEPe|YL?Iif(x{%bsXbHc-2GN1`2%!1*h=pG7 z*7FQC7HD^WF)LzszScXV?|8~E&2o3V|8Zr$Tm4HWXW1dII1ZG(apLB zRo~s$n{pX`2i^1ES-J>8gxLJEMNO(m<^`LdGUJiJmf#u}8A;!r^M+$a47fggvVblY zKuBYs$ip~=qyLB&XNwhI}@&FVwBZjMZV7@G1Si4vj2X$7ME#jjuaU0w-2Zm{c{jRZJ~mHcpP^usGYmpHjpjws&UMJ!c zm^0CJOmFM+!jnM?EK3wB)X`A>OZlsbV@gUMUfTw&{oi65*n zm_WT2ySy|W8mB7tFSHwAfe@waTwzsvfhzk|YkQeBd7?rgCua0HIV;3E5ZN&01m|o) zQiVKaa9^O&c!B@*85%8tNk+wyG4uKwQAe&1!Sd_%ffJvb zyk3GX8uW3-K!-9{e*7o@zyXdDs^${7`*dM`$r;w)Cjnn0DVA5>8C}Zl z@Fx>ovJuxP9TA_K#`fr9!AvIG*}vkMLqHS|k#qmU7@!)U@?YpXbSFI6OYf77=s1gV zB+<@-I@YHC9Mz(Gps3Y{8{_ktCa`>)6VLN>K-J|@$612vLocAksz@Pkt6P}(+(Jqg zzG?-45Zw)cg=liVQ|IE8I|B41)sm!lt%2O^2Zxr?2|yS|Lr>Ey=4clZxTRVNeqPNo zD5W?Y{Q?K45d@SJOvwha$>yX8$kIhvOgXHKBoby{@b`x-kcf#PKrWqBVuNLKOnHZT z?I7EvK6M!$OY>U_j8%&mA4LScU$!XKeTF)!XFlkDh006`~#ePgfq;QeJ z$uu*#Jv40m{_bn12`ftJgpuUAcy%D-SC#9vO`m(HYo#r;3x3h~^8=^%L@xm?d)`BY zTirV(ViJAIf33O;K`ewN@4?6sl9WvKoM#Alp|EvG8uzO67$y-Xpw>Yc2^?b&G6@C& z$3o(+QA3S)^Y|fO4q4ylGK{)Jh?NQ=WQt6U<(r@mffm;=C9CG=8OLzPEuC(^(#g-N z#5E;e9L5!6qz)0B5_CPeNsi(|<SVYJ3(_;o9+Cyl+u)~x~hYv zGVZcer*LHLr8OigiEPL6*9)oO>dU}(Rd)fKIKp%_T&2>X35!C{W#?4IWoULQCC*r- z|1c)IG;xC2fttJZ#9D>FTI=^HC7Zk?6AVGLGr9;E;0H{vo^ko$j`3gYoWAjqV48NK z@)Uy;SS40ZOS>zL=g4CQODj4!j(`+2{o%YKaS~e!6<0}vaZTX-V5uq58%bX8?-eFt z^~o#Sc|w=@$S=WI4^~Zmxt-&hAJ0E+bG!4ZYF>}l#=}0)s6o@540Uh&_8>1 za`AhUP9Yt2cnO*GyfD3Z>a{J)=n)uCK6`7O1Zu5xnexM8_n$Mt3F>kgE^8)?I7qX0 zI5Fhh4)JfXMbng&%;?*7iF{bbt^Wm{LLLJE`mACBZeTL-Oqf(e(IVFol9VDHl_4%T zqZp5#C}{TnU#r5l?FP+Zyi1;G2`bV;qyuz3iBdzQay+x6$n(1bnuNSd3=;ah8bkt> zozrcHHEH^e8$|c8+dQ87=fx2r*Jy4%4uc4qnN7F-j539$r=LBc+~}*Y>tW;ue#(wT zl)b||Kh;JmkIhfC9Ntq&Bfb-WhyOqhqMvBW$dkVIO((lw+?!ZOJmnR2v1;wJ5G*uh zDZ6;@-e5(#giHAI9fC|Ify&8%4)o6vm69?piO+?vldYN6>3cNDBJ*%U5`2{!al~(G zEe;TFK`p)ta`P7rV*4`QUWiJ=M~)?n&b!$J`P5?V7^PBnaYlz9!W!7$p4%daaJW83SNMMm-zHyTbn zAZ`U|YW!e^7<#lP|Kw(iJmubfl>jB0T$Cm}=p3dKbeiVw+KhC3CiJpQT{&-wb{T z<+?)1E1-Ugnq`nlMutYOE3{C}!#+y_8JUcg>p#4hP_D5^v<~_?GO*hHK!AMp=4Dc$ zgT9I}SoX*nbKY?y@3>v(qw5xlzJ6t$=v061wO7xXsqd)KBNMygbKnTL2u(K!B$ieS~gbaeKRCao##0G8J2e4W16 z@dx{f)wcoY)+r>$(jLElJ%p+xG~Spm-ol3J4RzRuKD&B?K{FIU1bPaO zS$%}x?>$bYq58%S(ODZ5)EpbsVLLmy6%75s868*UHVkyEYy_crB2V#pr;txXQ*64) zDb;RNfCV$UbkB<(adS%4=Hl@3=t`ziIsx%aZkItdy>rs9IpEet&FF)1O;E?AE3~!hqd?(2APaX zS^YIrPZ4>fm~HE@`nBER2v+1GMy^Nn6tKi#mNHKmO}WD46PsZ6PJy5kj=BDw2eUMV zCGMGZRZbfgEb@LfP(o5obpZlse0&D0_-|V5NqOq7LWu0`FHP^do4gYy=3k0TEg<_C z02zow-g@iBC~}x)(7l(0&c;W6DY243uDygwdXNYu^AieF8gKCFBeVv3vfID99x`AH zl^l3>kYq{+H+Xj-B6?4L)Ye&)Ca@v-_h!2ln*<`-P(`Z-Maer-L#`29`vdTdXnCLIDN1q7hS zF+z#y?!=Kd?I`8=z129V-{lTQYt5qPJ~3V~u{CJ&pYN4_wCeq$U-? z0EL>KtrBF4LrYG4&n6-S+U*d3JX12n10pDzjoMY%cp895?}23da4Hf?oI~7%Xy2E4 z70Y3^^AxMoe|c*#uLXsIAUtUw4D*dE?QK|Bj>9O*c6J{T%hIiOKL@Tk&!n@VtqKZK zuX!?15#?Ytj8p9AncwP3qPab$w+bQ%E1r?6pWsA5K3LAMTv(5tYoX(Ix%#;m_}p2s zh_e-V!g)X9N)TjHOO4o`M?~+e>8kGbzrgH74ii@nW5B;)9Pr`rCEv?y$VI%LBW0Tu3p+Vxh zK?@P&*Zw9`ctJ?)LOOZ-2y>0kkXcsqnF6>)((O(Y4T175BWlD~uh7c-XOikXMy`f| z;L(`XRc3a#m8p3~^trCFJ)`TbDyxuTX3Y_|G&o~2D4>gJ-q02gfMU;B=|^I9;O;Px z37OoBH(t8&iVGdA#ge#wy-|#Pvi-hO+5-dxe zvj`JoK4wgL=s$-z@ISa}Uo>vzJ9q|<fs8>^~$~#*k% zc(qnuzt<%iQ*kv|1~+fyXlg`%RTQM)h4^ zM@-Tq+*w0;cGo!w+A;I5J`YGFi1( z`Fi3etMr=q2#spPxaQn9JZwELQKb#waYgHEM96$`2TWzam!p9Z zzbzO3Rl*hovDotedjTK`ra7ducep#2FoWE(J#v)8oo@_}Q|YWid^WB z3WeW?@9eQlvq!(~bG0`gWlCoS7PIgwK;tgEtpuCklTm zThOBn&aJM9#VoSz& z6yo2C=e^0MS5XKu+fgmte-qfRf@cr6nXP`7clK!4%mk#ej*}pEh<23iSK8rL5D!VA z>YFhP<7-;=uv4#1>w5g%egAwEM%}`C956!vU5Uj?a-r+oSOU*07QvC&9;Hg0`o?m0 z89PK;OPVhDLi@^j1^*@8K@Z%50=8Bw)z%*zF4`DhSM8ZH_@36rF_ssk{@7~B%=c>H zD10=q)4LXZ4R!k7|K(GUXNN|pO&h`P4cFbD^^W8~y?mYAIDQCfF6#pb@E&w6rE(v% zfH>Mo9Wk>cI-h#FoWO~!*e%Zq2n7pZ7AQ^yBbhy zCI+JO+SP`VH}bZG_Ag~KKnunpVh1oM!qfhGn4|0hKCm2PSpX?Zg5xMd$%Rp$k_*Yk z&g$Qx4O`~QSAo4%$)Bb74F-^4W4lZk@3L&U7zydz&bHCWNH>u(!s2rWF)ONJ%JPPk zReJ#IS_=xt-3_iq%}R2DhFoN3yVBEt#c|)jnCe56Bj0ey!L;R^2((} zBFT5lgqB)5{^Ed2TTeK_A`K82PALx%(z8^LOyU*{k*YIN#FI>ttXR}&i&>7p^2Bz6 z7ppdQPrnOl6j-Pk|J;5VY#HM#Mrf;HG{>p8JlwtrNlPexxeEd=`e}#hViADGJmnEm z;?%<8G%gzy)%8E>bcEu=39+d)9`RM-fh;QY5?674X-Xu@3TNE-lXptel2$jWQsRd( zNmLv$psmFaW%6YxPJe*so(qa(P2$7yM^-6vkJHaepEoe zLuoNxtQ+7F>$w(=^sEc$jcUV1DbywpI!oS1O|F=_c1Ul1y81H@ZT|hz>Z2B>&Woac z+1~d9!Qw+z~KB|J^=t1@Yda{QD{aMC5 z*|j5cDbDSvj3V}7bv&d8+ub#bU1Fn^w8vil;;#xxH(CN<3;;;ols)>Ys=>(_SJ$kr zoyjpS^`7S*^xuJ2SU_p&f7jA+xxG-+%KyxBRoo3sao}S#g?>bc7-PH$&&q#VhNe1@ zF@q$>a}84gITnD5hb@<0_yx+d&@h6u7!OPlB&#KdS_U@&S&z0o~tYasm<^nEPs&WGotyL4d47-{Dz( z)>av0NKm30A)`3%XL}};l>J_1WdDOPR_Q{-b(PO+U0FL)-LB9t7We+L8~@?86`(aC zf28efqH3izpvm~W=RBMYfTGGfMxdEtpkjjrc(a4xsc97^sE}-M^I2E(#J>|H6oyVb zSDus~rnOX7R^JxZ;&%ma)&;*15wHkik@!=SciqotGeI?XDmSNZM0jn?jFrF8ZGjIP zwgTcE%H$63Khy?oL$RE9T4-LJ1qa7eu6_x6Q{#{2UEm@d7bNLn2F#w?2BYz?Ck7O@U2qq9@JaZNnrV>Aq^B#H0%ALrQxDE^qw2f$uzZ3rS={2U~^~&K9RSVG|EPdc${+w*K^QU<~cp>z6j0D{_P#JgY!ZGfM8j<8F{J?rS~FkX?9a3XPHyT zcw_2qLA^JEyB`r)%Cn$y48h2R^;Mg@*BX!WJ3TGW-2@xspXSx_k})VWbg?6%VosTG zacHXhdU9zC@6kPI>|N0?5u*{yNk=&Nm>^j;LpgnNzx;nW;T!?2`~sWyEuN>C#N91O zsV6_Sm-#TY-=NAr=BOFFVA|b$6%MoeRgcDJ5VI@NMl}&P`alEqt>D`?TGuGLns*(wH0=Y1{N+?QlCjCO;D7PqyY^+Ln<;?uiChB2Vfu))9EwfH(Ny$kE zATS63Tq(V7vzujyw0ERu|W18WVSxR71B1UTbT{ z9UIO!K&UEcNPc}Wz?>yeM0xuzN4jXZkMwU`yc{ziQmkB#1iG$ur_-;t&x-5KgD`;+ z7B>MvJhxoEVBvn2fzJyTv5&;-%Ga-JbU#BxKIi#OlHt|Qj1mNC>=I}_#>FL`{}a*J z-S_bsPjTIS>foe+?-=^0++lSs)c!e=OsFre?dyc(`-pmdwHPn_Kf^51p)gKU1w9JE za8?w_u?@FGtmS0jJ;`YJq+M3`mmexK4@(9%!GH7i|0|w_N=9vNaCie35>n*83X3y) zru=0=-t>+J$1H2t<-X@T#R$N9pGcZd)bFEN>WF+5IFPls$EbRd(Zp4u7E-2BGf-Ii zn4&FR;=NUQ%2}=Sj)7t53qk%f{0sosLYkfK$8p_+3t~utjjbIBw>bb$ZW!;o5=N}66fKtDNMJ$yR$EHR_)I3X7jM|(k8R^Gt!P)O%HGu%>+;^l@n0<4Jq5@sQ=OsbB zWFct1AvzgZ{S;rMYv#7OPMUeYkdYKNFJ?z?Nev{t?x##JvvK82L|VJ_yZmIQlsP~) zGh_G_GG9nAL+QS+CuH3WSdQ6T#V#7NtLMk;Ei+BLOwz>Zn!OZp@}72ise(Qbt``kS z{cF|5FvKR91p*e`BL>&q_fPl3f$=V3F|#+(=T$?r8Ol*=9U&Jrq_0}EHe12?T4KfF zSn>kXvFu%+NJ0aahe!>m6Non?4?V+rO52KO*}9ENc1b?yRn%V}e(w{)P|035o;wS6 zaw_r71a-I#8a1s~xk)1dK(md-lV8V6$TcG|Sf${iEES3vfVq@nsMfhQ99n{xa20Cz zvKH9!t8@4bvk83(@mP&FqNl=m#y>4#o@rtLsx-mdr3}ig;D$by{5nl}W}(P?`-lY= z6OK7^$apv}ra`~znWEjBcaIQ7t(GhFj`8F5fHv$x(EwFig*JccTMF+b&K*N?O|Icc z$4LmoYjF&SC1$aW4FeoUp!5UXb0E{>1vv^$*jsA@aEk8EUn*~U<}94X%;i@eV@@iY zK43C1>pQJ6kk`2Xy3d?tx6IBP-TWIoq37|~N3S1${pC;h^-1f2$yFPpp((yf2Z3=o zZ*^jJLD?t26wowAC+Ww6b!U?8I+Mg<4AhmFt~_TRkBK?yxpbqSyeb-)ahNeVAe68i zP^{*jcmYa7vM#rh^ajsYc)!SuP)Y~JRfcjo`azG6FP~~Rvt3arhN7)?Kad8nTz`v0 z9z%yWr;mhQEVoT;ISQJ%P<(eiW0sIRw9A2Q-)aGAX-rgpqif}8jE&%|aw+~ttOfW# z5W9&LSE?wo zFU2e_ayXVFXXG8O26uR{kGjnm^7m}bs~Gx1P6Onx(bGKy<6;!xX~$c-w%l3VD_N|^ z4>es|1gUw~-r8FP^mMkj#NVJn6T6FfrXPoLH(Bb5{r{75D za}kfZJQs8A{W!d{^+?Z~DBKhB zuT|$Dh+%3l4=~TPR9FC%8;KvU4Yq;XxNII$aqbOC`c*6WMhp^f_-zEC8OOni>F@XX zP2oR98A~_VMB)iIVm)7gr+TI>_WW6mP#uY^Re!K2^t#IhAR-Ay)NVGp%&jILgS27O z!MmkJ0?nh~iT#?dhbm7(K}vOVhKkJ zm4)p+fmWVG^Ll|CB;-wFd`a$3d-_rSolX0z$r6GF0RRA+ny)Oz zNA}X$45&`CgbEi^A$u`#46NOfNwG1nnJ4vNZI9XLzA{pYOe@;V_4@}^d3~}iVeZ;; zv~tjBrWyv>DwWq0^J+G5Ej;2 zWLZLE(i~o$&TNV%?@jHCHJSl-eP_*@M(jl8TeDcLG`qjyxLLqGU!%p}T&Zf|xgY8> z4>S@-@-jJ-a4P{lUjHedqFKoB==TeosOIw9+i7vGPstNauEX5KmTdC1L z&sQ93Qj;K7929hfP!&W>2qXNYRxW3o(v(AA^ZE%%*v<#__vS%zj_@y$683T~sioKO^&JZ)3=4_VYF*zwgCrxhEkLNk9GUfe(2RvWD-A{dEi$Z&00 z^W;9g_hhN&uGD~!N2m7t55MU0kGJ;1?Yk=#52|tg?sU7;3NMKNSvi7^v{>towL1Ys zcbE!Io!i}CT|FP6(9z?%eb?a^W*zk(<%83i27{4)E5lg_PmsgAx5?885N9qTJ=*v+ zKmX#SdKPE~`XtW(^y$k5)aTh02aWVOk_sEuMGJ(b>~ho0k=!_r>yo2^IZXnYCI{_P zznC{@{qN-UOMQ?3p)$dDT3m$(H}G z5@5W5EInOEnAzB9rn}ILY5=z$rdn{!n{#E<_TD5FkkrB;4K0}xbq&Rzyc$XaO|nKA zTOX;1W4W31x*cic^)nk2#hZ^BzA-vNpJ;*S8OT@bKBrcaY@w4ZT-0f0jXX+{$O0>d z@P^zcAMxUazRkGjJJmeLbIcUEg`O6}`2f>+E=#p&@aL?f9H_iV^N^a5rxllHzuvN-l6U5y4(2mTc4_;~Xa$+<@fhs4 za7XLoZ{;0{zfaa;Wff#_B0SO;CEtq`0})Y~00@#UQ^89VR)8F)=wW0o`IJG5v0Fl2 z&2JwHxr2&8bE){6Pv8CwkiTh%Anb`uHVR0Ij}BaX%6`ml>wPc|e)`+r>*5qfjCCDv zf3B@Yic|W|>hvkx+28TYp)M45wCm}qxPmW>KF_$A8QBw+xmM*SJ z>BJ)yT9bgf>~4ijF2F_AL&j8)9BU|pPU1jG;oF<&^24o)42U79l4rYMxS0mwwXQna zx_Il7mFr5A>?{Q3I%Qw1$DJw!Sk2=-$aNP(6%5MPhLRsT_xkdn&{|c^jsUSO9om1D z09*B4Hd)hzji1yUyBp-F=5UL%|Jly%wqq~uY>N`$tL@58)~*T%^%96tka*rTf@tzS zB-DZ6CEMtJa}l!Av~>$Od!*2b5{%0?AWAHLT{5R}e3uFRsNGP#9>|qBmi! z;12g4Z>ohcUt>(y-;(O&zRXe%_zoVl)&3M>kS&|DAx=s3`9{vl#dJ2#_5?}H#M}4O zi?pQ8QBXIaK2vO9qg-!}^fu9MtX^+LWOP80%wwbiklt7u{1K|HotD6wlGVSn(z%|2 zkP2SKz@^f|jy(au=hHcmzXMSrCKl^O&I)Vfnvs&ESlZM|;}}R-(?&elYpRV)VViTp+Z@ES5S2;G7HTTEsv?`W1oB5 z^RlxfgQr~v?BZ5fNk%qq1Z;wfCr=A1#l}Y~kaVkBEmqW_K?exh$Gml_8op@2B9vhe zJ(y5t{7)WnkVmYU6Afd>HP1J!r*S{yM7{`uO*as!Y85}@;6@&wPG7a?wPNUyd$;~1 z)wle6uwdYxt^7&oLIvS`4wqFGpPy&!0sk3DM(>pb1g5y@@euIt5N(3INbBtbYYIaTt3~Av5YZ zux80+C`oM7MX&tkCNesgAETLvARyv(jV6$PBd++?q=lg34!DpOzR(VehORp=3_hMO z-BYHOF5u(lZ*>j>;|BE!!ICM9`|23haFLa0?};ESXK`Wmgi3QR4O6sPw#@Y$sG{gp z_<;L-PwOGtZGU(IIoh2PaK04bF@d3mK)+3vx%B55mwKB(WVy_|?-5aCC_oL;Fez+l zI}em!GjIn0uOGuBLg-C-u+&{}=Bp;2H_)>1?zv8POa#_Y0yO0$p)6YfbVOJ)oX z1S_aGj34UyXNO#GDavhJ--8S;BI#?3(Lmxr@}clIU|mno#aqsQJ}yNH?eBsAS{0Tc zHw0VZfsOLzi-qRd-_heK|C5?Mi}}(nc>c>P_>+L5;undCOKpZPL#Ni6k?Q@tvraF& z{B|sV<)~i|BJNhoC|tW*9JGqcd2PV8UR2H_R2Rd5q<=S3B*QfN z!q)dO9bBO=&1)&V+$`}+i5r#BBaLyXh0!2{yZd##oX-DFZ%db9@L-4OJA-y%) zSjkjslW|`!LuxWj#oNBTeq4rL>t3QX&M!k>FQgMbJ7v{xIn86l0-`r%mdUA#nV2kd z&`|J61HPg` zJt^AlaoLxbFdSvFHR(NAXEqp0KZ_S1>yzhS`ghhGX+OMa7?q;sXE9;Z>D-T~qg$dr z5JbFMZ(nW^R6{-6P+lPbI0*m%as2qT?pjopMnPa6?~e=w-3o0iCVdH zE30tdlGNri`^{CX?+dnf1QPM=w|Oa-=k!aHs-&4SCiP!&S_XoeE%DqXIw$vR|0>}S zf|v~(L^4uLt21<8n;(edlvBf8%}dqwY}J47GI!3C>pyPfS@$$!b^fp@TNFXN)sQ=_ z8DhDQh2P13L&`ZT3u1DsE(K6mt5MO7M9Xw>*Ob^LB^PF`!zhwoUNt|NF=oj}iPI3h zkO#X|PiXQRleMiQ6o%PAql}_Eoha|7&U4AA?Pa*c+@{WvMR0ymKVXkEzuaXS@qZNU z!I8s!NmAs;b964b~qBJ?3*ly&KRuHCWwogM^^CkR%a>P;RpZ?0^y0V0dV~FZ)Pi* z(fFbtRdwH^stor}_%tz4r#u;|K+p8+mmeRjUU$-TbuT@%?rW*J`WWsdFgLzlh%>F$ zOec~=BmIOof4D^1=m>^Zw12dabB zK#KiVi#e%w)bbkV>DVlBsI$4@d}TmAj$%9lG<(`5^%%huk0oWXZRm{rQ=3#>6{+!JhFf!q#$^IxT|SHD7`-5;QLIk0td$l#F-Tt*7u+_~C1>fKI2 zW*2S3nLg+gkEfM^Tq!mJ+bR!|M&U`P1@z#k;y+(Ecc_{kayrOO>TDA@J$6uGYxAGq0C6!u*C7X+~k zK~1w?3vmTQD&H9-&zWIUhvpkT^#LR;Icqw2K`0yMyN90#p86ag`}M|;1C+eGKjAC* zegRoBY8d#(3pKjk#SbD$Bmhf1_Afp`Yo|UvFASlO%9CPd%29J|l;vGKa0W@?uyFWk z5}l$~iH}WFqJo(K*Ju5Rzx>iH>OQ2CI+%0Y`g!wU3$-g}x{oocub;KMa7)8oRZPdf zUh0RDYQbNQI)jg}$tYt7lGvrE(*Gdm|>0R>#I`O|cKeH;l56(UJgiV!&13 z;lcuf%Ok(jvA|}Uq=;=LC3fReIb>8}8STCXm1t3x(=G$1THX9Pjbqvl%bNOYlPYQw zycfEq#vy9l^zq{nLb4eet9uod2KaU96=7M4w)v*N<{j=U%GJDCo%&Qlx94oYRfr90 zvUGV57Ivqm(I7G~QxiDLS$v6r8=z`XRTZZ5^_DvTGnU)pN16?9A;)i{Q)rFT@2UMm zh4(5oeYG6VQ85?J*3q&X@xMBp<4auXX|D_SYB4;G@xXNfe!1|jZ>_IJywLt!=QXod*peDt zA2_Q6AooB-Ecj~rH1gkE*`2MzIA#hcPXjO$ck@-rMg6s~nIe-Y;I7>|s9r=X9MKko z)P7ML-tvc;8yPBGa<#+|Zq72Rr+RB?bw_ZGwRf2i`2qBQmi_UvkpfivqXBc(a zXjK4*gl(t2ZVo{)9S$h`MFWSsk+1)&Y>`ncqc%8{)T)H;zf@c#b;fPlh$+Btm`xM z;hODI*6LOEXV9NTqcs|z>1n5zoVypn=`=S4dwOIy74iGMtLbAh=R!#h1Ma7w7wm(+gQ^%77U*3u>bb+AZkbEbOAM-he*4WTt_jwaS5R{5ocE_bI=*@6(;v z>{Jbqftn_h`FS@h0)v<)H${zz7;Mh-V=Ar7y$*Z|%RFoGe^|PuiJcemnDIp9WN9L< ziYL3aFKdeBCK#^VvZqQ+YiykX|1oi{tbfRJa7+9X9JM&+-s-eM)2s1hyIfIgwmX*2 zvW54#4SjvfzujFcCXKTYIMqcd%w#o}W||%SfxjcXcL>AIU;k3kR=ku_?mJv;_#|Yw z@M`DLf_0NkK*a1udz@Ve(;`j;OXQ$wQXvz4?mA1Ikj-y}-Z*)$W~bv?wmTBJ>jXr3 zf<-3N1qs7n3~dhw!dFsYDB!Z_nSP!B-?wnW&*lIqCqLm;y1A27|~e`H1a z&~J6Va_1TamxC1=s6)@z5Z~jeL{A=gwSKF%4Y{Z*lVTvsG=A1Qc()lmV`^IG^=)^o z$3J$o@u>Hwgu_~*!L5)}M6$>zo8aB&l$*QRy{^J0_t+YjGU9zI$~Xm#dX8}emY0kt&@h$opM|BZS{8(&Ex-*ibc2hgM@HTgSE0YDBb_7Aw3mpcr)0 z{JY3~`+q3(zkE^E@_+$zco<;{X8D87xjd+Ad7}uNY_Y|pGHWk=3|IAc19uF(Ei{+6P3%LXo5~)1x!?-?INEMzBVjr!exLBn2tOf38mcW&ZRG=b84wi;4N81biOv zF1}UWqkYjE?+rQdR?q&fO*&Hi6E7tli!tMiPa4hLHYKY+gT>ytvVP!SnZNdeimg8` zt0IRqecd-KV5z;i(Y2qvb-kTlyd304X`S2r1#$4c`08K7h;I1yAOMw+xuz^Qk1b#1DECQwLRUTk z!5qyb9y@hHY^)&o(=#TfP0I3Wk@Aid9V=GOpY1E%+)-AN-hp{;3ZTmTxmwAx_XE5n z))ZpeRSj4bHGgDDUTw&DI6rwEh%+)XZ!1gEgfgu`2p%64I`8+eZL%^ctsrM9S~c97 zzA5p{o74Zrr&7nVc5FNZ(k86R4FYKX8y)s`$-Z7*MOvN+IE6cS$12A~%rPFs#C-ks zuM#!@h|hMgff~hO%o48-JO5)|l31>1OJ_x4$`?FP_siTJ1e%w9L=LY&|b?d@X zh1!(7?^uYy$>{9rg(dE){F;0DNikUGDbNGW_QUy_?)nfu6jU(92h{J>3&-#dGNNgOk>u3J#O^`S-MlxU~$B%sk~4ox>c+$6LD;B8YUW?Te0wLGzYmc;zpZiDE!Rw{=Q8lTu%pRDGB(G`JBD&DHVai)ft zp9RnODM4~u@j#8HCUT|}Hn!t1<3y^8>lcz%@YF5!AV8mG^c#ZMGjzL~(G{x&mz;F- z-(Lvkf|xb^w^H$Jc+ovzPHT%#QL0;4PDEM5Rx6sF$)iMUk(Pv~ZL$+Ic5d|{ohf6- z-}}=qp)-H+hSyeYAu38RVhn`@LLByKaE{t!l&_;HzFYAz4d_VlYPk=q^1Q}?fF0X! z2fFTh{dNEkUnX@X`~)s(0$+6cHV73z<(gw(iEk$R)`lYE$p=1K(Kc~kcuH01r{2N}itRs&NKqUvlL9`YJZk=9ZB-1_AOr%h(l?TORJ}RZx zmK<@{)fP&06Qj_7tYbn>Bd!hjo75w=D!jpv2MmqK30GiKmxE6MDrtowgikW)7%nGy zGb+VRR*DX=O*((Ik_==&qrZN=<%#0OklDN z`Dy-M?X{c89QJV)qD^}_SkO_s|0Dwy-epaE+1R4^U16dQLAXdqLF%G??(Q|Dl{H4e z(4%}R9W}(!d!D0^uV40e{(x|BrXY6`6jfWXwz=uMa}oUcLffW&Dw=6}Y>XP+o@CkJ z-`Vp5K_akOb(H6w_N{$RHjnhyWQ0{*vl>I{6afPj{;BcR7GArMiNzWOH#Lr5 zRmiB>k!jgh-?8*pYewMO1w)GmKSZwmsPpYE%D(RQUBWj<6LO84)_D%~vT@B(Igi~{d3S4+7nGmwN zImMFq)MZ09Qe9_B-{va#>G92pqpLTXa|3%PAj=+_lg;~=(lr3;vC+{XhJR8^$0d3a z>^$Z2XXnZ7@wFqkaP54#1BrIY9qlEgxzGqsSyB#Ll69hgXZrg4@1lKz->K$NeO6~R z|IVHt5X5=Y)n#PqP4A1EdUK>NcyNLGmo!Uf18g;Y*_kZp=|F&!(Yokbq=?qo`+@p> zKOb=*)`>bVv?TStKwh1HYQ|%sO9wZbudK73jRce#>drtZ+|keCw3Y)w$a8;W7|$++qP{_Y};nz zB52&kjpmvA_x$JOnRn;2&)V18YhT}MSkt*ipDNyV!cn6#op7SD04~^s=0I7sEX5;J zFVXG`O&g2_d)Xv;m}-9gyH&k~ldK?&dcOTfue9sg2C~QmsDSRO8Ai=XA+pxeh4o~J z+!kY#oXea+MY0mIfjirMn@P8p)AFEPmZwl>FOf!f4V7efNtZKHE8|%Gc>e%SEqdej zbu0&aF$obEUFxmP-`v|_qQpbwkv=k8@>y-%RL_-DXS>G*gVKfQ7?SHakj+0zmhYOx z7;O-ro2yMJE`eZ{YH8>*egc>OeCK5a&#prGm!Mk}uSDI_26GjfdXT=I>7X(I;tpBmc{UccId6dkvhuRs(N~ zjgX#^P7`x6oyX5&Za7x zqMptr-@GV~w4^r&I*dA{&9Hta#zsqu%BZ>fv4LC#zL<@a9N~C*20`vFJs}5>x3+5= zx@_^Op#NWc;ErrI{Fq6-!dq!^%Uhf{Z74Zs zaHCDC!{iJUgX1HChLj`0@JOO`cnU>wW>BC(Cqo9-P9dFkY4?O#?&7IYq$VWDS04cM?;{JrgU8_p*Vp74;q5G%O~4^Uod-Xi#@& zzB%8TLlCi^)+cjgy}9Q;?^~m`u_lX$J(e!dss+9tYgf5G-44Hr#)|VAAHU+929ja` zHGi0jywE%3PojQSb1#c~ctd8ZEe>R5wGTd%vEH;6QZb}*jmh-zPU|9JVMQQo4u1a+o5-F1Z1i(Ea zJUfIkMy?kpt$bB_i+q6Q#XE^@aqf$HlB?^h zh;23Q{yV_B35FLoS--UWj$-xE_n@90h9)9NNOv9pTfu4l$de4XKQ-9XSrf=OcTz|Z zV9wG8bI9R((38vS{;O-5Trp-?*Ew?1=#7Z`(64{ww`Ka)T(=HBCo@7XrouoMM4KG@ zYWxCgDlKCCGh%jE5t>PdkR3WR>G)@y5g{J1%Aj}XwjYRJRKoUjOQMqMt&w#O5;c{vY0e%IhzysS0n}@V3 zInNkq2Kbb<=3+?~`a&j@bEItZsW4D2YgbR5^|eT*Cw+G;LXKW4BBblr^D9QlRW{Q1 zs@g$EuNCc1`{01HsC%A-TA>_k%1LCr^NwqKl-<(BphyU+j^*c|oB%`3^5RyMbk&_s zFHC5t2hUZfYPy&gDqNSP@^`mN!_-ztyZAHDLoi5XB4IznGL*?o7e6|H>1Rt+~ zJ3H1z09F3}SRSITRbIWeC%faSy|631@STsSp^f+Oyl?I~V<)fvd32da(Eh$a0Jj2? zuprSsMefHOz7+9JcTrgv&Eijzx1j=r+8$(8QJS}(%B#L70 zw97Oq2qh5u;{Nx0e98JzH<)zQ_`G933_yZ81i_;bB4QGmKFHQm(zC})DOy&uZe3@YV>PFdU88RL5Lp9;Hpt?<;|wPfPQ}@fFT&ip06nwuG^mNwKL&;GedQM^tP&h zYHzSn*=gMWltEx7!=*0KIKiRLO|vu6?;xmP;`ko~{A2&DNXRotP~yY$Ly(*+1ygpk z+zHUh5d7Lii6;Lu*hRF|OgkpNvtAhPu*g_mWt~`Kt;^#h@F_YV5q@kXkJgV_<*$fK zv-d!AW;fbJ1oF+TSsLE@AG008g{`dgN%3E&l)4;Z1^4&PmW2b4oBEY2^LF_2dAZv5 zuWP(-MV%H`dSE=URGz!tUiTtMPELns(8AoglTHB1s5(+M ze@jcHMCR7u>AU>IZ#Q{_s+xVwHF=|PyR(VfOm5QTd@5`B&@#j*v+20c2aDHV@!a;- z`CPcF=tj7mzYPt!w-S;&nj6ES5ICF0i&ougDvcXE2kUZgjOm-h#t<{|QsCpsQsrkF zBn}w{Q((AGll_SSKx13HkIbZ8s|~wu?e;mm@!s`r9;)l?E&hrvzkI!%`ijVSr|$8~ zd8~5$nTozp2hkIE-75YZ&jnSyAermc%~z+-1&gYcL?sFR+Y0!FzBOq$*CTxzy!bWy zfDa|C?O&onotMW&T$k)3;pIhQX55&;n*H8I8}D}$^=a6%&$5Mo)>=MN)bMiC4qR91 znsbFqORB52Irv_#hg=BB-BfYcDtHh_fzFll&Yr~9h(2=!cvf6lKi&{maD|*YZj%U3 z$bl}kYn`JBEyn$$QMFWhTc|4|m)l;!LJkwj5OP&5TUmvt-y%zb@U1oa9G;zAKw`-qX-g~Nn{CtW4 z!{&n*J8+~{CiNy3rS1-I)|rP4393O%NA@(Wz(6uYzj)RLBkY>o8gY|n=kJHt-nsbP zly(h{`2Y0CA1KhkXx$z`TF+^=cG1MF8^;!UM~;2vM@Pe%M>vW@0jyN12*q}UaIJ5% zdZq`D@hM-B-{Y;#w^i(gf@AJW!}s({pBs!Rkd4Q5^Oh{wf_cXgmiHx)ov6h`=I3(t zHe(1Jo&Q++5*F5EoN_rz7PIVH6k(Z2fn9^6ceZwnxk38z6zS2~QHjW)pkBsW#l|w% zxFYk3p#LxLNzAx~O;xu~f%lGwc5ErO>>n{Cj|)exp18FHJUew|%h2NeZYshYhgf33Bl^%K9Cw=+AE@ zC9ouJ&*`w`JYkj}2K>oegkx4QS32R#gq1~la8~Qem~8M*+dg|!VL&XcMD;-$y$)-)a;Y9V00j9HXKMFvN8^Z!1m+X9i8j ztC}2tP^CM(>r{0dqU2Jx)k{a=sO@k2R&c7DS!K~f;oQ}$Kim)iDfyT###Q!x zpx$1-!lLWHUT6n8x;KF4m2hv{&z>ciM%ZeQ}kJ>1sk;TVBb=vDeZN- zZ`-r<*JVLcK0_*$l?PB4H zN?YXh6h<~JF>|myB```~SAYHfw0*lc2@hiAR7(S@1w26ZS9vW1mte{TX|c>BGL`7@ ziy=Vls%5OPC6)k7 zXq^hO6GAQjiqAx5w_-_MXOXV0tTFJMeb{S|2!BuIvL?m4Z z<;ag>1RfKG!1CkM=^$HglpBG5oOx66_#!-c@Yx)Kwtyx`7Pc7io=fh8B-?7H^s1G% zb1i}oSD_%6fs*>!{@&Z3tf7jq$q8c0wBx-EU+!&(yMx5rz@`_7>YI5RpYaG-QuVR` z@_zktu=oA$+^GW5$(IO@18r5}ir;pjWZefAL0oU@%&p_ncJp^kqft2PLREkH8Q#@{ zr{j5^qk`rCdLaPZ52&dEdOuem-uK$n+!A{ndJY3cK}@in^Ms+43oRL;i8u7rg4t;- zBGqxhFMCUpFp_pZfgAiOLt(?wAOj5e2;%W%(x#fOXW`RZbjGyoZzkP=oI`}u0eGjO zuHJ^6AGf9F5j%8>CFcViM$sDOx@onIEG!(92tjk2k`Z}vj{YDcAuTqlZCQR=eB zI(8P)YoW_1n&c6<@^E93Ec=|f#Ke9XIa~RBGw%fj#4$=IE~r{^y)ci(V-G( zniK2oKAN~TlF=`_=zXm+eUWcU7Lsf9DE zMFj{Gg^{+V>d_{`W3D&Fj|eLsjnr)H&M(Ay9P>-1_g^CHTv2U}Wf3og8F2I!HA~c)P0#xd~DY5Ce}h-WO5DYh{2V0#^y6 zc2f!D<74>WO1OeTL990YpmU+1x$Q;^OR&09k?sYJOU+TET|jc;T8iF?_LSDYq%-`p zp)=`^TJ&%oqH9D=E=*z6h|=-XpShUUdDk-WDmo?$IGLwj4s}0NFbfQYpZNOSab?Y| z{5#Lj36S@uVn6?W=DOLE0U)H41paC{07NTd{AQ`v(t<}sWT#X_U=2M(nbKPs8Z!aB znAnse#uC|zhlnYJHbcXas8G=<665f^2+2{2+=xbqXe%~aY$NQS- zzEq61f`#wb*S)eoYYy$FqxvkL$7II_j;|B18hxVNuc%*oiI#2JbRXfO)5<+m|B@WA z`-j41G0@=AX5IfZnX?DlV+1?@RtOA-}R?^t+oEFM&?9YpkPQMm}z?)wdBh<>*#2kl-c?fTks zb}l`}W%YpKU4Z|(wy#aetQ`JE^$>p|zL)Jf^UzIe687M9kIfiUzTW%A0Q|nvgxj#w zQ=1sAbi&7E2EqXQQ2L9*i-)TQZ>njCpPWf^@$30#=#A-?En{yW^YWs<^cdw5idYw| zqxA!)jxH?T{JXz=tsqlJR;6kHTWlLpji^1E#ov}=w`=9c=hVb1#HL>|{(jsu)8pNy zYV>fTK9#A1?n07KJd7i>CLl{>r?L=(EvE87mtOky9GImjtaUu$nGPP8ukT9BW@##T z?b`LFQgKZxu5`f6Q!fyj45dhsVkOKJs1Q5UC!ED74!@w0nfd_p#+OaCytO)k@L024 zh&Gz;H4iWO^ExgMazEGX9Re237l`Bh(u4;~JlBS$qLlnG6CVRs?1b5eSgJassG2R+ z)Esnb28=G0jeQF)l0ED>RZBiM^0*SCi+U_JNbKq3zpjq#$TyHRbQTaq;GyCiHq zCmwRP%EC%3oH&oi%<%SdmI_>vyVh(K@3*~Z7C^uf3E*a(1-l=NKB_$65y#SzTIfns zN`+a{i{VLVVd$&^vM4_q&6cu!_Ukz4FZEtweS?FOPChfU*x7k; zrl$NL=B6T=lZ}Ed08G0mnWQ38jPn3mcb?8){FIC9oT(InVHdeYqqe)&4CqH$8`0687uY;Gx3r zf8a5~Ri7eA36K{A>>r7ewQKh#Ls9XJ+>;EA-{$8eEcA+N`A4m|(fCEt&{4x>(y`*v zS*o%hgdn@)$1J}4MQ^eEoovr`fS;}P8Pu6heW(b0ZFklNvrXFQfs97efjA<_aoN2r z2$Vf8#ngGSiSmbd@*P$&U{bX^D>TV zcw8*W{y6^3^Xs%_7h}r^deN(n*e7}wN<%Z@dNo}?d6hXfn%AAFz~Br54=gfpU%+jQk^-0Wlvx^dq;U=9Hcs zry!V&3=hA?N~uFq@9kmv^#yX-Vw)xLM=YfJx;YfjiC4en@|m2}44XnxH#$PLt2sW@ z4H+ec9@E{i^`B-JQKHZimt=@bZpgmwMMe4=VV7G*Sjwnetm+iZNV1mg6{%R1m>?5P z&M4#XIZdvt)fGn?HCd0U@iIQ$*bBylR<p!*k-){E~fE)eK_bnypVPCswVcCiIBfzkpD2pMj;XEJ`xm-}+g2zz)&Bpq2 z8LvA(f`65%SJ$xr^t5U}Y5AhQ*g&zQ&cA$*UCkp4kMpo)Zzm;lY6S>NP#dB|N~U2( zN+$ZtkjNL$8!v{e>6~#hu^S0EWUpwup_J>o1zkDDZ5R#opx!2pTH!S?n1!y*D%GkXqffsw}3b!NrN7tVr{*P~49c+RAvnB>K&Np=E zZE8rKc$nU=BRi1i2lBZKT?R{3u6>D!iTjTd`ecGuBD>c(;^H!HUUU0F&sQJ6KPkNW zeJ@G>AxI(l(;|zt^YIAIroog4C)Iblkxe=zZmCPSBEyrmqu`h$6nYq+c&`gy%n` zru)Aud8j*icQN68(~V-xKWYZIqj>n0@^(M0L|b~<)f~<%FD|!`*J&Cl38oP%pug*y z0|(OgPv+Z6|c@j|AKxpOX<}q3HgN{xo?&b6qDAia36=rd~?(O z?M8!MjR9+kiHDDxN^b|vkBQ6Xh$qp=up3>Rn7S#QPbHnv$cX+qD@D;3SU`SZsrk8e z><>?`Q3dO#r%vNGGX|$zORbmp1~w?4xQ1^SPjzz-;?&m$gVZX;_qFpc+&n9G6S`XP z2z8Dp9BL2&s-}^Lk!F$Y_k?yCHqdtQm~oU&wqyVa%7@VCmNZkq&}%z7Z@rP#0?vqD z!a8!(d}~@f#p5u~z1;k&DlsD6%-`Aws7H|nRcw*>nfChi@%Dq@jLo{$#93#eMe_QI zR#}REfzjC4yaot~A4aNFWZqayDL06sxsM1>ZO`*s&O-}i3;f6x@d3ByH}XxgR6`W% zRXmvGqO_p6Dle41wdeM2LOzazV5@33Q#AjpcoqtSr`TEgTawzHf+^6q5z(E7H#vDuhi6W(B+hIvfl#sjhKbKh2m5 zS)K~sAG0mc+9L^tf*9ItoFj=mCB{MLPxMJ3O)ujM3NNY;4R-h832!T7^ovT0i?OLu zs*6I(GU#(3YOX_Ym3^jsmFPTopdhQB!U z6zXAA4%D9mmp|#Dh!e4HRq^aY*qI}q72TUy1Y4`bS^7+*F#clmX;WgjkNgwOR3lj= z$xpc3`4+yOa)HZ|^#i#oEeK5^LD=Pzd+Dr-27Ihw;K}<){!VSdLnvjlHX$?d26uQl zC6&t4S1wulOQ>TpU?Sl2zVg4l0yT~7zE*Q=Dpl`7bzxc_mjQFv==Ocp9%G~$JJS+W zAVRe~4BbzfcDkJ>0BsCFN{IH6EH)So27(WVQe8lFv?pa84=cyapPq8oU@2wxMZq3p zB-IWPggk*kFUXu%0>l+fK<0K-eEoqFZYf3wHi?g>X5i1k6l2B+)I~FtsXD@Kxamf! zm1O5vo%W5#C$bz*7)?7?#N$dQ5A@x*HeO^F$GuykopyXHr5JV}%f_WxD!?MjX)4aw zpihsEh9-QlP#XA?7h8@zYlDaX@sYtMy_sB$>#L-%9JM;hplR4K5iDeTQW!`=-=k63c*JhX-nbn!K_VV7q_o9C^k>ms(L z7UPo6$I_+J+&BB7*Xsz~Cr0+?9L86Wa;`1tnVRaVRyg8_g43d!hb8kWZYVoVQL7F? z3y&1B3s1)sX?PSLM>(~UT%#V@mEO-Qx^Zh#dK_T0TF#fU|70w0#xotJ_R4BjK+WR0ILz-mZe=om3NpCNv5Z z0`0IwgmWz^;G3bH3hc%dXDPYix{4SF25Fc(8n7b=T;>hCY#5{K&a`#mkGAc0(@x{vGQlh`e z^U&fL$4(!nZ;M2Zvl&;Ews@KnD~8P@Mc1EL<~K26iNt=nvtPA%Hw~@#)~5MTs(aAU zDIEoDJ&x^cAkwVa+HcAeAE)TAsQyiW96CV}Nv^0+OENCW<)Y5ePo3cH+Fh#kK=-yq zwqv#wOPVEFi}b4*Z++>`qW+tRa#Y=!pSGh17)5tdPwum-W$~5PKS=jsm?nUdx`La7 zwC5m5k&%hb1WG)IDs2EhhqUcGJwnnq2jg|NI zPUi9C{L)EIXAZ$Xarze@%IQosvG6O8``phj8e(GU?=j&=EmtE8{%~mDT4g7lDX?d- z<{JR1_jCIO6);K{5L)m4)_ME(Ia0-Bu78^v|TzVPuqB37c`n<|f z91fbZ@6j)g`;6WUVvMAjkW^s;6Plugp+zIXOTvbV zR9I*j!>13eAM)=j{ET1y>9iYLr(okuT5Aca&!^WXU4AVQ&s1$#nq^?$y^+^=Ug^jl z8Zj9?%x>?_r?FM=wE#(nN2*kQWlU@Dp;fVIZC=@AQ8jDUTrt*uS_P+JEGE>AonOl# zjmnV=PLU-@NxJ361uT!J=eSVpaG@h(n^!7)x9r`5U1QgYZjpyf4*raCIh0Sk(WsD0 z^R69j0Q2&&7w!3c_^aha!Gu$4MrB`_3-M%ke{Fq(%qZ1-tke(|FXHh0CK<~TDalGB z9a51c$rn%U>ZkIb(uO84w_9%5Ba!*qS`!bN(na9vmZ>Yz;+Y<^)wYLcx;x?b&{Zne z$r)U=LwapicddO?e7tJQJAFAXYm8h6UIeQ@sZMVG1+G&Nwwq8HtoXAtWXHstkcSH( z5EF>@!lPz7atBLCA>gXQOQ6+ime2jLmt|GZjla_)gP$6)ag-&G-RAD*LMAgMc6r7R zL-qAgdT8-Z{bX9MsE(TN^~3pTVQO%~|k>;w1Z_C7Fv`PTLCkc%tuQ?1|ItW{~x zpF2F!4NCj=c;3TrzBF)LzO&*-#BrJWj`8ikjuf;}x zh5LjD1FHubZ54`@#2%x#U&a6sHdC_O!ei5Cy7JSy#y}qG7Ul}HW){5I9v%)fpYu#C zqloUcfR+|B@^U;qOP+{b0eay%%rRCW5wmRaungGQ@(v5Y`bTl%TZ9yuZ*3vV##fjB z97AB-DRH?5YcllPx~VKv0M8J@*~wR@n^DHu!uEE)Ku(vp1)CQtktG!f zRV-oyf9po3gH`=DrS9Y~twjX=#Zpd{?(VAW#rnv#5=|WDqy?rWwQ{Bv3U-*bZbBGg zFpaA6{uSu(;v@Rn_aBT@>C9J2EhHo34e zCoHf>8fQ@}Fdk;1KTmif;ydxO<+WAUW`u3mmZ@i+ z!wK=#U3L^zX{!k+Yh*`~ zg&uGs)~3AYe$M9P7`%qkH<^enH`n^|@6gcQoFGjZ&CX}pr_}kFx|f{%%Ikydepzsu zfGmZoI*f5DIPGD;sElA>k;fm`(nJJ9uai*eq5vykK+JG=wcD1PWPaKH;*?2(m;Eb^ zg+*B&=cP%KRg9|>wxxwWLY#51C;}hPnN%Wb<(ghZrjY53KLyCM&Gxi;89ToUDI;on z@!qg~P7J5de-Ja_*0q$SkaBSvRnNE>sr+=KDfp-7)gXhDLm^6Mcvazjd^?P84hHu< ze{S;YYS1pu$NC%$kkuq?tqdiy1R^km7n6Q{&Ezir2$wP$3h>6pf;c)Y1)f@9+M^0` z963iU+uXBz%Be2DlRE&Mdu4KrH;Y|`{~zbd!O!t>qOFHnGL>(TKlFb zqttq_t5&AZnNgsGvfx&T&np??yh9HBm^PB!y9Li5Yv}h_aQ~o8zp8m?Qj{7>0`gjn z@+OEY*+p{@q^RJgMHCdNwVe&H@3N#xf=H~ScZ;6!u3_lgQ0e;Q$vR+yS;`NWDgbBT zkza@Sk`YlEl7+gwG_zI05$186SZ9Y;3$lKGh*F7oT3LiQ4~%zg?bP~JmiIEZ6M{s# zv9aap-X(1lQn_U`nS-9K8RlNOV!zf&7W$e_BP$(XOm9##rxoP**4uwkMwWzr>(E;D zGJH22->Gd4$nyOldDT{wvw+T!jrdaQu3Xf zgS@{gP!vka8d&M1>lw$vI{|KgKi}@X85XA46IeE?JH(P|5FlZHV1W;rWZ(FKQrJ2& zHp>w-&Jaw`nF@E&@jkO4fF>%c)e%XJLhO)@!q1*Q^5qXyhO~Swa#$S2G)*5X;h4F@ zXz>~1mk23vOE|X}@)7^cu!*dsw^$K3TO+2*F#zn3}_|hf{QA zb}&4acsTv}X%~jBmbF-GRvVDQ!@TiMuU?1o3$r!ZIMzWtE3Qgt;5pLTF~;$$Rh@Ov)hFC~GUUNtzpMzUx!ry}M9~8JnMbyT zugXOFZ56+lM(zk}8(!QDP;A2If$Jb-Wqr0c$`#2j`9IR^rIQ=i>LpV=3b?Y|{F1bs z$BW<2zwEMO=1=k4wybxmZ_3Z!f5uk%rkU3j#V=N>;|+3?Cbk8pebkt9Bty@O`!P1f zJzG@WomEi*?mSl$*%E6J*g}baY%bLQyuZ`iv)26;g>{Of>YkziPSgf^m~GG+@az;! z^#-`91jIxaTZ$9#!2*{GF&R)uN^Qim@8BxYG3Y092S+IjEX(7N5|Z(pgBup73V1|U z;MQsEnAc-a?XW9IOPw{dQoT3K$}W()hoZtW-Hgc8%q7ZAS3g`CiQNiX{jv@C=s&}k z8S+o3Er;`Gpr%?g)gO6BoPD9g(q-dT$U}3UyrWc8g8+vIi%k=}sI>&FMb^9{lEy^3 zXR@a(6{86aCyMr%&wnfKHvsPHKc$WL6j1lvXbLRC;R(^dpjr8GKxWq;o~zNi(smWk zL1fVG?)VsPau3>emLpbA`XTwTOxZn3p{Ba3FdB@NHcd5zA>gFiR1{KOkDJBb>6 ziP8p2T;lxhLcKWM9hSlkDr8K>YGa>vd~$S;YXjArW4%88IY8niRdFVxdW(co1vCZR z*)e7t_I_g_D=zQi4=I zpQCI2$;=(7^Lf`sKw%KOFr%rw3VHmuxSzZGTgO(+%RukvLFSituf^!Y%lSu!0>4<6 z`A_EhD@EpPzZ1Sb{@Z?0yG}S*gyvF*!1jh(H!!s;~#lSce^t_006a<jbCn1H zVr78fa8r#ppw8?KSCK|HwDDwG8@OrLPcee%CejqGXm8b1Ns6+QQp=l>O@D9NBxe4+ z`jbkk4L?6JU2H5-@ag<$T{g6rL2H%$Fjd;4ou+X%*Ul<}uM@9TaaG>4XO=H*Q;EeK zW%cTgWO&*c(>Mgvgu8eO2k%cNnfmh7 zN^iUI?$FQZ1MnzT*`dcIO80T5q;P1We?JzX5cG=m=r8$EQzJ>(cB!(v1LJXkI=Ga& zT_kj(U(7^3n>96>$9(4w$}#r~9LG45b(yNjO*Yi=dHJ-+6Ny$ zA0V5PQODZwBI@@V_?HJleCO5wx(xN{gj3TJQ!iCoDt7K_x=m}tBk12y>8I(x;=;(1 zBM=c$xxwP10CqMhazy`;=#*5CfSnY&E(evwc@2@Azsrl&g~|Fm2Qu}`n>2eoTk}rO zwSVER%Zvmc?B3qDWz7CC?lBH=Yu$r)AfM;2pBDep(!Y&y$hEhsF76x2v9u|8nV}jV z)r!ul6J8l%Yd_KT+Tz>)U+wu849{-0?#C?g95r{AWKJ)o{$H05ou^GUocD*L_#d3= z+*KyEHs9Pu?JGMszjgSF>+V7RKJ&3tVVjR3H$om?FVTG395s^9;-)>DOrgFg#qSn( z%YyjTi5_GvAv4>5Mt88IUbFZkVWTAb>y_vCE`qvCwn9bP(7en|#B_VfK#d7}PbJev zm0(6;@vEjQNXPufDP8ol$c~Jk<5>6Q&fDjYfzY-Xi`_Mn6M*AtxPzoMQCv_-A&boR zG^CK*6b~A6{u@$ThZx*{;MWGe*hN*4V5>n{BoIf~*ocUGTG+qx-MB4&;qBFDIi46> z*a6X^$V8@CNs{R)4>=)JepDS+o>k z;5ksJeGpLH-S(boiO9}ztqF522cnw*(mLd}e)A0-=VuoFgl})zFIC{tiI)nhW|qqw z|Gu~9ur*8DXCYu-~mvSj+K05wa@_h{vx`~5A$M+gM**y3gD*)VAXo+rx{K>#1{;I`5+-lu}5 z0>$Oi@AbL>mJ~lV#i8OFAYT!JPClzlMMpo}#)CZUeVB4;RFMtWRU_6%na>h9+@$Ug z0va_*FF91lEOz z-ocDlDsk>EK^7Jn_FwK~`?Ap`t{r93> z%X>0&bFigbrY%BBl6B7drByJ-5^T0N^2KpZbl2AZ)Xpev_0v`H#^BasYoGjFPCT?_=odC)%NfI|j{7Sh(5 zCvv9GzaTS7fRH~UmL&OKjk^WFvp^k$%nH?B=i7rO;{~`PW%?HtxIgI{&qdNO_6{lp zoG=})HI`UCXdiFWIOqs4^NfGl*HNj@bV-4KKXtRtwhiWaqSu(z&OWG4q6bBEa&ga@eVAp>ybe6pikPmSXO> zDh%ZWRszLI*fPivaXbGI1&M}wPsqNrf28^lCz==ey~m!X&S=&tZkjrQQ%?AdGJ9oG zI1c_-tF6L>Rxb5LGH(P;O$&HZzdBm0a;U?Rp}B5RT%EJBlv2m{xM)`J9^JvK zjia3FSg3w#?dnE7&hVu2I`<`}qIMxr@gAvB>SZ5t9q$2$tx$}unX0@D5D(k^0uoiF z9FB4*4r#XlyHmDfxZ)1)#%!m5R%<7T%}6}R{yW^!`tfb&#ID|TTRQSSdy=K&{aa`SJijSD+V*l4{Z)`w`Ci%8B4-Ae3gsx-14Nzwz#w!)>wEdE6C z&+mP45}`m+)pfSl0wEoPn#`2qZ*55ikX9etpM5abkW%=Li=PU0DZOyo*~o_|JUF5F z+($G;PFLAVjR4;B2fq7p+kg7%J{T_TKSeK9om{_NU`n5(3SVYe&))cxs>!Yhy~{YB5ZJFM3?^5B=-_pP@zCEbtbKHS*PkF>W$%XUUVS{W%Lq%1%QDWb*tq;cup z+FOrj8Xqj`&)o!2k>nOyiUTLM|G9%jdPSfZEKeW1nMzsx(^DtU@XzR4G8Lfg`~C8 z>IRua2GD#Uwm(q*ZV+&2#^(<%U4QtxH?{>l;jXp^@)U$$fkI>%gz6KjGzJ`)C&Wyn z8(K7^;p8QD8Amx$aCjP&q-t108Ow8JTTnDNjTZHg1V3sd%wq|s{5*B{$>FFYCgZNj z(O8QEqwF!(DS&gpwWm zM8HPkAm`HXn{O?PwI!o{hXE4a4~S2*b(&1 zKn%fRCKPGpZ0Ekh@Z`|B-O_&yjUl5AM@tHnaD_8)JvR(pKn@h>i4D5}{tXc+1%xAw z0uqr!#cGby$B=<-DE>u04oWqmVBNc56U+V&!{SzK670Bkn0~}|Pf_`dh?a%j*EA%Q zc3*G$qH0*DNg1EOxs;_Z#hf^4!~82~2s@ zq-8c;A=psD6sOB%kos_CVlr`k9}EByP)Y);`Gpa+GkzV4vcuBBncB$%=m6h+6Dt9L zP}4bp6{1P72{Xb3N-?1cHZnB@5Cwh}$~)#BKprIxu0%tOfC1HTfDjl-H%s6bB0ybq z{8B?Iy8bX~hGqDKxb>qTt%pH6?%SamTuWAcxWsWLBj*hlAKko#W2Q`7fVo=L){*R; zow0|{QdW_)X|-Cv8~oC^S_+p%Y9-p<&KsyAS`f|OB_(R$ zBz}<331`mp{hV#4NJ3{1hzb*uM3l#$nxR8$_OF(Q1_O>9+X2lFWw7xT&n%Blec@nj z=xvy3#AQv6f#FtkvhZx|05?Kd4pE5@e2CRBEj!Zg=D|_w7EY(fJ$5Fem3Jmk3JWD* z$m}+2ZDdK(3?62Jkx`zR0E<(MBaNLS&rro3CcE1-f+$<%J3q4|93Hmy4^y~3c*Gd^ zs&0SzVk>S|Jb-kiUNC!DD<%dRDmE@YiVSXmxe{$u2tstM`icz5#+h&^#SslnrNbQR z5?rLT<*XS4P>WJfi50h^!)bC4$Z0c#*VsFZ<*%#50TXbU6f?%+%g(K|6JyU5sUBfN zhs00AjWv+Ue_rY?{0j<&i>F6dDn6`XJGIqLts#^ZZ0;!&MP01jrNKR7T1Ee!? z`Qe5`)VjGf5;0KuG}x$mx*Oj4sDdE(KL4}OK_Gt;0=(1(lMMsk&;ReqyYM7qyEk1q z0JM@E3;>7%Kx!^>*e37-3oMiO~|pFzEslrhJ+-N0snDqA5yZce8>H%|h#hbgWF0$!M&Usg~Na z`E6)}&;}dxS_$iN&pfWgzF5?(*j=hIU>>A35#d>fdG|Q9gN2&LMw8Thp1po1!}1$8 z_O{AT=i_VQI9eIW?C^#k4YS^Hz->F0rfkjVXZgwA%i3BiF^6+Afk>V~M`6cFl*<72-lkknc+ z5fiVSwiBeH5Pgs49-4;*~g{H4Pp7yg?h(G&0@_Eiw|Ii>rR}}fHNsEQMg9IqA-nR z2Hr`OsmZy!yW~mM8H92MZ&Ue^u?cb8pCinxZ#~#v?7as3`b&?+5}y+P9aIutoTJiS zWB$cp>0E9#1_!(;zbimeEEWE!(CL!RUlUjXQWWC+Ep6uTpoy;F(k+17Zk8HpOxmzwevr(pg|BKTmqYv^Kn)$Rk_--u$$uQ+1GXv1T*JV^J z&`V*f6yY=0=o`Vp#KIpkVspsxW0T`zb4gjTn=J8L*{S`3qjN76iyaCd(f@8H9}=zx z2oW8|rwai&JD>@hHUq`RaRn*Rs0f$=*@+%hy+U2r)M=lTORXf8*4j(-=v(L}QBLNR z&R6=iRB@?M%1?Q}q}7Rs)v0~CXp>##o|()H#Ti`2Xua+7^Ow%2y@YcgI|>9Ms*@Y1pP(jXcxU{!*v%#f0kTe#rBg@93; z2MCBJs2D1Oo*9}3f{F|cCrjDY%}G{D(WxW^qV#e|A04n19UeMHB0OA@}SB{NQ0aI-M%(a zc(u0R;bP1oKxHHszi)Rismw8BFg1IP{yHEibpXHw4}^*xeeyxi%1>VnEY^YO@KWT( zqsWMSxRtC_Wf9CJrL_l<_+F0qSR4T5 z&Wt1V&{dIGp;>_7u^p2?(tg7gG=eqNM$dLva;Z$N@};#B3e<~)g2pCgIVc^6bUgE< z!Unyr$nYQxLQF2s|NF3Hy8r~;UDazDG5T-oy1!upof749S?ntPpO{pQ7rP$pC02qh|EEiJUigNYNB-G;+VP`eNE0tU?R(S-=l}=}p@e6wP?mTedA&G#bl%lvQ5G(@(q@~1QlQt(Z zw2v{M9}F*QYrt>{@w~d6VGJ!9G=eJiLl@#jl_e0mO+e%P#O} zG);iml#54YVKs#h-bFcd5@rjPsiiB=0YMbgYhksu5Cw$9jVzRiKq$rY?_8rgi!?T2 zrwSUQlx}D{LZe5@6x&DWlT6}-#gMTnP?H=L*?f)aS|Ve;;_=tSGj+GUsDpfbJg5Ad z%=hs(+QLcR(fiZu!RiB5L);)!YmZPff<{#^rn_&83q)ihLZN_>5x4>o!3tKPd(-1UzQe>j@mnhl{$cV91wHkvCoJ7Z zs%QxSw2*2VM8;s*OO}l4B_k-|f=m-p7YYqF$L!D^De0xEL}naV5gjxOgM<)po8(zW zS?Ap2{j_0Gy76UYD;`xWx~Ne<8u|0Vt#7*dWp;XE?^}Dzd^~R;z6h2odg>eGVPTGZ zuSc&f?>jOY`Tzc&Cqyd@kPX^Iidh9g7F*0GBeGtZCPbiMxUtZD%kQN%%PBZrB;)cm&$hB%EX`ZzW$49J1<&gW!If4uK#7% ztZ&`_`Cq;`hS6E~{KMmP_5)oxg*iW0_CELv&#{bF_c_>*Y5~G&A3>H!c~X%D8@38@ z$v2t|f*O%LNWslaq@XdZi0(KLiReOvCNbyz%LhjwfK1Sx7({a>$uftE9(fZDu9L3_ zR%;h|l+dD23O`agZ1~T&4&nnDwBGqTsjFF}JE|fQtmD@0bC#--sfy@~@3iW?_aMd) zGJJ*?)me&;gt5jn%w$s?g1*;&OA2Uk2mQOIhb%r6e z6_qQDF=DS#QE@@RqO^GW{I1aD33VZPOf11RAVeiWvAFPxpurEzX!91_=HXmx zF-8j(NV&v~E}VRcXl%B;Rkz*MRgHY1*q5>rnmdiR5t)lshIbzlu@W-jBbcb@=o&f0 zn7g$Z{E^ZwAP^IzF&3P*UC96j6a^d@(1=3SG~_x3Qdi@J0EYuQZq|SaE5^y-I_z?s z>=`RC0SJz&IS~f4Q!|r`K}7nl&=%`4CW!gP7e*FGfsV<@dLo5^#|#BTorSc1DaOl1 zW)?CY#=Ft7tJ+5w8$}}-ec9Dj!&ROxCG@pcL|SXo>|K!Nvu}%-rIi)5C)Zf1g^?AQ zI_ht_zrF4YO2;S(lERn_YkwvB!Bmz4LOK`79Ad-i6F}S2n6YZ}Gz~)UT@%ih=x(J?yk^}_vyIpb8Vgumd6A5!@SR-D~BW)y=wz8e)*(xf% zs_j!6XIZNC(x{YUks;ngG3=hDlU@Ja{cP}UMwBBlKA|ZDmFY+mC9`y-1k72$*{aaf z3ItfD6|D<2q{9&L~oLbsWFrxT^pAuw?H51o3Fq`z%CAfQ#y{VIr#&p_x^zB@-#&D(ba_ z4s`6`$IFvpVZx`75YIPoi8D9bSGRL)?wwo3j)8LxOR-2H9>>^ycO!;h#4EGe5ejZ! zIFmeoevyAVXTc%}j6vqA5>_l(Ri?Rmzm>i;QO&hS0>yt#K`~&3L`8vpMPMcBsEM-sLm^yKB?dcjc2du%@mAd9o!3 zCP^zS)uW@+%&k#L&!Ch~!&7W}y43Xla_{>!m|LgM}RWgeWqv}eq0Dln)!YK|{a z(k)D_*~W7Wb^okWHnjZ5+{~kn!wT{OPB-oBx{Fb=0cNrqP03&F$hqLA8$iZDCnQ?h zSA$U=c_{=UOi2qnv3p3um!X!HokT+siq+XOd6orBE1Z{k70bSc4>>4Fs#@IHBgy8o zSmQ5K*uhzO7lT=c%gZahEu-Wz98H{6K^Drr8As0@fBZ)qSdi-s-5ohlI@u~T)J7jK z0}{u?tWmt3bm&@;GGJCD7tXcE?bPEhLS!<7w#Y6^Z|}K;$_ipQG~>%9DhwAfFJs6u zlB=nbgC&c}3>YvPsiIdF!1&^h_YSAV6l+~`2VQN^-iJlKsD?SWN0*Wc97@U$vB26W zmNu@{n>tblvpdfhPoK)9U%fWXTR(L+cMU!}vg$OFHWx64M!v4VqXoB>knDWE@jq)wEFM=WfFUZt1*86rWv5@~SO~HDggQklD76kr0S{ zBh<3u;TL5fm|E$&3)_;)A;d#W|NEds`~U>JX4d-#E^3wxx}9O@Yf%lGS*$S)A}=p$ zwTGddjgbDRZ9i5aGp0a?1BS-|>l3pmWw-bz_z-h1sVl1@BoK}%l zD+wTFAQcfDtr(J06^tS)kn)e*ZhJ!M@3<2esImoEV+qIXxScIW!4M+P8Agj*wN9qA z)TN&Gzq)*V(=5a%F*AagfzmJp2p{E~|CT0>H zT%Y*)Q8Azd1juDKZM%q?F5xj0oj}A2UuZ^Y45?PDBWkC7cW-9iU&?$3sKY#YT3Vio7HMpJyt^_6t^S}I+O2|-DA&|tW zCcAce02&M#m2d=zp$JRL^Ro2~Ude!lLy1&+F9ZTpWij=|<#Dy30R(Eg7ur*UNc&jY zs7l6~!sC*Y8m0|_RfHj&>L5X-L>iG|rx0;Vh*xwsXCID;SH{k-J1o~|^9$bR6HrX6 zjMFJ55bB4DsGMWnRmE3-^HcRB>_z|kutd%P1VUcbYYan5j|K8zm3>~Q#)kO;o8ZxQ3WH>P3OA+a7S)7`gp3^vfqttlL z^WSS1XYnX;QM%WqmTrQ+kymP!Rjuqc;1RrFiwb_nTmWF)2n9=Q z{{$2TIEHRGh7bS&a0h~vvL*2MB~vkVq`@NvKEe|g<9*Mxj`wB z#H~hM*180JmY=w?3hBMOPFv$jvvMxgO^-5K+A*;%FvLFRmwR20;Q9E7wyK2gu)&#r z>swdQo(75C9Q*AnFJT+*z9sP#d;!C>i2E7MU(R-q;({5Rqo|22*KV)^C@Hw$1&~?P zszY@_NSr5CsWfF-D|XF_vd8jL*)qmlblTQ*^~5W5;pAz<9n^0AIUF;-t zqE<9%>60Sl!Bak_KoPQFQB85S7X@xVEJLn~OqQYZ_t^DWd&P~}kBqy&P>quXl_bhc zqr_T8bXjLnT{W@Xqc+dg>L9OODfC70G4AlZWY3_ey27AA5#z}m>F)iH=>aZMhDVk}BY zaS`ix(M;A!GpJmlKx@2@87EoP@mjs^)o{GVdK)(}R**7^hPE3jVA`sGQNtP=;z}7+ z2^`HQqWs@!|G@jkk!nRpKmXU~Du@U@5M@_%zpo&BbeeeQ7pWvA?>2O3wRe>egPDp=vbMu(M4VB>tk>+i zK@&|hIaar$m5M>V`7AIrPI-M@YRMAsn9`O`E-itl(rDiVWHAc!maAs;TBmTdFBhe zgiqSs|F73v_NgxRMHFkeVP)p78Y6eOgozyUM*PffiAN_dd>g`p6O6C_|K@q?9zZo# zNNzb~{(%(1=>nPg0f=e{04<8SRc1(=&UF9#utem51Y&1Z>kLEKkBiE!Wrl4M1*2Q+ zF%se{FY2{~qHMMRr+cubU-MNMwR&_jU4gJ1=_smige`?a$QnX<5xg>RiN`jsG;VW) z@3}nhx~NInRed^JQlluzyD9xGBa_^wr)H(^Ub?R8QyOPF2v>@GL^m(K#IvmF$Ebkr zu~3`OFSL=U32L=Z;w;UIh*j2Dc@l;VAiQ8jM6uS!IofmMB>+ zjU1+*DO#xPZ39u;p!;6hIvQ&tC3jOrQc&gbc9+E_iqf%u7c!EuZW1-5ia}%NJW}rPfw!u~3HXxOIU|m{H_ILOyn= zfJmZOGH$z?FHHEK3jZ=HoEidLIbm9CZMeX~;bQ3KHCst1{g=U>5Nt#M&b4}^@Ip(n zElB{ADiEaO-c2#&zvf4o!q>-#1uInJ`N4r?u7KeNGecG^Gq(Z@mlptPl@=s_%I~uV zyl#4oi_EDwt)fbIWumju?-j6dafl8{Yj3%g^{Z*?bKzOyG`79Ww$EGVS+@$i>g*lqwKQ$C8$Rs&MQ7dHE(HldfVYj z$+G4OGFKV)E~hunBs`G?bm-eYN?n*bxvU@D-bY2PNiuURtXHUW-{r9in6 z2y6=gc`Xr2WUiDSlpva^K5WAmit=qq8BEc5iPv8tDNRgc5TZk?rH5llcgMx8E;T5l zD07b`ZMvvgIt@#OEYql3)I^tANV<1bh{-&KJ<6S_Xy!PDE2R43vHl>1@lr##jTZsr zOc)87OEH>e&F%X9--o&siv@}rV6);ZfiqmBkWBx7BhG^bxprUim@VeFre*})fKB!v zPaMbjXxKPyipFGfA!HB43!sqhRih8pP>d*@*vZ;NxH~11PIiw5U55n%HAM25hF5oOb5pTO%+rf zhk59G6(CA04#h)CMe4JCbYZGb@$~K`mSWNyJVvC$*{Z<`b1``px&97_9zGJ?T7mSHu=vUwHZEyyZRKIxo{V@1(2p%L>F3yM21IYj)uu zrQT~hI7Yc_^i^MK|NoVrr@x>81VKn-0V5l4@8j$OEQUn?R+*GW zv=r2~Mn!@p%x4-cse(G?L$m&>48N>NCN#d7_?ZnDzqdU;-W{gNJUP8uZb||EGAvFA# zXeZjtKBbylwv$kdk$@r=u%R~Y_TQ}LW1iMk7z9&*1i7qAalE1_nJ7naf3=jK;Fq_Q z)RVaKIW5Z|NF3H)c^#QTh{w26=-;in!jYi zxf1=GRjn9xX~DCqy@ZLqc3b<&EX5*h>LygS=mRXtkr+3 zE7RN4eLW@-gJvqe&!T-qzExqKrj`Qhw*MLd46TF)iUYKxg04!Ws9dQG3^Uz%2|`IK z9Csoi7-td2t{lQA1*r%di6lO$Z_OsQI&*dmD1{oJBT2$6hGto(4Nvn2 zvb`cE5uzm;2{i21{=|>D7a*e>I4foT27tfJkhv_0guHOZ7GBzDG1R20>P6wHbY8v5 zn3RGQ55w}Nw?avWhCS%$fMpn+acu>aN0Qe?9{gi`h-b#BtU|tZ(;6As4Q9);PuRD} zhgwd`lyYAjsF6|_WP<52#v&GS3bMb7EghOmT%Pc=ta>RrEmgNc_R5H2K}zFpNhaf= znX@7Jgy|w_9-=`|1%P%Okl%>jf}dj zV8y#qoqbiTp?Bg(FzM-(qFqBG#ky6e)wt4q(m9HhJgBNHXpky=A5ptf=_)m0YO0>T zqMPZdp7(?4;YJLrXPJrT^}VL9L%PG;#8CWJoU!V{IDU?+qS{5NDVEZ;@Ue%YHUkIt z=PW3X-Cpm(2P$AgkyA1N+?LJ4kgDWb5(o-u5s6G+@uSQCBrh3r8>12oA+l8jE50$L zDdO6WCb#k8m0o8^QmVWzqqg@)uHTpy5Qdtv@6jinI8Hp->M1eHO+-%DSG2`&izm$5 zyvGuX)A0V)Q`$!yuUBycNjjiw{Tyk^&oydP#nsxl)R%cf7N!|s>4!^Jl}oFk8mM#> zD}WMHwm-p>r^!W#*OA^>WB1u@zTz(5&O88byuZjZZInd8mm`=K25o zYKXrMcy5qtiy}K9S_P1OTiyFSMIFk@_cE2Bvar!(@WgAqV7Me8#<3EUQeEJXP$R$; zNS?r>6ln=388B=zf`~~F1Tq6ji^3pzdzB7HD5qjD<*w=ljbWAO#jA4Lnb*BrsF>oO zoqcjAS1&VukVh7ddBPS7x>BOrQohL#%psc8J;C|NtZ4(hFb;^ZZ>|g+IE#aGCu~9R zjEIijDwIIYc?dGW5oc0d_WL0bNQ4?afn^CQ!RjiD;q9Ly;b%PGIVU1|yo->y~NA1Cwo?Ts3o=Cfo4*S_g-m<9J)A0qH ziD_$eqvW!u`t508JP1;(Kl*kYh4b?M@l9iY@DZxC3KtJs{c%PS)oF@u)i*WUe*goJ zsYuM{q-+pEU~r+i81c#p4@aH377y%seZU&aLE&r|8C!a06*zF_L}-GA zY03qaT}ksx6MrJLH9iz!3>>1gg^kIABhQ=uH;%oqX+g+OQQ>-L zS46F$C-b!z$;znSYS7HcFmr&E+@6;aBq4Cx94x+_hG<%9#)4V%CJm*>rIW&b0tETU z-w>~#*hhh`cfpRBBLDyY;O@o%g1n@hvdOt2iliuTISI&SXmJ1gutd&)1R!SDYY7}! zf(x3>V8fXZd7D|RByXxKuIjahA?4B(nr?gOtufUXRaOkM+RG)(ZZJBmyjk;Q^qMUQ zRmG}47}8?kkSLCLxq&Q6omOWpUG;dE%^#v>#(C5J>FPn6b&L~aw(ivctyN*r zm+2yz`Ev@ROvJ1~N1Z@DAtH0b!8k5VB961@4+ME(Nl8PFti+}rD%1zT&S|-E_f;HKw={3xmU-L89g99JJXhW@#E{leRz9-hPI{J^`+Vs|~_n!U+bp7S4 zs9$)dZ=bziSfoFHOyaOI{v>)o)nRNfu*&ET)BR8Y0ucIaB;=9JumAgXF|kbu<4h#W zgB&1c5RQixd=Ai#M-&+>bF`=|1dOCS81e^YAy5pc62>H!qBDuurC`d5m^cK3ZI<9odvKRZ9XSLY1H2z5ms!h`neNp$!1IxbWH|r7a_LMr|NGEH>i`6%Usi2l zUaqtWQQ zw>eV88;>WauhU+sWAdQ0pKX2H_v>zZnDe!6TbaVOiqZOc7VdV34rPT*Z*P_7``^0# zU;F?6)&LxnBk{VXyIZAgnmp$XLB>vV---@A-cEDp%m$zcSk{L!1*@ z$}<929Y%*kmC}_2<)an|fQSerD&uadjs39yEya?psLmuL&{vJrLIs0UM}7wx8gw;? zt4L<;0!HXuuEXKDemg8?lhN4KYG+O3mq*%-sU18s4m}a*Y6E(r^p9P572k+T--jw@ zUmJaC>0zo#UAqv98D?_16aPnH{`mIwR}Ibb9D=10nKd?Y*hYBad$4}+)tvXpR4&v@ z>T1TRzq+}-<@GynnB(~2p80c^Dfh17`@{aGAI$7x7YqOXng9?0g9SAuG*E{nRI<{$ zu+K^WWu{R+b_M1>RBBmGXwQI*lsPpFIx(04Md?Oz zH39_#NtHqXfQ$hV5HRXR41xg{ct%8+YZO&PFa&`bRP?CZ^2y*-(^qQ%?nYVjZqQw* z4N0WZeLJWJY3rf{b?GB8dv;c+b$3CDpq}!@@QN*F8+cm#{|JB}NDcm3lnjNQ!IDM7 z%j?m@l+l=CDPQq_;#09#`QLe?P&-b0otZV5^_jQ!7}n<@x@cRG-03B8`6Rl{E9(N& zL~P@q$(*)e`ODfxo3YATu@)NPMO_z~1ja@8UHL?caj@F5;XhG$YLWeiXW`g(ZgNxk zOxCZnfySWv8z1zyon&eWHbN& z|J+d{2^*jovure^w(eML!yKXWM5OH@8RHgs2YIdmFoqG#fi%VnS94Of!2~QVNmowc zO6L9oof?Bf)~ABqr_t>44PZK#4Y`F1vF#6AgDtCRUs@yQurmo`G>a0Otgzww!`0q- zD_r7~^^@jE*sCQo61&zXrK@aT5_@X8hiqHVT-pvbESmVWb?dnzS9XU>(jGNPHqNyY z_@?)qMc!q$^5^e;Q+U?1{x_fV5?O&6j^ULqlm9QR4MC04Ksr1UP%wId0>%rdIzn*| z1fFp0L2?$7b=2(8;KGjcXFBFQ7I@OGoOd5`QuVgJ_wi5uGynSd_=N*7aS~i!yY+*b zO&0S~Z?CVK{qH)oxTWXWrkx0s{%)wHRA2o+WcvSEp#?klf{kvrbQRM@t9=7(}4llW`FzLm?80I0_IHdSE6P5f{;wq&hfH#Z-*OHOvFf z0_dcEkc{N^%&^&BxX)*cOB<0*9?7;bdM@bs_Q@Q`Im3!`AyY4@MKbda5XZYKrPDS3DGaFg|D4RvMX?(QP=P!H$9Gj^e z!%CC@0xD<)8j;^{APC}d%EG0AU^3sWK~AE!S5<+Ei`(fRaMW9x?{>br4oZnVWKp{7yK;M-Pg!`wlV+&s{#nO zCA-`R0eVkqXyQo~Q@&bf6(E*F>Y9s~Yv9Aqi%pdXB#XVzc0Nr%VRD8&Hr)UFutf0y z1WjGm`w2tnk!!k*W#(N{X`@rDF%6<5u4;9L8KfDUj^m9rT&gIhm8!}t%uORc?bfqo zf11_bZ_|IvDmo+3F>rIycco;S`|>X8zq_Apvh5}}NdGSk4Nf>95 z9or6z$!2^{go8H-jJTSs{5s+z`4 zASRM#XL}`tb>WOm!2`8VkhH9EnifgAeuqE|!L9}*yg)II47&go!wS4~jE%69+2k$%0jofi85Gr8^v(O0RmhQ}eAwqx%i`FD1XAupP zC2Pon=z!6kHu|NPW!#yD*VUQIjX|{&UGD>3Y)*}0_m@KHGb>NX9eLokGZ;H0xg0gd zDdot>rqH`dCZ%R)nuNxVfvH**C@#7{%i-(9{)J73Ac2G)NFYCy{P#^-PRN(><1!94Ku22XvQc*NXNQhVn zOh^Ora9A^Ns2NGhf}Yj1c3fLnquJd8#FQR|8&*8FLK_%M=8tkL_mmu?>!I|cReFbp z;gtHPhNfp%l$e3{@yFL4O53Z1hgflQ7x@0Ib-lVu?h}>tC)#<7q&~2fq%$-%OMd?6 ziUc4dM#zo1Chr-9$?7&z<&RxiOMon?hqPLthQW1>DGWd|3a9JWm^P1g^+H@G|ItHyfB;P#u`aHu=%*@u}$z+(cLdXBdX%~kOP=Y~}gqo8{dkLG?j0@VWVTfr_>6=xoF%F_8FKTs@7PSQka8P+HgvAU%D(nS3?J`w( zv6+LbK;k{Jxwe^i2fvULQi|?!l`=@84Az$Eh-@H?7Igtp#W2H#>@``_vT1DjB~L{3 zHU!abQ#?ky))i&iO=UZ^xm)i#b1+wSI#k-Cyd`(Ja#^*g`n>fgq490i?#QMjMdA+| z{me9r3<0Wv1V6AQ+_LT{QRfqE)&kX|i(xR36qliE6g?HtWu~^yL=OH(pLlj2k;?UQ z4$o|kp4`goqMl>n4uv%hdiR?8|9r zzL>wOn@TE1$;8&^UOaCq_R&z|b+w-yvvq%M5!Z8!F&!#bPZ$CGLLc1Kebh%-)utT) zAZTGN*R9-Oq)r2DY01uA)T>&-MA9+#c9N|Y1%0Iqp9_$iEDgSo--}s*?ZnTp>|q<& zpkE-QVX;s+L@cskbs3$Ji02J|it6evyA^|4w^WE#E%zZI`e+(+SxIi}wx~yST3Ion zu$~=wl3hy5oLQCr?vBlh(UIAuuAuls8^6r`XQhlt6)BB?r(+2)9ZL)X8Yqw>qq_u= z71LZHLf}<3S7DW*sD^NMP8$@Nok)wWXfMU*FTVlmZXTJGEXyOUNw*;6frfG)i#x|o zv|Ty!HR9ZBAk!YsHc6&cu5-6OILp{ z63s{Vy$jq(CB!#9RNOp7ydt~{#!z}BOH$bX92DTJ+63?^8cgGtcvTX?Pr73&W5MaYM1x~*Xatx`RsS?n-FzA{h zQT7Ds6QO(NLS-~;AW8vdqM8fGHJDeiBh*J@>{!*2(DesA@r#XQQO_I78Isgo+?g4d z7ZFOg&maHs^?1|q1K;Vp?8OeMBxKF1-`bD1A5C=rmxz1{130okvrf{iXjU*VK$#*I zvzlA)8h|WP@s{v7jDQgVGqZJyg)0>$lF?qnE-a#&9=$1hagJAkEzCU%`f5b!M=V4d zh2YiP#O$mv8IG<^KGYLkjGN=Qh>=P4F?^`aG50kjE5QmVLpql#I-@gDO209zyVTAw z?#swQXBI|xEzXXLh_S_|_UkFGp~Sexm>r6C*L78DXXD5L4}f5#?lNn z+9ct0&^aqn<-u-+&TdV`)s#a^dj*omZz!Z62xv~kkZ__y3PHy~u5t31Jn{rvJr?yA z@t7UwPKWKBwx%ZQ7)hF7)@;oyv4Zw=4)Y1#$5*spR@}|nPZQtJTRe7WwVsyBf)O^O zg&SO4n~g37JbyDEayo(U2TvrUREz&_#n6IT>KV36cSC^23x5Y8Vq2|($sr3k7UF;y zh6w;9l2lHNQnhelj}?T5&^5{lX`0Ip9RX}jiLHwY#ISfDj1dQBQVpdMM-p->PH59& zNqp0C9O3$1Mf`QS4|=4GdO99wNA-?0<}@l1(w>&0NvW*8*JqeJF>3^+)~#+LUPc%$cUD%EOEh}HU}3c& zKp}=?2%L7^*$`DI0xF~eU`t?Of{7w!{sx4~wi=kpPVY-t6G)wGvH345Oj6dx++2Eo z5#|Q9Lk9MZ%cYfsX}s;&faGdau3gHkm8ofRoKHiBL_I_iEq!7Hc3QaSg}J}Ecl2jX z?}>#Su^X4dC1vQTDUOHP+Ts7WNd1N+KX^e{z-n~EzhcNJKcG%IEx)=#5TNjcEC{O+ zK&kro_Yasaq4Q%!N8xA~tg*!X=skdi4fC^X5E7Me(5x=4LycDJLq&gPR#=TV(P zy(cuRvhj0K9dQk)LydOHAu^k~h3YcHOi|UMi35Avtm~X<)h98y3X>n?TWAy;tUXHV zo38Pr1JEJnz{!pnN0r#E8*{DIhLp{rIepL5B|q5rE;qmb^Z)Uf02@d^xU7HG8Y~_G zl0=L|;)tjyDEB#zAdqMk-4kSrty)tCrhKmJL&9mHHJCV2O(v?d%|>j_XAtLhpo|iP zElN1S|NEds?0^JXT~+%DMVN#uy1ij2ix8cgU92Q_qCm5%HI$-cIGU!dEIa=bTjHJ| z7ME{yoF8ZnR_fTqs*$}<7Lh#PAM@6nT1b}Yo`)B1+^myASBq+Ss(BIaLt0L}HORr( zOk_Xyvh5K+Ra7}@0Nl22Cf$;L-9#ro<{<3c({T83(y;O{zi3u#u00`kk{z~G4ZPb6 zcd9W0gWy(*S_*|_kOM?bP&%QabisSg2&_Vx_0GnQ3uWB;k|>{1;_w4WQ-lGel#=XX zG|JaAvQu>k!)go046NCr>3ol9{rj5e=oIOFys%Smec zrnqv69wVkM5VQp&RDrmPyF5*_)x;>Y%*L3_R*F%Jr(9B8y1MR6TsypDV5oF`tFJ}B zTVb`+JG2kI(S65I+pAvtUpC6_zG^y~r|T=aucYvi^?CWeZ~kr%J4gVe5XK;qZppYH z@)Az+jWi1Zh3z%gG}0=YY0hHDVtO5q}A!=u4?_1mQ>szHMy?o${siD zNp7Q?v8&mxJHpk@&$stUsfdTGH&*$%Ir}y*5}^qYLM5u8wynDVmMC?XN`(kJ$~;C2 zC2E`$U`cBc2{-;ro4oVwx~9h?hg3_dK=Q!)byLcls?p_E*EoDq6`HnD0vZ&;O7E#+ z#1=9iEp&E4@cU3`-c@2cy&bi>reW`RiCGD2Egi~r80fiAna6FTYtM{?RZo_f0E(@U zq~wy{aI&Vr4Q7=XRv0W$;ylP$^au!@3h8k?o*C`NI{?X8Y{~jf8FrsKRn9Y>+sf0| zt*oDlhmca_G-VbI#x2cW`UN21Ilphf3kNG8~lxdAOHa)00PrW`-VZL zm3uQ+t!*oO0MFa%*O9V9E?h>4#6~rfMA?mm5OPQ1 zNb`|N3xx-y2oKBKdgZr$imdofTUqbCmo=T`4DGP&W4&EsvRVKC{?ESWzHmKqv%}}z zXVN_Mb7{7pe+~O9D?Vvmgewb6Av;#<{bsGa&zgal$#BU~jz@0&Y#1B{Xz`nh0vAyb zNtE?FXdWA+{JNGVX_y`#>NU(aTW(Om<}=Zdv_h$(Dj9W-5zhNKs}F4W zUp?;N&EhB94h8e7>}40y-RiWnLpyF}xmmrYU~}3ev{1ikM#%Fw@{ukUF@g(RN0Adx z7bK0l8&z@X|NF2+)&K;hX4LBsLh6%E8f|4JlM)4cSFAk?qBXGUb(EH5bs_*mcyeuI zS5-(Ah#K7}IP8*sR1nyx+Fcrgu#cqm46CF(%Sm+E<5wu>r^hDqiB;WEm$7?pVv)Jz z>#HRzLJy?E!YYv@Q{nyKn)5+~|ssE6nGYN2lCDMhH+5T4qLtk`Co z@9Vv)BOCbr2ow4vL*K{$^ZBd-lw`1ymOaEo1vvUqrZ57ji)x?-Q>?^tK-~-yZfvvJ z;*`>eB8c}y&GPYXTU{|XPNIim0xB+0T2Nf!Xmr|=rR?~TR9!^O=|`HfX~qn8Mz&;g zmhKl}c|>HsCJdG6W83%rezW}6GP1||DhM|) z^GPmE0Hly@#N^$(1y)($yi$xwt3-Rlz>F#a*DeO>Pz*fcE0R#O3y)| zG9f@bOiBo<)o`Vn#FRZuInRqWGA`AOh_TUTe2+M7LeFO3d~x0`dupxHa`5~PMf#eG zRJq>TVw!5!DaKn{7-NsV>n;8l_3U88*vw+g3=s8Wo~QY^nEO8K9tQxp0!g=I{pt&y zUjs_2<$#10Nd*7kLC!jEmZhVdz^C!J|{GF%2S1uWB`eBJCm_R+hYz z3aKns$Qit*r-NyhRJ%9zx9ucpx=2IyjCuPpk3ArYM|sh8(A>ju%|LX%`3;1`fkE>4D^-5f(Sd zW=O=Oc^Ib5tBe$;WK8@*Dl;M$Rnj~(bDb@`%j@KdUbDWAcO>AtK!Z#nBYM>nIJ5;9 z^bI*R*ZA2n#G08#|c3266{u7*DpE2$86 zqM5}yF-@`>>$1&}6;N#?acl3dZqTtcN!K{~)gx$>bc!>Q#t%wM@3`yJRcT{5JH3{DI}e3fk+F6SzQdC(}2Ma*6K55+$rT5)Lxv^)n7GYun}<}O7q2b zl(PE-TOlNqlV+2d|NF2+=l}#wUe6e*oIC2G@ zwLkPt*Il;g63H~9rkFyp5}@dX?(fJ}{MjmrGZs;Z+7xBatA5vi<65Rw+bt;4;fk*@ z|IF?m@BhF0-{-|#*K4cVmEfW}@Ns@l?A@DVvGDy$VnL8MMJAkf+k_B|0uFdfU}5EA zwn36jl8mKcl!ijamprV`Giu?!@C|p_*0Tku+nbEsP;~$>g*J;2D%PWYYr7ILl(SM* z5iA$y)LqUKcLfjN*&;rnbxpw%0Hr$PV}^%8Jt!*W6`hp>e`t2O|>GRl5G&xIjje2=S)~v6)nT6H3$~$mH56s2Ka^VR=B&!9omAsm9ci-8$`u+6BQ=~lF z{c+0gxIYidOC|8$m%cMcW>*kNJT5p)woTLQsb{cF_(lN0Fabc^FU%|_)W9MWw&$tG zMtU5zcz8@^4n+O>i|LoE{X5H43UNei_S9)xOhXmGNxkS=cW)jeHBhJ<%j66(e*tjL*5 zZXKgTN6EkB=EowGxu}3dK_vG)giR=rd;!2V8ZP-Tk_pDhL-KYReyA+vLLBKaO!;b$ z?~;M$rdBM9%7mbb{%2mERLhR_ZnweO3@L2c%6VW%)Kbd@AL0S^`%jABaO(LUMv1T| zTakpVv_x!lwWkX&&yR$ggny4as|(ciH7)q>zR}x5C>7{}F$HFP0W3KHo}kpAH6>o7 zKtss|DubyS7Or)L>}h(Do$}Pl&%4lEzbeH}3zn`AuJ(~snaTABvX7$48q_pY0}IDJ z=%a=rPoL;(<*JMJs>E40u2QrMQ|yiJr3Z2nMMIZz2tdxW;Df}=MO$} zi^CeRJUxcMf}rG>BAkx#R{*-i1ay{NMi79zs6o5k1`8>siB>cAw<}v4Tz}SzPI42f z$)tjG5}mqnn68QCigqZ{(@C*BO@tqE3oWkPk-U;Cu}m?#OE_+BNh)`F=P^^;dAmc> zVkNWN;f(FC5C8nFk9493|2^IayAiurqw!?Dsu4P)jV|slmtTmKV9PPX#5!`?9_rEx zmT9Poc*T&$9X2WhmvG1S1MC9&6A_dnzg|D#dxePOj&2C}zJ9_h_DoYpVkzZfB@8oS zhTg>u{GnlfVty+1&$hr@dr7x}cb-E00?3*`*+ebPp?RoD&Q;o~+1hR^XF5rt&d6XA zSx!KJf#q@Xf;<|n{X|uEFdtgy-2t&4`5#Kf@P9PLp2?Gt(~d4%H8oq~j23%Gk^A@< za@y^m*vZ|O%C(~lSwFeKGM!Y#-}e4&xHrM5Kz5ROqKXhDH&adeCo0eggpPY=Copj5 z;}^J#?!5h{rdFW1FDB=LHPO{A=3n2T3nnPhc{1jLFLNFtls|x}! zZ>~diVeYH43VtiyU4!2*@)h$*7lM!G4=k^q37L=$jGbSdghA60cRUTqF}z^-=2&p0 z?~M6={TVOqo4xRRnK1cPUn(_sf}0c^Y1-vlfjUiyo@fHSu77=DVm$AqVhDv7#e*uz zV!FDkYpNMOXVaE<-BL<-^3w`bjLHB`Nv5*$ur=LugmnYY(E^)8;&{EAs@ISICV7H~Z@;j=`Gws#W@8DYF4IFZUa3_l8+5l}U^Og>{44m*-)9m;xATD~oLEAc_JjiXPj;6=cc%8zU^Y6#( zDiGG%V9c*(4n?7x;ap@;cOf zosWm@xlBns6vG?%^3`U-qX~5$@L$D2d=nI`G<^_RAEQp!AWUYRO67NrGfp(7Ppl{1 zA(?jt)l^u7XY&^mp{?jlpT%WF2|$Rj=07IgLicA36sgk3_9|fprDoW!xcDlO`e7Ui zA7EW%P|bU_bo2OXYXysbfpS{)Rypg8e146*1oJL~!&YJxR>bFz{j=BgeC}g6Ha?7a z?^S>CL}ikBpKGuDDxKFlZ=^RPy1ScwYlvRB3%NOhPs%zD_471iiiB-WDBEpytS;*z zltu-^07lG!#nP{7#~`G*VpSClVwNy&?uBiZ1vB2{B^t?|u<*vYt^()VU{6#s&RfCe zqQ$G*BB(uSo)GD#Qhrbrog%-!t;hYR8uj71*~r!$TgkGi-;MgyLQb1gS`_$>wg0*b z((N+4dmnq_o(CfX!#o2py}k>!EpI5APKA+IGtzEtt~1a?pvYtZh=XR+H+rszbr&>h z>ZR9x+{U40Gch#(^=307gB1KYGe5IMe* zkoMQm=pwCFj~f4jBSAf|^fO9FeYyG;PF4A#)o+Nto}QEv+hukE0q!NBw(!^gs{cMn ziKL>94Pdm$b}5|Kr;?DNWa)BdNMH)NR5bzmhM3}u*NZ08G9bDrancZ$t4WL9b@Z8h zrNNKWIl;9p#Ma04s#QT%j&Tmd4@PLJtl(oy!UuU_wqT@PeEP#gIedW4c&_Gmm{MKR zIAR6@W)nA_COiFLcNbLqP%wWJp18TuulXs{FJ^@K`#7mAKw_1L)ML^MR?>_;(L2$X zt#PmUp9)3NTloToj@-ZXFEunJO#gGE{~G{n2I*QrG%rD?S&+0b9~EaGtusz^h+`^b zB8~U9M zP{AviP7CR4NkAcfLp`lfq)}fbJRFnt@CBlxWyT>dVk=?3(NV{rrQdt9**3G^(u~Fw zQT=jx?Cn{!*6AFvSE_R`l~_Uns~B}TlIc0{cs$zKH*AkA;1S(Fy~O>U^lI4F<9Vp5 zBwu?f^?4L5{c)2s4qEuQ>+(nNDq%XEPdtZT)Yr7x*?vvn#lLF9A)3Cb(OenQCVX7p zQJt<@ncu-^nljT4z0*Cp9UYpFhvq4fgEyRadhuM*9fhkl3WnR2#n0%2M`3+oZ_fAB zYAUb*6vPZLM4^xF0la1Gf-MK2&h~E`>v}5hPqNz6RQZk^ztW)JN*6J_!B$VJ?RpV* zZDiBNXs^sB-ShpL_*@sl_$!U~^md|r)ac<7TpTO@ST3*_tmCfej#HI$xW2=bJ)|XU z#e}8GQ@Ut_y^j`Z|h3)mF z#jzGDT{L-rT3Xb0y4LeJAsD#!K~(Is=63+N2+PHDi@(U}sB1r}tDzX+i6ox70+64m zD!+V60*sG+XP#VHdvr3CDYg2UNU!pdlRjFbD#k+AujV5PAVB$Qqki%>5!w<`7C>fC z`Fkz*cbjRJfa<5xh;fozC)O7fr_I|bW2X;#)0-+7mFKeJoQ8P!8NW|=`5$iGXF9Q) z6X#DBUd&%7O4i%j_3vbg1bjYwm}75lK}ep##m)iWhD{D$*Cs++O!fbP5ad%=}un1Lj`uGre_y2e~ z6foshbw} zGC4CJILK1+Qzi=HsZ}$V%^lMU06>X^jm-It3NsOFLY-9& z4%(j5c>W+T1ecdLH}i9!aj?VmcqDI;vGfKptT;3c0Y^X)=8z2{3L-vyATT>@(ty{n z&qPd_Q7jsI#47zHu(tUL3eZ)d8b&Q@(N!W_M#P4UP`JV=ETz6gW02Nt5`1D^ms6gp z5g>N6QdSrQg`bcCCt|oP{f-xq&ZsEf7siHcm=HjiT>rb>ug%Kh9}a77W}@t&%fPvw z*75n5q{#7czozmUg9uQmgM)AmU%Jg$H-ZpWL@eLarvCX+`u|nX$NT5YtpjzT%lH3# za&fACk>`v1b4-245=^To8^~+cdR}Z^h?!?*Ls~<}iWRC{Fr=b9XGJ(j$g+4FG0Ks! z@SjiSHUPCY?Cbk?V<ji;U@7_i{!7Xj5kv@wLRNpLgGQuOi z3=W7{GD|LS$c~`0$V$3Qg{XI)3NIM$K#e5hpSdU+HdQ1qDnN{D0uh4ntg<*VUojZa zYLdftpR2g2fRCn3-okUA=hKR2Nm*>ip} zWO*B$CK~WBT<&*C1r>9=!j2l-Ox7?hBm-6)_MA>>?AXsX8Wv(Ez+W39Qoz8`b(phx z_I^zZ4h`ODUYDxxX!6|Y^G2PI($^Dbjw9_7xwTe#U(%Pdx4b^OEnb$ts3E@{K4ffN zE-&B2TUCG0zqxxkc!A`J{NM6=^56K8zm&^TP(ZnWQVS~zy&fs2%)w-xz}Z6^K#AtL zH>Rv0TRpWDLy0&ssz`O#uaF!uIg6&BgdU|gYYj45RQ9o?p}$e4kF5LlCj zsDOtUfGNudjaWDz@U1OS8Gs2roPT&`O@a-@>~2K8p(2w&I+o0pn#4VSSEw5%6db^W z6VT^uNuL`|H4|oRU8F$s`MqH)vsV@#0x+abn!SkLOWwJsj8mb+S_+1%%j1uYO{r zka`L8??NJteBAp794_ORVroNZD{C|0a{v^EcL2^m=apR%N!9gm#L%b6NvVhm`B(P10Rf`Z;RbD@#CzEvziJRO2#(n!#(pNIfWwlgFIq5 zk>JJ>isBnAk-VTW3sH&S<(B8!jQIJHcE`g+@#V-tIMe~Epbm#T#?%P!aMLMVEjHq$ zA*{$I3GZxGIUU!}R%$NBPXR~dsEV>gINU&w)%RGCyCA&9(#oG-oLMwKaLUlwSoth2 zvdF3+Kl&kqF(olnTLV@?k=_!etPrpQlYoFHfH*LYfYdBud6uhqi^J#;iHjIQ2?akR zh;GRU7X>#}c$6TBRcNfE$yO?dXQvvMl-UuDDY2%*Sjukq!XVgFSh93MSf#4C+OZ_3 z`!gu5BW$G<&+uIi-?F+#7l%xUqIEm5y3XvP^}j9#pnfH)bD^elWDpU&2Jkgi)^Peu)Cl+8*S1;C1E zu6&pPko|^rx6U{K$|@)t)g1F+oT~rCHO<3Ida%w03rV2MY7C7kT`S?#mUFxN{IsV` z8`l+nf@>1Ie(gub9$e<_Zxwa#p=b}|vqrCRA2G^KJA6jtAL+aIt@_)mWXl#5(2CFX~vbwRnTk;XC`j~QglkoyT`P{x$rr>-LI2RTTk!9uQ{aFxJSyLJZk!0YJZ5gXdt#nxWMCey040`Lbasd^b?H1;p(?I9OY5G zDX@D3I)aQ zq~_+CGL>ijFO_9z$r&D8<*GxAvW863@v3<;F(9sP;CJ8gb7A;@O$M*MODvmCF8AGr z!C<$)&myU-8d;yRLVB9*>L_4d+z81YgJ^QLx3ET^-+g1y;5y~-YU{50(tZ#|)E*Xu z^q%%fdg3AG5BmzrnhZIuu+o&esYx#8G>Tvr5Qwrc5hDWdVk7M;qKQBIKDMzi0Atvs z;z@-v3DRBF6OVY>T`}v=cPa%(sjF0q;^G%o%o@q)8nvFcmJD?L_?K2M!qQzO5{X_6 zbW%y3F6YRKuy+xKsP@Qz|5hcQh)!K?Q)_BegcZl(SU@TY6g8Sipq!m;sq3vl_P$M= z$=oZ&FTx~+zkaAkGYv?sG?`)$LQ`^faisLJAi@wA+@`#dmjF(Z+~I6FnrP7v3k@~5 zP(HRMc5J>n%%pC{w38=lEq1ArQ#D~kN!N^vtTntFyeoNlPG_Y=}ooed#T&qQlZ(-x#CvUz_5GKZxF4tTPGdY znFx-$RHNy+GNU?VaN)*((do21B8B@+dQle&=niW}YpF3;l41S4suSX^1;sbL#u~%` zbBx{r#6D6;;aJG{kz>cn2NIHgT+FwvFB)%Qsc}#yE-*3AR~|*Bloio-7*0jxl)xb; zxYNO=leQv$^DXY#pUOC=T`jX5C1COQ;sUN;KT{lA{CCNX1OQwmf_9TGl{>=d==7%a zPI0uyLii>FD9{1=>9G2ILhW*EJAs!3WLsXu;Pysh*;9qbG>R~O~4W`!=L`_4&OE^ zZuj;*D|Y!-|30~mFaKqwYjcau($^N`YS7J!ZX%Z8^D9f=aqCIpLs;{W%VZ&kj?ow0 zt;mdh^rQEs`u9r}HT0d}da}-AAzUzwI0x(xSp|-yz{mhU&1+}+L3Bw(v=hseIX*j8 z!QaeX3>Ak$xJerI49N-fC9o>3$!Q)r;{%Mf+b5>^0*OBl%u!z)_dK0v7#WnVwuJk zn*uim3+P@q-RlHq$$uBbh;hSqs5J;kZ?jqhk>F;1b9ItT|b?4@S^90WGttOt>!;_*VhS(%!scvZmgkcpZZ08X$VCx zQZBqf4XQqgCvzE0v)QIKca0|;_ti54c5E9GErO4q*AJ4&Ol2yj%-a0j{kj!dxO}%< zudxP^6ic?M#l+wu*BC2VlJ8Tfh)rOUHlw0hccSsfFSVsY)WTH5R6LQkHpDCy-8CJ% zS|$G(28>{L1Fa* zi({U+!YoC1I>s#P$f|W0R(by|CW_D51)XwHG=bAqYxMYX-z}aqHaTGpkEe3-d-J2; z4#f2e2E|9JRIoo2;qPYW%^E*iwo~W*==7urvm^`6GTu8|X zu)%%A4?wkEZ{%_xM&)g_p)RYE?Pn_pp^wANpQ6vx2^^r$aeCJHwYtV)i~EV#RBWjq zn+6XPz@a4?AVWS-pkN%!+^|LW)!CG8zI|%2$g}lh&D*6xt!rf}HTUU_tNt|g;_x*; zIgjN5Yk=bNU+*JNbRr=sLloWl^E<3ipS_TCNro(MAC*)I8RLa|;eQpk5ddp!pbqhn z^Nh8dh&3LoQMQ3NrgAv{H_QK#49ro{1h!HqTLx~&{V~lhcDL8oWcnUtAQF}tfiBr} z@JmeaB)CMMmrk~@gVHSlJ*``BQ`Kd7aYe|0^8x)k$7A2^1CkOanuH?ejj+Na4b<@?5iX^^h;b&Q-ga|N zGS8`qD+vnC=1)xW456CkWqkI&)Sne!)H?lNG?NqI$oGX7-*6|n*wPwPeIj94S`kZ~ za45filBsw*kTw1Wrf2Cq?dlJpD%Gt;gfIBZR)oFRHm|G$8Yi&DI;vTNr(g-%^IU+U zUegi7GC9Y`Bef-FvirQJ(2^}cU7~z~b&xd`9WLFlyT4s28S+_j0QaB9_HM#nS|xU( zD~IXZ_gt4>U%P}TSMtjXohUOTK0lGl|8l_ZrOUibt!yuH+`BCL{Mec?JvOK*?|42- zNC}uU?;J!SMn|?lhZ{o&7PiPvSr86+KImh_iX>1x5~X3ohbyPx?$7a=%jLo#pBE5h zk!Z?^t@FL|{cu{f5vO-edVe&EO{57g+8j3`@PTYfm?yo~?lQuu1w0fR@I-5z%1hv@S($IETwTxhkwL-?@DBm3IsyN=7D2%r7g zYwuk3Zz0?|npw3AaVNc9;ON3<1??2x2cxx*9gh}K#G?Q>0qPAFl@3bR3HxR=Ys6qT z=z+$i$08eArP5{&38Pba|H{=G>K!9@KTCW4VBFuUe4C>UW(*HwFS>8bx(pV73??=xB$wuB;?cw9L*TPrBsrU)#f0_Z zi%>X0kkjwN;*M>J06!wT6z>8(Z^!Y#(H3vReQHSUp0eVYKl6fUOtSI6y=N8x>ueb85#5-p31|L#npnyk^AzOp+RtX`FTcXCj_-f7XE-s@frZ2?**of|OsZaG!8 zbrSOyf9HaGsrvfy{w}F-4R|3&W8}%M{YD(0#ImP6I2+JXbg&)}Et#nZOuOUGHW@JX zNHxUzahyA|cW_);bUj|RfmGW{M37-WL>#2Zt%RgjKvsNVsM$K)o8(%eSz=1DnxwFithT>}1VN+xS8+=aPTO)3 zGUw_DQ+SSrxZS8|#qYonI%Xr>9iz zOu3aqG^toyH%HMKaQS3J$6L?%aXGemp7(dK(CFvy8tf9J9z&^x)iQ`>fYJS!(j|oc zfjB3t_Z9?;R!9pb-rMIWC=C6}p@gc09)gPeHs&c@ z4XaDf(ZFPl^^A*)CBzX`>B}2-%tZB6gZQpOv}@f@ASI)R&XD3J$_YwPAY$v@>o;pI zEZ_kkuBM+(t`X+bRdbXgzGb`Kktr*u(mxPG%E6+|S;kDX7#$5KJ&hbNzWSfMQKQxF zfKzLm53`^?WXhUC?z(>CN-ddq|9ofi>4B{2sgb}x#W>y@F53`ePF^4$&b zh+@=)1^I5r8|XwujU~rdf^TTB_SAW5>?dTkJ8{`ez*vaWH|VZ&I*b<|D(d?X;Hxp^ zVEETX=q9-GpyS~39WHuY%y{iF#Hq(IX={Kbm5En#JY8v zEsA7EvIDV$@mL*Z3*>%9i+&#D#W>w`#(nesS_)z@y&u$HbnP4=;b2?@VOkcAXX%TR`cM%HQKEIehs zLv-kDo)n3xiM4W0?6@gNbyeNfv8|gb%xj#(s^`MC+woM5-I^lk9XkEj3IJ#^9TR&1 znL^3Leg@pXhX9vFv3!A#%XMcbsz%jaVi$7om%BqNm1QF%Hzpn7xT^24aE=uFmRPav zlR`Y|t3UJ@U0)6P#*bax8&&ffdTwRyu-2@9O^ZdBnf_Q7mlD{$^jDpftnR|u^ zxUp_<-Z~}Ff~&3Ved>PeuBmrtu#U2{Rn7%KF*3ZdQ+}II5a%#ulG02Y=iXdmQA~IC z{MFFrLf7U0@U`xepwF}^`R)OT=}e(J2$F5`!nUt?S7iLs!pcUiXS2 z_klNMg6R`^)tmJ+`1{%0dEPt1L#Mnsb<*?m7RB|#R^pc5y>0xJu-QGu|bL)F$Kr&2tXz#t*2C>I^pG2d#F z&`Q9LBxk&6qoj?{cr6EWN^-)QB-i}9kv*drE3wqr7*dmwu5?*MvKeRKe-(ET0IO=S z>;uoHom36UKnM#}KK4;nlU9zH6 zptfuGj)Q#bk>nUt$I8gp}~rxMOIcB6j@ss%wNe;A zCHAxgRsd(H!vu~+iTAVa+VOfx8opQpC^C*VzHfMrf06&i5kFNndZhZ6h^Ah7$SiW2 z1m%bLWK1lRf96S#XBy#&>{2F1Orh#QOGI#5uGuzKxomm6O?dCYR&$)mG)5agjP}=Be9w!;3#f-|4=-@LA-m*+a+Yfo1OI2xs`2;m2->j(Rzh97x z&dq#GS`3O2P{@QfwXL5)aI)mdm`n>O(rDu5W#xV!TMI-l3P;+|A&ncCM$yOt*rMC%~2r&ygDY@oN@cK*CI)qNmR(M^5l`(QaCPB6)tAf1H{b85OReOZAT7 zH&R7DO80|Bc(=f^xBw8%W3eS+(0Gs(Q;cz6rlnjF$Fi9eFD9cR7u>&hbP%*$F2?p_ zoL8AVBDvGar5?!pbddAMqQ$Iy(mBia5RO9JfpbXCA#`98SszGL^1@UI|I-MJf+vG& zzpaQK*^+cMFvM6^>lMYbIc=_cLgL)U_ONnqOZec#`Ab=mn=?UyZ+`M&>%YBcH2~HF z;z-XfVV#49Okly#f+JR}c1A>41mZYu2?LtBRVe2Gy zK2b_aVHQ2RM+KtFGch8NaW5q4$4yqc3Vr(^X-roGUjJ?r{n8P)hC2$qIf}L#uGyuf zNGdYb^I%*1MWK^`+S?NKvtU#)b>VU4m3?j(FR7q~K@k-zXUe~Ro3f-<%>@&J6Yq$w)cy)568}T-a_klWUWl@VXSlq3_K$^Ec-i^@ z(S&yGD?G|xHQT;Oa3it5mXM?NKh>`bMn=m;Xwz{zJ>c_mFNx_m%?z4%pTJ&w`e77I z7Fo?AUk;0a=~(4?Bwgj%&3kN`5LSupW?SDjF7C~2S75t@Ar+>)KH-V^*B}p<)&sY+ z(z}oR*uoaPp!bR@1_W=|V%9eI&lpGnZ zq}m4(fwzrm8_&tHdd(MGCrp#oBt&rBDM@Y2FWRw_QxBat>pTAWqrRv;-Ekd3Nm(kf{7xJ{?60V%izt3QDehLJ1r3qI3hODdQs9;M&;zGf!_dMOx zpG_FIF&!_hz)rB8AVoxW51Zffkz1F4gmVOx5yKs7Q7P6e=Dk8X&DuM7l={DlTMU53 zGhBY5#@9|pMRtI6OjXc)R3PdnQwoR{C7IlJfNM5zlFYsu4~89O?SP9fqbc4sQgTiBE7 z&L}!BB^A3=`6hm+FvBM!t+MNJia56&Zq^Fhn@&4nt2Ebq+ui5y53$+Kso^8jKs{>6 zSYl=^tlMhZ;m>dH){UPZy!k!!or>#F+2~{soNJ%H{OWvXWIUtdwaIi?zMyt#0!YWC zl!-wPWf#XJ7Y|f0tCW}@=hOz-t6UugcUb6DZ&oas)5nQSSWS7jSpE>Z?95Y5u$0R8sUo30f2Hyvzgw-dIHmB!zxj^wlHGazSw>j6 z!v3mP)!LtAOQ+a_+n>7<(XGS3Fk#739l=vAechrx76z2q2OE$eDCr?W11Hc?&=-yL zlV7gpt3x7nvP2zRd-5Xd8s4Mi;vw-bastM)3Fp?Ps*OH)jGs+03CgzP3ZgY53e@D#F$QEUG+y*Oy&z zoGfA^erqr{=Ox4?ko|d$uMMbT(*KG9O;ZE)@Pwl-Yo$ouKD}PQ;u7_<7p(kEzt9yS zmRN#+l`~AQWO_(kSP%6DynRxY1#ULS`R%i`yK34V8BuwwGeU}p4iDa_Btr4?E|lFY zA%T3Wm7)8>Q8F=FPgP9SvYRGjj}4XuZCL{iko1S6)2i(zs6+k;hYIiE(a z&cPXtOJr17#pNjNM(${c8228lu?OjCw4ZX-2?-lWEADnEnq}uvCaK1dw0!Z(kc@s& zQ@OX!drg{R6D?q|qgIHOkLL<>^}(AAupZ1JuLwJd9JANZknE@2kZ{raZeoc`NxI6L zrC%lMDxS%Q6qUmBME%F9ixHCwOEe=v9$_psxsm58hQeLF8|~&!eON(%^w30zi2S6! zK=BWJT!x!{%3(e;1^1gwCOEcBYU_Z{D{ssCcU<=qEuW>#Kx0ixU8!Nux<`6^J9_Q= zN9&p8mogvVGi>l5uxqK6W(5dh5&_4^>_av6I{~|%d36vP@Sd%DU2FKTr%EVW&Q5jxhrCDk>Ks2ml)1g(vnh+i(zZXUOKl4EV zth9=T50d0qJQ}ir1#LbS?GLpxj$c3tHk%(QX>LTib6}6Qn3@_fhH^KKd*BdeTt#RR zBjG`Zo4jhppdqQX@6>^oXfekeXsl)i1Vt{riH|=w!-rfo7=bHZ89@_+Thi(XX3n7; z3(K+Ci7%C%!h78bEKP1;gU5P8^(5>kJjXett{ubF&=|3sIK-?ENG9NR|JpZNJ1v7a ztAU_<3`;u`J8QMfkf5G+QLbuT1>p9_Ys!sl0VjVQ-Z_dC&=lD~NMyc!52 zrN^zFAOkw5GOR2;hUGmrA(YgyJj$X9g#=ju_nfV=g79H2fw)U)Tcd&|0(r{%3?qX9 zq7F2>jxE@cSgERkQ=!dO)iw;C6^_OF7C1p6=g5g=Fj?3N`zYOBEnY|)G}01t85+{_ zd4qp;m%!b>{ZCa|5S3hQGB;mZ7&_t^c0p{RVaYMsLbqzDSq>U}*bnK|oQ;2SyYy26 zWFv_&@M!{u%=cHe2tQO~XX}244P35lJj;|Xk6m9C$9t#PU-l}rMiR#G;#mgtzkB~Ob9YA|yUM_djL5W?-KvH;D~rC%NgKhz!2owE zuq`ixm&2gp&07WVVbqT-Ink%?&& z{efl3A80;sO0eEmXfPB>UcuUzEd>q-@eLoyElO3^q$0*3$VD3=jTl&78RPBbR@(4A z9o!6y3TH~AYB`gBHWsCZJ8Cw%(Ab$qI zd2Ow#Z3Q&*ro(UsKDE#2%a9;Zz29GaUK=J+2p_x?`j?pRYo^>u_8L`8KdBCB3dnz< zDKAT%w`+ljA=K;M|G@+JzJE$cm#Guc`mOJRKT#k(0Q(OE29mM@mx3K&y)D`|mw*E> z<-y^8h35L#B#s9ILpYW(Hy33{z=x}?z#pYjosk9!eB`2?Ix5Qen^;_?yz&do@?wHb zv$>@aj|__h1R=rKn2taN0N_GmfN0tN^3q4G2rl@G^Ryu{`;0gY7eb@xLXbFeVnM1oDlO$jn6!mrbC;-nrTjebyfXRv5rni0;?&EFpZu9b^^Y?q(2Kbg*tL^I7 zZ4r`eU=}8_bEgOVSkyuENu~5>mo6SV;0{bFM+lT;J|tWZ#Zh?{?Fh!WF5LICM4mpa zymVzE_L?o;s18fu0{1W|7K@9ECe7;?adsBY=%!?5$4pTZZb}Innu4N&<1rU#lg7GO zs-k4Z)I173P$UUH%7QT6vevv@j$U@RdN*IuJ}a%Ms;F5_cR{4&!gHe}xv5(a)KMl| zCq9v@VGptFEoimUa)>LL<^loP;sO#}R?33g~@gjle?c9c%vTIBy}=c1MSUyuLjj^Y8D+^SmDad zur;DA7CkiVw;HV78DLAvVja?`;8Ya}vzWzzT5PoBF7|J~%8XvFhnlk_# zQVIM#sf0d=9XSZC5aw81RxKPZsbj%C^=(&vvM%OXAs8wZ1)jUSIW^w!?2t$#E;m%I8 zNzu}6CgT9HGo$m(Z?%Sjp|A0PX1#Xx`JQ7M7Y}ENqpUEem>-FD6dw>r3FTDpX%bhX z6$j)hr?haRh8iBa|Iwn?(H*VfTH&y|Y5mg+hoITI#YeGkLs-wLz+ljO`Fo{PhwsZu2}UZ6zUqfHVdxTW+ovLv|agjnv$ttk#|5Ckdhb~c_-B_r_cmZ!#j|_ zaU`uvU)wz~&H2RoWD6^d=3HelU`eHrOF+n>NXWTT%{^dE{tm7i`zN!&Xkci!>UZ@2 z;LmLU?1JT@gGm8m(d4s#br%!`QM~X|4FI-B{OHT40(E@)ApuI zC^J{G`I}_vGFZyU`BA?1Vk)wf;UN3h&TIC1Pty-m=EE%Qs@Zsrwyd>lG2SGneYynHP4-=HmiyuEF1yc;d!9l%mO_BEMsCZnV*2Gs8ke*E#;(=4pSnK~Dsyo=f1SXiXxMqQk}W&{1Xp zlq+F-<(G9Iu{^kC-m-=&fe+uDQ^xJZ4bpewV1qNe{N#M%%Tx*TGVBZ<-OW1BT?GI9 zoJt&W{6_Oh=+!D)F-2*g$h5YL)9b$7AAcCV?_Whp&2A9WVJP*=gZ9>;)UAGcKUWoB zPxpmHBSR^e(3Ci3cu$%Bi@$5vpn7ZF_DA_US`eLSeT54rNerl%(~DF9 zvh)3aD|~zE)5ht8{^0*UyV;!H^#^cJxx0yr%7o(AWNmG^qKDYA1HTaTa2X}4;^U38 zns^t@(WN?OXx`fEDvbwK`^at4~^%Tu*6DcK!%yC;mO; z`@@P*m`b{`#mvNm&9eQMa{c&siCGJX#+e%`7d?_JmLv9?N!cDvB4^xZ zH`Q*@5H1EEpJbjAW987s1~R*$%OcCI+SJyg(JD4)AH|z9=cyer=l?EP-2t%nRvP{m z#)u`=-cDy-P^zWbiq#Dmwo>fJ?#blmlhW$ojsD-=`hDMuDjuAh_8dSO;0@k8;%X3h zTB6ipafzyRqJ<74nni)-xSKE-Nx;jfBif?Y!PIdi#_>WWunt=E_pcl0hrWjKe=(bX zc`F^V6QB`8pc}(!ydvg`uwi1c*XB*YO^gl+M+yJFA`K_Zm)vBzq<{_1#6@tjad15_=r$`8c~RBZ6Lw&pDzb=bwCE zR_oSx_xCxet?Wwo%fkNX_{`mK`pv|}r}9!|N}!;vYju74`tMF0>szuo?0MSsu2d>E zHMBf@DmfM$!C){79^y;F(uAW?jMRCEWnwI$*U=F}5iKI>kXd%tb199)e#{8kpq{8B z4ZAzbS3B_235^d*+=N)h3@k|G&`|S(&|ac&Xv}ryY$qpD>(Je_WpI94>N8VSeDsm4 z(j?VwN2f~M$-WykR}gcI+p}Ns2`*~}-p{lAmffXkRbmuRZc5s47eaj7*`RG1+I4K> zSttkl=AaPMa)s|T1H(rMEtH|AmE;aa%M9y!6=}*$LCMT?4wa|yDJ>a+Z|0iIK6YCa z9?Vp0!h7BJw16z2Dia|aCdhN?(Xic z2?Td{cXxMpm*4~s8k_(jSOS}WpR?!4w&1mMvAtsBdh4N`<&oCGP#GAWxh&qq#LqgUnkKrsN~4St;# zi%WqpnVNmBee!v`&kmOy6&2=J4(nGqhJ=Hq289o}g4uY>@ zQ472y6J))}9i0_56^v!_p7vRMPc3|kJB#$H)c6(?+SK&2k20T5&>$1W+>0UxUh4*$ zhA>ZoObPFMs&b|9T3Ake+UG<#Vx0+yfhqB<@jxojWWY8+g>oi{oli}Q)2$HO;ZWwk zzQqTlOwMY>7lH9}X3UGBDQz1@SB~OkVaI_5i>+ry5!cI5??=xd32cWz!@8$bgdG8k zSb!XTBQRpLTQ1~?3zj2#}&Nb;3A-qfJvthLZf2gtK;1D^c5QD}~ZLZ|} z^8P+U9A$5;Un)x)jwXXa(BpJo>0ySp-QF^&WD!!jApR=+sxSCUHLXaku*3q2DSKzS z1bRaK05a1~%g6}?j4)xEaLvt&5BjQ@wx##CbFo)oi)XIn+W4 zl64X3qe#0Tx@CAjpHb41N7E?cxZ##sILh0YFg5t6u!_g7jIZA95-L{-6h|b$Q|d7M z)D;Qm?*s2A#jlAmK~z2yAHg@pArcQv7MQw~_9ou6X)F4}%={oG6$cL>>ZFbV7d$~+ zOkv1S_eX1!dy}(cx1B*RTak(z6`on+k&kH7q&L-6DvBr+2ZC;Ju+J1;W==3MI8UBU zu@co2<@4h%0!;hV*_sa_F}b^vxim~K@N6=mm*x^Srai5wlER{^*TrR{%b%rQGP9** z4Gv0$);W5U5Y#<D!_AqN^-%YjZ(ec7cQ{TU3P$9-*X*9kEiHVi5q6EIFe|hWyy@ z29G$=_P5jdt6NNBwsgeT+>B)G(ydyJUWx2Vjwb1{8ES3 zid?v}ahOt-RZcA})r#2P=Lnf>nz;*4d)TuSOB5-=v(xfopB9^WdWSE&&;I2sSZEoE zn_d1y!H?%2sPA{A95*9NEJiY~pZfX~YLALKVu32^wp+rcQ%Yhe9>$1tx^BjD01x$_ z$9-sH3w`YGp_9}}t$8uFgs)Q%%aLyj52Tl3p?hmw0GgQ@$(qYBN`qwOAhQ|d8J_@~ zW***<@fs@GYBmeSjZX=+-@A>-aHr~FfwZcqSNv=55dX|?Bct{4T} z%3d!!ni4j7=BLcteni-A`)9&DD~YUPHv*^)cmuBDk-Q{KL;#hr%~q~hv>6d?CFLkA z0EkV%80dRC=nf(qiUEY+;W7mwt5^~{mcnuB35sa2AojUgF!2#?TTnuMN`GcaWs^#d z$2Y<$RkO`@aVb|xI$!Ebx#Qh2USCZUU3Px$|Ftw(a$b12?YvpKi@vpkvf^o|wdQ42 zfB+k_RC(aR1af0R9IESa*ww_WA@I*Tg;Nj9l8Rr_Xh;)bcY!2c5zED(-V9us>5{i# zgcqC=3b4y6aQuD$dt+*h_Ws_-SlakLb}=_4;FGI%F=9ysoVr77fE+ zQ(<8kX~j*V@igp6z8S2y8Hlnupv0;I_7lgEL5-H(Wlf&b#kbyW@bO${64G(JHLmvE zUY2}122NWmdxMt{D!7;7+0D!QUGL`p`M))(b-%gk9?1+itiO4vrJs%*c%Qd_ zw{(;*PAzF+MX+za?wPe>;x&wYg5`?F2}+Qb>5O22R%t542vpN08M4JW2X?ly;bCDK z65Jx^1XxBH0Q<+eLNvRr|$LE0xgq z>bEES{ZBddx7|l&nfD95xFzt4;`?o_+B@T`ou{#!Hu&)}U-#lM+MclemJ4;})m-l} z?yT+t_ugFnipz}M#61i>N3k!|EE)zr9bG+W%F;BAU=%dij-k_18^nr9oqUP&)KuY@ zSv|c-Xz#Pj&g_rDuW0eE?EGxaSVKoC19m?qN*@Mofp2_~FmI)CKkq9>Vk#XHABw!T zbUtS_w8ZJhYrp@QTl?06628W_*mtT&AapK*4Qp$6)sm(E$GoKSoG*x*oB3zh-n$~O z&2|>7lm<+3(+|K$ZljVAN6msWat`NoS^T!b&8howY(6Ma%=V_#N|8Rsx14ijsz|f4K_8a(JBpH3|B-aHTpBki>h>-z3xUK_&vZ^&js2%=-26w% zz!1-;n20`3QnWt5EJe7E)Tl`fhuom!U(48;b2xV8^(5KN}K zosQB}2wzJ;Au~SDDq>nRc-V}>JL)VmdEu2q0x5ysroNyj{|`D*6P00 z!gg5<|gjq%3bd&92fTG_B501pcz@UsMD{6j;L!8!+HW^USr@lmA zaY?V^Me+<>EYMvXIYS@FerlP55+EOzMOaul)L;d_28`rYhb;pn!&3J2R3V&*TWiV|^ zAyZBFg6B>*T#f`yxrEwaO52JB4_YdXfQHj#+ashyXk&E(a0Hj#i@TtIsy@-NymoiyK;;u#lANPBH+Qxa2F`PsGPwlTw* zJHbQbWV1*qC`73&ihzq5WK~sqP``V<;LR{bc>k|%XhbdSC0Z99z-SI{HxM<86#|Xv z3BfsRR{r>5L8fF!JA(>RzYxLE>m~9JV!7CTRz?kcuyp>)Tf|3>9o2q#LilJ!H&kkJ zSy~Z5%IE~uGNgzLSgG2T<&7qn8_Ny)dpZtW9=4Tr?g{l=pIWx-<^;?|;k`X9m(Gk! zf6Css*aQF9R7iOrye%uu>wXzu0Vbhkj#?IOLg}3e5-zN4xoE>w-Ctyk&-=xNCKX~u zV+b*57=g%vs+%i0qh?`T~E(mdiToNF-fb@t5EAtie-nPn(Pv?PiV5 zoaCJ@S-yz&Xj$glY6he0Ny>Zt@#^-^e*d-FwMC!J({c6MZZxnFzWJZW%>aOt#w)(a zQkAi>{LYrNX&8OJ>X*H9W(q7e|3dTIwsWe@nJG`dhEh$B*Y3T2b-K-(4p=8bK$8}^ zOV)sfMlA&D#gE;tNY!I>#kDRle40$L#d}wwb1U>wL812{Dd=shE7X6#%{Y4xFZ7y5 ztnS4ck|7{AItijF9!d7d^f1~WmUS!UJW~iJo|@+ABE^2Tq%Ofsp__NE(tvdk_EV0e z(oEJ|G9w+Ze)Ksv;x&xyeGYGRP1P9=o_K2``2KF^+9DbR+JNqzVp9Iq9o^<46%|3< zKM*je#1@tas^?*cn+;12=4%U)Yj0q!MhGDZ*`&Pm<~l^^>?H+hbM7iD!Jvmhi!g26 zVyem#M(=M;@Ox;{G4?*H>9$qZ33PDa^voVQ2p{*TC3uupdzB;)Q%OjW8Ca2NeZaR= zjuB8ftrC;sGxla61zG?8DnIm+HoiZa0eo7JT&LePrgIzNaf~Ez>>?>^z80qbE3ZvU z?c`ghaLc|7J6W1EQ{m(zunJ9R5=#^WpCIEmcNaMEwlSS%6%o(j!}uY_gvIe?hgM|S z^?TP@yumU?nug0{+eN0f<_z={duOvm=kdkgu*H+&w4^t*Q7n(GiR3i*8c9J{z;_Ou zu?6>3N@9-fhh|+Jjog6VKS1VGv-*gPU|2)8EnWKz;e*mm8R|Qy(4L5;pP zE0Qhc*wURpyR*5#ujKf87vl^yy?Ry&U$%CsHB>kH?|)>8sApqv%CeBP@yJ!TyP1Sq zQ3>@p$JT({tfL!=sW>xm@TjN_TQdj*o4HS%Eg|}?zwX!s`*q7l|B>_N@Y~xHXX$P0 z>J_Tc8FfslE{EP_k1bK)vp8erD6K+a3(Q2bHDws? zzjsuGqvjcV+N}*U8m`<_a?TMOOja9Si4;|R!{jXZs^JeQ1)22iBfODwHPf2!ZfADC zR$M157ZkD~B~JC11{;-EK5AV^pFEm-rH+@M79X7dvH2Oj(n^^daW8uRUG0!+DTdve zHmrYtGXZY#n#Ey;eY;m=T9oh=C;Ct)jxIoJI?4e~Kg} z7$(im=1CIRHE?noKk2eZ&VSB=x!ex0c!qEWYSfK zKoYROd?s!0En!w z`2nze3SyXcwuCKEMaj{=WOY6up*|N1ji;(mt13}9{U#cZ3>43jl;9u>1@X#+I?Y9Z zPa@OlMV(C_p2Oi4?2J`k*>QNmDoSDEMOYinQ5@5mCccZyN-6=jXzU8wW_?*a;>F{V`bK1(WeoO+H>V?Gw!X(kIr}GnLSvD z7)mX(Npa3exj|~Fl0DE)+f-lV$Ah~FHuaK|IeX*I%cau!LIkTumwTQ)xw?@k$Z0uK zob*U~Xz&Oh3=^TUmHKZaZ z76{>xN4-+c6jV1aTS;4~nt6EzQ!%20bisVZ(i#UfBHH@K9Nu25S`Qd!+N$c>1RP10 zM{6aE$DafXhie#$p?SBuX?u<)9W2i>R|(L_#Ll;>sY_s_Jum=rNexo#|NYx72ErWc ztG^-TQgAL2!^L0cn9%wAhbO3Le>q~KOof;+zVtzh z96TYBBc#;}EG)Z~G=<4T2$*LwN97ukd7(x1!iZ&|DAbf}Qs}~C=c?@<$M(g>=EpkC zdAH>6an_X26n#15%j}p>-Icg3|14I_>&93i?F~kb-qT(QzGT%`?xj@~H*G~vD=EVe zPgGh>4I1Nyv+&v(`RRrS!bv<^#5oS zU^6syYTiw>fw=y-Jksq;5SOB1;y{R~l6y+)k;=nAPsE{y!AG}gq)$38bu-1Oyq3JnTp4E@pF`11aCab=II7a0hv z5Q>Mu-G|oXEgk|d94V?6)F0%+bTKItsX?s(CH##}%_Y&BUGkc-U zBlE>bcOW{iB>pKO;`}&g^n>H)y>%V1951c|YF@G#h`}+#@JAArC^`>$6J=KO4&RRrX45vYOyG zr2f;(UOP49Bh;71!Bd~x7Sl7JS!Kysh7lVIhpjwwN?^))lK%Gt*MavZPFWjTM;8;hxqo{xU7Cp5eh_ggco&r) z6I|&}-Drp1y0RO38orBYIynU^vlOY{HQ}uyyoDoYr=>O0Hjbvi@J1P?^j}Kt5ms7L ze|ec%{3G!csqN2_|1mr4PG&u$k>)TNpsj&fq&t`fz?XYz{`=+KSPyCIB?G-E&z^57 zipd%buj9sI@A>@<6HZ?OLL+K%{UeT?yy_=xFhp%xPXF1Qy^E@Y7|$2a_E*x|UX|Ay z;(8Ez=`Z-!$;MLc@FYTR(sao(Me?=yI&$=g?;(E^B7#=%U5bIG3_*y(wd892bwl*z z;)jjD&sHfU7t!mQ&eSa<9Gf{QAyGDcH->QG&|8SvkRa5iVv%S^8WxdxlQ)O0`eTCX+F>Rf!eD*N$;n*HA(t+qx7zviN<6qmB|wMC28K3C_Vmc_!+D%C847Rp7j1o|t;ii+49 zU3Y3KF0Ki=I@m<5D?zPpvJvBvHFUwRTzJ&%?2(Zj5F~NAs0sX2v1N^=r4?%Ak-<7O zn#GC=$)KkxlMUM?46d`3Z|U(H$93u+&o#eMsm#oJJV(k=QB$E&C($caDSoV#qwX<| zxW>g2R3~9>jD*}rteG#_m8sA-jc{|@DamPSY_$K}VlSx}Rx#zoX93Ytg25ZX^{_#f zv+0KQJ-Fw!;hqiKZaZjnm&Q1OLgg#S*G&-FF$}&G zeotq!AyI8G-9fh zw-E(ndsA%BgT*UPY8WbXL;bs@DX_ujnY7W@KCR!;@u?MRh&xPlx&A)ICmEdp(u(g; z0paGMqA*c%<~81on_K(@sAon>XZmg|r2{RfPr4I2`61BKT{doE$8osc2+)bltSgM- z9a_!xMe-zx;~wlLk50SQStmvv-#6HFtTGTEuoZEg``34TOQiVvlS$=DD56oMsu{=I z7P0AP;`Ht!TWS3ZK0Yn2;ladFSp9DO#x8qGFL!KS8$jXjam-Ly{(2RYXbR|BZ+6Pt zKa^wFit-$Fw8Mno91sd;EZuyd@Fw&NhpToUo21~VhvI2qQ~E?*gmUw@JzpjzHUG=6 z-U5NahReQ;9|Cts(*c&SH5g+#idST92l(`7ekq9C*VF470!Sn-m~0XpnA5HJi4#ui z;r1~>9DyjP)Bl)&)TPGD+^~ktu-`%=BRV~LU)sb~^dkt4GMuLko`YiL918?ClB6gNQ9nDl`-IfM3l`5*M zN+7?|9(OF&Zd zJ4ZQg&azx~{29F1kf#?9>UKmgS>G_F>u+}5>bwD{N2w>D5+eU7=NhtF&)siblze09 z^M4O;Jcaji>Ok6H`?8<7sR08Q$+oQR_%~J@8U(Nz%w6)1an;KbSPKS!`SN1~YU?S| zkk!G2Bvd7i#s=evZaEAJ2XZh;Jh4oR;U;=+p1p!_q@Y~eX<}m3)J<&_fjF6yMWUYB zd;8m(BpXPNfRCfjskVV#zOEa0!K^(3*! zvKX9Ho`Wm5;DylE=4DxZh}@soLIw7%cb}PT5f6m$3lY4vd?(gQZaKh*1*MSVplhVo z#TCl{MwY^Nf)59?OeZKxeT0Zpys+5qu@3mz)6L^I31UF($k`xFE@X=APplS9IB*K$ zLvs|ovD6gEXehJrfLH{0Kw-3DNZ1dR@h)Uo1ku98MrcHEEH`wdxCKotv{R6W0u&U+ zPD95zQVhg~Vh}_N?Tmhk3YHB#3BK<~UelQ;;r}M!jQOR^sSkQPgPRtSa$wy+tc=UbIGw3X$#6RO-SkE7kG(V8ThLSTHE7fkeP^xPhaf$ zUi?~*UON|`Hvj5dK2`*y*2{Vo<8i*u_FKT)JIS$n@0<6#!5+sNSJV1CSH1Up@4Q2* z4o6eKZ3eAp!FrW<5IO)|ovsR{a7N!}ZBr6JfeRxME1cQ*bda?o5#NFTnXeERzq2VS zkN{~=%9WM(j!4)osysx-SphB`V(JEGVrEiN4p2eWU|)d2U{M|V;TFPugid03$U(%J zKD?g|wGax_@ax7ELshW64@nPs={4|D!NVLN(BH1nW{ z1Zy1%qQ+&4)y2mmVO#1A@7Mh?A{B+PVG5gc7HM%fVhp=IAw`2M=2|ZFpv7Rtp(D7W zqCgpe%#C#-WV6kbSy(1MSZK`b)=xb9y{V+sMKRbRp|O6fg9so|nDAjN=s{^9BO(f7 z2#(I|C=lj{X*l38EI110gW%cmLv;~Q`HK#Hh*gvmR)*tL26$P-OkWpyM?s<_)Fy+? zy3-nAd}d5W1g)@^*a*7SRVY<*fMWD=V2+Q=w} zvqq-3^h6xBxa1}|yBhuqfCz5;WIse@`pTif= z%YYY&vgvyv$iSVi%IrcR@TJyZt3V47Fwg|3@%Ld-&8Ib_E}`GSRk9I zT_Lv(EDXRU5%M8{4$Bj0hRzlkhG#j(8$vgXerQr1*@u~_Z_)zcmb=K4oZSg(S|GqA zqczm2h2w9iLs?ToceTbCRR~FEZjcUJbRD%*z#0cWM+v&Z_ODyg#~H%eXIJQ9L$X)a ztO}SjFwD-5zTp?AXJ^GkmIv22JOsS#y{w&^OGJJ&E}F0@Brr5AG-yI4#ApsRSLRGy zni|zil>mB?qS=5L586<18EDbb1f)uae6!t9Cna~D8QvV*%%7Zup;A4BqRJIc%RmkMR!>Nr zP$FNle42r_Yzlwl2m~>7Tp>{^m$AsC!%=}y+uv;MyO#quYD6xrI*a1xP}SdgaRbUn zRV}T&JK$y?wYPyuJ5fAKq{As`PF|Pkvh&BMrU6r*ah9E!kCiYhlbJ_2*LV8vsHv8R|{dRPC zeR=2p?;-_%-`7Y#7U}<4!uzA~|J{FFo%Y<{N6;FUu*B$kN~N;ZJqWT5E84e=ur~~3 z=t46)p;RbGVb&p;h){vhfqJGxgWg5dKR`ij3wWVLiwQ+M*{C0*?;jR@fe3#i)%@+r z0425j0dorgns#jUt~`L;6dQd24=bopR0_ZhCZ57vo84Oavu{2k0 z0n;fSfpE7wu1txyO7zk@Rq;>hHL;U9@Z?`nYU!{&biMO!#W2}f`lrs7xegbnKH3F&#$Y?*Svt2j{lo} z|8<*Tz9;r`2>5T&{}AOu!CYC^{54Su73`f&qXcg9;2u2O{?Zml9y1 zb11w4NC0Ui8DOZR%oujtGfttiIp&l>E=5e(J~tvSWDt!tEM!@|bQm5w6)RDnEtfiK z1i1EEczIHWBP+o3N$c}URBEEc78@}T6rOSfc8_|?k&$AKsuv=RA?^!!1g@JI&oXhdHng8-*gSU2i7lp4Zc;P}M^3uWkA=$eWAvyC4|v$TQcU zzj4m{89++#v?|QfbD=%=UNNvEB;4@uFwpz&-@gljKWkie*RNylIlG(VHwlWOv&e$K zQ&P=a2QjeiH{a4Z$%1Gk*Eq3s#%UwdoANo(sdiG=9xU$XU4sPo4~T-<+>QZ$Mvk^y z|8hJ%-Q)SEV;p|=UkKH0WTg!Zyl-gkrO8Ive7S>Xq`WsVo#FpUPWpWF{8`8PGYI0e zVUWtxjmy+R4gUO{49lGyVj{~-*SJ3?g&`yUssm9oosC7;@i22KQx(O7Uo9Zc7Ikg2 z?k4n8&QZsx#So~Zo0^NUm2KiqEnalw)DFE8r)`|PB*PRyMjln`R?k|_DqiAM3cZX} z#@L_}pyF&$1fRGpe>@32RmPYe^^$X1>SjnP^B9}N|Hw=&W&yBbW~%|VKM;*=x(6;R zp)iAD46i6%ZABC4|AiB$e&>zm(zL1pvO2zM#>MN(T0A+g3(U)-e~9}!@=bAI>DKBt zPFb+2mN;}LZinM|n{V{>y^@%BiE2m^;E3{u5vnBl%)j0IQ$oj8sr7o>dslupBlpxA zq(Jf7)t{;{kps##uCbMx(1)9_8h-Hu4<0h4XAg_6unzf6J!bxhzgI|GVxN4)^h!Q^ zdma;`i*CWg>@dM|jYNS9sywl=Os>6EyR2EMZ!t^Bo-39u<&9JuO{|`))k0#fG`L0o zjL#VNEk>&@L28zL4d1pbJ=?Y|X^uMe0<;+`C^3B{RVUM8Xk3lL&<7COgw|`3*#QKZCL6`UT*xf0s46W+%4?r4uANwj7XEEB{SA zRbas9vJ&uUf(|49%XHxppgE?&?eUkH_~6Gdi&m@Ri}6^{QlqY{BmEf7`o!3Dw)EhP zempj|_(wSbuF|9MYd7xyNt`#t<3yFlSGNtv^BEzC3M%*WeYVGaa;5#dF2|zRs?d9_SJo}8Nxu!Wl0{TSIfE|KE0fUt(GZY9Vdl?)R3>6x-Vg6=_HLbSxPJiH$&W36veK2o5&Xs$ zwoPEZ82P%=SMq!6Dxnb6BQIeCBtdh!zgfBBXhR#m=AS!{Z>wKxfRK=hXVRc#_Gro$ z7e>n8vV0UuvI3EA18g03enX>N7&*N21%BhUHg!+K{^|nHNkY3u;;~$CPZ0K)X@7T2 zmrbNTsq}Bl7i=n?iEN;To-4VT)Mmf~urRa>_(6X#VSf*jk-`*9BxIjW_^OIf&7!YK zZEGGg*P=O(k8&AKe9yi!Wu<@rXHyhdV-)*ma_&-1|N5+qV&`h!+7^4iw8dU5Q4?ov zE3fteL&R3tar3oDs}BV$N621}U^S|a>FQnGGj=1-XBD}*$jYd{G*8?A-vi&-1JYZ; zKUV3V0MMVU8^mwpT4Iu^o#I0PN<+=-oc0mw)g+ZE?W8fE?ZOFd+N1h(Q@QP(z44r` zx%-7gz<2j*%^KbuuiZE4gsPIoL7we1B9v;q$}KGE;aQ7%Wc4v)-GdPYY# zNeL0sH_o27aUqZGvU-HX#h=U+J6k>Qs8|oYUwgh`y}y?w!(t2(L-zdM>6rO75;axX zfMlF)AM7KsDKYJT5}4FIOQte`f0kf#jC6Z0kgJ*CN*@mJZ)g>}q*7};eqy%)!miU| z6oT$#!7~C#B?t|ud8ecYpuLH6MeqE>Ee*ejwU;-NLlQy5iM^xl`Efmce8>2FX{^}x z7~gNMfBOBx?5%_(y3ux8`memcbqyk~v^5o#veIJvUUmF z1}xW^Y3jL+=CKJwu$eW8pPbyAZ?(cVxwUqA`h(*1*t!q@tG*urz!I|+Uq+$NQ4V@> zwy+zRic#8^wJXK8O?G}6#Z=YSEN^*nI}&{p42KCJ4hn{0v8x60t(rwxQ-Sis5CwCE!+$e?4{h7%3L;XtzE-Fqq@plFBTKwtgP zS+V=MQ>XSr?NxW@F80o*sqztP1WRB1^`BpKrw7t%)Pli23)F#nI1UoP+=6gC9|Rn7 zQ-GpOo6(S->f@}s(r%$)3EbUjm*eBPSBIY)qifeUH475oui6ejJ^j|sJ%(MG?YCUp z>Dr%y&9C%hp787ZNXD#)*1Cb-_QC_=Pf0&@{vbjzsm3=_YWv_h;7yh2d^cuse-lg+ zR1@s6ON!?C!M7$z;?SN@UuF^!jVjx$UQK&mw6QchZJ`@2R#;hyC+C1kPc_t45x zi(_yP9T-pZ8*4*?Te@VragUeRPS0YNPnO%Slm@3qij*B03R*HZ3knU*PKXRjj$2L+AG29-9i6OHG= z$LJPHq@UsjmxWP05Wzt0_NWCA)YtalhgE#z4b>vnSikEJ=>F*ZSv&>8LM+uUq>UzB zEcN0nL%v`c#(eaeea@~vI)5do+mSofvT5#MQkJf{GXW`jIb2ikKWE+N@h;yZnODEa z-O)*%QP3vy6N;~}r8J=ZU^Ch|^m|bW=u$3sQ6&%5<`V9{ndfy!1kfswsw}~tB>+-u zk8$Y|0Sk+w{kKyxNCZaG`Z;%0?49|j43{KTyp~&>*}K!FS^1~uVSY7NV~ zOEKtq?Jwq1FtfpsG77tcXw6TlC0`bGx-cCn-Gz`(rKz^Zy%RMmtvxmAw5%AbXVv1! zHXSIOG8Sj8&jM|8;MS_~I3jln92*9yns1>&q85Q>i~CsE&^|+Aw4L`zK(1C5>CX@- zP8Ux=bjIAXHFiqB0>|1yN_6|N2SP^y=AwyhQ(A@>`U}VE>=A@gg^w%(k8{cun2`@& zO~rSSZIDZ~!;?GxvQN9%pU$qm!avdCWDs>G(1?xRU4PAv7i zF91sjL8RaRl5`<8LOSVv6^On_q3u||t(#cMh6z(^zzC{F=dD3jCi~%rL1q_D7&Cz< zTTL0rUATIQz4$RIkGQ^5&mV?qaaUyL&wM^Sc?e{)BlkPqG+!P8M;B%#*}+Y%`S|s# z@$An%t)fml>>*iq*sLeik?Pfz73lw^QB|(nB_+x6RKM+?@cQ##?D-JF{c5)Ss=%m| z@1UpXcp8OSl%rV3x=8<-<4mZi#PM}!^N&dRoW{-M=K8hw-fs%;aYwl|hzURz5FY=^ zv=u{*4NV((Pig`yAuekUGrZ|5D$Yj6h%yn3Gu6!cp{^;2IQ^;>IkU{-*_1I|IHOr* zcX!Rpr{UF9#hhOeHA`0p&$P&kZWIP5ieQ8qYKhJ_{G<;{La}ZBSw#$M3_RL^1sA^? z{9}JXiMWIaClIF-^e1IaBFe)KUx1UdMSYzY^ub@H-0i){FYY)9?-pR!w4P9f(BYgh=oyDTHIpx3Ig{xm zDjlc>XOA`IB5}uVxulq6`V_n1bZ!qDr%B%c{_$yo`eVI(o=?7Z5lOe|EtFDJT)X_a zU*QOAd~?o3l!)ILs_%?8_VzJP+FjvHCO0uo@nyc8x7{-Vk@q{-+IODW2n0c+^9HV@ z6VRiPMJ=|xnX;gUbd=3pOY?A1hoI+Z5%g?Ch+1ikUOJ~ZMWt(g>%|{04yA4#W%P4+ z)XBp`MD6>=Tm-Z=4!8wHLj#wlkd|=m40>;5R|%SgaZ_03@176;ofeu61Xh|Yy(&o2 zXUq|Z*wSX<|0|KL+YdXK{qVTf?7kS~g+raqbDGb$kkt$N7r6#U*C79i2>V!6oPrFT z2A%W!&KZPtJnUb;D$RO3-TXDGo4Z^F=iEYCN?<}#?mm&_5*0Mq>f1IAyw#7}pA9 z_7kC)b?7SRTO&BU%iQod2t$K0CqeUf3Ed1~IMLk1OI;Pf=sp=PU>m?`4%Ngz^LAL zKTLzR)h0x~DmtYn356}5G#5^$CBB(te*S=d-TS5QtE4)y-AID@kEizfn!H>7J*JC3 z5wFXuvjd$!-aAa6&2sWB7VqUw#?0lhV|{9Orq^(oX+m~~KNTa8qV`ga27oP$Kmhzj z%7SLOqs6S1c0IRouQ6K7@9L$AHek)yI`LX33-&QK=F{5@xzxGMniNZT2wnj>l6CY3 zA6j7hJPR6E6jvNxm9#oZ7U~~Oo>r@_Wb2Hi?H0x-DTM&_; zpgS#h8U(GVApppu$YRj~pJX*uaM2cSv1`v_X9;(=nTua7!9`j5&L&(Ryn{n-S8ANV z@9c7QnM~&R0mKV2FE=2S2!q5x_xBSEOTB|KdYkM4`C~gOGk68TnEy(L1pq9*)snBY zw4MLVrm`tTlZIH#r@AJb13(3BUkKvmcDNpFmSc2(tPN3{khc1Lw5K7;!B$X&#;nBL zL@9K&O)mq9DCn3B#62@Gpfo==HNc%-$qz_GoVvnLQHgKEgF)7$zHKRIqgl4-N^r|@ zJHp_LAm|CEs!+-~%c^mR132gC!ZRh!r-sh(J4hEZ>*cUl z)%>pN=?)&o1TD^**Ra(WDHYb)Gq6BOs)uo7SCD*=T_h9Dgm|{zL&uQu!I73Y@zlUp zL=1RLICOlX@PaAV+A8*ETOa%2el-x=1Gh?2z|8wCMF)c%6@dOkYL@)wkl92ow zrM*5wDd7~oXttP99AnKvtFHIN;VFlgis}ATX`B=AZu*5L?vKAaA?-=#KYin`M^(@m z2avo}J_K?FqJ_U=k`WBNp)LSgO@W^vR+zKo%4*&2e(A?fm1MrM-y|`vW~`|d+wB%% zLP&pD%QbkXf0QO)MV}CAC>?3f5fYXi?3gu=mwLf|jcZI&V7vj_SJZwp&{~WzFmJnS zi`t&%hT|GRI%qs)o7oSLA}yP2Wt(Gn$>K&|ei{>;2@+&J#_*$>#QF%P7OPOe6SKuv zY2oiah}|NVFy6*rO2q2U4vV2VKDGhJJzO?oHv1>iRIpL8#Y+n2vyjr3+A5h5oBw#^ zQ!+2T6UDsyuDmGYn(SAIgkNYpJMud>Uz&W}hWrF7*qc5bY-5)9#jW1bMzIq6GiHRN?@%KTVLY` z1&8X`--%lPvtQOv5p@~{cD}Sd5hX_^`fTzq)5j|ZncvAw z)U5+O{Hi8(V!@IHa1WM3>@Sd9nqA&_(*Egib^jSmIPXQhh}@q53Zbk z(=*%I#uEFO1KpunJx+v64}WDR45w^oBL!59CJihMhx?jak=^xW-K2swA2Hw7in?sh zK;lY~u|7jvl{G`FgN{ADd*$D9tun_(2i=2z&x9xD_=M1{faaJXdO*e8F52=x)k#fJ zXq%*P<@XNz3Wh$UHJuGoizQx7v11j1KnJDj%MM-Lz2nxoix~o(13K+ZiGzdvSv{Um zFp;4lRCYMwdXrc0!*qHL>!HK%BQdrJQDxW>S$6J~pcr{%nWl8WA=#an*PxRysV!jf zo!t47NzUjgFq$cwK&FFWz|1RudI#pUxWuP8 zmEPW{|K+gwsmx@1bLCfNubmGCb53xNkbnLT_mNt@TUNo6nnB)Z^_O{~@G9Lg%U0Yh zdtATk9}2chN_=`KH;}0&pjBKPYAqe7G?%9|ClFy*rE$1ci|0^NAg6xewefe3xqe=2 zr)5s`ItTs|I<|eZnAqoq49CZpt1{1=;(@64Ul-mS*t&Jw6P*xsjb*LBXa5D$p8(*G zk34}|y4sVHUc?$%7RxV2{))_}>WccTFEu`Pr%;BzOT6gSMab*4_@Rq~T70*jW*B%m zEuh#eF7Yp13PVUW$VCi*4C1YjnT!bt%@X=L2O;cvr*fZvzkb;M_Som1|Hyw7HJ=kH z3Yb(uCp*4uF)wI@+oTs|g%p04<=NdC$*JH~G2Mjp$;iMFM>5!j4F;K*L06TtE0v1Q z2XYNZ1ob6iohEuH;y`v4JzqTO+;hLpW5_utsOs7iAd>pJBTu#u5tQQ_&e_I2k#i0x zsg}ty;a_?*OhEF+B6r&@%0_r5d$=pkEViQMRb%JLCl#zIO`>{QlrXgpjF^0>N-Jp^ zjgw52`tdS0VW7&Px?i2UFV~ZwlepGH!wAvU5Q@^fkvXqJ$0Y&As~MZ)pDKnT4FYpw zj`LZ6UrLATDr%f~SQ4(?vqaW#1z1_iyfo03+sN>0QY!r#G3VfPJ|yHYh-S4yc96hr zwW^l7W3R4bpsucNO`xLE)LTBUuHku*$=rI~DdG0Rrq$B_N;#r~Ja>ehA=J?GD?k!1 z@|10zeVBC;%8JsbnCZx7R@QV7kVUB#9^S`}D;=8YpLB&;!a74{)xw_rW0E(17A#r{ zmbHR}jV2PqW?pU>O#Vj3%a2~olfK?k^xavVF3kry__Zy3A+fsG(h$c;(yt>y55fQ4 zfDebiyTt6P*zKX9r_i&bG=u9ClXsKj5sYj>!O~evJ3BkUlqrUW@BCh9oPAbdpl$&` z!-TFfc%AwkV>g@stDfgthcBU1Bm4?2E4_m1GP|`r?f#&WX}VGW@@`+=(CWXc_&E?* zXQt*WOFSK3bFOSL(xGvjB70f7YI~b$;}=vuD`wadmPz2kN&8rlOg(E7?9ga=p5dY6 zWmmVZb+4`|SNQI1odHK~536GX2xlMPP-mzw&4UhchHgCNzEzAzE1||U{k(7$Y(|Tt zp`{`f)>OvS{^~ql{>8|wXQDXZla^#?2nk(yl!YL)VavrYlN3e2)FkLE4mQ7i@1AXf zt=VbAGnCqF;#@wbI?d+OJ0_r}u}yXNTMaCATN2fDL|tRFd_G#KWVK{n@z{sGfB>AYo9##D z<2k6XtSET<{$2;ATb+3}UAI3D<>55Yr$Imy)XuJVj5>I>ecu>` z>$ca_)jT*_RoBw;x75^d2taJD8)d!8+>dAs`|N?N>ws$G0vhL8zi7-pfJE11RTGxi zl96c-i6vUWz|$9wJsEl=%3~X(sv$I~387;a%%P)MMw+fdlB<&SzMano+fr^R_S_st ze5lL4?e5tNFd3G_K8zW%s7E_}_gV>2q%q6kqRN_(a`FWKq$gG!SZWe3jK>=LuPXki zQMAmKeW^)kGivodYLpBNF3%57aNU1TJM~K^U*$tMp5Zu4xA|>W6pa^$9%Bp0Q85Pw za(r^!osn24BCDcnUx3AkQjoBWRQhaw<~9}cYx!J=J`@TVvbJS4N^W=1qX2EALziF^ zO_n649%hBe7%_YjXQe|@W8?c($Y3dtox6*3NdaenKT6euum-IbxERGf(Q=Z!x3v}< zkFdLTYK15_uoJT5;q?L7I)9^nHjxky^rRUWaEzT)hXXNklBg8fzd?hIEtf*4E#@`h zd}-%p6wswnSPLr`6R%AlUwQ2*kwo%P+jjOv>}j|UJ^0j4U*%FLvrdj2B~GNN)rvn7 zz@woW_-~|@qvldFzovDp+w2r;n9m=tdejtR2afILBjz7NXJp$ervAoDuUUq?O@H%n zLZrS!|JJ{?b34r!%^IlkhDar&;Z`mhy|t+Cos1ro7T?6lD3*` zI)$hkXkV&vY|Nqr}=@uKh#aeBwa!bQc8UiN_1Cg`8{m?%l&jz)u9gWx$?i2MHN9Ju<;y6fZUgk-CBn(5*~# z-7u}qxPn>%dSr3P5;HkVXOEOe2qWPqW6xyqB7uHS+LnbRa^wuPBG1wcTm7EX?yOa$ zP2?8KJ4ON;+6VSZO!-X)K=NTr$RbDo!`54eHTlJj|JxWnaP&wAjM3dGF;coyy1NlX zMu&iOigbsx0wRrccc_4XN*IKa`|k5Rzw7zycmB9{-@A6*yLa|J=e+B@-pyDH*3=Xu(aKLm^y=bMC>)c!%(GeO}+Z@`&rIk#d~qL%=9bIUoB;G#vAw#k9wNt z2tuAXJH=$;zhXeYDXY$)sV9E%{N=0bW#0gkIVX#V6^n#XFsTMW>P&|1gA9ePG8=su zs0!5LL69HYYD*ybsx7U|mtMzd>NmJ8{j_a{pRJ|Nm!A-52W6Bb)6|ap z@vvJs8z0EK_GH*`_4kyQ>^R3?P5N#Cid}cG945m{EpZyiICb(zxQTZve0zKAdwnn7 z;myC`;IKoj?YT4R(?hw9pB1aY{s`W)&=`xKT7<~3B@}98Etxa3AI4DR!<;aEnWOJ7 zmzvjuo>ZdxRx~hRL7~`1__RdBO4ZbLf5VWNu}hil4CbcOI8{F<)jvxi{d2j6c8?2m)_hSF(y(zdu6a+%(EnRNjdUC}xDIrAC&5Rh0iUB_ zDC0;g;mLoAtM@PMJu*4LS^`-}PW<)jUa65D^j15;;ni>V!^BmIgcG8XZLY zy!)r}D!)(S+z7#2Hi>R0DJPJv&BI@uQOY7Fe+d#K6y{eDvY<>_YAO!?XKN~PO1oy} zm${UNtLEMdEDkK3GhZ4gbnj=k9Hlb)zAjJt@;0s18<{86^|90IrJ~pT==tx$*#r&Aq z5ba9;l7lDR$AgpcB5UBL^ZNRs2vADd)$~UZJ`SOwI=|REUBuDwX)ma(B!7;Z@YN$I z8_qgV{o-iE^he(tL*jQterUdC1Q~po0x}HW9_wm7)bS4HIaMxC!UCd2AF9k6+V=`( z{w+=kp4a2F64R(lLRANMbrzmKMxE|Tm9uWVewvw2#z|h*_p_wvxQPBmMJ#3Ep!Y|I zj1~@k6>~YtJmz9L5XU4cikBJ*WlQ3@V#J2XX-HJF6itC@ltM@vSidn#HWHdK)%jfb z`JNoqFE2yfSBc|3{g6%UfSjB)@4rb78|d;imz(cGbZ8k09C6N}B;G+3 zDX(0Tp#HqiJK7CmBag#IP1~kqM+UVMi3jN~k&yJWUT%^C8Zx=81ai*qDWWWVl9(-| z{qEoU&whF-T%EgG?mSvz{&d%yRA1rpg@#+#a9X3oGRC8sXPBRIy zU~=y2*GI~u1iBnTp_M)`^6l6`yqLdSPU0j=-`QVXvr`K})NQi8H`k8nLt^apv`A?h z-MWm0riMUNf;C2;o=E#A|H&f}3r@2oI-sjgBuY?AEYV=(!t1u}q4ql@98cF$QH#@f)`lw~|vx0LTyE zzUz^JU9w1+zWo`TCh5OYgxuzxeVleiEWJ#Y(p6X6G#`dXE9`{$sHrFGbUW$3!=LZR zrv&-x;|yzRGoOG41``J5(fyH-cc8(jn@9vOA%>NrMN@#F6K{*-s~SQ=%IDL^j9<~p z6AS=+TG|pWN(04VO)wAZP(aL>gQ~!P%!y3^c+zt2&hZODUR~E6mbzv$O3!B24ImC5 za_Ws?y!h3ULYmD|stNBX#fK0ZvE zbMq64EfW{WK-D>R45pha5E+#btPp{j*Ak&6!dHsHF7M>Ta1^C}#3L^N8UV1-hql!8 z?*U?dC+pygg7Q#&d1&U)C$N~D)HGOf-TV~H7Jvgu^TB!l4_Fp?$;D^``or6A76Js} zP=f&qfIlT1a0r^&FRliHg8f4)9#V3M%R?mKBVWIWfDz0&qaw~PV)82S$;hc{UL~;{ zQvKE>LpKphTD~)286I2WO}Fz%$cpQ)P|@7-fof%)R+ePrw>mj}gTK5pa{E@1lqTPW z#g830US#frN;Nwz#rPtyfRd3rkj<|tI%G7$r4REz?VR!0C1dJIk|2H_yOWEFvq@c8 zQ0F);fce-mZ)kKlKN%b#A+eGw&-{^rgESuq$%H;qp))k^caIUX$98{y3IVxk4Q%^0 zHA_BW)A-{&TTovAshRg?65*5`Gr>H8^Q$qm8z`>7e<7d?0VXL^ghP+4)rA#JOL#?; zt@6ONbHgk{@{{s1Mu}{uFljrTgVTc%i%ZMT;;6j(WU=iXucNsep*3=**M8sW+qA>2 zFZBp>`!hVG>HPM6KjJmC^0RgJkX1?Q=!c3!vrvtLC&AA`f~L3dG_PB-E1rlkN?S;D z)LP{=44wwo2(+14j=p8GPBtj9IRkBpa&N@C-YYTqz)fpPPwcxb4mKE z?j4~5iPAbtmvKM<0GI03Z(?4VWb^a``DG-f{ZkZ~fS{Wm2^{^R;k6wZtJuIt`o!S? zJqKb{`N`&=kq(H83^7*1MHZywFl9v&r=DO{0q)oFI5F$>A~i`|hWRDcEcKbb+pV<` zR@UlA2a&cu4>4gQ8RD4x2xjd6hG|z(LlFrMGV^IP`S=snY1FUIjMKB_Nt!3YI3*FJ9i1DVmBJ=)AP~y`*q@)!1Odj=_ule=xC2hiv?ho>idFLJJpeeEf$S5P2TWL4 zQ4r7z2xJ1`k{#s)Le#`QVtIl9;YM251T>1TGPOX>nBf=UqEDZqhOn)-pjZ?GyF9DS zLi-*?TnBGO3WX=tdVK_##b#o)RYuW_c&Yq%!i~Bq2WQ&4>pAHLxz?U@?4pat0g<-J z)us*aiJBbD*GeN4C4#Tp;rNCH0N0`}h{N?poQj$SsFsNL9q%EtAA-g72mDy%Ve$ysF$4>3?)wi9k;H^gc+=%X<7@tw= zN3*k*hdc3A@9ZLhnicn^0SR?`GL0VZQD1>CnFtLz(E)VM$$%S=N^A#HZc#Sg)u)v+tqv^uCf7+ zCgj%|k=^MFci^x<_2NhskyH&9v1Wt#qvLTAHs6dw6f&4urW|gx*|z z=yf+Oq2xo=8MwvTmdsJnRwSjEyq1YFP*iVz)x^UztT|G{w!kjm{NAq;IFQbvs5i+V zB`2Yo@TYt_(CtJ;b?xh2(}%v#;-8HjEPhP=2uu|ZQmkeg^K08$dA6@)dbnLTOtYLsuxjwJR1pSFCWIB4}tW`D!fuK(x{9P@F>16 z9o66BLf1JCn?JN03gi>5KCeAQ*{Pzoe_Bbtzdoe283ZK>*fIu-huXu{P>BrNC*rMS zh_Tm;!kv&b0WOwE#RRq29h>e7%f$K)5crDf~sf!;z=8$D`e6r_Oe{dq`g2LW)sQA5bFL$*t4n7gB+0# zN9%1#Z+Pth$v{aj6t|4uB#sI4c`&yk)U+@2-w7ks2{O0~d;J3vP;i(K4U&ce4T9p3 zU%Sk_J#nd2y`}eamrFI*V+fG<3G%QVskh-Muo?KGn{meOFpl#o-U$^cN0cNi$eov8 z%+LID&8`6XEu(3<_DdNmksP6x-X<(8ERxn(=jI&p*`h~SNJXv81#5-rs&QbOt|7c6 z?Z2xMY)h9fDQSNH6SLL&w?;uZ7MFww7u)cNu^?n8U7G(HV|j~l8@avL5wYV0 zGtz&l<*dH`v9n$NYEM?)@8I2L8hiA*bF=L1ZD*8Bd#LJ?#rmGwBjK! z7hMicA&1ln${M?xxLUs(I{*&=E`HMBfUElC;4?vw3JCzd#$g__2LMiial!GVCC@|> zY)tb`#Mx*Be3B>STS_X&J87h8<7ouliY0G^c&ku77uhcszEei==TwHL$gh0oc~YMV zi|lw@q;@9KclsX^=y`r0%99SFZQv-J`zXyV~=#AoEL5qcwZVo$1Ynyax830FOE?m%#4dKuh!&vrIIhHf3Y9~!d;SK6Ir6B1d{>; zbaBe6(?@o}5eA7MlZEHG;fP`!sfJ&1CMi^HtY2zfr|Pb@Qht)it8fV*WD>HPt+qe8 z@4Pt%AOVy;eb*wS?hqO+79tMP=)~l)LAWqcv?eKq@%flUQL|*fS#P9#6%Hs$$zCy+ zolcc)&qEAGCP1}S(mGZKJQrms7gsD_XW0JX@o9Z^hTpg3t!auT9bf3|iwlzcj`7X# zz|!uI-FyEGxB2_tL{O`}%vTL{f7;OPI4l)zAXwqJ^!9PxlksSp2_&@Fi87w;W8@?}U2%D_Mx7Jj%7~wDn1tQ@$D^ z)O0t{lxQG0eJs%E%T>^E{k`oI14xAdUGhbe8NVAE2~{P~2)%XdZz4NjoS8WN~WHsafU8{8j33%c3*>hObuL z7PZ`a*1P-W>x*aK!r-3=ZDe)ZHxC}~=I3g=j#3AG@A{qaoB1S);rw5P#JupcPn~<( zCYON^`GjVHccOHcjmVW#>BsFdYdJ&|?p~Q;9aiUmE4K5s)Ww7_n9B$!=MozL`E7bL z#F#)J5>iJ^KxIJ;c%f@k!cu_`oFcatdj4vZIa{rG$A@I-d++wUJWhg}FPVnd!leJ_%SYec zN|Jt+e6aaui%Wx*GHvr7)8)09v)|Df1SNpVL($A2@afM_hi_%_zm8`j6+mF@yD<;3 z?wvl2*WX}hi~@lI@!PP7J`CpW&$E!I58FSH`$hnH+1|G;1Bg8Uy9B^doPf)F6l7)y z%C2|8)(8&(KDIu*-^FhjWcAloq>}mm7W3f8(RjIsRPkSk#Mz1wu6Z{4UclJiXe_NCC{KhNIR=khd;JIBx(_bZl{ zWw(~rE^kyjA5~Sk2`VK_4gN`9kCjO}>X6uv*J|js5P8|Ub*Q?~Z_g!(%V8_fpvOh& z2#TVNi*x3Zrqz4J1IyD(GZZ+col}oW`|-lo8gud`Ef_$R6E5rbk_qsDDd8xd+|FjW zfq;XNlyJ(Gg@VSWz1BFH2=&}DrK-SO)B42=%TSN*s`LzmLlV3nZbKD~t5&HudB`>p z_l`>_vBKeN*SM&st-ZQ=B2R@DA&L?)M@W&#kfBOmUgh*q%!1GNaBA7e$fWk{WfA7* zr)QH!Mn>e&S-sZ7`tDK$PzzCpzX+*x_ zy#T@dn{>duL_a!nqBi*#jDWj&_=klG2^S@a!I8U39F$cM#ns4Cr7m}?2N$$dzxwt{q+L&p-P~bi1o5Az>_`NfrVwjXlFjD>txPX*6W#J z&AO9-I$PBu!-jynN0_(k?Tr!M8{W2~q5S|X`4U(9J{iPT4i%BK$=-r-)J5uj95zh| zQ72^o(BKRJ4gT6o!2_ui0WD4}-Lo#~5z5Fn^M0Isx?>$5thp-f4c^GM;WiqZYSKNJ z=hMnD_-xGjCQ+GeBAae*9wwqkE>RJdqB^1aGktdhcj zab)OwQRJ(rcmXu0?!P2;rM%(Dbq3at8A$8SwvYNKduMdXCi9xq`Wh|$+zt00H^alW zew&zvq|uYTq0`@nzG)*d*Nr~Oc1m3FJ^HNlbN@Ijps(4oe=oftu4L2wH$EC0+WVt1 zSO;pZ<% zQzhRnaBv(|IjJUO7B`11eAM}*n<#ZtkJdd4upNahU;9#h?rwK7fwOVyXcTG3PzNir zDi<0Q%_Rjp5hNWj8)8l8;)_+x-J?M?s2NzngYoYCmcuIVJMabZoCn17^2e_}ZVq6L ztD&@)WL5j5Gv8{IU3XPgZ%PmSWtcO>pZ!Sy@$pH%QuWAnZc6P{s==un+lO+` zr&7N=r0H>KqHx;Zs+w<#Jq#_N<=H8l8gF1xEhyILJp3;J^$&pe+<)5rCF)<3*V7c= zC~W1@7s@BFVAmU_!`>?9_J*kjJGrUhO5UW>dUFdt2a<&0O+HQSHUKycENaq+aVK+8 zF=f2FqDJ0fqYfeIbHY^T1kEy`xScZc;OJFm{%V5|8o`5h zUj7k7PJODJex3NU#G3>d_t01Dh3|Jl|Qc!^zw?LQzD31~ld>@VMSrbAtuQHQA~!{-?=f3pi^spZYbQ&ir>EFDJ!NLMsv50D=lChP#`5;PC3b{S z3g4R`cu0L}?Ri5Pj$X4-=FPdvcDwtH5I=wrcvv3of~RRSOgK1(2Xzq;o$NlGYQvZu zVJ3wY0E71Sk1tbz%=vMu?DRN!5KB7Tz6WXk8|dJ%SsViqMMO8!)7Es19fp^qBl zPEgoQQJk-0_K_wT0SSB&S#UG?Q5lp`7b{hSEH|oLJUKZNdN(swZ_qReFGWWs>2vII zz~F;8coedmX3O|F&l~a&Cph-2@(*7}5eNrAn@ZrA`cF^T#0I}5r?3`FNMKcBitjg9 z+M;a!CYkx&MB%Ey_SCNmCXYJ54)vUF_Fet;{B$P#_TyFphrA7$x2r_RWndMjA8 zeEQj`fQer~Vlf592Pa%9$(&2GBLYN?%lB8aj`9!hxIE0mr7OO&?CU!0#Yq17#>lZH zX>pYn!webr^#er{;De)DU@5Sx&SgjcG7&qUwFVUxHJc&w&>u}`H8nVg8hRjMGfz*2 z5Ra5`YkR53(zN-@mIKf9_BE_ly>y($eD!nw9hu7Pj}Vr{8~7;`5mG0SVblqC>V=4$tq$DYB zvp5l}oGEGeK@Dr26z7wSOJ(ODqAvA}yB_OTb!V>gx|yUfF8g;pMm@X6`To=M4)b5z zp{?t>uBUv!y&fqIeSBTc*9>}6K2=N)3)U;ka6H|k(=&S@w16i;MVLo3 zpgX5Yhr?4tfFi+>UvwqH2kIJnqb<&R?@_hv_UZssiLFY33ycF__6SoMiYCE#XxzSA zq9DV;l@CE9GHGC8;Dn`G0+bC3jng~`Ri!3!=B52@cl_bRWbl!bJ&o;jQp^ZRd6roe zqL9Vb4)~kMsj_aD_Uo8|AW2{we%F$cF8eg*ay7|5Eyx($4 zUGW8t>ax!A>6Q96V_osnBn_`K3s-qvh{bdD02`j&gTyIEBoE~nhh^%lxga;%rE&oy z2z(Lnvpz6@QtYgo#I8_dSZJYwho zvutC!idbi&EETk~ah|mr=n=3qN9x2rP5*0F*!+XsW4} z7~xA>!cu9zM1?B3I24ZR#J}N>M`Ev0-<+AbhI03)E@$oen<`e3!@NaSkIpez2|5kc z>-fy^T78uRCy#FB;O6AdgQO|pN_q99iZ28Gd*ylSx=eUBi2{HB6m>2Fc|q=DAibSu z3vX9a7ZPy;c?AOrQ$^hacAGm$Q}hl>z}`^n-DQpWS-B^x0#8NPr_f`kuNkh z&C;V{;;i&C7W5A-tUAf|xDlyPJPYEtt5RyolZapYY2vlo7gk-REvE_KMDH<5dZ6X^ zAA^}Y5r3<6Z_EEmIN+5A* znoEo-*}Y0<{WCd+mjv^Tc?C#Jj{-Ff*(tk^8q~5RTh&=w8cn%Y4l-Q^zxDGPzKA|; ziWlMxs@a5a%jwoKHV8j*aJ1`L(`w3|EUGb@vxMatGh|P@Lne$>MY+yKDtR(%EQ%|2 zm-HLHKe2aF$`E&alzX6qc*2!A5rmTLXvsHU7fO^`Yma-&Jzu+0mF>1uG(zf~+FBLY zT;}PaC#d9L!vEe#pi|<5Z3vba*;R7n;~P5o;Ye#`y@PdPHvN^QVmWxwn@)zfx>hE~YJzRa*Xr zl4}3l##Tl1xokrf>a%?FxCER*@}G(i_Jo}U+f_He+wSptE|=f{-JSWLdflk3Apii; zSimG$$)}eD#Vv9QaZ^Jq2`4xV0{n5alwRP0SyMEqe&-M#FyX-7%OiAg``Ogr>4lOe z;4cJH3M#Dq&~1(CBym!U1Sb=DD#f6Ul70J~e(vs@joW?BjUx>zaR}0gQzmjE;K@6t z%5NdqGp;CUS(~(u<8b_YG`oMq=eQ3_gTbw)5Yl7wRp zA}bG>2>&)h_G?9dcxfP+oCKYev6Ckv1v|xs*@=Tmy=h}gTcU6XQ_#YkpeaB}lpaVM z;(=F#o*Vc8`6ki7)(`v!1<>2!IpT9jP$TWQU=Z;yV*`OWrk;uK#J===92b%VIs$DK zbI8_RzLCI%1}KpPzuSd|!W~TOlotG}@pT=5`Rpm0(7?W$<;P|DPrr#41{<)4u6zrs z|8}`((7N2wV^pgXbQAvYbmHi*lC`Imu{*rJt@RP+hjvfbSHg&Vu4gYI0RT3$3<z}%2PKSuvT_EWzi;uYfvTi*r$4}LCAMjp-wh?TR|N0>4)ZRbN>lO(3`_ZV2<$E9Y>=Bu^1ctNZmAPexN6OGV z1dqlwqhh*K^eMLphw^TT6D`TBU7uR%|F`+lVG@lu{8Ym$$Oe!&I{s$50YGLYE!|rM z;P@9)-PZ~L>yr=sE#Y3*ShaI?&E%`-tuIuYF%Fw#o4E4Wp>;Xr@xKW#^U%_q?DJZ0 zf2(HGMvw7mlsemV`*hK_7;*I}|9esU?V%1P_zC0dS8q@Dd!tO7r~d*8XbJTTS>Jj# zlbV_vpt%*5=cT#_D}E${?kb{Za;spi&)@_KCtF)C!RfiM(fVNUW| zPtHmo=9n4X(3SuE8n8IZf*%c|7ULkU7ZAS0X+E0ZeCqWeMt}5lAzL;aPEeGS#1z>0 z!GlcQ2D^zH4ETyy^RD-JnN=V6aX|H(jsE{uyDc<$OjXA{MD2%mCFh9)>r*{mD%pmL z1zS+ep=id}XC)AJ1=b1d6a8oD2~>X~gT$&*o~2e^CRfv27`K28z?8a6_FgYD8r4$f980_( z$K`BW+_sX7TDu&fzMN%}ayi2y|BU7`K4b;3r21NAFiU0!1#peWf6O!cnCho_85cr^ z^VO9gFK4s?v;B<&PWA=!LPbJ1<7>2tkth+-5t$I_b3AKL6`@&t@_7MRMgpFPd~eMX zZM^tZ*SwSP3qGcr*{+w1d@~hX6-qq@N@p}ouPhtiPW)DO5EqYz30CPY=Zw~ii6SeB zXw^bZXVh}J>(ZDVKWR=!I9q-;kE8h*U;D$B;_N{O4%8ACfRCF%z+>u|J^l6{p}7Uc z>!OXf&Py@`8^itNH}8(lF1TKpRc55U@r+o}-J1RPROeB^nIxkE7MAv%sHsHtZ6XQn znfRY_3=M#qwW0m=a;>00yWg5HM$oe#o9xYi@%=3SR{Qo?t;i78-|p@<^t_7p+R=ohYnZt>agW!jJ+9U-2} zq?n`^R6?4+f9tPQcW_=j!eG2HkBOLDQTY*_r5>qrBhx%3f9BB*k4bQ2RRT1cD_!K> z{A!({S)bNA?{j7FS;{yO0X|v&ZLCB{?kb^8(gz8!hx!HDsCS)nWqEOnOKVNf%;g|7 z$XHepbu72pI}Gek37YYlq^S=2jRgNHRjy4G;jekCOa%#J5~kNswD+|b)GmkBtOb9VVk)9ITm|2CYs$;!FbmM4&ULR zvY30$Hs2iuJKpv_e`)^{eg@!EGjhtfK>!~Dkd7oW600vJjfgXaDo)u@JW1yncTL8BVm4P8nKx8q z0}rJenrAr{!R*h@Z8YutA*l%^3M*Wnp|LXQwK=_dR7HXZQB3_BJY14=Tkw}BhRvqr zvl^@X$fv)rq|Qc@|7GR7RqC_>7pq@35N0)5ft=qQvIkCXxHp{3E0KRw^J1%!DFjkD zK>Cx1SqE&IwKwg*xWQOY?Hj_q#h2+PE%5k__>v!jekwZL{yBU1>`gt_5& z7|(Alz+`2Ml&IbqQ_l zXQ1PxR6Lyndg&o_ESh8Y|*9J#Ev^?*qL% zD}r-aJLVmYi~xXOxs&UD=NO+D{{42} z?Aegk9P=E-Z} zYIxdpY+#mi>0f4P6fe;uJ@p|_J|0s^pk z`J|;VF$rrHrFXB9lcP}{4D+s}YlXB63hN@@zwtyt2GWYaFi8h3kEC|PN<;;9TngMXn+n|q3n=RO@ETdE)iIlwU<|t^PHBe7L9!|b|hle;(Lh)vqFTN zoUQ$6!Y6J>vvJ*@H=8yD0Dx9Knt6X7PIMRqh<7;o5|b}PAd||K%4EY0r^Ly5fU_e? z{H~LGHSnNKh+0mM?AY&T6dM?qNa~ql%LwPHHsQ4T&mqi}4+T|v5WF#SZ=#^EI1Dr5SxVP5* zHdRVHUT2~HlqGed-+=%7$|u}#nxMgw*#A74r)d1T1T8N=G}IXNbaonB&8cWd{i-1i zNcVy(m|BP+kCYN+N*m0z?3gg_5VW(xCj^iZJfJb$nB%h}*ZeglGHlCDI4h|a#o}p? ze>oLiHnli;)PK&ON#=4?@X*%QCJO93q9O%_!ax84v_PbcgmR$;`c+`m2so#ori5jPp}<$e5)o$fLd6yky7Lcfc8=Qi(somaaXhXP&#vWM%V)uOuC-TX6TwE@E8cV- zH^0gn1G|O<@;xC!cm2BIDce~KkLI3>{#Z$|dUN$0w!f|I|GzztJ>DpVVZK?v{=e({ zznGh2_o}bw@qn4#1dh}zti4AJ;L2iJ$=j9FrvVcoT-?}1qdT{?*)6k){r^C9-^cT$ z(hnLw`Hzsei-x?2n|U5=1NiuWwr^SljU-z&x_Xbs!BKMS6I&u6*UKl1rUH-I#=sDj z(Rub!@6>VU{BYa(fnK_niMDH^xL<;aSuBH_2XUJzBBeRV2cAO7G#{fNs0Tm@d-*S; zk3005Y-1yAlq*jjlkV@At)I^n=1yKu7xOXPIc{x($5n*I1iUoasAdW;=&$EQNabHq z68Y2#^OxL_XE@<;+hZ=U6=<``x%J1Zke=9IEpa^d!&_OcA!awQBFBT;Feg6`nwFk4 zkcTEnh{5I%Lx(ri6@V%(meEKeF(`^B$j(-Uh{YDfH-=5YAY+0O3E^yK{X$)o`QR}d zwdUm80~JZLeu}7z$z*a8{8ovLCLcLXuQU%VeZQcWD?-N{M;=shmIP;_tow8}$|Lb- z-<>Og3fET~k(I&nm4`%nYk;vUoLC~wF!enTlc%LrbNsA_lw+5HjCf_xc32Mc&GW78 zkz{M<*HM&H1?Q0yQI$d~_OEoPk$baU-gn)h&yHr_{{Y8S9g+yR@bPU?ROXwdt6MqW z_d+`D*er+xd8}8Uw@q7*bhca<8DDmvH={&FSw8fa{W3^fH6L!W7WnaiDzXKeoi^2oq0_D{SBMD{G+%?w$WEo&MWK!J}4P~Z` z#(~_b!5zk;6{-nyvb5?cK=8;`|MS69d6>Tb+geIfgwikG$S}al565|bL?%1JQk2{- zeon?M+(~;wHA6cZS+xx&VRWI1M<22mzKjKh9#@4ssm?hov%O}83=tt&U6M06b7yFv z4#xNA`aP_84db%R-h?|!_nHe%02|vC6U~}@_Gt@ty zkz(8}{8li(hhDv3IV=lK@b7kaGv9czvC={DEsf45pvpnolft_2e;?(IGONA4!#J|0;B}VyqCp2q-3!#x zvI&!pSg?A85&f%`w;21au$WgzRVc|-QJJYpbGJQv=ZGokE_d@)Ys1-2-(bH_pI*4J zFfO`Pwmq7}-s5dJN@}++Kf80Th=7?Y_UN)2ZKd<$z#nLNt~*ln zuW6P{zE-_rtz%UK!i5W|^|nMdMc^*bjE9GnX}7GrQqaI?t!gK~z|msaB+kexzst$n z$Qt`v=;Xd^vTxk!XqErLtjWk^*{Rd%os*Z5d!^B(<4%5u@rP`8NAvZ9%Xhs-5k|MF ztpK!y1F{KYOzOn*i$fwYVGuPG^%%f0j-Nq@b2%OziNe(bqFL4u&t7;sViFt{w!e#= zp86$dS{Adtv=!!I;CXEie&^;Nqe-Q*F4X8?FhZrr653u+BO8P)_*E_Y$IZ9OaB4KI zxqL;sf<8T}*{(x2*>Yvqe3Yg)dNi+AyV8GFlCf?il^{u5GO^BR8SC}@WFK1A7pZQ2 z4ge4+6vSkXi&lJ8Mb)iavfP%Iji}-z-dchtz?3CULa~7L9`*Py1;kYk{(N%_c2qSw zQN5reJLuv4P!P@@fzh~obn|dpRLkCSg`&GvuL@NIS|}kpm7_)hnoP#53FCo*LegTC;)Doz6f*_|6zzlQaG!5%o{-gz zcs%b&b{zbQG?w#{6WI4$w0V}0MB&t)NOpxiH&a3&7>tctoosGx%YIP=`i`2^J%tT(b|E0%2PiI!@tH6eRn2DS0jx7xlE@4 z;2q~VcURdEXUG-C9p8i^u=r79#l=o&+c(*wT83J{TTBTca)KH``+mTQKX7ut7{Icl}1U*j?5;(FdAqT_0|Q;^gyUR!HO{k&);qa6Uy1irL3q zx~}4VKR}?rD&3uf@#1Csm9h)z5=@ANAP26Vb)YxOGJlTxV-%;FVoz3M>ZuyI}tWA5K;Rj|o3B;N)nH;tWnVdK)ifYvPd72du^rYaS z17t{Z2Z2I}tiyNY?rTP>9md@SE6#O1I!juyEZftpV~5lbAxlSD8E?Y(--Q=%xv!_K zw5kEUlpq`Et`-K<{KDxW7)_8t1eaxl82f^GCELL3Hkn+5!@2Dz>XTZc>E7KA&k=ZF zTam_R+-%l(^hgyWBMW|lYg$u%A34*81DDC^lnjvppbXikR?j%)ofd6g2W@6lonHFV z3M~~g9bZP}l5|S5wtT_q63M`+XBFWTox=hRi{Vnxyt1oG`CE=_^QI=6oku>e*o*Hl z;&Pabi~N==v#!6~%W=n;5P2fYS)$l`x-s!^(fw_XPkP zO*m^nDL*Sej9CoQ~QU~!Le(y zrEN%?Z=s}tJ>Bt(yse4+oC{UA^0O8rhN_01R=y|WKf0;fxMb%s%j=?;zGWn|5?BIv zq;9xAAbJ3eBm~e(NJbHp0B9Oee5>+6XBUP~ENx`GdSUSI?*ES8c_wX}klwj@z-vk9 zYq3e!G72zk^+-L?aQ$2DgS|g03Dk|J%;_fvJ@iGr7VlpBLyqhyoW&7atqNJHvDq9S244~a_=FFU!m4 zT;H9%cUltZc5kCD|HR_ip~d!jd!kr!QZMDr*{K)p=B?SV!PLV3+xPatpD`F6Ewc`S z&-bxV96E#CAk2qT3tsf>%Que`N3$O+N;-_Z}i37J53%+;S9RN|kl|0H1+07g6O zxx4WG)4`_fJFpa!XBVqB!ftF$+G={yN$(@{FnuhukBTRBB91H$Z!!Otou59G#hmKo zZW?|Ul$$;JY+ZJFcY0J_+C)YKfD0sN^IfkI;Zb)xq4UvbmSC_ADoT`$*5J)L>jb3F zQ_@kCQ>jtwK^q5Y1HDvWyCTOsI@I|jVp{2s)Jw0p6y(!bCev}l7L%#tvP)Vq+e&uc zWDuZCo}*N^Q6CG8yI9eNlIl^Pk(R!Kop(Y#2%rA(b{30vinKd%yQ z4WDo+P8Lj26o|q{mg?g-f*ftZv;MhJAG@v9tv||~eboAGwYj1CAq#B<@jgcrNa!)+ zE?OV^L=nhyoTg2VBJAZKEdEwDd}88kStnLm`msb^dAfH9*GF+4JL z;4~66+^B!lE9MoFIZ=|tX=tB|E#^{IG+?$Y%$@q?A%}(LfK>MO__GG6B#Eyf{ON82 znWCuC@ay{ZA3i7Pj7GF>O41z$j~~vT^VS>tAED);I7k3)pSwZYfSL$89+ddNBLhZi zdY!0iR~t0Xw0d7~!M1t9A|!5?Wsz^7Atfly=1}qLHEUruW#)t$$lPvVh<#tV;!jyR zPn8#fjW?S*XCk_pfhsu?D3VG}rPTlG6+XVOjf8CaKo>y*b3T4_{;vcPY6a{CTW<6K zWSEx+r?vLK1lOqFK>>Fvl$e%1|Yj-uTOZ-2Y-YOuju4x(_U?8~5K!D&bgS)#1 zcXxM5NO0HS!GpVNaCi6M?iM`g{PVouIs0z*zMIvnd#&o~ssuudBsz=P5@jI#f9H{N z05H>9^-PZG-@+u}hK<8dyz2s)${otQTKr?*_}GJmnBqhni63IkaZw56JXBPNBLr&r z`Bhvygg3xj%l80vYL+?OcmG0NSKl)9`G^#UO@?t#~KfDWnmrnQ-%ojlS^BeMT$MWssR)*VF2wUqneLsA!d_ zy&(>!;;_k|T*&~3;2tWNU<6+JYV=IhaJ`$Lk})2d_Q|r}cPyxhJscIH$}~(s_=+Le zs099hOF4i+q(zfhA_bq(@dpfnPsEVf9jrGqomEQRMF`GEpHH6-%86<%`qD) zV)OiJRqgR?8W>dRG-ZYJ#$E}SFj2Mw6&T5R)DK`2svlrc%-qOaG%mATc8`uYxbHiH z@pqk1zQkHzVQFkTOm2c-&dCC`tMlWs&Z1zr%s%J@Y8A)1p$YD@;^KBOQ>V4Bi(mjP z>C^l3e`GR55hgA=b4-q_c4`d$e$2k7v9l@7aJP>w#*D6?wj(uMUvHXJYGD;|o!EGr zrWax4Q0LmX7aLF{%k7sw*S>mx<}awDMF~-Y#Z)5_!$f=9Cuz_zG$TZ7B6~XI`21h) znFRpnp;btZ_*o+0nbjJD0H^ntSXCW%=`q~#TZBoB0&PV*TiT;vr=Ek&ss7rVKa|W3 zLnA0p@AZC(1SsoW3Q`Oxk%q&a6Advzlq69$$OedIF0-RK=Yh|4HxvKF&cOe)kToC& zZ!RVvY_F4jrNT*~JKRTZ4B{VqjcLGPjx7txJ|!t;N(T+7 z#!DSg1b&>Rte3i!W&Y+zQk}o@$n`7tDkD0jEG2wL_S0`eF?Y+)G0H8hrq3AM+JCZ# zCbz!+G-ttCyYb4+%gRh zcC5ky1I101oGXP&L@kr8E_db68$_cP5QzxsrmvZvqMqvy2Un)1)A=8K_nmqn$Jdw<3CM_n_T? zT#FOv2%+`t89nE-L(DU)3FTKcv1|os3-=^6`^Yyp_F|j?lQ&Q@9}!9a#+~rzip5B@ zgj%Mq?4Ou)^Os@iN)1h^AC;>eAmxK~qqa216GkUn%I!q}J6ou}tzTyL{d|~9&E)fyz96vvhiIX%Si^0Y_*oYHh#xRf#5SERFA_jL0ql#mSZ;r8@ zPtY91vvX{ooS-zWzxi&gcQ<#2di&)pWxLk37e=zg~)p^l!qAay6C0^_KzBo5=Ezt|rW6OW~#@a#P*u$VB-&W%-FK@vf zOeA^-a8V`k9I6-g`2l~KhlpoG@OLSKo@ZF<UBd#@tpGkIrlP~^|S|f*Un)<&=px8fUoOIUe69Bnpv0}GQ7_}EoR34 z84+&jTIB9up&5QCC56@OF`+GfeK;J6boMiqpFwXTOTg?xwb1P`mc~ku`o}E8n8RSP z>b-aD$n*4v%9{@y+`TRyC2oBqRFTI_b2#-Dsy(&e^?-lBMl4-STKU+B-H13Qx%72- z@txPNPb4n>FkS!m7gpZc=izzg6S*Q5qqx{6$kBYF(>4^F9Apr%`G{OJvOZEO#*_al z;TZZ@{bOTIh7>?itU}HDe9n)k_1EJtEijO+r`@i&WQHu6!K81Y)px+ygYBVRNk)Om zpF-C6Y=r>5MXyO_acKV}D==TCqWhc9?t%iDW|C9ayfzOS_PlvM(IJLW} z1u*EnAD(m+bwA9dXabrYUAcH3{gx+m*#L^Uz?xb7Wy1h7nMhamGRtk;R3tcZ zrsDq==n4R||Ezk(MEuN?+eTu+goFD8y+l$im61doH3g}w97akN~VRngfB@70jBI^=1ZoRq863H9x*4bz0!!6=0 z7@iw$TxqN88*fRqmuJ`?JqFa!7?F;(sKM1GKSWgW}M7rDj4?+~QXPgCz=ckN^Iw^89NB zl>H%Uk%}R#i(NsXQ3o-)5AVGDfrOpaL0Gq z*gBxcO_pEsIJE_7RovJTxqy!ZMXwHwB3rCuhJQ`%{@$K6|MFyT}-iB}Jo9We*+NT0p{v1}vZ5(r}AO>qD-n(n-x zoBvy&c>u1K#+*Is$73e4XI4R0Je=8JnaaX>n@+gW?|&;5o%M`y!zdW*xfpybQAm@P zh>7HmzY+g=6Zk4U3++kN780lSS7^m%4|P6}%(M53h~c-ECc@yumU;iA)@0SWg%7ZwsZnTUO)74kQ`a%^VyS;qS0 z)dCRXO-Eu{A0hY2d<82?KsLT|P*!4vEV9~pFA}C=-En_Rlc))EFNO~@O0_Vz#0MS6 zp*UB0c;rT^ydfHcLSZ9Cc?#^_;|MABI;C7*pHuWsD+$vlPDkgdGCtm%a!xTyEnW7R zO-D|~d80OhaAp1)c?_lTw~h4A%4@hzb?4vdX9mN~EQ)+jIxwE^Uo{ZB>N1X!7xt?{ACFcp| z`>)tRVVEKlXo@3V<;y*Vl4@|UQ-l=Gsb*~|fi@l29U8DyrIU@C@*xujX@`0>*hp~E zHM)}PfTF}1;RtV$y(i0OOuB;%w|l#(yrq+$EK2%EwWV`#p`n&{Tlqb(AT;{QekCCt zx5o6VAKy=3^nUyigRzmsH@YZldky&1*;Xo{t*smWb0wZ#_^cjxUquG_WD`>3TqD?U zF`z%M#4#$gOVZ-#vj%`sOXAXhe9@z(w5=%T??qZ~r6gwi#VztB`;wPKB8!aMU#^yy z_*?KtJIi+^#~Qd~5a5Lk0#QSTC!!|oZk{QP^%Ob&z@Z}!M%fN=O@5aR;Q(RRmGSUb z2zG6)MhNrCp4BF+f_0#pe|`NiXG~uF+l+Kl4*ApYpYo@u#dv-tvIX2)AY#)cvRkDN z%dc!odbUA0b?bC_Ed`KC1R6siDL76#AyUxfxX57B$5A;27i(IZ8INATg4Of1r!8xuC%-8$X%G&_&{jkU=!R3O{W=w;m^?A{@r5L}yp zy)Z@|H4uh`?EK?meW`*l$Q*b@%?KnNwOIe_9dQww&u2jOVTFcAiR%2yYxCWjG7&XJ zXa3u_!?2_Q@Z>}Po86B;xaUe!%;4pOgq&gj^u0MM*_Z0aa&?`>i#GKu(8EKaiBOE& z9Vfsb;JHaNH>ZMMz%q9Ld$3h-Elr7s_v=D?&9l!#|qDLH4kqG$5c6GH|6 zD|P`uGx53qsD&)KV2RY%x`6%aJ@X}eutSA}dD~=Cb>M>&NvToME_hXx zYeHR|falz=-y|)y(&CG3C5DbQQD@AqUS~in-svy&{#!>(EwQni1|Z|4_GZ05bU+>v zkO|@pKafn^_UE;~=(Wy^VbZwu;(!+yz5l1-geQkelD*{CMQn5$FB8Posp~1pt)ucj?oUJ0pVwM1ddmh?8}X93;*#vdl?yBor5FOC3v-F8sx1 zV}-jy%1*B`aQh`C{S_v1y6>}4-4G!!2mTPqE9BYdl#EP(C_QdCC@YLErQJUf(FZGn5Rn$J5}iY+ z3J$=c>*?(a974u4g}Di)2Sl;tUxSY6gJIJ~kYW)D1585D4AYKH0fE*?!NW1}#O44S z#Lwo0=wPyeOt=rRXnAa5K$Mc-P?=pQfx;XfhUudZ&d1HLI&C%YXw1xWI{(AfV#{0DRQ>p@8keaByyz1CuE$z1Gm6B#daSVUj%6 zwyPw2H2W|rIKCegLXZ?ksY^>%oH#}|O(qk;8q2BAJv%HG=lmay=x+cjPQ;Xxw@Li2 zvu*Zd2PW+erHJkX05(JLXp3`3tVkb+fh&`b5@UDOiwJh=8^+>ql#uzL7mlN8&}xO( zam~J5sl#?rINmEOCxa0OXRXePnRtiNH+#LV`xA5)_gG&iRP9NfFE6~CCvR*u*=MhN zko%fP$O2+U7aO-Ti+7f4SH%h?WoJt3xDs^3%C4DjuBA|%c)?lRM4g`HMRq)2yG;3Ls2OTK z5&P))@uf3nHCjRyH2y;2Z{KqdP9KZ(W>4)o;d7!a-;?0LE3RICy)G&)4p}bpXBa#= zXxjJ2j~3MV`q6HS<#2a`EIcRUf;p?K%K6(7!+}z@H_F;!OZJ;{n9CKkpg^V+2Q);oq6;w@_+vrBwXb0`|0INxc~qCe!pk7Z*gg{6G*Xp48fG-4(Ct{ z2uNoN&|^r44N&iAB4LdAw0zF8kXEou?a2}r*q!fIJEcx~s31jg{O9|mb$pe(XVsjP zoN$4+COK5iZ3JqD-r%+a=#WEKy=0C&=s&IkZs3Gf8uD5Na>fZL9Nc5uQZQCdvIjM)_FAm}C@za?1<%zUJowIIPW|mr- zB#HcNqGuK_IY$>(@S3sHFH9w}jeUE=@hKlP3Q;!n?x%ZVTj?Ntb{q71qU+oQ%Yif| zdgyP=dP0jF$@`8+F7C2gOYTH}mMG5-Q#Tr%s}?WqGgg(31eUyOV%PAuo|_+kIM-aK zalQQPPr1Cmy|){TRa!!;ihkMi_jlo9h4h;MfVc-Yii0K*Rcrbc3O;Jv$*x3Y?OiGX zw3=Bt`v+@K3S3iZRk^SmZmkppNx3&eFU%@6U0Rdac%j-{HTyueS@36_i@(W!T)ky^ zn7Z^m(I&M9b=CnfxG_OKYc+I6Y-CA_q-^AvP%U1MFB(j+#em#i6?O19`>cy9w(W4< zf*3xFdqro$V1B_vUeT7ckx9i#K^UJD9I{C-n;cdE=jGlye zY8`lxiBHHWYbRJ5j`x+8Y zk$i>c*pzMte+J>);y27@rWy(TxvGWn*wvjQSD|MM9@iU47`n%%bE8+^D@By=&QF{} z82L2fm`mLyt!P&xN8?7E&nsp0ouUWwIs*UzdIY+=Jy5P|BEBs?+U4_S)|%mScRZ{c zF2=}iJTu+pn0B9je5ai*$nSnL#{E~kB*xu)V}c0;tYs)$m>^IkTZR>LgN)QnD3M|1 zlVD-7VF7U2ouK+N1fTiEX4cb>eD&?*AATSz{`y$I0Y{c}CSyB&l(ReMIvcg@aW#P; zT0D>Fts!Zr3sh)7P<5WeQ&@E4Il$GB43Ih<##AXJabOYMZ@!ZMR=&$4uSZQ&C6Hln zR4^~Mbb9Cm@?0_Ec49VNe8}V<2*VH&`++|;p83B_5(|}_(FkOLocq$tB~hFte&qkN zrE#G{aa}@@=%l>ce#0kz98vw4ZT4!$*v&{UmEwFo+7{HB9r+=0;@nH07aKp)`UEK| z5yeMiTENtL^5qATCm$Fr}w2tX7Aumzw14z>aKFfODXfW3dR zaOk4MM%VxeGTW)<=D}7KPngljB*E||tI{Wyp*(!1;@aRm^^0UDK zq{fN2S5X{G0ZUkFFlTel zC_Sk}<5070^xNOwr0iC)ibQ|bPv^ev_Ye=<1HT)HEscDhk6z0mmV)xtai1=FtfIH0 z;yMCkEgirM00f6pwL5Mqb{Y3r(JtvCYid`T6w1ok8Bvv}>@r{dJ*hv+?C^meNAOT$ zGdvu0c(wSrZANrzIUO{VGEh(|iSP(wi5Z#XGw`BmVl!EY8So7`9SjU0&7Zk-^ln1~ z24s;l4f%pa!{C77pJNQ*iP1Rc5n=Hg$ibNOBryWGY@(Pt4Eyr*(l8V~e@w5PuAdZf zd?J@}N(z+%o_T2gaiC>LBc{@RmaEVX(PC3XVYp*Fr|M6Z16AP?@Y5ojYYZH!j!_z^ zCMGF)YG$K095wNumn@hqSstbi{!CWbuvm`HdB7xhK26q?wBc@V^VU+l00%3YBgHp~ z0W~a%RRF~MWf8Eul1SvxQ!{kff!xGt?czVwVmAQZ#8y?^mg|oh1@bhQ-c<8`T1J^l zb9(@I!ud)K4E`-1Cvc^B+Jay~W!23;I+sd1y4SkakYUXI^`)h2QEPDVjZ|dzk+Kaw zD3{i$?G_0ZSdjS@CM`G^AsLg`*Nh%qI)|Pi^u^5HVbm0CkAx6FV#+IF@ws43mA7Mb zAZ*g$_dYWvyReXN;Pq+VX{p^;GusVEfnSKT z^^?LkkvA>Yf?sR705V{_ca z?I^D=N-^&Gq{iq-+cwXc49sP1_hn}^MXDFx?GAePOvdeh1|3$U_fSZ`4(I+ctcN$U zZSQ`3;rmN7P-De$xMGAPGA?>9VacnkLNkzX+sc|T71Ck3aFcz%=B9h)Rzg#f9d0Gp zo97PSpS`+5Eje2(lx^wJeUl5sRO=^waUu?jqJ({5TLTaDO~EUdNmzlxB&!4`rXP{* zD`_ttYGfb{o>r9ov+l&T#Yo-7bP3 zlSD3NN(`6X;SCFTx)A07yW{)K&R(HgD9LrE9x~g|pDMcN?iw9Vxw*J~m|N9d1UZb= z3AOn;Of=-LdX!GsUF;?q6e++hUo>89WUf0;U5S)jOCtVdEc=?5D7vPXjdU)5LNg@)WA|0Iz)~u5oMfL=2no0(Y)4|50nr<%)Ow}VdDr92R(JYNi3nWFA z81C~(Ge<>L$-DCit$8_Zxp$d2i0LBY(2wz0fz9+;4R{Y!#ySi6^Wm}^%4+649AUX_* z#>O|1S!C}cptM*xlbN*g$8ZLQP8Q0Jl0>bk1bX-co{|}?M^MBrZKhAk+Hef8*s_g^GH#bKHa=gw?7^@N~ErpX^l>^u&o zs@iEg*z%*3fMOwRQ#(SkV&bpK_~^JMQk4vui2 zWeF8Q;_7h{-I86+xH6+J*HS;*8{6gGkpxyEJz*17$$c;rqMKS-dbF`4l-WFq+}J?H zv}H;}4WxoX51CiiFmsfP?_=(q+2ypV>y5<<;uEy9x@)S;Uokg{NEh)#<^+d*$DMz- z4_i7fy?tX41OgcJtsrmDjk*f%yp~qnE`NA;3d>jRw6b+i|H!cl&W$s$ABy-6XIzW7 z9-%+#LJ08nvqmC$L>@0^-E4uu76i@hF27~Dzz4kp`7sV+yaS@Jxp=U7jPc{)2tmJe zUPBGl*||Oi!^!`U-S*s*x+F|oxB^wVT3ioC|Isc-xAb2Bdh{oMJ|b?EC8&&l`5K5= zWJl&&ui+7;Or(aA+B`h&$TC}>1g#;4)1nqo-);CF+;Y#DgCs4%|NS5 zYgf{kg0x_K%0kOweTaNvStnLl$W|8um5D<-V}ke(B4e&c&E{qte~PABJaojZ4qozU zdo@0L7C7tFK7wE4?>>Jo7fr^c3preKGTEaMCiULVgOd`cwMo_}M=&(Wt>9;$BR3gU z#Lcf&s}P+GBk>Is&z(JJj8s$Bp_flZMT|n8sr?Tqdkla_x0pLqW^~S#hZ0h?CQWhP~@xqJ4A@ zgXEg3Z1E@yrNA$^6u2j|4KgvLurv|Nr$ozr)$9qPakW|PB96|1ndww(En&U6n7pNX zExA^($(C(xB8Dif#oAUaG9q%4lnD0t$`dWiIduVrNIFcB)6?bT*5Ukf+ryg)0D&A} zn7TF|hxq=I7}XEFnJ3PpCm|7**c)B3oVLMiD86$^RLpo2 z!aM07l81ydZZ7qGM{YG!zcowf6LPVZ)o-G-To}CyTJFYF1y{Qtc(GhjAF$$m55hr! zQsm`OGtR!aelWrEqG{;n{(xOJhXSbZ?BsuL)P521FX;%aa$>w+IK;AH`Ch0p>Z-j6 z-}jrRrNu*^Enc~gY_OQPJ&YXvj52@<4inrLAA9rP0&PK)w#l5mt)vgl_No#QD-6!l ze@T0CdjihJ9DA#%;xrx5@F@y$2!fO_}0z?HkZ@9z#p7`aDs#h7TRV?kCA*LWQ zNMkTf8i`Pe^TQ}XQGAm^hH}zax?%K!m16~iQ*tAg%V$E^N;6zZd(+w_pynhJIlJ2+ zS)}Yp3!#&+8RMXti=ntnx{jS%x`k6%n4Cl{TeTY0Wv*G<|9zL9i0K=!^E-)leB}*> zLt|0C7x|b}^O~cBqs{XVy%5K>JVJ!F@V~&If57SM|p| zZTaC?L*n=3--?*vVOaxKNv6K&RL+^1(1<9f)p^^gEb+Bv_gCugk*hA5ZVVF+pE2*N z!{<^xIbt7h?y8|+F&-Aw z&9{om-5#rgmL$CBt-rDW-F=1&eu4NP0t9bjgbqUs+KcBy1t%0D?Te0nv_NI)vzZga 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

H0lFvZ4|0%m+@SNkRgkTvKVuy^GJi#P+pMUQ^ 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 z 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

>PC8)uQ${Fb*gbj|Us-2YWcPdg-aY0X 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%0DH?p0Tld~V-wCyoQc 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%0D1=K`e2R>n(-<+25UPx6ibt&K_MvaAZrB@@Mgk8n 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

<`YUtq(;5*2xO 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

#8gGdKp5^mIMK<4{jB&_;F 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%0AmJDM9fsL$u(oQm232 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

sil9Q2^R(iPQ{f(X#0PNszO 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 z z_^1EhKVDD$fB$%;CdM7Gz5Mss??JI`>Sb~#q1>G!G9MHL{1>qTfEy5=tK?M%&+QXi?^7O4fPna;3MmzoP}^};u~oL}$& z0NVl~NCYN;mMETXqaiIf2lEj(8agqf0~sDRvLj!@GhvW1S(la=oH#g0$H)yxV9LV` zFeJxDLDfcLA5-UFDXdfqcw>N>f&pNLr3u39dw>?$3M9hw5dtO@ENr-fpuol&1L}PY z7M74u81ogklse5+4h)n`At2U_E~_w6p(RYAN*E*v=|k-?G1fdTju>|u>U#`?gQF$e zds;jM+#&dg&<6;!ideej^bqSVK~Vq~i8YJ$a#1|=Kr+fFqKVsw+Ix8h*M{xVJFR9v zdRf|AnNLgICoSH9v6l8JgO>lf&!Yr&7(53qYmP%XmOCyI#&o6hvZ!^I=PtcpE0SEJ zQ#G@c*oP@|mE}irlEktpoqKNNvGuhsrlIVo3TnN#yE@OCx!=Pd?Ot>L|NsC0|Nr@{ zFqhlbb@TlH|NsC0|NsB>fBu?XO(~sF002M|2`H+Ni%t@wGE85ifTkd>;45RmUE>!@ zF@pmL2Oa@AC(~_dFi-;rQyMD@6oU(lB^cWjGqZt##6-j(kFr8m1{`8-n9<-QKtV=T zoAhu@gGn=Ym{`h=+Nkn1inmsZriP%Vn<11yQAmCm2Odxs!2~ilYXAGtWaR(~g@)E{ zZ$tqPO$xuw=ztn!ZC2f#fB~8j?Dw#+1k>w3Af%Q%_v%!nav#-XPmKG1%$@JETKn-F zU5%rb|J$6Vf?&Brr0Y%EqTRdr?m5T)p2YpV@{$Q_Gj**}&r@R(n|vo)_4!M=e$18s zr>BM`kSg_HRl`m3My<)7lx!%JZB{umKhdXyWoz%XQk8ZNRjx}{b zd+D$9AN|}sNx`rFMZfcH6b4+7003*uHB6-oa-YFY3^PoI)vPLMf6l-O5JIFj2o!}9 zL!smqR`&pOktkaGDo}9<0Z<+BEa8L?nG`vW3n(Z#EMzhMQHPnyiY-^`igr91FTG7n z(Bkzew;_x!)%ehuY#A|E0}Np`oXua`m$M|IPDNk&i99o4%HzB8-?M(%?fuqh!kB z5wpe2Z~L`JX7K<3RF}kO1622OMwY=k3J@sGF=iJQNAjJ)hJa@$;i+ybJ%#g>kr$)V zbTgL6L#q8hQ$Ix3)a&p6_Bl>MZ=(;}{?olUHT8R;@gC$!>`)wTF$Iv8FP2nlAo=1u^iVa~uHA1T;m#rNSmV z#F%lNJ4Tr(r$i(}WiM$dO7pSBb2B>myj#wr74qr65&*WB1=*&CPYs3J>p=anOg$N9 zIht2QY#jzHI2aJ8Fz(P43vN)-_l9N|{o`0zI#p5P=qSup4k_VfX{n*?OK%b_b|ystZny` zRT_z^=CP^(6}IrrkOrRu3=RZLpwxggP{G22gA)|Ph5)HtZhG7=p}r!?ipH+y9F*)u zy2VyAfc-_5c@W@e;Z#PfkYpEG+sT4J58ZfjP^}T!Y?ypq9*gVIl7YCfYT#r!L?o$j zf>tMnU>F)c{I8v|_#khd{d-#F&bu9TzGwPidXnoXsj*ux*9VxILlE(*MR$c?uK z5+~}KEeuPgkTdHWpL-bn>lgm^`<-Gyj+{aLtukdBPEPrl+`qNz+L)H6&0AaIRP&U( zw!WL~Ha53LXT8CZz3jKm&u@~v-TJ$uyg`DC%bpPknn0PZunukhn1#Bx00t}n`> z1_iNNRTE4eLQ(=tZ(-s|7cFs9E#S|=gc)r0hluR1`^m0BQw<@ch0IirfGh)Ksw^z6 zN67-v&WxlSr8i;}>^MPKB_;cI#&4WOQ9G;ebpK?%S5$tCgNlkmA#ll+rOj}L0$9fy zQ35FqEXr8CTCrrJctdAPe%b&5u&Kjf7$va+BVbJWggZb5ftUh@5Kv_EHb4m3Bp*=Y z4LHY*Nfrs|sJb-77{WcNasmS20;Uy&Ky>+sO;P4caWI`FL@G04xj1x;QgE(sXF|+H zdgcn2L%wx-q0Y^0$1&a!_z=vP%#*n@I=p#_E?A^+soxEk7*X3Ur12a}44->Umz|-w zmcKfxIjUxVULWNUdaH_v?E2f62{JX^(51cBLXo)X5c$>0no~ZVTWD=cQ8r|-9Yn8a zU~LAVG)ZgJ_b~rpJ{<^<+n^Ip=tW%h4d$|ymD9#KrhWVIC08_I6j^0~k>>;UuC9H9f5D*YiXEoCgU@|!xm~>f3^an-;O#l0! zWciK-?Pt^zPc^Vt!n-YD=2sS#qf%|K*1=1OZ1snUT;ir>U>o&1-r(n{7j6uhp~^I^ z722})=c!SU`q(33FgYqukYTI6tl!ZH000thHIqJ^R!}wgFgfNR89Wk9#0LmSP@q^S zP^i%uY!objD6)(Ql4h!-sHASYz+2Z91S^&v{MbkXIZy|6mN)_JRpSF>LM}9cfR~tf08@8fjIQH_a>6`$kO>dN&<%>EQ<;nVhCLI!_C;NZJnI| z`=Dgr00mE5RJ%zYGEbvxO<{v|6ZvaptR&XyS_y3Rh6+Tk(GXRcZhm6J(yRU|k(3Jb zL#s6)gGy}5)$n}N$Gzhm25ZF2%=DqkW&MjqAN<-rjdrOhm}#tnRFZDSOd0}l23Jtj z$)MZ^h8V{jh+@LN%TwmUJ}e6Nr9?R*aMMKH$+}6obTow9QD^TH4k!|loO_RW$6bHy zuOn&BFl$&HNT{(pX{oE_&g&y^#(D&&3Y;Mpsm*H9pW>YM%|FKE0Uq0sG?8Hu%-c#^ zv7q^k;sr|8Itp}{Ct(p0Ys{j8$0u#ZzVZxis$>gjYyjzIPma=hK;yjKTTe(u#?Yz4 zpiBqV)Vk}zE%h@zU`yAylE~P91pDlNs{ID?6Ta2=Odfz_Z?bB}0|F8e#nCEM0 z^7q?nep-Lk>daK%L}qGg?EBWxS)nmS)e~SR9Fq6c#Q-32goc9<%DKi&3?x|grZfu+ zCJFXZYM_tpZZSC59ypyW<+^wS@4yVMB?yI5$RXR-Yud+c5*wQNO?mkQ#nTuPBw*lC zmNx95<%kf{NLGoI7>Ux~F_%cUdYT4uC%i0x@ier+~EjEb=q4S`YeXjsQrt27~@FQFKy<|G1?Sb(V$kCiU+<%I)_ z-xxUpIG}KXWVY`a2DE4>bYkJrC>YA)1IbqixRnD&hGH2n=MF1&4`wf&xNhaVbuW}I zh2sgSdIqFH2TG9xP1n<=6w^^Q;t93bj9%EJ;59a5n?0A=>rjf%Zqv=$-m4nA7_E)U zC@z)BJfy0Y8qnmNT27SfXwn#%BJ{}zR){}FBZj1G>VWkrNPX`MDa6jI9~&$ZAgwm9 zb|QCMzv+}S=149UUW}<+G$ARM$s%Dgmc=Dxti_VhJ%ou)FNy{ZNkrFoIR^YN)hM(x zXWmlitdO>`TUDTy-JQR!tf%`C|L zR!-u3PP*LqzpEWQ&H6bLV<{1x=yO1A1Bf*(dw<(cl|zu_$3X#Lf`(W?QlT5j;x?~V z3`ng1`=Dgd00gdQ+3N`%*iAyaO<>276Lp_wtUV2(bdBt_hn1YjXrrVhTejNN)e&bX zL5eU7uGs8_%&3M!S zuS2TDa3ONpq)HllW}msHg31}rQ5L|hTaua59rN;J%UDDRyc-*6*Xtt#sUHi*U^1DIx_RbFDN}3OO3ZTM+Ta)k`BzpTY)90TD5os`voBcpc;~A_5J>0J*|L^3)Kepm5bIrl1Ay za1qWQ90xHHu^9C8IB_LUZKMgnQD4aq(2lkH50%@|DRgmDBZT_m^8Fo#}CuU4w-?5A^0MLHE@s0?-C2MQ6RM%RjRsZAv|9p99>fA69ad7)EI zCi)d8dH?&cWYqu!oL^b%3>?~ZDGL2zBAFK5c}z{DdkJR^EWL+~BrA^&0(5|A(o^O; zKk_qq|L^NUmTCAls>3gZZisq7%d>I=g( zJ)~-EAk+|_&#E?~%k)Y|t|(M0L<*21Uo}GH62Gy(;zLPVQY2vO46-Qgjnm}?RVZ9# zl@y$^T%zG(%s0qKVnJcY(i{v>&?NJK0t7@y7fN-o2VUE~122dwjwKwcFNs{BrbSh4 za%)_5R3(@ohm1lea;lCmHMbSzy|h_Pkw=OmNHbyCmCFkhic3CnTiUSowU~arR{s^Z zu!Gj)w&`-+B(tMW@Z8q7oVN45o_8l?*NSaSxXD_$-<@YR3w|wjq2(wjq5xdjkRHlV7+xOoI=O(K9a25|+tO=+pN ztBj~oqrZ?Fx9m@1oP~@!!Op63ERKWOm7*q*z#i%i%OY7sNHlSzrILFXetHs_9G4lO z?hp~f^a9c8(TVcZ%PrGYtXj=4_;uvAEyQT>k}4ikHgN0Z+z6r-4; zrtUE<$}>y<`>Rh8pe3Z0q-mHxS-X zc}UR~$qt#m+b}0t@YQkA>T@$pzA(kyKPwV?M7K zm6>Y!7k5$km8vX`4NnWnr)O)8Z11`IZ~i`S+`G^J&BCOoFqjM>GBo(oZG^G%RH!vz ze@GbRtV>}?gk{oP>Yl)1xe6bkOas7Q=IS6$f(%^tDI9&@1Yoq;=AjBN3#)m~h1pmV zDG?vj(e5H{!5Y)o{__Zm9@;mWLTj0>mp7_hE0-?jF#}LXO<#?!Wyb5=eD}E3-s_QO z=opTl<_#E%Df=nrdqXlp&Kd(u+E`UAZ(i!UJ$bX6PbsWVBUfj>9xp#Qy%4>OZnmkq-+XCj{5g|J!RMT%~;KQ3&a`Gf& zYD!0*esHm))fVgWiA7J(%58PdQon9fIAV*|{|w`$ZPw>Vg8?M89Tsje|9#|ct&EoY z|LP+~Jq0KyZnt!(GGhZkhtZ1V)G(`v=EP6{)m`OfZ24;`*q(Q) zGB_#M!z4$R68A#Q7K{=XBOLn{lrCmR1Lf1!iwg`$=Z?il$|*J9+)XIkC8r9nI8lmL zYOL*!vpK>FWcc9NHEm~dsk+!4MnTI%c1Sb?NK`W;<+>Z08$?T<@lkY0E74 zm(bjq^}--GH76MzG`ZDBuhot`7%(d%DZWHBY)B$twHAbEW;u=;<%WJh_F$2AHf=!? z4v%&`r}FgkXwUa3OLCjH(+!6@EclyN^xy?A45H3Et@o{u@gp$z8ovfDSelXsKa=0@hgzB!B}(P4s_mHyya^4~8FETU28%bp<@K{Welb zT8pfD(*8kO09_xEC>wmDWA;5Jxm0E#b(UQcs{=*ZKh>Vj`E9v< z+pMO1&#w&jtHahzeV?#~drw+51Q3_IxA}{0P4l!~%iP9eM72WsOwBp{cDAXgyTrh} zX&D62r3ncHMJ0D{&NC8%V%A^6QGhOms#a{xq44l+IZGrnaqQBAa4!||YfKa1!g|}k z%BLRrB(7uHQCpP%`=DgsfCQ&t+50RU+EN1RPcsWS6K#`YtR&YdNet|LhnZZipY27} zxvwc&Qx~NuM&$wYZC~xK<%nF_Y^2?i-p<4`0Qf?d>>*-d6`f|9vmFwe0^{zu?o5^h zs>31g1h19B&H~iVD+2WlPdkB2sqeWf&aveJ6V;Y93@Bxqq~e(K+1vt2Wd((i>AF;y zMO~)5li$8Bu57~WsVdPf9Pp6o+j-Kr; z-fX-P;Dkn`~2_QrQk!oL$YFw1k$R)}cR3f*(Dal?WVsLnV znf3(5c**FSb?^T~|MNH8vM#x`WHo6?S=6#_LB_)g`QK!@yg&VqU#aAJ`EoxLhMtJ35B&g}21RPMuMnhHbg5tzN zMM`vaoF>9rvEpLXQz3(iA9YicEaz#(q&6kdtj&0?SQ+(8AS1G6Ns+LbFq<4noU{7|gU8>WVJkU7fz}Bkl4& zYg2k-vnG4wXKkXe?v6bgZqfw+HVbk~FPf0<^@duI5%#qdX*hRwOT(3c%u^73y7BW; zVu0aX^q9a7brr(wHUImdWat0|5NO!z4>M?CYx@0Rg=JHjhh?n1&8bHZtTgiqREX9E zbat|8O1E8#i4iVjNVAon`1^fnjP?C>wJ27CGiQ>7%`(h@ovvaNOw#hT;vbWJKXt#c_JUgbSeZayYJ=P2Ujt(P?Wt?9Q^;5k!E2w|xd z3RDqdcEzHXUuN#eoVJ=Z27gL~1$)x6enHFnSL;Wj(E<}U=Bd4KpnU*BFH+k^YqlXO zhy(}%G!j_AD;*WTuE(}2%%+6;%na1jV2C3ucJ??O;l;1!LJV+jk}(y7Ak@nyk8GJS zSen=YG|)hC5^Tg+^oz8V(rC}+S#7y<9L}0R`?GFd+|hORJ8Q~$(i0$eD*^@NJ!-}Erixs#xPP{oHOv)Ur7p>B`{gcjQ! zdZ+!r*eKkz5F38G^2Brh`=Dgv00iG?*y~I!$X#N)9|sH%6A_?C-pi4g1ch8e8Y zzq~w1AXbzHQ2}X2joaI|OPQqe;&cHhiVLvf?5IyPwZ;_;IocLHK7!RT6!sVhYG|<~ zC6`{$1Z6N`UbWK12Et_lbX$&sz+9CTmB5uH(i0p-y4;%!@l8*wT*BF;B*8xV<-?Yf zFd!g)wqtHW_1=b@fzAC+1jPJCC6=ie?xJhmty9|jsJC)xmMJGpis6h1b9~~9WU5*) z-0r5aboLuiuW^(9UN|9cTU9#LR4s|08*;I-bW$`CQGs8n#BAr z_`1Qe^z&a1E$USsSa_RAQ2+a&WZM7)mt@&%2_1T63)g3{@k%IIsAvFOj&8z&jsfIQNIXRPvVsvV`Y}V}z@?g;B+|7!397K{-Ze!4Tb$i3 zOev@(ts!B%YZo7JyKdznxqF}#a@>_1jaF&B>jjulkcA6ND&03!Atc1Ph`Fc`@c8}5 zL#q>Xz0AQX$EBZF6!iiYv2Sf3P|euEieau`iqB#R4J#P9ltrjx)@oaSXX28hsb1f^ zAr6>~i;xAz^a7V`oBO|BgrAJs!gwKoWFT(aisquwp%kLxg{CI(!^^_T9{?%RWKJw0 zi6)fI_e7()*GJQ8l7z+kzVEA7t*)2bp!K7tSp|t@(-xDkmYAEW|(tMUr?- zZ`w_dV{%fqc+EE}W#_4LT3j5|bnO>d(%r1%VDcR-HsXFWX}Z@K?@a83^E*A}CSV8A-8uR&6dmckT@XTe^kB62zr3P+1{Xk-ITbO zUICw?K__(o+kUX0wng+h2P(=i`#6fpoj*fmhMWJfzxUc8IV}2h(sU(m@8al zKpADuD6z-KrUJ$+Mv@-nV?TwwGq`)c#T8 zAO!~8+x;>AR;&4Mo08fQL@=CN;f0d4uMj|YH5jtD8wSipR8D8l{(O9g=`qg5wkFkm z&n=CKoFOQd@r79!&tz z6BfENz=ak>Yg|p_m@8sQN0^BM+Ny%HJ$>QNjv*2TG6=toiF5ZTg0kM=+H2U0hx5GN zi8{0}s`}*@s*J?^wm*bg`%drqaB1d5WX->q?>x@&1x_dFo$-%yA1tLgXiVK~syC#e zRdoZoPB0n{^smt(9v&#AGL z>@|i7ys+cM?GKQ6a4aB9dK+<|1B4F}0L4D4WNTu39D~dol5Mfc{1fi=Mpkr~m=|aXDbNJmAnfQ%M(%8Gz)1ev_+Y`u5HlsXB z3i^nCT-$tFsol2HjoR6C6|0xhC!?-iDyXrl(`ig!Or+8TL1fQHAR-WuO)g!>7}quNptRg+_%0 z2t*H7AtTbhdZ}HI$qB$GZF0u&h|V3Cl3FfatfmkbO= zJ{>Ty5a0+nY*E5ZQcB9y!w~wJ1Pu#!RX1Kclm8Ax-G;o+%uq_!ti0grN);?$QJ4Ak zV9n$D^fYGXvJ%v?ZB8pa*ZLWaXESmdX)PJpfuEQ9CjLC_t2PFMB@2=o5|0wEh_c&@ zr=2#SO>rh#aDGX%3ks8@R-;IMC}{|Y6$b$@qYY0H5UJQ^O4H9u;d00NyZ`-!qqPRo zJlngqiNkQP%E-xtqM%f=?4_FtPAx0{`>RY3W9bsmN8ws6IP2n%X zrL-(Hho$^V8R1b`ia;^|5kT2uoBj|T*e?YH01?g$h8~ner2E4Lq)d^onxml^P#?0Q zceuN@^w|tFAJEC{@gA1zM!? zCS^o!d6ZF`rT_o^`oEvjM`9@g$a0feEKc_^q_S_0sw&_S@u zijNM*UHG%BUL@QbdCX;WU4o#@X&`=MQv9-W8z>@qFZRvrq7-sgR@#gf01*0`CjFsT zC4^?4Y`3hDRvvhX2b}`aw#0<3N}?P$GlvZ73^e2FS3fn+=2wg6j*Mj5SO}f$l2Ngj z#{2ZI>yNWaj|+u7+d!6OvTjr%n?RSbw2)XtO#*<4q*DkRCR5FwV>2~>Gd5fe~hQz?s@WxUe|Ycg2Ls2WY0j|eV}bC3~Mc61Iba{KWXee z3#tXOY;}eXoDOk9y>yc)%T+)_B}pW?y9m5&BCDd(83#y_<)K)mt_}(vnWRD_ZRh4+F5Cakl`~^!w>Qft%;Ef+T#)CV^CK)Rgq0&RgmWNd-q!8k z50U>d{C7DoE$7M4t$%o+T-PJ3db-KGZUb-kZ zKFl;3zbr6YNmIwLtXr~|iv7et&%BmnG=Tsl`EJ0;gffCN5GTKfzgI*Kg29btoyQ6+U_ ztRQzPF0tsl+Dn8P@Nx)G zRc~j>aDnlZLRxwdn=>{UG^e&iwb)`j;qc`+M-9&1mZ_Jy%OgK}cb3mC9;d#Qi#FOq zc0AxmS^zSjBmi8lUfe`D0H}pWQ`SdTQm1T5)&LnTR=UJy`6FDzK%AQ-4^f~6Y?R|! zG)_CkW}a#$UEd!O!H)XU&pGX$y_1-IUHnwLdUK09Ap?jsLN4xVaM|MaEn*IN|F_z6IY^%3^2|O`xeVNS2U}Gf8qL7=`9(KQvJnF5V33O}Ylj8AsGtE`|0| z0S{?qQ|#?>`?Z;9n>h?k(&)RRqU+HC&u9Z?S);po9ja%&+ zJ=L^jOcIkX>(F~ z0W6|CkW~^*SZLbpG{AWt_=pIa*xsrqgPU3M)|$k9Riwz4IvhGC5F@t=EA2=Xsb5$? znI3t-#wCCv26aR%%-*(y5P~{4^nw};b#~E3=~c+ez0KlRerCjGj6f^9=hRz9C8JVi7DJ7Vxv$2k-4gdR~WcC0ArDs>`3`AONjGFCXC4~{? zKV_^Wb7`8bYqf`orFa;j*rnm2>_mU#Bu5dAr1sZ-#)^Ruk^LuRMW~Mv0%)|!g{+IK ziQ~S}+YF(3yp_S~I9x4UkkKNJM0C#G=m(8zwiKLRtkwyG_`HH^xV|)q;np>i#>hCN zHUbKR;KL;;Ota;avaz-4pV>DSZ>`vkXf7ApHQe7#jNZEyZ)GD|%io`eVkd85How3` zdu1+_iwd?XvkNi=Dj14o`6c}Mypx4)EKmUAPsbG9c`Hm!i(i1DT;xPe89J5UqX=s)1Bq+C5`|*frx#aGc z>7xji9OmCvttlweL6Du^-PBk?00i>kgG(rvME4$*3?gTMjcR6#JuEc~V%*-IXnLRRO zB1bfbJm1@Nbv%fnJF28zthj&yBnB#L!)1R+`DCM^9!`81`Az$|AEMo9`D)C&=-hHn zPuBTC&>1uvDorZi?{*?}RN=V+l=ZdfTUf1TJ1n~=hRKa$eT~I3xIxiCn-`g}<&_u7 zOor%)PHB~Hdc2ZW?Ik0iQ?f8o(i?UD8@vQ$q*kN<`=Dg)fCO|)+3O56T4v=M{b41C z65XR^tfYA%dk^e2gql>QrcNo50%X?%g?(2(V|7bll<6RlU6Su)RRb_V!@=z!3eiw< zs7kq30*4WZjAhg&0oh7+>b$6JenhA*~)mm?BRuWWO@=59kMQ%@X*}Tpxkv^fK zEl=EyylcF6=wtZUe!a)l^XC2@&2sbb?TocBTQDHfAuDJ9_ZB6L&wxsp$_%7&W?uXi zQK7~aWJSPPWJgoGB0_ICIZ{pOl0$TMz?ga zBh2kHO$gXS2(7k;jEVzjQ9$Hswv?8s2dNsm*e@A-WZd>^LTahCDOa9JI74Ut&nYzR z=odB4ld`ZV^Duj3*JND6S-P$D8`&C(GlfD~p{rIcQI zlo`quN5f1~_dD5I?++N`G`SNq>Yq^Kl`ev87{9sq`2YK$Wa|I~$7k2;DKy$(C%VmL z<%AP?Gh?hhEvb7B>^+x>)aMCOM4O;tH~&F#84zR@G~)fi^Oz|0kC6~!!v4jiD&Uo- zWVc=w>8eQ}NnsgX7m*KvR7vJmNj(Vk zP`MXXVB5BI^+tYB3M8MWTQ8YwQ)fS~y<046t-ike)f-iP?Axy1jc#MfA%|vIYOnC( zfmjp_j9Ko#8*|E;GZ#y>*EPtwFOg_@8svA5@w^zIHy+kI@)V>piDwJbq=G-?f~m7MoCoy7!LuEuuSbX5or0vr#*gS4`jgi z>=To0iF^)1ck!^=`d#{Kv)kKRt@ll>^>kfQ=v876WfdR|O0R3~vHR4C=C2&Ie!!HO zDw9ubZtcWI<5~tJQsF9v#;?=yOTt7{S{^`@K{AGk=?Vur62|cu^?_oGsB*q3+pGN6i91UA3`98h6{I8+HuD3K)27&ub~76M@` zDWxX_Yfg+R5gUg{L>4KrFIDo=!L>D*Bf=pUY(FfFwEFoKUpiwwF#2?K{s>S3>zs&7 zV_W{+wwp`XtTC~RqtIPL*&skLr2>ee#Bog40Zruefyqn%`=Dgx00g0ESnCWN_;P59 z&0&I@6D6NztUPVu#;7Z`h6*Kzv!x|Wd!_#C>iX#fXV=4)s6xtEwYZUuLL&FkeLvU# zyr17s>gug3PGZ#+5mf=j!$?fbIM=yDTd4%}-S>MiUJx0*FW1>wRRBpMkfbis?+65> z#I^haz|=*oInoiN+i(;kI!+ekg=@@7Ovz(B?TJO2?%cMRX~zttRD*6v(g?lDNMKEN zmXOZ(3WbE%j-SlZ!Zf3gDaKihqX>pc0*x}I2!rEa4yUhMnP$~v<=iu2wtU00pWblA~tN+$D?2SV@M` z#7R0(py1nKhzZjN4^19@8|mBWFFc)fSd(wq_s4)SdcZ*1kxCi`TW}?L@A{*3nc?8{*m8E+VK+k3Z=b)G|M<04IgLe_OEV?5Urphm3htjojzP>|ib{Rv zX2Uosz|&K~7yr8MmqLE_7aD_KCXA0=OibOVoC;-po}tsMahyQi2DJbBE^#rv^Y8Vs zgu{PR15*HuR_m2xZ2mDf1<^@s`bcfnH1kUF$-{-xil&e#>wEXaE~QPR0lu+jUPG4G z!@epBpDblPB!Uhjir58>K+A>{R1WXBR7JT&3d9@+Pn4vOIpV0jLE;UfW%zkrJ*0e1 zeAXvd(mWQKPmh{&VE*Ft?s&@M5^kCREiuZYF&R_J9%A5r0TalJ=$|ImD$>v#brecQ zQAN8_A~4l>6PJE0f1HhgVhiW?{E#li224Rj7fM4?3k7^ zSD{BcB=XG;<*9-~O$pJJ*7v03h!bC#=3~3}Mr}KyCs&#K@DiOJIYvJcG2RFw0nkJ8 zt;WnbXF}yPeXO;mAp+*Q|LXL%BEw3#MJJ0I(M1ztT0_$_eOR~FmY14i9~a$-RvZ(o zy>xwhCb|mGftGz+PJYe#`htWk(q|+1?hWKdUA!EH}d0kcFI^T6EGM)sC?crhk&U2yrvF+W>DAR~qbD4kl^!fFX-`+DI zQ=v|s@}?Oc!G!boD7-8^Xu9EH@m^@uXPiMaX?U>li(P@M819Jv#CGDgOYe*LhS48+ zuin8{TpQ6Wob?=(gO4t@I-G5l6n%%}=2~nwSQeVhh3i(+#3tW!y{FO%KPEG>5Nzr^ znyvd3t?kpYbsKfvk%P!}@JX5zTKsta+2LIHuKB(3`m-s%FYQZrgDp6m2$gja6!)J; z_86_dL#}DJY6Q_+3nbnvW$Vah~h5)b`wY{XB{40PWV zlFvHkomXA?!z6Ah?v}`A&FcIaajg} z1WvW|5p(DBbgjIv*mpJn<*X#xlM^<>)KB-VT{2Bx;QTXQ9(qfkZn^L?{8caQ}nUE4Ou&|cjSL^=i zV@hrZ&b4*$yjN^WiIfftAa2ROg(I-Y<*ks1)Y{#7^ZAbfcq0~F)_Rlr%jm7#_%Vkb zt%y*Qfp`1lK3|TZe3PEKFZb%7N6$++i_5G3badX!7x}ChA!w}X9M{BA(ztlVT=+@J z_WtIO;q)WBAzbSfky9z+dC5|mICn)Tm%yn(`stm6w}P<(?VjMB$(R23?$G)+rwT77 zQd@iDjhaNfKP9M#AOf^t4s3xotGUBpCGbohk>GTGK0;-_K%!!F^jCP4#5mjlZ5A>< zo;U0SJn?+^*tkJ;mbz}`7Ng|on7FoKurlIoTzFVuIO3?-y|hw8`WFQe*G|YH7@ul! z_M=oFHrqe!7hDY-=8huiLVODH#nN+ynptjb99=!a0)!k{wnmqST1`2E*PZG1&M)u> ziy)Z>_piN3>#iyv2a7FZM{Bf3cbz$WWW}gMJAdt8r<}!nNR=x}v7BWtW9p>!Hb2nm zdJup+y~6aJabNJ^L*J~Cz~grpLewtC$!A4%{3FjS?etVkO=1MbQ9L2sskn$$F{9pm- zBew|T+cQuJ*=gD5I^ek4rt?5Sf~1*@V+4=|`ih5MsZ)AIRJHJ*Y;tQdN4pgw(#j~r z;MWx;xIN}X9qp$0WUMK2H_mKQ*y3Kc`gKdQgPa%Bd&8sluQYRl1r}>bKAi$8a#g1) zA5J;+R~IfUmMNABY)Jln|NG5B^}$E~DD?~Fl*z7F&2*u9w7y8wyAD*W-pbY8rXP*v zIjZJSAO-~%Er}uhl#lUan^CJM&SXT211%>y4lFCmk!_7ZUq%A%fy$uA%n%RGdLgoS zJH8Y;ZY+5??TtXnPSXT_`p`NP@8ErD%yS`>m=Jc4h{Z=Y=INuCsg=bpezRHiJQ_MHQ0Crh`KatDz9j;QwU74; zhda?g4%iJ!F=A`+tdNA*63nO&0nOVNeSKhjQu}HS;;9ll1aI3DwBE#zajX5B>-*Sn z=46JYdMj%9_plfQSh*XT^V)&W_pp=rCcrtA7-q!nryN6|YEFHlXC%bVn{{>FIo)-0 z(oUOcC1*tid+YI8V|qNimh|7GLQE$=f1oLPMz+*2F~`hJi}QD+8%V|KdHlFQFI4%Y zcz1vtS(-P33@?;J-{r{GQA;)Ha;g-kl(`iRl4ix3s7so_zg9?~k$8D_3gy=e(2XJAa(iU0xvlT%g>5P(pdye|zZs2|!nW*|P$csHYM4C(#CA4A`tVaL}~-#@L^l?Y59;dRRXVHkW;?{x4y)wl}JXpZ!d& zz$9hoyD;oYIXGuxzm^f;q1#FIOFOMR=fvJ%@uaw0Xl>b|{bWE-xq4Vm*ZN?R{ROIm zW<%#UucDx>J72=4#+mLW1WI(vC^M~e`BqieYH3?_=xo_p(h_shKH-^aer_oPFi%M~ zP+%fNrpI&oAVivsDblaMO%oUEK6>SaqnyFf3y|HI9VhooClP2Z+tSonnXjmYY)DQ< zNLZ6w_$!)HJb88R5K`GBl2Cy~3m-Sr+#A(R3Pucdq30IZ;uoo~!1^q%+ZGa6;k$SK zEsr}}3$|Z7yMMmpgV&pSZCd#Xw@pp{n3+^AaxERJXX9U%^0d)2l;Wgf6FH@Ovh;{GlQoKffW^Vuy zcW4ZSE%QL#qFv0lm*iSgGFdB^FbZB7gLq0BbLqFNVwlMYh zHVi)LW~iCGfU`@Kok`=dtKWY2O_t$%m6*UNMlB5rbB8J9Ni)s<&GHB&*X{+)=Pvy` z=_aOg?@H#7(dM%v>DBPT1Vu(+@R;ow8eebiOT@qZ=u6hO<}H{ced*UVLG~=-uR>`? z_6$2UQ7vwYxT1eURk6Z(|M9e@;BO;J#+Rukx`~4p`Q=z1!G-orssfwUXN_t;h(;TB)AaSl z^f{C=tRVlsiew z2HhdH{7joW*i%HhCOHADC);B|W>9)KJ*KShdi8@Kdi$o2XKUQY!SVG_soUl7G}Ce|d!L(*t5m}mWL5Uh^wYM~PzpX<`VXi( z$ycImF(Motr7K!y@B)}I>qn4TTEaf7Od~;poosT?al_tw_Y__*g?2c0tfZ}N&nD!6 zOQ)zPBX;BUFv6_N^4k&9Cqu9yC&RxmEtAU@!~3fb?pMFZj%7-dtm|&vndufxY`X5arrA?o5$tDd|;zFk}F(H>x#%dO#o&p7G zg`))VZKT^u!^dk8yxzB{`*^Dd07m7L|1t;lomRiYODsHGlE^21F8BLGc}S%|7)_zM z(t0P;n=&x3DO$^odD+LJl;zEei^v-2H(!_r(Nh_q>!yNTQe=;n{3q$`lHh0Yq~STQ zjgZdovaa}jzKzJ^&W>S->>%vV&wi&C+odw?r3@y&~k4nXX<_0?fG!r;<$#| zb@02tzl&L$Z|Tf2k-)ZsrbMhNMml}D`3-V4t5ph3^Y_np^*|Z{7VV}^y{;~-RTopG z4%PT^XC`;Mi+#;VI~G5D(O~v==+RA=4u#N}SXU_Aa9ZlWHN0cGO|#`l33 zd1FieQo;U)_;$U1CjFB?z7{7`J~ikVTu()*CXVUfd3=5uYd>p0Je4LoK7Tg9j<7#k z4R5Y`|LSAq{g0;Uc7{(uc7zt())e0*^MlcG%rPUlkqdmJ00Dy~oxf{itfzWfKSF$i z!^V${&c5<~zlXkIgB|aRV*M8!p0-}*td|||1j-S+B@=duk7dM)^FU4&iF4!k?ApE&?;ZRYD1a|+{glP-;P&nQw8C>!W(?}!#Q z6H-EcnY+av0c3~AFtYHIB~WT#bU#Lkes;14wxyNmGPzk9XeE~qE?T6Fpo&O-wc4bH?`jm%xnu#g3c=-}4*&fOTuaYewexHFocuzG_P{ zN%NKGp7{XTemRa#|6$MZzbgM%7~MhnW*-_M1yl4%jEFKDi5U~#gMV46DB5R^!i5tzH)6^$izynhhIK1MdT=nQf?iP_I51q6& zUz*~%@*9GY&Z{BgL#hb}=AGg2boijzrEWn{xw0#{#!(0no3b*Q=!2GhNT@V_wr~8; z#kI9D2uzWmB>W3~>4(O|SWb10Gf$zG)$-$<>O3-H@6brapGzjQ)n)PvM*>TwhCtpq z?uvh&|F*4|A+0!xMZ(FH#d%0=D%eDa7!}hWHr$iIH;7-m>!LMqr<)Ha(cbA!%970U zqpZ_dj}y0*zU2bu@j6#W#H+Ud)vx{{G1@GbpXyh49*&gl=ApjYvQKdJSNMl zGL%4)iv?3({S2u@Oq&BHDW4kxPdJl^SRI?>YP6>nKX)xYq_A{$2b_c}O^pm>C{yAA ztG)m1N%J{z)4OD^b+WxXXbH0{VvE^YZxvu|mBuU-BVyQOLvqMLsWowk>bN#+5_0WW zu-oUcxg!-qY`nSTQjcyU|6QfwY#RCCC$>*NZ>?ZwRG4^Cku{CbSYBROWe70lum8C! z!_~GlLR24>>LgrLCM%Xxp&d6ly%rORV4vz8)sGSMsttEO^TLZYbvB+#p*=1@^VM=_ zFKh?rbl;J6(*?g~B$uHCRv4T%pUab}fEV_t+tBNc^N3_rveTVi*WM+*#ktInfkUV) z!IXU@!hLcGrGYORpYY~c4C#{oI|)Ak7$ZhcvxWTjW+Penub7gEH(x$&+;JX;J>9Uv z^Z3JSqK3M#G+%I4gmde5B!?!?1%LmJ-}Jn(Pi4|cm-P0Nn3|VfREoj~Z)}Rd)LFO- zhPhWC5|^tS=Kz+Qi&+>jh5WHFyqASa84M@K51`g zNHtI`kkB8Ujt90*6Qf&|4YU8))@i@CE_lK06Q`!0>yqgFo`ChESYF!JWOGB8kbYZ@ z+wo-9Zs)r4-5+)Dl8J|kC!Kk;v=Kn8JzT%{x^;He>*_i?FF7$p*8rQ)q|h99HQ$?m zrJGw1iw9C=LaiA!@*S)(Vy-IMPn1kyHfpx-I2bOj)W6#K&E{K5R;4}BNF!%GJ+Uw< z$#XN5$I?i`7HFQmnSu=yGydym*QF|{`E)ETadhPKv0Fz$H%6wUD$8vph=VtGH`)va zp)+F+Dd08>Q)$@<8f#54&OZ{R!26?eaHP91CzDCLueZdn%Qd-DXL%rKbmcq1&n|wU z`DWox%$=tEl!P+Ucb&I8`WTn&6B#49ZnUq-ymX|a)KCp`XBi=XDB*L8lG|X~RsYsM z$E2UC`WwaHOuRIFM|t^`(qUe7ll{w=PuUI+%ey~+{%F2k;)%5kpqy+eYfxA9>Hi$d zYMn@*D&{{XulL#}SJbnIRa&7|*YU~X<9~J#)}G8>o;bbcPu8S-*sn-szgYhVJr9aI z5qu&A6>`0FvxD1xBMbby5nEV4w6OB0QUqh|$zDB$_wqQaYx#qPG9s6wJf7J9*l_ZW zStJqMD1cYjKquG7T4CSZOvJK13Pm}&;XLi_BfwEO4LE0rS6{Rp%*K=j*EIej{vzhx zFFHZlQaTw*y=X}q3RBnwYnIZKznNvqBFMG)@ZLlM86wqqB^fcTiDa_-F(ZJI)Sw85 zx`b28c};$5^o+&pRTZFSOrIpBFnKt?6{EU(3(SCsK7@{val~2V_w9lIRx}^Rg4c>A z^M~gLWP%5^_80eV0j8szp zXRj;Oge(S`R*hc`rC)NUGOB3%f&{VCht&UJsyZukgz{22nXDBpX0q33t)XtcoKSl_ z8h|_tvr$kKtB_LSx&RvvF(xs9RXfgHdQToiD`?34L5oqW?<>(szy$@%AG8^^cASCh80L0kAUsN&FQQMX3Q z?a-gV&(kWwS-7cT5N(Z1CH^lSW#2)D!xqDlPWJhJ6r6L zUu!P1%jMzknr#Be1R1v#WNS@JH=Yx+2-jt@YIBNyHn0%gk+QW}V6hNCI#PtkmyQc( zxVb3ecQDjKQCj7_!dcT;#)0$2g4=y?wT57%iXo6W{-m^#KrEJj5|Wp!fS zFd3=(iB`N_o{$f|v6syxlgN<#Tdg3JL0{02%CNh_;jwz_NWbQxD_G*O@!Ct()40J@ z*2Tzj;_Di1brw~ZSNG$V1HDuV9gJJXNhqp_95Z-KzP2_{Tg%a1JCejc*?=vMfNtMY zPSZ^e8eeFoo@eEN%Scuh9XRJbm`@FazlQ9hTc&jIXO))Q*MQy0$-vY(2MNR^7DvCzdxB&$18^=n;IQH-o9td3h zYsoA_B+(kh!{|wXSNaA0@@BtxBJ-~D*vWmp!V;al+lZI zjQ7|hIck#MYut?_juH*m)S@?`KRp@u3SQ=fBfZwshm={_lIb67Dl$N=@S$rl5!aGR z&kKh}+5am<7d^>eMdYIv{eSt$Yhj7IVz@=Xy3mz!%^fb{iFRm+|H)>pYezQDco=p@ z%IOuQ9!lr)*sVwPNi(?h+@6QJUANbkE!3}HJyhghoTK#ajZ7Es zDA}R!8({QNFNjZM7OsL_Cd$oJ9AuCblBEpxR!Fmv;hZ$d5NZ{@cvk2MM9xsa`V{Om z16ZZ>eSoO$t$Yh-$yTVdo|<|m$56KiQ3)$YI6nQOLyIbFe=kJXc-K$0P(u+-Rq|eB z+_Q><&<_OX+H}tPoRJ9$EW;cUprGg%U#B|LAQmrbxQyr47p3QDgOJ}0n+9QOhGlW#5VeGXy z!Uj7Lv<@p6ylGg_+7}|(k~MAaMlv-qBST<~bTTQP7&RMto3KQx!qi=Ld$h4GQdY)S zQ#ljm4=U&LO2@lj*%zj+1Y)gI1eivnxAb4Hb;`08C#+9>T#Rx^tNd1HxOBYSl5D^9 z)B5+}@%7bL$A^crv)b+{z0OH^gYra6tpDrHv}=lmw#Xop6@#bfN5<8 zG9DRA)@R%d^As$6n%cO2d_N>xrDBtyjFd-*MPPA%-*mLS`7jKcKxR7ZVmqWKHIX|d zCM9ynfWh!(NTB?}USF)41-Ba57~0O(LSYGYS{>7@1WE`1o|-=6Xevx=36nggV#gnb zTr!Vp8H2)Fjvm^-PKxXz7G}#B`za9vBg2vfI@IUf3i&c^yy1!aEyb6hizbn;m72bU zi2YhT=7;*`sQF{QCU&9_dL01HS+y6D|44z>sbQz?ett&mt6wjO&WuSaXtJs!DB(G- z*lHTkwdQYm?Gt6}<1fu2$*N;j>VuXEAFRI&(Hh9>@d$miJ=|H@kUQsfaS6-4yQ-4g zZ)^_meRyY#THgO(4&+@~_zr3dHQoKc&;MG)e-C_tVkR&cuvC)+LFl+4E{zN8G9YFa ztMBA9tQEtwFWG*DMPq=(fspSMyyDz;vSFzlIxo>eBr!RlK(akNyLd8gybw^PH)aN* z9VigQjjpCZB!-0sk%Xh}x2@P4M1pM z4>lTP)|~^{xDz26G5Z|Nj2?g`tRzF{7yfMQyBGmdKa`ng;LyqTQwQ(772c}8WUs(N zbJ=sl&y2?WI_>syjUJqd^F_vGRiYhb&z7q@t4Ap5N42XM?YI&@c?#vxscQ{`o$;!6 zPmEBg$DCfOo+kt*nDPxq;ks+$UA`|4PI|E92tKFjrUX}^0$Mxy); zv(rxXwA8inp)u|s_7wdxkYs8$PGcgNv})RT@LTj~;ip1$SuKszx8Y~nW7VTfe{@=k zw3lplh>nsHM+$$K;&jlY&CgAYH5qzRc8W06&>W2mq2ll{$!s6pMczXIAYdxy4800y zWS})GQrJdjox8Y@+0HziSqa<|#|y%rn9p=)lM+*nMHrO|q6d!Vyn_5C?0RF$x+hVjveGPEF0v}?WMXpQ zoUyD?wIN8Elcl25E+10lR2zMzTE@?&iePg3tYkP}kD#$;8>aC+KvknqdiH3*5ptXP zNa%u1;rBFcsN-ZP#f;y#pwg^Bn-7rh^S~G@kqCY?V)2Cua`e~Inkm9oTIq$z1oZJa z@P)Sk-UOHwo0i*j326z)O9bNJ7AI!r193wEO-z_%7!RTc=|gD_!QAoZK1~B(S}V>> zu$ZLtui$+*X}s4#<7-iy2+qocE%(H>r)?`JQyM&+_~F>+P3!>mwGNxi;3t zlx-5Q`NUohXtC_h7zDtY@ICWx^j-o7tUukKE$lZl9}QM1KM$WwmNxZdp4k?8<%1}l zZ1+NFtH14J|MIagL;iTg-n@jUJKzO{^huPKWrr?P^4zHI^{(XEK-Pgz#@(kbHC^%D zZiao|yG|QLo5dHlRh4%QU;cbUoizdg07xJdraQ#TN=iniJlKfGDMrQ!9>hH`7w;?# zOjkgjiue3rQZQ4AR}S9?!2|PL!M``Ccs$c9NOg7j4R=RadC0LrSrwGW+VB6wor$+w zs&9Ovg5Sis2T9y-NuW?qo7J-qGc`Zp;>g-zrVN_01*`AyWz{e!E@irmm8W9Fn9VDDN@_Nn z`MM)#YY>gAMejH?hUyOq{}8swJ_c4S&pZHzC$kMy20{2j7a%ZY+l*K zyn45R5~gu}1EU)AChM0C3L(-Eym14D!cD4U$M61s@zSY1=z63Fq*R1ubY(q4><;kU z;Qijy0aD7)XCU9-3SrvJx!sUs8ZCnsA?K_r6}3C|LG8SC;K(2W8RF zVp9($-gcR*lGdZKE!@~td4SY~jouimmegEAhxX4N#4L<kr|eb<$SffmbdbyM;-O=(`_c@Nsx zC(qTtc8H>Wk4s~AAHvNKWdTr008m_-Sj!5Q&HIL(lfM8RhXxRYSxCU>q>-+%{dT5j zEJmZSzh~Q$P=I@T761>#j!DGEw!+znwTsWP!_&Osb|Eo|OD8L#j>vTfMB&pLP|Nb` z;^?+0Mn#!r!pu}X$e(GGGBYTw%aS1=f=3h8Y~}kl8Yg=;kUvc+5ocrR=q_AtM;|Sg zjQ=J99Z6hpet))b`B#yMQ=Q$EAol*Gh`|6aWias-kN(}iqk}*;c$p&M+SG?xrIb{^eYDrb{iIlu&(REsmD!~5SM)!E z>!M$AH6coxCjQfej{xks5S^zy0hsTwc0Mr!;NL%%Z`%Z5AR6piMB)KX-L4(KV;n~g z8~R05KC+_ol?xiP))6D0CS#@puBOkQ(1!na?oi$irvLvts>=B8-GL-jcUCo)#`@qI z-l83)@BeiWR;a5l<54k!H%`t4ODoYbLr!YMG`(SvqFNx92KFM&5_q8&(djRk;{CnFJnhKRbrGC?>@Zm@q4T`QsO$hja1UHVs)zo4$Y zyez+lvgFvvOWnD7tFmKb#7on=OP}gc=WwrCo720+kDF~tO$^tbT1yTjDivx zL75ARnOq=BN9WJi7H?JTl0+glNVr^m;=GY{NjTOS>fk{@Lk2?_jAi@1pp~RZWGH4} z2&Po1GJ1BpRs@@KB6=KFj7%dvUyRfXf*=x@#!jU`G1OfpaTgH8*QcVOIfsUUXVyb^ zu^mz!Q+oO2^*M;lAeN&pjZqBZr9QE;6v70Dwqi(POQ(X;VLd=ra&pdEazJTr|K5OX zZ_iUFk~J95hJ+y<5OL7Afhi3P?WXI+Gn?IJ`z5|umqY?|NonLllLSeVHCeFm2^j%< z;$3~X>`D&=KNiP`(yHZ=V_LXr0YCHUO3A162lWKLN&di=Ci)%&l*qpq?4UTdsv-rn zwENDBUzP#@Bbl>`Q}SV&+}p}2^-*Zt=1_h!%hx=4NlXNT=<%22)agpeU_b+Q@|7yT zXsM-wjzY)-D=0sfZDS1|Fjb`7)D#{-b3^#Q=cncOo#BFj>*M~LPgj6o*=%rO#<%*y zbcEnWvtnU~BBs0z11k_{lL(0zms1zd64bGWW<)0E<^`s1f=Xz~;av_=3BjYx-|5I( zLtM;indhMls{I&yVu9oWg9>#!6g|@Fh6!k|f3ory7|8I!Fj_cA?=`RjF;&n~9gY^jaVJDyXt zD|(aJDeZo8F_4-jXvZ_1t`=m%(hu}`;ujm zw_pl^i8aO0dXhf<2~cO(g%9&a0n$C#*84eX+)xuMOJ~l`-vX}o7Q3k^%WO(4Gah&0 z@Sz+pgE`$Dx{4{3c1yrAup9v7WkSzq=95ankzvDpJF}Lra>>}!GXa5(#f;aR+1dy% z5U`Nb^GJsX^0@7)u=4_uWk?G%OJQ7dAfK(yvLZhNGBOZ`8zVy$4*E|Mn334DHU=Nx z$w10ul(r@{0G5#%`fXp4=$!Qx5<-$-c496(!L)wa-n^ukK`bkL*~^#jTaB%}HHE$! zIGjBZxC+W(OYjrXJ!D8F!&K{c;ug-90vAf@9`2=nz_9yXS6s1U4%_!PQ~T)1F^U4- zz-=KL0T3^92mT=CKEolNfI!Gc>NaOc`UKt8J2RWLCp3D8GB$SV5EFHGEJt}xTxHhR z$bRRaD^2t_H)8KBuTKRIQ*(|zEtF2wRb=*JKAS(E$c|JITxLa>{@qlmbI{$&$V?c& z;;Aq+Hsx$jx}ahFH%L_$<{pn_%dSU)_3UY9RqH7WgF!YFXKmi9u`MY!QDyq|hb!sr zni1eQBSJU%$29CTAxszI7_+rH4m(~6eZJ^WC|-~Y2nxo+(I5g+#Pc)uP+VY<02Oorrs@KGW1fFefH^TZVU+uF7h~qSosI9pZ0I zTs1{aM!8Akg&plTC&h*jYMDnx#>%$vj7k2_@eTq^qTNfYdm6G+MKs8LS;-a(n>}ML zs;E$1j*Z$2MDaFL5(36u0-Nmz5dyPL ztqj!0S=0&)ds!Ba_UQG6HN)BS@NHG|#l{&?DQyKjpdmZ#{7s_5`oAsN@?HvUEj97! z#Y10@Y}=Tjo^SX zQ#jDtdtJ&AId8g8WgKvEpLzb=|8oAk)M)jus!5NJqFx(ly2dh%fA z1UDn{E%!wpwG57U9I}}abO0m2KyJFc(`bchzyRp@3OP^~KL$I1Z18&wad*~CB=F{L#<_qE_Q)#xzh{dI?t59G$w-)DtQXiABqUncNU zSf$qR@`?H_GLr9>IWE~&yemwYH*6{&SD96o%?`G*2Z47eaaGyDDc@#Wqw88iF|}y%bnWhxzO{RT0*TL|ubW&XqiH@N)s_t`IoHuMr7^bsXuQ^_Y& zgu-#z1qtb8l+4{D?{5QpMRD(w5e~@*fd_ZaK=a^jQW{;tiszc zG1mHcDXp;CeFkW9llc2&5r!l;!oSRrXWmR!x>{b@do~x^G%typoxNM215jp57UHB| zy*LP=K;n=EyCa9p0Xzx@5F|ht@7X_4AU!2WSSm0!WZN7t1D|m=%MV>30P?%y2#=BC zVU7sNBS;yC-nI(Gi(Ays4RY~>(lLsbD0`a5(`9g^jg;XUrUqSpwwFCMlJN15*Iu}4 z^IO?yMo8&tWwzT%*mU@SKfk0`%p{VA6T7~yy7U)>7ihG{m}(~Ca1|yJxGK_0_CK9~ zJ0t)DBT#hwNn@;K_FBh?H6+;w5RAEi0tq%AHwH91NOT68H*`g(vNt}&96dP94F`e& zxsDCXfbC64s7j`lWw(Ms7;k6B(Sgj~^yq>79mu{CIwo&jM^;EFx%6L9Na;5rdrTE8 zN99G@q;8z1TQzWD-HC;%^pQsec*p;88pSFk?j*gz5yn<@0F6wLUZp?aS-= zG4mr$j+z-NX+`SIS=$O^$z-c%{E)8UA)Nx9;bV|Q9KaR(pbiai-lFb#%|J_#Pw4a7%VG`K%aKe^Th!=-fya*p?UF zu2_WukBKD(i;fdx9~{~>LAT@mvjUW^`O?G9_VQLI^FUAq6!H>L1~Nx8_sF z_`YQZ*{&%w9K5juu%pQi98vW%81@RTNnVKuo@jwxLT=88+md8+stxBC3}GzPVmt<9 z9>>aHGQ-P(lHH`+wK786SN6Kxe`G$7^#A?U4}pqM02vVg`HdUw^e(++;@JmZ9(mj7S*pUe&`^*`NDBS1>HhDJO-dfO>d99^F1bq?8K6b zPRe}jDbn5+R`_QA^a|g3suFj4UcX%yyA62%60E@l{HFp zQ6F=t1&XwTCU8m(lF0ZEuoUKTy9P*fpBFW70v3fzVm@Xb9gJ&4kUWp}sm||d zROaU`lP@7O%6Lb=ZtHhr;D3xI{Iw|*_xMNq0J}~7Pu$mSj)e>EG-JSZ+svI7FRXR5gFMTr)y|%maYObbq{Js-A*BxN8@`bE&ZR(V4-*#Uf zG3wpoPZV91h{i@_Ii|ijsrA{llrhAd4iZjr?sxAMS{D0kowhe1JqMTNlt~j4d}3H3 z-7HoZf1Rz$7!z@n3paeAaacaz(#~v{YBF~v>5gJ1*(DF9e!a1*aP{fIcjdiVTMvu0 z92xoRl-CcpU9m=jxHdBL68VRO+b}!C&gkr+@#l15e68Q%zISlqKal zt_ubKwtP;z|1SL@E2YvPH+7|?!(>y!>6}(KbzWO@Zfd8!bw3~gRh|T2Y4C;X58piX z{I71%!=7QoemU?m=~g3F$hTKl&1E#+JE2ac^eS1xI17d>!RDA;rh@=mLZ1S+3=1Xl zZ9~0k#;pPB>K`MsY`RU!ZaVLNg6^TsPEr1n`>KmVE@gH__nA&7@&~B99yF$7ELIMu zFL+v{sTbeW2`-(?k+yyBt+!zOqtb93gZtLF~Ahgy7lI+SQMPW`rE~XqI=NDc& zct#w|#uJ24(lBehH3aN}7b2`Dt;YR$_*lVU<0U0z*vT;z6vefC_}|#TC=zsLHXr*A z22c;Ym#7p6FyLpv+o}NQm@ge#1h^HRml&1P>?}jt&W{CsNExd42P-924&?Bq%=C2G z{dJJDo*HX1RF(X{e_tu%)9OC=Ez;oRZ`yhzH&uFHPxzN$RtJKDK`!w zsn?kYn#aelOqQ2MpoND>LO9$xsF(Qk=vi!B;B&wdy9=}#s5m`;Z{Iu+h9l0AE!{(B zUK$w1DEVrJZpR5X3zv+sZx8!mM2&s|zvqMjeV;9oj)ZQvG%A7jkbv~JP7WVF02eC3 z%ON-`KM3C25#(by72qVZW?wQDk|m`qET6F!TsvM?oUuQPg$C4ISN1MMaXis;7s@l% zHfI$*;rI$i%qp7PlF@~(Oq8lu0jMf@z8t3-PflTw6gem{uUZN z+H($G@A`D?0QGvWxKyqqG2Gi~UF%UKO8Gv)V$O!Q)g*`7Fu*#&RV}bxn8*Vm2>S&W)q1+M;m=fq}+E1ms@*W z;fe93Uv{hcWxnS#h78^FFlPx@gT^Gc==w~ju3F2D{r-!Ajkq@qNdram%QJQTpEhij z0)s33@bTLm%Zg1SQK<9hPo1iOCz*ZvJl>$bcAMUGcs;n>L6Ddbs5B5eCB$Dkk3PY* zlZyDldxIxAk56Nz&Al`bz{0}+D;8)b9hgTDOw0J<7Z@E$691{c8uV5es1MXdo`cZd zBUgGXTo_pdXP{OX_`&{Yc``DRnv*YjTmY*BXO#WsCY;&Ngy;SXtBXh+JfEeH?`~oM*KeE14DF}Z9dL$$BS0Wgk{&o?EULrHE!Wgszf;yW=H)+oWay-5thDT9EKuap zzU)zPI@Y?t)=+A!A*g0-^a}iSXv@uS`D)d^{|y6C}PFtl0Ss-rYYXIo7o)Y z9+Q@>lt~Y4{zSA@@^^{gNjD^`nA%P+M3JQEn)O#RcCJ|76ui5_)LIHKke^ZDkZKk|xkd0g@GGYX@T*-d2R9_R!wFuN2r9AJGo zy1x#X2LPoxqE>C@B4ns#mHJ=j;e@3xX(nW3C8R?cHkQ@!h z*I>6O`}54}#WYLr`*C+#R8{JO%8hn?2P^3nb4BqTWs25Z{_)X&VRZ+I{mJfW`w|AI zWw(DS$w3(MGAwT^gQUN_d>Ye~lx)80OstNQ0Vd>%hh!p zS?2WjL7t39ge*;o=|(8oc*cX>ICf%W?MhMQ^vhV>RB6%X;*tkWT*rdmxxDoPw;y5h zMiljjya-o6P6hw{7DXOtcGp?J<09(53IM>g5X4NM>u@7v`%?*A>J^B{ zt$6agHL2H{y+i0Y`q3WYQF1x zeVsnE>7>`Y>i)l1?xp)LLigM5ldor5Zni~ARqIlWmtYEy|M25#I#mDy5M(NFh9@EH z*drPq-}J#i()i1l%#;v7{1A>|LS_IQU`W9PMjU?pn9yi63^3Hoq0+DoKxNSwx<}dJ zjk?l856gbe{5FyIw|Nr?n{&`znB%k8h}@cfT2m8av3SG~;HNZB9(AX3dm)$cn6d_(q0;8w4SDQL zT9!9yJ6u#S8&+SjX$$RDOO#dRb03;m%nyZGECA|HPSf6}oSkdz74loqb9Izz)T?n= z)J_viJJ=3-7?nPen2cUsjN9d$xzePSOR|+ySh+R3t{V<(>RApp@wYwQuM)Kxtp76j z+y?Ew>mE@LQbp!qs5;zF|NsB)00o0(cT!g;VbD5LZJA}(k!ZFhFrZz;rT_cTWSxKs z5N26^Z$OZU^HE$1Oo?~eP&SL2m>_`qD`Y*2?4}N5l99F z_=i+yic1w$@MT%-KjfAz=}^%?Ir6qC`fB~->@yFBi0!G>h+dbC2O2dpLr&!n(1!}Hz=*auiBmda70WDI zgADLYuL+1SV9e|kiG~VV)LT<{x$CrPR*POQYzlQUx<2TZe*N;HiSnIs0dG>x31+v> z6Rl9H@#9n0HhI}2?@>MXd)D#o3o^sbW6jeYJ7pi?)*2a#JKYWv)2<6_pv zKmX%@fBa|bQKyYQ=?%VGK=0$$9pGxS#-{U6cz4Ae$pOY2`Snd>=K23n@l93>a6se5 z2sc&;9D+y-b5nI?%CbB(aKM%Tp=s8(FXtldXrY3MEjg9xglwP;1i%!TS?{B?xmBQ9 z%HrBq004{Ho# zg>v!Q@$iOXA)2;*dN#Cjh4_=|bs*NI@$jZfP-adNO9iz`F1dLT6EJcOnORk2VWG&} zsZNS5i!W%Kw@>$eL+nwP`<*Y}wU0Dq9FrJ<`Iz;c;+D@b5_eevdl=1apFLwoXL)SD z%+Mu2K>;hgL%L=nYENLjOm;Gys3K(Ov_u3GVBOd(ehzV7sEnwvCQqqylV{}0IGi}m zE2@3{1)kWopAPNZtF@~CVQ*&3qP;tN68GyS;$7KLFw6on48-0ueU(JZ0T7e}2pBqQ ztqUu%9XP-MLh{8>xh8fO@Q-jA|7!l--PZu&^$dLWFx*u`Du^$%TOaM3eRf zr2C27)I3^U6M@`1P{hH8Vi5B~Xcfc8T_|PMBZT|m9|JlD_5DGjBMr~vk1jPi>2rvSw=Az~MYiIZrh}0qpAJKUlp~jKd z${tL{#+c&VwWB9YgL@8L=9mQWutGT^t0y+!S`86BuH_$)M4cEoPF8?&KHx>^7G zpk(BN23BrW%S<-XKjHgt2Mie)U3FHhy))Sii7osbBy6c~!|kO8i3fHTZ8qJVkrQMm z91feH<21}JJJ6T-I&$c!s13CGccg=i!Tk3a?&w@p@2oW7Fp+3Zfla>*L_nSq3W&>z2Cc1r@u9%`f*ueB0`dVL6q#O zeFbdp7UXNlJ!lg>L=2@U9#$)=Zc?P?9|;J7ArC2=l3E*-tR)5r2=SQeIvW#6Nf?Xl z%ONh!E2fT7sVqK>iP0^$2(xl7?9gx=8%ITFeTR{}1U`MA-nDA5T&Ay2_+fcRfA)OK z0uB%d&mb3^4kP^e90Sr%Q~u)JRDJ6Tl&Z z5z5J!-Yx>{&GUX|1xl$s87_^55pu3kK)Vwv^J=pgOgvqrS=tCA zn`)8i=BOQQ=d$$8Z&B>A(99}kRx_bWCiP+yNX=m>I)Ft5OOiE(xfKX_2tC6E>m)3Wq`GxFq4>ZjVCgx_@9$mE(7U)%rp)%WvDjiK9e_Ncwu^!Nod zh$*T%xE7Q2W#ATAKtmTbXJ??~hlwIRG*rY83fGT2cUh~k$t-TnvIC}U6S3u+Lq*JZ zP_l$^ffJ(3NvAZ>Bb7|Dxng0(H4KHy1&{?NL}13grME`_kTB#^gK?V- zmh;TH>uuU{+^Z1(et6lt$)lgn!#DLj~07T5@f9ti5RslX_){(0Zkz?DJaM=Aw8B13>0K>i2i0y zix5W^GGau45*L8Tj7VjN5bZe7NZAoh7MXe=0380W31Cz!Jy}y;h6PHu3Z?i`v3U)^QgB8T=Mrk{{QPIu%y;; zb*^gx067taLXRqg1aBp6fmv6QBj49ZoZvCvIr%p+N>PabgyaOZ9y~0vVm3~tC29Iw zvC;qgpk(cU1oUEBYbiCVRD#QIVdg&?IiXZ7VK32Hi>XMLCsq$%H@cCci0<&-SVS zMgvXO49N#Uz@c*CqZF+a9vu@gpdvzKKNbND4+{jDaoS>mgWI!w6);I+`!!ZVq>Km! zPK7{}*tO;W0D$I{&XEn}b>X;mUtl@%?Xq? zNo27&N<{&~x!Cq@c2ku$E{Sm&Fx^gEuSRq< z_BkJ~|NF3H(t-v_Wz>soA0SC$`(I(`KNuC2QI0U$K~xFs{5-Hc+F#~wT{$<|csst# zW9Q%L?w#Vb*ouD4*e*2W@tTh++FpG!&S9`sbUK?lM)V{!fT0=_1U96s9ICQ<7z7@#D#Yq5p=-0V z%%H63Ou{GkH+Nre{`E=K0{{R31%WLlM!F0S4mu$u4tp@Lu()}Vhk;8BIt@w!qAcJH z22ftS(A6D4#7bz!A=J@}G{*i4TW`uI!%$SQ*=w%bl;p-P#oQ@d_eXZxKvKh$ ztrQbBjEx15k;)R16^2sUMtNkBz(WLCc(X}Vn?C{2Q zowc#p?8>dOJEnbURq1Je(_WTGPfxwS-H{P!j4>P_o8>|G=WqNI{%*a|ElXZWVO+w5 zQ(=@01Pn2VK_Co92Qc^nOw1%23IL7{2v!n6iZ;H4^F{%fAPj^uL7@QbtdSTD6dk{2 zN&cxphth^sEPEGw7Eo6PZB=8k$d+Axp9$Gb`bd?oL(zHq)Ays8UX*X8jtVA%(1Mac zt(DY1J{4QcnU_4GWumkSk5Gp#KWgi%yM30F5Vy+vx&E~(_M7>?&TsQFU7H_gu}@P? zxnu9)%uE0Kuw>;91%G2yOKBdUbg8R9VIs3v5tU9(XwAWuB<%f$3AAEh<1-%eTJ*CD zC^e_mLmxLQ=oCmJa1=!BmCt{TomQssD8=kRTQ#LCGDD%wK_$uIa>VfQ(x9h+TaC2{ zTt01%*hD2Z?-gk6=6vIK-0pv5&)mpg~ zcqk>vH}F#Rf{hTFq8b}Uq~D0_P`0aEKNQKL-9t{C!wZx+=?&O)hCc!)F9U4}Sxt;a zD@ua@?%Z?B_JZ)}P)jXvN?kEaKv1GmB>;~j9LCY^R?QaNfFQ|kdvYpg|NmdSkfBA4 z5Q4gEw-L#S2(YTA06vd6EkacgBqghXJyD=U0_Wt=^%iE_r+u<&hn5kb0gGP7O_(KJ zb8&{FNq4$n1M&&Ehhtp2o^ zkG576V#+XKRP}_WY-6obJ|Q92@-sf=9gI7Xrwt3?waa|Sk-YLQ(?bLZG)D+-5ay%T z?_`F*^<9ve%oPV3>VO34U0G`{GkRO2>n~x6a}wpDY3w9(;joWveViohuFp8D)WPj2 zxk{DcmV?44fQ1elxgjMMB$oSYTm~bC-2l>J#u4asC{khr0$i3`!yZErw2j0L>N1AJ z%CK(s!wJ?6dCkZA!(SRFreSK(0M% zQ9HF~6x3Mc<#{%C6!9_`>nhHt6RC2^lD zvL#6b@fY^bro3*RN*X&sBI&g#>&jkeuHwjCXlYktLk2(n>-oT?M3kQ)Wj+N}g}CvX zgrIE2rm`lXHs4flRwXdNZIM!tfJM-+Yq$C93J=K^U1SRVq-JYxYnKQB&lm~?mQdIr z)5JxW`ukEqVRxzR8KdU^r$Ybwp#hkffeFcFlXD4?5wQ@$3J=IJabpb`MT!R`n8+42 z0Kgz1AEVaKad?l6Xb!+}YW^0+K&O`C-L; zF?u|yox}yUNvLTgVRIsVRB`vxHJJ+VTn3$n)GKjrM5C)bA}uT+_nsDR2T9{$2arq- zJ(ks#dYT-MIc`MMrAPI-@ts@LDsDcaHOCEZ`_NE27`**q|2^gC#n8r&REqi_o-{mX%3lEBF2T`>lGJxyezIV@crD>C!C;Uw zn#1b!K#<(sqQDQ#DQPPiun}pVFdSW|? z8;8n=>b>boG*TJn`q%*#0$_v4#gP;>$l^mF#z(md>3m$F;bvAn%A)Y6Ed_`m9Re0) z7B3pp0{{ui+G=iwf<`3cj)OqQQefYZvM2~>Y5CV983S zU$wfBmm*n{HjY8|92;sB*Jo$M@ju!(gTH^K)W<6^|9&CAzyHv#)Y--JvsaYkOdLF9 z-jFntA$@`Y)98}z-*(4K_3cp#bYy_4QM)X+r8tSut0@pRECvc>&7>3(i5JC|Kx}pU zXWwoBZXyAlTMxHeByJR8b$g z6h_PW&ukY6gF}aK|NF3H)&KOjhl zkf!C`%l$AeXkd7hXm?kNs)@!4DhNy}FoY2LL+RcZFw*5ZWv-7DI?}e{K|YooXI8TO zeJW!^kulzAomtOI_nIDWK|k#g9y*T7zKxt?z4!*D%5ZR$CHBPN0E2MR>9chRPa^vgj&Ye;9Ra^ORxZus`IVDpN=S&R>!7&lc}v|8*YZTAruTYqY`)nxF}bF36(=9$5wG!o~OX?sHu`*;Z|6FMYJTS>@GxYZ?9M_wyMZ{O4P< zHHfB`Ze&u!N$2#O{%4KnB{0XD3WcHc$EGZ(ZWyT<%oT0(T=vH)BOzaY>;$Lo6#Y85SwNWn31@B6uB=CRrR*sakGKiq7>k#u)c+-I6pl(>9?g$;FkBN~{HT=+UUJB*1yWh9zrx zjUcx2S>C-8-Ymb|_Jd)YC1Qv6Z6nNh!s!kDX;(nuwW5fQ*M!%&%_!z(l?62)&c zRjo&k&|W7(FYJ~O$k(eMCGtuO$O#PTRv~@KE3gq?)Yp7|^Gq!Agu&2Q=+_0r14^3o zzuh|j`k0d?f(u@n&s@^^4L9W4E}YjU0}BPqZo@4#m=honjV%c9AOVq3A^;&+6hed| zpy{EgB%l!|6-!_^^F+Rn7w*$Wgd#6RYceR?g$An&+QptgMb_pCRo`v8K?8MvU5$pB z+O9O3Te+;d4W6z$+0xVLto7DJ#S|NF3H&42{lXW4rx9q4HUn-67%c@z16U92#7Nq!J(wTGoF za}kLkn$cOo@fx|73}uLtQvR@g4lS1?+7_1aXr~F-(hn==3i*k5GYRUgBgrG2jcbBl z&X97GUcsxvav?LM-VHC)g!&FgjHZ#sfRwTG%2%)$dF92q6g895n zi0tVCr)8E`CCX|mUsFDC_Op+tbX=WxHI()tV$fCIhJy+4VElv~Qh0D^!(|O#YG|ad zL^ZZmtAU*6iU;H!!OkM6^%=}CoQP?tuZXmlgsCkhl_!)}h-KjT`DvY=K6}PetX#Cw z=!w@WESLgOINpBGfsn&D2RLL#GcaaKkc!BwTO++?lHIVeTckRqw7Z{ORAGJ6Ps+`@ zZ$@*##{NaWkQDxIY(%opLF(y95Zx<#!Lw$|nkvP*Op|Z>eA-v5^Rqm0Tn;S_1d+Gr zt)RA(y4!fr32Y&N@CV9^ruLWp1%V+qA-sNB9IOn&c01|9JDn(o$?pDGU9>KKApL@No49tIWq~guM-gzjq-sCBU zEEjdQ9mrJy6~*+H^TT4d1SPnmWTDgy*>cv*^REBAjD@eHTfs9(mlfGtAnK%%!VH9` z-!0PYJmHL>oNh01n|==hBbxvFpk(rZ1nFj4dk;f;WTWcsGYKCQ5szoAFn6iC5^TMe zA>2V!-NQlj(#Hh}LH-}Dm9gz68$;CKvcd-QObjse=)uUZKBIf)2&U#VH5(y%t zZf$%5rCW$y0K2GcyRlMmnN~*TZoFa@hkY zDG9@3rpTR2+VQZ_l-g)vR(m5*N$cD8x&uXv@BenKU2hV>MiPo`Ia!I1Ih3imX@)S6 zf_a*@8eQ6wdRlo(syt|NEe1-2epDXV~irHL6_18!co>mlNfgU#z5gX`GO( zwTGcBGcQQj5;>_afcYS!rPCeEgb6Vr7g;)3f`-^JlAW`$szXIS~>TK}uoa(x@QRm`L`L*3JntEsf1aJdxV5m*1J05*cc2 zbz`a#G31U+|J=1V2AJzcM@SJPBMf748KZ^@IbwG-9Ajt78G0AnK0-jwhB%WW{KHjB z)UHuMX0jsqjSf*jLUL}ycOtW2&iy0=x-wrXJjG>;=2!LY!n7p<1gyFcOwnY$H0*b? zqv3d5{*{{;iC7Au;dYu+0O|_0Kt&n}BD@jE8lG=oH}BvSAnJ`M*D~=M0$P<+94KrC zj>iz1hRkzv%TW6dcXNBMyVJayxS~%ix-jy%D#4{RNh!7Hb-xtIAq)Y;0@4+q9F;GL zMlEvbLn~U0Uf`crnSCa_1(_s|ZZL;aZhQZz6wKXf%_y=apGqYu`;FGzy~_QnkbwqS zh^Gk+NW-C#Zh2~mLVxC&+}_Et%*g-yuw>By1i)z6`z#&Ea3pH)Vd+g1ou6s!BzLKP zk8CxEtnB743)=9a5C@`?O5%ZzkpbRQboDZgbb)aaFUO#wMhIyBK5f_;S#qa*mh)Au)`ppbAO`9?yhPg#bM=+$01U%+a~~7cU?g<-yy5 zdsUT$9RMs4mbQ6<(IOZ^w}&bw+_3&-bcDDFY={*XI9(-!_bsn;Xi&_Fk-AAGGcehv z@7}6pnP8I5CY~c%INMh?T4pV^vYmGSg8O)S=A*Y{9@?5?qPx>mnmsfg_RM&BRH>9v zm^wj_siO4J?~97qBvqrq!Vw^i?{El69wrtGVkn*vWdn06F1SjLUr0U{rpMi*r(Un9 z_Y(F3Bo9KTn$p@LE3vER<%UL}Oe#kZ?P*a$TK!+JT47pR|B!l&Xih0(Z&M*ciGdiF zo33miV9g8&a=?ZNouM76AQ=g)M4H33Na{s1`*6BhV;gQcwJS?wn93_K+j`|@t2hOy zD_t!^j4({f4@1V_> zp1&ncm`*lP4C$S3&py*XrW+v&DX0O6rptAXIwgiJNnWJhWR9PhVUDD&5Qmj4kjN=W zK*)fOM(3!qnkE!dK`Kr9PNiSbD1cltBNdXPVJXJ}J?$Lyp6%_>0V*G5>rBT1nyyud z4n>N?u_zSjwbmIOc#l)<)gfz}`YZo$|NEe1^?(G`XxM8HLfB#jJ0D?(TNCA%VeF)L zscep`{g;(2>m*@{aX9%Mg5;!?QdW?Z6zr1T*o9glurUh)4)A8e5)dL(mzhSJ6%t}F zskjIxk7G_cDFIlx6REhZygG+6QU-wfiU^e_NlIv`LI-P0a7gucw)3+E z`6f5goJbbomh@Q59^!@^u#tDA{I$Hl@^L0KP9*%$y2XNmjb)cp>R|<3FEoPQzvaCz z{F1+S?&^rta#SE?lFTwh@IVqi7pyo*s4xIP+c8gCs+A=Gk;h8UXSSmguu7L;vt}h1 z#pX1M+OaXihWZ|3B{K8bK=&VR{%p#ueXJ*x)w_M~H6pQ&_FU@FEe2Q#0LK@vPyV56 zcQBb%5T0g{O=;IOsWNhE?uLnj9sve$W0U5>+iGtM`Nh-=4E_zY#5E zZVl-7y?Skc_IVIqkmlt(PB3Fhj@o7UZguOW$Sem9iL&W zJkRN)lk0tlv6Qq{hWbHb@Idm!+_C$%5$H2)a?o`pq~aCQJZfb9mrLBq~R zZe{{yY}UKDsRJNzR4ei9!K=J(d~dFf&D?UCz#HdUc{qB?=YZ+(RKTslprbk^Nezkw-0JRi!e&wQs7g zdfbDNcu5tcCL|My?~()sMM>3tl-(D0>ii#ThApN?6FE^!+N?g%J!70mIB9Je8A7aW z%Bny`2NOpixF8`-6UkCNS5s3csOwZ>4JoH6`%=}1F?&G~h!KPY28|yPJIlvLA@S!5p7`xi)5W5+ zt@0!WMRNrBCTMv9s{4%{qQf(0+H#mP!UJv^KMDAL4|C>zv7$O54&s zyZ}`gAW#(M$N)nKVkZ1J7!XJnffrDgT&)j`IZ`0=I=Rp0(U`2FRb@g)gRwV5lFeI3 zh(ne=!^shCvf})l(VE>cDiECY=gF2R(n9TQ!^u4d!0K}qs>X3u zCDKQO!BH8E9C0R~g+SHn6-yn*L-~;*YV<`+jFFbl3|-@FtJNBv1~$*lty0wxoY&M? zplHw;1iUbF`z?|tx&;5%Q|3n>b+UszQ39%Pz$O3tpk(}j1pH^%YbGBmV&m%%Wh<2w z*_mbRu@1T&?5XsC5fHnX=LJ_gwVvl|`=GwrB zAh(yaWR1-O9;zc3)+%bpR+vWSciN8|yGaSEb?5T}~T!m=bh2Km2m z`%sh0r|U1-`?g_-Ixjh$sCG@3rk(lhCSk`$)vPyHq~2W7+EuMjCPis{LW< zTNEjiWvm!{>BpaJb%%+(jCQIam`E%#21L#?P<+`^be?774b%UZt_FH1p^GrFOUcV?#0O@yc2f zG~=#rDsqq-tg3`+KuB=WC~JVG300!ct;VHECsb94FzpS(IvoKZ!r~BN!3j?x-lMAG z8J&CQ4DTE(22^vcYbonfYB&+THJ@zlb8UZr{^P5z=cpCD96e#wE6D~9Ex&AknKkci zZ$CAS;chq8;MY~PGx4or|6bRnV^;R9Ue;(i-M6b#8s4j_=JuYy-&XN{w|~6E_NFTr z9~zQ$Iwpjaz-Fvq>mzsfE=Y!sTO-i`#yS;rN#UodMrII5UG9;=`#DF z?*6s>SvQ}ZY7^wFT2}6<;WKY}N9MZ4K5>r=Pe_nJNeg58tWy8A9?$Xjt9G>BkFG&9 zP@xb296?Q6YmPlMv@Bk3hQ=85WGhBeAZt*@awHDt0*)Cfp&;3U38uM^0vM?=ju048 zpnyC{00Mn(z;4hV*3!OIM&ApjXTj2n=zptVSsYZg3EEqH*0 zF;&9=tSKlKa+EI`%_bE94G?-_3K+T4;##2$Gw9rK)YA}PVHaf1_W1203g5!fdHZ7Tx>KYGCXD|AtV5o#FtsSFaSbcyc3mnSRqd8km)mBx-igb3xD8Se z&e`IbvKv?VZ&hs9se0vWR`2C%j*@b|a=D#W&bD`Ok6F&uo>SGg+`k(2v%A~bYY&oT z`^vR^@TIFag4JxKQ8w?e+(~v@XEDZuk%=c>nt}@@aN;b?_aL>S=+}t+t)c$ z|CN8=mjC)Hj1>`h_T4cO&2n4z+T&={&QC1qj3i}Sn8Kn0r3TBWX@m(}GH*kI7_#Oh zSd(EXL|x4@Id~u%lpI9nD1tYO3^D@@h$aLO-~@SCLZVEu0~!njJs;7L%Vw{715$t} z2~}EK-wvSRXBRPx0K3Kj7P@}YUpWoobRK9DBw>RAh9D@vu%#+p>99<3ZzhID#gU$<*oNd?f1((%ZV4-mMyIalEPS%WBk|wHJG8?uGeu;8w{#&8$b~ zu%m!ua`>CMcKm-mSeMFVZ_Hquv5_D`Di*W^0}$qR#NtmFLS^nH3>R8rJR{Js5eif>Wq>6Slrd4{7&1xBB48X` zZ2-6tFat**4Iluy(Deip4?u+?!E^%!1+J3;Xn}0S4q`ovP<02fqC`X|QY$l2JX0;5 zOo5h3!Z2pjS_!&o5=*pM0|bDK*rJrG>qe%lGdXv5XQrBur9i%JnN=Zi6Nj01NXs~i zXO1lt5ocPBQ!+eac{ev_ti_UdbuIt&`?}lpyQ-te14-RSS^xXMWcYvyp>)@7Yd`?J ztO~8oPykg;lV`n$fGH#iE;!$=28sLu82`2+;Ga=!(3tPX0^IPg!)RrnfyqQVz$-Is*j_`eRf1W zaS{7fqS;Ni(BWry{@b=OTFrc3u;9rCpBlC^_clHI&9cC*Apf{B#J`WKQnal9)9)Am z>wo-b)7Jm%70t7ldd+tkvaV1gK)0;VZKI=tB+SE{uQ|=X-*y6;lfS{% zK$(C`u(>ImsttK75CH8vJWvyD!czi|bHP|sUP$n5wMK(u!FDs~_`mxXYd2Z1rtNE| z`~Uy;)db53NfuL5Uo>PQW1`Z-fO>(=so5gv2|5a31wiAlL~=~fCf0+qasrFtYPchK zCM2@A2t)CsE&#PpEos)6joEtpZH8UP&aBpwVr^?>(a`p;D_-^-#waPTUbCP6+lT}L z?P{V&+)@(?#=PTk+R?WZu!JPD-*w}=IjeU>DsbY)puuyBVh5WeP8Jrm zXg*v^Bbx4kK33jDf@^c<2Cz#t8yM390=l2!VYY>mDhU68u8@_Gh(#FH(JxKVa}8%5 z1nX^+ksU7QzAm$Y0YE_0eM_&>i+}w*o{hS?7^1W2dK!ThwLl{yh2?I%MkTlam8u}H zQRC)fFjU|Wp$Q;$RXAZeH;NkB9T+Kwx(wzToUIHoe15uRvUy#($o10ctr2ZOrN_-n zN|S1G5CBET7hFn7%%T>Tx;c`#W>jX0L|BTIi%b1gj&-(?sF{nqv;+6OJHndft;-dV=A`C`>Qi+n7-@Bb{gswfTc1Xz^(w;5iXY)YMyUQ%)S_VNhJyj4hQEZ= z#zeDj6nYG9h^0mP^NW1_;u}j0>{MJHY0%DM)MvyY_=B`L|Ul zgQ@v{k!!LSbr$Z1Lju&Q%8euf>Sj8)Dy=1oTIZa+)R=NsGF({^Ln)~_q3qUNmR zwxK{vZ8Ec3NkJqc?ddhxWOm>i-Z)VOPfCqJ)n26pNM2}Nndf_997QYr%;LDE)g94b z=9es76D;yHHe*h-iX%mX!Ch2>#?0Zf;Xw|=vgQPp1+H=?LkO*K*v^DP@;^F5k`ZU2 z8VRK;p>jfvZ!b=WN>$8m2yW%#-Km6A#o^wyY*wbY_(@JBox3rlRlje80z}sF9YYc@ z_v^oQxudE|;%HV&NT|}ErV$iRU3TIrv*Pg)ETJQU185Wwk}WXBae1`l3RoQH@yW!A z$(jW_z059V%oqGQKOcIZi{r`>Oy5qexd^^IvDo@sU~?_D?DF|;QNM&{F3dM#b5-T) z)0-48*_Y-unN93}*=7p4*=TC!+A1H`=_s|jTJ&4)<*#d7^4W4ogi0%8(U`hh_BAC_ z?V0oMUz3+0U2Eq62b3TX0--4WrX0BeF$GeAqm5(m5FjW9D%?^c%IyF9pk&;D1lnZT z`vxBxW<(nuVeDBGDUoTcFn6hYpR2WoDP(j>6}m5>*YE1rK0T>aKeoirIIkxJ2aCj6 zl^`Q+_W!qj-F<$Qzwg;uQFpbYwsXjmylERNi*2D<=! zP;nhVS}S5c6G^d+0yLkl66jo+dHv;Gi&Z_I%p6X1lKa?|;4S$*^F`BrUB zx93Cgld{^G!BBmeou#meInuli!+dqfX|NF3H(tre_ zXIbkBMXGB@8vS7-eG?IXWvrxkY1*KxwT22^7($@vBv5z)$x*_KN?3^z9_g#~THG-x zT})0~iUR0pn6n;g$g*dt+ZWox9V?`mU9uh0Q|jGn)!Vr>=|}h`Wk=T6WDbWDa77@o zQ#3-A+ou`-WnO)?ZZrS7A57b2T(s_8`#=<*{IvsIQAaXXZ?(&tDF9%(fQJBUfsYKm z@Su>W5kTTbo%jKBfj}}cZTj~Nu0(e;7z5C{lmgGJ7d9c z|8bQr)@5fj6%n2)*Px+?fyT(wEICIN7%V8KhlJJJgo_TXp#JMYT#0*gW+RIb?Z%}K zqfkayM8tSbzyV;oKqZ&9uQ7W^G4K7UC z;gAeADtA>;<@6muj(jZMm8Gpc z4hSIe!^#`aNVsT9Ni${pi1!MNJf^<%Qx+uGGf_-2`D`@4Fg(0L}35>pk(p@ z1wdxmdrw2^eJtAlWnynssh?x)JrC)K5UhQbrX> zCCPp3SUPmCI5ofv*CW1kVZr54W@ROs`DWEIyWYPy6&+Oh|x+_m3JSM__5lKl!{ zN>V@rD&DqD#{n@|1RkzPni3@Zpc;@s$edf$WgQXDTWpfL-@AS2qL_`I@0v6imgUbPY6g z{O;wS-v5g;X(<1Dxg1NEI4&rNUv5)!BAJI%zTDONp5t-b=h+Gve1!PH$PT$HDw1NN z?uF=C6Ef|SZvKJhWXi*lgi&ONAsH#+#LHhu6)s(kW$Ab@oo9BYrmHl!k~tD&Qz}ZA zD)P6U?7O1)Gf4zhy+j~ts{V8(t!|t-S@s;PIQ9~a-KIH_TcBa%(m7t_a;4CuuaHg09Z@2d|NF3H z&VU5mV%hsC9olMyivMMaWfQ%hXRI+6>4lJNeTF5RmyM)!NzfPoaHxg`Zank1{lM<#dRR|dyanF|3nvJYAB92 zfFzvFbd?nq0<|o2I{m8+t4%1}hWzHOwb-wHCWl*Es)uyg6hgMr-zN&>)Uu1C$<3hU zWW`aHN)X~$6&rlzU1q(i&Liz@$D3yw{dKZ3c}w{FKdEHJS*i^o@OYm|t3>rvgGnJH zsRx8NIZHd`hcrV+1?dENOe8Y&EhRbLM!L>Mz8l*UUEVV}NSlNcBR|r5oA4v|d2cZ^ zbI&&G-vVJ7zN0bEwZ*c4@$hBw6KLTHru1#+aL89jag()IofD@t# z;|*$JpS#!0Fb-KNLGW6}o_G5H`>xg8)OCb|8!KBj?O@47Sb{0ekq(xE;{!q!LLVMM zswmZ#WVL83>8ltc-mGG;HOCq2tKv1e*ID*CEv z)S>tDQ~}OLQ*E4T(;N9M%lR5WcIsnqhkm?5)hjJKRadJ`CKGBAs1m6 znJZCCku1CH`dKEOxf$HVb$~+RdAi$0iokeYS6%zI0B)cZLwr0&>rC3DK?tymvpyYYa8YTx1(BVTffEwV7qCu{9}o53GHWCQLlW6jENWBhNHUD3+JsUF}!j z>0e)Jw)Q{W0l)wN019o)KmaO?$yfzX7F-AfH5kHy0-aH#E-aL2j6)?53R(@x0&}b! z5FvG<4LQZdr4oyB0i5uw-e}Tl;cz-(|l4FPT%nv2!mqjq(5pLHEAvQK)|p z@wQ*0>21<9iX#d)C~82grnP1vd#6!+2&cSI5E-W7@Dp)<@PBdf;7|ZG?q-t4vwXTa-4R^d%5eLC(%ZvlyxGPeXOM@1o9HUgvHHZC~i0X~W145E%eS7o|#l>5TRT z9Wv}$qyPJ$Waa<`V`$ZDPc%?*2g@&L<9}0qgJrBe4e5cD>-~g@^i50H5nEStRuK|d z+>k%&12(^C+!u`=+mH0_-r0{z%XXB1;sNb}09?!Lk+>*Q(Y7P699hi`uz_DrjBL;U zXMIY>-E&}!V>hZ5keX6~;!{l`WRBbxP>y1(0}ui1~EiuZO;v3=(O{Ie6YoH1a3r zGBbEY*eTJdDD!=YC;7W=FC{@#0Wg`9Y(dJF(>$&^*>RZB@^^Q)@Tc#){LZ^x^2_@X zmHy}NuPFW9e*X_BGq9mS)ZG!2Nu_)ACXA^EQ#&XPq8LVFgZF%>1dvq%%CcD!{+)|C z@a!pKM&F0UF_R?0^?~%FjL{-YYcu4G{n6ekF*a+*I8d-`f>{>R)F>`9gnxrz%2u_o zy3vRbBYnH*eVUF^ojyiw;`9`fUC0n9^lB3!v<;Y5PhhNKs~kzvhvYaU9HBE2hf5)q zghH&i6!~sNtkUtHwm!-ySaqMzOR~W8!q)k?Xjj20cqXv}k zc;;)P8cacP&ni8o2gRa|n@A*@L6AM0=G_)ePA)<+ZEUj^BWE4E&YM@0yogP6MGm3< z-SVwUvvQOF`>S%-OKVd7C6B(alOg#Z*#q1O1_VXE8tOOL*_ zK&8EKF;KM(#l~B;9z1E1s5%ZVme5v5GOfHoVQ73oHkwCd*$S;r-$+FsP~)In`JAE? zC}Sz&Ye_iD`8akoY|qXAbq^bUij3n8S&E)s9wuaPO;mw~1Tx^JAfipyoZdnWS=a?( zejAemGT6P3>cR%mWlg}6Iu+}F9Cp?gkke05vZj>@c_FFT z8*%sfM#YQWKOqBk5t~%rDcAvscKvjX%xO@vwd1oQ&oP>wUH{>s z35atF@~w^YD5?GAC+n@l4{ax<|dX^D+sU-|lbEzva7j zR%_c~TaPy00S8uzz#g*8>Zq#dw-K9xTNpv$#>|dG24#p1iAvo2mtAK{o(Jor3(s&= z2(2EwrC$WW+5h{XWcC0A=V93EEJZqf?7H1yg^N>_k7cYd)ajrRtM!2zjNvEl3Xh_~ zy|5}AiB4=fb!@Y*Sg`gTD+`833pm=HkEdMPp?7vKT8EJ=Jj41Hl{{b-H9$tCO$Rpi z?w^B%9XgqhJynv$AP9iZR^wQqWhrSJYl=q-2X+BJMF^;7;+Vu7?p+EB;=95)=&`%R zvWnV-^M1fkcZ*k(Aa@s-^NZ7B*d}Pp5W8}){{wEmxv#S8MOHP^Af_n+i6Dd)hlZf) zDpSeSp$$?#-mN(uFf~j8R;oiSsFN@k7jrSP;{{-COS-?nBNVjSL($27N)+OxwNk%0 zN8{pl0jPWnfWr;YpoI1%R4H5w)FNhumaABbd4r`8T$ zB(2Db+4oswvrIb4l8$2t-AH8U2(dK_fC*UR1dC9Mm3Y-AI8{$jNz+`U2e!NR$P5tS z!B+win}-3|2V4+DuzggayCCS1pVZ@yLSSSL<7sh~5uxj@dnExZI|nj~l)D6$EnaJ{ zCSvRBhwS?%3u`xi9$n7D8#d)mtWyHClUi@lr9P281!7~7M4MWv1x(@Q+gy7!PLy`UGYP)V4ME1}WqOG#tl)-Nzfvo^&icD!>#+LAA z2BNO!&nZ)6;HwX1JsDuJmZ0vtv&HAg=d?N+&J`^=iBgK9aso!bK3|63$p1$v#*>H6 z>?_!+wm(j7{b`7-?T{h{P77c`&D0Z+piH>L+LOlyBp^4ib5U*`=vVhwQe=8U@|Wka z=YM70@XJipx=z)!CE1&7=R-VU5D5Y?KodBo_bH&909UJE07`f|sanh$Og_RArSB&I zX*@wNMLjR2;;mcPI?LzadND54Akp$@Z&1aET0rucRg&mgf8Vv)Z&dDNf+-mZ8*0T& z1i%S5HESG)DXe2o)WJo=XODmrfhtLFN3ZZgff6lHn%Af(>u?RSLKj)KeSJX{J(;*> z8i5xyeTX~k{))s)Jg2on<5sLJD@F^~WepS&$A)Y+YY0UNkgKTV*&rYe@r0OBf(gVh zu)LxxTFYII*)*Gqh1;a!V3pf(2O2P&ryVOQMqMW}6!Ph*PVkRzE_^MDMp5k}CHn~e z-#X>@PTFBW4`v-!->MGGes8r;V`fY=9i>scf%sf%_|=T8se^O}G1X10_FLb~&wtWu zKJ3ZAptN?;NcA?FtP$DL$CD_h$AwRXQfMqi>s0BWn-djW!lwj=8o&{UDaV!n|FZgE zS85RjY_{(YlO#aq3jh0{Wc+|6q-9v^3>?~Jq$=$*3sVv$qhqWfccFa{tTbFCbY8(i z7Jyhl=qO@Dv;+bxVKCKRy0Pw(PSRtt2->rnpU{Vq>vS;Z+k7T!Gxm>p0SAh-U0pw2 zSxBt+^2+PCdh9KoV}EP3W|!}Eigs7I_FKqnWX>?d7G<4^wfyeJ>?2pyiHB{I2V<_F z{PJ`t`BFnC-E7qT5An*%hRBwg^L3Z77v14Oy4wq?U3&I{x>k~kEmC+Mrwnh2@JH8V(Jx{#dOLgsGW)0k%J^GNS zs$00_$&hWu*50(e2klPxREmaH71C4d_u{JzD*!8T6Jv)907iq$3{hroxtOBEC=`9R zcvwgP!>~vSj}@y%rROCRfpthdQ1(erM-2zsVYty_#$=vqi*a1x7&-$^6Z7gvvBIpQIg`WPST{CT0>EFj@S|sAL@+h}HH{ zip&#}kg<Cr;Exzvl(RaILt6KWDnz}|$~?6fID zHbkWf&^hUntv}5#p8K(A%7>Oy%=ack^I|e`*mg6GdmmHEnJKdcz@|U|<^b!jZ`+~9 z3AFuTpSgROix3VWvK5|^soLOV_II0M)jB9_fX#S)1`754!A1X~>$>OqRxoFqpffm% z6I*mD(XW_shAf%uo)|esloUf+vJ|Of5|wvNt;hjc5pbn<_wL5XLLpkwFtI7ksYakU z3sMLonw3V=81+PPVN0qBA^x5~!a-IY)?eZ5XNx**ig!2B?CBuzd$YZyNbfEU!69-) zG721B96VTZoM3rH8AM78Aa*DlFwpTvNaaxoL`2;vf*f^kLtUNk&Ft~v>-4Cg`vMPo%ef&CQ^J-M2{0FW0On zWjxhv#0HZ+*ur!y6A_(ZL-b-*bq?)pfj2^-^7wxKr#!6H)5pW)Mclf7{=|Ks?OT8S zY9L1-Q6%=eZi}D;f=<)Ps{i|-Wbpt5du7<`2^`v6q1W~CE-e`l;c3*jmdY`ucA zT#?3-CHb68*)Uw;&?U=?zh+x>T7ihmH*%X`M^=)?Z*Q!2J?SR?a=tzyPW`(1fiu5o zYHZdCE4D7*4e>oBWR)T6(}W2sM!a0nj8a+8;bpbh?Q4Y5H(~i3YgS7-G|$WN9Ifbe z_s>nOb2#3$wYTf~*7nVN6^*;+e}c`V^tPW&iX?7YG`6YBDKc)2e#v^FOtI;jo=#ra#Hw4W;OtcrKHFXJ*jj{~x@DxEwa4{w;a%8zP*J#d+i%m7#!Q9!}rb7*0^*Pghvv&6zcKcOU z_S}8QeZx(~_AMsuDe5-3*H@GDqI~EV?2jo?sl}NNMH2W@X9E4l7WBs7dA1%GIbS1uL0@R+SsZL zyuwixfAN0ZHDx6jEr5L2ZaEPD`=Dg|00gpJ*=r9o>RhBd4Pk6)6fKKktUS-@T#syY z94s_M4dzdyc#^n?E3mnVf^0H&vm}{eN?9d?uHd;H@zy&D;AJ6F!P1TCL~nJrE~s)D zDVj(5oAZT0<+BpVPSY#ON~-#HYA+6C&6Gfrs>*v!5Mn(Qlwo+YWqQ(qKJ{szcDX!N zUnZ4n)BoRVa{Z#GMMN1EtusGM_nPe;uW~*;U)bH-Z2jE*9>!?Y&cwh}01E&PkxBmG z2mE9U@in0%BBzu!$mPl|v9^h+xU#2)Cph~8I~?L5yd}txIbPjgVe#>PdR{g6A0T#%q2q6bn2^8t%F@G!AxJ3Wuz1s{I8v=4Yx#4qm{%aY$}`YSyRB`+2$RKC|v)wR~$TlXB5j z#Y?4l%hyj~xqLlUDPK9b!UGh~c`)C`c`RXz)lUQ$|wNG*2VpjBqF8t)NuQ&q1I z3f=t9`)kBdBWq9*&%MNv-F&4S&)etS_xHo% zPpOW(->9OR&+-Mp0)l|p6a*GJbt74$-<{on0AR524YC79Lx5-i3z*5$4H^K)7);1q z!G;V}@UU8E>c$2*9KW~%q>;n@gR?KT)zntz*#EoXpLEfKWq7Qy6ziu ziA1K~rQE?LR9&d5*FEEiRb3F|k-HD2B>2^LY-+lv7qXIH8J`_N?b00mxP*zIB93U7t$53H;KCoSh;xxEqt zA)+exHIe}HxnkW*5vI9}IeIA~XK?alKca>TrO+PYH3_$NDF#83`O8rL=&i8}*mB3% z|K$D@`JzKvS2L~!J6m|C$bAyqhGaf&X8KtTTe%{YUZvN5nXtDB zWl7k6io`PP?!#nRs;vPhGyf!qtKm77+L+tD7`v4nHRxb;HzFQ<+dQ%X5u(D~#Sndq z_>OF+k=qn-)h<=)*{vFk+-uTUVd9B93%RvjYgP`4xhxsmbt$Crozl+EU+!}uWy^Yu z0(r*&o0JzX2&ze49rgacax|j`Rbf;68-MX-bWkl2M1@e!Y`X8Y>#3k2ULZnCw3^uP+L5)x? zV0Xzg4Q%~}3Ct4)qwEUWM&sA2Q%ft>{bj%II`8MLq*D1OSyd?@len^?oG&XkT)Jpf zcYagt|CU>}fQH>%h{zU`C2X#e4i_ht5eyShc1Bd@C@NaJ1Hhnymj5GM5-*LylT_mk znuJ^Fvg#q^8k%zd6>7Kc?n)J?{U6^{Q~&ucsQO=_2m=5B0WWEujvDfu78zV%!e|X5 zF##f&mccTShzN`Xm&H^H9q>$p+g}F>3mL&n zP7Oa5fnyG=b%B~3HJw?jm9e+K!@1+0RTg6oh?_XI1pxy9Bmjy84Tb{p?FhCm(Z8tJ zLelF57Ys>#cEeYlnp4mc0?b6Fy85`Q$%xRpRjaXST{8zTfJu6%f|30{q;FtW=O{gf zM%eZJ0|n|F>ba2K$yNJV-^aHh?9&hz99>5NceH`QI>&(oDgr=stu=H`5b-R*P@o|L z!;5YtAlhLtAWQ&AbmUuVn%#!sbe5>b8s}|7pxK_)tA$ zVA0lhGUi?98G?sS$r=jW*NVxg`s~_)T;CPe9!nJ7T3j)Bx3=-TV;07w`qWjM!o2K| zm~5-m@5zDG#eK#0&bM58S>`96TDLuXy@mAQ!pj1vBzYIjB;Cn`-(lJYIK|3svk9 zxKFE{=w`zk`#Y+S5Fl9ctx2pE_5Xg~;@+)QcDLUprsPHsQ{d9fJS!C?TOf1T9au&I zZwCoS2un*3l|)1)mwg)16^%SgqXwMo<`xK>5d`8?b+T`(v1||;P|IX<5t0weP*`#k zm?6+XUoFY(F1Gd6lJ)AE6+q^ioIa)NQ>p*%_>C4QV4Xt70B)T#w&Bq&iq%FS^14!7 z@d7#-GJ|8g_=t~Xx0rKMn1mk1y6O@5i+NzFc1or|8I&c(Eg5g{AzHw6dhIo55{}C> zcpm6i{Y>B34sw0(!O$jsS!HCyewTsxUM|7BYc>D-pk(HN1-)j}lTRJ+PNVBDVS;B8 zfp=-FC2{F{5NtHOAiU~lzz8wq5-l`fStk&B<=Wc2YPqd#(p{?EFkxgDch}x&j|btx zvM#Ne@rw~wVOb*Wg+E9ki0_b$4N4GULc~v#7|EF)NW!t8!nVeoJ554W0Y44Ax}B-= z3(h2mXJTXMXF;XatvVfCQLUF|dUYC%C5Nh?R`!HQ*gjfPnp3ey@Iw%<(;2JX79v-;lbC4?Z+JhxPdq(l)qFLJU{6@_rY zb|nlO3m99n>o-_=>Ndd}HHtXImT6by2#2wz;ndVox|VF~Ns>M0J)&%woR)#8m%45u z|K(@uD{PJuK$IG(QLg3Zgg~-4c2k^urb{iiBGR}oyHTy{#wQk!S#%GYM-d9UB-`c7 z*A+1Nj7(HwQlD`M1fnW6$pNVNbX2WDrnTF$KDlhf|NEe1-2eo*WLawoEqYiaD<5F# zi4+ZuXY8cYsh$vP^^_)D13+F(!g7UB?wXl)=Q8skni(krJ|@qab3+2>$w4OaNnYUYP{50ZEDptyqe%3MDzg085qF zqKZvHk}eB}8>$@@66AzKNOG%qZyi73At0+dh^??QN~dhw(55ZZVqr;6Sn|nYdBU{U zKP}(W?{XPU=4I&#+j0Xqm`}ilt2_{AZDOATd((8!j&h_lU}lvA3%XBY$KF0 zm(YgdQlcae890!%*}W=Qikla>SnGklHR^a1dBF!HK;bGy-~EZF(?AI;)fc;*ur$eJP&7vYeqg5zo`DI#@v zy?xuE&jw(}OdB?V&^S&`ML1m9@bYYa4KUgPTj zVdzT}9iL^aBy;JN4{N=bp(L~gqhZMNv;vmSO9whaEP{FHXq=dklZzOh=UHTcL)k>8 z_;L&OEJ_q4d_c#}BU=CL#9|WXMN5<(^T5bt$R|PL2nYgX zj$TwjiN>;}f!L|k4eK@_kj=zx1sO(~^2<#63H;UEUJz!!z+Dt*VUo7zOyYTH;j9~> z(Z~sX&|v1I-zY5D%vR ze*PT6qZxVt??Xn3lX_SY`&Pk<6o_w5D^CVzT-qvre8k`?vCo<3eYSud*8Ufs7#IMyT7PFNwNZgUvO7 z6{vv}z*bdnpT}3J-}Y-QIzS9Oc|zXDvW(?5{gK2NHgx@UaR5>i66dzmQR|(soalrm zJ264}c*}`7`#Xi7S*?|ZByQaH z%CA1_Y`4><(8Yyqp0qs1&NX)GM5sY4SiQtvW1=m}{cGNMT7PdB)!)jJc^Luwf8nCUb5{nMD&yYxs+l9;pgyIF8C| zLJ&<1KboBHuF1N8<=0s&yG`#6$G2ZiqS&~48N8zFw3e5=Mhnd~(26pEfYg8i0}2Rg zK$0~-?ry{!(H*5$AwyzDu&^2;$3O*&?{yZ;+kfBotI+Q!9*F06If()A=lSuy|npk(;~1ixolYYa2` zT1QIlJt$ce35R2>Fx2U64{QB`rj(Fmj$GIQ5C#~uLQiRi@PmpgH8mDh3mSSsLRhnH z4jE&T*dgPkhuO^aWEEl#{9*gV8l2DrQ zz<@lKi4rt`lFKVF6P0CE&rdR^<;=7xvYK_a0?aP5J33v=XG$+-rHns&9$g?(L5UMX z=sl1pvu>Owqc>^WPfurikh!qlk;n|yukN4o1I{#mW$gGwvls#NSV;I_9qEZvmoMJ_ z^!wJ+?7K=6jVgheF*}5F|2j}ch`TljhlgT`b(z)YO+l#2ZSRGw|NEe1^#BB(XV~it z9Y|gz8to$s85PZ+XRI*QY00CleT0rQsrdQSyi4;W{#$#I_r3d{=O+oxA1sd6@nSL- zi8xqDNFqKgFZENeLd;UMO`_~_-oir45n)0|iqp&BYXI=raAjG-54(zL*B5IuhM$t z-3NU0f=L=%Y~0W5^Y>x?RifK6+lDh%?|PG6tNHJn@%EjzV`^)2E?aQoTH6`_jh2*N zFbpOrlHLvMvM3s>h>guJ!s72TFy;!TX2y3gpfrRi5Crur3Nq4=*@XN`+w`{T5-POA-5eOw;>MQ zF6{KcH1I@dkV@(U4F!=b>h&5O=XV}a2m!&$-Y6-_epyP1wW@eE`nK>g*Zvz}p@-?* zBa&ZLNo6MhkNQ}ijm23<4K1PaCZM|~D`f?yS_qscg9v{0mpvlQE)Sz(+0l>5DKO;b zI29Sg6`5w`ez|L+ZuuNL12J^EK#9&4M2Od8`v{GSBEBip-7>+jGtgixS%6$_KMtn3 z;v>#?>DXuza)3%V5yt&`*T+Dz0^S|BLC6dXIUELb0gzt4h~?iT`_7TIlJm zdwRXSUhBXA-~Z-KTD=`^r*dYt_(|4!gN7_Gwkvgh<+JM+-2?Jb)l>ZKetvWLf7@pTWH=2_}vVp^J%@ zWrE5Rxrk*a$v{nlG6ftnh&JdE7;%C!u&;`!0|J}|rXG_T<{-#yv*~g=84_oMpJy5m z3pJxGq?02=FDT~*5|VN3hDtCM8yXcvCfhC1_=3Sn=o!f~#4#W(kg|YLb5F{7uPouO zj`f!e7EnekS!#8sfo0}`SSF$eoi@>%P7@cgiu4YsfxtoGV#ERsbL5vp{)+DwZ6E*s zzVE3-90C9`OtxFoya6&9zoCdPi9Xs`U9IsDUKbg#CYrW42mYQIyw7^n8bf7ap!#OS zZ4%o@%}McXx9V1T?W)-O^qOt=NUkbM>oRc=c?)EAg_v3JFjn{ED=HW|MV6{M(&@$% zMJJ!pMb6G_(Rx+e-kO$uhNpe+%kOb}S!?aPRNI@ayA?+lku&l=7c7p+bnpSm=4q6` z{BbDC)>&`FCy)qeY!iXb03i)}Ux}Ewk_H(W@>*hvtzm#}F2`OtKk3xZ|NEe1*?hAuT9gkEqrOq52 zDX`tKTZ*LyGzT;2kckY0umBK@69v*Q2_PFRH04vP;^>?%1F?)maTI&8$$jje$V&^B zSU?O*y?<#9h^~fx@gca+y!XBLD$+FM#`YL5CG^j%bg4%o>Gqp{kLCM5Te9dAM-c=)st1&@)@N@1@vwT?D0R zkKqFQDQqUVd+T`tp{hUFwf~w2kiZf7<_|BjsqGl>TRToT@jNN|3zRu*sgAb zz-d4yE3CJbq!$NpH_X}3xKGpWlhV6sANi%nUo#EQz0Jkra|n5i%6 zukV6YB|-flImKbuc)lkGZhdfRu|NB^H{-)`gXL~Gl*?xIH< z1Vn}0mu~xUZyZ^|A-ir=8q|TswGKX5(7M(l55scRuY&0JtS>7Yz?7a5<>O$DnAcO$q+`n}P+{8Sp4Im3rB*5SRsYx8QjMh9MEV!P3?X-DHxH=6` zjDeowglWh^Q2cER=!|K<$&AH=|Lk73A@+NT31D5i+{(gi7FjI?dDAXY0MSt*|NEe1 z=zs*(XW45HGkQzpD=lCtr4kJ#X{;pF>4=c)^zkN?O0};V8Y)5)U@%|=5~Py;SU6Qd zaTnyG>U3c;|c~WtSJQb-I9xhVSz&^ z%Qgg#>JCXp!clmUvoXjtLD5z0gFCK52SZBM>&qpmwbtHs5^CM z%7Y0K87Q@z6G}ah*kh!Q#GQ1VI`u@Y!rPRmk!Bzj1VLMj0<4bR0Ek4X#KIf}q*xk- zERh%x1O{mU9^}qr%-FwjgsX%vGFg1A3QOr#7OecPMH`556xztHsiz#Y3*DY-RHdL6 zS#^t|YUjUs==W^b*6a#cGm=395rGh9KnjRd__K2j@DYX*LPU(BI7%d>cs(^-J!ZC3 zv-0MwMp{!A>PdAW1Z{@WfkPeYeU=2{{E;BEiv9cBe6v_uc);=|;)3UigQyQ4Jj5K# zgrk69CT_XcGmtpk!05@WVSn3JTZOo@kM^zfLY#wu47X_+Ns87Zj^YkXl5GyVPbs}L2YBKFmb7|D6BP=iY$=)&yg9u_N5V#7X~=8QCSc< z!cPm1i@p8TEgGtU(W*(8EVl0Mm|_YJwE~2&FcGZ%Ob0^)xNv|lV@h*F0-}vm!%pK| zejr$S3Ln?5AB$^h*Ntb;>3DL8;CX4np={<9#q$q&X)N%zxD~uGmtK0vij{SyosIm4 zD!TDy8y0Gd8a{d>ww-WmSm=T^O^;!DWLAnR-O11Ks%KW?dMg`ovZJkXTQ$74UQ_Rc zG1#nOUkHO$3Q}d%AGgz;%Vs(&fAH7b+s2|UfYlD>iwUn|yKi$5V&8}Z4vi{82@o*T zfo7ree42Jeg1Rdyj6xF5PKqee73E>1SB`FuG;Oob4gCLM+2$w$tKFCY2Mn5e4>Ip! zSXlr0Tc4?}PM0%Q6_x`2~DS#+N$0hH;J;n;X<#iAQWC#o%Q-a!$C6_7!z}Rg& zpJp=-H8~B?P;+Sc5+ss+ew}<+25GI6+N*L)6NpgDqKzU^1DmX` zl8=gNP2T40DP#j#H|-!st+xYGj;d2LKohb}4tW!H+FroxDdJIsM_NR&@KA8zFNX@K z;79P%3zmTr0Cf?MYmgx-i?PxkismJhwXq5BeG9&b@BSHCmF5#JT2LFbr95bIK2TPuXH> zr9k0H60EY`s)iSu29jU`3uM-3yA|whRel41qA5qwipVM zZF<=Zf0(%;VJ#WbWaqL~V7GfcQ(DCQ5g5nA={GKSQlw~^Az6q_>(pwP#Y7!8mwDTN zRfqebhH~2PaiPiH&BO2P^g|czwXxlqjAwTC^^Q%myOlku%k4dv({GWC_cF5kK~Py3 z5~P-I{6cgv5rY`T0$X89E0hc z;!9$%>bs_il$yd8tf93cq~fG^E6(1y%|vR(!YLWClfli`K5FGW+q<)_b!fW_7{RnW zAo~CNuw>By1i)rlYYa46Wu$8jG38ejou6r}BzLLN9&EJp4%AWy1~r;a%O(F1qDqS& zLQdaBF)KCBfQOTIvQ+hClO#~kQY;|W8(87QJQUC`m_bmwjns1+vD^CvqK+`?DbwBw z5mW^vC|pGn%*w&*AkogEwO@HZGRq<$$iPKzQv{s{lovgDrRYkpotThHkep#NiaKg! za`7e*WRhIG0l5MJ1BwR0js-D@&b9`ZC=+!-NEiUn-6zzTCc^R`5vW-VUJpkgS;RC+ z#+j+PFh(&rlN=p}B@`UIZAh|IQqd#Hr5l-)7S2>@8zxLnn3vS2K)loo3tCD+%*t+G zS&H20I;TNJvm@pVW}0cH^bD5gR_UfsR*s{HDK(&_vfbLWjoiG0Ac|B>9)qUorjknN zB+6Qr?x%GvUC=!nN2bH3$U>lC90ExqzdMGo_~{woJT|=QU;yFaU}j3GFdIif@TfkQ zz<(2gj$&pxhr6N75PoLKl*wnBlBVb;R#IeSP?b2Wu-wEFl9Xx zhAEx8kJn~W-&L2c^w-t@=`AZFy3CQ>RXF$r0m7DhxFqY7n9m>_0a1-Sw` zgaZbpambo_g@Q)rR*N|Vs!81dTJE~v`IR+!Qq2iM0wnWPO?eK97esivt5Ee&0m8@G0U^zqXZfs<0>Ub-cQrx@ZYf7%v_iC+UmSyL zPij!?$lw~$iaVIK$!4V&Z`0q8PsH~C&)$A!C+o^3ld>rViB{lT@rNhr<|!e${#=$k z@rgv{aNT)5rv@5#q4s?ug=Y@Lsb}{7#AeyF4@(r}vhJVz;6atnF@U<5q@>cYknWdu zjpCV#3f#Dm*u`WgUXMbChk&sg3kFfTPb|?8h1>xt02u)^EMSGW1wRJI0kfg}6R_wa z!M2Ntek02zGhx^@39={`+`ziB(XsNHV)Udii^Q5UW^yJ&4G>vA&a+xIqJq{v5@qvp z!J(M~OzLT-v#UOtl2=Z&>AfYSbik~$sI0`Q(tcK zl_4ra_jaA2GBvK+DtBqE$D_2=^sF)(%~j`ZT)RD8pjx4Udul5|Etqv6#Hv@Wl7~CY zk*h9ul9o8g=&UyDmY!1=gR`#Nyps2t6EBxjMr3w5TAxo_r4@Z!J3F;X(BZGQQpTTo ziALX=XnyS_f7ffwM(M6xkL68XSv_~_|3@kR3bn`}PzgZ{6qQsRz+yNE5r)D>Ng+g$ zB{x}Q5pr6TY2`!c!YYq3MFvnnk@na>T9TXv1}f2r(F z&fiPufSpba6;`XO@v8K^_3EHJ$cD2mfCq${p?auvsm@ZQ2@9e^Cd%U8jl4$7I{_YD zq6tW?53BLt?EalM`#-0n|NDJPgkTduG7-Q50Qg)pq%=tpFd#O-Bw*wk=+FRwQZ5|~ zEhwYUC2%86Dg<+i=US1|Bgm1N3;ajN)cA!nbrccZ&jst~P%pVNt=c2@o3+Y@$3#9> zZR(+@rBu7Fq)vz)6QGS;q>aQAGqYyr9j^@K;qH*=uVQhUl_!Y{34&XEZ6)o7Q4v2N zt3p;4#WCAI{q28WWB<~HlFUisR=lO$3F)fkW= zs**{rT8_J*^P!4xvLLs2gD}ZLfS@ihX_iqMp1UlFWpDv-0ZlUTtW*iZ#o0&xt^J>0 z)o=f*kN>71B!QF=00Rm&0Os^nCX9k)hvGXe<^n4w=DE^fzYtUp2(<;|cm+LIZBLe% z6lQ9bK#;R*6h{?o7!t_E4>gGyahQ0uFKm&X!y;rttgeCE2h*aj9BXK?4Tp0-H3%{*i`Odm~EyW}9`Q4Va_%F35Y^v);eSc@_`gChsqPHX4|ATd&drV5Rd(zd_ zy4|$1yO41x#)$v>pk)651+r*bb1zHqK!Q7OW$ZW?38iO@Jukr!hi`m1;G{@pdn+!Q zPdET58bcmm5_VD^l{eD@(G}qTuFR_*_H_CIes67VUW&p#j)popwZwuTgiu-vjXv+b zE-DVOq!xKtDPwl;t0&7abG0l<{U;>x7c+d0}1)W5y4! zQ!bJF7QfGTB9{>4+$Qe;1&o8A5j#Xa>zIcHA(M-w9}Rj03WG zXO|~O@K*Wi{t{uqoZBtI-2mRy{SE(-7ShT7}DxxNdAX4Ul>4TBKmqr!URH zdB*Eg*^lMKOpF8z7$9a70t7~#b{F zXHc};?bTw1a$Q(A1eO!Qo?wenw8g=~Wrip-orITm?uJO)`v@NQGfF?JF0Be#SmvpF z(*CZ>8(7Q`RE=O2FoQ5m3;+s`5a0l@p$}9nmgX~&kZ8F=OI<^AN4nP&Isk{&wj(%> zTZf+PY2rGh>BgXt|ND?+_y7dFW8LcyLUK8w`=1Tz92DK3X^bS-fer`m{3oQCP)XI1 zb3CwoX}Y&`9{y2znyw);9a&T<9LWajL}n9=4$v#nZB(iA<(G(tENw2+zpbtRHK|Wf zNmc~9zr3c3E_^Y66A88FB1DZ{QWGgLi9zs}^;iArq$fnA?5U|F>oaZNK;W9?qf{!3eemA_Zb%utF`s;>Mi>r(HeEbg-ob zH+K#I0zv)0q9{f|ic%0@7CV?Yex6mNO~jcRA!yTZ^B?oBSSZBj7^S2~mPRGywdbe1 zV_ISKY__RgMOT>4n-!KQP&Z`8ms#WtbI+C5i>l`>n5)}+T3WoRd%5&1!1 z8H$KVD7cG|>`fp8VXK8==vez!TJs)KAZ3Jmj(k(L zVpGs~d0~`Y-oc#P0TIM9v4a2mpk&yA1yg8QV+>5tL?Qd14-Xg@g`Zyxy^p}>hweN# zq~!C7w(?*phDAoOGKmmRH4D1?g%YQd7`VlVbL3lbd!K!hF#J@}8~^(||F3WBfBrxJ z{*}N~00107!1$Wd{Tm<HqvOTR!waaUxmkOympZTF%NWqIpm<-GVdI5JFEeVTQo_R}C+Z%y>>+tB7^64+ zn%tV)ufFuU`$Ap2xG4itlHNYW8PD(hA0?6>oYyOhBF0q&Xk{}ArxTWXG)hw++J+x4 z6ea>VFO{KO{l&5Qcxi(7$nc19WJuO>c7EUbomk2x9qjs&ok>qgzzs4Fr_*gNcIRg` z)WKZKYJ`B{O^O6mNHl~cfQTvxrG`l&%FnaoKp-{({96RfyE8~_9O=@5LzwQR@-g$0 z3KLRD(%gld_TUnD-7sS!*z$mVw9UOBD z)lhOfWwPvBKBM%^6DKG-md1@6ev%Q6*vwVBsQ3N&^?@kSbnx={*pV#Ms+nDrRS$P_ zP(n5SsO4v`P#H$k+tetkgAOWa|NEe1*#HIHXIDckHc&|c`;R5#9}~fyXN$hFhacVyn(B)fST|iR99!vHaJaEbW}P zDwgL{c3=0G!cVYX|lIcp9}CnB-#$1?{2@v#sb4r=*X=KnglEu_AfIvrnfJY73NYGgwd zv357mxq&kY4-$QR0|T*Z4>6*u%v1mSpk&zr1%7AOLo7|OKBEhtVd5PZ*`Zquu^RyY zj4pgE2z(e`O53voXtTjCaL^Mb+oayC=@{3ZrrH5O01K(1R#n;-M^=B!Uu77>j;-r| z)Arr}zqviX?*ISx={1yC002q;XI>y&&@|#uvWmnG%&5a+M?)0?QkS~KKwOl+mZj}E zvZ>S!l`MMawR&EuXTezY5#D)_BgXRlGne|OqPO?p#z&Bxu|Kc0cTm;9n7?G2ErYkUo59Xb(RJzvuL)kvm>Q>i=hxlC0M=JMIG0DuCS zWR!q|6bKb)s|}FEl&Ea`BN#N42E5xBIhYs#(>SBRFr^xg%Hmb1Z#GBf zhL4OW!1|P0kf@o3#trg{P>Byf=Tc=@|NEe1)q({*Vpm%!7Ens#TWw$_l@_6$Sq!AP zK`;(&y@!clCT0(9|K9b+>lT@tZxWER@b)2wBtod9R!WwURzeDiShQg{H9uZxU*452 z2sWabP!q)H_No0~@c__~R4e_;(ek}t|IYGWr9uD*;Zr1Z9Lz!}JWxPoT4S6Tagb7I zj*3v{=%7J!N}&_l%jlYH4M&kHYNqOH0FFf)V!&3Ew;WjulMTU63}1G#aM`@S46%sP z(tB~z3#=tN#4flJkEJx?(wT|6G1TO%?$=$BCb7I+FX=3T=O`ZAL7ASJm}f{d>n^6B zlAJNCx|-_~DuykhllA|1@HcMa%B4(>?8Y0CS^iQGn?o-Nt|bkM%0meOHyYx8E~+N9aNjrHAw2Jx zR5*B~a@P6z*nX*3ET8K3MPKAlv;M^N{7Y%tr_$sw_6ao+r4xf*@mg8b0R?!GF%2ST zF;fX*s%6aw9Bw*Y!l+7xQ$t26EGS?AFm)g{=-DFb|Bi|SrU}f72B&J$i2}jt^3tV; zP6;I8E;-#D-?7QY$9g+@|ZC$$~g{fnYE@U2L zaOclFTt0bWnE^0<8hgdk1Zmuw>4F1^Z`JD@;bhQ6al;Cl4bPt&3YM zu@iwi2`qg4478yUW1BG-Sa`I$gqTv7Zncs~p`)qm@cdQHwbojn)WlFoXw2|V00hV` zM9S!|c@^(eptm{<02*t{obor#jZka|7YrdUrua* zn({I7lcY&{za0Q#6a+42@NtD0OgUa9sfRNQ9Tw`Z<=hPr!c)pP7YyjWwqs5_Rw)0u zi{&aw#3A@DSa9lK@G(QKP=;AMjX5;6&NRF3(h-{@{G7(w%Bl!@fQMIoxbJR0M9@X+byL#4pX=+*uD^fdk>aVNZ~uJ&h`;~<2uUa* zc#N5iLQD{n0kfHG0=-CN)Mu)z0juLEXm7nB5Y5Hx7kBADh< z8feNrI%EHyI@|3%+IBZ+KXiIQW)%=)j8)YP|sm_DK zLIFm|I7}|A>H>lXksKr^Xpp!ROhmC@Rq8?J=SS+|yTq5o#Vm**`e#_}h6f2QD*w4c z&vh)l=zPDVz$f&!@Op;eKX^09pUvC|I{%oKk%GLV)>1GQ#% z*K}8)5utWdathf`Dbc#$+50;5cPIYpJ*@taAV`1!HlN}cnNdiGb0aS*h&HfbBmpb| zag~L2xu#GmDh@=smjG>mq%5Jh@SQDM0!K|pTHy+MrAHpiqHM2*&e}p4RjH`5NyxIW zVH?(x@YF9PI}z0u7Fkf!d;Fh5wjk~`rpQpbHJQHie7;1MU!3Vrp&^FfX2?c`m(F38 z56MDVZD(6iIMyM!{PD;`{N49eNhtC(3gb8K(>RTIo>EQK91)^@KIbGyAtqwmKFAvC zR%YSgQJ5(uxBAyoI7`v#hH*(}TOf(#r1Sr51YY1b6Dj1*ab{3|^ zsY}u3E((JCN1sSxlvI9P2}ClQDhC6>@4wZpeS|!e6x*o*%jC8fc``p*rFvVqyiGz5 zs_DS~r;ZB=FWu~tifF0H$yZojUf-1!xwo3<%U84%u5BQxaFAWAA2SJr*UT`+2^y{Fc_7*X5t;McHbJ)cizpJ>Cjtkyw>-C6XtKmj(D9`z3bE;i=~x_!!0l?F-6AZ z`o?Y&aR6xmoJb}P5-QrEf$2f(d53RM*h0F%|Cy}Sw8#OnGzE@3Pf^qmkiK}`+H~vv zN`Kllt4*$Nwdwz3Du|y&n?IS0T5f_?E#iL?sf;fO@k9j0NC$hiX*>jFYthp2F7>Ip52K(k7*H%-v+HI<;$d zi_EU3p{|Ja z;!RDUN4s^iLwm->w4{k5OpT|QWQv4PQq&O%4HzZK8cZ0agM%h)3wd7FiBOXJn~LSl zoD10c$>`3wSfK4G6`rl*;V&lsD8i%b=>|-sNX2MHx})SviNvY>N@)X`n00s-E<*`u z^EsJ!wOh;jw0;c4@|#^ZN@0d$#&6x9PuoK4TktxA!VboqW9h0;BADdpOgZZ>Yy1OE*bFupb+4 z?EbB$0wP0a5v+t3rjX+BH7M8CeCo#`m+iXIeIws@e4cvH9!H311$CwhHL=;(rcr&D zYOSC6;{A`Q|Fhg??YFxa*RJ&=uerpAFi6O!06-2ZWP$>ynQ?_|!CV+BnH^W81fj&% z8jKe%L=C65<@y613WjrKZ4oAs5qbfBGE9rXGmRoT@B8z|i)|9#@`56?eANP^fB745$WnSg`Vm z`){C93P!^P!~63@Ekqdh{lD`4|E}MtRW zY1hiDYRfdCWZafkZAzDv4JslV^9Peb<)ZZJImJ#lzx1KMU$c|!>{h+H2mgOouiA|j z0e~P5RWNc>9HUS~^(F9RQ!=wmMLA)n^T;M>3#7V<%B$=y$1xR@I_(S;B`sl4{+!_8 zb0i*^)eJ1>$u5I&D{PIJ|Ol`RX<+UJrR|gk=^d(rm1bP3D`I!Hb#9>u2#5As&gY|5{%9tN% zAvBVg)&4doNDun2Zri=-i0PtZ7)6*r#x**QS4>N?uu_*x6(`9g;d%GqMI|3VhpGf# zbPnUH(&2e|J&0|Sf>I$K|vxN>)g9g zxr%Canv$bR0LEZA20ecRigg@fS^yADvxD@D>_X!trPjA+Yv@ev^aHK&a)-vm%btO*Ms zRC*!Nl79}tnVO6$g(TFQ@7~^JNJsav(dS1K^{ttfUP5T+cXkF!Z(6AqA1aCXm|)l8 z@1=KlDz;}M&r-ZqhP6*40|$@QZU?a|J$Z6SH9^BgEXu2G^n`t2Y?o-v%dF23LBlSV zA&3`x$3>)$Va67(M?Z4gF$AqR)G6g9-x!kT@VOuel^(jfbf~B<5KG6zBfcEnc+~G@ zXCvROY8PmdWK!s=6p%nBIC}2@4C9v~q0x*PS>9$6THXAIJxJsV5`>`o_UfR)ig_Nc> zTx0|!gKCf%Qb@%l6sqQC$>rc>WsmIBSCgSzwbR!cW9*Pfg<*HyBOBkdKb#?1-K7z! zAsW`39_#<{=Ef%ozwKxcH%Z9<+vj}#bN?Td@vd?Rf1J1>Y0M}8`>IG6rr6`45Zl6ERbzIfhLrF>#DkKn`~L#pVU1B3JnOI8C_d%-(;Gdj{C$8 zWIwy{*AelQ;T7jCyNT~_1y_4@a;;$IiJ{xmryGreKb<2zabcHyZ%BQatr7bsu`Y&j0&*W^s80-qg~S1X&@p-KsbslUM+p2t>So#D)qYUMe6e zmH}#~Q}0CCs=!KyTG2a%8S;mI#B`XA6WGz|hCHfGAfW%c3(ibXvXP+XkKMaO!75`D zLd!}19K{`-1GN&}6YvN-K6|F#jVug~-Ah^?A}ZVo%2VAa>KQ|uB;9K5XlXWSun^Kgd{qDRbOe4kS@v8K&MT ziB@Xb>#$Plhm&38|7~u-PqCp>%K#~~nO+Szn4{?F`QKAj_4NPjQ~&#*Wcz>y6=zec zOh&*|EHBO3j9p*-A~KwD%K!+VazbH-1+g*I z1g>R{^Q0PlHW{W!yA)naBx(Gh`>`gQ8*A_MI{#m}1jXVeD1sWrvH@aP@(ILY=$lxM zT?oEl;Mk3cOQc6W+T?;|kf-Y-ti@t3dxedAcyI)J~ zG-Ge?_xkB-|FbPrq#~M0%P1Hzd<2dh5*0DQ0#$i!+hsFdjm36m+s1H(-^{8iwhnz!#8iAwOm(*&@JBy}1kE1pwr%SyC9 zzpj!8ZW&eZ$WBsiTe)rjCC=(|a^CA$O-w@yLT4W{rAy1$@=_K!0W2O-LWzMT@?TY^ zhQ?__`!>|&zm+2*Ku2yh{G^^)&Ylpw*>;Ld14}M99P+^ci_nk4$4+)WhXnOrjV!oJ zV&h$D@n{-UwP`6(`4ZvvQ`F00b*loV1gR0qHkx^;tl8-#q{HRtq%B7O`=CVc00b*S zS!)Izx{0iNDq(|tQ8ANaOeA$;KP>FEgpRc(ks*5$VX1kcylPXa$u#FU9i zF$xl$((c)eh%dmi1|Sv~Igk)BPx9zBEQ1Ru9eC>ugKaP9jFF&bv_%b{6Geb|9eFD* zz?gY1TIrZ7s;Blx7Ht=(%YN-qOu|zlAhGni*eJCTkWHQtcSz)*^TJCy)f;kOeYz4W z{cRN{b0$rs&qt1WFR^v8g*7vTp3f#0j?=ukjA`C%+>ASXK0Z!g$A|ATwf^?h_@t2i zq@Ioip*u}&`E~0rVgvnqB{l*BS`W0wGBq z-JP1&grGM-c&81cG|)T4sopJ!6=^Zh+YbfKIuSSAt>6C%oZTyT@UryIc0<=M_!7iH}HiaVryYc$ZX282|gQWX*sC z^kdm;3^ZzBWGg*k=w}lNe`Bnq(k1rr>C5Lox|lf218TNYuPpXpiNvpv~J)Zsu$8d@&J)`l5} z6syNe<>SJI#mcalPzk+J*CN$bK)uX%mw3H(0I89*<G?1)kyIg}{ZN>{tr5wTi5$uhH)9wCTefyG!ZR~sUK$|cLMe+i zTF^OOndloU{mQx8c5mdqZXGF5L zGh;rXOH)OusJH!ft=Az)E5TM$w$1x-0zPA6Drivx281Bf8VDEi`9MPRePUhj6@D4wFxSH+DJcYDHReoDj7{SyNMm04?BD(R z2K%1hb>DBkmsx0FG=_pGLZHdAJ9Iu_Y{>-E z%DbG~p)Sy>kodPhR>FavEF21vH)&DLy#fpBP|hjU!YcrP&8XqQQa6pCUEy{A`=Dg> z00g>a+3PGEdSHX=KVj@06E%}(tgzDQf{$!{gq7UZ&HTEm%qZnkjwz~XwPcrg1cBjt zwSYKOyeSA6R1Y+~h^gNiX{EtBJ`}}_z8ov(hSnXo(X{eHXO#|i+PQIxggC}zl7!wR zE9&LDLroSWtg=lk2=mUN)}1C=ZlOY|EyATC0bo`xGvuJYf*tO!BH*jAw_*n7*n_H2 zSsSs`h{n=1K=romR^K(=5Kr_aDwoOh#C-WkB5-ITo6BLVTS4mG2l+Q6*JF*Ni(! zl4;hjXwsiS7)4^iV92GU!E-gB=dJOwM|6ASzrD|3Q@P?Qs?QPv;2-9<+6iT6v17b4M!*k>N#C!6DIjs%Jx@&tDwq{G$ z>0oso59~#X3#^6%!On^-yFSxMf&n*W95H0m4>X3psI@+!i^TNw(EU#z^eloGcKp@N zZl=g)ySuJhEbQGcV(k8A#=rGl=Reu|pR;LH_ZZmv+j!Gfr|h_d#jFO#_Ik_Y@l7&y ztjHu`Td5g>cr`};DBm$mmlYNUFeG^@EcmvI_%jLK#)Z#Ci1el=-h1h%RlsM>8`N|7@?6EczG{Ug9Mn=WKddPz>3=^q z_0nSg+g8fHAgEVnI@-65otxdQ+u683{J$}OCL3}yahiEm@BPSb+~|1L_l^6da^~T6 zD}<=vf#qs^u%~lk$^O!2K?1897Fu~|p+g#xt*xC>ERI+UsNtHj1HsEW_Fqb|BiiZji)2c9kVUIlUM(@0r!9C z3LZ?a*E`zlJaL+iZJ+XxoTVF!Po|$v%N*N>Vz*eCUEfP5n}wI>yvFAIBA3*Lrs(AM zB-57Z=cn_pzg>&fqq&uBKXdnIjdx(%+x_ir?G4D;r`%_sI(s83Fxu-Ov<^$TcD7V3 zdR1v65EK(g8!Wv~33(`G?7A74pREV8M=kRU2S~CM>MuPrE=Sa^JuwnOXyaUs9j*=k z`=Dgz00gjQ*=sK|dS2y9`eEx=6CIahtgzK7d6z5omI@@ZkNq3__fiUina&WRgiN!J z>E0OJNeJT9>`tm8pZ~}zt%jm;v~II*SX{$m zP57f{YryCRLIc7A=Pei$l0ZFL6OyU$p7uLpL6VH0bG}7s#3NKQ>QJorc9wF&9}A7L zbtUuhCn`?G+%%hAl`f4Q*(Z^0-G*+*s}t4_>rHYJm7}{g4B7X4+az9-cmw=(Hqf1zbd9J^#vR>T`b!LaT&kZ{jaY&Z| z+W-5YWa5AX)?e9cEHqkCquU*2hiMU+S!Jv+aj9jHY;}Z{)TV#9krsCybrm6pj@r5; zkk}>?RE^4k5~cz*5x}zo5{!lv5G=* zUtzNZoVe3S#Oo3&_VR``g$p@1uL>wciu9m}GLKSSvGd!jk`3ZZrb(WcVG=8jHXtEj z%q&F?Fo^WXv~ZwIuL+B!zjUcITZA=Id5@vO8KSJtCTU4j`{jct!e5g|nMBW>5^jt- z$(CEbMKX4TAyff$$=#6xpT$1wv>YyU(?sS1qRk-4j6<_Btu(Q*uPpUBXQW`u*)Mmq zsdS}}-M#vK+r8HR){X4(cA+|ffkx8O%X+ApGawKIVQLK^%wT26a+g2JV4|r6t*{f+ zrO`IL)YdxsapO-Dc>g}1Zao9gH5*kfJitCx4Ea(;&409hqAn4|i+t>`==6NC2f69Q zVe_z7VnGdPL)G32AaB{9J8>pM6#9Eidu@uOA{v`DiR(^OwdLQ_cOI4Irj8>bccW7= z7#D=zDHYSze;;&-qhYnE9vEK9V;vqFNDu9hmgx41fFaA9y?%SAZ*S8N>72L=b^X zfE;dJ`JKsf@1tq3NXX|sc_{Xns+Y&m9bu`o(ZDB4A>#!Z+1avPNPG7NsohNa;i&Zl zSy~Xin+TNh6{&|wAe5yNmN}$=%wGkH16aT;IWfekm8ipb#)=jw zfamBMT@GbkIZb?b)Vvixo_$ojau&HOa_dh1l~;NR82@jn-B`4xnYENcw3|pzRg$6< z=@G=)yOig`q-Ntp45HbTr$hR(z%8bptS?iR80V#-QX{3hvDBnM|ljJnNXBbid+gJY~Dcd2!bYiJxKJg3WL5s<;IrF=Rh z-lJFfV<*E7Bz*JU{s(&5`fmM6NvT*Fd|^|s6$F5-5r~2XL0{AM+{&a?X$lD_hNZ4u zL;^4kEU-?fW?sDstvw&~L|Rc~uVT;uV&66G;NTAJh`$ zt6s+LlT>{qZ7kA4iwU;!Lyo3jh~V|z_lhs+`5Ys14@z-_CTgbj-(yP5mp$#Kr~X0I z+RKc*%FDLWp6jn*R1Wx)&4!OE23FX6Gbx<+xMpb5V`cROCu(rg1oA0&Hy))LWH5z{ zU>h~r@N_)AP|=E{p?rMgcmxNs3t%jJ$ks}L=jOHF)PW>+4z_?;IVFcc@vuQbKv?^Y z4h)iiVt@4UPrq$y6ly&Q(4X61$!T*am@J}fb_}#k=283;NMEpX03pD_g~101qOa0v zr1JxSo!DGrFqZ7yo$=5g!7wWjY;YDEQZ|H8AWKlF2!cpG&Ba)Vu#6ZVk+?8$(vgY6 zlTDH%pukMdB#dJ58;~t}_1HxO_Q!MtsOKdH(op;)CR1{-l+d*-#|jWwmMVhXDnh2D z$^mGhC*(q@k-{>=nMW;H_cV)HG!SLLaVet&D-kg?eVOkaoK?(#RTU>b?VO1SLjee_ zM4+V$Ay)PO`>6?R5cs|KEl!-YiM9ed9JZc|3TssECCmuehRmc_UAePfgiUrX6qibhB*pYyl68n~Vp%bjBluhyd9pHLRKZ}o19U3WjZ`D!C-vELljW zS1jH4TfO&EGdNF9WN^Hpd6WO&$l=nagVl4S9IsVSUp$DQ0tsUQ5+Um!&l#qnTzHfR zEO`#RFiV3REMyg#rcBnPk2*4L2ZE75G=M|L5|pyw3exxjEF20kDQoj!$7f@NMN|JKvcss_6) z>>!4x5*$_j~p|o9jRAz0di%O^=S;slTkL318^Wtb%HsGM1ug24G|; zU1k5uUWDp_MUZKW9ZiSH2t8-AlDPiZ>!FlJ#8dL9+I<3Tj-{q4k62#+^g$hQt!)7E zJJ@!wLTFyhG5`CZWcUCC^kmrkDII!pXgdFCVt*5XpJ7ZS)Zwj>tbLXtYzeRqp05MB z_g{Inph5-@sO=&V!NFCV04?$%$Gl3-Z+rHlaOx>JO6pEIAWb1Xvu>L}n1K=vKqlxT z5Y<^gKuXaV0j+cj4<}mBTIh&6ad&pRX&vF>`qpuBR$*b!-o3Xv-b<)YAYs;2p-+05 z#qdQ>)LG!_buOGS9}pPPzL3FKfg8v5oOn|AT~^rNoRTB09F! z-1a_T?H7>%s@c0$|#j3r`g3m)$MGzvM#dRR1i=mw<54BNa_SLJS~&H z)D#6LkUJS~fBN+jgw z4mN&!k(#`;<&22Y%=LQjLe=E=x;oO*dr9i)2mPjv=|ASm%uwWugbRMsy?Duvg;TdT z*6U0++W+P5uln<;uhn-}k+#n=@ zoOo(o*i7B}@`CE9J7U0t>`zNySh^#Vkxu(~xK#_RLYz>5c9O)7KJsJFElg@hk!h7Q zRmAszYJ@70ERdtFOjV${;T1wdkYFY`uu>9OlV%+uHkq_t?O#EI>FIl956VdyT&J3J zv^OZp8vMJAqs%DxD2M9D(^D!tSj)29<W>czA?K)fwj5g}l;8Ga?|%)a+cODxMjdfsemQn<$|2FT;BAGcq} z`*eT^ZAbl0@4EKA!kvyTvk(|w^N)KUV?LBDpu`R=eFPSXLEC7r$31MdsY)y=ETV0$ z+)4p}A*M348dZ@HBPo!D*)F7A2FigjMO1;JWxBBVQoGP2L9Y{@=6do0OKT&@o=}8~ z2&M`n`BVcxHLw5%Md;tuQC5^u7NSJjvG8U|m8nG{IVhSWng4O@|0(~8dF}s@g#I!> zx=Y1|7$I^}Ui0dCu&u7-hmorx;MAtZ*2h|Q!~fR>v1OG?Iw_L4LKl#Vgg_wf?SLTx z93E3C41q_X5ZB42%>VnaWYhp8wqjUoFC2PdL^~Z|Or;YYi({;$b?K|4tNn!ztQyl) zh9LNUw0T!q&A)NEm%*gJQQ;#$z^{dwR3Vi8zFh(pVjC3kWuziGX=~B;3wBPh&9Al-N11{rY&_Elu(yk*D7X? zAas?*|t^vAiIRBRj&x#$@IG1eKTDv4-%M2q=;mWa`5vpM(R6}qX*XZ zbKPgr#~1MLb8`B(Gdx{)Idu^YrT+ZV7xu-(! zGGbb!`z(;|Vs0fEV6?dP(QeT+C%ou=wsAPLuru?Urf3Ukfe69wP+0c;U+EBSLTc6Z zeH-n6_kO+2+lwfa5E#-j+qYRjj23L@u*4xKz@`jiJU1L58Xbm$#kAe(Rcd*_?B$UG-*`vP9#sT|+yp)2K$zv^E$Uq5NjT+PSNkK^N;e#ehhET|DKl^n8O z(SpKyz(h?k)`*VQ!QoB+`=Dg~00iG>*?UPt>QzKL4{0Zr68(c^tT553W|6FQgq?I; zhD^+r3rvSwycZp6GG_uaZla1YNc;xiw;Ek3HqyB5Xes#?55taTT=FNZg<=!_fAY6~ zrS*4R9xr;#(VbmfFv#xKEvh9?+qi!F27udTQ)X9f7*=XzjA#@ma@@SiMBWtn&Jt+% z$j|gPW97BMH7FD#$JmC}xT81*Ak`H}*ba@BP51tw(~PN5@V(GVMLpIP+tC<-*!ff? zQEMtWMi}XyCzRUd7M?^{X2i%b+QI8^T_G&o93 zz5QpXmkv2?B)e|ynu{oAE{Z0C^&Zz=#i7flNulG5s#VWc!G{CO0XoeYt#`Y%d+3>G zp)_$uks~g}OA$09l@O{K6ft|-mzOWz(RR0O&q$R6B?F$Zo|QUH2b6Nuxm0=Ve%JO< zb-&UK)w+CtIMZ>t33%7umb)n;Ik<=zWe8waw%vEPgC+dPi&G|Ha}AULq}~z$@EjK+ zhBVEg&sdz!JRS`Z_7&Ys`U%YMOLo2VZGJrfi?Xq4eM#@BF)W5AdWSu}hPSu6Q+Mlg zMenbx|NpIMsu5WPT(Vr%P5=9#Wd48zrf1me3>{i%|D4|cOhXo*(6{xvU zq*~+!h&xc%Hxw_~f^1XzVs#63o>va+yKH_hHRdmKp04fT+?|Q^v$R8_JNNopD>$WK ztYIRq81*MAW?saE|Dh`vqGchptsU-O=I00+%A)Bh=Cu>YQ-lq|gv)>{Wc%Tvk}uG8 z9ysM3l)cK7Y-7WpREkYl>!tor`5+{y&# zr!u1TO>^qAr}XZ-r!z<-iU`1r;Yy$oBvllhW$n+mCzoHgzW&CsHb?6JPdcNwieRxD zXcHv2bsHEdn)3JHsvx@?2%@81RBxhYCu};((sm46YoT)qhUH4rm- zgBg`>A^Fx%|*?gz&P4nw2W!?fD+{8yt(KO3M-usz* zobFTCjK6q`ZneCim2`Hu8Kk+zY0YzX{+XvETC0)0ORjL=($ibJH)7=k$qHg11bw@? ztl&i{6&Yo1g;?3}bQZ(%z903m72cyz)J^Q&dJrTn9LAYy7NLHBF8I_CW5ps<8+2B7 zyx;aO+U<{XL_#ACqz$}YntIm%`=Dg_00g>a*lP?N`f_M0{b6F6QrVwltT54Gcoyrm zgPLs5p}wD_U)@zpzQ&7yV#+hQsA`oZ({9~D#Q+^zj3z#a9@vN#@ADQCDJvM_6%tZd zrzOZt?;Yh3d9b0X!=qE}LGJQ9)Wb`5chD*X!0M|jZC|;XNZt(j)QaI&1p?yW zPkyowp;|}~*s-eHI88qhrK5Mc>y0I9C87Zmo(@(PFb`;`;>t4HbZr5TiZP{ti-N@m z#$e)(1|Y$D7{dlesElnfe6JYVZh7qw_A`wOIm|X}TolO}j8mflFm1u%X=Fn%FrIc> zz~~@UmdZF8v^a4RfQo1_WW;Q5GOmB)(f-?J_hifp4I~*MOzI$h-nf^+1EEQyz~px0&Cu~RodD8epoB?V5ng4Q&Z0^qG;P*jp?P0ApQ5L#+VFd2mTrW0EV zf(+EsbhcnG+59wLZ~$cq69oS`CHhkZezYOCDW*Q|u@dPeSg^&!C1_@FJhHZ8g;WMt z-cHSbQ;zMe*F(yph6Y7g(D&8XOgoX4GyZqJ47-l~GnC|-oGcV(;sE8jwXxnJ` z&wBT)(Vjid>qqKr@4wIaR{z_x#yji1?nGEy= zJB+!H8_3$(;wBG^bLB}iJyhyA2_sgJa)shsu#uGlaI86=qyI_Yp&lGYP=p}fn{YM| z$%>B^3Jn~AkVc5jXG}uB*Y-gK4U;SA+<~Z6?EH};KmdQk1At|fuok`ahFI0VYUEXLJXjc zq=9N9fI=W)#$QxNL81V-;41{3x)I8`B~?64^fC*R6C#~Th8^goI)TR5WjvUePDAm* z!=#=U!dg3-#|q*R-rBDw2$P7op~rfxuqzIfs_7DrKo@mjx~(mmNO_S3h2WeEMm(q_ z+9p^qvyfLV#Fb-WKFJ}-oG?g*wi%QE`@m%5fCSKE*lR2_%4vie-C^lVA6c_ZO+7V= z3n#5Tgo=DZaVap{M12EmEf_5Z%cRm2w_@@UNWqp9K`4<2*l^4;XDWb+f zK#nr>mb_YRHYi&lm{%fdO`(8`BO(E^6#~cuC?ge<`!DC77dqa&RzyQhY*yGsEZmeQ ztu>Ig@@1n*`UA!eq7jQ~&p000OjMlfnHoqrmG zKY|?$$pn)E3}h!01Ja@7L#1*gj08?x@e++nEc3LK(ogkja$gn*-#`=c*b_J;x zCba+ZG;A1@C!!`!bU~6tN+fydASQP-jHcQQa5WOzG>R!IlXGo}Wt&>!U6L&maujCX zG^JIWvnDf@S@$QrH9jLa^+y~%$PP;i@M2ftdmb+DJ!G0}ywNJgO6G$iAmSkGT(*)X zfC2yo0T7Cxw#WgiQ22+B#(0$>}e<4JLz@0rVf};j3Hw)smpT^YL=!9 zXQMR5T{||P)mPnm*|x5a|NpO6{eSPS%%A`NcF_#xXOnqX#<0)%eTn7v?By>9$!Yr7V@{j%ei2_S+u6`!7; z!{0LY_xUDZzSpT}iEGCw0)mJsaKOtDf7_-eIUazOu z|GigsSRzg-QC^Y-K9vO#i2lH zfx^%I{?C`qwUM1`*37Jt<4pCYQKK8fw_l+az~RIJ==|s8USNpw`YX0fd|1Y4U6|Gf z?^SYKY^!M(thF%hd=p5L?WfYUVxd$~JV>I_;V&k**gW3_xk62r;y)W`wB@J9AoP!$ z4?MfX4c=;9+=r%&ZP@%O49x$qA-n-5-7z8L?(sUwl*R8AUM)A*u+RQ^Jd77)A;)CC zlM6X1XO3-xMz61i&yKqa;}}>bM@0n|Y#H40;$u5wx1uC3A&mKN zVq}-k@?<8M;iulzMCHp@8?u!JXD&->nnfxtUB7#mU!OEzt546G{D0r^dKA{yRywp! zVub&Y!2oQ-MvAvvABLR}fb)Ck@cKi;K|J^tke}C9NY1Kyz46OPYdlM~62|ElWs_g? zSaI7=UBqOrPf>M!vUDxH8@l;rm08TG9BYcOPk)EjcLr zbMb6hF07KnT?(Si^7F;jkUIbn zrO!3#>PBGM@JnMq;~*vCUL|b=A}~5n&@$Mxm`&v++vf3~CH#f~`!zS7-bR)zLH>nh(E2LNt)2?`i)qB@l0#bG^-8T;S1gj48l+lYk&#)H4$pSE=ewEaZLbt4gmlh}ai)|$(J_;CKas8q;ufE5P zOLJ(KZn3F3x4NF?D`hyO@@xcK&}};g;$Tq}OI^qZHv4ERro(}_D%!4fk&+{JxSj94 zvFV4Y*57!f07f(RokTCaW+Ne~bKJvNlzSTfV7oNe59#9RqIL_>!61~4GHduot3@-a z{2qEDI?;0)JitTI?Sp#cR}*d=t`Vc`5FTVBzs`^RC}&$!C;x~E7w-hiP6~5WeHv#N zBPHaxh{aYJjcyEIiNN;L(8+YL`Wlt8*hu@NeVGe3xe~zy{Ly!#fQWQS$na;Gz$0NQ z7~L8j>S*IITtrrhD%fo3&F++s#&xe>oBY_!(r36fV|8|i3eh3TC_te$51yXA6p9^Y#5 zHTo*^IvY9}5fSr+z7X3r$CA}5?KTCQ`ML^9{c|Mivzj%{R;RpnossAE8W$2Xghj_v z3+d>{%dL=cY$XN6^{`PZfY;!yBi*E7=KKfAMJVnL5xdAJx>A7@ zb}XH!@s;wyRLNo#atI zgz3Kqk(j_I6M$bm$h<}XPry@wW#G~#!JQ2W{ZUATs95+~e2&au6b>CC{rvb5W=SYF zLOIzW^kYb&YqK^!ycI|NyJ+_O80iWE=GcbcA22?XbJ0cIq*9tIg=LQpG(81pP|bI2wQLx#^A-Xnp;(GkV*emJeAaP4UQlu@ka)L`A19fz+Z=A%8;=Nao*G+DsTT_q(HMTdSN2jC>CB#i(oU$9(2x7Ek zU}%5^eQA+ded!XT_fEaFUB_1AI~2rkgC&j`O*xi%aZ;sBc$(c@vcKvHHD(eUTK_ov zbgt~eM|&tQ`%RC=@cpJOkEg0tA))EVk)DsoZxZEDEOHO=&%+Avvx2Tq?-)R|+L28osvH3fquK;eL>7`SP3X&Fh{zAtLZMukE4nrLkFzbt7R48Sp; z=jL|9{=!QdYF6Ad@$%C;)b(;s+kW~rTO7LGsxRkocOmVdPF|X-ywPIg{Mm$8j>!8E zC%i{`yD(JUyJy3~HL;zB6zAbmIgQ1*)6UvV!)0)WJWJzzUz7DLX9{ypcPMA_!C~4| zr?;!B;oN!bK2=b4l4XBu-Q(f!8O6v6-LI&Jnnh#he{wyerJn9Hl^LrY4sEu#T`NvU z(w>!!#xz{*sd|Zq24zb7?I_UYEL1{X&jr>4X;ZDI^6qN72%66Mnm3CAY2i^&X)|g9L?hP7PMqUSFY=5k{1Feo<)1W_-E{769ns^ zjWCWdfqP9TJIvcknzuEv*^QX3fm>`b-jW7n(0F%hhc`xT_*bFXi+*j{?U3%57jx&O zEE_`L_zJ5Z*9fW0V{}bSlLAMClUjU*VGY`J=O|8;>u=G~pj15K^b_luG;Fh65d$`_ zt1fHj^M@Y`9ctmrXtSUg@L^K%&UdtAGpons#P++A_e4{K>}P+mym^us`2mhkgq)-U zB{;}N-(%E${qGG`f4&r#hOliL`}##t%JDs6N3O!ZeQ?o!_S^rW!#@~Oj>XEAB>?cj zxa!M~dN^G2AnWQ9+!HVgs|XpGhbMR@m$&efCR`X_U=7-`=$?_a?RRag2IAwNADBK( zGZmX~7OD#+IIHQ*xD|`&e@p3G3?T{?`2>Vo@wt-Jkm+GWQe~o|+-k$oE@z_2;z_Gh zL>Bz?7FmAe6`$ahjE@GD!aEb2MdsfaYo+Mc>cybdYT}GFl#4~@khHcxcWc*8drvwy zj{mEnl&D~J9Ut-(w7ONWIRu~iu-nKF=9dAxWFqD#Lm)(gJC5ZBbGZIPkb#1~BE>ibam!$Ee}uC%9S zx-OgEVJiQ-b1Bx>A;Npj=au)exp-o!Br;Pw0DDnp8pmH%=?qehOT-RTV####LjMA{ z+sKo>%#re63@*RMnUi(5EBzVB1} zsddx+m*$M8;F=^mpJ}GFpXwwtf8RgfcJz$b)u6E5wHe-jD@EV}{NHZ=0{}_fSWR4> zcU}xW>OJRi5YADUWi{oe_lxG-b{lFZf^h+U;@22>Olj1Ue9k%DDJ#>+Xj z(+TL>Gd{m0K2X^`uIV|f-FX|YrX z=Ie6EjE`1%sXZM8;o)`b;`O$#;CJ2TxN~qmQgpGjY`6~BgwQeqzy!6_NINVpyG^ZDuAh{G5NsT$2phcjAv&KhB*dWzF-&PbKaIx6BImuuv zw8Jy4y0n=Z>cYk62d=S}uj2d}U=7Ez#RHC&P~1&n|NCJ7?fgmhBehNwC5N{(d9>(~ zo!`O>|1d=~Py0x3zW(u5S1?-~CuPQYMm8!p0x^m}_5x3+U6rOa(a{%u5dmiW;z?lj zFb4ck*dHZ{JTV`|^^)3_ZR5uso%zmpztJzPEwOzdVhgX%KRd(B{%^eS9)P%Hv^*ul zSFac-%#JLFi5n60CgHezA`^bzO(p_?GzPl=Y>c6~TVRcKs046;-?XdN2LZ-#mUuV_ z*2dG=QVn!~p^i#y9#dGOYQz(jfJ9Wjp%+e6YwQ?#XpOzuhz-4zFAC_pBoNLMw=x~n zAIvurGA#!ow{}G$;fSWou6J3#wHE{SM&3DB=OXDk3f(UVmZ{ zyVWDf$|Q6Y->HgU1n}lyS%%Y);$!;~dm2IZ&tw7*8IGwrt7o4{>)z@UbI%0c z*&LC~ZXf$pPrts=Ex%Qj=#7=az<_uP)L0g0%aAO3m?$9rEPk|#vmOdRBZ@2m53sW7 zrll3|GM=^)1uF(842Jhc-cKstm_*$_hLvz|cQKav6PjpP%BgR$N3aap)caG`D9S;? z!o#g*%Z7|?>Ce){%mlI6-lxox;mme3C=L$;1ebwZotz}KMr}+yij3-!fR=KIU zZ!SJ}1+^(a0&%zaI4@hk1(QXnv>L`J&7g)-?i+F2 zBNIN^*gApAl?zgRTi@%wIzSSMxFR%!5k55HmPBI z(%clQjUt#J@xMz&q64RchjhF{fq`%V`g+JQhU)?@-(cl184g}WkIwTgxyqYhT@4Bt zg~BYM$JwXd%vl2F3ao=*wnbDk`5W>Ov}Q}nuQxzw7q#%tj2n&tC2r6W3Yu1+u~nh{ zYM(>_jzAzYL}Nd0MkBD9tOlK|n_AV_-*T)IPlbSIoFEzbX3|N;)6!WKs+w5L^V2l2 zk2m{}9+C`FVQS?*{j~93_2qTLFLvtR>%EaZ7bs%~5r!OzL}s7+>1AZyDm>CyIz9z# zq$|qJIw4vJ3Fex37NEVQ3oLIt+Rdy^Pv?Kw8HKc*_bvNtcSprHt0e|kOfT5PK=U2j z6E{_o*GciXy42zb3lW5nECAj;rd)m&XAUH&&r-7M;7UG$zW z^7oVjWurnds>vr{hbGa1C6zYoI^o}MBmPTKw9slkZVwA?>m{TA+WFf6ByvNwck)tD z-Edt)g^)m46ecmI2DL(FLU@j2M*?17fH9tUc+E3)zH8l|jd`s(cb z--kP9FaQAL01WXVM<@-Mp{SJpVHAxsQMSq-P@0q-osM7aB|x(Uw(k|d!2r+*r#QSh zJ4d#F#E*%}C5ArhNs$s=YmwecDw?SJgJemgr9~1HG>9Q^4bp$>b90hvLY1^?0*J8_ z<{?G28_tiSamLPpPz5057kRA)db<2B0hmwdOJFUftDguDo zLIw;k=45OSUi&5=G(3T|5;%{B>o$(aXs-0?{nskHFGQs{yu)JpJK#nElcxpavJLj3 zuCCcBjn;sHkSosrzRb?@;2p^!DXU}zav?e(AUd4eGhnW%GrmWRs2 z3;P=jxZvb`d0T;6ViJsat6+uSrQFK~1fsDZ(Q>r}g~mj`N37$ggC96Pw@F1#X6Mlo zLRSjaYJ^>CMtASKtvgtQ9 zV;^>UN9eVZBrkPstCaiip7|$T1*t>AxJweNc+vRkzh2}s3nFwZH3KSxUA>!4nSrJX zJ0BSe-1SxL>IhzCX%_Z7Mxv+m4Zor&^c001*MdL9oQjMaX$EW_(phS>j#5c zrlH(1#40YGd?c5JC97i36MI*Ol@nfA{ZR4N{b`10fjvY|)FKL(WS9Nx7lFrbJDj&M zB0(sZH-yS*`Ma4fb#zI}C)EeLcQX~}-lTXWn%H#3t!01zlydicG5FB(R>rhZN8O|y zz^>xy@~?15u8~8KF0B1t-OM^!@7WQOJG`=@r_8Y8V149hcqA;%^7<^Q*!Q#S^$Y<( z#lXppqNI+V8cp9}b~lT!Af`8*i8c(tb2SSpjlr|TKw_3KMHnUckJ9i61CD8J`k?W2 z$_!3@HV$+lP|wg+PlJKhKx`lC!9XOF?-m4T5H%1X8U)7)kt%#KeTkm7@DmaE2r)#O zXue|4#V9-YfW8#WNHl~fLB}CA!lLL}{@L}nOiMW}iaK%vUrc2TC(pA_#^#vG(Mj^Y zzMO#oT@Js;Zdzeq(+uHqP?aqCUkP;@Jf2ol9i>L)u;gHWQ*te?!0EpEiaNZeuUQwhscg)H)TCL z$I`?4fypXHNMhBnGQrYYAGlAMnJOcqJ49H%b`z6TG{S2PNJx0PEYdCK=9 z()PbBc=TuVd<`EB@MOOUm)z^lV7fnr|Lgo<%_ESfeb@VO_Nr!y#57^_4{Uk%O*~<} zY?t2OlP^hlSZH-&o3d3rhS19?M&a;GsK>=yE`&LE27t*}ye}j5?RS8M?}%Pbe@C~) zQAF()t+uCe*)Kq{Q_q66?chJl!{w(vS< zP@pqjp^pRbU!o6CRocXzMx(W*H|EU71u35hvRa5>-rO-TU=SVviRy`Nk+0?G?SUTB z{ON||6-@>*Uz)Z5vEshh?H%z|R=-~|3OPGH@wK}5tLv;=u7CSOs760>e5?_pmzYs8 z5c=CS;t;Dv6QCHxHVG$@>nLY6jK25+#9~QrY+#HHrBN?vrPZwfiz*c1gOr5Wbi`S+q2T1M$$op` zM`w*j(H9r*eCr{T*1$m})TB_s4ZB{jXTBPZjDiGJ zNW3{slzxLKHy*VS`6!DThr+acHIZ&D+z}Fo>Q;`+5}(1>CcF}V2~26^a>f;|y)~>XrAs?Vc`odO zLtm@q0&G;f5Suj_5-W>qrXctd}6AjuVO@cdlv z)TJ*;e&dh1>0(IAm`=!m(xxo?Q2)L-r5SXMNaBR(_BfO{eAZFLDtmo-BYZ*u@K^(= zg&l<=Y8)tNp{vyuEUin-y(cChHi7zqgus))f@x3_Uj5*hv_*5E#BUI_Nv--M5_P+t z>`(RRe_=<+C{zIR2Sv+^;TX|LU&|h@g?NtA&e==_d4|(px#Bd*Di1ning7o8uRivy zZLV?cT;RsaO1zt(!|yhvwssH@klLA&FOEQFLU&g2eB12|fc8r>2Y9Kx`w$xFCYWh= zk;yn1uppc-4lgQ+5jh9P!gm`T^@nzzL&GJOhl^>HIWE5(PHmL@KXsG~7%0U;%kQm9 zpD8JOHDd&$Y1uLFs18IWNVNCoj)y{{#n!0IKw9&G3)Mt`yK$X@f_yGwjF4Tm_+d{@ zu4@#G??e*9=ZGbNq7JBRe+!Ewq-+p%Ye zB;Juz#Bd#_k!a7*&0Afw1Yvwk9E(Lwm2C_VM6Ms9tx`RjtlHg`M2hcA!XZmp)Xg@+ zpkYoH$F9EI*sal-lv7+K^r>F*xwpAgdYu!+(5qu{-7YK%AJki`t<3q9ybC?!?TF&| zM{AqPVzDdes2ccpsXL|AZnE_6q$mE;H`cYnDW6sHf3LSa|NLM7-|xk9tu4l&ZCQ^4 z!E9hm)jRY^fldzaZ6cE9j5U)E~ zYBNEPL94`z=wg_qG~YNQ;MrUjyi=3<_i^C;v4MQK5vj-D(AQT(NY>G*556dtgyT{j z8UU(brYT%10`si6C>7)C^mQ!h)u?EW*2bA8;HltE832F@ zkkML7UoI8^;D%N#!&#!jb2_QtB#1GmpwI!PZ=9$OL!nEsg1~Yk8VWEO*o-rbqd;OA z4uA^N6FbA9abKR7;n+9n?*}=>n*jFUz7LN9(gD;k_(918_#m7xWJVC#U@$Xj(Ca5<&@O$eS7Gi~w1^tNA3vUA|1}zNVjI232B(Ml97NGaq zf}@OPBUnND;Wj(v21Iw})%&E$;1I09Vjy^0Yv_ZD-j4p7xn>k57_VB2h$=`P1)D-@%J|mHbNT_SF|tqxfy7=E;NuZRmfEu4Ne7OSr0o3l#3NG70*u9e`Fc!?2?o z2EWVzdF9RrHE%VJj{z*WC=vswN!Z8$>Faowi=6QQdL(9&coN&&gk(wjZ46>EBkC{2 zc-fA4%F!65Tx=HRz#u?rgVLcG6_=_wCcHj8{}Lkw9CD_bQ&xIV=@7+1K=h&HF&GV9 zRHAV;ooFKnJ)MIyfRxPwW2)W~QphF&XP(dKA}@EZ7>S9e;5R#Lc+A|t$JBm-`#H9M zEbnRAd>C2$gnQQ>dSp1ts^kCn;ogA4_Z%Wa=Jc`kM|NrjcH~;H~*J(l1 zy#F2ay>@&-tM90K4v(j0%3-is(=lJ8$rH~rS}W&?njREY>Bq{)N3vQ7p*IUbj0xuE zMnNr$Hbs!q&dG=`{b^?>$Q87RCBX3`0H4?*T|8um8qLb&fZ&*t6;>cF-G4IKqjbS; zftIU6Mj}keDP1SEz(ts8PLDbhs=nAZbr3!xG))-E-5w`9AbckJ9BL{%hR_wKa_Nx@ z_iT=C9kCLSMe}%5uNfh$V}}UO$Sr0)5gS0Ffiz?{bh{j<6CiY*u`a2Db`+IT-;PuM zQKO{E)zjUfYacbG=U3$N#+-h3$0WZEzD=y=X6!jWl5Fjy@}4Ksjbd5F*2ASfRaoT@ z3rW^xTAxtBmpDeP5h|8cE;{(rmaJTJ* z%fuKn&d(*>e-tWCPbhEW%OwQt2Oet1PK&|#C-R3?8MOuAhtw00*|1U4xv0VeNl-)+ zVlx04fdvsfB;`~Q0Whg)X~q!%DRCGI5lD;iYk$9Z(1MKTC@4@a+ZYN~2INc6Gbxb` ziGPxkUnZ7QLnp_tZyE+r57f^qb@wsN&Y%vkc zc>qY9Qj7!ZK$po(0F_wn6#TN-rO>UQ5AMWW_-9bBrAAc?hO;Wc&E4!rP55gz=UYv# zB(_=oUb3(kZ=3`#EK5g)iL^d>oj^9U>nr^{V;r|`HK65<#RI{MxH*bD781JaU!un2Idg*ahBn23ld>GPGorBNkv6lQa0 zr#s8U(L+&!u_nuwMnrxo)y+S5+Pe+hdA@y!KQybu3Cs@<;&nI2X!4bz^)n7LUUV-; zpLnRe7)zIb0`y*S9KRfpXE*-niyq0~Kr*SuAaiq7Z#`~%$5M0YS>hZayt!>Ynw^pw@Fk<0h_Z$i%_Qo}usUzI4@$7L6F+wlMRl#_MW`7c>sv=Kd7I$a z#yzE;P94@O{ILF=(NtIlyiRoty3gO6pP_s500Ay~=qTF6Hh}rVR~SG*XE#EziC(Qoqv$1^8W6)-*tOuk zlgYy%YjE{(&V+f}%j8|lvocHdj(ejO-L)TOCCKR|)4VYqv3Q}6?Fj8qATS@f6Ebh; zahmI%1aimp%-o(bE(>2&m0N@8=#l(L&wucVy*r` zB|O-`M)O@sg#6IF+Qs^EDX$!=E5*+l8u300_?&#_k{-X(-Sx5`s7=AGr177a*giB^ zhQc*4CQZKig@5qI(>5?B=r{l%fse091ti6fKr4`0=an5`o@>1&Dew%J24|C{PbR@* zkkF=-Zf6l{&qfoV8JUIxE71ei+F6_F39Ge>g9s2RXDK|anvj~R@}UMT!CyB$99Pwo zni=z*48vac>sCc}DpS2W6&^Hgepq^$zJ?0@*cqd&$!!=T z(Gw2kw|i5!L1oOY@=3PVw`)Npu9wa4sP3}m7lX_%fN^CIrOL zW3+{QFafjUaGDW0?L8gsGr9d25$F}Vk~o9_Q1ELGmGL}SAXx$dBp;P#*Y-U;nBq3v z8UTXrfg--blM^lXOS^K&0K>@;fz;AvfuBKAVr|Oo`JtUi_Top=Z*ruoxs}C--I6Z~ z>51b>{Cp~_2LnUxjv`1`LQw=UFRHPVMfT>!gFYPFB{*rns9!o<6WT5*qo=4UC|t;4 z*8vm^D?OQAp`2Rh6@LOQR*Fi}=10GG!f0yGZTv1QS8tzia|+Y_O}1K4N9&B=MDqY# z5*$`&y-M|oD-j0V!UFs4H5SNG243G)6PO~RZWn)YiQKQiDF0yOGTC8<*0!iEl9xpjP!QK?2%{yqJ;zz%!QnY z)AQ!W2;}_{;NFi3Fc%&ryv!aV$w4G4JnoB>!a9DCGe@bL0L_%}E@e0IeEVyVw> z!Vp*~SHCh_3jqv_M3BotJpl1go-&6#nt!*g=T5<^!_jB^XImSr2$?KUV213=X01|I zR~$R2%q}TT9pRt2eI~3)eQo9XVf$;R_sZR7qo`m?NZ)v~IcKuA@yA-l?2<-HS6`ZN zujw@BnAYj+`zhU_Hn&{CGxj09HyO>6-G^y^jdo@&Ay6*rIu?(5{)8$=oO<CK40eS!K+;pZTC;aT`>R2Mht<^j|wWPGCcd5AQzB&ZfJ6 z{`Ttn+WYsnl#6@eboa5v5A}q{mLHV5H8vHC$^811udhAsz2P2Z6h~HQtI}|QcMb+& zqMHHUZJ!}xvGhFH4DBd>L1dYGsZS?Yw#BhA{4F4(Lg1(Sb8aYA_!7MzhE zPs7Y=@wAkuQ?o9f%ov)ggk-u|zxS?jwG@HLR{O2dvWcpd6qi`S-9oC;Thx5I?v}?a zzlb=}Urj_x@#Yiy&79um(k(Y^QFvtygR0(&%?j8Pl(y#_3)X{8)$hw9?4ey0@6xF` z=L?XmzQ9GsG5g)v1WqK+s$QW>%|aG&Wx3#p`HGVaiu;d%=xr+TQFV^pis9s-X4OK1 zCa{J~a;@|xw}%%t8yD7;3`1?G-A(MUnOp$H{Pwv1T8D$4u8wOI|qWv0kmepG)b4dv$^fl?U|aViYtc(d*D_gTmq7i z$?vvZG>E;g2DM5lfL;Qak@dqq(xFL2%>tgO&zlNwO&s3R?qb?vRRgFnOPnBvw@`fh zH^y?8kC{m^1-W7O_$z)cOPbEsx8+SP+a{qV>z7x3JJeCC1!9U8an}O!1RcjGL3E3T zg!NT9q0(vB-RV=7>BQm!9Z3vxyF_lf#!D_Gss*b~W1M%8Vw7iV-Z#*Vnc20Rt1Tzc zCX9?0AlSItfGL9JL+I8L8H|9EmsEHWy1a`)uOK4EOd+%XJr!C}_k&xxOR{`JQKn(z zo;GoM^E_kPcT6`xBFqzO5uqX_WYv>ZEus}Kgr+@|dTHc+k1NQMQcyB^g`z*QK$`pW z)h7F^0)HM9&{)WnU0-Em_(wpmiNYv;zn>(QV@b%ChqFFlHjrROOle_wsjs;#%TqEW zO`l9t@~h1&ENSu{KRKJsM2?*Iyas~CBOx~ zN?B^Ne;*Z|hHm`gfIb$D({uC3sxl>nuxVvlhz53?;{&jcp zkJ+srRZ3fRusC6^?!Q{*3;-CTylIOzTe_r-t&w$35MQR<;hWQv^&5R4!3}D|N7WRTHp+8a)8HtsA zwR#iP)Li3#bn#pI_;0;j2Ffj7xT$q5TI_`*w(c}Kpu)|TsvdePEj!3d@e5oE^j`J`4a5mniwwwXz$Kd+CSr=8J(n6sKJPCJa0 zwoCJhSaVq<5s(`4?Yj4D)-vj4+3U2 z{i%=MSk=P@PlQgNYeEj6|D0%Ow3r&$bsY|U{AZ-dAWN^3YX6E-F-C<^on7t}xQ~ye z<<73{5Dc5ASxAQ?U<0_5_ZbSglByqV_ZOznV9)7`>FXNW>n+PKv1;=FoL-J~7->i= z$+e}zUbk`&7#OP>L(0GP-{DMg3+VOpWUYH~-zhs@?kfD;_M#ci3z!Y#n zVy;$rof)ziG999wrf|%hMpMlO`2TRvpB_C3r`0(DbpDx`TnxEcV(m1S_k= z_NKA+8|D7Q9G({sh@(cjC9HG*;nlf{cG!G6b*8&Yit%6sCkrm2J($}AgA)ug_v=4Y zawJiUfQEhNg%AIfV?bf$!Ds{8h{oxBY-Bz*WwCNQs+DqOep7?0pvqv@XMO&|Ha*2obqaawl;UKvG*dw2j8;4k{b`+Uci#Y8Yq(XYa!k=AV zHD9i3BbD`-Tgg{1wZL(oL@}BWphU2`_4GHjzQj$o%6on162!J{0o0lXxOdO&EEVb$P9k1y-FSOIItF-al3~ zP3LxHv4X%#s<=AmI^zHL_}R}GJG zgC3mIOh#>aLbh6CxNMPQY=0-mvi-V69|)h2O$J~5a=VYa=xyc4S+E7Mc}HMI(1Lu8 z!ocXiVXj!DSj4-iunG9W==W;S=6eKd7ST16uvFXr+BlLgos_uZi_i(PHtd6kHMoZt*kJrzzq9?6T_`>Zl4DML#7^(8Fp(DD_%i4TuRB z@_!EF8jQvU=;;9=1Ih>gS;F<3FxlJsB@%_KIYQ(=x)VxVx0E;E<8AGORoxOwwH-Pm zpp1vKTNwL9_DuTy_f>}#6cCk`^QYXONbpE(+1BpJzL`f@$uuUeO1QT>-|4? zdwLikv?%ork4|fJv`>8kB?9gdkfHu!SHjOo%9Hp2k&5T|K>1T#a5iZJnU+h-30+dzv=6}w#XM<{X{QM&kN=s%B}?uq{fMPb)WVxRTv0@)Kxn#J@h?D zN^V2H7&NiA8TWQrDnI(=t{f$NdoQit`r}7k*l1SF<;B!)QsapP2{m6^p*_GTahM{(IUJokJs27LB4> ztWVxjtp6Kg#><3=$(j(tb&&p_B^<+mg=!mb%lS5%Z%=IFLj~*=ZtHW7nUjF{YPVEW zvYX2?%hy?O3H=f7jy*G#pcE&NLpNn>V^7N|9JMYGD`Ygo`WTiGBRvf_Js_>7B#kHP zHAzHU!M(qR(H5kF_&Ern2p6Pvg!s> zF|jPI9%gu)Hz|9R(wzs~fi3;PskaopYvipfJ*gZ&{>6SS`)4)&<0o@@Vc=2)Ac8i# zaW^NZ6fux#qKJ$L>!BP{0sCOkNWBkG_NwT*v7+)G-m?hn)(qOqW8g5-JN^DEk&ADx zI=wyGiP2%cI%{vc{sG?}(4>E6# zClOHX2>u*oP(^olqauaN0CI-(}H*t2D z-$)Livg+Jxua{YIJS{%h%G5bd!?Tr5)m9+Fl^=eSG$`Hun_rju+&sv775_3#j?1z^ zmiZK;^2@0~06z^Yu(wO8pk{5#f=%kn#)$N&$~V%Cy$A|c%RR9&aCabIGsFo*iWf2WL2%& zZ(EucORb@d>$dTqO;<+;CxE}sD>gyW4*WhSkaAd*y3iOk5*dc+I~^USV?)bF%CE;d z2qspFZ5Xg|Nik~$;yXJDeLM4J*3w42@hd+akZkEb26l}bj$2J)u|$kno|n#rW1iIg zsvkZTb$zy=S>@D|;A~HuO-Gq;&dbX`_s7?^sfW0<6l?<59gm1Sje8xk>G7}VZSgMOF61Kx9cJEOnSdhT-hSfW)ZbfAm-M}LCS&2&fpSB$pf2zH4`kU$ zJUevqtH=ME@r8#x6)xr0k5Ff(gsfYyQ{oxLJT}j_wiCT{ZO(_L0l+`sCzX8zoHF?sin?q|{5N%?S<402DaC-L|cEb)n}Bmi3X zc`qO`fyGUnRru~Z7XRkUMR&hQARzQm^joWhXZYYG94S~4A9x+XPlPTstGvIVW|7+! zuD*Y;8(IQ03q`sT&SQGYToyY{#+2?ILd7Le`TVOIzr7}mX!maR$SM$OpP6MC$+m8{ z?y3V>iS(|OqRGTiI1(4dcGaP8@{CBO^T#$q@mMa7W;RVv)*-CcsrFzivm(~5gC>H% zrRa8a5*c>Y2xe1X$l_7|WHF!>P9CIdYSjPBh)g9mFG5ci@M6*+5c+PO$jHNHy-*{g zLu1)2f|~iYF{)Fwmq((h^j>OHGuE1lZ3jn%LRNb;S_bx{xTM*ds~nYiqDc`*s)51? zq!&lXQfLngbhfP68;~GUqH&!5sq8nYkDSu&a;VtkF2)x>8*E(r?uhE}gcHE2A^1h~ z*C+7AiAy?Dz^8}ONY(^-0g zQ?XQarV24M=KTF@Ro=1Mmu?abdBfcTxm%tRR z+~tGX$;=xb(>%MGh$Bb8$Q}3wPDTxOstr{O-sEDnS(~wZnEFyYi+;FNyoCwcnBMRt zTP$~?^@B*!;wZm*;wKS`<)^~KNk~{rKA_8zFktI>;-RjVAN8oc2h=c;Zd}&t6`)1F zKxe*kvMGxHu1EDx2zZmmL#e#qzm_E((sqAMqg5tb`r?sl%0=~<(~VNJsgx40o7{|?i>-Najd&J4 zR#o-Wfw@*HaD&Q`0vs`_e`OIQhicsw0R%o5L>OqsxF2Y$y=5peQa)SDw&LlJtBB2s zb^TJxn9OCaLkv#{$mf{wNS*^X_`yMN#Nf9Xsk{{jhqQ_A7>MQVA+#T$2l1+qCq{+T&{bW7zY<-leC z(p_e+qw{}8oNuz@=!D^zJi_T$|JvPZtJ<8>b|_GFIj*<%GDCq6l_*Gn5)9%63d&CF zk9b4|Jo`o|Qh~C{?!VC74{|2}{>f@dM&``bf?3#{2V>%T0h3|=+SR@~p z+|3#shoHyDMr!^%<+n2>R@Oep%M`41QqnW28;q`rjTEYt7a$2mAj*hm1Xf^%m$a}# z4b1`raVMh>BgDZ79-W)tfA-3jXs40pO@oDN1S^0Ah8S_r`;5q{Nbr0NJk-)g5DRaJ zBiF;4TLMMp8N(woYj|Gq?j;ExoYX6>Wv}gK&%EUnS6T5 zWR`8mWmw8&Szn*xgK71M$F(8_!7zo8Eaxx>t``TcHuv#xhXY}bve8><;D+PVRwuu1}6|ej=*yxurvf_+l zMS+!3({%TJWg)`!0+Hk$XC|A8bs5s*(rk)W%{3x-DjX-52N0F+lFbgC_APCnw-60b zDOk~f<=Z{gXbFu1J%&cOUuS3b_i6ru&k-V#CR;7FVO3u{+jv0ZyUdxr$B2S)pzWC~6RHuU;E%3RU2bv;C zMFfiEh+4UY5W-kAlIfi#4`zbod9u?ZPG;&-haXQuIo{WdJ^N$KmU9X%TZiWPe~GJ? zg&B3Vq3KBAlkSrT&}4=;@dAGW1$eO1K&K}B(w$eHYK`M5Njq$$gwj_6fMjVVY%5tx zWg&d!v7svs5*y=W-Ux9=mUKBWY(lGhY5NpK>}H|=`=Dgt00i1**y{`&dQC%{KRm^i z69HRetUV3sSc@z5h9O+&_Go)jn1B$75Xhynqf6s=IV-lNRefb5YZ5S2lHC6Uh!}OK zk;VW9DH9MrdMbe7j0YGu(Mbwx$x}l8TTj%Dt0-LU`jVF_mL)5uv8c80KB+#BT;dYf z@F7{$D~LU{<-wT=6!@ZP_*<3B=D0=jb+6*#>niCkWFo9fK2E&Nw%IsSYrT>0)P0?( zWlI{tprhRss7fD|gV_HSse z0|usSP$VQqcv@~#swq`UoRlG#xw~8LPS$4tVPN2KN2IHAo%HqCJ&Aw5Zujcn{%oUw zBW1K`c>)K*aB1N4OXoD`U`C)Jq+OEU$_Ly8Oa_btE&~K~;ApT)At$Z=BI zl_Qzv(>k%^zLGSva$r(bCGd>~jZ{IKSGKo*!YrN?Ez}(KOxP#(1rm3%MxXn`T(MI8 zi%;S$az(~$qiMm6GcsA|z!~3P@!sI;*+&Tb3xtvpOaJ?zWaoect7q8j3mxiMqMGet z>va>!lVPkS6)9PeZ2g3yj0N1NoMiRm3p)Px+1S7L*1P}wvTa$oF2rW?-i(GEnj#P~ z@qtPMDk_qy7L}x90E{>)jvm@1Lr&{|8@EX?wv^%+vdDi|W% z6fGk_qp_r|AR6>-984Zesi|T3gI}0f?F$=`2#w_ZuXj~eb2ro39nZ2oKkfcxkP)?w)=0HE>{)H4CMF{3!!iCwgm08m;R*z+Aw)}c zNzm}eIRFgoAaP-GFCa->Lh&G>sY!~I5w(z>wwD{NsgYsj)RKQ%2gMP!3iI?(uV zc-#WQw*d1aXVH5%%mDJvg%gBCCT>-x?`ER(ig^s=XpZ9l`=Dg$00iJx*=q?kT5xO1 z&0yoNQjK?EtR!`5otmt4@}kUWtZ;Uc`UYeK+>9>wDtaxdY9-T~`u^ssQu~YA2u5>q zj!cQ!|!6PF;0lHk{g%@tw9Z;&-LcJPQ9e=jJ6{)g` z4aoM=?m1woK*olLu1a7L($u-k-NX_K9N8`Zuh+G0hCic;2xn%b}9R`+v@x;Dh_6?x^g z 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%0D{GJm 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

@$aRp{F=6s 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

8%y!xDvWu)sSmD0VLw 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�TM;aZ4R)rKEhGfNPjBkqmmlcqcLD`RV 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

#fUvs!ut-AT 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�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 s0ye5Bo`Nj(O%z{LvP)a9o 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

*M|6`?6wgpwtVnD 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�T1=z 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

4H&YkyO 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

GQq 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

QeXm13}Ql_Xg3fUThOvuKE1SttvF;3tO9oH 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

p9^Hg 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

0kpp&d*9-c>fv-^WagG35pTm_Gp8 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ʡ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℘dY*k5m;I-XorBWM8`EvL9q1Z%KoMaWVJ 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�Y z^X5|pfff2`CZ$?3IcGk94?(<4Z_o02(5(OWao^jc>A8(Dh-{k($c?iaKVA7+u>A)y zbpu{vBrl5w*M!iWwUm0}qhsb9mU!YVzX%trmqLyyr&SF9E!p@i8p_Iqg=<)%oov7quIg^M#(({xv&`a@k}Ghri^EOA6a>n zGa7EZkZiDV&n7vQQ9uS&Vm$8`t+1j5~yu2<4Y&3EfK1GDv5xWE@L;n3Mn<|#ctj$d$ z8ySl4p4!vNOljMoFMC}~cUL7z?=1Y9p^&60DK5LbE&D2bP>8+KG%A;82g+vjVA|Ar zXncLDz87JE#1v6m`YZJE9+CJnK-yglSatyRAR@Xyu1O1<2$lYidv^ZQ!>rlSON@Um zGGMZCQY7-o63{yGrYa;aEay& z0ueEs4qD4AeIq+3zjLgG(}K(=+fHub<2)t)RIC9Y<9vvfpA!G#QcZOehQ2$tJF^X< z4{43%@)`y8^f^`O0!BSUou>4cxHy^$1Jg}UmMq}&btp&XACQW z?^mum1(#p}!ZGH0T&lC-Z<3J(k?ucQFr6eI6eqa?0u-sx@_9^H;2KJP55$vGp?77$CIgJy0J4gV=mLEs^;K9p&CyBi|F3| zPzBz(rbXQ*ZJjQ-s;JnEc_XefHL8B!{W}Kwx$C4lPYEecYNE?3&CHkJe24I@!8w*0 z$K2CYsEyxSc*6+LE3tKooms8BHeXe-g|S6b#?j>r{NE01ouEBY3ovCIB%&oKP!W1N z>$bNRMUIj)JH%J@mNAgpJ+e5F7Gw{KWp+p3fCSd6xTH@>wD8dsE1Vb(S|V&g-QXGsH&wV{PABy&&*>6Fc= zr0G|rBN^e#i&2ZI8u6_SQe8!;wyL62H4jH^TAQ3>jc}_>ldju}Dj|pp>CcNeF{r30 z>8p!nIMF8q<%7m_Qxvz5l8cjx#(a{dk2RFkWSB5C`oOWdq~=bavq9|khl*sTzfY=q zX+qUR(~mZ;#Vv5*9O%992z;5qd*PtQSd2pUQcwS0VPple8O4OKGIwMAI#$)6$okD% zB}j4lols7qB3k91>nQYMOm=ZZ!Anh=*EVLe>;)Vi8!l| z!^kl8BobH$=b;Poqfa4WZ^)0vx~Bid=$|4Hfwshk2vVDy+|hJViaTWnWX4W{5DnMorG(+v2%mF|a5%l!fpr zTOc7$H~G)YpY=#P_Sq-*l&qY2MqIQIvr=^uUQSVJ@%?MrE8bs-?hf7*6_yQ<_bVfGmGetp zP=ZQt%`Sf~LGLnMghj3qOm_-zY9X)uVVdt8S;NeyA!~=kH4VZ8EfZ1s~ADLXyStjG;*a?l2 z3Il;-ED$ET(0m3o_v5fzD_C-ti?mG1dS(7rX6=QFm-nSxsd9p8IV$q=D!Q3e?wd{u z5}T2s+WHCQTvSJlq3l{FOcc7XY(0MrIW9$$Nm$q>QhR5&a8|8&=8k565Uj})x>m)` zACx_y7uz1#TE6ylu+~~B%*F5&hmROy9J~pen+04ZfL%km<`fL`pGG1Gi zHHd9u3i(fPh1J=E8R?pXBH%}%lVC6bX%ABAxCxTiI@7Q1epBEQ9AJOZVzSO#OMgYk zlJV_bW^hC>y}i#6cERDsIX%#q-GE`a{pUAXP%eCU*_7ryVlvV}#-%hXeR6WY7uNU& zrz|pczA45WwE}bTNIf$`Q=^MrV(=K-pey>V44N7KtWKR^A)QBzp1wJrh8CN^Y76T0 zIdI9~tiDuMkWLHGdL|M0OtBMIBkH2HIyJcr6m99~Rs1U!hBsIMpyPv89+1-OyY7~) z)L}?wB|X4F4zPrj5sVBfpw8Y8`h|BDQhCu-lt^y=?pq=tmDUvYANO1XU^G5MH0Uk< znNahAO{kNxy!{Po8qw${>(1Z9Q%epz@dPI=ofkaG4NXcZHFbHHL|pJ2)n$2Q^Bj3| zuB>ht{hZQnN>MVF{B7-R*(#ql-KQ&x*^G5pe2=1|H30aX_Gw2=hO_c`!JS{X3@9{# ze<1#9%MfvC3ugwQyA(qf(qK3|`2%x)sgqtV!3{EUPMPD1W~x&pIFwGzmx*&1loClH zCyq@}h)$5YQbAO+&>%s=Wvk*&bv4I|Fg8E+Cg)`PjsG(kx<0bBx?X2`i~`>>EByL- z<$!v5Wmw_*ZHBDv#Cr7kLJ0ZQ)J+w61%KC3V9M#^aYqaypH4{ zBFebH^)gRF9OGA?cGIdX``=(c*O)RQ8Q*w$Eyfj;5%%`z>B!=nE{dE(8EA1hba`Oo zK^(s+`n42&-eFo){iadf%G&9LV6t+&#l8b+fb2?DOP`c5pm32KhkDIRU4&{5nM-tV zAcj>0As8Bc09j$N88rgED}bF?nzK)aD?Ku~@fQBy)LJg86oa~iX^#YelF0OX+;3

2SGq@y~UM2j`(`Tr*=}|JE13jbr$DqI2ygQr=Z-!iok^lWt*zzBTGuKMJCvl zoZ=w1++pK-FzTKd<2f$#GpsZOs6Y}Jj4z7I!QHe(f4G^Yh#!L^#C#MxquO37pM(&p ziNET=$zd`<&Ra1Ag^@VH(7jq=iyVcERPmyzMZ=ELXkQ*p_CwA4k(7Cuq|K}3U=)gJ zpp>#J&An~VQ9fpEHTP08fMK)*EHe{$*4@!b>{dktTcw~#NX{Psp#1D)DkggCUDuRH zO#3u+1pYE^O=44)T&3>o^Hf9Xh-p@pFMZuK$T;2<;w0C;ZMm$g*YdKoS;(1CWh6(f z8M2ye7c!dWr^v+}_r@sIN}3Yli#u)hA$WZE2kWvlPw9(7c8-W6sT_2gEO*o77AB_( zV=A3;=51VU2E;+s49w%eLuN_Gs6!(q$p2Eu02ucR7cg|*TtZ;FUEprWlOl|YQYVWN zTeS+*`pJ-k4CojgH?q|NW#}}DaS#>03OBRn0CQW6n<{6O<2GdeHHxGaChf~-h^bOV zI3vK2V`fXRLnA9Z7*9%;T{W@uWga`vI*edlJi9?#9b1UhVv^ zYtcH<%k?Ft^ft7U_DVv3xIqGXIRXkzE0Ah5E_r1mnQWh1xsN)XXg>y9oIT@jfI;>$6<5uU3;%Hs7y#{S@R=-0 zqV0Y~7;7xuhbfZ%8Rg`1=95(Y9$K1$`izvZhOg`~F1a;pbkXWoh0QVVQAujxD7e(1t})BbX0)ZnU}7cPdn=#VpZJJ*h>I~D#f zK4J76{7ZEfaGIxo!wBVz03js;FJ^A$+LM1SsVA^|0&L#r^i2NwbxPpASQH z0B4#SV5M)noZRrAU;!}-EZZ#bvpz^_yezC;5PowD>xes5=L#VL=? zBh(wnwUYdE@V6mDrdNWo&(3UHqY{`Ta6cF8rkrbUY}*q%xO>>f|A&O9Pw(Y_%5!2{ zyYtT*aIg(#ZLUsDhF4_IdMmtk?EGiZYl(6k_hIf?PPJx9frQxw3T^25Y~kR z8-CtmIg6(G>Dg2xRSKZkS6%(RBM53(pJ%~z<^`;a5Mm))0zs$hw0?h@I zh-s5vB<#V+Xw^)E^Ts1nD_a-*&e}}LlAD^EcGdpS?P#d<03O_@A>ER=4Jp>HVVK~T zKXG>>G!pa~fA-fM?&5hbqAPyfU8@j4!^Clh3bNGT!S1YY)hzj5yQjMV4|}6DQFUv!AS%7hX`L z12)~ms>i27A#vUHu{{sI_pb{p*`V8MclfE(>}g6F^EVuiFhp5mnDsl8LIFnzNN5~Z zb6szWD5?+r)zx+pQAY!mN9<_lN~<78P}jKs#HoN0+lV{5B8TnBYHCZtWuy8lrZ_3A zGO=><@tfJs#6rk#y)FO*hCv{;Mhv1^;q-{Og3m&XlKv^+5LueiS)wt628EjAV$N$p zxl?u1;2R-EjM?GF+I+xUKLoKV5OVW7nBc%Tr__5hqlhr?bB3s8Y!7Cr7f+9QsC*mA z{Xi!=`nPnW*%e=0wQ(#vpG@IesFGuf^EFjEJt135V#n+CmO#z@KTfy-K#zZ_Adoq2 zjYb)EO@flK*!({^!Ha&Q#nvN`;=cJUsU|r$lYnH=?#HEeNP3GNf$T?!s0xdJMeE*a z6Yvh_oqn78pUB8?z6sBxEbil`V^P^r@ibH|96&(&T$U8Ia!gyLI5nmfFrPpM1sb0n zu#!OM6Ct+=9@yzDxx53pdS8>#ncpAXjTf8W>hTDP>E6oy=vveERaQZfkHa;W+cy)A zvY;A4nRV=c=qHNiagy&qOm(f|gL+Ck+7L~rxFwtV%SU;N3zFc|b7+do)O);v6 zNG~mhL#0}NJ08acK!^nkLmKotfz>pu^N=ph7t@6(OgMSfUI?lo2OT@axegBNsM@|( z?_l#uxcW3xqE%CKF#?iQ4+GF+2MB4GD8TtkuVAYWqgMm-M}}romAB`67fa@g+f&?- zBKM!KeoE}3IM)lZdXL+CP&@^c232?P50FUMs;X#_#QgAy#S}vFF!h2rml9na(8pIJ zPvq|XH64jI60-W=J(QXu!=rnP6NqXwB!{tdf@W?C`45?d4=}F;Vd7r10-p`7y3$9G zkf}rv4^UAGGcdn7b9=Fe;fq=b0E^I?5e59}~UJ~Pih_OD1(9gwCqYtd;+nvpyr zvIMPYy&*oxl+{~(ykH`E4oPc?FbZ~BTh86E2nqL;xBSiD&twvhki{))v;YPZeGi9- zqt$C^bafSxKdJx-N`P>YN+7q@VMd`nD+7WnjA-dsUXP8OG=uh3V)M zetI2c=`DIt@Fo~(msYfoZm1)Qjj!E`*p`oA$i`6yv0kTMl`^d=?K{bFGpT^fqS>oP z2j`tmcXutNQ>P2mpy}UXbg}3gP(ldOtHEh9?SC{zr*>I%q)p=!!|g;!=>*+BcHhev znuC(sA{b=1&-fw6V}vm?r9H@vDTeVq5`k^lk;e8U(1~d@v*h7bmPU-_VZd`ALTy1w zOd6_y{#(B!`EHVV$tX~eRCMtkrUtG}33_t9bXi7)wSYJ{2@i~R3ZJPm-(`pi6+C;sMD zvyuDRx1idStS67}VN*g@{Sb`ESu|qR?cy>~ql>_>0@Ul2>+|SDNQST(3otqVNEQaY zpNAXB`d;&3$R6I%{C)0^(7QyZMt;l(gE2DAZ>W1MuCMj}A#vlE`w5ZbXEPM?9a_9v z7?k90o!}Pz;r+s=oE@?!MP3-3FPK^#i8~KQ8)XQ9HIqonS-lP)JV3K$cin?53wK?^ zfk-dOvW(^VoZb}&2?%J_B%%TUH_)~3L1{@?x%`)HX3WDAls%# zeN7{4+`PB1>&iFv`kH0bXrb1AWTLESNGSWy?KwODbZV4hkskcHHMf<|6rK|;kv$$ zd)r1@uLoDl5jCfml-2e1ds4>2?RM5LjPaZ;&*6-p6MrF0c?i@b4X(lbr<4n#03=Rk zLYFQIj09W4L+Km?y-cr3;wmcyO!C~ zI+2Ngz)5ZL>glz4M&9J_$2QFtZ62$d_>`&G~!_@tJ8i z#bn*s1ox?1tGOmWn@SU!FVVfwJiF>J)DCB zu?gpy?Cwt)`pa#XCywqog}^@8aSSA1ie_&m$h+xbf|5nMT@};Cv9ma;;cfr{;uWbZ zf81_;t!JoPmfIPDRYT*lT$QI`osR})G|0!%GzW(juNSvuuho&V!ojRCR|ZdnXsxuy zAY~sHEKly*mEKOzXCH=<4HCwlK!QYMvylQ<33DCeBXk-wtgRqw%T$@u8UWUs+Af?7=VEd}lC2K;B&s()yk=A!!9!ERr=W)i`BKW32&{vfZ{T#|wb>bgkEtzyk| z4!iedo_#3E`mOyNHO6t{3M6aOxXj-;N07>D&Oj-kR&_i@^gxX3p%-m%=Z~_VM4A1% zkqnI#S7|9(7@H-{){a3|AnyYn$$%evTQZI>52e?m#02`4x?tTC5x405@w@f z?hE`OfEgUa8lI~X-4ov`aFH|008P253-7)&&DRq(itOIzaQ?{Es;M{*Oy~BY?zl87n*?9#oM8E?uO_H)k#(n{0L?I*reEJz`G@!*}apQ!~G)M+WNSye% z0I!7#=&SP-8f+2NWw$zFk>c_t0(VuBVSj?;C$jWg{7LzN(#;>m3r(|`1b*uc(_5Wi z@L(1QQ)tU%xMh+@(u30SEyTwH(dXsqC%*Fq3gef^K|k9X zQb(5vN+ny&V3-vmkRx(-)6aS+cT~lhpRGy_25KJEitq2uo719-{`bs(2Ea;LtzUrr zPCa11Gg+9X8yf7Yq40Z8n8(^Zq?c-s3H^D}etF4PdV0AGA%`<997LQb8>xs(Dakp| zwp1xl`uC@68V0Crs(J@TZ@0nJ{Vo$fLJ~I_MtP)w28!7<}JXPd+{as;ZuGYRCd?it0*IlU}`Uh|(yhbuo0w(i7AhK7pSic=?w z3Z<$JkoYe=1>?(Y>8eQj(;V#T0}wZY*KL?%CVGBfCrh~%<1L}?E9mD*}91uV&rYT?j`|b-ob4ge4I}C6T`5MGy08j7lRG@P$&^fH675w{&S`NLZ=+=00x!^pNC! z-2p+uaWM%!OHYo^Y@?YNS8 zNs3M~RAt2yRf`z`!J{_qm!h{$Y@J7VePXAn-yJx0&ekEG)XtUbR1~<7oQCt~8WwVi zc#5{qn8w}BsqSlj;m?08$d{D1`n>OS5hEZakB#9EQnhs+w$LeRB@zJO|x&P>i z=IWK*y_1ssX@5V+RKvzsL;SpzS7+5J0^aj#aaN6~P=tsr(ovM+waPf{PCxsX_hIXJ zx6Qtl`20oBxc^a8MQDH(@%!ORI(2-IS~U3f@A_IC*rP^s#xj?2iZ-Zzq-5?sQB{3n zm6DY3qoz8i$qX2=VuGC-OBg3rkv=B+!((s%3SRwHO6ia(Jg*Q;|cv&q13l&?5?Que!;ckwp|_m_Lch#ivEfS^nOdS!m~tsn>JTO zoO={!u7%UFFb*gthr*E&_$$hnbJ~`fu`Y!mlc`#Uh!I0ve~^n2x?{3m<(PqC@)Uix z2AW@)cUqJrXB%O>M2MLcPECk$heBHd$N&LkoFwRx!WBi}4`zIg53wWCfQ2CO>sCrF z9_V}rwB{O2H*yc)z}xr4bk8fb#vu1aQ89Q)KD`P_fhz^-?mbQ)-{LO- zA@l&~&*gSza&Qn4dKb_Y>kYF55*|tqP_=|WyH+96K+Ts}0MAY~@N2)gs8^#&G+$sQ zx#C1UD;N{`$r~|}OWfL7pG+)`?7NW;c|A?hprN6q1nzisBvy)m0t7QRIr3Ddz6mh&k#Mxu3%%j^_UYL~*5*h&# zkb~;5_{F;?@)bc4Swo#C2nHC!%eBc1_CI3k_{ddMKk7_9;&j82#&1@Bb^YzR@i2PL zXzTS$B6JUsMht)_3M-tPwM#RNKy*eI*6FWw8JtYV9ERrsggp%R<-rKzdwfr~($Dn$ z!v8UPFelftmdF)Exfu;=r*9U@I^jKwHwn@;(vwP2mvIRMwY5YObbQN-MfN}-HQ=vW z{l^+=Xf0kf#ihG4liLKRa+XxL0I6JO3V`B}g$7v}L581QGShc0P=00q;TP{wj z?M|<+qMDni{PFpb6_Jwsp?-l^`)Wg#5b=HahFqoOtkpsy)xwpl^YbVFhlJw*m{zNm z0~WbI>cKu>3sZO8?OZMUMxH>X2quB>#)u{FGby!O}dHfWQQPL+grEU$U|3bFcLJH2WcirlGDngTTu5-$$5ZKGUeZwDG$5LGh|ssJ%eD?qMA;g%<0-7)5Lg z{}_|3;|O^b`h@9t&-NcC1?o}zRU#>2Zn$#nSN*^M3<`xU{Z*N9)FEtcPh~Hn;h~}a z{!R3;^#q??U3bCVdjXWG*O$I`%9VzXjM5Za@ht!qK%5-EoWu!I4?V*qDtMHwY@+(z zIE1nWxz-_l^!uIFxDZR#`;K?6>^IXOzWL0%{>oDMk?iiZa}(Witwe0XW@_vlj`kA1 zAOpx?C^3=1{j;PBXBDUi)j%mmu^0&qis3W{spgNqzI1!J$yt%XFc{1y?uh~oSaWPt zdYof3Gn6#s;|$-8FJ7BO%R=BvACxDw_GKNK^_~)e=lGuKdWo|@(UlLz|L!A;0Whwn z8dLI;tg-{ILPAJ9IP1Aupi*xUHiX*uG+boT$DYIu&F$Y(uMS?rRYZ5h2lWW@&OWia z>K&=e<{_ddy<9 zK^0i1KJl3xd!>$EvwS{_Blu&H*1GMnxAFD*+1cMy8!AkE>9_MDaK3_>=!&*)uD>E} zz`=otMcpq+t|g9PbvHBJ*d=O)QVyd(*&S>1O3G{sKfL0Jnba^^739jGXp5W9_PI|r z8m7B(%k?#B9$6@D|I#DwPrQ1(?En@E{yyL|R}gXPwBfl{%N` zu`!*cj-09f_6`i*gSr(GpPtBuzL1)v;;y5D#YBY6S+#Aq%aI9a7+9q;u0j!12M3KBA@kO*JLQUprvnD&OO;n@692E9b4s|8WmE5SGqP zT}<9!PrL}pNC=4$7a>v2fvQ7r?Pu|1S%?WkYv@Oq?PRgPpmejBsh_WUwt)t)yAu~{N!B;&Wqi&HLfD8)3jC31s zPG&xab9f&&y`@L6v32*~s$PESyZ3Jg0kF{l@PIO9EA0FdDVcE|f`)H6`~YklT#J76 z@l-^?U}+gqabEuIjU+>HB4QzU9p>RY=rkev!Oa@!u4r1Mv@8onQ9=t!sMRDs#kRs< zpox*J-zMxMx?-YN2(tBvRW_`D9R!`@iw+VphM+ob*3$E`;scGoa1OA<7oSM#B-L z)=YqAq9W^RYOhy;r-><>gT4e0shqav5D~pvFA|f&hPfR2(+_$#frG3s_&+4v0AOOR z)Td-5`lUr)jm!|xa5HmNVl8L~Sfguvr>SZ#6|F4e=oQeIk0U4av>txwX0{h}A-o9A zID)~ofPetfCIAZRFsnNU9i5c)9Kcf{V|_kEBxIHv=aLYBE83d@l9vR<>a8Ku0MzG~ zq`guNrYu?C=xap-i_ovg(VG@5_XIs{&};g>Y?Cl7(h3(gsqFLWiBQX?$bD2bh=1h+ zvQXgo9;wBH|1FshnRd4LpRhk!vZp0*4 zPfwWRz|YW>OxJP+n`(K#mDXEc`BmJnacDHtI)>1Fp4d@5rZG=n_oRnM?ZwavOCVq> ze;HYWp{~xQ$(I+uNPut6l9V8q&J&W->5|0JoNPup&7gZ?Vx*{Rzu-lx7&Vf7F;9ME zEbdTv8!uoEgoi}UbF*A9_7KTD7LI6y5@v#v$A_>HM+y#@q2SuEhQN^);bj`(IML$D z)LRi;G(i03;{&XTc_>lVt0x-GGt-o)G_$rN2*1*;u=$p*4r7rfA-PAV;XUOjCy?!) zI9`S}Xp1)czH=n$u6ndGyom%<(RoP$sYlx`eV2FOj|X$!;#3?;NVmIrD4c1|wkc6C zek3^JM@WzrhW6Ygpo>ZP&w;#90$y?t3w!0ft|l}lEdgAGD8x*fOd6Ao{~_Tp1}4>d znL|hBj~XQ5l@%-q$0b);fl4P(CEmU@Bo2Eea&}E;+#zc?m&L7B49VT4%IG7UBGbpZ z3PxltF#yy5TEm?-F<7lCADtK3x#Y++W#a6_A%v{1Y{jG$1Bw-UD4y>Q6Mi9{P|}rlQipw*xo0K^lET`wqegX7lBz!E{ zlR+P<1&o?Zm?`nmdKU9EOgPO57o6|GecIdta8F~pIDigE7t)?J%NR1U1onmF!dw%wRf6;990q?8@)N*TuD zOi*w#2jJK1?McR$gpMAH#eZofdh|~=6W9#0T=|s%J4+mQ2fb3hOt{M-o!4-KOz{yl zn-#oR8Y!decz}kwwi%X(=k^gwYM3p#SzHl|K}+txM9!iGJ!V^xdvQ#4{r`}#900>; zrQR$L+7l&zHDW=a$7;;fV4`XdB#pd$BgS?g)jiP0*Mm@G&cKD>hD-O)6`GxUtpQGEPtJ(l5P}=ql^wO zk!#^-ELD;jK`^P5ZI*xnrl><$8HMpIrZ0s>mCxhFh%0uQj1@O_wj8^e8U@!)btD1a zw7jj=TI$wJ@1twze#Kmm{Y6j!Y%a3TA@r`pPk66RG)mGEXcd~iLt_u+{MvGKk zCRu5<)M$G|<?io>1PnyR5V(t|Dc642lIMals;RiOowM z`sy0u7TdVaJr4Sslq;IN7)a>S)s0ZhsqX8+FNB&+zT}qL*QP||1o6E8N7Gpbwb?~m zI8fZ(o!~A33be)D-Q9w_wzykycMtAbpt!qxixh|AUyJ0Xckazh{^y-p+3!AQ@AWM8 zB3X3($IgLS1Imwz81kMUduhBFNW>zLC+~br-99g&;G!zlxiL0za>wN?hgcgZj1k+w zLax7$iIpjiY#F~#UE>~uAvw-kdvWQOy3J>pE+&5F<4r^`Q}aflx~uaIh5n{7uhBI% zxOV!dgr5LJeVgSLdC(7;{T?oQBsP5YV)I%C++zGV){~o$;iM^j)k$%AQ>Nwpul>+s z5YiZb%7+@TqM4fcI9ZrAJ_{R>SorVF9-sy%+uD0LJxK&{yU!CvzXL7sxfDGAsB0V( zV_B=CN-^15ttOIHm$azMy!w;hkNJ=oPTsgb%l^3g8Zaufpj9_1c8ZwsE6R=XoGhPm zOouLuhV=khT_C-f*>OP9;lI&{Z;yO9&nRBY>0_?4&}uHOuJR9X>y zdsp`H_P3ELh{4ei9Y`s-roX@9us?tL znflevBEo0Q>$%s2JB>DGkRYMb@n={pBVLm^@&Zz+L{*el6C60DHhw^3qPWX5CS`yF z+)-*5jT&cPrPA9>D9M!Q2o`Mxw?!tBX%4E%=gc|ipnM%uhJuK#5kyZltLXo14wkAs zkC^_o{95mk$2eN_v-Yk869b!`J60f;z&tX7;<|XF{e5O}asVp#{ z22mm%uxd$3I=yKKn{KgxDT&j|zHId!#fdg0qCs?@$c{BIc56+|G1W2`j#)za_ys{N zGnbjlN4F5_Q3F+ld}uo{5XHQB2r{4{*ajk#tJp`G(M+D%a|`1|`*Jg2Im@Awm7og> zNJa4f3%)!DAbhjkaKMl}kreOwgpE#&XPym161BvTM_s&#iW*(7bZWHC@Qojx@r+i& zS7a;W2@D;bGP3m2AQ8uS9N}WO)Je7oTq>5f(1>l6FAC^;C|v(S>PnZCS$OwQj;r$4 zhu8Rg%ZWS@I!D2ghBm7}R~0&%;a1u+EAAdX&-uAzx?lH+y0%PcRng^_3|8$^z<&fE zn|I~heQv@pp7<%}}0F|zI7h=BcFw*1uvBR(gDjp z_>OjbMlgKadg$LBjvzEC{7wz?4!h9sX@*JB^DB#_`4Y98@g||b&9Nrf(}W}^kRrxq zgjK!q3*}`OcGmJH{IGugx=JS{A00W$uS1AM8b>UJ5?&?6gbAnN-q&FLV{nSGOP}mR zT$)4Gpl&}%gU4}HPT%P4L$Z|Nr?*#;&qZxER0`CZ^K_y zUF%vr{_n3k2SC`hgpmuS7Nx|WDS3Wb5~LTKUjUbi8Bi~JGs}VUH3DlnlA$rFrL0

Z+ActwycFKhCo=8)yNeehZavG0IvWbDQPWvaxh_I6Q+;o0x{a^=iA4yR+^mWDGUt z85{d+1vO?=%z*b?@MaZN^*G&il6UEyq5=ngM=T>!u4lV0Jav#&_V<&DpT)UU(EH>* zrH~wrI2wDMD0wK8$S!J)g91asY`9^{e!_ZkVn9-6RIPa;z@Iya#U3d>)Wr=IpRuF} zde!!cE4-nM(Gp5qb{+VpN{1IGGi&vCJ%*@8+^_G+wBDfq!UF`U&%1SB?vh=jTG|uZ zHiu(nfHcNAd^P@Wwe0hzMLl}0oE!Tf%sz_I^W(_-nVl58j!_I|ZN~p~BNqAKKcTU`M$%3vwQD+mwe4z+Ef6~o z2NEDB-M>WnI4`2n(9nnR($z4Kq98@mSd-3Uo;oNLJDXLq|6~iUA*Z;#m-&P60uE>- z(`bo|P}kKF+UF>U&imU@r}}90&1ujzemkp~-Sw0*Ychb;QqhepPCU^s-M?{=${tyt zL4ikt&*$2;^mmHO$LNdwv$opQpIt4<>Ih55ER`s*@ZYAhR7z9gJ5x=y40BA;;SDd| z0FV=WWb4{zbge5u16jQC)#K%z0XlO!?+Op1RRij9E^<&vT=Ve?3Y`~6pk`X7I?lQp zs!UDHcL!OwWHoT8dD(hS-;sYi*y z=7xebwQ61J_MYd+PL|!aUgD>ZHf?u=U5jFQY07Wn@QU~uYe%g_bB!p;is%SiieJ|b zw)S=`R?~zfTZHHK+}ktEo49V*)lyMYNqa8N^jfAbbCLn6jy9ANm}*nyE^$O| zpc@x1W`?GKP=F4?;@Evhi3S1L8fas&D`M`X$(q`%8Y**U#3u7Lk%f=C^M-zbJF4@< zJjXfZ@KK+rNX3@iI7wctoG!ZQcAxGGP>}mrTbv>f;`h$po0{9497Lz3jA%du&segr zrzHgixn?~uxqlQW{8QoccGE}P?m!jrWp9`$IVWrGZjj*A))Lb!4N2Bd!M)@BzR#D1 z513x>>W1pM@LjSjEQ6bn;UYJfrA62}!a253=#jQSB1FeCXYuzvvLXNWlpjCq7>azI z#enB_sQ5q$&o#P`5LebhQ#ure66vp8mjsC=V{S35yP}=|8)@HVnN?|h2WDq6j)XA) zi>dHKC>+h+m*C>-2GPpHs~I_1fb;8zA~(FKiv| zVsO5tj5hZ1x4;q2Xiof(o6Qlu9#1K$0#XQL10nNGTBC17=^$=MsT@}_9ED1Vt z2V~+v`DtvmnPli4z%t}0Rx9iWLD&W`J9oippZ(?r-#_U3653vEw7;_(Gs_W|jh$6y z8W`ubovZ&(33tH=hqgLPs2~kJ%K%k$Mr!;^7*UW1cfysd7Um`e{-)-U9p{cQ0P` z=!#kVbSZ*=w06$_LE}DbTxstv_9j=o;~tnmocCebU<0OdY|f$-nLGe+SU7VFSdHMou{9!O`%g2o8WB!SLo+LzTaJ!X2kuG zG7N6UH_^(r>VHC|ap(zJD`J8rah!yw7Q?i>%LiCm=6&Lb^)kx7&s5=Lr+zYiw~6w3 zHgS4Ysx9bI#@dE$x7_o!mu>GsK&M!1Nh3qm#1B6+JA1jjG*?@3HznQi#Ck+@>ND^V zKaVHPIMMJNqmE39&cMo9c~CEx*HX=Y!Kk}R8;*EYQ$N3rj8ObHKtAchvEf`fG*KEeH}b@Dwseb{kIQmv zH~0Ki>DvR$aX>{QRz%nsijR|@sdUI&W}P;Bgkx$%C6>}Xq?6+Eg_ouGRS`NVuk`jV zdGAPSO!Pu5=I?nWA_6$LY&*r&E@QYHfYd6cS!V@?Pn=UMTS#*CBuGcbr2kf3Tbw#v*DSf$D zdboD2oNx1OJNn}S{X}AR?pOo!Cx|)quW&N&$FW_*ImN%sVSbzVQMV!;Xe3q(s54f1 z?DCW2ZsK2wFFCWbq5(Cv?OS9oBd7x>LQS6mvsB1uH09n$U!^&&74_m6qWohC|W>&u!r6PFE&l znV<1+U*YV4?A|-0vna*yM`^W+Ih#} zsthVgi*~x#E))jJ*#z4@KfPsfeG7n_)CHeJQq==Fv66zO}WX zvy#+*WyuB4Pvf7Yp>>cKwt+t)AJ_L9l4Wj4J4M!SJf}asMwzvq=mv#^9%$RqP9r09MF>e4=&Fvrgnl6Uf<_ocVUMQtCZKE(eeesfvzzMO|ua> z1pbJ$lJ@pwa{4hz;jVK~Ps6x+d>nnHx=ANGJgw(ItVdTkds$UwmgwMDcQx5XZWlhI z?Mb5U3=6;Gmut9@7In202_jO?bB>GXjl-Y3BVseb9H`&+hfUups$0p)uS}Yrdb=({ z;m8Pe8oHeYGnj)nDzm+t=z!fgYYO*Iu}Ucm6HjrY5;t4 zz`Vwryd#5;RaPXyszFQa+cl)YhM7(y$5_23T=%Asdq&&tA%$1oeDxh84^BTKkvoB` zb+B`QRx(1GGnuwzzHMM(eztVaDGVE(vBH_OuRd#JoyFX3T5EH5v;+9<))NHbvJ(SfHouQDN|K9J74-qu%^M%_|@pKPH@JI^AmLKuA zd9GcJAV8!N1e&veP_BDechdch5|EfGB+kTyt*ogaDY7!@j@jTA4x9{sl_*xDat(ru zdPPo`^Hb}$g1?t9IfNWO<)E{jk9fj`9+5=eld!q>GAK`%;f`7%v$l957Awb z72&Ft)oeLAOOb4C>eg#`$`kYsW1Q-#EJfnzefQs*gxI)JWpv0@R@rIFWs(dzf4V2C zz_`s+9mko!6W3*M{8VbF)lA{hluzxSa>BW3U=RI{7r*-b6$;H{v0f#2(X`Eb+!x08 z%U`*1erV)vr-8WtwMFejXPV)=iD7 zD<}au`H~zQ1vAB*)jm?IBU3~HR#>>xD8gwG7#e?lo-SlW>IjKz>)w{V7M>LNuPxQK zub`Ds+H|`si-CNz_@!4Qc!~5-sT%WgudN_JbO|2b4q6pB@`1R_j|<*81OrFMKLnnB z9L%&)@>L-=!EYVYu_c6g=TUcIs59HIG_|^lam9o>oh-rN?;?GKU2o`1pP9sb5FHm~nLyEib>OfSLM;Cq-i51w)!m2n9`jAzNaW zd^vXJA81|KYY_!0PLlnY;DS$%l#0UAJbcMffy;kYx)%gOo>zHo0)Oh2)MkGjt;n>Za6Sn|bc#StaxwN2fL&sllx3vLp z@5f$b?19u5Gj`)AiP(dae6Plo@rVElY-Yhn&CVCmp8N|SbRDzFU^z?-yWbrva%8A> zQesWFH_g732~yJl>qB}9EJZI+X)H?s4OcNFU9I|vSiF6TFeYw04a9I!36fa+Pn}3? zaU!2f=UhrM$*wKweP96*)wJ(&&-vbBp#aCtPGNx0*QY7X?WJYgo>ODKE7_FkXLrxh z+x*8s9WK`Hd&*x_9lwsp^W{$EGXZkkVhEb@dlDhUi&Jm$wQ@ABw#@riqK*pe-RLbd zy=;xWZIKc????hOET>^nn#Y^44lVo9b0==GXuaHADRzSO{KWgbTD_MVI`i$8nDIb= zVYH@YK5^_{?Rf(rBrC%RJ`@I?=iR;kGStjd^wCnQPIk9@o1egF*(fYNGNnp+vrGiLM_#vxr{XPklL)K zz(Qa9!<-~#IE2yUjU-BVIzH~sC4%*O6q`WFY}9=ZKF34N9y4t+Z%eNAo{_P3&p*nx zbQ&p4yJ<%aYYvhaf+US)#G5gCk~r6qeWl%KYOMv?JItKj{)`(9d+&PB$lz)$nCgc$t7(=chTCFke1xKGy(gawo+~XVy4^7lQC^6w2r}aj$R35ITml z9yv7?lj=3^#cbi;nK>FJ-+vIatpdMIpKwucnh5c390KEar$oN#8ee;Y?uSfm|3btW z&F!KX*IY2j@gtK&6-MCbXocD&O1YQq7k@cV2xT=-Y;;+8>XWz$fhidnH6-ayvdg7- z+!RHPn(*M{TSt)UfcPrxhouVYo|syT7Me;E5v+D;PAV0v;sy!}-w|1SGkJ@K`5ER! zX&)PHib)zzQ1%t|+=vU}Z`fER_0{xXffuNRkD z1|o_kg)q;i_jvQ3lFcM7FEZVnq8Wwc+CfoMX(S`_e!Sd{Z}hf(G#TZI|o6{qx0L{6S3&fVAJX95Q-~!8AbKofTQVGS?4Gif5y?r`y+E z!-LBqM$$ASPrBnl*$62b$EIa)+Kc5lzEz-WCab$f)b9iz=+{SO+MXvGeMVgK$KcGp zFD@4AgPl`|c2N^=6(+q(BpKk={LRbZcVzp>@e?>%2)Hz22#8{(L@=Bu3!{-3in!)i zP=}KtgFV&RNPeWxmVl`Q_(mZwdY9?JPsy4QU0iG3rb7OsNgFxRR%LZ~sKe&O(3b0% zua*6Q*3Khq>S`P0laFSg$?@E+?2)eW)NDCdg6wxF#9%3YEJxI+nW1es|8&=*88XsL zbKDQTo|nS=j!FwafZtMl`I&BOz(%3LN*^YN2N$j&BgHG1Q>~<8DJa_7TO!>@;@~&E z(}Y%2==bj}bQ+8>Yyo2pNcnr5OwNc7zYl!4a;+1jIL=Tu#w|qD6luAtC*@~KTyFH4F zcD7T9=|*ySUXE7k_WSl}FLN7b$9(}G_pm~Im-{KAc04`_JUu-tp1`Q$Ti+HM*-Bg7 z?vD)vKArtp42e)3=oGVU`Pwl<2jqdej=54uXYZqDpWHC&G~Ta4PUb8Vd>Tq*X^PAa z8WeTM@R6x={V6}2$({)=Kg}$KO#~d<<>+l11C7iC5v_^aiaGBr3BA-36i?(Y@_R2oI%Hp=~`jkK4_c2;U}( z=<7Q-u&HyL`A{})d9C){{(Q2xkUaA%PAN)i8$d6{uxhJiOJ@yQd~r)a^x|8S&tMcR z{QXlB+nEA5^a0s^+tvg_}?kr=sk0u0)vB$tXU4VUb9y{DriL&fW@9k;_Bq zE01ED>y)PH-8g+UN}Xh8bf2fc3Xi#+K88I`rCc_G6l^w(nVO^{p`!iffZ<|9~0y&5lYF793AoItJVz1O|48HQQo&g__WNbX1Ju z?N3LqYleeoQI^4IDkUPtPsP4dcAOP!f<)$ zj{0`Cq9er7bym3Hi{leSG1dkOWfE_fdsQ>Xqpk@nDg~OJ7h)tksym?pGy1- zv$~G&hw#?%-Kw-@-}V@Gq^xw^3 zY|UKEyH1N5?mDS+kPrS78Awkq<;QbkTd zF5<06;n=Y5R8<}deT94@6S{*-wc|8*(CTeDgB7{8Gd<*6*|$t%jci+foV ziDv3wbytimRUk*jXXL(wVu{aB7X4WVq*9J1inT>*RnF8VH(g~rYUxQ6Tu?-Lbwv~F zbU$l)_x_#xr-a|32)@R;0jL!I77&FwbNH|L3Hh*e-=&{As28Fyb@A*s5oR>Oni9Na zJuU+n*`ZNr2-2968S+wrqWCxjr+5eoxZbOX)WErA$bjbkmNGIyp`9V5H+|WG+ z^PtVkM35Kbqhz$DXykix&Wzdg)YAZ_b?viNFS4ApExf!OIAkmmaOjmNSaqSvb6?K@ zA%)?znyJ1nQemZxK`X6lxfXkN3Cg{?wAH6C{F>`LvH=Dj;(ep$U>B^B~>MQ8gHK5E>4tSn%B~Gt4erSg4sT1Q9Hi$}Yp#KX_ zWIz%t388YrUuvslE==s+d|sa7n5W&AM~p3;O#p3{IU6Onh)yvR( zaV%7DS!KgFY;*b|*U=eY{i$JgR*%Ln*#dO(<}#j{V@N`-%u2-Y;~M;7b4PeCsni#sLXI4J$}>&p%IO9(&iC11&6;2 zey1TLR5n1L6A3ZAK_&QF6rz?W&jfKpBDKnA3)TKw$*Juqmv53!MQ51F+E?(>C4R3i z;P!4kCC)Y-m*N*X9<3$ogjkkGSq@p6o?QupPF?eR!iXmE#tz*N`YCBm+gimf9Fhx< zB&XWEskQ@#8g6_$^3f;MzUfFCf*P4_PpZpQDM@gpRY|=6UHtbGG9fBRXjF*<++7nn z)+S9e#o)C*iTT%$z|vmIZC7EFI|Vn`8O02ygyMgsKWxYlr#;M9ykm0sWcH2v!`X10 zDelk`%NDfU@YwF^iOqLfg|Ugw8l4uLmMw?N9@fk&@KD^%bl!h48Q+^)uA~!idHL{x zMRlvUj3u%J%@djS<9X~t@6dxbs*r&rvQzt2S`j|tfGnW#;5!|}O-YhCXIVNt$dJ8` zjUnwe8y`Is&dNfP)7e#ELpwqvm4ZP;AHyo7xV=>-0p2zx{v;WFE$T%Y>lY_G?0_J~ zNjW+h4?Xi7NRA*8 zvJy?yTC1P|iWh0oSUp}tsV0F+kNk9QG|t*!3=>+!C7-kLjRM2tjkX}_!hKKb$>)GN z$Df=L+QP+@nk;cUIy`R2G3FRQnx$jqVx(x&w%w6q3+VMHaSyzsDc|OCoh9N`c6?6G zT;cLKrb#4<6(VG`1N)Pl2=VmS^-ejL4Dz4+!mP^ZrT61ZlmH~y1sVDlLUHINJ@f5+ z`zgZ+*Fv|(hCxgnFEh2DChHebojSzw=N)hn^EB2Ya?6!wLTzVta%*Bq&-OD>nLL@Lh=+Zl0zsH`@_OSzx1UaN>vVzQEoMO*nTZX3{IG&@G%fdNvBn| z$HkzL!EJ~9TkC+GihWIV9bh@ndJzWKX7rW#)-c6!FF;)C&pjVv3ARIdKQkSBu&5Nr z@L+wrygB}?8pc4Qgyv&^YW69ncgAK*djx%Gf-8F!6r*y7n&q}4KYzNxhTa4UfE+dWpr#h#q<01pJ2T-I>N`SWlCd15@7@@`s;swQ` zY9r*t*KFV>@8%o$c8;DRDo8VPX;5c*y7f4yivD<;6! zZV`*m7i1rdKa9RIid*d^KkqkC?yFgW<#u~MInF{JIP{+JZz|J=s;P}{-_gTB>Q=fWkPrT z_S$m}VV(y7k1h@nCs}$jsBYQ}^Gv}LB{pyQ&R(U)yB$Vjr*Al!-Pgg#v7&ps+SE7T zyd30gKj78%C#bih``g$Y=;5iCME@uYL=QGl&1MoIsq64Mt1SLx(ox}~1F5>&`aq@$ zKvPHr(uzgOumO4G;-|@($nN4ka=p5dq2XOf5gc`!4lTxzIb{!9%==(6z`^+wrM<@} zqUZqO8d7d+pWkp0qOH>aX6x`$l3F`k+~H!Ze$0DWN=_~)OO4EgMsl<|_VS)DrrEa~ zjRq9HUs;&Q`glb7aBYo37h8lSfsEwLnp~7O?jfEfPYpm`T;g$W=CGN zzuT}ABEdyQTGL1Wq{x-UmCTt2F)5 zYVJFb{nMVRa6~fHz;p8)^l;Vp`o31pZ_C`Xha>Y^Q$zQ~tBshZ76B3641ni!XC=x0 zT6_2&j8=&MuQB}zKq!O(_)sZ)U1~P#{(*kkjRb1hsGR z!tB<0v7^E&6P`M37t0#zCMp^2J{!grT8GMyOAk;d&xQbKN5x;$dBtJtw_hGBG?Dva z1a9DTm^ZYDRH7W;d(#6B(DH>xx6udzxPk7GL((3hV>WRyV(mx=huGylpk! z`P}psZhm-dk&|ixwRi+N3HQfdNlGgi*;KsM_ah5b2PQ||sqy&5b!c3^T=z>yMl zU2jr6i%ME5%IF&Tv#jyYa0(H#{(N=fvXXB-%3WAW>QYr!H78wo-Cw**9V7v<9=12} z&5EvQg#2z4B#3v<^Sf8?#?KfDk;U_sVmEq&Y^?bZcM@5DF8*u~DvbItq?sD*b-@iT zf!ic%)2REWgcSfn#lIkKeg#!{;cH|RQrrbt?IH1iP@y`!h*CI;^n9{LE9i_;Xq|q5 z`a|nz%Gn$V%G=*cZFGsIKR2APOB5kX6)~?GhubKFZ1piT3Z(JFS$)c1?QqT$cd7?S z@{Bs28570PlKg8#gFx`3MCsgqJ?qQWAa{e!FbsNS3bP>xU>i&B$68_(bG^C;>;bm1 zDD&hs+lF_c$<_&q*yS%LWJzX?B$navm$tj^Lp*lOxl<*}3kh{RFLxYB0Fn;0;LKaw z=i+pm1+Yn%;2nkU9!Slv5a}|-0${opa#)5`e=!K z(<{6+E25i@?mx5`u5chcmdvHFyA3_t;w7BS}zpe3b8b*s? zCX&{@v^!+)G>0wE-Eu+cKQKWgXT|ZIEb~I<41lC`cEH2-t10CK?C)q{ap_5ES-}%o z2nk1;&Fxmf5nnJq!S^W!=L_#;^Qg+D2egLh^nKf+B9EZgST&L^!KciQwbPCP6$uWN zvte(%0;8zkhmZLWW_)O?;{7x&vZS%`<^~dU)M?xHZDh-Ka@u`Z^<07QkoF7DxY^7J z2!0uDqY*2owdjt(yE$j1+0$!P7%Rx#0ojp{a^-EAP;!yA$u@l$2N;j607zP_06DAI ze<9c_QN?3rqlip7LzRg4xJ7g$Kff~r5Le1f#HzkUOvbA$FAG=KaVWjEi>rjLyav8> zwtnS6vr#NcxHG^8mE>~Tl~>b#mABNRPxs@phL zkO~xR*C@tM7YoanngC!*u7j{3tYbllp-bhicCfv60!?Da|@o3p~yNz^7tb2 zl;2J3qwj`D-(gyj@kX-`5Ao7;M&g-aO90q;ffM4z+XK;NmLn41$76X1*NAWMe|Xc( z!;Q*Hwn*1w;cPKUVoC0+sn)nJGJmhqtGM{w8ZT`e63m&g-(&2Lg4oPn*{H3N^X&&SdM3Klbx=^_d_r6h6@ zS|%kBdIqsbp=@#}@?9CdL6{)4r&Ohysq^%MOS*jOPF40pDgV*FWM?i{HponraaYS) zz!jI7|5g(JTj^e}c&IfK#e#7!d=!*I`<1Y9!$fA3WxR#Zvul#V6zZbOf>E)*V7kgRBcB% z{#~0LOl|HBgo<#s*4~R*cg{u(oib-t@(X)nd1czB?k7jptu>a@^1L2p=DrzAw=C3y zDAqu&)w`_O5d%e1TZX*!o|GOUi~qJD0Zh9onmXmMc)$n$Rj%7#jlcX~1NH9u8=$*E znL(H?8GgME&=ZE1v{a#U%`dPY|Mu_O-}B~>?z4S2XE-}@;pkrO$bOLF69k2mXI<(a z8arzg#%g`!aixn{z3zX!L)PS3_uz^^%gzcmk0KzI7h+x?qg4v`934?>oDg4!%cFox z#XPy^MRX)hlNJ;EA>&^ZP7gu=0%@Xnp{&u>?jh_r>;&J&H~R(@b&WdBMDUQpol5Qh zqwvx@#o*SlDm@+7C$R@HILAk{+909iauJZ3$)aOgOrP%RYh>LaxtFOwp|RWMM9as~ zzC+WfKmbyZAVx<6Vi0Y47+Wi1(c$}=*WdAbYeX~D2-?{LEVx88Ok)`U0>9bJgK2!@ zj!C`DV<dqI#NWGKaLkY=)6N_}YIN`2wRh`aJAF z{SpcL)1O$C-~jM&v;)Dg(}z5BS>5+q@e))lWD+$#85uD(eRquL5PpQvysjD*Mx-n$ zo5QQzRwSBuo513DMv@FWxiZ{vqwYEiGW2%A{K?OMoGTy4e5Q=Ao#L{Eti|kDLjJLw zW`a?FIj%aphylLR+ZWE900{n+TK7f;)1slULmR&%3~WK*(b)BuO{0;CdB1ED@XvoT z3l|WVDZu4y##c4;NDwQkQYe;`_$vHkVa)-0x(J-(B16PG$|en`7Gj>ACq<365Q_eZ zY6ZFCgiAJsC?s>ai#vv7tZW)YM=)%$#cldD*$?5yxo((`&MZx?uh%_vnM?X%B^8gk zX`ky%9k(I#qEbpMi>xI=Onnaa@kwFb9Ra?2c+yM5N@6i$-xa~6OH@b><2f|Q>bGICfQ?7JP(BR1smx5cK;+lswH8JKT8JT`}!|2K7L_;=T7-| zB>js)SI=WtobtoB&@nod?3f{8A1|hW2U9uL>{7>y?Y^5ygu_xhW!&glTmb5}sc({{ zYzDDp_igF2K}z`#I#;H~U{g4BQYq(Sb&+}E6%CXC3W!PEwu^z{sXE>tx@BtvAxo0{ zOj-fqJsfUfDc)Q6qs6%}iD_D4vC&@d!5}Kqoy5vKrb{6I-FVf#^0wGi!dv#9=`i{3 z5qaIRsXziK@uWz8Li;pbI(4UA5NqWOD9us?AcO_agzr4}E!bS^etY}YZr&(bbSX>! zuTPi>MyN5?cR-b@R+9|CCOzT8&rdgpg~x(p`Klj66MJ*6s@wZ(Oet-&T5cgi7R~(9 zZw)M({!>_7c8=K? zukkRZud72U$hh|9RdWJ!v9Ua~H>a?mf4R6(_y4`pp6Ziw?pVg9m=VeDU8)wYb1^#& z-Duex+5ZkeI31S`mrMz~k@Ma_`lX<4U&WlR?T%jS+7rkS&h9kFrfS5}@Rgt`YG~Au z=$CQ(rRQ5N2!r@r^?G171t6T+t~p@v{ihC(*3ZW!h^Osl3WH^W?Q+lgZ*$6k6a2QeaikAI82UGafi{(o zrcipj!XlaT;@DC)EI&5hhja6sw)6?WWFf6}xgH!stlri2U+-Q47{==`GZ7K3Rp7Aw zH;oOY6lz2?&sgv{5*Sh3I8Dxdr7oDiT$UkOYOftxV7&ZBF2UGrf!?C?hf8iiGN)mgiAuk~4A zc1OkGGw>I!#i_7NceWkuB5F=In@!Y3gJU}xmpn|Df!Ht(SlKz@iU>eb54AAO^S|y% zW1*E2qYss<$?&@k?9^;b3Vt0j_J0O#pV*+INl2c3kumG9P2N%LCJs^!UjHGTUtt4n zzh_WZ|Gw{Fag=fi{e%5H9$!N)Ezhx)LSRiK!$&R;7!$8V#S=y>Pl09q;)Vdq`AV)N zIhsAh(STbE!cvh$wB)B^WE0hji=hOZ10~bEo9MM8Kw7YNu2?e%Rx&@ah_dy)*&WHk zdW9fJsjfrFI;4)GKfsG+W%?6)<{a))z|$+S9__53^JN2$E|+q5{)kQ&EPZ)mlX8Ift-dIW#@)g>0GGZl$RC>a+$KAazH$iBq#F^T;{RP;-gVaX#`eT^mXmsf8*>uW-_ zeOk{?U3#pAUc~4$`2oBM!*l3gAQ9cG9uu&``@%EP62mgS6n+pOO$O|#T-9%CWD{ z&3YoAqwj{%1`iw46zbjhvtmjB5GEQw=$RYEbc)DMDs&0@a9fO89P3YiT}@~Ywi_E| zqlA;=G5Bl!w<)w9Ku;ObT+r|Iqmc-3slj~;AFi%E57~&(&pK_DlkcIp2oMToVvg0T^|7mWzNu59 zsCpV~M)15` zbo``CMP>><^Z$oAL+zYA=Wf&%d7SnlO3A4u&7uTtSDLkoh_T#tTwH_@zrEGWl2s?G zfH3q)@`*Rsqi);Fd6=93U8>pQ;<@s8bAR>m|v`# zxt^UgGe(W(I4;NFMx4|UTVOt$`(1^df--w#xxHr9o}^gC`m%PXhIwgR1RPKKr*Def z`zp-hC(aBiT^G+}`zI~aid2;u>K!mx@*|tYnLP+guHmWWY3)vb-*A=s!&I0+0PdGm zilVbJb-&TN*TwbE&tIJzqS)7x5AIRFIB6pIMSB6+oG$-r!ey3b^C4CX;pk48Efb{j zB>YptIsl>98uoVJ?*_-&?}*a3XgGPm)*$9s6k^z3M86pYYYu8nMiRYFd}>+A7S6%G z_NN^ErbbT0Zh#*nZbQvE|KBG>+K~Mc*+JB|I#2+Av7^GAfBiixfS_0^?PwLsjgjU* z0u(|atWuBF(~~Kxk&Ttq4os?fd}%Lm@=!2EP9^jA+tl}B$Ha{>ENZ6!U!edN0q$~c zgYm+cEh$RCc%sviIA37e#yIYVR61q$Brq-;)rd|LH)NU*H>BqGa8|y&xc2xY3mXBx zFeB%e+K*(CClz*~SvOhD^vP6rI+7kZhv;NjRa>ltz-TdqS>^EWPEyxx5f+;n@iuE1qhz0Ki0^^ZX=*8+a24ej?DzzA?5ivM5Ubtks@8E&& zMH(12B1u~y+6B2)AiSDrxO*4hk#nr-SJf1*_dT966K=YkL!MKyUwenmk4+uG@PU$4 zWew3x{sQYig`TK5`9tK{6r{8@YuDaO8Sp#IN2)wLp!~7kIl9>M@*sGub6Zh37TQwb z2sDrHwHcjRsnbA;a{uJlFuFxECWei?AkX%?_qky>Uq~{fQ;p3!ju2uD$fr_wp zFJACJC9DAu+D%s-7%3->C4>w4Fevd+gY^H6JULTqS|8GvV{D86)NTbn8y{a2&6hDZ z5y4R*z01WjQg`Zqk#n=%7P~h#*<9+b`9upKDU*Y*Tiq>;#0-Z7paT~)9)Y+`rxIug z#mL&~3seLO6ko`u`;d~PP2+dE;BkEP&HiK)cvcjQ4y4cL+wIFAxHXes@=k5BTVPV? zV|b;b=(Wo#DN>~JhS_OV$t*O;2Ao^hNn4eB1VRHPFdY$G{Yvx4t@D@Pn?-lfZ;<>{ z&orobWu+uak&sxN-2eES(DAc8;2k=^oT)VRO%}PmVDMt0h3`6XAV)T7lf6x4@ ze%ttI>7K5|!rMfBA=L2BWEozgt9LWW<;oa8baBf67d6P zYfu!Q9WU=V5JJC{hEvJWZb?C>w{TX)ws?tP@;h{YwR()_oLAV~uBhqY;$fnU|3*kA z;ITFzUxi96Hhfsn==j8JmfuKSV9Cqz7IlLF?Q z>GoCtQH`3Oe+L16H2oo0bF3w~C(+n)qzyu)kbSBbO^2-NUCmyMyNalCfpMXsMcLV^TedK4#zBDqp{w&uys#aAa3nw>f@nkI6RCNPtBqnGbM(wA09 zz^Yac0xB&8>$j&loaf%=N9mH99S^!SDpj)8tT|W5zww9HBT>rcr~JrfM$D)HERbvn z9-m*oP+Ep)3?QSQn@EuS8uD|JNG)S;q~?S&(9FCpSwZp|`5{3FR)sxNR#&snGbtjc z2`wZ}zhC-(|NEe1*#HENU)Jjh9NJBSI?q1|VG<>mTdX8;=?jPJ{EQsr`>H51tt5o( z*KR-)Q9-ybLSv0Agd=1yDX5bayYI;fQK|=X*r3uR4vqtHZ4!yl(iTfcW@L{&Vd_0E zA8Z0uBUo&H!p#ig4y`6gN*w$nR%+#czUE1jr4nm{Ayl0kS+8pSr0n0BDaPVc*s~(N z;k1T7qm3lLNV2nby>EQ;4<CA{ff3gIA-g-9e^?u#1_l@6m5&w|PART?{4A%=U~{>6-r`}i3bpqF6a?ifGnS87y=8d zBPS~bCuX#+;_splh)gQ8BS=&>k!1IgA|+i?6(XUNyo*7HjzEIbniCKb*ZRxRJ zQK6>j7ql~NX#)TIpk(p@1e;aXYYa2mRU}&P4dopZjb~Y{B+;pJE~xU_}!sy)2#c216TJMl+T#T+55zyn>{~^+b@61jQ%K> zwEh&A)@jn6-QM<+jg6(*_(n)$tFb4)+^7{VmD&|?@Aba20RuWT0tPFl``JjW1nD>u zsO>|HZYxgmb>PZ=l8EuB9SL#tJgu+&FMqe{uQ+!KoLH#ThNFu;cWl)}Y>R;k1Oh-A zAc#Ja?ahrCr4;*ZlJ}rWah6(E>vt?bzvSL-1+@WTyc$_?SD=wwbWce4!GYUqGN*ap zvg)?Q@Pj;emnWBTBDl9|;!tA`|gxSmK9aqe(L-JKsICBp(d?dx?%N)=DY z_T+_-#-RWSfB=9@Zv5+LX3X}2sJKpx2Qo#txVZazo;Yk+_gvn+Nb^~xJ5+D~KjZ#i z{CVqjTQB_I`~QBtln?5x0YCenvO^>K9Je3BfFdsx8ubXK>_xKV+it>vF%U>mWl;}6 zMIbc6+*RS177Ij6|ND?+^Z*2$Q`PH9G|Ez>s=pcHD-v;?S*#>>=|8V(H1Ll6RR2>9 zp@V_cexiFJu%bD5B_Z)K}bfV#AZ=p>Ut8#Jg~MaL_D8{l!ZPb(5v0kf?5;A~8if zKDvsmNN)4H4%S_ag&sI@VoZ6!RT{LfOmrZJ7`JTNf36lIoi>!a-TRzvq*oAxBB4dG zAPGmy;tpMN14IZZK_C_e&LZ;4Momlv-Em)7jpZ&oB z=esK1XEz>I2(LO!0RQ`-WX*sC!A90=3`5#SqFTK$NpTX{pIfY?bEyl7D}1~dBJBT9L)=|LwJE1qNJ16z$e*s%EtxW?53)7~(3zjq$ z%}olgw3GD0B@phROBJM*bYBFrl4Lq;A&3wdUEM{G9t%`j2#o4HKChY@WQ17CR{KKH z?ayd4Df}p>{ymn~u;J|w`)Q;Kiq=39Jty%<4+ONF7!h}+`c@IW2xE8D> z-Iz$6ntggcJx!syzTfNqU2i5>Rqa+%?@X07eByDIl?~ZtxIn0;X1G#;3JcuDKuD6( zIR*J85-3Ovek~?>0n~sne5g$V5eU2+d1Z-3iZrJ?0akI9jB%qmPHdThn) z6kuDf8G&4hVanuw3X9zm65w)4&L}t6lP_i;3`+ooTIhi$5%2Pa9 zO2wMgq|~~x%2U;5g0heQ`=DgwfCQ9VRqF{H>OaAXy$=i*5pg$HOr&q=!7ge%@{RS& z$xMxbe~ADXWI&dt`tJsYN)n@TTVSJ>99jSs%P4rI)SPK}XY0y@Z`L^XJ@ixcMuG& zV05zx=KunYNC1a3Q~znA7g3h0cy=00%+snF=|O3K2B4pJv#XAAuW3x_D}U^Kj*}hD zB-@VlJ<+csRO{Yf{r;c-*X{rQpZEThb*oVor5b_5JysB4;23SVfND)9?a%=r0o=q? z0X(WV&d2N9OYIVRjx`dK49h;)h#c@ z6u!4sFGWRdHu}ZK)Qf8KQO!G_FsP_3C~-pq84y}^GVpy@mQ&>YqTC{Tu zcMXV}3pOqd2$7%xCja}OWbc3k+FjM_EHnC3OWKWK!gUfgdsnP5b7>z2>iid! zEMXjqDxjWgCL4`4T5%u&1wrB9K#_6Tg^aX;03=7zp_sZlEkTCNkbZ#{(oU?ahx#eG7zU5hRitn1Uocv&=x7&5{ zf8|6HX3g?RF0Q!3=KeP~4+i}J4IVH7Qb?!yUw*K4C=Cz?f{qbBEz2jljPfBEivfcS zT9C1_CrayOrj$qOn>pz_(ce<(J-Xko|Ll+dw%`B%)Bk_}_RifqG}OxMYhKj7AOZ&* z002NXHJe+e)wTdOnLJ`<3&Dj&#(NYQ(AZ*P5r{(L5U2La*1Yq1&>gKmj#11Mx@ ztUxrqhSc)JYn9wcB?wkk3k};TF8eD=_(PczROP;LA@)}+vc=h~sriQ>b-L?WXml^T zhc?vXj`JsLl#<8(3x=f-%+_--ENQlaAjk4gIS{)H$16&!%tY?HRpB!GZoHAnKs4a6DF|RdSX3+x_)b9cV>*cu!3xZI6EIYX5t;@f zgkV55@MwBq$AUsYA9`a54w@R;EfjJYF9sPra3;Yi7vVZxZs zRY?OI48vgR4CqW~a)JhjDn0@*goLmJE<#EqkvjaBJxh>XOVzDl!UA4xSq>l~*Shyo z0x$@Mh37ceMTll{R>a^kXCbtg(Et13M9csP*TXw3(kSjGI=m-Vqt+1oP*}gSQvO# zY*9&zA0)-|2D?n?0x+=b#6UAwCJd}~GGZK|s$ti0S+sOM3PJ-xhDQmObigDK03?_O zU_tP43_u?h0hj;`V}V(KLBIeA@eNf%07}4$fMAN3D4~V`iPoddIT_R(!XPAaZe+nw z5LBuHTY?aBr%^kii1LCg6z10RadAs3C4h-wJ}_4`iXpYc1qu{B_^B%mo>YLwDu!C>8;eLlFj> z8ge7h`?BqPH4Bi+Tf2hbOvPIBET*+JMa_1T^;Y#;R{M|t|NsC0|NrY7wk>Lc-OMjo z%m4rX|NsC0`-XD5*<)&FnbB|+3LpRqB#EW6TW{M*OiLybFd3(QWCh8EIVK!P8UoO5 zz`3%8XA~ucSLT#enB^K~gW;V=hDSXCss<@gm=I~D2^zV83oIPCWhCPd0x&Vc!v#<{ z5dqV4KS@(F0vHR5jUWO5P#XIf0C+$O6p#oH4ZIIyIwS}N27*N0Rf8T6F)kC2?4RFcTe6v0&uoW@whA zUp7Ymw20&H6^l+&-*V<|sVs@Ga zhN^xY!=H~i`RgD5|NsC0|Nrm)yZC;;pMU>}0^v!} zg9`{BA^?Fv;7DkMqEG~k2nH)4pi&MO*mjtcKOr0CCv(GloU`wWx}~OYMH^vA_U4w9dg-nL)^sO0^vZsk%^H|y<_Flsfm38 z(RD^=7UoCh$Ck+(B4TQRi8!-IH%!R_V7_cjsYuPt)SA<~*Hp~eb4NW|l2ft8x+_H^ z$B(l#(P%YwxBvg&PwM~w?V4@oO(+R&(x`1-KB_QEuf+KWW*mT!kTj#MpCGZ##OMtE!G{B z!P3}_J5~Ihv0^Q5NsJk42zO;t`&757DJ=5O*WaX~ zrvI=K?f?J(oarswQ%<-vEvFN*`}W%4Vio3OEE>@PCxu6v8pgPJ6vFHUm%pntgy}%i z*dy44frJ2XMa2qErQt=CkVZfx5j{6rz@{dlOw@YigFkPP_T>M zK%gU2y>BWcJc_FyjV*^ELCqk5&@9``9=Z78m4j53)>|pG=|&{>C6(!B>EHSo7EcYib*bXe)p>N~j#Eh;i7Zl{dknb*OLBSTw=7dg zChgzGCss9MDhkytQ{`hmR;haaufv%>`ghxe8kFm*1(Ys^Cf4p<GA;!cMz;>0)5J8u(cG5u> zNb)LP<_vCHHc_jo9h#-9?25hr=_HYK0|lC=|NsC0QU+FOR#Q^RQrqCbmKk~-f}l&N zm1UbDNH)Otsc13;N3_I*ViF+=e6Kr5FsW9>70Jx9l=Nfm!SGfvOm!z>S}d&IlG|T< zwDi0Pdy9!-$rgEQ4inn2H`6j>UMjNnje0k47ytXvWHJB+cWBywVc-a2gL^;hU;z|$ zmu0LO7^&W{YxR*2CDpOxV%oG-%^yn=f8g8KdWrq@x@#YKrtz$K?@Qtyv;WP%`HS<5 zdSh@ctx`>97p-XvQc@mqBiGSjR}}lovJIZv@>%R^fAyI%0t*hy2JYmWcmHz7n6HQ2 zs52K}m7-q-*=ve60~0xDIfGcznvW|Zdz7auc7joso;EErJC3&>gSo9`@Xc)bzFt}= z=wnyYF{ZQBDz`W6<@5VTtcCR@RyEg-6tEg}R-J)kG}=LvR$I#iEjVYAObBwd41(%_ z3>-*Egd-w|$eu#Qj+a(fb$}HBq3FRUlr))?pQ|xRoYH$0iX`MnB6gSxk(!4hx0uq1 z46)J9Jj0q40!dJLWO{ce?MfjSeh?BiMukq^N_KiCMj_dV%{dm+eI;-_TG_bh;ny=f zJ4+6##tpVvu2EX5*{b5RO{;?#N=U7vl`cr+LH!!s-%AilsAmE%bB|m}O5cy&rIs>= z>qIz#ha`P@7-hvpFO<^_ zZQu!=ZUY_$n;Uq$tIclJjOX6%{Z)v;)saPM;Knm3;|_YPpcNcTQzes}#HX-~GO^LD zv?UMiqD!?|wf8*!9RHm@k(nOZ7xt(+!A#l_3vnlgq)}9maS+#5G66_%?FdB_eA2uV zU~p>Y%!$?r$oD$+wpSpWX{4t~j!4SpJHk+!X^UQm?Q zCYFe3CRfO$ZE7?h0d(@vAD3VMul4HhUa$N>ds$jxr@Ss@Y zS+m&W`hpcBA|EIuXh|5LjkFgYu`(bT#iw=U)~D2U|NFpXs{jPkU)gIZ9!hrzI`3hl zxf79tVeFWAsv9vYeWQ-dC@y8BjQ~Pw6dL0Wv-h+90bu548Z_t^p<4$4(yY2r>86=@uy#7a#F%l(?oe~_o1 zt4d}NMwR;bBGjV5EgCT(cFAt$f}sgY00RI>1tu+=NU$l2>BtEY0d&d`)CyQ6q#8yp z&Opkqg!0OnGN_r`QH&i%;8q5#WeLP5AqRTcgqVg+Fv~9?7<_M4 zy*4pyK*XoIXVxQ9QI@nFwYMu==f^fDTMcLO{dH9G*=Evl`e0gBTC&>=)_RP1xrlu2 zR9oZy!>ViV_HU^>d{OaH3p*u)u{br!W&PZh(pDis3=Dw(`>vtXCq+pl6E($YnZ2a=(%T+p9#Rqf4 z&N1~C?{V_izo|zQ$EibFO8oB|O9HliVXa7m1|60@S?PS4PW`qmK ztg4veQ0VI#DE#)ZHCA9oDq=zIn%m3?f`Npgz(f@&j7X5lNbo=)NVs59`ni<`ffxcO zuw($lAYf>uIzZXrwQ)_nVsf0SBI_inOCXL>zvz=O19FL#g4aA8e03EPsH#ZN!H9Tn zt$7LFWgY&@}`_53TnC&0^ry18KHto9zIVn;SF|*+PokJ)hD^N z)y9ivxUGgG#1nZ4(I{+QVzQjnP5!Dz={Z#6{?@0Z|5OrrF4{R8p7yLbkv02ykzKcC zaCjvyA)h?XS=BOcWgmG(K1^qk%YDL!5ZLJQ2y)-#BQGjA+`n!=#W#q80E z{;|>^;YwaU{Vd28LG4;wZJK{r`gSyduc*Zf`J9`-a+f}(MaqdN$0`vXjvh#DtXp|rd++=p{S|i1XS7?l)d~E^yY{Juk@6WOvPxRxEz}4}XnL+d zim(70bXP(ExFL(vvEgI70#Z|S5*Da`mg~r4Lk?U|raPC4JwtGRVY_scDMS0`C?$@s ze&veF5@WCbFPqIsuc?uQ{@%;nyBI9|>t`qMn*>E(`jHboWeXmYaLD3%C8v&H$n7wD zuH}BhIARI?vxOcu$Q>0SFU$L{rTVHRm;nncl3svg3|eq-$O7XYIhzeJ8Q&UU#Gm?0 zDm3HgC*w$!Nwu|L>~fC?k1eFDr!f4)`z+1H-FBk}qpZXm4W61u#G3@Nbc33?^nG_w z;IMhHr>1z5Fa@S38R`jB-fOvS%17jU_KaodeTQqy2>pQ>6ub1|mTX~{3GqnB7ed;f z^0Gh@5wRoRZ6@PR3XC|S)=R@FMGG23<_{E4B0MB857x* zqNGeLRMw?;CN&Y8CI)tG{bpqQ<7Rp@4d5eC$hvr`|D0Le@fjOxy>4MhlB`p8KGJF> zDqDQ7Hs7juy1ivB*C+8Zqd!Og`>;gPfCPY2)$0Zx zs)s9D&0xdBQZ;#7>==5gA1-QjhmGanil^?94FDD+jwg6^fiEt}GOUPFN!jJ3Zz`6i zy0a?$D3{R^+SO498sydX1a4yON+hVp4AYuHnB5lnPFiE&r^paj;R{rti3I?b+QL+* ztGsL=$w>pIgsJLYAj7WeURMSDHolutH#0sXF%c4=KQn=p7RX|&$V4l;^^a;6Ll4^t znsS_Ta=m)51=+?cz0OXzz)}Z9ng!eY^aMhkQK?;1r%Yr2)wy%9uGVOii=hjC!T3KYjv3*f{-LQJ|T zxXP?%Y;>FLvGOuzERt!KR4QLQqQhsVOAm^0_w+h{>Vq`Y{>5R7!IJwfB8plO$}G$a zkP8;s9KD-^gcuZ{M8TjMWh+3iI1}uNi{PME^MJ^uOGTS%@zVBX314m#?@fHuB10=+ zxJqZTd1Z1mYw8g`#*vYmNp1O-?eNRL>nd9qwp__mB=oWxBKKm=01ezZIYdX8zp%)s(@^{!6R~a(j)hHhaJWp`@Wtur9+Eb@&dV&ZMh(uSo8RxOC2 zi5R2GNh?7IJeozN6M1yjGG4YHuj^-e*4V$(m?x(vrJQHD-FrzbOLM&=GdD+>S>caz&Czgv>ZC{TsLlnp!{T(JR4uD5kBN@Gkp3#}Lt zkUS|$(CnlgBd%K#W!mfoy5xbB0RS8_2XpwvpP z&+qoPl~pp?8Vq@1Q^!Fl76>zu0aRI5fG9lG*65n2P)@rcVq}07ULrbeR8x`X90}5W zUv9?<1Qs&lHL`r?T&-qDAiRUD9bNBC9^DD0B&r`!3Z-Bo){gZ8K*3 zsWp<`4HR-iA~S+PLX!MKh>+}{l@SR;qmCq5Q2+|!0ucimWiv}msb}nA07e;dHF)+EhxOKmdr9M)P+aJ~s>(Gn#WmO1$o-RmzDR25DqWC19`(LXwDrBmy&IcG}zI0w<)BCy4q; zhe{LpTbCpN_EkfUzBBa-tOpk+7heYc`Dk`m-lNz$pW7kzZW^;Rys_Lfp z`5BTit;meQfRxGMWvKuqEva`=Z8}z)>?D9NxFq-ASfG{4SjV)GL?k?zX)TWSG6jsf zfuMj^djO+LQ09n(L9SPQL;(kc77f_MDSJ5XiVzBjlsHoa6v`G_P;#5KQ@uuI4(A+a zmD*p9L|LTsY?2Z*c24XaP*&+?skp=~f+jTyBxrU!#bAS81?`olr3s~47*5o)qObM{ zljz#E-2HXNl_Fb&pbsNv2hOuF=&g=@tE#Sa^7LJPIcO(I0DYQV%;aPh}}av;jLI8ycQ;qUw0i9i3j z`{gPD5rXlG^tNvS91a73QnA9>DTqv^tc)lK2xxaDycrr!&w$0cF@|txjRBMi23u$p zDYq@`rq>BWZMc#%lU3;&4BZ+j3#XYTkDe2wC8l11VJQ*@1x=@trfFQ3WH@Ciu%r#8 zFmp)K*m%9b){^B7vTnCj#s%i+p%+qH;=LyNHY^%4G=N88hQwXM%w92NI=JPn=zUu3 zZgim0kx8@|O=bBU0TCkw+hm>TJN`QPBc#l-oxo)A&G2N3(uQP+{a{wd14Oxsnb-<> zhrYWP?NPFC@Vv5f;t`{eyG?WMnqbzwP1M%((T|Ql(_+hIFvbfwR5)b2sd#2AhR~3; zI@wTpxral+Dag~$8=*#P03eHM4Q1DFG7p$@Mf5UO7H?Dl){UnYYf2bnYBDwY-OQ$n z(c3R74ZXFrta2A+i%?3k^ktV{NEX^5Dp&_`$AX9$ArlA%X<<}`Y%*wNkfay{X;NsX zUhueUFHhS&sciG+n)P*a%zC`O- zs2a~df3j)R-PhBzW5BOw0DuNsKt$|!(;_4E@{GB?jY*wl2&01%5NOL{o&XI0`>^scfQCj5teXB&*j`Bxi~yBQy# z?bN|_DT}VJ`jdBM%Sl9~u^ojYRnAvNW>exQ^j0jzSDv2!ss7U{PlQv44D$T-gm>Pt zt**vwNjMFy9i3Zido=<8%Vn7@vflq4jDbf*<|u527))LrGYu#T$TS8@-7lfUxpsMN zcpzOJ%-bb8s%1MRjM{@$j-9=MsUB%l+l4VfO@v*Aq<5lZ;1{1%xjBtqEcu5JSF*Z3 zamBaIvyNSTK?*TV z+d@qeOF`Emt<5b5dbk!+Vp4$?aij*OB$B%trFEwwqMojCPpe{Ln^;v>2(raD_N|hcPWw!D?N;@WYUdwwqF!6_Z0{fNeF5XBudg( zVxq0Zj$KlP+*xx>H3ebKVc8OZPy&OR#dI!~F7~4EQ1+s;J({rkiI z?_Zy*dhhljzCAzm-)Xwsx1V=(-QVUPj#sh3qDml%u_GdaCRh^5W&Ttm1dgqmsbh+_ zkcnRzM4u0DIZRx3TO^`Fu(1j?JAl_?C95WD(pQNCaElfg3epppC)1Cl`?vdPZ_JJS zzCtjbl;p6FCL;cK$iG47X|~a(Ur71cPoensH+PGYs4tB$?A#wa?*6!E|5f#efDz2u zO}9xeKv6UcWDA&uFzEG`6nLnpEp!ZA#7b+KHw6HsVs6oKhZxPFcau_W7ia0Atm#wn zPevJA>l34NB-^dq(TOAfCThl)oUp>8h5H%pJ4-|Q*nP)tQdOfn~bXcjIu;OMB<12bL}0oMh}KVf&^G1 zc?BCbMWR6V)H&h>8sB4-=DiR>Y+-9{npVI4$-b%pBUmy+XKuR9-2l%asCR@_7I5_t zXfNXo0bPlKZr}b2G>13t0;LfIgbyUorT%P1HQ;DwIX=OP2>M2;=it}!!%Lft=TFD# zLyvR5nv#;uq!ZBnPf?62)V;GMB=W%hmvu;9YMW>s&~p`9DwWw`&*!nix7hQ_aq(Ec zJK)gCcMT)U$U$f0y*=}at`%FE<$^w z5}%n6hs|2&`ekAEnx=FJbg)$_E|^iRfS)nPWP4YPhHx2++*H@Chra% zDJ?&3uHC;OtRT?i6To?KqtpDb3m*XzjmS;r@)$b^bkL%` zelsYZHJ4)b^TJTp&bUi7D6ut^^KcjzA;>`wL<&viwAoEr%8?l|k!n{T zYrmZ)(Ah}X8IaAHF(y>$$4yPR!dcOURBFLY`+K^Itx;~1%KTuG%mf&B;{kKVXo9Y^{kDa9qL$%; zcDQ~5QxU0d`HMQyn^6Q=gCa(1I5TH;HPALh;~JmvR4)zRIx`1TniuW38IcQbQ^k5e`$9W475j zC?>gp=z!Ih1X2bX#hy}SLxGG0CV(QcqOoGY;29GrC@PF0$u{gqv1<4=xeO)fj(cHN zsu*$}mg6wzwp#;+19F_nN;LxK+^)N$sFwj#-BY*b@hyi+qQeH+<>$Z-6U2)lQD z+vN=4f}t-Hus85}7r&oVxdS>I-d*y|?BS-gcg2^b?7d=d!oPykhdVkKfZE&owW z;u4u@lnW0r#W43%!ZKTRU20lbn8+giA6R-W)z&3pS7~pS4o*J=LDwHA^C%8kxqJbq zHnL^^`=Dg^fCTerQ|l=m+I4LDZ((DF6B(0Jte|-*;V5bSkdEaxy#RqM4-!I9Qb9pX z$#az47h4NZX3S${#cch zk4_x$aO1><2Ugb%8fshuLRu~Cq2^E0^x13`-}K39bo4BuE~+o3cedR0+Ml5!)dFG) zi|7z05FdTM*gZwbM+JivS{PQDDqf21nabglAlLi#%9PZ_W2BW=h}u-VW;S>@^e+?A zn(vtzt>CL81kJ{ByTjwoW=>&SYAOHlAm9(x{XPz&f}px+02ytb4N-S%xBFbFVwfCh z9YO+_LdIkWu<;ZzWZyzMaM7iJ+~~3Z1}X$_ea`%igP z&HJrQsG6A?8EGn+ZeM0z=#b2~+Zwk48Wazf9E+0yT(*@uVA3TfH(4u}AtwuxrtQ;S zhvJnQ`g{Ury-egz;?E$ei;Gl1Yf=c*I%pzUw3vO>fk}q&y=;w#wU`;ekW$NI$!9i3 z)_`&lkya#7z)&bHXNNUEP`BefIZe^aa^)@lB->2-pR)q9+grou`fh`a5n zY5?R8bzMY^;G6j}>Q#j^s}o^bZ&w?$0O4{2PdJBYZ|(J2+k46&?Pg_q67Ee<_ocCy zdQ-~q%j<6v@D3kD#X}1g10EVFxeCiBA`c+FJ06(n3s|idi$gJRnM~M+1~8*copUA& zl9+m7IaH3Q^wHk+fC8X|MFs{qfYwGJ8!TsK+efETifv)XS0j0!#fTsyV17Eo+aQ3B z1jh5P8)|kET#Viit0=D{frA%JQ2?OmuS5YsK&<^BVUG;){uh5#jL6ZonMl`>AtMvC zL?SoW!4|G9_lQO2yk3}>M?VQDVJ+)YIX#l@ z*uViyLL!9&975T(0YjR@ge+u9hX1&2J#xt8{h)v-EJoM7FzifRJ(kPD;#nTr`(*X- zHow)W5F6e}LO~sizkFxRDe@mb<=jQ-0GpGuR?2u7D-%0zfVhC{{mLeH4^)rS-SOa9L zl5A1niB}QH8&c#D6gdo`j#RjkFEOOUXn~>Ybj=hv6&z-D@?>>r4Yec>@LUICwI^5{ zmtERr9ZSmxwSxhYq9q`GIklTOLSf=u!m6$P6#MU;h4iV{Y(xL+>tz3Vj5qpW6!EzR zoD$SW=2Nq4n=Pd5LcE{urq%u_pSjd9%!o9ClG`V7%*6+RPTi2@jUD(ys;*wGb&a&C zRcz5|tio9T`>;gp00f9jR%;0z%86?F&0&M5Q#nOl>@e7Baj|Okh8DGIVyd&*a>67_ z=cz3ec5ZlbMrv}ZUgnRN4oX;~4C@j8)~q>5V8zaPDEeA=Og76}edc0Q%pO{cUx|13 zmRcLJ3bKNx3Dnbq(UM=jQ?5ZILR&jDaW07UPc6T*sESZVBISg`#}6A7yE#n7Gcd5S zp~i@42MzBEA<0^<8$8b5!wf_c2^NH6A{clZ^C6yORA#CM27>&4DHa?!?p!t@5}6bs za%Ahd!=Z#psd2Aqdf1OUap~tx#P!iPKRZnym)XZE&l|T%O>$oiKdr_OnXPVZySs-uXY<$Pp78u>Ij`^G-dF8@_a5)LYd^i8@0jJU{aNSR$2_%rk5oXFq|wnA zmUkYelF{#Q0haLiN5Ly=CDLmlgMQ&@Xl{5IUT`b4^V#(%wix(Ac26A zpA(5di;(d>hER|hG#Mf&R!!GiCW0$P6p|_zted@&LR>+RxjbT#Ekwwu#wMs0-lmx; z+|}q-bu??bO=Y0d23xMQ)SK4Gw9wQ^>}vK%Br4G{^4eIjKYM^NkT7CF7?8^6mauZz z!6Sniz)TVn)Wa@wh4rbSFV*m=2i2Bd0Pys7;BTHG$00Vt5EO#}OfZ?e_uz_H7 z7tzvX&4J-@UXV0)pc?3J@R=1^d;;_xDa zUS=v^A!{^Q%-4wf{Q+kecI;Bd;2Vqe%2yJH4zu>E@IPG_^4&Lcj7EDoO!3oky2|8E z+V1+yP5yNpjX#dW9_~R+VqZ;aAFX~>b91#K^D;u*< zmHJPZq`n0Qfxw_b0&3Z;F1wP(C<%i$1c)OxJSf2l4OU|gfl>punB_&_GbjwZA^9c{ z`HeR88918snlKxS0t0JEev>PNWbmL3{9(Gzi3YAR){5!q>{A&G6cCoqo zqp@BmPa=&>et+KnzwxH6T3s`ggALb*@a?E3f@%TItnWYf|NZ~`Fv9mS=l}j0UB=~` zoA2Yg_V=s9v`h_=L$>42FI-NOq0B6JL27J@1yHf>vWoaM@)`1JcBT~g*l zGVMTXb)_H~qc!CEYzQog&2DX|xlB1sooBhMzON(QNX8yy#$C=dR&m0T#$XqAGeGZQ zOTX2=Ro!iOlhQ6*L!&%NF2HuZO3NllepDXkR=iGPVpRed3_1&X;=Bnnxs zpLb*%m*5x+^0--`HA{N@WUdWCk4Ky|?^`IPym1Kn|;2c1wXH(B_002NC>u>D50TXGHY3wl5DMO0v{g;W{;y50s zOEfY&Qn~}=BGD$#bR@R}B2{>72r(mx9C}91Q|u)F9tim(H_BdSTkN)*RXEw{-7kh^ zB=_<58-LF%^_{*|+vjI1G})9C=bt=`4y-k!nhaVfYF4vUzg!vstz7X2{<&?l_K~RW zC49YEfn{eBq5~6ndMW!58NxG&A6*TjHh+^=L&bLp!VUr1jrb3tO43ud{f%8NqwYBgR3x%sg5)Mu3=cl= z0D!Y(#dQmMqedJZCHE5uY6Xpu3K|;)G*~Kt9~l%ADCwcI%sOhYx35(X>Qj7Lb23sY zv}Or#sbtYcacQPwaJ%}OiCSuJgXQJp@_YQAhy(=`nu!d}78pEJkYno{<;heuonv@h z-}m+>$;6u2HXA#QZQHhO+g4+vvCYOd+E@)5Hc68_^Zi}_=e(PDbDh1{Is4q}UZ0yC z)B9{;hIm#7ki3B(%cff489Y1Rr^4n=uf>*Ytf=I;a*pgNuGxIIB%pqKL|umbi1(T_ z(#YLtE2%Wg=7++bW8Y7MPen@u6ZrG<`$gey!p+KLPW9gJo}Tl-z^bbaUr85F_18IM zgqShfm7GK)P@_20 zT20Pu^9IL^fU1^rVj7h6=JeTIYtl~Juer4L-mmbQ?_PY=u~zye^~3CVAJ#mkFHxB@QSZLbG5Sbd%PF)$F)MLa%8P%1o*w`b0Ls&8x zm4|F)Jl?pV0?`$Q-w;~GWMYs=+XU0mbzT4MqFX$(V1*J~zZR&bmdtu@iYOe4cn~ce zZYz!FtWQif8>lf{(T1EApS!9Md387t=`?lFvN8{;r?o?%*MjTZp_H!i{2PvIn9@L5^+;Dv~57Ptu}^J$IETa z+VRmLQ4Svh+mL&f?_aIUGyJZ11qTW>Lg3E!f?by9iJG3@&ez^RO)kGaOW2!dKd;96E|Zvu!SNf z8d7Er4iT{ilAURflWGDDGr@s*MV?19r=z|&nJw3kDOdfK_wVA58~uF|kZZ~y+%M=h4KL8pCyEx?h5Nok5g*f5pMIj@f5vP%{)Lu{~fDAUpYk8+%iNdvzZ(v+-m z#NOPczO6A>>eaOdZo5@Wh#YG)UT=pmR{06*+f`jvQ{^{$oPaE< z($sXnz}XAd9n@SJRHdrO2RpUWMWbNGE)wHIc29?FEJCtB# zTgk<1A*oPuEYyejpZ}dqlg7OrMQ=49&0k`iIG5Yu&NT7S|EzB-<20A0%&$e?Hk~Sr zKQoP=jIZnUh_Jd??Y=z>b&XC`Cv??~j3HJQ-YUAZh_(zisZuJl#McMR;Fd?^uFKt2 z_-dEaX{R+}ySbj;iJ$Ryr)IEl_eBraVh?M!@Sj&(r_(E>d}QZn{@KpOz*gmVoNM>V z$l0-u3#%MH(mS_ZF$l>hi!O#iHqPI`Gzkkq4@I+*>hr@hnMJnFd2Xv$P4Bkj8YCMZ zk!e5fLn%5ozO_teRp-MFk>Y_YHm31U$7g4Vq=96|TEq`JmTNmSY2C6zElWt$#l!sN zPnyzgFTT)BnHJ+mWV6dtwY0@i*4WB&7SVNlB7fvl&%Do{UCU%dASL5tq{xu<<=*`C zOMm*qs)cRdq~86Cn&*11q>GGD=9p9~ibCQ?=TUNw)V&=8?%w8AztV=;xiA1; zO~m|n_vF43z4sJJp!_?<>vZ7(rXW}QA4J(XeWR<0$#>cyf@8sCmqX!D`-jkbzEB*B zY@ye7HF_n=f6qDO%-bf??`wAdlScr+Ib$t5YGPSO%GjS4RK*w(g-4AF9hJVT0L*VFA$`-xer}<882UiECrPuxtR*nx9h!I3704} z!sY5Yc7+e2n`Knb>D#ov&MvF3Dt*y06%#C6%v^uzVn3<{({yc=qu5$gqU>j5ZM4CC zevxrHydI=n(3F*ry+7!W?wt$!>Z`ET&oq?XwgIaW&KHH&3<}x=+BjjqZz*~s6M)TG zK%K+M&4|A5pZhbm0g?7YObxN*0zj%P0-P37JO-AJYmKmaaB|p^>p7WKu44W4r=4J4 zq_wv-^aZ(L_xAY+GA|rIGMvROCcKHYy~UZv5A}lox_`p6Sg?oa(T5f!ndp zXGsU?{!RNP_d!|geMsr7ZdKAzF{El4tn4^9sJayLbi$sS%45sq3N}`XW}N*yU?uW3 zc2vGqf(uLR8F(CrOyPGVe^VJ3jpw`<-^f2Ix2cljJA=^!L|I3%L0 z+`YZRKLtXjj=%|{t-k1VhBi1wM6BseZfetkm(B(kyiYKrUE>wyH7IvE6({F;>d&06 z+x~BH9k)2zy#T@v`9ylUfd2n>!YKea{~rU3xLf0pZ&wJ?3Z2tIM?Txjrnc_C24T8G z&y}BCC92K27FFi)=`0=9WKtrZqP)NoEA0suU<->2mU=!wmjCH=7B=#6)y-Id;aZA)MIv3II!gnuc*gQqieB#+f zACvw~9)`2P*|K6RibsV<&M;vs25Es3IhPu`n2A3{-Kk_MsFLU^LxC$xNfwYC!NMy2 zu0MkPuV^hLjqVk*Lh&y20G5*5y9n=E2VV2st49JGs0+0#KKTO#B{~liD_=0{e8Uux zmbmo9g5CFdMQQ8#4T>io^B(2=i>os8p=mCh*Q}U2KZrJP1y4p5(Tn2Q z^sVv)bE_KZm6Tk#a=K8G&{c$}>d(U(lz1Fb`?v+ajfaM}-{Jhpk(n%S;Yv=HMry^D zS7CPZz}94Y|2k(<2JyVO%GuwrYafQ7etz4hhK{HL=79Uia4Ti5H5?d#5C_1(HDJUw zoZOe+Gu19Cgx$D(xeCdu8kREBubq)cK!(ysg{N}b>*CE5C&5SMAc3RKv^qe#>pMgg z{&O>P7;5QddFBaj#24~E!vF1r!w_JO$(kJ_!G$WM>?}K~8hQXYq&C~9S_$ET_8&d4 zQU5NRRsv8?Plg3v@U$>kyz|g9Na;EW@ojQ+mEv}E-pEXY44JL%uVN%fU=a9sxBZJtt{=POOZJD^M}E23uRa^{>`xB|i-!(@?wo-eZ2+1<^kDt=d%>3c zh3T6WLstV9%#&-a0FA^~Kc{7%k2cqvpCvDbK~!G!%yK72xnx#HG>*iOBG9fZpp$lB zgRK0#Cs%Ey)Q?1bKAvv%LK=b5D>adQ=Ot(>AZ2y!l~y%C!h&3Xd$)@<Z$a#2l$a z85EKFC~@!`C3+MjxLz2%YnAgHOhjwLPMJd`PgoWHLF}EU)Ztn=HH9!C_M(N_vR|%o z#4VcerY96|@-)LgK$Ezfr`BKcRsUVzjHGQvx;K**J(Y7xEpU3(8fajW-Mx9$pmK-E}9n8L4kw<<}QASIHIEMs; zS{yE$Wsqgll{|o6SUMU2?EP;i+ya2w3YvC|>{}*3Ui*wGy3om#z=TA%YUghk?hgp^ z?K6DA@%L0>;wsh)_NzzBz&aJ>=|L117Ccc1{DV%lxSLU%#d3?Ln&#hUHg{>#m!pjP zyz*C1UvMKUIaTQ*sPfr%v++oXxbAYw`m=UmL;iZucDvoHO!7+F(pO0#%Xl`^)5;`i z;BzTU02acH2oOO0ApHv~aFiFc5#1)GGHLwDvpYuW(hZJ z(%saFQBTzFGs`u}*JKh00rA{fCm*$=OB?36%|cTJsepQ~fWM7rV`+945ySylPTEr+ zKh?VCOKWP*lDvGWYv0!oFn!Xd1O()jCAT7AlT0L*ds{~ep9#_W6p_rK00O3kn6$%H z!znV`PQ9WdlM@?~N8dRhU`cUH>5gcrqj_A65!vL|Cg zQxZ6&`BYdQ;WWAwf@%W(;t!c|l82sh+R@@BOrgwOPIxVGs+0;(-XQhJKC4NEy+_)?U2 ztU!FqCaNS3VAtX2k7F#!qeb+96ZFb8xjSHQMWx`+Wn(G(dP2UJwR$KX<7g$KKy~ue(W^@dx z0A|Dixeh{&4>9<>nWd?VD=F_V+JEO7?O|22a%E=O*X*r4rQY=3f(-GHbtA8PjNUZA zeAct2g*7xYmr`qnz%^;dOgHS*(Dip(mV2S2n5XIjxfMjwzl~5@0kXAs$eZo>owmR2 z-Lh z`Pu4xgoM$lNU{u6n6#5xuUNU#jmxKt%lD=jBR;;Gx4-#zd=)S=SkO?-5?V-2y+;Wr+ zh7f@OytS>b2qv9<7Xz4SdV4h$(YuNK9f%E^ubMpDMn@t&EZz(G!Qv9bMU^9SAGWJ- z)t`$Q$y%1r_D5pEk)GjqTatyX-l|yn5JickUVWc;CJ}5Mv-b!vgsKr!^c71k2726t zZXe%ZL2j34>D2If^Q5?uhAW%^6FF2&rqQ8m2c0FPI2vIY=dN7Kx&W!n1kr&u&crG| z|6E{g!$4yaxrb{@c$8~f%1M`2W4r-t-NyVFwYt_+9usd$9X1E{m2{DQ=&Sn}iSEjm zyKDItR%Sdmwzy$$9VAgKK7dlj0ti5!KX6Bp{Kq;(b#XwHP1>`$x1i(V;K$v7$KL!f z6Y!2`+sO6u{pYf8jCgttq3i#!wqTfPx2`4_aJ(fCMc+paX@P+prYB$KcFq%HvojH6 zj>cL4h1K4A5Imt<@6f58UG=LsFH8bi_YXoQCq$^dbokZU9v|*hWoJcps00!{HZT|) z#$YUxv4)E;#VJSy5?dIW|Ivr3U|41y6ybC@gG#&sd;CdLq^ zpMrEU)>n8n*GRUbC9v95f(j9*i83Be&OfBY*24k?5@m+BP%7`o# zfObGzg_}WRrDNgTC{7nh#8nRlu&_aRy#=KLvJmeY?$Bdu%aON1v7rjb!~se_ynOjo zDbq12$5M17G!HmmEnNao{l7EuiQ~y~#$~&qxktXS-*m!6|0qe{zUr`f?>l9Fq(D5Xpva!+Z$)5*6gi-vE+_8V2eS2!omkB7Dt&uK5PP>F>} z{_a4YFPJ$hSK=UD4aNV5o?aCvIn$iHHQPoE&D6Cv-F+rYS2=Wg)LD4#@jJVoeC|~N zPf#@zjcIJx$7S?i#siP92-mcKm&}@e002nRP#(`t^pl9amApa;iT`Xys}dqWc%rcYqM5xt8JoO7$23OaUi((h+Wm6>s%H(-5K4xq(sFZoh8e=^rv; z(&5rwlo$lQ_IsiVH#nR;M^x?vcrr$)a``a}(mr{<3eR7p93x{@_tEk|28kvOp$z5iQkh*F6b&mjRGK?HFeJHU>7yUNAK8V1*kTnjv-CT65n|U@z9X(q{?yxV zRUSZi)Y7xFe)SJ6s`Fo3SJKfhy)7`n9y?197mv@1h_g*~gy%Jj*&5FilsH##alUN3 zrWE|}%;j#K=nEi#=T;sUt2Frf?I}&5!dLQ3PUix^M40)f!_$Hrniq*nT(6S8Q=%w@YU;oZ`CCLaNBB4jgdoF3bNaaN=yrbHBPUN75i*1%JvMi zPW{U(2mipQjdYv@ z20uA6xxan3I3bnEHq>wta++5h9F zCaRqe>RJ9fKj-c3-DQKH6{=38CoxDTxg^5Sw_P7vF4=7?5)YB}gEGQAE>jy9Lt%Na zcGr73iReY{dBRr4ss@WjTq4G^Gg5(18+Kt%k@;-(WV(NI=Vf?Gxm!qM*s2g+Yy_7AX%3#{p|Rmg*31laW?bTH-XPf< zeC^j0Wk}$V7PhM4lDMpVIo$N`_UUH0Lkz*EHK z@hvVPROmb>9Pye;rm8qJWeC5(CyY9Z+Dy#i$n6dLr9*6v2*QXgiuKtV1w4+UbA`)T zN;4hN5$o(;L;6Zk^%EKs8~NX}m6)-#E`})8HVcRS3`tHjf_$uY-%oSXKr9;OnW+i= zAvQJmUnNjQxWT{`07j3T-{Th!ZWgNY4f24QEeejqVaWTLFVAP67;rl_=Nu7DTAKB7 zX5eWRr>0ik+Ki5mhEGxLcD_;&KRTqs6!_TVv7-*j@$EO3k4UU3mguA~A5Sq}00|Xo zyu64-r-NuO$E^siu%-$Gx_KufC4~d|P-`ZcA^TDsYB}{jRhfee_#H7@ai|z;S1F*N zeZcUVAaJQzONQE*swsN-@b1s4N#Rz38-|gEAv@{tT`m=FRs}08oGh=qVRCcu8Qo({8aRjHhT$&iKiP8x?v|zBB!>_6t!% zm6KQ8j&Y#~7FY;@M0y-l*(w1ejiiGXYg7+QFL#^Zn>$P>+$wqNj zHrJC%hoCC`P=KiBCqs8L>vRuQqOZ4J4^Dk{_3X?z%e-p5dP#ud%et4-ZgBd0QJ-gQ z@0Pc#Q}tu{L>3dlG3tPmY%}2$1ONaBAOm171r1AtI1|Mp{C7H|V|%=HoMX|Cb(HgT z-iE{E(I*jNMm>OK{A_7Ch5!srC@Y)@y?H(GzoVN{lj@VEnP)r0MpBN{KyXvU0I#1N zhvbk6AwnKu*m~quRlp5Ga13EEu-8%(41u+ktn;;{D)CUQ*8;a|7OUB#Yz6G=#kJjl zWu0F}beX#6qkA1x=vkE4Ot3V%IyI&UrEc_3+^eT49e4f|gz_JsGO+M&y^X{kDCl7( z_-m;cjrLqNk0qg#Bt+M#hprqSZY$e(ua0)M(jRzjWOlY!w$Y6L0?%>3pO79rynPSD zhtaFqq^4QB@8W!{AD*p63?!l}^u|en&_8b^mx!Xqv}3GlG+m+x0Km~TT@;1S8MXKm z&7Bjjc=%AHvCw={V;bmU=+{2%J#uX@mF`j(wmC0*F5?|uymRtv^E~&JGfo|534CMf z{x4yR+zxga^uwFb@9m&8Vh(Q+MgKf48VTXxU=}tcdRUEni@McUD`KEslQs^%ybZz+ z$T0fhTRL+DCBWDui@$NQt}zdSsWz@j5xI#np*S>@_%aZf3_(!@fCKR<{}CfziCy`7 zr}{!i*+&dx93353%mk3p)Mp8{_vr>hv8nWdJ%C`}ZNdhnFIrCi89yDTBScpD49oBP zM=3N+8B?;kwJhH2`pcc!9*6<22iGkxotF%yp@vqXY@ec46bhx=`1T6|kMh+P$zw9= zrYNo@UzV>}Z5imx8s7$-*tLC*-B&HJh;>fK`m$sU^=|)l;MF$AHs<`DHu0=E4R2RJ zVv&V2qdC#=xcr3j)T7oqBO6LwuWZ z!X2X|Vy>3M5AX3TMVmr=Y>biH@&A5Wv+~^KJATT%KTWttI6q(?^!fR)ObP&_qyWKi z%v=xR?W!`VS;ipYp>zjmq>!*d$?{YLU^d=jbs}N$=5SUze>Qq`CMxbese~k}_*$+9 z_ULUqJuQGs*9Bk(grMyjq+P4Y8qXCwp|#~vqWi&8VS`F*;GI}ES-d9yG}L&YR{@lD zh!Vbp&jcZHv~Buzp|nfGIJ$}+4zRoL-*hT6307|)0HHj3$k?8{ZZ#r!p{!Bu?YK*718i_iDHpwB|?dbj`Y>UjQnBJ^T+ zH~)XXj|(H&^RAtDdx5I}mS1JzSeg8KF^$p0VuaCLsUhVpHmIb$93Ut%DmI`S6frp^ zd$X}=(HdSR91sEt9j|lfdwLWC+b?UAp^!)>>x8=`hEP&$ybaDtm;F^F^a4LiX?`m0 z*^LhR;YbKr*|Y#Ny5`}5^WfyEt-j>8&_?LcFu-!{QW1QKJcaE7*?M!rtHn+CMqH<} z+|glvNf*5#Jd!iansO-m@fWGZ0U4?ZX$S`%;^+5kXLNV%MpMaPI3(q8oOnlCc}fA3 z*k753L`ie~<+Dtiz-U8cev%cN)`IV zFjOO?nBMdOWeb3I=sta1-N-TuAWbr7Csukh9hqaxfgdGaL77*L?VAJ@|1`~#sRU_2 zz4}yd!?mZSHPe2S(5H{nbK(Ep%&oUETn)I-OgxrFph+|xIXb1dHKU65u-GBF6Ky>1 zA4t`+XmwhPMKZ=7vE~`Ids58tZ=rxn>9sfwyy9d;LYVnv3^YXo83^@#n=o^wQ1rBs zno{HbL%2Ach_Xzc)->Hq)m>`VB{8qEu1TWQW~Cg&G)>vgr}PBteS=b8y~Ae& z0jE1IJzLv5zq`W_R`NRvDZZCe2L9`>pXqwsn#y3S!WwcYcK10JbmCL$3s<90kxQ?2 zpu*t8-#NB)#)40le(lPq3JLVPUy3JGZp;7LgSmG^Bw;^FcS2B|@G&IOC6` zXTCO;Ywr6DFdF#jq;>W5th-g3!~#Mr(3Xs&UOB0Tu+SLz43bnjmj%EPRsk|MqwuoH zSs2OCLP8>mA&bO@tJE1G!=al3@Q>shfng6WEYf_l_R3e|Y`k;`NSlgSla#mTCbnA2 z?`>AzHWu=NL1Qb46EupoH5sk_i?trP>d#y8S8Guoamb&sEJq^Mgt^`H|{$)K4k$(S{IU0t@_Ga~Nm)owIC z|5@==eiFNXQ7HUmS)8#ps-4KgBp{DAw`-lb=9Me(ij zD(KNUDXDDm2n%@;%xz5cz5W^nl>K!40mWelRX-*}nl>Mh)UKra{3Lc@9pL=MU+GK{ z(T`QdNzUws-Pe@LofGO*3-Nsr{<<{iZ0*S~K(EwDGa@3fly-KAwOceWf$R8>f!#&U zOZ)xDfA*2}VCWYk4LN)N0~s?0C6fay?Abhx`0_^)AR=SyV{tlb{XxL`GR~SqP}lEd zIzJV(Am!5Bjnn|`tA)}XTwlmb&ERxekmr%`9v)g$am3Kd!+8CIo$noLzQV@$+|tzt z_RFiMPnR`b@}!R^t8Ss?;*~NFh2DsPuP}pvvlE`X!-(!m3aCJVY=qG`{1gg0;}q?p z5M+V=J47Gu*qlbV9QCHdGB+JY8WBu+Kv9W3wGDc!30`XU5*y~m%xzzO`4_$;xIs!u zl@_`$uC-ZWpGh-RnWBoJqNR`aS+;q5JFX|8JT)Od7UmedMHxhK zMTq1e`7lF<$`)CX4}X_a|6+MJ#}J790=u?VoQqKJI&*3XV^`=@BD+d-buhB@Z#Ci9 z=11d8WVWl{Wq@P+N|fIENg+`+7JU8NtllLF@4#M*zNHs!cVEukaF0*lI5p|Hy2{!; zR|+cWhIVl{sr((uFyvq>iM)avzYz(^N6*=!YR$BUV@p|UDe2cFRc3@5;`*lN-hkL77iU4qJo&efaf2{QL#={FF}GWOEr=`^-~(b zU|iko6dcK(4CW|9Bb#nq!rR{oiPjRC9B5(YWSG_UVVpxF{O0(_c*J8ovhkfnBz|M< z*9Rqo#LwIW^b@0eQNKDFyC4LZCZ}9G#XS-KL)}x&*9N+v&uO#7jf!a~GnLmUZc!J; ziQ?lgh$nwc4jjaTu<@@lF`;L$ro#0RPyqUW+DW&a&{qZieJ&+hR^pERRIueOd2CoE z)B9DK!TWouohe=d4yf3A;()bODS%6*+DvscgpOF6ys+Rtpy!6E|V5q zMGrHq5*B4Eq?brvnUs_plj!(Cu9;h6QR9F+(r;@cZ4AVq^Fp#IIrxpmc!XE5K% z3H=?PG;k{Xe?u>u!O(e@YH3Om&f?^9s6vR`m=L9Ubxj!i$nmxRW(bcw%`KAg8&|%D z=}5NMJ0|UgkJoI!0%f@N;|Io)0_TZd>kK4=UhA2HNAqccPl<*mD`rdN#;}Vekh5&_ z=*sA9{+zeU2#y_T7ls$#W#^~37Mr2p*`?(e638e?Qc~yG7A{&$^>;Gxb%`70>FhUB z;Nb!>PN|=eSej0p&^W&}pDWL4ZDsy_o4TIVlr z)|*o~WxKZ;dJ@PEzI1| zTXSV&hBh-)fbbZ-;Xo4;(W;cOA2aP!?;R2xpw*&8ufG>~NcdFzX%mXt>l-mj_A$mB zaXS^_Z#k~1c7GmQB=-uLBA)(fpId!Ql>;T$q-e-x$>u z9fkC+4!QvwIV~Zs6-n;h%h2qXc?`>B3=$-n!E?U|DIre!v}BCt?j~R|4jfBUuBA9FhqneqaF~bA zB_k+}&1PAr+fPD3*i*5#5B6sGT-hbIU<6eZ)!v$wq{zuLrsChWBWe=#gc7b@o9Ca= z!4XYoK2%7w^2ayfGKoF$$6q0Hkp zW*b|u>H4Z^v=VXc$SFy(rkD7_0q*<#HY8GITN{S#cW0|y;U@(3@vii;82;K*5jWoy zw_lYkezk1H5~{lW7@%NheWXvcNEbh!AV0f3NDhBZLT00cmM>vxy78njg_D#)w3bLd zileE&4F-e*@?+)^lp(Nsk|0QPZn9{Fjx5Kg`y_R_wlI*^ty$s!{7HBqG<*TTKk7bL zfrUpal83vkFD+`V6ZI#Q@W?pR4UGW(W<`px)e^hkmV*ZY3&ErjzZKZlS;szhaSkFz z@u#V#aEai4hgBZiev7d>UqJ^FOp*U)5|uZ?`z}BvJKC@}--IyQVW!Zq^s^=;UXU`1 zG?cm8blH5fvBB7Aa)me(-Bs&Xotj(l^2C?R{YsDV2kyC3-njqwA+{JfCLjdOZkdr(fU^meN|bjy@5fs=`7db z?o42x%cH^KvMTL41eQ7@!@o;*4JnztxV%neGP=kzic1oOjz2NkXn=k z2qwxhXG@p>=*Q;pKPuSam;&bu9~Bi~R+n712>6f%R3gYrys=bn8} zxn~siP_F#cJfA+-o@ZIRE!W>>Q0q@Ne~!ELy)J8ix&YxI0f68*;>1_8WIV?YMEWC> zyqnCvr^J8sq@iVg?GqzVw031~WbT>~D6EUWQF_@N;=5Fkk2!-%AA)W_jp7`y!7~t) z9QgPM2`%RbSNHyobK1o~dX%#emQCr|;V^jQh*(Q%Jlt#^vq9^4e6xkFh~X0lq9cG6HxWk^1LGUPgru@{kGRvH8ROuSTVsXpExE^$}5rEnu^GVm{pp5 zeCBE!=Q51g<0w9q?Pbs~oYoTLIcS<*blE7+*DtI|RTC$V{kM$bE7D6`{N zws1i`tb$xS3ly==`tyK{m|-0KPDf&KUvhXDOQsd|6-D(BCKLu(@FQEZ}HrQ8VV^# z(sK8~D<_V?IXD09bl2A zS(a_e)D>Z3z2N4~#a^|cUd5876T>IW`x~~8YwgPGT5;TdhMxYZP+L9kZW)-a4!-{V z|3HA}r019C>rW~vp%<#)5O@yN1RdtgL6b;rtQaupFtSQ@?arn&`cd-awvCGd}Us6^Xoz~ezli}$d@oxf3aCz)wkPer1- zqs(wFUETN3Z>19>%(_^^-ld5u-}ecPt!^Yd!GESo0fLHP?Rpm|PM}y|9z7zQLXJF} zPOt9y-_||?z<2qoU3&!wdy64R%?JQASkv?jvVv(pU@o2;oq>)@hX-MlB|@uha3yj; z+G)Qi+O7otheN)Kc`g0{muY_qObI)^G;;JUUlqn;?qkkQ-j6 zxSeMAh3X9jcaNi@mnCPU*27<^J@O|SO!RbfTO({8QOIuk$FA%hJ5sr<8Z7tNVge#s3m{MP!qE7+9u!JsK=XLNIJo4Zsu2<-}_-lYB{tQA)4sh*5B>kX1f5$iSQ z#Loh8K?7%9XTRo*a>JiOdj?rOY8Vw;GQ7BVsxx0P%efhlbOp$YkkUe6F*ILqB8Nqj zawtNUzyKpO&gNx=iMaw;WD%hOD4H>Ag61UD;Uo7yA)zRsb|lrS!w|K42b3nXq83tg zACER%EC)AV`Ihx$TxY527)>TN(cne#CdR6c^N0m?B-PMwuPvt<{6}pY-4Y$@QQN5_ z%m1|MswncQdvBNFbzmibEy=9%*wK~nzZvb2bCWY!p+|00mU@yU1;7TALToP(N{ z;Ir~+2uYnrTYPLcuU~u8YMWO$EOe2MvIHdUbh+%Oa3G_6Sr>Cp}89 zyGacH-~0O>06aDaw{XQSG(=?`Xy{ZhQVO*csL*VnVQt+pqdDp_a<58isg=<`3=)S) z*2n6ge#M9;kminyxU6EzD&(5F%SsM*jz-W8jEo?vlG1`~))u8Hi%N1UkoBUZ!{Ayb z&`*T8bl1qxRSw1wvK7jZu~cSNGQW1KTaz`QWuSD$$wcXH3E}cgPt=zMK6=2l&DKyc zI3FJF{pjHLb1s*o^G*hY0GP;s*5j`;`{+b_Q62oE%lXifW-w&%UUb#A7m^c0qUm4^V!>f&}I_ z1X@fuV2>NCtWw)Ojd?Wm(0*l9zGo^*B1I^oER?D7Lg#rKem*^7f$1U!eIUWXFZ+tVw|K;~=^V&lSU7~AWqX$(?)tma?~o&J zX>i8w@4uJppV42tbty^Yd-|ObK^kqZ*oH=K;s5W z05-r!(zdRyA6j>L@oHo1lAYa3e}QFS@g(mz;?%;k&>wZpI^ zfu`%M|LG$D;0)N-K_{*&i_|SEKrw*fQ>Z0hj&{}=NpGD(6;Iw$voQt!HoL|YQmQI% z-ENYJf~G_1GouFylvokLOe)05W*3Q25vYbAl)qijSU9$~?fi6@+IwuSTl@R-dhX`w zePG^!{bsyhpqG0UG>F6lk*X);FD=>23wSfpp59Y(L(LIHs){gdces9k`x6LRKo+DE?%fJg9zL_0N4W&D^p^k=NGf}6XXG+S} z7Q4W#j3y_%@jJvVj69{~L6Jo}HCA6RpVe%8*;+{~v85Q_4vpi{0%LcJc4+pF;hXM|Qrw1(S10_aDBNL67&xtnOhQ z8n4nrp)+ON9SuE9$Fp_T?Szz&Y{gs6Bi2@uk8s7`ZlemrM z$GHD*fsTX0dhLI1i!&jJ+yp#(HFP{Dy*ie8>lGN=R+<=jg)L90*_>eN5mT9{@bFEn zd<6QJMp=*iIP4`@TXw0GA_+=KwCq$?{-lfCWqD$ilkHe7Jk?bk&2R%zG0q$@^Qtnc z8i9(UkQa|+O@AjQW?nqKdr9`ktU`zkNs75k!u%=NWKp^Ph0b7zV%2Htzppq%2%MZc zpWB@BsD#xgN1O{!f%6ounHHjAQr5Auu_>IpJ9+EhzjU(?f9P- zCe5z35eId^GC9UmKHSkj6z(+tU#DSQz zK)u!YjhvT2P44{1=bh2z%Xme8&=P4Felm{7 zy5pQR!=0nDS?Eg(;N^)pD=VGEi@eb0dZW8psMjE!%BuzE^A7IeJx(Jr?&{;>O~VxX z=)Y&_axk#aL=)^>yZA~Ln~O^)f*}GHuvq4ecVXyTjhlcfSYNgsX*+4vW}JOTAR*)M z7}GgYi2%OgI9d(cP{u8Fic+M`1kt3@0M=u|C3*y#Zc!0R=}ieJxJmKWRdpjPgfG}M zd~;S}h%tt>w0|VjRk(Y?lHKG|`)o}CVUh5dpx(dofw>Zd3uvYi46sshkbl!^k-v*D zmMMCA<*YfKv%1%cv2XOqF5fZ!Ln9^yIF=z5eh#DnzoDyWLQrxs;=EVe8ICU3PrgM~ zoDRZaU;2t+WGu#GUd8;4jD%Q#t2*e*bT_02=W|4ft4Ry3<@C);uV$= zf&A7i&ZDHx$(!2$OITl{>AOvPMGAt%^4 zqL;H^`W!Mt+f>oXTE!MAp&g->99A~ye!Oy!gGYZp zsQT^+Iqwl06k({;o`8xUHg(!C_VWKm)gR*)P)iLV4W`dZe*e5zbR0DzIDc<(c_sFI zem3|wYS31HIfgNvV_mWe8JwKc(DF!#MrjR$zYwp9#K|r#|8QMpFzh50G6Of8(!c%g-uBX1Xz9>M&f!jju$B!zFRSg@(gPi?q1mJ^8uIg7kK@P{1y z-rquvG2#}#^a$_divxcM8~>gS-I`EXa=RRMHpWPa62AZQKw%6sH}!egZA21weZ(GY~{?potaxKwa6 z0^Ue90A9f?4iPbcd{jOKbQ&^J1yTWgy^df8`5+C23osPKKY9C4=ee{RIrtIU<9H-$ ziM;bfX|4wEZ4MQZQrBwHT+3WhSV-DNw#w$=2A2*r5oq{^;^YVdyOCf~=W+UZplxT6 z;KRqFxTRrH6(%6i%bJ)e?tYzZ%W~s9{(ZJKXogLz%C=`LXm^yvSVC|+w5l2gMEjJH z0@%P%o^YaQ-sm90hwW@J68;?%j+Bv8(lBu`H;MZ8?Uf>N$mI^`Ieb-8;o}vNYVnn+hU*FZ4p_hg%@S^7!9CLZ?F$+yoHwYO?2_<+GGHkhCs+9w*dH{ zo2k9CDS$v!|5dgZ9$6Um6@AlbYAFHoL=!&mq7(tn@R@eYR7d{`>od}3_x?D7+@7kk zn4B8;qMW1aX#w4@jSu<>85kdAx-xbY`XS}Br@!-cXm2Y)f8u#NSA!0 zVYIy&jymE$_S@$kGHY^BF6FP3bkk3hReyR(x@0;NcYWp>hhiqj%g5yDIO#%?Vi$B0 zO*zw<-I%U5z1zn8`>NU81` z`~IWtgRW-Xqdcgsr7(Y+;G?tuD#+nouKFwgOLc(1==ggRec(_^gwt18MkD|%1S#oY zs1?0oE%x_i)Ij!2F$f$eOWdNIUW6P|nZ7vErr4s~4VzSg+%39%KniB|0x51fE@bzd z1R7`(N&8O`HSRB+)L0+_t`2Rmcs3IUP%P3p-rPEvlKj4P`TsF>4&HISU$~!mVmoPL z+iDuyc4lJRXeMlIqp@wXanjgq+!zfS-+X`T-nH)e3(i{SIs4u3#^=Gq*Q_Y~$plnx zM$cm-6UV2sYtTqic2ZI3KsB&2GHfkJ35HNwtF5w`#$b`ebYO(z3D^CZp+sblPXwpD zD;*4yNgrae!>Wl?N^w1prUa45_=N81%($ugk5f)le}Bf`k|u6d4k2Y(6ohr#`1kW) zKN-BU4=qbjb?*&;^SuV z|2>aWbE4KL8pojgv9~L1Mige z;r|(uo$YgCdW;wN1c66E#G;6rWRelVKrs;ULK14inWbAvfuUlCWr`mzBQk4QVZv8C z-vem$#aix&gQ%T3Knb#b+_3>+&h8*9`BgA(TJ!OCK*{^^+f9okeHQ>E zpRmOXM>D{KV&vMM7Uh{JRtmJ&D&_ggK<3;B&WqgUN!WKGk< z*pjg9(&g~OKCshRtf% znjH!p6~+V0#UY_&i5!T@njaTVAW9z`fd`@!F?R_WL0;ID29_oO4t|eKnjMBUDae)w%rP9T?^?`VaznrnseO?n-JPHL9&}i>AUA7 z@pQ-ZNv%Mxv^A?@n=g~pt`)x-Q~P3=6wl_4Ot5Q(goYgZ95uKJZ7^Vj?QCie6ogVK zVB0?f?bfG8#ESx_l!5k8O z)aEq+F`i6qKG7sY7)@|EaO!nfYn-diWg?Y22EGP$bvtWIec79gHCQ@5VIoCZ8M}C8 z$>*@))l=ta%Dn69=;80Pk6Iwc+-R0iJ;-_lsy^rvE5Q;BJ6Dv#&eOs^BdFEmFw9B> zN5;_n^!3%^MD*je@J54yQQ@keodCy>!XoI2J~0`M;87fSax^Vm@L&>f03*UuwauOs zP)s7rF8``n&34n=>`o}NpomQta6je+;uKMU%AjC$^w&W}&3ML^4~L+~-q>MUlu zlw{)2A@a#(qzAC6>d<7Dzg;A8EN7P^KgGm;XNY$Fy&q&rQ7ncC{2mL1Cge07te97r zERK*lF=BpfP^Ea@^vKF+ZO_!GFr31x+;k&4yLoGK@y+DbG2+8uzRqk9 z9)8hoQQ4LZT6RF*_>2h(@6KMES!ijD9jUr&66n|Nj%TzXxd)a!RI4rQef<{hHsF&SwC|ZU%Y7HVjL?Nu_JBr)b4I( zi_`V29NKcvT_ow(BrSC@69Ww&By_eup8!85o*5`toc2T{{u;B3jN`F`MavYtX!~H~ zV+2}I2$s$WUboC0k-7=cV4zQE8C(Po7R0#Z*~KNp8?YHL_-!8O)ur_&Q zzwN{N=yWE`y%|o^?Qts%IiH{Ss+HF2pR4j_Se2+ z8;SS3T=jphSUMCet=I6eqUXa!f|9YABvG(<)n$u^lqu*O1fE}Uix`x%rv$QFgo{EX zCGn~m+j0H9*W0Y%iR<|pG#7!mGeRk{3z``%!7N|}Ow=a^R0v@p7!7|FKoYp5U7-Ph?dS2@_L$K`M>&g`l2?*QrtZ(rG=B%>~~Q z-7Z2HM4o7K5kPbebO{_j6M6YNOq~&er0zlqfth2+NCbt5>d)XL%uvtQf6+B-0094F zbB$#uFN+TOF(qjJDufQA63<<5a4ncV1-pa1b*~gaVfLptIGNkx?QkrXI&Q|b z)bJc<;8dK2kUbA3fmOs9ummxrhIDs9QNa2xD)uS>ydd?SKHPxVWuD}Vn+|Dx0>=j% z+&*vkXk3VxB7veaf<(aDnS$~7?ES2i;ca16?)}~0_TPK^*H;ic5SxmS36Qay@xCJn zY~ecjqrAt}@Grd_t4gBsmQ+tL6C%4lGAkX1!!u+xKgLOlkp}gZO@@P0?FyeEZ&HcF z;E1AICnu=f9@3b}Cv4&rMf17&VA|X1huR6RYPhI?U63Th*=qntWQJ~!I_Q^5tVQ-xL%?>S-Mshfb&Ps=zw?=i z4Gm=LgVjuPCMVAVkT zs18tcuq*$Sr}7vgVWLrvl1cd`qGg`JG~zi)-4TnDDBl_WN3>v%^$8QRMfJVgd?=yy z{YZ{>veA_|Jol&*wBtSQS1+gthmtX{qDo*oW(CY4Lo)0NmYXE6aK!V}j!HRA#Zab1PhCc0i(P=X!fY-XSd4 z5>1GTtOz8^Pgf>Afqv`9-d7C2{exmyQx&k zxxB|c5mz9x%`LH5eIOeTrhSoq`_7Gvmdf8s&6Kd8jSF9Dbo!l4%qINTTRT76vdjg0 z!rp52@xN%24Re$|OK1#sRSo`Wabaz!M%(4Pro{euk6mo^tp$!XxD94lV-5jW^jY~p znV+FiOLX92(Qw*!ELd92EtPC^c}%4!Fx&9kgb7dlSd?0=&hC&4jFO4TSegp%oBvb7 z5d;qNzfv=IovOGXDn1-5_IVok18RHxHG;`ch{;V#;+N!5R-Wq}<#Wr)#07Ct@2Z?A zFHTulqJuF7KR^%ODV$0n$eBxG8D935l;C%&UtQ~{9~2R&%A<>_+$n*c-lP!?NBDf7 zT*Ux|@UVdpScNausCsWckg^(mYSzfOUU8d|NRz-Zuf6^&)+2gQUNirCTWSSwOvDB{ z18Xr8kvVi2+O)7woGx||n=+J~3oAZP?g0hdB3#PIPRo<8LEFT248urZ!sp<_0h?|C zaG=|N_JL)P3?6zx^HXImj*q31h5aS2Y74*}j-xf#tQ06-=slz*x%u@8z*3TT<1eVO zC=pY13d}z>tx)A0SDY<(!PLr8oL94_7_Rx-AaE?tED#Bh+DvjQVFx7_n6TrjBxrWl z%y2G_k%f+~s}zD^BZZ>sgOYeR8s>|I@F`z(psY-23u~#S%{p@H>WQ5`A^vpv@SX_8 zD8Mxk7LlTZsb&8mWDua1q7Z#&n-};s(KV;BA&9bLmpC&! zK*`X)JSf;xGN*9axy-CeGk{4I#9TRg=491BOTG#KpveYY+=);PBS%bFS^#!>+qwKW1FqX+jIaid>pK(y&$QZ7kGz|_ROuSTS zq{}v=vs!a86n|3&HfiZX45W=}3MBu*u}j|wT?PY4D z1EDfs>#A2P2P$Y=n;HOd>ZU&kvYBVi3m;qmIY_OXcy93u#B@iRs2)tUDrB5Hg88VX ztjX%1YyY!~qB*-R_8#3!qGO(*P^vVQE|e=MZrNiq^4-7OW0X#<2t!exdasKRqb_WX z;YxiFvJ;I;p88adOs2a`kK=Ezq)}6SdGea-V2tv$o{tBLg_81np58&PH>Iu4QHw4| zV@nm+1eM0iU;WF^pODbEeHbm4>dqTJUq1Yfz7D@=kBWtY+vEg2W5MH$Ku2*>OA_?E z&7v5n9XgZ(69%J$#e^`<=)@9jZg{jJRIGN2QmNtRmh8mN5bG--nAt@1ZT>AA_wg9< zP|FQy;^gs8cKo}1o(O+kdEn~EDU6u%Rve)uG-o14c^JDyQKjz*88-F~4o}V3-2Qhu zKwwYxKa{}Tp+d=sj*P^J-JE7z#pX#b8)MtWo7d(0PBiVYZ7KI<^31$rqoR7FQd8zY zrWgzY?k{a|h_EPJk@78){H0R?!(+tf11AMwN!-iHxQ-j1##SW=){p+GYcotv5G0BU zF2Ay=ow(@K1DnEr>FT~K_O^Q|G5t-7vNIDPZ`0RkNJ7}^HvgnYuTlicAG1M8{xtYz zA~yf0R-f7ZJZ8c9o}t;z-NAH$cU9g@S=vorNpv8sNFOrzdJDoX7x^tX-XH-Xk%1(X z?LX?0dj*lW31A`7wLaMXLGqfs)BN_veCAe5_trc3{e|;7{@|y-Zg%6Bf+nmLFJQSO zOOQsSA%${ECI-`swl7wsT|w$C)6W%E@_AVy6`RoA1Zirw1m>R883~4maA7faN(?e3 zJ<9KfVe}CirW#oz)UfVZFwSOI;yfet_VT&e8JakAFL$PJk-$)1BJVC{TK;Z&RQmP< z$r7Qzy(fBvrD1#myaeEJuolc`BMU6iXs%(i`BLFWol*a)gEN!u4!1#|c#@)a<7z<; z?5D3wm(_0)5@Mc~Nu8bHAt>Taw5=ZZ{*46r0NB0tPXu`uKUjg}I_I5A)(|ZWY_os%u}-5;)vasZF?I4^)&&2 z=PI2>qkoaC5@kIeDmVc~9Ge6N7-TD6WRN&i0#$_a(iXr?1+1o%!=+a+OHce z1zQ&(c_-_?+3TC8!WL40&FN*WH3}-~uih%U18(Stq&X%j67|cY3YJvPTb_JRD!O*! zwd|)gHj}AIwAdqC@hY0J=sokb6D1F~^?u5T5X;76oGBcm+7w ziINmXt7tqy+h%w3lH#Vw=Fg3z&S&z4p{;5jkv6TU3)9y}bTh2Jy=T|AW>Ic4`-z5g zFJJpua6({%%_M-fqT|Q~tL}raTIn=79YF?rUw}v$?V6eUR%OtyEz(lfY+l{^8-{u- zGBiE~AI6N~8g&tVZW*@N;E*(HpE#CiXCO_{g6;J1UZ(K#yP$52<#8o-P#%1m~J`%fE?SnD; z-_k1FowYi)uI!cQz{F>KT3VddtpDW+oF9x)JGy<9!e7npJQVNJe+P!5 zM;%X{d1$xZVGKfTBpD|6xI}R_HkU`~BAd!HDygel$^uE6hb-}>fQWW{LC(Gmigf

pRry<9PaoKUV1`tPgGe3=^y@E!kg|N#I!c&Vqgj!j8IC&?X$q?Z@c<)n6_QlhfT`lR6m(tqN!-!w zrf)01e|X%I@54nd7Gp~X&FB$&t)tLiewq!sO~)m2=r)|zEzwk~E?gMCH+jub==i^< z!=;J#hflhIEHu(3IwL)HcamWhHQq4=(rMER66_z1U+are1`uwlG#4zfpsdz19X^VQ z6nUo=dTVgLXmXwx%})ztdBH_UxHF2@s;zV!vk=VqSjkk2NQe(V6GaJCLv$qlkF;e< zA^-Q41`d%?c{U}Gzt0zv##L#Tio2|D7xUHyiZ?-xXx}N`l+NZ+6BM|MySa|nzY0+~ zV_Vh_X0N}r7L^y~rrxFEyk z8S%bMP^k4}?R1bI9B?o69yAGF%t0!B2^3%@e)9{9zo@#hYud_B#QS{srJJ${hhbA^ zim0~R?*+yRFnT$`LlWZKqA&?VD20DgmU3uwS4I*U50yrkqW6T)GqAk7%eUCPK%MFplb>nICN;n3S?}Zv(2MgvIXS7F4`rH!*NAKRCJ43 z?7ih!=g=w38<2>zt`|p{p+tx_ddQbtvpqa`=3<*)SXNGN`AO$Xk4)$*3)G30%~%$&Puw4|8ywSp1 z6tqS|_8Pon^kIQPsD}CtbP3Ttwvun ztT26(sHH)CbYQ=tsI}`ScU1%dQraxV!Jh>s3MuqW{sx1RxVKhIA5S~JhXyNd7r;z2 z3Lw4zw+O#`r;h-7=spf0hEOwZ^?8aocEcR=8e<@^+FY-zxjc2>{k4`rS8Q_4@h?q< z*-HLD1vj+adhp1I4s&vh?V{&5x@tSRUv!w%KKjf3qawr*J_{XG5G0Ha77LS{3PndB z`AKP!*eiLVfcO*q){X}@i7*ocxbZ|nn}p(>ztG=|Z!mY}pUHgOoxG8J`8=fxP3zNZ zQM&fa$d+eDZcEzJxp_>U^9w!WF#%&!Xzo{o z8o9J9@S=8kWzm{gjgwv4PXuwu3BVzr_Rzi+rEiuk;iBT)lY<=hLlfr{7a@WhMpnrL&qh4U{cpNzyQ3qR3O;Jtsjemgv=^!dKjQAoQW|=zf zVAIOg^{~)Q^yZaB-TWJ*VS^RPc1b+}EGQlXUw2cw7-rZkk-VY;DyE`;^tE)cbUaxO zFqSF^z|Z_l8x=bY#WJ> zPL|n9J5wuSbe*c1UoXH8X9itv`g?EF-mUMe>Wl+WC=&oAInDdLThqkv*Pa_g-Tx_J z_G33ddHIx{yF+WBqZ%2R6h|>j|G#TK6Cy(sZ*mi>UDxODT%GvgWc4NeJ32%Co#oUU z>f%P<2)#Op)R>y<5HH?OrJt{_P8SZbt+Gv07mE=|zMqj5gZUYwL#bM}L`1GFbw$`^ z@TJ)3rsVkHki19W0a(=ybn2)v`O*SF0$aZV#lp1GgWIkiY5vc99{Yv zMdqM5=BNRTQn)QfbLcyM$5``5bovc{Dc(-Qw5dHLgY(iaN<_)LYwwF(d?`#t$lq7x z#DnTKWUr%(^velrq##{oaX!}yo!z0z%p?FbH2}0!vEWraIMU%;q4{kjzX^pL^2;ay zmB*O1UnlUY;TqFru8HBSd?8O02UWpae$tiEy|vYp`4^W^G`71NK>p$c&s#tx6-At}B%Dm&AHyU;E52vB znmTl(?uSTn2zsT3O=*FEGgHb~1Xk4XlHXywfT4kAV{#3ie13cXv9M9VF;_{I8l0~5 zFOB9&SNd^rWHhxT1{|AGMqa{(OMhFknCDGJ#njw?XGThX6L0JfZ_}qfd!J48wN@nQ z0Dc0KSDu$e1ng}9^GxF=m8?)?CfGN3O6W?d9WwlhK}HyF>4&MQMO%hHsv!;Rk^d=S z2?86dzij*AXQdM)=TFSQh)r$(F&Q;)E%d$OmbWh(&xB`&0T&mgp2C6{6)g%?x6;6b zavM}$Ij30)M4U%vyT=zL@wP1JKC zN%cw5(t%^B(%EybmAFSsorm0)T$NfIn0!wZO?sEbvzCih4x3oa<3*HC*`I<~Ih?CI z-rjIJye{MpecW*sGzM|Y{3I#HmQRl0ql4;Nn5y}PuE!nmJ{Zc ze+4Ct)^jLc6_UFzne)gdzQEhtBxpZfYR1_~dY+eazYj5joA%ve+@HVoDN?~Skq6O{ z^C?t`hF3{V#aVCl?qZy&YBH$Fk&NbD6>G$lsO~8QQ$7{-JFBF}TPZPyFj*`ve0AqMZKX7dxMEU1;m2|!5E5kWR=-ojfz3Zvni6QM%TZ+oe-p0gfH zj!PB`YmY4KVHs?^AD(kXdmPL}81Bx$QR>s))_JBf!&N z`#GAgBM8M~ujjJ$ZRq>lQGJP~c@bVHTO-ttHn%+{JA)d#(Igp7mCH@uu2A%K^sH0` zix(k05S-bDJYYhQFuA&uawl6mWc6*AIY__K)x*Y-_dHO5J-wS>lygSXE>r{cmA2Y!sZ&?gOjXbKkzC1W9Qb3u!DjHWq<;f z-T)&IXwhw7ftY3$q2#cdP9Z2Q4u7}#a3!u+WTOg&Tg1hN!ELx@2_0qEb;@@EnF6|j z$v#KQ=`ff$@S@WdUaP4{r$=17(eW7uO5g`{zTfJ<^s)vFP`|%hsQ0|n_vI&k_9YJk zqT%q1CFg?-GDO29AyA=H+}SKJ=)wCn+9ND3iY9lOfg>g|z{90)ni`~RO$RQi*l7PL z;RyiStndB*(2SAjXLTf>o_V8S`A7bF z0aRwv2u7f9C%R+EE1lJSWydqk#*+JgZ%Y4LziOMs5TsM+o4rBf69uAb+ki(jD-x%M zk(a8i{ugMw7r6Ngr_0Fi`+i^fs>A>TWbK@}Cl<+IW3OYbi)$pgARZ>ycM{ zXj?>D;TF+CZcwi4ANzdKtz{W?C zEK3|H6JihxrGd}j$X^Hz+)rN*#PSRd8iOw0wzbneX3^y)mLrYIotYoe*6l)U}w*m52)7#w{oJNZ#fr znZJHUjA3-HHG3B@--z-sJXU|)+KMMqez07}q@xC?LLr@-^fHWZpp$;hn24(*D|b!t zLY+RR#8$L{#|O__HhgWv%KKm+{+lW4^!h0n7N1VkX;u;L4lIsK&~<}fphRzB+JT)7 zy2~ty6s?9KJj+Zb3MNPLwMrqXSd`-xv(|q<+hz#1V$R&}B2q=E1ey6_>P~o_$?UP+ zU;5^@;Mf5Gax$COFd0eULTgvmu$nHppcDnsHj!(IVsbNwBGJ}Zcx=^onlStP^zMFLYZOgxg0|_Z5;! zv~X?=zq&=){ky;1%wbhpR?cM&s+nYE^{>@k*6KC+%~05FB>~(Rx2f`bf920Q^&`&354I zul#aEq|Jdhs&@fKxgKeJiQrLCP35BiMe5@x{%2e(6(c9Qx`;~19dnUCtP^Ae9}Gn# z163e9ii(B=^@;h!7oDUTEgGVehS5tr>S4OT5*%O&6mILw-jPZ3U6RBAGf9QY#LE2g88 z(22Q^#wn!bA(lpicdZ1=!OyB9TcY{k@*A!6!`+GMvE+8z5R(r7V7#~@`}i%>v0&ZC z_(tEe5!B5)}HAip)&z|~a8 z78nT~S+F+-dGPn`XILc;h(9)=M#W=woXa#*L7t1dU@9yacrK6ov^+sNy{=XBLtDWh zuHfzN8DR@=ZA>SMu~%y+`*qFuH>f=pvdBx;rgArW_{Tn2JwK33CIe%L6T6No@hFtm zvP8CiJ{#jz`vQyS3yLhK_uDD7U^wh|X6vurWxq{zsH8P^;y-~g3s2OB+V9L=Rknv! zeUdz+4S*9iKH_}6bI8s-K|tL#FrB9A?2fE>Qz1qcL>9r=V=vv`G@!}%;Ew*hy4(N1 z*mDDbO#&~U%96_2l|@d2O|r1a^}$tauI24m40oXgnmzBeFMpoD^}cKU6&UEFsHEz< z?H7uuYr%c25TTOcrlO{9(H|uNf+mEX0B}g@P-)JRV(>g-{8I!Ue1b8MR>hktebqiR z2ZfCSCl;YX38bD=Atyw0TzEDCC#dsa3Fn)(+324wdRz7>eYmMbBwP-UU4-J3Uo7P( zd6IA2N)FD7<+N+$hskS?1`F~p3HB^UiN(@wms3A8GinI4tOXq#{yn`#-;59qMG%)A zgoi|sEx-iHkeJ3BQlEZX_J6@Cn;*OTDa8a8?8gIPXah-z=LU-e%%mtVAWEhm7KVF_ znU*Py-mqx|%aH6?#SIfjzLxz)e>{vx0AkzQb{@p2(@hq_jK@iO{ev!+Bv zH6RdEQ&M01i&d|vn-10s4kO1!eoP)O`&Tl5h*+OiI#}8eBn8LfVn$I2vN91_()IJs zQsx|Mwt{4*5hd(It_ypoOlAwx6YP#FA_Hc^C*13f5~=+DNS0)12bjY@3M{&X4hu-; z5;yoQvU!9VWWDF39_lp;us7XHva&xC&Z?a>NKNSVHl`BIwmdSy`rZ*rN9y`eL- zDrNFCP^x1A21F2P5-eO)FU@-IKFiXC9n1eE5Q4FauR1p8ao8pYjNzReH;54#Cp-U7 z2_NeBli> zF1~N~=kHN2KduH2xPCQ-a*3K%MdEgCvmX0RRQ6W?tO^Vm87y)@N{jrA)z9dJ;K78v zw0bUicX|}uzP>0wz6xq_r+H@-%-6urIP;d5OoQMgSMEgV-%Pqq$g~CG6~7mC(eApc zUHBC#ooqBF7m|o7tF4FHXrb7F6l&B&8E_yll?GWvCw4VrEQFIuIuT|^FSWWG(c-wo4(!Ig{ z)bAO-mawVRy77G!M=b2g`{jGixB zix#UInrJKp$R;U)PRz0}_G$+I>aq4a=odL9@>OnutRNy^dVVf5ryZnaInRv4_U#K> zk`iHWU#25;GiXK7IN3&v?%Q37t*PVNB->b;+X8!mOaSiTr*3*xc?QQDu{dNd1%dx! z!iVQ>1!(E{13F=9iF64n$-!(7{wOiJTHB!6`lsbgYCeiuYKYz5gu_hcr4w?<+b{Z1 z6vCe4>n+PY8?G{;hxLuR$PA_WX&AI?I4IBlp(Ky0vI=INcX%gWa4Daa3KxR?D5asY zr#HhxbM>t=ec_PCVV`!~Zkp1>bEF9y2oH;6DexXiB$^OQLOj64F4;i2U-F}-nMg87 z0}q646ez4|#?uwRutDm?lRZ^R7UY^&HO4-x7C3-9ykN zIE`qef#=YDS?i$1MTYln?jD|n;m;3gUV2l3feZBjBaRgJ`o#&pl!kkYN+$5#1eq1L z9wUA;3z;O%bCISIdXhSW8O-Djt9uwmD$Vv?&b76wby=4PXsT?}2n$sR)Tpl(dVtvD z`HxyBLDZ*ulWVC`t}%l#u%ywYiqAw5X>CNxSz2yO5h$dB*z*!b>ns5%(Ks06@ImxG zM0B0(;gnZEzY5ZmfjTL>cL}8_76E#z1VZizxh6K9zqQAFFoqJlMiISDMG5nj7;XR9GK?6#*m7U-kJwy84Ls%EUNstG!f^JoQ%a1exmA~E$q%|k1m)S zhx=KdmwB*w}Su>u0C}LZV7^j5#ea zF^n=r1bvDihg!?tDV&x}f$5Nuj6}}LKTmQzc3|yK zr+}gV{8kQ`j!IoNbAA0UUxc2*E(5m2J^mHwY*_#SY;I)8cE0}x({`AlgZxybdMAar zupdz{LQzX@iRqrKkQ@olNpuChKxJwv^cv*jnx)R+%{g1KYD$cm4~ak3#D)%lVU+pNNmaeTH)lVQzj zb}$DNxXZjJ7`*I^cJMn{QN3;iF;7Y$cAUt28BQFzB8Fxr8#16m^RZyj-odFwyYAnR zIo* zUdfhxRAh0Ob+&sjQv6p-nNjWQ`SRNR`djZ(?_Bt&@}OIMbqbzX(}a}UnuSXr;TB#& zwx=1macJ32=Ct@kbG#zpEjyHkh02s@Dv=`-xq~{1j(bpHM32^PW87a?lej@CRgwrL zF)}F_UK98}OmjC0;3u=bK-1f8izRzW^mt~H;*)B>T)m8tmy3(f^SqlEJ4}|YX05Ia zl&yX$uhRiP!)GlNR>j=tlziothEDbr^Nlp(qj%!6jHQ|>f=sH_4OYj(R|=8I07R0S zpWS*4j|JOS@Vph5NL1`RU$2;6f86C!w~M&6d6>;EloI^5;C}kPH&(uMg!EG~ed=-7 z!Dk^b|6hWlx9{0qZ)Z)kO79)H=~mAg_wlhvF&RCl{gP1~O;RaYXt5C-9HbB=i;`mg zvE}(cE0HkMC0j(26V33aUZKKVtc-l^sv=LY0!pP2lgJs`7tzGA`RBIbLNWqQ0NAME$z6Hu$`&9)3G_Ryk2H!^4N8 zRi*R$Kww6!Yzu0QFeF-9v~E%@9x>}NbxFi5EF@fc&G)tjYOD@`Q3IG4E(8aDR|kq8 zMQ9w1#y-{Il0CmikOy*hF0VBSJpZIgU%KX!inl5KUzeP%=hp79abrnsVB)8LG_UXX zcZny=nmC(&Q5u!JT`0RU986pyb46N|32s96#-6n&PQ4aI@x(Fdk)EfXSx|k|!GDnx zrr>6vabYYgL>fZ(OipZ~C)CjPbX!K_k@Uil^8e^z_?6*G=|8UeO;tj}q7Cd0tU{Cg zawKgS(P*VUv>CQXx-$KWd;RucC*3)VhDJK|DEE4r<(oX6<#NL%XP6VqKVtU7C=RKB z;4hHPg`|vLsbs+z?+;TueD(8r!M$(pu>jXf*$S3KM_{i-k6>kBKPN>4%W~rv~IEoU(DEg69t{Lqnx-TL* z*=ebQ>1+spXH&8pH#aNT8V9J(!c?O)W!l0wxt&g_7qs-$&;>fW6%T2g@n3BG(|p&S zey+K1VRaV|wDHvDd*mGr0U)6)&ZVAvo{6*j!Rwi&1JQV4_qRI!{787}3!HnL^%}I9 z!#ck#In;KV$SH^X%F`~?aDS_o-O71;_o&Jljdam>6axY3`>Bx9BdLyA02T3eGGbyj z$7-W{W~V1viefGU%m`|qFFzrfC1oKyh zB0z#FK?I5f31tkBpU6-trCS9{LN(EiHrYIyB;{VC#LJMpSVDxm+Sh@Lk%&tR4|g+_ z!&dcQNO%Ll9-3><(;JQp56E4j?ta1X&ec@}Q~o(bVD!V!&Ym09VXt1*&2u?-cb2?g zvV9b#Ta}PM=z3C79BE0Kr0~|WbY}WeMa9BFen^B~r0YMO0Up!>n*o2i5U|_hAgK%l$DiY-EhSZp#_UrjFuJK5~;^t}Wn192)tC<|?aq`)$3Z_?=w#~MF z-A$7WuY#gUP!LB{Ln^9JgY#Ct{GPxu`E8;fO>uy#6P%GjZ_%u(YJ+P(7^af#9fnlV zvwX|l(-GBSe_45~MZ7$_99P!XvAYAV>G8zh55)#Z4B?6S*!Cs_((_9&&o&KT?s&%~ z!HY#_+1ME3x}Es2ZhAzX1w03sFuwb5odi5A0-y+>px0}R^83|FI1sa7*COzVNKrWx zp@#qaKp$O)Crd4LdPzOO0=ZsFRBmkgkMWUu^s*5|MmPMjBEL45g14zsHc?xr0V`3+ zRWzb7goU15oG@5fKs|{&#DPX;j05oKdN$IN9AvOCwR|j8N-f4=t>aH}lnI9ZF`8=Q z%B2Xuls##EeYfS=W8)C9ph);*TRtLa{n_!-#ATkY>Ucm{P+iH^^yTkV>0R5}o#SIw zR!VbL4d%KkWfC9|2NuiIwsjAu&xTpP1|uN{UI^QH4m6%xgB- zwz3W?#bY%mhnTY}GQDDpHPOYlQAqhihcC8r&W9p5fB4)uQ%RT`;~5m#`iMB{yBvjL z3^RfjslvQ!$nkSTPxVK%KkB-Hclk^4Tn6lxyr@2CaNinmO0>-gpMnyCBIO-wCu26= z%nUVN1L8lcGd-Xy)TxRApee}t_H4~Mhc2HYAprhlGSLTZ19ljx7c4%ikmqq9?kv%n z_y5wXkC?q`xp*qex%SmWpd0mw8>>Ip@V`VG2GOP~;me@8tqVy%SZXCyZ}Vzty^vK= z;QaaY!Snrn2p7@biqN6etrQn5-gn3K;ai+1AErcCkCCF8UO_czcsoNf=m0(Rqw9v= zOeUF{hN&KABmavWc2)w%@KA#e`6hVj0_Vmv zhHP*Al!6|UyZw?UpuvIVk>-$P=ra9hRfpdD&d%15j@N0H@Dp5|hXDK2Y@xI+F#&pc zN^X&BF#>0baLNc$1C9$y^%DUCri{QkC&;L=33-JyOAy7U6^|tATMWhE)!Vvo*G^2v#! zOD>+a@S2F)l>5nH5P`{Kgj}askos|`*h00~&W5xM3l1Ij%dng?XDW^6cp^BJeteah zjsJetk1|ZMxt97zdc~gaGYvaWjg4t;SjFc2XEDr{4kx>cIDfvwt%Ghqv8CW^S$B=H z!sy$tu55)2Nm@2rJp28IO|2iH*qYYgvI*2oCf@zP%~c4p^2@i9}*r8FUXQl#<2X^cbptMSed zSr(ziiu!A1ri=Ica>;8?0ph3qZ^a6%Dbx76K z+WYSVtpi|l4F2=ydg2U>>_ugz#XQLQnCft~hC-;|3K^YbIk^}s5mnQQvAD!TUs0q+ z9E?m%K$a*=knWZS%wXgBkqZYByW|H7qVepn(q^_&FWJ-6t0b?A!^f%9CM8o7Yxw^_ zJ7H*uB%$Nkk>)&(vfv`rp4^TM`zv=gSuBjbA8q1co?y56TgkFE-sIS=V{DL32?O9o zKrcvgE*sjJ$B@UcQEr!Hj~(`I&5BfzK{o92svG6lj8l27QNLv1))?NSx;JQ2xPTEN z=|`#jFJ@w8S?y7TQk8>2^dOO;Ty07Q4%R;rC3;EW4*`;nE_vTb5g{B2tSk;t zA26s{z2>MpZZk?sG+*6GRpLXamcT=6je8P0Ju3WIz8cP9-piFWghi}oj-Ehf*D;(y zVAmwcCN0O7EG~*qW2K`(-Lem2PKI1E*3cLkU(CTCp4;Oh*u3 zv>T;EW%Cwoz8Em*4jI`CyJh2L0|2f;05tg@y{5-Alm|0_^l>;@ z|6=JB0JijlnJPACbT(Ks7a;eV|!&zh@Ta$GKi&4cwF!oGb| zpzu2xT2y~alwDpXTv$9`RRi$iisDkwUF3v`sD?m)@?t?$2&*RmMcsyIn8PFnsy1_D zMC8*n!D$wB`3w|C^g+zU9awpsnCB77go=Ps*j4i@4RFe2ir+b`*4gDSV;$T-8u#4T z$ER`>i*@stXkx}e)pZ6>O~6Afk=b%LIn+o+BYTLE><$((YW9UjCZg&H)8G*P7| z6|cysi-&FMOG$EaObJS)*Vvz6P~TCg>)DMIb4dspo>2+hHkuvPP@VplVbPD_PNJI# z7MJ-ybiHL%8{hZFn*qlME6rnICXp-&2`fVmNE6k0bROIJ@o4>bKG6zlr(9Hhjjre~Mk0fHOd18dJXHro9 z%6Y2n2noNgqt$rjWO(!6m+&lm$}OI&D&?V4zJW2>J`*9e?|-3s0FNl+706u`s`BXs ze1*VJi|2v-JXOXa(A4-pO?Ku5uV zGY;Y)cTZ?J)81UV%1uiyXa`gO{B3iN|gl6p3drIK(yy}@>W#E z$E!T~3#*Ld2cN*u(Ufhf<2zeQ^$(r)hAD}2zvQP1GDvJqix^g??+Gy1|grn=5*2k*_FEh4V(QRGuKkW ze=kCnR_>@GK9&s~Umm!eJxmUzd|AIKyL+m>&nFu%IO1`Qr>^IwLhx{)(>Z!6)z;oV zjJi&Suj#zrR&I-MtINbM5Jq@4s@8@Ke;V?>-)O!F9qmCStXFK=L3gLFQ_1)aN!W{n zqDs-VmYc$g;w6=6PeQT3&C)r2M?b<*jk-9le8s`%P5RxZVFTWvsGvlzPBGnTs{?kb_YcdQFOM_I4fY zKl~74eTMMqtgO?gnECIY_yT}t`BwW#iTCe2x#daIz8r1&oad@KZ?{Bscs)*gT&%!D zn%Wp(z5B)6K=IDXtglsn#K3n3mEg~PSM|F?p)TSES&LobDu%b|bQMr5TIxo+kJ|B& zHXKK~R{eMKgNBOMoNML2Z?;b2*k8SdkTTxAA+|E#LRgL$p#E|WpKL$mxNP7Ta5aO?jN;AL6`1#Jbm^1hK7PB8P z5IJmxHH)z2G~-prfoW2H{i}|G7qCOONC4G{!~9ww43%frz*PMXp+!8)%w`}Rx?BjG z2b_kLs>5z3{M5zhfPkB1Dvbak1xNKpwG2&Y5pdsvHsk$Czer;p>sA(o6!r#hcwWR@2B-y0}t9MYtRhXkp0Am{q7<7evc(E@bhS>S^cAB<}^- zE9nF8Tri97ZTV?!QQufm^YRI#GsZ6+I=w0&diB_KP$?otY4PEo_$yr{R1T7EaipWo z{N982!$s_2Bpj6@uGO>YbSAnUgNQRUJThDnP7O?B#wu^Yp-U?%ow`OFJm*YQ2TN&$ zC+gxpj;8rqZW&`SFn0$TLg@Ld>E{;laPwU40*PMad&)JNd0wGxfh*EVd@eY-DdZ{U ztazrS(mm)$zS9RIEvMqe1vv#k2BHFJQ5JHg+gQ0Aq2M`MXKwv>BRW&&ZFDp^f?M2n zTO>*RwOrgeW~IspSa{cSl8m!c96A5)sygV~i%p_XnbUugG3$Q%YeN*h_$4)cOzm#I z8y(l2G4`Wmt@S#8$p75@Zvm)JHcRg@sYbm<3_8tz>FdM?SsaV8mo}9-@C8Q_eGCek z)1#aHm!iSQq~C^n?Xq~iTG{wT@gjW7Qd;)?a-&U=uFbCl$atgUxFlr^CqmU)m>iwB zKPnxU^*e1@a1eo#zH(F4LJ64;8)Bi(NpMp^mDe=M9L`=S74Csbt%mWLmambVh#WL6 z)4C5cAh_<|`)$d}!}NBHk2U)}vD)Xd^|z%K&`7zGrK`?;cPuf{s`wpBR`r}Faf~ilLD-!v2(6VC4O2@ExXZ5SF2zr8)q9yA_hJY$m5_pBK6nj!Fe_4F=A z`!rnG%~t$i!9P1aG!-%RSrfs4b3x+3R;T#rs6{+03Oh=eV|$<0DX!P(f!vf%#7u z{*FUmzzRc13xCdwJG|S#%SWR0FYH$(lW)6Yct6T#I$s&IR*;FdP0+Lq8h4p`RNX{x zp*@Waf5+dix)CLv^cQpE=(?|9WLvDTU)(2NIKegyx`=x4%`xuvX<9wyD(w31c9LP< zrMF&>?ci++(PW4Yge}s1`>zU308snP^c*;NM&&?b9B&kbNYGL(8pDuG445pB^+?qI z9@ytk6RQ2QugGQKq#Qf$=N)_TgEdj=g$zrFsZ!?DIqaXVp1d>LRYiNJ&HN8hl&G#v zT#UQ^zLB~AcyoQP4WI)9a59{UK>=E2ev+ibF<1m#_rXgxnnc~oDG;6mpUJQFYzatI zLfmAf5_eS?(-ahoQ_hk|67-@+BSJb2BGCtep@R4x#pS~b%5(7v(ZM5F>ZUEh9#(ee zeQLiuz=b;ao~dlC_ydYlJKuhypS`I0KwwX0c9@<0rln|tLhwTtx(oc-@*su(LQE}% zb4T)g2Wyc|6~}BpSdTTt^VRRtSt{?Y!i}xy@nbC_wNcOxOHiA3R1=uP30CA7Qw^qEz^9jBtt$*T5FFqHJxykVMDy?!>RCV9f9c?km# zvPzrAGMD6)FjH!Z+KHBMf}X5F3j*0Bm*EN2g!Rv=+CieUizWp@OFb3Nyu^c zfmq_60cAm3Kp>#zqL_-aP!5?XE!ae9>Xsjj*Ihxlk1c^2#h65nry*Bdh->`(lXlSR zC#@jkv{0VgxHsX6uc#6Kj9~d`IfKNMwVpZkKmf`P{!UJ)1=1y_Yqm~+Bnmj0pLh^* zcRCrY@7wDZD~*{2G=ESrV+!bmq*tnHyqE|Iiw@KIcu?TC1Xt%7SKs^eY`|3Uyd4H^ zg^z=c8w4ymz>#C%{Y?wq5M(}Iy44IUiI!rb!-D=?Hr1Shx?3XT;?e{mR>*+Bp|!3-w~UHb5SLIMwQ&^5Pv_2VWVWEh80w$V+?aLpm0@a!nt5-ljLnSzZ#GwOJ?!> zIQk{fg1tdPggV`SMfhzp3Te7}D*;K;=nbtnpRIRb=rQq&c4H4ZzT9DET|C)^0wEuA zLpK~qb-E{o09$~`WT>tF+?t94U7V6RjXaqRewzOpid!rj|F_C!0kkubd5(#?axUzo z`JZIJlLUWBIGoit(Zr31W;PJ2U0eTqa;QDkNPgrp=(Y+ARb*2RE4iINKNK8pd#Lo@BHAj@^1%)FQf#R?!1bJ;PQAZt5ab6;d6N&?& zsgngN42uB-r4HPI)1&xMEGZ4aM8S9iwIAYP)+(y$pMx|w8y$+fl{vKMia44YS)}FFB+JJ9N5yp>mYXb-+U}$kIRPe5PdCg!3D5rg zDOgDv3^audhIu)8?n3%tP@t&*QC$JkXUe(UROQq}pWZOzD0Gp4c3+&G(hezGOBac14)jgQFY#_X*sLG_DQ~KWqTBA#KPRF5r z&nG)5Z*}ShJJDyCoJa?X$)ZgSJjpL5Q09iw+N6TW$%+(8TYg{pUc$1VaVx?UrId?a z{Itfi=7!;E#rrpxorjo~6zy$~(d!c?v-uqudROJ2sBBh__Bt~uEbs{(*@`o@f3`~4 z+D-`<muY0&1nP%vO%z9lWy-)!j8L;k{)IiKP(`i>uH`lz8oRd9j#CL?xkS^`%~ zK%sKSqQ-Z?nz=QKueho%gQraIn04D?UyGkV%(~L(;!l@*r2n9YSc4OtOu3w6y^kZMe9dc*8&6LMUMH2om1Thk>Ceox0zKoOZMACBp`McL$zu!p zu}&`uH8Q`A!YCmLt7e%VI6cLsG3V|y@7GbqMycWkQR{hca6YxZac=xkFEM*Pt4;p! z7~_S2&GUXaiP@F3&hhY2eC>V^JWXlY?<%2oe(*dhB1* zjfw##i(wVyfS6hDsgMvepa9b$>7RqiU;x1pJQ)cBA`lL}I$>&`M8LG<7@Z)sCIC1c zWf}<}nVTAwYK24e6K(AALq-covIGCtSo!@GKRbq02|u)`WB{ixb;{}rmDH`1YE=JO zQN(J|q#-b>@JcuPyt zh-yApr+4XyI$y|o*4 zjgt)=O0jR9D-|>n5p5r%CxnSEwBUi~QN>!O@(2K!dH~W|pIep9ri50Xbz%v>DAn+i zOG8MHVo-8h;{yMqD&8Y8v%R$bqblZO{_Pr{0?<+~n*6Cq0A-grzTx8qn|_zjqJj~b ziccwCr72Aja(4l>QqB6wD4AP15395Rou((^p#d-l`Kp=dZP`dQ<|z5t=4dg-jN_dU zOv|49G_yD`5tGGdI&EzfyV+wW>Vst>W~>l-qrgp`uOlt(Y!l|aTS>#Elu;c@#2vob zp&HkM=j<#a+PR@GI@r|2a9_V_$CFH~cmHQs#v8YluDC`rw?de@5ABpEs`b5Y1|dky zr@dQ_Keo(0jPY{Pz;(S#jnc=o)b6VZM_)#D;Fc z^)=aeL7y+;6P=r{wA{;odqlryv>xwno&lKu-@r3b>j;-a18hez8N%74Ej@^EUleK5 z4h~``3V&{N>nT<%4H34c9?UaC=?#uyLV^FpaYPP#A>N|4c)}q7VjwkW5Wgh1Zx)9g zEJLFAO574{JiI&CwW;(qB07#l?n5sTMW4>vtTehfs-`kpLzyiCA9bV`epjNr2 zN+nRs^b?aKE5F7llt8pV+z(z!X2Gp^M<~Aec!#OEGiFuc8FpMuB_w!B!#fG#t7A{9 z=Fmu*#EwT&x<@sr)XMpcqr8FVH?m~av6+j`Q4_C~_fE^%;r-PjF~U;yPJQ3K{+_WK zp!+y$Zf!jfId{@xkhTU_p?FPYY|3h@`*IxH7}>D>wToY=f1&)FUSAqla&9>*qp*07 zJ%}_jic@yJddOjPgGJ9qwbs_*`JL(ka&ha%1~oIrGs=}it?pO57z2(>K0p&a?M#qh z8EL{AEIB91CBeG>>FCiybad8XnEOp^ivyTev44N$aQ#s*LGL;}otN?E%o5JN1?0AO zbvJ$apTOz>U=mv|JUYMt9=%7e#w{WI^wg5A&jQ?1a$i6I0W^-5SQv`r5+-|(u71mP zq0OR}ueV4hp@4PQMzB~5ArqSyV0G)$01z2CC@6@&MjKzqo2|o+DRL74n*JQPBCGuz zT=6>a=V3HYCQESdpokWwQ-wVevnf;tOb6{jUm&Y8bs!^ux0m*(BF-@*(wSE=TK>vo z_(E8ac6^Bj#5#~?T#O(8ogP!r76~ZNL=%q*7(vAd4{w091i#_h!v*A)#P$B1DK4xC z?xA-bzubmP1-EG9OLA`8Rs;fnZ5K$zZ~+JkaF`8DC!RS$M8H6Jmxj1`(doRg7?2(* zg@s#cpiYNC;z#3HBftTH=&AUrsXLyo~b-)JXz62Snbsu!sCj9Ig{znX&UC6>xQip51!hoTWat$>( zNj*>qIbNmm8K5v6SZG_9EKCd$CF4qA!8GmbOH6ipfz{i^G11*NNse=D@PD!Yu((e2 z=ja{l?Bw15-MM$S9>8fzF*exEPy?VSfGcw~YnxVM>E*G|01*+ONMMKr2sm1}2UQVP zF_omv07`S&DJh)Mk#bn{DCh_PDiQ?o1lT8GP~zdR4TIU4 z0qjKlJrcNa1NjPXNCG<1zOzTz=4Y|TaYO020dF7|4a(tIjG(kiv3N9`42>BpJV?7#g@SjvrffAx8e|zG@JxS@3jW23R>h+p6)>~mmIO@4 z$t~%WD~WOczI0Z}7n(&WsHo#i6qF7_Y`+T0VTZy7beQmIxO8^SFNoa+`+WtOb|ZXN zNBAgfXBS0;9TnpbG*p^ulbsFOGgL~I#tTdyh`OGh9-g04lb00?PQxcbt*s?g&t0lq zyw}iOfS#;GjLcJmzP8>n18pnqIWrn;ZKw=)Dl5xER@Egsx7FoUp(z;a z0KuG6I@c*=a<_g=a9i3g>S2hIa8#}5_AAR7?_beElAwwr+xxUcU#V^~`;R4AUai9F z{sMx2*4P0B5S(wuf)Ft*qE1S>xD<7^&;zZ=16K*^z4y(u2K=6rV{niSA_$))&CmtAJXKc-P*c}k`mFbruHZb5F1(M3=*oKJ;?L4sS zDFC$T#_*&Dg@V*XL*=RaHDJRsO|)bteQK7CZNh5S$q5?e2}S~Y$F2BVxv1&rLx^z_ zUQ$jdJ;E9fkPmBsk;_n)db&o#ZNG4vzqBm`^r4`iU^|j>2c|14)744$Uc5GqbjXpE zoKRi}bTH&8F8}+zRI?Ozy6|{t!VW2rix>Sh;U$x^LNXsU{2}?S?5pj6@St06ev;Pj z)fVQK`4qU7rqfrk(W5$Ofg9DHbD|jJe23iJCRWc>fMW~i>G2d7%!)3%njLcVS`gEem}O>MdJh*e-JwQmS>S35GuNdDnp6x&e8 zda?Jjzc3z}SUs4G(GrKs15P<2rMlmF;FEovL&N`eBVIkOLzeMbg!@&g(~Wno;n_qQ zJ#>By!uHdBee&VW1ta zIn#TNp9XBP-E=|+N$#xjnPy^|bFOI~P$qm$3Z0*+s)~_g4>36OSZg|zY0~(}(RC+# zLz~d~xN-l{sWc_fn!2GeKhSbSD-g3#H9J%rhK2~E=dw=Gn&&6PjUcV*v5=$l z9OxVW)sOlCtKy|MXU{Ah4P1t6bDNf$YikC8f{l-r5CtMqv8Ckx367rS%bv;4*TLlW zT(Hq{yTk<}F!AO2M+tGh#W9b_OW5>b>0c>oGj3k)G|E7as)v{|-bC*H@c#ko6-jf7 zVBe{f{V_M)a@gT&^olmM7CeA<_ej!ijxT&-%>ZEKxm<4yYrR9J)06__?5rIPoBDLi zigdZ2pKbJNV3Cr6(T(u!sTK9&cip0B&F&L(YE?h7==NBO-yP<&Z1jYfojO*>k-cfG zzCXgXLYeaJ{AEsc6TihrD!Fh$v5xIA{ajSGX_5B2mCdE6AD4KRF8f)#=Nb3kkQ=^v ze0s{p0f2yv7FoPIcywlt6S>rVFY^B(YR$yg#EK%*hE8THNc{ROi}@W zL9Zyl0g0%%B$$-xrb}*V!@p}8)k;%P!~==)4PKBD4mTKTzNai9qQn`Bmy8Qm6f;Ic zf8|+@j}_TkLZ1p_5}vX|1@_AJYn$xu6JTiH`YzfBrsP$_VhDd=w^VI3zeF>-w94-> zY%4BS*LeeVvHfwS8K{?~vMpy79SY705p|^j`R_WtPI-Gcs@j#6XhzFgz6;@1))%45=_^fD+Ak^Tt0pIKA?FG|zpF%22OfFp!cs?5ICbAJuqgpCcIvWnfOwOJl^Ou>- z-q(w{HpbO0HMh4b`HCyH?Y>DExa_xGNo^0WgoX%Y=2GiM;^lU@ygQkb zR2vslbalSphpkl$g#2>Xf0blGmdrVvIRWay`^-A|xanTT*pNT|_IkCkKgs&k=EC=3 z_FgY=HLS`myrn8C9xGOnZf^0U&&lmaqd$3cZE5&gP)eY0PvW# zuCog*B-ggAYkV5S>yIn{XAOx;$HVx3zYCP#P0Np0sqa=c9+7G+Z7A(rCMwGm(4UYMdOd>oVE5NdTMMNg~vXAGj zk%i>+6@30mZ?w-RhX#A(3Nhy~1MZu8OS2A~WsR}WmZ`@kH|3)S8W6W71rIompkG2jaazm}1A2oq?nlJz zQffZL`ozqI(sP@t+Lu+Pp4p}>#Ir8=J!WPKsG?YfMp`>YlRS=x0%zq{lar#Y_xooZ z&l2N*WAL=mh5Yr$m8Jjp#wwqH53GlxATEQso_}Mbdgb9HCb^>F-A%VHAWj1Ki&04r zhf{94MZxWvVV~pAixxH8dwfr&1$%i-C`14P5;Q|9XI?l-7pVD zE0yOU_2I^Hn%?|Sa$0Zexbp?yFKhlS0s4gmrdJ_ildHn}a$5^lYH40^{W&ANolWVL zY?;XYOI^`M=BQ^@rzUc1YVN^y4(m69Abm-wUb<4Kx{#E?H9O<8R=x;Rz_Gdro`wD@ z`E`%V$9Mkva%b}EjM?%ZPV5b5(ySJX@?sV2%4XgrGwnBfkR2v7o@%VdPbo0D?yhZL z9+~904VjqaJe8$$p9-G+V${YX%zh-M%Mb;?1=Cp?&jE(;)q zkN%l%oUJDxw8=MI1lN8=!^Qp7H9-}`;6aZhr-B0$mu#)U8QSZz4`T%_3xqcjt>Z$g zdJ}BsWkGetswn5B8-Axd7A`#TxQajj*t?HzHv7|1=YHmv6N!%^bzQgf53h!2=0#De z*?6_kvs&Hf#J1IBYi_@NRFCDq_$YF5bh%VNPZ5x>CK~ZmrPA4WX(h@pL*+trVuwSQ zE?&VQk-wOZmwCcyfCGgt;F%$A?-=@pKH}L;}>_C-hf@EINK!;Tq>+ zb@&y)-CK9CCCxGLIkf~9Aij9BskFMG8ngUuas733bbpHQ=^saxUGn#~HD>0uf{2?J z--#o%*}=kGEIMD$#cvwT)cq$)en9}Hs6cH!d<&tp81p{kYa`V4PyjU$FVw@@Q({kx z+%BLXub5rMOfGl-0!{$m#^y%BMp3~GQL8{}5u7mx&_e@&!>miCgP8p&MShF|(%SJ1 zitFR(!A?I$ElY_d`blT#x**v4?DvD;wa`w!*k)TP?AA5hHZ2^iCOlPO#f(umc`25_wIbKS{>_DxVb65Fw8;e5;hrwJ=Xdn_S0a3EAR4!0w{{lEkZhkD?Wp*EGW5 zl@H+^$0oO$s4Ch` z089cHqZ-&JLcDz{b|L)u7207Gt!rX0H<^zsYh+mXHntB5QWj0_54c8kDB@BpPBbV_ zTfkhLiW?s zgVjbZ02KgW)#-r|G60bX!PgrhV{TWNbyk}FVt1h#oC+Q_T4q01hkATIljQg2c3hJR zasRkXn$~!Sdvv5&{Koic(f8ZOhtMw+DeG>I>iyuLg-)g6qxaNNF2~nuAAIw@qP54> zy84j)nQAZs=+lFDYva>jB!CF(b2Fb)2&NfPcGALknPj?nU z0S=pkN?OKogRZS0$7D=WFqa!(&{o`?pnHKXeMAo0<4Yw+HNOq(X%0*Y<$L3i+%E!h+iJ=ko;KhXgWqJs!0_=jQp()digbLGQf-3-YD>e*$&FL* z_?6}bbmpH??I{Udti)8##hPt%nQd7*c^+nQJvDkG1Y7DFnVOA+7{bX513M{2SvCUi zwEY{er%LA1VIgpDBp9c>e=m0`SFLey7DuF4zI(j6<3$VQbmJXWP z*2T%0HLM6!@b_d+$(V4)4}ui0Wp5A)_*%GaS z4WSTvmz}8;lHNXEW$o_tcW{kCvE<)tf~Tj)n&-rclA;_AdFPIg5!=@zIx4k5!>RQi z#+Eu=r#&q}4t-9nrZ~q``E4k0P|6E6E;)>Fw(#9>xYXJeubTTNJ_k=@)rk5Jm&ymb z*MTf^$;L_n`)g=S^d^5d{ykuLON7lnZS2X1M2bE;1x;CwBQYJV7yMli5D$6#>Y;H6 zjdr^3a|i+3QV+Wb0f5Qsr%&&memjQJRqeiUe|R4~LX_wPle~ zU|EBD5Avk68T7_AiruM>6U6`xZr)boN-kug9A~JL0&=A~$uMmsav48UGVxloFelIS z#J^X%l!kw86q1+6=w_Et9!yW7qR>m^(w91laeJ`hG9=9;(rH{~*e%e!X^Ko`m)q@# z0`-w<)@*1F>jyi(jBotdRbza_HC#o!t(j3y_TkIoZN$Iys9S9zXtl;3>^X^=tAxqO zR8N&wFwVu+mwQD_=dj~ay9FTmnF+z8JElx%^J%zqN+d6l)MM7NWDIL_dkjgB#{p5f z2MpSGKh|8h_@%AwemSHnN8?MaTNi|g6iX+Bf_f>?H1_F4ScnKCpp9~cqxO$KBn|*5 zbYVgXPQx1F1PYo6YxNRlvdX+(ia4Q+?uh8DfY|YWzk7S4<6QRw2yJ`NC#bav6jAnY zV0czIIR9h`*+BaEShP%#0BCqIsG{QJikN^+9Ciy%(`4>GO5OG8aW?am4U(3U;vACm z!nASombqk=(Hbl6?WT42=!)1&Zq#{cW?S!#KDwHrTlNuv5=vH%M^daXk5VTqeG$%| zOm|E*ANbOnN0}goRuOJzyYJY79kU-?oFux-@)b*PTT;7Rd5|n7t?|)d5_9oJ@>RMP zHmYjtb>jJ|{3pbB?gW1;JmP;9Zv$;}S8|dYTQT^8c?{|L4Nm-+fNku-E9EbkmfhtS zNU&AI?2Tr#@7VQ@tw(hEL|?a?`u>oj=Xv{$Fvsu(LH!>!003VjT4QtvlGBuSk$0`r>Wt7hSmMpMqx&C zJ*+hc1_UNF3W21ov{ow`b_6vQz-bjm4QuW_mEKn^YpExM&mP7OVh4q#^ZGesFx-Yv z=qO3S?>&(+PIP7yDf6n!^s(}7_KdI$8Hao>rBjU`0ZcX-Xh}yOsh6h@-fE;NQm5zE zgAjNHF3vpWgTD$j^s=PocaA3aUw!$K`MI9a?jgm>fZ?6bD2IZ{-w)Zp+a6O8PSe5c zK7DMZvcCJiuTKacSX%K`{Wg|zOw-V9z+~HQ43^5=hAbbMxV}64e>t0dq!tALU{eym z@U|S+u+q(}M4aBI*!fz|MLc#HL{M(!GU0IL8We0Apl0a(F7}gq)GqnX|GE00%jsM3 z<5lJ1kEUuT=MDYE`+;WrEi|J$rR@hz!V!CuWrc4Mij%SwFy9EdxhO0Yt=8h&Hj6SG zR6H=blcN0$7p{gAgwBEz`QBI?#wcr_Z0r41b6qe)xs>F3>a*}qNjxHM?h3i0^vkai zc8REPELWAZc=PZ0Q%^M963RZ?M7SHMKs7UXC=PIi8xxfmUrREeFmn|P;RsBVc1Y^N z3}K1p)Uz`CnNqmNEA+e!+M5>=!16)dLww9PQJp`k(JX=Z)_Yy5C&2bc^saTr6`QPv zA4<^X0=z-Hv80xiZXm|yrN7ysuD%a%vCdk7+A-%Q-&ZG<{ILQizOYlR8zJFT@AV>= z59%kW)BQBJtu7vJO>WvvmP;!Mn~MI{JOV_6&Mq7=Q&Yo-!x!13{lb05Lv-fb?wGL( zws}<(Y;u@QZa)v446aDG-^7$v{qw!{-_Vs1FhCnUo+l=DiGSYi@jblqdD8d;4hnim z$QjP3jDJ?4cFY4wE8Kh|!daZ+0WwG&0(4Y-x7VSiK;>=-(n6NEqX9ZR-qcPza@g6N zK?q^05R;R#QzI+P17Ym~rO4%|5E4O9)=ex+XI6Pdgs0YjA=HTkmssoiJ0JibQA9YN zH?PsoFY5p40Dw>!kGr_wh=a&8Azs!g#x@5%zehAhnYojdPft(3;IvlSN!~JARx^e8 zjKw=O-8)JM%dxoeX9PTOAupUMPO6)jP3d9UvuCuQAQvoL=Vj>E}7S5Fi)XxZMR?{1-NLrOE-7u&0le74I z&+@UTF)r*^Ef(S(g~sTy2OQS78P2M0U;b^>6LYDOwtqyravTYpY0ITJmU=#l|cuH%WSPuI}zvXXY+lm?9V?EEiBcQ<=LEz zs~WV9=X8rJKb3x4KMtEVep~7E!$p2#0;uK+v2CodDLrfZL&WfuhlL{hZn()NBBeM} z9^0;z{tre(QaT!qK87WfHg6}I2?by~{Q{5OA}$LRh^f?lDwejD*({c80B#Y0KZn!lSu6xx@DH6*PA z=qz|rE8c5n9-;93`SD;~;Z5lrslEIH;9V7?b@e||6h z3WdSAfo>`3CE9~pxk|KeGOH(z+bb>bQ%9X>32zAk74jp0_062Kg~=5i8Opz`5Tro~ z0CBGA@Hv0bCr*ck@VVpZFT7%{Q~1@FSHC(F27kKmwyXhwL#>t`9RL8synBvuQ4qAT zNH;qSi3tul>Z&nC&0&0B{^x1nIc%ODq!`WRs1YcVX|HAH$;?eRU7|yP#K`b&EG%zE zg5iMm2dTr5mO8c`Gq>2v;G2-fkueYEFTItyaBEjLhsL~Z;pjyX)Q2O#%`3u;DxS>N zOoP+Y3-5!2;kG%b<4K8R;OVdibrWHs=!{CLmljB&O3K^a{sGrB&AktM*+6gO-o|i( zE&IK7*S6m{SaY3td6hli&0!^@_*g&okaFsxnbpRXdU=xkXN~jvx4Fg>elD!^jP$09 zE~D+2@tvE8Ikt<=>X{Jc64^jL8dKoYr^>%?hIL9X@k_P&{l@4jIbfjmhSs5oDXX(t z{bMotnra<;J>C+1>u|#_wr2-VH|_sY+mG$~wS#e<<#w1xs_V1Us0CF2fBFHthzaeuG&d(gbh?Rw~LQ;@u zX@bzcX&vp79St~bqq#2lX8VL&JlE3MTeB#W0ksl@oNHlB0o%iFP{c>%c* zKjBt_!T@~dg-?)_uiSz@r~5S%8WjamDQvIRH3yC9awPmmclX)fun7Jh3H@&5lqheP zN$2`+n&6_d}IG1CJiReYLnMGieYgq3!owU_g2%waAi^>tm(bRdlBOIil4ot z+b&Ddb?k2qE3SIAubMnI?&^+Rj5|ZderUQM7gyEJ|H#z6Q*_UHJ!@rX^zXTqt^MyG zy|MFC@*y$3#m(E-3$H>c?}Z%nckkOBvWJ>V+mqj(b@pc7bUGMRyE`1bx5%#iV*K}K z_Yi{wu)Vfl^!Kv+8%;fj3msdrcZqPyl(#V(u0yOg(E-(crqgiKi;cTg+={7z$CV%~sS4wr%s3}+C;QUxs#I(A+Du3huOfNC2P?Py^l)9%i3*`2Y z(1c3xi{XdrdapPs6=X=Ltwt}z%W36OiwHc zLcX2uFD1+q!9JuQBL|-lj+_bx#|rblar%ay(3U!SNUzogP@65ilhB+8c1KMFO6R7e znF7$Hjk&scP6i1@@05R7LMVjXb!Wb_Z+#Gz_fI{p^^&o2)@IqoYr(-+l`)?@=11~I zCBGptpQNF4VxF9zr`mAKv29WzT2RBOT>Z?4+n?|EZg;NkKRt2+K&v$S;bZ{-m~6GX zRG0$k{c)eSOCnLYI9T8C#UcK*3mW?u3QA=AG!=8DD32B`R`eI7SWJCgH>BHn6CLmn zBll}Jm1V5-*FK%6HoKXK&T-Qzuk&1g`a@2VqS@oyu)Sr9;eM_AUAcAslYc?~tJeQN zC!JV#SBXA3wLHAwd=gX?457-u;3<4eb|J~&jc~HzVm53f#Fpq^e>hmlToYHD+~2Mt zBZ5XgL{RZ(d(p692#~-YoPu71oSh>}R-4z6COeL4Z6h`jO5f;m7fW)$u=8FjdpLdi z zK8B4cTymYZM|6CkluoogHtfjBus`FV1?1Ck|?QAn*utFSW z-o1;-YX806wf^KcY0}>DwC8*E;(4BQ{n6wZRlrxIuW8Wu&7x}^y8GwHmxaAmUo zlAbpD4TCO|r=#1)uZvICm6fX52Kw=GML3cq=T-8PF4o`6w%@nwED(UK?YMb-mfa24 zwzxo8V&)A&{R;Tq#3TmY+*)&T0}2iFI4D?^Y*OdRxF%r!omWE%f`IaP(^RfMj5p%J4)Yt)84*#Yt!(Z zx4FYV(`i(2rE{fg@OxL~EzABHRoZGYT>lSk0)!tD-B2%XloA@jQ;1AQ+4K)<$@BVy?2Z7b`&5aJX42`!$B zCCTe`6J4IQt4rH&cS>ZlE*CA^j#oqYuR3Rv4?%J13oe%p1)KYThK`7$xa=TL9B z#<*7Uy&TRLc;H*&ul>#VYVP{VZ~7Z>n5v5Y{n353pBU13s-&@A#CeMYI;b6{@*~yDhG<}}k99+F(HYrlu7I?P)B4QDU;&>QIrHKL}>NQDeDzW^uF~(~# z)7EVD;L6G+iCPRwdxN{lY${&9ZZbjU&MfpZ;Nm`yK38?s_%NGZj(!o5u-ZTUlGD>> z`+>}E+I?DR92h|rHVdWb8m`VK@_bWcnYK#|KLq<6@bs{Hc$NSVL+o7B37`hQI}I?O znk@1hi^Nod#ye%~@?W>ZKLF~exxNGXO9clx5h}C%dd-Lss|s3QW)wQ6gXGVs z$u(WjRmTl94-N~Ckue*oZZoV5vez>m+&y>}WN;ySJ>$~?KJ!;9-XXxIgeZC5*|#EE zzqNxg0yQ+?Js>r`w@L&Yg%Q` zR!^{{vkb#FGcGx@Pau%BMccaAp-<_-j=)(iP!|6VkM?{tfAriGP%74zEa!M*pNu`K zzi*s_3^dPB-+6n9)R8YV5_(C0)#!@SJ1zOSFP@MSxBwz~$=BR<8Np&ybhY7D)m*b~ z@SS$x?(_ad*Mh2u`JTLv58PijMJQQhKIGrz#D^!*AylGZAh;JJP9sLJzl_XU&g71M zV^^qBDO>{2O1jdt)--8F6xx{wrI zD4E2tOf{lT7S5hG)<*}5R;!7)RO69bxv}=DEM=KCP^zA2zDgMxV^(>6^6axk>sT8? z>v`0iVwG?djta{7A{|oaofE~jlU}Ouj!ubxOzV4QFVRZ{4(woZd%(HH3wkyoWwOSv zdi`3wEK3eWNg0$lXDv2horvM?R>$VNQ8Sr6kG*SoS0c=; z62*1SYW86!fA@y=>CIDHL8ay?7$t<1ni^{k?e)jsDle8*$M{)V8AN)PG8GZ9*}v0P ziG{1#jFDtzA!fAcbz@d_>q1-vQoqsyysBpo(DIG=)Ck_^2KUlPZO6}C*A@A7W5DF3 z;KiZ%d-b;i=5e9#5>*X4KKctR~D@qELg-x&c`LGgfdwBuW4q zc*l{|6_878yhE*a3#T z3YIlIz(9}z26uux1b2cB?(XgyTtaYncXxM7kl+M&*WeDpgI{vaz3c9Wnf<(1byauO z-~T5&h|}xB|M}Mm00|1NR*Kg73=;|^Wh}V1mMVfq@sGNMIFE4%MeOB@r5(|dsPeuQ zva$UBZR?8wV-cR*mn>T=ix_s!(&fy0VJ=^Mb9=CNBc$lsR0t*U1D}tU^5un9729Y{ zF}}3H;Cu;dK|qyZKQVnIbBugdyua>WE>y>dVJD!l*w4x@GI4?N1#=lEty@8nW47dh zs@BPdXlZdJS1hIzp83Huli0h;r~%7g%jDeQ7?0g~Qf+PQwAFP4Y=Zu*^Ht(HUQYWQ zsQ-MiBM^)vO`R$G8ny28w9KG2K=i!cX557Qmy<^l|PayYzqL1e-nHfFIcuBap*Cwq2^`jnI4RAG% zu^e%SujHVYMP&-toh@=h%$k1N%jTJ{osg+E@-O#X0Dv{xOEw^)41eq6YD4mQWxL#W zt7~`C>P-6P(B$2x)aU%@8<~@#ASacHvc;^SvsI0ptjn4!L&;?TDV1)>3<-$Q-ejo5 zvZ$UPJp#p5K_QdL@`-{ppIL?> zkH&c9TbZL)vli0NEtbU$hLIHPp*K}qWa{Bbk{|JkhJ)J}5ua1G>SLlK7{WK>D}xMk zJUJHJnrz-%rAoBpHcgErsLq_ywya<|B2)YtXE}xfrf}`ai0aPhJ@&q_$G>xG^ZILd zFDkFMgNN#9a^GNgPmzYqQrgcOZIU8aKMrYZO^dT6hJQBr7Y0$fF*JMy2ZL>f z^+O{5$7wDUkXSE%e;=CWoOQ&O?}b?yQHgbyk^F@_Xa;8sdk1dQLlo#6T$jVIK2R7ZIn-}>LLW%U$a!1JSnYQ7n>a{n; zk2KQkMk>2NJjPYWMoEcydAU#U#c4KVVAAiX96XM))* zem6LFC+*EVaSe(|G9CE8Ll;vwLQs@y=YEjYqFWsH@GUvqx}YKHcA$z*;*IK6Jlv+iGi)zQ%7CHC zWO;+R(6vV=26a(f}YwKB>4^QgO08ERP<+O(v$@UJ74a2qCwpeQ>DJBabh_@7! zy7}v{o%pnCy^(<;eS2R^+f~I~Nb1(|wT|Q18y5|Q%7TrzHNbKjUwe2GVwRujV&DIW;xHxZAvUkk6t_KPv|G7 z8Pkq@m67W3T3Z_R)*q|@m7lzL-)THYI4muw&Hne6C$Pp~;RHlPXG?DVVsw~{Nt&xu z)iG(c%xc{n5Q}wiW|gYlIB^Ur1`l18FQaOfvSx$iCca!0%t z=9n$pjB2DwH0F4e3m32$%HjxNcuF3lvh0s6rFKQ@!*D!p zUj76h?3Ie!Z2D~pDW>9BKO1g(?C|kGd9zP*Xje^mJKQEAzvC^~Wy=f?N4(^_i_(vN zxg>?kesSe%=NC<+VCO1ZPDR|M7WKy|Q|;^+{IabwNWZoq`59f^D)m_14w9>#^ag*-j^A zypsAFU!>J@KtC`cNmbjipRf{Ege>`kl`Ar=zdl+F4lyoEsPs08UqJwrN;0CYec`IWGbX`q^B>6l7Yw#7q^<&HPisLJMD8SU8~~9&xo@$u`>aRC~$Q zYfkf{`^;+XR!;(3&5pN{FrULIYzP&OqV-skb$1PUSX#&5kaoe=1;nuh@v=rRj$_i; zA*Gce{mq8SF;I-1Babho;|(+1PeV*km(7GLAYtBNB4#2}#Z+B~aZxgzJCH+{{ch-K zKdMrDb3_}rF`5@ix$e8^ecSeq|LIJZs&-Yh5NReWSxGdIZ?QSQnJhiVWlYKIAMl@`4-NMcKzTbfZazfgr7!i%9+(R2YZ_77U51HSDKi@I()`6eQO66m_ z)%Uhh!^gb@p_?HyF*$h2ZvEWPx(Tx)duSay_G9x5a$)iZM(cChYSdQTVkS%-EQGOr zfA~f5)K>7*$1I@uZl>0c?AR8oZdWmyX7If2OuAlQWX)OP#H@}=wuWv*-0VY|`D^4T zLn=l}=}d;A|1M}=^Cm5r-Q3`m6}nT`YMn`h#TmTlZ(eO1!bl_e0siv{!QlU9_Y+o3 zFbdg^Q8tu>8HNNRm09&4`^iE*BX1~LPmhD=hQeWV#>@Z^_?-8HMWmA;F6~*~9{?$- zh)8dcI5Muw66bc5W8YUhpcr(rxUDGxt{QHdAFkm%ti;bYRtbBNKP3Jz(*m{~&6`7r z%GV=14#ziUY3mcl)?W=2obl;gNBSw)kly`Arc77-5b!MCXWtMgFeQu1q4-lxm@L8CAL<8@@m*4kt#D4QSwXR%F{K+ZDK#*_U_a5bHlgZ?{_U`y@ z;%E=+?Cy)kxsj+7EkowRk!g*JbulWvv-)cb4wp=J7X4aljXNRJHDP-@{-$%^w~K#j znbNMu(aR^_$^Y%0?Rnu@-!+zGR=*)}Gr%HsYe9g@PFkgyBt%olf5xEtVMRarlaMH> zIRc`UP*kVR$lbi!ASYTe{w3|-b?2PsZtU^Bs|H$0I#;hcD)wZ|TN=8gl4XlCejtv# z$TFIErI_2yT1bsH{kZm2Pc@U%_Vo&T#optjziMd>w$YhPKHqD*tKR#&BlG1}f6}15 z+*K!CeSWOI-b?*q?W#TX#P_d{LG8xdZ89+Py3gy!<5{+%SqwpA%5BJfh?X;`UA=Wj zCV6=nTT6Rh4S+~U{+;eo=gZ^#N50~ku}tV9Ec%9CZDa;hf5Qtpv^aph{$kIpN!u5U z=fM+>YGvla?TowFd?T{x$Fz6wCp2dzX0g~@KhD{)#Yn)dKEpmXiEipkMthb387mAT z`dXuWC=AN;X`C>vKLacw;blsd$bK0FBuN?|W-&`z0+}PDC)Sn@QNmIWr*B25MUkf6 zYf3{N<=&tJnXZ$Wdz~rfls1R3MpEK~tg(NUjhzRh6>iNI_0v+%JV}KgOVXpAmkKwp zsFe+w7{#{Ms9>M`Op)(g)zxo1?@}a%`}qL2(7kuz@+|hr5l^9&SB$9nHRXpr)=}is z%|Oyvqw@?%${^HaC&TDaF+xSt%t?%i5wj&=`hf*H*M4yDY8*;7?To%OR=T%Xii!S8 zyXU3O>+_OJrt>GZ!NG5ZadVq4;uof?CjXLlzaQ}0Y~e&)>{!=?Zk!sC9%KEzd>74a z2_T+yFfde^xV7T5G-ne1I$CuRbKEr3Si7>Hk287dDd&|g?sGT?)ViW({vEh;A|o>H7bmeiF&`059}25JT* z4N88|Fl%v(&bbdVCjo`TDQawI^%4VDB;^Oj^p~@h9SjyV7AeEQ?$OPM1dB zq_5VWc09wlLjAL)-CV9|L27pg1vG~#X&KX<-wQ*5aeg0teI|x&vJE~-2qoqn-(VzJ2ghtf-&K=EM~)6d={GGVrlz0| zGBD#f%CHlTVFh@udUN21rvW=efhfp1bil9)h~a_8NDY~FX$TY5-SCTya>9T+B%c`| zBW4Bwrs!PuwlK&QOU_C|DpR&}e3DVRU9Ye_)v?saZ*|$phx6Lc&S&-hh9)M^6VJ$D z6E;W91yaxb}j23KUAtPEa8J+LMP|TNHwd!IF zE52|Wep~p{RGG1IyH@)#k@AoPzd=9Av{@>k2^A5FcG4E&2Xiw+ve~nK$?ZhOQ->c_ z!M+>GxkCCXyK2aDJ|Xbu;%upUwr#}Xx2H3iYDoh1G9+5SX6IEI1<_6M$Cc{36dYZ( zE7to$4h{THp^)P%9#~+OtJ#O&mC%?G=@{nX5`mn};d4EDVPoHFf(!58hVxT28MKFP z-|H9PH!=t|9&!*t6z0B)4h2VhClTCq;?^(OHh!0vjvCikYIaiL@wRRwJHI}*lwmm) zMU11QYvYyGjV3~^rFQ&dZNu+o8ndFb83mER#?C7~9YW%1R|bn(Pj-fh{|7f4PS37; zy?y=rPzgQM1)x^ETWt`Ep@=yIB}arqZZ~ zotI)&aH*L*Sgo%=Dep=nCOJx0Dk5ATFq|ik-h{NCMHg&Nj+HD|T@xiEY`0(Bd>TQO zg}0VufsbGgXWPq%#UnCi; zMm_kWAmaBRT^UXMNZk%#p+*J~F{F!F$|7gz?-dLZN5S*gT4xyyF4&nDoTF((=1^JJ z&N?HWyFZ8tRspmK)EPqH)f=PmX&B}Jh5sVq+7H-bv}hwsxMB=Fl8cH;i=H3)kH%AO z6IIb6KvPv^ZHzz$3I5cw0g^XF2+8EigF|8imjwrWnj*1`Yv^VbvrFbKji0U&y+C?B zEpw?%s?7g)XX_U(VVIjV8cyHe$c(UbQ9X5>NUI{qG9veaxD0y~lNL0)BWBb0dh=H1 zdJ}2;?|wafswSwq3ke&{w26e{LR(>e8*6J(>kh86E2jG8JTm0kJ=y_mp+yFWOmIY| ztQN#%L0xPB=zeto0$)|`?bk_$fzC1pBP!fp_|9h=Y((P_=B!8{5VB06Kl5$6-(IcD z_w0>-sfj;&A7Z9#keJ(>oMOp<7|^W#-rI@BV}GK5122@~%Mhv|p@E>yt!?V?KZ>2$ zclcvqsI`0nW0CR)!)TdZk|I==At7p?Cm$74JHaP4P`LTf_sfJ9APlPxS?Ri&5Zfv; z7NHckSt7}~8ik?2)fGjt^Rm;53?@?~NS3YaUfDW#DAlzTe`+$9Vz31%h12bKYBhus z3MG}KX)4`7WRNvqc3RJzMhlw6X?jKc}mUU^56ZvP@ zIJ2Yf@mxlty#g#kkaq)HIw36(?~&NQNO)(p&ApR1qzG4Z2S;j+L?h9s1GQx9(T~jE zO~Sw7p6+V5(E&K(~H;%dHi5zNa(;=ij9$IJa|Ig5ihPoWyQy4k*L8{sZi?u zmRfTBXsF`-d2z|;S3Wqr!Tu%iF?jwgy5okyS#2RrF<<6YB4~z;ZMQet?T}=wvAT?~ z1w;^(F@t{Lsu4E@vO0@}PczlC+K@4qz`Knb6~xs}h0EjB#js&m758DLb2Lr3{J!m* zj9_`60*{3lBVB7X6J~tp(27WAPk6@u`z_iHfTDC%clZt0C)b2nUqYvi6E3bE#nnra zBmoJjpP|16*r#wkr={c4D87i*g8ybPEd**CfmC)aKKdsKf{`7R;HD(8fyZc4yh?w{ zF>SmV+8EAVZ+wi9a!@+8{zlFXZ1+Cth<)^ECiMv^G9&Myb$#gznl4@VqKT4L*!}l+ z+Gp*Ez^ZftiikN3N_5$JF~URMGS{d`?(eybRCEdZ3F{@t%@_JL_L~u2M!=pEkPJ~G z);i;nAD7zN#YSt?dZiv1fC5bdt84c%5bQ>k!3M*=fNzcaVRl!@z=f1w$Vc zV9O{OS|F&@t0r7-?gC`r-yFA^@_jcwoC3A99((!$4G9~rpNd*0cxEEu!~ z2v#>-Sxw;NV80r6I!WM!e?c^*q^^^mwQJ&4Ei@Qkafy%;r-$=~g;=csrHmAl;=IN9 zo`lpi-W*@f?{Tieh;ctC6NuMqF1wQ2?B^b!k+X+J~5V_&7jj z=m|SQH5%Q|63su)Es|hTDFi8LE3ZJFTvcJ`m=N=BcnmQ=0D*n#Lm$v!c_}JJT96C$ z`U3$?OP>Q=BgZ7@6REiCK37_76)|<9NHbTPa(w zw;@Z&yMefMx`^1sO?d)S0LqLg!)KK%3iqjttzo&q^!MX$qcRvuiXhj8p->3jP}NMy z$x!4-;O-@!xFBWKua1u6Dn#t=TkS4mI|*wWCZ0D}XB{s<)-e(VsQY@N80>``9&+Mt zKm+_br{GaG z`J<}VI*$9fWkM?vqp@PPq~js%;(qUhG$(!jk|jU`)VHi~{?b z!f&RiqeWvMlU4Av)}swIAi}E-PyZXPC~0M(nSt80>xHnkBA>a@gk=2V5pmPc$QnB* zv{68!u}C5ctQFz4aCx_~6B)o-kLsucIeZc@ms%#bjn_c^0A(el=rmC{a_{-u%uS1w zmozX&Y2~>#Hc4u$B!jY-DBlMY^1hMHGuZR{^@kF|X)9Eae`{L!^R8WveNju^XMS%( zH@D^H!ge}3dUa!c{cY2R?Np%2Eh{XH1t3Nw4Aa;57|XK!TJurHCHv-Mn@lbdMIHcI z93TYHpcO>I-U=cO3)||qL`w2-d#$PkF^5qXi6khp4(jLlL!Cc^lb_l*pW9!r=57hkjdc!*`jyp*LLiT5C*-WoYMNR>>m zaJrmX{IyueY%Jw=(5Qnlu=((Oz1fErMiqZ8fEvcytU}8L7PVJpw`jJxU!%eIBKEoS zN9&c~uTOkq0$GU1%HchVk0lg2MFP>2_N}_4X6_5~F!5rPr8Ih~m^1){^?Ak7qOQ*; zC?*60ZtQ>I$O04xGp)f*luOd0@b#?2xVi>hQ#q7qOPElIh#_;=UryIP( zX+>GDXGNFN=?W?$v2m<;ux5~ki?vvS_&T)A==7G3?#ChO=EdpKa)$HRE3DF|8>gKl zHCuSl!=8?>w^`>kIswKFQeJK}n%nI7P-%t;kQaEUVdy+|7*Z+ow6whKS)$~M#||$d z7*<#WTR1#@%GGvszH5A`QL(*y*q#^$$ngSl=C2VHWqa&**F{Pcpk1f$rE zrGHK^ey!Jg8fy!?y|E=8|QJSC=g93+A6ul+IMwD?gH+z*|}H3@D(^XkIX5Blo{mM9d`=NPPb#U z!+gL;z=L~|2zO=FFxMnLE9R2kX%0$AY0+|4GiQiMR9aY+Jhn(wYMLW~RB739Y<19amEbTZs7H!k;=j*=Am-HjY!$z#+ZA`LG+ ze_3Fmdf6p?Ll++irU*e-lmrPG!pM7=0;o(#`vMz;<4$3#D(79+jn7ZCS>cerW*GsZ zp+XFEr91now&_;P9j^4C6JavO|qZ+acXGE1=m!cufcI&6KFJUryGHi2T zorx7ejl)9XSBV1ll)T|~T=kI@jx6~xcf{EgymOV-gL|8(&KKLL_+uuKSzI_-0Zp8h z4PnTxj|EGT^pX7_VHrM(n}yB?@{f;i&tCtp2@8rv?finId7r%eJpW!|bTx4S%(!S& z2^m!69lW<;ze1>#3gNF}k{Q^|>lA65xyeWn%^vaozPNzk!5ll??A(NKy$Mi;q=g|Q zxS|d!;zPSKM$b5Sz2K#sdOB6HaHv?$&rE6+k90%d*PPLRA1+L)J$MA94$npZlB2Jg zC>3d;PeRyMY~_^gcvo9Yz5CxI!hF^A`2z8)XVmT-oAOf=NVIxM^`liMI1_x2IM!sd zFB;|99C@~dV;83DaJBhb{Z<6L4240{nKWx=v^iuEpDNon@0EWx&*-h1eY;Kg;1S3! zESX5viPLKU3&<#lt?I)~zGFszQSC7z#QH`C*8y(OfTXkPi39{^RV<}7>4~Seqvfzn zE4fe76Lc5ZEZBB>ht=DC=LklAdLG}g>q0*BY@xT2LVPMV^RG0&X>okk-bUH&yuCy{ z`MS7q@$Ce+q~1<_<#D3(%a<<((oYt=*ZOUbB`mqJU%f}uh%aq^l-f9|O1=`=;V818 z^-kDb2}EGJPylFR;cUxf6CQpxn0WT#I} zTFhf*#1rLs`swmL$z^`h(K?c~UgVj3Z$1f)7Oo1@iqnl%inHo!7+ky1bbE5Y>r#tG z_p~r7!{R*ek`VP%dlTl#JX4A)r{r`@@ft3atRzmq_v-hY0N1TK_t|$EC}hg?c}AA; z`*93z&zK@5{%;@0W|Txk`i3j=0y5TbZA}?`vuS3lx|~IZo9CTeO5TupWNL5KZrMTJ z(n`V1$NK&lQ2m{ys9EPP;q6OriohC{j0`^AR(swwpaaGL3_b@Sm7QFQ+~eAwhDMX> z1O^u7?-kD=p+}pwkesw|9njCT0^Ph{R79(6H{8634W&@14MNB6$hy;s$E2ss<`@IjdVY>VTf{Z9`w+pf%X<(%Lnw`FLFRc+zyi=2H zlktd4fBM}!RExY?}vLw4Bnri85(82d{m18Jo(?dRl`vRLM~RKWE%JI zj1Ovrp}jf`SmU*)wr&-6Pxl?vbS`>4g+>Y)5wKM*{>bSr?w<26#s-t%W24H&9W@Z z6x$9HP!Pc47fJ8uiNWn^bw1!s9Bd`zhV$e5WPihnR&{){PEW{@m;TlGZFgvTVXV#k z8QpYa&Uo!G8OFZZ5DQY|BIUu&fp)-UqWSgacMG51>kf%{mLWYt4pG5XT7=w!N|4g$ zY?6-+g43S`3Ve)hy?9*AtsJwixL&GF4(c}BzPc4KdYy01LKGO$i%le3O;_h;+XTkO zSriaS3>UenW{Rb|ZPjt!q@hW5{zbyycLx@|r4t0A75zZ^Pew<<=*{7J|6n5Ch41o_ zaDK|9cl|KAqYi2wwpI#aT^c3AM=1DUct*`oA&Ag-z3YiR7WI1qzxps*oFR{snA+DKLpl`3TNsqR!Z{(*Eyha1&QirGL6| z1FO~P!X#rr%9~Z4n?~VO!30HfHHneY-J2T5?q@MWPD|qAV*9uA$LZpA3+VKvO<*Is$y0AOi36TD;t@m9_CEC*Q9U*-!d| z;+fyCJ;Zm5Xm-A?+dUO}XYyI=x1La2qz_@6I!cOa>uYd;13Adxap*mVNF_n<=Cn4? z$3IV>J!%~UBn!QM0>oGH>d;}=s#`>qSf=H1qvzaxYPYk*00OCLu|oNk{_hu_0wKJg z`_JBXB&>}fHFS28p;QT;Q_z4<|03bW4>)ePXhTc1qz*&(W)z%=u^y^ZRX20=J`E5E zP1Xf;52eU+Y&U-n`=B4k#vM(`sW_7+uO8kYMv$^lx5G6txuW&#htQ~IY3a0IB??{O zW}+jIjY5~I?l2|~`CJdJ*}~aKTazd^h&;i&^6u)KKteIJj9X>Gcw%pHOGfV2_la)* zq1r~egl=wfTsFTPMcm(xg|vi0*c4mUn$jxLBe$a)422Jt702F-d2EWRW%!#OBnqnt zhBj)44z!u9#vohYo(hh}A#_!+c|i(K-UFFm@>+cCvYle+X(bAYAxwr-MnF)6Jc>qU zOIUYxsN0>G|fGBO36?W@bVd z!rGb9d{e!8k9B=X4Tg_bF#UgTw~sD;C>5ZJgQ^cbDQN!0t0S6N7)2nGOzNXWQIyCl z|Ba9#6EWvPSS(vGy>?*`Xm)DnJaLn=`rXF@+ZUhq+ulZd&J|N$k8!Et=R{=TBnKsR zB1!V7NOYhbB1r=(7|;tq{~a$y)UtW6gY|m#AzDy%z1-IFV>yF+u2n_?W#-nBdVSZ$ zpogxdvnf_O46gcuaj}Zwj{BA27gjK?Q+G)1Z&8%V^sQ-6;7VYN|XV^Y}I} zW=_8WP%rRD$T5kQ*)i@prTCVrE}jrG!R%(4Eni9Z8A?H1JN#pERdcW%QT*D+->!X& zCf+`SJk?q+FefY{%Lw;t7sV=?O?xp14Jo4`qsAd~ayk!eL2eXi!UCGutJS2OVI)#C zcu`yl3vzOw@B@FK>Co!tHa+z*KaeA5ahq#Zh4Qm03^I`bFv>sBH4HxmCWh$5DSd9l zb~{VrN~bB0SFg1i@l}1})JpP1RaA$IP>-0x{Yk$Ytz&-l)(Iao;$obwQnI^#@C%z& zcA7=yw}`RPk+XtCmC_-sb?v!KQ`2lMD;>>!b-9WLdZ7N8OzUbpD`GAPfJ8+~(>N^F zkgq600#78O1~;4*O2^>QgaFMR;_++m77AJ|O)D=D=G+Ofd4a`ZmzdxwO%^(+8xT=ydBoNJ1{v`-fa!B<+r7Nc1KUZGu*UT1 zXevnAcdE!<_C3;?ZaMNO{n zoG=!i5%BJAV@WdOGc2wo_zEiiUnJc50liG#1wI6iW`n%dM#ib=j&@pd@6|yJROymh zt?MbMDjOsvLM9khE^j<3z28b+VrqM($7M)Ii4~X9YZ((tW;HV$iAZ2;=&Fo?HkL;T z4a89T8NcI=&Kkuwood8!K(ARW{?c_`r2D%TD zXb)DK(am;1cn&2;hsdLeFYy1$oA&x{b%to^hs=mMh1>pif4ev-tIOTz*Oo*Ih?UEP zb}4HTsa4@W0ORdtLn536oP6&dMIni@<8Ws(OY7X3 zSm~W%)EYdUEX26Z=i@CfX2lxDlM}&$kB5`0t`5L-J?8tQ1z+h{5pGwqBtwaCTrD-J zX)Y=@ET#eoG9pxhiWB~#hA^VW6i;ZAeowF7G=j&tYq7pRW`1a3Uqbrk@`r+BCt7W0 zQg@3Z4v>P+>o5J{cGI6Up%`X&YmZ1I__rr=kQ}=r*`z=%{Wm+oZ~%Jjl>Ljk72sB3$>s6SHhbMDRpwB%3=^(WUy0 zwM?U!Fy&9+5kFYubMfZVjI1ndQNL{aL7QRYJ|V1gc#X8SF|vMo@sSkdfKmIG!ubkx&S&asKf!R75h9zGJ4y@nJz$`M45`f0T5yYUr(9*YiHl4PTx&{}I z#vG+ipLWdM*^7-3t8$u6ldkHIPDAA(!@=(`>yiN%Bscbzx)lvWxByE^@lJD>o(nF; zO9$83WAyi0GOT7G18YS!d%BXx1M5z~`DQuVg&KXOk>i)IQ?Ko_^%v8_M^9#z+Krkv zYAv45qt%gc6yeh~OiAHsZyJLPhk0s<7>5 zQmf6%ybkS<`M91}jpgz;nrdD*;Xg@x(GT{k`JxJf>7!WB$~f#NB8)v7t*R~ZEuwI` zn=#rXa>-CB{tr>!Kg{QsS6(AuQ#EH1S6|~Ue;-Dl8GH0s9iGVyohY`;?zIz?>;W(- z#sbzFHVR7Ud2%Q$5F)zsO0LOdY`M8ke%vX zV1aC+!~!Vx;7iKzVb@fHA?am0HZ>XX%ZwB{2l0dIm*E_OnYPQe*^X z6;8MlT4DU^)y5o=e5?m}v|1{!SfO=0^b9f^hTBayah$vY;vv}RgnRCM^hwk>8-sNjpzbIHNn!uv*y>_wzuc7U*Wvc zu}IuBiL(A#Es0sUJ(P0i9oCh_Qfh8%Zw(us02mmngzT2}O&D#L-^jY?&`F>W<2>y? zG|S5bK)u=yU3hVdxN-cE(J5)9$~q=JP(?@q0<;X(w1dF+vzod6LK%;At67G8vc_$L zM9rEW8fX_cvk~Dh6_3+kH{Q3lO<-?H<|}LPo>?Crq$gQw{4iH561GYCZq=roXk)1V zM`hv2IchAloUa{PJq9zz2d1_9_7|!6u^+&l;&7dPaR9ksrwH3p7T2Ba!?|5!oC=m! z_vXsT7xq_~lIoC$CZ)5Nf~1oR1?_)1Va*Q~N_+l9Q}R(ktfCWZTM&cDK&z@4qwETS zo*kP%ORQEU64a~`bNcpHE{sV=Qp}LCAp{i^KIqw-=W-bF;{%oud|3k6u~4e6pVS6} zzO0d6NJzKKW6!g%E;~^^9d}!2=GzG*Z6loc$-?g0A8m_^6Twxg&W4T$2Rxx~ztzEwFmqRxvXUAe` z)yghl#djkY{V)xOx&d?)01VINQ=xXAGuHA$Cz|R@8dUPZo_H!T+M2-5jK|k5yAj2P z2I1Rmb!!5JspGrXmmE6hisrd-bA+M=t4FJmmBgD-NsX>gm@{0k6 zlprp1>B-|K0;9RdMljqiHK#i5zN`9l(UsN&Wz@~p$WqL$b~&~#wudvkX;!;#94I24eTr?bC`7IM-Meavd|*a8H#PrCrS5c-eCv7rc0iIeStvs|Iti zT*kR-S6vl0vbhypn54f#RRp#5NdmC&#r5pkhmi{i!HJT(HnAG$5JQupUm515WKJvG6&qPoQre^6^{A2Qwdv= z;eydI%E*ZBnUD~SP)>EAC#*I}NW$pSJ`G}(etGU{v;A}QeDS9sLF(^nhrZdy?x5aohnTQ? z7qUFl(|L-9PJHG^goB8Fuym6j>$j2nb0$JfIJl5cM5^c~I{X`vw-JxK4 z;JBSq1h)PVEXgs9NK19L z2A_Ib{RFTDRyl$rC_X8Z{NfWW6DFgP)`rPP{$7?Pk1`J8*q*xcN$5WOTix*VA&!X& zx2e8_aX`f-_6gk&?IK9A@=+`v()6+|B~S9@BQ5$T*8`N8KxuIG{n4Tv%D7ud^GL== z9gfR4jVjx&T9xaCU9Tsm$>hY_TvxOyU9v0xztMu(ZkyC(8K6tPtZKz~`K%BLbVaow zdyzfv`qJWMyVT1wDdac(!_Vpr!5DkW?@jbG6-W0=(&_LtZBnMi!ob398KEdDn;+?QO6y|ewyH|#!^E%CpEvd;2kQB9#2u!h0`R2q zh8g?;&_r?Qtx}#@81XA;=x2pr)`QGdw*1M7XDLtTmzSqMZVXItoVjkS>$$tT_&%!2 z2`Q6cMU= zJ=Ap+O;K}jzQ}>)ruZEJj+TD-G}*6d7T&u354VFPudb=NV3I)>2q(1+B{mu?EPBnY zRU53EReJS0{1Zm;pKaQ=b3R5DGwVTCWkf|h7%mkq!q{O~ZLPxB`8eofFifkree!@- zXl@Xeofs5Rjw-(WrDEQiy6xMA&zSqq>L+)m=DCwbdYQ0a@CoFfJu+5$!Wl;7h^2zw z)@wH_$AQ^^$V8p*hb0Vf4mvCOF3U6^#Wma`0#HBA?CI-Y0SQGtgWuQ=&QUJ_qgesoEm zn4cZ}d0Vjr0HA?F0PHo#7gbCr)k1I%JmP*LdZ^lV9n0|O_q|7rlE{>Zc5z7Di#EN;`(M(2KYfR*tJ^RTJVIbAvJv)ZF$QwgWb4Kc z@8OO*IBBvZ<9P4>*2f~A&gnP`Eo zy(MU*yoH-Zl`xN_$7uWVrxpW`N85Mo0pH-)pwIH=OV*F-$%GjCuRHQ;7a?>>@B{_j zeB)fVml1QEL83Boa{Qi41~JoK_n`!waamEzkq?U$v2PZUz(8$6j3NwPuDi9CycdpzC=iag0+-*x^o$X@21lIXe zU0XF8pUE&avZMKY&U9Zlm9CeP;(6E+2yi8r%ok`@th4kFV$;^=Ga89#0)F(MN~FJA zG7|{_Xuq#s!Z-PwW59|o1tEiJdp$6Bf_h>(O~!V?r@5|CO=lG{p;u62mihT(2`8OZ z4dc!ru}`(`)4&u2T>PEhgAK#5AL;~Bl>gmd0Xq!mPh{D?@@++AQzI#1z*=ckF;5+F zhFiIW5Uy4D<7k;;p3Ue>;f+~2iC9V))ASaB{kSD5JaGFEiks9!QGT8X+*r8fNQ9(N ztNP~^(u6f7Qg%mX~t{gQ)TlNy%X>iCCSKDeGo7}x81I9Hbi*z=}*G5)1`LTi!3-ul?;0j`x_{e0%w`@ z?_*2|Km08;(RY(YC?)k-dAsU0QMQBeL8vAMF?~y3vsBBDieJrb>;!cy5glQRxJC;? z<{3`+CJ#_(Cjp&?3q`5D*O>ej*d>Z&xH>y0_@r`hLi<)Dzk2(bN`QN0jUv6(X1-{9dVAninj2}gtzis+@Y!2G! zZSs`7-hS~lsI_{nT0TB{UMqoSWK^!;U)2-bTWekFGGwP{<#d@23)B|wh6yZt7pw4_ z_I3k3w|5Y_$DBhWv?HzAg(*I4YgsF+qWz16D?ebek@~;(h^rK0E&)6rCX1KeKN{{3 zIsMOOFwk3eP*O#1UB0>KOo~8(x*Ry2YeH3XtbLQ!5l~hw*|v`Kvm)DF`RCjuZz{W0 zTi0rJB*M+6^$$IxZ&sJtm;T=>}b0Op!w@?PP_#@PbWD`2kTJ}e_YFT^foByxv`1khw^!9N7f40eQ&#hxWZqq!b za6ux___!O^?5h6xj4YY_hh(z=L|JP_MChoT1Y9Pd;5+GS&{&yU7v4MpUJ2T?K`9ij zf20pOF!l!qiUS#0E$9B2gY#$hF!~{L*wiT+8q@b-N)VGYvLwqqHX&$X+A*vZ@*21V zBQN5#Z*)u?aY!wZ*K6FHmqb}CGA6u`&LKHstc3S9PNJz@A=I{sv2yH<*T!+md*!6$ zbn>SrNxMQ}a&s#&3LQwx&J|&b%!}=CwVpPVBwV%l!B;Jg5UsuTev25Xy9#Xy0ZSJH z7q3sb8L_w)^f{@CFe@`@7Dz?pF_)^)n9d6CuViJ;fj^a1P_xyQqcc@0M|e$zlw)QVsPlj zuv`cY4HSV0GlNXQi^NElK*@s9Bq$NkK(Fuqtom~T;i8Hzvith#*}Zn<@<_n0bxx6@n5K!bqJNGQ zWwdRF&L04Q0{{|`W-fa+e@J339ch$6fO4UtA<{S?a!CU*a9e0-X!SEJqQ;aaLwxf` zV^-iv>0DX)i&8zY>IutK(aN_gO6DwcQ~7fJNmZ)XZPvGHzEd(Aze5AvxqCV3scsVM zY=NdN{WL`KkzJa~^}blE4C7a|D62%1C{T@V0)M0L@_7YnN*4_--6Z^h5Lxz@%Bf+= zEUIGGqgP+5Mx8MWcA0dcVzD-!t&Yo(!&~>&t-G`F3q6+0CvdgP_I3H^mS2~3be1w+ z3IdcJk?+(MKC{BTXKcPy5#AippSq&&e#)^2Un9SpUXBGwf+t$YA@Im{Fb%j(SCa1-as&)U_^{4vlFDA1g^rEk`>HO+igaJ+j00@yF zw1nLM`@m$HfCk1_R3~Qu08zrLFYK%U7;SS^ESna=NQ&$Im$j4x!eGY)fkUG(40IIP zV}(i@g~O+U6wzCo919342@Ezkj3Sx}kwu{BmAHi7kgKr(;Gr~1#~7b%D;*!y8l31q zD*z`7EEp!Dn7U_b9g1CJ_A;-XiDqAi<0|^pxn%`RNTwgi)P=gRbo6bf-?kb+BnRrY z7}TeyrL*2=a+j3WD>~7b^fwOLXAF8OuVT(SaR! z;~1fH%=0vo$(R!o78h(RQu-!zDmaufc$(M8O z9S7o}P)rTP`lzb_q=Sj+BxVpWCxDh-P)Ow+?QwiOT+2G0!L6P0QBHoOXDy6o>?cqa z3YIn8C()YYK!Xc9zsCR8GhJ7C`QAU*#8OWDdh5 z0d_)Mg3vZ{Tup|phk`ioNql`ugi3dxpTivU_W|O?HoND!3QF>X5 z8O&jCwDbS_uw>Q%25@3i!z_JJNCK+wY2r;7!JAQyGZTSgimQE>iQGPn<4Yct6Ul%()S6CuIShyq<3wz@GD zV~{(?>3-Sd)4dP|zx#_XA4F=<*D!)gB};`#EI^$G6Nv#PWfDmQMmaUJ7zAN@P-zab z8R^(%9Nor%(jX>}W3~WPB9ZhU(-S3RWdv$vngkbo(>(^J^=Xz^lc8+XSUFdRV+G?c z@imaLHXKNr63Jh$zyIoA5lUCvmLg-~XuxEWr)lQcfc809(qZw+G8YJvMyjU&|FH?Q zHf5dNkeS@+tZ@}6MFnaW+z{g;;LX3}jd%Sj9N(>+cSVsqgPEKt@v|g)P=&3#%X}WrJ48ewhd%79Ch*9D3)A5R-tYh|+4% zvgnYcttzvjwFFaX6Cc#}9teSUOAEH^&pfF+f8%?0M5UzTN7WRAi+3As^zW!_IO{D3 zu##3bC|J|ZBvabw)$zCgnwBQ&xQ4!9=s1DR8-(bkqH`G)0(W+UMOC!9>TC%tD7}k} zxiIOc1Zv;=Msz0QRaDq9C&wfN)46AC;)C?|e`)8Wx|2Hu1k#duh;^XSr5Rio+}kFj22;F(I&LCh2qLkgdAOiiH_dSbmB+4 zERMM=YZ+R+iz@9~q|-FwW`~KkS>xw*9RL3Xp*!exwnT8{4D07_l$)?R>XUq!_01G_42~%3r_$(81^l|Lbl%I?Lu~xKu zkBvSn0;MFw;aKofs^m4Z7149-Pik%UFX-?8(O%#E$glo}5R#~xbLySq0?XVEj7;If zMT{&0)=Uu4sXj}bgoe6~)*=b;P6L7P8xxAgFd3sZHKT#~^5WEULeoM7C7j}l*p>B> zfl_m>NZ~U@B?i=cE2Idy4xnleX?3y^0gXipSuKP@EMsfS82HIs=7FC@3H-+hL$X=eoDqs>)b5Xuh;76x}SfY z(jWxWpn~PwZk?uRfc{`1RH_b02lzN52E>GjI3~LXKkO*E^2Gax6fitcmLa49H6GC+ z8m6q$os?5v7={1)kYxA(1gT`!>nT+5JYm}ZFCteH`8!>#u`cNbi7PbriOl#IlXBIJ zH5EkylHni=3(Y`li6ba8lrkb`IEEP9MPL*)VWEMb%MeW{GwDWVxME@3aO5(w;Pn{l zp)lf5`F)F(#UrwV7=z=Z4p!q716wr~U4DQ73M?@I2W@xs4~nDpUI`Lhm>SN`AXV6e zGKn>G=V+F{LSWimMK7oJ{4oQ<;=^i4sF3s$v~*NEnMA78bgyuB4=hnaS3wXxAgzsY zC8=)rjO|-fMs+Xd(#E6PI)U74FFpfiWtY-_$I#S)-)~Wa(tLsr;0Kh<2Fv&(-Cxc zQKPNuTq@&cW4XDJ?pfa#xWAu%G3$Cy8d|4wmhthsKI8rIr{!aE+2WsQ*r&4!zb67$62X&KtfbKC8;YtZw}||5Dz}4f zv{@px??9&FQ5SCeZllJL=TOML79og%m{=0PW!^x<2O)%6oW&z-o{A2Xx|UsAa>dvK zo+%R(EdkEd);UrY9w{S&0HLj#$k|wuY1eu@YT=HP3DX|?q1rH-iga5lsU?%N!k95f zR7@T?xrg6lXCO$S8Z9LvUz!#!k!iOs!E^;K`WCX0D;a8^3)N$FY#lovN1y;3@H1_{ ze_~i}C(?H4rP*iz4a^V3ptrP-FBu<#e*AHx)%#AapMCsc540H!xFC2LJ`90CLsHhT zTJ^0AN&o-vs58IR<;pl?BnrfyVUmNA1s>H4fK?reC<;&XoH#nX<=QN~W0Fkd?^tVUbt?T8T=%SscDpOU z;R`aktxl|p(elZ8rtJ?aBsfW!C2Z=tP^;>tu{p><*lV9DosGok@0`$;zU+iubdv- z+|ssI`;X!R1Hl<1u>bpzWbOe3h+)?2DIDrT!n&#@Vr3Fdb6HHJbLjer>a;hhOulVt za;Bq23HXcWsI@*pdKMn54|0p1H5&?$x9+}@W-S335p9fR)u9T97AWaeFzEcWjMJdv zYe;LmJXnUlfbo9qOvH}j_7R_XS~qjEx|d!uydVH~paPt&-}LW`7U`=kfsv9~4W{r0 zD?LF-Up%{V+kY?A{7KtRiaOWeJ2%114!>z^UvE#s_VA?nmp+-zwtr5iWxZsTm!c#6U z3d4!+$dwFP`iQG-Ls~M*)V>f;&OMS#YPU9C6z^5R6gMEQTmB90XUrA)FVJkKVU((s zOd6h9Nm(CAZV2Iy;1Zh5VtqOLg;Y|oSRsJJfOHdyPko2Z0JgFwq_0u5#4t@>nm^9f zzlR&c*EgFGfwBgX^4cK%+P_=YPK?Ht>gwBfyZzSW{`ho&)8?8&)~D(bwtzHL1uwU8 zR1lbQxNauLNCYqtaOMB|pk&$r1Xx2>>kJ&)I|53b8w*nsAyZkbq;shs3hDHhi8Nrt z4PcC7l)yL!!1h0kCC#?W-Ze4jNKsViwbh(e(K8YP+`Dhi_a6;t6}Whb2NSLtQf^EP za#Cjne$EEgnb~Hn21Yk(`R9DFptECf&MXg%gXKo?Le9OAER1*z2?Jmukh(_62u+X> zqc{W@vUGz80){9~(ugG#rTjA(GWARy?n zHjg8c1Elduc4czMIlVwe_7iy-!69~pijRm9AOV3?H5WGbZ&NVYJK3pvf+6^!>_z&? zfh63#BK;jB83E?Zq<^`=jV8e>q!8vJnkazg01R|db&x5gbj!%U?EkRJydiLsiwU?Q z4^9!pa~?v>$!fmcuyGKJ79x^k(WH)8ib=>3SU?0sV2DbR+iw^M-9%6TeBhBw+8G); zH*)_j5V!~iV1rj4&xt@6arn*paa^qPq(;j~Qxp;tB*qC7T(ULA8p?*v3GGcLi3+Nc z*~N`Dz0Wj-WK1Zi>TsMk3c_pIEOI(#FOAZ;hac3Jjk4Z!+=i-l;3r~Gp`x;W-A#Wp z(st)T`bp3r^lFlOQl6>ZMV)og{-);Zg)P>vtlDI?oxY-aJli#3fW$0?b=Q9d6zxU2 zD1OC*oxs6z&L={Co=vu>|NEe1{eT95Xw}m%On7I>8r>`-r&P(ITkNHC;LHXqv=khq zdVZ(t+jrUJMvhO|qNP@s-}wH&waWki#3T~!*51y7nVX55BN#`CED@saSb=#_R6sSw zdSL>qp7KEKHz{)<3y&4J*08UHb29kg{noc95jV~>+1XTXwtlyKl;jpVVy3TMwC7J9 zMR(<0R8`i9YZs_Jd1Vl02=)qEs3w|95ywO|tYczU3ZYOL8em4;fxPt(Th-Lat~#g? z%UA8ENR2pnsxio&hcRx&tVEH084{h7Rm!`u1waP?0<@BU!i_dL!&k-kaLM>Q=cNk{ zz2cQr_zR4AZZU8EB1#WoFyU$|%H7$EeLkQ6>hpDfJfXy&4uwsMfz1|4C%|ALLWHfm zZz(af0L@MiBv2kCW5BHza!?eY6U5yb3IV0p*B%Gr4ugma;TgB%XoCTWr==iB(S^aw zC4quAkYp}IyqA6=QI?wul;VLdNM;^CsBI@z47wx=0#ruNMM03QJ&05VM+@k^6f zYb#2i1Ppw|?);#}xl?$vCXCQ4bP8s^VQBucZ@w{x@4$|)LDL7)Xaue08H`$#PyU?= zuX?S`zQo$cv|Wbn&8h$a%qsu;pk(L(1sZ47>nuciMI$!#22V(fGro{ zaX|Db(na&f;80LuB#moKq0(B`n4*D?KZqKdDY3|xr<|xfyf0wmOFv$$D@9MUK>RJPY-#Cy0m=GXuNFbo## zu6jXwt`1tDucq4OVJHDUCm$HVs)6lpU7OI7Usunrm*$nsEP@;cB3i*W{`v_j!N2_i z)r4p_eNU-C01QPiRGQnxMViCL?2*d`4NNou3QihmKvF64sl)>0Dm>*oDxq=xfn2x} zChbIDSJCN|K>Tl@Y5A;DjSwj{eGWL;9?6YanVo@o^p$5)#G~6zc|EMhjgz1-$~1O` z9PxK9YH~(_d{S`LtkyR>rEhY5)%79Gm%NVLa!`(IoZ}9l;Hx@1v7TQWkz3^q6crMy zju9<0f-sEt6=AtG$bk09FWl>vr<7QN&izP}#~S+%4r4{n;D$B8^Bgw10a4`@6WHVeC0lKeyU5 z?PQn%OIm5Ezq@o_F*QIq8i2Yj=^}9XKtm-4L`6n$r9PZ^b=kG5}WN!4#rr3Z?^Z95g2gxuVdJc*ew!VKy# z_#kRR$7-*sIkFabnMmwz`ShWXCg74wb4D`mdfe7bX9*2=KmZ2>-2e$DoBiB+E9E{E zvD!WtC8DL&A`HNm!8@IPnROqp-C`+g+H`mb(9ssBeLE0nB=JxX^(K@K5sgr3#%IOA zKyrX}i!CLPcr

sKp|t0-D0XPT#KZ=m8Kq0O`qrZH!XcaEMT-2@*1N;cHu!9A$Nx z6qf@e0$~W_)?tA06#ch z)Mh^VP&fXIOWveY00k6CvShMe`x_ub0zl)8SqHqs08kW+83uwfu*uk*FXPPgxDS+S zBIP1B5X3{uGzS18K~a_n5AG_{1hQiP`;cV&00g>YR%o76{z*%5I#e+er>RA*euL3GS5 zTu~X(Dz%!WA0j9nS)fQHo!zqx=6kXHlO$-G8Yf!$U=Zk z373v|%tvD1(dY}^-cV`R=hIk8Yh^4_m92kwwdLRHOfTVpQ@qVbs#D)~Nv<%n4~e!pR+&#^k~Y{k(RKPd zf86_Q_*t^aLsBS73ow?2W0e6T+e8HJ|NEe1-T(xmWz}m*9BM>i+D#ehHxqq%Rjjbh z=>rC7bTqV_*4~T4gM+In)HwoV1rP!c1PBH#51s9T7!wQ;}Y%GFdUfSW+o7F)~mn^!(YKo;Ibf>oX+xG3WL= zko5M222zn$X7B9^i0|_=(Usy9r;oJO|GT%}UDm&|h4;>O;DL(oMU@p`?jzegyDXzI{RheI6Oa}NKWV;#5u|Kv~w zIaEo#z2BB0Ejf@35s;^eV5sz%L53}0fGV+|EXjnRmO~Ah_h_-0lc8~ymJ^Gt1&0GA zOQQ>x8*EY{eHu()vk<-FL~u;I4U=r)G@S$gve_J^P%#%Q?JpFLY#8R%ojLus zH$A;XAhpt*@oQ*waI}24$S)ll+FCB{llL3$UhH}O*|~lzw*Bu9X%ar!jH~kiB>*XH zlJkT`J&Or8jE{NXdz>S!=uH~xYA6_C57S&<_4jAV_`d$MenSu^HUa8=BuR4<8G%`> zB-1F{hAF5NsGOW)(mkxL=o%5ea@jFe)F4jg21BVxN=K}+W@Kw3+k1fRa=W7B)k|h= zyCT`t-e)i3v8y8=#lMTK`{sAyx4u&=S>JYB%{?S(woAeg3V^|X|F`f!QPY2*83on4 zghlo0cHZw5s@&o#>;0NGZ2#$?&DRd=&_yY<2ngHmnInX84@f^l$vCKnVPFM}k;BSx z#3P0s67iwPycCYxg&0hBFMd9+Ru=@KjaFzcpXgh}!&4(VjZXdJVsohykzr;&QVJ0Z zkzlvNIS(~srFxBtII!mzRco}fys8+49pvngAqn^L3^HzrR+?{)MC3*DO$%UQAn5h- z-m-J142QGG$r9KkI3cD^~Eoyny(_rJD& z^%y*fieJ`s{+)bS=CKO*=J)zdFMM-_vWNjfunqg}-c=ac2Gb}kz&H#Onbeoxh)x1Z z3VQ2X1d>4rLKwL`MQb>YM2pF_(VPSw|CoUP`>y#*yT8UdSE ztUZ(JODe0h93>=_6GX^dumA?c0!8-Gq=27#h%$75HnAdY&ti@%3I@R1#EGLog3-{R zkp<#3b6p<8_#kxA@4WSB+oA$WU9~cG2umiS1kty@|NUg)dk7$6$AjVZp9lR%Ab{Y- zAUFjvQ#S0D%jHHS0C7_E0zxtKB?(D6#2_5d;h>PK4DC(DLxjemwQWj~K!d=oOs^=y zi#L`WhZ?gE zQ__x7T~PxNdVT3__&;x)L{tDP!)h-j020-X!F3(e20#Y`1`&>)m>^2R13?3XWr+p&D4xpcpYrq*utpkV4p1{Qq=1cRw-%9}70GuB1Pbg43JDIJF#r3oWcYvuabnneOf}l73yOVjD3utw zol@+vHi9CmtUZ(u94j|_d;NH^x4G(|L<}7l5C}lIqnrg|u-Kw#IuxBOK1g-wvULcf zM!%V?!x z_j@yWGTcFa!B(<|CR@6M*t0r}KKSIIRt_;)&NM}7D0RZ;T?~o$8o97ALufAC%IDJ} zP5x#@{!q7S2#mccij)(8l3e%~56;02m+uNIH&;Ml)dy z$X5{2fGyw<;3QINtAfHn5P;!`px2;5qm1SGh7%lwQlP0GOy~tC>PA=N?FF!gA5JBK zhLo4X55>pYd~Wks`o2qh+<6S(eL7NHF;78W1gKY+;t~x#3oaYWilT5 zywIid4>D4j-YF8hlI6k0c37BKk!X333F5NFAul+Plo4!1G+JeZvL-UMry7s~0{jYTnpVI%-uu=!A{K~8t|=5>X%^iAipJ|zv+W!{>d zOjyVHiA$+l?ubw8R`W9&#%5Q%kN@fV$#yGj?u^Y;P~zzB2}~42qvmBf z%?D;Z23BhU?q5&|KwBhX5MYpP2A&^d8BCK^F|CTW3x9-VOJX2Qw^9)Su3qPO3qs@* zkfM$UH3|ysYPMLV>2(23t0~zhvjnV?yWBXPcbjkj`@m$(00$6gRbxzjplzzFPhkSH z8GWN&j6ILRHH>Y2jU8Y#bE26r;}pkC7$nF{OBpp&Diwp|TaMM4sIa8jESkhg8$3Zi zZPiKHLe8U>Pn50F-t!Gls`}^c&Yd`P902o}t0Wi1tvD_=J}KE?thM9xG!fjYr>A#s zd7a<=nPj$IK`p0TPdxix0>L$6#!@0*-z<(L<&j1G+i#mj-|G_~TUke9r(?QB8#iUP z3mD2J!FrDwf*(@*h>?iEo0KckSg^DyS!_17fI{U>Lp?hCl*#?Mc?r>2br&l23|88G zTV@ce>iWI5c8;#!|Eu;;*2bHyhX5p!BQ(gA9x0t+DWfAW;sNIn;U+Jlm6QV*kw(Oa zt1gYHBs;NL`_TSv5`N9@b@%7M>h~6@YY*m!^nTFZF37fhh6_EiyyYcd#6HoP%lT=2 z@jf>oj-REN;(d)9HNP8Q1No7eWR6iCrz(pPfoax`6OeVPxJqvY2m{Ebm5=rK{`mfE zs91Lq7mVqIrIGjQEM2cS2k!k!>7_?iD3ma}MW&r13yqDU+IrKNs%11we1u_UaKB`% z;O-rj-HitoP4+AGa0PB?gej=FY{02L0uw=RXp6e6v^DW-RURr!bSmNDf&m~TdYVA2 z;?I#Q2qMD1KL5R8nt9Pcs7l(e1_R}f&RaCPZhlKvY&?M!qF&`&ck9d1s>@D=rIJOv zeUhci{r0P$HMpYT{RM$eLkS0EeygY1#0BLu2C=BHw-ZJelPG}&7<5Wpn<#>*sc42# zY`0yega&N*i#Sl_02xR`fE0&;4o8(;goy$O0*PCgV8uk&!$8{!!=9~W%8q_FM@v>u zvzqldUBcB#@Aoo!GkS_GfAM|#&0mHa<*Gru35W~=1MvU*pk(s^1qfqV>nuf3Nkc0? zV@FsM`Hy9+B(=d!4DG#z3Q%A^5};HxtusR~f>>~Hra%mI$S9~J{Hp758U^Ti~tGASl z7s@KW6Pz$5xc%5$@8)dR^1UV(g4d$8%H2!(cx?-fQZKv(mRV1aiD#SfKozm)bHFjT z{;T2fJO3hvm747zQPe>(<ux0qsU0lHcD10MfFU#Hf^!}`Q)7pRO zcmMWg*;On=>W;C|mTZPZh7^0roB~i_)OBbBSHP)WXF5LxJSovhE3(qo5P5G6R{pAw z%IF#-X*@_X4h)#qVz-!vB%Ne-vn6?SfJq(Ul2QV<3#0;IvOW5;4K9KbOvfRTQ0bnA zefjU#Z+@hj4K~$ZjNZt=jfS@I>@HStMDLT3c^-9CivRnU-S^?Y)yX94NsVOc;6P2^ zaz{M(MN~<<4T}HwpsTDa!XO^v zDHI((W{dT0-3kfsHgUQ9e#B|NEe1_W%W#V%TFWHE>OX zD?ed{krX+LWsEU2K~jvZJp8D%840Cl6h+GdE`XO%po9PjF-6Zd%mso43IIrn$b{44 zku2Cj07x{pEJ)F z&S|NU4Pk2|6+%;mL2|VbUdyP^sM@%a6-FLQz6Krs?6dsr!g5E6p(z;p*uAC&0Sx@O z{pnQMDlNS;>dPrarE&i5{AIpX{XLV;$xUTizEIYmMX@85`Y5HVa=$&Rd99yKhEXbp zh02!OX%1bZnZcmIi6WcE6`C1?r^SbEFP9$S4nvmKX(>x~78`B>e>EuS?$iEt-L*IW z?ERJh*Z=?C0D%C2VE`53rh+<%11lKwqaqm?0s$~kaCIm|s8!WuMmh+!DuI1~^v$=W`my6w)brr8olqid(n3+N{B%CY{Q@V*@9tu*=S{8_# za@;`}N(bF@CCcCB7}wU}l;ocf3!^u+Z$iofdY&sPnbyK8JKDU6jm)*FCto+;`Re2S zq`aD8v`0|7v$nvy6yv62D=j9a7k`OqMue`K`D-7{ILTgQ?ac!ANgaxlnR3H0b5o!l zg*qxc5^cCeT1|DTQD(XWB*kPAo@aY|Z(^X+Z7`}HZL}fu*}eb!pk(fY1(avkV+>8O zJYnmvHw-Hlou62ZF*t!h3~jvJs66vB?nMd)l6Lw>x*jVtuUGv$H?Bv2x&&8{fl*+) z(~@|{fdvOM0m+7t0ce0gtrU17qjH?(oR-CtblqusG%B)KU9#J0yGq@-B6-M6cUjs_ z*ebqs7;`A2qEpAQ_F&)WY0w<6qic-P4aL=&M`)2n4^Uxp)s)d$sQ{Ho(;sY;1EQ%x}g@78~$J3-sz6sqGQYeUO*0v0L- zL#RNYQZkbF7E}<4N0_En0I?>oZ`*xE8+xv`_9CHAIYdD+jhGiCLCx#!On+DYrr~n880ICK>=`f%>qZ&*clm#pRFmx${2J?Y|mJ6{+ZS-=(nWn<0R0N=m zF%VbrnAkqc3Eppku1Lio0#d{X!VvM>dxZ96o_I?$KCDe$?JZY%U9NK!sX8V`j^x?Q zmQyaua}Rd1a$E)!95i26SYoaMas<(Pl;>5MKpA>XgpsNtfNB%Xkq#y)Qt5%hT}w(N z?=K=IJCU|wS!He9|GC}x!MPz{VIm1`dr*pb2g!`|nz4+&=H!=8|NF3H=Yj?0X;s5a zP9Rq#%THrPWEjbzQjI+^i4%uy{LDP0(Q?Oozug6HW!=DWd0T6jK&O^V-2%uH5xI2& zr-oXLG>j29?@sz?0m7!daBQc_--mjJ?b&~dKE&$dAwWzZ7&Qh47{p(|gdiBehG@lQF%)NBiwcR1=&Di>ytwK&ak0y* zY5jtkTguqMbSg_seO!e&m3$Xz^PHhdw!AI8AP|R$jVOfl)gY1V@%K%27n^OIVa5;c zXP@~m8Z$48uAQv(JD<(ckWTZY&HJ(Jj^dOIw7Br~Q@Xyd>gqbD&`@jmp7$tOvZab@ z7dNZ*S55}h^2mTn;&sMAw3Kr}^e_xnMTmy3JQ;8bBFWYqNS&L{f!sjWZIuR6H!l#k zc0-<|Q_YUoslWAhZ~yx}G@{?xSOFRU3X7QDf=)&HnBeH706rpWT5}=_kdzT%p%GY! z@UXcwLUNc3U|9u$?mcJ)kw=}@Z5)-MQl_3rHZo}sD>=-RV9w>b!yIq-m>RVt?DmPR zCKU#Wlv|H9QTsDmAoEJg8yJjtn~xk0SJZ7`VpQoj7VZ#rx^I5loa>35G`KOyO zn7hSVt(lbSfqIlpQr))fzM9rz7P-6^7mlFcc%|U$)?H&;_=ysEOJE5Oztzc=&{iZP zg(fyE^$3vv5;buDLwUVp4b>*2ND?G0Af~X7BtUlBG4ib|Y9XY!X)HQ4%2pyfG%VZF zPy$nwInfasVf5cSWArs2U)!YR;v7mLU+tk@j-R8st^2?C{ZB<1pQZo%pk)651qWhQ za|u1*L&57mXDxT|}3=h9={QBCEyHO)8fa`jQoQ4uV0 zVGmTHx*KiCOcAkPZ8PGYJcg)a4fih?ZD+doEFj9(Wpqy2*;lD#mppsgjkmIigHFtp z7UUjr7I*dksZ3+eB3`2gmGmCfQ9wC);9%0?cYSJ2NdpgUGNumlNjA_eE@{4jO+lp( zApRD^6J=@F7LXxcK_99{gh*W|0V5DpyR=#dP2i5H5D(Nj?uPoJJ%8(TqV}p?SpkfhIJG_RMkx zgG>+Z=-k9{(MApb(|@A>|L@gXFe2wu5qTA=1OR{%KzWBTg1Mid2;(UP|NEe1^8f`C zVpZEIE>J+@D_>#iITTHwTdbtjK|Ty@J(iXXz5rS}X%quTv=BteX7)pB9Ih#DMGyo) zBYh6yuOQ|Z4ql%eA!I?xQ92(cg0?I+;t_dbS8H$Tw?~lw57#X9F9T-bgk1S#wBflV zvdynp69?|v@^Z;!tZ6=QIz4~=%%9^(az%Z%A6&d^oIa7$7ROHo)yUxqGX{_Tjw@cVx{Z{xxv5c~qxAcCx(Ra~jdcV*TDWD91l!JnpL5pfn%z(E^nn*yw zkTF9?u9eDM=)dtGg{;<|?I48?5F~cAcB|7Uvfy4)5;z-`)gexDKH8y{vUrbBLNZCr zEbV0)M3a2*eP@(6Rds19Z)GC7wEkyeS6BU7`$RRoYwK2lDZ7;?H@ck^Dt7|WPqh1RuI9w-?lgBHYUU}&uS!d$E(x-ASU0?p=1a)S(bPTlG zmH|meY_vMCQDx)+3mTnIvTQCspao9|U?{C1TtZeIOyVIy11HST*}VySwsQabpk(_1 z1=D9!vn)-(T!U)wYcC%a6`@y5;U&R4itGH$sI>MUe%keu1q)pAzCW!%hnueyX5r&}# z&_UrqXf%YDV8YqYMFS+{JB`GK5{HDBoHS(+__G9H!1L8A#Ov%Z`ZPg8w_q$u=zxpyNhu<~%N^(HP5q{`8RL|MV zp#oVDCY8vRCtG#hnQ-quMnx$H0GVYb%vSFecu-K|gDCf1J5ZcZN_t0Ub|}{(-P_ms z8HbOvuW`*c#Sc9Jab`{PwSC%$egAELr8^ucOG!ONL#8Q^CF3k|%85Rc;t+&lB+xjO zP$(k^QqgMf)g&!twO2BZ}P|9lq&BGps>d`!jRvO(YW zec$hQ{`{#mkuBpuU(s9Q>^$q}3S~qobrn1f8hg6+sq);SU4r1uz z@(4hM;(QAs{+0O_tQA(uan-D#gz`FX*q?9mdfkP&9p6XKahLzyRTo&508v0d|NEe1 z=70p;XIbkBMCwdo>pwquQxoN#RLrEOtYs2crvpS+mN>IIZfuKLvS|>j#t9LF{q&Ao>p91`NGBT+?2UvY@+`Dnwm_i4Y5fV>;FYR|H^+S18i$N4g)HfZPjC5qYA>^p=^$l27w<6^%O^kC&nRTk!Zc|u%Alox z^XGMN?ezI8c_i}~??jM!ro?GY)jhG1)PyOK&HMh$eb)K^)~&*4qZ|Gl>Aa?LU$I!2 zEcjFvKE=HrVwY(F0|*GAA?$I>WLDlenYbqO7b~~+9%J7G{qW4r4 z2QJa~H~cB{)A8H){+GFs ziiNtri+)QK889JHHV3A0fq-Jwez1*LhL9K!cJg&k&BWM)=R7% zabnVGHs@=I)&CzHiuwcKL1Z)=3XLJ!Vyg%a6r z?;?X{m4UHSyDoC(yUhW#<{(Q1fs%$VzyJRsuknDjA zME<*NE_?az2MmP}2|Nrh`w=>ZxVnnEu z$JHeW*~?~ML2@RrB#k|yEFyCwPOruhS`!9F)jJ~iB4m~&kEA5rOalkNR-k;bnXytO z|ND?+{D1`MXjtnBMCd_b+W!X+D-)TYXY3gm=>rPv{2Y|@i%**d7iPUr}t7AqQdghEWzA-AYsTE)EZ}T@F z!U>yJJuBf2Dssv+>)Ohgy1Ej<+!7&ggO>wsk~n{LXUkT#_gG`S4%QSA zE2uY{!DrM|mxd6^xZmh}IYMqN?fdy%^j)&|viD4ktUB6%|JVRP(1{8(i_%^x6P3jP zWJ?!1q-ZPc3?4-@B0^uQ6|2hawR+?&05~5B=@0m|`f{BE+_*rAEaWoxl0+DpDkoHB zNd5|q&XX-NY&ghF+el=6Z0&PhITi(NrmH{y{@;|}$84am+r8B!6TI(Nrf)xg{BsUG z%uTW4J-q8aIz${nB<(Z9v`O;dQ+hBl}x`!zggjlZ?e{ERfLHxXWjme)HP*xs{eNP(bLie zKmYrnWZeJ+ux8k62}HU?;=2zE0y`3|oms3f(19L`>-;CA?5fqLY;Ikdf)Rd3#4G|_ za|i`40UQR5h*<$4O%11M;b~AifaSENmbhT)==WxK=|vf`K{!>t!&%_Og-H*n=2hHd zBTO{8X;UJRun5b_0t4Eq<>z^Hp<`EzmvRHMx`6Kgn^LKMSNJ#9a^fzQPI)qb;Q79V zLyMVI;w3KsxsVK@sXhG0cz@yDnmCNfBQqKNlcbR^6FzXJ3)Z;ry0u#31P4gSiEXwy z^fs}%@>><-=$<1z#*qNs;>g3BM{Rd>f2t7=3aQ$9G{v87%KCKsZ|m#-id3h)Xm9`Y zGSjxB1d>-aBsl2>0AM(T0opLdF;WPCC6ysa)s?9_<`cA7wWj3@MWfEv!dpJ0uJlH7 zogg}*$|yvz4ymRGXqtVD)uoX8?1m`QqiaGnQnQVqzckkn8#UQNM`YtGN$?zx_h*$g zp+*Ud9Fev(%V301dJZ`Lt|$;^5f~jmO|{p~K{B|2py#R-K5;@AKAh4T+YsR-hyVw) zFaS-*Wxu`Fvti8Bu)EFUIS9pw7ZG}7m4U&R48it70S04Qh^W2hXiI9F4v!B%_FgPi zZMSQVVYf8!tQmrqy3P?v)7fpm^?b9Qk-PoXP(^ELWKBQ1JCN#Y65=Kph>p>Mj7i%V zIE1MG`;cVx00kpw*y|}ZdOX5Q4+ZHd69JuFtR%HTO$jPJjVVwH5T%dJQbG?8FggQxq?@;-b~3%n1X`UT){Vi%{p zgZB)wAb^$}86}@>E!9ge`|jn$_kvzu!d!b2;wXji&7L>M7@qXW72Nx$_bvT%C(^fm z?|!8Ac(40DkFh8s1qy6poM@EUFWlq!P9h4L7z>3*V*-F30c%<+zJB7YfIu~nTXvG% zpw>?zmeOS=sfdk`V4Qf}7?DCI2@Z5GK$gi#bh~|RPI)w0Xb+W74#bTV^JItS2Gx`# zdr^aC?z@_s#L;{Cg%S~Wji?aC#nXX-^Ng7m7O$E%%ReaYzS5#6slV=5gqoiINzvBt zkO%)VI1mvfnkor5R@}2%-00-=E5jg>j0Sv2dxu`8!Bi-P;m7qXS51WIrsve*vG=#D z=U4u}|NEe1%m4(TX4-oR9Qry!OAiMJDH7RrUF;5>A`**s(`Xhh-r9v&V zk*n>JY_>#E%!vySilIPDSz)xO07SH!PZni*0C9p5LSl&EAD41DXz^KT2@lnk#3YSx z%2Lbk5e}d|j}||VOwuP>qu*gFfelZJrE~{UxO+*vyAZK>bb$E^^RG?r?~QL>R823Y zc23i7ih7;G*%xogIx1x&s9`_XVNwUFlngl88AEbO7D2{K9vN3MA^yg-SREU8fRspnX01Kijh2zRX~m zNFB%~tCWf=cU#^6u*Rit4s7PwaYZ6&=-P6vkeq{{UXZlNf^W>7lBr9Kf&|NLWmsHA zc&js(*J_m5b^e~Eh{;xN;8_5hCc8pp%$E>@SZF;KDX7AG3H9FIobxTZtd9o?p&B*HXQEWQhYQWvvdw z4bk9&Ld%UEOjxtbGcj+o1ECywkP1mNA%%Um?`+miUCp->^*=w-3#3N?%olO@1Z+ntd%24J1_@e*awaUi%SMUuA&H#6I~Qg z0@GR>Okn@}kYw(F1sG>o>kLc!LqY2Q3k*3Ejh|nvBz5TJhip6-tgPZFGNwr9GQkj- zq|?A*uzY+zfl*BY1jyy21&I^G0doKmDEYH)DtYLV#4DU2YZW;tVkHbMyf7Zm@?)PU z{c-c(_{YX}P8wUi`3c0s}k{0zK^!0K;e`6dEfM4WFX3yM6Rnk~(}E_~91>^hF0ly>0}# z#mxmGwgWQ?LL5idq^*p2|2j|OSEHK~FB;dm0;f#t zxh1r)M8Zqsj2WqCS%7pmeYhV5*#9YiaUlyN>Z(Ty#B)W#hBW^51^a7QDkH z?z{?FRwrt;MnIGBkc6n4oFa0YnK8y+j9-4sE9fjDQU+C;Q$q<9aHapiIFDpN!v^1HCEYXO{q6Vc$puf)r0BDK+HI*JdYQ z+PsvDQ)|m1&qk-vIh4QkF+h0XJX0#_(+?X*PoABSkN*z?F>LM8IuoD z0O_Qy@PyzQJP71z%XIrIOB}|rAwWvi^D=8BJ?;vyEM9eoqUFIV7(haGqXzWgR43x3 z%k_GrQYi zwH7{6iL9{D##^If&3Z*;e^E_JQMvR^#4$1-O~G!73%6$n2&Gc z_goNneou#I{Y1BMNe#54^QuZ_%xNnDF)6WZgIznANrd{oQ{xO zV~kO*C~=tu6>q0ZaU6(Ea$qQ^$Pv}?dUQRSR^Z9(sbb_UJox`9&-QXMg;37#G^)Uy z{z0Q#6szcOz$x}=TOJs*F?1KMmdlL`1|s--TJ%#A$)4( z1a!Y@T0J+Gdd(46Y)Wk;CR-{!K|SFBv~bl$wzW|6|L0$5L8hmmcRcR+;g{-4;tW)>cL>WTlP$me#qvKhkoJB;< zm^RhDdkDn($&N0=yW(W0ZUm|t>Gu{}WW_S-x(6=x3_7$^8DwNBO z9nX$gpM)jj*~>E=g&K)cg7AC3T>EU-Z2kNbkOsinw~x4LyOst1jr|MVsDgx-#e9iK z6!OTfy@(+@PDD_KmXpDeELy6QlC9Z|CR>~aC8ZMtc3BH!!oUxX(@vI}IHPMp#bm}Y z8K8iEEYI6<$yO4OacD9`N-krR2tsdcg3Rt~;_GUr>#zVKVq_03+zl9rh}g~9F>x!0 zMK_q5Qt~~Nw2~#u58-@^Q$dEJvu#!y19(S7G0PsFjk#T66*&A$I_pSZi-NmU#>y^V z@+NAY=o-dHhzS&F45AZ|a*{4_W^3(2OX=c?J)0{1J@fD`>us-&GV6k)N2A6xsV5`& z{?+tPgoccHWm>)8%QD| zMWcbEp99``*a-&#f7!l@$%L=C&0e(hiN=tjL%U&Jv2jHF5*xWo=1SyTP(4nDdu7Ng z5pPpOkPE0XuM?3YmLR8(VsoztD%YS>QT`f@D4rp(3+g1aDwlLRzza{NXVpu>d|xV( z6pWpU-+}(&optEG+?mvdkKwa#bW=2h@4xvIBw^TS5-@Vz25%Ubs*rIFEFEQHwWz&H z0N;DPN^1?a3*Kk!T@337KPG{A={I8Jz*rX-2t^yS_^Tw2EN-EenQl}4;2YVhZ!ttd zAm4R&WbWxGKS@`D8(zve+JI= z=~v6vZKYZ;d#vFm8!Hu>g*k)8?R0Il)A2@ z0R$`F3V!YOWXGH8S09iH-)XF9pJL;LZRO+_;9o$fj@X3J<>uN7zk$)b z;h6h*lFa2Jzf8s;`YLCF7r{{`^o{_nftW>^e&w<4;kZ#ZpKdSO*A{5HOk!ZkhX-BD zW@5wJ9ETV#L8CGe?TUGBjnUE>YF0gKyZXJQRNYXst45%N;;abl=h;KBql=xr^CNBL zf!KsA=li`su@$hI9kAWCy#+xX94a*&Bp(lngG`4w7DZuFVvD7((2Gh~{8?*pM_D+; zTEijn=Rg(*TPAa-%#72dP{^Pp|IplP1~12jb4AZnQLo3KfG;gwO!{@jYGq{L_yqaX zH!bi&KRXsE%@7NZ#r?Z$Fe|~QOZY_3)QMc`8?CRH`=1~QX1j-9)ys_CPnwfAR{)oc;J67Z)oa!vHBpg%p@XWv?Rd6;vWcp$>&070j*;k5ao5 z&Q4`>1)UAO_UD8l{H>aL{bkaBwWq7a{;2m=c5ZblgKSayNX2pgqGu)0_fxSYijG|K zz*h0&p2oKMQ%U0H?Bw8}4?sf(;HAu14!N9JE;irrr%dm$6@1w6!)Ym6>0_a8MEqyT z3p4Y#E~Ia~g}%8vY&vU!nn7j#9kX$5T1-drw)TufM^RDpU&<#n)8lNL2f@e3ZmyUf z@{AJOJ70ChPod9FooxX_Ym7Yr-fAIcExM?{l_L=m1Hf8)O|%hygesaHIvD2)OP!lv zow^9zA9V$mHY-W|IKrEtR8qLfZR3<$DL) z8vQ0NWT0pEqP=ypmQUL-ohSvPdMV>kL_a@G_x;D{5A+DD9z`^wbg^AV#dEbU!awy= z$BBPo?4~CZKo`_~b?$>s&PJDKbX@$SrNl~drXO?J;{8_^Q##emuJDwCBg_U{=BA3m zTPjdhB;Q?&*Ca0%Nf>oxl)pk2LK|qhHuX`^^RVS9StXdVl;dhxVoj;rw_qANWwL?%i<9HuEO zKb*28(sARND#B(!u7%|3SffLUhC~<0oeTXAV_GSXAY&ISnS_Od6?U9(se>gvE?!uQ z8}O~vZAX%)e1e$Ig;{lvCvp2~qSyZ9uEHoK;n?gqjE2l4X;sS6Fe0R+q{%Ez_i9uV zXH$6#)mV97w|yydZOtmJHUPRd6N4t*JG$$eV0?L+J-%-5fgZx+o97}3HYJqrO?Hv# zo9f6MM_i}W=>gFsTEp#(6T=t-ArGC)%b!2iSUwc@$WD2v-Q91;7_MkNT~>ngSB=#orBSNC@je3OL8Ad_|+nKF~=zUpV|MYHQf@ykUHtW_RdLjsv#Rj?F z`XQOXbV&Uvap)LCilBc5VI16l*dwXkqck=MvdBkxOF0slGE+zVcE+S$sS8H~p*LmZ zn^yB@sd1$~~!80`(zBCSsdzS86qJ zB=NC)o8Ed((cXW9vX3C>VUy(x@W@oXxVnxNP6zmy_@93SJ#nNh7mj%Cip!vfUbI`N z3B})JqLeDs)qot%xqcs>Vr`3NTWZ?uKaE|2=GAe(`3^1R?9FX7Yp&G9(hj8oY|5MB zhfuVUCEUT11OyUG;OV|l=+Yo0)%A^h*Ar#X zG`0qZ&**#Px=PsJOGXtidutcwno9qP)%+QFbjJl2-Svq8@Gyd)oa;a8NHP>n%zDV^ zb-DlECA0&+L;RPjD?u=NR$yBPu2Z>ChHZos4NT{p|NbCrN!oL_+l0qut!NXEckj=) zsr$fR1uy=rX9{&}CB-WQ*rFIUPsou1Nt@ej{)fxnp<80t&_2zWZc z*k&)n4(j*K!$ z`Hl)#ya%%8#i^kYosv{twmUfB2SSC(vNKIWp^@3xuuP_~;Af!2o01FfxudeJMCwY4 z#|kHY(AnD>khDaqYij?9$rq*WCv?mq?_QTTkui>XIo=|-q%4WYh@_v=McXi~!22#= zv>%&JiH6-Ksq?R-R)Oa?TeCz2S{ngV1&|+0SOV z^GAJ+d%^R^%BSIfk+2#By=wtBWEVdd-6zOHIbz1_EYYcBM>9G`uz9eI{&r7Hz~jz) z0f@>mhCF_{PA|MI|Avp_6owcVRe73LF0PLP0_ngvSjEZ89{0{1{6XQhSJr~bq3a9C z;lT=1$tZIl2Zcd;GRD+*92?>@^CQtCBZrnK6y?cV-2=VWx=~tKs|rSpva)JPMGr({ zl`vA4;_8hT^kVBozp2TqO6;&lE))$DK=Rgm$5ZtPx)Hl{S49rcAVrm>b@Z6n(0I$ZSwZbNN3rT5~{ zSxgeb_*U(z!y5`C1k<#cusa$;Y7CBYa-lun5P?oydwrGOGBRztMAVvrKTX5kMY&@2 zChql5t$`Rz7*j{BhV93ONgGPJgc%f0kT`g3ZQdhH&CD`s)A@e$hj1QUy=RL+YECEN zhX@pb70#~1uKZG;Q_QTu?n$Royw}u_$LaDWf0+viDFKip>9ON~P$P0aZ>W&&>nmVy zDfRY+nDhcBHJ2{w>dj$9Y>OYux)5Um2pIy4+(Q{bRUFDn6S6az(G;OFeDWJx&4%4Z zYY*W&GB7@cO(jz&b4iF|A?pahJf?ZM`6=ye|M23HZ(nsS6Wdk6hatEp;9d1zf@fUvpRIZcP_4T0g8!flzlDWiz`_CxoGtY3-;nM`u2)VPO(JR zRQha?9CR*SNr@~vvBHVW9(TERNOw*3m zHQZo!vkExsA{8XB+AdxT3{cZ~YQmCS=dVpqWeMwF)qJ`Uy|{ErreeZx{3TkAQKYdI z6cras7Bx@~(qwNNGApppGBG~kplB4tn)4TU|7rsw{ry^VO)Lt4Qx~V_{`GHNJM4iK zrSGwT0(kcXL0;bD83UK+tQ`|Hokye@DX_!(x$L8GVhqu2Bz5^q~4#|U?)nBB`sC+AcPy|8)I=t-ZX1hw8 z^x+3W``7|D2~Xzad*edl==xXA&IM$z?KFg3aH6qY; zn+7XzM3}e#AR(E4PvG|8fFeY>AY$?gDaB6r>iGmLIL>DJ76m=;DitQrNdigy7hf5r z;}J>~HrqVh`^+}M%P2`^_W zaN}szs4O}>d@tT;$bOiq(KAdGWVQ@=kvy|lt3j;Mu}z&aRlD15tsYFY?>V|6gQg za=xkM&En?widRyldQC7~w#n^HM|CX5@8YAS7@b3~@y7{ttz|U2=$G$}dJsLT=Px9s_+!6xFOln~eRKu#3x(uQVJc7s}tpwida^O}ZN(7h8OSBHvVK=06 zwuz4RvJd|v_syu6_%Qa-wPDeOdBA7o8Rwi-^DN1%(m;t#bB{kqJ#{#BFM&enASsRw zhYU`XM66G23`bd#c!pkCJmda&V^bPmf1NH$>|0n5J;8N;+FjGvuAceU;62VJ0D#Mi z0)o`NeLjkQ_&4s63CS4Fayme^Cg8Xu{ywd{VpR-mTTxUlhVb(*{t=B;+aHJk0+U&`_JJZ10Z#;lv_|zIu#&BQipb&tA-~{-Kor5ha?;R z9r>W=6LEMXw+<1IwGwJww_YrqM`Y*bBseJje93Uw9#zQ5H8w0>eHk3fiy=)QK_x{O z9b1P!-?-%LfyPkJ<)Gn9NM;wKB5$P*Kh$}o`q;qj6gy(NQ*Q|x;2pBG62!m{Q@9S)1WnheahJO0($Y#z7XhyO65zCoy6BvdY8Do%d71QIy|cDq2S@BMPS8!la1>ICF=5Ba0LzH z#V-0EE4=KosaPK2|4Y?70Q8tSn1x2LyTj=>V*s;HrW0AbKA^-5f>+sUle{y=b7Knx_b0byQogLk-3hJBSkHAR+K}%7o zIOWbO>9!Vj8Is2Rf+u7zyQ5)R(UxyPZSixJRXcrYc&b_xyZJQ-p$#ZvY@aG^(v-{d z@1xoPv60}fOZv_iRti%Y&??sLr21D?HKcLbua-Twar!?qoT!%fUPi6xuK7&|yJKvL zz|lrysij|Zv!fSwL;Q|oDYD?(k1EGwD+XkB`V~~;+pMX{oQ5vEHSzT@hs0r^wN!H! z-hx!E)#QFW^@%ycg+<-qwn!y-&@Pse+!8^P{iFFp;N8^D0XRNqzgRISmOlb}8@aGU z&&cy*&ApXLu^(*UEVMAYy}n^%bo`BP!HEd`<)4F=?_X%}u6$z%_G{U>bNNn=}$ zf@4X0Xj%OB);Rxv4RD^i7MOc<4kAB~!KW|>E=%dxmM)xqr?jcGO#2ok$AOp|D)JT+ zo20!D4*^B&CH@s1+JFuUQnRcCiw5+_KyF+dl@8ut7sb;zu1;u~YMXKvC5J*Ti}@xU zYYdOiNIV*VDBIl7UO6#WSeU{r{SAtP#+Z$-g0x3}VxVOs-&Zj8!N}RMx4D%g&2a^` zVsPV{>->yUSHV_xVO(0}3cri;@4~RR(sPwOL{G|jGRAkCH zbPTpz341~l(2xkEJjxgAIy|yWc);ku6rIr&^c1@^Fv$p#1`N7OVE=zY!f7HtH%WA?!KOlscz_5aYS3+c{MML2%IC3Qj@r zmp!}j!wbKMqa}hwi!f5h4H3y<>r>Cl;szTicl|x&?4?Wa3MXzv;m8NvvIpJ*^t71Y zJSo_ww%Sst2FcmBP!umEsZjsLXBm@fDIcLo4;n`O()1*)NS%>%sVIzp{EVNSypqEa z#0)qij8f&cj@zYM%+2(vdNP)y^-k`KaZwHVCuop?;T z`}zNWQDW`v-Ey;|M3>9|_vL--x&zT62qGBff)9!eAa5>XlVV6vT9#csnHIl8LQt|3 zA7lh9)r1Xu4~`2hw1P^4zzl-Np(9%o!TScwjSPVI(kXFsi|Yspt&~7G0D4VRcbrin z$+F-sssvOo*ix&qgyNAmwYlq17inqao$Jcf=q`2nAg+8g$4G29o5{Q;b(>yf4+;Y^pu7T(>LCP^=5cXdx{?2Dwb&oVAOM@TxE(v%xYy zKu~qpc%vj;QO-OB8^3PQWu`)K-G$4Ri|%XbKP3FFZEP?8)ZvJq-G1Rl!VJaX=_N+g9CMBGvULuf-?{_SzbgSQSM|mf51*STuGwDI);Dw4e z7Akf+JpRb5YW#yP8#jMXfKO-Fq?d*O$C^=q;kKOb{^jqzCO@&Eu*>hP6KinvomXLJfJF*=MgWB86kdXnChHL}`$ zW1!+6F}M_F2guQ3wk2O>8<*{UgTgHuzuHxszqin*kqvj8$Mly{^)0gKuaY#hy@bIt zLe@{`w=?7Iyl(C?8sb;w8_)Z_Z`U+is8=D{NGP=;JD79m=)TNDx>@r{+BH?T#lSk( zHA+t$2ue$n?uewB7x+5wP+o~L(ZV*XL|F4*Wol=d>)^3b{BMKS6eLejNfmsG7CxEXg?+8p>xRqeK*GXlu>Umwv&ad-z zvO#l6su+(Qb}XaG4$c?281Cj=VY7|{VUu8GA#x%?Z1A%w zzw4MqX6m6Qvmi1>c~O~h`RL;!H`|2&`ni^HSGYx!S+XvZdrYoB(Si0Ul`)k9H^~L8 zq=;J(z;S4fnfu9N<@SfP{Bm1SC&Mj*W-0_4GP>v7S-*F?-T-+$`t{x>R&Mp8F;X15cZr_=@KYqE_yL(gv zD67qI_Wz57%OL0%^VJJvu?gj?z^mT+ zqrgMc(=~?l6EL#ss_I^8@(tMzDkOYIGK(f7&T4`QON1Z7P!}awjevt$9LOJQL%2_uvnmmPy44c?k>#Sd0v>ndTv?Q^-OlCzM zo(nYyVE_nha#NbC?m+fV%;CH^0miSY!i7uqqeUr-10P7*vPo|~pOUpM7tl{Y#8 zv(?L&joX`Tt?hrH>v4{LSd`j6GzY%DGC-2m^iv(Q?JxjfQfZgu?E0fS{K`<7sF0@tZjaaT6Vg&^j1BzUfbaYly3_|p!-4$#F2KTc4x33EfN zYH02PX7%pm>gtBwPy=~^Shjlt$Kf{I3=$6mtwK!enN|bx{^wxmBVV>l1jDh)Li43e zKvm~FZ0%A##jn7z*L%svs6XhUSOO`ZrU5$6*9%iQ8aOV?Ub+n;Vn8ibO1mv9Z|U+M z(^hN{SfyhCda8T)xcN;*3SE=##Mb`%=%JsFywdMq%qQL*%I1??-UWUI?lCuB^b+;} z*Z{rT6+SkruSZ-sQQv%`@urn0RuFaf=*R7^m8DHZqc7pD)nU^$Rd);HUqozS)EV6` z?9f_SE;uWWGGx#3MIehPaDWuhaiz`{-?N^K$gwE&7xkAHSsr*fG0dk*rD>_htLKek zDl4rfVOQy+7Ia!9em4cJ7WPNBT}kRu8WdQKx#7K44X|vwtiRpZU2k^lpu^VZe5LU- z@Osj1+nW$R%l4)5d%uDRiepGC1Q0aHL?fVAbqTD=n~waZS=hwhru2gQ?*QX6!FoE5zBjJ;ZM*)$wPliGV_G^qP?r zL;3{uQmp(@d~wPendb`LSHG}4%qq|KvkP^+F|w7zt%6b);-P=EJ0j@>!O32uP%gJqF&(=Y(iBmcFNlMICz5*sHInc%M*3ni85S zEIrFdx|B|kGsrYjiH?SWD!zfSQWB9#x_G=~lLhH3m|JsW=9Ju^LE%m!e%oPDURaNK zJ11@;hn$vsIhsp$YNV%RHklyEOUV$KUE1dsEq&4y6E34-7O|hnNn4Jh$F#`HO4UN} zFO2dvQlVHqGs_MRzoy>;#J?_QYyq#MNT5xeM8)lx94&s7N?m+h${J4}kb(;|3{X3V%Ug=0V0 zgZr}ZiArk;+JulbBBRx06%|7IaGcqF`#~BQPU<3a;ktkzTo00|VKg@2djqKfK=`>$neV zA7~!IUE=?aZ)j^putg5hh8i4Vosd`!rZw11x^%Hfvc-n$HWsXN1n<0lUNBnNY_CPQ zi?8>VncGXky6Hqi=d?QnTi}eyj%H^Vr&MvknK+PXpehlD z@M(=paO4o)WHT&U+7t->@M~@Q!3IY>{y;jtK<0N_ ziK3-72mXtM(;(<;Q?ROo%SWbIHxGZG88|JcUrUWmcM;7{X%^M;-eF5#KW3}Oyoz1% ztA&nJ2J<`Bny`Ff?%yCYigCeI;utDEGz5x9CQOU^aIvx4VHy?f(L89}ufPcD(gmDU z1iui%nrTa+BPM$1rNy{&&v=PHBUjq+#pC@5h%2EYX35h1jTkm*-2Do`AFFNLl)UPq zgbo?x7ztqt%T^IlVWPzAcVU+s2HAGb+IC() zl^ZRz`Jl4mL$v(#k+@2CSx`d7_^iA{u6{bxld){lhu)S&aPco`7 zj!Y7fQz)n(lYCNqteearvDq5%b<$y}{DJ{C{M@|?sW3~3phJI zR3B$d|E0WsT#e3qDp3hrq9F}STHKl`xM?M1Yc~sTbqgKsho6@^q`WQ;)Dpmz{zIZC z#}eZZ!$K4wEJ3ata3Gwo9GN3<*5_!!q>SOq*-bu4Vgp10gG2<&VoEe@rwmpm2lwMaR>EJTI0>WuMaG{2`*9@ zajUtT;@sPPhZhPZ#S)@R!f)`Xn<%DIZ4H{VOpU@{~}`#0Emi1 zL!8h)2G~kX(#n$G)!=^dwj-n!#X&A7uGCuU>WMtOn5G-P_^L6v`uU*mb6Li~u7x;t zDG~TkzSEl2a%GzHpVx@`aKUOiQ=ajJ5gPuBP|xh7bO=c9hn75~M=8(8EGeim}A!XZ3w!A<3&E`PdO%~<>>_$*nA z;QS(0`1@3RSCxxWDSr1I`D!@OS_6VEMFf}P&0rq#05OD=4fGoXRfZ9PH!)B)$JNEv z7(19CRzaB)kl)ttusy6wKUwP4HwRc^pxbP}(?k?jW7=XDhk=1O?q?77U4R*Tv- zg*P)79hw%P*`~{08v8Jl3_@1~08CI4AhT#HLB#TYlyqwUtA&Hj10^z8$*!NzOHzS= z_2jfq->LT@!CN9#v#RuLUGXW>sP1<5(`L{jRT$+wNiD~I1OOETAwB@FthxWiOIxHb z2k4xJtbfjSF+sk9oGB@U7#f9a$W^o`aP=b9+i}?Iv$Yx4rnP(lMzlEE zl3a*3K8{x-{R%IB?HuRO_1Rwyz(a?Cr2cG&mfip7{MwnL*V&@lbbeI4T0BPule%;9 zX58WyaTM=_%`yRWa_=bNYP>AQc_c#ii>HS>We zIShH+Rr7z5un%4;)&)lb(JN>`AP?pQ1t_DYC*O!>?OA(f9f43b^LiUbR+`NQ#kA_6 zj?jt0MJug?YbOwlcL*5;-|T9up%o=G2?_|soLZW~_X>J(HI|oR+E$v{(!P@IkzUL5Ntv>#{`@R? zJq1x!*-@BvJ7^fETdcrL7^<#D^w=OKv!yN(6)%+mZ9(exwIo+!bqu&Hjm-H!$Ji^I zPJ;ZNUv#nN9!8GnwzdZBj$g%bbixBM@+^TO!S6zPzZ7kju1*F*rn};N*&d0C#E?{! z$&4Tju|}v45Y&Qfp`$Qi3uC3!GGm-gV7P_|7sN4*A?4tsHr6Zm_DXVu#iP$P;H-5- zO96mzfO@aq4ho$kYmDZr0|-I1%Bm2JS)(kOD&K&%A?(sEXEjWq+N#R-n?k(X=xIRx zKi zO|cILjMVzytHYM=$_1XA^I=t!^0C!jkz&{?>LJnE4@r1ZuLHQ7MkE7r5V~ z?zQP>1|;ZvcZ>LxL>@|S!{r+M&j^BJ_^K7QAJjt5hH_F4leac|AUhYiOR=II@xkO9 zDC}E~I}MmW!wy;)%p3V%UVMw}95#Sug0g=(%Q&cMxPyJ+XxI&+CVHlJCJW9jISNCv zAhkL)hNcYyReUR-a5oNSjx7D`L8)sc@0SGbG&1uWj`E%uV*soo{#b>bO8X?TEfYv+ z7)0>wMsxd@JQrK}Z`J2$M(akD791p$c#1h)C!J|O8BV1)s^pS&RokVso5SaKk~{Sm zIqUk>|56p~yU__&?1PIoh`cKXh7JvrT1~%}ZQ1H3;{0C(HkNExbx`>}8RT)hLp3cO zXeQM}8WM;|=7oc0M5AmRw1g4fIYF=ltW5vAK!f(!@WQ1r#+ZTXo8lB5E7R zCTNk(7|(S|q5*p-F;b zCTl^3X;{P(5kQ4SkAIZkw?fn9pVGya7Gtk91u54tVcD$PlmYpEw%7y*!j6@~&=qmI zT`yBJ^260V7f>9sYoH2DP|Z77$lo9}g*98%yb)Y-EVv9;@jJ zrXAjFr{4;G0GUDFjG zAO6dy00Hob9OUQ^s=ocq7h-3J7`hjXp-EILteDf^8iLDS&Qp)>#>d_RmNMNU*UY`L zv|K&D1%5s)UQaAIOzk{;zV-jCQEyaG>)cK`mZV1H{CfGwo;7uQiVNSGB^$yL2EE(v z0?Lv8FB0y8pp#`+ZJ7vPl_-3C@Q(>GnZY0@s#S8&hBLQ^7-ZhNw}fy^QMP+tv%F9Z z?I2qhZjJgzyygRRuTzqLr@Ev7>7D2$c~*zNv^hV5-RF}jjPBZ=W8%-tc%>-?JEJO2 zmT4l&D_JlU{rf}0&0{xZ$MrZ+kCEf#`1VgFIAfUDXHO!t1VrhSf`8r(DH)FsFLE0R zb2XM@YJ>m8`+qG6RITD=3=l;1ly*etREpouzh6Zz4v+trQn7JGfF?%qv(%!dX{2ud zYs*_8S4(V-jnJzHgDl+*Xa>g&5h!HTX5tz`KFIaS+2;NGRQ1q`2pXtR2=`5^-5_X= za0C(>gSmS?6*th#Vf8(KOMI=2rbV)i}b(Nc-#~lw{w6> zh;|)%Y#*^diBZe7D=*|PnNgf14-)U6(Q{9NqXLM~tvf!P z!R&n_3g6CSK0=jRh2!OSYW~s5A$slFgrwE}6!>DOQH*c%%Cj)**={k>Fi9$nu!>Fw zz0~#c9sSQ(iLw*45*q@ANF2Fju_D$RsO??PVHj6s;IRL6KPkP92d%Xu0d?HA;M-0H ziRLI5$BZuyiQPRX?VUSUS!;8$ZZC1j=iQ!bk&%Qz2Nr^ScpX+WIZ<*&iw8eXdlZuk zyDG=X6cI%!Iqqbeu)l^ur*F}}Kl%d&IH8&pmXU($auMG7SKHLxVayCc0Kz^1g3I*3 zoS|>^R%re)K8~$4qZ&pKx8_aVEhn3CAs2sEoZ-&&S5LI1{L`L3Z$MC$Or2@+h~@4x zsx8z5;5DoNpe-;UBk-vz{>m5JRYwTR4t&Yd0W0LHaF7_>GNR?ln7nvF*ymQzhnv?^ zD5bDNl*ncgu#nh$NpX;oY*xq$Wf>C=LdO`v93r21_=@I4;+QXuTL4jq9o7WggOjLZ zHX3J_tcs#Gsp=D^z;73c7+*F;L8gEB=8#L-L`b3&*#vp=2xZxnT~Z^}Icp5&mCq{s zF(Rq^&KmdcRI}B9^3y%Etby*BL`?d15^|3m^EdAPOPa$wqr)Tc06Av?c6>gU2Y$b6F?O^-tV=BJ%6 zGAsYV4+*bEdduyF_VuMdF`J5aep*S)9z`}3bB;jNd|<-(b}2X54;K#-&Sk6s03^$U zl7Qg0@uu^n!Ue+OoQ2BA0zwKERfatLYxclq0}3%+5##A0J5(Ps2Huv&+bzT17h^F+ z_Qj(n@JzemKUGIRc=eJ=>@Uwg;w(y#4nbXsp8U_%{RTGMo{aLAz|Rj#&e$`Jq&0$? z=*J$Zhqt%Se>d!TN_s1nUmS?5-}5}Wq-(NA2dv}Ciof;puU1AFv`(5OLSu_aPMpi5 zYl@k^&g~ghDyUge75`-nCR{7nT@pF;L=EN`A&qWFUej0^cz&zbhl$BBV%4`9SS6}P zEN$DN3#txJhy{qJL1M|Z7!I8{WA!93{w<@tCX#F#rYbI>BIG^z9Tz4OWfQ92gQTM& zkCOQRSUShRIJ>rMPtw?KjEQYFwr$%s8r!yQtFdj{cH=Z@lW*?ldwbKG!2{E0+RJ5d{V|jA1e2vJ=vPKey8dm^&A_od;9E3Pv01uM&TO3Vh8=N~8<#D(b)RcmX?=?;1oo z?;p_SMAkn%cm&q09&L8HT3h&HGuEDJgv zfXTM0@M*oxC0KhuwGmOEb=Vu3(h)~1^lHTs+@h;{Q^?jViiyvKw9p8Ji@j+_``;GC z!z-CzmeF5HJ5*b<-;mRzq0e3+f9~D3_Ha5}=}g&et=%f{HKTusKDQuWvHMl#mlJ%f zjO{Xb{A9F2`}-BU__pHrn4^KSofT{#=ihy~hg)kJ7XZYxO0R-C5=_B&=H`Kb&O=gm zjY9Ag0x3@PE&yWFaQzBdv?@vFgTN>>U**Ezpfx-I=*)P{(eN7*&DBioIF+1)3NtRR z^TSvn=Se=bPD2;Aw&2iQa)G!v)d4QLm0dY%<%bIV^$cPCW9`vpwt471&6V4(@AZn@ zhg8(fEN1T6?w_Q5oF)I!%x9#n7M!p5v9i`!4eb@XSRL)U$C{DS=bOH$udkO8PCc2g z*=K~OvVdybrc#Vju&8& zDsdnfDVmA|2BroB+<4eX&;>%23JEG0b=}U?FiV80d3X@=CkfSpuiT6lLdaC_;#!3+ zxAwf%Df@sT_+bheSyGwdytG~cDl^=$uvQKA3$>+mM7EMZ{i1cc`8xtz&^$xnAv*pP zMl_e1pkQ)PnwvTngyDj946~yMvxK?=63%r-aYLz+q9zH?hTd9gx>zeipz*!s))$2x zl|2;!T;mY(&lz|%zifm~TEf@^M9uVB&HVJCg>}_BAt@RU+72Yrdzw`K`Ha6lbo)^& zpMQ(gsOvX2@m|eV2qv++?bR^+7=AgaXQiIMFoENbhZCA9QDoXi3dyZK*udRiWXb|Q z`%@{HA*hd-5GyYa+00slT0RwD92Z9xe*#d|ezR82nLq)t% zj(BQM1-c3*C{-}c@|18np@j*r!Xw}(&f;^P7rdQgkw`^JS_~7Lmul~}oKhzr^MNP& z>U92RhdBsvtuuh70%AU2&! zR-z&zIA%rzE}j9W7!~6RosFA2gc<_0h6azyslue$&4%L>CETyXE&1XQg@I+n_}i4+ zUd)tJQNX1;&CYJV(lbA&HLEeX{A;&T&d&i4zocZPZoQd$P(VcewAQ)iJL?a9pX{Nu z$D5slJl>(U#t-$6y~$+l-LKak8|@*l$CIB!f2ut-Pu&`(x<9WxuXx*Q{?t0)Wlb6M zP4O}hT{+hYq;XQT=G__9pIw$=bam+bP{)uo0_PsgB~43q>#6hmRv-r z(_Aegf_~xY66ArvOg90U?RX5CB8PWLo@_IV*IwCY@cEv<_O*9)&R*jkT1F>F-1k}k z&v&mXik1@~nj~e{NvcY8@K*UtsboP3Fo(+Is6y{X4-Gep9+j3lj|2|qajME!DsNzm z+*ebnA$r0VK?Ip?iwgd2Y<-YIsef_;I7xd93*219*PG0-vl&X`8qB(ch${XyfuXjc z?VP-)2}P!4#yfnGFww%{EmombPzcqU4KF6=4w{yFtcNw+)5eI7t?NCnU zQ00*T$E}katH>#538_f6f{`s)+5Y$Ol>tg5Z#OMrD?LI<%y8S&)VLwYj6e+x0jAO~ z@b8j%&Ng%2W(hh}`hG!*QLWOD7JB(-Hc00`Z%qs2&RdG zO(RIzi6IL&4OsdxZPnH=BxS2$O%u8{>YGT+u3TjrVyc#MsLD-|cZ)YtH!3x>h!hMQ zX`Qc!2GC>uDwMVZ=&K8V^jGOQF{0j3Q5VYvDZa7WC{6z9pV2=AyzO5M-A$7X4qxe- zM~0``r{orF8iC%5W|(3Vc@?)&aiTU`4&1t$_6X1dv2%D$KF+vZuSqLhpeMzS9jDv{ zq@D2``Xv9QkFUdxkVeVNA2f$`%eEP~0ssumB+O#GH}7YUzogi(P;*R8nISd@{I*`A zx-JNJ|JTZN830KLVuDb!Yx_*$eim7vJ?LysEb!+pToqA zD;dNpvq_3LR~GV>|996y-bZQkLm63~)fQ>XUpC!fjrEd`ElM(jXI4vh`mMq%m-k_6 zA>yp{XXbYF{9bus*3&*Us6H}94c>C6wB#slmzz5X#Z=tVcrZ8zNzpR^#R$IZ5JgPJ z7%vqX!#QWa=8raXZ3o8>?e=v%xurg454j(xrfUSa$bF8$OG>@RDBX(N>)kzVMC}mY zdL;f}_j!^L;`9_F_6MDGQ5&|CQx%m*^@o+%s`#hk3}#38X2F-@v0DEm@>ErKuVDF8 zsa%5Tf?}k5yiUX5Z)DmE)&@Yh;_NN@cC&n)PtB(Ap7aq0)|V@TN9p9nEEV?g9tcuP zZlC9<*q!_7pYYgMLI4Mj`K9uN%u8t=C?jhWn9No<_#V}<%h%GkD-%Xe-#t((6h)ayOY81+51=$ z$*pl;=-T_vQ&M;^Z9H8W?{j;8^W@{AhkoJ1WM*8TLo!!$Ozb&u;Slvh^cRWfYTp+Y z(1Gi7aN@ra+yf=YF@1{4!Ebc0bB69$Tf>B!`oz-(wwT>%J& zsF1``?2L17twG;NLZnDR9-8b&NM$IX`kouJPW9g86cJ=2^p1TRzhDkC#W{W1Kt!&M z*wxdgPM0@*{f3*bde)u%3TxUT-=*`aHQA}FbEr;!+8G(9L>m=4Zp#1w(t3 z=lDa!DfZl+Im|NKj%SbH%du=Uf}Z1xqH8)G>AqP3-}Bo-b8b}=6CR~%l|{;?9*#Nj zogF$quUst>J{7#w2{ko0AtH06qnMq>a2!0Nl&ckyP>e#9*@{4h>3m(wh}sO|*x}<8 zO7uvI=0mE(mSt!EtKSrwX@H5HSXT*p?sS))(^@}d6;1P`px;IN<-=9sWvg$yQhG;y zOPpDk zQ5zvsh_1%_@LQ?{ z2|+fzRIU8zn}mWsUwrgRho&KsX0ZfZ`?a>;9Hkv{J<9^kjEQ^6?Cw_S_IlmtVVMsX z>fsyN_XtZIUV5)OeYrMVt9}=)Y;%w5ps^a#wc_JWwr#`) z^fAg5(6ND8hy^GlU4Fej%!LD2<%AkKR?;9>=hPRaRccg!B3bWKw{Dz}pZoImEjm2H z!h%^$Cw2&q(8!!U@B!0sP|+)d#~)_B_Q0ftguW>Tog3CL^E0Eu2_I=I1%XNGqWHG> zg$*5NBqZ;0O<8Ir7+au+v|X?HgArm>!|j?4p(0v&3z7+%>>hAZbytktJJA@`eR9;JaATFJe6<;jH?qqq__4N}g);^0A)_^-qWuju4qxNxv4l@aKULNJAhDUv9zFecKX)R^lwjTHEz%P5|I zMR@Z;X`%n>*db<3Kvq1qb$bcz8za(4v_=J!8W5quC9c{PzokU)n@>>ljoAAc))MhI zRW`MOfIlo0R1$Uf@=r@;vi_sWW?>l2B#HYsJJv!C*a-zCX}Xz!ImktwVuLJA1Gt|?-NytYq(#4siO>f~PmPX;f@1Y`_hvrr}R=4CrML_+ZG=WnvR!7-7Q zFxRNjSLvHD3OKTd@S#mdiAmaM8_jA&I!ExrRgd&(SNA5zB-Mt^?N6v)v;x$t&ATy^ zxkgS348Ll>O}AP$`fW;V_H4Bfo?PxCqQIrV%@+cw@xJnzO2=a}Oe{N~X!bJYyXoi(3Pis6ET9SYr=c>0#Uo_2dcj-OV-%pjARSVIyK;|tEJ zAL7uelf7ek6VxQ-nLcp2I7TZeiYJGihTzImUTR_|cwR)P#K15x-hv=9>1#&ZKe`HT z>rRLd4%7?(@@LmFq)I)~$aE+m6negAlSx?N4`NCkFgnO#n}2w=JAIgdYkJwfNhs&G z@6i?ZAvR-Y2FD55tq2QSNy!Q?j9ZT$*HAMB{%uUD`6q`mh?TH0GAIoDBaw9F>|U!0 z>qM4zQjwXW#IX@4v&9WTNCeOiXi>?#&dvbiFr^HxOz4PDm2WGDTeVwfr)suwHMxM< zbXZ%2{$JboP5?xsG05LTU~LZdK4*GVjh0!gC(Gng7|nS3{5|5|_vlyEYQtownzODy z3wwKOUpMB`e0ppvUmW=DatSpHsDa@IQ6m;cX zLsEO0H@WAzI^T3y?hh;;&6bA!iN{0CT0*ym%H+uMVaCmeyMFEw*_G#%?DBg5Q`+H- zIK@?!f9;-Ow%dOq=*mee#oN2JhVb8UE_GI14S950$&N4dGNswR0L0Unk&hrJVJ+5^78ctIn5Ny-E5gHxc;M{Z(|_~ zbxYLow=R;O^D?_$mD988QOl$=b=7m<`h4;rpDSYVKzbT$zD~S+g21Z-YP;xozeC01 zLCl&_n@@pT793}S&-O2%X&V~Y#$pzAC*VUYhVM`RD)5VRV!Gqo@9@<=4Tg`N^VkZu z&O|Ly(aIa8hMU{rArauysg!$~ZY)vu-W30=x3&se+q~0XL@UW&aYwV!LycM13rdHj z4a#LsMZJ`E&a&WS<4=Fg_R7=2cyLtxoF4zHT@nC8EhP&bC;63lXzKej--5ac+ccV6 z+7^}$i>lziGhsCVqE%JX27#T&lJ>pF2w1F4;%`vH#aCG$kC>5m6syC`-cAAN(50yqpx@y9p4pTMPf>2oOWvZv{{W3m^2v? zQqp;AV1h5>O@2ZT-qPo@zuOasG?!W*}XD{Fo_t>CFrAvroe zR4fhOz`oniL3(+utTjiu+C?0JmdhPB)%O;tdsg8ca*SY>W;6<&mz{m4h)(iz7BJ~= z2-8A|@`=V2a4TjF(>VNPwO-w^JQ1$ep4zOxX%u|n5~$gXCkr{#%f?|2%wD3+B9qTo zSgpAxLU*=!#KZa5T{b-90~0qnkz>%>md^D*kemJ**?#v)(hT42Zl-FP%pPywQIHM( zWHZQ(PMRAl%e{Z~?=$$rtG?;u@lvw1aoO@j{H0I?$3aB`#YcO4jn6RTV#D~{@hmA? zpLAGv)UcYK@joR1AO@8+K=#~Cz0%7WUeb1S%>Vu!mMS%1ZCZHAY6j{Og689AexC0b zQrm34%<-C0yY(CaOr^kMG_5A!;HZc4qi`i_H8SDJ;hwbqfiGpF*2>Z+K~#weZW>W- zeb^Qo9pW0{il$Hr8V@9>l#r(dCPx*lqhRcu=Ij)PxvwNrOOSaP0Vkw!^UyhOy5#MP z9mq5M6FpbOvgzbEjiXIq^hxxU<1HANGHxej24tgTz>8cJNC_;f!08hT1}11FwNlmGmypdV%Puf$8b%#HAn7VL8}lPB=zXvEO+OkX>aJ z8ovS9jy8AIbQmEcamJ9r(|?;jG<~LUf7iOQ4n;c=9ksG*wxOTmwWNCjok8h;c(BwMIPst}VXe|5uj)Arb{j%anwvknrQNiw z5`ExTgd{#(6eFD9y(xY6VP{cNqzFs}1<1@{Qqy$(EKn~#zxmZ!{(0wDsqXVUXGx=S znH^aI#eQ8|Q*(TvMZ+lrxhUK4L_{YTT@j<$14beR2r6p2T^Qh}&BPDKx=J7)cb#DB zfgkR4lBz(W2wPW@t@y3WjoMy;+{BZi*q~MI7-k%Hz9j)Wep+ny0y}~GR0UJV6!Dac zrmSe_<8LhJOgK-IYDEGUhg-+5FL6|tS691OAJSNOSn&oo4LAD2?bg|9FNz~%jZA)1 zS?N=v<7QP7?YTqeLX}EmY|ULB@hfokzI{9f<0e6J()p%+d}DGNKQ~WR6IZgSKuGqwfni(sVF1oQJpKN2_8{+*j4$QQ$ z^IV@rKU~l#N6e(gQ)t~DIg&4UEJxBM!uPAhFhIue(TQz$-_Kh1+kL)gAKt(xW(O|u z*NxtrEc4!F+t1AvutX(6@J;tSVM6c{+?Hh}J_xZMM!|?D5ir8pOjg^ulbZX_@;HXk z@7|@BH|{qo|7|=$?66r=(0xQyTN)^XEC9oaPEZV*Q9KHW**w@=mN_&qYhS-2wdn(2 z%^lk9b0^a4j8&&cn4uUEcss_ApAjEh?r#?-c(_n~-~ANly3mRsURAol5Qkn3lf{2M9!$pOWiB|D zdSgc8v=Jid*xZznD~ZVcLJ?sbAQ`^2SwvY8r4p^@;AS%6k|<6n%4DQ^d?d3t@2TRH zNA>q0cJoOzTaQSLjG$&gNmHsH%~|0!h{`m;4sFqeR+>ek9KDcLDjC-;kK>x_6RxS9 z%$S7r=>*yVJhDlxC8uCP$>DFacHN2yTIR+4aZ*%2F5lf~^`nC- z^|9*_2V`YHIFb_O#SW5VQI6|y$-UW{Lxm+2pvR$SOgrZs9Ze9F|< zUy9V(_*PhFTka{u`=N$Lm?-&x8-ZxS5NkMIGHxoFN^DE3Z@4yz5}Cg^@3HN#o0~eS zXtb}vF|)`d2NRMjnl2>HxfC8%NZHwV773=uVte_c2z*^L(AtcYPa#>OG$1I+mIb%9 zY9rYw<9bEKk&D5h1Pe}$jgqhFQ~!+~-zNxrjV_{>X^FvZq z=n5MrIUJ3gDa@g&9_6bsloBY0UwX@k){gf~nF)vMj)2?JBldo#dooncvRvA$qp-X&;DU^jMs)jXc?FeHH zt~(nPHd^`faQ+j0om9&SY~nG}D;g_)Djiz@4G+QbCqTrqMcsN2l65k4kZM01sw`hn zQJhPCsExo0JO+;ljfO<|PKHxVyOv0V5Kl!`hCNiL#YJM9jm=eO$JlTGr;~&%#l=c8 zBg4H(^8VDXow`E*te%M`H2?sX7?f3lEPor$*NDPP-k2B=gJcrq>8AF>8Bq$SHqY@0 zLi$6yvN8I}C=!0;ke@H$JGf6mqy@j$18N{V`BO3#({HChq4&jL@F1Y}%4j)DsC`xn z^d3nyb^T8X7Xc9UCK@34$fc05^bI96H~LP#UJW1YMLg5Rzkqo5fOMW8DU#}fzc%d9 zHrMoXM<+=Op-zpWcwta6UWC7Cp5TbC%&L=;hv}Wz9JWc9PNnkKwR5IJ99^gk7r|Vt zw;Bt@KV+iJ$bM%KuwhLaRCRHXMy2*24p(7i0%lGP>X;M>NdGfRXS~y2_29T#h}2^Bmw51lO#}rc#YY(4t2%?xeWjb7>vE25MjqSj^XJ#pry^KZ8>2pw z`0olJIt@;kT1Xq^JYBu$-Eoje#=KzE;r>dI1bq<@O^hAQT%hgIm@DuB6Tm_;NdhT} z(WEN19{rdMf3xgZ-TPvIX{LOkNB>tJSKHgeT{@z@LCC&{u1&v$#w%J{_RFlWjHXMt zt2uSB(W1;7Lxr`R>D>~VW!cf$Sj7G6geTU*g}z3-jPFA&qMUEA#X$SbQk~j4pvwAp zvx*6wZVb8jur9%&;nbQ;=S1p9W^Av2LuUZEYeoU!s=WbqSdLm!(I=zimeQIp(v}NL zWbNuL^7vD{;pCuzt4b9JD~ztPc!@Az zLXzGpC1U%JOo?!WeDnfByg2|iI8YaI4^4DhB8p;SgQzg3p3`YPuh7q;%K!VN7Q?E! zj_;OS1=;oIAUPpz*pQUbIF5G5`5lK@Dbir$j+0KEP`!tTL_!8B!6s%LJMPK^#vj

H^RXmffH&shuN&`#^iVdE`O)jytu!QWmy|SyU&i;elH0)=5 zFDn1n&R&bxc6rJtI=~RjQVIa4z4Khdk}V8?!~vo(pD(a99k32QY5TIF=c-(rofX0A zH}6F(>p=$>T{Tp{4}*%cn|1?N8>AtGHF_w4MZ;Upxl)MjQB}s~EmqjuANEvST7ef~ z&CJ`P00{E`l<*z^u?BKR(Ggf1(M0v|7S}7^{MSqBR>=r$!^TAxb0X+T40AwL+H7{d zI-|<}1H5}xt2hw0+A`H~Kht}o0&3gPQXU(6E>hd{2Na2_&mU4T-wcY?q45lD9Jp@} zI1Ns1D;!89A>Y*kqXOTsg9D(~WNX+Z_K~xCw%R5^<)4)<%+o5TjW%{|oz7-7p8|}F zW%m~ju*)-l?Q(OAfi84a{=3s9?-Mj={QwLbpCe{dN22-$HE!gRTT6f63-gYq#krhci&v(=A_ln>X;sV&m4(b0cE8Sbg zN;aT(@)$N%mAjOAx@WOoR{bhdf0~{csXR?7dT=N9rc__XcG=k>+eV%?+r+KAyg8W= zb&cDZo4W^!3;hoaeW|k!3XWa6NJsVXLFOxWn1DKRmaLj+==g%+au!>Blq){*Slf2? z#9l9;645gvPZ}Hds(@>#RAseEw-Ls$Ex&(*@uU?zky43f$xtF4gY!;m9zHpwlMoSI z8~>C-gB5qXe_08$R21vZ5=bt^)7kBom%pT6nO{*V8zHKtV)jQw6jEr_iPG!EpQ(k5 zd68TwdsN4OJy20{0Jr@j;z{G*VkOdywDH-(vyH{lVHaJoi`Zx{;iR2?Xmo>;#I0S! z%sn|8df=AAn#V&=w0~$1tUkr8x2l#FoT=4@C|w3ij;yAkBn1qyQG_`euDReSle4XkxuClhF-)4(;Gk?lG?W6k zH;fWVQnw<>g~kILjtK;y9|JLk)XJ0iFZ?a4Nz`5ei5(63Y7|1<6DJ9?4(FO*U;&=| z_nTG5-`JdLLPlfa&^C^RCh|g6ncuLBaD_P}e2*<{#3cJ;!G4!V>!z1@wV*8r5`-PL zE>zA3O+B-7{^uV#13(U%t=oZE5LVtmMVT(0Fs zX+;{-!={Ha&E*`B_6EJvSVM3y{MkT1U<@Q-4J5U^1qlmH1cDDV!K!@s)ywEC3*Y{O zzP?T#CjoNXeD?Y8{h#UPx^9oP(!^j>P~m+Y2~ed#9Dz_E3P=BgBH6+*vfuHDg=_}d zqG6+z4V!m3P8}=(&hY0RbH5h^8g6?TJrlP0zL+LE1S^=I@M&-nJP?am7KclTP|TWD zh>2{!B|%-t5-pOVY5tvq4x?gA>WW>kp?S2etv+%1?L;>)qq(evs;reUn#>I$Q`DxW zS8VcGy?Q~%;dB}Kd!#Y3LN>G4Gs{7UA{Tn-D#;mt35scdC3AJa=>4M{aK zie;aF`>d7Hz{&n#My2U1&yX1>9Z?4QL_8z3P(NNuPZag0F4Zy#+IWp$?-tWVEsGcI z@7i9zmj8B*;@EGGWT@X;mglD_PCQ-S#$tKWU@@^V4aAJbla?)l=d5of>5xz5)>NI=vF3?y%Mz7ge^(E)m#&yN;&o%*It2$l=OL4vScgo^=^qXk@HVrBg zCpf);R#$Z_Ae&4a?om(8vio3ZEG&1z=5{or6fVBw>OH&s`p;y>-nq&!*2k9)U%?D* zR@0V`-6{eY8AUVXEY#(BH?HlkKGs<33fFOBqh{rXh9X>0u2s-=?UL4%r}6cZB{Th ze%6}A`xp(;m;7_hC+C!@|H;{nU9sLx9_nk4Rk5G9xR&w_PBIY?2~G;A!IC)jvtJft zIGYSM%D^w{hkncMjlrc3MUMh+=-#l|cT+hb+xk;<(o@&2tRCBKb}jAd7l-O{-`>41 zPI@0_jmqr*f5C!$wb=4E0l-E=Xc|Ozo7b6Ue!9T(yQd zHZQyIxa8SZW<;8{VkZ^%lE1cNFt)Zo^Oa||f4f;BuW`+=%uu%@Z<%mDJaCy?jyN1^ z6bvxaZF`%o(k7X+9{(ffj;VklCZ5CvS9VfZ^`?h|A^e4jxLKTvf-<5m$K3QyJCje@ z+c`8Bm~au@SvFI_(zwYMT^g=2397Ls>hiy6B1gS7^AKrDD=FgXY9jA@ZW73@!t%|3 z^{{rmoiLthc~?Vgq`ZT^Oxh>QN(CkWw~*R7uZI2ylqfFoUahPJ4Pwef?#-_)c7R*T{m`v0QfS-5{VOC={x>V3nAH zqg|v7118d2L&Que7|sF_ull_pm|RgULd+dhB6Hl3p~Ki_`KY7rARQG-3F&Dk01fKF z+(GFN8W;Od3Hu;=sKv&An>&kXo;{-zMwOAw|F-#+p$N9V=|u?cz9 z^4W}_aekJai9)1vYc`CcGO|+pDqY=irD?+SfFNLrx~S9jlsmPxxPr6}buAcqjTuDN z%PxfGn&=o#V1{u)#3%g_ZhHb%mq6^4K8`D~x+7+bY_7 z=WGr5MDKOG4W4ygR;?Z>KZZ&@c9H}Gqr|P3?bNc+;GAv)7BodRu=p^NV0jr+0ssvS zP0?VMEh0QmHOvTviYs~$@2NYo)uVjNZgi8gQ>#Ic`9?n$Bm@sZSFnJ9%LNwMKmV}_ z27wo%Ol%adbC4Gyhwqs!!=ojPS&$Cr)E?u+`gW$_yjfabh~9WJrq^m-Ova|+U$uw) zH4=~g-9}Q^-RQ2l?!A-XgYKlKUJ{FIiL4Z}-LVD=#|Q;p-72m>HaWkbFd|J6W}h@D zkzuubW0H*T(g4khjF_+G9%g!LgrWk~TPWCim_W~6Hp(&3Xr-)yHnrFe0co5pmSIL% z=Gr2@Y2#f6T1q=!eKV@r9(V4;CW*RYj2|m`g}=*dY|Xl3?T1#3bhdTvO%?$<_YZa} z5k_N{SKB}(N`juP-k*l*j}=|3f`1VEygXk1Yf@<9@I z;_^To`w3ofeVX#ojT&(XY6ia`!P3#A^DzK3KQg`H*->|^$&ZU?F#(#uTAh5`lqSik z=0a0^sYJI#Pe|a?;?{zEtbs+@aRc6VIx{t`Nbb)H#N2PhDXD4CW`K1llwDXli~?$O z1VId2pbCVRH5RXw7;84X|7Fj`9!7R)BV)WI|Evf82ETNf8{4`RG;y&PoHs(7 z`-%;R*yf&06?^)9U=su)Z~EJ4boPet&d@3ioltR;@kK=gIG%FwlBfg=v&`W9t@*_T zdN_iJX^`-}lJa7xjsqb8lLH#jMM?9zx&)va285B;@&!96)4Cn>v;6gY)L}P4D&1uW zRqOjDDCAjSx)=a4WvmGrzu(n`JNE=&P0&UXLCvuq)bJ5DE$I!*oVRi67_8(y>rwG{ z=aaI^q)r$3?7O~Yca}HKH6ms%lA(U+Qt3}sA!?W+E45vZBb*ds3rZSky zrNkaV1dN{Wc!m^-q!nbxMrH*M1v91XH^gWR9x;AgN?GI3Qs^}6T&`k5_=Bd$b;DAqA+<%vGhzr6IS1jaIX+mwF`?A_P)}N<}4BnQ4;Y!L1ro zQr0g*Ro&t|&O_O_R|q588Y%@;S2(kyeoJs&QsMDaL=)=fu{#0pinnUD{m~wr0Nzyz1y@ zRgz1VVi5eNgaZIXlkwUIJb|~^=@c?0v=};MI*8!oMlFm;^VCgzZL(DvMj8nbAf2?S zHr-_Y$Kt&IXtn@RP*AXCu(EiV_>ZEcbKEja<8giK4;c^b99BTYX@i&H0t*h@pA$=v zoh}B8SN@IS?WAS%A;!)Cu|PGGd&am{UW=mEfjp8=Kr`F^$k=wH^~i-Lt8q%AB$R6E z;$}EKDNd@EXVn`qu48I_cVVvHeRMEP!sdJ~K3sXO!eIvbT98;BI|K}4jB_wZi;ruh z6IAHd2gMsq>}^N}ji+tI;%N)Nj52Rnnp=~o;-OpXr04OKl6YE_>smG4Y))XQUdAvs zndbVKFw{mCQJn)$2t)1;xkxAY0KrHCmgzIib-8J%O^G0VG#a#X698J``5OU)B^>eK zKY0f@feTz~5jcl~aDn7(wvbGo8$QWhD?3t6q1Xou7A7qkep zJGNY}O<))AOY>{mdM5FTW`7pI{%PJzng8Tu&issnp*F+BRf^5a19HbLZsF!N-?ry& zd)|F--lKx0Sr(odO`5&SG^5&=`6Wh~MQ0T%#Wj!Tx|sn;GD=wg&am``f2_1OONm=q zg{z2QGV2`5mBdO#SXi?a%i!5(gD-y$WR|xn)A_ar#aF3r)6^ zSY=fnnpOY*lmJSTmZ_+N#_vrlQ=WP}cxrS=1<;e+ij_drRrk+`?w;J0DkDl-*p#C! z`~33YbQJc2k#yB;@@ES0w&D*6Q`FMk-<(dQ^YU&fy{J91BC4v5T6~q4P@D=m6gDG? z{c5Syb_g*}5$ADL@J3Bb;6fpGjG5*dlcq2`rMo_faY8C6e9>Wv zCxv0gK#G^sL$wuL$St9oMR0UADu$t~f8FRZ-OcsvReiIXp1RZWN7(h9e;7g;6(KU9 zcFQw|T43N^2R~zQQNqe2VC6(jq$E&fqc@8{1P(o{p(X9pzq$t*O|Ml~s~W9Rh<$ds zgxrqd)#XN?*B1}(?)k-C4P1&WN{roZCn)&g8!?U{Ui!43jZ`^8);A%ZjlklV!YMiU z--I+&>sdX$Qoa(0&7~^z@((YYj0v^VSXO7o1$NIaQQ+DU>+0%IX*)$Qm`$EEH}*DVjf)G=oSfq=QhR zudMlMMQ6vYg8_g7fFNMJ{B{mW8{1H_UWhx0(Mna?JVTupl^-RcT!al^8g7H=g!AF= zKO)1@Q7sJ+CT6Q#LVWcXd*{b-NpRJCAiaf+LCwC?%mXsbOQD!<-ifmfd*LZnM!>5n zfuW7udx36@|3d&AT7q1EViht)+INr_^k|WVpoF=b5lhr%OB>8JKonC$`puZY+*J_+ zaGw_7WE*w{e$-=2wv6zj;XRbQW7PWo-{_|cK5b&-pOV!DJE&C?62miX=V=IO^!1z_ zjcRY|Zn;NmrEsIch)Q^7c=kxQtQ&5g;M1X|?{MK2>$yVETB24G1B@2>A6J7nM15Q7 zPCW^2&)F+o^^STL{^`oiTs&aI{ltKjB%d+_*qQ!ZEa^TC)R}hOuG!9;9`?7~(Gwi3 zO!s$J*3~_;v&$aS723iJR^|mg>5!aZ4Le3{`VE(rwN@VLug@=w4PEO&m{cgpG-dzncBzuVCnp{jtE%du3#HPlUK0UF8}QmUNIxL|5#p* zp52~eYi0h-{>E&Q+f?118)Bgrd&u!el|4>kQPqIv+s`#tVr?b{42XpM^*(0GzMptK z6SLcQd;i%jrT`Gnpt52FHg6sHtQp8dB9&AdgKH+23sZV)%dyl_CXi5oYJOj$LA3ic zDCa*;@NY_4#ZC!KZ>hHZa$l;3cYCpTQqA-#i~JTQJShM5DJE-ZNwew`Fb^|QRFMD;DaPJJYnMxV@F0#P9xOy7Eu-vFXIqvQuAWDoHTpaEEINRujjtTBIA_ zV6Dk8(Z1p_NrE_Rh@LFTueFd-C=KGufh7*c$TvIA><-+7p7+@3^Q6~Ug4Cfq#*T`{ zr+VknD`xJa(zP5=mNe{+EY+9lv@}Akf8YChQWuBFwqj9kzWG%RLk3w>W>SI!QPDsw z%1?lr6A&&T8qoVGczK#RGPo^Fc#Q%p$$`tYTB6sxJ_R)9D&K0ho*Blua2Gih87D&u zrrKL27al7G_i~bA32qqWAxC70OtCx`!l?>Jj~lD6zcFdnep^@JN00mQYur3Eyh@uM zx*1hO@XNA=y6#TWO! zRaR&oJH1%1fw+<_a99rrzDnO2@hj!-Fq>mR{K}GEBxKMDBVv~QG?t^5g0U*`d7C!v zSrYMcxBR~&;T-_6YX0Bm?u`d5>K)Wcj#kMD8Xa6NAmVLWx-nC{E}`zMkEwS)fqG@x zMdAkN5-iE?4VTCGRLyFsp>g9P2r+1j!nBMiV1QUIjySQQfq-eM|)aHgnphTWY4$}i?7{onu_QGHBkcPpL)Ng?BY+y_LqiA1VTSFYizOpJh?EkgK<#L(y#U>Z4tlHoMI#=p;Y9YC% zW)a%yYYZEPdrv8A=xhNE#GS5+GL>FM=YUIqG!Pm~3IuU+)fUd3Kyib9hk;uX!Ixyhr?7}R?}KL8QJeN!@YN-%)&i|LWx#qP+eC77t`q_B-!I*2#Ag=yw~FAe zWsczOC>SE8WcbRa5J19?q-H2+3P2yHP@$)lz!WRQWnYc3Y|KG(6y?Gm>WnfMN{H1e zBma_Ud7iHfuD*J-&$Sh#3ILd%?M+nsLk{hD9_YwVhN%{;!0Bt!f;g%HJ-14!J!Le7oP~1DzYS^T28UA zw0!JRz#vmWISc@>oAsc`;)C^vPz?kH!GjA^P5MVbN`noqDnCQR+c&1=<2zeqh2+W6 zr;j-5p}*V?)^{uU^%s=?N)%j_O)IFL10I?-(xoB#{KE2jL4|T^1j0Ii3&Icy9y2vA z{&qUjHcQ&6tE*igz^aNUgk+eBtINa6Uw3W1;(^_PW9n~ZEwS9;sAXjx3pJ&0M3UN^ z{8<}`3!qK_m~{wP3QvV*MI5Mi;ey;e*i5e_&j;-ZPmac(SwLVw{W61P z4Q8<0f1fHS$J1%>U$?KeLB)F&?@>IuRIyGiu}2|fymbW!%+Jwn!uP4;4PRE4ge5Ej zu*o9qXOcf|j;4E+n@LZP#a+?Up}0ifLLg=w6ggxbYYatWGu_w6wL=gb>KM3=bc4WM zu)t;c4$zq~jRlE28k*+5cXobTz7UhEB;3GY=H|Z)yTVw^R*)+9DB2y6>Iblb0Pe=g zABI{z=;PxSEzp?*1*{{K9J8>)TlFkECK9{z@OC%vZBJf(7SA*DB5rnYm3{3RIEho!W@^xH{7ED6U-wBlw(y-G7G6AqIvfJR4Sr)H&6 z5V8Loewx2EqfE{fdpF8B7I{E9US5;9n8cVog&`LM`Qfcma z9s3}cb%%Nn?GVd+%Q|Mqh<|H(YR_tK)MsJcvf_U8>*kDH{|*t#7sa9m0s>$s@cZva zYQw>jw~HnRYuWvi`zgPI>s0UH9Zyf?r%QLc*ht%+;=ok)f&bdqW|V68S+3OAY#%7J z{MqCGV&=QGD`H*Rw?+I{H?Y?kEusllUdHZbeH`Hu1qC-OM9>%`Kw~%oS`nWH!nkQT zE-Sq9K!ZT=+{7jMT)LQ3R&fVDBHyH`p*3tt)t^9#)s&gIJ$Vvm97{l$POpWz>s}lD zTisT1;j6Z3%bL8`6o%e*prjA@!L(vUQ*xyZe{!O#uwD}_Zl(^JGeLZ9Ma4FdJVY$B zToMO{73S%zVULt~2L^x<2nz`2X8%`a<+(PGJiz8B^%f@z)to?x2=ftaLT6r9h^j^{ z9RL16iq{DFYv9>`;Y)6H1&O`RB_I;OQSb2hQ-65H2(3X7LV5MJ1*U}Z|MB!zVR1A} zwC>>UHn_XH1cJM}%i!)3Ac4W%-QC^YgF_&=6I_Ek0S@1P_TF>XxARn2RadQAFW{>? zJ=ZK^Zskm)e#?Ka>Zc0gm(iyRg7Zar$~H`pa$2p$%dooM zoc$8#a*%B$KhQnc?2eVj8J0lH6-#4`zNS+WG|3cY#$ct0dgwAbm)b^KLi20(_`&l0 z({7Qg*wRk-_}7-S^yxLJff%4^z5hFSTa&FWUtLS&*O}om$G6fMcX}qds(Gwr70I<< zhZFl^1X-DoWiFzzw3ILmV3aIXX!~{l+mIYh(HT()(eS^QC>n%!y9n@W(S+nq9vwb- z&+Ywwboa9!eFCB(JZP#~%Z;z5)d>n(iIKUv6=8}Ywtc;GWY#qB)Z4YE`IhkqzlxdL zn<6mqvlLeBbr|V0MW-SPDrKr@a($!*Y@(&?=oSghqhN6GSn3Bulo7ePa#DH7RcE+T zG>i>y?r+s;uI(yOSF^Via!r~&`O0J%wbtw4R}A^aiF;hyFC6SC73~$gl_GGt?o3mU zs5WTbpF|B=l|De_kUK^Pr;IO(AuU@h%63!fqu2%?>`qXp9YEbMElW%Mo+@Y zay|<~J`tl3i=k@46!fj9)~DGYmM*s9l(Rp2Q$PGatekp0R@cc|L}3@Kv5UKmat3jc z>qX7sW07#lh`R*JH;EvFo0H6H)%DcUaw%c@O5?9P!ZPtz5`bo_v<7S=p)GjELyf!3 zgTDAbXYi*TYz67ic{BeamNr-xDf_Qp%Q~!0WiDMy0eQE$fEjB|Gv0OO_*vSHMHWh@ zLY+~g+c91!(!Sk)KVI%1wpK5?1RaEf3P*|5l1n7nUtalDjL0C-KW!Iy`?h%&|N8E< zyQ){q%9Y<_X74~{A%vo(U72>Ff5Sx4!Dx&^tFrn$Jx{+Dh4)#;7tztE?ix?yItV0HNm95aSKOecmu z)~=h^^_^;@KmGBrL98>ZCs3x#-C}mW$XQy@??Tf>Q*;h%q zuWUuY4HJR+6-B;IFIBEH@LJ1-PLSK^DEd^%+j{I2?zfhS2YfA>ad^``tI42}@vB3c z4g|^B;H07Xo1#xkgM9OKF!Z?gvK=dzkF=>?4Jgn8OET*}nMy%!5##4|tU*!6`f*NA z-iI;KAoeU&Bb#YwfrqO=k?c`niRw`KxhibuRD&dG)7Mz$JsguNMw8T{#w{5$;xQGt zmHCKp4P6gJC`h~=1{{MPJS!}2{DtsE_I%xLf2%d+qmo6}OdA>75Go#A7$1B@B#HXc zpVjSMTwLe2r%-q2>)o(OR`?ft({+*|3$vFfx{9_WC+7cYh5$X zH^zGJxz{cq0mecnJ*LUimp|t5x_`XweW|gjle2oeBz=m%?2(-HL9m>5oy7+L@Xo-+ zSV_vc)k3Ma_6DIKXZb&L7IA3XI@F9*6uA9NoLIY^ig-}zWGdYnw{xbY>FCra{+n5d0-*{(vm~La*T?CMv%w^VQ>VN!bBzC zw8Eq;U@m7L|Ah8WG~0P-0}Q4!s-XB6=yS{1h%tPTlGLbHaH!+Rc)*^5e`fI4Q_+gd zah&;^8N3Mw8pIY}9{ZOeC!FC&P(-We_ua3x`-LrEh|TK@YfPH;e6+pMO8pkBjL*6jvEIXBU_af1P;W@r<= z3qryKp=D>{Ymqa<#M#tOqUcn55MWS;A(bt0RuJK_4}tR$d8I++S_6IsehaJrzV`(4 z$br@g;~P!M)j=n}741R#fvGybk-CpMegh}!4zWLIe>()6J>uy8d%m1UmisL z`=ev`>EHDWlS_ddN^%x|xkcSg3< zcFHw*~>lZOL93@e60=50PN zidm{|$uX@?PKIZ#!Sg59+Pwa19$i5qKKK(EJEq+XJ8qpPLqg=eAq9RCrGs@TvOk6K zCX{#X`C0| zvSZ4Q8&?~9OKaH&Tc@GOmCUVlyVTOIgabIDHX-c(^*VFLPw4&oTCZLrHZ?HU;W0*P zjYOv18iY|%s#W5JSH zvdv$Kd~WCeeA)Lg^LF%qg5rVU*6{L@sPT3CeT*`l13PV6N2X8|5U`Jw!Yv{x(Wq9_ z2r8VM^4_Ci=8G0ju%ee(iUva@6a-2GqBB16NEZ31wy<>8=*XW8>LD?tU<_w?C9+xj zKTTmSCfUfL}4S=9UVEkyj0??;eYon>rrB?qK+|waetj$m0 z7TS|@{CH1LQD@emuIDdctCT5khc2*7B8P#&2#$z0f$`vzPj}aufK;RFw6`!Ttz_q> z`HgG6@MAAZgb{gLe1@w~6Elpg-Iq|C{HRbAFO(z2?Af!01Pk-oP=_XWk=K&KNyD_n zI;8!=aIr0cAZ?=|;7dK#PaJW_++4f1%i(8HpM#WE7^uM|qoZDU1vl#$F%x=?S6o1v z92WAB+Nsj8YuMk1YEGO4?vvKW6-z^!!#d5E%xsOS! zw9_=T)~Uu}`zyXcGY~s*-5a~ciL-dwtEgAje0P!Ag&Oxs3-5^Sx*I1McI9KQpP!zy zat!586{ykUR7)N5Y*4k%$H=*aRCED#2s|L44RWHTLqq z5%2*3b`GSW@AT7I0#aTXbVv*g$Wmt(!s)+7U>3s5w>Pf!sH|#VcdB71u}w_a%X}f) zXL1wr>6Da(pvGRKrF8HZPDHzRkUKOMo6W_Z*3}}jKZgOAk3{`3E9nhnj+{;Leg75W zpH)yenO@=F)K&EH;%f^40P_I=e7eR0PJQ!x0``L_5xUPIS+ox-dZO4oOc;Hj;Y7Gd zvW#>w1{XGprbJ^#1TN49<^UG$aRh4R7jjf0dTkRo{*Fla`>V~elWoSLc?rcdl(F(3 zTU4W#;fJJBN}{o!Nzi-=ZGYQ4*3TSeTU~4p)bSXL6CTX4 znxH3-Gm^|tGBomSmE+af&vj;)vBbtBhAAcI)R~R*9nD9o$L;e(@kDlI^F(na<;=H= z@hMTDn7%K{-iMLtJrYE+X-kR(Lfu)z2&HpQ?EV{o4es|@sN3LX3z$z#AP? zfMi0^e`o!TyHxk;f6<34_Tt}-e8>IQu&v`Xr$$s~4t?7EVQ|@uCb*oMfU3S3(wxj_ zKpb13zi~K7Tg_!PV7bpmVAVq9ht7u!n7Oab?DxphQtc@@_DB*_zEqvG*!yr<@x!fB z>6Bq4vrBmzHt85HTi{oErd@J)4pk_dAr93K#;0!vzn3iX6S=0&(?sy7SI+ai8rz3d z=#sGm_iNY+*|4}8cs%8P2%iZHE~iDXF)bnTQWa^#jDy7>GH0n<)y`z7VWKhx7v=w% z8cHUKSeSjmN(fyIQrS=YbHY~}?NUw>mP3nf8jxr|5nlf)4k=xp{;d*>5G<|d8FDmeGzh>rR?i~I`z%$daXl1=7Yz=V0RsnAl7C_nXT_bJ zEa&OTx6)*(eQQ4?-etje;3$<9{n4Ly*H51&Y(wYZXa*1K_K8a3=2@{%JS7&0#NIAw zS?$cUl*4gjTBrQ@UPb@v&pd_YBRjJNa&i+%PW|Yzhtb)TPf3&ij9&LK*#iX7cHG#+yV0WC=usG1!O}vzT~q4)lE+ zw^}NZok8rNTRst{U`-dCSq+B}+tb&$yBfI)r(wN|XL`%&@yd-8@EE=3UvRuyQLmOa2kAd%txSm+5reL7vd zruY+>wgS59lu&I6W-RA{M%J6c&m0gYUXHR5ic>Tqs~irqLO{;UEo8N#o$jV-7R-tj^3qP#I=qcV2w zBs#`1nP*?LLnCooa92;~7-tr{9!@^~{uZ8h^7r{*y(=+(Tz(OL)4p@Cj?c4nIKgaF zMg4F<72|11pxD^<3xH4+9Y@2Y2$w*|z_wK>Lcwz$M9~ZlFs{w|29)30;l%lKC0$Z? zq4~eH5E#1F;y?b=n%J)1U+NQH%*~?DO|i?48q+D)UBu>!{H>A~Fqw^)#ZXL*kyM@% zarf0kVPiG6eWPY}*IQT( zB@o-h1SO5732l3(<=J z04V@6s^Zr$hG?62iab`PWQSFe8O#lGvQ9Cw!Jmg)yE={_SXkI{zC-ba=NAmey3>^Z zlJ+tHdci>Zzv~()3b{&ZGhHlVEB$JAEP9TJQ?AjRskgzRAI&nye$6^FSmh10kyN%Z zg*r@MES~{4$$!WEj!dw89yaOD7@!*;1#$+JOCn2z~3+~A&){(89_j+v0@Sb8dvmo5I@_s zcRIh;+O)*l5vyZAs3|T_(s81eyCXr)u|QJ-0YLPeT)N)EAEUQ~m1T%!Nc>Omf^`|f)6CzVz6UU zqlgy44SH}`QD@*vj6QK76L3hPHr`7GClGjS0_)c5=n@ zLojrs`I0&U@t7ioTnzo85LQaie=wdClsG#s-f(yH3?w-*Qyon*&01(J2xcE_UH+7q zUuDjED9eEfntAXe+UBnN(_TBnv{I&uSxp1wXibc71Z^IrxO4XmI1+r_2YMK?4kak} z>RjKh&4iIA7r!npd%x9PtJ;w!K?CN=3;P_s2^*XCy+eX+R%{GKPB5&%yE_T|Vhcp| zG1t(j+c~w4iiF1e5;w}*IuVMx00gCz?y+zMa_*dQzq+(&g?K<vyFEGRkU+M@MQ-IoD|~8u2J-}{A`h&^DAZ_U59H3 z+>6N+QNze2Vr$v2iS$}_X0rtTvll|ORTiVgwI4G|S!Zpxi?xngmNu{2r7c;!=3%+R z9}S(Ie&3;CO(_hz{@(ZuU6t{YD2L#vtgxRQ2m9yv{Nh$tZ_s+s%nneQ;A`B5;HoGj zgP?~CCK626H<~7W0T%mvHZKO7fC0&_E@}?$mr2N5d~}!?1MJvskVOEnx8q>ZxBrs% zBN)0>^HV)StS2Nou?cgHkLQqNR^1bK`~iE;WlfD7C~(X~sOXR1v@ak%5=twsTW`jw z@>K%^wb*=MKrT2>A-*~^U&GUj#uhDu^JkqyHih3tFrsqM#2UC?2{>wiNa0oigoo!aFfAOZI^pyv z?RBwcnRMi8I*lIOyvcDUjNP;d^DLZg9Mu*sxgjqoHkReo`ZKi9G`c@JpfBsufxbd1 zpG~1zJ~XbN0(B|-6PwdYDJn=53SMt!TV z&5rO~W|{Jv|Kit+#`#|-YL=#(e$9^O!yHz!NR}G1*5)NE=arFYmopy$s*i|K6rczR ziTJoA3lt8deln^4QPo`qU`9 zjreKmBvyy(nu2FI&*b%Ixu#*l9^C6kFFn6_@u`tuw7G66N=ePfjc4T^{yGAdj$80syF={?*df__M`{PN%YwP^8L z_OVv^iDFxyY>f&Ap{&!cgSxOQu?`!W+wSzKADvb!G+He+tlLQ%Xc-T~7seOCF8sXo zt>;_CgE{G5xa*^ceqS1S$Ol9QrfGslFl*^i;unCF_!@jFRAFdq;sitDpr>zUtq*BS zW)_HP5IY#|{9wj?00cOy^)fSY!o)^-5FT=4Ngjr9LwID8H4!H}|H?UAxz0qf^}k4% z0mERLFU>1+`3Mx8PQZlXVDT3jeyTclV8iSL?STu6PrffbSwpx*^=e0DjYYngRY{+i z#okt*MS#>FGK#FVixpTz03E?>G;TW3J2jC4i~*ILZ;dW8=0R51+l)39^PG5z#5ER! zU+*l%0Tr4eHZ?;thytUo>6t39CH5;qn%-&{_Y0Nov{bPa!H2iVeJ_C$^PzJU)yu*G zMJO&qEd8*EN-|6SaQ+bvNlBgl%8?WumN_?~)(G+!$7E5$3`(lDJ@UcQU-Mlle10a1 zPuFA+U;u>DO#2)p0o=_mUJEqUERttUT?KExxfSzz3vMk2;zx96;;9fqo2wPSP zN}6X2(9bsTX16`p8K|KU@in75;$}6&aj4a5kL<}R#uXQW@Rz}FjFlKK{QC?z_3ZlZCTXqy-Pu*$Ef2M{GX8A7? z4gtZFR-dX4qHnU06OrV5+L**i#?|#+(A@u8!zJVMu6BisxzJnVD?5`|I^pB%D6<{Jpyyne3m%mwGL=%Kg2$r@{hSM&8y< ze2w~eAN+FQYj4Ey$e*E11$zWKTQDW0NC-*5At-r&72Q}1${h(Lg=-HlYAJuPt*uh+PMskFk`W-1*IJDR0km=1I?#i3L9bN(qY)WA4T&s%-~oLUUr=zoaO#w9DdM4(}kK#MC*IZ%)LVSSho`M z3|UugUfX;Mv^J58`RdE3GhQC6owf%usd7T@nsD7c133W}U1DOW(hF>x`uI`-Wl%*7nT^LnS_%TJ{jUUqeF&%&3odzE-fpBS6KG_5Ak-PS=P52J2xoBevY(j*QYQPGx2ZR!Y}8%V^Q#jlkH*V`_SwRZW%WDjrYvg(*m(EZ zKUapKpL}VqDhnmHN(bkNw)wxzim5<{a5ZEJQ7XvP)+e@Y=s9c_GFXWh7IPOI7+4nZ z#3zQ)m-WQi?a4+NAHf@2(^Pp*(?x2oA-v*>8H4hM&<=yy6U36;8pe7)odrWC$<=o9 z9)n8H!c9SXG`N&K2iRs?V+U9cBSb1Y}nwOpW>*Zx<13H_?x4#Q;s|XZ))+9Ea ztcqXRk}rGXy6(b68D^3KDQL{tVFg0U!@2W6$wZ&KvW-_b=$Kt<6H^k$gP~mU@!LBF zp#S}=KA(;CR^7|pBP{6Eyhm7STeIuyN89#0eL*x|7^;f~f)SUE#3*&psY&Q3Vefw@ z73Kf)w)iGhRN0BL%Z!y1_1S5A+2A3b+*uVz7XuwQj-@9(ujpke|KtZVr0Zy-!XyKKSoFIeHJ~XS`iLSoZ zRnhNUf$7+hQ(CWnfKX83D^0l8H*iAa zw~R8;h{Yl=3qw*X>GQ(;xwS0)*FOJCP~c_(W>%LY8-Lbs?`V^sbcLOeL<|zb$}K^x zQ;N%06V`l409!}3%xb)Uu&V}95mlnY>viWcCA>~(@Flv_}d zU-wP50UJ?`ay=P*Z(Xh_8ydtJb9*fER5q2L@!F=29eOC-`$|x^D7>+E(IVNq+vTq^ zviEb{@;1G-2{IiWfaK~kA_i;vwcZ8usZ%_>k0tk8hn;>_PSI~kN`+}euB$W-%CxqE zJpYs5yiXGwGp!%X*OOs$cj&kjw03uqYpSFumHAk1mz^wW!9=%wa1>5D28e(S^#>BK|JH?Pc(E;-w0-z}d8mth0 zQbmh|75bgV(;VWVtr!e^KI2|oZieg zRDwD)N4E&l%_zd{$e&Z=2sHdSR~yR=>Yapod#g`L!S?vyN!sHN2`r|9m>T>2!prxJCby8DiTFrUX&!EAPw~?_$$B#{Y1Lcm4+?xPDUQ+ zt6-ZSN>WR064Zv5WR7blX`}0Dq6!NPJ{ZNZPq$#p{@kDwo^qo$V029e!!$A}9cb=) z?x-9USg#wN)gYSk)`!eg`D-nDj%O7s zCq((cbvf>ewC#=4Cqyc51zm&(f-=WZ9WSS?=R zMSu*l0V9G)A;q}izWE8zf^2L@XLs-~2@S28w^<|rvi;j8#n&a|s3be&VQ4nMPw{BX zdCZ**qy)Aqm>OUs8O?xs(6;HXSA168*yut;mIk=6CSFe{L)mFeGIY~`Fl~h_^fHn? z3oF%hQ)wFi{5CyDZG@T>QYsv_WV4C3Gq?Rz`;`_Wc4N;|buXr_2bUf%r1nSm>?3cV z)~lSd!FPg|&<_G5P{==SZH7mN#fs{xjk=tP?zUS#FV?2eABC^&T3f`2-@H=&eYUE0 z!j?yBAD^wJy_mduoQQwESHxF^1Y#h5HM@8-~^`F1ax>~4;j5T%Lo-J8q znavX7!@oAdQl9V zrx28?WRL*JR46B2(G(6fCmaFH(_|n+hEnvCGq%!$HJmUH~rSMhg!e0t6--e!#I8Qd2em zCxTc5zz*7|66ccj$r zPe{eB#`ybzIpk{eQem(9n0SzX8s*Na6 zMwal?5H%4Votq9?WjmcM0tyZv;*Z3>-Bg6>DbP6|1b`BQhz9fNV&k#F1VKqHAoGdP zAu~DaD9Ru9Lrd_P&M|?|A=XLFWwKa^QzWb<;qD;E0y=hope+bdf@V3)*hHg~M-v4c zc-*2--Or04t*zkWpNSDDGJjia%89D3Ny_iDSx!r2e@`dXYZc4nO3vyv(6!)TYc=K; zg_@|KGTih@zPQ+u+}LSQsC0gIuPhSl=qM^o+{7`oyPH+RS(TF)^((DG`}jC)VE&xz z0AM3T@%m@;I0&J0%T&0mX9ITs6ppR20nwqqt>L3a1R}2t?@{>%^h+Uf0o5k0h(@5z z$V9+D&DpQj)c*igsLWL`Rv2Mr(i(|9beo~*;&^AyEA^Kg5M1`=%2sz%hgWO|7l-G= zDssxF_O6E0?IP4_iBcCT!kj0)Ehh6GUsJsm9s;unxYa^1d<66!p%9Q9mm^FBQs zxm00$qoqK}W2=FVbp&|9lkIbmg^SBwd3)^H*$T3*P^G2{gIZTUW8 z)5){0t?IWbGd4D`gw7yKK$w56?~Sy17+z#K7FX;Kc9A(;AP`4_W0A7Uf(O3=?x8E7ONZy6Xg6b5$K7zlLS%mG6nEXS=9XX}7w@qbCX zB^0*bXi?eD1X9{m-|1Ws0?(mEn;GaAfR4Z-NJJ<2g`;}ITLFoaVB-t)2&vcKr?lxl z+ynG4{&Y^OYj=M3BPW)9IcxA`(3-SvGSv4m18v=kbKpMd6Mdb<;p2Oje#bI^PjAW*KqKc&;eTOAKaSY ziv41~1=R#q~lZ6@%98%Oz0wC%S2z_tXUcT52M1wVpW5HVjII}qmo~_T4J<%Z=&}%sA^Y} zOww|pCKqMt@q%kd?5TboRf52*{B`wiaAV4sxB6>NEmcfV)h3z~aDk6!i??3!(&pQv z%p>%OM5&?af2sW{{86;7r`a$IhCjX{Zyf;3z(K)Eg-9qMH`BqvvlX%fPT0lDf#GB2 zHsOG2@??SdqQKLPy;KCKf_^Yi0>@c~uUyI0B$Oqbsbr{orEew+E7p5Gm47vXz zZWVczKxL_gF$c}$DE7WmC_6z$=>l&PSqsyOOhUjf^6r1JCZW&B4n zD>$3vpFEXzF}$jp_5@8>zWCXvG{t&oM3$5CdS3tT@!9s@q`H`18nN%jq_)*@(J6D) z`_I{rHa!4fK1DkC=l5~PsZ(ema3PqDE)+$laSA;>dJ40o7Ix_0n6)Ma(UOOZKBR|X zFdr-AdqzCgFo;FH78X)16g7!EAweOyz}_yIdoCwqw`Diylsjy6sFES+P@K7ZS=`OZOB7C+GuKIW)_(PE!N^CN@`UpiO ztb*CyjTdu+DD{CTmLp4z-1AJCA!v$b`M^3}ILj722wsOiWDgWK6- zw!)32?QMBw+X-Q{hh4VxJZD13W4aG0YTa}U6!>XGEE_3a8DezCPB&dHsS%Om@a>GCj_^NSVDg(l1&ilT55afe9Dc z06cx^hNF^(%MX)~OaxLf^MxcWQe>!HLx-^F7}0ULFk&-yXVScDmh9UhVpt`wYqAg$ za~gBhtE)yWMSGAeGP$CrgpF}6{haMg370nHAde$(DivoXUBZ+n=C+NY`&YbwxPJ6j zm%gMrcX5oHTt~Fa-0pd6)p{wiVfAt5`0%Ory9&ZKl4<&SOdk(t0>iieGNLo!bNcCp z_Br^A{WRxUBt#?bmnhU10`0QmLv$%Ab}#k6M%Xt$AWD$biz!&K^Lwc4^{Kj>BLFJr zzr_ruJsB0zu-2^g#%!g%MQUq)GJluM`(CB!x86Je5QHhx3Vg`ofL+Km04&34Gm2?E z3ezY$0YiP4*lN*iIYzH2qNgT19dpxz=My(>W`l|XfQ(&jC5jLUO<|;d%7r4m+4E$# z32PDds!X3?vBuCXY|08BPks+`JdMS5doBKaN8N_`H;bDp`Qa7@Z9){BiMs%OO32k1 zJ~TpIb{Tyz3G>2@Ypy2I$XFWpKKxH_v(C#4cYaPTcG@BA#)Ki&e2>m3U}4B96=0{$ zf6B!jv{B{C|+a#7#-<7FzYNsdpI3cIoGcHq8AI?xNwEzd@h?BkS%TQFqZv*ef0Hj1GxMlE488+FxOKW^n!S%iMAUd)kI== zF0rKawzFe+9WSxm(JrsHQQAaQ@3gcLOgs$~d@*y?|H*@6Q#T5!oGDbexh)E8Y3S0w_e z*&Qq}L5=4HpUb+UkvT&YEFRQZ?5g9|vll-;`T%{5udCVdA%Qh&mL#M(4=vhk#+L>| zcfQHXUzC?Zx-gg^%^Dp=T)+|0>_1_U*(Qy!OvS==MAQ>k#mcg(Pi2)SnCb>mhZ-HV6RqfvJKlAk&up(NNX&smDYNuY!c z1J9hSTy+<2Da zwZKdAUBc&W<<-(!L=SO?wuNW_F3QR*gn`-%dB{jvh2t(G?`T<#3)_@TC>g79zZg*#ufOqUp<$_m>2s899@~M} zg2zC>BZYd7c<~IIrPEwICpaj-Eal{gCyilW_679l*~C`$eQY$>h}ZFNwSnPphk9~K z*mM`c%B79@iKV~WGuaz%JXVZ5?F4^&jZ)5F0nFB+V1VM!k2DIBfv?fPh5SAEjfg$a ze~~a103%?%a)!)ZE)kSPiiF6Inc@$M792m3imd9+#y+n=E=13_oviIGchkx)3Rpx) z6*3b|U75%4YZ7gqY>un5H$+2;)v>PZFMsi`oGE*3IkN$0>N`|X>mOJ{XC)ewqGOXo z46qZhaNgHYKxwk{%c4`0RV>RyfSipAr}fvEj0GCk60Jwj8Tqu&v@qi1yJi__`G4rP z95IFbWl+S9plvF1t`;BSuc_#2OuzX=7>^%0)|S#cTaR7uD7(7TqO_>@bhn^U+Nh)m zAbIz8_Yt7@_LZL!toN!+t19I4#UGr%{AmS4*H6j-xEY&9$|)v!e$A2!RGJJ_Wy&<^ z!E{1<=!r_pl~h#^7hpBn(%+wmvR~Gne>9wU%~$104K5VeOTRpL`BRE>=;Dx3Eu{JW zd4m28KSkv(Z9k3IPp|X>y&Blr@#7vfN-11yByeTNW7o5c*{F@2`KABYhyxU3F|8#- z@j>+jj^;&66d|8xO8G|N!Of^F#b z82*cdPZ*EaC)@WE)h01Sh=vBkj5++DxBAkFL>A*+H_@F-tjy0-!uOeXTe!1dn<615 zR1gTRMiT)<5L6{U*QJ8L3{4XOshCjV;q5S6eg$1eS|m7{6FOAh?T=Ey(Ss*Y&F`!) z^_h_jvnr<4Yc-LtOn$ntM^MSCjmgWNq*58!D6e)Z(^T2u+L*ukI1fbgH)6rK?k?S2 zJMbIxmnw8t)H)flx2BqmUeqy3T_1i|$myIR+<&TF8{t^;_CL$XQ8JXLW-K{?rxStA zM6(8z?PV>ZqDkQoF91DwX`);&JrQ*8k^hL%z@jP;1$@C@e5UD1glFK-Md`k-_}!{y zEP{TZEr6;nmU^lz{pPRKx9wH7UG?@jHN~;Pk~up_k0<)F=y_0dFNrlrA@1nlg%1BS zC`+WDgBzkmOs!glZWW#YuRdfu)z z*|XI}Hd=zY&UE|srso=DQI@5heUiaIT&LY5<(1apUE-xcfID4+!v}paEB`X~jB=#k zYHs#pBh?A(t%^~z27`t9Bh*Pb?b~!$^wu--rYP#%Df2skB-A-R^3a6lzNbPunSI$S(o}WWQ6=5z4areTN zwfetEI0ry)e~vQIIBkt(^)5*vSuvm8K4Cn+Ph=681c`v(8x0!FQB=jCI@ze*Js2Rt z0HoBA&}a>^oheix(Fm$c+!XemiuD9Gm*nrKQFzgCHN7HG7=gVG*T61|`Zs8%KP=)b z<^$k7>Evk>F%j@M%n*<~k=`)~JS9k-ps8AHecl7ogff4NqmL9V{(fn1EhWv8E5CN$kI2EVAm*R6dv+wp@0IZ5ed0 zl&!+~Ly(SLZYuX1MHjN2!>t7&{1dV5i9mq?t*(KpmV+M{jH(~Zm}QnDJTbE)0S%JL zDEj{+0nW%l{fiIiMtx8ojTMO>E5!eEl<7r}kHp9oR$Lr09ijpg4go+%lKX+3-!Xu2 z>e^~a%~7?eBJryn9wwwM_^RgNaX4zs>7sP5&PsVJ#p7RM;^yney&exoUb#to2ImzZ zi@T(bUZfcm49H3~`Wg7a22u>s#9`~fLh?zfyT$<&|Imz!RgwIor5Y$LJbgeoPoI^Y zHC$a%7+I1-Z4@%7K~J7AAZe46bz(im15&-S7wRZwLxV^*jg*(F$Pj~GbYZ7bSgKEy z^Dd{1nk`Xmq?Cozv#YG0Jb)h{O6TpxW8EIsjc)hfNjs;Q3SqClk-DQPCMNySBPt_wn{pUNohcCQaV*^Bia znAXzjN5q+ssjOyo>gJVQC~nBbqQue3@cfJays|FI@8om!eZeyi=3*d)u}$jzB11N% zAWl}g%jV>$YM~?TKHU1-w{dyL*h5-1 zYs!Xh0zue#k({3rEhYO$+0ELS&89T52I7T)%pG=%o9VkM#)BVgm9JUZGZjs({^6>r zXn(pL()oS#pp?ECFpy+Qm1#&{1{Jk)!v!9~g4%bJV3QDJ5Jv@G`rDFRq8hIdVn4`I zWnpkJN!h($Q-LT9oJR?oJ`pt6VfQcIVN`C;*o|Ujuer+h@v0V^nxI?(=82ulSEmnP zL&I|br07aswwfkOUfM{#+L9sQ-xg`O^`S+4ue27arqDP}Cm)K;(CT*rQ#8+O^uEUZ zn>;qOmVU3ARfcV={`l2-XCodCP*Z+9r}6^emsFI{B$QJ=u~Eg|WzuMn)VjnnZu|Tx znMKX|%Qk6SBG#b7N#AV2{wCHUyI15ZF`HU%QOvG!Vutp#qVX!3^sS^OmqP@`^xAYX zKLL@gA`WT@!421CE+PEaqn4S{(KacnWqQO~UXqJ0-^3W>jMYkBdeThp*MyQdc1Agw zwh)&QYxrS+T*CI@LXjZGZkaM_mW>V6A9y~*NHL0Fvh^qnT~f7&YV!IXY4i4>8`{^i z@y%_2L(_1r;w&sN(8@?Ic41M0?rL9=A^l5cn8+xDCpWG7?P-~kY7!Qn1>Cc?-yMP6O(H$?FD>8_l5hy|2I;l z-A|D;dF;GpKU(DpjY(f_y!287sYpbTJ@xjKpFs_k?~6*5pDH?cvF>R;wP3aA7v-Hm z0(O3VVAi>5e*#y@$>zXmmO|@H6nUC&oafWu&HQ01D>I_v?OeTCGTX1c8LZ(+ue-OW znQxL(lSALf?Cy+JORTY=pfS}FjUly%{%OFZ3zKzy)y6oU%E3XmazvwO804t`|9Cpf zfT*Hw4G%EDkPbbh0}S0AiqhTP-Q5Tx4Bbd~=gQUDX5FY#G*Nyw`0hVk+EK71{X3I>0-yq{{uzsR2nEYupoY98FnVuN-Hn5Ih;q30haMz*lT5LC zjlK}^{xr~DP&-rh!Nxn3Yk9OBv8C^V2L3X9mACi))2D2OlyZ+U4p9MCQ^F= zb#Q%6n~wJ7btCZ0WO5AMB|4eefliyvPb^sYh#jQN^VQJ%- zCY4zTn4dgiA$Us4>@Itx2Tz3>HGOig^M8V(oj8AQzANx7Q94kfh-X>9%&! zcZ6ihsv%Z<*858Nz&8hut$8*1E5*k;H%1K^ZRR~i1~tpATbuIK6$Aj}tR@#!(q7^n zB~F%j(FIwsM%lkq-Tx22=M0VVRI>2&0v(G9|K=GA0`p0G|l7%q_p^U3@TAuA-H<*Gq?`_tWke>Rj%O8}(Q zO@CTIn7|7yCmXbf)@!e$LlTd| zE}v8u6NN$X*PF}ycYm|$2X$m#L-6|C`i&;Ym*a8t2|r-WQ0+(QJc}WiznSSDA}k%i zOBBkvODat|l+`$En?P%F?YQY%4-OJzODVO{WFF$nFKr@-FU&cw@k@}Y?nP1Cod13| z`_xT>qV`G7;KtcV_4nth(w9$K4~~-qQ1|N? zO?G!P4mMj+Kr!la$WdIAM?@*lWD3;^{cfQCX|UuT9F=0hnezZYD2)ToB_@m8*wtbfX(D8~E)EylWOa-ePx-`K%S^T_}+c4S;7E}3L+@RnNs zZPnOqZ{#X4CA1ffzVy$)i@fh)Tq!)&`n#BDKWEC zGEr%nD3oxFb$C6OMOLHZrz&p%ik$AbwBZ1<-UD0gpqW9^1u>pF59%_`@?eD>ped7f zn5m+kSFaLRtm0^yvdyTM-D8FrPeuxQ^AamN6L}x^mEA2HCAw1L(Kj|lkr0HVaT?TP zvSnPMwYx^DS>J8B=QXA6ET2;7%i>C{u@mDo+j}rZo-|POI7w8(Srg~rwE5XIi#9r8Ige+;}L0x zcU$uL)0bOpYU1ClMKkO~6%EXL7J9CXQ*Pg%Qj?OwkdyAeM9|{&@1f)jC-98J&YKAs z6GJ=YW?$2TrkPgr2aodBSTVe@yd&e6BKKtLVeU8H1bj0M>K#873{(hBxWXtEj4R$- zPY~<1Cub`j(EZe2)-B){Zl56GcGm8lUr7{1T(Q`%3x`P?8Go_!tuX@NikMF1&Pq52 zF4(r*VwI~?secL?ad#|cN#Um5Kx1LLO%dZXkEBQl0wj7Xo$4pbzTl}oj>t09P_&&J zXt^Y&E9-GOThs+Z_N9m!Bbc@ows%op;J#M&FH^$stay5GtZZ~%?sT~Hz_hOUrop!X zlNDgtxCzF}i7MQ}6qG@B7Tre$=e|MB%8TYhSI~5{jh`raVzz`Y27l6+qaS~=>5xjT zV>}|bK5}@Q&H8)H1?yc9iBJ&p=adjMX_m{ippQ-q8aj_lp4x~m7KG{H{x)S^YmlL& zy*)RRvv>}Nl&(yb{?D!`SpKVMJ^ekRuCEflgte)f((}fz-lRGkrF6kV0EEh?rmy8b zEXh1QGXDVRPVEvR**iR@^3do{)~YEm;Q@j#&$(%IUq?R-eZq|#va`V#uqmj>t~%F% z7-_83Jsv$CS&aURgdI3=|Cx`7O>r;#>})1=CO{bWTwjTBodg!2`%|Q}Nb9UAMq0b; zO=|m9t`a<^42`6+FdNE<7lt1 zsq=C9DOIm7N)h=Y_x7g^@fMd>3u;Tg6KJxQlc!@3o4eL+p7daL@Yw$wf!Nf^^y?lu zDCp)&aQ z+_zos>5x{Z&<-vb5^pqZ#s`SFvP8^zy>cB#D5<-wZ!@Tt@ zNcJT~8ZVqjjV?uT;|62(;kzF%lRTS!fG|~_{2qKgo82_?43HrPlCN)s8atA|&N#)? zJ+#%bA~y`8GXL;;bjLf4mqx#7y^VS{UQUH#k{!RKs2~VuY6-=~*XL2&F6p;|z;!fM z!(YomYJ;_X@mv+~zZ1f30Px7-*$S6$+;PO=1v(lB{!-AtK_a`!{A#{X-0FI(DXaGG zj)f0=X!TPy?z9TR22(ehKYsk6c>1X~hey0`S=gdLlhGe+C?|Nwxqz1c9vtF%9?><8 z$2?rnTfjo0izS@k_RaQFVJVb3y|Tpah4Y`QRIwmg0J46PvpmEom?3cR8oR*=*cxR7fX`n=4MrMbn?pH79fytNmJx3Yx(nw0}nK?|kV_!g??{$$Vkbdr|cLrvlPo ztZPZvXYSQRa57%J`JxWF6yqwH`MQ+um%j9INtdjjm^`Y=NRVC(B#h(o@n_&kq8|R7 z@<(yo-3x9siFVFa&nSVym+L{Nw+g5O*``$Hn6|uVXAuGyF6=cEWi_l5&0W88#4gPytKrv-Oi6zLbOoZ$E3J8D8Z*`=xS4-z^bHs0b zliG`#6qettUTTW&4lMuDr@f)jGnMj?m4EM)5!$4wXTR)0AK%R%9jYd{e;U(WUOrMI zxJQ%i70;gbfVkh^@235^cN@X~YcESUXiyZSzZC++!WY9MqNjD-%FEr86b8~ z#9p9^j$dE-0J+>FJpH%!`~jfiJ`aS`OP$)ukZoJ-+2GHGJeLVXOpWvo-4Q8&vjoe~ z^HlYa|H6r9@@KqTI9#4wYSuG4N(HQwt~Y_i+N5M5h`L>nQ>t&lUN)>Z)JK~C{+J@W zRi9~<3fo{2zg&mdLMZt`jInXiIU`6W=(|}X*Dp}&0nUtGp-}$O_bmRU7?<^Bl;8Ef z!;|@2x2_#dzg6mzH*pd$kW4?5k#EN4h8gBM6yeD*^4FlSx(0w^UXR`~@bZcTU5Hnr zy^%2OE=kDCQwQ5C1}PN)LH$l+KAC0jhErPhEP^{MY|)Qj32jg;dU=0w_mZR6c(NKE zlCiyNc~X}s&my*wM!;)oI9kI_r#Ax3d2YGrE^^Z~+M818PaNh*9Z5~OIj#KqlzDj; z6BD-Ge_3G(J5XbJ62A-}@e$P7?g@_o*aK-0t=FCS(bi-ycz+boIVy`twigm< zj&S-buX(6BeZtvQJ412$?o>^>oXpdI4HTR6PG+mv?6(BM5tcSjR029^^`=&^I7m)S zW8lk{!^FmIhQt;Hk-R)+YCikoX{9Iha=F!Sy@$o&Stcqnv31ei_(3XwcLdb`_ zKAmrSF`nBT49(lMg6yBR=6{^qV6?ap{4HGX`Bmpn!xic?hs6*~*-!(a)@^Q8HI@hSMpGv+4f*+h1}}%#;a?7z8mL_6W||d~9;wFd4>LHl;G%Zv(R_ z5T&(Kf2pIoh)F37XqlNwTjFRmnl3Ppuwsc2SFDmePZ$z*hNU7;I<=6D3;g;0!Wyq# zf}&&bZu%u%Vq>%o9*0lFPJ(^{U(IskNEd&#mjxH&8_c$vV1Ln)Ns8jAcFHD)09!+( zUQe@g6!ZJA0wv%DB7)55UnI-{fU|nfoj<;H4VtPKW`|w`e9v+rn2()QtRwG8lw%JL z9X^Uf>d332i)4}0PSy)dC48LVZm*1tA@ zR65J<#fBEQIgbJ;fQHdQi%7i8nfNhPp${^JeaV!g*{YIawm$aE$;gbB4K>j@m`QCw zXQaIpCsh!?d)A*8nWFgXc#MQEO*Zu1wttF`6hi`&sS%Ijn+pDw`&f}T`^04>Ct@Tt z9mo9T?)JMP!|qEM4<m&_g0h~?wccT8<7gj+Z@_TU(0g;u5v$~=tN3jh8^Cb@XN0+e{uLT zco~TT_m^k7ML71VdP7DnlhV~W#PG{ov?M0jhy`IUd5)i0J}FMt`jZRL64z|Bc`t7N zRnTafrwl_Lj4fFkNbd%2{fmSZI56B;=M015RIXot6CE21?}x)baG{-8I!jAv)M6{3 z`h#`F-<~nmzg|JgW1_)Dw_7}60WXpYdBaMP&EvyKll9aY`>E7d-%%gV5XH%?n9i3r z5B%(dc8ddbg*k#}(<3x%5tVLBhr$PLxBVtBi;@Q&NlhF)f6QntA&y+6f=)A){o2Qz zzrS5BsfR+0Ma3uS3lkJ6ewn3GtCk%V##s~{LY~id6?+o>?6qYoc!5l51kU2kYO3|s z0q7okw@64pZU_LPu@M-rt&eq6b(1jpMqSW~Z9SJaHKB_~6T$sKI?V&?Sh;lO-DE@U zdSKww<3mN(!j{TYddj_4iRrhYF*7Qe%;AXnQrx_4iP!31L1tflAgdLZmv5gkiO8U$ z0A(j1T`0S<>+5P%F{@P5!PP=Wn}sN*qUP@swbe@TNDjOg#45s2%_4P_3+XSk4e6H>d!<3#(`(BuYWeb~O2LmH zp08%q^vS0pdQ;sV2MXUP@^h359-0dy_zX$>D>3n>NnELELibCTCyl%}{5b=s<(2iS zq?OXbwp8f2uyARMQ(Z&N-V8`lz9?A7Z)o!SriQ)EPT?x=nkLH3yJ;jO38=yc zh`)7QTiT_6sH849jI72L8`8rAcVrS%ZTYZNIdgMuVY_fY5tn@J@B&HfAS_4Ujs6`6 zw9E2`oQ&l=b!6W>xjYCS0){uBs1(avGvdWK5G+F1BXRSz6uMkwQZiy{Bs=~u`Qfq| z-u5?3g!**fxFxt6!?3iaqW(3OuHZm7(G>>_-gVjC(@TaILil(tMvBige<-d4?@d(B zr&iXQ_$_CYMvOw$ul7InL{8ZU*}R9PUKUNX>ihZWcYMkEOePq_{;osK#Ineg%o=te58G26V z&ffP0zh0MVqUB&JD+I;xz9L#)7xB1qR_NE`+>gaNyel_RcYG>D?SphHj$v<&otO&a zPM{?7Y51j3A5Ft6Ut^g&)417=)cgI^cHldfRT&1y>}px~=}<)$0j_aGj@sR{V7P53 zR3&o}CPriyim3HKc)shl-S5zeY5gQig7G2GUzT4HBh!qb6Y6Fz+VCY(Y0xQU^PMBSYVr0*V(Nzei8l)ff7y)BkxTgzn+y zW+rCufEvNN<57m`5Y&d-ANDU**8sp+!{^Q)g`XiBbFS%rHi6#z=f)Bd)4RgTme4fp z8^m&e^XJ^B1&2Uuj_x}N!^OF~$7`=78L<%`FNo%+oC5kA>8E(Z4`(!GWbc}PS+h52 zj2B9-)6o~FeKTVh7j-aoPCU2oJx&#Vn??{M3B?T0R}DWuz(e8ahaR^Q-;w!hb|DDc z>L)Il1G7>OwBhW-`g~Fa)^?b4(~)FK$f%m4ezM%05&>X*Xb*pd3cW3nDYx5W2K&=!iiJ#K zJE1Ct5^S5;1$ zA2!>uo;F83|7xzk*P6WHkA{{{|!Hklb8vSH^<<#4aEFFGqr?m zSSOftfFI4D(8hZczF;g@z{@DDNK3;Qt1U*P=cM?tT3PRe!i1=BwcVl;Eo(i;=Y6r< zdBZ0||Dpl+57K&HHNM*|fqaDs$>rV^S+c)b#|bTTYh`Gy+CiCT*6Z%EB8+zZlEGiJ zj%Ya>3U*SvX3IJnUD{84uU_N(FA`Saz#X%HH2-z+f%Q#tWI3WA#U_d(9J|cKXU77m zif24F41Y;;^B!X2A_!9xkV{s%Ro#qmrgYW*%p(FU)=Sp76SZ%hTcsBJ2*0G=&5mLT zVj|7UNJQatB#1GvYO0!9#m`yHjxv_vJdBSmIz{j`6f7UH9WB{Zm~!f7;!hHz8^qXk z_Y=NBCmMAQmaet++UrOm6{LT_KjU3AN~Sl;1a~OaItl)s77hk?eEh-WsE*y1LR3C( zA!kdjU_%^AO`^M@-5ADsq>wnBZN%E#G^L4U!l%3uEu}a+Zato^3dYMyuRzv-2oPcy zA608V*RR6(rpgK@Q?0%qc$Fy`Yny`AdwLCiH7mnRiDpNz$R6f5-rmh9p}ZCq*;6w^*YP-FK^I!&J>Bh z*GOL+uW~{)zb*wx>LnwPyY-AA&KnbpY+crxZ_NR(3X?gLV9x_HO`rEbR#!yvB+`Ct zTK{*2&F7Z?HrN~uQGbOaR?Q4Y=4 zrIL0t`mweyf%~UHWx9$PE%%R_pwmd&xvHe^ex~kLVvtBq^&nz-d4bqCvBGwnmx7!4 zh`Cd;_=Fez*0`YJ^&N;;uo~M~jb{dF{59YT#db_R1E@EjIXktxAMuZiFE*BC*XA4;*C? zA5IQch+NRoMB$v_M+tXy5K(eY;SOFr5=+w?Jm@Wy1<0-ZJkDCBj%J0rxDc+*? zWyN`BKbfVdE<3gt${!xH9*6EJ{zS|+;i`CoRXpo5TWK9RCnW@pkSUF zUK1@^3zLtHn+Tyh7`}pwzji|s_t~yA8JgzYh*>?cYtTsRQo+yjU=H=*v1_xr09jci zhj!q1j{YeSN&8_xl9Mzqe#>xSbdsfQmEol$_{s3YTGCp@S1eThn6puJGsc8ER!t?y|0B(0Duz?kk>Z&7SALeiVK{U+!bMRiA;=6B;zPbBV0`i z1H|~{P=AmwNH|09cK9=byLKw zWeh33AF&B^Y?)DTiMJW57^`43pVK6pq;8yPkboa5mcV%rJ$Ke<+a3A_hjE$bvPx6i zx^p`E6@aa_6D9JtVH60L-U|?D5Sz4exw?Nc`DP+byWH2LzTozI@Hd( z{)U^$OL)6=N}wp_`0i{xq^|FHANNoKW(4zu%tcJG%D%Q{Ri&=0$6t>uGqaur!JCS3`{`hv;u zB^R*aWWqCL3y`kKI}d#>7AmJa2j-U%+}$SM+j>E0oJh__KIu)abDs9@rbF-Wkn*Pu zu*KeLsQz9z9Q}NF6KJ%ijk=(lcjm)kQ+2B&t$p@1x7b2GoFzp7yL0}LWr_`QB1jOF zc8_i#f@@RZqtQ-~IQzfX>-zkaqTyevp2C4``Z^lVg`8Z`csJdi4t{FxKS1KnZrGWp z6&H4)ryH*#5MA;J2#tbWoO3fZjjPU9oA)ha#Lhq~czkr{FYbGBL%c+Y(d;|M!f&iM z)Ul~^dgY2aAeBL_A1m{Umm8>AfOWiIgeM#61jODG&4_M7LS^SqM#-itNg?lvEcY)A z-Ugd7fBrQNKq3j`_7;1^97Izfh(m#=g!0CifY>X?(7m>!tzdP_!@w_Z#aSe;WZE$5 zrspB>x%K>&=kQN3MaQN@{#I5_Oezh%$enx64CO~Lo|25Oogw*PD) zW6D(Nq4vt(<@={OT1X(|%*135+WlfPubBt&_)$X!ijSqs$x&usSJ#ZhRCi#$m@ai1 zD7CR$>3p@w?>}~0y+yfqF(9e8-iP@%i?gef`+(NsP;q7IQ)5fjW!KUGUyBimU(&SI40BrzhQ%QA~lo0=RG(8&aH27%=iIK~GoEa9+MS04%D z_Id&&yCJ*iaLg_+(kwX&f$fsqe^M0y%r}4D3Q_p!v36K+(oU#9k1$np&YVC%%!rXF z#lwd4y5p7=CyIbpU>FLyhRewc)y3OUwP%^8A5>}e(;-r+DgdtD`b`VS?uu(s!owB9 z`2EvKkwGw$cyCCgnofg*IzMp;iUOTWGm;GVldNm~oB87mw7n#B&Mi?5{9!57^^O!a zHF*bdU+U$nV+Z|quWWm@4$`-*kyYw7L1?Ava&~cNYGos zxoHkEv!bFwLTbp>fj^vU9GF(d$y~5Q#i0@iUup&bBQOOHYA^kJa71XuqGqRCr^vm6 zfugnumOYHhHFH`>Q+vEzIwKGYImNB1y$jqnc?tllV^)tz5*}{24Tu(mG$F-`R;ECL zu{qNRkQs%n^+Vq3T{j*YsFT;P>dKCKcTUP&J+QhCX+W9?Jc-RC9p^rM3-UGe50xse ztua#0qNn`%b6J9FJ;^ZSLu$SHg{RBqH)*gba&a`&`!}Mb7DJ7jmolh80ByxJqM!18 z3X7*_c;V~xS3Ep8-$i!|@kPGiElO3o1jE5-ASC4C_id`MkdLqwC3B9@L|!%f3Bx=X zv8RJ@ox6Q`>Ox+>fW2HyCR2FE%7RHyoQ=0m&6rId^0+~H!f7bS(i-YMe|wRL=f z-qt5o*mC1lpN1R`vy!NVyrk;CNO*QoTQOgHc2K+L>GSI#-Dkj0H8S{T#`6aAl-CiK zBRg9n!2FS|Ns$p2AJZMF+FWKpZaHhENK}+Y_cea-ovBuRYzJ_#NRfd*f(BY_lDKwJ z;xJ-$_vYhE8~XF2i|i4gX9lMc(d&*AW77TMFBZoa6r*-RoF)RKa&?v>SxMxneKFK8 z)Yc`Xr^g&L{rj5P^>->8xhgy2_easQg69mC9iNHv956Fgv(uKl!7_w{YsD< zhOwomJejH+yBUl1N!5pYP?{HEP5!Z;2$POH%N_2XU~Lz}1t6&a1juf6E-oGp8bsYw ztl*MR3=2}|M>0y)k~Q7kYBz*5HMx1oj?RV$yEK0!d3QvB$6fe_8rgEO{tY=BW&aUF zlww?QbB{4WXQYXLs-_mKisj;=&6n5iu;8Fc#Sl=L#c^Ro%C9)JM=0AiH=ov!p2Wk#5h zDzvG4ZC>Eru=+C>wuzujN@<)wDz>T#YWu6e*w`|KLR1f-r#9V#Q(kSfO(<+97>#)?o9r>c8A+O6}h@ z;x{*!+g=veFVQ7MP_UwLY)1TBwEqBrU#*ul6e;fcsO6ujYZwGx#d^;z(?YS@O5X3$ ze+u+a-uK({F}RE85?;n?3F3AcF}&BFoYMlSAB{!&*~n;aocyD0&ll6We1we=3yrVnRZV8ov1F zNDr^;abfu}e~u9hK*I8L`{KA-O$!CIf5#L3PBBsECuJR(gq=FUVelcI8YN=c#TEXV zsh+idhk^+p#?;k?-8%r0eVqX0-bW!Mq%j*S1Y)BSC(CD%wk}B|_plessrJot5E!As zL3og7&?`Zx;EeTc0CImZ>PILRv&2_(h!tlgV+{?30N+60C1cQh0po#oOoFHURjFVl z3#}bJo^^>-qS9-{7;H~gMsBl;X%N=@G^wSA1}xZ5MA4Ubmj<}#|2AAPn?Z#Y^`j2% zc~vSSBD--E-?MPUt5ANB>)#psvl-7H)93n%(%wZnYs!o^m6)zr^8&g;{mkI?g2!)C zM?opzu5t{s0DLoK(Ne?hSJiP(hm%%jhvNR&5#ql}r_hAswd4Ba&hW}> zXdP9emE2Lz_u`u$x{$KSTHJ6#p_2~5vvRd1FYOmcOHR@g3zv(goGyba>&B7gP>509 zk*0Vbc{3kBl8}6Do1(h$KGLV=;Y_B6ZMsdYz}1EpI04oe%}C_Um^2=4maJSfwCbr& zJjfh;%O-3+t{Z(R4ZNABW%ZcW!1poRqf3ZlU=zjA+QPB)GZ65G zs?yw=uv0I6c4W+HOypp%22o8P=r4GnBCD~I*ZZZ&P>EXme*JMv=50AxDJ}Z;{Zv%Fl_QL<|Vsl3}qIe!j-2u6`Q!ie?@Q4i-9E`1R@?P18p=az-LdDWr&MR3_bK4>6g)CJ741Gyp3-n(bX(JhNqPn3pp^n= z&;xV*^M(T`s3~TnBRs*+!oHroP~A&H@1&nnK5pm7-2LFZ(K@3YxA@k{_N0|SEV-0y z3AR4F*i0t{&_Kom1eIt>#bqs~|BHm5LBLT%JqK)FVHpdSmm+&F3AH>dS|Z>~`mqk) z4FI5A-4~Q+?E^QGhaErHr-egb?z9DZbFPGBWGYTPQ#CtIp%B#I5RgJ-9P%Ej=|Dl5 zA;=P0V(17BV1BeWgQiDlS}3Z@n?XzjrDr5T$AF%C@(ax27Yvb`VZg>?stwcSe5!6G zGu+A)cLito!UhLl9+zn}gEj6yXAmfOtSF$kkZrIH4F(!V$YY#$=r8PeN05dNI4?T7 z;v-3w%~gL=dpGgz;1&4KM#tgNY+=ix==s|@CX^Wxqv$`8dWQWwHd5aw{L4t zr7QM&n|cnh&AH77CRln|<2#?MfaYug(Ohez17F*U`UjjJK>xAuzgnXa>=;1)r+srpvlk4d*gni!ZDXb zpG1Rc!Hd4EMkny^LI-_cI8J+2XbZd-4u*h0$*AcXjplZB4P!}%Nd3x8-49N1U}kRZC~FQyniysVnibH4q;a{BkRhfR)|1s% zz8MgqsF+X`Fd@Ws&kz7lE=|a=tp_3AIm)VfVs|R^)zR%}Qn-3zf`qY4X`nlHu!D_Q=qCZ5X*l=;V%=W?9N?c&%kFVlTIU>a2lB1juARz%3MihERL8c#BKf$tE za7g{$O}!Km8KL6ROT{Jqu0uCBC|{&;2Gsn(^dm!t+KI0{T}IiCLamu8gy z_hW7oMb*om|NH03hr5lUv7)T1nnso#aqInb+XACN7UYECTL`LFBS-Pqt1gxN#^wAuds)z2j)fxdIZPJvN>wVQ@ zC&waD(nsYq>G>l8NIe>)S@Xx%YI19qje(v?QPnnV<5s+yhF{ORx7wdRKLx({<2pjo zFr#;Q!t?F>-~GI{t|ybHo~Qde@~52Oh@LZHDu65?t*qFoH8ILSv1N2LF*ZSUY-EHX z*566D|7cj>*qTAw+87pKVJb>p6g-dT+NWAzDkSj{AD}fo+B_F3TQZrLM20GcVWT&1 zSMH9`c2O&Zv&)L;FkU@y@Zgx9B32iO2=lH3rL=^Qa6p9_NV|62qvLSiP!2QJFe+^v zDT4ZLHp&hSPU$Pn$MHHT+ju&8u9Dtae`)ljE@lfH6=5|dE$QQR%^vfzj4CR1n4#vy zhjczrmwK*p-ZV`-qfE>ZE}P_8=&EW(QuDEn3)JQ3T~`9NzX*Z{TC0 zIU&7<7d^n1R`p&k8m`mR1gAspE7zPNzy?}f4*qCEYDj`Q<#yz zr>@+Jz8TNkcjS2%)#LO=-~iKAD?%wz=ds#*321A66xC9K6j8Na^qwujnRVhTzks;hEFxoFZs zQ12fSF=*1}9P{SvT8hkc0`Y^SwLDry?FaW5G?dl=X^+vfM56xgzZ7-=9sI!wIDU!%A40DSc4 zzr}Z5329+90cCg6y}ky0wcFj)I{z$$^va-JiN{)qISA?#)+xV}`C3ShFipbqBl-Qr zp2sJ7YYU^Y$bp3wkEUv?low0%$_Hin2b`PhuaY&A+6jJBeYvRc&;Aiy(U^SqycA4C zQ{fg2(&(mbhi?gcqtY!>SaSW|d@rhdd*qNR>48Iu-qtZnjq{qJcv;6iiKkqM7A2I-^MNPZ8oV1)&5w-UM z_#O5zF^lby1sV+|cfn5{PF#1+1{4hlE`Tc$sVoE&6%YxT<;IE)_W??(ZM*9JH2+R1 z4Wa?}fwMy}s4%dHL3%oIGb&QhEM%$YV6{dQv97*$ z^`KrC)rKH@wAY*3b8X7X-$KdUpx|V=0#^bj5p%v<57M-$E9Cl9c3*;IC7S)o+tNd3mUyFnUUlPFzRX`LPT@(Go|D}tOsdWR6yF2& zd&n1MJ=ju|jHB*D$J4L$r$f4EB(^P5T*4)j(!pZo&H&(AmSCjrq+Lxy>5mKy)ab*D zig1)TWK#LxafF!=>PQkaLVz^VDfTGbRolK>*RH~RbSHKaCy0rEmrn!Z%;maKdCm?7 z4rq(u6C!J%f4(gm#ZcK0a;f4x&ul+|lt8$F-Q%5N_l6(7st05Ls|@l{Eqwz85J*9! z!rup{Y3Jfv^Hu-(Wyc*QX%1J#W&+1Wgcqjc+QtNjB-VgG@&>1k74cgbp_B{om>&O9 zCKa?F0?3ih*`PJH{R92|0$|YCEIPYD0pSB#JyQn&SX`#b?;0@jbtlUck2o9>ygx4& z3R&n65t|Nz(PBACXq*%N0u`dA$@X!>G4$bAD?%8arxTPNc4fvJpC--GR1zVm%Hv=3 z2<7eURm4{NtXAG7^qH;q!-uwxy;3Cv(ifN=UH&+Ymc7fO`6$G$vBv#FYRwaSdq7PZhu>_QSY`t|E_Gh2rc*ucHKf}`l8MF6=A{+j&dK+QnHuwajSr&80=qw-+@ z7jD0iEv2*6Pg7j)j61{36Puqd9H;Of*kW--E~M@r?>3uAf4KnSd_Ibd0w2%<1vG&1hDG zMg=iBH!Jyf@~uye0mo)$S~;J-^^t7en~Ed7qL)$~9j7MG#cDCe+s9Hx--}JbFL7N- zk=AE^`$9xKZg5%>x_zY=189pO7|0q{g9I{!12SS7IFlA8)5+G73wY7R7%@$xI2w2W z=%L}TMg2StT7eLXJbAbasMc~Z3yQ{?>8p6p!)!Sh!^{Ur)q0{7LYEL_Bg44}#4`yf_1$!I!H1*sV=;zL3T zRd<%J$y7mf`icN*QotbyU0m0c76^{y;WaF)Ika;24iOYB^q1ZAg?5!||z?>DiRN zX3xG&dT##RS0zZJSu|omA&r&t6CO&o<|%ZsSkuEUFKuR4kJJ%f*f*$c2$jXOqQ~bR z%HY?t`t9)Iq37RcwGV&;j!^sNBZ|bpc~3cI3$O^wH2Ylx7w_$_ZsQXt{cp|p_s^Ts z*uW3}y?pw1;okfd=u-y}uw;_daQ1=K$g#~!rjU8Z4pqTGitnai0@I_6pz+*j^TVMQ z0$i>jc$}gwo+N10VH^U5u}ntuh=@H$A&Dk2+{-)loVRBJGcsP{3nSkC2dI^#ahLW_ z`?JAq!y^m#J2v&YC?h`IFoLT+v4n^3P1K**DH}q*e>syc<&;E~KN2rDe|4LPtFboF zL{zGoM9RbCyK(aV1{Oi{N^}eCR8go*wCn^@yUO0&*spF>Jaj)p3k`>l4s2dN^Fq?6^VE^psp7{z~>-8*g&1Ob?uB1Ucv%QRh8tPC34I& z&WYom@O?A2-AcCCQsLP@7|l1K$}(M+oG{2aPhugN`nh^}@fFP7a) zBgKhdq=ZNg3Wm+G{#c}mjtwn3IqugM12bZ}_id-+ z5aM^R&Vr3tG>JNi<;)|{snJ2bX$BsNY8@V~@^4ClJu2Rden3E_1Ol?E0vZe%0~DA; z42mWIQ*4%JX!BSd~sASZ?2glYDYqrpog2oQa+ ztzBn{MwJLfOM7Gf61?Glz^7&pA}4YH4I89 zmaokYVI4!^C9G9h8(|akE60i#&JZ2_D4w3DMJO8c_$b&GVV%#6zZ!Su78e0VAvN}$ zgJc9Tg`puQ0Y<`klS~1@O4jU9GpJd(HQ;}k`pTfVx@gPBp|OS_ji!Ny;O-I{4esvl zu0euJV6uE8CGI|&|~kN^oG!0^3!H8tnwt^4EFIcLjVd+)V?R^pbb^BBJPA^V}> zj@WFt&ZLMRt9}U4-eV#7fo0O4H1%Gw;0s2R;FJ|If}Ui+P!oDx>x%zDr23Z1|$Ig0qMmaFUOP(s*%cg#+CB2)uI~gso@X3pZz{jSHd+sTw-5mFb zsHFq^oyXVb?US|A> zBW^^U7#M(YM0Rcg<{a=EY8ZqA0`8Uvxtk3(HL;3K9F(~llc1z8x0NSl8Lm2&@)@;e zs5j`Ldl_HW(B~@@aLaZ)x2`pBc6jhfc)YKwO4%Vu_I&Tuf~F^tbKS|f((}*zF(16X z5T|y%0wF>UjpZ-VM5!AkaTWZXE18I@z}bZa=K|tq4(JjIdSp#_c&2C4y9;sOAW@t+HBn~51(L#JLy;t6PjX>FCXk>YbIdpNATRee1gEo%UOvl*SAVTKLhOpGPbg>`m<#(c*yQB@` z?Mq6n7=Ln+e{z0otBN!uH>g8_QH>9ghsjqNe>d~Ram|;Vdh$!h8!7qwBjK>P47*a2 z4@an$WGC42_rZf+*k^WbwE#e7%A&f`P-SlCmZkm0Y4tP>JHc?uCW*xxHET)ke6D1^q$8B${aAF5VQX zvSmzOU>8$pEBdXi75Po=T+!M7#Fq!MbJjh-+Tx+E`vXL1lIb}aVs(R$c4Bc(bc&yh zu_aXq0Jv2SFvH7}2X!1;EegQuVvz;0V_*TX(1fgyH_<4JnTr6pNCcvc0yFcn)`)l! zysU##i?@7{MU9zJBSUf*i0+`Wj?6rSAW;;pWhO}!CdncP+BdfNs6=aUmcFNuvtp)0 zn8s$-(1bpUl0sMW!RTm9@!?FqE_m!yW^6fFCX+={>yYSfJTpfq)Exg}mn^9hZzwA= zucF--C3b=k8Hx9wtp3CJ!*{o>aIAi7N5qRT8q5Z)W-kB1{;mO!yS zTQ#lzDsK9x4~0uV;BEBAR`AJVz=1?t5a2DA((L@YLb<%>R=HtX_eEF`@!j;NEHK=} zwFn45!mpE1qtZb`$F5>$kz|Lsd=39dz=0q^1=r!Y;YPz~((-qcVQ3D!m5i}duP;>= zbk~@puvq#vS(T_;++u+zCBLB8QJ+)z_4lo#`6_%i0Sn6Y^Ic~w$N_m|X(EP6W_ zYO|#~lC!m!R6w1*C(EK-dg&Jy*^KpiD+g|_*C6?0_&5y!Lx%!u<2Kc?OHi#qcp%cwe4X?yziLEHLj?9^VWX=v2z>1U8-t{c^OgzxZ!K&%Pzm$m1H zm%AWD01OkLB9C~$uft44yz?{t7&~VFSL0YF0Sr1jT2sOFRodEgqO;jVWzR3#s+d}V zSn>yxn*x~yP9fURq$_P|ET)y@DZUt~P3u8%(h^27YJ5m~NO^g=LVMk6gL;b~eU)II ze1llVPHei_NsfwLeO|};M)y(=^`@;xtBA6dadW>BT>?qsK@AN?sQH@PT!kiIRr


q3WT>gr(##*~5XJQx&pva(06J9>zF=XXhO7`BbuD&?*K~!7 zVDN8t^QNd%l~fW=yT2BrRK6d}Nzdd>!GtGKbyy!UMKJ+dGOsF+?9G1FNO z&Ut*#xASKdffZ>L;?LkYCJ34^t!SNL5P_ z|NPSM@-Pzwpa&qc2yeX+P_Qwy`(S*n5E9|`{u+ao(${>&PEo2ad<&i;iK;<1L&T0e zh7cc3WWg%KSBZp*#fa_@R6H-`U_Lf6&z}Qz(bj4zAYYX6wKV*#w;*dn>*-b`?8<4& zxgYRZzc`uClkOs0R?xfU@mqi0>WkhdT(xVt*%GTdkI&!!E{S18&oF)>z^z>1x73sqp1D8yopl~K(jw;M**<1mZ;I}m(;RvsZn zLIrcdex7_I3BZ=f!-+712%GSzgert?aaD$o*%l#-Aef}XD(#3)Bhi>F5QD5yMI9zT zwb6@&Hb^{J9!Rw`qhw)W) zgcafTZO75#1gU+{OnJb_h*~~!;QnpGex1L;6tV17)JR!7HD_mCL0pe|+txicXd+g>m%DgEdzNGWmXY42g=EZ& zcKS)AiZ&S>4bR->M9>=DM#s<1j44C};I9~w87NYHo!m8`o2ml};NPxrNa4wi| zQ~zf|UjXR+R+?9@CiHP6hHb_qkya#2^`SNhVFmkK^lcD8RT*2>d|3vsbf5_jBzh1F zG~r(21W#gcsVY2hA=Y9+2fKj5^cIK#A{*bjF|cgHNtkaYRN<9{u+HT~6bTuwvQX1o zA9uYO4MwwJF_tioWfqG|?CC^q5^-&I&7obMH5P?!2K(KFSd4U*Q|e1wR(ug2dee2E zOke-LFT?%4)Yw+F)tZhzY7#i5KFbxMV0d%ocj-yIKGuy`+S1kZ5y&RP8pETNlB77Y zYxPn_p7ZB8*=VTVsr%9GZGFuXWwQ31<7SPO-4*C7ms-|_2Qf?B()(J)3HznyKU2Z2 z>sG2F0OgT-xodgLTWzi&Y9)tZ-(Ql{*TZK^Ie+CfDiiR+doF10-wiiabs@+7i%~Os z_wp$ExI08$2!V*BP~(@+%@r<$aMyfQP|he}!)=7+O0!6)0W-ej($uf)ql9X9Wh>y{ zH^*o@W>z?=x2$`s-7E;Gd#=S1*7&W8P8qZu-4}TXAc8Px8SWC*FFSv0Rd9SqN*7fb zK{?#qv?J)%=`kN{HiLtN50Xn8?Et8V5H5lwO{sGUe3y0W%+YMDW%^B%xYo>3HCX_T zu*-oCmd=ka@fblfi2xWk5D_yAJqU~3#D*smT+i}@8;hT^X=lm`kV(LVgAAcZcgT`m z-+VVymdXXfKsKkxA{7J`;>jsx%Ep#vnzgrRJ;hSnG0?pkiOWAx&t`etL)`6&$EewpP(yt%{ZpD0|u1y2*nm>qXp10(9AI@2SdixE>(N+ zGs@b%b9x>qKDl(rL-T!h4Q$P4y*z)~bGC;(PMsbsc8(F*#UP5RIcD%TNoW6_5qNVW zr~Bn)FR117!~QPnKq6zsvzCLfOtdz)d>nK*p-Nj0sEtY zEP5o-pDvUJ3(H+G&*$dIFiPH!(Fu(FlNy%h)f!(6_aqrqcDHouDzxygU~G@dUa#1W zx@wMK<Ubz>%2*5y-PUO?GI>f-44E?Q_TP zG^WVYT7QRQfm3hGDI=?|n79D_4VM}BZ_<1WL?<-tOM>EygYbV4w| zECe3y177Ls3^3>SQ2gbk=cDrlePmeSQE!TGI9RhEyM8fhixJZKpFcr&66I8QWU@bD zYc9-Xa@y7r^wHiwSKD_RY6`6wwc6VUDkhzu>X*i3FuI=-2|9=q+Kv*xe%QnQpEdw! z(T&Ait~^T-XWCl=O3XQ+jt%6edh=G4Nrlc9CkfvvDo9GPRAD4Mcw{tq1TPCb7!JUN zoe(Ax54}eiGcmzDUO)-~n(#2_m@rssHwV8HVZ8LxeKRnaqMAWX7Jn`+Ym>H?9$6M|AFq%`Y&)2$n+9Q?_Zq}pwl(N}fbEUSTewhxNT z&2^9X-Co4>M|QUIj}t6y^8781R3Uo5Sfjg?F6`vZaGG*Mw#)C?mo;|-wNph9*5h7b zxYwa2jDf@9cp*j;j>y;KX4)g`^V^rFZ!azY5Vg8oY;kpYbB6eoYV$I#WTFMn2iJ(^ z|9!shD{z*G&uF|P^wu1qekMf~rPs`R5r!Q|GJcHhthd8c=4R<)>>-jSC>Ks{ zk8B^{{W<^S^7NG}T*`8r^P58)GtZm-9Nh%)<2Ks3!j_bTKq@4iH!M&GWPn-mNTsw1 zx5B>Z#BK>bU>G08FIL!rAO3N!@*#fS4zf`m<}V{Q5*8X}aEpVAbxsvpT?CSXXPwhx zP_wrd?bT;KD$0zy6x$CLHrP1M1R7cvwu7?a42d!FazASXJqs!pwGk21xjFx_d$?#Q z>%S6){4;EWkK}=UspMuzf0Dl8Kw24jOKllHQh|1#(>wK=|Ws(<=2c{~CHcpSSmBe%>VYrWNPfw!GvrOXuwdahE=UNaY z4YD=e$oT7Z|B-**zuGuZ@S_2ttN>sA@~2Xz%^_N~=Ke35LN62_nI{ZiFZYYjP^BtK4iKh;RZSDao|SQQ9rEd9m&|;)Q_F3ut#xHfdsb5jH(Q`*a`mm6 zccROiHG$i$F!eQ8$hTg^#Tlpp01oaA}$_! z3|w@z8Z&@vC`V|q1s5g}CrkntnLAl^z&tr~ELqv@DL9g-RgkENzZ03tM>+~UAf>T@xetxwsaf=9tc#%VimJsun~j1u-=P(9h)7Z%q>Q zPH#;oe1Exr`E!tg5Q3Op2UMLQIH1bpuh5_U)eubUG`9HEKvj#Ccmb54WXZvIBb|XE zR-EQ8>QFQnP$QS!Tb4y|-1#Ah;eAq&YwpkgF=O3ncW+wgKWtSp9fF20(Dpj@SXyqF z|G{{e9Pji`K^eV-+^SC%)QV+U7!Fy{GgzR*C$rUy;x8*$QRS({j^(0;%wWs3*m(HB z1grAYyk#>v4+jRPaqv8Hc`Rp{PSPPpb}uR?O^wSg>fzI2mS0G-BZ@PcqN4MDtVCP42Ce-1-Ozm?wAr z6^g$rPu**-$VSNyI7-UFKYML&eGMMuo014(RJHi3(4AltY8?f=5C%DhIwhDbCrJS$ zBz>6?u}Sv*`*o${wc4OlYWc~V;6Eeaj|VCxitRw_iBmh_Uxx}inj^O_BmYsir> z8dDVynH8EOO3H=?lb{1spwz7c<4BZ}af#c9S`(7umI$r6Wz|%8&Qm4wWy$+3h@f&J z`uD2@KJV6BuF@F|7Wb0xWWJ%y%@=jxvybcoEqLwh@~2yW&v$=;g63;SAZL~+${Cd6 zGo%uKrwk*mX3Dj0+sb?AP-GpYH$Mpeli(mqe)_`BaG}GJEq7P&dtts$LIRqb=~<;; zS2oM#*P^Po8ECxGJ}Kg^-(&Ydf@bV(x*V%s1J1Y!sV!5TvNEjVz#(lrps4%Cro5z6 zZLN8ukk9dtTOPP|)S!B*l!(*Yu17tPCR$Cp%(aK7&A1?7&^qFCiCygr3=Q1x&`1je zza>JKG_`F0?M-1CHeiA>s^W#kEHgNaFgT`$1?4xl9*?lY@*(9$4M~t_j7lyA3LqqqNNAq(s~p>s&@4p z|LNT;+>u7EYHRAv-=np$!n(o%uu29|1-@*l;*l^-&Qv$|FxTV5C8g^^;-ZN%3tlnP zd5f;MQV_J2(XP~`B!1A;-&;ZTZqO`4@L0H-aFjqkH9sV5Sd!=O1T2v_&19&ejVHAlix7W80xn#Q47brT4trB% zpZ?fw`7M~(ZdS^oXUbEJlQvqn`Fq8(V3}?1syRsCG|j-w?Llk1(ov9fg^5ijg12JB z1ND;a#LAG$9?*i!VYS0c=_k+c=VQK_FV~6xE@q@| z)V&(}@(mc>85i`M+q1XLd5=7npUTtQI!rs&igR3Dj~2B~Hl-NWWqX23RqBYd_gvQ2(ujAs5ru{P z^4sc!8BFkQ%Zh~s7yqryAZTOA38r|%zpLYy8r8@LMp@DTmTLGAn?v|wBC)0|X(37^ z8FI&W(9$m)ubP&bw_53?XNt7-WwU&{7m7bZgy{VZe#*`X z_q;udJnFT6c`4)4((?Z3qa`8b)|^P6UC=q;-bq0MMm`1GDP)$~kgFk)h6H6nO-PRe zz>GE|(LLZWNY-Coa64vJD^@1DQKptdW~?_LeZapwGsqDY_3N$+o0SQ*E!rqT5ir6D z$2@{YZqIb-Eg=b*l8TPfRUs95aC`;?8z0a6!I>114hF5ekzy>5^q}Gp0kJq-#Ao0W zD(K+slzp)fQ1NaiMD9x01V#<;&=W6OkX#iH+9M*zKvBR0fHg=2eaTF6F69Ag0=a(6f8bgQ?Wxj7BNiC`AH9^=j zftf^~S}_@_a$9^?GCKt~2Eio>5KT>w2I0=%|RqHY$v0aLyIY0D^sdY;sK0 za1<2DZX3f-3P7NTl!hqiMF<;n+nVthuZgSA9y9GG|EsjF@LhAy(>v) zHV0SPGe~uA^SJH!@UhDN|NHj3SKZfX1^?~Y|E{Z>xeBUK#3X5LK3YvnSzlQKIfjk6 zGxeXPqliQb7GJV|MI<6z1BFxBoBU;Uu>j1Zn7d-CWDWt&KHHNFL98(fvZ+W9_q&mE*T5DRI-+gO_uE^ySb`m`BZt&kWb=TXYRi!}LLu z;y|XlwXC_}z0{}lu0{`@+N0JDot6xepF|(9Yk>?Hb-V5PSC)bm?BQ}YLu2afC{It@y#8Q zplj!+>)<lV;wpgf4owsYh|Y` z!Dk0u&QTlS&&7|-DjIgF9`U?9 zz0N4wf{;<8rp$HCvf}B)S*i?IWx06BsxEmM6q(2&gsdWBlA)B9VBAbWcKlrqRRzYJ z#KBy;FmhrnWCa|6`^4TXuX;InSr;+a0ec=AJ|Ig*XUHq2Fi{7cmmHKk6K`G8>v-z# z&{`FHvbX;P%#T!*JM(t_j*<5(&@kK`PDFaq+42?gU+?{M5G)8lv~Sf)X_F5rlpE#* z03k#exF0ei(lI^?O-@TFNz7jo%Q##IB z)*(g{VQjlTw=12-5X|LoOhN%q4VVU2M0dWK-n&zqpqj41_+;0$uu=JrghCjb^I`0& z13h3yoHk&V5QTz3UayL(yzTEalUC#P!M4ET=Q?l0C(D1&N4^alSC4KDJaM`9-hMmz zb|D3K`kmkZ<<8wX>eW@nmi#NIQD=7iZFu$b^Cj^96ESmwnoNelHgEG(MnId_1&3<} z^{%Q6X=X%bNs1?&&zoWh8rEA%e3o7=B06R+-0C_o6+gYnP+ngHZw%e6zB!Nr?H70} z25!8(+@I<q9IX5eW34cI{hhgK76u7z$I!reVB`~q6L9^HBa?1 zVCzEiz>Vz3)Q?{sI9pvDUFd(y6%z+5QmpoD6BwGiTXce3@5M}i$7ALy5;fsZ&a;6S z+j5gFQj#920I+dc^4SuL@FEfN`RoR0oaZ1G&F!isbi@>c$H-E%z2C&{N|`I3d;N!# z00;r|xC2wfrL&9Iq{HJ7`Ih$2e!ksSR)_ZE`F=so%Hb^nQczxwQOLmv4N_u{_>|Eb zQf>;3!c&Z)5Jd~2m&XB%yad#D=F2f8+%CG3OxU963M7UlYS>io2W4?Bai z*^VeAy(ui}*Nc}vlK8yiVIz{}+Ia9<&Q3-vz?rXkA>!c$D24 zRqH$A-=FcA=NIXYYCCOYtA5t{qo{qQ!{i(lM@G=@7@!)SyM%<55;k$^Hp68ru@0GE@M@m-i8b#|7_ay~hgp#Rq;aW(;lUSUJr(EY|SZ z_bYpEZ)jV3TYEYc|H4klJo)taHS3yn7S3n@)0s_fZ!D&gNp`JBnT(sExuHSU8kLe@ zlfK;g`H?eJPu}UNm>;|^grjqSNkI@URwV4z>>Eg!KiN&kq3%AW8b1a4bK;upK()eAl(Iuk?K@qWL6raSZ(P?R@fXeu&p8Vl(oOUEEJa__T zyZ-X=QrSl*nZt5qQivz{;4XdKp!zZk1EX;vLuC$=LlyL4MP1ldo`ay#3Y4Hak#$?goF`M)W`tyeuBn@vAlZm`BMldQ>5h0 zU%ug&S9~37XIlkEWFZGGJ}Yj2mVtdL5o9dwSM8CFKO+d3wUmA(0!Yh z?#+_Ht_Xbn$bB?&ORV2@n=oP#C@?UZ9i`sMNh>unQY6WXel6Jg+iJ)NS_G zU~V;;C{5n!cE&F3*;@f>s*i;O*r_at9-bg<`S?48N%i&OcvefxnMu;UI)!wHW9a6X zSVd1|2!|cM){6=c+HopdDV%+i+>Ir3s$I9X4IkkCpW3)W z;mmCIc?S+ZSkQjrRcJo&CeZGz{P=ijx~90u*7S|{WvBhTH;dLp@0cqF107Q-lHj|1 z1ZX6OyNfFug22Y2MgKVx6SFA*|0NdXI+Cg@+Z!an@lHwJ%CeXh__WnZih20sZ~ZAd zO$JCDi|4TVGhPW$wg%7L&P(Z2wd{hEW3O<1&e7G1mC&)3FyB@z8%27=*lRHjbLF?) zU3a3N%2W4O1naHGmws-fI*`HZEW6}f5HhdQ#yKVhW5|R)i|Mhh>LspiE&DnnX6c1z zC@!IwEN!29l12da2VfWhw2mm*DPzVK@8leoZKEPVd!!>sh?l6-TEM>TotkhZFx=Xx z;pH?l8zt=tqJpZ5AL=&cy{QYc)TA2pl@1I*t zj@I!75&FSLk@9+DnowgSzZF&s>`aj(M_eL$5`L3TnN+uunJ?kh@r!F^8%Ia|V;H4C zIp=4~2CB;O7L_q`SxJ$sqD>{MdzLJ!_?RGSuAFJ^b|L8B+43pUUs$%5A;g*7yLDt{ zay-TgL7bzC0WO4ypAZi-OZO9RFli^&Kj#FsXP_Z=C&l2N{9x|rYl{#n*xUWhY1!gb8Kpm5l9DyvWk4dWGK0*wVsuls#BaDc0TwNsf5y}6&3EShOKit z{PHN7M^jN}s9ijaOrktJ6+*X){?*R{o3X-o3yI2GAH^Apv|zV6!=;yu_OO4-igqZw zCV(#vX3non8i$dL8yOPKuVDsHyq#hpumV3svIQ z%ZXy3Q&;LKjN}Bgg9;>8h6aBsX8Dgj;d>DBp7pDGEG450(knM~ObPymym>9u>-3)G zoF^?hjsCOqz{&h!-&Z*dh$zow=m3{ug_vxIa!kdyomCGHOhg$OO>K3` z#`9f^QJV6})ym>g@nv4jv3Hh{wKXS1hkZ`v_%?YP*;sSbGP8Bd$#p!=doCBC6aqj) zMgg$Cu|h(`$=V_zv6?2Ybb!>$Q+N@{Ad7G?+T3V&T||u)GV5OOh+j!FlqoKvG_Ykg zq`Q$Sj|f=iiKw7q6%ec_x^O6V;KGR;4Q8}q>TBvc|1Mi?0o2(|Km#+ zOZaf|hcY>%41I4`c>9v2&N+RU&0vDRK0cn6HWwNtjtmJTs}d65!E>u{M{6%oJG+ph zptdGhza{9{5@?9b9i{DtA&E;_1tel6C(QDZPc<#Gke0|wk|cJ#=m&N*oq>s;yb|*L!z-C%dKR%@2k4YQc2x=SxqxEPru?kYi5^ z6}e_CuZb4z1p6VAi5Wg}k{9t4lZg&tSu+{8$`B>=SCm;+l3C=(m~r1aU+w0akPCD% zi7+FF(MD^IzT^)!zs18DEH?OyiPdJEnlNkS`1_fcZ*q-F|Jj~IHqueBr>@cP43mh9 zH{eq5LKm_b8jtsZRMDO6-x!m~Die~EzTcc)f6XGKx-V@diu1+cNBL8RVlX zWVv-=g1Lw*VF6CevTZD4`DnkX$x&i-u53X(7wT;8L%*gWqG0|VrR8cOhc|v54QtZr zGH0~hP*y#}6j4Z9($Ih3w8OGgVy$)eU$lD$ATL<1snbz*y3xzMn3_eZb;Z2u5PCCg zlQD}#P?Kl!Yd{=ORfF)UZpICXBfkc_)&n@LGwe>!^+nGl=rp2;9apcJ5Gc_=kP?a@ zPilOS3wzO^I7V$IgY>;3BurW(AGRug^++wXCC4E%V{?c$lbawGPo}2@gjd;BlSU(^ z{X9}zZ8K^rdwQvfx&SkAa8@OaOLM*LRCKXoks+5#iJ7rL*pZ>E+X8Ierg~-p5p* z8r3IR7JEDveI_lMN@XA$yP+~_8WxyV!sjxse-k?Y#JyAec&F2QdaIm(X%D&9lO**n z6x$)dW90ppejf-fzvNRyC~CN;=o#;_eljmVGqkcYL*2cB%R)>I5Z-*k@YV1EHy5Id z56$X*cy}y|zV>u$yQ40JfP?7L6fSbDZ}gw8M6s~ehRXVU(q{9p4@rCxVGH6ds$9*_w}cbye*I()&8_kj=Odg0^q8R$6A2P>R? zCbG@IH7Hq!cps?gOohze`r=|I3tp^gAr< z>R9-35iZhza2Pt|-T1AgCi^$*0bjx1-N2Qmt84gA7%=rt*M10{&0XAM4) zl1p){ksmsQlH-i*MQ}E2Q?@S#pt_T)Z$2-Lm|iN~_eNtCR!pdHnsCp*4Fu!b;ecogn6T zx!7LhaSG?Eg{3<`Fy}h(VN^tr1aP69ZrQx`+~i;JZnyn?M6i4i5V%eCap&(L0*%6_ ze_n%7>y8IQv;r8Ro-5Ylr%yk^ntkaEB>qPU;r2DtHq^1l;3f5|u)DN8@lm_WGpz-G z-1}a2-WGvlkos3CLL-wJVr1a^Z93XPR93s3%4p8Y3FhImVDsUW_#*4 z*RKpDJ@pV$Fk~S4v{6SzwpX>fwJsFgTt|2L_liNam~;`hX*dK#7=~iHPl$>m3nCa~ z%(bC-rq?I51-cYvzG1voLM^rVapC35f;Wff7ENBWl{v+}RB6LlUV{y_->9)zT!)$o z?EScJcS)6r=h;m1;=&-2ETG56aGR*;_V7rc`mP}zXeVglk%^~i>A_wa0*@gXy7Cy~ zMDCbd+H$aDQN~J?F2G%VcsALTCiU4~c=2<7TGESvI-;^yMF1{Imcbxt>~1Be8sdV) z-3nd#Gn(zva}?`;odFiMdn(_c%mSuuBn7gJ&ggm*UCSoO6c~BcO7#}uX`eIR@VqC; zh*;wi{#=$SI^}b$SIY4GE~4ME=xAl?m%x!S8}imrI(}ZWLx*AKffOlDQW0W2XPKTf zU7B5?dMOezx=x}HpBUJsFuP$3Ng>QUeUP1bCyRXM+Eeg;CG=ZoJcwYKPeFwiA;>_2 zrH)!51&UAuPfAW`!Ont$L^|iS@rhI!PMr(zlOW)ih%4S+Y(d_ zuymn}IA5!{#t!8g=XYCA7ufOmS`QN2a(DHAzUP&dbJ=?B9F2C4+`n6`p%2OY`mlZ+!DEVKFut6C2(Sni&{U8bss6F7}o>_+K zVEBu=yp*f=pkt98D0YuKPip~aaP^~=i&ZJ>*|UPXKhkT4I7_Pa z5!18jRoA66Cf_tFh#~T-7W>;emEKsyG$t^R8j+kjM|~V}uQsfj;%Txw^2>A96b_kW zVhT4L0}jbmG7%Or=e0^y3OS|TSlW&()JbGyhh(WFj{Iwset)V=q#WdIU+cHi{`}jp zubO$74<)k%O$9q>18G%WDojI<4jdtGN0Inn-g6OzeEF)(#K67oWM92wY92}ORA6wy z!NuT;Roi-3mb!}Wy#eZ@^iyRH6nQ%u7a~3*h$crz;QIqKs!M9g;&W8Gbs=Fa{=rt3 zzeQ1)Y@8uC8~nmNq8ZKsAV^icPc)?i{^K=Q^kn4;)l>%{pqm8;PgB9*>&x}z`b|xs zxW^VoJ5dXda5_~au~exK(XwVq!9$cSu|>Q`o;=G_O-wsVf_zEd3MbA2P!$Ey?iBVfP@{=bdW-z~aIwVq z?TDQ~PhX}DIR=@G4}so~3x`52TJYK$quQzxugwHuA*XPTS$T#mU>MipM#H1+#GU-k z>hoO8ZGGxF@}392B57{bGZChjuC*?z8qHFJ7-U9BIt33k`#_u(5=v=d+7@b|-Bn!| zx$&yQeFdyOC=0O&GZT+6MYv*=m(prF{SXe4(F>#FYm%EO8bAFYwk6e*v>nH%pzQNa zH~SaJ=i%Q=LWhw%o^7tPkmq+d;)p-LIk(=5Hbg1iAC*3|NWWaPuPfPYRqmfX$qOPU ztrdtZ&_^W%AvI@)$FQy@$_~8Y{ z3Z;wH_^kGx8AY^Tr}&ZmTg%Y8I3J=nakz}#!oXIUFD$e=o9%MY{fJnN#qyZ%4RGyx z8WQ(FERLxnM13AM3Z=#jH^IeyR!z_N^!vY^<(>PVs?nXk(>wB?m&}x_N3`R5FtzV)}#!rlnh=nVv-sdN~Q;mMo4u@5MwyR*N*x#40}}3ZC<$)HDaaCLF)tGJ2G!A;6p22O zH{5AZWYXGl?Mj+mI?jb=E2WS1aYYm>jM96XD zW(F-OqcldCrL17Iv|HghV}n`7+k117Z3(H(AvICUYUwm0Hk+v@xg9CE=i;SQE7SVP z;;x*=N~7-LR8q1H42BYkjm8CS349fW>xOBv=&He;^1guZ#MxIgecsB(Ej;#<` zbE1I}MD6na+QM@Qi)GfZrM!xQT6phzU#7(Y5nRZ;42B4QvpmoTgC1z0fQ7}xP*VR; zGTb82m`^<1Mx3NdfC|I*=z!A}y72L6=%7XLg!>a?hM#-){$Q>e54yYd9Im}8{U~-q zCygW0d5Fo$P3HcM+8k(Pa=kj_6*++MycmNqE~?5SABSnk}t|^Gw&OPccn3_ zEqv|qptZ27?eNfN-JCmC{f0du${(^-rcwk};2#UI7iUl)nCG(A@>SDmzdh~z`B$Ri zroNT;eN=IB2HS>+U&HE-NXgyh8lY531|5&V6H83Y5~uZDt%8~s$nMXs!{9=y3MlCN zLY$WP`-_}hsq`u;Vsh))k5h2;Iu#jRoJ~GoeN!(Rgz{*y?8DE$cWYYW78kcT+9J1g zCPm4{wh2bKcJwR>-23HmotZeF@d%Tt6aBtBW}^Lf6ZR31GfiJrYRS(W(EnbVl=tAv zy8p*PU6sXJ!xI$UT7ttnG1Tt@nsZK{8z3vu{4kwf=glkbw441UBYC8Xb=fR?VzX~j zq)tj#iNj(!oOVIgPK<`yCWEW6I?_@yHh8>`MakW*pj02G>KW=#2y?GPKvxcPMXexj7sE# zqR}q&l2)*V$Xw#!o+~4_5S#vWZYrs!B*U+lV=18Z!)vSd;`Ax)AF> z=j2LLxH2n4Rx)X(-zT3)r8Wp76(b@;)k>|*8UvIQI_ZWUI@Z%@xHM2og>2i&eCVidb`5##s{r_}-$frKWboZIkrl~FD z=+`#kSA9x5zYB{e-_a>0(yLNPDr`VjxQ*D-*0#S_R>Sv^664}`*}%~o6Q>Lz7&iI3 zQ~K%Hy2}O^*krx@tJ1`T1X42M2N8%NrcqDq3siimwnD0@VzB(}B$wzp!idt_Q=X0i zJk^r_!%>9DB9Cl{rN??${z5Nb4Fs$RbTvvWD4&>I_c-(xJoO>$rON_0Qt zHTaNoYHX)P=Wll7ZGK_;P}67mwQ1HAxNJ(MFpq=)_LK7dbw^f(a*MKxJROPD^n#cnb6R-c z$KyU?qLlwl&x*~!Q{~>YUIZMx;AIHAk$B7-WFEu}y7HrYssdLk+EI}{Dm5y4Z5kFD zehLI3ouwA})TOlL6&7AD)MxxyDAo~hBHg_rLt zV5BWSY?=zIwnYu?rhK~3V1w~s9gQafrr9Ti)>ur+_dfHusTinNd!JP2UQg6zd%EN zw;+{4+xIxqoImtQ3_x}I}LHWKd9XG>Emzyy&htDY@v&wp_`L7C*78?^dWYPJRuf3@Q1GlM&QWheI#>5 zwK^26j)u_OrH9k!<>m0&nGxtJ69WPbLx4aC2O7P8H?dU7E_D2k=S%#j{Vyg;UB50z zu0ZY>B(YQDCK1r~$@@1w1PbXAoRZtR2tbdPzz)a(nt<+ zXz5DbVS`%|Ws6&^q|)h-BI~t*mQ>TsnhbCd3>9)vrYE9Xvc*;b8e?ds8p&*`S6PpI~m?5VE`d-wf zS;uA0vdbUJKy(Ccu{Eap5CgrPY>WL?MUXbVvXh%;cKc2b)iEoLbW;*in-^>fI~KT| zZ2S9XL0DZu^DT~Bv1jFf|M#EA$Mqie3wuFrS(ejKSw|8?ai>01x|&yIcM9#8|9?pN zlUDFoXq1~lqc}&%qRIwT1D5GGhynmC5bXi3B!rPzc5bJ2lg&=Ab%8~LAUlk}Fnk?{ z$*mGLQI}bBOrOK%D~S|yshePWXLh&F6MLYm#MWzj?Nf|K<4(jt%*#u^86NsBmb?7g zLmjBBIrj@nvLk;hEga02x0K%@lb5H4W*Y>N*!jOZ_PO5I+IPQgE*NyXqW+EgG!i<& zQ=p8}N}E@^=l~!YBVO1hX4dNr z9LkVvI;vqNjZz_XU#u|Cs)n&EDTJDRkOg71XiZpE0dmbSJzH2L*cM%a)40cG;QA>j z%S5n`ustAX9|lCNzQ(liQ~{Cpkd#PJBw{KusJx(7Ndj*(Fxh}vnk-(McC`i_`+WJG zyZ`q$KKIu$qLD!)AU6BhF!7n@kr8;OLXoP|d?x-f%0)UF~xdAs?s5*2q^Q-1Gb&s!h;LvRrrfs>e0SF z^N3rUSO7ptQUNX2-_K7&2!jztVdX0f#^JPqZ0VbF5pbL2iScL$g%P%HXiU^@Q!%WS zICQvG%o%CjruAKEB$GOnpIXv5Xo3q(MpW4pmXV^4nU#}cG)&!;t0trtezjI{PUiMo zYTZo9uIbffDIJ?lG!@_f>#~j?vXDUY7^bw-X}V|5MQ?I4?$7`N06_wo?_0K(&9>hG zYZ~XFkbqi9vL6LzfPk_itk7DqqEI>{%^VSnFh_wwOlcz|pq!Hkqev2e%@xEZ4g&E$ z0)?k}F^SA!u%_Z7))HQprPf)@f~X6Cu_cg>yMa(86V`&Ltv6})j>BcugPf=>hCogt zir%#)Ar@GuSNrtI-IaFlOtn5$nsVC2Z#eCFTqYGu9&U|AyFf9B2MquF&}8X=1yN?# zRbk)?h>PmYtUv)`F_}@htbhb%L#TH*KmjXXw>>DmT1fdpRiUTuepei|Dvvvq?o7=5 zUI3YRGq(-PZp$RMtVm?}-F~vd&H39;+%syHj|j`pOO(x9buYt{7o`&@f>K6oCo=Oh6deT3~aGPZ!AIXmkl7 z6*xo%zzzmG#QG$O5i_bSpDc%Xa|MXBKn=%HP}rCtB*8E~2C9k#p%ob+BpG5vX2)69 zKAHvu`4~FQ%u1w4oKeEDMH5q0kxIu2BNm&R9(OS{M9yf)B4}bx7s`auk*V_p5JbSp z%<_uH2_$&BStrWo45O}@q358r){$7y%4}q%&N|r>=@8@^^&RVFB<#Qc|JPGL|Nk$w zT9#jN^$ZLHLI7D*5CCyKrjtVjG&ABrqOp|Y$2z7X8Y#XC6|ejd1!wb-5cTt+~eirB5OE6lb% zNmbaCzwf*`KO3zL$Kvv>!L$_j@%VbqQoEAMIUHv@bkosjao%w$(~)o>3@$nmF-9`2 zXaHeN>@#C0IyC=3m1ZKY47KQ?e=Am?hG3g^o;U(osVlDj$nV2<{|F7L69aW05PBmGDI*S4FNGs_<90^3z`98!0EtR>HquCWXb>v zJc8J6ZzK?$C%YfbPy!VdqiMZ|fFUr2?64GUy5c!QYP3Y=B<&W-LkT=kp4HXcHs9xA zpDw3zot29Elf=Apt+b|_!i99X5c;4j_Pe_?|;~m2=E%4)KxQ|)k>p0$TEKjQ1 zJ02lc1o_oJ-Tl9%@q6ok(;ry(y|sA1;=A?6{wrP5-x%GooqOVv{6fuR#nxWZ1USw% zi)a#BS2vL1W|G8@P5(;g5Xt*@IzS?%lWyXc+ZG@QNkGENf`bxYu#8LM)g3~l`UJ`^z=(du})UYzyGr4p$Z^_BqMc2BzIlP zh5}U%<(CEmWkwhn;ECFskWe5uW$a0LhuoNU{ctul^s3Kf4G#oSjiUh|p1>PA9w#z@ z7HrFqz(!?-m}TlWY!>>?G|*(s(}IZU7fl;dwnJxVrF&^xjk(7bD1tIql&#(ymK?yKQIiQ=EvZV0qv|G#bwAb|xUA|zxi__E zmh?^FQABtpQ0WF!Kx|psn>{CNPN|J0c>7>j)=8C2)v|zFQh=I2D9s!QOiyc9qb*Ei zz0Gy*)sv;b5|1hzGDNG-ixE=8RTV*l4sYb?LbaQG ze(j3={Z{4OnxdJSRk<-nJ+-s7?r4&Dzh^hHqV=718FjMie1A^)y75<=kN?`YWbbx2 zrs~<;*LbU#?{4MgAdXi<6i+(NF~66+0hw84s8MatQo05`ZL_}{0FE&jQN;ERJ@9Br z+sDD=uLU-D;=G%F{(LbaaQ}G6TkJ5GVenLD&J`f6k}(%r%SF#9UJay&VWJ zxnl<);fUvV?x`QD3b`BTD=oI}GVx{rkX}=%(2Tc4h?mZk<%(2rEKYQl8Os}}la}d3EX3KyepaoS^(Z z7*HG2T=TBfwfW4lzP%-4YNgNXsZ_UHgJbw@u;RzDq=+m?dausQl5EUIn&cMi%XfWnN$Yi zAgK}UI!=eCwcAOB_R;|13W(++%Qd%-MY;xDc*(vr=_(0euG ze%MTJ3uz+v4<^v@te^p^;GD~^(=w&0wKqB%ZPqhAS36=uu1oz|?@gRwdy7z$&N>?Y zK>d%hva$nn{*@xLrq*X^AQH#MoQLYYIUg9ye6q5nNspbJjYes8oNkufkJ&&f2pfIVS{@R*>_{?Fmq}ZtLycH4(&~cT2SR=ohO13^CTp-AB`mD zQGE5WvR%Ao8?^1FyhuPDIVVDKM@2N3<7<-Nwx&nw-#m=3TkG~Z6FD5Y)MhdA$FGjf zs72rX+wfvHov^gxlJ03HJ1NEio&kt5NUwn*gPbM=Mj?0-wOX2coI*fYdY17n0cy#{ zsb)ExWm!7WhoUJ6M9#}A{Vo-2tCWb4l1n3uXecTS5|eak9qwrgM7Yip0c`8Vw|L|n(EJYTfERHE~RKi0^!=ciY4^LwZoiYrJC6T}fj4OObC11Q*%<~H_S`S+3E?*oSvRIrw3eKqpq!*3>ip@SpRFIryjp&1+wZ-v+}yO^HiO@=cg z=7lIlPmXbZS|ec(>`()tGj@wh z7$VYW)RfV|8U1lcs^HL{Eu%yrArS<0VBjZ<(xs1!cBVaFpJp176d&Pli0-w!pDpT3 z&GrzA5JPOMgz*ectqi}ej^A&!r~KaEwZ7N+efLqV-CLuzaIV$$@-nk_eYi}LGLk^} z|NF3H%>V@JXxD2mGstd73e92Tc@r6?`aFi14`U3{6*V_XOl) zk*vm}I!eszB=iL3R?%Cl)qOJi+eXgX6pGehbaqo1$#Oc{#3D9^=xh2DS=6{Uj~lO| zngJITjHd0j-z@|ZVI&T94#C7Ai9`rfO~tA;stNFqzYQn`JcZwQ-4=OAC~SoI(4sh8 zXzPO|=g-v5BraJ=EtHWOf3uZ^ZCHr%I^9jV)}P9w++W(>+GP$JyS@GWe){(6N^d=` z=WQAIKG{Pf`xE3sd_s_Kkc;hs>RMmNL7jgrpsGiYVhX(~3Y3hO^X(!RCW4-!Fk6p) z?6)*@PTKZO0hkvK*s@mgX2v@aKy20Nr(WA{`LcvX``S6EQOi6^%ed`4@1Th0i5b^CKq;Z!>8Au+Vp&4NQ-aQP863Q!JbR zWiMgfWO9?00A-rp+Mr{AvH;DQNEVzpP=JI)43|{F07N`8&!L7!1p%GEX%xvA#Xn_A zs9O>|*E>qREs@8{*#vY-T?~*)r^{W3jG*SHn$_~2>UQ_}14O`VK&{SmM9yw10p?TR zX5&L#|7{B?-*(}fpkeK0<7Tw>D|^*xaMtf!_l^5gS>5rw8PMwa^zYME%Y%Ht0!YwK zVInt4lb8PCmU?a;CVQ*cmq|+(1oNN7+juZr?XPKXMSU7z)HIi~3 zedSldF_Ea^mI@5^9s?weX3B~NR56~mq?{(k$y=!GdPXjennF1fxTf~|e%S)Z4hk)i zgDU$26d)7~xrjqxd}oVTsxp8oIZ1C; zgPp1rUIw13=8&yc$fp|H`Fdh%YfrB6N9BMdo)3n=MQqjT6JP|94E?KUNHjn zykHT98O${UR%}u}%M`jOLdcr=ERue0RC6HsYmp||s>NlzHE*0})!b{PZH+rn-gC6F zF7j`JE+FP4jTW8`B-vA53{cTVZy6IQcPL44@f}-fRbxfbXmK<2ne{6mldu7|$D)>5 zwBPjw|NF3H*?{ahFm23PG|{2dkw@SGP^JH@!VmDS0fcQP{wnX$wuM18$Fyx#NPe(?|99< zu?EX)kDcwbr^V*Z{Mmysp8RXOThW`_S{C*7CG!{b>DSHlDd9l$0K0d|RbaHEK^G;q z{y@Sh1Ev>*EGd#O%LUmlvr%NDDgYNmlnji7%_X%@4Pf8V-3b8V6O$F!yRvBXWgZd(|21uk@vZ!vZ@pRpS;=)Wcue8p=L z?;}x*$JJH9O~`|`A}jK|7Kk!3s-+|gd=u70$%seU;=d}rsfv>2rf>>(3^P5dV=XnU`WkM!gYK8zi*Tg%v>0-G@#W&A%aIy1Qay#(A!5qRrrFvWD(A)u|Q~q z{K!QBQ$7Ftpk(lX1nyqe>nucScgxznVFP~?Eq7b2u+eF|7c2dgniQRy|6#Uq6VX{Q zZNKUI&tLmbK+hmg(id@aSXLZJ&>)?53-WL!-;+{d zhHQwHExP`;g5yt;lNAh(a6utZr7~k<0u=-3_EFL(y(|XuVlMLmFs%w4AA^|BZyjZH zjaaebC#jb_$_Z}=%fELWe%l5C6ClYlU2f^T2{g5%=P2M*G4jqlE(F2K0@MsOVE`MRIjwRbO+*l& zsZ6zS;xZV+sKTQA?2j1tyr~W2pP4PinZa?TVtY*!C_G>+GS$$Y!szaI@&*tk1Dt}0CT+FGZ zALhG{f@aTTHsAeWO1`=kiDkR){J(}p`A|s;CCP2x839<}vicTr1fg@eW#&mpiXGlH zW14^(!&1T;|NF2+)PMv0TUYA_97=@iy4__Xi4Z+6U#u{1>QFPQDTJC`j=xAChUImD zRW%?%k|XVzrdNK>(BsWCEeKosMjAUc3u0ffq}FC?ce%LzH@e!4ezuJM3P>?t=3R`B{6PF5c~#0gnxy$}tA%Mja1%5g5-`83a3* zu_}ccAb}@7`|h+(P|Cn305IfGPGS*9lpQAFU^cvu#t0mzPlvUXKWr2pcGdkH|NsB|th3#n&J?G!0O@f2fqZ^~w{7G=#cu_*+QeG=TIb zX*GA&tleHHV5sJv4tq|3u$0;7CtxNA1-Niri*x#Ln)i8Eg>RJCc^^}FZMd%|F11CJ~wzoZr; zklvQv(`>>#Z!)4p42%jDEXp+^h75}i1fB3>`s+$pq^XfWj5IP0paRAe3M37kAf#%cPY^Y|72h9e zcTXQ9&>0j1DF#Qg^^L8>IzRj8CY7u7)jkUvD3 zqUfNI2}PP(iMATVE)aSsFi7nF&9bE`=*fP4Soa~?q(E~XjKm36U$=7CYuzd-sytKO zlt2XIX(=qWZm?%7D3%youXXB5?)-w9y53^`x$_VXT)ko=FhI2)s7d2IPq7>n#05V!mWwGt(d@bo) zaiByrk@(lw%yXb%8v_6Ppk)4l1ukaR>n29ZdP};^V8Xc)iFIA9Jr8M$l!qF160cB|r=aEyzgqG#tBt#UWR}10|NEe1<^cqzX4h*BGg@8cTMuBPwG*YGUF@XR;mxkAJ%pA# z#*gl-ie~Lo+m#kpO%sw$XhGW+*iGn+?fGkUaI z+-Vn8AcGqul{L~{qJT(*WPyY#3Z|jS6+$j*U4R565uHNdXp<{<4MnAMk;|5)H#KVI zwJTK&@w3H^ZPl!nQX)+pPINCIKO50BT)NC&|IxOYS^R}pSGHXl|b9r!5UmhJ~!u~t8|x3 zQo}%v50S1*|Mq_BMll&h#vPEKD8!h8~d}{IR zWLk`CF)xfIv)b^lcNxR<`aj>gqVA)xr17{zTD##)7N1IXvNfF}d{#ucN$$mwy)%V9 zha@Bb07eB&3U^!m{psMMXZQd6uw>T&1kz~M>nua~YzUg|VPk(25u07CBz5Vjq$_=d z4m4W(J%Q*F{4H{7x^uOmRa+E>L12tQHra;qD}2{~-FXg%DiRCf;5ac zYlXiYjvO+{IcaN5&+{qd^~gPRd~s0HaZ$1y(%ORIN3qj}mGwj)_o@Lbkw_BjlJ1kh znt@zd^AZKb0a2>rBAE~nbkJf-BW5iJHEL$==sXSGn#e6cc~!F4O~#eIwY#0V7JRYZXVvGo2DVu|-YXsC!iGoPkaLho z@HowPR>s}Tk8?xK6ntkP*ta(a1s-HhEg-fImFly3|I~P#EV^X;vgCD4gOz(FWrSqs zzh%muGBSAuq+LBu(!L5)z#K@^xB($(k&}>uZXz0z>%UfE48s^N^B@$>1xlD1Ay&%T z3L+htyNt;$MH~C9wfAW6Y?E=Es?~>Hcs3Csu>@JpvdvRL@o;dxHz(UIE@il^%SkJ} z%_5nhRF#Zfo6(eF)@3KUD(QYGT`|-#vPnCo=y)23(<*Z zt)UqVT2O#@Z}(JGqfD5$#BAqaFfNcs>502(m9C^3qsBxf|9AVv@owrd05RdqgaW%V z)u=Fnv^5n%WLmQbaWK&H_-o&~|NF3H`2YngXx3{9HK>Bi+Pz?Azf=u(TdXA)Y8I~Q z^_QWfbU^7MR%>G}p}y*VzA0*cDeJft7-WwYfaT2y1}L~UK~dIe1H;jF6W)VZYK=^5 zTHD&S(8;QcXVk26Ox=+dY&n*A2+xT`$6iQert5m3Ocvywj{A}JM7w^Ew=Sg0GkjJ2HjpJkM0`0-9$ zhvvC|tG`!|El2A^SP+alQI~fDl?1T{9Er)YF^Nc?XAHBIOz9n)cmbMQaNNPU7=|!0 zLOEl~oxJV;Ed5V{WvP%Me+w!7pZ-_IA)zcl60O$nDk2bVRG_;<2SVVuNk+ZVA<%3N zS|8CVlRGpt3{a$&;w4TPpcaYmYYnfcA#Kti{TNO0xh}FQ*&H!6D<@;brt(~5YxY09 zsI8pws+w#xtd4H|$@c%<$K3kQ4!oCrWA(vho*VAR?_NLeKD+nt^B4U8)X&VwDR@+1 z=l0jWun@uyHy8p(Y`sLxQG=Zy1W4tI*Fb@+;2~)ArtKb;!fMddY~IpRwXpMI7KY6w zV9-w!es;#Bg(uZEfe{;M6klU4Crggc%DWgkJ#{iR;?UVJ3S~&7)bYr4b?~ zuWI#^4tR5?dIkS-N^Q=*RM*^Ny5roANT?vgPh5KN;P9#GA3ny2}5xn_*rCrvXV zknoV8yT>b%doU=aF<_M3mE411ngPul3#y5Lz;;818Q=gwFWIUTeG?23Sqp%`)?OHp zgF%Koc2!ucF)uezgc<3P-OssOwlFtG2|n@vFLZu|p_WI|6dZ_H;XQk=;3@xUE;2v;?iw9!iz_^vAj(#}iEl0$+-QNUKbt6>|t1@Z2@s!@wjqa0MMrPtI zEJ(utqx0 z5o(gVYB9taXd->EB5cLgf^29xaV$L6)MH;|nX%T1T)V?KeA=$nL z%JQ~kx68O)W;zdej$vGvI9me@APYo)0Yx*ZT%j^OKCQ%=m@r8i&}bLMF@SKnzfm^o zGaEG&tm=2I&e-3nE3cOM^L#v`hNfLLv#S%H9{fmlyIsD&zSnRm4TY`kqUscQ3P$O5 z{JG9C{x|P^eM8JjQ!y=k<94Pz_q*wD|NF3H*8l|TUDj(XLu!v}s?T8~yA+XKVYP>V zDgdi%cCdg2ear9hd*&5$xS7uDUF$zSPhVZ;7H=KS$0dq~scN#NPlLITFeZ@+#bmeB z*X%->Awf$3nQc(Y3(Bl*URRt3y@(tZ0)k-@H}LzsAlr_+sJXklnK_Vh6aOAEDr-on>iFOJ zzDCx9I3!{WAR62M_jOckK0GZsY$wGtFGlsda^EfMW+ zBCrnd4kCfckz>uf4+^T78ohZy_OyMHO2&ONBr*?m3vURNes+z%^EfKY{$ zfXmFmOCkAfTqb8KL@UT-PaRi(u){8+gROF}<0_($!&6eYs&p%RuO4NQw$pgT7-V7o zVHdmIe(u`k@5?X$|NsC0|NsC0|NsC0|NsC0|NsC0uprt*m;nF?pb5(?5kD!(Yqf0m zsACcl0wE0pFhe$!C}@eOQ1TkG!%P7xL^#c)hP6CAa8(x)MJ_?iof^5Y(5lc8ikN9| zz*uneUQT5YX0BuisnmJ@u|CO_s*(qL2ZR6n;AGVR3T1-S{&PeC+so?j&1{e+-Ir7O zy#NAvrmVj;KnP?A_>mIZnckh}|Mlu}CD!g!O<0LU_bJ{z$MM1#kVxYjt&@*WYRtA( zujk>flG(Rzc0GlvXxB2WEue~7k#Ai7bN}tsgQ_+^E`uKIkQ8fPf(53Bb*T zM5RLol&}_5+udYsnpH-ykf}^L9g{>7)WDJmV8;?s)ddZqnNH|)C<;X*6$X;=D79+P zQ}8SyteId?^0l=a(@s+XfQ)Fgj1dEOVd~7y5t8`7jc_o-rx==0Mv}1XN$o0yF$B`0 zRPwtsEGe>5fEcBGNdu3#8*uMst+O zaLWpnCbOc$HsK4a5r$)O>UYDC-CI_GrF^gd|MKSD!H6Kl*e2;=xAvJsA(5;wZ@|QZ zo{0k)1n7aZ1&qWUv^&Jl5GZYg(vL2e2m&ZjP?!q<4lrfMNHhjO11^F?g2cv14j9ld z$p$pE#c~WV42Dcs1bi+*DI7Y+teI^iiyXl^kRilwe|L0N$tv}!mA<#Nb*Zg=R8*U( zAE}o0vm)n`b!oEKS9-1bsZ?<5mN4ZzTW^&ZZJ=NY!17n7N+@42ib+Gz;6N#XbH)vz zU2BFA3`YPV3!3G(G>A`8D!z?bMPgBJU@LwbmocZ||BkY$ndxq zCSI7NFylT?N*@gf)KvmX>6FJ2kTsGBYf`9{JUIv0?LAt0(U}yvxVuc1e5@-KeN;Ul zpOjm3S`-cUvW?5C%R7ZXHT}J%b(xp@0{n| z!<+rq>E_b&N}6CsX_r+`BS@p2B2XLMy^S<5WZDo0q#K$6#8QMD{Yqj506r$q*vBci zZL8V-;TbPvIh$*5jna1#DF_S7*r(!;fAf7(WVPckn^r15(MBo^3q(5?@cRfOx| z=8t=AjMtX6?$Ylr{G7LE$5?;tx-&?NrnTDFpw0jLuw>2v2Vij1hid=;P~y8k?7RUM zVWC;9vGKt#4XkyCnKaC&#&bV<;|*}$z}>M9Fp?;8rP{p7d96)sf9Kq_ta+kAixNiI zv#Qw9uT-#{npyF9Q^`wGzgqbJ>h`Yh>%Cfh`qx^0N4BJI2Dz>Ei{h8?ThSu*yYRZk zKra$iFc!ZRVL{bZAZ8kV1##=1pEVw9A($S{lk`=@jaz>zl9*B+RwRZw!QbUqU)?nF zg&1@yl>xKf_5bzzzu8y+|3!tH47E*bV9Y4OT^y3KfuaXt1rj_c6z*Q5gKlew7qRPJ ztyz*O2QkQ;5V=DEuwA#E=@T_^)v`?7n~MwTS!K>T_D9O1bW%`rHwYVkKK$?D~2p2IFc}|NEe1*8l{%SlH_cL~>2S%PnE) zR~Jd6Q7t`n!FHQ%J(Y>v{Hm})EDvu%!0>=#gR4Shh(>^nfGRF`jn=u+0NUWteAt{( zY?WrSJf+p09qgX0zqR)N=D8*cR1!GA6c+{_MCk;ZYDycNNB4hMy3f#M15=GFY=ypp z04@XcAQ*tD{xSt(1fAnXVSgaXSX6#x$4Hbm7(!=F>+PrSb{Lf4V#}m4 zrVpgL(_LS`V?Y15XG8s3wc~1Tg#<)}XLOr;OuT?ccchT=%861Y1)vm~iO`7T0U#Q9 zWhHnV=x!QlFygB`vb7r|CS)5P0!lEkESE)9Fp>*t6(b7I(-Fuf+9DaH1yW1z%E_s| z?QPf$BSKi#I;C>SOaJj_-)QRC{( zVIyl3MO$g?C3C4x3@rVJrIf`f6B02rwGR$a5~S!e+^?g>wRy5bFlSrm+8|oW11Xmx z_hN5TXGgUnKp`+L$BU^BaFuptiF#43ga6CO-DZ#euEo_MvfgPqHD%8G2*)rbsaP#% znHQMC1$^cifCf`iVw7AFjRUO!J0{@hHa|9l2i%B6Z2{y+7Djx2B;_m8jQda}S zLxICI?$d(E=jo=#%?&DOGDev2iiInqT$OSepbr=!(q=L`Q4<$0CQcaXCXE&)Pf4tG zK)5k0HJqu&n0=y&4MmP#bBwuFQE*8_t2fauwp_GSP0bR>^ou>BoOJ5VL)V?WXLIhjjodeqab!TYmTMsw+h2!@P9 zZjhq~c{tW;T0=cJU*+xmXroMw5UChuJAwrF?^(|ri8KL zUxc{LY{QoF25ykB4oB8YEL? zrrEK3&5thmGzP%oVTuH#`$lCRi^HQlwQH(HPqV(&6Qdnd{r{VY6x)OV9G2V4hlth( zJT@@kLjZ_}6(qIbLlaz8WQ|jGFLmG)t)z-E$J{x_2xe#L*&(t|K_1qf)nj+(o7%02 z?3*3qy7G%jDFV}nHr+eE9#UUhJqsv$N9u*+!ezBeaOfY?!^-m6n-!6m#p`eG&ogZ4 zu_gpbGN%ore#=wF0e$V4djI2nZI`x1_2*9Iat*Ro&41tCR!f?jATkyLQc6ho%dYZA zOB689Kp)Y@0NQ8>jzrjTzi!AMo}qJ0@w4&hBBN(WBXznHtz-ZDpk(rZ1p8;z>nTLa zcM00PV8ew|nWI^(u+bs`FKV@hB1{FA;-bU%?rLXY|5|-L=y7dTBr!;%5(d=|qbR!4 zr;Da)cWalbWNpzo|Noz)x}P%}R~P_Qk0lKt=j}FD8vQo%(_1~*Fpe-yN6q@xtWxczoK(z8qy+@4Ah4&gr5r#agTVuvAF7xbAkbH}pis9i*oaqSP=DHr%eV2!UKliv z{=Kij!bfxf1{L!dZz01O`)h>awWdi z8H?o{RW)LLzux;Ss{-0Rw>Eixd(Aa#UoU^(AGhQZlK!SwP1@~{|NF3H%YX#zX4dN| zL;8J7y3c50y%RZyS*$S6>EkYH^^}Ti_7c|(ddIJ~+035#zL~V(Rb{C1I*jWvheTKA zI&dXI_7X~IW&hX#d7x-D^vw%SB%2c2oeqT6rjuQnquvn*1~B+#_drIWVDUFdnyo|8 zsqSq{et;!0{@l5{90obxFXWYcWI#y7r%4K~A>U;x zJt-wvj!x2Ju5ct^L$#inwj0|@@xG3|C#+G#N13vYR>l< zv&`ooU4Ied*E3R{9qSrP?lf%6@iyuw>hS1o2+h zYcDg(cB`7tVFI}oIeS@Emw+lcuWI(O00dkW_ZBP~P{0H#4HGHJXZpdPLLs8^4~(10 z^&EPXG7WRCPUA{J!*(KpsDpIDaDWubo+yXOP}KxL&1u%P_o-EqRq)K@=)RzHV@^c-=D;nzJ;PfpKefCf#?nX)23dM-^?Enbw+=ibi`f zk*TzltqQ7A?n}DLC94=%L%_$;01yBGAi#l_NeY0HNEm8JrpgEf z5ltN99QIC_>pbA_xB!9xf=XPKA6VuRFeFtn;ZT-B(w9r{NDBZ{XJt~13do-XfoHMS zw2Lfp*nOTd$QP||zRb4MZq!!$C2-mkzOv-5o>gEv2Q7glRZ3WPBioZ%Lzq7mH)e}h zX7{?V%?yG+BahaWHQ7v3VnIagNG0_lh;Ch5Z|qC4*Z|@{9lz8KPp9fjFOEOZJPPba zpE`clYx4O#Hx0|BEiOka#{2moi*{83Ow@*ZY&Rizt4B1REt zlZHfySO5k9o1uxB3K)=c4>uu`En@-z7fhhlV*!Q$A^~K`F?j-u7D%_ryjk$&0j&kV zEUAQ0(MXITCIx}!&IAC1s=I*1+9UM`#vd%{Dnl^LPQ2_zkg3~w0;jw9&z7u42LJoe zWZVD>2YXR&b07fr3~GJN|pSP7ibB<6_?o}z2+JPoD9;T+wS-dP)lx2SPOf_>H zb-efgkNkoLn2yMARFz8V>h@f%o~bE2ys`h@_1^x!J@5bj`>ucG%~TIHc8ilNpa1{d z@m7eE00jsE1=nP}a3LiOxI(80&J}QqV4#RlA^=DbbdD2h2o;MVt3_(ij-_#N)96kK z1(I1UYdsvV`le~a%sEI}GTYvjP~XDBXiXEcxpv!jxeq%^*Y;C2iyq~+V=FyLkEfF5 zr#|mz{xy3&H{1FtGa-{7EtUkO`jon=u9AwU%j&r0LL=8x z4Qi)6X58 zi7uM~ zk&pOf3?Lu~QP}=>qHTevXHMVPW*F*KHG6%Of@Y8rhT>28JA_RaX_3utYS{W{F$}X| z2s*@ZBU$NAvi(&o@=o!bwRyo9#dSJukGeM3cw?3AZ_- zk6z$_U*|hpk;+~-N>6M1cAE5((=r|}2~ymCzQj}h?Vj@se>3SgMI9g5Sm8l~qD31h zfHejbV)ijrt%MK3=8X9DH zp0R89RaG3`MDBG2NgOC9{Fd}e1b}PFVXq{Pry_ahEO`{kNnx-EErux}19ilsw^D6; z&*%Ph&r?2?%1ZU6W0dTZp@mD$yr+~PlB{O3Ow`&|Qo)%z95pV@jTVc|v?X(lt;7(V8p?)ZU_ z&_QN0&BV!uLg!iKn2Nk5Ewy?IHBHY~1WeO!aIMN$1o&rGQz=Edai+?>WrKecHKSXsr4ga_v}$#RA=C%}4IuyoE z&6#yHw)@74%1;W_$2{9#FZxYX-}80!bXC37u)}U_nrfQeZ@Oi@Jmtr`q1Om0T!(aR zoSv!2?eia-K>;i*lI7Cg@|a7T1B1j72n7%lFvuh#r>bO%q5=-u!ofA#5(40s0LMdW zB2^feG%%oq2$XDo3e7Yz1{xF!1ebch3sE^L?edB6F_>bCy(l&X6HOjt6RV;uQH0V` z+jHN7_2PfcYi#IV)8Z75mfz0GGus-|xXn({tYiFo&!7G8t*B$^*KkjBLaQM+Zbkay zz1Zo200Ss9Kt(xpzkQm0>#(>Lk(#K_>mb_SV5)*Yhvh`x-Jx+WSHnDhB^Kq^Q$JH; zclBGQW?#O~by+elU9#NiW_0?uudP~}f3Dkf zS_^5wh?$Es&Hw^Al+lsfcXiDAh>QioIN})?2)3g}m_kc}$rg<+#0EOj76S>t4)z_wsqbXs5%LnFJwDwLqP!Q?t7>m>%wl1@B@!(Aud4@DK+D@jK zcya8#TqjeeP0>Xnj^Sr*BJk`jo#(UM!MnO_OCdDIBw_?^nyX(c{#8YztsY)B-uF^U zneI(vM}w|04Ut`BO>tG;7ka2DM`WB~amcaKxkbuEb+u+ciL|TPzh3as z&WYH{?A?YRwi1#`BFRP52V#O~foMqvtg_2Uvu>X8B+tue`q=+pZ|+_e@t*S9%>Nyu zFtW2_E7C8zo}8P|LeIr}(6nDnC);0LoSR^%00>tA0@Rb+zF16srs+)F027Gb5rn24 zFLjm>)aYeeVOPgWp-|dMwg;arB|L$voBuqi&mvOiW^NVP!B%as?mWS%ms&y6L*o2` z&?kGwn1*MGiSJjjbj!)5F8f()0I|~~CmojY$IK)F^_^h?iw7zIb%Tl)GCVk+$VO#| zn2ohngmPep-O<9$2f_oC7!d?S&{Wf8j7*^}=_+KxQZ|-_6j4qY6p{$-6@1`qnWNh} z6F_GP12B`<*uth_Up5_8a^$KGm&tCt|hWyD^F610q$jy-%B#ZH&*j@u+;- zjW=Hk$1GC0nAB6`n$3NCBwB4nwg56_001cq-}dl36v?E}Rd~k&Amxkz!WCZj-?ZEO z6?*jyFIWHjuw>i-1glTi`z$nCU`6WRVB>cashd}qNKxsLj7Sx}!QVDzpSMB9k!6 zcV)PiXJ(wHot9}qv&f7LAgYw;()C3Wt#wJy;wc@sc8WT2qoCmHSgC{v>iLX^)PZ>& z>0-$NK^PZ2DlmXwLm&}$L@^9`2BVnFQ=sZAA>Ly6Yk-ZTs!*c{(d*czM_(KYDAGTUGknmhbCx z(uxn>L?PnX>WmvqqjChPY@4CfLkLCT1PY#@hDZ_hM$cpEnqEiI)S9UHLG2w_B@csU zo2nj7U1@@%9-P~!k1DflxMNjOHdvI~)+a=*qE#Hw$-_BOQwOu#9~Lgob>>>TYPBXv z>80zUYGrW`n4Yd4-xh^l1?~Y_m+trH%k(>l}|rbt|maly$p%ab~%iy z%8(8=v>R4kcX&VvEnwA4yKuWLg$75P4~ZRF8iVrAr7o>YSiiB$809rD-M%kt72FQZ zoTAMVJouK-qpP&qn2JROhn6B+V#BHEP;{#l_jY7j=;*0-vM^|@aaT-D@M~|DvCM4q zHxE{H-CrEN+mPuNh?hl>r^L;naW;;PRx`1;1&_3VZP}2lj|y@mwK^IwhyfI#1d%1P zcSOX~a)tU}D%dy`RltE#EqxK$lbZg9h5%&>F%+6!3~K@K?!8*!{>-&h^ChV#mjt97 zF~6G~X-X#+|NEds`v3%OUe;3#LuiqVDyn5DnNo3^TdWxtYB{lLwT2<3VDj3zEXWEomNEy!GUu34{U-JuHIQ zaI7$WAvTsQ+*=mLW07H~lWdtSIGr__uAev8cA28hX*a(|Nv%9|TbXQkBqZDE#s zyZ>91kNsHlwJPit%F3};aau47k5p&?>IqPU5(EGdo1PA`5p5p1Ju`^YHpA>Zi#DCI zs;0J5Q4*`y>h=HsV_wRNnFZKT)fnkbq5vjPq$E_b?RzjZkO*Y1bZ#!0ga|2d8ZAkn zi7fdAzyLd4sWLJFFc=X985jwtt-wxfWiW7tgek0nK_)Vaheb)v1&~yrP}1OuAhL^_ zRY7=2nBtt#xkJU;7<@-Cq>2wYWl`H!moVYY1S+OMl;Qjo+8UEGO!AieMO!=8^;2En z_Z9rS+%FDw1E1m0iPYb-Q6ajV+DU}Cuv!FOBir4MPwuBx?!jiu%UH;%2{ z2KaylA5aoQ(arxkPI(sLrvk=!R3-Z(u$E#ENsJQB5EgX18-i96fVu6Vrg7ISK^|ZK zn=bXK8gNh$K%#+;v^lVX*YkN{o#{U;FES$k&+_~E=NekFoMbN}Stl-J@8$M%-_N-o zwkWgUEsmFKeP{Lk1sIzp1f;fa02TlR7>GjvUa9yrS>Ul?67aKVVOto2?0+mvDIG`R zTZiP!A&WUnXpvzCCx`?SGYfNq2qBN*002U~X+Y%5wXU*IrE6te1Fw&6@iuw(PSZ`& zsgyuSEv<7Ph*A+(-7j#+h0$Ta#kr%{i9wx!i8}D2@87A4o_ru&AmynN6fgX~4b=by z_=q7pB)7l?LIOsOi{Ka(mSnAU9&RN9j$oM#p<+k`gsh=B&5Wknspc z3R5^1Lu5~dY>8HfkvJK22C&DpKqE%-Y9B~M7Tzv*HJqX;@SX!GRZ(>$5MX@MF)SW~ z)w^%?!_y2jbaZ83zqIFjt7~^Jd)YUmw8pKE`rVT2wVzhDMwQj_?>Hq|CX4mTm9a@S^+U;Q@eO3)^VXS44YV@+}b(flbjeb3< zq#yvzO~Mg?TflJ4@^J|d^C~Yeyp&RA)fE?gYL|uT%UgUv!Op7XeaBvMEm91{k0#;J$GFJTb&?L%qST!e_n<$PW|{0KioaLaGG9QD?T(?Boua zJCxTT63Yp*V>q*lO4(brR<+8ES14|RlA2|X*VbLskWzdHK8rab*kKSE|O9nY~0+k=;f*l09Py(I{4!g7cAA3**%J{Zdv$(TY8mTt$s0kX}8n z9$705y$C3|rE>Oo0Z2GZO&3v20ENKBN=zaVu?zrAu=7x!3Yb~B#$djQaYwa2tc!gn z++i9~jX~_7w4{%-lNcO?Vt~|P3ZmfI-!TqJhl5kBX%m?!ZDRC>rZ>c^Om80|Syuip zuEyFWtla#ka$LVInJ@3Yj+^6C^pw0nq4M!Gky?>IGkr#*io{g37?3WTG_ogc!3bD@ zX2GFEl=~e5hqD_iEm`3%^N%(d7a^X&Y>5fCt%8BkaSL*VdBIdCMjlb?g~DA*841T4 z)|WM)$?y0{7Ni)ahc8HB<`Wy5l9^ZCu(X=8Yvw$5e4K6W{I~uq^0FJLpsd}7tm}I} zPX9U3U@qC=(0<#y8BhQFutd%P1Z7v(>j*BYjVxOoVd!ZRF=u0}JkM%FvFvGv8SVe^ zlaTqX21V-V^2_?4R+Dd;5=hg!NDYg?M6&adRRQVTjOgP699FSOs(@!*sxL-|_yiKE zYnuWRwmX$6@NS?qxdoD=3RcBLXU>w$fDgX>@VKNxIPlAAf^S+pBN$9o)eV zvh^we0`bsgOD8aRh{HZNtqn0F4;*?*1HnO#VqpT3cV;hU?~aWT9^iHK6mm_Jm#ZzM^dvF><^=(&#P9XN5D1K`kD>}NXB zeI#OTq9=`t7B+JsCS{8G?p)P~bT!h;=xu9NhWi%VTqyBqyMC=niJGbMg%o5n;Pg2I zp){*ioW;GFXl0z9ZAK4VfJGI${ExP z1R(Nqs_b6U0nA9Io1?BM3h5@BaN7E$UJ@wzMQ}4gcE40Wab%^1;DoIxYLkK>;x1AE znUg!0V|%kQB;zCEv;HXDv0-#>3UNK z$Pg4^Kp@u2Vs?xJiVzVnCDrB(H7bm%zLlQHOp=U%7$WOa%k)7RGk}GX2W-+tMn>pi#;c zIUNX&8XpX(vXoqs!RH`?(DXzcKh;EZQ-@?lD+(0Ube1DjAz?&G3L+x_WCU#i4N62p z2N%s0*byowI~G0lL&4B6rk!d$fas-H)##M2IU{W`12Oe2VWnJ)S8m@vI#gX)ON>!* z^Y1|{u3bBv^CxG~?lV?Q_Wyei7lue!c9JDo&zo^aAM!RNP{+BL5nj-I2=&fQdo)*Fk!Kma`@N(jyaW=atSL1INiOS2HUpN_X~KU5%urFsoJ|dyvmgyL9lV(krMZ{WWn(Lm2;eZ223u=)%3kaE zUVpc^oS>3Kh*|qj@?Z2Ocl~bv`>`k0mq~c23Kfg$$|xeUk;PwH-l=BBHoSqC>+$$q0aO zjbkQ|KDXmt3`qHQXZ~jMNZ)Pv)Qu26y#%8|sab8e7==07iu%eXDLWPQff@fcIh3%l z@@QHC(gohQRaOS$2iMq#3Nr?-z2iZo!tEx%LY=SW^Al039Fp&P0l zqB&M(v##>kT-uHF7VhauF0Ct3C+y$!sHF>DU+H~Q1(B+ap@HsZ5MP*aG*nZAAfN<- zfR3J7C216bp}e7C&_tNPfn4H*)V+GhHt`2Crtr$Cn4u@WIY)w=6-Jb&iA3x#A`cIs zhKSrkCB;voo;p6gZc@#~S&tH;K5Ec3D-Q_G&pOCi5i{6HqN8p@1e-q!_x?lOq09TI zqG}S~I{3L8+V>)Bv{^CMeQvp@tko51|K;1ikFWkY6!tlST#xZw)f;1Chd$y1#t*^J zAus;TWr~QXRvYVd*?p2iv!~{ET#!m|3g9%AVFl(^oK=9Tb|)>COO_R*y}xz(vh-hw z^n2P-4Li&`)E-95C}D~JuIl$^u>bp@WcL6CUT9fs3`F2mLpu&-f|3;xi)HMwGJ!!1 zu06a6xbOddVv@c^e=ps+$^^h502?W_;mjeZ7!cGXCeaBkWP}M&2ok|AYx8Z4G4~nX zeb?H4$nI0ZrO_#7oi}O7UTpV(#F))nMO`;_Vpuh~g^#U1&?In`Ize>00-g+uN2|iq zrHs9_xTXNvXKEs53a(7NJJrcg=l}Jy;B+v8jlt=_r&R;+Ev6beX)9H&~DV`=Dg)fCYnOS4%8SuuUUtKVv9W6&;~nY`reQ zDTpk+jJ=4jwx2}(?yj!);eQwU_UZq-Pg||srNE%jfDr_97-$N3j6_&CHs}B;ybK9L zN)TU25|qf?vSgb^q~4@EJbtBd$Btagc-SeS$nz0ZS7dw!`D7zVYRb={uG{L)y!EAR z3ywO^oDh@<d`}HUH)_yBhXc>7B|Nj@rQ}q6{M+07N1 zsUuGiL)bE+P)<<$L@AEHsEX>N?rBnqQ%0jyQDV$Bn53R6iGIG<8VEW|>DPT4Z4m2o z4hy!~tMm+`uX+!rLqaqK)Ht@w20Tqm;NcMgZDNG{7zDr)`aRY@L3|u#+B?6Yi;ioX zce+llN_9Ub>c7+fZp;D{3=4^85kh-32#GF|Jc}?=rIAo4O)bQYon^wIf`l%kH0c!p z?0Z!jNd$5el2d+5IXO46KvKBMbe(TVIoMVg zWh${#1b#Tw^=ScwftD;y`*s%zVhT27;Rt}9V*)1ea zAw(wzOv`DaM77B-jvIev{AsCg%Iu`1?rEzi*ONrib+;}1HPqN=`30)y^7G~k2sty2uW zFTp8{Z9RvH)KXe74l2RD*-FZQ9xHk{wGHzDYtgPgr;xb|w{6-O?W=KCAO*d@8UOnI zKd0#b-`zJ?V&c5rM@1vy+1ekH8cv#Qz;45?lrb<&6840g;FFL6YzQgRK5HxDZfPO|mvizp|uMy0))-R4J zPL>^dK7;jXt)KL3|NUekAS>L`ur($_7cNwjDy{=B0Rt!kTJeJoJ*c?Pz|;ml+P7te zUP=)jkF@zaUUpQWh%iKt1_ftp#gH>yVaOJ0vqC}2#aBle%TBdOX!ET zEirjf35YGdhoxK!RJWr8$2w3!+%U$roH_isGyH;d+toH%HJ%4eC9;$wT4TtXoevSEm8 zF%ov>-14RTF7F4Qv~gvYO(Ix$QzayPHIeflo=rZ+Z_EPILjrp%_T&GhuU8S0^*GD# z&mT32ZF~xnsSD^;W2w=9t!fHXJcy(t#4D+fqpC~oiIO>L(gvImC?HwF;gp;tS+bH~ z^!En4BPm=mPw`V~Kbej$WBAEAXrQ66Fft6W+HuwKZHhS!N1ysV=BSHamzs4CjxGN8 zf9n9_K$AcgO>E8r4Cqj3BJgpbvV>Ejxvn^XRN}Dk5}>nb<}M&vPTHxCMsf+grEx+LpM$4 z@BjbxL#caD7SOedrJe_=0|g&DF57WkL1I^YV^U8#EDQ7g%|EvP|M4)E=@{R<R9h4MAK=!c#)5ha$SSk3@ zBza{4Vm)x2vu=~CCVoD+)ET_=7-?401IJrwga7-WWcGmtZD>{FDMjE^V!JZ|rjOkfbfkxfWDJ%7~@ZV>(2$pkr-zWC}`X#*z00h8+PxC^+E<7I; z!;>;1O>kohaLN)PDEtOwCLPdGM6n9`UfchE`Kf_+fIs_C0a zvh5`8?h!D++88C{n3mM2fwaoJ&>%cqD1{jt191->Tk5Nj8xX39i5cM;cgo_E>)rkL z9w%QhNz_jwA-aObUNHG>>}n>CM|H-X4r4qPArgi@XW3-q3 zKpcYZ+=&Z@%$qT8kAl3jkWt|^5Sa8gu1o&p^VJRgs-k%myL~OSx;3(|ZlDNtQ^&)+ zV^fo}<2*o1>ZWV<5_ltbry=di1+}*=3xXQ8f$y`=Dgyhy}xER6|%wa8V;WFJXms z77eXVETp%A7YwaEhnVD0Oa&r|;zeKZ;X0`66_B5C+E=^%meD^tvz;)>KnX(Dv-N(2 zD$$KcrroOBbspRHf79zlKp+4R0>na1ARu~Usvyx8N-!ZsjA4M7L2I}|aD+s9K5_$$ zYnZBWX}N@XJz*Q;`EZsg4t7)_4=IV*;$gk^sMPA0M20c0-LfRB#Ym<^ntEJ>3=kSR z1DNTcXV&zJP?oPncub~zfsDxduW@}(D;eJA(KC1cT4N?*lv*->D2lWA)>_Rbg=@R5 zx#oFKWB18aTNZXweQctHb56w?7<`cXdoSm!CJqN#YP~cxcp1w~OR`<=yM6n!6wSND zLbOi{TWFRJ@qYQ}Apw_`bP=RbH2OKEv6Ek>FHrTk&3B1a*z4P3yFX6Pa_jk8R{uti z|J(rqlBu)eSmmEK=#3Zz0EkVZ05yX{Rba3Y5yxrfk*zQ>2YnSDC+TcJ(wdc}FI~p8 z(xoldk_>nnoI6KNl(Q~mDKm7|!A!fHw&I0^2@u65V1*2{qG+X*oYFlS)FgbU(yo=B z-2eYN`np$A>BOR>cRRdDx~OCNgNB$==D*)`?Nb_wdY6q|N9AviyTC~OdVerT5~+(9 z`*CyOBnBYFpS?oJr~s(pnaK&h+bz{a27;nk3&sm=ApiTIWY~fQg=W-CPfJimLc4Ea z={pqNolwmrd4Um!?EJhWtiuuAL=h%Lo=ef&*~NTnZ8lD4RAVDq6%SvGS9$~Yt)pmR z6sF~jkNV~-XZMZ`9u5qQLmZNG4yFzSQ1I&ziaMv9Tyna&`oHx5y8p42DC0xOublId zi;+8X7Otjy3=RNtctvDTw{lIY7Vj#>ZPa}#0v_Q7RACy~cKitXhSpR*HoE!!w463( zT&W4zqe}!x0Yt!NT~GbX^>)izneU@iXb5(Y5~ z0yO}_<l%t&uoidnI%4H)W&TW&U>}{x$VwuAi^BWm3!lxuRYyZ`fa&ON0i8fF2Xps74-2RY?f@yS+ z00I)MDRlB_Ikd$$3KFJ3XA@DuG(oF=qH(2XAp{c)rXW=R`=DgnfCRu~*y{;I>Pcby zFBcCN773Y8EhN_gLkX+Aygan8S}@z3iykcOqb7HtO$k+f$qEy!OE7=~#9#nS$`R4Z z-+JPo|GvMG(4YTpH2?}gBqz~yJWX&E-Dq$_{nmXZ|5AV~Qlg2Cz>P=PXOP~XVZ z6Q)>zJj$iG7ur9yAanwzg%7fP^P`F2V6clEQxqqX%}UjgR62CANsa#E=YQ*jdT{lc ztC&Kb29A;!Rt%e2{POif*DL#~Kn%Lx)5z0KX^d0JZB?C+EykZc-0GwdKs!qTQFn3d?9ruxjJ< zR5=H`co3ZD%|o`()}8KR{YjrcX3prv+Qi?DJvhU#?Bp<^+3EIJyXiMJ0X_fiHqtbS zQfRjag#*E}h-Zyp^f_8V3IgO=j3e`uM(&1|9g7{=k7PBg>vgG6mhT+#45irDI=?8P z@yGJzqF{AZN2N>kwoTa3RRdh;CV@~tS0mVzIB8nK0m50pu>bp@WZVD+9cWa`Ohm9# zg39d&3?CF7onfpo6R95x?EELBe2P(LU0gtYY^l~*cG0JkN{5LB9@A>gZZmeezyD6n zp01rp|Lyxftqx24+gIg@+fbAvJW~K5AVZ`Ih{cg1N)fQmoe4<9q`Nl3eZOH)f=$iF%~9z`PjNC=ctW?0zV7bt_cybl>iI-rPp1_6G~)SRr9n9= zjkjWHN-6+#%%BRLJj{g)p<^mjAynK#1rS=vofvxAOHp`NqIwbn2Y{t-JhG*FOYFwn zH5r2o3OJrgwK&;Rqg1m6^2IAs)1=5;jTD3`yUHK}Ij7d_pObm)pp^V#q z|0B08(+yWE*L@j|RbI_erg!6XwCPFb|D>8E#@R@Ge;0e%`?vj!%@lcCEey<9$&s*4 zoVpB_wS0#lL~#N;!?U7$Yqozx3!QGvL_#1C!J=s*VhRGRnqmr2dRPgMI&do7MExUJ zD2Dh&T~&x6^sM6C?LRs2s+-sJ?oZ#<&z1F6QdPOr3SpB4XjVryx7j59x(uyG2Bu>< zc10?R0azPAw}!gQiUSNpWeVU41twxxXsxC0kHiQ;;ApCV|ADZeyZ)g5?=<{JhiKd4 zljWNKmPD07&Ih2w)_6_9h@jbp;Hg29D2xFCT^L+ecYpA^Vxj2fapSak(EnN%Zhbv# zDefu%+g+z?>!j5d&mK>AZ>Ks|@ekD>dGcfy?1cVNDK)eEr%x8hYp%BLtdiX&*o#A1 zPt!>ZXc#>XNU0!uP4B}?UOKTbsJl|VRHm_RCbih*bAnczi3@~~?Em|qWaa<`MP}FQ z2{r0W;(IR_3>_35qi5_e&tWDBY;+tvEKlfkozA;u4#|+BHzl^6Kds;Y+=07tk(*p; zO8}4TJRrahOeg|CAPmA(EK1;ZfvXNG8QPj|GckxmQ578ng*u3dnYfpNh0B*y6=;}k z7=7r=3zxXbrK^9R*zK?$0^4bs~3Y9hmB5i@To4JeqvQZf*(rPrv{Bh?pxP$|@VX%O%SssYI|VQ7%a&Fi?iIp;Jx-B@0FZ(IT&d^-BBLcb*xV zYzCTL!nloh4A7KD@`?6aHDM_uCe30|sWi;UZKhhl6^c;xt%_p^A@xm2m2Za%%uv|o zx5lTH{yjf%Wq$9PorS;FSxl~vkXR)XAZUN(g!5&!8E>8PTf5KyE!D30Y-_(L*T};k zKhCD>+*0!p13SD@HJeMW{Hj%A(c`B{mgTvJM7p|3g`3)8)O$} z;*;`U&rK;q1rqR!t=qfF-ka`hbC$yl-`l5VEn0mR)~~8SMw5sqB1Ovo`=Dg$00gXO z*y{-_dP<@@Ehhpk6G4$@>?G5vK8h^7ydr4u*($380FGwwvjJ!1|*C@dxXaEc)cjS$LO?oG1jaS=B#4INf5$`)Xi0A++GCGKe4veXTO=(~h$2*S`?M-mx{ZAZ$7RzaW1 zn7<}dO73!EZSD|lnA2`CqJIOh06f3Co<5aTP|u zJ~6EuJS>r82wDtTK~_0?P&t^i*SZ@Dk#V3&RAY@*@1(!U4z!>e60!>;53a=Gf#h~V zBSzwHc~U@=U5lf{A;61Fn`Wvle z9kc)LlDTYzry`6A9dhm<48p7pm>{7M3+R~x02fTg84$)6NpKNtwtZhB*RVzv8HEjb5i#d#}vHC$!2YQXUAX9tk8=OD)^4? zZuNzPDHVx~`s*~~w5z2+MTaR?L~l!o)J2V$$05O}s@8cI#_CSJ)UN~}Lc6rFYTE0w5Nda@ z%KAD#t9`uR|KgB3G$mdQR%HQ-?4pgS+5czfr|BYXo^a}EPqL}L z5e1&q49zy`3N>x0Ksb|)J(!U~Nh5A&PT8ry&(K%3?dfu_oa#Nb^VOqY?PvXzd?R*r zqliR#mVfb{&$H{+sEy-2lNeQD1Orp+^QXi=U1-DzU0LK&M`yNN``ls1u|WU(pk&d2 z1p8-KYbi9cSElPnPiX6`amPChfFjatfGK+|F9CEe-6o`U1 z1C{7Xc?5!u&U8CA=TT7i$(YLz3Z}heU`8 z1&N#~LLMiv;Bm1~IIv~vh=4Gd$*HQGm{}AcSp?T4E_Lc9j%kx@Dw&SeY^<+M*DRFN z&qvmBa@b-Q8I4%Um?cJt7@uh_z9;?yuww=iHzzNBLc^zkS^Moq$kP;rlBdo&DCIob^`(wYx+rp1jIV)C8dyvOdRcfj#9&%` z8A{FhigtTC8s$|aQB)!sm(4T2-%8R;tr2XNR&_e9&h+fLovPG6MM@*Iw)&zuQ8Q-x zIL=6h&Q_!nP^i#S-DdE}t;L8YaN)3^7}8}KLI_{AcEjF6(#Yzd3Uzk1)l++y@7w~+ ztR*@*wvhZyqwFl=F2V!M5()fRl@St2Nis$uaz=o~pKVTq7nn+t$9g9E3T&9zfHTx5 z)P0ofYF(+S&z=`n-3$VH&ehqiZL0Bde^?7?ImgG%FMYP#{$F!_Lr<+@Bc21^@WOzZw-0%llsM17bQu$>%JrwL>t0F zh|0xPX^#Naw9vSpY+2PMg-LQ$_csR(S}oGIkaT(~`=iQ1)Gc1j7HvDZ1d{cuD=IaT zh*Kd)8q`zQ?f)y4k=&Zmoz>VIWbFU+quZn#gKB)bhgA0&cwnrD5B~I?o{Hk6N5m590lnsA5jS>}sN3 ziP=>ke3H<$_&5|zf}B-@aL!&xj9leaz@Yq0B`8edhS}*ib63lkDXha?Uo+bxY}7NV zi<@pC9xkQ z{Ah5{3$k7F6gEJD0|Yc#id#jL?S!-S*j)J3jf z{p?=_W_DSO=aeH0)ipqvXuQAA_$HT+P`@(%|M*W#2%i7ev*ggMcI7}sN<#G)&uh&J zJwz4KxvB{glc5!Evfj^(-2s>#(Si*b9uOAXLW6!5LZJ~us!+AM2>6_AiM)NrLK9Xv%5*YOmk2`D zQkga}LuzG_5bAI+g1Kzu9Hli#UWmj^ZvT`%^PW(`6v&){k0aQilANYR!^wfcU?iAp z6QA1b+7RSJOvbA-MbQL{wB~@#H43`&zQhOJXxp6bwR_dbk0g$>n0y%fw(lVt?l`H1 z;_A8VHp{O=?>p~flmQR`JaCD`)(Qts6ciLEjubKHN`i*{7D@KX50aDAN@b^?bN_HhCdU^-&R z1Db&e$tIFua|UG;Mhl8Hlv5)>G&f1eof7SAc6IfQvhK>&B6DSGi?T)Xvc9Vg@8gvS z)3oo$?$@6;qv~dSd)GS~uW)5A9eT@lXV=Tz)@tA3od?OvF)VoQd1l7sZoS64e!5#W z|NF3H%>V?HX4mTp9Y|}WI{iNkEfYnXU96$mBC1j&4=0hV* zA>vK6#~Fy2L5hzSsg&A3L>>qM3_-x}TvpII+$X371gq@pK;s{wOr*ZBR71%*)}>}U zTkK65zL%(EHD^hlN4?Om*!$XDkr_ga13m1m$G<7+i`o4(0jT6;mgTbFWYL7y40@m- zW|4%11x5gj7}|6N&Mv`1Zp2xI7{tsrb)3M{vgO#2CW;1HEtk(#k&01A6k%ck!jlBE zKq%pfS+Ye$h3Oc?Vy4bCu_7!;`Z%HUA@N8>xx4T+mdD=@!C=t_Hq&rJ+eC+;o(Hmj9IH47A8Bc2dWR90Iw)pwmk4$c<1^v|X1 z)>Z%epk(s^1j=UC>nud7a3-3~Wh0eQ;eTJOBy(xTFROiq3LKRdOQ{ORW_3p@T1INQ zPFE|vSnY0V`&0k^s(ULfFM5YvpBgT|@W*DCc4B4E1C#>Dm~){4#332`G)4FfzU;hc z6TeR;XKy4{IQJ)USV@TDCeYARHo1e7h3+xFCLjgq2dVh*;FZR@<6> z*n^DxT87=KSdQK(V}AJ3OdOkm#LG{x`2N^rR6(;(2lq8|_nNZCyvM6ug8p;9N;AvR2}`Sb_5igQWO;nJq$XyysVBM-2~D^1w@Q(L z{~U6wzZ?+?Cj=wSlX6J~DKAJtZnO>#YaTv)uAbO@V77NIg(v+i%2J34Q% zdy4osJ1M%v`*?B%a}i5Y7E`zEaFcPW$n>v@&KxLoxj8`%J8|H`8~xcDLW{C*RUvUpo6=S8T^qugCfASP7qeY)jmwGIJLpS54Y57VEYzd2Hl!zvFqC zl5>C{vRd;)iXZ<)!q&&GqT#}<9OsCaO<9LAT)WCvfNllr%uzlCgIi!Sc5s0AD4|o8 z^@{C|{eegr-Q2QPFLmtWgfHQ~s(f6UhXk8EF53|2Ond9Fhe|ocm$F-Z#F4r$KF^wq z_&u~nJ>^91bqwe+Y7f~VYKiaa{`USj=FQGnqCc@J5K75mDc}L@{&Z(_MX6@>hX7An zv`($oljS>o)7Vcn zD1@s*b4(ti9@F_G%;lk=yIE*dTnu`#G znhNlz+zGVG=bz1_LB)i|bc`vnj6sF|shKV&09kH4zEX5KHGGM$aysX8s3U|s#*Ty| z9@UTf55WZOQhQkTSfn}TM<_YUwt4yrYYGmZAM&8$j0M zDx{j($S4wibQZoWhc!Y>?Fwdv(BTKtOJHGG)7O!s(aiw+4X6e8@PlO?BR#+Lks(g*>DX1JNoOc>9$i!HK)ItVN`AJ;*i$UE+jPiW zOAUT?3o`dgzJ1r3{xo57z)E?9Ldu~dEY`rWu4lqn~6(+z2rVfxDJNZ=Z_mOJZMS3b>2rR*^b zZcM~fnW`0_XpgFxDfuxq2_48utu8Xhorzr+oQEt;B-4Z#-bMub2R$SEtWd|WUnfx( z0GdWuk}Mo62{SHgQ=?-kW@+tKM86OaN93tMmD$9EX#K`j!4(so%|nom3fq*~)OBvU z-!b2?c=Or(PN33PPP#j`avyF%_DAP#lg7Ox_ZNq?xL|YJo&C!6*x-33Fd~f!ue59A zQ<#|}G@h*-f&JoUd0_bS1uePT3X@<-vz=?2x^ih8_~abXUrwh#<}P?m(s`cgCgdp* z)9;gb7UfXKU*RqE|IVH(2<*0*hK(GjjFSa@n{lWj7J1MIGHT{1G2X^4Bq|f#vwj>= z&)=x)N7~erqg9UUurS&<>(hyW{;KiJK`Omd?9?>riSv6dS*lrR!D-tCKHE=P)Eds`%$o|FWP z7==$8Ly=RKPv@pvc4x+Np}1f_znb!{`2Id!7Go|H9F)F|Jhah6Z?y_uyc zuHB!layXc9jW$(eojoL>ZO(_X$bTpM%-UaGZkcSPdln_mymGPjcZfZo43#}4Ith6_ zFdAMKrvHB1Zj;;|?!T>7vkeIB%7=X;9p?zR`~&B|=Y|=i`eE8PbL5I$-WU?4$Kpa* zBP`UTB+-f5z;VR1wBSJz!PEz>I(~HQ9~9miX$mvZI>v!Un^Cp4Ew+ZrK>sj%OYvUF zU43Cht1I2eylO9#gXljml(MFIlWEN^-E<_aDPhgB&zDS7+e2QvqlyOow@VW z;cbH)LF76IzWdB5=d+;7*zqV+dvoQc?4m;*1F|d{9+1@ei%v$8RxjcA*BWt)itg>i zo=^5#OE$AvqxE6g*^yBu2XpJhWd+mY8L0*}<-g=NZ@$~fPZ&$5uup7S*7L~!KC`Jj zsPo!n>+tku0-)iPY3(mMcx)VUfv!|K>lx$yc{E3b>uN@gIM}$OLq}U{InkD_r{eoE z9PDeHUTJp3>!c*eI~~L+uHr)j=U%vf8&SB5s7jIb`W+ffRKGJ{lL0_v0KK@?1(9rg zp?tAxKv)l(H1e2`s+{%!S@@;2$r?{=Q^as;{ZziQjtnMy>LeVUI4jBT}kl>BDR3JL^0{fV1u;H}N)V|SM4-m?c zo{#9)_D-WJ9hC)R1c}6dS!e+O2XCc$g35WQR!~m*F^9p<%F?W;#jKnZYC1wbYLD!8hW2A<4n}I%5z+s|-~nCqe%@T=n}vM0JIRiiWQd7;p>?q_3W#h;Oxwz9eJWUSJW*y~Maqv*(- z;qZ8>$Vw8xno-X9=#p#orP%y zU^kSnSui)IDcBcvCvC0Bge}2Y!Cnt`yJOK%KjhdHvfmiw&drse$LE zJeI>nd66(kQSGuX;p>?3VP2DC_OSpB`#&PllG*78!jigE4da6k!}e*bllk~A7;QJ@ z;hln_VVvh(?fPP&xjSQ7f+J+?bdmAwrGF}r>F3q%T;`%U6yRKnX0K^u!rvn>&kP%i zNJk9_#5Q!VDx&IVm(o=-K1r(cKr3rI?QFO5g~F&)g9C1tI!rf0HQ&2mMnS0uMxM@JC4qSPg*X#Fr#z{{YLBq`oG zlA(N8{9T|nEA;5}cr0DR%+6wpB%nW|OZR72(LrrL&D-ltqDE+r1O_M>3MIZ|6#NH=I0DjuWJbIm;;?fjk{tp-IFxpek_W1 zDw6ox^Nck6G1YIXRGnnNCuK#|D)*R^VX3!pes6w%Zx=BqshGrKs#YN<`)txQ)LSHb zqfnDY)aA>;uR<=sixxK_@LweSg~0ZGL;@YBl*viix*$a>7LJGUe+WySkBd7&Rx{%+ zk*Mw+NI_}$#}4-?+7?nUnm*Pud60=_2vmGFuo_dl5E z00MxMlvPZ&379|vA)!n_l%)(9N0qkJD0gvfE0qU<*QFEZ*RsAKJkMdL>wi&Wfu@2ou1j+M`W%pE%*E;{fgk!Ux3Qs#S^voKu;Yj_N;NVOCSd7MwX^IZ5WM=x%o|@lCD%rZZs55ANX9x zg=ovTUewB*iMm@CwEtHoJIrMiZ)&P!82<_-vRTEWLYrV!T;<1UT|EAB~)fGbB2Z)8>Ui0qdCJoLSEOV0vyM zoR-M0aj1w6wuux3?krfx-AYiHx1_@%nHaH^tg(AHM(R$B=vNpeB?*_7(Y%Wp*`{4b zEm^oM@F)IcQ}GVkK~0elkaCXM_D5y<5eZ1dOU6<%jMz;ji3wa>;q@1u=G@8dti`4;D9nULq^t9u0ucxa$oy!u7R z=eBnV-u{~oSXMQYcG8-e=BiWkgd#9wbTXg0)#c>f=Up`MWCa9T?u`BMDnxk?_6rv* z6#|v}Fwp5qh@U6@l!r2DzG*>(2U+n7rlP2GY(AAEf&Q6?DSl#mQ!D&A4CTgUSA27w z@RlA&_wz)##vc{Re~t`lh#oPhl@2<$hypbm-d}mIJnAqbvhqT^3rgewKAbkISjOjO z^BG_#K!7IO)ZQmQDF}d{R$wry8FQ0?UMOZ?vkZEU?W4mg`0GQ8gEvE}+(&wQ&}%Y> z-;?lsQ0=E9i6xuNl;*FKp67pe#`UBI4Q15bMGrKs)%x76Q|&G`(N2r}H&WK>=@NEv zlq>bgG7(KAZYK5TQG7WtYi#sg;CJvpUYaQzGopPq*}STiZ>bPMJ#K%81HXTHa`zRv zot)9kIZ9>~qVZIqr zb@BOn*C|&a(a*2dFMbdIVlFF|EKRgi7~0ksKs||4h$9pY>~Rgy^5Q>naHQu}vJEtT zwEjqQ(LOD*T&^p8bRUx9^BnzQPokQ&H})df$&lIx7iDPqq~e-muYVkteNJ5$@ME zbRIm1FE*{EcxRny#R6NEI_ygiWt|5Ak&jB^n%TK}kE;lPp6*{%%EPsvUX3MRVSP*3JR zWEK$Mxfh+ipS*k68oDjmXi-x}H6!WbpCOM@^uc7v6XQREHo8cUnp4)I?!GLY|9FXu zC-`vI!a(+g5rKo7_yr{?v=bO-18h)r+gtz8MYzdB!Mlo6ovobLz##Kg0035!s2Uax z+R)v`-5A=jyu#!vqYIo|ACS>lvu6Nol>UENXh=Pe{~h5I5@zAI5Bo+JYl$SAy8yI; zzwgbmo@ylIqP#|tqEeW4$p^7T3u%y6R^J1+Ix4AY5T-Z<1(&f4T}U(&an_8j=WVf< zW}F4BQhy=?9au%~M^IYpDSZ`{rcNoA+|-gty?C(HyF6k(${fZ!UIJk|PI8>T6!N$H z>1aAbXL>RoqYttT1aUg$#9`b}lBf|pSe*th*ses?7`2mnzUh=KIV z+`1!8IBaIJS5$sf*kG#r0Tle7XrTUMc#cH$tZCsrDMaak6_urVM&)u8mIUqyNN0>Z z-<8;Rt4GEv*}^RB8M?+T_GxcAzfjaDkjm zVChulbfSWVS9bi7ia42}Q8Yy*)C2E?aCqaTlo1LfI{R<#ffC@_xF}W3@WU$!V)(fT zM;~)xFxtA32%QuY>tvvV&bsU4ZI0Hzy8u* z|3)Cs<3#A~(Y|T$&0){_{60h@r1R(G+7|^Vy5t?Cp#}dhp^z_Y$e6EixGm6o4OE;C z$po!^f4Pm&LASuhwZEEhxn1h1QZ)S73b=EebEPHoN~PtPoM;@40~2>Js@mS*ezVzS zJFXmwgcW8J#mw{1V=DruJjbn`Dr zyy|TixvFwzp6?#K-oqR!PsV()@$BgVt$&*79De;{&FSeqk;N1{2zpU)g2>+CIlfh(`5MJR)dfH(n+0tshbZ`o@$FPm3KeX&o9a@JQL10(&K;e zj>Q@C?CrJ`-buAQY*szAGDTkCKR&;EkK1@Z>OB5(F_HS-$lm+wlkRiC?*mfzfzHK* z9j(V0c(11_Ls4MK#ma|MSPmHma;{P9V15;h?zw`2wg9Z{6g7bLbO0t7s$`-|%nuP& z4U=u^u`h>GJ*;~$pCAfKH~<(X0oB))^*KrpaR{fj3P0#N*Qh`Y3Ez>5b55^_95Sa? zLNAtBWU5e$PZlc1i|CBWX+(wtPh+QC;_}TEmq7fNnr2XLn#B$@giaSLu>9sf>q~OJqT{)0=Q#|j2f@04drbfF5R+K4hon6vc2+=BNIL;)_AXQbxR+1Q<7NOW>R;NeV-S%+6oz*;2!Og$j=C;H za;5!Gk&`wTx`%c8xE$q_jf=xCN$H8G(HyPzc|gO^KT7oWl!M*tKi#o{P0}QlOg$#D zSjkFS9iys9h?$rC*Ls);X}7K%)kG=ZCIx-7@h4q3v#fBP*ADz{Ue`Mn*DfB=!1FJ9 zFPx9Q-_KvxDvgu>O#1zPpRcIz8PM8W<5}Z+pFFtu|6kIFzuNoz;>~+!_5b}+ZF*C% z?|G2a_@QwM&IPuBsHhCb*DJcr9IX=jpyQ~HVs8h8ky8OwrWmvUHB+E;+(eNfE_As0 z4Hr_X;{eeZA`QtYfg!;xehr@MoUIZY3^F|`oDU>S*9f8#*@M$aqeR4u22G8ciztgt z43OJ~WhI7YG|Ua^lVest);{1%5h$gIkv$xy?H6_|hbDuH9T$kH|2MER>@7t?7v8Cq zUYIi<3?W3~GfoY^m6mMfiyPi3^wX+KWBanAw{VdY#4u4~VMv1F1plAlqKB=YIsYk5;;XEiqdLgD#bR8?b& zhkAXy4(Tg`tNN=lH5q`cBDN}z5x%5hEq=Xv^<4X!pjEbRkBph5qZ4HII*^*^lSQ6jq)Yw1AmKJesH`VHx^P{E{1-!>t z_6F^5wUrjJHeTQfIX2ry^TLh1{i)6Rrs{ED=hxR40nYV}_sV7(n}pU^fnVGmC+kUB zO@@u(3O?VN8jrh1aVvSAi_gEFb>?|jUzvrXr4&Fw83`B4&%f9grxw)3BfPL;o#BE- z^ki)X2Be3k ze7Y%j%^S~1cF@a;B*7TR1-C!R(`l1QVQ;xvLfArF%SK9xKZO`~9fy~N#z%yfL~#e` zoYVYv`!5R(KwzKEmM)AT$O{iitLym*mi_u{mlfsFg(X$PhXt!Jy zx}WHZ{a?y)2fb%On6lB2w1J`mrenlHBI}|Z?+szrEesBdF{vKF;Tjb=7$QQk%7%z1 zn!qtvIUb_i5o6ohRnWoUO7UR+VIZdydrU4fv@4wB^HbDSuG)Pc8Bd-XmjPStfVN@d zo;WdV$i?mc^jGPK_A$?GD)0+SY=#GX;qR13+ils-0#2k+dD#M`e2?WbAu0V&ZEuyx9`XV*kFOew#z68tvV6` z8VyGzCb0Zxlo6Y&maHpzCwXYq5?|%V$D%4yO09Jj@r=62e}+{*s?EY4cdb`moNrjc z#dW)2TL|4pb$X^BHjuB=GD>$Yc3NOQ{2TLBVP93k(c+j1HB14Dw8{x>It@wR7Qw-+ zB7A&vWiByc7QS5O30>!BMmV+svISMJl5^pOX(}wqj+sW`rj1?r+tN^~g2+BuM(Ji> z%_rPcGPu-Pf6I__y1wINbfoN?sJBUv*{>9FY5~o;h)RDCmE_S&{Dl$u2{~zX3&X^+ zo+#&@Z~(&bAn4V20|wMfYIIMlFn>grSYXfu1r8Z1oPk_C3re*o&4HI@eSt z=y%fqN;tHz*QJE2us@#(N5S4B=+UY)MXz-8M9)YALl$Yp5UpxtKwZ%2cUezwXs~YX zDeG=l=|p=529n#_v`3ikE`p<-+=u;JUzy$~X9bdZYg9w- z0ZmB|`C0{RminkH~N)B3ti)J@*P^@nJ+Hub&@j~^phgxL)?>&~# zX(gP>p8w6SmLRY*ABODGoGn`0I^!HjbXf9!x^irvN{x}rZt*GvK`o3vtih@d^l)_@ z8JAS~7@z*Rw_->r!Y*_ss!9wYZP2nVrxfNKju4=r@`f0QxYv59cK{N%K?McL8wnv4 zL89Z+0marJxiUv*`YhLDuZG7h3b)1qvlJ(BwaYdJ-02`(C&*J?9U#$_5@NxzC6Zi)gqBh`$= zu+i{kx^-8QWKvH-vD*hB^rc+97FITO&|>%&?vJ!10Zub6i2xJ`Hh}5vfP|%xQqE_y zAkl^(hn#0l@{1Q92s*vM;*5{Z+VfEaYnovqvr{+Z9Nec#Ja@qBE&^dtC-~!X>sLvn0a|-4%BH0t}9-dNY{|DH;r*5v+|stV+2jyupe|`BL2u@ z8YbS!Bc#kU3+9#5Iw?fSH>QoCHcwI}gX)dxY8Z*p9@J6uDFyB9^p!^l3qY|3C5{a& z$-tSUu>+?CTV;^bVS~0%?^3cG|Pd=<>dtZ zU*0w!egA7#KO&*a=wq5d^z3rF0yZicSLI95lq%WzY)5;rE4LIkxWi=%=!OO(3ZIfKi0Qdm2 z5%}c6H@>r1zgJFaza^;ekV5n1TUT}>C_&8O5_+8+qY`s}U1-ZlL@AD6I(lP+;em7C z7kQ=F8J%`Y+>#KjdQ6uPN0n0bzI9b0m+%$Ry$2@jZFF$8&T$N^`oE@LyHB#@N9BH- z9-Uv^ELv~kEHf>#b6JSI4dXRgD~5EkBUdxC$buLb3Sr zmZZh`SO5<`v!G^ZKIv@!P!}}dvXjaDE(WSljI)yP(FFb-BMHWQq7VLqaS0RkxlC(t zDJy7?2!h%RwAaJ?Dl)99M1iQr7DC_DnOMl^r}#8(C=8f1p=tlK=(+*>k5HV!a{v@? zCC6ga2OC=XaUX4V?1PmRx)?K@F4kZEK&??T$L5r?>_L9A4?A&U!ftXXwa-}pjHY9i z9)BBxO&@F;SXxQYtXE{x`t^^xz9MCOc6VvtuJaC2y7hgB3b)nz$`{lGmjhSE2NzDD z0@0mYVMd(&-mkuz)8HF&PQHaVs9z7zFhBqqZ5Xv~(K{=q<+((imQF_WxZpNNS&!Z(Q z9b+*R!&&C}@H{N4Q*Ri9w(j_zGKdWN6c+k+<~&b=V5C4oJ6f2JOc_}&hl+t28c8}( zWN+cQmdmKfhq9Ip@;BO&)p#KMvnVxZB7Q#Muk<1mJo3xt5<2*zyfAu}1!1p@AC~pM zt|D%uHkt*q*QhHP$B=Qjzb=9O-5Cg?dZY4GVZ&^_8yXw?gWw13w3H*2p5)tV+H&gy zzSq?lrzsXe(>Tk})AC|KV^Ivr+F#tiGhFJ8^wlOh&wlz4CZICpimxoEVQM^WP&LpB zjBpj@L$mMSJ)ukd(L_HmHb3(Y88B7Nu2V9R8$s|iFRRVUz+qttSN3iZGuG8f<91z1 zv$IIvbyI1@0T2qYMmU{$ScuXG2Zc}?ga=_+xI&g~Seoqx8cu`$_Z6wa^<= zB$uooU;cBT-9$Yx&6Jw#AYF?&zp-$;>5AcpwUzIy_N!=f<&9Y+bfjaXozdeNgH_=w~{ zb?ky}DV@Wq50q1^+3Uw5oY{iS$Ju05(zY&0*@&_1pj$yTb)=YNBNTv^8N&_*8S+&l zN0aTHJzV@0^ql}bP+YQ%vwu~v$A!CZ1Qnl;UTz*LOAQnJguTv=DJvHlFKs%MSVD|S zhroY<(ZGi(+)h`pp$M9hiUC1r+Tj1NWfd#QW1jQa_ObZ*@h|g!Z|D)2d&r8i&*s}u z4P-DpCi6O7OOc-%{ED!?R16Ts6pvq9*tFu$H{O|I1twsThYIP3p*qZ!&2}aeaM@E9 z`x=X zV+Py|Yxh!;JTjYSH)w%aev089$ zaN@O=+xs7?&a@r&_Nc?E*^u3S9P&VH&n^8zNkc1!ROr6Bw7!LgeA>77Qig>;HnY>S ztKe^)z8^>3`wTSxc4)KE^V>9NO~SZ7J=hx9fCvMDr_)g~(-%+fkfpb>d21+qwY<4M z7U6O=!$plvrGsDozA6cy4BIbN1q{HP@8UEH%H1iUODSsITwisBxQ5H)G?B~sBP_O9 zq5Jd?2%S=haX;rKz1|w!eSdF!3Ql(qAG*ht6X}#NegUXL2tC4VNphayh< zmDXMB_5->C#Jyo3*u*V8u`kq1AB`A!nm^0J`;(F>?=4OQ2X2y}*YtpKjLK>v)ujD$ zFj=TUP110F)_-Nf6adywZqWvbb4011e%(009JAX^yW*ovNW``g%1O@*brLkZn?!4( zs7o%PhMh#pWW1N@>(?`ymHTDw>1dF`>}g{iQAecO9}-y9BZ>uovx^9MlnLUsw9l+0 z%Q>ZO$f&a~HrAR$CGG|U`iH_2L5YpzQP*L?icnE-u=MR|O}SCAq1Pkme2g?IsglDkRjoFXgxJ`ueaqeJ5TiuOV+uhu}p0$QrcnS*x zM6m-AJ88)y+~EDmRAxm7tuf3-)v4nDNBh^XjiWH zvLWyxL)F24Ab>Ee4e(`p8lX>V29HEmUXlZ0I&lZdRpIDy#!{ZQUePh`Bug?He^gT% zS#-?V%?r4}K%`CtkXs9PKvdeqBH5rUX5*tRG-oVA>+OWrL9v%>_kU4W9dQ!G3PBFV z4hQQ<`6bE+VYPqC#xx>uEA(l^IdGDcNT*x*br8D^L=z^N3bAPk410smTZ6 z$)HwIf$Au>&XNxhlPN$&QhaI!S|IBNw2+Cb~LK|S_a|-o9$3A}n zF1^rw2@l7Ovvy@|wq`QO0wU$y{T#$?{P{}f_)p?UFgfWXY(upZrHZP-vC>p(C;d@6 z;ib7?5_sTtmCA+R8;FPpPTj179Li8QKyA9y>t zp=3bD5*Ei;WPr8Vx==|LCo%K!T|Bc@C*mqY9P5*FlUx$EkU2 zPw^Ql41Zf8e!sZhwEMLYi|H;Q<6>uj)+Icp<*3^$86q061C5^(swfFV%#|u9u*X!S z6UqQX`I4S0TyRp!hOz&jsnC*Mb7fk+4!4>{DjG z76x0;n&t)6HkrpPCYfo7n&cY3*HKVX-D#@t*vj$XFTnWT5@hAGMf$?_6fu6yN$YYU z_2Lv02%y$2v|qh@X^;+GAsZ_UTOkXc1UxAU+AC3rOfAzmC+`Y`<3h7lVX!7ZM#xgw zb`>{�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

8+D$&LxwUx&6x!}dJ<;j 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 z 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

0Mqckb*Ac@JfZ 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ⅅ0pyR3T4<*=NHnO%NM}xnXSn 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

3CYsl|$tz_e$Cl{wgBO)Th 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


*0tMOJS9TK+ky53%WtTTV8>pH?U<= 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 z%0D9Caa3v!+j46H3B_DmR1k(2RMEHbt!*^roCgVN5Eb#wSlv&~d~{W$Q#6L+u~~P5 zA3$VXellm4glj6P(f}7g2)2M&cHfJFeSo8=3k>X;9-XkU!tLo>elt_Z?_~WqwopMj zpH}M3!`bvxZkG{W|BYveXjBi|K#Tb8`G1vg8UO_Y>Ipw|yhKf-dRZi5L9i{**8%06 z7>CA}B<|>_wtr~${XP4MK5$Z#E|uqgV=CY;q^%?xNa^o1DpMS&Su{PJw5MjE$+Oj>B)ayjycIdTW};!x znb@|ft@}c0={7pe(7dpvVfbD3GT^%h0J7_?Bo#eH@`9>1BOP5im--mdc{BY3s%%_U zc}%#L#9f3vCo2voy;x4OeHd!#Nu-HRw^Wyj1z8mM=1((kuFb1^d2Z9Cp~mh9yeSu{ zV)=bVbkxF#914wV;xG1XB*6atTSdE}%R(BAIFx6HW5oemBY{^%z|iy**T5D9t*tvs zq1zTL`07Y8LN=;p^>EmTc~U(_$32&KI8CFs9$Xb}aOe=LYu7Z`QHpW=C^U4D#c`fd zE3V+mVR+AwzI?g)bf?g}1t!^u=UTOFHiS=eL=QekF#daBlBTRl&n)0^80a!B&}{OSX+>}Xl47H%dm zW0IR0e=6WX44}~D(mEsi`!Fj8AGvHP`oBuJ0YHHn{==?$Nt|T$vP?8$$mWCMv5x0- zsTVF`sXj6hQU=x24jDIZSJ{L3Aw2~Fhb#wx3Wf%i$cUQSSl=g7>frA-R+z2FgJdGJ zyo5c0$K*>>B4l~AU#-e!Y0aJXy?gui^P%Vtgk!B1GFp10(XbBqQI5-6 zH5^JJJcCD~!C0g*NgGEr*J`?Rz?Gd%<}Rar99vWD+Bs>R9`EJ?d{)kK5iDlXJY`!> z;7$zjzaUl4o9Fgj(oO;ZWHu0W*Z#yfcxYiN<6^%TakdjK-M(PACigzQk0;F z>4EMwt#N<6Sq3sG)!vAEYOQYLj3+){EWYAB+b2V!te}CT0E3VuTf-#079)Xlm<3ib zZ+#?dc6?}#-SzAH>b=JzHhOd`Ga8Fe4SW!3LO(OQ#2-CA6^n>^Z51?TGfx&;`n!gp zMHBYjAsUUh2txCWUv8IJ+XFve7_x{;15nfJz&swy@7-W}<*>o`rkaLm5k%OqFmuY< z?PR;HKdFAy#_zuSKgbF%5i*&AhjsgdGH3c9k=z(<7gH!>bMOo*LjJ3`icYrihO&Y1 zs5$}25wxSjBq`8qD-DiTwv_^RG~18LDgvCi7+<-vlFmLRWt_=97*0IaVTp=)uw!a& zycxh}zfsuOG@6*u($KN_avf!$X5b_yj2b)3QKilk3rx3>JX}D0h{XW46HIgqi7&*O zj*Qp8#G7G2r-U?96NWM>YDvqHe{YWr$qcD#iPE__@ayhN)w_u4?=LRXJis2w;8FwW zFG2C6ux{iBDQAMQeS&JcHC1bW&!L*yvyd`?EWs~p^)*p9w{4@F*DdMfjhfr)BENYL zY2DN2;#{0xc6v|0rfcIgUq{^iZ(;=X1kV4x9R#4frpZnXK@J~KFbU~uvR`T9OR3;rPg>3VfRDW1uuvw?= z%)Vj+{I?>VcIHyWUk(q(xup*E-W)Trd^Rt>)u`geCR)Ra42+o?MC`(5c8+%H+C;(% zVxz{8>uWdDct`>Pt3-b+(%kQ-bjDhB%txeE2U%D3oqL|(bc#)>Kcw2XjV~_J7MuQB zGC-2L0U+q@?#B;_3Cv{2VdG^*9={?tS4_Wt_A%tX0kQdUYExpV9f6-}3DAg|BWn>V zpFm(WxN_MqH>sKN zASH*h(x5jdqZ>J}pZ9mjaco=+q2ZKX!*Yq<217QJe@2vsoOtn&RvfS5bsjxLm-lSa zfw>rdlLvqht_KkLsq{YmpPsM>QqRqo|9QQ%;Wuh!itANJ3PFfOlznoPY91R_m0*9< z*5{awmoITpq>SE_7;kv_%=X*t+N5?le2~p_Y0GqO+leg7iT=DF^=EtA`8!R6WiMO{ z7u3r0&%2M*f!vgm)V>Q73>mHv*U>IulBf__mTO??#Dx7cwF825Z$gCjlO$1mt7a$G zaaH?Dky4DD2ts|Zy&W9`LTl(2c>X$T0nENk-7$B1Il*R-SJX30KlFu)$DI*n4?J_H z#R_786$s5k)8CG3&%dCoordF{UaY+Z+aJLr%T+Km12m#QBO`2~rkcnS!mFkfOR9rBuVg6>L{&)=!xMzf_6zFq2ChAIl3#LKkhG|{S3 zhWkq1^0iHltO0;P021h;RfEamzXJvT{GWfMzgFdnn9gJ57J>ppj{CKF7M9_ue<7Td zWi#&Xcd{{yx>{Z@s{AoOA09`6A&$3Lq914JTz|Ujby~GAx$a;oke>XXBKxTR3Z#8C zYSbF8QP|-8tDACbHpgl!_L|r5UP`;_Bv)04xO0G;Xnw0Nt|v9pIVmR9e|6gjR!L|< z-nXFr4U!zY;7?hkp+GQ=o}vRIWtb)_qKL?&KW!rX29E+)MWIPeV`Wkl$5g5cC908C zg8C%#oJB~4)PP%r8k2w*-^LH|8e3RZPIohZa-IA-$N<8qvG$@OQUuHQ+|BpHyMNpt@6(I`QO0j+{P~N6#PX_Lpn*f6QuChJQ93 z$*M=pXuo*6kLH`p9>%wdN|dG3Glt$J@_cBY*iZBNG;hxlqwH>@8xTUE5p8`M?NA^E zLnsP~kJ8dMVb<^+kp``LA59-+HwA#fUYp7VR9jMp`z>6xg}ga{tE5oT2u^v5L{J8) zX4Yu1aufZ~CURql^)QF#K!7>;5D#atp(%m1RIQ%6Xti=B?uuiV@>=`I zrqa`AP*LL&)^iF&<^(^du2qu44Qv!SZ^Qml5=vbZuO0ai#j8crE4+BAlwhs2S>D>Z z$yZcPddu>0%;-j9tFkV64SXLkc?3Z9{?BooZ{7uK7?a z+kQA{@Mfu#m!XoFC}xA3IUGzhO=!B33-Sy8ESUUyEg6Jr6g_NPdV#7h=29800wdR& zhn_f08GW&r`t3}VB8mNq^VgJRtrU&XPs4x*nGtI)S8X+D`SEjK{G?V}wLTxcUv7yd z-r1*mdZmWH)wsIZ%%kkmF)-?!t`Iz>^Fh>83!KCws5(p)y>crB(I5t4q1)ccrH(C8 z4Qs`OBPovF&XC-%7mcleC?*e*7*zzH5HXrczWweBMzNGOBY!KfmQhzrv$~nASkMazwTgFpM#$rotJ#{cS~;HYrM{;7 z%;ClLdUiYD)YeM#Te`J*ciB`EMNhJ+T-^blxQ#nUIO9FIHodrck8E8TUx5N_gmFR7 z&sUo{ttezwngf5>z9ubk1d-8{(Fd<89^YJ#sY=9YOz54av)xpX%hBcqY;c5zNiLB77PCPaX zPJIwDm;tZ^SGT$iR1&i;rL#oe^Jz9k5e21~INQ_q;9}G0J@mr~heiX1sr*JwiIF3r zBk8rweo7-@XZ>_*4c?S!6<#rBxYE+l$%bd5C4Prz-RZOTK%b+>8yUiFtoh(Xjicd5 z`K@z~dguQ2$5T&dZ9AV2a+yX#npq@1i>}QK7IK*uF-xj>Y3?BL%52`oJ~57owk5A# zrFo@zqNC{zS!rFI=_@Z*OvD!~WnM`@AmN*#G=Q-KS}Icioo;Jru|e1>f)&w_ zckTQ6fg5Qdn4l<}Im6qc`M**7PXH9D#o9X(%UK9TSFRz%GCGR>KPJ(+4aQ|}TAWUj zgcZo>Oql~qVv>%C+fbNC{`H>afCTu5%7O&FhJl82-Lq6huYHLV)16zsttxAWa(LN5 zf=V>3XTHl^(Ke#(hrkUfw(zi)xS`UJ*eOIEOXB$#KB=&^McJyqQ7|1}ZXD7f&m(7G zn78xuV7zUmT4_@^&(g6h)|N~jlBo@;>r3inrtS>!G!}hpHhV;~?NIV~=0fwB+d4E& ztJK!D<3p37Vt!0$;L}f2NvMWJ zX6J1wzj&L=lt?<%z#?Nt5}aE0{MX8Au1YzU|NKn$S6adB{NhK-M`p1{JdU#$pIU=* zpS81}dG-WeDp6ysbBli?o48oDJMHDW@7=rqxOE(IC#Q3lM*P@ z$LSo%7F(=na|KP@F(0`}zPghQ2JX{#Ox&`J0@!xJ!!53?X+tzd5W~s~OX*xk%W9PK zXL|EO_g-{7g9(3!$qr9dSD^lVR@VVg?4TSjlE{T6Mb(F)aJs5z@_&^Oi*3~!UU)TK zCiUHo4I>ni6dX=g;`yy9H-`?MqvpjqMQxh{q1Ky&64lEjFpW29)C0Gv`@u?SQnLtx zfO`G2p<>$JW`!`AQ@+Jov0&pAHD(4K9Ga1=EGsg0{Y<9OuUd%_6CD0a`A{Oi`3Kz% z&>nbg$bk&o%9pld4u~T=<9Y;#E=XA*Ll1@d&frS0>kciXB;l8qpJ{ny^M!b?BF>#Y zOZB|y=n{+9+WuR9Pp%Q9r~`>8c?&OYsc5{jo>t(KAR)0cJDt{+g5%PvtKsT)XEJ@c zb^!?NNIKso%{kfY48zqqrDU}=v^mY2*rwugN^VG3FP*i-+w8A!9_iBhq81!KSjPS( z-sKK8hoDS^Wu<$btJ|Oh5!QipV7HPkJ`YboQBF7d&xZgkUX%psM5Ho=i=jb@E*{To z@p0ln^F06GV%K)bAvW%W<50%mx%HP+lFZy0Y*$X6k~9r&@_rj}1kTu4z1i!2xt~<9 z<%~O<5(p89g1irDMT(ICi_l~^2x=+7G1Mm_z5<>HvXoqD-2)0v&=8bBq6}(7KLP^7 zsL)VryUcKNVEI}s-NrO=oU+pqZ|*tUlVp@-qs-M$R7xf++u#q+^Gj|2uVCEG4I^Vt zbk&@{$W2Q~p63GRBr6XuI;(FCH3S_mkVQ1cl5n=d(aFzx%*fn84g>MWf|A6yjGovno0W@`y-*Fv39WoXxj5<8JXkzL^wE zM?)0$j*U{W?GfdPSv5e#<%tLtNAPO=k|pIYxCqY4P zdkvZR==?Xd^4VYK9%}#;hy-v}_UHAwwXXA)ZPVW6s1(|s&=dXX-mbJy^2-Xv>nwp^ z7qz#&ZI|`hg3nW^!uZ|9ss#D6KAa>1AzbvoY*L(y8FiM~#J#?&zTti^D#_kuoSeWg zq^8u6vc5Z=l-8}2y$rh38s1c76Gn461wf$XiM0eLnrcj+LC15b< zH}<)o5@8~Fe%Y|Uk;6*kZO+1O>m$7*3#4~s;#@uQqMuYPD5 zvW^d4RKlhPo>0M-^xj`#==d}`hF7aPFc=<&E~}J;i^CWo6DF7lS1K>%+_Lh)-+Pww zj~ksU6v_|U8{sM`u}p-g1|-)c&BpA>rLnH)w;yQJoE;oY`wDScTM1_+)O}_;sHc`EB&wla7E)@p(xnnh2GQB69wQcCw7(;U#>-yR;9Vs;3+eyUH(zIjkE?0)s{>{`lcR60Drw zRMyA>HetIHxZL%uX3s)u_DsXZHtugCOu3!8Pbx8Ht;PJ-_Mx~Ug`?j1=HK#K?acm~ zD-5ymz#XS!Mp}uNaFtkCg|l`!V)0W3e49)P7kvHI@Ki>^1=Hg7GeyZ90XSS}!sE zd%oOHQ3~Jwt@C&53?()Df3aEbe*`|QQm=fT!%_^g|E(Ry8Y~~5qw&!2(%SY#Xs8|0 zv>T1eqP??$^#xWAAmYVI;Gqi&m%%R;q1=Me=B05ayKEp3*aegVKA&c8g$XsT%UuKt z7FE_^jFcWnRW+RB@we%a@C@`=CtM@UV{!`0N(6v~>^cw-@rn?~g9I~;Hz{cE` zO8VR9_I>D23+bQ!N18WzUUX7as6L_|JJ7;Z*Hos+Y%9?+g4(hegkImzBSoNY$M0~J zTE&6qTN5>xa-R#OWq7!X%f7h&Y_fgZfdd;CGCrlAb6YMgu!k{|4Uzbeh0TjT1MrLjk`1e z07f)~;r*}o%mJV%j6oqnF)nGCjakDBDhw(Re*`2kR^**OKGc;U#H`^Zp=rtc>)k#2 zkS##kbKg<`0n~qH!ANIeCKZmhNBt=o;~3kGyGr5M;%^<}asishxZ@lpHL=dxu$Mkv zbd7TBuu5=-ccxjeHJp5-!1IOiJr8gnXHkNua~7nRm73JT2uICZzPPE8vOxreh2TD zHH}}LA`uRu1XL%#uq#%tipH9Gw~rk!zZsD{(~zNuVLLE2N=?!}O$tXPyDcAc7_5-> z8OU4TNN6mFfrkn|F))7fc@HiH`Aag=w8|sUl+6ChlN6!yshw8?BT>QBQ{(z6Uo zHmMrr!V6*4YMRDRgy!7z;rg=uwDRATl_*x7R2yy|&Q3GU!rjY>`)-%>+u^Qm1u3J7 z^T3EQ(>N32tG;h(MGPYXh8IlG_p=%+hIwmLZNzK6lZwDzdxk&01Ea3W5~bo9*kC9g zjDeog78*nXNmIXrpK}Iq2&G&u*iL@qZiAM1%f6pQ0Ki;{KraF4)+&&JBUaq5{mpvT zrfhTBX!Kw2c>+Lr{AbI2lPmS|Wh}MD*pK}uWu9FmTC=F<${5PAvaVdk{er_4Y7I#P zqslv+(AW!YYC)%4oTNK4u>7&b?pV}$E9^-t&yoFMx$pK68H=g$KED#Xb}Y@iRpyn) z>4;CH{j-@^kkCc4@p#wwPGOYYU;glN_F_3WBMc?3>}#|Zu^PUmPr<804j`Gg1kIv& zdk5|-85$k7SJqgq8MJVr6WvGH+)5;J5SV}kCFA^>nKXV^+yQEvyk~c3t(wl6}i*%k{XxgKaD2`E!#6s-a_KNf>P#<^< z{0w1MlGO>qaN(7cKLY}FVTe!#LQ9hG;=m2a_p1<=v7-qG1*Qnm{xT3c5hIf(kwfq( zkv`Q8`pg$HBD3+@d00gR&s?np^K34%RlOlH3~;7?kJ~%?ed3m&GhpQ$@fzw;li2rU z9Ej&@Im&#&$h&S_x1%^gYgw}?vMx1?Qq_bR-bj9q^JPt^k&Wyf z*?`$qN_{r3|^gEg72XiDIg1_HkteiANeL4FA{f((nLr{;oY`8DpxPb$vD zeFROOcdBSWT@|*=#;rSE<|eht&{{o8%^OaofA{d{EaeI=2j$yn2Adg3V=?vO z|7}DhlzM={PJXOTA-~yDq|Avab&lePWY4KENaC2ohjRNtHntE;r4orB{2e_=`a4VJ zSUWqTHD&cKBGYL^^xm*$q($aF8D(ZkGL~VZx>*2N005)nyG#8Y!|S2cB4w|zY&3+- zZ!cX5R@%@huYRp5rHUkUJPW-NE`&y(^}uk^_x}2~VQbwK^Cl7Uyhc>9f;lErs|*fT z6KaDRV{*NAWK9NDShY)AVWN!y(2h-otibu3BCiVT1jhV&akmr%+NGvx?cn$T7N zQy}fYA$l4|wQA7WdS=4Zq*|{sy2DUhM@27)PROXOG=FgYEw{&-bXwbfqUei(Sldot z?ld8LVsxz3=VpAxChE-99DWq)%CS^0_d8221IuKxn#W(YndY5D*v4q(K{!2!GzxXm zCw10KzGm&N-5ei7`fa*Czl%yvcRT-VO;Knm03;zHQ6A!TwirYPx93BwuOI>DMXoc~ zUi808I0Zl@{wHdCC_!4y;#~(~yk>$#ZN{_TurxjDQ8MZyfg=#G1c*c^F>RH0igC<%0^I`H^!LQi0UL8W>kBH|J2V1P) zZD|j+X?ivT4%0aDti0i3zsEwSniaELiiEvb- znIGY{`SO1@s}-6V$w1gQyw6en#+7;C)?I3BRjX1VbcRxfL_oA4OXjI| zw{N?DU^#YVB%x7NY*|1oC458x1?`v-u?z%n$M&FDxDAi741S#S39M#Ot>^(C1(jN@ zicAApCh$U2Uo?vLkbMO`C1#a7yjrd5&m)s9{oy#wQNylfn%{kC3eIw0Lw;Lt=~3YE zfWi+k#L!{PRvptk1!Vv5#53FBp)Gns|2S zeV-BlXaGPs-5ufYaR~f)l=~F+XU2w2o0;$;T=!JljIpujdMM%zx?BwkC%LlIK1NE8x zf&SaEuA(yLB$VPx1?rGnv9>h8#Eg_Xal`>! z-e3b^EGHX-BsNb5U0BS-i3P$15>{hNzd}oT3N9?q(yl^j+Ldr^#IJFYo@wi3p>%5( z1;}5TBM7J_;j1h|Vn=!XTVUQDzX6O9xe<^q{@#TWZKNIA45*f4U;@#A;wisK~oytRXS1h_X)YdobjmWBau z1%Kkz3!8=$qM%F7tEZZ}C-Q{PpN2Oq(fizj8E z@PJY&Eu5s;55|?;Xf@qGZfdFfy;kb%IqB3|ul2rr-b+NtmHyP;Ejs#7^Fs6GPlMrO zS?$u|ua zF2|pd-v^yvn!+SxD89jvTp)|6UqI;| zA3>+4eP5lU6++PLYTkOAd6h??J(BKaQAV&L&c;`?x(P~PK4$erw;Gyq9k~C*1I4oh zCEJ?>00Cg~0OuynFIHmC{1NUcuB3Q_YOLg9_-Rk-e^_sXRd?yN+Vea7r{Wq%+MWJY z0_YOAA_#OsD^|q~x>bP$C63Yi4}OHUAC5^y725lV8_#Z+)lrH96N{qbV&#$OOp4TV zNO7WvA9VEG|BAGDfr(KIiCt)Pj3I!fcwigfcxVMCMaq=%`K})jKmiF+WtI&86~-4k z&A{}zYHQ*A#vgqcDt<^-VKAtQeyXa>Jgnr)pRaC>Z?=7+hir|9Jxfm{X3LLtu?VVW z>y|q=BVV^#g(})%s8vk>0z8{vY|Gyr%OTyD z-+CP1_yi2x6il7!3)zV`HcGRH=BK|Gm$$eVlYQ66_^1^H86kRV0!UXgyaE89Fxd3W z1+Rt!jCRNGPnvnO!n7+90Q;20SeyX-5E!>az@aEu9JJV1^uO?sQHO$5ycPQ?GM~x_ zG9A3RI*XFTqs=davjmRKa0}zJz1EKRW@YUsrc+iw8BJ=n59;I-{z_JavzI4iy-f z!Ye8@>+ytylapvV(91WigU#q8D5d`D@tqJe{tQz7X`C9-&pzNEkB%HNV+^z~oaXv_ zl7)uZm5)x)z}}Grf}Z0{e#^h~UAVybpU1UcViDF8&hiWe#I-e$fiTBl-u$u%PrK(p2Yh4R0z z10Ylk#B2t|D&)bP5YON9KTe_ms zqUG%S6M2(?oTfFCi45jA4jl^(X^eFE6ubq8AP9kUf;38W>C8KMWTPtpfh-C6Sv#Rh zIfVSx0Z(yAESjA6r`HHTz8KzZZ^lZo6I`t4_8}=`6=BQ_|98I5rbj=vQ>W%%m#apr z$SiIf)6VZuA+F~YDZ@>z8nG%(^D4%J1*&#@F-ec*^qcJC|0|roAZ#&D_?f8Lq0m<3j|L{IMdq>*+e{ z)VSw;YbUJp>Qo?_H_Xp~T>wNk5*=57qQ)O9|BGLnx0?gFEA+t8FwgJL%}j|FI_9I3 zHro2P9}QYalk08#5;dp01e|$mz{ap9^m=}iD#zohsXFsVtn=qr{mbm%UTl^tasAis z=FPb2Ar@u87y^v8(hiums-b9ehS^BP-~*5C>* zaf!X|)K)aHrZp+)Y7@Bh=pM9>+mu>g`ie#FPLdUkNO0=$T)VT%G%pkO2*Sm?ss2;2 z76G9F7OIy&bUX}xWziWP#A2F)<^*1h{Z#x4msfn2no&+kWtGG<6ls`0s{h1zRQ1$gWORcc&F7R83@H$ZW=i0a4Eq zt&?9-%w2|ftIAbxYV4n|6mXUta+J>#osBf)n-6h3G4dp0oL6`% z|2&4{LyR>%gY-iIBE*5Obn*w$=O^))R+_EF=RLFuX%czo2g zCJ(kvzBOfJr|<_+Kok<-Kro||S9eNlFW4G(Tn+;M2Cq2b!)iK;+wTNibk*k60_EMG z3W%o)8364oc#1+YZLI% z*Cg8TKxA0MsCiKLvuzbwvSOwwR7MZCRpt)3e6zFOkhOPx4z1pFuX~D6ol088sD2my zS8>OHFYcf>3WtY;fv6WR&yRVm>0;xj@BktuY-_(p0AvsRO5XGAiVv)2w~VclSS-nw z=9P{%RY!NIgo3T$VDG&p^a%&MATZET zev@(=!^FIg5$l+PEk&jSN z0I@6`b1)XhBDqE+1;bzfxGBSj5E#5KrjP-F7?52Ka3LJf{nA9+giN{v3@XneOvq+y z%ok_PCKL@T{(Lo;u55Z`<4oXu5ztE^qe-7kOGphr@jE+7&UQJKLfM5H=VCe0*MtMs z(u*AXrna-W>6d)}nln{=F@vFJE_=^E()5QF-ydHtl zQrJ(E{`4NfX4W#M;%dctEB%DPQjU{-O8Cw8hjW_T)KHx8o#Sv};>7huUMXqwy0pz% zt9k9RZ#%%sb=2M9JHpDBNKW~`oG1w^v2qiZj@A1?fnX{$uWsLZbj&~Erh+MXk{AMW zIEh=h9h)}YWw!Ow#2~O20mlX?dm~_RQi7^5eux$fxF$G3AzH{8fPGSnj%WcE(ukmu zfy&=Fh+rcE6IS2@A&?OCl=PJEKN1%de6rFZDae(%Jeu(LeWtA#wNKW4vWY}H`dIPa zRb4q1x_-?z(det{EwQV0eY94^uS9p#xt0at=v(u?J&hSBLp@GG6JZNWA1AH*tmUhL zh8BkPXV0x)?C4SPWqCm(SMY#M;9JE2TX6iBRGkee9zM#p`; zT^upS(&(KN7hjN(%=q~Y+<`3^RXeV9rsg%siAzmQ9WAx2cC@u590A^`=G>#vdqqm0 zE7S(dRkbD{ifuFcB6Mt#bQ=$53NPtR!3n-;dzUg5h|SZ+N&_yWt-I&>!>T+a5;@ZwZWl@DMc zKNqH?9D;KONd%5`?^01CV#p1vGi+oTNqTf7YOIa@k!%LbXxUDtg=~6e z&omktW06R*@UPwItg?dlizcKm#u*($ztd~HHQqhvCC?CMRZkae5P4Qw4wtW4&#qE=DD|Wi{lmj@ykqGBhy+e?v2#TwkUmTXlBx z)EvVlza7ieMSE3$VzpVRwnn|!`L@e>F|M})r$>{W9DDc^c@KI3d5$n4`>4P7?Zdx% z_qm`2EFp-<{nGs`%qS`}Q3R535+4y338Qg_Zqd}J`Fn;6%he^e2(wbPUWlA-)Fg9G zsgv_^1%ytw(X5p_kJYiMR%Z}fj!D2fM~+;}IdswDdG&>U(C_K|Aa3~QPQSL1%?Gs% z?r}WnW#^bafv()~qT?_EEfhO{$e-}_#Kr4W=msw~hVv{HR-OLF-rpSAemxB*HjLe7 z_aBUu{A;F504O)mDiSovX`4~cno35awdNaNG2#?@r(g1h7qWoOD-590v_F@1Cy&w^ z2DQf=9_(QhGQkmHun(3Ar_c843W-u3q>RxXlC5+k_G^h_Tp$QLD)UM?!!^MmrG94t z31ZtLZjfV!PgcK*GE%Fr>Va>*ywyfHo_JQ>QkE(aU?ny8JJe`Uqu9v>P`pMfvPYK; zm1;5Q0as~cY5=qQR1(GXPi>EL<77J<7}4sE8C9q4|j9#vh^1~4#}!(nniJh`?x7r zvlmr2+oanHbMvc1eAV>NZD}JmleEWE6U}nF+isci%vckzT=mzK0@e^z=v;j_Aap<= zCDP-)-=jjygAseT6QAI+o1EjrZOvrCM@8e?5;oFYJ&o#{|10e;2$BqqwTZ}QZx@Ya zRY$(u4Zl>|n_j=eDB?6WLMV2(zU%E~>;%=|5vVNY&@*b8)G)J9u-c}cJihp)Ti(QC6M3<>}2 zS87j$o)|~vtD73#qL#;R7cTW4-DP1-&;-yL6c9H-8@B*A?7(U{aePt24<$X0aO7~7 zm~mj0Wge8J3e<2D=6*LFs?C@JXRk}UU4RcUIgsLrjIh*5I6Sc~le*vgLB}HgT@C(J z{d1A`@96+KM92%GLBO+3$e3|$^OiDSd|+~Q`_+0oZM<=ZtgFht{&BFo7v6QE`@F?RK_$kY#0hG2I2h@ z?Kk;_d?AHISnZum^cXNvRx*DgMk6A_sMbmQSP8s*tvQco6VohkC#j>=eErka?e6ItZ0;Qvd~q zDSR1THx>bZq~0dIM)Jha^}^?u^GmQ+z@?B87HQn|rzz)-8;mh9#x9GQ`-c~a@}nz5 zf|kS5#7LwGE3=h8UUst{ zoY&<4oKf*&bGTP3cfn`LUMh}pf^FYAMbYtqqz;0Fy0#TkBqT8rcoHg%{lYUSnx4}f zqVVk$3R#}gs~V0v5ZbhkNj*ISo~E^m&skr4D4=suHnFsqkcxFjC=%-J4^M%hcou_2 z2QOxd;uZmKZUA&WfuVl;S4E}h?qOeP6$Fv(gKcNfhFW6WSrN*`^ERSdwuVi1s;QCr zedgBkEVM4Ex#47}!*bpFvQsy23ivP50_8DjHQk&M)Q)iiuGb@2hg0gi$+k~c zAKExSkXvL*2u$k9+6SXxmC3y11ckGRYSi#AD~0nfF=sbQv{AxS>vvS%)zZipwd%*x zT;0=sCN;P6(6{0$jiw%SJhftT1K1p`Zssx!yOvr^!4I%5VF1{V(w%K|K`sX@_~2P4 zqwg=wPGH;Svc>D(x3cRMcNJ#J!$uDF%!>x!x0(3U)nwC+pu3=epbx(vwlOM|7S6tz ztwg#zhj5Oq`XMY29kh*xd|#eN;nOVaF!epvXul`dK&Zfk5j3nP_lfZ^D7C9wMapbA zdz`vfHRxHYU0Gtk8S8mD8oXhj+oq~vfe4FIhP|hEbv%!Sh;nN<%Q(|HTq+-h>~h|F z#*C~`{rR>0=DOajNmZ3=3%T4-eryuIiXdNN#(X=reQ)yEn|bH||!;;MBN}mteN;1iXmg|2}^G9s+$l z>`m{ZyN5*^3_#Nt`_!%M<8R1d; z`TRoDhD1&9@Cx!Ev5z*5$dw8eS6KPjy97z^HHLbW)KsZuT49OO=y?O*R}D(QF@mEo z@Vcxn{Je3ZJ^%*#eLzWvAJ++SCDudfM<$;UER%gB;t zyf6)Ky=Nur4XiV}-4!Sr7p5>i|E(YIg$_JsEWWk-HhVgPLXxgZ--uC%l5|6@qo`CLo~vQ}|0-uZ%hd)oG&c zpvv^uA8O~=dH3K-d|lNCauRfjB5JfrKr?&Uk?E#li15`Q2AX$`z}|#Et*rSARvJM8 zo+jpNux4riQY&5uI2<^DYNG3JCSM6on#2@=X`RH;9UV$MvxUEhHq-B{90gD4GhMPW zX5!%kG4kT!4=JH4p4A`v%j0kKmqSZwn8+QlizS(Lh9r7BiAa(&*fOl5zjMt)phs7! z6KwrGH}GJ%h=u0L_D^S<l{wLKZAxSzN_CPo(3_ZRZ`e z_)e=Tx&pbZ3EZatHm|o%6i*oNkr#rUJKelvib<;=+p<#@rW^X zBAqrRuOZXh$uq3(jB`-5&ob$A3G1!;-vzDU;2 z--lEgnmW0|E%e=v%sn&@seC=_6{S4+_`ZAEzu{JWO%Hm0r?Yu$-y~Zk?VHP9w!Pm! z`MhI*AGZO|00ymYG=$O1`TDSRyOF7%f<@k)agXr+1Vq7@mw~k@ESJReICaf|guZui zqN_|-*UnqzU(7NYrG9{JA5|^5lUDoBLDo;y_eG22O!5x75h`+L_>w=`(old?VwV{H z$<=0DuugcQVD+z7ja@^9LbFQJo2O}cV<#V_na&bFZnb3sT!uXhl~vSE?c;;+D@EAP zzp!t81yptspLG^RWuZs@F1;mqJz594qqowjWx2l_U3aj;kk{D!-Zed>iNd#8$0ZG6 zmk;=a>8>_!Sez{0Uc+RxRIMQ=>qKw+lD9wqWz{D~9EDvcT0_kP8naP^EV88!y zs-Z~XOYlH&?=iWJ7L5E%hcH^73`0JdoCVWNgSHvbY2FEo^==mz_p1bd6X?*|k=-O?rv{e5Jyt&YG)b!+i0ZT51~`JbMKf$+LFs^)h)?lnz>h zmrIlw{o_2@JbaFby4HquQpILO3F!-|)N$Ur%7k=vSDcX}Ut$SvWKs=R(z1>iq&W9y~<$eDL>)7UcXm~1>sb3^wS znBS;$!Kt8UR?1GhiRt2O3w-tnND!u4 zKjePq%1~bVU3y@m0At}uCB(*QQE*kHu%=K$@u~2vnEh^=YiJUXDG3K9bfTJCXtD3! z5ya;!ARt^TR@jA8J|DfCA^eQJhXibYqSmC(!tHl$ZoW7~w~Nk49cV|Ysj_~|JsKmuh*pw* zkRrkZd_e#TMYtL-LOp^i`0kow zvlzBH^Kj&OIqc4cAkazw7J97-pycPMSPA?VmJ^Q+4K?V==`xr;3S&?KAHAEP%_>(e z^_rT)CS3`=E1LJ|PnOW^#C7$LvP61H&{uDX8a*imiBzEGoL9cp7DlAwV}xgE!>-a+ z#dp&U6`yl2c_RYPL)MLuP(nIcjJFY&?{>o@1Z?IvfD%D@iBoxTbt#zWMd7ijv7H}U zzZVeY7!=WC*Q9DvIOxwkChB{c6w^l~F_RZl!-|EmsLS{13zqNI#URO^;rMd3u$G!U zJ-hIaeioEoViZV>v~gKOP+MS2`cKOLwF-I;dt=I%@rSa_LHQ#qti)SgbG?U5ZYbeq z%mJ$YP|Cw2?&!Gdf9Db-vOz>F@^iw3yRzX5sT_cT%!GoAkQLQ5V3qkiAF^lhCkAW} zVRFQQj!DI|)YqdHc)iMAO_28I{k_kptiZS7SVf=o4LZg>KXSG4$NC}Ph^r*#auUS2 zcCL04$#mvA@!GI)%VZ1D_$=Kq%=A>plf606NtYmBKI_AgE3>>;7{Uc1ep>RSv3qBl1oI9ufFWd$2`0H=B>ccq44 znMG@0?W9Lu2$Efd<`h#p1Ahr$yShm5i}kPmYthcnRjXT8kvcF_7W}S{Ecg9yt_zXV zRa>~smM`C~y!w{K^xZL+x9kITAhO_G6{ji>LvzW|jiD!qJp5bJ%4;~YLwnn_T=H4k zWo9KMtnMvpHeeWOF`1@66@9ngTEQnC>as>iA#kYaXC>!mls}Yizhf^OjDUoye0^TJ zTujl4B1}E;p(?~?+MU5vQM1~USR5VIj3%}3_%R}W$>|@n?{a-BE-a}i2#+q@?wQi) zDR`D>3HoPlLkgZvBHOz+m)G^QJjeEvGeKPnMp%lX zBEXuwYPfAi8QA|S(qJPy3I1+KBxWprcL(yw@I*=q=3LNz33>`L2EBteI__UdsZ1q` znJPewS5anWb2*R@JaP782%_j@sl{coya?2}U7TmBYb~%#t&bY~qIPP=HbiBoZVJc3bUeGre8>UT;8gXeDC7h*u*l(#aNBg^=#OeWDY;0E={UO{Y*Os z12b`)qpl62p*ktL`@y>n?=Z!om=9)wvMEA;5z(NF3|g6oWn#aHl?hnhGuS#@@s!@= zsdw_Nqf5=mh&R?;rM=*8*IiWzIX|92jCNBbS-Bp0-< zL)nEF!@o)ZBLH0f*S*0h>HAJgzJ%HJANR)DGBTqePL=!8TkX#nq^&wdjA2WHj@SML z5a^vaf_}__mBKh>oEK4d26a^mUu-;7?hB5}83bJOJ)T*$s?j7Hnop5>nadm5ZhXXH z%`VqOq|}SKUY)nJ!riO*IOgP^&X`lAeH;v=W=X5CG7O!&k=2VIb_>#Ue@Cz?cm8t2 zP(QkNw++OrWW&?;R1xwk(-6Tji!z+&)>B2sp;UTECuK_ZVY5sNUsM*FRq)4Zddd+$ z{v86du1-H|PA!9-KN5i8!4e4OK0bxnu*!nA3Ki)h6ys#dMbf}+Y#hTL5Zy=8p2-h6 z2Qvn1cp45qfm)@%o9-=tIQ)i8f-M$(JAW?l!hGc=3wF%uX)?0~)df=o0}wvA56ReN z_;dJzkxKX=KG%eV(uD?Va1TXQLvf`24E6i9hD#`rh-1v~Rutklqw5j3gtnu_;j>53H6p5XKKqWfX?eA6jpQR>|zNaxagbMfsl=ii6YU&maPf*a(n;b+| zldssSnW7ll3ym;UQdUz@J5xAXG*ae#Rc{n`l@`_W#m>6B>>T@HaH@J4r!ptpr?I(8 zAs76mRZ$K9>|2OXRacT$hX^9-zS8g9%h{N~hkf1T{GS2Z;LPA1Iw?bSn62?WNqc*1 zS$dftQ7K!4THE@H_R#F_21tn&c5Ah%!k5Z9^4Ylecd6(mKpJE?ia?7sI(&=cWG|ab zeA!}-pNeQuu%B%2H5bm>A8l6|g91)4^)1}+vyMbepPWFTd1a8YG3fa(cbVi=0#?hS zpS7U+R_&G@Z1L)?0;<=^4JD!0p@ujmhk;q+SiKBDW_XPBAchJ}OquK9fD1~=%5lbm zEkD}XfLOmCvsx#viCkNAC?}?Fun<2>p`(g*vK%}wQ|6UhEl&_6+*nvgJRC|Bb}jT} zsn*u;99or$5e~G4RoBz1q%UMWu&c(&j}=7yW%4iGuu8HH=^%Y>BdoLf z#-ffC_LlAP$Rn;rW{kRdRsJ(=96NE693K^cnMZ3)4Ch-*7tKQC^|Sxf#;mCFYcE>kyj`799?qlxK<>rSXhH#vq>l!8+yR}WMr=soMM!2 zxx5Ut*3(CCsV&EImF4cbQ}+@PdCO{&`2l{36(=i!O8bOdyZZj485yEN(a_?O3H5{)QNM#WF6`O&a*2~uuOc{Os; zEXH5yA`tQgzf8j`SJ`nn;gipM#XMY1mpM_z3uNh9bl}llgs1AnGL8VSY?6SEZ4_n2 z7nf2!5@EyIJOIs|-xYa(`9Oz-sLKP`HRpl??{AD=!@Y)GA0^Tqpn2nm_Y_2jo(=7h z-K{4qkn>sp;Vbt8DM7W}5{VZx8sp01QZ~>MA1xo9oSq;N!YWf&z1VGsS@I|L7M|;= ztQOTQr}q>YgAA4G*T9;r5CtyJ&Wlb@e`D;HI`#Rga^HGgyru#pc>~OLE0?Ms{LA<@ z#>HgrA58nz=<}E+uZBW?cp>VV%l@nM%RhZ9Y$=_Elr$SHFgm(ZgTh?57s`%lJ=Dmz z3gY$AjLx3K?W?G?%khQF_nD#;3eDBZzfTnD68K@NVlBP1T;+i_NNoV0z@2X$OE zUH&_J-T}}p|IzF}%Z=9rFdZ9WtAe50VAm=Y@r8RwjYN;DiVCNtx(%E4$Mw=ZCnhO& zYl(&&Ot=gx(92K{p_Cl|(Rgtz5P>g~ZS2GZ0Bml;q?iygB3I&avbuD<<5JD3R=5pA zEs+W)9sAmw{INpeX`6Ed*4L2f3oaD2&fFeOELKxE>5%22Z0z~@8LN<8tVsJmbte%p z9l?vychxdcO?_=XK>B*<;31tkag{JE?!;%-VE!V5lX@G&;ija!+?(WvhNmPkOAH{D zpjO84QpiLsaCPgR%A<+AL*}6UK2kD6PclF$akaBt*n(4UV>S`ew57t;d*g5U^=3S$ zA#%1ZBU{8^Z#V>Fd>QwSxFUNh>V$beSe#o9=x=mG<^edKe1wuV7Tdd(}{>kd+*lpg2!n`J}I znfSIfQYYO@EQ$M93FoTBHEk62e+8nx+!%Q1^r~%UUQ%f*HQ1NM zQV58#q6n90pLPT&3<2G-zQc#jw#CYl2Z_F{r&O?CE>_ zFcYJ-27c<#-qRf?N@j%qj>9?mYDZ2TBxC1{kmBe-JmT3p@cXB)OF?qpdd8n$LpZnu z1@5nlTEczV8L%%bh%KSNar0`W>u--wP*rTAh4yj@rF18T)2U&u4xz~_88tMk9tagj zkzC_aY)}HQ27ZP}j@TQ;YtabP{fc)vls6}Qf61SSf3BcXmF$X2hTuDlpA1qActei8 z1zjhO!lDb!UF$^q72XY1!=t*4{)uOWvM5Aj;3&A4`j!X3RS6T`d z|Go>4iC%X}pjt904lub`Z_!!}YNrVLIJk55TIw|F_<9Rxv1RyN92}cqI3SOuG>@+E8->>s|{#$As2&zL?}W`c=w~B2F2jP_zY^{t>_Sp$tSG z{qGh64+>)b#nejp8khTm2oQ8}Lcs2g#x2vnY`gc8=KO=;Dc1|N4ST^#-T`sP~Gy?9fWUTHB+gGd@!<`TG(yG+=S6|4k$W%pmnw! z>aUuP9DEqyW|a3OuaJm$#mMSw+7F>MO+hWd+OZ?#==Yod$XI_SDszN}B`T1C<9D0wteQ8P>wjzO6Yh1S0c z1I=QYQd5E{#3A&va{@Tr#HyjMvJQ^Vz7+<1XuUi=1+faf26JaKV?VC$;uKSzU_)j? z5*4Fchz=$8Qbbm?F3_dzM#jWH%Kx^AwA)HyLBk$#<9ot-pS+yqBEnewk+);{`b}$s zf?0UpeC6tbH(8_RLig>nF6PVMoC=E&tl<+JEBs5xrZPiA>owmkI^u$et8#e7om~uf z&luV|yP;oB3`#dJPD)ol>Uqa&dkgG^%C?5(F& zApfhl^I&Ke@V5}yLl{D{S#OG1t;q-W5DG5rmu1(ym*D4vANPmRUs(7)hm0a>DLkSf z4VCSy!6#-==pZx^4g-0nEu-2x$H|e ziW&C{<>s!dWjRfo_A7tnj9rvx1M3#FUrwDk)U0si#-3_yeulvx%;aHwRs*|5G=*r z-sz&9uV`TnDFzW8iyDs$YY9us-&0*?Rbf}8rG$UA=(e6+sF ztjAVtx=W%Jr4ebkK5ekaPb>u~4sDhVQkkqzhYZv($|PYbrM0t2ToU-DXyd0>tuB9u zkax1_XxoNleJLp6ZtjM@;%Jw-G%0Fv7>Z0N9*q?(Pm;P)`WckUm_9yP z23tH-(bLNOc@)D}lEiNL5P>TB5L+HgJEE5S_~w!^?}>zxW`5l-s=H*VTHC1%Bv}k(2An#@AS*kH&pXgFpb1*|5h~!bkXqK__vMc0k|TRS|a};$BsN z_?qGW-FAP1p+&*pTnbV(*3z*_CMQAQAS1)NCXDLt!i$HnQUh02rluVU5>?i}x2yt^ z!F4kQ?!5jZ*>#S&6=F-<4Nuy(oy%}DNTt|@NhYcmbcvCYd&Z2Fnn$~lU8e0F)KN_B z+qDTBNC1dk3`)Y3Qj>7C2~>n&0DCBB?jHjkG`Nwf%QifJ*T9|y+(5hLb}r>R%=7gU z=Ql6FH;6Hiqxh$SQGQ&5$M= zg#WMnQyfeq8I5d0c+WX0MtnSM2UeW{Tz$7x>ewo^IS)_TAvj;}Q!UW3yhY@g9OBM= zkIvxXq%1*;almWP*Dk(CYtD#Yz+^LhTsvIZ6jdb6o6nE;pqyAWLpei?D}UtE8^^AX zH+OOLKV~>^+_N@pjI0=@aI4YD(-TcZu#&&1F|-nUm;g%gI>hSW@MiiV=5boi^mV6o zJup&<-H-ni;vR#t)@zD7FeGmpy)D_!|mA6c{Bf8K{OR-mQu+`Fy2O4GBtxrL<)rni8k z=+U>r`*-%N1Ouk><}M6CA#CDM}A*E`$2c=tLy8J^%&2uMd8+K~6)NnJe+8qU2!;EnC#RM$_(&Np7T zZQjRmx!tF;)8Mp9AR}OcxttI%0JwlxrtDxme^k$1%(PH|;K$24{zp{4_urCSv&>4qM85@*sZ za0pX>{>H&l1I&Mpz*NG8ZE_bP6o|AURfzGTg7!So73lO8C5EZ&<&dmoht8HjQxql4 z*D+CDKiTLgNp1^Fk+1cSM~h`n_o2j}O1Za&dGN0{>Zdah+1o0g4)8L@vHO0GL($%J z+qeoA4*jH%AaqiPDjY{)Ew z)UfZq{O^(eBN%vUv1*S*YTo(ba&qdHyXRM{+srRyVH2UV&Rma|pb=Pih`KxE(9Gwh2D*G}ZSC| zj$0`NUjAJUKLEf!Fvp8Tmx!)7Hm^ z;xtr>iFj*mDB&%a8UW|0F7+$DJwY(G?mD>v6a>C`Xo}|FE_l-bv%B#e!Pg6tB+NW? z#_KfvttuIf)n>QYTC5K7p~b_)3&Msv``Yhqn1Vn40$bTjTag~2ZR>|n3+-e2;o+8EjC;tA}sVK?l0Y!~OLqwA!0q~wc zFUyFGpZcHg=ae?&0GGAErj}LDSeJwsb{t< zifkLfBlUTsN?vR(#$g}ACpdI+M|=o(fw?+ow7QxDGamyjYr4(K7v|O*ANu+y%|il) zJeTq9OUs^pzb7wuBjMJ;?{IvkaJA{=(EYh#h8GpR&7eI zSW>w8OS+bd`1p}G+??tD~#=dx}DbKE?<#HwF-Z z6U++jvT+dB3z?#1#gaK`Purw(+QWmoza@&(*yr*h1nM)n=Gib_+kPT39qB@$udkb`;ubN9;$s*cM5wLo2=~xz82p} z<+@vYCwI(gH=;~>B-AJbJSmY73O`zF)cH7qYuv^mDqD~~YQcNt`qhUBb(L}uO4J4y z&}ErL9;p^*OC-F;oJ_7T?l@wk#_nu!y~R25#>y^zWTv%2i#^#t$LZ zzRrR@75}Cvz)Q%Td^=Z9b_Ca~OP$|E$Mo&;Xgzy_ zp3@a?kIEGGv$*9p>zRTR@GLn-mqKL{Q`=;5EH=MmmTP%XXjVgSp)i-px*`)@c8L=E zKmPE;zZ22TM>lqS(hA`e2{Qb{bDh!?hk7_GhCqh9Vgv z|45E2V-Tu`?U69_>BZ0dM`#o_U zKP-@P|F)4>m{Q8AmGh}61 znD61Xs-m&UH9n@Igm4PQ0=Cv8cWG|_gcwa;-X$}qj!nEF(=wWmdqE1U~#;BklTU z$vn@F29-tNw&gINQ}Y&|^2YTW%kSK4f-fIM9a0?2vm#GHiKZn=$Q_(pfi=|lV}npf zK-@f0fH+(d>9YjYO{D2yS#BPtjcP_QP}J5!i9yt2O7i%&Yd>acDb%fY{Rp3iLzH9mg!&S{P^@L>dPsFyXF3D67=A^8j=Mfca zpjla_-J}z7zbIvFlPw?)*)jhar^7A*p8L7thtE>?KE5?$@d+{-nlXmuhwr{a zPCtNZ)O$38o<3GFP`TxlwwRB@PH;>1NtyELSzBR%w3LjDjjBFCoLXFJ%#E)NWsN;o zBM^6IF5e02VMfEh&b~2mcLRo_C^?DJ;N#Qg7ERF1+X-L3b@b9|%8<|Skd=H<)9rSS zY9+%T?ZLT?57O&r`I18$c0BJG3pzgPc+#dVNIb*iQ}4p>&)&Po?Z0cG;<4T68)R|+ zCj5E+Ar=7U%!d}F`W8>bA9F|`$him&>xEL;|LAcJ>N$6zoY~CkqzEiW0ch_zsi0|%o`ue^8rSyMiS3V0y2ED6+w7{N$6 zH2Tb;qbaJVi_+@h%8)F4iOsB9yW`4!T=b;0sdi|sXGtA@SS@f;s*I>wN!S|5MC^a^ znCr_Zm-L?o7y$fXv9iQSaKTcnHw7ezKpzd#t*4wnyNEn*HA&AGJM>XX)Yzr0{v(wW zWbmWVQ@4WWvhVY$$>F{q7iGf9h&{8%uJg9>pVkMqt*Og)p4#V)lk|B}fM^6@(jaRN zHAkZy!Z2+J0U4z_^RjxDYCc|KKQy*Wq~o0+<3V*P!OO28j+^F7c_J`;95DD)a*YFl zrlE+#*nP7t79Tne&ngl70sMrr7!9wAf!b~@h|7MJuTZUo4o= zsaIL5zMO9PVI6(FaQU4Pz97D8y`qw}h3{at&JX!p1OaBrXqYH~435<9dhLq!;H8C@ zB@kv&Q~QS1r}+1b`p&!XTj6TCT`7sCI#Ow^^JBo%yTEpW2N`;vW(U*TFJ|^IK~k;| z)QSW^X)IP05Sr=1Nry*~&`4%W?yE&>f*nQR2%54iTC8O8lk2Cv@}c`{=xw$Pf4xjY zSmAqZ=6?(H3jiDfi&>F4E(8X<1CYdI(au?P>%K0~PDGsFv&H~j8*TDP-AY5&bt~gZ z@;i+cMnwnQl?kwHw{n%R#9q|ohLA?SEKw0;WpCIH!;@H~YUF+}pK>EqHHvR%Z%cX3 z@^tlI1!|=5f4QG;&Y9MujDX>&fd_~a_!caI-V-u7s?8n;XdfCGt;TBVtDRRv{XWz| z#M9mBLNn_X!l$JueH3{H7(hBvY#6fS4u^7_{P?-S7OO=+2NP9Q&*tx z^fxIhRj36sYcF_rQM05uzo>%W#D__^FsL@vzn+$ZrEyX>s znLGdP>JHfH|A>Gf&8IEhS>3IHNtxC7)J&Lw7A%YN(vk@Cni@=w%(a8#boujp(CdKz zXhw>cBk`IpM}#q;bV@rdPb+_{A@n6svX5Vi#)ec( zJcllm8^&$&b@!SN-Dz!-h%ojn`rCb7dG^d?kEMe~U)syJbdRS|L=&*|m!f;?$T+(4 zlp&NKW#TW*SogF;S)O|PhN#!NBWI`PHKBnruj52XkEY$p%^z&ZGTfeP$LDhG&EK)t zVnQs5Twc33QQ@4xIv7z(!elZ{9hng_iy>45tje#S`FPsP*|TFKTXjay;L$?dfrlo8 zs2Vlm@-0M$mJ_2;mYNbEXdP#9Z% z+$1Fte5Ry>9PLala}`!=epNK(&|~U|YAeM?U}970&i+Q2;hx}d6f+#v)Cq=^H7__= z3|V}bX2n`)yZsclV_6sszhFBxQSU2+=+`vc^@gT3wQ%qDR<96f3rR^QV?LH-0GL0c zEr})jciF83htFAQ+B0&z3X9d~F^G zIz~o-3bH|;;P*!a>z-2vlts^W9b1o##_b;IKLmD*$Z(?OZ}NwnJg!MnzEm?C%BC=H zI4Fh!!@@LKL8*DE8p_WSadm?MoMq{Q9-pE~f$)#zJ&tEoBTWkkMxAJ^UG5e2zj~G* zoX=YANzU4k?`;=MlHQ59<{Ex@CQ6sv&>EDZ7j|EdcmqbXqP`SK394eq;xSN?E8+AS zb&a0;X|q>(&lK_zoTsQ^GKR0%oQV{vO_Z_}io4mZuRM%;8&|Xov*(}P|84L(ainC9 zNx}P~I(sYFv=T*au_J7NAJ==a!ID(3@vUno*&@PJT}uN@lb&Gm26-9k+T_LTsu_`v zS#R{NCkZ)xc;;N+^et?#k@P)Gq?VDwn3!N1blYE5vB<5)xc&CCE&aB%aNW=oVVlx& z^VX})c;odJu=Sc}@9Yah4I%MeG_?N7C`U>#hW#_Esk$>=8ZR`=FMxDY3h6mg6guj+ z+WDUS9eLsxuFmb`T1xmNR)9qKH8a1b-8V|d_8573M`$sQulnba@#ASu1_V{wiW14biJS)5(iM&>3Lh)he>mD%= zRNADG1CWU(SaeQ3*T~}byJXA;pEz7j;xgjT{8U=x2$$O+gPs>)TW%=v6U3GZn$MO`yl%45Xn zI^u-auj$D4`}{6?Z6ILT|Itio$eTVgkz2Rq*q7Gnuq~>%sCPfR-J>e0V*bhP%lDC| zfW2PV1R=xR!6lx)_ok2fn#Z}tqCDBnzaLgN>U2FVIc!GObRvdt4y!M}ANq@~3M)4{ zI{`7N=0TUMmPp_8Xwo7nGdxzl>-ZHZ2LAXOwo|~D@}<^artNZjtk^3S1TuPiSOdUF zL9k|%@vs+kSI94=_su=`akv86icL5ciXuFMnA z^FyRzND%)P=qeZ*+Ism?mhhDU;xzz?TpJU*OkFb*Kspd{UK2|S6jjUHXN0$bZsm%U zFcU=zhW=zc`pgUv8|cV#K&EACsnHvIB)|d=DjA#bwvGiBN(K(&K>6m!m++zPplPL| zRWuK@xL<_0iBbSn!Y?ha=K@y*OZ?jtcKV7;?z#owdFaF*8w{mAvc@kvZyw}XmyKjG zgRF?g)eKQDqy%WyqAzwe6@1FY0N>I0+#R#K8wJa^^Rh;dFnku(R%dHEDE&QBRp#OG zFc(@s1EZp+4zbIb)Y{G)#(a!@4ihh(eN1cLBa7zB!NolifSCBX|$cp55x?;@DD|o{U5=gw0NWN70}yHu%QA0AyVze zjS}D`#jiM{0O0H+6X^n*{WvA8cmx^&ju`PsH5ToB_AL%a96J|0-ufI6hn(l-^fA($ zbub0u)R@ANnlzCLI9BP+718-)JQz}t2^D0?V}>DPbYWIOA(6G z4C&-CAQUbT8-Rs75D&o$l}QZ%z(B<7@Nn3P@;cB$ve|XYO<0+V0u>lh;i7Ph@yQ`_ zWbkQWU?9-eF$vJ+paBQL5XGr+**2so)VS$-5)3MtzA{Lxq+fJU-*IVC7-8WcA)w%0 z89!OnHfhdaBB>ou2qL^aS@)59~RhL_p=m+3-QdY8u3KUx%d8Hq}5Os$(f27ts(3})IY zGH<>jAp$W6b>w#qyqkQ-gXgbM`cN%&Bn;6^CNxZPj#JIAs`WO!juSXx(Ov9hELo1I zXD?mxqAJLj$R;H1yq7t1eoe1X1evp8{R zR`pM}K5pXvua0gEd*7zoU;c<9Vp&200I5#R<9L(+Q5A%)Jwg3Wo`C{2*;IJtup5^-;N;r@cd^o0&;4d z<6V37)GfD<(MuX9$}LnNou(br#Ss zZiVXpAR2b=6O!_%RJ&N*r zV)jH!>m7OmvYxu~vhthXS8EO<8uTl#{|Y21U&m%2CLZBwj;&TPdy%Xfr&lsEE&l?& z`v^_1u@3+De|K#P0%?2wvQyUn?+@oLUNMXCzU#+r5Egm|@xIG2g7Io?PFJsu;SkOdJQKiC~^856m2d4k^NErI~>#8%pYZW6)E4O7>%E2J360=B)G z06KT}nvTYKXa<_7^SZHPpT}zfuxCIX_fG(JKZ;h2+K2_ZEs~PYCFp$+1nPu?hNNH^ z=CD|(5iiY{kwUUPVp2k|Gb}FUAYwyzW8V*fLp33Q2WCKI$RfrILYHAhL~=tx6+@8) z!__5VM#CY(4v@kjf0A_nthyWHoxoJ8P7Hwx(1#v6qoU7FHggy-pn~8=FGb)IG)twZ zb4NIjo`bbP2$m338X0%Ll9Z36j{Mpb!fKP!^#|4{%ZItVOrcX#ZknZAe{r?6n zEtL53rp_`)JP?&R!L}F-OwC#r-P+H-3kxY%8w}mkEjiBheoTz@_4ay48<%?aOAqy) zc5RN8)HuFco8$8J96CycZGEk6R`^ejR@V6K@>^&|=Xsve{(JDKs)Gg-SBCHa%7%dr z%FvHb)lgKbyltl^#JF(J#m*tg76>#seS{RPG*G@Fax8e-d%gw4%V}@UubOL4uPg8E z_XPnqLH7ajpdFaEZy=}s9R#l02mb2E`rf}YD>CiJE3tL>K?T5`DGXpU^He4`E zS*@!hTnAooQmu&7L}nIKkqb=L6bB~sC2T1t!TDIJwcub34 zlgd)gd~KhI**cbfP$!}a(VlE5qXr6ET3H?YGL!I}I%lr0%+6%I)?d8@x#?;M#u&>? zW>90qft;u^GeHHQsXyHh30+U^@vg_=t1?Z|P~s5T%G6D|(Cw)5YD0%vw055V!x3c#12ZgEFOfKTH6rl8Swi|?j23Cv zHKEb9R@uIX;8QZ=)858t=P=JZu5WOfd6?D6_}e5;^D2#SACv8d6{f@=%4J%57g`ob zYjNw=*qJQ~=Nv5=_;n+2=qkvf^K)gzSRLdN(^=c?7UfNL;^f4@cjsYc006W=AY_E| zR+XoQQ#c8p8)t}BS^=dBBHxW*(hK*qVYDmx*FQ>xr&}GCt<6vI72TfkLGcSRz0SN9 zuudZI5TslczOFYI+MhM}L2S=xZ-aSk( ze>;|5cQ_^NhyDXAgALHp@3L_9W#jd-W7&2NYBsI)flG@sRxO=5e@tKd} zIZF88MlbW6W>ol@rn>*wbSJK5uPiB9v1w%S4*sYgrT3H;Tm zF&NX(vg-Kd`F>(7L7nPR<6OU25m+^OzQZ%Sf5+y=E6l?q*&asrK%cuWKt5hb_$`zdcZ<$9ala>zxf8{d>bgxoRZ=Tp5Q!sP>>0~&8IIWcMobk(r3{jg)l57M_d91Y*Sx5{r; zK>L4~`pT#_+n~(^f&?q>(BK4jhvLOOxVuv*-csD%o#O5;1zOzQic{Q+w@}FPe!FLP z^Cx-oD0YVh+JA#(kn9Pwfg@1-`H-+0m`#t zpp@lgN*9YKnyXjM;aXwJWp@`4#VR2a!!8XV+z|Y{6T4A)CvZ_~+Y;ah_I5XT?!m~F?BhQ&7w-I^<>=txSQU%qwJyVpu8 zN&$|=0rUX?Db~$TCHEMX1r@pOYcUloM7atjY~tLLOpyg4LCTI3ye~Bd{sOTF#qP1r zN$YtD+8li`D|&>^v@6411;qwm@veJJ%C2H>=X}o%nUQ(SwaTA+Z=d;mK4kz<5s;KU z)N|vN92Y*UpmqO!5RN;VLP{^Nuon} zsA8`UxoWY>?9yr!R*gO0oP{4I!j^L$)D~W@K0b(cT|ZI8H^t5U6*Bbdu7=|&0q`LJ zNII^6!wt7qKoA;542Xi(j3ckJecAn42&trc2q4hg*qs$p= zvxZHgy|?gx@YSz%9v|!A|4zrXm_-gfKN_X^(NQ&E?ZT*ts2EFF|I37j08oO>q5})L zzOmdZ&P&P*Z!s5ELpxnz#bbMy5^1>nMaXP9>-y_2V!RMSh{QT)a?v~rT zJpJYzq^5fzSwzBPXQ*<+gZp&Lwb$8%t87WS>b|?K-xD7wn2qbZ??Ej%g)>ydCutmg zIE!RtT@{5ke~!6gD~6bkin;kWWX>6yw2ql}OMX2j)<0x7u4T=~I5zehBh$+bVh-=0 z#GtMBbm`!rwUaADIml2X^Z za|=yjG-Neq`M9jeRU2z~=~LU%Fm(r8eYw|Usq5-2dU))8*=noOxb5Y#J36sVMwLK- zZ~$qSorxg3ISb!yA!al)k+{@Q{Rj!l{alQMN&VE-a$D86xhM*I2)d{RQ*7@T2~?xhV~7`Nb0M z$`-YEH1;88$hZ;riH94_;`3JL+MpJJ|1#ko0LoN_y^iuv zjLsgFt>|Ey`$e$ohBrH+O~>6KU?ov8WbNxWy1EXg0ANfZbtbxmi3<|*$GsUcgeq$9 zTM>s@iZEv4DEorY$}cfSigj2vXypr(k!*T2;7uYfMJ2gEsng-aA2W&0!AvgT{EDDh z1viuKuRAG^8ZW-ao^bb4ILV1vTYBVk7T?ZQPF=%EO|~^%?o;bU+xhZtPg~*T#g}Dj z6SROefR^WFU3Vmafb8%B`#6=JCKY4irT27Oc&mXx1>Rdn6ZDv>_wSxJzKo(e2C_n~ zWC{3T2K#0^%(Aq#o7|y%42Pdk6ACLe?=M|UO%Mie(_>fuA#OC+MEXer$zt@Q>km+D zuMTv3hu;v95s?z0#7UTHi5^H?(1L{7ggT(Q5t}8jurJoncRbFZXeG#xlzj1$&#o}7Fs}7VYMqHX$8IbL_Da-3O6@ylZJL9 zqS%8#9Fi<&s0B`9Y^S2To?lO4FR_Yo?RUg2uOJBy+AhWw(*unC*YNoZ0Oh>eaAWW& z$cCQOn9}&++`V#Mid}cK$SR%#;zU9i^>p&|xakdO^cwLLH>Z?OKS;^{9ij-5YzSEt zSRN9#u8(!HjIjT`lR^EQZf>{=FG>^&DJBSM5YrKK{oz|Wm}zhM@h0x8MxI8W6oZ4Z zCDUzB=I;hKEC9iGaFYBpTt`car7im1$4K4qyUNw!hi@_;{T!oM3$1(qt=7fpe_e7s zod3#s*UJ2-fM2-r=Vok(BI?5(9P5oDF0N!-*-QK(c7WOl3AOCOx|u65+^&Q(0SAx~ z77#2U088@L95hWcKXRDrh$1#4`2b?pmkdDXyRozSkZW2fW25 zv79RMGyS(ozNqu~xV(2+_$Bo`VLO;$YD6Of(^5;Fm#czAH!4c+e-yn|03aLNMF%Lk zts;t0t|`4gUg%d?b;%n$P444=V(d!PTWZt2L)I}g)M|7nw7`wYOT}(;8w)I|vi$MYKpG2cUwxE#mJrHwpQ;;+ zp-hvRx?|`yW^AXB)9!{f<8oDg(d+B_AO?3SS8MkF83Z!5N08uldf|&vbi7?KlA<=p z-~m9LKKV~d!yj7AtK8e@BesOS9Gl^rd78{sBajl#l|J=aH3<)39D`GWk(&Jk!t$Wf zCUb>aAQ!4eP_#?}8Lb|zMA?f86{#=bXBKKo{f@*hveX`e7${0eiG-=O&n}w^_(E!! zA;`S>7>qkO9BdM0a?5=a^W|eCq^G90S8~*O%{PB`#Xpog=LQJ6VKxb~4|*&x#>ivV z@4mm>#l{B(TuG~w1T+N;6|vX7Q!yLDU{O!{i<%OKqjuQKc9{`^Z7wy8nu;2Mxj>U` zR?DCeF52;RSGf6tBrN@n5~q&%{N4v6X(sRHvc9*F@Zk-Wbv~%hGgPo0K!bw zPxJxa_~>!wq=GmU0emHz++Jg7Ik1)syai#-7s`n*c`y3@zx+*}?f=`f4+20w%1ftE za(l;#M+MWOcrA4YlWI=F<9FqDc96KwL}Csu`ITe!77R#e-8ZOOH(nT0Qe;1ft+n3P zu72wJc6~BgWA&c3^I9B>I!+S%UmH~%K_XYExarKSIqDD@U4(3Pqs%XXuzfaWC^OdH zS;!Kf7Mfl}X@@q}v4yab_w7$K3}3KFU0j29uT+k6969-J&&}s&3n}+OhgJjd`At?> z^-`57%!0M>%)z9orOR)1SFNi*YLP*ijY~*O%~a_v+AdH&HW!_Uj5e2 zw4W2tMoadm%6e6wv|E_hQ+CTvM}`-x9EMqW0BTIyigX8726bXTDcaurS(py|wJ5Ap z@ugT)SJ}Lxf>1lpMzyf64gPpOd+r9isO3RcVx)iN+6bd!3j|oY3E;SoixpqpkEBWyX{01Mr!{Jd{Vz+Per*z$TwJX_!In16 z=>r-j-_&WOn4eX~rrgGm_K*E@Gs{`&6?51pvZ)-HwB zw&45zVeDfJbTIcvs5e_VbQ32T92PzlPgw%(55W4jJz;E3nj)0zj%fPwE3 zBge5Fy{m;kE|7X~l$J=SyN1xpx9g5^c#NjmmWR$-9al4p3l4wzmzaT9UTn_}TS`{W zqg2t1)>4dfo#3)mv(U&NwXN53!NK}iDd;AeMOgcu>22z%#bI_usl!XdF@BTI-REne z>`;u=?s%2`a~+S2NY|rUwD{0S>|w>!m=pj2qI9~p_3wgRpd&H8rbrEk?i4i&Iych+9b zKt*1I>*56%k;T+933t3(FkI_28~4`#)gbzLc?SuI2vVo6Z8NR}`VOd&g=B#t0;7WO z726BW>SZAXjm!6emi)i+*L|6g4w>f{_1~ND)7QXc6X(~==lbSqmihlXzOMnGDVxQ4 zd1-qt@y;615E8yj5v+!eV0$s>gfXF5np1DRbM7X3%w|O1&fy>1(@Pjr=HGnKK-Q^VcSo&Lhd-wy3R4`Ciav;KM{%qLEWV)Ge{qI3;n z_C;ri2Y`^d)|*sZ&2$&h=VYi5F=XgiTQ~1WX(&)~X#g_L^nz&Cgjn>^Dx>~}_BFhs^#28DGXQjC@jCJ3 zeq;hf<$?x*cs1FYuQiwLVvwCJ9tH-7-)Y;2kES#nhZrfJwD!I(R;^3rb6 z9D=q}qL`R{R~3Q`Ga|ggUmWP`u%5avVV!nH#TC2^R)yNM&QrMj1TqIjS@+bjlbNFY zFJD}0AJ(46vadbe-CjBtE+#)6P!*lc9`*j*f?D0vq|ywI`2q!p=5F@-m8*Q&5xDD3FGJAZOvRDDeG6bfeMj4p%sZ z@-cGUTM(>f`@R&92|;O3*43?CuLnhrKi_%XfIZUfp=D&z8t0RndoBGJkC5uHs{O{= z>D$eM8LX9*gNxc6PubQs?}uyqUyrr)0Bz4~dw)s+wxl9ZFy z{5Mn7hrzXa59AR`;qUmC1w=ZJjIy7a*|!jbR3s_&i8KHw^l#DVtcPgXtKwJTF25cY zFL3hL8X5Gx&b?R&(Z219@3R7n<}*Sgk|}Xa!l<#ZLOmFxt4nIw=G$MSjo7SM{i$N5 z^UKV9`>51K)U|OuKuuaioQUdm&>Y`HYyRNlX9z7Zg52-yivHi~*881r^_o7juAK019Yn9^Vl{@DTuUDJ5zV!d#4K8M64)9pNQaNdw9cAF^ZRJZFJ| z$BYBpmin;~sxG+NtIF*44SG30T{v%rEGw$cW8U30PkcLU$oAR%Z>jzRfYL2q8)f8= zBI5dfAX6Y->T3_Uc&U60bi%`tW63`*{7&`J#CZHyqyFGwBAcGJ9p1Q5Rw=>Q8#*@u ziNW=Wx8qtlhhuJiJZ{U}^LzEtUABX^t?5L_r#qTA6ck{!R}8Yjh!R*<h4eR_%cBPeZXQoh#C%sPyCoVb}cI=EC)sP(0dChtvj+8iO z<{UsxDRPqLTXynWbNa+1nm0HvYrmfK^4;< z3qxeHOdgC=dKTQ#&tpk$&!eq1R3;xjWj^9IqSY~IZse)K0DxjJ?*6iKZYdO;2SQhn zlvkD$e}~D593GIa7g*eg(PkaC6Y@iy*p$WHl#Ic)0_XcYbL7Z>0XhXp51DG6Dv>`5 zLSC0D1c>{buK8N49xWhMFmgmJKwBqhuQj;jQ&Bc!swc?R0)w}IeV%7vP=5rY~0qWZ|kB$4Sf!&sBKDJYrgblyvln2e6i6kzdb=_cPuY$(o%ca^G&;2EP(IT%y9~&*1%b1N93U!<0jV7=-MmPh~L}*a%R5J;$&)%sQ8Y_5(6rV~!d*K7t%K5v@|dobdawE>lej ziu3MfDGXHmG*kK3F|XZd%lyix&WZdYG)t@+3=Ql_=@1DNw9pUURv9r60Py|DgkJV0 zTWyF6GN4$YFFfW}@o)AuQCf```6jVecudnMca*nS0yF?yJ%26B#PjNC22XlKx<*y= zg6+!~_9BbUa@k`n+~u6j-%F`mKb4XD;?Don9v3KEt_D>u>HZ8%aP5495o0T!QF=X( zOpGtx8KwzjCoG!p%bW|e6Dxg8+3)=BZQ8US9>ZA6Oq9O4SzNnODkPn1ym+F)w_bQJ zzy0~0qoSRi;YMT(Y6R9mTqV!q`0^+_#XEe;hP8i>+6Ost>)nuw0z`CWhP}(jwxB2+ z{1IrvSK~EdvHKUkEbJh+#w^^yFANBV07chV;0f3i@SV2&TTfuE%Ix{P)fLhf;+!}m zItN5G8z(qO5tRV51yxo-9wbPN@>XIwZ_JCP1ps26I@<94ABMZy6wZ1Pt>6L&&( zdZ#4L`}Az<`ael0_u5$-w`39?lLL{m9FgFg!fC#a$W#}WwT%{*z;9i{S+rku&bdE% z5PGC>&8?9XJr1`+VCLgM^Z@~Mn{+mBIc0feB-uicyrEd(;UIN zlt>g(i(8ntof(8B6$)$zpsc180jVY$X=Wc}`$@d&0r;o@2z<<^zQc6Z(J!&1A2Jk* z#wswV?Y^COrp-_*0c#Cko&RH&io5O>>wgl4|DL zr6nw-V8pV_f*vRN71$apMQPPl&)-l}eT=5#y2_zmG_3iL>AMC%^0Iopmr6fYPw0!< z9mV4%`k9=S;2m4koID4ofwF?0YV}&_`0(5<8|f<*&?2(Fjug7nDQm!-1~ap$a+Mi& z_iNP2Tv3GtbW8OO{&ZegQTyKYsg)*T_ocfU-J8DFMYMt z{}J}?(cieP?f4PCg@(CASWtq+N`J9z%v9eu&AW>jn^CWzVJ41=s67)D*tampu7b=; zDT!iVbcxB>^tK@EVvK{!Sdz0Jnp{SWpFtg6;RZu3xHJvL)0&uJZptkb6znJ}uPBK= zjLdQ?$jwizZIuTdnUjBB)YGBmu{4kp!Q#3t@G0SHKZot-TEQQCv*4G1zef2%uRxjx zc?fOV^4X>aq6ZNGoMCYw0esE(EP$S$l+JE3YaO$Tk-_VGNU^QJf%vXq^c=~fyGINA z)_eX#T*~qWP>K_dh2%$Mi!f5fSSH3DK5{Z zAW5ph+R}p~dNBTVUu%Ec9{ojQM5eqWC^MZUGV*1%(wddw0}Ac!3i?!%i$(>dNuLJC zFY6*6KKWMr5*1fR713&G-oe!-85sf%RRu+wEyDxPM5}QQO^BF-*70T64wk>H->?o5 zJCVZ=JTEWQoSy_qjJs?swz8=lrsXewO((CoFEv3>>HOZne;M~P0Muxf>+{ zZ+aAoM-{G9Lx)q5QviKV$g)&i;4{Wt)t${-&Vk4lk5pfw_wA7@-rWudqrDb%sXchAt7-=%{FP>sAL~w2&u;Nx!vK zxM=8U6&w2WV#C$2-NZ`E_^WT^y`$p|>Gk~cf?s%8XUx)b&#;NFop?`8UYKpZZDba=^hL=+RL81LwSC{-#1%m?Xz(~H6*kNH}%>o#RT5QPKhnky^y z)E(&Ov@}OM6?5Y`!5RTz%8n$a_jEnh3#=O@?o8u4Cf#hnJS5W<$@4t@a zt51h{_&?fl8n(oS6L#f+MFIuXyal}5OR22zAsWPKot$9Toc~I@KLMcSSLOzoXVn}1 z(ZveMRYTeTwN2)Ef>?JV8iM)Etw=XQ@IY|1=YFQk5?pVL6lFiABvnxKJyq}%P;Jc8 z@<1iHsAw~t5XQ^PHR7kYE?MNauqdsKjY#8srKzGDzcw-VLxTaEE|B&oHUYspw&F~+ zcu~ej-$pE8>VPZ2m%LnyuJ!1bK4E-Ak@xi{sJC_@6G}B1dzL4QJ{5aN6T-Dq#vJI? z^J9`((gD3QF0Sjm(@FT}g}Ncpf#Zo-)1oo{Rn5zgq@eK{*}W%g*5R(Q>Z3Q=<(5%J zNk@o+m$L(G6i-y1oPi#F;Ijeidt@iz%mghUlitonw-C@5Z%ka18b#;`#t16bZu`Wf z^#ccOcj!gxfmlYgwN%pMU+-c1!DtQ(iv|$CaL7v@DG)VQ2b!3cMG(eBP&w|~$os}Y z!K-k=f?#9pk)dwGWx24Cd3|h5{O0p`NRyv@E>3-w387wHUJYYe+@c-s zIWveAp&kBl*1ph0ITb3H4s=M%b=mF1DOcVmB^_H8;^lfzB1=`nr(gM7<2rdMFn&dr zIyMCpp}GfoPUC|E_wwb{&pN6}4U-RR{--Vc>E>5uY0^7v-F6cro0o!|Gv2 z{^^!xE|JemlSYEm7xP~0J!`p+Zw1WV{U@F(|FY_rE%?iRu2Z_RSq>2y;qGE!F|$V- z&+?1p%6U(Bv>tc#=1pB5Yqh=)isA=y{=# zN?|`;(IPT)&uc%~035g>g(cu8mSCQO2L6pXv!AH-$PjJM!UCz)C1RNp^hSKE|eKB``FO zTFQ@P_UBKWQT(1D^vNmTE4JpSWQwS^(yH7XoSwO!f3$PZu@8MC9 z|DpfYEXWMkqe!PZ!;178?LS)jr$di9?i$Ggmn* z(J;Yy;#L`?3`hC&mj9tL31NZrzaHC}0y1NlEG_Yg0U2kUL261PLPtLq0!hfNR?BTL z%2m1VFm^0)wI-tGSC%MP^`B*nOGF#9#g@aqk7zOx>*FUX2qMYDQZZf{%58`NIAPiH z)0bWQ3X2XDY9ln%c=FVS&moySnO9#=mp3&pb59oP$t!SxF#84TN~nGj>7ifTNO}Dw z9E0t2Y)p14)0agt!=f-BAtjO;*17RBFhmK>{w+&?q7f~v zx*eEqkC3uMM;#k^Q+75>SgwiVkdzXH9F8!5JfoG5L?Vu>*NR>5I+al^CJ2_%mXa=A zOTr;Ti6>|*!8TWVo5<%>xi^QGQd2zk(+j#rk~BX6_fwf~t3PmZGs>jzW8{`~?iUf| zPVw~_3%TEJ!mD$NGoWGk-uUagk`=}0z>!{k)mItZRp=<)OOA-Ru6P(wKds*`SrQXX z28H?SilJufqgJZ_`+GEog!d0Om6tDTgM+h;5zRrPat)9oeDVJ>;gvR4_j)=&$xd`5 z(fmwlT=3L2Upuq2wp+na#sLnckeW5;2!uqE>o^V?4^o6k>R=*TXkc)}aBdMpYCIeWZm3wJDsA2BM}dCtvr31j{>MNQdETRV=M9 zoZl%*D?^1VsQG#`eN$c(RB?+FfuE!T^Zvf~_DUkh``~UYwkFrMr8jIuIe+2eYOCz` z#>3xKvg5g}DqGj(&zrmW zyI>N1`2qSB>vmmfHFe6t=RC(hBXh~c@lt5xwCYe8F0@3u`D+(XQ3&jNl@FlDuAc1K z3>qpx830zG-DP+sDjVwzf{9r# zq~t+AG0B9n{x-0`BieK{Pm(GYB0h(JEl%tVAV$LqL+OK5gGm1i&{+WOxB=`H!syEb zP%uI@1rkt&!&=e<7{3Be#6kcd!as7RRR^vp83zH7&e)GivOpQKk__7FkCp+D(0v8D zWT;iewUH%@+)Vp#4HL-1Tw=rzOiWG#Ype}zKnOpAE(963msrXzH_*HYX~{B%_nMEhM}za4rp@g zWSTN-n9IOsg@^4V4-h*y`jD!H&}Dz7f8^1bxR)qqJ+8MwFPb}bQ)Jh#VXMx>uWsw$ zrs7}Sgj+@Wp=y_xumy!%_nDJL)!m)8sruC@N8RnZ%*c!0IGEIx0|16bLPvSBe&_=5 z%VU1H!+BqPiAys^7{MWtJli*OBUm{ec2>L2KJ)=7qeR$A0M2NoV8ZVt7PYqWXEaUQ z8W@V%Gk{mfF?M7~(0T%WddaU}28W05WEz zq(cAzZDgi$$3(zu4Q6}#>V^}f0#%o|uqA7zrLzNA3<_cPC{^U~^H>?j;E1Mlrlowq z=5Q%alD*;>rig4AW?isb&}$b-&pLj_Dr8&l0C>Av%gTNC4T@b%+P7G}l1_+DXduS%F_IIN?_YH#KWNT& z@b(C}%#ZzRl&oO!#jR$$J6h*~f3KquR{CsOK|cSiO~*f-S=7CP=Fh6PulUtE8#)q( z@q#B`EN`iJDh>Q8P|ZlKQd*Tk1n?0 zrG?3Crz^)cp$KXxX+U_9_6ZM?QM~xWuSNK3Qz|->I5MONT9$RF}nqLHFkBY>h zgMb61v7{(qDM5_89Fys@1Ll&dCSs^SSsG^FVy?C0w4tz{##;6KIX@a?((4X;L5TW& zwleN$Y@li=RDFHGM`bqpPjt?<;d8ue<*BZpC?!9yBFW={!X!=h3Q=t3z{KirnkGe- z8>c98l=>>Hh8KE&OQEfQEYCK2OJAPt;$5yj|55IxWZI8B%}LEi1b;YL2Y@?N1op0^ zg8@~#WRv-hZ+PhY*Fsi$)dt9A2@#?-g-JtRF+jfz%e z(d=HWf|k?pGnR|(B3dv8HZ5r6oI3|FzQm$y(8w5_Xa3f5W&w3Ue&gpZ`~W6}&>dX6 zSq~tN4E^v53>g`r<+}B9wYpJyoag$H=02&5R$he>OKb`0*W^TfkNJv|K3y?9xsAt(=^MX=cd5NAJ5(JIo)@j$V8VJ!WX~SSh(Ku4 z(x`TT4~_XY_2hzvVH7aN7_^3bmn=)S@E%q_4^qiQY$nOh$H-^cdjBO55IK!jN)?RN9$qP<2h3m70Ro+p> z>Bnn8Uy@(=?KUAkRtGFp2>?lcdbh2Md#(x^h3*o2DbFZDv3Q#% zeZkPnW4SD9m9QsmLp3`*=6T z5|nUP5SRB9eK6TK+_A=@O=_jVrtN@v(LmpO+In3O2AC5Q!JZ&qywYId z%RuM(*n~N;6v4_^P8M@IsLk<)STTS-z-9}87VN~c<=^v5;sl&S?KHf~FKjJO1ku&G zJWusqNb5F&8Ql5#YqHX}@O!}v#1X1o2``qN3l8IuP(KK8#F&|5Ba_gQxv^efYGU^x zBTFe3{81Br`%RDlJEKPBP4K+KnC@7pd1e0|YsKif=D$Oq(pMk7gja7((18BpsXWUg zTfV}7^Fe$}2fgb0`J)zqy*mH^diF^FRPGl@k409R${6%)Z>Lny6E9qU{*HLgEfptg zy>TcT??b%``J4tCaoydvI=J2R*x;mXzrvr59@}(`5j~Zoa(TH zePO6x)*lE00^{hLht?+!Ap%7tnYq9Cr%|lkW1mfKeV;u)Yr-Ez#V%jA?v7?KBJIeq z&TC)LxLCMAh;ah)84;uA;sQJ3g?&LKtC-EhUl@lC1;Ax3*r<|kv-TX)ji>}C(kY{8 zu4U^u(0OOjV|r0lzKg91uyqa)cZ?9b+Te2W$z+!;fBQN*(cboZ1IzHa$Ia`i&Be}n zuxS_<9Fb zh+>w+w-|M&4u^%Ef7LnFF-p0(9M5Zg5180 z0i^x_01)?w$$v^6wjBXXJg))L3q(3dBlk^JYwNrg>En!<_-dRS-H%$ICoO4}L z_KaUNgJd$&DgNC~vb_^~=Wl?UslUg6 zZrKgx^R0KjJk^^5fanzDpR6(m>k|S~SaIjacCv65CHc~hG_~8BRz=J<)HOHjbl^{o zn~f~jAu4xos1X(9GM$}jyR}|Tf0|LLBr^86)KN_&=1RbsPMo<#H)kyil_vbaes1>; zsq-S-H~}(7Sb=_KV8TASA}cnL5#QluA;opkW?=tpgdWV!ipJOGigQRce;sRHVtt*%$kfTI2@Wnp!JAg zi$I7<`pE*{at)3rw7~o|$W1)&tWKeI;y?28WN_Izip#3NABy4;?Oq>5C2ij2bPEa)hX4_61GiWI3(#u|xK3y3l!e@$3!orM zYzoB9eQm?gemp7w*fnDVKtqn9_4Oads1(E%jgXt!=?HOSI--A;Ca_?!&&|t6+*;m* z=6xb+6J~2EOZn;4=?GKf!ZhM6ZV)pnYvPThcQ8_+?TvN5HR}5I+2Ia8_0+N^4F9n3 z7kxT*6+3oNBFYq0h5sCjCj`Q@KetSR!;ynO4#!nE2oodIJ!^5r4>K}0xV;#_Cg_(`D!pVSrvhHx*Sa%bko=*UCwQF&yq zZFG_!@|4E4c#6yIW-qFFP3oFF+%5!LxzG{h4+m45$cN)>?Q^en_UFSt$#=}!tGSQ3U92+juQo7~&)%EQJ)wYHO(g=> zrOoK?v%ge8KSIaxz#J0TSSyIRK_S97u}GfHOHg^MgZ~jDdewhz{;v|^UZn?+#=a^I z;_d{)Ui)OW-+)ja&HzvwQ6C*ZHVH;EhpPPT5PKbTl;8D}$~$acFrqLf#Ko*eF4kbJ zy~D5EB-CFZ(Bn$;EgPG{-cnq;nd}&+7=O}4R_=W45U%~_7g=`B z;qf6QbA8Tdnf7Tr!!U;8dsg!2xE2nN!g}$8fC)-fF8Z8m**GVv=HTytwG|qG7|*EW zJMTlWB?Hjo1?F2%846&uS|H`p25l)Jt(XqF{5$<&b zx4*CutL9BpUX?9+5c0VyNKR69Pm(ow!#??1oO%zZpR{eV*Jz~0ejZmExLVcFtJ1PIBFW8iO9 zws=F?M!L>t?4i1Ke=pP#Gs}D8y}~UBDkW13)5GWP<2Zweh63E6Ymv zqX-g};sQ!xs6QmjhdAVx&Atui|Ah@l1bkQek?^grKn;UB!*JGvbZ&AdcRFg&08sd-l0w30zR6G8>9RPF@ z6Xl~liYUSF|JSf$FxOm8DYKbbO-ZaRLTbaC|@Y}ZX{6TS2&rR!+T=1XzZcBSY7^NK@iEVm>{{!te24B{UU)#9_YZWVMaPysfWX002U- zN#1vCU<39dpuN~!0I&KE#kG}%fhu)5M6e;c1c8&NS9LgnWf^I^*)9S~2pyt}B5m-g z^6`}$aWm%|D|5KZzH?qF5%1Ri5^3iK_&x<0+YH1`m^Z0eGh!HDO{B;YbU9{rgoT!9 zmP=drcGJf}%<8NEHT-|So*w`G-5UNs53g_R@a46AQvg7657)j{!G-9K`~w*PF<)Vt zEok_m=*sA1_}jHgm@BDssO7%fpNNhD0%*;KcH6MVf&a4@(+L3ZQfuT64PBUPzwzxy z$>V5BM#bdAmaw?VCZi1IP&4KHa0QM@L&yWl^+gA9B_=iHBXIxvMLi@9<@(OIORI}c zC8nrG$YU;_1(4+cme69YB5=_F^cE(m7|&SCks`}J7MF~p+Tlkdg%tiGAU2C)CXJN| z4Xi7BK`v$~3JMJY&?sHJ{YWJwACQ?GMUsgI}un3=&XN1i43`SZGWb;O|AjoJ`TaOWojmDaw6i!>vdM8Y~xYBLdZfDeC zQuV#@+p@er>$NQvR;RNoUsBD?Dj8cGOAopb`gT^d0&_*{-?-+azzWl}y{I$4C9N$i zB#qyYrmy|KKlp!tTK@mOc=3V5U!F7r0Me#Dzf8qf307qTY~mp{d-V>dszF!+Lk<1I zDmHwXl2$1gS%7_DCd4ZOeIGc@kC$)m-ZvwjIG9#xS86?iMikFFt=QZa?R+aW=T}bMUy~1aoszk!o}L z8fjF$`YFy>{tE!FMQA#^hy&_59-Ss85a_6W>iz8oAXqiA^m21xBXq=I3(S1~PIn-N zO32IUdczaQ-A@BSFn}Nq0j%?_0&mc9S%~n6MNMgU#U=Wnz|n1sYPJ4MpyPUgG**S&h*BtW<0j)Qh_VEHJ?vUqN+Bxt(8f+rGdT8aVMwQigoe>1`Y|CKZdlYW;q8xLnkrrE#=k z{b_trolp^r8)#fGOCQd+NiulTKq<<>l32ra^zRg!n`Na#qq?NKTlp2IX!+D+8h-eH z6=WX9?wG~^9^e3NtO6}Ca=+A0n~!p6h=;Nk&mkuksaAeT=|0JAoo2h44j?2BP0YX@ z^S2#BG#@~W0^lE@94t*glE}r9bUc6V&eBA~qld56dY4VCjG5N#UhYAXQBi5MbZl}{ zX+J)0K%x~i3v=q#8_eWv%2jBst8?&AmEll1?#5K~piN7S#MVfK-qSPA^!qT{0zoP!8`kP9 zL?o5F1FMg*l$9PVwqxbm4ziPMg*~C@AIz8EigBk*#uxRaAznIMWVBi~Ga3CODH`@e z(@jryb2#A9O`uVEvDN+EWPhmbrP~^8sLg7A3Y%oDW2=erTV2`|<&L>*neP5)_wW?@ z;AoBMplqZ2G|{;!6xVUn=iq0Zz5-DorUeq9dGjPTr|B-VX`IM<5t5_%2H+5rM=;LE zT=GlA0A)oClyhrTR#)Rn>Wpvm+^h3^ts7x9G_;w#h2yYWp0vcyd1cw~H#y=1oq@gZ z1^B(ooUba}U&8YxQJ_JNnXSiziMdMq>~C_*aADH!l}zHXE)XcM%>NdjWr@cTB1S*2 z>^&@cK*5?7ja(W`jU$CgM-$h0ZPQFKyD&UZ&E8odtC=os=>BwX(ABhZi91p0A$1~C z`yU3P1%TvawYY4yjplXMX>`^M)HKUgSNb+tp_N^2FLr$ zSn|akfjR@3pV<#%mZwhY^p)o?kjGOUy!lDlEdi*6J zfB_|h^`xn(J{kT#!u5Wfs0=yg0H~5_gyq|SG3?~#MFNfFZ3IC|#gbW;-}~7W#%#<# zhqXF9R*t7C!#F9-c~V?U(k`s&p%C3Z6%uWERCaem#@*WRB#v?p7j=JTOA;#~l36Ko zBiBQtRErI?Bm(RRPtwJ$(H2de$3B18pZp#=!1$Fp^R|MnCXwpXZp6y;kB+zM-f{pG z`Y`kCt`UcJ47nWLiKNEf@B#E*fQ9%ZS5VX;n~28oa(o8eo{6QT)R@M|HbuYD`ZM1# zj&mh_iute3#Y_y{Y^6#iBajo}lExv%>-OCZpJy$YfT+V4)cq5yA~unF>SV)V8ZsPuwXSvjPXDIy%}EgQ8uMkiMOc$-DZGkVPUQ zO6p1!b&s)IY^iY@71?hde5CF2-dCVCaOrjO%6$H1B6)gzW=s7DSsgBCDX-5=Cwew)ilKCd~X1M`0W3*^$dU6 zYW2@7L}7x@nbyeZl2(c%3@A|-zcNu9e%cHMwVMlRXL@KM1-(!9Nk~=c6&g>%QN$hz z+p+!f=g6}G_~%HBhv94UtNkQp=-q_IG?;FD_daF?LLC0HQH1p+;tf97Fc&udkk+O_vu-wMq)my$PTCF~p^V(l~+ zKC6ETgt)djeZDb+L;7f6g3qe1{UH-2)>=1SBvV`8Slb|TM_NV_oszd)x|FU@#QPO` zZ#EDnoy|J0X;$x6p+o6~XlsLvtMG=~y?tXE`M2)~L`tPhKDhRY@F@|CaiJ3o+Z8Eu z+l~TqtFq|4MJZoUM3Z$T51bUFw@`k;#$!xj1>2wNR>*?CyI>t_QEKDI@?wk7UX#7Q z&WjOUtdDf}^H1B_^7s7oeQ-Z#qyAaBcDHtw$^UY$Y%9W4`STfKd-3V?N_8`rfn`j^ zXL`a&VcRh6(uvJCl)O`6mi~&1WbBF{r@O)+EbQ52;i6Q3AAT?tSUaCRPc3e=W}g%| z1>Pr%GF>2&^a%ZKT-oGuzxDTS{@f?%@ijO2dE;zs&ErSB*3qX6B#~m>0TgThhCCuA z+}nvWT6#&??SFICw-Dfj)yf4(>X*H;qKdUlux4f{R0OA*y7hkJSQ&$V*WI-QR;>ouhbP#&>24>| zz8=o(PdfxE)knUN?9#0*S#DKn9fQ0@EJ@U2^f;img_mgBl3;~`*M=_lS%pp_$JZdH zhnQUsCVWFtj`&YcGBnEmC#Z10=Rf;Q>NFO71mX$HGx_v99^v69xLOQjk)~u$F!QKN z*i<}~Z&FQc)nbG*GHt8>p*#rlt@g{wy%nOiazT9I7R9Z>B@|ujQphK=<&uJRqt!Aw zO(C`6BQQ{yXY|;V0) zNtV7wg8I-JeZTP-<+*0i{JbT1fxS1vEZT4sD z!<9;*8{;qHo%hF$*_)jT<7nhd7MfBxa z>beHD_dU=_EhzB|n#C0xd&W*7-mTU`UNm}|K1JU=`Lc0bR4L5}$`W1a>_ zD-#oeHYl2qXP28&gBDjd#C0UH5>F>*Xuo^~#4IqgE&&Qpdvr}zw3m})_l4a}{@1*P zV}!*SRL(}Hm(JHJ72Af4Y~J*mx>X>prIue&&R+1^PE2~&>%gO+kazmFpuO0$odE@{^WX(~9iinnoh8T;Neb&J&oidU}8zkcpdW`pT4v(IGPGW}Yf z05^(^Twy(p7y_1DgpsG@l-J6w=}zon2q;r!`EPAV^Ae>wgI_(vKDYnl?yp*Tx0dR% z!E!beI;B!aL@2c|PBgZS(pYH5&QU`wZ?O=5w^xFrBT{t=*fx**%$wm zUYd{=K~h%W({2w>R}8)?tyc`Ca$F$KSZCvU<8V{>q;e9)yb<@lwPP^txg z(%JkLC4a&F6sKbiY^?@&__W{3(%li@^Zfp^Jn z2h(5x3@kM&z8wV!g_;Ej&HR-$`C4M1-rjxZUqym&ppVP@D@9-Kvx|xeO^XFl$Kbjt zJzK7?FPYRh^*WgXub*S+sZNnBONk|N9dadj^oGz&iYlr-NqF9ua^rdIIpu}Ixl{d7 zV+x4CjZL_m{}u=;hH;02S&>Qg`9iu~$Q)p>9lk=*Fz!V=Mb%y@v7a>X>OYSj(Yr-g zXSc05>LszLx!CT-I+KwtQQhH>J;wHDpn>?jl^EMFC#`CvNv()c;;sUUq&*v12xZHp zYn8v|Vq6j+VDVd>L=`s^DzN9GWhKxZErf`A`(ko{X;J6&++N-ZL3~joUnqzyfK<9~ zu~ZfBwZb?|jS!iyc3bQB^AjQIX~IORTfU#bFp{vqGWA1Y#<6Nf;LHrbcGN0 z#MFCrMkBX}wF*7P=5}1KIot{TV5~gj4EGOxSD`lgN}eZvN6x9FEQuk7roFFh)!nF# zhmxMQZANGIgQ|j9oF8kBmT`i+yo=|3{E!Tpy>Qmr*7KKGy&&17p4_D>Zx+Y=dfvv*iBmFzYta>WswacdmM0q^-ct)X9r*Pc)MW;F`J~$h zxKSsdYkx$rK`T5(SVXF(JfNmg@Gzl4AzH_U<%Ur=^)6t*w1tU_9uEJJC0m}EoVZTm zbcxaMjHCbmTIc!ybZaCp^n-aWAZi@!4Lz+oE-c2pPzPR(2%!J>T&#Fi70gGJf>!$# zxr=1>UAgM=ON$zl+)c^p#~!DmUe67OZ%3ep4$g;PPaGDB8{L7fGCf+ku}?cj%B@R3 zmF@|5ZhQ;tO$IiN3~mBBjD5R(7%%uuaK7dWIX1NVXG!58S|7WZ z+IP^$E!-#MEQ_TR+8v|2RXU2_zvYeuKH9$*0f0a(s#2xf3(y&@~A?9sDv zV?vmwaUTrA99Q!&dCr=boFa5fE_ooK<;VSKiJ}Fj7%AsYS=td+Y;thHSO^FghPz&U z23U6t1K(+Wq_fRUXQ+DffrT#I_RvU~B%;xr|)vmJf?2w{(`-vh{` znVeQ9FGd+^2I-m$e~DnFvYDl6xVzQ{OE39^sNJxSKjwcsbUs!%v26OaTFMo;w4q{b zjko`=(B1~X3)n8NI)tFm6;1vr4}oE%+gItD#Rfb^*$WVI0-oPLV0cdT7^Qng@91q< ziFY~aTSW!kKu*80>9tMTd_KMR`F;GQ3tdUrk`?|wdUI(ttU2_c&K4HhnEC&@36T7G zQ2|qdzhbZ`nJ8&~0Kh~DKNTM;MXNRtKrEPIP8G%SGmH6+rFD}@FPwD|51sooUFn$L z99MQaUQ1sgXXr5ZR%Go}9FhXAS%ql==}=!~yADTDa((2?@-v1ph(XwqRj#0W*YY(7 zdO!gwURDg4%?TZOh;V_Y`8txSOqrC@o z@XB2uG>y#_s}&yb;AGauZT-FB5+iDfTZWkUbMBCkOk0I@vz!~4-U#;hximDe7k#RC zK>&WkF(m(MtnxUfUbOhZFomJ~37Nr&tNCYjBPwXjdCSeUf*uY1VGNC4>N#iBpRx@AFC&9~i;|_zgh1;I++MqpvV#> zOht3*jH2$3gF4Jxkox3SLKh6Kxv^yApI1STV1r_|v{)TC&-rSO?@FKCz$-x}t97DN zr`lRi)Ft#)uN@XU-PIZa8!~ENW$vQ2-@OXX{*-1&sksF5r41I0Z>!IuDae;hbIs&*YHQl$Yq60z_IuIE3b9{ z@VIJgH_&DRa}jak9#omom#tC9<$l%&WaRZE1cJHbN0M7?)nEu49VL#9mnOoK$*^Xz z+_&(`Y>I4!lWT9s$qgD~dvDE@>b^kcHoN+7cwfon4MaXW1gxK@nsVn);$F0nf0F?@ z`ahiKFhSO5m&(K4`B0G*)`2^O<-LJ=f+I$fEN)j70eBF<#EFw`+d5V>g>< zf!~zn;Ye7{Uv&9^_JKR>6pR6cmDHFvt^+&WP*vv&{2t`F2h9LQXqn09-Ni?RzeSa!5@S@YIY<8t~ zs660dKLp6Bu%TRctBp7qU|VpDXUO8_0ASdvrjxfm!H*-gbn?xT(tlS)8pPv&T~s77 z>MA3Ag1k|@v%LiNxb?=O-g(RAX_=CPL{hR{+aJBG>T`?sSY*L|yj0vj4$0tf@G+Y7%RZ6FOI>4bmIgLJqjrj{o1S9a=6P|C}uGmH>Y-n6LO&@#;c{OgxWJ}6r0<6>Fe*OhQ(KYH_bvr zJv>wW-`<%3B31qpUl(6%S&G4WRcKH`RJibWTed1H?R4Gtlxs$*=F`>?ZbaFzDWW03 z=JWy<8Ky#6ilDM<$9AIo{Z7#|$!J4xJE6=5xUy?bG4b30llstd@zBkCy zehxj+Uy>)M{;|?jUQzAnm62G=ejpaU#@}vy>`D~ozLs!*$o}mmAi^;=C!f?Kvv;%t zIRnU$NQV%MNU5P7#nhQ?|2(0*&feoBU$db=&S^<@+6>2ljlcPZRn;xt|05a|5%zeiYToN9)l2{%Jhwj$)Pyi7= z8psKw;ST-9z-@DPA7RB#Fo@z2$D0*5&~!+rX*QXi-aPEmp^{_s8ck?e(hU|q6t~JR&8XMWT2cFYfTpG)1tGwJ;2x&sZ-6Kb(}_tN3gG1(|S%wDi}$= zGH($#Vzsh$S1nEYm>e?8(rh^zPi>?^O*6{u^$aqOkhVd-_A%<9K#!7~FNzn#m+`0+ z3(U3^Qr@gnYI;62Lc@e{yOX78MgXNSP)MnuO*trThy% z&9nSh|NashG&BK8!eG(48GYk~<~;x$?xE5V0J9!lskj-c{K7=D$7!)HO6PcvK(3WX zejlP+jf3OoGDN%l94`OJG~OzEp}chcYg-INz_d+@*d{kCSlSij4I)Egq_juC3(q5I zwIpKtbYS~#r#vmJ)vtk!IdD#by=DBt>MUHO6#%>CvTWAY8OAvyRz#!W5$9yp_ZcD= ze5v>Lv)b$(Dj#|HF9wsupL)9I!rvSdxTif74R6p2Ya%gYjtvz`XSS}kAF=C2Y2bbd zAU-uGrN5gB5W!C!ygG&lJ?ioW1d1|L2$7aIDZLGv6L-~zNupCV`(d&4Ih4r6H3MQR z$Wf(NGbW`+DIBB_g_uS7PxJbOPB;2j>~Gdd1`I0N`*BSqEXT0%S>t7b3xS=F#JqL*s4YrX*JW)+5a=iH7yU zoo`ru%}S;JS?bYNJSI~DUa5U&-yl{QtBVG8WEL8?bT2$9Z0~0kd#W~hyzpUncI%j!f$4(;yWL(UA-~v6_;u1e<*h zJyiRX5<(pS#-yjgQr4+44GY!a#U(bXpdPv@RdILN*>IvpXGe)M|2E%%nG%v4BtwVE zk3>#UF#ezHGc69KCJVM!i8+9+Zrn@9J2o_h4{k+AqHt zm9df#HoH(3PML>}nI025q+|!a&;PInl_R22R3w-F3LcPo3x1QUzDO(lSB=bu0PoCK zoD_H+xr!7`{~^vU)_CEA9|c`Xr82S+1ps?OYF zC5viqIjxcKLl%*;v=h8dzRbpHmNn>9qa5+lT}t-TQ&CFJ?v$j-Pckl1+UgRb1MmG~ zqljHPvPh{&zp;=NKKp$y)Rnm|)~lR3=n-^iOJ&rIP43`ARG(GJ*j3C_Vd626M?1 z<{dV;h{P=@UrgLbXJ?v7(-`y%y&x2&+(BSjlF!?x4* z3G0v#wOn%e1wE*v2Bkt5epeHAt3LN1?0gYZRJC(5xGRjlQIL;cYI1=8E@wLvQLRuX zT|XrepLUo~1!Taf?g{RIkI@`W=MM*cr`@%(O4Ykse2-!oerf z_-V{q1L3uyEvkZfvSQ$^dLeateTIllKb1BBpcPBv*0zD<6v?Y*o5F z+()rb%$#dEKi#pt-$05vBK|m2=+Q+?s}Gr9fes` zWhY5m45RntB&`>wm{9q>qn#JCQ5adU86!F)I3r98PdNo|k>w}#I_0VuMEh22T*@r{ zD%dksFX)yc(zlh2Xl*c45OE}OXc$Ymw$yvd%cPS&(aS0HHfExIjN6n0CLUV)vm>yRVbGBwX$bjw^<%r6G&y7_hwD24tf)1v966co zHRTuP1weqN1Wh!k*)4!rFvGehK#~DfcTt7Slm$e*-HT|G^Y!i* zCYecgis_y!>Kr0*1tFbN-(GejS7?4yW@?D?`a;o^@<`UAe$yJI=$ zZH^rA<#hY6&exZf`@h!JQP_zI7p$%=ob`=;rlm!mwYQqvE@2zg+sjs5tow@s_; zv^H%}mx@E(x?t5qdnP0HG`?+U)~YAl!dQ8kPf3<3X)WMP-<9#huOo91@CX1PO(7xV z)aI4;Cc2G~*^j~DV;CB$ob=5BJEL%+BhOTca0@lgdxxvBEv+7e?T$xsi)oj#dA)GY z8Ci}6Y*!fe5=)eB8YXL}Pm?$^ZyEKkF#W*~*5C52^>eq-vVmpPA<*g^Q%zG}WllS` zIFiAwh|4ivz4R}w9Javq;2|o{E2Tc*Z!@(daO2N{v3+R0uO0h4zw|Wq7H~-S2xZXz zS4W8%Nf;*O^PIa->1uF5gM+o*0y@5ORY=+_*D^!Lz2+dqZ@Ps0} zg{=syP!-;w2M6~yUke)FdA`X8ZJd`le`6aiNLZS#V(7^lo2Qnxmz+ET$0^fz(h7I0 zu;k9qMo-e%tFj1o^sh;VQz=MXq}GHkGge|4=exQZTyh4xlc1ukNb^kR_)L*o%WI}Z z(7OF<4r)Utpfl9LwfYN&&HAHFY^W9E`<(PSz@S;8P2)F0RDVE!p-G+DHFfF>rAu{=6S|2$UKiT=f~CgzRc6EUn*70s#~-DV=Zlvw z?984*D7YWax<)%VtG#s}Hmx*Q8aiuV_-)C)*bwXJx%mBpYlQprn;`Do(!%RiE&eX{ zCL~AhWZ9~YfPvmd2axAqU3R(tzBXI~1PzuIpaA>FLa7%kW_g#?VRL_x2scNm5QgTU zv7NS%^-8sFjlovlY)^}|<9U)KkWW?4(D*o)gqK!zxB2{M;8pzn>cS)8wc%%A zPw?wsFQD^oEZtS_>CcAUq^IMzq@T|cFH9?^2>~J0F(~p~&K9jRM9o-b-U zzc9|<61@4@|Tt7?2OIW2PzNqztdwi8eZAelNBw7 zI+sNqeIHlHc-QGRvNJvldq~T(lRbYZM3|JK*KgeI7Y75jKQ2f&mw(!cgHj-htoH!G z6+`GuNSQcbS~1w1J{D*He^1qOG&bn!7DIYqa6#6GHc!HW! z0f4B-m>_aT%VyiJH1=37Up+oCw;tLACjHa`*BhZpV{BhbDPil1u;N~=zL2uCobEIm zwK1NVaC)$1uR?>NU8x|%CErJaWsBX@ir!l)V_mFXuqo58GU~(3*ZPGp4V{xTvdu`O zJxHeQvf0ph`tg(Y-8Fb)GSDFD?&!%#QBSfQT+V2k&FGa$_$aqQ;7zDP%Z-N!6 zB~iHLySYCi?b%Mc>TR?OW@HvV_$@mCc98`5O(z;t^?0Gj7VZ< zOB69;-Oo4gkiP@(Wz3WEjdj><9j*ZKkD)Nx`PK-a|B5g_N|6icWyU!kNo-kI$hQ!D zQ58_=n@ts997V&!tvE~5cMemKp4~1)SoQZ~JTmY&iAkY3=U$}ERYa`Vj2+%vYO;;t zL9ykocwk6ximi{jYNfkK&c7@|K@ON{VcfR_`HGE%`ojvB*|AqUBaswWn}81aTk~t2 zQ4u=3%8qZr#+(QYbT895%r^PsH)Ac5@vmbz zE_gH63lZl?OUyzXj@5VIE~#QlR68E)`w~QlS$gp-ZxW82vGD0d=cX8H3n==>$gF}s zz7ikPGy zFM)_~ItYdtW1BE&W$!~>J&@nUgh8?;g)`}VYr_BhN&HU_iI|G)6P63ff;vC%VB4 z<3rZ_IGw;j4+N9IJdw##Ryotl$YC(4D!Wxyx~-MRCC8hEzVW%J7_RnI#A(Pv9x!1! z@lkv(+(?nEV@N~y+@t^?KTV6{ZV)C2e=a(N881qMDc941B5A{Erb7Bfzs$x!KPKjo zS;)&e4!eNR23gaXJFY10z}!1JCOut+MvaShw?crv>@k~~R@z2!(~*F`BVdLQ7X@1b z+x?2S%20YGOQ5;fzAiNtuU{-C>Vs@_CV!-|Mn4Z+)`Qh-241wr2;Ijba0DgY3>W~b zGAgN1X~zN!?uv*v=jR1_vwu%FoVMD&{{S$M+E@csRF2iQ4{2lxRBrp61iO55a=vN3 z)#TDmtxKqgqEQabPGUh$cbrQA@8R$;>VN^Af+-R_fC$=uJK+)lOoPse zl}R0C_Z5?QK&Uw0g-}nvXSGzMLl8(5NbabMvT7d#N|gDESke60Fefzbp0K~XG)DENf6&i>_CxV=_yn&%4Wq>#Q*`CJgB}+XZz|a` z__3W(Bg0bEP>XJ+sJ$AwD>qDsXBVsMzi|8-@kV&J=Xny} zN#9cdf{M+kH6OfgEfOd_-K?rpBoGI0FSxWX(GW3HrE)ggIxA|)*{O)@_*WY$+e(q^ zI!>56-phl}pthNrB^c!KVy4-;KJ+jOMNPDoR4Qq}P)LfS#78W6Wu`xq-)XQfy#$>+cwIUA0TgQnb~MpeRn;?1PKULyY@_bBMr zqb5h7SZKxJRH&yMs$rq?LxNS{b)d!s$q`45yYH5K^&#naJDB(;x80IG%@$@N<@8dsalKEC z1i|h^#^hcsh@VZ``Ytb(384S#E;q{PZX zF}xAU*^il6oq1`{hBB9w3A?_1cQWiY42u#xD9Xt{Xa#^}1b`Q;$^c;>_rD+DuGqTj zyO`V2TV+}NYUh99n_9l-2aW5Gppk%;9sK5pt2RPuR&?64L$G7y?Ip|b8)$)a%eong zXX)0L-q!;*KM9><91H!KhF$J!Bw=J?un3Q--Pv-vq_*2OrcCDlkd+ilBlq^{mf)9h ze;=x5AsONf#nwZ^Ud})_uu8l5+Kg9~i?=_bOv24q9zld^1V60^Qt%wot$7X1=TlLP zeq}71a`jmY;H49XKr;$&yn+1XN%S|6i!J2Blpot#qTvZSaKI4e955_pJd?xFZ{4H6k{`kE?Cq?U6?&F?&=_O%QT zaT2nf?5bXi4aFlL879}npYLDg2ClAvY4L4x!CS`jgY-}%+QFCq?Sv5EJ~T6yiEL9y z0wvK72@%I29okOtwZ90f`TJll&DMmE`i1#k3Ky0q5?D)b+M#1k^`eJ$@v*|3*nq}> zTOAz`S{@a8ghU_#*#Daf2c#?s|1CR-vgZtklZ2Mo?iI-sK{Jj#N*PAPC@Yv(ljobD z{no_prIRaUJ{5bfLWzY{mP=skK3VRwtlt`okBkgA8mZgvlJBBWr(()#rBm2O3X4jk z5SDjdf#OZ}L)#PDg#yFG$nckVPJI|dE7z?>Q*F8u4RE0T{cbiF)69%%K$)zr|52)6~#+0k^@%ECV}j=SZ; zLQQi?S}A3Pg1x=3p0D=XwrdNQX3$auW0LLif5+YzdUq_xeLJ;qcD8ga`t&U=+}?0| zlC|bc_JM44Yo)gA$Ic%Q$ur^&?lhVEI&G^KYWb*JTy1O;uP2kW=~e(h%mbA!o5Ik9 zx_I;M5WmF){gcpY=PMBcSsu4DZ{B^i_u=uK#Owa){;!u?{eDwT!QgHf?xRfhY!8j% zvc#M}x|G6l>C|s7Xd!_V9hRs;;A9rxtrkZ^9p+h1ti*|IS2Eq12RBWa3JQI-}BRLp_(2 zD5k8S(L7|sx>C?8JwUMfT>#5nw}vWRyYZ*5t2QQpGSbj>*5#3&D%EDCI9_A2dMWU% zc($W?Oebyw{hIfJ;!T_FgPDuj`)F|RJ16F-DrI`dPUoOU=VS?jpJ;+PRVs=x7uGsJ zo;uALPRi^oex+oeQIM)kwl_t$w!UaX$a(mfx59OarH+H$rDXW_F|(Yn)h4ZvX(DmQ zLQ!yxRHCBlZb>@}r+8>ZVk|2+YeJ8WMz$P@y9ah7DmL7No*$b9k>QJi1g`P0rYF)W zu`yjXt7vzULza_$neTu;B(f*_3j*0@CZZ^m{R5JQr&0NDj6`GJYV~=drgOxf(*PG8 z11Ykw9n!xv-I~#8k{apk@$#mt^FDg<^7{T5dXnX5Eh{5qoGNtq@2IYY0RKWef67uX z9N?ND(RnzWzGxljptu?d-huabE{Jm#K)G#QR=4((jNd>MR~Ux6k;~jWo|Z7oWi;i% zJaq6I4~za0GZwesA*^r;9!2#DAtte}phxQZ9&KI$Jkc(_$7f z6?qa$O6Do-kUH=UMFw|Lez;>=)|R0OR(#Z9mR(s9uCyhIWsf1CxD95nGtoW&t31uO z^Zj+!cdBiciCgdhMX>7IIvsWqfa%MDM-Sb9zltVLoxQBJ<+54Oo-2hpEFb~Lf6Lij zzuMt#{DcHU0@_(kdnxY{F|qW?lP{g$jfch-XOU0knW=9R%i zq^n~0;F8(;XvN?y>o$+JV^Tx6M8?%N@j#Ep60R^_A?~^C{0gCzf%^9v!w#_?Q!f9W z{HL4sEwA0)qrjZlJm1+;6C_puyxcl%$5x<)gGX8Wq}-q)Y?yL#OFVz^qV9FS$l|%H z;#Ae5ZXW+D-(|VpYnfKtK+_f;C6-7`#nqZ?NmNL67Ha1rEFn1;-3Yw>JU2ylF7x*K zFb|H$rZxG|>=ap-*)+>$@|2A)cQuafSB-~~KHV3F9QsC7nTbOU=6^@^4ghR5`o}zS z6tD;g;$-E+euIu{8t2WI;A?nskZ`pSIZNp!=O?H6HJVSSlC5W4hJ`%mH{1vPs=SlG zzzgd2xG!$Y8yY*tt>+86dzluUuj{QwNU>j@DzRRKUI!JsE-Eqfnb8!C0boL^jy@Z? z#mT~2op|XT)DvgvG(D00<==8mpiTk zIq5p*rJ=;?BQH39eIyj_L0TkENigwP)iQHtR7igthpyoeU0JzhDttM+0r}|!=Xgr99^}dk*5D7 zDlT-wR@)TMB4Sqef z{-+NTA)#ijn~bZMYem9g zGJI9d5TJ&7jycL40KGMR3}Ol@K{dm08o=}=C3IF+q*qs#MNRv+K!?zXHmK8=o?MWp znArs$+N386{TI7!T|wWzvLp7siIKZH_<4j7uws&t;?Ke%HIj6x$tgm@JDUP z*sMD^OcnT~GRlVio=T*<3&?$_D~rdUDpf&EK95pd9glJYt+;ry=}c3h2q9t*6Qj}= z%yHu>RFN)AbwzKO*4pRh$0duMn01^KE(C@E9QC)e1K9%OfXC1MVFEszFnpgFmuoIe z9=7zhSXI#ykeY6iIN=QSFxant1{vPb{MWS{>ox#+(GNp#Ok=z0>y3=C6DVTkO&0;N zVudnoK&+D~{$ zQH2$Hf?S{^L0Zqf{!m9REFh4M6$X_hU>OUcDa{+zByuzli}$|;KH|xm#jF!C@TY3* zbf0yeRJJWL{UXwDhTfduW?SU664hKT?s2xl4cbzpw-JAJHF<-+&FpeghuF@)2kb}` zIzneBKZRJ|`+MhnZVJur&CtAfD`fpudbHX!TsS`T&iws8Q{ecTd|q|=s$=$-jT3-S z_Rzp0yOadb$hG$qMzpJ1t50D|P zzZv)$25yoJyYMhP@}cQ(VSMCY7hAt=bMUBRYwAH?guHY>V}p*9kmz4awG-i>y1fzP5xM!h@LhI|VcKoFh4M8e2H>B3h6c;El#fOXIeJysq^egG5< z1Jx$rIsJR9o;8R3PdtKzNv+Al1(znudw^OKj~aEfzo88gbVw^TdgSptFzqVoxKBh= zK*EYrAe5#yyeAHUL1Rqwd~=J$6{Y+gbL+*|WR!M6QtQ@`WG_#Jud9-c=4~BImnc?s zWmXI62`Yj&p1SlnBCNpk2WC^5XZvLTcE-qJL zck*VK04x+pZVF+g;)F{S3*%u;c6+efUr^)C7T)TSYkLEwt1H@_^Npt+4-uXyz4hX} zLP9}%J#t19vlEV@wz~X0^2t1bFgF6!X__J1fA&iw^dxmNhkem|$h9e(;iMOC(po}4 z6)s#1Dd(F5P*lFV?V3!5jV1x346~{H&K%_Fa)j=Quv^JYHVta(*rv=%2OEwBsyTcBG2u-bk_OM&!EC?r4yNeTwr zK;?fE>7J1PO{BAGSJ`}hzx!m`1a-D^)ZO-=bjKQ`g;}%Dl$^0*uFUX#e2t%1Y0BAY z;!Y)0DeNK6bI;OS`@J);{nYV3Q|zw=`D%kg`Vn3jdPxJ=m)*Xz>D%B8e%1+Vswp=% zNbW;!8IXGs-uSbDYD4vk1JQ)M#tPZj`n>peN}gk~-@N1UD}OtKLfoKYq#0oHr+wPc zl*`D5|0a+W7kmxkO_K&y10k4MGDX5{Gb3{?8Gi+2CWHYXnk^rn@p962l|M;D`M$L@pCGpo zZT{Vze4mZ!_Dkg6=VF(<@4+@`1a36HvT_faYFXWi+XR(FXcKT4uip~?7{^U=u8Sr* z-_`%HY_{Z~yL%T!OrhxYN1y#|x&IY|670`P+-D_K%Fk$3gZtngt8+hM6@{0okL~1T z2}P$RQ%grdzV|=g!P9-oi^lLCBKus19e z>Hc@nEaPxI;)>_W@E{BD?dhIn}vr5iJ{n9jO@!Usb|VTyA(njf1Z5Wlf(&Kc8tG=)mzs~{eyFcz^}0h||+(kou42y?(#GBNWR zf1G>Lp6lA`1mu-*2#udk)$4mnFsi2jL|e1KwyA%Rfeioxy8W696t|{j5df)cgrQZ) zH+%k;2HRiD4B?YRs$=Gn0}W^|8VaUAp$qUbeQRF{>AHM9=y|U z%_Fb+tEIU$3R1tLEL$!lBB~YgPcIh1EFrF@^KsKMj{fSPGL@sbQ`+D|*2k2xpvY4V zszyM>cE(`&+_pQarMb3Cp$iXZr*>JBMRwWX!#*=@*P&9b2g!zmya8(LEyFSA0rYq% zon=;0g&Y=nBCIT~5dBiHY>73%f+A$lylbC4G#tok zv6uw7Pnen1a@gPgv`^rL1s*-`i5dJ6NFNoye1hI8t6WGY$C*Ko_w=00tBn7B$xKH_ zK%);h+2RFS4hpo>ACD8@z%#JkAkef~YMu*txHplNouF>XFDb)cDO5DbOGJ_zKC~xh zGOt<2fVu}RsUpYI=r7vcpej4UL67l(da2mFYf?=ZEP*$X6i`z(cbYq;bzLfz!hV6` zcG{so>~V9anzyAuwm~YL#lu?NqiTay`VW&91{PH{r#9n1YPx+qjoltr&<`Ciwgw+& zY_o*LlDeGp`4T@JC$%pdZt3>$@EClXt#b-ypEkm1-fFSUHeB0mZtoGwn{Jz5H+Y`b zZJXBFd|cgJvu&A~htby1l}gN$SvhOgREfK- zheL3Au3U??4WAir^MoqynDI?J!kcli!Pc;Fc5qye(|XSTVn^p5RrH{U2~-)-+P8My zT1d1R2=bh-Ta6a=Uh?-UL$J3VRD6Ip{YaREL#imJ4J@-o1!9u6<|7NYsCi8H*eIe( z20=x11iEj9Ob*l@upt%7hCn(MIG`cO#P^K^vib$`h6Y&xglJV|x;$RjNY8w!4Vl4Z zIzy_Bjswzy%p#3u0Y7{g*kX)ho4@3wn@g~zsCzp)5`!jNkqmq;*JW64n1 zd6NS*PIX%<(S2m5*rIx4j6&p0d7|WSydZhZCsjcPuYHC;Gj;LC3tW6!oE7ym98D+H z#9pOnhRXl(Cs{A0j%)K9*wwHM-~{c!3tj5D%c!O+#3nZF6;~_avu&0$FW1{Lcvzgc zT6g+)kT>-FeandPEvAG;M8f7K$+tPCzeHW)zz{96JRp^~xFl?w{z!yLG=La;;*YC$ zeCN?)HeYacw7ZI>*u1*^irZ(+FIS4 zi&BPR6O#7iy~W`Ur0e)p=YQK|^;tdkwz}WLM4@G%_OL4eQ?gq~meyC4W0}&}Br=EU zoI5irCR~534V53}r9g1XJFAaCjozPVj7}M#`H%R&Q74a>%7iogp7L%5S8a}34YpYm zPi*Px;Z{YIsjqI9Vc935GF>bu9J)L@!I}2*{$;pH{j8GPg8@@JQ(`9+q*7$P0u{*pk2f5k!tfGoO&5&A6b+5^ z#d7!%QT6bRmNwC7JdMQ(lhg9uzbfPj<0-flvW5UgRuwf(3$?J&5E>fN*=J0` z$@HXcWlpw$7v(7Q22`tcI+-|q#8Z16VPo2^Sat^V7tM)jEE~I0rC~|(;h%?veqs5@ zn0={kmN1tn=+Dwg4c|@#n3(S~r)B!<&l=wNsITm%Z)gr}KO|kq%rx}0tpIe_X+3}5 zKMtizJW%9%jwCUsYRHq?b!LZ9J*lb<(J;EXrJF+uQ>Q=9%y^V9YkNE*eG>US6B+eg89vZK(kD<7(oa%T`s z&K5M=6sC4eUEHq!{PYsFHps~_IvtC|Ffr;QCD!S4UB@8 z{A|$Y*q>XkkS7QPYTJBo*gLUI*1Lc6KE8)`VT%3{3%4y-UKPkTrK~m!t!Z3vT)t}6 zan7Dou~zei#J(v4sEw7W>o$L?Von_3aScVn6*uKzCZlC?6eBZtr^f*eYTrT?j#}r; z_fqe^H>9gj!<3!@skxyYooTB9i5vN9Wo< z_UgE$J~U_tW^9r|k|X7`kioH{-!Si0B6eLPO`Ks%N=Wmh*X3hl{xHVM?h4yyOY&P6 zQHlnec7kd{9d0m`TZkey4-rGNrj0u6&*~R+B4^W?)RLRD$1d@|-522*9kUHV_Yg?_ zR>M`Dh5(1y%efll2Ev3_m^5Kkd|f|^R4qr7n?l<9e@Hq9#yGpK3r{>rrfJyNwr$&H zW7}vN8;zYdw%OR6*tXd=>XS5?Z}NV>;oSS&`|Q2ex`GSxRQWVA1KWuRBKyy%4iQr- zDic^fU?xk18k6^UXcVLcOe#4G*+Y36uFrp2gfOrO-X~)%hZ_jjr+qZ z9K*N_>SF=~-~grJ%!LyLo+!VqT4Y|LQW>4ng&yzjs+p&2orGn&%zR(g;g;rN{yRZu z-!HjumDf$boA4=ivCGFNvmG5SCJJcupr-9aUh0+4*eZjJ6vmVu?yuxV^3Ln%vB+sJ z5tRgqLAqUqTMo|7V20+`9^YHYN`6|b@R>n7?p%LlMS+6h%@$p$E`}zlkODmdFc~&v zro_@zkFmQXZ|uQr4Vw?5!TI}_H?1UAl~IGY304M^X zABLp~%gysW!avLzI=cdXq^Mpj2SHvPLU^h_K>w-*mQZwBgZa`WGM54W-gBTZD-0HO z-1`C14Z~G&4V5UhZhqyLuZfAJqdKIf(&s<`eEKdnpRpGnp@iNTaPUhaV?A-x4?z;p zKsU)18(%@1ymWTZNcra{cF7{Ad-~a-WZiIL%fQi5Xd_KDmCh!5(YTxC6Xj%?qLL*h zb+%wu6PK65AZ0QvVlsBGRYRjrB}h<44NrV07HNe$Kt(fSm-6!lT)uFb3h&fG0sw&N z4er|w60;3Ny&qG+GpOU^N@vokpIoJVR+m*R`vH07)d4Se@7%ujjx=a^^8hrRd>G<5 zRVC0q)RMysQNi=|fWs|;zwpT&0OVLFpZ-w_ds`my&JsOrEITqxDUSpJFwO-}eOd(PNHVNm_kCY#u12e5uPz-2jVyKo+iZ`+tBnNuw+< zE(hF5Y&bPGS|%(R1LEh>@s_MF`awb(-WPL~1~P2h(KL#pK{`3`L5y4G?)1vx)->?G z@fs1*I3{O})Gbx8upj3e4D1i^Bq>ugQuKcksQ<6O3WiUzgr?CG88DM=Bv4VXVc2EIJ)O=7Wrv+`8!3Vuo86!tQ&ORkOrIFXvGYit^wiHigmyZHh= zUC8RUMDOYcZQ<@t&6=vg%dNr^!xo{#K}`S*$=3mvq)yDB+-b))E2!aq`-=pE^!n+49W`)>6W7MSGJd_^(|yNQfL*BDh3hb zB<9L~n&as--)+Yq8zae7t|D7va^p}uNzZ8v8|O%pq(o1U0!3)&Xq0p+!n!WyJ$Ay{ zis|^+gA4n=i*0x`F15hR!Ctn%wmyawT$9Yz2aGk&*p-%3M9q>siAm<{M7p>*RjYJu zN&}%QfN#J5rHX98;MG~CJZzd2MGm8N|FQf?$=0H2)KUtYC&A@m0>rdeZ6^2FKwVjw z`4d;iGcP!W^|;=|Wm~XlrOzNyXvEDFwXU`Ken8j35y;liagX#QYeArCKkWaZ zlU?S9Mqwj`L}n|FWOKBr1ew_@^ZLz=+04Ta6)J) zZCu|Orl{ya0;6saVq)P$Qu z6`cSOlM-fK*VkehKeDC-TksjR!8RZZNBsRR-3t!Sg-Sn>p%_ZCNhbsv7@X2f{Tktq zXGdY@EoPu$Sj8`+Kmv?VbPpv=R6V`axa&EBPf@^ghc?fBaUpK2Vj{J^{c1Hv*36k= zfqGIFdtUw>F}HFw)v7PrCT{oRYt}*5&2@_|*BdLilLVSEoC?I4B1v9iZV7w<3L5iP zvHdHi*bGjRTOM-#<2*9tEMi=`R8{ZPC}J8cCif530jKuIGSyJ8-I&14Z(32BU;w;) zioWo061B5pK}Wf+SzU|dCuNlf&zRPR(6{i<(sd2XiVDSsGPlKD5PKFbzDK4n+Ri;n zasUi>({k_C`!r-KbT%LBzc3%*K^))@RLD07B%xvAa+zHvnGLyWh86|Mvb9Iw2h`>& z^)C+nH2H?P!M3J0&P;DsRHV!$!;`%X`&d#KQd>E6{|RI56GZ%->{N&*%rOg(rIiKf)1O?cS`z(}!0-Mom@TOg;wI~8dROssPSz-j``S9fNIpGgC^9+KH@Q?{ z3!s9ds++LBX(CsK|Ay+jS>T0^7BzBFs{48^SD4@ynE&-yt%h9nk+v|L>(T3k>N(p3 z@g5r{gGDaoX5~hqK^@(LmTy2p$CLp*7$8oyu_ZP(Wm~0n5<-eX4|h!Wkr-}BPuZF* zF=lM<2p7I-#J~?8o|7kWy#*fRS2Z3YZGZ4yst`bgICRU!B<0H&BA`G;p^jAwwe^)^ zoy|i_)ih1XbCtDHoR+tWLfz5od@y4|)m=OdjEAFFVefFOSBPjQ?xfj6skR&BOCw92J5a*RJRjwF#Yyh+MN05XD zCQ;a$56A37Q=x=u-vfscxr9wMhqwFG2*zX60WT_=tV2W;d*Oa!pw|0@s}ycpl8-RIfG#7K{dInwY#{v$rP#`#66=dk-x1^`2(tOQ`v@rm zl-+2Tdq3ZZVSOZreZY`j2KKuTh$+q=7Q7$O5j4%q`h8FA&kkdd4-YkS=^GnD->T^cZopp-)qBNH|;_{R@OWNp^;QCr}kUd3X zewyv4nTtJ9tsJNGZ`vE;07>}awKxCqo4DB=7{Ha*)N!sx-+;$~M8?C;Dp4b8S>q76 z>6F+qnCE!V>ZVnxb~lE!*1tyjxBO}&v1kh*OzkKr2a+9GVJibwYUDw~5C_O<&;axV z=d9vxU;!$=eR+{uN*KgWL|A(9Kx@c;B@BI%TQsu&{)GXun4*t-@Au zQDwmw4Lz77>UQ~@S?~6};*dd`x=fx`mtYUm-_d>O1w_aWNJ@$e;417Ma+nEm@0{Nh zRRrhCElPtUv&p3hB^AV&836(op3wMQ8O3s%!D_lz~jeibxe3kkvByJ3i%IMwp>zHs6=uA#dGD=k8 ziM5JlU2<;1ZO1te&b?bc*NvKL7q#@HLfg`b(r~Sw{E~XZ$WkbjUy|^{WTkd4fhF8D zqPM_y=H0liO%|6v81h2LwdP##Jf zo8{PF3#G46KKrnfSE4&)zDl`9fT{5y8l8q(3&#MK0S4Bd3bX8SM~~{r$Trv@B&iUY zgD&Uuy(0~BD5Yyd#ircK2K#d-+{AmSUID@z{}6yAzDrvJ;6S71JKTl7$YI=UpZt25Xx!bsW z3*gcw7d-uN6?P+dVqw254sDO1hS^<gY&@C6|UoO)NV_`}x%w^sG?TLHBDvdOOL{~)n zSw-bpR-gpaIGr6P*gFfxY`^~cLd?@)xT56o6{8#r<=@GZCm+*T2@7kr#-i9t1p1nJ zy>RIIfB9S&ienNi!>+{X$|C?xFGvP{&AUl-tAqlQ$>dhju{nQ+VOsnF8^wiKeE*QJ zHfitu))uNFVE_)Gt+>XgBqlbjPRKT4!M|neQ9NKK4M{g`6axr=nOAN>yv%sN1mX0H zk@&DI^c8doU8%iR7SbQSXvg!uL8;7_E5%Q->|bg4j`I43!#M(BgRR@#sH}F4_lB^d z4G1lOAMD|Tlh~S;GL?@libI_LJSCfS-POdDPS5w_eg>v1y6?$-O`}fwZj_8BkmTyf z_@QEqNQ%80TPlb9>uf!roY{3{q7EiKh%D(#@J3B&HL8H=(9QVd?n==Mu3!h&4JdNk z?@jQ;WhM^3(WZhYz~*H&mnrQAY!Jd|&1;gZzXY79eZEB{wf%1IMua&Y9F^yRpQ@0& z^E%P`@h?)I2k+m8a&5Xt$j_$-&HCp>!`Q|bQ|*SGoiH(rgWn!^+Q{f*bjT&Jyc(T_gsUy!dCq{C0!j?+`K?R`Eg&-H%P zlFn&_2mpS0f{5<5|bCwA{uaYgb z>vN|itUCV;LJFA~2o^~pglt#}6uY`>jfjG&3(v4WQXodcD~KNJKzwEJbL(VbB&yB0c3W{&&I^dZWnSIv0g2tF$X6%L4PKPG z1_vf+=yFz;q#BspoCrlgE}#3JYYRWHL|kh!F5mqS3614Xp})TBD9Jyd)y$4Y4~9d* zJ39zbmCCYG+)p#p#q!#28^{xenRIKqr-+bgP{!h#{4FPrPmd_G!Po3wZ+l=*w@^lQ zGT-v8kWy?QL0l}{i|r4L#1y(r4z^fGsFGRaHSf_;FLkQ_^-X&Wxd*S5lw7DVajFDu zJN8^W;r{gYE>P011OQwift?2!o0u{`7rW@P6AveYQwy5Dk z!L%7AK~L_CqyNGmejEmKU0(kkCG!H$AY@Y#&K=z#|9d=D z&CkRJ$ps!))qt{7V1CkTbECnaftiQv;l`w9`EInW&i%(uI&+{L@SCBT_I zp&@JrbJPy6pIH%h^q5pFIZPlnfo~M-0_FV3>;oU{%s=ETza-c=8Q3{SHhNKpDKzHi z%geEEkqx?LdeQEf({wsu_*>Sdu36WwZ4HdgiH=a(@0f~b>yPK3>$jh#7SEJPO?-MXUq2T<{j4tmPHJdvY)`q-+sEp(C-)wpR5le`K0|eAMtXnLa=0vqSa~-Z^);Kwi8H~dIBQ_Wns)v6 z7#ei~(L`70fUN)ZrGSWU)~lBvx&7JpsuB>W;jm+h|EC2XhP|Mp1QL}{DrpT4G)-I?-ECjlmtep<#S4n!2? zIvU`p8!^?^wR!XV!G}cP}M<-_m)IT&*m+%7s^xknod= zIJXh;{^F1{?r12|fXY}eCkay`{j(|4%pSA_r*gLuX@F~$WMGUhL%``oJIt;tC!{h` zSyAO(iG7T9tZ?s0_tu42J^4Bf8BpmjEXpePICo4H=9gh+3y>up$zxxw+~l5KAnF&m z!_yF1$N5hwy?+S@00h$axCtqL7P1_F=(Gn*TJ=5r>KrD#((^t#TzoP85I&fax~4KM zL7a%I2(Le!JFi_EJe%=-&b)SV@@XMoXnnQV_Fs)wz&V`U$#ztQVJxQHDm?{*t2~T#(3b<>Hf7v! z^rZ8xPw9G1S%?M%>HdeKQpv>U>)359>K(Dx+yW3!Z&T2Hsnh2C<9Y?~P9ejiYjUJx zNol47vRQ^u;Pti=Nt@$GU?DSsroxx7)a6nfVXxa-Vq|zydN&y;wXUnw z4U4V9M%I;m%H#^*hYZRl!#&hB zm-51Gh7!7Ok^j_RKymx*vfh1JD?gX(R{iBmA^>b!PANw#&ZF_JiJ=KtS`G63{jleu zlCGJl9QrYqbw8s2c<~T6tADE66IUK;b}kWrBakKQpMuGtn2^gjiz6bXR|bzzr}*RO zOLWq3M5Df6+Hb)TIM87NG>o1W&gltPh;czqht_Q@|; zHVS~*pVu}a9GWUeD!uB?&MuIEB!_~0(b>?X<`^Q?3BGM$MisJ;uxIU1ym)%cCq18q zi0p4(dz4EIM2eTQ6!%SxhO?3Ve zs8i}J6E6O)wH?GNCX2zKM+x~!ATzWeq3?jMHoYIxM(NM z??K^)8S|FTbKTd`+3Q|c+qqF~LHJky5=J49*PE<1ygn}fS(11(Z#jG35%MY){}M$#Ug>gNBRvQ>BM#C?bebYhH0a zIPpF@Xhsxs?=I517kQI80$^yGw_6us)cnp%#vExWEU-Tqm3Eg#a!T=4PCMm#3{qI9 zxxC+{Ga=AyrRB?yoc1z9oyNkjhFH>t&5er(cGPt01pRzMXOyO3fp|k0tZb1wK=;xiD52qyuXf^D|d|=u%c3+}uMGN4yoqIq< ziuk64S?Z?bVV?*qop?C7vH6|Dr(SG}jc;c9-`|0%b)32ezu1N&o@NE&*So}fNpF%8 zL7v3Xf^fXhL{fLt9R}Mdbajqgy2l>Lazf?m#S)cUx#y!faY^vgH@W-pQ?Qd0!3!>? z7yHaZ`(@8q=cg$%^3S7Uh7uvb+wG;HqUQ2$IEZ4 zR#gCQBHNPd7n7DKR=6CL3I%}0KK6hq>~b(H#hXXrl85P)I2!@+2e>e-!@`s<)`XJa3Z~%b^B$>`P@{%p`E`5DV2ZN1&@hX( zddLwzh|`NV@so?~%2E-;afc&3;l84df9AUunQ#9oUR!C;T6?rL`N=fTSz+icMK+qA zVp%PNyYu;#k=~LGMb%MC)`H2qx>0I+|||&~{LF?Rs0H9BokfL_~uIcSDB8e8T+}`x)01 zP?c?2&b{jW)xW`&m)6M2hT3H1X`x(U{ zRd9?$BbqgPBtWWi1W9(xZNhc8!mp!m_QOWjc2Nhrv)-@A;jM~n!%xOswQAKP;Y>FT z-?Q;^2F^>vA8-=nel^pR#Fg`d1yoafTrO`bD3zVqp5y2%{(dnEPGO$jG$imDVaSS+ z&%u;w(o6Y@#K<3S4qRw$m&6gGI5u$lLOZmger7M#dqk9UHvALnH&kHsUiD=b>rjvp z(&CSd3MEf!@Q)D>TfBSbsw!Q*=ASRU^~!{}yu8*{Nd(#a(~f7^kN(sggIT|G4Tg(6 zL99UFGYuV!*dhT&YmLZJ)p(MY1p4CzFdPkEE+9or3@fJDeJ9A7t^Tl02v#-uLXZk7 zaf;m0OH+|8k;_o}c78KN%xP|r4r9H6V2$f*GnK14+TMD*GxPM1`%hV#)-ie2U7e=` zt@qcR?^yw+ao}>TLU=TQhWD&Ye$e#2DPjPoI{+F~3wF$`;KD#DOerMH5@PQ;L5@o& z{GvBELa!rI*IP6Y>$R5e`HKBHF!3!pX5N|ClW{j7dNcw|{fm)-9AC+bK4{Zf0VoL2 z+VhCagU_%+$&M!{4pHt#M}XaRp0}JLg~9w8>{~?x=4RC<%TSJW{^drD{YBxsXPKT) z(R-;vy>{0&%MQrI7d-tNfy9Uin8>vMjRg-KCg^`{iC|KF3qmJf;`QU(P!5I>UuTk&^ge@79u7IJF z?1vmxVKd~I$Qe+zzU^|;Qxcj0gUINV`2x5MgUz%*IKbW`@%m|s-L+CKO~gA3G9Zd2 zTvHb4dJKA66}b(dsi3-?B8qnw|tQiNU^_$a0bAHQGMxM9fTd?j5e8M_(7&%sblbWa&1}zsrqr= zWm5yQ&q!9A^z6=9;OojyhH+VQjh=NC+V;JaN(lIUFh-e z2eb=--+VXl5dIYkL9wBx$H7cU*00I(vz>=$;JVAwsv0-{M}s-YXxW5`gm{#i{*C5v zO0DM0@fe2Ky;{9YCaT?D$XMYQx(UhaaCA#GrTTCLm<_Ec)B&MU-ra3o)RD{s@KVCq$3N?0t6KOFrPIErS)c^pVxXUT`95DrU zV$*r}Ir}d0C**dL`x--R9(Npb^6QDX0VECb`M*90_|nKE)hPb)E+a_3aAhJb`p;m& zrFTKR#VBQl%y`$ycRko-fab>KiFBh70oy7HFowbm_otX|crYO0P9LZ+l zn(OoUIWgGES2Zr}arG|xxbYAy#k*g5UAI+RyL(1P*$M>{)YNB@x~|0be_@{)T%XQ2u|o zC?MQb;N4-hp*R`qPeu6yYv7x@Qp4;yDdRclcZ{)9P0Xc}$ZEMlmBa0wzL#+y1Oj=4 zyu@iB!T(hJEb-9tK>nd#Knz9$NcFIwa)b{np(VMB$7TkPSk{^*h#n=TfmV%W0Yo35 zbb9cy-&_#op!kI64R<)CeU3_3H(-VBC}D$WP*&j=bps6nDA|%z*Q@Bo7A$;WqH=HX zFs{X{S`)dEG}h{4#OhQ}VQ?fs{B+}fG>eZw!MQ9ja;f%>ucfw`!eS>A*a^uokG<|o z+O2g{RFfm8@h&(4X~IH1vH)!Nb(i2^WLQC2lTpmT#&FVrj8dZuyVBNO#w-k;oICIqUpDS4dHOKv$T%l%jumFSj z+Riw5*wEEP`MA7p^dH&58zk0z#p(-G+`o}8!B>5c`N!z`2Z$N=OcEbya+bt4dCO6L zhPG5n%x4JTQ~j#A4N%{C#BUyD|KZK@=cw65Clu}S8h>+?n{&c2QNP{wMUZXOZ~{qC z#DObAbDoR?4^GmL?n2zL)AA z0Dd02LxJif`34A_s86Ud@p*M?*k)~)!Y(Q_so+Jpy33qx$7%x$V+Q`K+FYbhi+GyJ zi22xibf>TyGsafJE@6MOf3MWA?6GY4Flyy@0nvZ`R@=?EVJuINfP{?_-dkdNDOQ16 zCWxFPWOUBYnE!E(ZL6DvL#2LPEmEUy|VV? z0CE35^H&KFX~&S1LLdH&Dxi)^ZqEAM4jnuO^DJ`Q_uKf2{&F;+Ow{6pC_7c2 zN!W#nSP~r;R1wW!e9|Kr!jgCKNgHO=HhftNNr_6pK9!|Gv9VKpnw;0p>Vtwwq@}T7 zz)Fh5krIj?E+Qwpw|Us^XWfvSv?h zcz82co#T|7j1kRYa=0-JvS4x>vI1L6lp263&_hq0@(9C|#55sd%%_k;53^>w+hLj; zmx2LI9E1M)Ma4~em8nFFiId{GxVkNpN56#N_5RBo4+|d|BKhH&n`2(sk3r|z7?2Zs zUUQ2VzBpUjbc|l**_&(3?wk&ty$rC)IF$Tq%f|h@_cO<{n=U-b@BG7l08m5TYFFZM zRhUex3_C4E!D$+A^gsJVo;&BlU{~rj{l_o*eq+DOQBCTP*u!a5?01)Ud)lbEmY*}) z>=ZT&d6_f4w(Mek2@DEg6_aqfC+z^yvIm!iGl3brHOk%Tb6vMeptnvPs`g)f3JnVr zUAUHo9mQiAT$G&!`^A5r85C;VX`H-|Eu6nf_rAn@Gc&qWv_oNQ+^*%Ppbs-uO!Cs8 zGFGc1!iRn(#Yqiw;OVN1h0*$s0zB^NK|M>E)foi2%Z6M_krDoO@ov?sqDeV2WOv!m zbHiF@t-}HuuA~3arPf7$S{E{{IPO_|sW3ODnoDY~#GwekbA-soIW&U3?4TgL=Qyq! zAKZZN5H8)K5mDh-<-JtT zpqc9LIl#nK!UM4e?3B`&JyDuU4c_O72$e*cSxjtWdZcnfR01lLa+R75C>0eq1T6Df z%pIdJN-BXW_35t1Tx`;?_ggg#S(8`h@;D9G$Mj)sBO1QDLmKuOQY`VCgPoh2lY{r< zJmRO2T#j^I2-A&D(0YBw@4Si8Yr$;CsX(&(&74re*f&mI^_4N67?v@ca4;IxuB@^; zyQ)tS?$rI7IELh*L{cnYGD(7eLOUOE{R2cMjeLoyY|zI``)_L%Opke~`Jh>G{|XA( z85_@nRJMIngr%Kz$^nJ~fQG&}^^@VRJtYjyb%C_w9(U}U4+$)pYnEJM^LS25axwB; z1`=JSN+&-kqDEXu#yHOSv}l!?*UOsl*{CVDWw%@TH=@0wqsMaM!Y$Ahm>C%`?7jGb z_L5d?4TK;I;~&|x=L9wQz1A{rtUnCb^{SevIp=zDv)(-OhdV4m6SbSZAd(LohiTdu zA}m4?E8MDq(#7@vL6tpkW)c%`uN|ycpS^Y=E^WcE=Txc8?O#Fh+gV@Pg{Q>+SE?c5 z3-2!!Ev9*^u~qg z@BDTLgMjKcgHQ12fOK%}65jtFHtbDE{7vO{g~UZ!f;Qe(=kPPw6xmk@Yw)D z%I3ZGC?x!sLzRo(BX6kWB|yKsPmPhLmBq=yK8d|XH=vb0*U)hLw3oBqVe}i4`rdyf z-y1k@oxZ%--~Fxqg8`5Bs#gAnAN|7=!{O`Z*Tm6a!u9MkX6`LqxCjG3W|~#4@^z^) z!|!~sVp`2&{dfcL z?&0Cg;is75IQFl`D8sn(m7u9I!Z0C-QP|n&CZ-FMq^0|V_*H5~=#BkIs47$MrTP*K zzxpo2<2(~ARIn#M!N4Zg)^5!VraKR_+erbyD_)@g40XkbDaizw21~$3iOc?NqW;Iy zSwrE6X8$`|@JOs_&5+9&s1jh6=;w~3JZgmT)DgvjeWB|rm{gdiDs(TdEm7D33Khw$ zOZ9#0(a;&D>6RDFxu?pNF5=Okr{GW@6->@3z=|01)h; zBH}>?u%zDjFvSF*Sj%*r38vwjvrh_el#9|l3~aZBO>6|$3n`wf|zIw~9RR zTe3Z4PlBw<1kWl~FqF;tk4xAn)KZ06+Q1f?-UUA;0wuky9dyc;Yw8;b82*&gAN%b` zU3CLYQFc~$xF@h2TrHMKLQ3l|o1R4PHJ%Am-Qtu*a_X95nV1ytEAz7$y*0Sb{}cUn zDN*>xvTxKz9stmCr=uQBa@w?aQ5*R~)lZI;g+M_uhI?qi67n@kYQPdlKUah%CyVZ* zS`Du#D|6mR(o&dx=WH3AnnsXj(TBNvYDTG+3sc423egQ+r_3QFR%s%58M&w`EFzp@V4y!44h|QP zi~>`XLmVZ+GZ&vrb52ltwdwjh_i$QllOlHS6gkRyZs{sQ3_+Jo^gDQIQG8+jDywi4b zbrAhC`%Al|zDhQ5dPL^`UDBX6q_f&_&Al*8UoQdt)9n2=h{j+4FQfgKU$d!Fu^jvP z*L5~Cyh$6nqt}rh$7<<>-3DQQCwWT&>&rA+??M)RWh<^ssqyf6<>>+Y-)7GuU+X`O z%+3DZBP$@1W{&LW-(ut*S${Bzb^I;(zpg)bLBH;o^;B0BfErZbMQK59!Q3tabvNOqYmKFWqAQk;^|aHHXJPkyFJ3TY9xI^eG^awx@FgHpFuOC_ z!lldRwO#xlp)g7HVRl#fi!xDD_)s*l;4Bej_CXt$l?tuDUre0CLpq`aSo>q4C~4#p zCRtoj5%PBMCF->TQOkQGHN3yj%fC5D!OGl1O*-C#8N_9d<--fKP)z;I1w|arL3bO- zY}PtoUEqTw>=eFD)u2;&W$Jfyhf0VrUIg*70Yk|xQ(;jx%>e5WsTp!ZNC`r|6xd5> zz^z^hsIyWN-b%ofGPqn!a-L(JiOsdYAa%Q|_1G+)H_^f;lUmIjv|hmV#LP@RgC(rZ z?ZK4Z*@hs-YLHIlps#{s7Td|PxRpGU!SB9=ct;s*B&#l)+k*`!Nq0@i@3EOi^3r=# zgQap#Yn1=wr|%$Rd%q@SW1GGDhuh!^pEj#Be&t6{ty;HI7aa}4b!CT2evQ{=t6>fI zM-i3QJXVYFuYe)MMuc&UbMo8=MfZe>vZ}qUsI4kzUOl@vJ3X7k6H~%8zMZW4|1>QA z{cE*MUfG67qQwIcIB;EM`LM{;6^s+t%Pz=Hb&T20#r1>3+AjRiL29;Q2*R#EliBzN z8OfT^lCbySYfxs|;3GeXKeaJ-9xsD_YTs_#U@v(lw4{uH|vVT z}Qbwkj$!0MZ>SDl_JU$3`p0Bjs0Xeyy^I zp-`r#c{1UIBM03f>>Y=GMMl^~z>_FBLroSljBzRWi)@}EAudi=i9a-Gs z(;2JEAj(Zs;Z+3u?gq}H?Y`1Zr_hvjo`!}rjA<@;5oHcM3Vc*(YkZQx>G3-;Dv{zL zpQ`v9Q)QyUewyiUP<@@hi;Ej%vI?2n+J)xtZ3kGNb|xAI%4%%yJgfQpA_SWP0Wg?{ zaox>sZ8G*)u=Wk`Y%}`+^~u~7eO0>DsIVgPMjFjR?R?Ae%T!rN{q8ljrpatEt;4Oz z(%bjfwpyH?2gv7FQHZ=jjaFyI>3AtU3dQ6J_ee=+i0x#`rqjM_#CL8oScy1l0xmQn zHh3UTaV8rkpqs;O57W=RPWDGksrXzw%*AHg_%~F0<2&xF_3-G1+VcG2+IVZmu{it} z+7#4p*5JHG(vkFhe_;#0fmA)efGjbUEDhC1wbM3s0FBcYuxSeshzxov%1Ze0D6PW
5E2ZpqhmtW8QeEsHl1TIy2H-X`%B?c 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

~B6t`T+rni|IBg@aBf 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 literal 0 HcmV?d00001 diff --git a/public/images/items.json b/public/images/items.json index ae9bbf39302..01d28e79e58 100644 --- a/public/images/items.json +++ b/public/images/items.json @@ -4,8 +4,8 @@ "image": "items.png", "format": "RGBA8888", "size": { - "w": 425, - "h": 425 + "w": 426, + "h": 426 }, "scale": 1, "frames": [ @@ -555,6 +555,27 @@ "h": 28 } }, + { + "filename": "ability_capsule", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 9, + "w": 24, + "h": 14 + }, + "frame": { + "x": 0, + "y": 412, + "w": 24, + "h": 14 + } + }, { "filename": "ability_charm", "rotated": false, @@ -787,7 +808,7 @@ } }, { - "filename": "elixir", + "filename": "lock_capsule", "rotated": false, "trimmed": true, "sourceSize": { @@ -796,15 +817,15 @@ }, "spriteSourceSize": { "x": 7, - "y": 4, - "w": 18, - "h": 24 + "y": 5, + "w": 19, + "h": 22 }, "frame": { "x": 407, "y": 0, - "w": 18, - "h": 24 + "w": 19, + "h": 22 } }, { @@ -1081,7 +1102,7 @@ } }, { - "filename": "coupon", + "filename": "icy_reins_of_unity", "rotated": false, "trimmed": true, "sourceSize": { @@ -1091,56 +1112,14 @@ "spriteSourceSize": { "x": 4, "y": 7, - "w": 23, - "h": 19 - }, - "frame": { - "x": 22, - "y": 406, - "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": 45, - "y": 406, - "w": 23, - "h": 19 - } - }, - { - "filename": "ability_capsule", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 9, "w": 24, - "h": 14 + "h": 20 }, "frame": { - "x": 135, - "y": 22, + "x": 24, + "y": 406, "w": 24, - "h": 14 + "h": 20 } }, { @@ -1157,11 +1136,32 @@ "w": 24, "h": 18 }, + "frame": { + "x": 135, + "y": 22, + "w": 24, + "h": 18 + } + }, + { + "filename": "clefairy_doll", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 24, + "h": 23 + }, "frame": { "x": 29, "y": 55, "w": 24, - "h": 18 + "h": 23 } }, { @@ -1179,12 +1179,54 @@ "h": 24 }, "frame": { - "x": 59, - "y": 27, + "x": 39, + "y": 78, "w": 16, "h": 24 } }, + { + "filename": "carbos", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 39, + "y": 102, + "w": 16, + "h": 24 + } + }, + { + "filename": "catching_charm", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 21, + "h": 24 + }, + "frame": { + "x": 39, + "y": 126, + "w": 21, + "h": 24 + } + }, { "filename": "fist_plate", "rotated": false, @@ -1200,8 +1242,8 @@ "h": 24 }, "frame": { - "x": 75, - "y": 26, + "x": 39, + "y": 150, "w": 24, "h": 24 } @@ -1221,75 +1263,12 @@ "h": 24 }, "frame": { - "x": 99, - "y": 26, + "x": 39, + "y": 174, "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": "clefairy_doll", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 24, - "h": 23 - }, - "frame": { - "x": 135, - "y": 36, - "w": 24, - "h": 23 - } - }, - { - "filename": "carbos", - "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": "focus_band", "rotated": false, @@ -1305,8 +1284,8 @@ "h": 24 }, "frame": { - "x": 175, - "y": 21, + "x": 44, + "y": 198, "w": 24, "h": 24 } @@ -1326,12 +1305,33 @@ "h": 24 }, "frame": { - "x": 199, - "y": 21, + "x": 44, + "y": 222, "w": 24, "h": 24 } }, + { + "filename": "silver_powder", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 11, + "w": 24, + "h": 15 + }, + "frame": { + "x": 44, + "y": 246, + "w": 24, + "h": 15 + } + }, { "filename": "gracidea", "rotated": false, @@ -1347,8 +1347,8 @@ "h": 24 }, "frame": { - "x": 223, - "y": 21, + "x": 45, + "y": 261, "w": 24, "h": 24 } @@ -1368,8 +1368,8 @@ "h": 24 }, "frame": { - "x": 247, - "y": 21, + "x": 46, + "y": 285, "w": 24, "h": 24 } @@ -1389,8 +1389,8 @@ "h": 24 }, "frame": { - "x": 271, - "y": 21, + "x": 46, + "y": 309, "w": 24, "h": 24 } @@ -1410,33 +1410,12 @@ "h": 24 }, "frame": { - "x": 295, - "y": 21, + "x": 46, + "y": 333, "w": 24, "h": 24 } }, - { - "filename": "catching_charm", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 21, - "h": 24 - }, - "frame": { - "x": 319, - "y": 21, - "w": 21, - "h": 24 - } - }, { "filename": "iron_plate", "rotated": false, @@ -1452,8 +1431,8 @@ "h": 24 }, "frame": { - "x": 340, - "y": 20, + "x": 46, + "y": 357, "w": 24, "h": 24 } @@ -1473,14 +1452,14 @@ "h": 24 }, "frame": { - "x": 364, - "y": 20, + "x": 46, + "y": 381, "w": 24, "h": 24 } }, { - "filename": "lock_capsule", + "filename": "adamant_crystal", "rotated": false, "trimmed": true, "sourceSize": { @@ -1488,62 +1467,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 19, - "h": 22 + "x": 4, + "y": 6, + "w": 23, + "h": 21 }, "frame": { - "x": 388, - "y": 20, - "w": 19, - "h": 22 + "x": 48, + "y": 405, + "w": 23, + "h": 21 } }, { - "filename": "ether", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 18, - "h": 24 - }, - "frame": { - "x": 407, - "y": 24, - "w": 18, - "h": 24 - } - }, - { - "filename": "abomasite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 159, - "y": 46, - "w": 16, - "h": 16 - } - }, - { - "filename": "coin_case", + "filename": "berry_pouch", "rotated": false, "trimmed": true, "sourceSize": { @@ -1553,18 +1490,18 @@ "spriteSourceSize": { "x": 4, "y": 5, - "w": 24, + "w": 23, "h": 23 }, "frame": { - "x": 175, - "y": 45, - "w": 24, + "x": 53, + "y": 55, + "w": 23, "h": 23 } }, { - "filename": "expert_belt", + "filename": "kings_rock", "rotated": false, "trimmed": true, "sourceSize": { @@ -1572,58 +1509,16 @@ "h": 32 }, "spriteSourceSize": { - "x": 4, + "x": 5, "y": 4, - "w": 24, - "h": 23 + "w": 23, + "h": 24 }, "frame": { - "x": 199, - "y": 45, - "w": 24, - "h": 23 - } - }, - { - "filename": "hearthflame_mask", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 23 - }, - "frame": { - "x": 223, - "y": 45, - "w": 24, - "h": 23 - } - }, - { - "filename": "leppa_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 24, - "h": 23 - }, - "frame": { - "x": 247, - "y": 45, - "w": 24, - "h": 23 + "x": 55, + "y": 78, + "w": 23, + "h": 24 } }, { @@ -1641,8 +1536,8 @@ "h": 24 }, "frame": { - "x": 271, - "y": 45, + "x": 55, + "y": 102, "w": 24, "h": 24 } @@ -1662,33 +1557,12 @@ "h": 24 }, "frame": { - "x": 295, - "y": 45, + "x": 60, + "y": 126, "w": 24, "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": 319, - "y": 45, - "w": 23, - "h": 24 - } - }, { "filename": "lucky_punch_ultra", "rotated": false, @@ -1704,8 +1578,8 @@ "h": 24 }, "frame": { - "x": 342, - "y": 44, + "x": 63, + "y": 150, "w": 24, "h": 24 } @@ -1725,14 +1599,56 @@ "h": 24 }, "frame": { - "x": 366, - "y": 44, + "x": 63, + "y": 174, "w": 24, "h": 24 } }, { - "filename": "lure", + "filename": "max_revive", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 22, + "h": 24 + }, + "frame": { + "x": 68, + "y": 198, + "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": 68, + "y": 222, + "w": 24, + "h": 24 + } + }, + { + "filename": "candy_overlay", "rotated": false, "trimmed": true, "sourceSize": { @@ -1741,14 +1657,56 @@ }, "spriteSourceSize": { "x": 8, + "y": 12, + "w": 16, + "h": 15 + }, + "frame": { + "x": 68, + "y": 246, + "w": 16, + "h": 15 + } + }, + { + "filename": "elixir", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, "y": 4, - "w": 17, + "w": 18, "h": 24 }, "frame": { - "x": 390, - "y": 42, - "w": 17, + "x": 69, + "y": 261, + "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": 70, + "y": 285, + "w": 18, "h": 24 } }, @@ -1767,600 +1725,12 @@ "h": 24 }, "frame": { - "x": 407, - "y": 48, + "x": 70, + "y": 309, "w": 18, "h": 24 } }, - { - "filename": "relic_gold", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 9, - "y": 11, - "w": 15, - "h": 11 - }, - "frame": { - "x": 0, - "y": 412, - "w": 15, - "h": 11 - } - }, - { - "filename": "dragon_scale", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 24, - "h": 18 - }, - "frame": { - "x": 75, - "y": 50, - "w": 24, - "h": 18 - } - }, - { - "filename": "exp_balance", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 24, - "h": 22 - }, - "frame": { - "x": 99, - "y": 50, - "w": 24, - "h": 22 - } - }, - { - "filename": "berry_juice", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 24, - "h": 23 - }, - "spriteSourceSize": { - "x": 1, - "y": 1, - "w": 22, - "h": 21 - }, - "frame": { - "x": 53, - "y": 55, - "w": 22, - "h": 21 - } - }, - { - "filename": "exp_share", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 24, - "h": 22 - }, - "frame": { - "x": 75, - "y": 68, - "w": 24, - "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": 99, - "y": 72, - "w": 24, - "h": 20 - } - }, - { - "filename": "meadow_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 123, - "y": 59, - "w": 24, - "h": 24 - } - }, - { - "filename": "metal_powder", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 6, - "w": 24, - "h": 20 - }, - "frame": { - "x": 123, - "y": 83, - "w": 24, - "h": 20 - } - }, - { - "filename": "mind_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 147, - "y": 62, - "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": 147, - "y": 86, - "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": 171, - "y": 68, - "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": 195, - "y": 68, - "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": 219, - "y": 68, - "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": 243, - "y": 68, - "w": 24, - "h": 24 - } - }, - { - "filename": "scope_lens", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 24, - "h": 23 - }, - "frame": { - "x": 267, - "y": 69, - "w": 24, - "h": 23 - } - }, - { - "filename": "sky_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 291, - "y": 69, - "w": 24, - "h": 24 - } - }, - { - "filename": "splash_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 315, - "y": 69, - "w": 24, - "h": 24 - } - }, - { - "filename": "peat_block", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 24, - "h": 22 - }, - "frame": { - "x": 171, - "y": 92, - "w": 24, - "h": 22 - } - }, - { - "filename": "spooky_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 195, - "y": 92, - "w": 24, - "h": 24 - } - }, - { - "filename": "stone_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 219, - "y": 92, - "w": 24, - "h": 24 - } - }, - { - "filename": "sun_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 243, - "y": 92, - "w": 24, - "h": 24 - } - }, - { - "filename": "toxic_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 267, - "y": 92, - "w": 24, - "h": 24 - } - }, - { - "filename": "twisted_spoon", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 24, - "h": 23 - }, - "frame": { - "x": 291, - "y": 93, - "w": 24, - "h": 23 - } - }, - { - "filename": "zap_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 315, - "y": 93, - "w": 24, - "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": 339, - "y": 69, - "w": 16, - "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": 355, - "y": 68, - "w": 23, - "h": 24 - } - }, - { - "filename": "iron", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 339, - "y": 93, - "w": 16, - "h": 24 - } - }, - { - "filename": "berry_pouch", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 23, - "h": 23 - }, - "frame": { - "x": 355, - "y": 92, - "w": 23, - "h": 23 - } - }, { "filename": "max_elixir", "rotated": false, @@ -2376,138 +1746,12 @@ "h": 24 }, "frame": { - "x": 378, - "y": 68, + "x": 70, + "y": 333, "w": 18, "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": 378, - "y": 92, - "w": 22, - "h": 23 - } - }, - { - "filename": "quick_powder", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 6, - "w": 24, - "h": 20 - }, - "frame": { - "x": 396, - "y": 72, - "w": 24, - "h": 20 - } - }, - { - "filename": "bug_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 400, - "y": 92, - "w": 22, - "h": 23 - } - }, - { - "filename": "rusted_shield", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 6, - "w": 24, - "h": 20 - }, - "frame": { - "x": 355, - "y": 115, - "w": 24, - "h": 20 - } - }, - { - "filename": "sacred_ash", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 24, - "h": 20 - }, - "frame": { - "x": 379, - "y": 115, - "w": 24, - "h": 20 - } - }, - { - "filename": "max_revive", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 22, - "h": 24 - }, - "frame": { - "x": 403, - "y": 115, - "w": 22, - "h": 24 - } - }, { "filename": "max_ether", "rotated": false, @@ -2523,8 +1767,8 @@ "h": 24 }, "frame": { - "x": 39, - "y": 90, + "x": 70, + "y": 357, "w": 18, "h": 24 } @@ -2544,12 +1788,159 @@ "h": 24 }, "frame": { - "x": 39, - "y": 114, + "x": 70, + "y": 381, "w": 18, "h": 24 } }, + { + "filename": "amulet_coin", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 5, + "w": 23, + "h": 21 + }, + "frame": { + "x": 71, + "y": 405, + "w": 23, + "h": 21 + } + }, + { + "filename": "eviolite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 15, + "h": 15 + }, + "frame": { + "x": 59, + "y": 40, + "w": 15, + "h": 15 + } + }, + { + "filename": "mind_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 74, + "y": 26, + "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": 98, + "y": 26, + "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": 76, + "y": 50, + "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": 100, + "y": 50, + "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": 78, + "y": 74, + "w": 24, + "h": 24 + } + }, { "filename": "oval_charm", "rotated": false, @@ -2565,14 +1956,14 @@ "h": 24 }, "frame": { - "x": 39, - "y": 138, + "x": 102, + "y": 74, "w": 21, "h": 24 } }, { - "filename": "shiny_charm", + "filename": "scanner", "rotated": false, "trimmed": true, "sourceSize": { @@ -2580,57 +1971,15 @@ "h": 32 }, "spriteSourceSize": { - "x": 6, + "x": 4, "y": 4, - "w": 21, + "w": 24, "h": 24 }, "frame": { - "x": 39, - "y": 162, - "w": 21, - "h": 24 - } - }, - { - "filename": "dark_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 39, - "y": 186, - "w": 22, - "h": 23 - } - }, - { - "filename": "max_lure", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 17, - "h": 24 - }, - "frame": { - "x": 44, - "y": 209, - "w": 17, + "x": 79, + "y": 98, + "w": 24, "h": 24 } }, @@ -2649,14 +1998,35 @@ "h": 24 }, "frame": { - "x": 44, - "y": 233, + "x": 103, + "y": 98, "w": 20, "h": 24 } }, { - "filename": "sachet", + "filename": "silk_scarf", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 84, + "y": 122, + "w": 24, + "h": 24 + } + }, + { + "filename": "shiny_charm", "rotated": false, "trimmed": true, "sourceSize": { @@ -2666,18 +2036,18 @@ "spriteSourceSize": { "x": 6, "y": 4, - "w": 18, - "h": 23 + "w": 21, + "h": 24 }, "frame": { - "x": 57, - "y": 76, - "w": 18, - "h": 23 + "x": 87, + "y": 146, + "w": 21, + "h": 24 } }, { - "filename": "dragon_fang", + "filename": "sky_plate", "rotated": false, "trimmed": true, "sourceSize": { @@ -2685,20 +2055,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 21, - "h": 23 + "x": 4, + "y": 4, + "w": 24, + "h": 24 }, "frame": { - "x": 57, - "y": 99, - "w": 21, - "h": 23 + "x": 87, + "y": 170, + "w": 24, + "h": 24 } }, { - "filename": "mega_bracelet", + "filename": "splash_plate", "rotated": false, "trimmed": true, "sourceSize": { @@ -2706,20 +2076,83 @@ "h": 32 }, "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 16 + "x": 4, + "y": 4, + "w": 24, + "h": 24 }, "frame": { - "x": 57, + "x": 90, + "y": 194, + "w": 24, + "h": 24 + } + }, + { + "filename": "spooky_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 92, + "y": 218, + "w": 24, + "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": 108, "y": 122, - "w": 20, - "h": 16 + "w": 16, + "h": 24 } }, { - "filename": "super_lure", + "filename": "iron", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 108, + "y": 146, + "w": 16, + "h": 24 + } + }, + { + "filename": "lure", "rotated": false, "trimmed": true, "sourceSize": { @@ -2733,8 +2166,29 @@ "h": 24 }, "frame": { - "x": 60, - "y": 138, + "x": 111, + "y": 170, + "w": 17, + "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": 114, + "y": 194, "w": 17, "h": 24 } @@ -2754,12 +2208,369 @@ "h": 24 }, "frame": { - "x": 60, - "y": 162, + "x": 116, + "y": 218, "w": 16, "h": 24 } }, + { + "filename": "revive", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 10, + "y": 8, + "w": 12, + "h": 17 + }, + "frame": { + "x": 122, + "y": 26, + "w": 12, + "h": 17 + } + }, + { + "filename": "coin_case", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 24, + "h": 23 + }, + "frame": { + "x": 92, + "y": 242, + "w": 24, + "h": 23 + } + }, + { + "filename": "metal_powder", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 24, + "h": 20 + }, + "frame": { + "x": 87, + "y": 265, + "w": 24, + "h": 20 + } + }, + { + "filename": "stone_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 88, + "y": 285, + "w": 24, + "h": 24 + } + }, + { + "filename": "sun_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 88, + "y": 309, + "w": 24, + "h": 24 + } + }, + { + "filename": "toxic_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 88, + "y": 333, + "w": 24, + "h": 24 + } + }, + { + "filename": "zap_plate", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 88, + "y": 357, + "w": 24, + "h": 24 + } + }, + { + "filename": "expert_belt", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 23 + }, + "frame": { + "x": 88, + "y": 381, + "w": 24, + "h": 23 + } + }, + { + "filename": "exp_balance", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 24, + "h": 22 + }, + "frame": { + "x": 94, + "y": 404, + "w": 24, + "h": 22 + } + }, + { + "filename": "black_belt", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 116, + "y": 242, + "w": 22, + "h": 23 + } + }, + { + "filename": "quick_powder", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 24, + "h": 20 + }, + "frame": { + "x": 111, + "y": 265, + "w": 24, + "h": 20 + } + }, + { + "filename": "dynamax_band", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 23, + "h": 23 + }, + "frame": { + "x": 112, + "y": 285, + "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": 112, + "y": 308, + "w": 23, + "h": 23 + } + }, + { + "filename": "hearthflame_mask", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 23 + }, + "frame": { + "x": 112, + "y": 331, + "w": 24, + "h": 23 + } + }, + { + "filename": "leppa_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 24, + "h": 23 + }, + "frame": { + "x": 112, + "y": 354, + "w": 24, + "h": 23 + } + }, + { + "filename": "scope_lens", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 24, + "h": 23 + }, + "frame": { + "x": 112, + "y": 377, + "w": 24, + "h": 23 + } + }, + { + "filename": "bug_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 118, + "y": 400, + "w": 22, + "h": 23 + } + }, { "filename": "pp_max", "rotated": false, @@ -2775,8 +2586,50 @@ "h": 24 }, "frame": { - "x": 61, - "y": 186, + "x": 123, + "y": 43, + "w": 16, + "h": 24 + } + }, + { + "filename": "dark_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 139, + "y": 40, + "w": 22, + "h": 23 + } + }, + { + "filename": "pp_up", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 123, + "y": 67, "w": 16, "h": 24 } @@ -2796,14 +2649,14 @@ "h": 23 }, "frame": { - "x": 61, - "y": 210, + "x": 139, + "y": 63, "w": 22, "h": 23 } }, { - "filename": "dynamax_band", + "filename": "protein", "rotated": false, "trimmed": true, "sourceSize": { @@ -2811,16 +2664,16 @@ "h": 32 }, "spriteSourceSize": { - "x": 4, + "x": 8, "y": 4, - "w": 23, - "h": 23 + "w": 16, + "h": 24 }, "frame": { - "x": 64, - "y": 233, - "w": 23, - "h": 23 + "x": 123, + "y": 91, + "w": 16, + "h": 24 } }, { @@ -2838,12 +2691,75 @@ "h": 23 }, "frame": { - "x": 45, - "y": 257, + "x": 139, + "y": 86, "w": 22, "h": 23 } }, + { + "filename": "repel", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 124, + "y": 115, + "w": 16, + "h": 24 + } + }, + { + "filename": "super_lure", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 17, + "h": 24 + }, + "frame": { + "x": 124, + "y": 139, + "w": 17, + "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": 140, + "y": 109, + "w": 21, + "h": 23 + } + }, { "filename": "fairy_tera_shard", "rotated": false, @@ -2859,12 +2775,54 @@ "h": 23 }, "frame": { - "x": 67, - "y": 256, + "x": 141, + "y": 132, "w": 22, "h": 23 } }, + { + "filename": "auspicious_armor", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 23, + "h": 21 + }, + "frame": { + "x": 141, + "y": 155, + "w": 23, + "h": 21 + } + }, + { + "filename": "dragon_scale", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 24, + "h": 18 + }, + "frame": { + "x": 128, + "y": 176, + "w": 24, + "h": 18 + } + }, { "filename": "fighting_tera_shard", "rotated": false, @@ -2880,8 +2838,8 @@ "h": 23 }, "frame": { - "x": 46, - "y": 280, + "x": 131, + "y": 194, "w": 22, "h": 23 } @@ -2901,12 +2859,54 @@ "h": 23 }, "frame": { - "x": 46, - "y": 303, + "x": 132, + "y": 217, "w": 22, "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": 138, + "y": 240, + "w": 16, + "h": 24 + } + }, + { + "filename": "baton", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 7, + "w": 18, + "h": 18 + }, + "frame": { + "x": 152, + "y": 176, + "w": 18, + "h": 18 + } + }, { "filename": "fire_tera_shard", "rotated": false, @@ -2922,8 +2922,8 @@ "h": 23 }, "frame": { - "x": 46, - "y": 326, + "x": 153, + "y": 194, "w": 22, "h": 23 } @@ -2943,8 +2943,8 @@ "h": 23 }, "frame": { - "x": 46, - "y": 349, + "x": 154, + "y": 217, "w": 22, "h": 23 } @@ -2964,12 +2964,75 @@ "h": 23 }, "frame": { - "x": 46, - "y": 372, + "x": 154, + "y": 240, "w": 22, "h": 23 } }, + { + "filename": "unknown", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 4, + "w": 16, + "h": 24 + }, + "frame": { + "x": 135, + "y": 265, + "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": 135, + "y": 289, + "w": 16, + "h": 24 + } + }, + { + "filename": "candy", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 11, + "w": 18, + "h": 18 + }, + "frame": { + "x": 135, + "y": 313, + "w": 18, + "h": 18 + } + }, { "filename": "ghost_tera_shard", "rotated": false, @@ -2985,8 +3048,8 @@ "h": 23 }, "frame": { - "x": 68, - "y": 279, + "x": 136, + "y": 331, "w": 22, "h": 23 } @@ -3006,264 +3069,12 @@ "h": 23 }, "frame": { - "x": 68, - "y": 302, + "x": 136, + "y": 354, "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": 68, - "y": 325, - "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": 68, - "y": 348, - "w": 23, - "h": 23 - } - }, - { - "filename": "rare_candy", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 23, - "h": 23 - }, - "frame": { - "x": 68, - "y": 371, - "w": 23, - "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": 78, - "y": 90, - "w": 21, - "h": 23 - } - }, - { - "filename": "shadow_reins_of_unity", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 24, - "h": 20 - }, - "frame": { - "x": 99, - "y": 92, - "w": 24, - "h": 20 - } - }, - { - "filename": "silver_powder", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 11, - "w": 24, - "h": 15 - }, - "frame": { - "x": 123, - "y": 103, - "w": 24, - "h": 15 - } - }, - { - "filename": "soft_sand", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 24, - "h": 20 - }, - "frame": { - "x": 147, - "y": 110, - "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": 171, - "y": 114, - "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": 194, - "y": 116, - "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": 217, - "y": 116, - "w": 23, - "h": 21 - } - }, - { - "filename": "healing_charm", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 23, - "h": 22 - }, - "frame": { - "x": 240, - "y": 116, - "w": 23, - "h": 22 - } - }, - { - "filename": "rarer_candy", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 23, - "h": 23 - }, - "frame": { - "x": 263, - "y": 116, - "w": 23, - "h": 23 - } - }, { "filename": "ground_tera_shard", "rotated": false, @@ -3279,54 +3090,12 @@ "h": 23 }, "frame": { - "x": 286, - "y": 116, + "x": 136, + "y": 377, "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": 308, - "y": 117, - "w": 23, - "h": 22 - } - }, - { - "filename": "blank_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 331, - "y": 117, - "w": 22, - "h": 22 - } - }, { "filename": "ice_tera_shard", "rotated": false, @@ -3342,14 +3111,182 @@ "h": 23 }, "frame": { - "x": 68, - "y": 394, + "x": 140, + "y": 400, "w": 22, "h": 23 } }, { - "filename": "binding_band", + "filename": "exp_share", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 24, + "h": 22 + }, + "frame": { + "x": 330, + "y": 20, + "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": 354, + "y": 20, + "w": 24, + "h": 22 + } + }, + { + "filename": "twisted_spoon", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 24, + "h": 23 + }, + "frame": { + "x": 378, + "y": 20, + "w": 24, + "h": 23 + } + }, + { + "filename": "rusted_shield", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 24, + "h": 20 + }, + "frame": { + "x": 402, + "y": 22, + "w": 24, + "h": 20 + } + }, + { + "filename": "sacred_ash", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 24, + "h": 20 + }, + "frame": { + "x": 402, + "y": 42, + "w": 24, + "h": 20 + } + }, + { + "filename": "full_heal", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 9, + "y": 4, + "w": 15, + "h": 23 + }, + "frame": { + "x": 151, + "y": 264, + "w": 15, + "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": 151, + "y": 287, + "w": 17, + "h": 23 + } + }, + { + "filename": "berry_juice", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 24, + "h": 23 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 22, + "h": 21 + }, + "frame": { + "x": 153, + "y": 310, + "w": 22, + "h": 21 + } + }, + { + "filename": "lansat_berry", "rotated": false, "trimmed": true, "sourceSize": { @@ -3358,19 +3295,19 @@ }, "spriteSourceSize": { "x": 5, - "y": 6, - "w": 23, - "h": 20 + "y": 4, + "w": 21, + "h": 23 }, "frame": { - "x": 78, - "y": 113, - "w": 23, - "h": 20 + "x": 158, + "y": 331, + "w": 21, + "h": 23 } }, { - "filename": "bug_memory", + "filename": "leaf_stone", "rotated": false, "trimmed": true, "sourceSize": { @@ -3380,14 +3317,56 @@ "spriteSourceSize": { "x": 5, "y": 5, - "w": 22, - "h": 22 + "w": 21, + "h": 23 }, "frame": { - "x": 101, - "y": 112, - "w": 22, - "h": 22 + "x": 158, + "y": 354, + "w": 21, + "h": 23 + } + }, + { + "filename": "leek", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 23, + "h": 23 + }, + "frame": { + "x": 158, + "y": 377, + "w": 23, + "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": 162, + "y": 400, + "w": 20, + "h": 23 } }, { @@ -3405,138 +3384,12 @@ "h": 23 }, "frame": { - "x": 77, - "y": 133, + "x": 166, + "y": 263, "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": 99, - "y": 134, - "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": 123, - "y": 118, - "w": 23, - "h": 17 - } - }, - { - "filename": "moon_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 6, - "w": 23, - "h": 21 - }, - "frame": { - "x": 121, - "y": 135, - "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": 77, - "y": 156, - "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": 100, - "y": 156, - "w": 23, - "h": 17 - } - }, - { - "filename": "black_sludge", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 24, - "h": 24 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 22, - "h": 19 - }, - "frame": { - "x": 123, - "y": 156, - "w": 22, - "h": 19 - } - }, { "filename": "normal_tera_shard", "rotated": false, @@ -3552,12 +3405,33 @@ "h": 23 }, "frame": { - "x": 77, - "y": 173, + "x": 168, + "y": 286, "w": 22, "h": 23 } }, + { + "filename": "berry_pot", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 5, + "w": 18, + "h": 22 + }, + "frame": { + "x": 175, + "y": 309, + "w": 18, + "h": 22 + } + }, { "filename": "petaya_berry", "rotated": false, @@ -3573,33 +3447,12 @@ "h": 23 }, "frame": { - "x": 99, - "y": 173, + "x": 179, + "y": 331, "w": 22, "h": 23 } }, - { - "filename": "n_lunarizer", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 6, - "w": 23, - "h": 21 - }, - "frame": { - "x": 121, - "y": 175, - "w": 23, - "h": 21 - } - }, { "filename": "poison_tera_shard", "rotated": false, @@ -3615,8 +3468,8 @@ "h": 23 }, "frame": { - "x": 83, - "y": 196, + "x": 179, + "y": 354, "w": 22, "h": 23 } @@ -3636,14 +3489,14 @@ "h": 23 }, "frame": { - "x": 105, - "y": 196, + "x": 181, + "y": 377, "w": 22, "h": 23 } }, { - "filename": "hyper_potion", + "filename": "rare_candy", "rotated": false, "trimmed": true, "sourceSize": { @@ -3651,18 +3504,81 @@ "h": 32 }, "spriteSourceSize": { - "x": 8, + "x": 4, "y": 5, - "w": 17, + "w": 23, "h": 23 }, "frame": { - "x": 127, - "y": 196, - "w": 17, + "x": 182, + "y": 400, + "w": 23, "h": 23 } }, + { + "filename": "shadow_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": "rarer_candy", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 23, + "h": 23 + }, + "frame": { + "x": 161, + "y": 41, + "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": 161, + "y": 64, + "w": 23, + "h": 22 + } + }, { "filename": "reaper_cloth", "rotated": false, @@ -3678,8 +3594,8 @@ "h": 23 }, "frame": { - "x": 87, - "y": 219, + "x": 161, + "y": 86, "w": 22, "h": 23 } @@ -3699,14 +3615,14 @@ "h": 23 }, "frame": { - "x": 109, - "y": 219, + "x": 161, + "y": 109, "w": 22, "h": 23 } }, { - "filename": "full_heal", + "filename": "sharp_beak", "rotated": false, "trimmed": true, "sourceSize": { @@ -3714,18 +3630,81 @@ "h": 32 }, "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 15, + "x": 5, + "y": 5, + "w": 21, "h": 23 }, "frame": { - "x": 131, - "y": 219, - "w": 15, + "x": 163, + "y": 132, + "w": 21, "h": 23 } }, + { + "filename": "dawn_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 21 + }, + "frame": { + "x": 164, + "y": 155, + "w": 20, + "h": 21 + } + }, + { + "filename": "soft_sand", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 24, + "h": 20 + }, + "frame": { + "x": 186, + "y": 21, + "w": 24, + "h": 20 + } + }, + { + "filename": "rusted_sword", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 23, + "h": 22 + }, + "frame": { + "x": 184, + "y": 41, + "w": 23, + "h": 22 + } + }, { "filename": "steel_tera_shard", "rotated": false, @@ -3741,8 +3720,8 @@ "h": 23 }, "frame": { - "x": 89, - "y": 242, + "x": 184, + "y": 63, "w": 22, "h": 23 } @@ -3762,33 +3741,12 @@ "h": 23 }, "frame": { - "x": 111, - "y": 242, + "x": 183, + "y": 86, "w": 22, "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": 133, - "y": 242, - "w": 21, - "h": 23 - } - }, { "filename": "water_tera_shard", "rotated": false, @@ -3804,159 +3762,12 @@ "h": 23 }, "frame": { - "x": 90, - "y": 265, + "x": 183, + "y": 109, "w": 22, "h": 23 } }, - { - "filename": "wide_lens", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 90, - "y": 288, - "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": 112, - "y": 265, - "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": 112, - "y": 287, - "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": 134, - "y": 265, - "w": 20, - "h": 23 - } - }, - { - "filename": "dawn_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 21 - }, - "frame": { - "x": 134, - "y": 288, - "w": 20, - "h": 21 - } - }, - { - "filename": "sharp_beak", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 21, - "h": 23 - }, - "frame": { - "x": 91, - "y": 311, - "w": 21, - "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": 112, - "y": 309, - "w": 22, - "h": 22 - } - }, { "filename": "whipped_dream", "rotated": false, @@ -3972,140 +3783,14 @@ "h": 23 }, "frame": { - "x": 91, - "y": 334, + "x": 184, + "y": 132, "w": 21, "h": 23 } }, { - "filename": "dragon_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 112, - "y": 331, - "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": 91, - "y": 357, - "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": 134, - "y": 309, - "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": 134, - "y": 331, - "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": 113, - "y": 353, - "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": 135, - "y": 353, - "w": 22, - "h": 22 - } - }, - { - "filename": "blunder_policy", + "filename": "binding_band", "rotated": false, "trimmed": true, "sourceSize": { @@ -4115,18 +3800,18 @@ "spriteSourceSize": { "x": 5, "y": 6, - "w": 22, - "h": 19 + "w": 23, + "h": 20 }, "frame": { - "x": 91, - "y": 379, - "w": 22, - "h": 19 + "x": 210, + "y": 21, + "w": 23, + "h": 20 } }, { - "filename": "fire_memory", + "filename": "blank_memory", "rotated": false, "trimmed": true, "sourceSize": { @@ -4140,14 +3825,35 @@ "h": 22 }, "frame": { - "x": 113, - "y": 375, + "x": 207, + "y": 41, "w": 22, "h": 22 } }, { - "filename": "flying_memory", + "filename": "wide_lens", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 206, + "y": 63, + "w": 22, + "h": 23 + } + }, + { + "filename": "bug_memory", "rotated": false, "trimmed": true, "sourceSize": { @@ -4161,14 +3867,56 @@ "h": 22 }, "frame": { - "x": 135, - "y": 375, + "x": 205, + "y": 86, "w": 22, "h": 22 } }, { - "filename": "mystic_ticket", + "filename": "charcoal", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 205, + "y": 108, + "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": 205, + "y": 130, + "w": 22, + "h": 22 + } + }, + { + "filename": "moon_stone", "rotated": false, "trimmed": true, "sourceSize": { @@ -4177,15 +3925,36 @@ }, "spriteSourceSize": { "x": 4, - "y": 7, + "y": 6, "w": 23, - "h": 19 + "h": 21 }, "frame": { - "x": 90, - "y": 398, + "x": 233, + "y": 21, "w": 23, - "h": 19 + "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": 256, + "y": 21, + "w": 23, + "h": 21 } }, { @@ -4203,8 +3972,29 @@ "h": 21 }, "frame": { - "x": 113, - "y": 397, + "x": 279, + "y": 21, + "w": 23, + "h": 21 + } + }, + { + "filename": "wellspring_mask", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 23, + "h": 21 + }, + "frame": { + "x": 302, + "y": 21, "w": 23, "h": 21 } @@ -4224,75 +4014,12 @@ "h": 21 }, "frame": { - "x": 136, - "y": 397, + "x": 184, + "y": 155, "w": 22, "h": 21 } }, - { - "filename": "douse_drive", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 23, - "h": 17 - }, - "frame": { - "x": 146, - "y": 130, - "w": 23, - "h": 17 - } - }, - { - "filename": "ganlon_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 145, - "y": 147, - "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": 169, - "y": 135, - "w": 23, - "h": 19 - } - }, { "filename": "relic_crown", "rotated": false, @@ -4308,14 +4035,35 @@ "h": 18 }, "frame": { - "x": 192, - "y": 137, + "x": 170, + "y": 176, "w": 23, "h": 18 } }, { - "filename": "reviver_seed", + "filename": "sachet", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 18, + "h": 23 + }, + "frame": { + "x": 175, + "y": 194, + "w": 18, + "h": 23 + } + }, + { + "filename": "dire_hit", "rotated": false, "trimmed": true, "sourceSize": { @@ -4324,57 +4072,267 @@ }, "spriteSourceSize": { "x": 5, - "y": 8, - "w": 23, - "h": 20 - }, - "frame": { - "x": 215, - "y": 137, - "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": 238, - "y": 138, - "w": 23, - "h": 20 - } - }, - { - "filename": "wellspring_mask", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, "y": 5, - "w": 23, - "h": 21 + "w": 22, + "h": 22 }, "frame": { - "x": 261, - "y": 139, - "w": 23, - "h": 21 + "x": 206, + "y": 152, + "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": 176, + "y": 217, + "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": 176, + "y": 240, + "w": 17, + "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": 229, + "y": 42, + "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": 251, + "y": 42, + "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": 273, + "y": 42, + "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": 295, + "y": 42, + "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": 228, + "y": 64, + "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": 227, + "y": 86, + "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": 250, + "y": 64, + "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": 227, + "y": 108, + "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": 227, + "y": 130, + "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": 249, + "y": 86, + "w": 22, + "h": 22 } }, { @@ -4392,8 +4350,8 @@ "h": 22 }, "frame": { - "x": 284, - "y": 139, + "x": 272, + "y": 64, "w": 22, "h": 22 } @@ -4413,8 +4371,8 @@ "h": 22 }, "frame": { - "x": 306, - "y": 139, + "x": 249, + "y": 108, "w": 22, "h": 22 } @@ -4434,117 +4392,12 @@ "h": 22 }, "frame": { - "x": 328, - "y": 139, + "x": 271, + "y": 86, "w": 22, "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": 167, - "y": 154, - "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": 190, - "y": 155, - "w": 23, - "h": 17 - } - }, - { - "filename": "deep_sea_scale", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 20 - }, - "frame": { - "x": 213, - "y": 157, - "w": 22, - "h": 20 - } - }, - { - "filename": "dubious_disc", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 22, - "h": 19 - }, - "frame": { - "x": 235, - "y": 158, - "w": 22, - "h": 19 - } - }, - { - "filename": "fairy_feather", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 22, - "h": 20 - }, - "frame": { - "x": 257, - "y": 160, - "w": 22, - "h": 20 - } - }, { "filename": "guard_spec", "rotated": false, @@ -4560,8 +4413,8 @@ "h": 22 }, "frame": { - "x": 279, - "y": 161, + "x": 294, + "y": 64, "w": 22, "h": 22 } @@ -4581,8 +4434,8 @@ "h": 22 }, "frame": { - "x": 301, - "y": 161, + "x": 249, + "y": 130, "w": 22, "h": 22 } @@ -4602,33 +4455,12 @@ "h": 22 }, "frame": { - "x": 323, - "y": 161, + "x": 228, + "y": 152, "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": 145, - "y": 169, - "w": 22, - "h": 21 - } - }, { "filename": "magmarizer", "rotated": false, @@ -4644,33 +4476,12 @@ "h": 22 }, "frame": { - "x": 144, - "y": 190, + "x": 271, + "y": 108, "w": 22, "h": 22 } }, - { - "filename": "malicious_armor", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 20 - }, - "frame": { - "x": 167, - "y": 171, - "w": 22, - "h": 20 - } - }, { "filename": "mini_black_hole", "rotated": false, @@ -4686,8 +4497,8 @@ "h": 22 }, "frame": { - "x": 166, - "y": 191, + "x": 293, + "y": 86, "w": 22, "h": 22 } @@ -4707,8 +4518,8 @@ "h": 22 }, "frame": { - "x": 189, - "y": 172, + "x": 271, + "y": 130, "w": 22, "h": 22 } @@ -4728,8 +4539,8 @@ "h": 22 }, "frame": { - "x": 188, - "y": 194, + "x": 250, + "y": 152, "w": 22, "h": 22 } @@ -4749,8 +4560,8 @@ "h": 22 }, "frame": { - "x": 211, - "y": 177, + "x": 293, + "y": 108, "w": 22, "h": 22 } @@ -4770,8 +4581,8 @@ "h": 22 }, "frame": { - "x": 233, - "y": 177, + "x": 293, + "y": 130, "w": 22, "h": 22 } @@ -4791,8 +4602,8 @@ "h": 22 }, "frame": { - "x": 255, - "y": 180, + "x": 272, + "y": 152, "w": 22, "h": 22 } @@ -4812,8 +4623,8 @@ "h": 22 }, "frame": { - "x": 277, - "y": 183, + "x": 294, + "y": 152, "w": 22, "h": 22 } @@ -4833,8 +4644,8 @@ "h": 22 }, "frame": { - "x": 299, - "y": 183, + "x": 317, + "y": 42, "w": 22, "h": 22 } @@ -4854,8 +4665,8 @@ "h": 22 }, "frame": { - "x": 321, - "y": 183, + "x": 316, + "y": 64, "w": 22, "h": 22 } @@ -4875,8 +4686,8 @@ "h": 22 }, "frame": { - "x": 210, - "y": 199, + "x": 315, + "y": 86, "w": 22, "h": 22 } @@ -4896,75 +4707,12 @@ "h": 22 }, "frame": { - "x": 232, - "y": 199, + "x": 339, + "y": 42, "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": 254, - "y": 202, - "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": 276, - "y": 205, - "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": 298, - "y": 205, - "w": 22, - "h": 21 - } - }, { "filename": "thunder_stone", "rotated": false, @@ -4980,33 +4728,12 @@ "h": 22 }, "frame": { - "x": 320, - "y": 205, + "x": 338, + "y": 64, "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": 146, - "y": 212, - "w": 20, - "h": 22 - } - }, { "filename": "tm_bug", "rotated": false, @@ -5022,33 +4749,12 @@ "h": 22 }, "frame": { - "x": 166, - "y": 213, + "x": 315, + "y": 108, "w": 22, "h": 22 } }, - { - "filename": "tera_orb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 20 - }, - "frame": { - "x": 188, - "y": 216, - "w": 22, - "h": 20 - } - }, { "filename": "tm_dark", "rotated": false, @@ -5064,8 +4770,8 @@ "h": 22 }, "frame": { - "x": 210, - "y": 221, + "x": 315, + "y": 130, "w": 22, "h": 22 } @@ -5085,8 +4791,8 @@ "h": 22 }, "frame": { - "x": 232, - "y": 221, + "x": 337, + "y": 86, "w": 22, "h": 22 } @@ -5106,8 +4812,8 @@ "h": 22 }, "frame": { - "x": 254, - "y": 223, + "x": 337, + "y": 108, "w": 22, "h": 22 } @@ -5127,8 +4833,8 @@ "h": 22 }, "frame": { - "x": 276, - "y": 226, + "x": 337, + "y": 130, "w": 22, "h": 22 } @@ -5148,8 +4854,8 @@ "h": 22 }, "frame": { - "x": 298, - "y": 226, + "x": 316, + "y": 152, "w": 22, "h": 22 } @@ -5169,14 +4875,14 @@ "h": 22 }, "frame": { - "x": 320, - "y": 227, + "x": 338, + "y": 152, "w": 22, "h": 22 } }, { - "filename": "berry_pot", + "filename": "metronome", "rotated": false, "trimmed": true, "sourceSize": { @@ -5186,18 +4892,18 @@ "spriteSourceSize": { "x": 7, "y": 5, - "w": 18, + "w": 17, "h": 22 }, "frame": { - "x": 345, - "y": 161, - "w": 18, + "x": 361, + "y": 42, + "w": 17, "h": 22 } }, { - "filename": "sitrus_berry", + "filename": "liechi_berry", "rotated": false, "trimmed": true, "sourceSize": { @@ -5205,16 +4911,16 @@ "h": 32 }, "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 20, - "h": 22 + "x": 5, + "y": 6, + "w": 22, + "h": 21 }, "frame": { - "x": 343, - "y": 183, - "w": 20, - "h": 22 + "x": 378, + "y": 43, + "w": 22, + "h": 21 } }, { @@ -5232,8 +4938,8 @@ "h": 22 }, "frame": { - "x": 342, - "y": 205, + "x": 360, + "y": 64, "w": 22, "h": 22 } @@ -5253,33 +4959,12 @@ "h": 22 }, "frame": { - "x": 342, - "y": 227, + "x": 359, + "y": 86, "w": 22, "h": 22 } }, - { - "filename": "leftovers", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 15, - "h": 22 - }, - "frame": { - "x": 350, - "y": 139, - "w": 15, - "h": 22 - } - }, { "filename": "tm_grass", "rotated": false, @@ -5295,33 +4980,12 @@ "h": 22 }, "frame": { - "x": 365, - "y": 135, + "x": 359, + "y": 108, "w": 22, "h": 22 } }, - { - "filename": "pp_up", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 387, - "y": 135, - "w": 16, - "h": 24 - } - }, { "filename": "tm_ground", "rotated": false, @@ -5337,8 +5001,8 @@ "h": 22 }, "frame": { - "x": 403, - "y": 139, + "x": 359, + "y": 130, "w": 22, "h": 22 } @@ -5358,12 +5022,33 @@ "h": 22 }, "frame": { - "x": 365, - "y": 157, + "x": 360, + "y": 152, "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": 382, + "y": 64, + "w": 20, + "h": 22 + } + }, { "filename": "tm_normal", "rotated": false, @@ -5379,8 +5064,8 @@ "h": 22 }, "frame": { - "x": 363, - "y": 179, + "x": 381, + "y": 86, "w": 22, "h": 22 } @@ -5400,8 +5085,8 @@ "h": 22 }, "frame": { - "x": 364, - "y": 201, + "x": 381, + "y": 108, "w": 22, "h": 22 } @@ -5421,14 +5106,161 @@ "h": 22 }, "frame": { - "x": 364, - "y": 223, + "x": 381, + "y": 130, "w": 22, "h": 22 } }, { - "filename": "protein", + "filename": "reviver_seed", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 8, + "w": 23, + "h": 20 + }, + "frame": { + "x": 403, + "y": 62, + "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": 403, + "y": 82, + "w": 23, + "h": 20 + } + }, + { + "filename": "coupon", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 23, + "h": 19 + }, + "frame": { + "x": 403, + "y": 102, + "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": 403, + "y": 121, + "w": 23, + "h": 19 + } + }, + { + "filename": "mystic_ticket", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 23, + "h": 19 + }, + "frame": { + "x": 403, + "y": 140, + "w": 23, + "h": 19 + } + }, + { + "filename": "dusk_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 21, + "h": 21 + }, + "frame": { + "x": 382, + "y": 152, + "w": 21, + "h": 21 + } + }, + { + "filename": "pair_of_tickets", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 23, + "h": 19 + }, + "frame": { + "x": 403, + "y": 159, + "w": 23, + "h": 19 + } + }, + { + "filename": "leftovers", "rotated": false, "trimmed": true, "sourceSize": { @@ -5437,15 +5269,15 @@ }, "spriteSourceSize": { "x": 8, - "y": 4, - "w": 16, - "h": 24 + "y": 5, + "w": 15, + "h": 22 }, "frame": { - "x": 387, - "y": 159, - "w": 16, - "h": 24 + "x": 193, + "y": 176, + "w": 15, + "h": 22 } }, { @@ -5463,180 +5295,12 @@ "h": 22 }, "frame": { - "x": 403, - "y": 161, + "x": 208, + "y": 174, "w": 22, "h": 22 } }, - { - "filename": "masterpiece_teacup", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 21, - "h": 18 - }, - "frame": { - "x": 385, - "y": 183, - "w": 21, - "h": 18 - } - }, - { - "filename": "metal_coat", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 19, - "h": 22 - }, - "frame": { - "x": 406, - "y": 183, - "w": 19, - "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": 386, - "y": 201, - "w": 20, - "h": 20 - } - }, - { - "filename": "quick_claw", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 19, - "h": 21 - }, - "frame": { - "x": 406, - "y": 205, - "w": 19, - "h": 21 - } - }, - { - "filename": "blue_orb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 386, - "y": 221, - "w": 20, - "h": 20 - } - }, - { - "filename": "spell_tag", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 19, - "h": 21 - }, - "frame": { - "x": 406, - "y": 226, - "w": 19, - "h": 21 - } - }, - { - "filename": "everstone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 17 - }, - "frame": { - "x": 386, - "y": 241, - "w": 20, - "h": 17 - } - }, - { - "filename": "apicot_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 19, - "h": 20 - }, - "frame": { - "x": 406, - "y": 247, - "w": 19, - "h": 20 - } - }, { "filename": "tm_steel", "rotated": false, @@ -5652,54 +5316,12 @@ "h": 22 }, "frame": { - "x": 364, - "y": 245, + "x": 230, + "y": 174, "w": 22, "h": 22 } }, - { - "filename": "gb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 386, - "y": 258, - "w": 20, - "h": 20 - } - }, - { - "filename": "candy_jar", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 19, - "h": 20 - }, - "frame": { - "x": 406, - "y": 267, - "w": 19, - "h": 20 - } - }, { "filename": "tm_water", "rotated": false, @@ -5715,8 +5337,8 @@ "h": 22 }, "frame": { - "x": 154, - "y": 235, + "x": 252, + "y": 174, "w": 22, "h": 22 } @@ -5736,8 +5358,8 @@ "h": 22 }, "frame": { - "x": 154, - "y": 257, + "x": 274, + "y": 174, "w": 22, "h": 22 } @@ -5757,8 +5379,8 @@ "h": 22 }, "frame": { - "x": 154, - "y": 279, + "x": 296, + "y": 174, "w": 22, "h": 22 } @@ -5778,8 +5400,8 @@ "h": 22 }, "frame": { - "x": 156, - "y": 301, + "x": 318, + "y": 174, "w": 22, "h": 22 } @@ -5799,12 +5421,96 @@ "h": 22 }, "frame": { - "x": 156, - "y": 323, + "x": 340, + "y": 174, "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": 362, + "y": 174, + "w": 20, + "h": 22 + } + }, + { + "filename": "poison_barb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 21, + "h": 21 + }, + "frame": { + "x": 382, + "y": 173, + "w": 21, + "h": 21 + } + }, + { + "filename": "black_glasses", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 23, + "h": 17 + }, + "frame": { + "x": 403, + "y": 178, + "w": 23, + "h": 17 + } + }, + { + "filename": "metal_coat", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 5, + "w": 19, + "h": 22 + }, + "frame": { + "x": 193, + "y": 198, + "w": 19, + "h": 22 + } + }, { "filename": "x_defense", "rotated": false, @@ -5820,8 +5526,8 @@ "h": 22 }, "frame": { - "x": 157, - "y": 345, + "x": 212, + "y": 196, "w": 22, "h": 22 } @@ -5841,8 +5547,8 @@ "h": 22 }, "frame": { - "x": 157, - "y": 367, + "x": 234, + "y": 196, "w": 22, "h": 22 } @@ -5862,8 +5568,8 @@ "h": 22 }, "frame": { - "x": 158, - "y": 389, + "x": 256, + "y": 196, "w": 22, "h": 22 } @@ -5883,35 +5589,14 @@ "h": 22 }, "frame": { - "x": 176, - "y": 236, + "x": 278, + "y": 196, "w": 22, "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": 176, - "y": 258, - "w": 21, - "h": 21 - } - }, - { - "filename": "poison_barb", + "filename": "sweet_apple", "rotated": false, "trimmed": true, "sourceSize": { @@ -5921,18 +5606,18 @@ "spriteSourceSize": { "x": 5, "y": 6, - "w": 21, + "w": 22, "h": 21 }, "frame": { - "x": 176, - "y": 279, - "w": 21, + "x": 300, + "y": 196, + "w": 22, "h": 21 } }, { - "filename": "potion", + "filename": "syrupy_apple", "rotated": false, "trimmed": true, "sourceSize": { @@ -5940,83 +5625,83 @@ "h": 32 }, "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 17, - "h": 23 - }, - "frame": { - "x": 178, - "y": 300, - "w": 17, - "h": 23 - } - }, - { - "filename": "metronome", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 17, - "h": 22 - }, - "frame": { - "x": 178, - "y": 323, - "w": 17, - "h": 22 - } - }, - { - "filename": "repel", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 179, - "y": 345, - "w": 16, - "h": 24 - } - }, - { - "filename": "golden_egg", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, + "x": 5, "y": 6, - "w": 17, + "w": 22, + "h": 21 + }, + "frame": { + "x": 322, + "y": 196, + "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": 344, + "y": 196, + "w": 22, + "h": 21 + } + }, + { + "filename": "quick_claw", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 19, + "h": 21 + }, + "frame": { + "x": 193, + "y": 220, + "w": 19, + "h": 21 + } + }, + { + "filename": "deep_sea_scale", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, "h": 20 }, "frame": { - "x": 179, - "y": 369, - "w": 17, + "x": 212, + "y": 218, + "w": 22, "h": 20 } }, { - "filename": "soothe_bell", + "filename": "fairy_feather", "rotated": false, "trimmed": true, "sourceSize": { @@ -6024,20 +5709,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 17, - "h": 22 + "x": 5, + "y": 7, + "w": 22, + "h": 20 }, "frame": { - "x": 180, - "y": 389, - "w": 17, - "h": 22 + "x": 234, + "y": 218, + "w": 22, + "h": 20 } }, { - "filename": "super_repel", + "filename": "malicious_armor", "rotated": false, "trimmed": true, "sourceSize": { @@ -6045,20 +5730,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 + "x": 5, + "y": 6, + "w": 22, + "h": 20 }, "frame": { - "x": 195, - "y": 300, - "w": 16, - "h": 24 + "x": 256, + "y": 218, + "w": 22, + "h": 20 } }, { - "filename": "unknown", + "filename": "tera_orb", "rotated": false, "trimmed": true, "sourceSize": { @@ -6066,16 +5751,16 @@ "h": 32 }, "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 + "x": 5, + "y": 6, + "w": 22, + "h": 20 }, "frame": { - "x": 195, - "y": 324, - "w": 16, - "h": 24 + "x": 278, + "y": 218, + "w": 22, + "h": 20 } }, { @@ -6093,33 +5778,12 @@ "h": 21 }, "frame": { - "x": 195, - "y": 348, + "x": 300, + "y": 217, "w": 21, "h": 21 } }, - { - "filename": "magnet", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 196, - "y": 369, - "w": 20, - "h": 20 - } - }, { "filename": "zoom_lens", "rotated": false, @@ -6135,35 +5799,35 @@ "h": 21 }, "frame": { - "x": 197, - "y": 389, + "x": 321, + "y": 217, "w": 21, "h": 21 } }, { - "filename": "candy_overlay", + "filename": "black_sludge", "rotated": false, "trimmed": true, "sourceSize": { - "w": 32, - "h": 32 + "w": 24, + "h": 24 }, "spriteSourceSize": { - "x": 8, - "y": 12, - "w": 16, - "h": 15 + "x": 1, + "y": 2, + "w": 22, + "h": 19 }, "frame": { - "x": 197, - "y": 410, - "w": 16, - "h": 15 + "x": 342, + "y": 217, + "w": 22, + "h": 19 } }, { - "filename": "eviolite", + "filename": "spell_tag", "rotated": false, "trimmed": true, "sourceSize": { @@ -6171,16 +5835,58 @@ "h": 32 }, "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 15, - "h": 15 + "x": 7, + "y": 6, + "w": 19, + "h": 21 }, "frame": { - "x": 213, - "y": 410, - "w": 15, - "h": 15 + "x": 193, + "y": 241, + "w": 19, + "h": 21 + } + }, + { + "filename": "blunder_policy", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 19 + }, + "frame": { + "x": 212, + "y": 238, + "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": 234, + "y": 238, + "w": 22, + "h": 19 } }, { @@ -6198,12 +5904,243 @@ "h": 19 }, "frame": { - "x": 198, - "y": 243, + "x": 256, + "y": 238, "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": 278, + "y": 238, + "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": 301, + "y": 238, + "w": 23, + "h": 17 + } + }, + { + "filename": "soothe_bell", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 17, + "h": 22 + }, + "frame": { + "x": 366, + "y": 196, + "w": 17, + "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": 383, + "y": 194, + "w": 20, + "h": 20 + } + }, + { + "filename": "douse_drive", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 23, + "h": 17 + }, + "frame": { + "x": 403, + "y": 195, + "w": 23, + "h": 17 + } + }, + { + "filename": "shock_drive", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 23, + "h": 17 + }, + "frame": { + "x": 403, + "y": 212, + "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": 383, + "y": 214, + "w": 20, + "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": 364, + "y": 218, + "w": 19, + "h": 20 + } + }, + { + "filename": "wise_glasses", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 23, + "h": 17 + }, + "frame": { + "x": 403, + "y": 229, + "w": 23, + "h": 17 + } + }, + { + "filename": "everstone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 17 + }, + "frame": { + "x": 383, + "y": 234, + "w": 20, + "h": 17 + } + }, + { + "filename": "big_mushroom", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 19, + "h": 19 + }, + "frame": { + "x": 324, + "y": 238, + "w": 19, + "h": 19 + } + }, { "filename": "metal_alloy", "rotated": false, @@ -6219,14 +6156,35 @@ "h": 19 }, "frame": { - "x": 220, - "y": 243, + "x": 343, + "y": 236, "w": 21, "h": 19 } }, { - "filename": "mb", + "filename": "candy_jar", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 19, + "h": 20 + }, + "frame": { + "x": 364, + "y": 238, + "w": 19, + "h": 20 + } + }, + { + "filename": "gb", "rotated": false, "trimmed": true, "sourceSize": { @@ -6240,12 +6198,75 @@ "h": 20 }, "frame": { - "x": 197, - "y": 262, + "x": 383, + "y": 251, "w": 20, "h": 20 } }, + { + "filename": "magnet", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 403, + "y": 246, + "w": 20, + "h": 20 + } + }, + { + "filename": "masterpiece_teacup", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 21, + "h": 18 + }, + "frame": { + "x": 212, + "y": 257, + "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": 233, + "y": 257, + "w": 21, + "h": 18 + } + }, { "filename": "sharp_meteorite", "rotated": false, @@ -6261,138 +6282,12 @@ "h": 18 }, "frame": { - "x": 197, - "y": 282, + "x": 254, + "y": 257, "w": 21, "h": 18 } }, - { - "filename": "pb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 217, - "y": 262, - "w": 20, - "h": 20 - } - }, - { - "filename": "big_mushroom", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 19, - "h": 19 - }, - "frame": { - "x": 218, - "y": 282, - "w": 19, - "h": 19 - } - }, - { - "filename": "pb_gold", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 211, - "y": 301, - "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": 211, - "y": 321, - "w": 20, - "h": 20 - } - }, - { - "filename": "zinc", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 216, - "y": 341, - "w": 16, - "h": 24 - } - }, - { - "filename": "super_potion", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 17, - "h": 23 - }, - "frame": { - "x": 216, - "y": 365, - "w": 17, - "h": 23 - } - }, { "filename": "hard_stone", "rotated": false, @@ -6408,14 +6303,35 @@ "h": 20 }, "frame": { - "x": 218, - "y": 388, + "x": 193, + "y": 262, "w": 19, "h": 20 } }, { - "filename": "lucky_egg", + "filename": "mb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 190, + "y": 282, + "w": 20, + "h": 20 + } + }, + { + "filename": "golden_egg", "rotated": false, "trimmed": true, "sourceSize": { @@ -6429,117 +6345,12 @@ "h": 20 }, "frame": { - "x": 231, - "y": 301, + "x": 193, + "y": 302, "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": 231, - "y": 321, - "w": 18, - "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": 232, - "y": 341, - "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": 233, - "y": 361, - "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": 237, - "y": 381, - "w": 20, - "h": 20 - } - }, - { - "filename": "lum_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 7, - "w": 20, - "h": 19 - }, - "frame": { - "x": 237, - "y": 401, - "w": 20, - "h": 19 - } - }, { "filename": "unremarkable_teacup", "rotated": false, @@ -6555,12 +6366,75 @@ "h": 18 }, "frame": { - "x": 241, - "y": 245, + "x": 212, + "y": 275, "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": 233, + "y": 275, + "w": 20, + "h": 19 + } + }, + { + "filename": "pb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 253, + "y": 275, + "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": 210, + "y": 293, + "w": 20, + "h": 20 + } + }, { "filename": "power_herb", "rotated": false, @@ -6576,8 +6450,8 @@ "h": 19 }, "frame": { - "x": 237, - "y": 263, + "x": 230, + "y": 294, "w": 20, "h": 19 } @@ -6597,8 +6471,155 @@ "h": 19 }, "frame": { - "x": 237, - "y": 282, + "x": 250, + "y": 295, + "w": 20, + "h": 19 + } + }, + { + "filename": "mega_bracelet", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 16 + }, + "frame": { + "x": 210, + "y": 313, + "w": 20, + "h": 16 + } + }, + { + "filename": "rb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 230, + "y": 313, + "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": 250, + "y": 314, + "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": 201, + "y": 329, + "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": 201, + "y": 349, + "w": 20, + "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": 203, + "y": 369, + "w": 18, + "h": 20 + } + }, + { + "filename": "white_herb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 24, + "h": 24 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 20, + "h": 19 + }, + "frame": { + "x": 221, + "y": 333, "w": 20, "h": 19 } @@ -6618,54 +6639,12 @@ "h": 19 }, "frame": { - "x": 248, - "y": 301, + "x": 221, + "y": 352, "w": 19, "h": 19 } }, - { - "filename": "oval_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 18, - "h": 19 - }, - "frame": { - "x": 249, - "y": 320, - "w": 18, - "h": 19 - } - }, - { - "filename": "white_herb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 24, - "h": 24 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 20, - "h": 19 - }, - "frame": { - "x": 252, - "y": 339, - "w": 20, - "h": 19 - } - }, { "filename": "wl_ability_urge", "rotated": false, @@ -6681,117 +6660,12 @@ "h": 18 }, "frame": { - "x": 253, - "y": 358, + "x": 221, + "y": 371, "w": 20, "h": 18 } }, - { - "filename": "baton", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 18, - "h": 18 - }, - "frame": { - "x": 257, - "y": 376, - "w": 18, - "h": 18 - } - }, - { - "filename": "candy", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 11, - "w": 18, - "h": 18 - }, - "frame": { - "x": 257, - "y": 394, - "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": 257, - "y": 263, - "w": 18, - "h": 18 - } - }, - { - "filename": "flame_orb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 18, - "h": 18 - }, - "frame": { - "x": 257, - "y": 281, - "w": 18, - "h": 18 - } - }, - { - "filename": "prism_scale", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 9, - "y": 8, - "w": 15, - "h": 15 - }, - "frame": { - "x": 262, - "y": 248, - "w": 15, - "h": 15 - } - }, { "filename": "wl_antidote", "rotated": false, @@ -6807,12 +6681,117 @@ "h": 18 }, "frame": { - "x": 277, - "y": 248, + "x": 241, + "y": 334, "w": 20, "h": 18 } }, + { + "filename": "oval_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 7, + "w": 18, + "h": 19 + }, + "frame": { + "x": 240, + "y": 352, + "w": 18, + "h": 19 + } + }, + { + "filename": "dark_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 7, + "w": 18, + "h": 18 + }, + "frame": { + "x": 241, + "y": 371, + "w": 18, + "h": 18 + } + }, + { + "filename": "relic_gold", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 9, + "y": 11, + "w": 15, + "h": 11 + }, + "frame": { + "x": 203, + "y": 389, + "w": 15, + "h": 11 + } + }, + { + "filename": "lucky_egg", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 6, + "w": 17, + "h": 20 + }, + "frame": { + "x": 205, + "y": 400, + "w": 17, + "h": 20 + } + }, + { + "filename": "flame_orb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 7, + "w": 18, + "h": 18 + }, + "frame": { + "x": 261, + "y": 334, + "w": 18, + "h": 18 + } + }, { "filename": "wl_awakening", "rotated": false, @@ -6828,8 +6807,8 @@ "h": 18 }, "frame": { - "x": 297, - "y": 248, + "x": 258, + "y": 352, "w": 20, "h": 18 } @@ -6849,8 +6828,8 @@ "h": 18 }, "frame": { - "x": 275, - "y": 266, + "x": 259, + "y": 370, "w": 20, "h": 18 } @@ -6870,344 +6849,8 @@ "h": 18 }, "frame": { - "x": 295, - "y": 266, - "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": 275, - "y": 284, - "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": 295, - "y": 284, - "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": 317, - "y": 249, - "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": 337, - "y": 249, - "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": 315, - "y": 267, - "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": 335, - "y": 267, - "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": 315, - "y": 285, - "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": 335, - "y": 285, - "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": 355, - "y": 267, - "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": 355, - "y": 285, - "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": 267, - "y": 302, - "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": 287, - "y": 302, - "w": 20, - "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": 267, - "y": 320, - "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": 287, - "y": 320, - "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": 272, - "y": 338, - "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": 273, - "y": 356, + "x": 222, + "y": 389, "w": 20, "h": 18 } @@ -7227,12 +6870,54 @@ "h": 18 }, "frame": { - "x": 275, - "y": 374, + "x": 242, + "y": 389, "w": 18, "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": 260, + "y": 388, + "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": 222, + "y": 407, + "w": 20, + "h": 18 + } + }, { "filename": "light_stone", "rotated": false, @@ -7248,12 +6933,201 @@ "h": 18 }, "frame": { - "x": 275, - "y": 392, + "x": 242, + "y": 407, "w": 18, "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": 260, + "y": 406, + "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": 403, + "y": 266, + "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": 343, + "y": 255, + "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": 363, + "y": 258, + "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": 383, + "y": 271, + "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": 403, + "y": 284, + "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": 278, + "y": 255, + "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": 298, + "y": 255, + "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": 318, + "y": 257, + "w": 20, + "h": 18 + } + }, { "filename": "mystery_egg", "rotated": false, @@ -7269,8 +7143,8 @@ "h": 18 }, "frame": { - "x": 292, - "y": 338, + "x": 270, + "y": 295, "w": 16, "h": 18 } @@ -7290,12 +7164,117 @@ "h": 18 }, "frame": { - "x": 293, - "y": 356, + "x": 270, + "y": 313, "w": 18, "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": 279, + "y": 331, + "w": 20, + "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": 279, + "y": 349, + "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": 279, + "y": 367, + "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": 280, + "y": 385, + "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": 280, + "y": 403, + "w": 20, + "h": 18 + } + }, { "filename": "wl_reset_urge", "rotated": false, @@ -7311,8 +7290,8 @@ "h": 18 }, "frame": { - "x": 293, - "y": 374, + "x": 273, + "y": 275, "w": 20, "h": 18 } @@ -7333,7 +7312,7 @@ }, "frame": { "x": 293, - "y": 392, + "y": 273, "w": 20, "h": 18 } @@ -7353,14 +7332,14 @@ "h": 18 }, "frame": { - "x": 307, - "y": 303, + "x": 313, + "y": 275, "w": 20, "h": 18 } }, { - "filename": "relic_band", + "filename": "abomasite", "rotated": false, "trimmed": true, "sourceSize": { @@ -7368,15 +7347,15 @@ "h": 32 }, "spriteSourceSize": { - "x": 7, - "y": 9, - "w": 17, + "x": 8, + "y": 8, + "w": 16, "h": 16 }, "frame": { - "x": 307, - "y": 321, - "w": 17, + "x": 286, + "y": 293, + "w": 16, "h": 16 } }, @@ -7395,12 +7374,33 @@ "h": 16 }, "frame": { - "x": 327, - "y": 303, + "x": 288, + "y": 309, "w": 16, "h": 16 } }, + { + "filename": "relic_band", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 9, + "w": 17, + "h": 16 + }, + "frame": { + "x": 302, + "y": 293, + "w": 17, + "h": 16 + } + }, { "filename": "aerodactylite", "rotated": false, @@ -7416,8 +7416,8 @@ "h": 16 }, "frame": { - "x": 343, - "y": 303, + "x": 304, + "y": 309, "w": 16, "h": 16 } @@ -7437,8 +7437,8 @@ "h": 16 }, "frame": { - "x": 359, - "y": 303, + "x": 319, + "y": 293, "w": 16, "h": 16 } @@ -7458,8 +7458,8 @@ "h": 16 }, "frame": { - "x": 308, - "y": 337, + "x": 320, + "y": 309, "w": 16, "h": 16 } @@ -7479,8 +7479,8 @@ "h": 16 }, "frame": { - "x": 311, - "y": 353, + "x": 299, + "y": 325, "w": 16, "h": 16 } @@ -7500,8 +7500,8 @@ "h": 16 }, "frame": { - "x": 313, - "y": 369, + "x": 299, + "y": 341, "w": 16, "h": 16 } @@ -7521,8 +7521,8 @@ "h": 16 }, "frame": { - "x": 313, - "y": 385, + "x": 315, + "y": 325, "w": 16, "h": 16 } @@ -7542,8 +7542,8 @@ "h": 16 }, "frame": { - "x": 313, - "y": 401, + "x": 299, + "y": 357, "w": 16, "h": 16 } @@ -7563,8 +7563,8 @@ "h": 16 }, "frame": { - "x": 375, - "y": 278, + "x": 315, + "y": 341, "w": 16, "h": 16 } @@ -7584,8 +7584,8 @@ "h": 16 }, "frame": { - "x": 375, - "y": 294, + "x": 315, + "y": 357, "w": 16, "h": 16 } @@ -7605,8 +7605,8 @@ "h": 16 }, "frame": { - "x": 375, - "y": 310, + "x": 333, + "y": 275, "w": 16, "h": 16 } @@ -7626,8 +7626,8 @@ "h": 16 }, "frame": { - "x": 324, - "y": 321, + "x": 335, + "y": 291, "w": 16, "h": 16 } @@ -7647,8 +7647,8 @@ "h": 16 }, "frame": { - "x": 324, - "y": 337, + "x": 336, + "y": 307, "w": 16, "h": 16 } @@ -7668,8 +7668,8 @@ "h": 16 }, "frame": { - "x": 327, - "y": 353, + "x": 331, + "y": 325, "w": 16, "h": 16 } @@ -7689,8 +7689,8 @@ "h": 16 }, "frame": { - "x": 340, - "y": 319, + "x": 331, + "y": 341, "w": 16, "h": 16 } @@ -7710,8 +7710,8 @@ "h": 16 }, "frame": { - "x": 340, - "y": 335, + "x": 331, + "y": 357, "w": 16, "h": 16 } @@ -7731,8 +7731,8 @@ "h": 16 }, "frame": { - "x": 356, - "y": 319, + "x": 300, + "y": 373, "w": 16, "h": 16 } @@ -7752,8 +7752,8 @@ "h": 16 }, "frame": { - "x": 356, - "y": 335, + "x": 300, + "y": 389, "w": 16, "h": 16 } @@ -7773,8 +7773,8 @@ "h": 16 }, "frame": { - "x": 329, - "y": 369, + "x": 316, + "y": 373, "w": 16, "h": 16 } @@ -7794,8 +7794,8 @@ "h": 16 }, "frame": { - "x": 329, - "y": 385, + "x": 300, + "y": 405, "w": 16, "h": 16 } @@ -7815,8 +7815,8 @@ "h": 16 }, "frame": { - "x": 329, - "y": 401, + "x": 316, + "y": 389, "w": 16, "h": 16 } @@ -7836,8 +7836,8 @@ "h": 16 }, "frame": { - "x": 343, - "y": 351, + "x": 316, + "y": 405, "w": 16, "h": 16 } @@ -7857,8 +7857,8 @@ "h": 16 }, "frame": { - "x": 372, - "y": 326, + "x": 332, + "y": 373, "w": 16, "h": 16 } @@ -7878,8 +7878,8 @@ "h": 16 }, "frame": { - "x": 359, - "y": 351, + "x": 332, + "y": 389, "w": 16, "h": 16 } @@ -7899,8 +7899,8 @@ "h": 16 }, "frame": { - "x": 345, - "y": 367, + "x": 332, + "y": 405, "w": 16, "h": 16 } @@ -7920,8 +7920,8 @@ "h": 16 }, "frame": { - "x": 345, - "y": 383, + "x": 347, + "y": 323, "w": 16, "h": 16 } @@ -7941,8 +7941,8 @@ "h": 16 }, "frame": { - "x": 345, - "y": 399, + "x": 347, + "y": 339, "w": 16, "h": 16 } @@ -7962,8 +7962,8 @@ "h": 16 }, "frame": { - "x": 361, - "y": 367, + "x": 347, + "y": 355, "w": 16, "h": 16 } @@ -7983,8 +7983,8 @@ "h": 16 }, "frame": { - "x": 361, - "y": 383, + "x": 348, + "y": 371, "w": 16, "h": 16 } @@ -8004,8 +8004,8 @@ "h": 16 }, "frame": { - "x": 361, - "y": 399, + "x": 348, + "y": 387, "w": 16, "h": 16 } @@ -8025,12 +8025,33 @@ "h": 16 }, "frame": { - "x": 375, - "y": 342, + "x": 348, + "y": 403, "w": 16, "h": 16 } }, + { + "filename": "prism_scale", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 9, + "y": 8, + "w": 15, + "h": 15 + }, + "frame": { + "x": 349, + "y": 276, + "w": 15, + "h": 15 + } + }, { "filename": "metagrossite", "rotated": false, @@ -8046,8 +8067,8 @@ "h": 16 }, "frame": { - "x": 388, - "y": 326, + "x": 364, + "y": 276, "w": 16, "h": 16 } @@ -8067,8 +8088,8 @@ "h": 16 }, "frame": { - "x": 391, - "y": 342, + "x": 364, + "y": 292, "w": 16, "h": 16 } @@ -8088,8 +8109,8 @@ "h": 16 }, "frame": { - "x": 377, - "y": 358, + "x": 380, + "y": 289, "w": 16, "h": 16 } @@ -8109,8 +8130,8 @@ "h": 16 }, "frame": { - "x": 377, - "y": 374, + "x": 380, + "y": 305, "w": 16, "h": 16 } @@ -8130,8 +8151,8 @@ "h": 16 }, "frame": { - "x": 377, - "y": 390, + "x": 364, + "y": 308, "w": 16, "h": 16 } @@ -8151,8 +8172,8 @@ "h": 16 }, "frame": { - "x": 393, - "y": 358, + "x": 363, + "y": 324, "w": 16, "h": 16 } @@ -8172,8 +8193,8 @@ "h": 16 }, "frame": { - "x": 409, - "y": 287, + "x": 363, + "y": 340, "w": 16, "h": 16 } @@ -8193,8 +8214,8 @@ "h": 16 }, "frame": { - "x": 393, - "y": 374, + "x": 396, + "y": 302, "w": 16, "h": 16 } @@ -8214,8 +8235,8 @@ "h": 16 }, "frame": { - "x": 409, - "y": 303, + "x": 380, + "y": 321, "w": 16, "h": 16 } @@ -8235,8 +8256,8 @@ "h": 16 }, "frame": { - "x": 393, - "y": 390, + "x": 396, + "y": 318, "w": 16, "h": 16 } @@ -8256,8 +8277,8 @@ "h": 16 }, "frame": { - "x": 409, - "y": 319, + "x": 379, + "y": 337, "w": 16, "h": 16 } @@ -8277,8 +8298,8 @@ "h": 16 }, "frame": { - "x": 409, - "y": 335, + "x": 396, + "y": 334, "w": 16, "h": 16 } @@ -8298,8 +8319,8 @@ "h": 16 }, "frame": { - "x": 409, - "y": 351, + "x": 379, + "y": 353, "w": 16, "h": 16 } @@ -8319,8 +8340,8 @@ "h": 16 }, "frame": { - "x": 409, - "y": 367, + "x": 395, + "y": 350, "w": 16, "h": 16 } @@ -8340,8 +8361,8 @@ "h": 16 }, "frame": { - "x": 409, - "y": 383, + "x": 395, + "y": 366, "w": 16, "h": 16 } @@ -8361,8 +8382,8 @@ "h": 16 }, "frame": { - "x": 409, - "y": 399, + "x": 364, + "y": 382, "w": 16, "h": 16 } @@ -8382,8 +8403,8 @@ "h": 16 }, "frame": { - "x": 377, - "y": 406, + "x": 364, + "y": 398, "w": 16, "h": 16 } @@ -8403,8 +8424,8 @@ "h": 16 }, "frame": { - "x": 393, - "y": 406, + "x": 380, + "y": 382, "w": 16, "h": 16 } @@ -8424,8 +8445,8 @@ "h": 16 }, "frame": { - "x": 391, - "y": 287, + "x": 380, + "y": 398, "w": 16, "h": 16 } @@ -8436,6 +8457,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:4d7c13d737ed237c9bae1222ce873452:256c2ba728cb839ce479bac6b53a7ed1:110e074689c9edd2c54833ce2e4d9270$" + "smartupdate": "$TexturePacker:SmartUpdate:06a43a858ac0838c2d5400a7c8e124da:6c9201d0b6d07fc299c0fa41c226a22d:110e074689c9edd2c54833ce2e4d9270$" } } diff --git a/public/images/items.png b/public/images/items.png index 51cdae6cfe15e1a1f4db9e84d65bb0f639867ad9..2bf9a012139f43291a28c0b4b5d5d0668894c046 100644 GIT binary patch literal 56766 zcmXte2Q*yo^S(}2FRP1AETY%wC3@MlyNKRX-|bLY;v_dWN0-e5SVs%b<^M9H#IZ&F}tXt zzVTt(?Cy4EZ)YbyAz}H~sz-W@xmDoZFbt}v_i%x{t*bk|xg55#8y}lYhKrh+T4tBk zENty-XsBsrDqnJgraN-32?7Qy#ttq9rF?gQzF>gK6^9&A~ zyttQ^mAxDv{N*m^8Wow^ef7J~_V1y4V4&yL&Hdxz+)aLxYTwQ3g7Nb4#rL(_mff9} zuix&rf?=LV#aYkq&dlz&O1gut4mOMPhK6O;Ek8$y-OWp%eVQ3sSn;;AY3M^iiptji z?L0ngyS;sP;beJ}A{o+L|BZt(Dk$_zCaA2YEy9{!)lhGDRI!Cm@LRToNf)gC$E94} z>7Z9f4OpYKHukpj>T>zo3Py818PYCf^FH~obt=e56YrmuoSj&tlnbX4zeUIfosr{>{pc`%4Adv2%6g!5sT+(wLlKIQ7ux2;ey*LdBk zhEJqlvsQi<=%mBu7}=Bp{#164T9!a#JF~IV#Fc6T8(dt91Txyn6267MNsL8a^zl2) zH&U2oxc}6D9~;sJ)7aRDM zQco1QpL2iYp)oT4Eqp9x3YDPjfMq)*ys?y82KXlTS1{|$7cY=r|F8WWnDl04LJ@lPkdA8fYy zGH)W^Y3JQrR_13GA4tf^Fxl2w*o-wJPU#fgNL~Z_RVs$J3X$D>8Y{Ugb3V z{97^XzGt)=7Z|4Hez9Ay`PjF9(Sox$%km)cdbR8QQsB3=v^0`;!=E$P>s{2BFV1x1WLIQZ zZLT9!cO+n?z0#WsVYI*h(zwmhZZIV!Wl^$`xsYA^nX3Xl($X95Oi?KL{-&6Yw~p$u zF9RaCWj=Vx@C+Nu`s?!DD|8gb<@=f)^w|uwTT3*UVaSd#0BLOS4wuMS&|x|y6th$8 z^DryZdNdL74r;@ePe4#maLNHKJginUA7y_Iu>0PWB%A*U7Y=eBKfDcfoaKBdEKaWL>3` zIF-Kb!k{*F^X~n96;|=*wx#FTzt!cP?O2B0pW9J$zs`6Yqp{JJ#Y<^|{sZZA_o;qj zDv5WR)%02TR_0quZb|ymrlJ4*LUhFUxL7a_l|KXwtVhT3;Na@zQtycm=%d3-OtdD- zDFbE8d)_Qy7h-LWfNN@~>b~QucM%*M2!~Wd+v?J~?|CDB?DHj+MYJhVHjn|U(4aYd zET{>p)(oKxW(KMd45djzYWIuJwRB?pC=A^Y``;G_!OyRkE?0iQunY4spgPi#$o%Oi z8Eq=VqQAxE^I5i?7YzM{9JD3K)5>smuBIJ@1|@Cuzxv+)9)S>s2}r&CQ!+YA%9lV5 zHvG)Qjpf?8_*^DUS`H+bi?9BI+qlqDfQhUA{nS*9Knt=De-!2q5aX+xQpu4dg`VUjG_y6xZM6PlEbp!?(*2(g^2z0?bsKf?{jmf z*EB+-4*D9c@g^2bwNPdSkH83);uT^k4vi0Q#%=u`!?f5AuZfN)q1+ z=4WT+d|3hQFnM;6e&O^Y#yqhvrY?=tii0?P20fC4RmJUo4T0P#?W)E5 zvsF~Az7jk6=$P$Y!sc>kp87dXBNii=SiM*TAtI+{Di7QQX_?DAdE&O?di<2UsONen zd7d>)UFONlxV>0$;r((@qq!crciFcHy{5!~Z@To1n4smKITSsRUlmsnS*a>h19}Y~ z{3D2o|8*@GfNGcb)+3(b#e#av?RT}qJzGQ^XPOV+--PlzOFDV}@z*qhFN&~3CyVK&Zuqy#8 zHsZtTwJ#6XH?NKczVt_pysxROlr27*tEqv(sNYnt@)+Jv+SO5YCah{Hf4Dj4VwtxA zIK4SEDSKcKFL>N#WorJdeXM5cIk|8a6s$?$dP&^!&rfNWib3rk-=c6ZNuiL>^{EX3 z)`fYVMQ*G6dLO<$PQ_eS!al7%0Lxnh3j2vH1tHhRTAzFJacHnh5}3c1-NB`_R4VU9*$g(wb7vZ5nIjwLQ7C} zjMqD|^O(q079N|`V&!1f%CFV6wb6W89rl{?cY32TB=Gn5r7lbR=rehE8b31ug|*JE z&d%7nu%|oU-S1{OA73&^&Ya)$E59encxK(l5cIgl9vFxv7i9VO84ff^p?M(K^zh`X zxHN<$b)9j%jD_{*ZRV<7Ow80^JBpvfEyCegfk|ZcTzQ52w${6Q(dz=Byx7Izw%Vm% zRX0-;mYu<0iC5v~K!z6nN{yqEiQhLEUqBbW2{vY?wy`f2^tJnzm|1PWrxaQE9i#X< z#}GVaA~Z#U@?E-Gp3RpoU^T#;5nsShdMHQ^er*+9U+Z)W*$@(;p&&2!n0nZH{<3j5 zBWusIf&b_4Dr%xvBOwp{n?9w<$eon%FPYwBP?NC7Hb&zdAWNIomm+>;hr_S)F@Jz&+Zl z|2d@{*G^w6&a2EWt7E=y^UuB+&7S%szdT#CD~eW=dDn6Lx4?eaPQmccS<#O~Zc{>< zD~$JecKQKt)b#zM)W&Ox-UUAf51&tVsLu6xyj)R?!plqB6kwsHHeDv^HtxpLhX z(;A+KCywM6`~mZwEWSmR0FJ&?D(MS~LnAD!xG2Dhxp=Q9)sf86EJq*A=3va-43xmQ zhrBWWhVieHXj8}rG!B8NYjA32C8bzSTKD8rQ6FbLYDPV zOT~jGi)}V}lz|NM>k5`3B$!e8dB(J|Q~Kf5ztgmi*MV6&ZLBM7#3~=~$u0I=w@qcT z`P~Fo;h2mNx_z+rQFK8e>aLSh^6iIj($B-tNhLS>)*FbD5$bFSYu*MIZRH$#{hN*x z6{kMkXnI!lp;eCX^)D{YcdYh~Gssdn%_B2o0%#-w)g6i{)Pm&Wthz>4{u)oFR)YGT z@6V3KIBt4|X2^A{6=Lv)`t_<{zri>O3kQ6{+Q7yI+CLk>$KmfGi=K}iDIpyXAP-;z zCCY7qQyDox$u;&rg(vx@F5RUk>ptyB`^-uc>gUBK7_=@j$78`T9r-IKl zb&o4v1Mj&ML+ihjE$TLC4~(iIeqg}2h#(Q5@0P$~Niqs*SWh~E9ME1K0LEUve9Hb@ zsu}$|S8|qEsmRlnmA_PzO?0HRmR&vEIwhx5QHZ+I?>hN=$2P)Y`oo?F_=z&_wq{bz z?`w@M99d#wn35FmwP3;*A~&(S3gM)T#MM4uQi|_MtlMfMJ~go1J{G)}{cg@yO+9PKAvfioMNGTX%qMJK*Q%NP>%Iu?tCeC^ z*BU#!zzPVd6tYBb(|g-Plt%zD2zEBMfgz6i;6JQ)46?yu9#A>B)-hqJqtp6x{L>Xa z+aIP`^0OhOLnfb3DYpgXAo}N{Bo?$N)%Gs1 z_=3IKo(F7X1C#8m8R48f+@*6hnup zZRv<1T4wD*8?yg+Ci~bV6T$i;n6rR2MYdTss^RbYx=X($NtnPa{u{1<2?3014!oBg zD^8mo2?+MPGI;%a9^~v`PGd_45mn|X*ZC(xM;!cP!+nx^+8BnR*{*)Pu?8n*!g!$h zM+~7UF5&@mqL7J?BC!&(tj_y0mE(U)6ibtUE0y!+4R;ihWaR5WzthDOs*-1iKD6T( zR{|MM)Ssh4Tpy_1{5;?8+6R2`cA87{*YHrq%lJsqdKXM~rYkTQM{~&385#LE2?PFt zp*o3T-!b=QFW=x)ZYYh57_Cx84c5f6S2ht-t~(2Doltcg%iu+eA;&aW6nJD2wz1T_ zQo3T&v_N!FZx$YNEWhN*$Qf60JzVRJ9zD_-%??u^J^eB1+B|XV{Gp4T4M_+IcGK@r z4|%J2A!`_E7%Id02Po&gkPb}lV|;YwMGk7_iZ`%@4^fO(_YO;t#q=2K&F3F%r}6f? z&k*102nf@C4b$TYYea*NQw+|LAhW0;z(z;iSoW;Y=&QnEOy=(H&r7+}NhEEVsi~>c z9c~3nW~+^R0S?1SE3Pa>iDGaV*GGaDj zm<$eBOEH-MNJdU>yzEub`lqpy}qDZ&iYMk3%0&`a1D&0As*h z1%Qv~5AwmoV~~t16m}aN?_QC2WJ$sx7q_vDy80gOb@yP{r6p2I9A4@^-@@l*KvnMuh64b%LA*1~P3rRns-5AQB61Y-L5#mE$TACpR zR{TJe_sq(^qk{K+D3V8;2zoMGO&j`al0uhkcGt+2rV~-bV10!tpN+HrH5ttlgg4!L z!yvP~^PT&H8CdQ9i{MavlajIwB1bkUGw|G8w(;ZEB{9VCWTFsc%~ zwjg`KF2#W@l85m;)*3q>#2xh-Gi-DeF#?$@`2HZ#lo!-JnVF6yCh@?-AM&fibwtTm zfG|F>0FzZF=*0tZYkSG)w?kCXemQNApBzbWaEEX>eVRv3Bq0_pjYrS%!hk{G{lj%Qrm*pI z^Zr2!Sv!(Ai4*YoYS9T8UDw+M6L#U}u7C2P%JGKW^@px^wj}NFj8QuY5BKDTG{j!f zdmuom7!`CfNJY%B?|GFZh;567Pyr%3BYSwl@jRfET+D^?B=SnHCB4dAaG*oS6xQsT zYZ?APnD{_235*F8&GY*YLU&?9!GpOnE6ei9Z*vkq|APS3m?g~P;_#2Gw!)urqfKTD zDJw^Tu{JY|c;4h+Wg9Cg0Sr8}2npAkoRN*ZQ1^kMM7zzZpZD%M%HDJ;*wwESO~2ZP zw3R2!RrIc~deDN7l8H_qtJ~L<=|2!LLb#V7?pL#cDDM0S5^$Cb_H5Y=I~mDPfP}UQ zR}N`9dM-rasR-0_C%-HQ#;%I?K;kR{ARD{n#*l>_-yuX7z1z+#F;v^ZMm*ihhG<^Xj0OUjS4?iG_ zX{(tUQ;@Ey$T0g;d><01P3&T4q(`K&D$^ya4+J~Uv^q#RPXd<=n8;afew>LuH<`a6 z_d+-pkzgGv7G51yQQD*8>?f@hW+V(Xlj9L!r}qT%^W)ux?eHW`LlkDw{?$>?XRxEJ z#mpiZb)GYrU!%73a;9~vt^f38&1SjB1f z>fGtd{6bdD;)*_bE=a7P%39zH*#cd570LS+gF=W#?f7%ph zDH1P)Mf+;%;URYq2B|K1@FLzzX*lJ8t;FSv%*K^2ZHPn2@-_>$>|ApyZYHQntN`-r z6N*h-dRZU6(bJy@F0&fYj4;S2HLM}KTDTY69I zi0qLqx_#Zc<-iSF-$pU1*45ey-uDdU`~Yc>;tYvA+a1&mi;~PSC*YnAO}oz`=l&4M zy>2mB!cLA^<4pLR;0O0GZltJAGb+l0$T)Ftk>vLC`<4M3%-4eKN8Y;2i`1QOx#35tb+0Dp>SB|!yYc8ikBY?7zkNMm zJMHFeb+@Lwh9|O`<#4g>I_A;nH-P3^W?UBt6 z?T91e>7D^Sxwz{)^F6GFDU4h%pm2ZwBTT_Kaf{KpK7-#e^4+3+x?`*Do|?~9kpP>s%2 zjM>xvK%UFgIzWheqr$DPI_pKL(goWOr7cWD?+CtlVE$I{r^X*~>Vr7`v9YmJY<``F z%t77yDJjUXaF;>e5LBDrK=cX+sKx4oT>2~HMnUL%7S}>ZeqU6 z=19PUAE|!sbj^6GkbOI)h@$eAfd5V45D{HvMh1;I$dfc1zBF=!K}ooe!V{O#OlT6N8k0-j zoX83|#hMMZMQ_u3t`fkGpxKfSHtWUaC%f%1p!uLjp+!Wy_h{IUZ8V_?XJfuXjtGA9tmnJ;bY z)*)ZrgNOFwgp{A^Ek@yKjcKbxu@ZK1yJsQ`H&oYl^i1m$^IB+ml~7;vIWH-Y;=S1l}=VPy!%;gd}{N8A@a^=l*$^{3( z%v?R*#_S>`WNI)B?r6{(XAjArazJ37)DR9PCmqNVNTuHqZh+2ZF2WYyAdbbZyR}AA zPeP%hT)IMif+Ov7XdF7));-^7bGgc=iq37z+Ds&22*xh_$fm`F*hg~!kq?(+hM(UQ zUfm&DK`W!2kZZVpw5LJm+d~2^gs#jh|j2ein zY+Zrq=pXmRHFLuvL)&F!J-0Pu_4ATY$WL1!#vaM)_2Y{@AsxEW6zL#${TG8omBA6A zxexZmr_>DZ8D2eKwYWOpCB_7>cz+tqAm#pc@}ZEBA|EgbOC+>a0t}giZ}LDN7+!5` zY(!IFDCwkU3|T$vfp%EBzEA;vb~Rz^rL`&EC@wY#Loc8H>`=6f#!_k8DbCH19zOG& z9N54D#TD!i0n?^{t_BFqC4K(vUg~$)gcO7w^O?PB7@*@KC*1iad@1EQbfC((aM-3Z zWMQ1A51pw%CeokXs9w||O~A33L8HDD*TamD)P}vXpL2K68L^AZRPvy@V_XW@q>)jG z>sZgXcZR>~A}(X%Bju#2w@bp(*g=@Op(kM>XgHgpk^>a|G|6ECtyv#{5(n-~+!!!< zB!4(f`bacI+$RVroJRqYJKJaq0=?qmL}^jO(W*4vp$=;(85--NQ=M!74ETb zKgdPE5!pC{gk@eTh6vg%i!ST$jmrI&zZnN@h681g8!m%dK+T{XCUaVj<0P7 z!MPcgQw8$}nWf)J-XOyWStUg?`eX<7XmIKbu$4!M`9eU92`7v=!R8MeJkX#t*dP)> zJ{wKS3J?@{=wBlqFSx_2rw zH#lQF*!@{ug))jF=1ODC5b%{)rd6alLtuK? zz8MxOYK| zHj(dAwAirerxUPUw>49V(3Vo2=YZb++xji_ecpqJozn&j_rs!Er~0+*R*@0{qF%&Z zihO}V@eL79W`S)WtIh?C_y$vA4`#&;^Kp3KKWg<)jem+O-Fif%n1Y3AK4|w85}+|X zc8tn_frJRqZn@qGzg-ZnDiCPW4h;==cxp~v9-`WuOEsZ#pyX5xc#K*G%Jv5dQVK^i z*yQb}3Xpc*zBTc5=k3S)hbnyrqyl-k1ZqHhE2J;tYF6KOp^04y;Hh53!6hXsi1WKp zsa^&{%|e@N<~1l9OpV9<hPq6PL^=`%_>E0pf)4Q#~&&F6Kj_p0%m} zCO8&H75kzA8{10@)z?egeRcL^RQukxp%S&AWoqOcyNw$-BvHD+tnU1%VV5mT%|guC zE)JBvS5Vsq3EZ8fJctKUL{jo9vs57x6_q*c@L55ib%V4pT3$gVTFFH|S6jV!)Q|(B zVg3kTVgMF_b_#t)|41%jtz%Kk=7J3cusfu%4j3vlEzmR1u121>C=R}4M)`&S@v1gb z!cg;ZX=#V_Ktlyz{R^6+ls+*tIpTTK_Gf$tt3191LS#%Q_IVj-@LP# zUw#T~OEz*1_!Oc{S}1}ahaV5(2NcsMD#P)rsBF2vnq0r-XfG+YDB7rG=MS>KU(kAK z5g_FUK+ii9fW9*R1DSed{(uMUf!O&ywS(1@OK}KKV+_-^9rG<8IhbDDaq<=_!qCUK z-n>bWqzqol(i4AxP*S;{e2bY4g9)gcg%O+^EHp=RYy3H@$r1NR<*P@BVnsx`C9zcc z=zndXjVU+_m7OWqR7O@7YtX0D!q8AOTzwB}u-9wg8`)gnN{Sh2LD5{NEAMdcfenJI zV@zhgNwCW_3MQNm|J!9d*zyBAN8@j{QlDsc|Zi9hy4^LC1g0(W#*ABM1O-T zzp9%-im^J!IC@W!m!K%}sTO%kVR-!==6&=_BV?bq1dy%=PNqR|;v16kkii65=T!WmJlvTv^Mk#jRZ@($<^~Hr z;s5OH9dG<2ugB? z5v$3s`|TDbvZItjtT-~zj4hXtamCM$Z^@N>uZlA*B07nVHnxiE>od(-(#2?mTN5u9 z)Y#W`4I8|eupg&C)z{jdM0uGb>eFi6{vA+7A^TT8h5lt+>h1q?tzf4q+DMf&H!z=Vc&)Di&yrA4B={Z;10yfqgMR7x&78RI)jb4fyY7jL#F! zX*QJ6-aHU0*UoH(dx zz<`*&S2i&<(LA`BIH=jhQ)33r%))Im&=0qfeK*JTpH!xTT&Ou zX_8Vv<_aVC?fVx3TUAJh4yn+s1Qy(HM+cHB6naH1u8sS`c}wW6`YK%$)lwm zk@(J1a3%fd{Xa!v+XLKHB(CA#2tKJhve_}L(cV!jim+;yHH}8HQnZ=XxNbwF!5jZK z)@()U0%pPKF`!og{W!KMWXKR`caSD443496Q&o4fgn4+uPXSc|=(@mk8^XzeNrHS! z_5U^(7Z;0*6P@&5AW@fx%75QCQW@G9Fc;c!3FA40kkT{eZPI(TTB)3TIWM^3YH{Z!+~7kg#(&D=CeO2Zb+NPmo^#>a=j zk`bd;)h~F2ErAgEaki}}5aB0wodC-!I4QTYQIkb@wW5{mmmGuMWqQ>}&}Vr#e3nry z9Ub+6fMKfp0m~*1w4k|Ah5fl2Be6$6q1DkoVlr+&Q?zDt^h_A1GC;b^C|g86#}HJ1^ni#{b$P{jKuO>)kpB2kW+JHmtj=?Ob#)HK z7p+hEsASReyUBxt-m8%f!GHSZ-lsPgb=?`&6wv3Jffmfvvdv`i4#g=*0|)Cjw8?Mu zKe8AwqhNYec6NN7my&!%DQ`NldF3PPtrP=Z47G>A7725t)nnZGrtMIr zYQHYgBL>@{kk0UMdF{@tj(tGV+bXOMN3oq2#}o3VL0z!c)tx7k2zuJ!YQNdz&3tMw z*G<)+x-u}}K`IG>ZDUxgegS=*5(#QdQ!OjQgDN@BZoq7N$%-ru!o7XFzc?KHY$5|X zIb*@uVb!IYii4u~x;gr_##}}25c?a^$E)E=soFvaD!h=LvW1S0=Sb#-ZfF4rq+k^!IE(vCNX=#}u zlG17iyMKyrXk>x%_f z^`+BUHC??aL^05bxlJ5y#0^F-(~$|yT2I|4c};E+3NV=PN)iNn$kC_gZ|^fWPlR-n zgXZoBoF8mV^!kK)v+6xLv*egTc-&~SV<7+oQdD<7RLN%GwNl74s1i0Z8c3K<5yqlb zR#W1a7wZ`Q!r;vpA8bB_b~@ZaG6H@E*;}`c4UA(ZPF)H`=r#-&x0H+v3;SQ9ZbJ=> zsgf}ky;uSIhlxng-&yQe#f~z>fbP@ACXg|_ac+(bl|A5aw31C|exsm3J3yahE#g_O z;8;$Po&=2ik@?c3eSn_(-!Cm)M+a>ZCp$yKl=ff`Uy1RJ#=MJHzCkj*$kx7yd7XzX zz9$0DL*_v%DJqqd7pzS2S}8YCL>NNcw~#rY(zply`maWVTN&cu;7N1zPO_O}iN`?Q zNCR8Lt8U1>$6`Jw6f;d`G{9lj??7Sy-`s(?s_&hG=z<8erM zA;hs*iPjp{y%pW(pg`YiwSkg7b2sF59#bu|LjLfV!;NNI)TvQk7(Nao=cYe5qa^9 zL4Hdv+B(?U`yKba#?S;Yo8*n{L|vD!+G3RRGrCuth$Q|pVZQO*)2OI6XRKC2F9< z$)S05mpit%m}T@~Z`KS3VL~mOasMIqp?bm$!l|j=g)tP{X$tx;M6y_PUb&ef)c{}^ zb0sthW|eKJe;H@iBH>Mp%WemQ0l0)7aT_-#V>#Sg16Mdw$wN>stz1I1a)O~4!25ZR zwuMkaOM8?1y3fXXq1Ndi5od8|v0n;#LLEoQ3PsckPpSFuy`>vW8zE{mPf}7}{iK7> zj~_h`d$~wFhj6)Oc`gOZB0=z%v|LS$aIdWtMymMR~(g32Ah;amZG50`PaX{ROho&wx8zA+@YZl z)kV~)8-z6}hXTe|Kck6g3&E8dT5umygZ1Iex>J1e7S8GB;;A4{4ZbA+^7SwV< zH@>|*7}^@9Z}FlseHBXqoASF-WWSOPmT8$CCwf}OjCTP44@IvZ552jWzr1==4&WRB zd}m^lA!Evb!H+B6` z*Y%-Bq0la;I#h$zXK;bN9xP{zf~SYBD+YL7*ut0Q?HPN4{(J#`KdmM0M*dAR2jg)f zd?~xKojsI@V8iTJ_FkzRG{o`73;!9Sped{uVzS~~AoD&;ZuTBb1K0fXFo|HNLRn43 zW)eM!mO863Wyt2CSDKomRcy9#1n$qdbuq&$&pXri^smh`Z#44>s>gQ%(-balzdVws z6GG3e``cLk7k{TYcv=4zA(Qm#3BD5zSz}ORk`rM7$A4v%um0Vf!&HiYVEW7`k;SM;Z? zE^38NC2LNS*C?l~dNi9Yv;Ol{F&4x)@qNipmf5pPA0EK^A-XnS@YmWC5xV6B%~%jioz(+qSVkNJEo%aYe|?L++l zCafnKYun4*`=IbSopJdr>2u3pNi${t?ox)o@{Ej+^E9L!Xl&l~03rvq7jz|_8^K`B zDZ1=0suzCw;zQ4FE{t4J?Ic_bA9}L}0bd}V&{QEI_NvE+8IXj&LBqF^b$XbBv(j6m zyc`Umf<%sQgS{1PJBXFG8JH&sZx1lnDORzv0ljTBpB?eX? zNhGvBq%uC<=r7zxu(5q6NVca!@I**p=uP7r|F9-YKc9}F(FX&zK`?q{MS*B+k~s;e zTAoZYi&-GY ztTzb`&hF~EbVyAVR~k7s?=fC7pnMpe(%`8|?;k|LGOnc~mMnHE=&Hg@YhPcy=&dwy zpJ~K9ic&$GuJO%a3^1=UIdz5XqE%pxG@PQWI${zSA{d*r_M)hId!j$w+V%avpR-i~ zmonO-$5%~_%QmlN8v0DtPfj)(B)L+7IWyS?>)2kbEaN+~l49xjaDQf~EHiiKJAE(V zQN*w0Xk_sSK!L*kp%Y^kjhYtpUYZL0OQAmsMb(CM>a0HFPp0TqpH-l}(tX_5_kGn@ z=h|WPTI_!J@n#oXqQo3oeTRk^QxEecn(p%_oVHw1N9X?oDEj1)&7TkG?dC;Kbct3iP*56A{ z&LHJ;+27-Mo%0DuMJ0|>jt!Y+!3Wm)_KxP?bzYw@Xyu4M)s%Y?7Wjy7>v?+(wgqT;6m67d7A9ku!e#^g#;Bc594S{(-EWH*7JpSxRHlltk?5&> z50z7Q>n!tfrL`1&2Ei}Nu(}?~DdGUFbZ}D|5h?4kYXj;RWn5k*t7qrhs{ln^jk7S* zi$R(g9}}jK?`W&i)H0;R?Ehqvbj2tK{~5}Vhih;xt^YoYwlI; zULiZr_M{zps$4adW=KHM-vi}@{YBre1*%XKGA>2Hst4;$F^duwzI~;9v|U-lX*hA$ z!;_PX42DG`Di($zLOhb15eP8XJ;e0m`Jbj?FuXIsiell*rQ3_z!m;7Fa#MBtd(nxB z82mVZ8H?21oWI82a+)X>cFO`B&-?Q2{4XFT93348 z;=>R&;~$cHG1x+D1)@@D2Wz)94lZjB&~m<<)E#E%4$(6R+4{#=BujeuRLVs@e)3M@ zGrir2&0`;OaxCp4WAWxt^WY9wdG?=hQo~fzr)+*VAYmCf%#P{|Xvj=q0`617@StAq zR^;b%M(`aD`B69?yXr}e?b%CtbsyJ{QrYvNnk~Ftp(w}Q;s_=bt+HOv-rc)4i_jD~ z0`|f0E&`ckv1l4Fm(mb5s7j)OxY#yQq=H3t8p9E(ZW{16mTb*Nno{24xRvaGU5z=5 zKDYm}??DHoJ*9DUHQww>=Sep8bFCYFewmX>BR`ls*GhChcw`*XEDDgBaXKnKYT9Tu(`zyw(RISrQQ2 zAbow7MMq%l;HV)kUejud8Dn$V2(z4uGBfDW@G*wmPUow_C;iEvv9=59`4Y-ds~VOJ zv3L2DVBXnRh77XWE2!fukL+q{mw%8(RcuwB27?F3g{g0j|63yX%Sc@&Zl|iB9r#Nd z%^DzN|04Bg46-J;`~`-}MPI!f4!^r^0`nis&B0jujJ<-SnW1<}?o7#^l$5>h7RL8X z;jc;j@hFXY1n%@aBz}ZuvOzMFBI}a=*jT#hHf_NcUxK6upaN7(Ce7GuUn|7SFD! zcHZxo``HmiY9PW=tls)*%6g46IPqPXB zCuGM=8>?vWjGIAO70t<1wzcI|9DVxRtr+o;bQ;;k2ZL5+52wYvg@cS zttB8{8Go0%l8MEwa6uhMX4r6kVD@F6N4}@l65v=u^4ExhnX5WsRf&(iwQSJs%yIQ0 zZ^UWX3E3x(;s?S=j68z~17le`wNQ>ZKd-zg38|nL7m5*2-E=;KVt<;kG!baxlznSk zoE5;auH}yrU)mQcOf3KErLcSAE`z$i?{5DZL<04JEc@TJ^nfzwckg~oIUBJ=#W>DY zqg5~9_e=2LR#t++ddagI7T;ogpDI!q&Oa9#5`V1q5OB(J}z zC!$fVxnb$?qC1~7b-I|hqbXEKH8zH#9)$`f`ciCZC1ThdiHP)WK5bsgIIcUamWJ|( zXQ7wg+^hq*j=_3o(pjgiL5`oG*SbvS>{K>tOreCVy1?3 z6Wi4W^YQ4~IL*4!4{c56_+Y|!>ybCid|9Q;xoF^Z5MTsR;#fhH^h=4xu&^d>knJbK z73W@5^3TDpi*Oaf%_(AM!>oWq59vaaGXmDSs(YH{gA)4rMErBd`txPBvA9$%|G14>1E_^%>O7kvV}iQ&g@;&R??e| z7`Hltj6?LpYj#AP*D8p4x4&)uZFTFu|A*cnx9-2af39a83zvhBiWZ7l8#h4>&IR-^m>qv@;Tn)<*0X<-6V zqd`D&APo}I-P_nk2-2cRN-3apO{GVJ#DKBU-6^7kQj-orkPt!X{_XvFe1HGlz5cnc z$GNY2cg}gniRJi*^Yu&pd+Q3c_q#dnCdMgm@~ZflpRQiN z*LJ{`SY!k={cTJwh3}Ho4hY0Aj6fR4?<5r?r`8T65TOL(Do&*-JL`wQeuMzG1@uW| z@}Md`W@1#dZCr}})}6>Pz5lUo{85DF`D5ZJn4GL6+`hKII5vE=I1%~0Z$MVg9}e+fCvm(y z|M6;uNm1fk2t}o;;gDhX8yk(@ml+npu+PXVclp|g!1P$xYAP!qnAyX>+U^xb0k)!+ zffY3eienX4RLof36xch5Ot>7iI{{DP`F=TJL}$|Ta(_dgyw;BfHHaa#D(THI9B}HO zs5>X=O8ZyJpTw91xCONm#15*KkBn4&6m82IO*`!s6*(&)Q(p|0KS%HY@s*uOL z;PqZ&lW*qv8s&)*IVe%C=|m3VdqaQS?ye;H8~3=8QX=&|6b74@Xd~E(=yiSvKK*To z0qZ?+LxsN$%GE&AiVMUTlo4Tw(o>m!hsRf|m!trm5{1KpYOQnqDyqI(?(#I=G)})` z;3)TQ2$lL_U}azxh16F;oMl#KF{lN2O@0sF17aM#DJ>}tjfoY@tD0OTcZwOXVdii+ z>djTl7s$ODmd_mLIDwG;@OUKB>4{h7sO9-8O$)8!ytW*XW6$1HI1A+O%0h0{gcOB! z3|3TgT^DId56Vj$Cyf~;aHiV?c z(05}4PUVX9hj8it&joluVhRF93}}d8{b$A&)?Lq}+?t2)MG{-o9`ALhy}fEE50C1V^g1lJwP!u_i~S7xkr z{{3Mq0E>71MpBM15QD=6lmki1Q>N48g85KUXd;x(b}b1mi=o=Gi1a@ejO^*-$BRsi z<_m`_Q;tzb1@VS)LrVz;<%!s$i^8UzL7nl}7dR`-OJ&KWjb~De4 zyCBoeFs{!cU?hA(c71V7)R0B8cig#3L9%sxU=u;?Z@*w=L7b|aiXO1cPVEm(!qBms zmoKaV7~PI=a{2(Oxn(1r$fBqtHx&dMQmrJ{LfxxMzp4t z^6-&EtpisLWyYTwaD2OmV0cTFD3K3?|5F5D(2g0pwt>HL0x#l=XdI*Icx~$1NAznWIbGWxV*Jt2864_YKQ0q$6lB-z#kd#6fpH? z{;h=2=prP0DE_gpvUdE;4ky-W6UVkGQC>~RLOlmudW1x&!phNfaE&KzklB*kcv$HiK9zsqn?_i zjt=JE1WnwPyqM|(atY3uuo znY6TZU?AE0^j5*dAzr(ARk|jK&eZuCny2FP$WM`yh%q1(wkcz%og#F&6g;|J%E}Fv z^?{vyt|8DniulYt2A%PG;UYE?&DPV2Z%GheEwo@SM3eip$;Xr)%vZMc{o0urC@W-_ zWcWk`1X`pC?L(R+*jt*+x5pz5Ywro;`WgCCf zM)uq(tBX2`IP6ckN6Jc)q10%XGm$RERORlGkue}*fFU?%ngf*+Wp{>scxXuVlCCX_%nf?S>&fo1}tB*LK0&Olu$TYPPo~eCySmOy&{98kq9xss%i4G1&xw zuX}ixTmCx>I@&I(;e&;Vh`qDi!m_K(9bD-P5DA0fnwsKz0`T<&w_sx*A1V7eZmWvY zG(@#(@JQ{*4-t{s*5z5++j(#Vv+tA?amAsrUgKDCB0E)LTUx0-^{jKmYGTP(s{~i? z>ckhVZ*nhiz26^>+_Wis07rp*K2nJvyB6tyJ0oKNPD73@#X> zjCGuV89Sr%FC(|AQ_~=IzGX%}Y?Q;L<$KWkAB7p*Z?e5ZyO9DgCVj(HU`_nHck%Sg z$y^OlI%TE-mX-4>g2j#a5P^rIzkirn5kce4$0#?B=`4sH7*L0B7Z(=sg}@Jjm4oIwgDlTNGuofs^o~$Y6gHoxGiG&Y93dSu1?&|s9 z)dT)q^7`1Ay?VE~h1$ffS{(AS7p&b_ld)atXaG%SA_Ae`{C$fNjw-2j^H|iC9~*{T zU7u7{WWG<+E@62}hvjx*#@?;6-nz-HJ@0L{#uT-UEsCp(+UO~c$3eh4R}rR7oL6s! z6IE)6WLidX$#sQ}RIRzNh-CYe7tBw4I<~90S^o61?ca$<)&>h5Zb~^+EQYt+CcUo> zr<ASo_dDI$RJ zOhwY4Ap(c?p5*MCI0~mGNAD~StokV1(M@cWg2tk9_(qP(Cv3ey^X)p~u0>LjUzy4^ z@7ejN+(wl0^Erp+Udv4 zfAhno!kYdn@92o@YIf484lf;l^kFd3w?hl{b`(gL8izUf!BTwWGB`7}D-~a|a9t7+ zQ4PgHz_+<(fb2)@VftgX+5YC3OPo>Oq9+X`RqvLw-F(P z^EHJvOSJj(xRJ`?7zWXaDJ5Uru^S_qXlJo`_qq)tXs`72bX*(-e)S59pq+Fr0<2;B z2qk-dG|>*rZG8W_hl<+PzjcGh34rx`20s)XX<_?T_n<0bumX`&*ZTtPdfNH*v;7X7 z4Ig^r(CH!-nwno_KR`Nxa!*?W#aN5EiLj5Ftp~|xojn+eG!dj4;8s#pr6CRE>1M5y z5E;l>PEh5w@wrloqrt1jS_Mw7yb)#<>%G!WNnK@7;nPg!u@XJm|LQ?+TXSG`q1~nC z!S2$#6A8ONQ&g7mqz94@LbZqF{RgOd$bj}&g!VU8dw{@**RQENi9QU@{&Zck2r&@A zzzU;jn&0a{^)_Jv-nN!15CM^(#`?7h_!A!i5hbB%eiN2q znoqV?#*#u`E=-1cR-|+f{DmhebVO)OgUGmX5o2l8$&&-ki8A%QR=+@$#867+DI80A z=;+D$<#qn=>G&-#jc=LM|3%HUKa*X&(+JmWOhmS0cRK2Rw~bo8I!>5&!4Daj{B!H& z9+P%&b2Mjo5ziR5U6^aSDm-TI)XNq4z5Y$Vge?iQU&9JiZcK$OiZFnD;dRyl-go+Y z^zx+Cw-LtTY@1|KY0_8k!t!&j*;-Ef=~cq(5I)l)>z^3Qy2ph0xa@2mZser#zMl+! zu%1{t-1TV-1-4ZLP5ZAjK_Eb$D5hg=oizq+|1S8+@rOAi@#x!^48m_e)T>9Dd>)n4 z5}N!UCI8ENm`?OQoOgCqh`c;?be1<)If0vsKxM{Dd@jWc{va=**kEs}d_t4V0|Z&$ z5@(kYT&#hMWmU_6VL(lc8zikh8eKApU|M!VX!_IegFfu7XgqJ-RwC5I=YlW@qC9Q>J!LF{f(jKxb1)%YcGv$320&v5$}NaJh*S5;@^X_06qg~`Th-dS2c`b}>C*tc z2s!XnnDUCYEeYx9u2is!u6xfht1Hvz=J_?I{V56C+&#m8#+18)Iwg<)J2HF(t~LC> z6H_>d#?Zmr^hL^nM&EJo$q`=@OeNb>RD#l$Ojt3)l?VZte9Z(-lxXV5Y_~huxg@>v z)?+%i(V3>*tCLO-?&Cc$^=Bd&uXRX???y=~(RM-Ci_Z$>JWt{QU^d<3_Zu5ee)>g% zd&k%OHB^G4ve8qw>z*|lJUr9Gd}^Dbi_S)GHZU=wpoEVId(DfjO)^4i_+(GezN90& zBC3yF3&jN5&Zu{NUf1?z98l1)%Nb|^ZNk~kP}?ueP({xucP3dCvA_A3a%G*7C0M@o z1Wf#rI?}1{11EfQhI@788A@k^e72!dx=dB_Yh#T5yrH6iG3eQ&QH$IDyPIeax!?zc zABMt}j#TR76~s^FLY~8xj@8M9DV)uEMj1DrWp^i({eAux?m7l@eVgXvboxFuL6hHj z!cqS@5@1Cv7%9mnTuo<1O!kJm4-jmdbP(a*LNF5we_*af_J|m9&NqlSvGCp6{JGTr zrI7&ulnV}+`O*Iw;Ou{Wsqx{-)m+EK*TBc?!4Wr{Up##MJ6Q24wyqN}LhGboV$nNk zNUT8S1_u2&#ADNge7=1X;xfMMBAVT0_f_@X^S5!>A00+?GoMfaUCP*GfGFZVTmW2a z8_h}@Aif~b?%sDeJv-a;p6Ls+g6E3*Y|ye|8p5SZXa#)$l5DJY+xQF~87gaLp0}_O zuT~`kKvD#)6*XH#71sMRU1VTFyHEc*A*{JDrZA{oj3uvN3)NXHHc|uTAPADPO}>D5 z#wOa2ah-_nj>%m9Ii}feSroEgY5mgV!p~8aJV9az6D$wc3fP?^Z~h4CX%sIWk+I%= ze#H9`#Q*aylBpn@rfYluhvXqV$Ynrph|;@+D=22(>xwJni_b;nA^*!1K>lAfRXR~< z6c4`heERb3G%_nfMvFxjJ-BZ7a z=)4WOKn1iA#O;D0c@n7~lwnAk{&dVe+Z`eraZn2CZ@>IUM=l2ijMz+fsD@`1V&x&G zbk~S<Rhneul$3{6@=8&rsJNwIKB=WXqUfSZD zi%NE^A_@NVuScz8JKGL_kk`x(5i!0hdYCj zmV)|5o~BNo+1D3`s=_{4b`A$GzA?wlWSh3fexZ2!Ro6s+%ST-FOz_|!*vf07Y;}cs zZuGn?(IEgTZmhc^m(` zVnz~Of(7W?c05J(?jIhjzhy!qt0>)WM%RHk;dRmP@|!h~xxp@uF+T(km_+2tODUNrk# ziO~N{CK6ItuApfG>nJg2ao0XDz*MTc5wo#lBY7cLOupL0;PU%_Ar^O&(cq-Q~%8)OJyPpkvSH)9GMzfr_SlixTf+kOvg z7&xwd{n72|`p9djxnyxfxkM2I`a2!=HVYjy1yk5|53vd2joE(77VVA&*2_g0%^pJ2 zge)$S=Es#xI&q>1;kqVanvwA_g~>z0O{^JlwSBjWid5SwY@ZD#42{CSxam?Pw=Jh&(#iN%qoA66==<*s-TnXDn6+Y0oeC$O`ytn3UwC)>QQ!nT>syDh1UZ?``;b+t z_H~c4M-RTi!!mnxMteyvLb!<|t{5xSVd>SH2eIh}^gmE6Us<6{Wsx>N zswR{;*}6XJ7fQRdFCMUA&YdW8EPDTVCdHWApoD|&!UK~9(kW^118x3`XF@@FYtE(-j8aA<^`F>deRGK_z)AM9;tFv)aPCizT+OBs0&^j>J*q()89jMhV+&> zIB>!wzTdUIEgM&DYNk9k&oN|eAYhIX33n0Y^fDQ4b6GkhEm+LkqUyG1t7#i8BF)RUzE;RZBoP=ifTze zQi^V4*0*|eMty1)3QgJ0d_WFWJBz3Lz9m;D@PW6l$nW9W{R^48p@8OS_?e=5x z1|8;3$=sf>#jkE}&0&<=R*fWac5;CWs>7G`AihR2^Dyg@dEx}5v5emOmuHkd;@&~X z3;CAg{P^1gC0LpSY5tRR)2}2V0l!(RU|f?s1JlMLR|Z?`<)Tk)-NYn8%!1z(yA)wf z(4IZ$Tl$~M~dOibHeeFartuK0Dt`zCe~$jO;ILXsTu`A&7i z(&Pi%BSgll%r{mKLIc3zs<*@n68${evw-J!8=Sv*Z0Q>s8W9n+c)y~ORxf6xmk;`% z^k#5=yTjZvA<%UVU~_WiU3_Z;>Us4^*5%|IQKO_bWTMM046lRhyLJd3ihyh_G?&z%Vayq zv%{8)LqN2%oB)H{(@hiRB+j~e5SQ-6uCTeEi`Qp3nIu%ua?7{+q zBIYFYhy5->pL`DREhT$sL0^ZzHo$0Uu6=@*>*76WP+tZo$1O@&*Bgg}$FKd*2(|{l zqK^*9HIF*9$qS_ar0lklhQ1@s{nq2IW~){jKF2E%tG7Sto`SE`8X7MDO;XcPFGs0J z^J}f~q`~4h>wImoRCRIQa==XX(zxk`Ub)(NawISrd8(n>%>yFHo`-G~NHQ_kgrwsp zAT+6%KY*`28{2FNZ~rb)t(BLZYMdKxkxvcO`XKaawhBmuO7(CYWj?B%od9zdw}_V-7-{^leU7t$VP@W18<)wcbzoG@ZpJvgwch zROU9U|99Iu_2}u`jKQeg6mXcqt5-RXB4?iWrodcjfJs5?z?ZGF^~!FSO@TWUkGwkJ zZvXn|w!FfvB&y!eO$6hdB}iQzN&m3*1j)SAi^%;>`z$Z%f1FAI{;>ai zeq8G@O)R<4K5zFd$&W6$6pA34HC}DJl?Hk2A*v`re;cTdC)g_Q>gw_1X~16`IT53f z_W>h8yXXZi_U6<81(C||92&fC!Vt@MuNxUUC>=KM8<8k4j;IQ-ilTl;oGR1Rpz3z} z_*(|X`!YADhXC<`J$P>KeS>m;)^}k0!FFjH>P(Jy`$dFRY>Yt7(LST5ou#F+j2`?H zGpK9to9RtVUY-`|7neqt)P{HKBHP%LGu;m5EuYr5>3y7K3p@N;_$mehI~-EhVK8id zPt>=S1|3Lh-c4HMB3xkEuP3gIsRg%r?H9=Yx_f};-@ z;)C6M7WyGpyGieKoS1(|2LJY>-5asgeAyC@tjcJ|g|N7DK~>3OyWk#O+EN3-d++&+ zm_Y%XbT!!)A2&LS3LGzviE)P_BBUa@bSk+y^Qj}BucyJH^p0&tpSASp5|&t3t+g&47x zbcFnZ7H-LorjJg`)U zdTvNqvXQ_kCHuPUkyy?u03`fsXOO({CgF+%Xw^eF1z?q{ACoV8olc)gPM)_GksvMz zQeXNHRgscE*X4JASk`dAp7P98=Ue+8^`vl1TIGK=^k$+XBAkD&m445ioOf z;ajl%Fh-g(nu*(JtgkXapGk$fEcjAsZvlJN@c+30O_hcR0{n9SRM_w7B@h~dR2PG^ z^tf4_YEFjiRe$r3+uu1BkEu+;7xZ!pusEEesQjLjt9EkcRC9HJe-S?oKD2iXoTq3t zv;OmoIIl+=NK?RamkCXY+Q2@c$th{UmUV}mKWDXj0qcX5qu*3@ctitPJ8nt$P&^64 zO0zDFzEo!-Qtb>na(e}coTW8L0?5seL=Or|8h~Ink}R74e$>E|>O9~%5-DcN;)U33l8ZnsSlYh?%i$<`CT2P?TY@kbZwBZ0a&ZM+#K zBx0;rcZJ19=!#wxFzhCMr^kV3>E-z3d)4iKe90RP(ErTe8#a?zU+0DY?*zV&!jNbp zPe#%|s=GZNcmFAS0X*2{DL>?B<|}*DUQSb}Q_w}N6ODB|I6pi)MOnD#Q|;beC~6_f z1`0C}w0Zq~{r#r-4PXcGIA=tU4frUn3K`+gesOlkojkht{KjZ8C(Odi_Tom-xjXha z=@lPU5D;E>f}pN z-~N8+^fu^*RPF0>%-gkXJZte1FwPZCWWC?#_5KCJ#$J%y_Wl6rvtm< zta2O8u)J6LCgx-fqsv=vp^lK)#&l^yeF=WC>{z>nU}Z%OGB}?maQV@BYU1cbzzFB zVu)DZdU7-C^bPY62KQ<$8-gvV%= zMWfvJTne4>_!tJ)#L^QC1%q!-UH6$ zWGp=_b41y}H2!eg>JY{Uv>l&jq(<=W=l*@v?8&7jlzNr)_DF2({PpeXCUlEJ!T2W< z&g)Nesg3!4r;hrfbDgiMT0TxvgRE;}e>dP-?L*&|gnc~G%ZiAUG4gf0-a`yD zWZK~lj!W|n4B-NQ&ocf=pgs<=1Z7u~`hg+~L*XwAKX|e@52?QX`8nA-35A5X@PbySJ1M|NT_jvm+YpG%$ZfR(2<)?Q%?%u=oF2%Mi9m0#5$keTplV3KN zM!%9A&A#F|;iw54-P5F`=ed2xrME63_C-%Wzv6OgFASjV;#&u)-C7jWlpDC1iFnm| zurWG(G#Bw)rD3lymV54(bVk{uD5OhdV@*PwspoO$_7&ICZO?4k@<}vX?;e}}brVT- z)oD&RdDr*Fa&w{T>VduNVLxd4fPYCX3D}-vx?Icracj-!f=QAk+78y_~ML0l>99YK;L+t2L*O{8oHQ_9bF z<#QF!)EME#VEn;1#`3MlgF~uRb=EXqN}?HfvbtgpJ4w9z zgQCxd6RuWopW=SIS1Z-XxQ5`~IywrOM&YC=M0pyWK6ysXn)xUoMM zQ<&)(dUDwJ?V(?zg@jbxx81SuAMCZ7z;AG1bs@Np#&E0xI$ z_Za5){w4xaj!sWgE>9U^!2@%R^Pie{B~7d=awJ44;eyy({MfB~Io@WjsXk1f&xJma z{c_E(UaM=8mkU3btO|OZZL7kuWcN?_za7`OYE*TlzDHM)VBIg=HsZYbQB;_Q?V_$? zrzC>UXNepY>jPO1gZHGcL#}Iz2d{4vjK3nZvJRVh+5jxOxV%&R38MP(qS51B@(&$) z&l6g?GIb3LG#wx{)-809#en&1D-N%FCqnpjNa1!M0Z$IJuKD*8Sr0YmTDV*1xbJGJ zyhy`<{qf}cZw`X+gW~j(X>2M@Pz%<&Gfi4<15OvmzJAn9QvSL?EF;gn17>@b@*1q+59VJ@ugHmH##_8PSPQ(W#xeXN< zfmRh;O6KwSeFEr6gS=qOb8S9f-jg~G$q-<37Zjl0=y5v=7a)xD7}1Tch}p4a4$(qs z%SFq|4bb6J^#R_M4@iM2BsPy4(R_KJ6D6=?+ptqbX(2yAn!$s0lDz;M>KV*03QlSmP}LRAJvEUe6y zo44=3Bovq9R3--F;|4{Z`S*Y7p>zRI2E1;VOJp5nT)D6)P|*RB^5MgF&Q0%a$6@9s z7mj`raXVOl<&TOiFz}w$yQ20muVHMJxH!aT>@ft@nnREWyYBe^QUuKSB}8h z{#(4*QksNkvEb-FElQrI_c7tc$z-h%$(+Hf2>t9@ui20BE|;KbraEhBTF#XgSq`B6 zET7*;$oPP%ymQ5?6Hp~<+bsVq8~@7p`Eq;`8MH6A2_e}dN$(h1Bjo=`tqZdiMG>UGQDoHK?O zuwxYtEG#;rY5`_>hbul=X6(aNhR&{Z>O`_?7(w-X{pdOv3bs1;J_1EVq^q*1)FjdTY7wTa{V z6+bYZm9Y<#`~EV$W~wXdW>vjZOUBa~u^;HdpC)3({=-MLQMWbRIs?^0=ol^bx@ z>#lQ9QAA?(#1AFrN$~jfo0valZrg6fN=g*`C9ivb z$XFZyEx~;pdUV6D-hW}_^tceaAFg>HM$;xssrM;$M&mu z1)pG`El(-XjrSF036R===GCv;KM$klY(FQ#w&G+yZyA@qrc_CCQwidGk&OxXCB-l2 zy~*&iK|2`$cr5jWMZn^kL#!oUq#3ZXQC|+NHzXV$=FA#2PUGr|u zb&?h^go?wU8!UU7qjZ|c_48aFqZLGFcLr^++tX(6u}M&h3=|!ZI`p-HmE`4-?Zrz2 znM7Y}V$6~T^gRzwO9@M_4_LG-NpO=*0TE;lo0u3r5x>yqvaryLc>rO`N@S6~fU^M2 zjUiEpm+`2$i=5LEBZi16#ZgQIwfJ*_Z#Djt+W4x0Xo)b3UbNZIpUdgAlK*se#vHy{ zG2*=w3~6u+92_*M=D;w}8kBLa((Ojn(q>0_>Gbm}JE{iGf@l z&f?Cjnv-BYM`Q$v^)bH7GQ$dipqMp4zV_#ochb}#zJJAiZDL1xlfy8NKH8z;QN?5( zow&J?iM`~@&|nQiQkW29pUk$rzLOo-rP2m$GC~WnWA%B+@1`+2laq&G`h&8)ZPb2M zxTW{R+=liyzEThTp*zVA7g;F~WPqnKp%@u{;ePhw6orFr)>A9qS_~HIzP|gAhY#1V zc-JLt0XlT}`sXFT#|pY#tqUQnu_YSQ`>lGzgWW={+K#4*{z>S4EpW>$Z@D5{>+qdw z)!(l}hIg~KFbv5sXXm1DHzs>!oTyPgT)`JBQLgP zVbYKE4$7T*p{f?~Y2V;{>pwFhBJ0^8$;hex%Nb0Ord9s0yr z8uA@_;2TS?Q?<0oP|e&4*Xc*rfKyu|#*jhy0}DMrb2&XV_3_(IEMpEV+j=^5nErL= zbBI$Meqw0XMpfO5i)4P^`(^Ldub6xoKL!Vau|;=$Ur+z;7R3^|ym(ypO}fm~Lu|*+ zn&$guVt&#XRsgNZy-@*B6n*fSN|;yhWfNiaMt~^nx8&vRQ~Tlw1voLLPm36?gU++6 z0ci}?wha=a?n-RFRDE=F?RtI^>x1=Ldr;g)UB-Ef*7<&0;f?pTs7g%S-Qhy7{NXpr z*~`t?!a|4o@!Z>Yq&}YU7K_--*JZA*_V|lvZ~usuU}FCI;YPr9{c$(9dZiE{n<^;= zl$TSDg9}e^aSs(FWJ8vEKLbW@QHay|ZyrxRaZB+uAD9_3B$YY$sk_cJj%2*=q2QEe z=jcD1#F0KsB467^ z{W)6&Q~8i#a8LReR!mS?uF)jNy`M_@At^TW=0)qk=G)sWVN?CgDGU{KK3U#=vz{V#A6Ze zj8L?+bUv&bVrnd!#Pk^}rgy_DVWSXq*jFgyIyAsr#UgIQI>XJ$lMGt85-76n%-^pV z%oKQ1@ss{*mawSoOUGZK4pkpJ0Fpew4S)g#C0*)*d07kxW@sT~COiE*%ZaaTG*-0)QY-9^80a4%Wu>4=(URj4fMiuHjp#s~)!5M5aGJO` zX4}vTn?&{Zye5B{rjWJBb(-bT53ES0ACaSUhm5MPgEn&!|(%rowhLVt9U3IoS zwWnVoE-qx&0)OYJ5`FQ80UmeU2jI?Cw)AF~-84BThQPX&L$5>r?)@-m)I9oT#|HvW zxrzyu1)qevp?ONwp>QVw(0(uy_C&xHk2SH%SzY~IzCtvN93~U{lmLLOx1Y{_j&dUg zXLl1B_`oRN7E5dJV%eqEQ>=;$0ngm2`^kiVk3P_X>9aIO+lE-S-nCI;Ttcg~Owr?E z30R3b5_4N(tF1g|5`5P6an=KbgVQ|)H7i?+0wO#ZWF~K5MG4wtS`2IVhf(g_g~B2e zJI(}Ou*>T613h`j(Ac-P$LTev_+V9b8wI5NuyGSAc;{y|DkPOh|qHNSa6TL8T4_z;m?u)*@?Z^?UP+5qI0+5JXMoyGj}Zx!vD z^6~^TC_H^Uz`&!&;9*|>_U(MnK^>yyRW2W}0I3Y~ zjrp##|C`D9dZYh?ME4Y!S4@3f#o>{s*PMu#OX^$;J$(A7$$5eJZUt}qfa7JmX-flWnJFrb6_Z8<)8D47 zVLxQlLDv0OnLpEMoPS?oGtjNwJgss|-~UEPJ{c3}1A%)`Ky&Wg6@zz+>x zz)7r${8^X0hjrr_m-BBa5?}-$%#rHt>$CL?GC&Nx2Pr30|M3#G1;Of{k_z=R(oLd(LmDtJS$Wm~f+ zu^b)TMOZ=Om!UTObW>`*oBe9DlG+2_-=sFF^y#snaJOz4uqG(wx{QnxmRUwxjPRJh z{1X@kid9mvEqK5M=dI)O7(M?ttoeN;2)|E97*U`ZGdv66cPU=2kcG%aZfm&09>Np} z{f#EGr%#EXa!r`)h0|YZEVQ-MPy~G;_Q{;~6%Q>^Pc__7Cf-dFOaj}WZsCxm7dZk2 z;O~$^lMqpDNd(`6qXF@84*Pl@c#n>N6)#rE$3^caxs(U8x7b;WgtBMI(VFU(FyT*} zy;jn=g2!-I+&zIw57-BZ&ctXcVCn2&K;V-;+QK32#x$^EEa)z*LN>KH;tmas!qXZZ z{0wFJGF1-2Y`E_|8$R?#xhG|ChZ2fyo4JJ-Rz?sSpaApjvNGRz9@w*cQRfaf)K{)2 zcGm|PHw{Eg$q|Q%a|$cM*h2Lu8wu9Bwu8a|d&lXL%4Dhw@YiJMjMgRTem*It3#c*l?^-yWDuj;h% zYN>-Fr@m~1FO7|EVk|?i>$^UG_SV+HTwe!%Mbhv==e&c`eq4rSyGx!5UJ9!H6^y2( z`+d0=>QzJX>%_<};)n>Fd5b6{gJ2&yQC*sM|cm zB4cnLsfX(r`9v<|Cgv$J`2hDwvzrNO$AJT6-PFFkR1}UH+?WiXj}rOQL(GNhZ;0rQ z!Q9u4Ue-wITN|7;iN?xH!+5b@2xAn&krT+>j4!{}{aCMPt!6jjRQ*96`6zO9P=`2# z=AWQWUEQeQQK{2Tz{#sRM=5ljOElVsr{X+F(UMrRv9XcJ-5nm;@5W!mpk?1IRAyrA zMja&*2QO=6^r7WUs<12o5(oJK;Qg;$X1#$G_M5n31|wpz{B||IlHD8+1B@Hvl5P|z z9JFg14OsoYjc1r*^Dve}dzS=`G8Aa)S9d4ei2~@XcgDU*<1S+=XUQ|rPz}c{=r-`# zUQI@a8=8n})FoiRmNW^<9a2wcV_DZso-&Maaa-mu^z% z*P?mcN?ssZ@je?5C`br)$Zfx# z^5gP;r17Ex*-R+LQ2M@3VOzb#SHvNTjYr`R9w$?NZgj8lMTz-1LoK1Uxm+$cuMiL& zdShC(AKH|-HsQE}Z%aoxopQ3vih0;uTfgqKVXa*#TQ|YZc<}mNUh)_F zt5i3NF`K*!v>%H9W=rcGR(OTHXFAi4e0s(^)&IdhnC zBls&efU<@F?zQcya$~K*RHywNnUTdI#>!;j&&p#08vP=*96mSorczu$efD;*^u3zr zMPf{{nG|1kWIkHWZ6Ox(82C03v!jpAPya{{bd7#RUZAP>(zp5Zx=*yScHjk_ec+%{ ze-x(cxttSG+NfX9JEd3ujxqE2i!Z5=02#tiuA8-+i#vN1FG@;EaCfTZt4V}w4Cb4% zU_?wa_kvH@t2+$V$`WHwdL!@MGFyf863O{v=kxm-5|vnrR%vS<7XemjAS_|`{4Vcb z=}@rbKjYl+6Rc7qn^CDRe%6c}!ZDjTde1;M|2Jyf9#LCV)vi%NDb=F2w<X%JF^~vm$ z6fY(CFYSD7#8w^%blCo!Z;o_CdC{r0>nAxlr1jD%kErP8%^1^M62rE$MhG2(bd`~k zl0hHa==hxy1T}&CooYNA;-%z;t<$CmmrXOHx#cx>2=U?M&@Uf4%3(b29=RV-WDwEE z!os58SJSsV*%;u>xfsbv@w-W5^0Cd&FXAkGUUbAp9iJ=pW;_n#hY>L3i5k`rVPnSb zf$8Z(-$C)j+)4Y%kAxGEA&u*q9? zENZ~k2ki?AtU{m5p5>`Y(+(Q)^h@`Iqeb$WKCo|7>PU7Km?k8=e;<_q1}7|8TPdO2 z$}wZd*=sNCGdTr6W}uk9WXR$7VBT2f`u7^*m)+B3VxihKO3@;DQ>KCdDo*Ea zunTR}CDh0tW{W3#~1^*Fu(0mO0orOwIe zBYUTuk(Bhbp;Lcu1R3nt8PP+aLjzfN=3VuESKkovQ_#&pamY|KZKo@pKA@2r;8*#2 z9DchUe+LC>SI0*eZNkNE=4vnZx`GzV&kk<%dC=ht3pH;BwQ{1_2emd)yw)^1cRm^V z9|`CCTFI`?#Xa6mP<;Yh=P#4f1%a6g2%xS7jnD$4PLB;!Ixya9I$pAV9`p83E(Rzq zzeO?BHt)rMefS-&;$fWX*TMqRvMh#g@}-07wy4++#AGoS}W~fCnV8mV4Lf}u973Qo5BPz{QdOl4!(va?k^AQ@^tTR zo&=#=aI&tZ8Lwys;RL5(v|N8wk!8=~sNX4x=4je-(-Rq2e2VJVVPS`lyghgjc<6no zDvWJHD$N>rkcfAH+k>hsXlR5KPDA`KP=cK3(JJMaI5uf!y3pg&)upc*j=KBmmX?<4 z>K}7R1X7dnmSs4HRd{xGQBBK?D4U5KX@z=#LJ3CkN{{Vd}B*CYe$ z24j90m;u1g@|A3of&N7t4WHQcHv)lHBhT9U!9&R_Q@qI3<%smZM)%meIOMF>iUwkj zEs1UWd)_xozg_A9fy*Tzc*K?8z-)F7PN4}3@0hA}mkS$WaDyShBi^$m&ll=K?Qi?q z7Ckf;RtLo1C`%H)vpgWu-N3or6?_uEiWj@gcw!o$o8m%R2uDa*H72WX$&*7vqFVN+&y>h???amqXFgQCK)df8G1o8Zd73>Z9y zeNYp;-ynk<%x1(JSiychR4W1e-i^5-roxHIVi1-qOI7KTB*@nXu;G)2bS423Cxn77 zo%XbLX3a=Wg`7e9r8@Mf;MlbXGz*mHmQL9BPl1nyU+pn>G2+95+-Q1fzlG<_;f8n5 zeLUmtE3HU{%;#P^^|o19146i2!Gsp%E@=e&wBhQi|DCbfF=@oMhz|vISkt%KjDPG` zOnp|9k$Z!(pz5KIN8qIfHhv_~nlraLWq&|U=rR?P2v*hC6G1)k3=Yc^E#u*un!36Y zN$$a!_uPY5NMvW^)eYe89r6u6HreFR{W0E+v#Pn!w$y@4<5vF`BrN{v{nXw9X*H(A3R5)eue|PS6Zopw=}rduGAY?yK5kG32-Pw@Yn$mj z98Nk<)Qpd@V=XW$h01^E?7z9xo@z;Bfq$gR0>9L#1*X8ZY~uanL3$E_tK1G zbW78V$%z5�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

`e4+Q}cJdkFIy!&WYh4>OJW34HZ_u+vxSM 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[yS;!^}r~q`wva` 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 Ya-S__o>|0H1TvVx)78&qol`;+06q0ghyVZp literal 0 HcmV?d00001 diff --git a/public/images/mystery-encounters/buoy.png b/public/images/mystery-encounters/buoy.png index dee7194365054238ce1e082ab53edaaaa5b192fc..fb957ac29f044619e91e639033a76a75a505f060 100644 GIT binary patch delta 1641 zcmV-v2A27`4XF)~F@H%(L_t(&fz_H{NLyDN$3H1Ti=|pD_y_G%5Yz|lgG0n@SULua z<5DgZ%ux2=3VU$viw=cC^ht|S#@dHL>BG>rVz;n9n3t{S)<}^KW~8J=DP^cAr8q$%jdiz z4$j_P+xE~^T5CC%cf_4AvbvrWS@Mo}B8pf(+hqcI7F7~n71xT(Sljjxi|=ASe*};e z$MX^)Z?gd8@qfQUM#6cgaR9?G51T^vFbva`JPv(vx+R)7Fbq=|hAAX&-@dJ0$=5|G z32P+PVHjq9l9!|t5^*Azf8=eX(;=N<2M@zA#n)Fy+!9Jl{=lM&VVL6n{U7jnJfLmi zf$pFpcK60${%!5Lw;OzZ0f<0%P%OUM5JCts7KsYo2!Aqo{6KcjKzC4F_$tWU@?QkH zg8+<0q5xE%DpA+ny)g(bbCd&`H5WoaM}|cE%l7gE~xjgCz0xw5;|Jyi9h+pabBt- z0uC@cY=5e$qN%2e@!17F{c-@<^LqU3*?rwFryiFw(a}^>ML6+(?%4{*m)|(fJ$L#j zHNQ_o3OVOoDjhBL%EN;Lm(=;CjZJ3EcG^yyq^{_gWsXy&Z^waX{Lb|O0A+x`-Bgjp zPFliVG~1E0sG>&`8A0^O@_AWZ(ww#vCpmZeD1QLOGc#%V<<#SnG@urye(qXb*}m_c zlc*Bt4hkuc;J`QPyxer8Odc%1Njf02Ody9IAD>;IsiulM*9R=x))yr>XG&^iK(3} zMt@e<8ChK?7T;B*-N*!T5LFs{esS-|F-zhEdru&icml?i%PHqSSbpQmF*)%wFo@7NM zVGq157)Ja0ncCU19CFji2JbAY1iFJ_aDU*E@^(7tO?v%j!9ziyJ1FdE@cBi9&o35V zZHTc*RMwgnbd}bM?bg<;TM@23E(=+wO5Cn(*jtqI52w^MbF3($`rO{iavm&a-f;Fs zToPN_*d#XpSVSY?wAV)?Vb5qEVw61tWODUu!D~p$PXw`e*1X-3)*rik zeS4xM4S-~sguKnV0U41|WL>4TqV2>9Y7ohb=_yQz$jkbmBm)sE(I zg?Ex2>i=jMSzWiZ6Qlt})6M*jpuD+nI=om+S`W~=$ zUDF|5=Suzz?uK~AIIjOwXKmXI?s(Ey3VtWFqxzx48vqB z{x&-3UIF;~yKgP|382EJ9e+=nK5mKFd!%*PHy?dbHq}(QB0jaV zm9n+0!y=Wci#JucSh;yI>EaLmDTInb0D^0OCXM$D57Fss@BoZOqQY)SV`9^i`MAs! z?XBcOe;*~4UY$#l5gwha#OCUA06r{Ow4DEA(^-eovy!yLSR|_MEndqt^Z6soHHjok zj#23Ev)sF+((Cx01=1Sb0D1Axt8Xu?jxUf3nJS)CHKq=obSkpC=N)yF?kPCob$B?f n9z)({VfVC~?{t!gM8*xs>4t7^o=f}-+;fhT`JaU*lamG}g3mcg delta 1674 zcmV;526g$V4Y>`FF@IS}L_t(&fz_H{NLyDN$3H1Ti=|pD_y_G%5Yz|lLx+gjuyhO- zM<{`U8Ok19VGpi-(Gj5#ebUZQwzUs~(ubjK#cp9On3t{S)<}^KW~8J=kup@2Qk}-F zSQwl=BDJZ@zfyFkdgqFCBa6 zF0U7T)sq` z4%XgX+jh`hUT-*8aKx=JvbvrUSqhGLGKv^Jn`Ht87FCj76<13uSlf0Gi|^uHdIXRX z#|si6XNv&j@qfQUR>B3RaR86Ud(ag24v)ucOCATlIPDTG7_ zBqUPXT7O1oYa{U|zgW&oS42P_!(nq>4b62mjLppR@#h0T!t3!fXZCf!oO)c!L`QR7 z4dLYb*=H*pU4Csj_w32T)crmMY2=)9sdTnBDi041TvX>5H#V8}cF=z8I1MF740Eh1 zeKYc+@!Qu10F(jl4zG$NX3`SoqS=g`MHM}o$bSf;N0v`38dB!8A3M(3lZOE)ou1Cf zFQ*=tqye=s^>bGnD)xQvoJ190Pe4d{1O~oQ=jEm&W%6M8b;<$RWdb?$_}I)m&2=^0 zzBXXcw!SFAO5=i9d^hX;b4ENo9wIpRnBL(b1_v%ud!kH9L?T@@vC{;~iBw{9k8yW+ z>3fd84kJW>;-Qvs`z>WVsPN1@^&WZO?v%j z!2^M>Cm_sda=As5%PkgOZivxHRMwgXbeGqQ?Y6c(_fTwmTo$rcmAF~kkXV#+4=2@_ zSymKLeQsZMB@dRfZ#erRE{QE}Y!aJ$ETWNc#_`ce*b($2f+P%($;Ofk0zH}wH}&WZqZ#{ua1zjMQpdV3GLU1J;9d8 z&0Dn=3R&a$ z;>ISOt&OTL0&sfaIg>kE>iX=n6@P;MetL(8)B!N}a8g~4_o|xcDgDa!a64Icczn^JuhbkhxOOIp|Xir+t>haSH&ynQy zRzg*&PzHp@Lo}RvM->Xv`{qPT8UU#>2{~JI1F|Bk$hynxMf3hJ~bxEL2i+?Ge}DI_AwL0B*firw^GCLc{THbS^H0;G@lCa; zAVFG(dGpa1WpiDPE#i|qTWMR%It)^&xo|^;iV|f2o=f}-Qb~pSq##N-0000E UWmrjOO-%qQ000080F#sk71vWLd;kCd diff --git a/public/images/mystery-encounters/girawitch.json b/public/images/mystery-encounters/girawitch.json new file mode 100644 index 00000000000..98830a00a72 --- /dev/null +++ b/public/images/mystery-encounters/girawitch.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "girawitch.png", + "format": "RGBA8888", + "size": { + "w": 46, + "h": 76 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 46, + "h": 76 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 46, + "h": 76 + }, + "frame": { + "x": 0, + "y": 0, + "w": 46, + "h": 76 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:e68bbc186f511d505c53b2beec3c3741:7108795fc29d953a1d3729ad93d70936:1661aeeeb2f0e4561c644aff254770b3$" + } +} diff --git a/public/images/mystery-encounters/girawitch.png b/public/images/mystery-encounters/girawitch.png new file mode 100644 index 0000000000000000000000000000000000000000..a1cc7e8448dde6114fc76dc6583621af0d79d51c GIT binary patch literal 1021 zcmVuL@r@OMpQ>IQdU-GTR(GV4k>4ck85vza}X|gQcQSN5R8nRl$4~VA2_Me z)Ub0d!JMQvg8b*k%9#010qNS#tmY z3ljhU3ljkVnw%H_00TuyL_t(Y$Ca1uf}&GAFyP<@gO?!DT6N9NDu)1WHC4{KB@zljH16;WJS^mKh7_zA@(Z9jrS4f zQc{yg8i>EbwO-*H5-suDJf|x8ff%`To9fJKExeAWo>GuUX!b8HIKKWyQ}D@p;0niM z4~r3LmUGIpa*?x%KfwVLAXcRf0l;$3aD0JEcw$ISQs1UK5T2!r_?YW%C*^J`at-52 zJRCM&G$&0WOW(fkXEovEaKMjijE}t_DY^=mXW@7_al1#_7Zz{A@hp=b9)c@bCvfBJ z%ZG~$l5x{KD)E@AjxNi}^PSxtVu-Ut@f$)Fx1oij`B334cK`Aukr z$9%j>xbb0E$HW(z$6dv{pnSfoO|HD~vT3Ysd*spLro{%3czfcLe*GJe{!%$qUR&B| z)N`b<9UXQx#n95CV9m|*)Fbs*;Qj?^kPlEJ`&1-0wl$tSP_;;U7CYZZ{<6qlkyhW1 rkCHUO6IVq}Jr%OF?t(jM$W87qvGQf@b%O%m00000NkvXXu0mjf)lS`E literal 0 HcmV?d00001 diff --git a/public/images/mystery-encounters/starry_background.png b/public/images/mystery-encounters/starry_background.png new file mode 100644 index 0000000000000000000000000000000000000000..759c624ddc1134067ecf7b29e94c9b1d9576219b GIT binary patch literal 10232 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 160 ? 7 - : scene.currentBattle.waveIndex > 110 ? 5 - : scene.currentBattle.waveIndex > 60 ? 4 : 2; + : scene.currentBattle.waveIndex > 120 ? 5 + : scene.currentBattle.waveIndex > 40 ? 4 : 2; regenerateModifierPoolThresholds(scene.getParty(), ModifierPoolType.PLAYER, 0); encounter.misc = { numBerries }; @@ -178,15 +178,11 @@ export const BerriesAboundEncounter: IMysteryEncounter = isPokemon: true }); - // If player has a stealing move, they succeed automatically - encounter.options[1].meetsRequirements(scene); - const primaryPokemon = encounter.options[1].primaryPokemon; - if (primaryPokemon) { - // Use primaryPokemon to execute the thievery - encounter.options[1].dialogue.buttonTooltip = `${namespace}.option.2.tooltip_special`; - } else { - encounter.options[1].dialogue.buttonTooltip = `${namespace}.option.2.tooltip`; - } + // Get fastest party pokemon for option 2 + const fastestPokemon = getHighestStatPlayerPokemon(scene, Stat.SPD, true); + encounter.misc.fastestPokemon = fastestPokemon; + encounter.misc.enemySpeed = bossPokemon.getStat(Stat.SPD); + encounter.setDialogueToken("fastestPokemon", fastestPokemon.getNameToRender()); return true; }) @@ -232,63 +228,68 @@ export const BerriesAboundEncounter: IMysteryEncounter = ) .withOption( new MysteryEncounterOptionBuilder() - .withOptionMode(MysteryEncounterOptionMode.DEFAULT_OR_SPECIAL) - .withPrimaryPokemonRequirement(new MoveRequirement(STEALING_MOVES)) // Will set option2PrimaryName and option2PrimaryMove dialogue tokens automatically + .withOptionMode(MysteryEncounterOptionMode.DEFAULT) .withDialogue({ buttonLabel: `${namespace}.option.2.label`, - buttonTooltip: `${namespace}.option.2.tooltip`, + buttonTooltip: `${namespace}.option.2.tooltip` }) .withOptionPhase(async (scene: BattleScene) => { - // Pick steal + // Pick race for berries const encounter = scene.currentBattle.mysteryEncounter; + const fastestPokemon = encounter.misc.fastestPokemon; + const enemySpeed = encounter.misc.enemySpeed; + const speedDiff = fastestPokemon.getStat(Stat.SPD) / enemySpeed; const numBerries = encounter.misc.numBerries; - const doBerryRewards = async () => { - const berryText = numBerries + " " + i18next.t(`${namespace}.berries`); - - scene.playSound("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 - for (let i = 0; i < numBerries; i++) { - await tryGiveBerry(scene); - } - }; - const shopOptions: ModifierTypeOption[] = []; for (let i = 0; i < 5; i++) { // Generate shop berries shopOptions.push(generateModifierTypeOption(scene, modifierTypes.BERRY)); } - setEncounterRewards(scene, { guaranteedModifierTypeOptions: shopOptions, fillRemaining: false }, null, doBerryRewards); + if (speedDiff < 1) { + // Caught and attacked by boss, gets +1 to all stats at start of fight + const doBerryRewards = async () => { + const berryText = numBerries + " " + i18next.t(`${namespace}.berries`); - // If player has a stealing move, they succeed automatically - const primaryPokemon = encounter.options[1].primaryPokemon; - if (primaryPokemon) { - // Use primaryPokemon to execute the thievery - await showEncounterText(scene, `${namespace}.option.2.special_result`); - setEncounterExp(scene, primaryPokemon.id, encounter.enemyPartyConfigs[0].pokemonConfigs[0].species.baseExp, true); - leaveEncounterWithoutBattle(scene); - return; - } + scene.playSound("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 + for (let i = 0; i < numBerries; i++) { + await tryGiveBerry(scene); + } + }; - const roll = randSeedInt(16); - if (roll > 6) { - // Noticed and attacked by boss, gets +1 to all stats at start of fight (62.5%) const config = scene.currentBattle.mysteryEncounter.enemyPartyConfigs[0]; config.pokemonConfigs[0].tags = [BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON]; config.pokemonConfigs[0].mysteryEncounterBattleEffects = (pokemon: Pokemon) => { - pokemon.scene.currentBattle.mysteryEncounter.setDialogueToken("enemyPokemon", getPokemonNameWithAffix(pokemon)); - queueEncounterMessage(pokemon.scene, `${namespace}option.2.boss_enraged`); + queueEncounterMessage(pokemon.scene, `${namespace}.option.2.boss_enraged`); pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [BattleStat.ATK, BattleStat.DEF, BattleStat.SPATK, BattleStat.SPDEF, BattleStat.SPD], 1)); }; - await showEncounterText(scene, `${namespace}.option.2.bad_result`); + setEncounterRewards(scene, { guaranteedModifierTypeOptions: shopOptions, fillRemaining: false }, null, doBerryRewards); + await showEncounterText(scene, `${namespace}.option.2.selected_bad`); await initBattleWithEnemyConfig(scene, config); + return; } else { - // Steal item (37.5%) - // Display result message then proceed to rewards - await showEncounterText(scene, `${namespace}.option.2.good_result`); + // Gains 1 berry for every 10% faster the player's pokemon is than the enemy, up to a max of numBerries, minimum of 1 + const numBerriesGrabbed = Math.max(Math.min(Math.round((speedDiff - 1)/0.1), numBerries), 1); + encounter.setDialogueToken("numBerries", String(numBerriesGrabbed)); + const doFasterBerryRewards = async () => { + const berryText = numBerriesGrabbed + " " + i18next.t(`${namespace}.berries`); + + scene.playSound("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) + for (let i = 0; i < numBerriesGrabbed; i++) { + await tryGiveBerry(scene, fastestPokemon); + } + }; + + setEncounterExp(scene, fastestPokemon.id, encounter.enemyPartyConfigs[0].pokemonConfigs[0].species.baseExp); + setEncounterRewards(scene, { guaranteedModifierTypeOptions: shopOptions, fillRemaining: false }, null, doFasterBerryRewards); + await showEncounterText(scene, `${namespace}.option.2.selected`); leaveEncounterWithoutBattle(scene); } }) @@ -312,12 +313,23 @@ export const BerriesAboundEncounter: IMysteryEncounter = ) .build(); -async function tryGiveBerry(scene: BattleScene) { +async function tryGiveBerry(scene: BattleScene, prioritizedPokemon?: PlayerPokemon) { const berryType = randSeedInt(Object.keys(BerryType).filter(s => !isNaN(Number(s))).length) as BerryType; const berry = generateModifierTypeOption(scene, modifierTypes.BERRY, [berryType]).type as BerryModifierType; const party = scene.getParty(); + // Will try to apply to prioritized pokemon first, then do normal application method if it fails + if (prioritizedPokemon) { + const heldBerriesOfType = scene.findModifier(m => m instanceof BerryModifier + && m.pokemonId === prioritizedPokemon.id && (m as BerryModifier).berryType === berryType, true) as BerryModifier; + + if (!heldBerriesOfType || heldBerriesOfType.getStackCount() < heldBerriesOfType.getMaxStackCount(scene)) { + await applyModifierTypeToPlayerPokemon(scene, prioritizedPokemon, berry); + return; + } + } + // Iterate over the party until berry was successfully given for (const pokemon of party) { const heldBerriesOfType = scene.findModifier(m => m instanceof BerryModifier 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 a60c4ff4c05..2f000742ea9 100644 --- a/src/data/mystery-encounters/encounters/fight-or-flight-encounter.ts +++ b/src/data/mystery-encounters/encounters/fight-or-flight-encounter.ts @@ -1,4 +1,3 @@ -import { BattleStat } from "#app/data/battle-stat"; import { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; import { EnemyPartyConfig, @@ -7,7 +6,7 @@ import { setEncounterRewards } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { STEALING_MOVES } from "#app/data/mystery-encounters/requirements/requirement-groups"; -import Pokemon, { EnemyPokemon } from "#app/field/pokemon"; +import { EnemyPokemon } from "#app/field/pokemon"; import { ModifierTier } from "#app/modifier/modifier-tier"; import { getPartyLuckValue, @@ -16,15 +15,10 @@ import { ModifierTypeOption, regenerateModifierPoolThresholds, } from "#app/modifier/modifier-type"; -import { StatChangePhase } from "#app/phases"; -import { randSeedInt } from "#app/utils"; -import { BattlerTagType } from "#enums/battler-tag-type"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import BattleScene from "#app/battle-scene"; import IMysteryEncounter, { MysteryEncounterBuilder } from "../mystery-encounter"; import { MoveRequirement } from "../mystery-encounter-requirements"; -import { queueEncounterMessage, showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; -import { getPokemonNameWithAffix } from "#app/messages"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { TrainerSlot } from "#app/data/trainer-config"; @@ -68,17 +62,21 @@ export const FightOrFlightEncounter: IMysteryEncounter = encounter.enemyPartyConfigs = [config]; // Calculate item - // 10-60 GREAT, 60-110 ULTRA, 110-160 ROGUE, 160-180 MASTER + // 10-40 GREAT, 60-120 ULTRA, 120-160 ROGUE, 160-180 MASTER const tier = scene.currentBattle.waveIndex > 160 ? ModifierTier.MASTER - : scene.currentBattle.waveIndex > 110 + : scene.currentBattle.waveIndex > 120 ? ModifierTier.ROGUE - : scene.currentBattle.waveIndex > 60 + : scene.currentBattle.waveIndex > 40 ? ModifierTier.ULTRA : ModifierTier.GREAT; regenerateModifierPoolThresholds(scene.getParty(), ModifierPoolType.PLAYER, 0); - const item = getPlayerModifierTypeOptions(1, scene.getParty(), [], { guaranteedModifierTiers: [tier] })[0]; + let item: ModifierTypeOption; + // TMs excluded from possible rewards as they're too swingy in value for a singular item reward + while (!item || item.type.id.includes("TM_")) { + item = getPlayerModifierTypeOptions(1, scene.getParty(), [], { guaranteedModifierTiers: [tier], allowLuckUpgrades: false })[0]; + } encounter.setDialogueToken("itemName", item.type.name); encounter.misc = item; @@ -105,16 +103,6 @@ export const FightOrFlightEncounter: IMysteryEncounter = }, ]; - // If player has a stealing move, they succeed automatically - encounter.options[1].meetsRequirements(scene); - const primaryPokemon = encounter.options[1].primaryPokemon; - if (primaryPokemon) { - // Use primaryPokemon to execute the thievery - encounter.options[1].dialogue.buttonTooltip = `${namespace}.option.2.tooltip_special`; - } else { - encounter.options[1].dialogue.buttonTooltip = `${namespace}.option.2.tooltip`; - } - return true; }) .withTitle(`${namespace}.title`) @@ -140,11 +128,17 @@ export const FightOrFlightEncounter: IMysteryEncounter = ) .withOption( new MysteryEncounterOptionBuilder() - .withOptionMode(MysteryEncounterOptionMode.DEFAULT_OR_SPECIAL) + .withOptionMode(MysteryEncounterOptionMode.DISABLED_OR_SPECIAL) .withPrimaryPokemonRequirement(new MoveRequirement(STEALING_MOVES)) // Will set option2PrimaryName and option2PrimaryMove dialogue tokens automatically .withDialogue({ buttonLabel: `${namespace}.option.2.label`, buttonTooltip: `${namespace}.option.2.tooltip`, + disabledButtonTooltip: `${namespace}.option.2.disabled_tooltip`, + selected: [ + { + text: `${namespace}.option.2.selected` + } + ] }) .withOptionPhase(async (scene: BattleScene) => { // Pick steal @@ -152,34 +146,10 @@ export const FightOrFlightEncounter: IMysteryEncounter = const item = scene.currentBattle.mysteryEncounter.misc as ModifierTypeOption; setEncounterRewards(scene, { guaranteedModifierTypeOptions: [item], fillRemaining: false }); - // If player has a stealing move, they succeed automatically + // Use primaryPokemon to execute the thievery const primaryPokemon = encounter.options[1].primaryPokemon; - if (primaryPokemon) { - // Use primaryPokemon to execute the thievery - await showEncounterText(scene, `${namespace}.option.2.special_result`); - setEncounterExp(scene, primaryPokemon.id, encounter.enemyPartyConfigs[0].pokemonConfigs[0].species.baseExp, true); - leaveEncounterWithoutBattle(scene); - return; - } - - const roll = randSeedInt(16); - if (roll > 6) { - // Noticed and attacked by boss, gets +1 to all stats at start of fight (62.5%) - const config = scene.currentBattle.mysteryEncounter.enemyPartyConfigs[0]; - config.pokemonConfigs[0].tags = [BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON]; - config.pokemonConfigs[0].mysteryEncounterBattleEffects = (pokemon: Pokemon) => { - pokemon.scene.currentBattle.mysteryEncounter.setDialogueToken("enemyPokemon", getPokemonNameWithAffix(pokemon)); - queueEncounterMessage(pokemon.scene, `${namespace}option.2.boss_enraged`); - pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [BattleStat.ATK, BattleStat.DEF, BattleStat.SPATK, BattleStat.SPDEF, BattleStat.SPD], 1)); - }; - await showEncounterText(scene, `${namespace}.option.2.bad_result`); - await initBattleWithEnemyConfig(scene, config); - } else { - // Steal item (37.5%) - // Display result message then proceed to rewards - await showEncounterText(scene, `${namespace}.option.2.good_result`); - leaveEncounterWithoutBattle(scene); - } + setEncounterExp(scene, primaryPokemon.id, encounter.enemyPartyConfigs[0].pokemonConfigs[0].species.baseExp); + leaveEncounterWithoutBattle(scene); }) .build() ) diff --git a/src/data/mystery-encounters/encounters/weird-dream-encounter.ts b/src/data/mystery-encounters/encounters/weird-dream-encounter.ts new file mode 100644 index 00000000000..d556a3b0c82 --- /dev/null +++ b/src/data/mystery-encounters/encounters/weird-dream-encounter.ts @@ -0,0 +1,541 @@ +import { Type } from "#app/data/type"; +import { MysteryEncounterType } from "#enums/mystery-encounter-type"; +import { Species } from "#enums/species"; +import BattleScene from "#app/battle-scene"; +import IMysteryEncounter, { MysteryEncounterBuilder } from "../mystery-encounter"; +import { MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; +import { leaveEncounterWithoutBattle, setEncounterRewards, } from "../utils/encounter-phase-utils"; +import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; +import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; +import Pokemon, { PlayerPokemon, PokemonMove } from "#app/field/pokemon"; +import { IntegerHolder, randSeedInt, randSeedShuffle } from "#app/utils"; +import PokemonSpecies, { allSpecies, getPokemonSpecies } from "#app/data/pokemon-species"; +import { HiddenAbilityRateBoosterModifier, PokemonBaseStatTotalModifier, PokemonFormChangeItemModifier, PokemonHeldItemModifier } from "#app/modifier/modifier"; +import { achvs } from "#app/system/achv"; +import { speciesEggMoves } from "#app/data/egg-moves"; +import { MysteryEncounterPokemonData } from "#app/data/mystery-encounters/mystery-encounter-pokemon-data"; +import { queueEncounterMessage, showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; +import { modifierTypes } from "#app/modifier/modifier-type"; +import { Stat } from "#app/data/pokemon-stat"; +import i18next from "#app/plugins/i18n"; +import { doPokemonTransformationSequence, TransformationScreenPosition } from "#app/data/mystery-encounters/utils/encounter-transformation-sequence"; +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 = [ + Species.ETERNATUS, + /** UBs */ + Species.NIHILEGO, + Species.BUZZWOLE, + Species.PHEROMOSA, + Species.XURKITREE, + Species.CELESTEELA, + Species.KARTANA, + Species.GUZZLORD, + Species.POIPOLE, + Species.NAGANADEL, + Species.STAKATAKA, + Species.BLACEPHALON, + /** Paradox */ + Species.GREAT_TUSK, + Species.SCREAM_TAIL, + Species.BRUTE_BONNET, + Species.FLUTTER_MANE, + Species.SLITHER_WING, + Species.SANDY_SHOCKS, + Species.ROARING_MOON, + Species.WALKING_WAKE, + Species.GOUGING_FIRE, + Species.RAGING_BOLT, + Species.IRON_TREADS, + Species.IRON_BUNDLE, + Species.IRON_HANDS, + Species.IRON_JUGULIS, + Species.IRON_MOTH, + Species.IRON_THORNS, + Species.IRON_VALIANT, + Species.IRON_LEAVES, + Species.IRON_BOULDER, + Species.IRON_CROWN, + /** These are banned so they don't appear in the < 570 BST pool */ + Species.URSHIFU, + Species.CUBCHOO, + Species.OKIDOGI, + Species.MUNKIDORI, + Species.FEZANDIPITI, + Species.OGERPON, + Species.CALYREX, + Species.TYPE_NULL, + Species.TERAPAGOS, + Species.COSMOG, + Species.COSMOEM, +]; + +/** + * Weird Dream encounter. + * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/137 | GitHub Issue #137} + * @see For biome requirements check {@linkcode mysteryEncountersByBiome} + */ +export const WeirdDreamEncounter: IMysteryEncounter = + MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.WEIRD_DREAM) + .withEncounterTier(MysteryEncounterTier.ROGUE) + .withIntroSpriteConfigs([ + { + spriteKey: "girawitch", + fileRoot: "mystery-encounters", + hasShadow: false, + y: 4 + }, + ]) + .withIntroDialogue([ + { + text: `${namespace}.intro`, + }, + { + speaker: `${namespace}.speaker`, + text: `${namespace}.intro_dialogue`, + }, + ]) + .withSceneWaveRangeRequirement(10, 180) + .withTitle(`${namespace}.title`) + .withDescription(`${namespace}.description`) + .withQuery(`${namespace}.query`) + .withOnInit((scene: BattleScene) => { + scene.loadBgm("mystery_encounter_weird_dream", "mystery_encounter_weird_dream.mp3"); + return true; + }) + .withOnVisualsStart((scene: BattleScene) => { + // Change the bgm + scene.fadeOutBgm(3000, false); + scene.time.delayedCall(3000, () => { + scene.playBgm("mystery_encounter_weird_dream"); + }); + + return true; + }) + .withOption( + new MysteryEncounterOptionBuilder() + .withOptionMode(MysteryEncounterOptionMode.DEFAULT) + .withHasDexProgress(true) + .withDialogue({ + buttonLabel: `${namespace}.option.1.label`, + buttonTooltip: `${namespace}.option.1.tooltip`, + selected: [ + { + text: `${namespace}.option.1.selected`, + } + ], + }) + .withPreOptionPhase(async (scene: BattleScene) => { + // Play the animation as the player goes through the dialogue + scene.time.delayedCall(1000, () => { + doShowDreamBackground(scene); + }); + + // Calculate all the newly transformed Pokemon and begin asset load + const teamTransformations = getTeamTransformations(scene); + const loadAssets = teamTransformations.map(t => (t.newPokemon as PlayerPokemon).loadAssets()); + scene.currentBattle.mysteryEncounter.misc = { + teamTransformations, + loadAssets + }; + }) + .withOptionPhase(async (scene: BattleScene) => { + // Starts cutscene dialogue, but does not await so that cutscene plays as player goes through dialogue + const cutsceneDialoguePromise = showEncounterText(scene, `${namespace}.option.1.cutscene`); + + // Change the entire player's party + // Wait for all new Pokemon assets to be loaded before showing transformation animations + await Promise.all(scene.currentBattle.mysteryEncounter.misc.loadAssets); + const transformations = scene.currentBattle.mysteryEncounter.misc.teamTransformations; + + // If there are 1-3 transformations, do them centered back to back + // Otherwise, the first 3 transformations are executed side-by-side, then any remaining 1-3 transformations occur in those same respective positions + if (transformations.length <= 3) { + for (const transformation of transformations) { + const pokemon1 = transformation.previousPokemon; + const pokemon2 = transformation.newPokemon; + + await doPokemonTransformationSequence(scene, pokemon1, pokemon2, TransformationScreenPosition.CENTER); + } + } else { + await doSideBySideTransformations(scene, transformations); + } + + // Make sure player has finished cutscene dialogue + await cutsceneDialoguePromise; + + doHideDreamBackground(scene); + await showEncounterText(scene, `${namespace}.option.1.dream_complete`); + + await doNewTeamPostProcess(scene, transformations); + setEncounterRewards(scene, { guaranteedModifierTypeFuncs: [modifierTypes.MEMORY_MUSHROOM, modifierTypes.ROGUE_BALL, modifierTypes.MINT, modifierTypes.MINT]}); + leaveEncounterWithoutBattle(scene, true); + }) + .build() + ) + .withSimpleOption( + { + buttonLabel: `${namespace}.option.2.label`, + buttonTooltip: `${namespace}.option.2.tooltip`, + selected: [ + { + text: `${namespace}.option.2.selected`, + }, + ], + }, + async (scene: BattleScene) => { + // Reduce party levels by 20% + for (const pokemon of scene.getParty()) { + pokemon.level = Math.max(Math.ceil(0.8 * pokemon.level), 1); + pokemon.exp = getLevelTotalExp(pokemon.level, pokemon.species.growthRate); + pokemon.levelExp = 0; + + pokemon.calculateStats(); + pokemon.updateInfo(); + } + + leaveEncounterWithoutBattle(scene, true); + return true; + } + ) + .withOutroDialogue([ + { + text: `${namespace}.outro` + } + ]) + .build(); + +interface PokemonTransformation { + previousPokemon: PlayerPokemon; + newSpecies: PokemonSpecies; + newPokemon: PlayerPokemon; + heldItems: PokemonHeldItemModifier[]; +} + +function getTeamTransformations(scene: BattleScene): PokemonTransformation[] { + const party = scene.getParty(); + // Removes all pokemon from the party + const alreadyUsedSpecies: PokemonSpecies[] = []; + const pokemonTransformations: PokemonTransformation[] = party.map(p => { + return { + previousPokemon: p + } as PokemonTransformation; + }); + + // Only 1 Pokemon can be transformed into BST higher than 600 + let hasPokemonBstHigherThan600 = false; + // Only 1 other Pokemon can be transformed into BST between 570-600 + let hasPokemonBstBetween570And600 = 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 + const numPokemon = party.length; + for (let i = 0; i < numPokemon; i++) { + const removed = party[randSeedInt(party.length)]; + const index = pokemonTransformations.findIndex(p => p.previousPokemon.id === removed.id); + pokemonTransformations[index].heldItems = removed.getHeldItems().filter(m => !(m instanceof PokemonFormChangeItemModifier)); + scene.removePokemonFromPlayerParty(removed, false); + + const bst = getOriginalBst(scene, removed); + let newBstRange; + if (i < 2) { + newBstRange = [90, 110]; + } else { + newBstRange = [40, 50]; + } + + const newSpecies = getTransformedSpecies(bst, newBstRange, hasPokemonBstHigherThan600, hasPokemonBstBetween570And600, alreadyUsedSpecies); + + const newSpeciesBst = newSpecies.getBaseStatTotal(); + if (newSpeciesBst > 600) { + hasPokemonBstHigherThan600 = true; + } + if (newSpeciesBst <= 600 && newSpeciesBst >= 570) { + hasPokemonBstBetween570And600 = true; + } + + + pokemonTransformations[index].newSpecies = newSpecies; + alreadyUsedSpecies.push(newSpecies); + } + + for (const transformation of pokemonTransformations) { + const newAbilityIndex = randSeedInt(transformation.newSpecies.getAbilityCount()); + const newPlayerPokemon = scene.addPlayerPokemon(transformation.newSpecies, transformation.previousPokemon.level, newAbilityIndex, undefined); + transformation.newPokemon = newPlayerPokemon; + scene.getParty().push(newPlayerPokemon); + } + + return pokemonTransformations; +} + +async function doNewTeamPostProcess(scene: BattleScene, transformations: PokemonTransformation[]) { + let atLeastOneNewStarter = false; + for (const transformation of transformations) { + const previousPokemon = transformation.previousPokemon; + const newPokemon = transformation.newPokemon; + const speciesRootForm = newPokemon.species.getRootSpeciesId(); + + // Roll HA a second time + if (newPokemon.species.abilityHidden) { + const hiddenIndex = newPokemon.species.ability2 ? 2 : 1; + if (newPokemon.abilityIndex < hiddenIndex) { + const hiddenAbilityChance = new IntegerHolder(256); + scene.applyModifiers(HiddenAbilityRateBoosterModifier, true, hiddenAbilityChance); + + const hasHiddenAbility = !randSeedInt(hiddenAbilityChance.value); + + if (hasHiddenAbility) { + newPokemon.abilityIndex = hiddenIndex; + } + } + } + + // Roll IVs a second time + newPokemon.ivs = newPokemon.ivs.map(iv => { + const newValue = randSeedInt(31); + 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().abilityHidden && newPokemon.abilityIndex === newPokemon.getSpeciesForm().getAbilityCount() - 1) { + scene.validateAchv(achvs.HIDDEN_ABILITY); + } + + if (newPokemon.species.subLegendary) { + scene.validateAchv(achvs.CATCH_SUB_LEGENDARY); + } + + if (newPokemon.species.legendary) { + scene.validateAchv(achvs.CATCH_LEGENDARY); + } + + if (newPokemon.species.mythical) { + scene.validateAchv(achvs.CATCH_MYTHICAL); + } + + scene.gameData.updateSpeciesDexIvs(newPokemon.species.getRootSpeciesId(true), newPokemon.ivs); + const newStarterUnlocked = await scene.gameData.setPokemonCaught(newPokemon, true, false, false); + if (newStarterUnlocked) { + atLeastOneNewStarter = true; + queueEncounterMessage(scene, i18next.t("battle:addedAsAStarter", { pokemonName: getPokemonSpecies(speciesRootForm).getName() })); + } + } + + // If the previous pokemon had higher IVs, override to those (after updating dex IVs > prevents perfect 31s on a new unlock) + newPokemon.ivs = newPokemon.ivs.map((iv, index) => { + return previousPokemon.ivs[index] > iv ? previousPokemon.ivs[index] : iv; + }); + + // For pokemon that the player owns (including ones just caught), gain a candy + if (!!scene.gameData.dexData[speciesRootForm].caughtAttr) { + scene.gameData.addStarterCandy(getPokemonSpecies(speciesRootForm), 1); + } + + // Set the moveset of the new pokemon to be the same as previous, but with 1 egg move of the new species + newPokemon.moveset = previousPokemon.moveset; + if (speciesEggMoves.hasOwnProperty(speciesRootForm)) { + const eggMoves = speciesEggMoves[speciesRootForm]; + const eggMoveIndex = randSeedInt(4); + const randomEggMove = eggMoves[eggMoveIndex]; + if (newPokemon.moveset.length < 4) { + newPokemon.moveset.push(new PokemonMove(randomEggMove)); + } else { + newPokemon.moveset[randSeedInt(4)] = new PokemonMove(randomEggMove); + } + // For pokemon that the player owns (including ones just caught), unlock the egg move + if (!!scene.gameData.dexData[speciesRootForm].caughtAttr) { + await scene.gameData.setEggMoveUnlocked(getPokemonSpecies(speciesRootForm), eggMoveIndex, true); + } + } + + // Randomize the second type of the pokemon + // If the pokemon does not normally have a second type, it will gain 1 + const newTypes = [newPokemon.getTypes()[0]]; + let newType = randSeedInt(18) as Type; + while (newType === newTypes[0]) { + newType = randSeedInt(18) as Type; + } + newTypes.push(newType); + if (!newPokemon.mysteryEncounterData) { + newPokemon.mysteryEncounterData = new MysteryEncounterPokemonData(null, null, null, newTypes); + } else { + newPokemon.mysteryEncounterData.types = newTypes; + } + + for (const item of transformation.heldItems) { + item.pokemonId = newPokemon.id; + 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() <= 600) { + const stats: Stat[] = [Stat.HP]; + const baseStats = newPokemon.getSpeciesForm().baseStats.slice(0); + // Attack or SpAtk + stats.push(baseStats[Stat.ATK] < baseStats[Stat.SPATK] ? Stat.ATK : Stat.SPATK); + // Def or SpDef + stats.push(baseStats[Stat.DEF] < baseStats[Stat.SPDEF] ? Stat.DEF : Stat.SPDEF); + // const mod = modifierTypes.MYSTERY_ENCOUNTER_OLD_GATEAU().newModifier(newPokemon, 20, stats); + const modType = modifierTypes.MYSTERY_ENCOUNTER_OLD_GATEAU().generateType(null, [20, stats]); + const modifier = modType.newModifier(newPokemon); + scene.addModifier(modifier); + } + + // Enable passive if previous had it + newPokemon.passive = previousPokemon.passive; + + newPokemon.calculateStats(); + newPokemon.initBattleInfo(); + } + + // One random pokemon will get its passive unlocked + const passiveDisabledPokemon = scene.getParty().filter(p => !p.passive); + if (passiveDisabledPokemon?.length > 0) { + passiveDisabledPokemon[randSeedInt(passiveDisabledPokemon.length)].passive = true; + } + + // If at least one new starter was unlocked, play 1 fanfare + if (atLeastOneNewStarter) { + scene.playSound("level_up_fanfare"); + } +} + +function getOriginalBst(scene: BattleScene, pokemon: Pokemon) { + const baseStats = pokemon.getSpeciesForm().baseStats.slice(0); + scene.applyModifiers(PokemonBaseStatTotalModifier, true, pokemon, baseStats); + if (pokemon.fusionSpecies) { + const fusionBaseStats = pokemon.getFusionSpeciesForm().baseStats; + for (let s = 0; s < pokemon.stats.length; s++) { + baseStats[s] = Math.ceil((baseStats[s] + fusionBaseStats[s]) / 2); + } + } else if (scene.gameMode.isSplicedOnly) { + for (let s = 0; s < pokemon.stats.length; s++) { + baseStats[s] = Math.ceil(baseStats[s] / 2); + } + } + return baseStats.reduce((a, b) => a + b, 0); +} + +function getTransformedSpecies(originalBst: number, bstSearchRange: [number, number], hasPokemonBstHigherThan600: boolean, hasPokemonBstBetween570And600: boolean, alreadyUsedSpecies: PokemonSpecies[]): PokemonSpecies { + let newSpecies: PokemonSpecies; + while (!newSpecies) { + const bstCap = originalBst + bstSearchRange[1]; + const bstMin = Math.max(originalBst + bstSearchRange[0], 0); + + // Get any/all species that fall within the Bst range requirements + let validSpecies = allSpecies + .filter(s => { + 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); + }); + + // There must be at least 20 species available before it will choose one + if (validSpecies?.length > 20) { + validSpecies = randSeedShuffle(validSpecies); + newSpecies = validSpecies.pop(); + while (alreadyUsedSpecies.includes(newSpecies)) { + newSpecies = validSpecies.pop(); + } + } else { + // Expands search rand until a Pokemon is found + bstSearchRange[0] -= 10; + bstSearchRange[1] += 10; + } + } + + return newSpecies; +} + +function doShowDreamBackground(scene: BattleScene) { + const transformationContainer = scene.add.container(0, -scene.game.canvas.height / 6); + transformationContainer.name = "Dream Background"; + + // In case it takes a bit for video to load + const transformationStaticBg = scene.add.rectangle(0, 0, scene.game.canvas.width / 6, scene.game.canvas.height / 6, 0); + transformationStaticBg.setName("Black Background"); + transformationStaticBg.setOrigin(0, 0); + transformationContainer.add(transformationStaticBg); + transformationStaticBg.setVisible(true); + + const transformationVideoBg: Phaser.GameObjects.Video = scene.add.video(0, 0, "evo_bg").stop(); + transformationVideoBg.setLoop(true); + transformationVideoBg.setOrigin(0, 0); + transformationVideoBg.setScale(0.4359673025); + transformationContainer.add(transformationVideoBg); + + scene.fieldUI.add(transformationContainer); + scene.fieldUI.bringToTop(transformationContainer); + transformationVideoBg.play(); + + transformationContainer.setVisible(true); + transformationContainer.alpha = 0; + + scene.tweens.add({ + targets: transformationContainer, + alpha: 1, + duration: 3000, + ease: "Sine.easeInOut" + }); +} + +function doHideDreamBackground(scene: BattleScene) { + const transformationContainer = scene.fieldUI.getByName("Dream Background"); + + scene.tweens.add({ + targets: transformationContainer, + alpha: 0, + duration: 3000, + ease: "Sine.easeInOut", + onComplete: () => { + scene.fieldUI.remove(transformationContainer, true); + } + }); +} + +function doSideBySideTransformations(scene: BattleScene, transformations: PokemonTransformation[]) { + return new Promise(resolve => { + const allTransformationPromises = []; + for (let i = 0; i < 3; i++) { + const delay = i * 4000; + scene.time.delayedCall(delay, () => { + const transformation = transformations[i]; + const pokemon1 = transformation.previousPokemon; + const pokemon2 = transformation.newPokemon; + const screenPosition = i as TransformationScreenPosition; + + const transformationPromise = doPokemonTransformationSequence(scene, pokemon1, pokemon2, screenPosition) + .then(() => { + if (transformations.length > i + 3) { + const nextTransformationAtPosition = transformations[i + 3]; + const nextPokemon1 = nextTransformationAtPosition.previousPokemon; + const nextPokemon2 = nextTransformationAtPosition.newPokemon; + + allTransformationPromises.push(doPokemonTransformationSequence(scene, nextPokemon1, nextPokemon2, screenPosition)); + } + }); + allTransformationPromises.push(transformationPromise); + }); + } + + // Wait for all transformations to be loaded into promise array + const id = setInterval(checkAllPromisesExist, 500); + async function checkAllPromisesExist() { + if (allTransformationPromises.length === transformations.length) { + clearInterval(id); + await Promise.all(allTransformationPromises); + resolve(); + } + } + }); +} diff --git a/src/data/mystery-encounters/mystery-encounters.ts b/src/data/mystery-encounters/mystery-encounters.ts index 6c3c2dd6008..f73673706ea 100644 --- a/src/data/mystery-encounters/mystery-encounters.ts +++ b/src/data/mystery-encounters/mystery-encounters.ts @@ -24,6 +24,7 @@ import { BerriesAboundEncounter } from "#app/data/mystery-encounters/encounters/ import { ClowningAroundEncounter } from "#app/data/mystery-encounters/encounters/clowning-around-encounter"; import { PartTimerEncounter } from "#app/data/mystery-encounters/encounters/part-timer-encounter"; import { DancingLessonsEncounter } from "#app/data/mystery-encounters/encounters/dancing-lessons-encounter"; +import { WeirdDreamEncounter } from "#app/data/mystery-encounters/encounters/weird-dream-encounter"; // Spawn chance: (BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT + WIGHT_INCREMENT_ON_SPAWN_MISS * ) / 256 export const BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT = 1; @@ -165,7 +166,8 @@ const anyBiomeEncounters: MysteryEncounterType[] = [ MysteryEncounterType.A_TRAINERS_TEST, MysteryEncounterType.TRASH_TO_TREASURE, MysteryEncounterType.BERRIES_ABOUND, - MysteryEncounterType.CLOWNING_AROUND + MysteryEncounterType.CLOWNING_AROUND, + MysteryEncounterType.WEIRD_DREAM ]; /** @@ -267,6 +269,7 @@ export function initMysteryEncounters() { allMysteryEncounters[MysteryEncounterType.CLOWNING_AROUND] = ClowningAroundEncounter; allMysteryEncounters[MysteryEncounterType.PART_TIMER] = PartTimerEncounter; allMysteryEncounters[MysteryEncounterType.DANCING_LESSONS] = DancingLessonsEncounter; + allMysteryEncounters[MysteryEncounterType.WEIRD_DREAM] = WeirdDreamEncounter; // Add extreme encounters to biome map extremeBiomeEncounters.forEach(encounter => { diff --git a/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts b/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts index 03066314a5b..307e0a095ff 100644 --- a/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts @@ -19,6 +19,7 @@ import { queueEncounterMessage, showEncounterText } from "#app/data/mystery-enco import { getPokemonNameWithAffix } from "#app/messages"; import { modifierTypes, PokemonHeldItemModifierType } from "#app/modifier/modifier-type"; import { Gender } from "#app/data/gender"; +import { Stat } from "#enums/stat"; export function getSpriteKeysFromSpecies(species: Species, female?: boolean, formIndex?: integer, shiny?: boolean, variant?: integer): { spriteKey: string, fileRoot: string } { const spriteKey = getPokemonSpecies(species).getSpriteKey(female ?? false, formIndex ?? 0, shiny ?? false, variant ?? 0); @@ -84,6 +85,28 @@ export function getHighestLevelPlayerPokemon(scene: BattleScene, unfainted: bool return pokemon; } +/** + * Ties are broken by whatever mon is closer to the front of the party + * @param scene + * @param stat - stat to search for + * @param unfainted - default false. If true, only picks from unfainted mons. + * @returns + */ +export function getHighestStatPlayerPokemon(scene: BattleScene, stat: Stat, unfainted: boolean = false): PlayerPokemon { + const party = scene.getParty(); + let pokemon: PlayerPokemon; + party.every(p => { + if (unfainted && p.isFainted()) { + return true; + } + + pokemon = pokemon ? pokemon.getStat(stat) < p?.getStat(stat) ? p : pokemon : p; + return true; + }); + + return pokemon; +} + /** * Ties are broken by whatever mon is closer to the front of the party * @param scene diff --git a/src/data/mystery-encounters/utils/encounter-transformation-sequence.ts b/src/data/mystery-encounters/utils/encounter-transformation-sequence.ts new file mode 100644 index 00000000000..271cdaf391e --- /dev/null +++ b/src/data/mystery-encounters/utils/encounter-transformation-sequence.ts @@ -0,0 +1,330 @@ +import BattleScene from "#app/battle-scene"; +import { PlayerPokemon } from "#app/field/pokemon"; +import { getFrameMs } from "#app/utils"; +import { cos, sin } from "#app/field/anims"; +import { getTypeRgb } from "#app/data/type"; + +export enum TransformationScreenPosition { + CENTER, + LEFT, + RIGHT +} + +/** + * Initiates an "evolution-like" animation to transform a pokemon (presumably from the player's party) into a new one, not necessarily an evolution species. + * @param scene + * @param pokemon + * @param transformedPokemon + * @param screenPosition + */ +export function doPokemonTransformationSequence(scene: BattleScene, pokemon: PlayerPokemon, transformedPokemon: PlayerPokemon, screenPosition: TransformationScreenPosition) { + return new Promise(resolve => { + const transformationContainer = scene.fieldUI.getByName("Dream Background") as Phaser.GameObjects.Container; + const transformationBaseBg = scene.add.image(0, 0, "default_bg"); + transformationBaseBg.setOrigin(0, 0); + transformationBaseBg.setVisible(false); + transformationContainer.add(transformationBaseBg); + + let pokemonSprite: Phaser.GameObjects.Sprite; + let pokemonTintSprite: Phaser.GameObjects.Sprite; + let pokemonEvoSprite: Phaser.GameObjects.Sprite; + let pokemonEvoTintSprite: Phaser.GameObjects.Sprite; + + const xOffset = screenPosition === TransformationScreenPosition.CENTER ? 0 : + screenPosition === TransformationScreenPosition.RIGHT ? 100 : -100; + // Centered transformations occur at a lower y Position + const yOffset = screenPosition !== TransformationScreenPosition.CENTER ? -15 : 0; + + const getPokemonSprite = () => { + const ret = scene.addPokemonSprite(pokemon, transformationBaseBg.displayWidth / 2 + xOffset, transformationBaseBg.displayHeight / 2 + yOffset, "pkmn__sub"); + ret.setPipeline(scene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], ignoreTimeTint: true }); + return ret; + }; + + transformationContainer.add((pokemonSprite = getPokemonSprite())); + transformationContainer.add((pokemonTintSprite = getPokemonSprite())); + transformationContainer.add((pokemonEvoSprite = getPokemonSprite())); + transformationContainer.add((pokemonEvoTintSprite = getPokemonSprite())); + + pokemonSprite.setAlpha(0); + pokemonTintSprite.setAlpha(0); + pokemonTintSprite.setTintFill(0xFFFFFF); + pokemonEvoSprite.setVisible(false); + pokemonEvoTintSprite.setVisible(false); + pokemonEvoTintSprite.setTintFill(0xFFFFFF); + + [ pokemonSprite, pokemonTintSprite, pokemonEvoSprite, pokemonEvoTintSprite ].map(sprite => { + sprite.play(pokemon.getSpriteKey(true)); + sprite.setPipeline(scene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], hasShadow: false, teraColor: getTypeRgb(pokemon.getTeraType()) }); + sprite.setPipelineData("ignoreTimeTint", true); + sprite.setPipelineData("spriteKey", pokemon.getSpriteKey()); + sprite.setPipelineData("shiny", pokemon.shiny); + sprite.setPipelineData("variant", pokemon.variant); + [ "spriteColors", "fusionSpriteColors" ].map(k => { + if (pokemon.summonData?.speciesForm) { + k += "Base"; + } + sprite.pipelineData[k] = pokemon.getSprite().pipelineData[k]; + }); + }); + + [ pokemonEvoSprite, pokemonEvoTintSprite ].map(sprite => { + sprite.play(transformedPokemon.getSpriteKey(true)); + sprite.setPipelineData("ignoreTimeTint", true); + sprite.setPipelineData("spriteKey", transformedPokemon.getSpriteKey()); + sprite.setPipelineData("shiny", transformedPokemon.shiny); + sprite.setPipelineData("variant", transformedPokemon.variant); + [ "spriteColors", "fusionSpriteColors" ].map(k => { + if (transformedPokemon.summonData?.speciesForm) { + k += "Base"; + } + sprite.pipelineData[k] = transformedPokemon.getSprite().pipelineData[k]; + }); + }); + + scene.tweens.add({ + targets: pokemonSprite, + alpha: 1, + ease: "Cubic.easeInOut", + duration: 2000, + onComplete: () => { + doSpiralUpward(scene, transformationBaseBg, transformationContainer, xOffset, yOffset); + scene.tweens.addCounter({ + from: 0, + to: 1, + duration: 1000, + onUpdate: t => { + pokemonTintSprite.setAlpha(t.getValue()); + }, + onComplete: () => { + pokemonSprite.setVisible(false); + scene.time.delayedCall(700, () => { + doArcDownward(scene, transformationBaseBg, transformationContainer, xOffset, yOffset); + scene.time.delayedCall(1000, () => { + pokemonEvoTintSprite.setScale(0.25); + pokemonEvoTintSprite.setVisible(true); + doCycle(scene, 2, 6, pokemonTintSprite, pokemonEvoTintSprite).then(success => { + pokemonEvoSprite.setVisible(true); + doCircleInward(scene, transformationBaseBg, transformationContainer, xOffset, yOffset); + + scene.time.delayedCall(900, () => { + scene.tweens.add({ + targets: pokemonEvoTintSprite, + alpha: 0, + duration: 1500, + delay: 150, + easing: "Sine.easeIn", + onComplete: () => { + scene.time.delayedCall(2500, () => { + resolve(); + scene.tweens.add({ + targets: pokemonEvoSprite, + alpha: 0, + duration: 2000, + delay: 150, + easing: "Sine.easeIn", + // onComplete: () => { + // transformedPokemon.destroy(); + // } + }); + }); + } + }); + }); + }); + }); + }); + } + }); + } + }); + }); +} + +function doSpiralUpward(scene: BattleScene, transformationBaseBg, transformationContainer, xOffset: number, yOffset: number) { + let f = 0; + + scene.tweens.addCounter({ + repeat: 64, + duration: getFrameMs(1), + onRepeat: () => { + if (f < 64) { + if (!(f & 7)) { + for (let i = 0; i < 4; i++) { + doSpiralUpwardParticle(scene, (f & 120) * 2 + i * 64, transformationBaseBg, transformationContainer, xOffset, yOffset); + } + } + f++; + } + } + }); +} + +function doArcDownward(scene: BattleScene, transformationBaseBg, transformationContainer, xOffset: number, yOffset: number) { + let f = 0; + + scene.tweens.addCounter({ + repeat: 96, + duration: getFrameMs(1), + onRepeat: () => { + if (f < 96) { + if (f < 6) { + for (let i = 0; i < 9; i++) { + doArcDownParticle(scene, i * 16, transformationBaseBg, transformationContainer, xOffset, yOffset); + } + } + f++; + } + } + }); +} + +function doCycle(scene: BattleScene, l: number, lastCycle: integer, pokemonTintSprite, pokemonEvoTintSprite): Promise { + return new Promise(resolve => { + const isLastCycle = l === lastCycle; + scene.tweens.add({ + targets: pokemonTintSprite, + scale: 0.25, + ease: "Cubic.easeInOut", + duration: 500 / l, + yoyo: !isLastCycle + }); + scene.tweens.add({ + targets: pokemonEvoTintSprite, + scale: 1, + ease: "Cubic.easeInOut", + duration: 500 / l, + yoyo: !isLastCycle, + onComplete: () => { + if (l < lastCycle) { + doCycle(scene, l + 0.5, lastCycle, pokemonTintSprite, pokemonEvoTintSprite).then(success => resolve(success)); + } else { + pokemonTintSprite.setVisible(false); + resolve(true); + } + } + }); + }); +} + +function doCircleInward(scene: BattleScene, transformationBaseBg, transformationContainer, xOffset: number, yOffset: number) { + let f = 0; + + scene.tweens.addCounter({ + repeat: 48, + duration: getFrameMs(1), + onRepeat: () => { + if (!f) { + for (let i = 0; i < 16; i++) { + doCircleInwardParticle(scene, i * 16, 4, transformationBaseBg, transformationContainer, xOffset, yOffset); + } + } else if (f === 32) { + for (let i = 0; i < 16; i++) { + doCircleInwardParticle(scene, i * 16, 8, transformationBaseBg, transformationContainer, xOffset, yOffset); + } + } + f++; + } + }); +} + +function doSpiralUpwardParticle(scene: BattleScene, trigIndex: integer, transformationBaseBg, transformationContainer, xOffset: number, yOffset: number) { + const initialX = transformationBaseBg.displayWidth / 2 + xOffset; + const particle = scene.add.image(initialX, 0, "evo_sparkle"); + transformationContainer.add(particle); + + let f = 0; + let amp = 48; + + const particleTimer = scene.tweens.addCounter({ + repeat: -1, + duration: getFrameMs(1), + onRepeat: () => { + updateParticle(); + } + }); + + const updateParticle = () => { + if (!f || particle.y > 8) { + particle.setPosition(initialX, 88 - (f * f) / 80 + yOffset); + particle.y += sin(trigIndex, amp) / 4; + particle.x += cos(trigIndex, amp); + particle.setScale(1 - (f / 80)); + trigIndex += 4; + if (f & 1) { + amp--; + } + f++; + } else { + particle.destroy(); + particleTimer.remove(); + } + }; + + updateParticle(); +} + +function doArcDownParticle(scene: BattleScene, trigIndex: integer, transformationBaseBg, transformationContainer, xOffset: number, yOffset: number) { + const initialX = transformationBaseBg.displayWidth / 2 + xOffset; + const particle = scene.add.image(initialX, 0, "evo_sparkle"); + particle.setScale(0.5); + transformationContainer.add(particle); + + let f = 0; + let amp = 8; + + const particleTimer = scene.tweens.addCounter({ + repeat: -1, + duration: getFrameMs(1), + onRepeat: () => { + updateParticle(); + } + }); + + const updateParticle = () => { + if (!f || particle.y < 88) { + particle.setPosition(initialX, 8 + (f * f) / 5 + yOffset); + particle.y += sin(trigIndex, amp) / 4; + particle.x += cos(trigIndex, amp); + amp = 8 + sin(f * 4, 40); + f++; + } else { + particle.destroy(); + particleTimer.remove(); + } + }; + + updateParticle(); +} + +function doCircleInwardParticle(scene: BattleScene, trigIndex: integer, speed: integer, transformationBaseBg, transformationContainer, xOffset: number, yOffset: number) { + const initialX = transformationBaseBg.displayWidth / 2 + xOffset; + const initialY = transformationBaseBg.displayHeight / 2 + yOffset; + const particle = scene.add.image(initialX, initialY, "evo_sparkle"); + transformationContainer.add(particle); + + let amp = 120; + + const particleTimer = scene.tweens.addCounter({ + repeat: -1, + duration: getFrameMs(1), + onRepeat: () => { + updateParticle(); + } + }); + + const updateParticle = () => { + if (amp > 8) { + particle.setPosition(initialX, initialY); + particle.y += sin(trigIndex, amp); + particle.x += cos(trigIndex, amp); + amp -= speed; + trigIndex += 4; + } else { + particle.destroy(); + particleTimer.remove(); + } + }; + + updateParticle(); +} diff --git a/src/enums/mystery-encounter-type.ts b/src/enums/mystery-encounter-type.ts index b3d4fd8be6f..0db41e71ac5 100644 --- a/src/enums/mystery-encounter-type.ts +++ b/src/enums/mystery-encounter-type.ts @@ -21,5 +21,6 @@ export enum MysteryEncounterType { BERRIES_ABOUND, CLOWNING_AROUND, PART_TIMER, - DANCING_LESSONS + DANCING_LESSONS, + WEIRD_DREAM } diff --git a/src/locales/en/modifier-type.ts b/src/locales/en/modifier-type.ts index 662d4d10e76..1266f6442e9 100644 --- a/src/locales/en/modifier-type.ts +++ b/src/locales/en/modifier-type.ts @@ -76,6 +76,10 @@ export const modifierType: ModifierTypeTranslationEntries = { "cursed": "cursed" }, }, + "PokemonBaseStatFlatModifierType": { + name: "Old Gateau", + description: "Increases the holder's {{stats}} base stats by {{statValue}}. Found after a strange dream.", + }, "AllPokemonFullHpRestoreModifierType": { description: "Restores 100% HP for all Pokémon.", }, @@ -258,6 +262,7 @@ export const modifierType: ModifierTypeTranslationEntries = { "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_OLD_GATEAU": { name: "Old Gateau", description: "Increases the holder's {{stats}} stats by {{statValue}}." }, }, 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 9821971b11e..1358c8949a0 100644 --- a/src/locales/en/mystery-encounter.ts +++ b/src/locales/en/mystery-encounter.ts @@ -21,6 +21,7 @@ import { berriesAboundDialogue } from "#app/locales/en/mystery-encounters/berrie import { clowningAroundDialogue } from "#app/locales/en/mystery-encounters/clowning-around-dialogue"; import { partTimerDialogue } from "#app/locales/en/mystery-encounters/part-timer-dialogue"; import { dancingLessonsDialogue } from "#app/locales/en/mystery-encounters/dancing-lessons-dialogue"; +import { weirdDreamDialogue } from "#app/locales/en/mystery-encounters/weird-dream-dialogue"; /** * Injection patterns that can be used: @@ -69,5 +70,6 @@ export const mysteryEncounter = { berriesAbound: berriesAboundDialogue, clowningAround: clowningAroundDialogue, partTimer: partTimerDialogue, - dancingLessons: dancingLessonsDialogue + dancingLessons: dancingLessonsDialogue, + weirdDream: weirdDreamDialogue } as const; diff --git a/src/locales/en/mystery-encounters/berries-abound-dialogue.ts b/src/locales/en/mystery-encounters/berries-abound-dialogue.ts index 803da26406d..c17a989821d 100644 --- a/src/locales/en/mystery-encounters/berries-abound-dialogue.ts +++ b/src/locales/en/mystery-encounters/berries-abound-dialogue.ts @@ -1,26 +1,23 @@ export const berriesAboundDialogue = { intro: "There's a huge berry bush\nnear that Pokémon!", title: "Berries Abound", - description: "It looks like there's a strong Pokémon guarding a berry bush. Battling is the straightforward approach, but this Pokémon looks strong. You could also try to sneak around, though the Pokémon might catch you.", + description: "It looks like there's a strong Pokémon guarding a berry bush. Battling is the straightforward approach, but this Pokémon looks strong. Maybe a fast Pokémon would be able to grab some without getting caught?", query: "What will you do?", berries: "Berries!", option: { 1: { label: "Battle the Pokémon", - tooltip: "(-) Hard Battle\n(+) New Item", + tooltip: "(-) Hard Battle\n(+) Gain Berries", selected: "You approach the\nPokémon without fear.", }, 2: { - label: "Steal the Berries", - tooltip: "@[SUMMARY_GREEN]{(35%) Steal Item}\n@[SUMMARY_BLUE]{(65%) Harder Battle}", - tooltip_special: "(+) {{option2PrimaryName}} uses {{option2PrimaryMove}}", - good_result: `.@d{32}.@d{32}.@d{32} - $You manage to sneak your way\npast and grab the berries!`, - special_result: `.@d{32}.@d{32}.@d{32} - $Your {{option2PrimaryName}} helps you out and uses {{option2PrimaryMove}}! - $You nabbed the berries!`, - bad_result: `.@d{32}.@d{32}.@d{32} - $The Pokémon catches you\nas you try to sneak around!`, + label: "Race to the Bush", + tooltip: "(-) {{fastestPokemon}} Uses its Speed\n(+) Gain Berries", + 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/fight-or-flight-dialogue.ts b/src/locales/en/mystery-encounters/fight-or-flight-dialogue.ts index 1eb4a984b21..7ce80b42d9b 100644 --- a/src/locales/en/mystery-encounters/fight-or-flight-dialogue.ts +++ b/src/locales/en/mystery-encounters/fight-or-flight-dialogue.ts @@ -11,16 +11,11 @@ export const fightOrFlightDialogue = { }, 2: { label: "Steal the Item", - tooltip: "@[SUMMARY_GREEN]{(35%) Steal Item}\n@[SUMMARY_BLUE]{(65%) Harder Battle}", - tooltip_special: "(+) {{option2PrimaryName}} uses {{option2PrimaryMove}}", - good_result: `.@d{32}.@d{32}.@d{32} - $You manage to sneak your way\npast and grab the item!`, - special_result: `.@d{32}.@d{32}.@d{32} + disabled_tooltip: "Your Pokémon need to know certain moves to choose this", + tooltip: "(+) {{option2PrimaryName}} uses {{option2PrimaryMove}}", + selected: `.@d{32}.@d{32}.@d{32} $Your {{option2PrimaryName}} helps you out and uses {{option2PrimaryMove}}! $You nabbed the item!`, - bad_result: `.@d{32}.@d{32}.@d{32} - $The Pokémon catches you\nas you try to sneak around!`, - boss_enraged: "The opposing {{enemyPokemon}} has become enraged!" }, 3: { label: "Leave", diff --git a/src/locales/en/mystery-encounters/weird-dream-dialogue.ts b/src/locales/en/mystery-encounters/weird-dream-dialogue.ts new file mode 100644 index 00000000000..2def3b50d05 --- /dev/null +++ b/src/locales/en/mystery-encounters/weird-dream-dialogue.ts @@ -0,0 +1,29 @@ +export const weirdDreamDialogue = { + intro: "A shadowy woman blocks your path.\nSomething about her is unsettling...", + speaker: "Woman", + 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?", + option: { + 1: { + label: "\"I See Them\"", + tooltip: "@[SUMMARY_GREEN]{(?) Affects your Pokémon}", + 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... + $.@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. + $When you finally stop to collect yourself, you check the Pokémon in your team. + $For some reason, all of their levels have decreased!`, + } + }, +}; diff --git a/src/modifier/modifier-type.ts b/src/modifier/modifier-type.ts index f430a0a118b..f783e2baa99 100644 --- a/src/modifier/modifier-type.ts +++ b/src/modifier/modifier-type.ts @@ -1,27 +1,27 @@ import * as Modifiers from "./modifier"; -import { AttackMove, allMoves, selfStatLowerMoves } from "../data/move"; -import { MAX_PER_TYPE_POKEBALLS, PokeballType, getPokeballCatchMultiplier, getPokeballName } from "../data/pokeball"; +import { MoneyMultiplierModifier } from "./modifier"; +import { allMoves, AttackMove, selfStatLowerMoves } from "../data/move"; +import { getPokeballCatchMultiplier, getPokeballName, MAX_PER_TYPE_POKEBALLS, PokeballType } from "../data/pokeball"; import Pokemon, { EnemyPokemon, PlayerPokemon, PokemonMove } from "../field/pokemon"; import { EvolutionItem, pokemonEvolutions } from "../data/pokemon-evolutions"; -import { Stat, getStatName } from "../data/pokemon-stat"; +import { getStatName, Stat } from "../data/pokemon-stat"; import { tmPoolTiers, tmSpecies } from "../data/tms"; import { Type } from "../data/type"; import PartyUiHandler, { PokemonMoveSelectFilter, PokemonSelectFilter } from "../ui/party-ui-handler"; import * as Utils from "../utils"; -import { TempBattleStat, getTempBattleStatBoosterItemName, getTempBattleStatName } from "../data/temp-battle-stat"; +import { getTempBattleStatBoosterItemName, getTempBattleStatName, TempBattleStat } from "../data/temp-battle-stat"; import { getBerryEffectDescription, getBerryName } from "../data/berry"; import { Unlockables } from "../system/unlockables"; -import { StatusEffect, getStatusEffectDescriptor } from "../data/status-effect"; +import { getStatusEffectDescriptor, StatusEffect } from "../data/status-effect"; import { SpeciesFormKey } from "../data/pokemon-species"; import BattleScene from "../battle-scene"; -import { VoucherType, getVoucherTypeIcon, getVoucherTypeName } from "../system/voucher"; -import { FormChangeItem, SpeciesFormChangeCondition, SpeciesFormChangeItemTrigger, pokemonFormChanges } from "../data/pokemon-forms"; +import { getVoucherTypeIcon, getVoucherTypeName, VoucherType } from "../system/voucher"; +import { FormChangeItem, pokemonFormChanges, SpeciesFormChangeCondition, SpeciesFormChangeItemTrigger } from "../data/pokemon-forms"; import { ModifierTier } from "./modifier-tier"; -import { Nature, getNatureName, getNatureStatMultiplier } from "#app/data/nature"; +import { getNatureName, getNatureStatMultiplier, Nature } from "#app/data/nature"; import i18next from "i18next"; import { getModifierTierTextTint } from "#app/ui/text"; import Overrides from "#app/overrides"; -import { MoneyMultiplierModifier } from "./modifier"; import { Abilities } from "#enums/abilities"; import { BattlerTagType } from "#enums/battler-tag-type"; import { BerryType } from "#enums/berry-type"; @@ -680,6 +680,28 @@ export class PokemonBaseStatTotalModifierType extends PokemonHeldItemModifierTyp } } +export class PokemonBaseStatFlatModifierType extends PokemonHeldItemModifierType implements GeneratedPersistentModifierType { + private readonly statModifier: integer; + private readonly stats: Stat[]; + + constructor(statModifier: integer, stats: Stat[]) { + super("modifierType:ModifierType.MYSTERY_ENCOUNTER_OLD_GATEAU", "old_gateau", (_type, args) => new Modifiers.PokemonBaseStatFlatModifier(this, (args[0] as Pokemon).id, this.statModifier, this.stats)); + this.statModifier = statModifier; + this.stats = stats; + } + + getDescription(scene: BattleScene): string { + return i18next.t("modifierType:ModifierType.PokemonBaseStatFlatModifierType.description", { + stats: this.stats.map(stat => getStatName(stat)).join("/"), + statValue: this.statModifier, + }); + } + + getPregenArgs(): any[] { + return [ this.statModifier, this.stats ]; + } +} + class AllPokemonFullHpRestoreModifierType extends ModifierType { private descriptionKey: string; @@ -1477,7 +1499,12 @@ export const modifierTypes = { } return new PokemonBaseStatTotalModifierType(Utils.randSeedInt(20)); }), - + MYSTERY_ENCOUNTER_OLD_GATEAU: () => new ModifierTypeGenerator((party: Pokemon[], pregenArgs?: any[]) => { + if (pregenArgs) { + return new PokemonBaseStatFlatModifierType(pregenArgs[0] as integer, pregenArgs[1] as Stat[]); + } + 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)), }; @@ -1948,6 +1975,7 @@ export interface CustomModifierSettings { guaranteedModifierTypeFuncs?: ModifierTypeFunc[]; fillRemaining?: boolean; rerollMultiplier?: number; + allowLuckUpgrades?: boolean; } export function getModifierTypeFuncById(id: string): ModifierTypeFunc { @@ -1968,6 +1996,7 @@ export function getModifierTypeFuncById(id: string): ModifierTypeFunc { * - The first item in the shop will be `GREAT` tier, and the remaining 3 items will be generated normally. * - If `fillRemaining = false` in the same scenario, only 1 `GREAT` tier item will appear in the shop (regardless of `count` value). * - `rerollMultiplier?: number` - If specified, can adjust the amount of money required for a shop reroll. If set to 0, the shop will not allow rerolls at all. + * - `allowLuckUpgrades?: boolean` - Default true, if false will prevent set item tiers from upgrading via luck */ export function getPlayerModifierTypeOptions(count: integer, party: PlayerPokemon[], modifierTiers?: ModifierTier[], customModifierSettings?: CustomModifierSettings): ModifierTypeOption[] { const options: ModifierTypeOption[] = []; @@ -2001,8 +2030,9 @@ export function getPlayerModifierTypeOptions(count: integer, party: PlayerPokemo // Guaranteed tiers third if (customModifierSettings?.guaranteedModifierTiers?.length > 0) { - customModifierSettings?.guaranteedModifierTiers.forEach((tier) => { - options.push(getModifierTypeOptionWithRetry(options, retryCount, party, tier)); + const allowLuckUpgrades = customModifierSettings.allowLuckUpgrades ?? true; + customModifierSettings.guaranteedModifierTiers.forEach((tier) => { + options.push(getModifierTypeOptionWithRetry(options, retryCount, party, tier, allowLuckUpgrades)); }); } @@ -2028,11 +2058,12 @@ export function getPlayerModifierTypeOptions(count: integer, party: PlayerPokemo return options; } -function getModifierTypeOptionWithRetry(existingOptions: ModifierTypeOption[], retryCount: integer, party: PlayerPokemon[], tier?: ModifierTier): ModifierTypeOption { - let candidate = getNewModifierTypeOption(party, ModifierPoolType.PLAYER, tier); +function getModifierTypeOptionWithRetry(existingOptions: ModifierTypeOption[], retryCount: integer, party: PlayerPokemon[], tier?: ModifierTier, allowLuckUpgrades?: boolean): ModifierTypeOption { + allowLuckUpgrades = allowLuckUpgrades ?? true; + let candidate = getNewModifierTypeOption(party, ModifierPoolType.PLAYER, tier, undefined, 0, allowLuckUpgrades); let r = 0; while (existingOptions.length && ++r < retryCount && existingOptions.filter(o => o.type.name === candidate.type.name || o.type.group === candidate.type.group).length) { - candidate = getNewModifierTypeOption(party, ModifierPoolType.PLAYER, candidate.type.tier, candidate.upgradeCount); + candidate = getNewModifierTypeOption(party, ModifierPoolType.PLAYER, candidate.type.tier, candidate.upgradeCount, 0, allowLuckUpgrades); } return candidate; } @@ -2112,7 +2143,7 @@ export function getDailyRunStarterModifiers(party: PlayerPokemon[]): Modifiers.P return ret; } -function getNewModifierTypeOption(party: Pokemon[], poolType: ModifierPoolType, tier?: ModifierTier, upgradeCount?: integer, retryCount: integer = 0): ModifierTypeOption { +function getNewModifierTypeOption(party: Pokemon[], poolType: ModifierPoolType, tier?: ModifierTier, upgradeCount?: integer, retryCount: integer = 0, allowLuckUpgrades: boolean = true): ModifierTypeOption { const player = !poolType; const pool = getModifierPoolForType(poolType); let thresholds: object; @@ -2138,7 +2169,7 @@ function getNewModifierTypeOption(party: Pokemon[], poolType: ModifierPoolType, if (!upgradeCount) { upgradeCount = 0; } - if (player && tierValue) { + if (player && tierValue && allowLuckUpgrades) { const partyLuckValue = getPartyLuckValue(party); const upgradeOdds = Math.floor(128 / ((partyLuckValue + 4) / 4)); let upgraded = false; @@ -2163,7 +2194,7 @@ function getNewModifierTypeOption(party: Pokemon[], poolType: ModifierPoolType, } } else if (upgradeCount === undefined && player) { upgradeCount = 0; - if (tier < ModifierTier.MASTER) { + if (tier < ModifierTier.MASTER && allowLuckUpgrades) { const partyShinyCount = party.filter(p => p.isShiny() && !p.isFainted()).length; const upgradeOdds = Math.floor(32 / ((partyShinyCount + 2) / 2)); while (modifierPool.hasOwnProperty(tier + upgradeCount + 1) && modifierPool[tier + upgradeCount + 1].length) { diff --git a/src/modifier/modifier.ts b/src/modifier/modifier.ts index 07aa1ea803f..3778310c8f5 100644 --- a/src/modifier/modifier.ts +++ b/src/modifier/modifier.ts @@ -702,6 +702,7 @@ export class PokemonBaseStatModifier extends PokemonHeldItemModifier { export class PokemonBaseStatTotalModifier extends PokemonHeldItemModifier { private statModifier: integer; + readonly isTransferrable: boolean = false; constructor(type: ModifierTypes.PokemonBaseStatTotalModifierType, pokemonId: integer, statModifier: integer, stackCount?: integer) { super(type, pokemonId, stackCount); @@ -709,10 +710,7 @@ export class PokemonBaseStatTotalModifier extends PokemonHeldItemModifier { } matchType(modifier: Modifier): boolean { - if (modifier instanceof PokemonBaseStatTotalModifier) { - return (modifier as PokemonBaseStatTotalModifier).statModifier === this.statModifier; - } - return false; + return modifier instanceof PokemonBaseStatTotalModifier; } clone(): PersistentModifier { @@ -728,6 +726,7 @@ 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); args[1][i] = Math.min(Math.max(newVal, 1), 999999); @@ -736,10 +735,6 @@ export class PokemonBaseStatTotalModifier extends PokemonHeldItemModifier { return true; } - getTransferrable(_withinParty: boolean): boolean { - return false; - } - getScoreMultiplier(): number { return 1.2; } @@ -749,6 +744,55 @@ export class PokemonBaseStatTotalModifier extends PokemonHeldItemModifier { } } +export class PokemonBaseStatFlatModifier extends PokemonHeldItemModifier { + private statModifier: integer; + private stats: Stat[]; + readonly isTransferrable: boolean = false; + + constructor (type: ModifierType, pokemonId: integer, statModifier: integer, stats: Stat[], stackCount?: integer) { + super(type, pokemonId, stackCount); + + this.statModifier = statModifier; + this.stats = stats; + } + + matchType(modifier: Modifier): boolean { + return modifier instanceof PokemonBaseStatFlatModifier; + } + + clone(): PersistentModifier { + return new PokemonBaseStatFlatModifier(this.type, this.pokemonId, this.statModifier, this.stats, this.stackCount); + } + + getArgs(): any[] { + return super.getArgs().concat(this.statModifier, this.stats); + } + + shouldApply(args: any[]): boolean { + return super.shouldApply(args) && args.length === 2 && args[1] instanceof Array; + } + + apply(args: any[]): boolean { + // Modifies the passed in baseStats[] array by a flat value, only if the stat is specified in this.stats + args[1].forEach((v, i) => { + if (this.stats.includes(i)) { + const newVal = Math.floor(v + this.statModifier); + args[1][i] = Math.min(Math.max(newVal, 1), 999999); + } + }); + + return true; + } + + getScoreMultiplier(): number { + return 1.1; + } + + getMaxHeldItemCount(pokemon: Pokemon): integer { + return 1; + } +} + /** * Modifier used for held items that apply {@linkcode Stat} boost(s) * using a multiplier. diff --git a/src/system/game-data.ts b/src/system/game-data.ts index 9662a685af7..af465278e39 100644 --- a/src/system/game-data.ts +++ b/src/system/game-data.ts @@ -1444,12 +1444,20 @@ export class GameData { } } - setPokemonCaught(pokemon: Pokemon, incrementCount: boolean = true, fromEgg: boolean = false): Promise { - return this.setPokemonSpeciesCaught(pokemon, pokemon.species, incrementCount, fromEgg); + /** + * + * @param pokemon + * @param incrementCount + * @param fromEgg + * @param showNewStarterMessage + * @returns - true if Pokemon catch unlocked a new starter, false if Pokemon catch did not unlock a starter + */ + setPokemonCaught(pokemon: Pokemon, incrementCount: boolean = true, fromEgg: boolean = false, showNewStarterMessage: boolean = true): Promise { + return this.setPokemonSpeciesCaught(pokemon, pokemon.species, incrementCount, fromEgg, showNewStarterMessage); } - setPokemonSpeciesCaught(pokemon: Pokemon, species: PokemonSpecies, incrementCount: boolean = true, fromEgg: boolean = false): Promise { - return new Promise(resolve => { + setPokemonSpeciesCaught(pokemon: Pokemon, species: PokemonSpecies, incrementCount: boolean = true, fromEgg: boolean = false, showNewStarterMessage: boolean = true): Promise { + return new Promise(resolve => { const dexEntry = this.dexData[species.speciesId]; const caughtAttr = dexEntry.caughtAttr; const formIndex = pokemon.formIndex; @@ -1504,20 +1512,20 @@ export class GameData { } } - const checkPrevolution = () => { + const checkPrevolution = (newStarter: boolean) => { if (hasPrevolution) { const prevolutionSpecies = pokemonPrevolutions[species.speciesId]; - return this.setPokemonSpeciesCaught(pokemon, getPokemonSpecies(prevolutionSpecies), incrementCount, fromEgg).then(() => resolve()); + return this.setPokemonSpeciesCaught(pokemon, getPokemonSpecies(prevolutionSpecies), incrementCount, fromEgg, showNewStarterMessage).then(result => resolve(result)); } else { - resolve(); + resolve(newStarter); } }; - if (newCatch && speciesStarters.hasOwnProperty(species.speciesId)) { + if (newCatch && speciesStarters.hasOwnProperty(species.speciesId) && showNewStarterMessage) { this.scene.playSound("level_up_fanfare"); - this.scene.ui.showText(i18next.t("battle:addedAsAStarter", { pokemonName: species.name }), null, () => checkPrevolution(), null, true); + this.scene.ui.showText(i18next.t("battle:addedAsAStarter", { pokemonName: species.name }), null, () => checkPrevolution(true), null, true); } else { - checkPrevolution(); + checkPrevolution(false); } }); } @@ -1559,7 +1567,7 @@ export class GameData { this.starterData[species.speciesId].candyCount += count; } - setEggMoveUnlocked(species: PokemonSpecies, eggMoveIndex: integer): Promise { + setEggMoveUnlocked(species: PokemonSpecies, eggMoveIndex: integer, prependSpeciesToMessage: boolean = false): Promise { return new Promise(resolve => { const speciesId = species.speciesId; if (!speciesEggMoves.hasOwnProperty(speciesId) || !speciesEggMoves[speciesId][eggMoveIndex]) { @@ -1583,7 +1591,10 @@ export class GameData { this.scene.playSound("level_up_fanfare"); const moveName = allMoves[speciesEggMoves[speciesId][eggMoveIndex]].name; - this.scene.ui.showText(eggMoveIndex === 3 ? i18next.t("egg:rareEggMoveUnlock", { moveName: moveName }) : i18next.t("egg:eggMoveUnlock", { moveName: moveName }), null, () => resolve(true), null, true); + let message = prependSpeciesToMessage ? species.getName() + " " : ""; + message += eggMoveIndex === 3 ? i18next.t("egg:rareEggMoveUnlock", { moveName: moveName }) : i18next.t("egg:eggMoveUnlock", { moveName: moveName }); + + this.scene.ui.showText(message, null, () => resolve(true), null, true); }); } 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 6164c32418c..435f890b857 100644 --- a/src/test/mystery-encounter/encounters/berries-abound-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/berries-abound-encounter.test.ts @@ -6,9 +6,7 @@ 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 { CommandPhase, SelectModifierPhase } from "#app/phases"; -import { Moves } from "#enums/moves"; 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 { BerryModifier } from "#app/modifier/modifier"; @@ -16,13 +14,11 @@ import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; import { BerriesAboundEncounter } from "#app/data/mystery-encounters/encounters/berries-abound-encounter"; -import * as Utils from "utils"; -import { isNullOrUndefined } from "utils"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import * as EncounterDialogueUtils from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; const namespace = "mysteryEncounter:berriesAbound"; -const defaultParty = [Species.LAPRAS, Species.GENGAR, Species.ABRA]; +const defaultParty = [Species.PYUKUMUKU]; const defaultBiome = Biome.CAVE; const defaultWave = 45; @@ -105,10 +101,10 @@ describe("Berries Abound - Mystery Encounter", () => { describe("Option 1 - Fight", () => { it("should have the correct properties", () => { - const option1 = BerriesAboundEncounter.options[0]; - expect(option1.optionMode).toBe(MysteryEncounterOptionMode.DEFAULT); - expect(option1.dialogue).toBeDefined(); - expect(option1.dialogue).toStrictEqual({ + const option = BerriesAboundEncounter.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: [ @@ -166,32 +162,25 @@ describe("Berries Abound - Mystery Encounter", () => { }); }); - describe("Option 2 - Attempt to Steal", () => { + describe("Option 2 - Race to the Bush", () => { it("should have the correct properties", () => { - const option1 = BerriesAboundEncounter.options[1]; - expect(option1.optionMode).toBe(MysteryEncounterOptionMode.DEFAULT_OR_SPECIAL); - expect(option1.dialogue).toBeDefined(); - expect(option1.dialogue).toStrictEqual({ + const option = BerriesAboundEncounter.options[1]; + expect(option.optionMode).toBe(MysteryEncounterOptionMode.DEFAULT); + expect(option.dialogue).toBeDefined(); + expect(option.dialogue).toStrictEqual({ buttonLabel: `${namespace}.option.2.label`, buttonTooltip: `${namespace}.option.2.tooltip`, }); }); - it("should start battle on failing to steal", async () => { + it("should start battle if fastest pokemon is slower than boss", async () => { + const encounterTextSpy = vi.spyOn(EncounterDialogueUtils, "showEncounterText"); await game.runToMysteryEncounter(MysteryEncounterType.BERRIES_ABOUND, defaultParty); const config = game.scene.currentBattle.mysteryEncounter.enemyPartyConfigs[0]; const speciesToSpawn = config.pokemonConfigs[0].species.speciesId; - - const realFn = Utils.randSeedInt; - vi.spyOn(Utils, "randSeedInt").mockImplementation((range, min) => { - if (range === 16 && isNullOrUndefined(min)) { - // Mock the steal roll - return 12; - } else { - return realFn(range, min); - } - }); + // Setting enemy's level arbitrarily high to outspeed + config.pokemonConfigs[0].dataSource.level = 1000; await runMysteryEncounterToEnd(game, 2, null, true); @@ -202,60 +191,33 @@ describe("Berries Abound - Mystery Encounter", () => { // Should be enraged expect(enemyField[0].summonData.battleStats).toEqual([1, 1, 1, 1, 1, 0, 0]); + expect(encounterTextSpy).toHaveBeenCalledWith(expect.any(BattleScene), `${namespace}.option.2.selected_bad`); }); - it("Should skip battle when succeed on steal", async () => { - const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); - - await game.runToMysteryEncounter(MysteryEncounterType.BERRIES_ABOUND, defaultParty); - - const realFn = Utils.randSeedInt; - vi.spyOn(Utils, "randSeedInt").mockImplementation((range, min) => { - if (range === 16 && isNullOrUndefined(min)) { - // Mock the steal roll - return 6; - } else { - return realFn(range, min); - } - }); - - await runMysteryEncounterToEnd(game, 2); - await game.phaseInterceptor.to(SelectModifierPhase, false); - 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(5); - for (const option of modifierSelectHandler.options) { - expect(option.modifierTypeOption.type.id).toContain("BERRY"); - } - - expect(leaveEncounterWithoutBattleSpy).toBeCalled(); - }); - - it("Should skip fight when special requirements are met", async () => { + it("Should skip battle when fastest pokemon is faster than boss", async () => { const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); const encounterTextSpy = vi.spyOn(EncounterDialogueUtils, "showEncounterText"); await game.runToMysteryEncounter(MysteryEncounterType.BERRIES_ABOUND, defaultParty); - // Mock moveset - scene.getParty()[0].moveset = [new PokemonMove(Moves.KNOCK_OFF)]; + // Setting party pokemon's level arbitrarily high to outspeed + const fastestPokemon = scene.getParty()[0]; + fastestPokemon.level = 1000; + fastestPokemon.calculateStats(); await runMysteryEncounterToEnd(game, 2); await game.phaseInterceptor.to(SelectModifierPhase, false); expect(scene.getCurrentPhase().constructor.name).toBe(SelectModifierPhase.name); await game.phaseInterceptor.run(SelectModifierPhase); - expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); + 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(5); for (const option of modifierSelectHandler.options) { expect(option.modifierTypeOption.type.id).toContain("BERRY"); } - expect(encounterTextSpy).toHaveBeenCalledWith(expect.any(BattleScene), `${namespace}.option.2.special_result`); + expect(encounterTextSpy).toHaveBeenCalledWith(expect.any(BattleScene), `${namespace}.option.2.selected`); expect(leaveEncounterWithoutBattleSpy).toBeCalled(); }); }); 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 b44acc6d027..1c8cee8f8c3 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, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounterTestUtils"; +import { runMysteryEncounterToEnd, runSelectMysteryEncounterOption, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounterTestUtils"; import { CommandPhase, SelectModifierPhase } from "#app/phases"; import { Moves } from "#enums/moves"; import BattleScene from "#app/battle-scene"; @@ -14,11 +14,9 @@ import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; -import * as Utils from "utils"; -import { isNullOrUndefined } from "utils"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import * as EncounterDialogueUtils from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; import { FightOrFlightEncounter } from "#app/data/mystery-encounters/encounters/fight-or-flight-encounter"; +import { MysteryEncounterPhase } from "#app/phases/mystery-encounter-phases"; const namespace = "mysteryEncounter:fightOrFlight"; const defaultParty = [Species.LAPRAS, Species.GENGAR, Species.ABRA]; @@ -104,10 +102,10 @@ describe("Fight or Flight - Mystery Encounter", () => { describe("Option 1 - Fight", () => { it("should have the correct properties", () => { - const option1 = FightOrFlightEncounter.options[0]; - expect(option1.optionMode).toBe(MysteryEncounterOptionMode.DEFAULT); - expect(option1.dialogue).toBeDefined(); - expect(option1.dialogue).toStrictEqual({ + const option = FightOrFlightEncounter.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: [ @@ -152,77 +150,46 @@ describe("Fight or Flight - Mystery Encounter", () => { describe("Option 2 - Attempt to Steal", () => { it("should have the correct properties", () => { - const option1 = FightOrFlightEncounter.options[1]; - expect(option1.optionMode).toBe(MysteryEncounterOptionMode.DEFAULT_OR_SPECIAL); - expect(option1.dialogue).toBeDefined(); - expect(option1.dialogue).toStrictEqual({ + const option = FightOrFlightEncounter.options[1]; + expect(option.optionMode).toBe(MysteryEncounterOptionMode.DISABLED_OR_SPECIAL); + expect(option.dialogue).toBeDefined(); + expect(option.dialogue).toStrictEqual({ buttonLabel: `${namespace}.option.2.label`, buttonTooltip: `${namespace}.option.2.tooltip`, + disabledButtonTooltip: `${namespace}.option.2.disabled_tooltip`, + selected: [ + { + text: `${namespace}.option.2.selected`, + } + ], }); }); - it("should start battle on failing to steal", async () => { + it("should NOT be selectable if the player doesn't have a Stealing move", async () => { await game.runToMysteryEncounter(MysteryEncounterType.FIGHT_OR_FLIGHT, defaultParty); + scene.getParty().forEach(p => p.moveset = []); + await game.phaseInterceptor.to(MysteryEncounterPhase, false); - const config = game.scene.currentBattle.mysteryEncounter.enemyPartyConfigs[0]; - const speciesToSpawn = config.pokemonConfigs[0].species.speciesId; + 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"); - const realFn = Utils.randSeedInt; - vi.spyOn(Utils, "randSeedInt").mockImplementation((range, min) => { - if (range === 16 && isNullOrUndefined(min)) { - // Mock the steal roll - return 12; - } else { - return realFn(range, min); - } - }); + await runSelectMysteryEncounterOption(game, 2); - await runMysteryEncounterToEnd(game, 2, null, true); - - const enemyField = scene.getEnemyField(); - expect(scene.getCurrentPhase().constructor.name).toBe(CommandPhase.name); - expect(enemyField.length).toBe(1); - expect(enemyField[0].species.speciesId).toBe(speciesToSpawn); - - // Should be enraged - expect(enemyField[0].summonData.battleStats).toEqual([1, 1, 1, 1, 1, 0, 0]); + 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 skip battle when succeed on steal", async () => { + it("Should skip fight when player meets requirements", async () => { const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); await game.runToMysteryEncounter(MysteryEncounterType.FIGHT_OR_FLIGHT, defaultParty); - const item = game.scene.currentBattle.mysteryEncounter.misc; - const realFn = Utils.randSeedInt; - vi.spyOn(Utils, "randSeedInt").mockImplementation((range, min) => { - if (range === 16 && isNullOrUndefined(min)) { - // Mock the steal roll - return 6; - } else { - return realFn(range, min); - } - }); - - await runMysteryEncounterToEnd(game, 2); - await game.phaseInterceptor.to(SelectModifierPhase, false); - 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(1); - expect(item.type.name).toBe(modifierSelectHandler.options[0].modifierTypeOption.type.name); - - expect(leaveEncounterWithoutBattleSpy).toBeCalled(); - }); - - it("Should skip fight when special requirements are met", async () => { - const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); - const encounterTextSpy = vi.spyOn(EncounterDialogueUtils, "showEncounterText"); - - await game.runToMysteryEncounter(MysteryEncounterType.FIGHT_OR_FLIGHT, defaultParty); - // Mock moveset scene.getParty()[0].moveset = [new PokemonMove(Moves.KNOCK_OFF)]; const item = game.scene.currentBattle.mysteryEncounter.misc; @@ -237,7 +204,6 @@ describe("Fight or Flight - Mystery Encounter", () => { expect(modifierSelectHandler.options.length).toEqual(1); expect(item.type.name).toBe(modifierSelectHandler.options[0].modifierTypeOption.type.name); - expect(encounterTextSpy).toHaveBeenCalledWith(expect.any(BattleScene), `${namespace}.option.2.special_result`); expect(leaveEncounterWithoutBattleSpy).toBeCalled(); }); }); diff --git a/src/test/mystery-encounter/encounters/weird-dream-encounter.test.ts b/src/test/mystery-encounter/encounters/weird-dream-encounter.test.ts new file mode 100644 index 00000000000..0650b3b0ad4 --- /dev/null +++ b/src/test/mystery-encounter/encounters/weird-dream-encounter.test.ts @@ -0,0 +1,219 @@ +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 * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { runMysteryEncounterToEnd } from "#test/mystery-encounter/encounterTestUtils"; +import { SelectModifierPhase } from "#app/phases"; +import BattleScene from "#app/battle-scene"; +import { Mode } from "#app/ui/ui"; +import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; +import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; +import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; +import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; +import { WeirdDreamEncounter } from "#app/data/mystery-encounters/encounters/weird-dream-encounter"; +import * as EncounterTransformationSequence from "#app/data/mystery-encounters/utils/encounter-transformation-sequence"; + +const namespace = "mysteryEncounter:weirdDream"; +const defaultParty = [Species.MAGBY, Species.HAUNTER, Species.ABRA]; +const defaultBiome = Biome.CAVE; +const defaultWave = 45; + +describe("Weird Dream - 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(true); + vi.spyOn(EncounterTransformationSequence, "doPokemonTransformationSequence").mockImplementation(() => new Promise(resolve => resolve())); + + vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue( + new Map([ + [Biome.CAVE, [MysteryEncounterType.WEIRD_DREAM]], + ]) + ); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + vi.clearAllMocks(); + vi.resetAllMocks(); + }); + + it("should have the correct properties", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.WEIRD_DREAM, defaultParty); + + expect(WeirdDreamEncounter.encounterType).toBe(MysteryEncounterType.WEIRD_DREAM); + expect(WeirdDreamEncounter.encounterTier).toBe(MysteryEncounterTier.ROGUE); + expect(WeirdDreamEncounter.dialogue).toBeDefined(); + expect(WeirdDreamEncounter.dialogue.intro).toStrictEqual([ + { + text: `${namespace}.intro` + }, + { + speaker: `${namespace}.speaker`, + text: `${namespace}.intro_dialogue`, + }, + ]); + expect(WeirdDreamEncounter.dialogue.encounterOptionsDialogue.title).toBe(`${namespace}.title`); + expect(WeirdDreamEncounter.dialogue.encounterOptionsDialogue.description).toBe(`${namespace}.description`); + expect(WeirdDreamEncounter.dialogue.encounterOptionsDialogue.query).toBe(`${namespace}.query`); + expect(WeirdDreamEncounter.options.length).toBe(2); + }); + + it("should not run below wave 10", async () => { + game.override.startingWave(9); + + await game.runToMysteryEncounter(); + + expect(scene.currentBattle?.mysteryEncounter?.encounterType).not.toBe(MysteryEncounterType.WEIRD_DREAM); + }); + + 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 = WeirdDreamEncounter; + const loadBgmSpy = vi.spyOn(scene, "loadBgm"); + + const { onInit } = WeirdDreamEncounter; + + expect(WeirdDreamEncounter.onInit).toBeDefined(); + + WeirdDreamEncounter.populateDialogueTokensFromRequirements(scene); + const onInitResult = onInit(scene); + + expect(loadBgmSpy).toHaveBeenCalled(); + expect(onInitResult).toBe(true); + }); + + describe("Option 1 - Accept Transformation", () => { + it("should have the correct properties", () => { + const option = WeirdDreamEncounter.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: [ + { + text: `${namespace}.option.1.selected`, + }, + ], + }); + }); + + it("should transform the new party into new species, 2 at +90/+110, the rest at +40/50 BST", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.WEIRD_DREAM, defaultParty); + + const pokemonPrior = scene.getParty().map(pokemon => pokemon); + const bstsPrior = pokemonPrior.map(species => species.getSpeciesForm().getBaseStatTotal()); + + await runMysteryEncounterToEnd(game, 1); + await game.phaseInterceptor.to(SelectModifierPhase, false); + expect(scene.getCurrentPhase().constructor.name).toBe(SelectModifierPhase.name); + + const pokemonAfter = scene.getParty(); + const bstsAfter = pokemonAfter.map(pokemon => pokemon.getSpeciesForm().getBaseStatTotal()); + const bstDiff = bstsAfter.map((bst, index) => bst - bstsPrior[index]); + + for (let i = 0; i < pokemonAfter.length; i++) { + const newPokemon = pokemonAfter[i]; + expect(newPokemon.getSpeciesForm().speciesId).not.toBe(pokemonPrior[i].getSpeciesForm().speciesId); + expect(newPokemon.mysteryEncounterData.types.length).toBe(2); + } + + const plus90To110 = bstDiff.filter(bst => bst > 80); + const plus40To50 = bstDiff.filter(bst => bst < 80); + + expect(plus90To110.length).toBe(2); + expect(plus40To50.length).toBe(1); + }); + + it("should have 1 Memory Mushroom, 5 Rogue Balls, and 2 Mints in rewards", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.WEIRD_DREAM, defaultParty); + await runMysteryEncounterToEnd(game, 1); + await game.phaseInterceptor.to(SelectModifierPhase, false); + 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(4); + expect(modifierSelectHandler.options[0].modifierTypeOption.type.id).toEqual("MEMORY_MUSHROOM"); + expect(modifierSelectHandler.options[1].modifierTypeOption.type.id).toEqual("ROGUE_BALL"); + expect(modifierSelectHandler.options[2].modifierTypeOption.type.id).toEqual("MINT"); + expect(modifierSelectHandler.options[3].modifierTypeOption.type.id).toEqual("MINT"); + }); + + it("should leave encounter without battle", async () => { + const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); + + await game.runToMysteryEncounter(MysteryEncounterType.WEIRD_DREAM, defaultParty); + await runMysteryEncounterToEnd(game, 1); + + expect(leaveEncounterWithoutBattleSpy).toBeCalled(); + }); + }); + + describe("Option 2 - Leave", () => { + it("should have the correct properties", () => { + const option = WeirdDreamEncounter.options[1]; + expect(option.optionMode).toBe(MysteryEncounterOptionMode.DEFAULT); + expect(option.dialogue).toBeDefined(); + expect(option.dialogue).toStrictEqual({ + buttonLabel: `${namespace}.option.2.label`, + buttonTooltip: `${namespace}.option.2.tooltip`, + selected: [ + { + text: `${namespace}.option.2.selected`, + }, + ], + }); + }); + + it("should reduce party levels by 20%", async () => { + const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); + + await game.runToMysteryEncounter(MysteryEncounterType.WEIRD_DREAM, defaultParty); + const levelsPrior = scene.getParty().map(p => p.level); + await runMysteryEncounterToEnd(game, 2); + + const levelsAfter = scene.getParty().map(p => p.level); + + for (let i = 0; i < levelsPrior.length; i++) { + expect(Math.max(Math.ceil(0.8 * levelsPrior[i]), 1)).toBe(levelsAfter[i]); + expect(scene.getParty()[i].levelExp).toBe(0); + } + + expect(leaveEncounterWithoutBattleSpy).toBeCalled(); + }); + + it("should leave encounter without battle", async () => { + const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); + + await game.runToMysteryEncounter(MysteryEncounterType.WEIRD_DREAM, defaultParty); + await runMysteryEncounterToEnd(game, 2); + + expect(leaveEncounterWithoutBattleSpy).toBeCalled(); + }); + }); +}); diff --git a/src/test/utils/mocks/mockTextureManager.ts b/src/test/utils/mocks/mockTextureManager.ts index e207f96b722..eab0e3c6449 100644 --- a/src/test/utils/mocks/mockTextureManager.ts +++ b/src/test/utils/mocks/mockTextureManager.ts @@ -5,6 +5,7 @@ import MockNineslice from "#app/test/utils/mocks/mocksContainer/mockNineslice"; import MockImage from "#app/test/utils/mocks/mocksContainer/mockImage"; import MockText from "#app/test/utils/mocks/mocksContainer/mockText"; import MockPolygon from "#app/test/utils/mocks/mocksContainer/mockPolygon"; +import MockVideo from "#test/utils/mocks/mocksContainer/mockVideo"; export default class MockTextureManager { @@ -30,6 +31,7 @@ export default class MockTextureManager { text: this.text.bind(this), bitmapText: this.text.bind(this), displayList: this.displayList, + video: this.video.bind(this) }; } @@ -82,4 +84,10 @@ export default class MockTextureManager { this.list.push(polygon); return polygon; } + + video(x: number, y: number, key?: string) { + const video = new MockVideo(this, x, y, key); + this.list.push(video); + return video; + } } diff --git a/src/test/utils/mocks/mocksContainer/mockContainer.ts b/src/test/utils/mocks/mocksContainer/mockContainer.ts index ea06c9de326..a61a04af5a1 100644 --- a/src/test/utils/mocks/mocksContainer/mockContainer.ts +++ b/src/test/utils/mocks/mocksContainer/mockContainer.ts @@ -212,4 +212,8 @@ export default class MockContainer { return this.list; } + getByName(key: string) { + return this.list.find(v => v.name === key) ?? new MockContainer(this.textureManager, 0, 0); + } + } diff --git a/src/test/utils/mocks/mocksContainer/mockVideo.ts b/src/test/utils/mocks/mocksContainer/mockVideo.ts new file mode 100644 index 00000000000..8f9457b70ac --- /dev/null +++ b/src/test/utils/mocks/mocksContainer/mockVideo.ts @@ -0,0 +1,26 @@ +import MockContainer from "#test/utils/mocks/mocksContainer/mockContainer"; + +export default class MockVideo extends MockContainer { + private video: HTMLVideoElement | null; + private videoTexture: Phaser.Textures.Texture | null; + private videoTextureSource: Phaser.Textures.TextureSource | null; + + constructor(textureManager, x: number, y: number, key?: string) { + super(textureManager, x, y); + this.video = null; + this.videoTexture = null; + this.videoTextureSource = null; + } + + stop(): this { + return this; + } + + play(): this { + return this; + } + + setLoop(value?: boolean): this { + return this; + } +} diff --git a/src/ui/mystery-encounter-ui-handler.ts b/src/ui/mystery-encounter-ui-handler.ts index 04642bec37b..78eac8a3982 100644 --- a/src/ui/mystery-encounter-ui-handler.ts +++ b/src/ui/mystery-encounter-ui-handler.ts @@ -85,12 +85,6 @@ export default class MysteryEncounterUiHandler extends UiHandler { dexProgressIndicator.setScale(0.80); this.dexProgressContainer.add(dexProgressIndicator); this.dexProgressContainer.setInteractive(new Phaser.Geom.Rectangle(0, 0, 24, 28), Phaser.Geom.Rectangle.Contains); - this.dexProgressContainer.on("pointerover", () => { - (this.scene as BattleScene).ui.showTooltip(null, i18next.t("mysteryEncounter:affects_pokedex"), true); - }); - this.dexProgressContainer.on("pointerout", () => { - (this.scene as BattleScene).ui.hideTooltip(); - }); } show(args: any[]): boolean { @@ -555,7 +549,15 @@ export default class MysteryEncounterUiHandler extends UiHandler { targets: this.dexProgressContainer, y: -63, ease: "Sine.easeInOut", - duration: 750 + duration: 750, + onComplete: () => { + this.dexProgressContainer.on("pointerover", () => { + (this.scene as BattleScene).ui.showTooltip(null, i18next.t("mysteryEncounter:affects_pokedex"), true); + }); + this.dexProgressContainer.on("pointerout", () => { + (this.scene as BattleScene).ui.hideTooltip(); + }); + } }); } else if (!show && this.showDexProgress) { this.showDexProgress = false; @@ -565,6 +567,10 @@ export default class MysteryEncounterUiHandler extends UiHandler { y: -43, ease: "Sine.easeInOut", duration: 750, + onComplete: () => { + this.dexProgressContainer.off("pointerover"); + this.dexProgressContainer.off("pointerout"); + } }); } } From 4fe5467ee5d82f8f26b073607b8a2ed89779a70e Mon Sep 17 00:00:00 2001 From: InnocentGameDev Date: Thu, 15 Aug 2024 19:05:56 +0200 Subject: [PATCH 243/270] adjusting yml to match new labels --- .github/ISSUE_TEMPLATE/mystery_event.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/mystery_event.yml b/.github/ISSUE_TEMPLATE/mystery_event.yml index ecb396a1928..7ab6287f28a 100644 --- a/.github/ISSUE_TEMPLATE/mystery_event.yml +++ b/.github/ISSUE_TEMPLATE/mystery_event.yml @@ -1,7 +1,8 @@ name: Mysterious Encounter description: Propose a new mysterious encounter -title: "[M.E.] (Rarity)" -labels: ["New Mystery Encounter", "Balance Adjustment"] +title: "[M.E.] NameOfM.E. (RarityProposed)" +labels: ["Mystery Encounter Proposal"] +status: ["Idea review"] projects: ["AsdarDevelops/MEs / Events Project"] body: - type: input From 6812194882befbec27be7031d66babdd6866febc Mon Sep 17 00:00:00 2001 From: InnocentGameDev Date: Thu, 15 Aug 2024 19:59:37 +0200 Subject: [PATCH 244/270] fix yml whoopsie --- .github/ISSUE_TEMPLATE/mystery_event.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/mystery_event.yml b/.github/ISSUE_TEMPLATE/mystery_event.yml index 7ab6287f28a..f15a07919fd 100644 --- a/.github/ISSUE_TEMPLATE/mystery_event.yml +++ b/.github/ISSUE_TEMPLATE/mystery_event.yml @@ -2,7 +2,6 @@ name: Mysterious Encounter description: Propose a new mysterious encounter title: "[M.E.] NameOfM.E. (RarityProposed)" labels: ["Mystery Encounter Proposal"] -status: ["Idea review"] projects: ["AsdarDevelops/MEs / Events Project"] body: - type: input From 4eed29d1d838fcfc0c42d34f7164d1a7a4af0470 Mon Sep 17 00:00:00 2001 From: InnocentGameDev Date: Sat, 17 Aug 2024 17:58:32 +0200 Subject: [PATCH 245/270] Expanded 'Weird Dream' banlist and fixed a bug with the BST bump range --- .../encounters/weird-dream-encounter.ts | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/src/data/mystery-encounters/encounters/weird-dream-encounter.ts b/src/data/mystery-encounters/encounters/weird-dream-encounter.ts index d556a3b0c82..2f141566648 100644 --- a/src/data/mystery-encounters/encounters/weird-dream-encounter.ts +++ b/src/data/mystery-encounters/encounters/weird-dream-encounter.ts @@ -61,17 +61,20 @@ const excludedPokemon = [ Species.IRON_BOULDER, Species.IRON_CROWN, /** These are banned so they don't appear in the < 570 BST pool */ + Species.COSMOG, + Species.MELTAN, + Species.KUBFU, + Species.COSMOEM, + Species.POIPOLE, + Species.TERAPAGOS, + Species.TYPE_NULL, + Species.CALYREX, + Species.NAGANADEL, Species.URSHIFU, - Species.CUBCHOO, + Species.OGERPON, Species.OKIDOGI, Species.MUNKIDORI, Species.FEZANDIPITI, - Species.OGERPON, - Species.CALYREX, - Species.TYPE_NULL, - Species.TERAPAGOS, - Species.COSMOG, - Species.COSMOEM, ]; /** @@ -375,7 +378,7 @@ async function doNewTeamPostProcess(scene: BattleScene, transformations: Pokemon } // 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() <= 600) { + if (newPokemon.getSpeciesForm().getBaseStatTotal() <= 450) { const stats: Stat[] = [Stat.HP]; const baseStats = newPokemon.getSpeciesForm().baseStats.slice(0); // Attack or SpAtk From 8e3f13db43e25029bc96eed7fa6d9d8cfcc4555e Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Mon, 19 Aug 2024 10:54:09 -0400 Subject: [PATCH 246/270] adds Winstrate Challenge mystery encounter --- public/images/items.json | 3789 +++++++++-------- public/images/items.png | Bin 56766 -> 57721 bytes public/images/items/macho_brace.png | Bin 0 -> 372 bytes public/images/trainer/vicky.json | 41 + public/images/trainer/vicky.png | Bin 0 -> 765 bytes public/images/trainer/victor.json | 41 + public/images/trainer/victor.png | Bin 0 -> 794 bytes public/images/trainer/victoria.json | 41 + public/images/trainer/victoria.png | Bin 0 -> 813 bytes public/images/trainer/vito.json | 41 + public/images/trainer/vito.png | Bin 0 -> 765 bytes public/images/trainer/vivi.json | 41 + public/images/trainer/vivi.png | Bin 0 -> 713 bytes src/battle-scene.ts | 37 +- src/battle.ts | 4 +- src/data/dialogue.ts | 50 + .../encounters/a-trainers-test-encounter.ts | 17 +- .../encounters/absolute-avarice-encounter.ts | 19 +- .../an-offer-you-cant-refuse-encounter.ts | 4 +- .../encounters/berries-abound-encounter.ts | 8 +- .../encounters/clowning-around-encounter.ts | 13 +- .../encounters/dancing-lessons-encounter.ts | 4 +- .../encounters/dark-deal-encounter.ts | 4 +- .../encounters/delibirdy-encounter.ts | 14 +- .../department-store-sale-encounter.ts | 4 +- .../encounters/field-trip-encounter.ts | 4 +- .../encounters/fiery-fallout-encounter.ts | 4 +- .../encounters/fight-or-flight-encounter.ts | 4 +- .../encounters/lost-at-sea-encounter.ts | 2 +- .../mysterious-challengers-encounter.ts | 4 +- .../encounters/mysterious-chest-encounter.ts | 9 +- .../encounters/part-timer-encounter.ts | 4 +- .../encounters/safari-zone-encounter.ts | 24 +- .../shady-vitamin-dealer-encounter.ts | 14 +- .../slumbering-snorlax-encounter.ts | 4 +- .../the-pokemon-salesman-encounter.ts | 4 +- .../encounters/the-strong-stuff-encounter.ts | 26 +- .../the-winstrate-challenge-encounter.ts | 488 +++ .../encounters/training-session-encounter.ts | 6 +- .../encounters/trash-to-treasure-encounter.ts | 10 +- .../encounters/weird-dream-encounter.ts | 9 +- .../mystery-encounters/mystery-encounter.ts | 144 +- .../mystery-encounters/mystery-encounters.ts | 7 +- .../utils/encounter-phase-utils.ts | 44 +- .../encounter-transformation-sequence.ts | 44 +- src/data/trainer-config.ts | 15 + src/enums/mystery-encounter-mode.ts | 5 +- src/enums/mystery-encounter-type.ts | 3 +- src/enums/trainer-type.ts | 5 + src/field/mystery-encounter-intro.ts | 6 +- src/field/pokemon.ts | 3 +- src/interfaces/held-modifier-config.ts | 7 + src/locales/en/dialogue.ts | 45 + src/locales/en/modifier-type.ts | 1 + src/locales/en/mystery-encounter.ts | 4 +- .../the-winstrate-challenge-dialogue.ts | 24 + src/locales/en/trainers.ts | 6 + src/modifier/modifier-type.ts | 1 + src/modifier/modifier.ts | 48 + src/phases.ts | 15 +- src/phases/mystery-encounter-phases.ts | 39 +- src/system/game-data.ts | 6 +- .../clowning-around-encounter.test.ts | 21 +- .../encounters/delibirdy-encounter.test.ts | 32 +- .../mysterious-challengers-encounter.test.ts | 4 +- .../the-strong-stuff-encounter.test.ts | 2 +- .../mystery-encounter-utils.test.ts | 12 +- 67 files changed, 3164 insertions(+), 2167 deletions(-) create mode 100644 public/images/items/macho_brace.png create mode 100644 public/images/trainer/vicky.json create mode 100644 public/images/trainer/vicky.png create mode 100644 public/images/trainer/victor.json create mode 100644 public/images/trainer/victor.png create mode 100644 public/images/trainer/victoria.json create mode 100644 public/images/trainer/victoria.png create mode 100644 public/images/trainer/vito.json create mode 100644 public/images/trainer/vito.png create mode 100644 public/images/trainer/vivi.json create mode 100644 public/images/trainer/vivi.png create mode 100644 src/data/mystery-encounters/encounters/the-winstrate-challenge-encounter.ts create mode 100644 src/interfaces/held-modifier-config.ts create mode 100644 src/locales/en/mystery-encounters/the-winstrate-challenge-dialogue.ts diff --git a/public/images/items.json b/public/images/items.json index 01d28e79e58..5ac69059d64 100644 --- a/public/images/items.json +++ b/public/images/items.json @@ -3348,6 +3348,27 @@ "h": 23 } }, + { + "filename": "macho_brace", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 23, + "h": 23 + }, + "frame": { + "x": 162, + "y": 400, + "w": 23, + "h": 23 + } + }, { "filename": "mystic_water", "rotated": false, @@ -3363,8 +3384,8 @@ "h": 23 }, "frame": { - "x": 162, - "y": 400, + "x": 166, + "y": 263, "w": 20, "h": 23 } @@ -3383,27 +3404,6 @@ "w": 22, "h": 23 }, - "frame": { - "x": 166, - "y": 263, - "w": 22, - "h": 23 - } - }, - { - "filename": "normal_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, "frame": { "x": 168, "y": 286, @@ -3432,6 +3432,27 @@ "h": 22 } }, + { + "filename": "normal_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 179, + "y": 331, + "w": 22, + "h": 23 + } + }, { "filename": "petaya_berry", "rotated": false, @@ -3446,27 +3467,6 @@ "w": 22, "h": 23 }, - "frame": { - "x": 179, - "y": 331, - "w": 22, - "h": 23 - } - }, - { - "filename": "poison_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, "frame": { "x": 179, "y": 354, @@ -3475,7 +3475,7 @@ } }, { - "filename": "psychic_tera_shard", + "filename": "poison_tera_shard", "rotated": false, "trimmed": true, "sourceSize": { @@ -3496,7 +3496,7 @@ } }, { - "filename": "rare_candy", + "filename": "psychic_tera_shard", "rotated": false, "trimmed": true, "sourceSize": { @@ -3504,15 +3504,15 @@ "h": 32 }, "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 23, + "x": 6, + "y": 4, + "w": 22, "h": 23 }, "frame": { - "x": 182, + "x": 185, "y": 400, - "w": 23, + "w": 22, "h": 23 } }, @@ -3538,7 +3538,7 @@ } }, { - "filename": "rarer_candy", + "filename": "rare_candy", "rotated": false, "trimmed": true, "sourceSize": { @@ -3558,6 +3558,27 @@ "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": 161, + "y": 64, + "w": 23, + "h": 23 + } + }, { "filename": "healing_charm", "rotated": false, @@ -3574,7 +3595,7 @@ }, "frame": { "x": 161, - "y": 64, + "y": 87, "w": 23, "h": 22 } @@ -3595,7 +3616,7 @@ }, "frame": { "x": 161, - "y": 86, + "y": 109, "w": 22, "h": 23 } @@ -3615,14 +3636,14 @@ "h": 23 }, "frame": { - "x": 161, - "y": 109, + "x": 163, + "y": 132, "w": 22, "h": 23 } }, { - "filename": "sharp_beak", + "filename": "deep_sea_tooth", "rotated": false, "trimmed": true, "sourceSize": { @@ -3631,35 +3652,14 @@ }, "spriteSourceSize": { "x": 5, - "y": 5, - "w": 21, - "h": 23 - }, - "frame": { - "x": 163, - "y": 132, - "w": 21, - "h": 23 - } - }, - { - "filename": "dawn_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, "y": 6, - "w": 20, + "w": 22, "h": 21 }, "frame": { "x": 164, "y": 155, - "w": 20, + "w": 22, "h": 21 } }, @@ -3741,7 +3741,7 @@ "h": 23 }, "frame": { - "x": 183, + "x": 184, "y": 86, "w": 22, "h": 23 @@ -3769,7 +3769,7 @@ } }, { - "filename": "whipped_dream", + "filename": "sharp_beak", "rotated": false, "trimmed": true, "sourceSize": { @@ -3778,12 +3778,12 @@ }, "spriteSourceSize": { "x": 5, - "y": 4, + "y": 5, "w": 21, "h": 23 }, "frame": { - "x": 184, + "x": 185, "y": 132, "w": 21, "h": 23 @@ -3867,54 +3867,12 @@ "h": 22 }, "frame": { - "x": 205, + "x": 206, "y": 86, "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": 205, - "y": 108, - "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": 205, - "y": 130, - "w": 22, - "h": 22 - } - }, { "filename": "moon_stone", "rotated": false, @@ -4000,7 +3958,7 @@ } }, { - "filename": "deep_sea_tooth", + "filename": "charcoal", "rotated": false, "trimmed": true, "sourceSize": { @@ -4009,19 +3967,40 @@ }, "spriteSourceSize": { "x": 5, - "y": 6, + "y": 5, "w": 22, - "h": 21 + "h": 22 }, "frame": { - "x": 184, + "x": 186, "y": 155, "w": 22, - "h": 21 + "h": 22 } }, { - "filename": "relic_crown", + "filename": "mystery_egg", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 18 + }, + "frame": { + "x": 170, + "y": 176, + "w": 16, + "h": 18 + } + }, + { + "filename": "black_glasses", "rotated": false, "trimmed": true, "sourceSize": { @@ -4030,19 +4009,19 @@ }, "spriteSourceSize": { "x": 4, - "y": 7, + "y": 8, "w": 23, - "h": 18 + "h": 17 }, "frame": { - "x": 170, - "y": 176, + "x": 186, + "y": 177, "w": 23, - "h": 18 + "h": 17 } }, { - "filename": "sachet", + "filename": "whipped_dream", "rotated": false, "trimmed": true, "sourceSize": { @@ -4050,18 +4029,39 @@ "h": 32 }, "spriteSourceSize": { - "x": 6, + "x": 5, "y": 4, - "w": 18, + "w": 21, "h": 23 }, "frame": { "x": 175, "y": 194, - "w": 18, + "w": 21, "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": 176, + "y": 217, + "w": 22, + "h": 22 + } + }, { "filename": "dire_hit", "rotated": false, @@ -4077,54 +4077,12 @@ "h": 22 }, "frame": { - "x": 206, - "y": 152, + "x": 176, + "y": 239, "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": 176, - "y": 217, - "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": 176, - "y": 240, - "w": 17, - "h": 23 - } - }, { "filename": "dna_splicers", "rotated": false, @@ -4245,7 +4203,7 @@ "h": 22 }, "frame": { - "x": 227, + "x": 228, "y": 86, "w": 22, "h": 22 @@ -4287,8 +4245,8 @@ "h": 22 }, "frame": { - "x": 227, - "y": 108, + "x": 250, + "y": 86, "w": 22, "h": 22 } @@ -4308,8 +4266,8 @@ "h": 22 }, "frame": { - "x": 227, - "y": 130, + "x": 272, + "y": 64, "w": 22, "h": 22 } @@ -4329,7 +4287,7 @@ "h": 22 }, "frame": { - "x": 249, + "x": 272, "y": 86, "w": 22, "h": 22 @@ -4350,7 +4308,7 @@ "h": 22 }, "frame": { - "x": 272, + "x": 294, "y": 64, "w": 22, "h": 22 @@ -4371,8 +4329,8 @@ "h": 22 }, "frame": { - "x": 249, - "y": 108, + "x": 294, + "y": 86, "w": 22, "h": 22 } @@ -4391,258 +4349,6 @@ "w": 22, "h": 22 }, - "frame": { - "x": 271, - "y": 86, - "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": 294, - "y": 64, - "w": 22, - "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": 249, - "y": 130, - "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": 228, - "y": 152, - "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": 271, - "y": 108, - "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": 293, - "y": 86, - "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": 271, - "y": 130, - "w": 22, - "h": 22 - } - }, - { - "filename": "protector", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 250, - "y": 152, - "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": 293, - "y": 108, - "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": 293, - "y": 130, - "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": 272, - "y": 152, - "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": 294, - "y": 152, - "w": 22, - "h": 22 - } - }, - { - "filename": "shed_shell", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, "frame": { "x": 317, "y": 42, @@ -4651,7 +4357,7 @@ } }, { - "filename": "starf_berry", + "filename": "guard_spec", "rotated": false, "trimmed": true, "sourceSize": { @@ -4672,28 +4378,7 @@ } }, { - "filename": "steel_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 315, - "y": 86, - "w": 22, - "h": 22 - } - }, - { - "filename": "thick_club", + "filename": "ice_memory", "rotated": false, "trimmed": true, "sourceSize": { @@ -4714,7 +4399,28 @@ } }, { - "filename": "thunder_stone", + "filename": "ice_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 316, + "y": 86, + "w": 22, + "h": 22 + } + }, + { + "filename": "magmarizer", "rotated": false, "trimmed": true, "sourceSize": { @@ -4735,133 +4441,7 @@ } }, { - "filename": "tm_bug", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 315, - "y": 108, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_dark", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 315, - "y": 130, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_dragon", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 337, - "y": 86, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_electric", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 337, - "y": 108, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_fairy", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 337, - "y": 130, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_fighting", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 316, - "y": 152, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_fire", + "filename": "mini_black_hole", "rotated": false, "trimmed": true, "sourceSize": { @@ -4876,7 +4456,7 @@ }, "frame": { "x": 338, - "y": 152, + "y": 86, "w": 22, "h": 22 } @@ -4924,7 +4504,7 @@ } }, { - "filename": "tm_flying", + "filename": "poison_memory", "rotated": false, "trimmed": true, "sourceSize": { @@ -4945,70 +4525,7 @@ } }, { - "filename": "tm_ghost", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 359, - "y": 86, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_grass", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 359, - "y": 108, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_ground", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 359, - "y": 130, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_ice", + "filename": "protector", "rotated": false, "trimmed": true, "sourceSize": { @@ -5023,11 +4540,74 @@ }, "frame": { "x": 360, - "y": 152, + "y": 86, "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": 382, + "y": 64, + "w": 18, + "h": 23 + } + }, + { + "filename": "psychic_memory", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 400, + "y": 62, + "w": 22, + "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": 382, + "y": 87, + "w": 20, + "h": 21 + } + }, { "filename": "hard_meteorite", "rotated": false, @@ -5043,14 +4623,14 @@ "h": 22 }, "frame": { - "x": 382, - "y": 64, + "x": 402, + "y": 84, "w": 20, "h": 22 } }, { - "filename": "tm_normal", + "filename": "potion", "rotated": false, "trimmed": true, "sourceSize": { @@ -5058,20 +4638,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 5, + "x": 8, "y": 5, - "w": 22, - "h": 22 + "w": 17, + "h": 23 }, "frame": { - "x": 381, - "y": 86, - "w": 22, - "h": 22 + "x": 196, + "y": 194, + "w": 17, + "h": 23 } }, { - "filename": "tm_poison", + "filename": "super_potion", "rotated": false, "trimmed": true, "sourceSize": { @@ -5079,142 +4659,16 @@ "h": 32 }, "spriteSourceSize": { - "x": 5, + "x": 8, "y": 5, - "w": 22, - "h": 22 + "w": 17, + "h": 23 }, "frame": { - "x": 381, - "y": 108, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_psychic", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 381, - "y": 130, - "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": 403, - "y": 62, - "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": 403, - "y": 82, - "w": 23, - "h": 20 - } - }, - { - "filename": "coupon", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 23, - "h": 19 - }, - "frame": { - "x": 403, - "y": 102, - "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": 403, - "y": 121, - "w": 23, - "h": 19 - } - }, - { - "filename": "mystic_ticket", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 23, - "h": 19 - }, - "frame": { - "x": 403, - "y": 140, - "w": 23, - "h": 19 + "x": 198, + "y": 217, + "w": 17, + "h": 23 } }, { @@ -5232,14 +4686,14 @@ "h": 21 }, "frame": { - "x": 382, - "y": 152, + "x": 198, + "y": 240, "w": 21, "h": 21 } }, { - "filename": "pair_of_tickets", + "filename": "rock_memory", "rotated": false, "trimmed": true, "sourceSize": { @@ -5247,16 +4701,37 @@ "h": 32 }, "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 23, - "h": 19 + "x": 5, + "y": 5, + "w": 22, + "h": 22 }, "frame": { - "x": 403, - "y": 159, - "w": 23, - "h": 19 + "x": 186, + "y": 261, + "w": 22, + "h": 22 + } + }, + { + "filename": "metal_coat", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 5, + "w": 19, + "h": 22 + }, + "frame": { + "x": 190, + "y": 283, + "w": 19, + "h": 22 } }, { @@ -5274,14 +4749,14 @@ "h": 22 }, "frame": { - "x": 193, - "y": 176, + "x": 208, + "y": 261, "w": 15, "h": 22 } }, { - "filename": "tm_rock", + "filename": "scroll_of_darkness", "rotated": false, "trimmed": true, "sourceSize": { @@ -5295,14 +4770,14 @@ "h": 22 }, "frame": { - "x": 208, - "y": 174, + "x": 209, + "y": 283, "w": 22, "h": 22 } }, { - "filename": "tm_steel", + "filename": "scroll_of_waters", "rotated": false, "trimmed": true, "sourceSize": { @@ -5316,14 +4791,14 @@ "h": 22 }, "frame": { - "x": 230, - "y": 174, + "x": 193, + "y": 305, "w": 22, "h": 22 } }, { - "filename": "tm_water", + "filename": "shed_shell", "rotated": false, "trimmed": true, "sourceSize": { @@ -5337,14 +4812,14 @@ "h": 22 }, "frame": { - "x": 252, - "y": 174, + "x": 215, + "y": 305, "w": 22, "h": 22 } }, { - "filename": "water_memory", + "filename": "starf_berry", "rotated": false, "trimmed": true, "sourceSize": { @@ -5358,14 +4833,14 @@ "h": 22 }, "frame": { - "x": 274, - "y": 174, + "x": 201, + "y": 327, "w": 22, "h": 22 } }, { - "filename": "water_stone", + "filename": "steel_memory", "rotated": false, "trimmed": true, "sourceSize": { @@ -5379,50 +4854,8 @@ "h": 22 }, "frame": { - "x": 296, - "y": 174, - "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": 318, - "y": 174, - "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": 340, - "y": 174, + "x": 201, + "y": 349, "w": 22, "h": 22 } @@ -5442,77 +4875,14 @@ "h": 22 }, "frame": { - "x": 362, - "y": 174, + "x": 223, + "y": 327, "w": 20, "h": 22 } }, { - "filename": "poison_barb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 21, - "h": 21 - }, - "frame": { - "x": 382, - "y": 173, - "w": 21, - "h": 21 - } - }, - { - "filename": "black_glasses", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 23, - "h": 17 - }, - "frame": { - "x": 403, - "y": 178, - "w": 23, - "h": 17 - } - }, - { - "filename": "metal_coat", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 19, - "h": 22 - }, - "frame": { - "x": 193, - "y": 198, - "w": 19, - "h": 22 - } - }, - { - "filename": "x_defense", + "filename": "thick_club", "rotated": false, "trimmed": true, "sourceSize": { @@ -5526,14 +4896,14 @@ "h": 22 }, "frame": { - "x": 212, - "y": 196, + "x": 223, + "y": 349, "w": 22, "h": 22 } }, { - "filename": "x_sp_atk", + "filename": "thunder_stone", "rotated": false, "trimmed": true, "sourceSize": { @@ -5547,14 +4917,14 @@ "h": 22 }, "frame": { - "x": 234, - "y": 196, + "x": 203, + "y": 371, "w": 22, "h": 22 } }, { - "filename": "x_sp_def", + "filename": "tm_bug", "rotated": false, "trimmed": true, "sourceSize": { @@ -5568,14 +4938,14 @@ "h": 22 }, "frame": { - "x": 256, - "y": 196, + "x": 225, + "y": 371, "w": 22, "h": 22 } }, { - "filename": "x_speed", + "filename": "tm_dark", "rotated": false, "trimmed": true, "sourceSize": { @@ -5589,14 +4959,14 @@ "h": 22 }, "frame": { - "x": 278, - "y": 196, + "x": 207, + "y": 393, "w": 22, "h": 22 } }, { - "filename": "sweet_apple", + "filename": "tm_dragon", "rotated": false, "trimmed": true, "sourceSize": { @@ -5605,19 +4975,19 @@ }, "spriteSourceSize": { "x": 5, - "y": 6, + "y": 5, "w": 22, - "h": 21 + "h": 22 }, "frame": { - "x": 300, - "y": 196, + "x": 229, + "y": 393, "w": 22, - "h": 21 + "h": 22 } }, { - "filename": "syrupy_apple", + "filename": "relic_gold", "rotated": false, "trimmed": true, "sourceSize": { @@ -5625,289 +4995,16 @@ "h": 32 }, "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 21 + "x": 9, + "y": 11, + "w": 15, + "h": 11 }, "frame": { - "x": 322, - "y": 196, - "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": 344, - "y": 196, - "w": 22, - "h": 21 - } - }, - { - "filename": "quick_claw", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 19, - "h": 21 - }, - "frame": { - "x": 193, - "y": 220, - "w": 19, - "h": 21 - } - }, - { - "filename": "deep_sea_scale", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 20 - }, - "frame": { - "x": 212, - "y": 218, - "w": 22, - "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": 234, - "y": 218, - "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": 256, - "y": 218, - "w": 22, - "h": 20 - } - }, - { - "filename": "tera_orb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 20 - }, - "frame": { - "x": 278, - "y": 218, - "w": 22, - "h": 20 - } - }, - { - "filename": "shiny_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 21, - "h": 21 - }, - "frame": { - "x": 300, - "y": 217, - "w": 21, - "h": 21 - } - }, - { - "filename": "zoom_lens", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 21, - "h": 21 - }, - "frame": { - "x": 321, - "y": 217, - "w": 21, - "h": 21 - } - }, - { - "filename": "black_sludge", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 24, - "h": 24 - }, - "spriteSourceSize": { - "x": 1, - "y": 2, - "w": 22, - "h": 19 - }, - "frame": { - "x": 342, - "y": 217, - "w": 22, - "h": 19 - } - }, - { - "filename": "spell_tag", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 19, - "h": 21 - }, - "frame": { - "x": 193, - "y": 241, - "w": 19, - "h": 21 - } - }, - { - "filename": "blunder_policy", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 19 - }, - "frame": { - "x": 212, - "y": 238, - "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": 234, - "y": 238, - "w": 22, - "h": 19 - } - }, - { - "filename": "upgrade", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 22, - "h": 19 - }, - "frame": { - "x": 256, - "y": 238, - "w": 22, - "h": 19 + "x": 207, + "y": 415, + "w": 15, + "h": 11 } }, { @@ -5925,8 +5022,8 @@ "h": 17 }, "frame": { - "x": 278, - "y": 238, + "x": 206, + "y": 108, "w": 23, "h": 17 } @@ -5946,14 +5043,14 @@ "h": 17 }, "frame": { - "x": 301, - "y": 238, + "x": 229, + "y": 108, "w": 23, "h": 17 } }, { - "filename": "soothe_bell", + "filename": "coupon", "rotated": false, "trimmed": true, "sourceSize": { @@ -5961,15 +5058,372 @@ "h": 32 }, "spriteSourceSize": { - "x": 8, + "x": 4, + "y": 7, + "w": 23, + "h": 19 + }, + "frame": { + "x": 252, + "y": 108, + "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": 275, + "y": 108, + "w": 23, + "h": 19 + } + }, + { + "filename": "mystic_ticket", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 23, + "h": 19 + }, + "frame": { + "x": 298, + "y": 108, + "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": 321, + "y": 108, + "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": 344, + "y": 108, + "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": 367, + "y": 108, + "w": 23, + "h": 20 + } + }, + { + "filename": "tm_electric", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, "y": 5, - "w": 17, + "w": 22, "h": 22 }, "frame": { - "x": 366, - "y": 196, - "w": 17, + "x": 206, + "y": 125, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_fairy", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 228, + "y": 125, + "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": 250, + "y": 127, + "w": 22, + "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": 272, + "y": 127, + "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": 294, + "y": 127, + "w": 22, + "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": 316, + "y": 127, + "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": 338, + "y": 128, + "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": 360, + "y": 128, + "w": 22, + "h": 21 + } + }, + { + "filename": "tm_fighting", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 208, + "y": 147, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_fire", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 230, + "y": 147, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_flying", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 252, + "y": 147, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_ghost", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 274, + "y": 147, + "w": 22, "h": 22 } }, @@ -5988,35 +5442,35 @@ "h": 20 }, "frame": { - "x": 383, - "y": 194, + "x": 296, + "y": 147, "w": 20, "h": 20 } }, { - "filename": "douse_drive", + "filename": "black_sludge", "rotated": false, "trimmed": true, "sourceSize": { - "w": 32, - "h": 32 + "w": 24, + "h": 24 }, "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 23, - "h": 17 + "x": 1, + "y": 2, + "w": 22, + "h": 19 }, "frame": { - "x": 403, - "y": 195, - "w": 23, - "h": 17 + "x": 316, + "y": 148, + "w": 22, + "h": 19 } }, { - "filename": "shock_drive", + "filename": "relic_crown", "rotated": false, "trimmed": true, "sourceSize": { @@ -6025,15 +5479,162 @@ }, "spriteSourceSize": { "x": 4, - "y": 8, + "y": 7, "w": 23, - "h": 17 + "h": 18 }, "frame": { - "x": 403, - "y": 212, + "x": 338, + "y": 149, "w": 23, - "h": 17 + "h": 18 + } + }, + { + "filename": "blunder_policy", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 19 + }, + "frame": { + "x": 361, + "y": 149, + "w": 22, + "h": 19 + } + }, + { + "filename": "tm_grass", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 209, + "y": 169, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_ground", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 231, + "y": 169, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_ice", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 253, + "y": 169, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_normal", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 275, + "y": 169, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_poison", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 297, + "y": 167, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_psychic", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 319, + "y": 167, + "w": 22, + "h": 22 } }, { @@ -6051,12 +5652,348 @@ "h": 20 }, "frame": { - "x": 383, - "y": 214, + "x": 341, + "y": 167, "w": 20, "h": 20 } }, + { + "filename": "dubious_disc", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 22, + "h": 19 + }, + "frame": { + "x": 361, + "y": 168, + "w": 22, + "h": 19 + } + }, + { + "filename": "tm_rock", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 213, + "y": 191, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_steel", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 235, + "y": 191, + "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": 257, + "y": 191, + "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": 215, + "y": 213, + "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": 237, + "y": 213, + "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": 259, + "y": 213, + "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": 279, + "y": 191, + "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": 301, + "y": 189, + "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": 281, + "y": 213, + "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": 323, + "y": 189, + "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": 303, + "y": 211, + "w": 22, + "h": 22 + } + }, + { + "filename": "poison_barb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 21, + "h": 21 + }, + "frame": { + "x": 325, + "y": 211, + "w": 21, + "h": 21 + } + }, + { + "filename": "shiny_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 21, + "h": 21 + }, + "frame": { + "x": 345, + "y": 187, + "w": 21, + "h": 21 + } + }, + { + "filename": "quick_claw", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 19, + "h": 21 + }, + "frame": { + "x": 366, + "y": 187, + "w": 19, + "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": 346, + "y": 208, + "w": 22, + "h": 20 + } + }, { "filename": "apicot_berry", "rotated": false, @@ -6072,14 +6009,56 @@ "h": 20 }, "frame": { - "x": 364, - "y": 218, + "x": 368, + "y": 208, "w": 19, "h": 20 } }, { - "filename": "wise_glasses", + "filename": "zoom_lens", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 21, + "h": 21 + }, + "frame": { + "x": 219, + "y": 235, + "w": 21, + "h": 21 + } + }, + { + "filename": "upgrade", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 7, + "w": 22, + "h": 19 + }, + "frame": { + "x": 240, + "y": 235, + "w": 22, + "h": 19 + } + }, + { + "filename": "douse_drive", "rotated": false, "trimmed": true, "sourceSize": { @@ -6093,33 +6072,12 @@ "h": 17 }, "frame": { - "x": 403, - "y": 229, + "x": 262, + "y": 235, "w": 23, "h": 17 } }, - { - "filename": "everstone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 17 - }, - "frame": { - "x": 383, - "y": 234, - "w": 20, - "h": 17 - } - }, { "filename": "big_mushroom", "rotated": false, @@ -6135,54 +6093,12 @@ "h": 19 }, "frame": { - "x": 324, - "y": 238, + "x": 285, + "y": 235, "w": 19, "h": 19 } }, - { - "filename": "metal_alloy", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 7, - "w": 21, - "h": 19 - }, - "frame": { - "x": 343, - "y": 236, - "w": 21, - "h": 19 - } - }, - { - "filename": "candy_jar", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 19, - "h": 20 - }, - "frame": { - "x": 364, - "y": 238, - "w": 19, - "h": 20 - } - }, { "filename": "gb", "rotated": false, @@ -6198,12 +6114,33 @@ "h": 20 }, "frame": { - "x": 383, - "y": 251, + "x": 304, + "y": 233, "w": 20, "h": 20 } }, + { + "filename": "soothe_bell", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 17, + "h": 22 + }, + "frame": { + "x": 223, + "y": 256, + "w": 17, + "h": 22 + } + }, { "filename": "magnet", "rotated": false, @@ -6219,12 +6156,117 @@ "h": 20 }, "frame": { - "x": 403, - "y": 246, + "x": 240, + "y": 254, "w": 20, "h": 20 } }, + { + "filename": "candy_jar", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 19, + "h": 20 + }, + "frame": { + "x": 390, + "y": 108, + "w": 19, + "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": 409, + "y": 106, + "w": 17, + "h": 20 + } + }, + { + "filename": "spell_tag", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 6, + "w": 19, + "h": 21 + }, + "frame": { + "x": 382, + "y": 128, + "w": 19, + "h": 21 + } + }, + { + "filename": "lucky_egg", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 6, + "w": 17, + "h": 20 + }, + "frame": { + "x": 409, + "y": 126, + "w": 17, + "h": 20 + } + }, + { + "filename": "hard_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 19, + "h": 20 + }, + "frame": { + "x": 383, + "y": 149, + "w": 19, + "h": 20 + } + }, { "filename": "masterpiece_teacup", "rotated": false, @@ -6240,12 +6282,75 @@ "h": 18 }, "frame": { - "x": 212, - "y": 257, + "x": 383, + "y": 169, "w": 21, "h": 18 } }, + { + "filename": "mb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 385, + "y": 187, + "w": 20, + "h": 20 + } + }, + { + "filename": "pb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 387, + "y": 207, + "w": 20, + "h": 20 + } + }, + { + "filename": "metal_alloy", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 7, + "w": 21, + "h": 19 + }, + "frame": { + "x": 405, + "y": 146, + "w": 21, + "h": 19 + } + }, { "filename": "old_gateau", "rotated": false, @@ -6261,8 +6366,8 @@ "h": 18 }, "frame": { - "x": 233, - "y": 257, + "x": 405, + "y": 165, "w": 21, "h": 18 } @@ -6282,14 +6387,14 @@ "h": 18 }, "frame": { - "x": 254, - "y": 257, + "x": 405, + "y": 183, "w": 21, "h": 18 } }, { - "filename": "hard_stone", + "filename": "miracle_seed", "rotated": false, "trimmed": true, "sourceSize": { @@ -6298,19 +6403,19 @@ }, "spriteSourceSize": { "x": 6, - "y": 6, + "y": 7, "w": 19, - "h": 20 + "h": 19 }, "frame": { - "x": 193, - "y": 262, + "x": 407, + "y": 201, "w": 19, - "h": 20 + "h": 19 } }, { - "filename": "mb", + "filename": "shock_drive", "rotated": false, "trimmed": true, "sourceSize": { @@ -6318,20 +6423,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 + "x": 4, + "y": 8, + "w": 23, + "h": 17 }, "frame": { - "x": 190, - "y": 282, - "w": 20, - "h": 20 + "x": 346, + "y": 228, + "w": 23, + "h": 17 } }, { - "filename": "golden_egg", + "filename": "dark_stone", "rotated": false, "trimmed": true, "sourceSize": { @@ -6340,35 +6445,14 @@ }, "spriteSourceSize": { "x": 7, - "y": 6, - "w": 17, - "h": 20 - }, - "frame": { - "x": 193, - "y": 302, - "w": 17, - "h": 20 - } - }, - { - "filename": "unremarkable_teacup", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, "y": 7, - "w": 21, + "w": 18, "h": 18 }, "frame": { - "x": 212, - "y": 275, - "w": 21, + "x": 369, + "y": 228, + "w": 18, "h": 18 } }, @@ -6387,14 +6471,14 @@ "h": 19 }, "frame": { - "x": 233, - "y": 275, + "x": 387, + "y": 227, "w": 20, "h": 19 } }, { - "filename": "pb", + "filename": "razor_fang", "rotated": false, "trimmed": true, "sourceSize": { @@ -6402,20 +6486,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 6, + "x": 7, "y": 6, - "w": 20, + "w": 18, "h": 20 }, "frame": { - "x": 253, - "y": 275, - "w": 20, + "x": 407, + "y": 220, + "w": 18, "h": 20 } }, { - "filename": "pb_gold", + "filename": "unremarkable_teacup", "rotated": false, "trimmed": true, "sourceSize": { @@ -6423,57 +6507,99 @@ "h": 32 }, "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 210, - "y": 293, - "w": 20, - "h": 20 - } - }, - { - "filename": "power_herb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 24, - "h": 24 - }, - "spriteSourceSize": { - "x": 2, - "y": 3, - "w": 20, - "h": 19 - }, - "frame": { - "x": 230, - "y": 294, - "w": 20, - "h": 19 - } - }, - { - "filename": "razor_claw", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, + "x": 5, "y": 7, + "w": 21, + "h": 18 + }, + "frame": { + "x": 325, + "y": 232, + "w": 21, + "h": 18 + } + }, + { + "filename": "wise_glasses", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 8, + "w": 23, + "h": 17 + }, + "frame": { + "x": 346, + "y": 245, + "w": 23, + "h": 17 + } + }, + { + "filename": "everstone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, "w": 20, + "h": 17 + }, + "frame": { + "x": 369, + "y": 246, + "w": 20, + "h": 17 + } + }, + { + "filename": "flame_orb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 7, + "w": 18, + "h": 18 + }, + "frame": { + "x": 389, + "y": 246, + "w": 18, + "h": 18 + } + }, + { + "filename": "oval_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 7, + "w": 18, "h": 19 }, "frame": { - "x": 250, - "y": 295, - "w": 20, + "x": 407, + "y": 240, + "w": 18, "h": 19 } }, @@ -6492,12 +6618,75 @@ "h": 16 }, "frame": { - "x": 210, - "y": 313, + "x": 240, + "y": 274, "w": 20, "h": 16 } }, + { + "filename": "prism_scale", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 9, + "y": 8, + "w": 15, + "h": 15 + }, + "frame": { + "x": 231, + "y": 290, + "w": 15, + "h": 15 + } + }, + { + "filename": "abomasite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 246, + "y": 290, + "w": 16, + "h": 16 + } + }, + { + "filename": "pb_gold", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 237, + "y": 306, + "w": 20, + "h": 20 + } + }, { "filename": "rb", "rotated": false, @@ -6513,8 +6702,8 @@ "h": 20 }, "frame": { - "x": 230, - "y": 313, + "x": 243, + "y": 326, "w": 20, "h": 20 } @@ -6534,8 +6723,8 @@ "h": 20 }, "frame": { - "x": 250, - "y": 314, + "x": 245, + "y": 346, "w": 20, "h": 20 } @@ -6555,8 +6744,8 @@ "h": 20 }, "frame": { - "x": 201, - "y": 329, + "x": 247, + "y": 366, "w": 20, "h": 20 } @@ -6576,14 +6765,35 @@ "h": 20 }, "frame": { - "x": 201, - "y": 349, + "x": 257, + "y": 306, "w": 20, "h": 20 } }, { - "filename": "razor_fang", + "filename": "power_herb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 24, + "h": 24 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 20, + "h": 19 + }, + "frame": { + "x": 263, + "y": 326, + "w": 20, + "h": 19 + } + }, + { + "filename": "razor_claw", "rotated": false, "trimmed": true, "sourceSize": { @@ -6591,16 +6801,16 @@ "h": 32 }, "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 18, - "h": 20 + "x": 6, + "y": 7, + "w": 20, + "h": 19 }, "frame": { - "x": 203, - "y": 369, - "w": 18, - "h": 20 + "x": 265, + "y": 345, + "w": 20, + "h": 19 } }, { @@ -6618,14 +6828,14 @@ "h": 19 }, "frame": { - "x": 221, - "y": 333, + "x": 267, + "y": 364, "w": 20, "h": 19 } }, { - "filename": "miracle_seed", + "filename": "light_ball", "rotated": false, "trimmed": true, "sourceSize": { @@ -6633,16 +6843,58 @@ "h": 32 }, "spriteSourceSize": { - "x": 6, + "x": 7, "y": 7, - "w": 19, - "h": 19 + "w": 18, + "h": 18 }, "frame": { - "x": 221, - "y": 352, - "w": 19, - "h": 19 + "x": 251, + "y": 386, + "w": 18, + "h": 18 + } + }, + { + "filename": "light_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 7, + "w": 18, + "h": 18 + }, + "frame": { + "x": 269, + "y": 383, + "w": 18, + "h": 18 + } + }, + { + "filename": "toxic_orb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 7, + "w": 18, + "h": 18 + }, + "frame": { + "x": 251, + "y": 404, + "w": 18, + "h": 18 } }, { @@ -6660,12 +6912,33 @@ "h": 18 }, "frame": { - "x": 221, - "y": 371, + "x": 269, + "y": 401, "w": 20, "h": 18 } }, + { + "filename": "relic_band", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 9, + "w": 17, + "h": 16 + }, + "frame": { + "x": 407, + "y": 259, + "w": 17, + "h": 16 + } + }, { "filename": "wl_antidote", "rotated": false, @@ -6681,117 +6954,12 @@ "h": 18 }, "frame": { - "x": 241, - "y": 334, + "x": 324, + "y": 250, "w": 20, "h": 18 } }, - { - "filename": "oval_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 18, - "h": 19 - }, - "frame": { - "x": 240, - "y": 352, - "w": 18, - "h": 19 - } - }, - { - "filename": "dark_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 18, - "h": 18 - }, - "frame": { - "x": 241, - "y": 371, - "w": 18, - "h": 18 - } - }, - { - "filename": "relic_gold", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 9, - "y": 11, - "w": 15, - "h": 11 - }, - "frame": { - "x": 203, - "y": 389, - "w": 15, - "h": 11 - } - }, - { - "filename": "lucky_egg", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 17, - "h": 20 - }, - "frame": { - "x": 205, - "y": 400, - "w": 17, - "h": 20 - } - }, - { - "filename": "flame_orb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 18, - "h": 18 - }, - "frame": { - "x": 261, - "y": 334, - "w": 18, - "h": 18 - } - }, { "filename": "wl_awakening", "rotated": false, @@ -6807,8 +6975,8 @@ "h": 18 }, "frame": { - "x": 258, - "y": 352, + "x": 304, + "y": 253, "w": 20, "h": 18 } @@ -6828,8 +6996,8 @@ "h": 18 }, "frame": { - "x": 259, - "y": 370, + "x": 344, + "y": 262, "w": 20, "h": 18 } @@ -6849,33 +7017,12 @@ "h": 18 }, "frame": { - "x": 222, - "y": 389, + "x": 324, + "y": 268, "w": 20, "h": 18 } }, - { - "filename": "light_ball", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 18, - "h": 18 - }, - "frame": { - "x": 242, - "y": 389, - "w": 18, - "h": 18 - } - }, { "filename": "wl_custom_thief", "rotated": false, @@ -6891,8 +7038,8 @@ "h": 18 }, "frame": { - "x": 260, - "y": 388, + "x": 364, + "y": 263, "w": 20, "h": 18 } @@ -6912,33 +7059,12 @@ "h": 18 }, "frame": { - "x": 222, - "y": 407, + "x": 384, + "y": 264, "w": 20, "h": 18 } }, - { - "filename": "light_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 18, - "h": 18 - }, - "frame": { - "x": 242, - "y": 407, - "w": 18, - "h": 18 - } - }, { "filename": "wl_ether", "rotated": false, @@ -6954,8 +7080,8 @@ "h": 18 }, "frame": { - "x": 260, - "y": 406, + "x": 344, + "y": 280, "w": 20, "h": 18 } @@ -6975,8 +7101,8 @@ "h": 18 }, "frame": { - "x": 403, - "y": 266, + "x": 364, + "y": 281, "w": 20, "h": 18 } @@ -6996,8 +7122,8 @@ "h": 18 }, "frame": { - "x": 343, - "y": 255, + "x": 384, + "y": 282, "w": 20, "h": 18 } @@ -7017,8 +7143,8 @@ "h": 18 }, "frame": { - "x": 363, - "y": 258, + "x": 404, + "y": 275, "w": 20, "h": 18 } @@ -7038,8 +7164,8 @@ "h": 18 }, "frame": { - "x": 383, - "y": 271, + "x": 404, + "y": 293, "w": 20, "h": 18 } @@ -7059,8 +7185,8 @@ "h": 18 }, "frame": { - "x": 403, - "y": 284, + "x": 262, + "y": 252, "w": 20, "h": 18 } @@ -7080,8 +7206,8 @@ "h": 18 }, "frame": { - "x": 278, - "y": 255, + "x": 260, + "y": 270, "w": 20, "h": 18 } @@ -7101,8 +7227,8 @@ "h": 18 }, "frame": { - "x": 298, - "y": 255, + "x": 262, + "y": 288, "w": 20, "h": 18 } @@ -7122,14 +7248,14 @@ "h": 18 }, "frame": { - "x": 318, - "y": 257, + "x": 282, + "y": 254, "w": 20, "h": 18 } }, { - "filename": "mystery_egg", + "filename": "absolite", "rotated": false, "trimmed": true, "sourceSize": { @@ -7140,34 +7266,13 @@ "x": 8, "y": 8, "w": 16, - "h": 18 + "h": 16 }, "frame": { - "x": 270, - "y": 295, + "x": 280, + "y": 272, "w": 16, - "h": 18 - } - }, - { - "filename": "toxic_orb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 18, - "h": 18 - }, - "frame": { - "x": 270, - "y": 313, - "w": 18, - "h": 18 + "h": 16 } }, { @@ -7185,8 +7290,8 @@ "h": 18 }, "frame": { - "x": 279, - "y": 331, + "x": 282, + "y": 288, "w": 20, "h": 18 } @@ -7206,8 +7311,8 @@ "h": 18 }, "frame": { - "x": 279, - "y": 349, + "x": 277, + "y": 306, "w": 20, "h": 18 } @@ -7227,8 +7332,8 @@ "h": 18 }, "frame": { - "x": 279, - "y": 367, + "x": 283, + "y": 324, "w": 20, "h": 18 } @@ -7248,8 +7353,8 @@ "h": 18 }, "frame": { - "x": 280, - "y": 385, + "x": 285, + "y": 342, "w": 20, "h": 18 } @@ -7269,8 +7374,8 @@ "h": 18 }, "frame": { - "x": 280, - "y": 403, + "x": 287, + "y": 360, "w": 20, "h": 18 } @@ -7290,8 +7395,8 @@ "h": 18 }, "frame": { - "x": 273, - "y": 275, + "x": 287, + "y": 378, "w": 20, "h": 18 } @@ -7311,8 +7416,8 @@ "h": 18 }, "frame": { - "x": 293, - "y": 273, + "x": 289, + "y": 396, "w": 20, "h": 18 } @@ -7332,75 +7437,12 @@ "h": 18 }, "frame": { - "x": 313, - "y": 275, + "x": 297, + "y": 306, "w": 20, "h": 18 } }, - { - "filename": "abomasite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 286, - "y": 293, - "w": 16, - "h": 16 - } - }, - { - "filename": "absolite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 288, - "y": 309, - "w": 16, - "h": 16 - } - }, - { - "filename": "relic_band", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 9, - "w": 17, - "h": 16 - }, - "frame": { - "x": 302, - "y": 293, - "w": 17, - "h": 16 - } - }, { "filename": "aerodactylite", "rotated": false, @@ -7416,8 +7458,8 @@ "h": 16 }, "frame": { - "x": 304, - "y": 309, + "x": 303, + "y": 324, "w": 16, "h": 16 } @@ -7437,8 +7479,8 @@ "h": 16 }, "frame": { - "x": 319, - "y": 293, + "x": 296, + "y": 272, "w": 16, "h": 16 } @@ -7458,8 +7500,8 @@ "h": 16 }, "frame": { - "x": 320, - "y": 309, + "x": 305, + "y": 340, "w": 16, "h": 16 } @@ -7479,8 +7521,8 @@ "h": 16 }, "frame": { - "x": 299, - "y": 325, + "x": 302, + "y": 288, "w": 16, "h": 16 } @@ -7500,8 +7542,8 @@ "h": 16 }, "frame": { - "x": 299, - "y": 341, + "x": 307, + "y": 356, "w": 16, "h": 16 } @@ -7521,8 +7563,8 @@ "h": 16 }, "frame": { - "x": 315, - "y": 325, + "x": 307, + "y": 372, "w": 16, "h": 16 } @@ -7542,8 +7584,8 @@ "h": 16 }, "frame": { - "x": 299, - "y": 357, + "x": 318, + "y": 286, "w": 16, "h": 16 } @@ -7563,8 +7605,8 @@ "h": 16 }, "frame": { - "x": 315, - "y": 341, + "x": 309, + "y": 388, "w": 16, "h": 16 } @@ -7584,8 +7626,8 @@ "h": 16 }, "frame": { - "x": 315, - "y": 357, + "x": 309, + "y": 404, "w": 16, "h": 16 } @@ -7605,8 +7647,8 @@ "h": 16 }, "frame": { - "x": 333, - "y": 275, + "x": 318, + "y": 302, "w": 16, "h": 16 } @@ -7626,8 +7668,8 @@ "h": 16 }, "frame": { - "x": 335, - "y": 291, + "x": 319, + "y": 318, "w": 16, "h": 16 } @@ -7647,8 +7689,8 @@ "h": 16 }, "frame": { - "x": 336, - "y": 307, + "x": 321, + "y": 334, "w": 16, "h": 16 } @@ -7668,8 +7710,8 @@ "h": 16 }, "frame": { - "x": 331, - "y": 325, + "x": 323, + "y": 350, "w": 16, "h": 16 } @@ -7689,8 +7731,8 @@ "h": 16 }, "frame": { - "x": 331, - "y": 341, + "x": 323, + "y": 366, "w": 16, "h": 16 } @@ -7710,8 +7752,8 @@ "h": 16 }, "frame": { - "x": 331, - "y": 357, + "x": 325, + "y": 382, "w": 16, "h": 16 } @@ -7731,8 +7773,8 @@ "h": 16 }, "frame": { - "x": 300, - "y": 373, + "x": 325, + "y": 398, "w": 16, "h": 16 } @@ -7752,8 +7794,8 @@ "h": 16 }, "frame": { - "x": 300, - "y": 389, + "x": 334, + "y": 298, "w": 16, "h": 16 } @@ -7773,8 +7815,8 @@ "h": 16 }, "frame": { - "x": 316, - "y": 373, + "x": 335, + "y": 314, "w": 16, "h": 16 } @@ -7794,8 +7836,8 @@ "h": 16 }, "frame": { - "x": 300, - "y": 405, + "x": 337, + "y": 330, "w": 16, "h": 16 } @@ -7815,8 +7857,8 @@ "h": 16 }, "frame": { - "x": 316, - "y": 389, + "x": 339, + "y": 346, "w": 16, "h": 16 } @@ -7836,8 +7878,8 @@ "h": 16 }, "frame": { - "x": 316, - "y": 405, + "x": 339, + "y": 362, "w": 16, "h": 16 } @@ -7857,8 +7899,8 @@ "h": 16 }, "frame": { - "x": 332, - "y": 373, + "x": 341, + "y": 378, "w": 16, "h": 16 } @@ -7878,8 +7920,8 @@ "h": 16 }, "frame": { - "x": 332, - "y": 389, + "x": 341, + "y": 394, "w": 16, "h": 16 } @@ -7899,8 +7941,8 @@ "h": 16 }, "frame": { - "x": 332, - "y": 405, + "x": 341, + "y": 410, "w": 16, "h": 16 } @@ -7920,8 +7962,8 @@ "h": 16 }, "frame": { - "x": 347, - "y": 323, + "x": 351, + "y": 311, "w": 16, "h": 16 } @@ -7941,8 +7983,8 @@ "h": 16 }, "frame": { - "x": 347, - "y": 339, + "x": 353, + "y": 327, "w": 16, "h": 16 } @@ -7962,8 +8004,8 @@ "h": 16 }, "frame": { - "x": 347, - "y": 355, + "x": 355, + "y": 343, "w": 16, "h": 16 } @@ -7983,8 +8025,8 @@ "h": 16 }, "frame": { - "x": 348, - "y": 371, + "x": 355, + "y": 359, "w": 16, "h": 16 } @@ -8004,8 +8046,8 @@ "h": 16 }, "frame": { - "x": 348, - "y": 387, + "x": 357, + "y": 375, "w": 16, "h": 16 } @@ -8025,33 +8067,12 @@ "h": 16 }, "frame": { - "x": 348, - "y": 403, + "x": 357, + "y": 391, "w": 16, "h": 16 } }, - { - "filename": "prism_scale", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 9, - "y": 8, - "w": 15, - "h": 15 - }, - "frame": { - "x": 349, - "y": 276, - "w": 15, - "h": 15 - } - }, { "filename": "metagrossite", "rotated": false, @@ -8067,8 +8088,8 @@ "h": 16 }, "frame": { - "x": 364, - "y": 276, + "x": 357, + "y": 407, "w": 16, "h": 16 } @@ -8088,8 +8109,8 @@ "h": 16 }, "frame": { - "x": 364, - "y": 292, + "x": 367, + "y": 299, "w": 16, "h": 16 } @@ -8109,8 +8130,8 @@ "h": 16 }, "frame": { - "x": 380, - "y": 289, + "x": 383, + "y": 300, "w": 16, "h": 16 } @@ -8130,8 +8151,8 @@ "h": 16 }, "frame": { - "x": 380, - "y": 305, + "x": 399, + "y": 311, "w": 16, "h": 16 } @@ -8151,8 +8172,8 @@ "h": 16 }, "frame": { - "x": 364, - "y": 308, + "x": 369, + "y": 327, "w": 16, "h": 16 } @@ -8172,8 +8193,8 @@ "h": 16 }, "frame": { - "x": 363, - "y": 324, + "x": 371, + "y": 343, "w": 16, "h": 16 } @@ -8193,8 +8214,8 @@ "h": 16 }, "frame": { - "x": 363, - "y": 340, + "x": 371, + "y": 359, "w": 16, "h": 16 } @@ -8214,8 +8235,8 @@ "h": 16 }, "frame": { - "x": 396, - "y": 302, + "x": 373, + "y": 375, "w": 16, "h": 16 } @@ -8235,8 +8256,8 @@ "h": 16 }, "frame": { - "x": 380, - "y": 321, + "x": 373, + "y": 391, "w": 16, "h": 16 } @@ -8256,8 +8277,8 @@ "h": 16 }, "frame": { - "x": 396, - "y": 318, + "x": 373, + "y": 407, "w": 16, "h": 16 } @@ -8277,8 +8298,8 @@ "h": 16 }, "frame": { - "x": 379, - "y": 337, + "x": 385, + "y": 327, "w": 16, "h": 16 } @@ -8298,8 +8319,8 @@ "h": 16 }, "frame": { - "x": 396, - "y": 334, + "x": 387, + "y": 343, "w": 16, "h": 16 } @@ -8319,8 +8340,8 @@ "h": 16 }, "frame": { - "x": 379, - "y": 353, + "x": 387, + "y": 359, "w": 16, "h": 16 } @@ -8340,8 +8361,8 @@ "h": 16 }, "frame": { - "x": 395, - "y": 350, + "x": 401, + "y": 327, "w": 16, "h": 16 } @@ -8361,8 +8382,8 @@ "h": 16 }, "frame": { - "x": 395, - "y": 366, + "x": 389, + "y": 375, "w": 16, "h": 16 } @@ -8382,8 +8403,8 @@ "h": 16 }, "frame": { - "x": 364, - "y": 382, + "x": 389, + "y": 391, "w": 16, "h": 16 } @@ -8403,8 +8424,8 @@ "h": 16 }, "frame": { - "x": 364, - "y": 398, + "x": 389, + "y": 407, "w": 16, "h": 16 } @@ -8424,8 +8445,8 @@ "h": 16 }, "frame": { - "x": 380, - "y": 382, + "x": 403, + "y": 343, "w": 16, "h": 16 } @@ -8445,8 +8466,8 @@ "h": 16 }, "frame": { - "x": 380, - "y": 398, + "x": 403, + "y": 359, "w": 16, "h": 16 } @@ -8457,6 +8478,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:06a43a858ac0838c2d5400a7c8e124da:6c9201d0b6d07fc299c0fa41c226a22d:110e074689c9edd2c54833ce2e4d9270$" + "smartupdate": "$TexturePacker:SmartUpdate:c428fceb82c2d05d4e09932aca0e849e:b87abcdcfeb40d09d19eb74093035e71:110e074689c9edd2c54833ce2e4d9270$" } } diff --git a/public/images/items.png b/public/images/items.png index 2bf9a012139f43291a28c0b4b5d5d0668894c046..3f69fbd7406666783a2424e36ec5477a66c7cfe7 100644 GIT binary patch literal 57721 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�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

`e4+Q}cJdkFIy!&WYh4>OJW34HZ_u+vxSM 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 Wnu+y)Bnvk(;Ag07rcNSwWJ?9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fgp&Q^6;tJBEps?lLUdtfI ztR=<&|KFQ4$FTe86vHgbIZM_YJ$u!wIq2%WXYby9^NLEkloPcCsDZI0$S;_|;n|He zAZMqii(`n!`Q(HJ(gGqP4iAmBG_4nLaI}i<=2)QNQ7ls8a_Q)bI3COxK0yIEOM!w*d{$P>KtR{g+%3bA$WQHy?Gb!20k*;-&L)HlhTRU+kK zn}G+H!8|LC3>^+}2CZp(df&t>NODt8dCnB-Fo)ax>oSH5J12?t7BmJ6x1N?2e}ALH z;K`dLaqr1@If5ls`SS$t?Pb;Ekzj2+=gO<<)~U<%g3)`o2Qvfn3azU%aXMQ27VC&m5I4xzLm1jW12haT#b zi>(R)OVcHy6l};&t%*v(w;1_d1Y8yC3;LiIuJ;Akjcp{wmi#a|?IdL^WXC#x%G=b^ zy3-AAr-`BVeTev@7wkmZs1qk;AAR@{hzC7Hqz?iSVd~ppjr$4=@pvvMO07ZT*<2x; zCI}L5XYvOc_c>8Rs@}-jFUE2?kEj||YqVH27()9fx{DF6b+829FBV>d`k&4Pih5P9 z#9OFq=IZH%00LQhkdBr8?v4L5feiRJ(!taeUm$_o& z>$LIu{90q#-R3c0vbPEiQ8#-4+AGLk(4O@gJ%*@4uMO#kch@gh2FYA~|8ZYPe;X5Q z4(9oK4ph&E+S_5j2Mz{r3GNrP*vad%E=Lr?%MI3NYU!=fOx=r9@_K!(&$mwKO}-q8 v0QK|pGbnt0CTewkd%JYUx5wFc#;^DXWB@PGf)ELR00000NkvXXu0mjf`Px}e literal 0 HcmV?d00001 diff --git a/public/images/trainer/victor.json b/public/images/trainer/victor.json new file mode 100644 index 00000000000..5afa9704567 --- /dev/null +++ b/public/images/trainer/victor.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "victor.png", + "format": "RGBA8888", + "size": { + "w": 55, + "h": 53 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 12, + "y": 27, + "w": 55, + "h": 53 + }, + "frame": { + "x": 0, + "y": 0, + "w": 55, + "h": 53 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:64eff0f697754cdf9552b46342c9292a:611e0e2cacbd90c1229ce5443b2414f0:0cc0f5a2c1b2eedb46dd8318e8feb1d8$" + } +} diff --git a/public/images/trainer/victor.png b/public/images/trainer/victor.png new file mode 100644 index 0000000000000000000000000000000000000000..3ffddea24bbfff8db534d97e5eacf7f37a17334e GIT binary patch literal 794 zcmV+#1LgdQP){}NCzF}o^`2AEdmr|O;pN5Q5 z;Bid-WvZZbI~PuM>_Rv*iBVkIfQK#wTfYOVkxeKgf5+j%Ot?#_T4QA+L>#*?_tv4C zs#RW1SCC2fZa9B1-|3pfa4m5bzC^v4sHyu~5rX=eBio2U|sdW?8 zK&V>cdZVN=4yW2yLB*YIo2X=7r^8KV_`ShE<{UD(>fc~nQ{GMln^YkNf%ZB?OtK`eJi7F_}RqvChd%{uC1UO)oFjU?2JysrcH3!Ziv{~e@N>Fx zC+H5T?Fpulb7EzEbA(to6VJgo(aRAtDz?kXU2(R2)TDDSSLG4WW<>@E4{mbRER*!BP)ubcy zhMiqIsaNjEt_OM!cXDZWPkg=`*n>b1;jGgd?s;%P&M%xwydGR*>U;1wI$k|NSy`)@ ze(UXC8}xQ`RyF;3gZ$18nJC*3&JKC$5Utb_au6(pFekbX{dscB(jY6VJxrv!Tb8%4 z8lPqM(*}QVoJe=BMHZ&dHM-wdv{7qhm1Z4+=z$NuH@dhIW9$M+cAztrK&x7%O0 Ye+BL%B0!s5t^fc407*qoM6N<$g0)v~<^TWy literal 0 HcmV?d00001 diff --git a/public/images/trainer/victoria.json b/public/images/trainer/victoria.json new file mode 100644 index 00000000000..7917113621a --- /dev/null +++ b/public/images/trainer/victoria.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "victoria.png", + "format": "RGBA8888", + "size": { + "w": 52, + "h": 54 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 80, + "h": 80 + }, + "spriteSourceSize": { + "x": 14, + "y": 26, + "w": 52, + "h": 54 + }, + "frame": { + "x": 0, + "y": 0, + "w": 52, + "h": 54 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:4dafeae3674d63b12cc4d8044f67b5a3:7834687d784c31169256927f419c7958:cf0eb39e0a3f2e42f23ca29747d73c40$" + } +} diff --git a/public/images/trainer/victoria.png b/public/images/trainer/victoria.png new file mode 100644 index 0000000000000000000000000000000000000000..e2874f266adfd1a8df0bc7dc52043f35114cf485 GIT binary patch literal 813 zcmV+|1JeA7P)0000mP)t-s00000 z0022!N=i97Vw6gAN-29vT8lwBq;oO7dt$}S)!te;-lTix)k^=>z5oCJIms`400001 zbW%=J06^y0W&i*H32;bRa{vGf6951U69E94oEQKA0+vZcK~zY`t(NO{q#zK4EqiDn zp!5E3yM05=o*guM!Vfc^_)$gEmMqKfj3nd7Op&1&WISY0d;orZ2$@t|1$zV~@%A5- zje(^*irFY~Y~LNm9O0d9QAE^t9X;I`OP)PyNskJIamG!LA|#oIwVS%3Z-}*708JI#< zYQ{vIpuTc2Ge{ZP8I}^5P?j)i?Uv$r^VC{4BIi3ulP>xc1a+s_Ewm8OZ5+;&y2~TA z)ep=yOM`>w3M_a+4AC+1;uy`cXnGdDEs7!glxrVvzz9Lwh%r zw&kdKqswI9WHeIrs*J83n+)HlA#^pPw<_ae2Ic%l-kM=~!}Y0)SR|LtB%SbnE3_H5 zMHyDW{hSmf$)I?r@%8m(Jv2BBZ-v}UFdkf%Q@XeC#mJh}Aq{W(MxRO)8ARF-qY)g7 zl8chhoahh=s2~qUe_WttCC^cvdARf7DwO{r^^9`Ch8-tL_(Pl`DJgqOT8lwBi-U`lIa<9jF}-_Y#Y#cmqz5oCJfe_@)00001 zbW%=J06^y0W&i*H32;bRa{vGf6951U69E94oEQKA0%l1>K~zY`t(NPytsn@6o1(2K zt@nT1186tPYK(pOv3D!KCI|*~-CxY%E9hN^FEBap;lH3tI#2!;CBcOAUr6IVpfJ)z z@g}KeB;g&*y5C6uBD(pW(mW^sKspPMrr9h#_;*Ak@y*4iClW+%TFLa_9tq@Duul)! z@5Q5=dvD;9=qk0=Ba>LXM1UpXf-U2?q2yIff=p9I_G#|Nar~{QdQP^V)YqXA@cS*; zZ{!rE+Ic@CNlZHlMW_A(Y6(wZ7XZy@x}G}dsoCyw2psz~0UT;p&+ZP!7(?WRnS)-| zs9RGUl#C(o_OB$HBw@Z44aN+^uofQjiZ?`;Wf^3>z({>#gvi`d(-A|1T65HpweQlz z0X&U_o%D~xlQQD8+k5Zd$Bc|3|1vx`z<(sMJwnaNRg*2zojhK?ka%|Q4$I}bktk=& za)4|y=Ia(o+p3ifU#o&?+4-d=^B-Hg*8=X{(H12_!-DxyV?e70ys4!I*u`dRe>DBAQECg%qlfVs-& zXxHsLPWi`}V+8Jjdd+dojQBOFSIrMG_*FDg&wn2#B16o3#+yOm!0XDCvL*Kh2=A|w z^Iq@5C(3&?*w+Z7KXMY)RpbOvuPXz4;V=B0wXAfJ18|ES4?x%WbI!s63F!ksu@P!~ z1xOTH6s-s#rRWzutMdpr!YIz5l)^IbFV6Z^UxW>-<%vM)kxl;sMCdB-se#$Al%_OT zS|TR{lj|pNj9qkFQW{4+_qJ80$hTfXBEU%FrW!(`-BB2kU)m22Y!jhv!Lm4`MSks9 zgbGYsirYkDNz@nI16i`f$vp^MED5#`wkb?GZ#f4niSxS1=mCW=h7br)jjN1anHew| zV9&8(yK!O!&GbGa54S*VE)1;}q0XpH|FmcdOnpF@rpfe8gzF|cOl<%-c<{@h7Qm$r zw5H^Mbw_>HEjb12K(qq1fG=$8p5v@%h|}L@RJ} zTE(>4CX{#P!-aVQC*!h%Pztrs*Hw)Qo^!cX*(_6~_*OFQ4cE>h{r9sNdrcB1aoPPu>Ow00000NkvXXu0mjfrgJ)i literal 0 HcmV?d00001 diff --git a/src/battle-scene.ts b/src/battle-scene.ts index 2b1c4ba719e..d35c73c2a0d 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -14,7 +14,7 @@ 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 { getDefaultModifierTypeForTier, getEnemyModifierTypesForWave, getLuckString, getLuckTextTint, getModifierPoolForType, getPartyLuckValue, ModifierPoolType, PokemonHeldItemModifierType } from "./modifier/modifier-type"; +import { getDefaultModifierTypeForTier, getEnemyModifierTypesForWave, getLuckString, getLuckTextTint, getModifierPoolForType, getPartyLuckValue, ModifierPoolType } from "./modifier/modifier-type"; import AbilityBar from "./ui/ability-bar"; import { allAbilities, applyAbAttrs, applyPostBattleInitAbAttrs, BlockItemTheftAbAttr, DoubleBattleChanceAbAttr, IncrementMovePriorityAbAttr, PostBattleInitAbAttr } from "./data/ability"; import Battle, { BattleType, FixedBattleConfig } from "./battle"; @@ -67,12 +67,13 @@ import { UiTheme } from "#enums/ui-theme"; import { TimedEventManager } from "#app/timed-event-manager.js"; import i18next from "i18next"; import { TrainerType } from "#enums/trainer-type"; -import IMysteryEncounter from "./data/mystery-encounters/mystery-encounter"; +import MysteryEncounter from "./data/mystery-encounters/mystery-encounter"; import { allMysteryEncounters, AVERAGE_ENCOUNTERS_PER_RUN_TARGET, BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT, mysteryEncountersByBiome, WEIGHT_INCREMENT_ON_SPAWN_MISS } from "./data/mystery-encounters/mystery-encounters"; import { MysteryEncounterData } from "#app/data/mystery-encounters/mystery-encounter-data"; 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"; export const bypassLogin = import.meta.env.VITE_BYPASS_LOGIN === "1"; @@ -223,7 +224,7 @@ export default class BattleScene extends SceneBase { public pokemonInfoContainer: PokemonInfoContainer; private party: PlayerPokemon[]; public mysteryEncounterData: MysteryEncounterData = new MysteryEncounterData(null); - public lastMysteryEncounter: IMysteryEncounter; + public lastMysteryEncounter: MysteryEncounter; /** Combined Biome and Wave count text */ private biomeWaveText: Phaser.GameObjects.Text; private moneyText: Phaser.GameObjects.Text; @@ -1036,7 +1037,7 @@ export default class BattleScene extends SceneBase { } } - newBattle(waveIndex?: integer, battleType?: BattleType, trainerData?: TrainerData, double?: boolean, mysteryEncounter?: IMysteryEncounter): Battle { + newBattle(waveIndex?: integer, battleType?: BattleType, trainerData?: TrainerData, double?: boolean, mysteryEncounter?: MysteryEncounter): Battle { const _startingWave = Overrides.STARTING_WAVE_OVERRIDE || startingWave; const newWaveIndex = waveIndex || ((this.currentBattle?.waveIndex || (_startingWave - 1)) + 1); let newDouble: boolean; @@ -1066,6 +1067,10 @@ export default class BattleScene extends SceneBase { newBattleType = battleType; } + if (waveIndex === 64) { + newBattleType = BattleType.TRAINER; + } + if (newBattleType === BattleType.TRAINER) { const trainerType = this.arena.randomTrainerType(newWaveIndex); let doubleTrainer = false; @@ -2423,7 +2428,7 @@ export default class BattleScene extends SceneBase { }); } - generateEnemyModifiers(customHeldModifiers?: PokemonHeldItemModifierType[][]): Promise { + generateEnemyModifiers(heldModifiersConfigs?: HeldModifierConfig[][]): Promise { return new Promise(resolve => { if (this.currentBattle.battleSpec === BattleSpec.FINAL_BOSS) { return resolve(); @@ -2445,8 +2450,16 @@ export default class BattleScene extends SceneBase { } party.every((enemyPokemon: EnemyPokemon, i: integer) => { - if (customHeldModifiers && i < customHeldModifiers.length && customHeldModifiers[i] && customHeldModifiers[i].length > 0) { - customHeldModifiers[i].forEach(mt => mt.newModifier(enemyPokemon).add(this.enemyModifiers, false, this)); + if (heldModifiersConfigs && i < heldModifiersConfigs.length && heldModifiersConfigs[i] && heldModifiersConfigs[i].length > 0) { + heldModifiersConfigs[i].forEach(mt => { + const stackCount = mt.stackCount ?? 1; + // const isTransferable = mt.isTransferable ?? true; + const modifier = mt.modifierType.newModifier(enemyPokemon); + modifier.stackCount = stackCount; + // TODO: set isTransferable + // modifier.setIsTransferable(isTransferable); + this.addEnemyModifier(modifier, false, true); + }); return true; } @@ -2702,9 +2715,9 @@ export default class BattleScene extends SceneBase { * @param override - used to load session encounter when restarting game, etc. * @returns */ - getMysteryEncounter(override: IMysteryEncounter): IMysteryEncounter { + getMysteryEncounter(override: MysteryEncounter): MysteryEncounter { // Loading override or session encounter - let encounter: IMysteryEncounter; + let encounter: MysteryEncounter; if (!isNullOrUndefined(Overrides.MYSTERY_ENCOUNTER_OVERRIDE) && allMysteryEncounters.hasOwnProperty(Overrides.MYSTERY_ENCOUNTER_OVERRIDE)) { encounter = allMysteryEncounters[Overrides.MYSTERY_ENCOUNTER_OVERRIDE]; } else { @@ -2726,7 +2739,7 @@ export default class BattleScene extends SceneBase { } if (encounter) { - encounter = new IMysteryEncounter(encounter); + encounter = new MysteryEncounter(encounter); encounter.populateDialogueTokensFromRequirements(this); return encounter; } @@ -2755,7 +2768,7 @@ export default class BattleScene extends SceneBase { tier = Overrides.MYSTERY_ENCOUNTER_TIER_OVERRIDE; } - let availableEncounters: IMysteryEncounter[] = []; + let availableEncounters: MysteryEncounter[] = []; // New encounter will never be the same as the most recent encounter const previousEncounter = this.mysteryEncounterData.encounteredEvents?.length > 0 ? this.mysteryEncounterData.encounteredEvents[this.mysteryEncounterData.encounteredEvents.length - 1][0] : null; const biomeMysteryEncounters = mysteryEncountersByBiome.get(this.arena.biomeType) ?? []; @@ -2802,7 +2815,7 @@ export default class BattleScene extends SceneBase { } encounter = availableEncounters[Utils.randSeedInt(availableEncounters.length)]; // New encounter object to not dirty flags - encounter = new IMysteryEncounter(encounter); + encounter = new MysteryEncounter(encounter); encounter.populateDialogueTokensFromRequirements(this); return encounter; } diff --git a/src/battle.ts b/src/battle.ts index 7205b883eb9..bec0e4363a2 100644 --- a/src/battle.ts +++ b/src/battle.ts @@ -14,7 +14,7 @@ import { PlayerGender } from "#enums/player-gender"; import { Species } from "#enums/species"; import { TrainerType } from "#enums/trainer-type"; import i18next from "#app/plugins/i18n"; -import IMysteryEncounter from "./data/mystery-encounters/mystery-encounter"; +import MysteryEncounter from "./data/mystery-encounters/mystery-encounter"; import { MysteryEncounterMode } from "#enums/mystery-encounter-mode"; export enum BattleType { @@ -70,7 +70,7 @@ export default class Battle { public lastUsedPokeball: PokeballType; public playerFaints: number; // The amount of times pokemon on the players side have fainted public enemyFaints: number; // The amount of times pokemon on the enemies side have fainted - public mysteryEncounter: IMysteryEncounter; + public mysteryEncounter: MysteryEncounter; private rngCounter: integer = 0; diff --git a/src/data/dialogue.ts b/src/data/dialogue.ts index 5d4bea542de..d8659c15a56 100644 --- a/src/data/dialogue.ts +++ b/src/data/dialogue.ts @@ -735,6 +735,56 @@ export const trainerTypeDialogue: TrainerTypeDialogue = { ] } ], + [TrainerType.VICTOR]: [ + { + encounter: [ + "dialogue:winstrates_victor.encounter.1", + ], + victory: [ + "dialogue:winstrates_victor.victory.1" + ], + } + ], + [TrainerType.VICTORIA]: [ + { + encounter: [ + "dialogue:winstrates_victoria.encounter.1", + ], + victory: [ + "dialogue:winstrates_victoria.victory.1" + ], + } + ], + [TrainerType.VIVI]: [ + { + encounter: [ + "dialogue:winstrates_vivi.encounter.1", + ], + victory: [ + "dialogue:winstrates_vivi.victory.1" + ], + } + ], + [TrainerType.VICKY]: [ + { + encounter: [ + "dialogue:winstrates_vicky.encounter.1", + ], + victory: [ + "dialogue:winstrates_vicky.victory.1" + ], + } + ], + [TrainerType.VITO]: [ + { + encounter: [ + "dialogue:winstrates_vito.encounter.1", + ], + victory: [ + "dialogue:winstrates_vito.victory.1" + ], + } + ], [TrainerType.BROCK]: { encounter: [ "dialogue:brock.encounter.1", 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 9a69a85d722..132c7e34e08 100644 --- a/src/data/mystery-encounters/encounters/a-trainers-test-encounter.ts +++ b/src/data/mystery-encounters/encounters/a-trainers-test-encounter.ts @@ -2,7 +2,7 @@ import { EnemyPartyConfig, initBattleWithEnemyConfig, leaveEncounterWithoutBattl import { trainerConfigs, } from "#app/data/trainer-config"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import BattleScene from "#app/battle-scene"; -import IMysteryEncounter, { MysteryEncounterBuilder } from "../mystery-encounter"; +import MysteryEncounter, { MysteryEncounterBuilder } from "../mystery-encounter"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; import { TrainerType } from "#enums/trainer-type"; import { Species } from "#enums/species"; @@ -22,10 +22,10 @@ const namespace = "mysteryEncounter:aTrainersTest"; * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/115 | GitHub Issue #115} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ -export const ATrainersTestEncounter: IMysteryEncounter = +export const ATrainersTestEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.A_TRAINERS_TEST) .withEncounterTier(MysteryEncounterTier.ROGUE) - .withSceneWaveRangeRequirement(10, 180) // waves 10 to 180 + .withSceneWaveRangeRequirement(100, 180) .withIntroSpriteConfigs([]) // These are set in onInit() .withIntroDialogue([ { @@ -139,13 +139,6 @@ export const ATrainersTestEncounter: IMysteryEncounter = // Spawn standard trainer battle with memory mushroom reward const config: EnemyPartyConfig = encounter.enemyPartyConfigs[0]; - let eggTier; - if (randSeedInt(64) >= 54) { - eggTier = EggTier.MASTER; - } else { - eggTier = EggTier.ULTRA; - } - await transitionMysteryEncounterIntroVisuals(scene); const eggOptions: IEggOptions = { @@ -153,9 +146,9 @@ export const ATrainersTestEncounter: IMysteryEncounter = pulled: false, sourceType: EggSourceType.EVENT, eventEggTypeDescriptor: encounter.misc.trainerEggDescription, - tier: eggTier + tier: EggTier.ULTRA }; - encounter.setDialogueToken("eggType", i18next.t(`${namespace}.eggTypes.${eggTier === EggTier.ULTRA ? "epic" : "legendary"}`)); + encounter.setDialogueToken("eggType", i18next.t(`${namespace}.eggTypes.epic`)); setEncounterRewards(scene, { fillRemaining: true }, [eggOptions]); return initBattleWithEnemyConfig(scene, config); diff --git a/src/data/mystery-encounters/encounters/absolute-avarice-encounter.ts b/src/data/mystery-encounters/encounters/absolute-avarice-encounter.ts index 45645a6b17f..500512b70c3 100644 --- a/src/data/mystery-encounters/encounters/absolute-avarice-encounter.ts +++ b/src/data/mystery-encounters/encounters/absolute-avarice-encounter.ts @@ -1,10 +1,10 @@ -import { EnemyPartyConfig, generateModifierTypeOption, initBattleWithEnemyConfig, leaveEncounterWithoutBattle, setEncounterRewards, transitionMysteryEncounterIntroVisuals, } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { EnemyPartyConfig, generateModifierType, initBattleWithEnemyConfig, leaveEncounterWithoutBattle, setEncounterRewards, transitionMysteryEncounterIntroVisuals, } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import Pokemon, { EnemyPokemon, PokemonMove } from "#app/field/pokemon"; import { BerryModifierType, modifierTypes, PokemonHeldItemModifierType } from "#app/modifier/modifier-type"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { Species } from "#enums/species"; import BattleScene from "#app/battle-scene"; -import IMysteryEncounter, { MysteryEncounterBuilder } from "../mystery-encounter"; +import MysteryEncounter, { MysteryEncounterBuilder } from "../mystery-encounter"; import { MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; import { PersistentModifierRequirement } from "../mystery-encounter-requirements"; import { queueEncounterMessage } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; @@ -21,6 +21,7 @@ import { BattlerIndex } from "#app/battle"; import { applyModifierTypeToPlayerPokemon, catchPokemon, getHighestLevelPlayerPokemon } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; import { TrainerSlot } from "#app/data/trainer-config"; import { PokeballType } from "#app/data/pokeball"; +import HeldModifierConfig from "#app/interfaces/held-modifier-config"; /** the i18n namespace for this encounter */ const namespace = "mysteryEncounter:absoluteAvarice"; @@ -30,7 +31,7 @@ const namespace = "mysteryEncounter:absoluteAvarice"; * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/58 | GitHub Issue #58} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ -export const AbsoluteAvariceEncounter: IMysteryEncounter = +export const AbsoluteAvariceEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.ABSOLUTE_AVARICE) .withEncounterTier(MysteryEncounterTier.GREAT) .withSceneWaveRangeRequirement(10, 180) @@ -191,13 +192,13 @@ export const AbsoluteAvariceEncounter: IMysteryEncounter = encounter.misc = { berryItemsMap }; // Generates copies of the stolen berries to put on the Greedent - const bossModifierTypes: PokemonHeldItemModifierType[] = []; + const bossModifierConfigs: HeldModifierConfig[] = []; berryItems.forEach(berryMod => { // Can't define stack count on a ModifierType, have to just create separate instances for each stack // Overflow berries will be "lost" on the boss, but it's un-catchable anyway for (let i = 0; i < berryMod.stackCount; i++) { - const modifierType = generateModifierTypeOption(scene, modifierTypes.BERRY, [berryMod.berryType]).type as PokemonHeldItemModifierType; - bossModifierTypes.push(modifierType); + const modifierType = generateModifierType(scene, modifierTypes.BERRY, [berryMod.berryType]) as PokemonHeldItemModifierType; + bossModifierConfigs.push({ modifierType }); } scene.removeModifier(berryMod); @@ -212,7 +213,7 @@ export const AbsoluteAvariceEncounter: IMysteryEncounter = isBoss: true, bossSegments: 3, moveSet: [Moves.THRASH, Moves.BODY_PRESS, Moves.STUFF_CHEEKS, Moves.SLACK_OFF], - modifierTypes: bossModifierTypes, + modifierConfigs: bossModifierConfigs, tags: [BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON], mysteryEncounterBattleEffects: (pokemon: Pokemon) => { queueEncounterMessage(pokemon.scene, `${namespace}.option.1.boss_enraged`); @@ -243,7 +244,7 @@ export const AbsoluteAvariceEncounter: IMysteryEncounter = const encounter = scene.currentBattle.mysteryEncounter; // Provides 1x Reviver Seed to each party member at end of battle - const revSeed = generateModifierTypeOption(scene, modifierTypes.REVIVER_SEED).type; + const revSeed = generateModifierType(scene, modifierTypes.REVIVER_SEED); const givePartyPokemonReviverSeeds = () => { const party = scene.getParty(); party.forEach(p => { @@ -296,7 +297,7 @@ export const AbsoluteAvariceEncounter: IMysteryEncounter = Phaser.Math.RND.shuffle(berryTypesAsArray); const randBerryType = berryTypesAsArray.pop(); - const berryModType = generateModifierTypeOption(scene, modifierTypes.BERRY, [randBerryType]).type as BerryModifierType; + const berryModType = generateModifierType(scene, modifierTypes.BERRY, [randBerryType]) as BerryModifierType; applyModifierTypeToPlayerPokemon(scene, pokemon, berryModType); } } 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 8eabbbd8d05..6dfa72129fb 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 @@ -3,7 +3,7 @@ import { modifierTypes } from "#app/modifier/modifier-type"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { Species } from "#enums/species"; import BattleScene from "#app/battle-scene"; -import IMysteryEncounter, { MysteryEncounterBuilder } from "../mystery-encounter"; +import MysteryEncounter, { MysteryEncounterBuilder } from "../mystery-encounter"; import { MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; import { AbilityRequirement, CombinationPokemonRequirement, MoveRequirement } from "../mystery-encounter-requirements"; import { getHighestStatTotalPlayerPokemon } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; @@ -21,7 +21,7 @@ const namespace = "mysteryEncounter:offerYouCantRefuse"; * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/72 | GitHub Issue #72} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ -export const AnOfferYouCantRefuseEncounter: IMysteryEncounter = +export const AnOfferYouCantRefuseEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.AN_OFFER_YOU_CANT_REFUSE) .withEncounterTier(MysteryEncounterTier.GREAT) .withSceneWaveRangeRequirement(10, 180) diff --git a/src/data/mystery-encounters/encounters/berries-abound-encounter.ts b/src/data/mystery-encounters/encounters/berries-abound-encounter.ts index 4f67905235e..30c82a9dd9e 100644 --- a/src/data/mystery-encounters/encounters/berries-abound-encounter.ts +++ b/src/data/mystery-encounters/encounters/berries-abound-encounter.ts @@ -1,7 +1,7 @@ import { BattleStat } from "#app/data/battle-stat"; import { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; import { - EnemyPartyConfig, generateModifierTypeOption, + EnemyPartyConfig, generateModifierType, generateModifierTypeOption, initBattleWithEnemyConfig, leaveEncounterWithoutBattle, setEncounterExp, setEncounterRewards @@ -19,7 +19,7 @@ import { randSeedInt } from "#app/utils"; import { BattlerTagType } from "#enums/battler-tag-type"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import BattleScene from "#app/battle-scene"; -import IMysteryEncounter, { MysteryEncounterBuilder } from "../mystery-encounter"; +import MysteryEncounter, { MysteryEncounterBuilder } from "../mystery-encounter"; import { queueEncounterMessage, showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; import { getPokemonNameWithAffix } from "#app/messages"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; @@ -40,7 +40,7 @@ const namespace = "mysteryEncounter:berriesAbound"; * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/24 | GitHub Issue #24} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ -export const BerriesAboundEncounter: IMysteryEncounter = +export const BerriesAboundEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.BERRIES_ABOUND) .withEncounterTier(MysteryEncounterTier.COMMON) .withSceneWaveRangeRequirement(10, 180) // waves 10 to 180 @@ -315,7 +315,7 @@ export const BerriesAboundEncounter: IMysteryEncounter = async function tryGiveBerry(scene: BattleScene, prioritizedPokemon?: PlayerPokemon) { const berryType = randSeedInt(Object.keys(BerryType).filter(s => !isNaN(Number(s))).length) as BerryType; - const berry = generateModifierTypeOption(scene, modifierTypes.BERRY, [berryType]).type as BerryModifierType; + const berry = generateModifierType(scene, modifierTypes.BERRY, [berryType]) as BerryModifierType; const party = scene.getParty(); diff --git a/src/data/mystery-encounters/encounters/clowning-around-encounter.ts b/src/data/mystery-encounters/encounters/clowning-around-encounter.ts index c03508a5700..147343bad31 100644 --- a/src/data/mystery-encounters/encounters/clowning-around-encounter.ts +++ b/src/data/mystery-encounters/encounters/clowning-around-encounter.ts @@ -1,11 +1,11 @@ -import { EnemyPartyConfig, generateModifierTypeOption, initBattleWithEnemyConfig, leaveEncounterWithoutBattle, loadCustomMovesForEncounter, selectPokemonForOption, setEncounterRewards, transitionMysteryEncounterIntroVisuals, } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { EnemyPartyConfig, generateModifierType, initBattleWithEnemyConfig, leaveEncounterWithoutBattle, loadCustomMovesForEncounter, selectPokemonForOption, setEncounterRewards, transitionMysteryEncounterIntroVisuals, } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { trainerConfigs, TrainerPartyCompoundTemplate, TrainerPartyTemplate, } from "#app/data/trainer-config"; import { ModifierTier } from "#app/modifier/modifier-tier"; import { modifierTypes, PokemonHeldItemModifierType } from "#app/modifier/modifier-type"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { PartyMemberStrength } from "#enums/party-member-strength"; import BattleScene from "#app/battle-scene"; -import IMysteryEncounter, { MysteryEncounterBuilder } from "../mystery-encounter"; +import MysteryEncounter, { MysteryEncounterBuilder } from "../mystery-encounter"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; import { Species } from "#enums/species"; import { TrainerType } from "#enums/trainer-type"; @@ -56,7 +56,7 @@ const RANDOM_ABILITY_POOL = [ * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/69 | GitHub Issue #69} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ -export const ClowningAroundEncounter: IMysteryEncounter = +export const ClowningAroundEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.CLOWNING_AROUND) .withEncounterTier(MysteryEncounterTier.ULTRA) .withSceneWaveRangeRequirement(80, 180) @@ -128,8 +128,7 @@ export const ClowningAroundEncounter: IMysteryEncounter = }, { // Blacephalon has the random ability from pool, and 2 entirely random types to fit with the theme of the encounter species: getPokemonSpecies(Species.BLACEPHALON), - ability: ability, - mysteryEncounterData: new MysteryEncounterPokemonData(null, null, null, [randSeedInt(18), randSeedInt(18)]), + mysteryEncounterData: new MysteryEncounterPokemonData(null, ability, null, [randSeedInt(18), randSeedInt(18)]), isBoss: true, moveSet: [Moves.TRICK, Moves.HYPNOSIS, Moves.SHADOW_BALL, Moves.MIND_BLOWN] }, @@ -483,9 +482,9 @@ function generateItemsOfTier(scene: BattleScene, pokemon: PlayerPokemon, numItem const newItemType = pool[randIndex]; let newMod; if (tier === "Berries") { - newMod = generateModifierTypeOption(scene, modifierTypes.BERRY, [newItemType[0]]).type as PokemonHeldItemModifierType; + newMod = generateModifierType(scene, modifierTypes.BERRY, [newItemType[0]]) as PokemonHeldItemModifierType; } else { - newMod = generateModifierTypeOption(scene, newItemType[0]).type as PokemonHeldItemModifierType; + newMod = generateModifierType(scene, newItemType[0]) as PokemonHeldItemModifierType; } applyModifierTypeToPlayerPokemon(scene, pokemon, newMod); // Decrement max stacks and remove from pool if at max diff --git a/src/data/mystery-encounters/encounters/dancing-lessons-encounter.ts b/src/data/mystery-encounters/encounters/dancing-lessons-encounter.ts index 5b127984880..3e87d8e3aa9 100644 --- a/src/data/mystery-encounters/encounters/dancing-lessons-encounter.ts +++ b/src/data/mystery-encounters/encounters/dancing-lessons-encounter.ts @@ -3,7 +3,7 @@ import Pokemon, { PlayerPokemon, PokemonMove } from "#app/field/pokemon"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { Species } from "#enums/species"; import BattleScene from "#app/battle-scene"; -import IMysteryEncounter, { MysteryEncounterBuilder } from "../mystery-encounter"; +import MysteryEncounter, { MysteryEncounterBuilder } from "../mystery-encounter"; import { MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; @@ -77,7 +77,7 @@ const SENSU_STYLE_BIOMES = [ * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/130 | GitHub Issue #130} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ -export const DancingLessonsEncounter: IMysteryEncounter = +export const DancingLessonsEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.DANCING_LESSONS) .withEncounterTier(MysteryEncounterTier.GREAT) .withSceneWaveRangeRequirement(10, 180) diff --git a/src/data/mystery-encounters/encounters/dark-deal-encounter.ts b/src/data/mystery-encounters/encounters/dark-deal-encounter.ts index fde28a2ab00..1251cc9bf32 100644 --- a/src/data/mystery-encounters/encounters/dark-deal-encounter.ts +++ b/src/data/mystery-encounters/encounters/dark-deal-encounter.ts @@ -6,7 +6,7 @@ import { Species } from "#enums/species"; import BattleScene from "#app/battle-scene"; import { modifierTypes } from "#app/modifier/modifier-type"; import { getPokemonSpecies } from "#app/data/pokemon-species"; -import IMysteryEncounter, { MysteryEncounterBuilder } from "../mystery-encounter"; +import MysteryEncounter, { MysteryEncounterBuilder } from "../mystery-encounter"; import { MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; import { EnemyPartyConfig, EnemyPokemonConfig, initBattleWithEnemyConfig, leaveEncounterWithoutBattle, } from "../utils/encounter-phase-utils"; import { getRandomPlayerPokemon, getRandomSpeciesByStarterTier } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; @@ -74,7 +74,7 @@ const excludedBosses = [ * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/61 | GitHub Issue #61} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ -export const DarkDealEncounter: IMysteryEncounter = +export const DarkDealEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.DARK_DEAL) .withEncounterTier(MysteryEncounterTier.ROGUE) .withIntroSpriteConfigs([ diff --git a/src/data/mystery-encounters/encounters/delibirdy-encounter.ts b/src/data/mystery-encounters/encounters/delibirdy-encounter.ts index bcab1b4bd02..18b6883b529 100644 --- a/src/data/mystery-encounters/encounters/delibirdy-encounter.ts +++ b/src/data/mystery-encounters/encounters/delibirdy-encounter.ts @@ -1,10 +1,10 @@ -import { generateModifierTypeOption, leaveEncounterWithoutBattle, selectPokemonForOption, updatePlayerMoney, } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { generateModifierType, leaveEncounterWithoutBattle, selectPokemonForOption, updatePlayerMoney, } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import Pokemon, { PlayerPokemon } from "#app/field/pokemon"; import { modifierTypes, PokemonHeldItemModifierType } from "#app/modifier/modifier-type"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { Species } from "#enums/species"; import BattleScene from "#app/battle-scene"; -import IMysteryEncounter, { MysteryEncounterBuilder } from "../mystery-encounter"; +import MysteryEncounter, { MysteryEncounterBuilder } from "../mystery-encounter"; import { MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; import { CombinationPokemonRequirement, HeldItemRequirement, MoneyRequirement } from "../mystery-encounter-requirements"; import { getEncounterText, showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; @@ -36,7 +36,7 @@ const OPTION_3_DISALLOWED_MODIFIERS = [ * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/57 | GitHub Issue #57} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ -export const DelibirdyEncounter: IMysteryEncounter = +export const DelibirdyEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.DELIBIRDY) .withEncounterTier(MysteryEncounterTier.GREAT) .withSceneWaveRangeRequirement(10, 180) @@ -113,7 +113,7 @@ export const DelibirdyEncounter: IMysteryEncounter = if (existing && existing.getStackCount() >= existing.getMaxStackCount(scene)) { // At max stacks, give the first party pokemon a Shell Bell instead - const shellBell = generateModifierTypeOption(scene, modifierTypes.SHELL_BELL).type as PokemonHeldItemModifierType; + const shellBell = generateModifierType(scene, modifierTypes.SHELL_BELL) as PokemonHeldItemModifierType; await applyModifierTypeToPlayerPokemon(scene, scene.getParty()[0], shellBell); scene.playSound("item_fanfare"); await showEncounterText(scene, i18next.t("battle:rewardGain", { modifierName: shellBell.name }), null, true); @@ -188,7 +188,7 @@ export const DelibirdyEncounter: IMysteryEncounter = if (existing && existing.getStackCount() >= existing.getMaxStackCount(scene)) { // At max stacks, give the first party pokemon a Shell Bell instead - const shellBell = generateModifierTypeOption(scene, modifierTypes.SHELL_BELL).type as PokemonHeldItemModifierType; + const shellBell = generateModifierType(scene, modifierTypes.SHELL_BELL) as PokemonHeldItemModifierType; await applyModifierTypeToPlayerPokemon(scene, scene.getParty()[0], shellBell); scene.playSound("item_fanfare"); await showEncounterText(scene, i18next.t("battle:rewardGain", { modifierName: shellBell.name }), null, true); @@ -201,7 +201,7 @@ export const DelibirdyEncounter: IMysteryEncounter = if (existing && existing.getStackCount() >= existing.getMaxStackCount(scene)) { // At max stacks, give the first party pokemon a Shell Bell instead - const shellBell = generateModifierTypeOption(scene, modifierTypes.SHELL_BELL).type as PokemonHeldItemModifierType; + const shellBell = generateModifierType(scene, modifierTypes.SHELL_BELL) as PokemonHeldItemModifierType; await applyModifierTypeToPlayerPokemon(scene, scene.getParty()[0], shellBell); scene.playSound("item_fanfare"); await showEncounterText(scene, i18next.t("battle:rewardGain", { modifierName: shellBell.name }), null, true); @@ -281,7 +281,7 @@ export const DelibirdyEncounter: IMysteryEncounter = if (existing && existing.getStackCount() >= existing.getMaxStackCount(scene)) { // At max stacks, give the first party pokemon a Shell Bell instead - const shellBell = generateModifierTypeOption(scene, modifierTypes.SHELL_BELL).type as PokemonHeldItemModifierType; + const shellBell = generateModifierType(scene, modifierTypes.SHELL_BELL) as PokemonHeldItemModifierType; await applyModifierTypeToPlayerPokemon(scene, scene.getParty()[0], shellBell); scene.playSound("item_fanfare"); await showEncounterText(scene, i18next.t("battle:rewardGain", { modifierName: shellBell.name }), null, true); 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 fa27c31c273..9a11a2e8888 100644 --- a/src/data/mystery-encounters/encounters/department-store-sale-encounter.ts +++ b/src/data/mystery-encounters/encounters/department-store-sale-encounter.ts @@ -7,7 +7,7 @@ import { randSeedInt } from "#app/utils"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { Species } from "#enums/species"; import BattleScene from "#app/battle-scene"; -import IMysteryEncounter, { +import MysteryEncounter, { MysteryEncounterBuilder, } from "../mystery-encounter"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; @@ -20,7 +20,7 @@ const namespace = "mysteryEncounter:departmentStoreSale"; * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/33 | GitHub Issue #33} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ -export const DepartmentStoreSaleEncounter: IMysteryEncounter = +export const DepartmentStoreSaleEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.DEPARTMENT_STORE_SALE) .withEncounterTier(MysteryEncounterTier.COMMON) .withSceneWaveRangeRequirement(10, 100) diff --git a/src/data/mystery-encounters/encounters/field-trip-encounter.ts b/src/data/mystery-encounters/encounters/field-trip-encounter.ts index 93e2d71aa1a..27322ea052b 100644 --- a/src/data/mystery-encounters/encounters/field-trip-encounter.ts +++ b/src/data/mystery-encounters/encounters/field-trip-encounter.ts @@ -7,7 +7,7 @@ import { modifierTypes } from "#app/modifier/modifier-type"; import { OptionSelectItem } from "#app/ui/abstact-option-select-ui-handler"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import BattleScene from "#app/battle-scene"; -import IMysteryEncounter, { MysteryEncounterBuilder } from "../mystery-encounter"; +import MysteryEncounter, { MysteryEncounterBuilder } from "../mystery-encounter"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; @@ -19,7 +19,7 @@ const namespace = "mysteryEncounter:fieldTrip"; * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/17 | GitHub Issue #17} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ -export const FieldTripEncounter: IMysteryEncounter = +export const FieldTripEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.FIELD_TRIP) .withEncounterTier(MysteryEncounterTier.COMMON) .withSceneWaveRangeRequirement(10, 180) diff --git a/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts b/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts index 5b4b582da01..533f9b93e79 100644 --- a/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts +++ b/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts @@ -3,7 +3,7 @@ import { EnemyPartyConfig, generateModifierTypeOption, initBattleWithEnemyConfig import { AttackTypeBoosterModifierType, modifierTypes, } from "#app/modifier/modifier-type"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import BattleScene from "#app/battle-scene"; -import IMysteryEncounter, { MysteryEncounterBuilder } from "../mystery-encounter"; +import MysteryEncounter, { MysteryEncounterBuilder } from "../mystery-encounter"; import { TypeRequirement } from "../mystery-encounter-requirements"; import { Species } from "#enums/species"; import { getPokemonSpecies } from "#app/data/pokemon-species"; @@ -36,7 +36,7 @@ const DAMAGE_PERCENTAGE: number = 20; * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/88 | GitHub Issue #88} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ -export const FieryFalloutEncounter: IMysteryEncounter = +export const FieryFalloutEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.FIERY_FALLOUT) .withEncounterTier(MysteryEncounterTier.COMMON) .withSceneWaveRangeRequirement(40, 180) 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 2f000742ea9..5fc827a0c77 100644 --- a/src/data/mystery-encounters/encounters/fight-or-flight-encounter.ts +++ b/src/data/mystery-encounters/encounters/fight-or-flight-encounter.ts @@ -17,7 +17,7 @@ import { } from "#app/modifier/modifier-type"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import BattleScene from "#app/battle-scene"; -import IMysteryEncounter, { MysteryEncounterBuilder } from "../mystery-encounter"; +import MysteryEncounter, { MysteryEncounterBuilder } from "../mystery-encounter"; import { MoveRequirement } from "../mystery-encounter-requirements"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; @@ -33,7 +33,7 @@ const namespace = "mysteryEncounter:fightOrFlight"; * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/24 | GitHub Issue #24} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ -export const FightOrFlightEncounter: IMysteryEncounter = +export const FightOrFlightEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.FIGHT_OR_FLIGHT) .withEncounterTier(MysteryEncounterTier.COMMON) .withSceneWaveRangeRequirement(10, 180) // waves 10 to 180 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 02f2393811a..02f4f2f1cdc 100644 --- a/src/data/mystery-encounters/encounters/lost-at-sea-encounter.ts +++ b/src/data/mystery-encounters/encounters/lost-at-sea-encounter.ts @@ -127,7 +127,7 @@ export const LostAtSeaEncounter: MysteryEncounter = MysteryEncounterBuilder.with * @param scene Battle scene * @param guidePokemon pokemon choosen as a guide */ -function handlePokemonGuidingYouPhase(scene: BattleScene) { +async function handlePokemonGuidingYouPhase(scene: BattleScene) { const laprasSpecies = getPokemonSpecies(Species.LAPRAS); const { mysteryEncounter } = scene.currentBattle; diff --git a/src/data/mystery-encounters/encounters/mysterious-challengers-encounter.ts b/src/data/mystery-encounters/encounters/mysterious-challengers-encounter.ts index 368b18b11c0..f3738059b0b 100644 --- a/src/data/mystery-encounters/encounters/mysterious-challengers-encounter.ts +++ b/src/data/mystery-encounters/encounters/mysterious-challengers-encounter.ts @@ -15,7 +15,7 @@ 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 IMysteryEncounter, { MysteryEncounterBuilder } from "../mystery-encounter"; +import MysteryEncounter, { MysteryEncounterBuilder } from "../mystery-encounter"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; /** the i18n namespace for the encounter */ @@ -26,7 +26,7 @@ const namespace = "mysteryEncounter:mysteriousChallengers"; * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/41 | GitHub Issue #41} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ -export const MysteriousChallengersEncounter: IMysteryEncounter = +export const MysteriousChallengersEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.MYSTERIOUS_CHALLENGERS) .withEncounterTier(MysteryEncounterTier.GREAT) .withSceneWaveRangeRequirement(10, 180) // waves 10 to 180 diff --git a/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts b/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts index f0a96356eef..1d965e38fa6 100644 --- a/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts +++ b/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts @@ -5,7 +5,7 @@ import { ModifierTier } from "#app/modifier/modifier-tier"; import { randSeedInt } from "#app/utils.js"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import BattleScene from "#app/battle-scene"; -import IMysteryEncounter, { MysteryEncounterBuilder } from "../mystery-encounter"; +import MysteryEncounter, { MysteryEncounterBuilder } from "../mystery-encounter"; import { MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; @@ -18,7 +18,7 @@ const namespace = "mysteryEncounter:mysteriousChest"; * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/32 | GitHub Issue #32} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ -export const MysteriousChestEncounter: IMysteryEncounter = +export const MysteriousChestEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.MYSTERIOUS_CHEST) .withEncounterTier(MysteryEncounterTier.COMMON) .withSceneWaveRangeRequirement(10, 180) // waves 2 to 180 @@ -116,9 +116,8 @@ export const MysteriousChestEncounter: IMysteryEncounter = scene.currentBattle.mysteryEncounter.setDialogueToken("pokeName", highestLevelPokemon.getNameToRender()); // Show which Pokemon was KOed, then leave encounter with no rewards // Does this synchronously so that game over doesn't happen over result message - await showEncounterText(scene, `${namespace}.option.1.bad`).then(() => { - leaveEncounterWithoutBattle(scene); - }); + await showEncounterText(scene, `${namespace}.option.1.bad`); + leaveEncounterWithoutBattle(scene); } }) .build() diff --git a/src/data/mystery-encounters/encounters/part-timer-encounter.ts b/src/data/mystery-encounters/encounters/part-timer-encounter.ts index a7f53976bbb..94318ac6926 100644 --- a/src/data/mystery-encounters/encounters/part-timer-encounter.ts +++ b/src/data/mystery-encounters/encounters/part-timer-encounter.ts @@ -2,7 +2,7 @@ import { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/myst import { leaveEncounterWithoutBattle, selectPokemonForOption, setEncounterExp, setEncounterRewards, transitionMysteryEncounterIntroVisuals, updatePlayerMoney } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import BattleScene from "#app/battle-scene"; -import IMysteryEncounter, { MysteryEncounterBuilder } from "../mystery-encounter"; +import MysteryEncounter, { MysteryEncounterBuilder } from "../mystery-encounter"; import { MoveRequirement } from "../mystery-encounter-requirements"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; @@ -20,7 +20,7 @@ const namespace = "mysteryEncounter:partTimer"; * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/82 | GitHub Issue #82} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ -export const PartTimerEncounter: IMysteryEncounter = +export const PartTimerEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.PART_TIMER) .withEncounterTier(MysteryEncounterTier.COMMON) .withSceneWaveRangeRequirement(10, 180) diff --git a/src/data/mystery-encounters/encounters/safari-zone-encounter.ts b/src/data/mystery-encounters/encounters/safari-zone-encounter.ts index e110d43fc50..56e3bb2852b 100644 --- a/src/data/mystery-encounters/encounters/safari-zone-encounter.ts +++ b/src/data/mystery-encounters/encounters/safari-zone-encounter.ts @@ -1,7 +1,7 @@ import { initSubsequentOptionSelect, leaveEncounterWithoutBattle, updatePlayerMoney, } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import BattleScene from "#app/battle-scene"; -import IMysteryEncounter, { MysteryEncounterBuilder } from "../mystery-encounter"; +import MysteryEncounter, { MysteryEncounterBuilder } from "../mystery-encounter"; import MysteryEncounterOption, { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; import { TrainerSlot } from "#app/data/trainer-config"; import { ScanIvsPhase, SummonPhase } from "#app/phases"; @@ -17,7 +17,6 @@ import { getEncounterText, showEncounterText } from "#app/data/mystery-encounter import { getPokemonNameWithAffix } from "#app/messages"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; -import { MysteryEncounterMode } from "#enums/mystery-encounter-mode"; /** the i18n namespace for the encounter */ const namespace = "mysteryEncounter:safariZone"; @@ -29,7 +28,7 @@ const TRAINER_THROW_ANIMATION_TIMES = [512, 184, 768]; * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/39 | GitHub Issue #39} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ -export const SafariZoneEncounter: IMysteryEncounter = +export const SafariZoneEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.SAFARI_ZONE) .withEncounterTier(MysteryEncounterTier.GREAT) .withSceneWaveRangeRequirement(10, 180) @@ -66,7 +65,7 @@ export const SafariZoneEncounter: IMysteryEncounter = .withOptionPhase(async (scene: BattleScene) => { // Start safari encounter const encounter = scene.currentBattle.mysteryEncounter; - encounter.encounterMode = MysteryEncounterMode.CONTINUOUS_ENCOUNTER; + encounter.continuousEncounter = true; encounter.misc = { safariPokemonRemaining: 3 }; @@ -104,7 +103,7 @@ export const SafariZoneEncounter: IMysteryEncounter = /** * SAFARI ZONE MINIGAME OPTIONS * - * Catch and flee rate **stages** are calculated in the same way stat changes are (they range from -6/+6) + * Catch and flee rate stages are calculated in the same way stat changes are (they range from -6/+6) * https://bulbapedia.bulbagarden.net/wiki/Catch_rate#Great_Marsh_and_Johto_Safari_Zone * * Catch Rate calculation: @@ -130,21 +129,23 @@ const safariZoneGameOptions: MysteryEncounterOption[] = [ }) .withOptionPhase(async (scene: BattleScene) => { // Throw a ball option - const pokemon = scene.currentBattle.mysteryEncounter.misc.pokemon; + const encounter = scene.currentBattle.mysteryEncounter; + const pokemon = encounter.misc.pokemon; const catchResult = await throwPokeball(scene, pokemon); if (catchResult) { // You caught pokemon // Check how many safari pokemon left - if (scene.currentBattle.mysteryEncounter.misc.safariPokemonRemaining > 0) { + if (encounter.misc.safariPokemonRemaining > 0) { await summonSafariPokemon(scene); initSubsequentOptionSelect(scene, { overrideOptions: safariZoneGameOptions, startingCursorIndex: 0, hideDescription: true }); } else { // End safari mode + encounter.continuousEncounter = false; leaveEncounterWithoutBattle(scene, true); } } else { - // Pokemon failed to catch, end turn + // Pokemon catch failed, end turn await doEndTurn(scene, 0); } return true; @@ -217,14 +218,16 @@ const safariZoneGameOptions: MysteryEncounterOption[] = [ }) .withOptionPhase(async (scene: BattleScene) => { // Flee option - const pokemon = scene.currentBattle.mysteryEncounter.misc.pokemon; + const encounter = scene.currentBattle.mysteryEncounter; + const pokemon = encounter.misc.pokemon; await doPlayerFlee(scene, pokemon); // Check how many safari pokemon left - if (scene.currentBattle.mysteryEncounter.misc.safariPokemonRemaining > 0) { + if (encounter.misc.safariPokemonRemaining > 0) { await summonSafariPokemon(scene); initSubsequentOptionSelect(scene, { overrideOptions: safariZoneGameOptions, startingCursorIndex: 3, hideDescription: true }); } else { // End safari mode + encounter.continuousEncounter = false; leaveEncounterWithoutBattle(scene, true); } return true; @@ -487,6 +490,7 @@ async function doEndTurn(scene: BattleScene, cursorIndex: number) { initSubsequentOptionSelect(scene, { overrideOptions: safariZoneGameOptions, startingCursorIndex: cursorIndex, hideDescription: true }); } else { // End safari mode + encounter.continuousEncounter = false; leaveEncounterWithoutBattle(scene, true); } } else { 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 86a8a614ba6..6ce4474206d 100644 --- a/src/data/mystery-encounters/encounters/shady-vitamin-dealer-encounter.ts +++ b/src/data/mystery-encounters/encounters/shady-vitamin-dealer-encounter.ts @@ -1,4 +1,4 @@ -import { generateModifierTypeOption, leaveEncounterWithoutBattle, selectPokemonForOption, setEncounterExp, updatePlayerMoney, } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { generateModifierType, leaveEncounterWithoutBattle, selectPokemonForOption, setEncounterExp, updatePlayerMoney, } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { StatusEffect } from "#app/data/status-effect"; import Pokemon, { PlayerPokemon } from "#app/field/pokemon"; import { modifierTypes } from "#app/modifier/modifier-type"; @@ -6,7 +6,7 @@ import { randSeedInt } from "#app/utils"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { Species } from "#enums/species"; import BattleScene from "#app/battle-scene"; -import IMysteryEncounter, { MysteryEncounterBuilder } from "../mystery-encounter"; +import MysteryEncounter, { MysteryEncounterBuilder } from "../mystery-encounter"; import { MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; import { MoneyRequirement } from "../mystery-encounter-requirements"; import { getEncounterText, queueEncounterMessage } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; @@ -22,7 +22,7 @@ const namespace = "mysteryEncounter:shadyVitaminDealer"; * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/34 | GitHub Issue #34} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ -export const ShadyVitaminDealerEncounter: IMysteryEncounter = +export const ShadyVitaminDealerEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.SHADY_VITAMIN_DEALER) .withEncounterTier(MysteryEncounterTier.COMMON) .withSceneWaveRangeRequirement(10, 180) @@ -79,8 +79,8 @@ export const ShadyVitaminDealerEncounter: IMysteryEncounter = updatePlayerMoney(scene, -(encounter.options[0].requirements[0] as MoneyRequirement).requiredMoney); // Calculate modifiers and dialogue tokens const modifiers = [ - generateModifierTypeOption(scene, modifierTypes.BASE_STAT_BOOSTER).type, - generateModifierTypeOption(scene, modifierTypes.BASE_STAT_BOOSTER).type, + 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: IMysteryEncounter = updatePlayerMoney(scene, -(encounter.options[1].requirements[0] as MoneyRequirement).requiredMoney); // Calculate modifiers and dialogue tokens const modifiers = [ - generateModifierTypeOption(scene, modifierTypes.BASE_STAT_BOOSTER).type, - generateModifierTypeOption(scene, modifierTypes.BASE_STAT_BOOSTER).type, + 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 6d56f2cde46..4f24ca69936 100644 --- a/src/data/mystery-encounters/encounters/slumbering-snorlax-encounter.ts +++ b/src/data/mystery-encounters/encounters/slumbering-snorlax-encounter.ts @@ -4,7 +4,7 @@ import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { Species } from "#enums/species"; import BattleScene from "#app/battle-scene"; import { StatusEffect } from "#app/data/status-effect"; -import IMysteryEncounter, { MysteryEncounterBuilder } from "../mystery-encounter"; +import MysteryEncounter, { MysteryEncounterBuilder } from "../mystery-encounter"; import { MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; import { MoveRequirement } from "../mystery-encounter-requirements"; import { EnemyPartyConfig, EnemyPokemonConfig, initBattleWithEnemyConfig, loadCustomMovesForEncounter, leaveEncounterWithoutBattle, setEncounterExp, setEncounterRewards, } from "../utils/encounter-phase-utils"; @@ -25,7 +25,7 @@ const namespace = "mysteryEncounter:slumberingSnorlax"; * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/103 | GitHub Issue #103} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ -export const SlumberingSnorlaxEncounter: IMysteryEncounter = +export const SlumberingSnorlaxEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.SLUMBERING_SNORLAX) .withEncounterTier(MysteryEncounterTier.GREAT) .withSceneWaveRangeRequirement(10, 180) // waves 10 to 180 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 80b7354b747..e1c7ff8a7f6 100644 --- a/src/data/mystery-encounters/encounters/the-pokemon-salesman-encounter.ts +++ b/src/data/mystery-encounters/encounters/the-pokemon-salesman-encounter.ts @@ -2,7 +2,7 @@ import { leaveEncounterWithoutBattle, transitionMysteryEncounterIntroVisuals, up import { isNullOrUndefined, randSeedInt } from "#app/utils"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import BattleScene from "#app/battle-scene"; -import IMysteryEncounter, { MysteryEncounterBuilder } from "../mystery-encounter"; +import MysteryEncounter, { MysteryEncounterBuilder } from "../mystery-encounter"; import { MoneyRequirement } from "../mystery-encounter-requirements"; import { catchPokemon, getRandomSpeciesByStarterTier, getSpriteKeysFromPokemon } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; import { getPokemonSpecies, speciesStarters } from "#app/data/pokemon-species"; @@ -25,7 +25,7 @@ const MAX_POKEMON_PRICE_MULTIPLIER = 6; * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/36 | GitHub Issue #36} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ -export const ThePokemonSalesmanEncounter: IMysteryEncounter = +export const ThePokemonSalesmanEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.THE_POKEMON_SALESMAN) .withEncounterTier(MysteryEncounterTier.ULTRA) .withSceneWaveRangeRequirement(10, 180) 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 36ac31f8046..fd67d2a0234 100644 --- a/src/data/mystery-encounters/encounters/the-strong-stuff-encounter.ts +++ b/src/data/mystery-encounters/encounters/the-strong-stuff-encounter.ts @@ -1,8 +1,8 @@ -import { EnemyPartyConfig, generateModifierTypeOption, initBattleWithEnemyConfig, loadCustomMovesForEncounter, leaveEncounterWithoutBattle, setEncounterRewards, transitionMysteryEncounterIntroVisuals } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { EnemyPartyConfig, initBattleWithEnemyConfig, loadCustomMovesForEncounter, leaveEncounterWithoutBattle, setEncounterRewards, transitionMysteryEncounterIntroVisuals, generateModifierType } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { modifierTypes, PokemonHeldItemModifierType, } from "#app/modifier/modifier-type"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import BattleScene from "#app/battle-scene"; -import IMysteryEncounter, { MysteryEncounterBuilder } from "../mystery-encounter"; +import MysteryEncounter, { MysteryEncounterBuilder } from "../mystery-encounter"; import { getPokemonSpecies } from "#app/data/pokemon-species"; import { Species } from "#enums/species"; import { Nature } from "#app/data/nature"; @@ -26,7 +26,7 @@ const namespace = "mysteryEncounter:theStrongStuff"; * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/54 | GitHub Issue #54} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ -export const TheStrongStuffEncounter: IMysteryEncounter = +export const TheStrongStuffEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.THE_STRONG_STUFF) .withEncounterTier(MysteryEncounterTier.COMMON) .withSceneWaveRangeRequirement(10, 180) // waves 10 to 180 @@ -74,12 +74,20 @@ export const TheStrongStuffEncounter: IMysteryEncounter = mysteryEncounterData: new MysteryEncounterPokemonData(1.5), nature: Nature.BOLD, moveSet: [Moves.INFESTATION, Moves.SALT_CURE, Moves.GASTRO_ACID, Moves.HEAL_ORDER], - modifierTypes: [ - generateModifierTypeOption(scene, modifierTypes.BERRY, [BerryType.SITRUS]).type as PokemonHeldItemModifierType, - generateModifierTypeOption(scene, modifierTypes.BERRY, [BerryType.APICOT]).type as PokemonHeldItemModifierType, - generateModifierTypeOption(scene, modifierTypes.BERRY, [BerryType.GANLON]).type as PokemonHeldItemModifierType, - generateModifierTypeOption(scene, modifierTypes.BERRY, [BerryType.LUM]).type as PokemonHeldItemModifierType, - generateModifierTypeOption(scene, modifierTypes.BERRY, [BerryType.LUM]).type as PokemonHeldItemModifierType + modifierConfigs: [ + { + modifierType: generateModifierType(scene, modifierTypes.BERRY, [BerryType.SITRUS]) as PokemonHeldItemModifierType + }, + { + modifierType: generateModifierType(scene, modifierTypes.BERRY, [BerryType.APICOT]) as PokemonHeldItemModifierType + }, + { + modifierType: generateModifierType(scene, modifierTypes.BERRY, [BerryType.GANLON]) as PokemonHeldItemModifierType + }, + { + modifierType: generateModifierType(scene, modifierTypes.BERRY, [BerryType.LUM]) as PokemonHeldItemModifierType, + stackCount: 2 + } ], tags: [BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON], mysteryEncounterBattleEffects: (pokemon: Pokemon) => { diff --git a/src/data/mystery-encounters/encounters/the-winstrate-challenge-encounter.ts b/src/data/mystery-encounters/encounters/the-winstrate-challenge-encounter.ts new file mode 100644 index 00000000000..434cabb4a42 --- /dev/null +++ b/src/data/mystery-encounters/encounters/the-winstrate-challenge-encounter.ts @@ -0,0 +1,488 @@ +import { EnemyPartyConfig, generateModifierType, initBattleWithEnemyConfig, leaveEncounterWithoutBattle, setEncounterRewards, transitionMysteryEncounterIntroVisuals, } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { modifierTypes, PokemonHeldItemModifierType } from "#app/modifier/modifier-type"; +import { MysteryEncounterType } from "#enums/mystery-encounter-type"; +import BattleScene from "#app/battle-scene"; +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 { Abilities } from "#enums/abilities"; +import { getPokemonSpecies } from "#app/data/pokemon-species"; +import { Moves } from "#enums/moves"; +import { Nature } from "#enums/nature"; +import { Type } from "#app/data/type"; +import { BerryType } from "#enums/berry-type"; +import { Stat } from "#enums/stat"; +import { PartyHealPhase, ReturnPhase, ShowTrainerPhase } from "#app/phases"; +import { SpeciesFormChangeManualTrigger } from "#app/data/pokemon-forms"; +import { applyPostBattleInitAbAttrs, PostBattleInitAbAttr } from "#app/data/ability"; +import { showEncounterDialogue } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; + +/** the i18n namespace for the encounter */ +const namespace = "mysteryEncounter:theWinstrateChallenge"; + +/** + * The Winstrate Challenge encounter. + * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/136 | GitHub Issue #136} + * @see For biome requirements check {@linkcode mysteryEncountersByBiome} + */ +export const TheWinstrateChallengeEncounter: MysteryEncounter = + MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.THE_WINSTRATE_CHALLENGE) + .withEncounterTier(MysteryEncounterTier.ROGUE) + .withSceneWaveRangeRequirement(80, 180) + .withIntroSpriteConfigs([ + { + spriteKey: "vito", + fileRoot: "trainer", + hasShadow: false, + x: 16, + y: -4 + }, + { + spriteKey: "vivi", + fileRoot: "trainer", + hasShadow: false, + x: -14, + y: -4 + }, + { + spriteKey: "victor", + fileRoot: "trainer", + hasShadow: true, + x: -32 + }, + { + spriteKey: "victoria", + fileRoot: "trainer", + hasShadow: true, + x: 40, + }, + { + spriteKey: "vicky", + fileRoot: "trainer", + hasShadow: true, + x: 3, + y: 5, + yShadow: 5 + }, + ]) + .withIntroDialogue([ + { + text: `${namespace}.intro`, + }, + { + speaker: `${namespace}.speaker`, + text: `${namespace}.intro_dialogue`, + }, + ]) + .withAutoHideIntroVisuals(false) + .withOnInit((scene: BattleScene) => { + const encounter = scene.currentBattle.mysteryEncounter; + + // Loaded back to front for pop() operations + encounter.enemyPartyConfigs.push(getVitoTrainerConfig(scene)); + encounter.enemyPartyConfigs.push(getVickyTrainerConfig(scene)); + encounter.enemyPartyConfigs.push(getViviTrainerConfig(scene)); + encounter.enemyPartyConfigs.push(getVictoriaTrainerConfig(scene)); + encounter.enemyPartyConfigs.push(getVictorTrainerConfig(scene)); + + return true; + }) + .withTitle(`${namespace}.title`) + .withDescription(`${namespace}.description`) + .withQuery(`${namespace}.query`) + .withSimpleOption( + { + buttonLabel: `${namespace}.option.1.label`, + buttonTooltip: `${namespace}.option.1.tooltip`, + selected: [ + { + speaker: "trainerNames:victor", + text: `${namespace}.option.1.selected`, + }, + ], + }, + async (scene: BattleScene) => { + // Spawn 5 trainer battles back to back with Macho Brace in rewards + // scene.currentBattle.mysteryEncounter.continuousEncounter = true; + scene.currentBattle.mysteryEncounter.doContinueEncounter = (scene: BattleScene) => { + return endTrainerBattleAndShowDialogue(scene); + }; + await transitionMysteryEncounterIntroVisuals(scene, true, false); + await spawnNextTrainerOrEndEncounter(scene); + } + ) + .withSimpleOption( + { + buttonLabel: `${namespace}.option.2.label`, + buttonTooltip: `${namespace}.option.2.tooltip`, + selected: [ + { + speaker: `${namespace}:speaker`, + text: `${namespace}.option.2.selected`, + }, + ], + }, + async (scene: BattleScene) => { + // Refuse the challenge, they full heal the party and give the player a Rarer Candy + scene.unshiftPhase(new PartyHealPhase(scene, true)); + setEncounterRewards(scene, { guaranteedModifierTypeFuncs: [modifierTypes.RARER_CANDY], fillRemaining: false }); + leaveEncounterWithoutBattle(scene); + } + ) + .build(); + +async function spawnNextTrainerOrEndEncounter(scene: BattleScene) { + const encounter = scene.currentBattle.mysteryEncounter; + const nextConfig = encounter.enemyPartyConfigs.pop(); + if (!nextConfig) { + await transitionMysteryEncounterIntroVisuals(scene, false, false); + await showEncounterDialogue(scene, `${namespace}:victory`, `${namespace}:speaker`); + setEncounterRewards(scene, { guaranteedModifierTypeFuncs: [modifierTypes.MYSTERY_ENCOUNTER_MACHO_BRACE], fillRemaining: false }); + encounter.doContinueEncounter = null; + leaveEncounterWithoutBattle(scene); + } else { + await initBattleWithEnemyConfig(scene, nextConfig); + } +} + +function endTrainerBattleAndShowDialogue(scene: BattleScene): Promise { + return new Promise(async resolve => { + if (scene.currentBattle.mysteryEncounter.enemyPartyConfigs.length === 0) { + // Battle is over + scene.tweens.add({ + targets: scene.currentBattle.trainer, + x: "+=16", + y: "-=16", + alpha: 0, + ease: "Sine.easeInOut", + duration: 750, + onComplete: () => { + scene.field.remove(scene.currentBattle.trainer, true); + } + }); + await spawnNextTrainerOrEndEncounter(scene); + resolve(); // Wait for all dialogue/post battle stuff to complete before resolving + } else { + scene.arena.resetArenaEffects(); + const playerField = scene.getPlayerField(); + playerField.forEach((_, p) => scene.unshiftPhase(new ReturnPhase(scene, p))); + + for (const pokemon of scene.getParty()) { + // Only trigger form change when Eiscue is in Noice form + // Hardcoded Eiscue for now in case it is fused with another pokemon + if (pokemon.species.speciesId === Species.EISCUE && pokemon.hasAbility(Abilities.ICE_FACE) && pokemon.formIndex === 1) { + scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeManualTrigger); + } + + pokemon.resetBattleData(); + applyPostBattleInitAbAttrs(PostBattleInitAbAttr, pokemon); + } + + scene.unshiftPhase(new ShowTrainerPhase(scene)); + // Hide the trainer and init next battle + const trainer = scene.currentBattle.trainer; + // Unassign previous trainer from battle so it isn't destroyed before animation completes + scene.currentBattle.trainer = null; + await spawnNextTrainerOrEndEncounter(scene); + scene.tweens.add({ + targets: trainer, + x: "+=16", + y: "-=16", + alpha: 0, + ease: "Sine.easeInOut", + duration: 750, + onComplete: () => { + scene.field.remove(trainer, true); + resolve(); + } + }); + } + }); +} + +function getVictorTrainerConfig(scene: BattleScene): EnemyPartyConfig { + return { + trainerType: TrainerType.VICTOR, + pokemonConfigs: [ + { + species: getPokemonSpecies(Species.SWELLOW), + isBoss: false, + abilityIndex: 0, // Guts + nature: Nature.ADAMANT, + moveSet: [Moves.FACADE, Moves.BRAVE_BIRD, Moves.PROTECT, Moves.QUICK_ATTACK], + modifierConfigs: [ + { + modifierType: generateModifierType(scene, modifierTypes.FLAME_ORB) as PokemonHeldItemModifierType, + isTransferable: false + }, + { + modifierType: generateModifierType(scene, modifierTypes.FOCUS_BAND) as PokemonHeldItemModifierType, + stackCount: 2, + isTransferable: false + }, + ] + }, + { + species: getPokemonSpecies(Species.OBSTAGOON), + isBoss: false, + abilityIndex: 1, // Guts + nature: Nature.ADAMANT, + moveSet: [Moves.FACADE, Moves.OBSTRUCT, Moves.NIGHT_SLASH, Moves.FIRE_PUNCH], + modifierConfigs: [ + { + modifierType: generateModifierType(scene, modifierTypes.FLAME_ORB) as PokemonHeldItemModifierType, + isTransferable: false + }, + { + modifierType: generateModifierType(scene, modifierTypes.LEFTOVERS) as PokemonHeldItemModifierType, + stackCount: 2, + isTransferable: false + } + ] + } + ] + }; +} + +function getVictoriaTrainerConfig(scene: BattleScene): EnemyPartyConfig { + return { + trainerType: TrainerType.VICTORIA, + pokemonConfigs: [ + { + species: getPokemonSpecies(Species.ROSERADE), + isBoss: false, + abilityIndex: 0, // Natural Cure + nature: Nature.CALM, + moveSet: [Moves.SYNTHESIS, Moves.SLUDGE_BOMB, Moves.GIGA_DRAIN, Moves.SLEEP_POWDER], + modifierConfigs: [ + { + modifierType: generateModifierType(scene, modifierTypes.SOUL_DEW) as PokemonHeldItemModifierType, + isTransferable: false + }, + { + modifierType: generateModifierType(scene, modifierTypes.QUICK_CLAW) as PokemonHeldItemModifierType, + stackCount: 2, + isTransferable: false + } + ] + }, + { + species: getPokemonSpecies(Species.GARDEVOIR), + isBoss: false, + formIndex: 1, + nature: Nature.TIMID, + moveSet: [Moves.PSYSHOCK, Moves.MOONBLAST, Moves.SHADOW_BALL, Moves.WILL_O_WISP], + modifierConfigs: [ + { + modifierType: generateModifierType(scene, modifierTypes.ATTACK_TYPE_BOOSTER, [Type.PSYCHIC]) as PokemonHeldItemModifierType, + stackCount: 1, + isTransferable: false + }, + { + modifierType: generateModifierType(scene, modifierTypes.ATTACK_TYPE_BOOSTER, [Type.FAIRY]) as PokemonHeldItemModifierType, + stackCount: 1, + isTransferable: false + } + ] + } + ] + }; +} + +function getViviTrainerConfig(scene: BattleScene): EnemyPartyConfig { + return { + trainerType: TrainerType.VIVI, + pokemonConfigs: [ + { + species: getPokemonSpecies(Species.SEAKING), + isBoss: false, + abilityIndex: 3, // Lightning Rod + nature: Nature.ADAMANT, + moveSet: [Moves.WATERFALL, Moves.MEGAHORN, Moves.KNOCK_OFF, Moves.REST], + modifierConfigs: [ + { + modifierType: generateModifierType(scene, modifierTypes.BERRY, [BerryType.LUM]) as PokemonHeldItemModifierType, + stackCount: 2, + isTransferable: false + }, + { + modifierType: generateModifierType(scene, modifierTypes.BASE_STAT_BOOSTER, [Stat.HP]) as PokemonHeldItemModifierType, + stackCount: 4, + isTransferable: false + } + ] + }, + { + species: getPokemonSpecies(Species.BRELOOM), + isBoss: false, + abilityIndex: 1, // Poison Heal + nature: Nature.JOLLY, + moveSet: [Moves.SPORE, Moves.SWORDS_DANCE, Moves.SEED_BOMB, Moves.DRAIN_PUNCH], + modifierConfigs: [ + { + modifierType: generateModifierType(scene, modifierTypes.BASE_STAT_BOOSTER, [Stat.HP]) as PokemonHeldItemModifierType, + stackCount: 4, + isTransferable: false + }, + { + modifierType: generateModifierType(scene, modifierTypes.TOXIC_ORB) as PokemonHeldItemModifierType, + isTransferable: false + } + ] + }, + { + species: getPokemonSpecies(Species.CAMERUPT), + isBoss: false, + formIndex: 1, + nature: Nature.CALM, + moveSet: [Moves.EARTH_POWER, Moves.FIRE_BLAST, Moves.YAWN, Moves.PROTECT], + modifierConfigs: [ + { + modifierType: generateModifierType(scene, modifierTypes.QUICK_CLAW) as PokemonHeldItemModifierType, + stackCount: 3, + isTransferable: false + }, + ] + } + ] + }; +} + +function getVickyTrainerConfig(scene: BattleScene): EnemyPartyConfig { + return { + trainerType: TrainerType.VICKY, + pokemonConfigs: [ + { + species: getPokemonSpecies(Species.MEDICHAM), + isBoss: false, + formIndex: 1, + nature: Nature.IMPISH, + moveSet: [Moves.AXE_KICK, Moves.ICE_PUNCH, Moves.ZEN_HEADBUTT, Moves.BULLET_PUNCH], + modifierConfigs: [ + { + modifierType: generateModifierType(scene, modifierTypes.SHELL_BELL) as PokemonHeldItemModifierType, + isTransferable: false + } + ] + } + ] + }; +} + +function getVitoTrainerConfig(scene: BattleScene): EnemyPartyConfig { + return { + trainerType: TrainerType.VITO, + pokemonConfigs: [ + { + species: getPokemonSpecies(Species.HISUI_ELECTRODE), + isBoss: false, + abilityIndex: 0, // Soundproof + nature: Nature.MODEST, + moveSet: [Moves.THUNDERBOLT, Moves.GIGA_DRAIN, Moves.FOUL_PLAY, Moves.THUNDER_WAVE], + modifierConfigs: [ + { + modifierType: generateModifierType(scene, modifierTypes.BASE_STAT_BOOSTER, [Stat.SPD]) as PokemonHeldItemModifierType, + stackCount: 2, + isTransferable: false + } + ] + }, + { + species: getPokemonSpecies(Species.SWALOT), + isBoss: false, + abilityIndex: 2, // Gluttony + nature: Nature.QUIET, + moveSet: [Moves.SLUDGE_BOMB, Moves.GIGA_DRAIN, Moves.ICE_BEAM, Moves.EARTHQUAKE], + modifierConfigs: [ + { + modifierType: generateModifierType(scene, modifierTypes.BERRY, [BerryType.SITRUS]) as PokemonHeldItemModifierType, + stackCount: 2, + }, + { + modifierType: generateModifierType(scene, modifierTypes.BERRY, [BerryType.APICOT]) as PokemonHeldItemModifierType, + stackCount: 2, + }, + { + modifierType: generateModifierType(scene, modifierTypes.BERRY, [BerryType.GANLON]) as PokemonHeldItemModifierType, + stackCount: 2, + }, + { + modifierType: generateModifierType(scene, modifierTypes.BERRY, [BerryType.STARF]) as PokemonHeldItemModifierType, + stackCount: 2, + }, + { + modifierType: generateModifierType(scene, modifierTypes.BERRY, [BerryType.SALAC]) as PokemonHeldItemModifierType, + stackCount: 2, + }, + { + modifierType: generateModifierType(scene, modifierTypes.BERRY, [BerryType.LUM]) as PokemonHeldItemModifierType, + stackCount: 2, + }, + { + modifierType: generateModifierType(scene, modifierTypes.BERRY, [BerryType.LANSAT]) as PokemonHeldItemModifierType, + stackCount: 2, + }, + { + modifierType: generateModifierType(scene, modifierTypes.BERRY, [BerryType.LIECHI]) as PokemonHeldItemModifierType, + stackCount: 2, + }, + { + modifierType: generateModifierType(scene, modifierTypes.BERRY, [BerryType.PETAYA]) as PokemonHeldItemModifierType, + stackCount: 2, + }, + { + modifierType: generateModifierType(scene, modifierTypes.BERRY, [BerryType.ENIGMA]) as PokemonHeldItemModifierType, + stackCount: 2, + }, + { + modifierType: generateModifierType(scene, modifierTypes.BERRY, [BerryType.LEPPA]) as PokemonHeldItemModifierType, + stackCount: 2, + } + ] + }, + { + species: getPokemonSpecies(Species.DODRIO), + isBoss: false, + abilityIndex: 2, // Tangled Feet + nature: Nature.JOLLY, + moveSet: [Moves.DRILL_PECK, Moves.QUICK_ATTACK, Moves.THRASH, Moves.KNOCK_OFF], + modifierConfigs: [ + { + modifierType: generateModifierType(scene, modifierTypes.KINGS_ROCK) as PokemonHeldItemModifierType, + stackCount: 2, + isTransferable: false + } + ] + }, + { + species: getPokemonSpecies(Species.ALAKAZAM), + isBoss: false, + formIndex: 1, + nature: Nature.BOLD, + moveSet: [Moves.PSYCHIC, Moves.SHADOW_BALL, Moves.FOCUS_BLAST, Moves.THUNDERBOLT], + modifierConfigs: [ + { + modifierType: generateModifierType(scene, modifierTypes.WIDE_LENS) as PokemonHeldItemModifierType, + stackCount: 2, + isTransferable: false + }, + ] + }, + { + species: getPokemonSpecies(Species.DARMANITAN), + isBoss: false, + abilityIndex: 0, // Sheer Force + nature: Nature.IMPISH, + moveSet: [Moves.EARTHQUAKE, Moves.U_TURN, Moves.FLARE_BLITZ, Moves.ROCK_SLIDE], + modifierConfigs: [ + { + modifierType: generateModifierType(scene, modifierTypes.QUICK_CLAW) as PokemonHeldItemModifierType, + stackCount: 2, + isTransferable: false + }, + ] + } + ] + }; +} diff --git a/src/data/mystery-encounters/encounters/training-session-encounter.ts b/src/data/mystery-encounters/encounters/training-session-encounter.ts index c6cd93068b9..9e89fd24d1d 100644 --- a/src/data/mystery-encounters/encounters/training-session-encounter.ts +++ b/src/data/mystery-encounters/encounters/training-session-encounter.ts @@ -14,7 +14,7 @@ import { randSeedShuffle } from "#app/utils"; import { BattlerTagType } from "#enums/battler-tag-type"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import BattleScene from "#app/battle-scene"; -import IMysteryEncounter, { MysteryEncounterBuilder } from "../mystery-encounter"; +import MysteryEncounter, { MysteryEncounterBuilder } from "../mystery-encounter"; import { MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; import { getEncounterText, queueEncounterMessage } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; @@ -28,7 +28,7 @@ const namespace = "mysteryEncounter:trainingSession"; * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/43 | GitHub Issue #43} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ -export const TrainingSessionEncounter: IMysteryEncounter = +export const TrainingSessionEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.TRAINING_SESSION) .withEncounterTier(MysteryEncounterTier.ULTRA) .withSceneWaveRangeRequirement(10, 180) // waves 10 to 180 @@ -444,7 +444,7 @@ function getEnemyConfig(scene: BattleScene, playerPokemon: PlayerPokemon,segment formIndex: playerPokemon.formIndex, level: playerPokemon.level, dataSource: data, - modifierTypes: modifierTypes, + modifierConfigs: modifierTypes, }, ], }; 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 0ea9d42ca63..4f21f70c005 100644 --- a/src/data/mystery-encounters/encounters/trash-to-treasure-encounter.ts +++ b/src/data/mystery-encounters/encounters/trash-to-treasure-encounter.ts @@ -1,8 +1,8 @@ -import { EnemyPartyConfig, EnemyPokemonConfig, generateModifierTypeOption, initBattleWithEnemyConfig, leaveEncounterWithoutBattle, loadCustomMovesForEncounter, setEncounterRewards, transitionMysteryEncounterIntroVisuals, } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { EnemyPartyConfig, EnemyPokemonConfig, generateModifierType, initBattleWithEnemyConfig, leaveEncounterWithoutBattle, loadCustomMovesForEncounter, setEncounterRewards, transitionMysteryEncounterIntroVisuals, } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { modifierTypes, PokemonHeldItemModifierType } from "#app/modifier/modifier-type"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import BattleScene from "#app/battle-scene"; -import IMysteryEncounter, { MysteryEncounterBuilder } from "../mystery-encounter"; +import MysteryEncounter, { MysteryEncounterBuilder } from "../mystery-encounter"; import { MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; import { ModifierRewardPhase } from "#app/phases"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; @@ -28,7 +28,7 @@ const SOUND_EFFECT_WAIT_TIME = 700; * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/74 | GitHub Issue #74} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ -export const TrashToTreasureEncounter: IMysteryEncounter = +export const TrashToTreasureEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.TRASH_TO_TREASURE) .withEncounterTier(MysteryEncounterTier.ULTRA) .withSceneWaveRangeRequirement(10, 180) @@ -147,8 +147,8 @@ export const TrashToTreasureEncounter: IMysteryEncounter = .build(); async function tryApplyDigRewardItems(scene: BattleScene) { - const shellBell = generateModifierTypeOption(scene, modifierTypes.SHELL_BELL).type as PokemonHeldItemModifierType; - const leftovers = generateModifierTypeOption(scene, modifierTypes.LEFTOVERS).type as PokemonHeldItemModifierType; + const shellBell = generateModifierType(scene, modifierTypes.SHELL_BELL) as PokemonHeldItemModifierType; + const leftovers = generateModifierType(scene, modifierTypes.LEFTOVERS) as PokemonHeldItemModifierType; const party = scene.getParty(); diff --git a/src/data/mystery-encounters/encounters/weird-dream-encounter.ts b/src/data/mystery-encounters/encounters/weird-dream-encounter.ts index d556a3b0c82..e76f0af1dd6 100644 --- a/src/data/mystery-encounters/encounters/weird-dream-encounter.ts +++ b/src/data/mystery-encounters/encounters/weird-dream-encounter.ts @@ -2,7 +2,7 @@ import { Type } from "#app/data/type"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { Species } from "#enums/species"; import BattleScene from "#app/battle-scene"; -import IMysteryEncounter, { MysteryEncounterBuilder } from "../mystery-encounter"; +import MysteryEncounter, { MysteryEncounterBuilder } from "../mystery-encounter"; import { MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; import { leaveEncounterWithoutBattle, setEncounterRewards, } from "../utils/encounter-phase-utils"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; @@ -79,7 +79,7 @@ const excludedPokemon = [ * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/137 | GitHub Issue #137} * @see For biome requirements check {@linkcode mysteryEncountersByBiome} */ -export const WeirdDreamEncounter: IMysteryEncounter = +export const WeirdDreamEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.WEIRD_DREAM) .withEncounterTier(MysteryEncounterTier.ROGUE) .withIntroSpriteConfigs([ @@ -202,11 +202,6 @@ export const WeirdDreamEncounter: IMysteryEncounter = return true; } ) - .withOutroDialogue([ - { - text: `${namespace}.outro` - } - ]) .build(); interface PokemonTransformation { diff --git a/src/data/mystery-encounters/mystery-encounter.ts b/src/data/mystery-encounters/mystery-encounter.ts index b1b47cef8ef..6d2bd27f88b 100644 --- a/src/data/mystery-encounters/mystery-encounter.ts +++ b/src/data/mystery-encounters/mystery-encounter.ts @@ -6,25 +6,16 @@ import BattleScene from "#app/battle-scene"; import MysteryEncounterIntroVisuals, { MysteryEncounterSpriteConfig } from "#app/field/mystery-encounter-intro"; import * as Utils from "#app/utils"; import { StatusEffect } from "../status-effect"; -import MysteryEncounterDialogue, { - OptionTextDisplay -} from "./mystery-encounter-dialogue"; +import MysteryEncounterDialogue, { OptionTextDisplay } from "./mystery-encounter-dialogue"; import MysteryEncounterOption, { MysteryEncounterOptionBuilder, OptionPhaseCallback } from "./mystery-encounter-option"; -import { - EncounterPokemonRequirement, - EncounterSceneRequirement, - HealthRatioRequirement, - PartySizeRequirement, - StatusEffectRequirement, - WaveRangeRequirement -} from "./mystery-encounter-requirements"; +import { EncounterPokemonRequirement, EncounterSceneRequirement, HealthRatioRequirement, PartySizeRequirement, StatusEffectRequirement, WaveRangeRequirement } from "./mystery-encounter-requirements"; import { BattlerIndex } from "#app/battle"; import { EncounterAnim } from "#app/data/battle-anims"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; import { MysteryEncounterMode } from "#enums/mystery-encounter-mode"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; -export interface StartOfBattleEffect { +export interface EncounterStartOfBattleEffect { sourcePokemon?: Pokemon; sourceBattlerIndex?: BattlerIndex; targets: BattlerIndex[]; @@ -33,7 +24,7 @@ export interface StartOfBattleEffect { followUp?: boolean; } -export default interface IMysteryEncounter { +export default interface MysteryEncounter { /** * Required params */ @@ -44,13 +35,44 @@ export default interface IMysteryEncounter { * Optional params */ encounterTier?: MysteryEncounterTier; + /** + * Custom battle animations that are configured for encounter effects and visuals + * Specify here so that assets are loaded on initialization of encounter + */ encounterAnimations?: EncounterAnim[]; + /** + * If true, hides "A Wild X Appeared" etc. messages + * Default true + */ hideBattleIntroMessage?: boolean; + /** + * If true, when an option is selected the field visuals will fade out automatically + * Default false + */ autoHideIntroVisuals?: boolean; + /** + * Intro visuals on the field will slide in from the right instead of the left + * Default false + */ enterIntroVisualsFromRight?: boolean; + /** + * If true, allows catching a wild pokemon during the encounter + * Default false + */ catchAllowed?: boolean; + /** + * If true, encounter will continuously run through multiple battles/puzzles/etc. instead of going to next wave + * MUST EVENTUALLY BE DISABLED TO CONTINUE TO NEXT WAVE + * Default false + */ + continuousEncounter?: boolean; + /** + * Maximum number of times the encounter can be seen per run + * Rogue tier encounters default to 1, others default to 3 + */ maxAllowedEncounters?: number; + /** * Event callback functions */ @@ -62,6 +84,8 @@ export default interface IMysteryEncounter { doEncounterExp?: (scene: BattleScene) => boolean; /** Will provide the player a rewards shop for that wave */ doEncounterRewards?: (scene: BattleScene) => boolean; + /** Will execute callback during VictoryPhase of a continuousEncounter */ + doContinueEncounter?: (scene: BattleScene) => Promise; /** * Requirements @@ -90,6 +114,7 @@ export default interface IMysteryEncounter { /** * Data used for setting up/initializing enemy party in battles * Can store multiple configs so that one can be chosen based on option selected + * Should usually be defined in `onInit()` or `onPreOptionPhase()` */ enemyPartyConfigs?: EnemyPartyConfig[]; /** @@ -131,7 +156,7 @@ export default interface IMysteryEncounter { /** * Will be set by option select handlers automatically, and can be used to refer to which option was chosen by later phases */ - startOfBattleEffects?: StartOfBattleEffect[]; + startOfBattleEffects?: EncounterStartOfBattleEffect[]; /** * Can be set higher or lower based on the type of battle or exp gained for an option/encounter * Defaults to 1 @@ -149,14 +174,14 @@ export default interface IMysteryEncounter { * These objects will be saved as part of session data any time the player is on a floor with an encounter * Unless you know what you're doing, you should use MysteryEncounterBuilder to create an instance for this class */ -export default class IMysteryEncounter implements IMysteryEncounter { +export default class MysteryEncounter implements MysteryEncounter { /** * Used for keeping RNG consistent on session resets, but increments when cycling through multiple "Encounters" on the same wave * You should only need to interact via getter/update methods */ private seedOffset?: any; - constructor(encounter: IMysteryEncounter) { + constructor(encounter: MysteryEncounter) { if (!isNullOrUndefined(encounter)) { Object.assign(this, encounter); } @@ -170,6 +195,7 @@ export default class IMysteryEncounter implements IMysteryEncounter { this.hideBattleIntroMessage = this.hideBattleIntroMessage ?? false; this.autoHideIntroVisuals = this.autoHideIntroVisuals ?? true; this.enterIntroVisualsFromRight = this.enterIntroVisualsFromRight ?? false; + this.continuousEncounter = this.continuousEncounter ?? false; // Reset any dirty flags or encounter data this.startOfBattleEffectsComplete = false; @@ -238,11 +264,11 @@ export default class IMysteryEncounter implements IMysteryEncounter { } if (truePrimaryPool.length > 0) { - // always choose from the non-overlapping pokemon first + // Always choose from the non-overlapping pokemon first this.primaryPokemon = truePrimaryPool[Utils.randSeedInt(truePrimaryPool.length, 0)]; return true; } else { - // if there are multiple overlapping pokemon, we're okay - just choose one and take it out of the primary pokemon pool + // If there are multiple overlapping pokemon, we're okay - just choose one and take it out of the primary pokemon pool if (overlap.length > 1 || (this.secondaryPokemon.length - overlap.length >= 1)) { // is this working? this.primaryPokemon = overlap[Utils.randSeedInt(overlap.length, 0)]; @@ -371,7 +397,7 @@ export default class IMysteryEncounter implements IMysteryEncounter { } /** - * If an encounter uses {@link MysteryEncounterMode.CONTINUOUS_ENCOUNTER}, + * If an encounter uses {@link MysteryEncounterMode.continuousEncounter}, * should rely on this value for seed offset instead of wave index. * * This offset is incremented for each new {@link MysteryEncounterPhase} that occurs, @@ -396,7 +422,11 @@ export default class IMysteryEncounter implements IMysteryEncounter { } } -export class MysteryEncounterBuilder implements Partial { +/** + * Builder class for creating a MysteryEncounter + * must call `build()` at the end after specifying all params for the MysteryEncounter + */ +export class MysteryEncounterBuilder implements Partial { encounterType?: MysteryEncounterType; options?: [MysteryEncounterOption, MysteryEncounterOption, ...MysteryEncounterOption[]] = [null, null]; spriteConfigs?: MysteryEncounterSpriteConfig[]; @@ -418,7 +448,7 @@ export class MysteryEncounterBuilder implements Partial { hideBattleIntroMessage?: boolean; hideIntroVisuals?: boolean; enterIntroVisualsFromRight?: boolean; - enemyPartyConfigs?: EnemyPartyConfig[] = []; + continuousEncounter?: boolean; /** * REQUIRED @@ -429,7 +459,7 @@ export class MysteryEncounterBuilder implements Partial { * @param encounterType * @returns this */ - static withEncounterType(encounterType: MysteryEncounterType): MysteryEncounterBuilder & Pick { + static withEncounterType(encounterType: MysteryEncounterType): MysteryEncounterBuilder & Pick { return Object.assign(new MysteryEncounterBuilder(), { encounterType: encounterType }); } @@ -442,7 +472,7 @@ export class MysteryEncounterBuilder implements Partial { * @param option - MysteryEncounterOption to add, can use MysteryEncounterOptionBuilder to create instance * @returns */ - withOption(option: MysteryEncounterOption): this & Pick { + withOption(option: MysteryEncounterOption): this & Pick { if (this.options[0] === null) { return Object.assign(this, { options: [option, this.options[0]] }); } else if (this.options[1] === null) { @@ -464,7 +494,7 @@ export class MysteryEncounterBuilder implements Partial { * @param callback - {@linkcode OptionPhaseCallback} * @returns */ - withSimpleOption(dialogue: OptionTextDisplay, callback: OptionPhaseCallback): this & Pick { + withSimpleOption(dialogue: OptionTextDisplay, callback: OptionPhaseCallback): this & Pick { return this.withOption(new MysteryEncounterOptionBuilder().withOptionMode(MysteryEncounterOptionMode.DEFAULT).withDialogue(dialogue).withOptionPhase(callback).build()); } @@ -478,7 +508,7 @@ export class MysteryEncounterBuilder implements Partial { * @param callback - {@linkcode OptionPhaseCallback} * @returns */ - withSimpleDexProgressOption(dialogue: OptionTextDisplay, callback: OptionPhaseCallback): this & Pick { + withSimpleDexProgressOption(dialogue: OptionTextDisplay, callback: OptionPhaseCallback): this & Pick { return this.withOption(new MysteryEncounterOptionBuilder() .withOptionMode(MysteryEncounterOptionMode.DEFAULT) .withHasDexProgress(true) @@ -492,7 +522,7 @@ export class MysteryEncounterBuilder implements Partial { * @param spriteConfigs * @returns */ - withIntroSpriteConfigs(spriteConfigs: MysteryEncounterSpriteConfig[]): this & Pick { + withIntroSpriteConfigs(spriteConfigs: MysteryEncounterSpriteConfig[]): this & Pick { return Object.assign(this, { spriteConfigs: spriteConfigs }); } @@ -521,28 +551,38 @@ export class MysteryEncounterBuilder implements Partial { * @param encounterTier * @returns */ - withEncounterTier(encounterTier: MysteryEncounterTier): this & Required> { + withEncounterTier(encounterTier: MysteryEncounterTier): this & Required> { return Object.assign(this, { encounterTier: encounterTier }); } /** * Defines any EncounterAnim animations that are intended to be used during the encounter - * EncounterAnims can be played at any point during an encounter or callback + * EncounterAnims are custom battle animations (think Ice Beam) that can be played at any point during an encounter or callback * They just need to be specified here so that resources are loaded on encounter init * @param encounterAnimations * @returns */ - withAnimations(...encounterAnimations: EncounterAnim[]): this & Required> { + withAnimations(...encounterAnimations: EncounterAnim[]): this & Required> { const animations = Array.isArray(encounterAnimations) ? encounterAnimations : [encounterAnimations]; return Object.assign(this, { encounterAnimations: animations }); } + /** + * If true, encounter will continuously run through multiple battles/puzzles/etc. instead of going to next wave + * MUST EVENTUALLY BE DISABLED TO CONTINUE TO NEXT WAVE + * Default false + * @param continuousEncounter + */ + withContinuousEncounter(continuousEncounter: boolean): this & Required> { + return Object.assign(this, { continuousEncounter: continuousEncounter }); + } + /** * Sets the maximum number of times that an encounter can spawn in a given Classic run * @param maxAllowedEncounters * @returns */ - withMaxAllowedEncounters(maxAllowedEncounters: number): this & Required> { + withMaxAllowedEncounters(maxAllowedEncounters: number): this & Required> { return Object.assign(this, { maxAllowedEncounters: maxAllowedEncounters }); } @@ -553,7 +593,7 @@ export class MysteryEncounterBuilder implements Partial { * @param requirement * @returns */ - withSceneRequirement(requirement: EncounterSceneRequirement): this & Required> { + withSceneRequirement(requirement: EncounterSceneRequirement): this & Required> { if (requirement instanceof EncounterPokemonRequirement) { Error("Incorrectly added pokemon requirement as scene requirement."); } @@ -568,7 +608,7 @@ export class MysteryEncounterBuilder implements Partial { * @param max optional max wave. If not given, defaults to min => exact wave * @returns */ - withSceneWaveRangeRequirement(min: number, max?: number): this & Required> { + withSceneWaveRangeRequirement(min: number, max?: number): this & Required> { return this.withSceneRequirement(new WaveRangeRequirement([min, max ?? min])); } @@ -580,7 +620,7 @@ export class MysteryEncounterBuilder implements Partial { * @param excludeFainted - if true, only counts unfainted mons * @returns */ - withScenePartySizeRequirement(min: number, max?: number, excludeFainted?: boolean): this & Required> { + withScenePartySizeRequirement(min: number, max?: number, excludeFainted?: boolean): this & Required> { return this.withSceneRequirement(new PartySizeRequirement([min, max ?? min], excludeFainted)); } @@ -590,7 +630,7 @@ export class MysteryEncounterBuilder implements Partial { * @param requirement {@linkcode EncounterPokemonRequirement} * @returns */ - withPrimaryPokemonRequirement(requirement: EncounterPokemonRequirement): this & Required> { + withPrimaryPokemonRequirement(requirement: EncounterPokemonRequirement): this & Required> { if (requirement instanceof EncounterSceneRequirement) { Error("Incorrectly added scene requirement as pokemon requirement."); } @@ -607,7 +647,7 @@ export class MysteryEncounterBuilder implements Partial { * @param invertQuery if true will invert the query * @returns */ - withPrimaryPokemonStatusEffectRequirement(statusEffect: StatusEffect | StatusEffect[], minNumberOfPokemon: number = 1, invertQuery: boolean = false): this & Required> { + withPrimaryPokemonStatusEffectRequirement(statusEffect: StatusEffect | StatusEffect[], minNumberOfPokemon: number = 1, invertQuery: boolean = false): this & Required> { return this.withPrimaryPokemonRequirement(new StatusEffectRequirement(statusEffect, minNumberOfPokemon, invertQuery)); } @@ -619,14 +659,14 @@ export class MysteryEncounterBuilder implements Partial { * @param invertQuery if true will invert the query * @returns */ - withPrimaryPokemonHealthRatioRequirement(requiredHealthRange: [number, number], minNumberOfPokemon: number = 1, invertQuery: boolean = false): this & Required> { + withPrimaryPokemonHealthRatioRequirement(requiredHealthRange: [number, number], minNumberOfPokemon: number = 1, invertQuery: boolean = false): this & Required> { return this.withPrimaryPokemonRequirement(new HealthRatioRequirement(requiredHealthRange, minNumberOfPokemon, invertQuery)); } // TODO: Maybe add an optional parameter for excluding primary pokemon from the support cast? // ex. if your only grass type pokemon, a snivy, is chosen as primary, if the support pokemon requires a grass type, the event won't trigger because // it's already been - withSecondaryPokemonRequirement(requirement: EncounterPokemonRequirement, excludePrimaryFromSecondaryRequirements: boolean = false): this & Required> { + withSecondaryPokemonRequirement(requirement: EncounterPokemonRequirement, excludePrimaryFromSecondaryRequirements: boolean = false): this & Required> { if (requirement instanceof EncounterSceneRequirement) { Error("Incorrectly added scene requirement as pokemon requirement."); } @@ -646,7 +686,7 @@ export class MysteryEncounterBuilder implements Partial { * @param doEncounterRewards - synchronous callback function to perform during rewards phase of the encounter * @returns */ - withRewards(doEncounterRewards: (scene: BattleScene) => boolean): this & Required> { + withRewards(doEncounterRewards: (scene: BattleScene) => boolean): this & Required> { return Object.assign(this, { doEncounterRewards: doEncounterRewards }); } @@ -660,7 +700,7 @@ export class MysteryEncounterBuilder implements Partial { * @param doEncounterExp - synchronous callback function to perform during rewards phase of the encounter * @returns */ - withExp(doEncounterExp: (scene: BattleScene) => boolean): this & Required> { + withExp(doEncounterExp: (scene: BattleScene) => boolean): this & Required> { return Object.assign(this, { doEncounterExp: doEncounterExp }); } @@ -671,7 +711,7 @@ export class MysteryEncounterBuilder implements Partial { * @param onInit - synchronous callback function to perform as soon as the encounter is selected for the next phase * @returns */ - withOnInit(onInit: (scene: BattleScene) => boolean): this & Required> { + withOnInit(onInit: (scene: BattleScene) => boolean): this & Required> { return Object.assign(this, { onInit: onInit }); } @@ -681,27 +721,17 @@ export class MysteryEncounterBuilder implements Partial { * @param onVisualsStart - synchronous callback function to perform as soon as the enemy field finishes sliding in * @returns */ - withOnVisualsStart(onVisualsStart: (scene: BattleScene) => boolean): this & Required> { + withOnVisualsStart(onVisualsStart: (scene: BattleScene) => boolean): this & Required> { return Object.assign(this, { onVisualsStart: onVisualsStart }); } - /** - * Defines any enemies to use for a battle from the mystery encounter - * @param enemyPartyConfig - * @returns - */ - withEnemyPartyConfig(enemyPartyConfig: EnemyPartyConfig): this & Required> { - this.enemyPartyConfigs.push(enemyPartyConfig); - return Object.assign(this, { enemyPartyConfigs: this.enemyPartyConfigs }); - } - /** * Can set whether catching is allowed or not on the encounter * This flag can also be programmatically set inside option event functions or elsewhere * @param catchAllowed - if true, allows enemy pokemon to be caught during the encounter * @returns */ - withCatchAllowed(catchAllowed: boolean): this & Required> { + withCatchAllowed(catchAllowed: boolean): this & Required> { return Object.assign(this, { catchAllowed: catchAllowed }); } @@ -709,7 +739,7 @@ export class MysteryEncounterBuilder implements Partial { * @param hideBattleIntroMessage - if true, will not show the trainerAppeared/wildAppeared/bossAppeared message for an encounter * @returns */ - withHideWildIntroMessage(hideBattleIntroMessage: boolean): this & Required> { + withHideWildIntroMessage(hideBattleIntroMessage: boolean): this & Required> { return Object.assign(this, { hideBattleIntroMessage: hideBattleIntroMessage }); } @@ -717,7 +747,7 @@ export class MysteryEncounterBuilder implements Partial { * @param autoHideIntroVisuals - if false, will not hide the intro visuals that are displayed at the beginning of encounter * @returns */ - withAutoHideIntroVisuals(autoHideIntroVisuals: boolean): this & Required> { + withAutoHideIntroVisuals(autoHideIntroVisuals: boolean): this & Required> { return Object.assign(this, { autoHideIntroVisuals: autoHideIntroVisuals }); } @@ -726,7 +756,7 @@ export class MysteryEncounterBuilder implements Partial { * Default false * @returns */ - withEnterIntroVisualsFromRight(enterIntroVisualsFromRight: boolean): this & Required> { + withEnterIntroVisualsFromRight(enterIntroVisualsFromRight: boolean): this & Required> { return Object.assign(this, { enterIntroVisualsFromRight: enterIntroVisualsFromRight }); } @@ -806,7 +836,7 @@ export class MysteryEncounterBuilder implements Partial { * * @returns */ - build(this: IMysteryEncounter): IMysteryEncounter { - return new IMysteryEncounter(this); + build(this: MysteryEncounter): MysteryEncounter { + return new MysteryEncounter(this); } } diff --git a/src/data/mystery-encounters/mystery-encounters.ts b/src/data/mystery-encounters/mystery-encounters.ts index f73673706ea..44f4ecf2420 100644 --- a/src/data/mystery-encounters/mystery-encounters.ts +++ b/src/data/mystery-encounters/mystery-encounters.ts @@ -10,7 +10,7 @@ import { MysteriousChestEncounter } from "./encounters/mysterious-chest-encounte import { ShadyVitaminDealerEncounter } from "./encounters/shady-vitamin-dealer-encounter"; import { SlumberingSnorlaxEncounter } from "./encounters/slumbering-snorlax-encounter"; import { TrainingSessionEncounter } from "./encounters/training-session-encounter"; -import IMysteryEncounter from "./mystery-encounter"; +import MysteryEncounter from "./mystery-encounter"; import { SafariZoneEncounter } from "#app/data/mystery-encounters/encounters/safari-zone-encounter"; import { FieryFalloutEncounter } from "#app/data/mystery-encounters/encounters/fiery-fallout-encounter"; import { TheStrongStuffEncounter } from "#app/data/mystery-encounters/encounters/the-strong-stuff-encounter"; @@ -25,6 +25,7 @@ import { ClowningAroundEncounter } from "#app/data/mystery-encounters/encounters import { PartTimerEncounter } from "#app/data/mystery-encounters/encounters/part-timer-encounter"; import { DancingLessonsEncounter } from "#app/data/mystery-encounters/encounters/dancing-lessons-encounter"; import { WeirdDreamEncounter } from "#app/data/mystery-encounters/encounters/weird-dream-encounter"; +import { TheWinstrateChallengeEncounter } from "#app/data/mystery-encounters/encounters/the-winstrate-challenge-encounter"; // Spawn chance: (BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT + WIGHT_INCREMENT_ON_SPAWN_MISS * ) / 256 export const BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT = 1; @@ -132,7 +133,7 @@ export const CIVILIZATION_ENCOUNTER_BIOMES = [ Biome.ISLAND ]; -export const allMysteryEncounters: { [encounterType: number]: IMysteryEncounter } = {}; +export const allMysteryEncounters: { [encounterType: number]: MysteryEncounter } = {}; const extremeBiomeEncounters: MysteryEncounterType[] = []; @@ -147,6 +148,7 @@ const humanTransitableBiomeEncounters: MysteryEncounterType[] = [ MysteryEncounterType.SHADY_VITAMIN_DEALER, MysteryEncounterType.THE_POKEMON_SALESMAN, MysteryEncounterType.AN_OFFER_YOU_CANT_REFUSE, + MysteryEncounterType.THE_WINSTRATE_CHALLENGE ]; const civilizationBiomeEncounters: MysteryEncounterType[] = [ @@ -270,6 +272,7 @@ export function initMysteryEncounters() { allMysteryEncounters[MysteryEncounterType.PART_TIMER] = PartTimerEncounter; allMysteryEncounters[MysteryEncounterType.DANCING_LESSONS] = DancingLessonsEncounter; allMysteryEncounters[MysteryEncounterType.WEIRD_DREAM] = WeirdDreamEncounter; + allMysteryEncounters[MysteryEncounterType.THE_WINSTRATE_CHALLENGE] = TheWinstrateChallengeEncounter; // Add extreme encounters to biome map extremeBiomeEncounters.forEach(encounter => { diff --git a/src/data/mystery-encounters/utils/encounter-phase-utils.ts b/src/data/mystery-encounters/utils/encounter-phase-utils.ts index a4be81a3e08..4d3d89b1abc 100644 --- a/src/data/mystery-encounters/utils/encounter-phase-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-phase-utils.ts @@ -3,9 +3,9 @@ import { biomeLinks, BiomePoolTier } from "#app/data/biomes"; import MysteryEncounterOption from "#app/data/mystery-encounters/mystery-encounter-option"; import { WEIGHT_INCREMENT_ON_SPAWN_MISS } from "#app/data/mystery-encounters/mystery-encounters"; import { showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; -import Pokemon, { FieldPosition, PlayerPokemon, PokemonMove } from "#app/field/pokemon"; +import Pokemon, { FieldPosition, PlayerPokemon, PokemonMove, PokemonSummonData } from "#app/field/pokemon"; import { ExpBalanceModifier, ExpShareModifier, MultipleParticipantExpBonusModifier, PokemonExpBoosterModifier } from "#app/modifier/modifier"; -import { CustomModifierSettings, ModifierPoolType, ModifierType, ModifierTypeGenerator, ModifierTypeOption, modifierTypes, PokemonHeldItemModifierType, regenerateModifierPoolThresholds } from "#app/modifier/modifier-type"; +import { CustomModifierSettings, ModifierPoolType, ModifierType, ModifierTypeGenerator, ModifierTypeOption, modifierTypes, regenerateModifierPoolThresholds } from "#app/modifier/modifier-type"; import { BattleEndPhase, EggLapsePhase, ExpPhase, GameOverPhase, MovePhase, SelectModifierPhase, ShowPartyExpBarPhase, TrainerVictoryPhase } from "#app/phases"; import { MysteryEncounterBattlePhase, MysteryEncounterBattleStartCleanupPhase, MysteryEncounterPhase, MysteryEncounterRewardsPhase } from "#app/phases/mystery-encounter-phases"; import PokemonData from "#app/system/pokemon-data"; @@ -30,8 +30,8 @@ import { TrainerConfig, trainerConfigs, TrainerSlot } from "#app/data/trainer-co import PokemonSpecies from "#app/data/pokemon-species"; import Overrides from "#app/overrides"; import { Egg, IEggOptions } from "#app/data/egg"; -import { Abilities } from "#enums/abilities"; import { MysteryEncounterPokemonData } from "#app/data/mystery-encounters/mystery-encounter-pokemon-data"; +import HeldModifierConfig from "#app/interfaces/held-modifier-config"; /** * Animates exclamation sprite over trainer's head at start of encounter @@ -67,18 +67,18 @@ export interface EnemyPokemonConfig { bossSegmentModifier?: number; // Additive to the determined segment number mysteryEncounterData?: MysteryEncounterPokemonData; formIndex?: number; + abilityIndex?: number; level?: number; gender?: Gender; passive?: boolean; moveSet?: Moves[]; nature?: Nature; ivs?: [integer, integer, integer, integer, integer, integer]; - ability?: Abilities; shiny?: boolean; /** Can set just the status, or pass a timer on the status turns */ status?: StatusEffect | [StatusEffect, number]; mysteryEncounterBattleEffects?: (pokemon: Pokemon) => void; - modifierTypes?: PokemonHeldItemModifierType[]; + modifierConfigs?: HeldModifierConfig[]; tags?: BattlerTagType[]; dataSource?: PokemonData; } @@ -258,10 +258,13 @@ export async function initBattleWithEnemyConfig(scene: BattleScene, partyConfig: } // Set summon data fields + if (!enemyPokemon.summonData) { + enemyPokemon.summonData = new PokemonSummonData(); + } // Set ability - if (!isNullOrUndefined(config.ability)) { - enemyPokemon.summonData.ability = config.ability; + if (!isNullOrUndefined(config.abilityIndex)) { + enemyPokemon.abilityIndex = config.abilityIndex; } // Set gender @@ -293,6 +296,7 @@ export async function initBattleWithEnemyConfig(scene: BattleScene, partyConfig: enemyPokemon.initBattleInfo(); enemyPokemon.getBattleInfo().initInfo(enemyPokemon); + enemyPokemon.generateName(); } loadEnemyAssets.push(enemyPokemon.loadAssets()); @@ -315,8 +319,8 @@ export async function initBattleWithEnemyConfig(scene: BattleScene, partyConfig: }); if (!loaded) { regenerateModifierPoolThresholds(scene.getEnemyField(), battle.battleType === BattleType.TRAINER ? ModifierPoolType.TRAINER : ModifierPoolType.WILD); - const customModifiers = partyConfig?.pokemonConfigs?.map(config => config?.modifierTypes); - scene.generateEnemyModifiers(customModifiers); + const customModifierTypes = partyConfig?.pokemonConfigs?.map(config => config?.modifierConfigs); + scene.generateEnemyModifiers(customModifierTypes); } } @@ -363,7 +367,7 @@ 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 generateModifierTypeOption(scene: BattleScene, modifier: () => ModifierType, pregenArgs?: any[]): ModifierTypeOption { +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]?.(); @@ -373,6 +377,17 @@ export function generateModifierTypeOption(scene: BattleScene, modifier: () => M .withTierFromPool(); result = result instanceof ModifierTypeGenerator ? result.generateType(scene.getParty(), pregenArgs) : result; + return result; +} + +/** + * Converts modifier bullshit to an actual item + * @param scene - Battle Scene + * @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 { + const result = generateModifierType(scene, modifier, pregenArgs); return new ModifierTypeOption(result, 0); } @@ -644,14 +659,15 @@ export function handleMysteryEncounterVictory(scene: BattleScene, addHealPhase: // If in repeated encounter variant, do nothing // Variant must eventually be swapped in order to handle "true" end of the encounter - if (scene.currentBattle.mysteryEncounter.encounterMode === MysteryEncounterMode.CONTINUOUS_ENCOUNTER || doNotContinue) { + const encounter = scene.currentBattle.mysteryEncounter; + if (encounter.continuousEncounter || doNotContinue) { return; - } else if (scene.currentBattle.mysteryEncounter.encounterMode === MysteryEncounterMode.NO_BATTLE) { + } else if (encounter.encounterMode === MysteryEncounterMode.NO_BATTLE) { scene.pushPhase(new EggLapsePhase(scene)); scene.pushPhase(new MysteryEncounterRewardsPhase(scene, addHealPhase)); - } else if (!scene.getEnemyParty().find(p => scene.currentBattle.mysteryEncounter.encounterMode !== MysteryEncounterMode.TRAINER_BATTLE ? p.isOnField() : !p?.isFainted(true))) { + } else if (!scene.getEnemyParty().find(p => encounter.encounterMode !== MysteryEncounterMode.TRAINER_BATTLE ? p.isOnField() : !p?.isFainted(true))) { scene.pushPhase(new BattleEndPhase(scene)); - if (scene.currentBattle.mysteryEncounter.encounterMode === MysteryEncounterMode.TRAINER_BATTLE) { + if (encounter.encounterMode === MysteryEncounterMode.TRAINER_BATTLE) { scene.pushPhase(new TrainerVictoryPhase(scene)); } if (scene.gameMode.isEndless || !scene.gameMode.isWaveFinal(scene.currentBattle.waveIndex)) { diff --git a/src/data/mystery-encounters/utils/encounter-transformation-sequence.ts b/src/data/mystery-encounters/utils/encounter-transformation-sequence.ts index 271cdaf391e..9da36ee6846 100644 --- a/src/data/mystery-encounters/utils/encounter-transformation-sequence.ts +++ b/src/data/mystery-encounters/utils/encounter-transformation-sequence.ts @@ -11,13 +11,13 @@ export enum TransformationScreenPosition { } /** - * Initiates an "evolution-like" animation to transform a pokemon (presumably from the player's party) into a new one, not necessarily an evolution species. + * Initiates an "evolution-like" animation to transform a previousPokemon (presumably from the player's party) into a new one, not necessarily an evolution species. * @param scene - * @param pokemon - * @param transformedPokemon + * @param previousPokemon + * @param transformPokemon * @param screenPosition */ -export function doPokemonTransformationSequence(scene: BattleScene, pokemon: PlayerPokemon, transformedPokemon: PlayerPokemon, screenPosition: TransformationScreenPosition) { +export function doPokemonTransformationSequence(scene: BattleScene, previousPokemon: PlayerPokemon, transformPokemon: PlayerPokemon, screenPosition: TransformationScreenPosition) { return new Promise(resolve => { const transformationContainer = scene.fieldUI.getByName("Dream Background") as Phaser.GameObjects.Container; const transformationBaseBg = scene.add.image(0, 0, "default_bg"); @@ -36,7 +36,7 @@ export function doPokemonTransformationSequence(scene: BattleScene, pokemon: Pla const yOffset = screenPosition !== TransformationScreenPosition.CENTER ? -15 : 0; const getPokemonSprite = () => { - const ret = scene.addPokemonSprite(pokemon, transformationBaseBg.displayWidth / 2 + xOffset, transformationBaseBg.displayHeight / 2 + yOffset, "pkmn__sub"); + const ret = scene.addPokemonSprite(previousPokemon, transformationBaseBg.displayWidth / 2 + xOffset, transformationBaseBg.displayHeight / 2 + yOffset, "pkmn__sub"); ret.setPipeline(scene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], ignoreTimeTint: true }); return ret; }; @@ -54,31 +54,31 @@ export function doPokemonTransformationSequence(scene: BattleScene, pokemon: Pla pokemonEvoTintSprite.setTintFill(0xFFFFFF); [ pokemonSprite, pokemonTintSprite, pokemonEvoSprite, pokemonEvoTintSprite ].map(sprite => { - sprite.play(pokemon.getSpriteKey(true)); - sprite.setPipeline(scene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], hasShadow: false, teraColor: getTypeRgb(pokemon.getTeraType()) }); + sprite.play(previousPokemon.getSpriteKey(true)); + sprite.setPipeline(scene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], hasShadow: false, teraColor: getTypeRgb(previousPokemon.getTeraType()) }); sprite.setPipelineData("ignoreTimeTint", true); - sprite.setPipelineData("spriteKey", pokemon.getSpriteKey()); - sprite.setPipelineData("shiny", pokemon.shiny); - sprite.setPipelineData("variant", pokemon.variant); + sprite.setPipelineData("spriteKey", previousPokemon.getSpriteKey()); + sprite.setPipelineData("shiny", previousPokemon.shiny); + sprite.setPipelineData("variant", previousPokemon.variant); [ "spriteColors", "fusionSpriteColors" ].map(k => { - if (pokemon.summonData?.speciesForm) { + if (previousPokemon.summonData?.speciesForm) { k += "Base"; } - sprite.pipelineData[k] = pokemon.getSprite().pipelineData[k]; + sprite.pipelineData[k] = previousPokemon.getSprite().pipelineData[k]; }); }); [ pokemonEvoSprite, pokemonEvoTintSprite ].map(sprite => { - sprite.play(transformedPokemon.getSpriteKey(true)); + sprite.play(transformPokemon.getSpriteKey(true)); sprite.setPipelineData("ignoreTimeTint", true); - sprite.setPipelineData("spriteKey", transformedPokemon.getSpriteKey()); - sprite.setPipelineData("shiny", transformedPokemon.shiny); - sprite.setPipelineData("variant", transformedPokemon.variant); + sprite.setPipelineData("spriteKey", transformPokemon.getSpriteKey()); + sprite.setPipelineData("shiny", transformPokemon.shiny); + sprite.setPipelineData("variant", transformPokemon.variant); [ "spriteColors", "fusionSpriteColors" ].map(k => { - if (transformedPokemon.summonData?.speciesForm) { + if (transformPokemon.summonData?.speciesForm) { k += "Base"; } - sprite.pipelineData[k] = transformedPokemon.getSprite().pipelineData[k]; + sprite.pipelineData[k] = transformPokemon.getSprite().pipelineData[k]; }); }); @@ -123,9 +123,11 @@ export function doPokemonTransformationSequence(scene: BattleScene, pokemon: Pla duration: 2000, delay: 150, easing: "Sine.easeIn", - // onComplete: () => { - // transformedPokemon.destroy(); - // } + onComplete: () => { + previousPokemon.destroy(); + transformPokemon.setVisible(false); + transformPokemon.setAlpha(1); + } }); }); } diff --git a/src/data/trainer-config.ts b/src/data/trainer-config.ts index f3e6009e02e..fff80d3e750 100644 --- a/src/data/trainer-config.ts +++ b/src/data/trainer-config.ts @@ -1958,4 +1958,19 @@ export const trainerConfigs: TrainerConfigs = { } p.pokeball = PokeballType.MASTER_BALL; })), + [TrainerType.VICTOR]: new TrainerConfig(++t).setName("Victor").setTitle("The Winstrates") + .setMoneyMultiplier(0.4) // The 5 Winstrate trainers have total money multiplier of 2.6 + .setPartyTemplates(trainerPartyTemplates.ONE_AVG_ONE_STRONG), + [TrainerType.VICTORIA]: new TrainerConfig(++t).setName("Victoria").setTitle("The Winstrates") + .setMoneyMultiplier(0.4) + .setPartyTemplates(trainerPartyTemplates.ONE_AVG_ONE_STRONG), + [TrainerType.VIVI]: new TrainerConfig(++t).setName("Vivi").setTitle("The Winstrates") + .setMoneyMultiplier(0.4) + .setPartyTemplates(trainerPartyTemplates.TWO_AVG_ONE_STRONG), + [TrainerType.VICKY]: new TrainerConfig(++t).setName("Vicky").setTitle("The Winstrates") + .setMoneyMultiplier(0.4) + .setPartyTemplates(trainerPartyTemplates.ONE_STRONG), + [TrainerType.VITO]: new TrainerConfig(++t).setName("Vito").setTitle("The Winstrates") + .setMoneyMultiplier(1) + .setPartyTemplates(new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(3, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(2, PartyMemberStrength.STRONG))) }; diff --git a/src/enums/mystery-encounter-mode.ts b/src/enums/mystery-encounter-mode.ts index 03094040ce0..3acab7b4797 100644 --- a/src/enums/mystery-encounter-mode.ts +++ b/src/enums/mystery-encounter-mode.ts @@ -2,8 +2,7 @@ export enum MysteryEncounterMode { DEFAULT, TRAINER_BATTLE, WILD_BATTLE, + /** Enables wild boss music during encounter */ BOSS_BATTLE, - NO_BATTLE, - /** For spawning new encounter queries instead of continuing to next wave */ - CONTINUOUS_ENCOUNTER + NO_BATTLE } diff --git a/src/enums/mystery-encounter-type.ts b/src/enums/mystery-encounter-type.ts index 0db41e71ac5..f9871a1a3dd 100644 --- a/src/enums/mystery-encounter-type.ts +++ b/src/enums/mystery-encounter-type.ts @@ -22,5 +22,6 @@ export enum MysteryEncounterType { CLOWNING_AROUND, PART_TIMER, DANCING_LESSONS, - WEIRD_DREAM + WEIRD_DREAM, + THE_WINSTRATE_CHALLENGE } diff --git a/src/enums/trainer-type.ts b/src/enums/trainer-type.ts index 0d3a0771604..65c3370b510 100644 --- a/src/enums/trainer-type.ts +++ b/src/enums/trainer-type.ts @@ -75,6 +75,11 @@ export enum TrainerType { MARLEY, MIRA, RILEY, + VICTOR, + VICTORIA, + VIVI, + VICKY, + VITO, BROCK = 200, MISTY, diff --git a/src/field/mystery-encounter-intro.ts b/src/field/mystery-encounter-intro.ts index 0f13f486eb2..1192e1b5369 100644 --- a/src/field/mystery-encounter-intro.ts +++ b/src/field/mystery-encounter-intro.ts @@ -1,6 +1,6 @@ import { GameObjects } from "phaser"; import BattleScene from "../battle-scene"; -import IMysteryEncounter from "../data/mystery-encounters/mystery-encounter"; +import MysteryEncounter from "../data/mystery-encounters/mystery-encounter"; import { Species } from "#enums/species"; import { isNullOrUndefined } from "#app/utils"; import { getSpriteKeysFromSpecies } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; @@ -70,11 +70,11 @@ export class MysteryEncounterSpriteConfig { * Note: intro visuals are not "Trainers" or any other specific game object, though they may contain trainer sprites */ export default class MysteryEncounterIntroVisuals extends Phaser.GameObjects.Container { - public encounter: IMysteryEncounter; + public encounter: MysteryEncounter; public spriteConfigs: MysteryEncounterSpriteConfig[]; public enterFromRight: boolean; - constructor(scene: BattleScene, encounter: IMysteryEncounter) { + constructor(scene: BattleScene, encounter: MysteryEncounter) { super(scene, -72, 76); this.encounter = encounter; this.enterFromRight = encounter.enterIntroVisualsFromRight ?? false; diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index feca608038a..37aa9b1afef 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -10,7 +10,7 @@ import * as Utils from "../utils"; import { Type, TypeDamageMultiplier, getTypeDamageMultiplier, getTypeRgb } from "../data/type"; import { getLevelTotalExp } from "../data/exp"; import { Stat } from "../data/pokemon-stat"; -import { DamageMoneyRewardModifier, EnemyDamageBoosterModifier, EnemyDamageReducerModifier, EnemyEndureChanceModifier, EnemyFusionChanceModifier, HiddenAbilityRateBoosterModifier, PokemonBaseStatModifier, PokemonFriendshipBoosterModifier, PokemonHeldItemModifier, PokemonNatureWeightModifier, ShinyRateBoosterModifier, SurviveDamageModifier, TempBattleStatBoosterModifier, StatBoosterModifier, CritBoosterModifier, TerastallizeModifier, PokemonBaseStatTotalModifier } from "../modifier/modifier"; +import { DamageMoneyRewardModifier, EnemyDamageBoosterModifier, EnemyDamageReducerModifier, EnemyEndureChanceModifier, EnemyFusionChanceModifier, HiddenAbilityRateBoosterModifier, PokemonBaseStatModifier, PokemonFriendshipBoosterModifier, PokemonHeldItemModifier, PokemonNatureWeightModifier, ShinyRateBoosterModifier, SurviveDamageModifier, TempBattleStatBoosterModifier, StatBoosterModifier, CritBoosterModifier, TerastallizeModifier, PokemonBaseStatTotalModifier, PokemonIncrementingStatModifier } from "../modifier/modifier"; import { PokeballType } from "../data/pokeball"; import { Gender } from "../data/gender"; import { initMoveAnim, loadMoveAnimAssets } from "../data/battle-anims"; @@ -804,6 +804,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } this.stats[s] = value; } + this.scene.applyModifier(PokemonIncrementingStatModifier, this.isPlayer(), this, this.stats); } getNature(): Nature { diff --git a/src/interfaces/held-modifier-config.ts b/src/interfaces/held-modifier-config.ts new file mode 100644 index 00000000000..304de72f01b --- /dev/null +++ b/src/interfaces/held-modifier-config.ts @@ -0,0 +1,7 @@ +import { PokemonHeldItemModifierType } from "#app/modifier/modifier-type"; + +export default interface HeldModifierConfig { + modifierType: PokemonHeldItemModifierType; + stackCount?: number; + isTransferable?: boolean; +} diff --git a/src/locales/en/dialogue.ts b/src/locales/en/dialogue.ts index 50dee033782..a8be04c8718 100644 --- a/src/locales/en/dialogue.ts +++ b/src/locales/en/dialogue.ts @@ -627,6 +627,51 @@ export const PGMdialogue: DialogueTranslationEntries = { 1: "You put up quite the display.\nBetter luck next time." } }, + "winstrates_victor": { + "encounter": { + 1: "That's the spirit! I like you!", + }, + "victory": { + 1: "A-ha! You're stronger than I thought!" + } + }, + "winstrates_victoria": { + "encounter": { + 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?!" + } + }, + "winstrates_vivi": { + "encounter": { + 1: `You're stronger than Mom? Wow! + $But I'm strong, too!\nReally! Honestly!`, + }, + "victory": { + 1: "Huh? Did I really lose?\nSnivel... Grandmaaa!" + } + }, + "winstrates_vicky": { + "encounter": { + 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." + } + }, + "winstrates_vito": { + "encounter": { + 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..." + } + }, "brock": { "encounter": { 1: "My expertise on Rock-type Pokémon will take you down! Come on!", diff --git a/src/locales/en/modifier-type.ts b/src/locales/en/modifier-type.ts index 1266f6442e9..cc54a0c5c08 100644 --- a/src/locales/en/modifier-type.ts +++ b/src/locales/en/modifier-type.ts @@ -262,6 +262,7 @@ export const modifierType: ModifierTypeTranslationEntries = { "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_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}}." }, }, SpeciesBoosterItem: { diff --git a/src/locales/en/mystery-encounter.ts b/src/locales/en/mystery-encounter.ts index 1358c8949a0..2779900eeff 100644 --- a/src/locales/en/mystery-encounter.ts +++ b/src/locales/en/mystery-encounter.ts @@ -22,6 +22,7 @@ import { clowningAroundDialogue } from "#app/locales/en/mystery-encounters/clown import { partTimerDialogue } from "#app/locales/en/mystery-encounters/part-timer-dialogue"; import { dancingLessonsDialogue } from "#app/locales/en/mystery-encounters/dancing-lessons-dialogue"; import { weirdDreamDialogue } from "#app/locales/en/mystery-encounters/weird-dream-dialogue"; +import { theWinstrateChallengeDialogue } from "#app/locales/en/mystery-encounters/the-winstrate-challenge-dialogue"; /** * Injection patterns that can be used: @@ -71,5 +72,6 @@ export const mysteryEncounter = { clowningAround: clowningAroundDialogue, partTimer: partTimerDialogue, dancingLessons: dancingLessonsDialogue, - weirdDream: weirdDreamDialogue + weirdDream: weirdDreamDialogue, + theWinstrateChallenge: theWinstrateChallengeDialogue } as const; diff --git a/src/locales/en/mystery-encounters/the-winstrate-challenge-dialogue.ts b/src/locales/en/mystery-encounters/the-winstrate-challenge-dialogue.ts new file mode 100644 index 00000000000..bd5d5560315 --- /dev/null +++ b/src/locales/en/mystery-encounters/the-winstrate-challenge-dialogue.ts @@ -0,0 +1,24 @@ +export const theWinstrateChallengeDialogue = { + intro: "It's a family standing outside their house!", + speaker: "The Winstrates", + 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?", + option: { + 1: { + label: "Accept the Challenge", + tooltip: "(-) Brutal Battle\n(+) Special Item Reward", + selected: "That's the spirit! I like you!", + }, + 2: { + label: "Refuse the Challenge", + tooltip: "(+) Full Heal Party\n(+) Gain a Rarer Candy", + 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! + $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!`, +}; diff --git a/src/locales/en/trainers.ts b/src/locales/en/trainers.ts index 0581a6698de..2adc2da9d5e 100644 --- a/src/locales/en/trainers.ts +++ b/src/locales/en/trainers.ts @@ -19,6 +19,7 @@ export const titles: SimpleTranslationEntries = { "galactic_boss": "Team Galactic Boss", "plasma_boss": "Team Plasma Boss", "flare_boss": "Team Flare Boss", + "the_winstrates": "The Winstrates'" // Maybe if we add the evil teams we can add "Team Rocket" and "Team Aqua" etc. here as well as "Team Rocket Boss" and "Team Aqua Admin" etc. } as const; @@ -275,6 +276,11 @@ export const trainerNames: SimpleTranslationEntries = { "marley": "Marley", "mira": "Mira", "riley": "Riley", + "victor": "Victor", + "victoria": "Victoria", + "vivi": "Vivi", + "vicky": "Vicky", + "vito": "Vito", // Double Names "blue_red_double": "Blue & Red", diff --git a/src/modifier/modifier-type.ts b/src/modifier/modifier-type.ts index f783e2baa99..791db6facc7 100644 --- a/src/modifier/modifier-type.ts +++ b/src/modifier/modifier-type.ts @@ -1506,6 +1506,7 @@ 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_MACHO_BRACE: () => new PokemonHeldItemModifierType("modifierType:ModifierType.MYSTERY_ENCOUNTER_MACHO_BRACE", "macho_brace", (type, args) => new Modifiers.PokemonIncrementingStatModifier(type, (args[0] as Pokemon).id)), }; interface ModifierPool { diff --git a/src/modifier/modifier.ts b/src/modifier/modifier.ts index 3778310c8f5..e0a8ec0d493 100644 --- a/src/modifier/modifier.ts +++ b/src/modifier/modifier.ts @@ -793,6 +793,54 @@ export class PokemonBaseStatFlatModifier extends PokemonHeldItemModifier { } } +export class PokemonIncrementingStatModifier extends PokemonHeldItemModifier { + readonly isTransferrable: boolean = false; + + constructor (type: ModifierType, pokemonId: integer, stackCount?: integer) { + super(type, pokemonId, stackCount); + } + + matchType(modifier: Modifier): boolean { + return modifier instanceof PokemonIncrementingStatModifier; + } + + clone(): PersistentModifier { + return new PokemonIncrementingStatModifier(this.type, this.pokemonId); + } + + getArgs(): any[] { + return super.getArgs(); + } + + shouldApply(args: any[]): boolean { + return super.shouldApply(args) && args.length === 2 && args[1] instanceof Array; + } + + apply(args: any[]): boolean { + // Modifies the passed in stats[] array by +1 per stack for HP, +2 per stack for other stats + // If the Macho Brace is at max stacks (50), adds additional 5% to total HP and 10% to other stats + args[1].forEach((v, i) => { + const isHp = i === 0; + let mult = 1; + if (this.stackCount === this.getMaxHeldItemCount(null)) { + mult = isHp ? 1.05 : 1.1; + } + const newVal = Math.floor((v + this.stackCount * (isHp ? 1 : 2)) * mult); + args[1][i] = Math.min(Math.max(newVal, 1), 999999); + }); + + return true; + } + + getScoreMultiplier(): number { + return 1.2; + } + + getMaxHeldItemCount(pokemon: Pokemon): integer { + return 50; + } +} + /** * Modifier used for held items that apply {@linkcode Stat} boost(s) * using a multiplier. diff --git a/src/phases.ts b/src/phases.ts index 24cf33a98f6..6d9054da327 100644 --- a/src/phases.ts +++ b/src/phases.ts @@ -6,7 +6,7 @@ import { allMoves, applyFilteredMoveAttrs, applyMoveAttrs, AttackMove, BypassRed import { Mode } from "./ui/ui"; import { Command } from "./ui/command-ui-handler"; import { Stat } from "./data/pokemon-stat"; -import { BerryModifier, BypassSpeedChanceModifier, ContactHeldItemTransferChanceModifier, EnemyAttackStatusEffectChanceModifier, EnemyPersistentModifier, EnemyStatusEffectHealChanceModifier, EnemyTurnHealModifier, ExpBalanceModifier, ExpBoosterModifier, ExpShareModifier, ExtraModifierModifier, FlinchChanceModifier, HealingBoosterModifier, HitHealModifier, IvScannerModifier, LapsingPersistentModifier, LapsingPokemonHeldItemModifier, MapModifier, Modifier, MoneyInterestModifier, MoneyMultiplierModifier, MultipleParticipantExpBonusModifier, overrideHeldItems, overrideModifiers, PersistentModifier, PokemonExpBoosterModifier, PokemonHeldItemModifier, PokemonInstantReviveModifier, PokemonMultiHitModifier, PokemonResetNegativeStatStageModifier, SwitchEffectTransferModifier, TurnHealModifier, TurnHeldItemTransferModifier, TurnStatusEffectModifier } from "./modifier/modifier"; +import { BerryModifier, BypassSpeedChanceModifier, ContactHeldItemTransferChanceModifier, EnemyAttackStatusEffectChanceModifier, EnemyPersistentModifier, EnemyStatusEffectHealChanceModifier, EnemyTurnHealModifier, ExpBalanceModifier, ExpBoosterModifier, ExpShareModifier, ExtraModifierModifier, FlinchChanceModifier, HealingBoosterModifier, HitHealModifier, IvScannerModifier, LapsingPersistentModifier, LapsingPokemonHeldItemModifier, MapModifier, Modifier, MoneyInterestModifier, MoneyMultiplierModifier, MultipleParticipantExpBonusModifier, overrideHeldItems, overrideModifiers, PersistentModifier, PokemonExpBoosterModifier, PokemonHeldItemModifier, PokemonIncrementingStatModifier, PokemonInstantReviveModifier, PokemonMultiHitModifier, PokemonResetNegativeStatStageModifier, SwitchEffectTransferModifier, TurnHealModifier, TurnHeldItemTransferModifier, TurnStatusEffectModifier } from "./modifier/modifier"; import PartyUiHandler, { PartyOption, PartyUiMode } from "./ui/party-ui-handler"; import { doPokeballBounceAnim, getPokeballAtlasKey, getPokeballCatchMultiplier, getPokeballTintColor, PokeballType } from "./data/pokeball"; import { CommonAnim, CommonBattleAnim, initEncounterAnims, initMoveAnim, loadEncounterAnimAssets, loadMoveAnimAssets, MoveAnim } from "./data/battle-anims"; @@ -1302,8 +1302,7 @@ export class NextEncounterPhase extends EncounterPhase { this.scene.lastEnemyTrainer.destroy(); } if (lastEncounterVisuals) { - this.scene.field.remove(lastEncounterVisuals); - lastEncounterVisuals.destroy(); + this.scene.field.remove(lastEncounterVisuals, true); this.scene.lastMysteryEncounter.introVisuals = null; } @@ -1583,7 +1582,7 @@ export class SummonPhase extends PartyMemberPokemonPhase { onComplete: () => this.scene.trainer.setVisible(false) }); this.scene.time.delayedCall(750, () => this.summon()); - } else if (this.scene.currentBattle.battleType === BattleType.TRAINER || this.scene?.currentBattle?.mysteryEncounter?.encounterMode === MysteryEncounterMode.TRAINER_BATTLE) { + } else if (this.scene.currentBattle.battleType === BattleType.TRAINER || this.scene.currentBattle.mysteryEncounter?.encounterMode === MysteryEncounterMode.TRAINER_BATTLE) { const trainerName = this.scene.currentBattle.trainer.getName(!(this.fieldIndex % 2) ? TrainerSlot.TRAINER : TrainerSlot.TRAINER_PARTNER); const pokemonName = getPokemonNameWithAffix(this.getPokemon()); const message = i18next.t("battle:trainerSendOut", { trainerName, pokemonName }); @@ -2287,7 +2286,7 @@ export class CommandPhase extends FieldPhase { this.scene.ui.showText(null, 0); this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); }, null, true); - } else if (!isSwitch && this.scene.currentBattle.battleType === BattleType.TRAINER) { + } else if (!isSwitch && (this.scene.currentBattle.battleType === BattleType.TRAINER || this.scene.currentBattle.mysteryEncounter?.encounterMode === MysteryEncounterMode.TRAINER_BATTLE)) { this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); this.scene.ui.setMode(Mode.MESSAGE); this.scene.ui.showText(i18next.t("battle:noEscapeTrainer"), null, () => { @@ -4138,6 +4137,12 @@ export class VictoryPhase extends PokemonPhase { const participated = participantIds.has(pId); if (participated) { partyMember.addFriendship(2); + const machoBraceModifier = partyMember.getHeldItems().find(m => m instanceof PokemonIncrementingStatModifier); + if (!isNullOrUndefined(machoBraceModifier) && machoBraceModifier.stackCount < machoBraceModifier.getMaxStackCount(this.scene)) { + machoBraceModifier.stackCount++; + this.scene.updateModifiers(true, true); + partyMember.updateInfo(); + } } if (!expPartyMembers.includes(partyMember)) { continue; diff --git a/src/phases/mystery-encounter-phases.ts b/src/phases/mystery-encounter-phases.ts index fe6de6973da..160a081fda1 100644 --- a/src/phases/mystery-encounter-phases.ts +++ b/src/phases/mystery-encounter-phases.ts @@ -381,6 +381,10 @@ export class MysteryEncounterBattlePhase extends Phase { /** * Will handle (in order): + * - doContinueEncounter() callback for continuous encounters with back-to-back battles (this should push/shift its own phases as needed) + * + * OR + * * - Any encounter reward logic that is set within MysteryEncounter doEncounterExp * - Any encounter reward logic that is set within MysteryEncounter doEncounterRewards * - Otherwise, can add a no-reward-item shop with only Potions, etc. if addHealPhase is true @@ -396,23 +400,30 @@ export class MysteryEncounterRewardsPhase extends Phase { start() { super.start(); + const encounter = this.scene.currentBattle.mysteryEncounter; - this.scene.executeWithSeedOffset(() => { - if (this.scene.currentBattle.mysteryEncounter.doEncounterExp) { - this.scene.currentBattle.mysteryEncounter.doEncounterExp(this.scene); - } + if (encounter.doContinueEncounter) { + encounter.doContinueEncounter(this.scene).then(() => { + this.end(); + }); + } 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, null, { fillRemaining: false, rerollMultiplier: 0 })); - } - // Do not use ME's seedOffset for rewards, these should always be consistent with waveIndex (once per wave) - }, this.scene.currentBattle.waveIndex * 1000); + 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, null, { fillRemaining: false, rerollMultiplier: 0 })); + } + // 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(); + this.scene.pushPhase(new PostMysteryEncounterPhase(this.scene)); + this.end(); + } } } diff --git a/src/system/game-data.ts b/src/system/game-data.ts index af465278e39..62c8c6b8aef 100644 --- a/src/system/game-data.ts +++ b/src/system/game-data.ts @@ -43,7 +43,7 @@ import { Species } from "#enums/species"; import { applyChallenges, ChallengeType } from "#app/data/challenge.js"; import { Abilities } from "#app/enums/abilities.js"; import { MysteryEncounterData } from "../data/mystery-encounters/mystery-encounter-data"; -import IMysteryEncounter from "../data/mystery-encounters/mystery-encounter"; +import MysteryEncounter from "../data/mystery-encounters/mystery-encounter"; export const defaultStarterSpecies: Species[] = [ Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE, @@ -126,7 +126,7 @@ export interface SessionSaveData { gameVersion: string; timestamp: integer; challenges: ChallengeData[]; - mysteryEncounter: IMysteryEncounter; + mysteryEncounter: MysteryEncounter; mysteryEncounterData: MysteryEncounterData; } @@ -1167,7 +1167,7 @@ export class GameData { } if (k === "mysteryEncounter") { - return new IMysteryEncounter(v); + return new MysteryEncounter(v); } if (k === "mysteryEncounterData") { 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 3acd8d1ef99..80f022a3e3e 100644 --- a/src/test/mystery-encounter/encounters/clowning-around-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/clowning-around-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 { generateModifierTypeOption } 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 { CommandPhase, MovePhase, NewBattlePhase, SelectModifierPhase } from "#app/phases"; import { Moves } from "#enums/moves"; @@ -123,7 +123,6 @@ describe("Clowning Around - Mystery Encounter", () => { }); expect(config.pokemonConfigs[1]).toEqual({ species: getPokemonSpecies(Species.BLACEPHALON), - ability: expect.any(Number), mysteryEncounterData: expect.anything(), isBoss: true, moveSet: [Moves.TRICK, Moves.HYPNOSIS, Moves.SHADOW_BALL, Moves.MIND_BLOWN] @@ -145,8 +144,8 @@ describe("Clowning Around - Mystery Encounter", () => { Abilities.MAGICIAN, Abilities.SHEER_FORCE, Abilities.PRANKSTER - ]).toContain(config.pokemonConfigs[1].ability); - expect(ClowningAroundEncounter.misc.ability).toBe(config.pokemonConfigs[1].ability); + ]).toContain(config.pokemonConfigs[1].mysteryEncounterData.ability); + expect(ClowningAroundEncounter.misc.ability).toBe(config.pokemonConfigs[1].mysteryEncounterData.ability); await vi.waitFor(() => expect(moveInitSpy).toHaveBeenCalled()); await vi.waitFor(() => expect(moveLoadSpy).toHaveBeenCalled()); expect(onInitResult).toBe(true); @@ -258,26 +257,26 @@ describe("Clowning Around - Mystery Encounter", () => { // 2 Sitrus Berries on lead scene.modifiers = []; - let itemType = generateModifierTypeOption(scene, modifierTypes.BERRY, [BerryType.SITRUS]).type as PokemonHeldItemModifierType; + let itemType = generateModifierType(scene, modifierTypes.BERRY, [BerryType.SITRUS]) as PokemonHeldItemModifierType; await addItemToPokemon(scene, scene.getParty()[0], 2, itemType); // 2 Ganlon Berries on lead - itemType = generateModifierTypeOption(scene, modifierTypes.BERRY, [BerryType.GANLON]).type as PokemonHeldItemModifierType; + itemType = generateModifierType(scene, modifierTypes.BERRY, [BerryType.GANLON]) as PokemonHeldItemModifierType; await addItemToPokemon(scene, scene.getParty()[0], 2, itemType); // 5 Golden Punch on lead (ultra) - itemType = generateModifierTypeOption(scene, modifierTypes.GOLDEN_PUNCH).type as PokemonHeldItemModifierType; + itemType = generateModifierType(scene, modifierTypes.GOLDEN_PUNCH) as PokemonHeldItemModifierType; await addItemToPokemon(scene, scene.getParty()[0], 5, itemType); // 5 Lucky Egg on lead (ultra) - itemType = generateModifierTypeOption(scene, modifierTypes.LUCKY_EGG).type as PokemonHeldItemModifierType; + itemType = generateModifierType(scene, modifierTypes.LUCKY_EGG) as PokemonHeldItemModifierType; await addItemToPokemon(scene, scene.getParty()[0], 5, itemType); // 5 Soul Dew on lead (rogue) - itemType = generateModifierTypeOption(scene, modifierTypes.SOUL_DEW).type as PokemonHeldItemModifierType; + itemType = generateModifierType(scene, modifierTypes.SOUL_DEW) as PokemonHeldItemModifierType; await addItemToPokemon(scene, scene.getParty()[0], 5, itemType); // 2 Golden Egg on lead (rogue) - itemType = generateModifierTypeOption(scene, modifierTypes.GOLDEN_EGG).type as PokemonHeldItemModifierType; + itemType = generateModifierType(scene, modifierTypes.GOLDEN_EGG) as PokemonHeldItemModifierType; await addItemToPokemon(scene, scene.getParty()[0], 2, itemType); // 5 Soul Dew on second party pokemon (these should not change) - itemType = generateModifierTypeOption(scene, modifierTypes.SOUL_DEW).type as PokemonHeldItemModifierType; + itemType = generateModifierType(scene, modifierTypes.SOUL_DEW) as PokemonHeldItemModifierType; await addItemToPokemon(scene, scene.getParty()[1], 5, itemType); await runMysteryEncounterToEnd(game, 2); diff --git a/src/test/mystery-encounter/encounters/delibirdy-encounter.test.ts b/src/test/mystery-encounter/encounters/delibirdy-encounter.test.ts index 8934dbb5f5c..43f9c5612db 100644 --- a/src/test/mystery-encounter/encounters/delibirdy-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/delibirdy-encounter.test.ts @@ -13,7 +13,7 @@ import * as MysteryEncounters from "#app/data/mystery-encounters/mystery-encount import { MoneyRequirement } from "#app/data/mystery-encounters/mystery-encounter-requirements"; import { BerryModifier, HealingBoosterModifier, HiddenAbilityRateBoosterModifier, HitHealModifier, LevelIncrementBoosterModifier, PokemonInstantReviveModifier, PokemonNatureWeightModifier, PreserveBerryModifier } from "#app/modifier/modifier"; import { MysteryEncounterPhase } from "#app/phases/mystery-encounter-phases"; -import { generateModifierTypeOption } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { generateModifierType } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { modifierTypes } from "#app/modifier/modifier-type"; import { BerryType } from "#enums/berry-type"; @@ -137,7 +137,7 @@ describe("Delibird-y - Mystery Encounter", () => { // 5 Healing Charms scene.modifiers = []; - const abilityCharm = generateModifierTypeOption(scene, modifierTypes.ABILITY_CHARM).type.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 = generateModifierTypeOption(scene, modifierTypes.BERRY, [BerryType.SITRUS]).type; + 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 = generateModifierTypeOption(scene, modifierTypes.REVIVER_SEED).type; + 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 = generateModifierTypeOption(scene, modifierTypes.CANDY_JAR).type.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 = generateModifierTypeOption(scene, modifierTypes.BERRY, [BerryType.SITRUS]).type; + 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 = generateModifierTypeOption(scene, modifierTypes.HEALING_CHARM).type.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 = generateModifierTypeOption(scene, modifierTypes.REVIVER_SEED).type; + 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 = generateModifierTypeOption(scene, modifierTypes.SOUL_DEW).type; + 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 = generateModifierTypeOption(scene, modifierTypes.REVIVER_SEED).type; + 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 = generateModifierTypeOption(scene, modifierTypes.SOUL_DEW).type; + 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 = generateModifierTypeOption(scene, modifierTypes.SOUL_DEW).type; + 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 = generateModifierTypeOption(scene, modifierTypes.BERRY_POUCH).type.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 = generateModifierTypeOption(scene, modifierTypes.SOUL_DEW).type; + 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 = generateModifierTypeOption(scene, modifierTypes.REVIVER_SEED).type; + 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 = generateModifierTypeOption(scene, modifierTypes.SOUL_DEW).type; + 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/mysterious-challengers-encounter.test.ts b/src/test/mystery-encounter/encounters/mysterious-challengers-encounter.test.ts index 7fe6b1a3f95..31fb03cb7d3 100644 --- a/src/test/mystery-encounter/encounters/mysterious-challengers-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/mysterious-challengers-encounter.test.ts @@ -18,7 +18,7 @@ import { TrainerConfig, TrainerPartyCompoundTemplate, TrainerPartyTemplate } fro import { PartyMemberStrength } from "#enums/party-member-strength"; import { MysteryEncounterMode } from "#enums/mystery-encounter-mode"; import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; -import IMysteryEncounter from "#app/data/mystery-encounters/mystery-encounter"; +import MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter"; const namespace = "mysteryEncounter:mysteriousChallengers"; const defaultParty = [Species.LAPRAS, Species.GENGAR, Species.ABRA]; @@ -96,7 +96,7 @@ describe("Mysterious Challengers - Mystery Encounter", () => { it("should initialize fully", async () => { initSceneWithoutEncounterPhase(scene, defaultParty); - scene.currentBattle.mysteryEncounter = new IMysteryEncounter(MysteriousChallengersEncounter); + scene.currentBattle.mysteryEncounter = new MysteryEncounter(MysteriousChallengersEncounter); const encounter = scene.currentBattle.mysteryEncounter; scene.currentBattle.waveIndex = defaultWave; 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 21d0678c858..5c526ddeb57 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 @@ -123,7 +123,7 @@ describe("The Strong Stuff - Mystery Encounter", () => { mysteryEncounterData: new MysteryEncounterPokemonData(1.5), nature: Nature.BOLD, moveSet: [Moves.INFESTATION, Moves.SALT_CURE, Moves.GASTRO_ACID, Moves.HEAL_ORDER], - modifierTypes: expect.any(Array), + modifierConfigs: expect.any(Array), tags: [BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON], mysteryEncounterBattleEffects: expect.any(Function) } diff --git a/src/test/mystery-encounter/mystery-encounter-utils.test.ts b/src/test/mystery-encounter/mystery-encounter-utils.test.ts index a336af41b6b..a0e055e3bcf 100644 --- a/src/test/mystery-encounter/mystery-encounter-utils.test.ts +++ b/src/test/mystery-encounter/mystery-encounter-utils.test.ts @@ -5,7 +5,7 @@ import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; import { Species } from "#enums/species"; import BattleScene from "#app/battle-scene"; import { StatusEffect } from "#app/data/status-effect"; -import IMysteryEncounter from "#app/data/mystery-encounters/mystery-encounter"; +import MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter"; import { MessagePhase } from "#app/phases"; import { getPokemonSpecies, speciesStarters } from "#app/data/pokemon-species"; import { Type } from "#app/data/type"; @@ -250,7 +250,7 @@ describe("Mystery Encounter Utils", () => { describe("getTextWithEncounterDialogueTokens", () => { it("injects dialogue tokens and color styling", () => { - scene.currentBattle.mysteryEncounter = new IMysteryEncounter(null); + scene.currentBattle.mysteryEncounter = new MysteryEncounter(null); scene.currentBattle.mysteryEncounter.setDialogueToken("test", "value"); const result = getEncounterText(scene, "mysteryEncounter:unit_test_dialogue"); @@ -258,7 +258,7 @@ describe("Mystery Encounter Utils", () => { }); it("can perform nested dialogue token injection", () => { - scene.currentBattle.mysteryEncounter = new IMysteryEncounter(null); + scene.currentBattle.mysteryEncounter = new MysteryEncounter(null); scene.currentBattle.mysteryEncounter.setDialogueToken("test", "value"); scene.currentBattle.mysteryEncounter.setDialogueToken("testvalue", "new"); @@ -269,7 +269,7 @@ describe("Mystery Encounter Utils", () => { describe("queueEncounterMessage", () => { it("queues a message with encounter dialogue tokens", async () => { - scene.currentBattle.mysteryEncounter = new IMysteryEncounter(null); + scene.currentBattle.mysteryEncounter = new MysteryEncounter(null); scene.currentBattle.mysteryEncounter.setDialogueToken("test", "value"); const spy = vi.spyOn(game.scene, "queueMessage"); const phaseSpy = vi.spyOn(game.scene, "unshiftPhase"); @@ -282,7 +282,7 @@ describe("Mystery Encounter Utils", () => { describe("showEncounterText", () => { it("showText with dialogue tokens", async () => { - scene.currentBattle.mysteryEncounter = new IMysteryEncounter(null); + scene.currentBattle.mysteryEncounter = new MysteryEncounter(null); scene.currentBattle.mysteryEncounter.setDialogueToken("test", "value"); const spy = vi.spyOn(game.scene.ui, "showText"); @@ -293,7 +293,7 @@ describe("Mystery Encounter Utils", () => { describe("showEncounterDialogue", () => { it("showText with dialogue tokens", async () => { - scene.currentBattle.mysteryEncounter = new IMysteryEncounter(null); + scene.currentBattle.mysteryEncounter = new MysteryEncounter(null); scene.currentBattle.mysteryEncounter.setDialogueToken("test", "value"); const spy = vi.spyOn(game.scene.ui, "showDialogue"); From 8826183777b6f3d6154646a4fa162dd62be144e5 Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Mon, 19 Aug 2024 10:58:17 -0400 Subject: [PATCH 247/270] small cleanup for winstrates --- src/battle-scene.ts | 4 ---- src/data/trainer-config.ts | 10 +++++----- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/src/battle-scene.ts b/src/battle-scene.ts index d35c73c2a0d..cac73d6791b 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -1067,10 +1067,6 @@ export default class BattleScene extends SceneBase { newBattleType = battleType; } - if (waveIndex === 64) { - newBattleType = BattleType.TRAINER; - } - if (newBattleType === BattleType.TRAINER) { const trainerType = this.arena.randomTrainerType(newWaveIndex); let doubleTrainer = false; diff --git a/src/data/trainer-config.ts b/src/data/trainer-config.ts index fff80d3e750..54efc6bd900 100644 --- a/src/data/trainer-config.ts +++ b/src/data/trainer-config.ts @@ -1959,18 +1959,18 @@ export const trainerConfigs: TrainerConfigs = { p.pokeball = PokeballType.MASTER_BALL; })), [TrainerType.VICTOR]: new TrainerConfig(++t).setName("Victor").setTitle("The Winstrates") - .setMoneyMultiplier(0.4) // The 5 Winstrate trainers have total money multiplier of 2.6 + .setMoneyMultiplier(1) // The Winstrate trainers have total money multiplier of 6 .setPartyTemplates(trainerPartyTemplates.ONE_AVG_ONE_STRONG), [TrainerType.VICTORIA]: new TrainerConfig(++t).setName("Victoria").setTitle("The Winstrates") - .setMoneyMultiplier(0.4) + .setMoneyMultiplier(1) .setPartyTemplates(trainerPartyTemplates.ONE_AVG_ONE_STRONG), [TrainerType.VIVI]: new TrainerConfig(++t).setName("Vivi").setTitle("The Winstrates") - .setMoneyMultiplier(0.4) + .setMoneyMultiplier(1) .setPartyTemplates(trainerPartyTemplates.TWO_AVG_ONE_STRONG), [TrainerType.VICKY]: new TrainerConfig(++t).setName("Vicky").setTitle("The Winstrates") - .setMoneyMultiplier(0.4) + .setMoneyMultiplier(1) .setPartyTemplates(trainerPartyTemplates.ONE_STRONG), [TrainerType.VITO]: new TrainerConfig(++t).setName("Vito").setTitle("The Winstrates") - .setMoneyMultiplier(1) + .setMoneyMultiplier(2) .setPartyTemplates(new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(3, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(2, PartyMemberStrength.STRONG))) }; From 64811239d7cce9e3566feb7534b27d124d9e40d8 Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Mon, 19 Aug 2024 12:28:22 -0400 Subject: [PATCH 248/270] add unit tests for Winstrate Challenge --- .../encounters/a-trainers-test-encounter.ts | 2 +- .../encounters/delibirdy-encounter.ts | 2 +- .../encounters/part-timer-encounter.ts | 4 +- .../shady-vitamin-dealer-encounter.ts | 2 +- .../the-winstrate-challenge-encounter.ts | 4 +- .../utils/encounter-phase-utils.ts | 5 +- .../the-winstrate-challenge-encounter.test.ts | 385 ++++++++++++++++++ src/test/utils/gameWrapper.ts | 1 + 8 files changed, 397 insertions(+), 8 deletions(-) create mode 100644 src/test/mystery-encounter/encounters/the-winstrate-challenge-encounter.test.ts 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 132c7e34e08..d42d4051aa6 100644 --- a/src/data/mystery-encounters/encounters/a-trainers-test-encounter.ts +++ b/src/data/mystery-encounters/encounters/a-trainers-test-encounter.ts @@ -178,7 +178,7 @@ export const ATrainersTestEncounter: MysteryEncounter = ) .withOutroDialogue([ { - text: `${namespace}:outro`, + text: `${namespace}.outro`, }, ]) .build(); diff --git a/src/data/mystery-encounters/encounters/delibirdy-encounter.ts b/src/data/mystery-encounters/encounters/delibirdy-encounter.ts index 18b6883b529..2c7f8b9fe7e 100644 --- a/src/data/mystery-encounters/encounters/delibirdy-encounter.ts +++ b/src/data/mystery-encounters/encounters/delibirdy-encounter.ts @@ -169,7 +169,7 @@ export const DelibirdyEncounter: MysteryEncounter = // If pokemon meets primary pokemon reqs, it can be selected const meetsReqs = encounter.options[1].pokemonMeetsPrimaryRequirements(scene, pokemon); if (!meetsReqs) { - return getEncounterText(scene, `${namespace}:invalid_selection`); + return getEncounterText(scene, `${namespace}.invalid_selection`); } return null; diff --git a/src/data/mystery-encounters/encounters/part-timer-encounter.ts b/src/data/mystery-encounters/encounters/part-timer-encounter.ts index 94318ac6926..c66a8efe5f7 100644 --- a/src/data/mystery-encounters/encounters/part-timer-encounter.ts +++ b/src/data/mystery-encounters/encounters/part-timer-encounter.ts @@ -115,7 +115,7 @@ export const PartTimerEncounter: MysteryEncounter = // Only Pokemon non-KOd pokemon can be selected const selectableFilter = (pokemon: Pokemon) => { if (!pokemon.isAllowedInBattle()) { - return getEncounterText(scene, `${namespace}:invalid_selection`); + return getEncounterText(scene, `${namespace}.invalid_selection`); } return null; @@ -194,7 +194,7 @@ export const PartTimerEncounter: MysteryEncounter = // Only Pokemon non-KOd pokemon can be selected const selectableFilter = (pokemon: Pokemon) => { if (!pokemon.isAllowedInBattle()) { - return getEncounterText(scene, `${namespace}:invalid_selection`); + return getEncounterText(scene, `${namespace}.invalid_selection`); } return null; 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 6ce4474206d..836c0cb1f98 100644 --- a/src/data/mystery-encounters/encounters/shady-vitamin-dealer-encounter.ts +++ b/src/data/mystery-encounters/encounters/shady-vitamin-dealer-encounter.ts @@ -95,7 +95,7 @@ export const ShadyVitaminDealerEncounter: MysteryEncounter = // If pokemon meets primary pokemon reqs, it can be selected const meetsReqs = encounter.pokemonMeetsPrimaryRequirements(scene, pokemon); if (!meetsReqs) { - return getEncounterText(scene, `${namespace}:invalid_selection`); + return getEncounterText(scene, `${namespace}.invalid_selection`); } return null; 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 434cabb4a42..e3da86ca299 100644 --- a/src/data/mystery-encounters/encounters/the-winstrate-challenge-encounter.ts +++ b/src/data/mystery-encounters/encounters/the-winstrate-challenge-encounter.ts @@ -118,7 +118,7 @@ export const TheWinstrateChallengeEncounter: MysteryEncounter = buttonTooltip: `${namespace}.option.2.tooltip`, selected: [ { - speaker: `${namespace}:speaker`, + speaker: `${namespace}.speaker`, text: `${namespace}.option.2.selected`, }, ], @@ -137,7 +137,7 @@ async function spawnNextTrainerOrEndEncounter(scene: BattleScene) { const nextConfig = encounter.enemyPartyConfigs.pop(); if (!nextConfig) { await transitionMysteryEncounterIntroVisuals(scene, false, false); - await showEncounterDialogue(scene, `${namespace}:victory`, `${namespace}:speaker`); + await showEncounterDialogue(scene, `${namespace}.victory`, `${namespace}.speaker`); setEncounterRewards(scene, { guaranteedModifierTypeFuncs: [modifierTypes.MYSTERY_ENCOUNTER_MACHO_BRACE], fillRemaining: false }); encounter.doContinueEncounter = null; leaveEncounterWithoutBattle(scene); diff --git a/src/data/mystery-encounters/utils/encounter-phase-utils.ts b/src/data/mystery-encounters/utils/encounter-phase-utils.ts index 4d3d89b1abc..5a98d7737c0 100644 --- a/src/data/mystery-encounters/utils/encounter-phase-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-phase-utils.ts @@ -671,7 +671,10 @@ export function handleMysteryEncounterVictory(scene: BattleScene, addHealPhase: scene.pushPhase(new TrainerVictoryPhase(scene)); } if (scene.gameMode.isEndless || !scene.gameMode.isWaveFinal(scene.currentBattle.waveIndex)) { - scene.pushPhase(new EggLapsePhase(scene)); + if (!encounter.doContinueEncounter) { + // Only lapse eggs once for multi-battle encounters + scene.pushPhase(new EggLapsePhase(scene)); + } scene.pushPhase(new MysteryEncounterRewardsPhase(scene, addHealPhase)); } } 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 new file mode 100644 index 00000000000..667c2d2ec3d --- /dev/null +++ b/src/test/mystery-encounter/encounters/the-winstrate-challenge-encounter.test.ts @@ -0,0 +1,385 @@ +import * as MysteryEncounters from "#app/data/mystery-encounters/mystery-encounters"; +import { HUMAN_TRANSITABLE_BIOMES } 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 } from "#test/mystery-encounter/encounterTestUtils"; +import { CommandPhase, PartyHealPhase, SelectModifierPhase, VictoryPhase } from "#app/phases"; +import BattleScene from "#app/battle-scene"; +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 { MysteryEncounterMode } from "#enums/mystery-encounter-mode"; +import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; +import MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter"; +import { TrainerType } from "#enums/trainer-type"; +import { Nature } from "#enums/nature"; +import { Moves } from "#enums/moves"; +import { getPokemonSpecies } from "#app/data/pokemon-species"; +import { TheWinstrateChallengeEncounter } from "#app/data/mystery-encounters/encounters/the-winstrate-challenge-encounter"; +import { Status, StatusEffect } from "#app/data/status-effect"; +import { MysteryEncounterRewardsPhase } from "#app/phases/mystery-encounter-phases"; + +const namespace = "mysteryEncounter:theWinstrateChallenge"; +const defaultParty = [Species.LAPRAS, Species.GENGAR, Species.ABRA]; +const defaultBiome = Biome.CAVE; +const defaultWave = 45; + +describe("The Winstrate Challenge - 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(true); + + const biomeMap = new Map([ + [Biome.VOLCANO, [MysteryEncounterType.FIGHT_OR_FLIGHT]], + ]); + HUMAN_TRANSITABLE_BIOMES.forEach(biome => { + biomeMap.set(biome, [MysteryEncounterType.THE_WINSTRATE_CHALLENGE]); + }); + vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue(biomeMap); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + vi.clearAllMocks(); + vi.resetAllMocks(); + }); + + it("should have the correct properties", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.THE_WINSTRATE_CHALLENGE, defaultParty); + + expect(TheWinstrateChallengeEncounter.encounterType).toBe(MysteryEncounterType.THE_WINSTRATE_CHALLENGE); + expect(TheWinstrateChallengeEncounter.encounterTier).toBe(MysteryEncounterTier.ROGUE); + expect(TheWinstrateChallengeEncounter.dialogue).toBeDefined(); + expect(TheWinstrateChallengeEncounter.dialogue.intro).toStrictEqual([ + { text: `${namespace}.intro` }, + { + speaker: `${namespace}.speaker`, + text: `${namespace}.intro_dialogue`, + } + ]); + expect(TheWinstrateChallengeEncounter.dialogue.encounterOptionsDialogue.title).toBe(`${namespace}.title`); + expect(TheWinstrateChallengeEncounter.dialogue.encounterOptionsDialogue.description).toBe(`${namespace}.description`); + expect(TheWinstrateChallengeEncounter.dialogue.encounterOptionsDialogue.query).toBe(`${namespace}.query`); + expect(TheWinstrateChallengeEncounter.options.length).toBe(2); + }); + + it("should not spawn outside of HUMAN_TRANSITABLE_BIOMES", async () => { + game.override.mysteryEncounterTier(MysteryEncounterTier.GREAT); + game.override.startingBiome(Biome.VOLCANO); + await game.runToMysteryEncounter(); + + expect(scene.currentBattle?.mysteryEncounter?.encounterType).not.toBe(MysteryEncounterType.THE_WINSTRATE_CHALLENGE); + }); + + it("should not run below wave 10", async () => { + game.override.startingWave(9); + + await game.runToMysteryEncounter(); + + expect(scene.currentBattle?.mysteryEncounter?.encounterType).not.toBe(MysteryEncounterType.THE_WINSTRATE_CHALLENGE); + }); + + 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 = new MysteryEncounter(TheWinstrateChallengeEncounter); + const encounter = scene.currentBattle.mysteryEncounter; + scene.currentBattle.waveIndex = defaultWave; + + const { onInit } = encounter; + + expect(encounter.onInit).toBeDefined(); + + encounter.populateDialogueTokensFromRequirements(scene); + const onInitResult = onInit(scene); + + expect(encounter.enemyPartyConfigs).toBeDefined(); + expect(encounter.enemyPartyConfigs.length).toBe(5); + expect(encounter.enemyPartyConfigs).toEqual([ + { + trainerType: TrainerType.VITO, + pokemonConfigs: [ + { + species: getPokemonSpecies(Species.HISUI_ELECTRODE), + isBoss: false, + abilityIndex: 0, // Soundproof + nature: Nature.MODEST, + moveSet: [Moves.THUNDERBOLT, Moves.GIGA_DRAIN, Moves.FOUL_PLAY, Moves.THUNDER_WAVE], + modifierConfigs: expect.any(Array) + }, + { + species: getPokemonSpecies(Species.SWALOT), + isBoss: false, + abilityIndex: 2, // Gluttony + nature: Nature.QUIET, + moveSet: [Moves.SLUDGE_BOMB, Moves.GIGA_DRAIN, Moves.ICE_BEAM, Moves.EARTHQUAKE], + modifierConfigs: expect.any(Array) + }, + { + species: getPokemonSpecies(Species.DODRIO), + isBoss: false, + abilityIndex: 2, // Tangled Feet + nature: Nature.JOLLY, + moveSet: [Moves.DRILL_PECK, Moves.QUICK_ATTACK, Moves.THRASH, Moves.KNOCK_OFF], + modifierConfigs: expect.any(Array) + }, + { + species: getPokemonSpecies(Species.ALAKAZAM), + isBoss: false, + formIndex: 1, + nature: Nature.BOLD, + moveSet: [Moves.PSYCHIC, Moves.SHADOW_BALL, Moves.FOCUS_BLAST, Moves.THUNDERBOLT], + modifierConfigs: expect.any(Array) + }, + { + species: getPokemonSpecies(Species.DARMANITAN), + isBoss: false, + abilityIndex: 0, // Sheer Force + nature: Nature.IMPISH, + moveSet: [Moves.EARTHQUAKE, Moves.U_TURN, Moves.FLARE_BLITZ, Moves.ROCK_SLIDE], + modifierConfigs: expect.any(Array) + } + ] + }, + { + trainerType: TrainerType.VICKY, + pokemonConfigs: [ + { + species: getPokemonSpecies(Species.MEDICHAM), + isBoss: false, + formIndex: 1, + nature: Nature.IMPISH, + moveSet: [Moves.AXE_KICK, Moves.ICE_PUNCH, Moves.ZEN_HEADBUTT, Moves.BULLET_PUNCH], + modifierConfigs: expect.any(Array) + } + ] + }, + { + trainerType: TrainerType.VIVI, + pokemonConfigs: [ + { + species: getPokemonSpecies(Species.SEAKING), + isBoss: false, + abilityIndex: 3, // Lightning Rod + nature: Nature.ADAMANT, + moveSet: [Moves.WATERFALL, Moves.MEGAHORN, Moves.KNOCK_OFF, Moves.REST], + modifierConfigs: expect.any(Array) + }, + { + species: getPokemonSpecies(Species.BRELOOM), + isBoss: false, + abilityIndex: 1, // Poison Heal + nature: Nature.JOLLY, + moveSet: [Moves.SPORE, Moves.SWORDS_DANCE, Moves.SEED_BOMB, Moves.DRAIN_PUNCH], + modifierConfigs: expect.any(Array) + }, + { + species: getPokemonSpecies(Species.CAMERUPT), + isBoss: false, + formIndex: 1, + nature: Nature.CALM, + moveSet: [Moves.EARTH_POWER, Moves.FIRE_BLAST, Moves.YAWN, Moves.PROTECT], + modifierConfigs: expect.any(Array) + } + ] + }, + { + trainerType: TrainerType.VICTORIA, + pokemonConfigs: [ + { + species: getPokemonSpecies(Species.ROSERADE), + isBoss: false, + abilityIndex: 0, // Natural Cure + nature: Nature.CALM, + moveSet: [Moves.SYNTHESIS, Moves.SLUDGE_BOMB, Moves.GIGA_DRAIN, Moves.SLEEP_POWDER], + modifierConfigs: expect.any(Array) + }, + { + species: getPokemonSpecies(Species.GARDEVOIR), + isBoss: false, + formIndex: 1, + nature: Nature.TIMID, + moveSet: [Moves.PSYSHOCK, Moves.MOONBLAST, Moves.SHADOW_BALL, Moves.WILL_O_WISP], + modifierConfigs: expect.any(Array) + } + ] + }, + { + trainerType: TrainerType.VICTOR, + pokemonConfigs: [ + { + species: getPokemonSpecies(Species.SWELLOW), + isBoss: false, + abilityIndex: 0, // Guts + nature: Nature.ADAMANT, + moveSet: [Moves.FACADE, Moves.BRAVE_BIRD, Moves.PROTECT, Moves.QUICK_ATTACK], + modifierConfigs: expect.any(Array) + }, + { + species: getPokemonSpecies(Species.OBSTAGOON), + isBoss: false, + abilityIndex: 1, // Guts + nature: Nature.ADAMANT, + moveSet: [Moves.FACADE, Moves.OBSTRUCT, Moves.NIGHT_SLASH, Moves.FIRE_PUNCH], + modifierConfigs: expect.any(Array) + } + ] + } + ]); + expect(encounter.spriteConfigs).toBeDefined(); + expect(encounter.spriteConfigs.length).toBe(5); + expect(onInitResult).toBe(true); + }); + + describe("Option 1 - Normal Battle", () => { + it("should have the correct properties", () => { + const option = TheWinstrateChallengeEncounter.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: "trainerNames:victor", + text: `${namespace}.option.1.selected`, + }, + ], + }); + }); + + it("should battle all 5 trainers for a Macho Brace reward", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.THE_WINSTRATE_CHALLENGE, defaultParty); + await runMysteryEncounterToEnd(game, 1, null, true); + + expect(scene.getCurrentPhase().constructor.name).toBe(CommandPhase.name); + expect(scene.currentBattle.trainer).toBeDefined(); + expect(scene.currentBattle.trainer.config.trainerType).toBe(TrainerType.VICTOR); + expect(scene.currentBattle.mysteryEncounter.enemyPartyConfigs.length).toBe(4); + expect(scene.currentBattle.mysteryEncounter.encounterMode).toBe(MysteryEncounterMode.TRAINER_BATTLE); + + await skipBattleToNextBattle(game); + expect(scene.currentBattle.trainer).toBeDefined(); + expect(scene.currentBattle.trainer.config.trainerType).toBe(TrainerType.VICTORIA); + expect(scene.currentBattle.mysteryEncounter.enemyPartyConfigs.length).toBe(3); + expect(scene.currentBattle.mysteryEncounter.encounterMode).toBe(MysteryEncounterMode.TRAINER_BATTLE); + + await skipBattleToNextBattle(game); + expect(scene.currentBattle.trainer).toBeDefined(); + expect(scene.currentBattle.trainer.config.trainerType).toBe(TrainerType.VIVI); + expect(scene.currentBattle.mysteryEncounter.enemyPartyConfigs.length).toBe(2); + expect(scene.currentBattle.mysteryEncounter.encounterMode).toBe(MysteryEncounterMode.TRAINER_BATTLE); + + await skipBattleToNextBattle(game); + expect(scene.currentBattle.trainer).toBeDefined(); + expect(scene.currentBattle.trainer.config.trainerType).toBe(TrainerType.VICKY); + expect(scene.currentBattle.mysteryEncounter.enemyPartyConfigs.length).toBe(1); + expect(scene.currentBattle.mysteryEncounter.encounterMode).toBe(MysteryEncounterMode.TRAINER_BATTLE); + + await skipBattleToNextBattle(game); + expect(scene.currentBattle.trainer).toBeDefined(); + expect(scene.currentBattle.trainer.config.trainerType).toBe(TrainerType.VITO); + expect(scene.currentBattle.mysteryEncounter.enemyPartyConfigs.length).toBe(0); + expect(scene.currentBattle.mysteryEncounter.encounterMode).toBe(MysteryEncounterMode.TRAINER_BATTLE); + + // Should have Macho Brace in the rewards + await skipBattleToNextBattle(game, true); + await game.phaseInterceptor.to(SelectModifierPhase, false); + 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(1); + expect(modifierSelectHandler.options[0].modifierTypeOption.type.id).toBe("MYSTERY_ENCOUNTER_MACHO_BRACE"); + }, 15000); + }); + + describe("Option 2 - Refuse the Challenge", () => { + it("should have the correct properties", () => { + const option = TheWinstrateChallengeEncounter.options[1]; + expect(option.optionMode).toBe(MysteryEncounterOptionMode.DEFAULT); + expect(option.dialogue).toBeDefined(); + expect(option.dialogue).toStrictEqual({ + buttonLabel: `${namespace}.option.2.label`, + buttonTooltip: `${namespace}.option.2.tooltip`, + selected: [ + { + speaker: `${namespace}.speaker`, + text: `${namespace}.option.2.selected`, + }, + ], + }); + }); + + it("Should fully heal the party", async () => { + const phaseSpy = vi.spyOn(scene, "unshiftPhase"); + + await game.runToMysteryEncounter(MysteryEncounterType.THE_WINSTRATE_CHALLENGE, defaultParty); + await runMysteryEncounterToEnd(game, 2); + + const partyHealPhases = phaseSpy.mock.calls.filter(p => p[0] instanceof PartyHealPhase).map(p => p[0]); + expect(partyHealPhases.length).toBe(1); + }); + + it("should have a Rarer Candy in the rewards", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.THE_WINSTRATE_CHALLENGE, 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(1); + expect(modifierSelectHandler.options[0].modifierTypeOption.type.id).toBe("RARER_CANDY"); + }); + }); +}); + +/** + * For any MysteryEncounter that has a battle, can call this to skip battle and proceed to MysteryEncounterRewardsPhase + * @param game + * @param isFinalBattle + */ +async function skipBattleToNextBattle(game: GameManager, isFinalBattle: boolean = false) { + game.scene.clearPhaseQueue(); + game.scene.clearPhaseQueueSplice(); + const commandUiHandler = game.scene.ui.handlers[Mode.COMMAND]; + commandUiHandler.clear(); + game.scene.getEnemyParty().forEach(p => { + p.hp = 0; + p.status = new Status(StatusEffect.FAINT); + game.scene.field.remove(p); + }); + game.phaseInterceptor["onHold"] = []; + game.scene.pushPhase(new VictoryPhase(game.scene, 0)); + game.phaseInterceptor.superEndPhase(); + if (isFinalBattle) { + await game.phaseInterceptor.to(MysteryEncounterRewardsPhase); + } else { + await game.phaseInterceptor.to(CommandPhase); + } +} diff --git a/src/test/utils/gameWrapper.ts b/src/test/utils/gameWrapper.ts index b1b00c8e15d..2eb924a6f19 100644 --- a/src/test/utils/gameWrapper.ts +++ b/src/test/utils/gameWrapper.ts @@ -127,6 +127,7 @@ export default class GameWrapper { manager: { game: this.game, }, + destroy: () => null, setVolume: () => null, stopByKey: () => null, on: (evt, callback) => callback(), From c831baa37521e28579df7efe0445eb26dbff2179 Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Mon, 19 Aug 2024 12:56:50 -0400 Subject: [PATCH 249/270] fix pokemon not returning after winstrate battle --- .../encounters/the-winstrate-challenge-encounter.ts | 3 ++- src/data/mystery-encounters/utils/encounter-phase-utils.ts | 5 +++-- src/data/trainer-config.ts | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) 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 e3da86ca299..c0886ed9f6b 100644 --- a/src/data/mystery-encounters/encounters/the-winstrate-challenge-encounter.ts +++ b/src/data/mystery-encounters/encounters/the-winstrate-challenge-encounter.ts @@ -17,6 +17,7 @@ import { PartyHealPhase, ReturnPhase, ShowTrainerPhase } from "#app/phases"; import { SpeciesFormChangeManualTrigger } from "#app/data/pokemon-forms"; import { applyPostBattleInitAbAttrs, PostBattleInitAbAttr } from "#app/data/ability"; import { showEncounterDialogue } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; +import { MysteryEncounterMode } from "#enums/mystery-encounter-mode"; /** the i18n namespace for the encounter */ const namespace = "mysteryEncounter:theWinstrateChallenge"; @@ -140,7 +141,7 @@ async function spawnNextTrainerOrEndEncounter(scene: BattleScene) { await showEncounterDialogue(scene, `${namespace}.victory`, `${namespace}.speaker`); setEncounterRewards(scene, { guaranteedModifierTypeFuncs: [modifierTypes.MYSTERY_ENCOUNTER_MACHO_BRACE], fillRemaining: false }); encounter.doContinueEncounter = null; - leaveEncounterWithoutBattle(scene); + leaveEncounterWithoutBattle(scene, false, MysteryEncounterMode.TRAINER_BATTLE); } else { await initBattleWithEnemyConfig(scene, nextConfig); } diff --git a/src/data/mystery-encounters/utils/encounter-phase-utils.ts b/src/data/mystery-encounters/utils/encounter-phase-utils.ts index 5a98d7737c0..c58e0fbad1f 100644 --- a/src/data/mystery-encounters/utils/encounter-phase-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-phase-utils.ts @@ -634,9 +634,10 @@ export function initSubsequentOptionSelect(scene: BattleScene, optionSelectSetti * Will skip any shops and rewards, and queue the next encounter phase as normal * @param scene * @param addHealPhase - when true, will add a shop phase to end of encounter with 0 rewards but healing items are available + * @param encounterMode - Can set custom encounter mode if necessary (may be required for forcing Pokemon to return before next phase) */ -export function leaveEncounterWithoutBattle(scene: BattleScene, addHealPhase: boolean = false) { - scene.currentBattle.mysteryEncounter.encounterMode = MysteryEncounterMode.NO_BATTLE; +export function leaveEncounterWithoutBattle(scene: BattleScene, addHealPhase: boolean = false, encounterMode: MysteryEncounterMode = MysteryEncounterMode.NO_BATTLE) { + scene.currentBattle.mysteryEncounter.encounterMode = encounterMode; scene.clearPhaseQueue(); scene.clearPhaseQueueSplice(); handleMysteryEncounterVictory(scene, addHealPhase); diff --git a/src/data/trainer-config.ts b/src/data/trainer-config.ts index 54efc6bd900..eeffd02bc15 100644 --- a/src/data/trainer-config.ts +++ b/src/data/trainer-config.ts @@ -1969,7 +1969,7 @@ export const trainerConfigs: TrainerConfigs = { .setPartyTemplates(trainerPartyTemplates.TWO_AVG_ONE_STRONG), [TrainerType.VICKY]: new TrainerConfig(++t).setName("Vicky").setTitle("The Winstrates") .setMoneyMultiplier(1) - .setPartyTemplates(trainerPartyTemplates.ONE_STRONG), + .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))) From 0b698a04a21e1ca590c252b55fe02a816bab427f Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Tue, 20 Aug 2024 18:01:47 -0400 Subject: [PATCH 250/270] commit latest beta merge updates --- .../encounters/clowning-around-encounter.ts | 3 +- .../encounters/lost-at-sea-encounter.ts | 6 +- .../mystery-encounter-option.ts | 41 +++------ .../mystery-encounter-pokemon-data.ts | 10 +-- .../mystery-encounter-requirements.ts | 60 ++++++------- .../mystery-encounters/mystery-encounter.ts | 85 ++++++------------- src/ui/mystery-encounter-ui-handler.ts | 2 +- src/utils.ts | 4 + 8 files changed, 85 insertions(+), 126 deletions(-) diff --git a/src/data/mystery-encounters/encounters/clowning-around-encounter.ts b/src/data/mystery-encounters/encounters/clowning-around-encounter.ts index d8dcfa503c7..85fbc2d2f18 100644 --- a/src/data/mystery-encounters/encounters/clowning-around-encounter.ts +++ b/src/data/mystery-encounters/encounters/clowning-around-encounter.ts @@ -111,6 +111,7 @@ export const ClowningAroundEncounter: MysteryEncounter = new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER)); clownConfig.setPartyTemplates(clownPartyTemplate); clownConfig.setDoubleOnly(); + // @ts-ignore clownConfig.partyTemplateFunc = null; // Overrides party template func if it exists // Generate random ability for Blacephalon from pool @@ -415,7 +416,7 @@ function onYesAbilitySwap(scene: BattleScene, resolve) { const onPokemonSelected = (pokemon: PlayerPokemon) => { // Do ability swap if (!pokemon.mysteryEncounterData) { - pokemon.mysteryEncounterData = new MysteryEncounterPokemonData(null, Abilities.AERILATE); + pokemon.mysteryEncounterData = new MysteryEncounterPokemonData(undefined, Abilities.AERILATE); } pokemon.mysteryEncounterData.ability = scene.currentBattle.mysteryEncounter.misc.ability; scene.currentBattle.mysteryEncounter.setDialogueToken("chosenPokemon", pokemon.getNameToRender()); 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 a0be4314e28..db8168e7bd7 100644 --- a/src/data/mystery-encounters/encounters/lost-at-sea-encounter.ts +++ b/src/data/mystery-encounters/encounters/lost-at-sea-encounter.ts @@ -54,8 +54,8 @@ export const LostAtSeaEncounter: MysteryEncounter = MysteryEncounterBuilder.with .withOption( // Option 1: Use a (non fainted) pokemon that can learn Surf to guide you back/ MysteryEncounterOptionBuilder - .withPokemonCanLearnMoveRequirement(OPTION_1_REQUIRED_MOVE) .newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT) + .withPokemonCanLearnMoveRequirement(OPTION_1_REQUIRED_MOVE) .withDialogue({ buttonLabel: `${namespace}.option.1.label`, disabledButtonLabel: `${namespace}.option.1.label_disabled`, @@ -73,8 +73,8 @@ export const LostAtSeaEncounter: MysteryEncounter = MysteryEncounterBuilder.with .withOption( //Option 2: Use a (non fainted) pokemon that can learn fly to guide you back. MysteryEncounterOptionBuilder - .withPokemonCanLearnMoveRequirement(OPTION_2_REQUIRED_MOVE) .newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT) + .withPokemonCanLearnMoveRequirement(OPTION_2_REQUIRED_MOVE) .withDialogue({ buttonLabel: `${namespace}.option.2.label`, disabledButtonLabel: `${namespace}.option.2.label_disabled`, @@ -131,7 +131,7 @@ async function handlePokemonGuidingYouPhase(scene: BattleScene) { const laprasSpecies = getPokemonSpecies(Species.LAPRAS); const { mysteryEncounter } = scene.currentBattle; - if (mysteryEncounter.selectedOption) { + if (mysteryEncounter.selectedOption?.primaryPokemon?.id) { setEncounterExp(scene, mysteryEncounter.selectedOption.primaryPokemon.id, laprasSpecies.baseExp, true); } else { console.warn("Lost at sea: No guide pokemon found but pokemon guides player. huh!?"); diff --git a/src/data/mystery-encounters/mystery-encounter-option.ts b/src/data/mystery-encounters/mystery-encounter-option.ts index f0932472571..d4cf56ae17c 100644 --- a/src/data/mystery-encounters/mystery-encounter-option.ts +++ b/src/data/mystery-encounters/mystery-encounter-option.ts @@ -8,6 +8,7 @@ import { EncounterPokemonRequirement, EncounterSceneRequirement, MoneyRequiremen import { CanLearnMoveRequirement, CanLearnMoveRequirementOptions } from "./requirements/can-learn-move-requirement"; import { isNullOrUndefined } from "#app/utils"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; +import MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter"; export type OptionPhaseCallback = (scene: BattleScene) => Promise; @@ -39,7 +40,7 @@ export default class MysteryEncounterOption { /** Executes after the encounter is over. Usually this will be for calculating dialogueTokens or performing data updates */ onPostOptionPhase?: OptionPhaseCallback; - constructor(option: MysteryEncounterOption) { + constructor(option: MysteryEncounterOption | null) { Object.assign(this, option); this.hasDexProgress = !isNullOrUndefined(this.hasDexProgress) ? this.hasDexProgress : false; this.requirements = this.requirements ? this.requirements : []; @@ -137,41 +138,27 @@ export default class MysteryEncounterOption { } } -const baseOption = { - optionMode: MysteryEncounterOptionMode.DEFAULT, - hasDexProgress: false, - requirements: [], - primaryPokemonRequirements: [], - secondaryPokemonRequirements: [], - excludePrimaryFromSecondaryRequirements: true, -}; - -/* Picks non-optional fields from an "object" type alias and returns a union of literal types (keys) */ -type PickNonOptionalFieldsKeys = Exclude<{ [K in Keys]: T extends Record ? K : never; }[Keys], undefined>; -// type NonFunctionFieldsKeys = { [K in Keys]: T[K] extends Function ? never : K; }[Keys]; -// type FunctionPropertyKeys = { [K in Keys]: T[K] extends Function ? K : never; }[Keys]; -/* Extracts keys from T */ -type Keys = keyof T; -/* Filters out all optional fields from an "object" type alias, and all function fields */ -type PickNonOptionalFields = Pick>; -/* Omits keys that exist in the base object and optional keys on MysteryEncounter, as well as functions on MysteryEncounter */ -type OmitBaseAndOptionalKeys = Omit, Keys>; - export class MysteryEncounterOptionBuilder implements Partial { - optionMode: MysteryEncounterOptionMode; + optionMode: MysteryEncounterOptionMode = MysteryEncounterOptionMode.DEFAULT; requirements: EncounterSceneRequirement[] = []; primaryPokemonRequirements: EncounterPokemonRequirement[] = []; secondaryPokemonRequirements: EncounterPokemonRequirement[] = []; - excludePrimaryFromSecondaryRequirements: boolean; - isDisabledOnRequirementsNotMet: boolean; - hasDexProgress: boolean; + excludePrimaryFromSecondaryRequirements: boolean = false; + isDisabledOnRequirementsNotMet: boolean = true; + hasDexProgress: boolean = false; onPreOptionPhase?: OptionPhaseCallback; onOptionPhase: OptionPhaseCallback; onPostOptionPhase?: OptionPhaseCallback; dialogue: OptionTextDisplay; - static newOptionWithMode(optionMode: MysteryEncounterOptionMode): MysteryEncounterOptionBuilder & OmitBaseAndOptionalKeys & Pick { - return Object.assign(new MysteryEncounterOptionBuilder(), { ...baseOption, optionMode }); + hasRequirements = MysteryEncounter.prototype["hasRequirements"]; + meetsRequirements = MysteryEncounter.prototype["meetsRequirements"]; + pokemonMeetsPrimaryRequirements = MysteryEncounter.prototype["pokemonMeetsPrimaryRequirements"]; + meetsPrimaryRequirementAndPrimaryPokemonSelected = MysteryEncounter.prototype["meetsPrimaryRequirementAndPrimaryPokemonSelected"]; + meetsSupportingRequirementAndSupportingPokemonSelected = MysteryEncounter.prototype["meetsSupportingRequirementAndSupportingPokemonSelected"]; + + static newOptionWithMode(optionMode: MysteryEncounterOptionMode): MysteryEncounterOptionBuilder & Pick { + return Object.assign(new MysteryEncounterOptionBuilder(), { optionMode }); } withHasDexProgress(hasDexProgress: boolean): this & Required> { diff --git a/src/data/mystery-encounters/mystery-encounter-pokemon-data.ts b/src/data/mystery-encounters/mystery-encounter-pokemon-data.ts index cab6d1ce82f..4e933304c5e 100644 --- a/src/data/mystery-encounters/mystery-encounter-pokemon-data.ts +++ b/src/data/mystery-encounters/mystery-encounter-pokemon-data.ts @@ -2,15 +2,15 @@ import { Abilities } from "#enums/abilities"; import { Type } from "#app/data/type"; export class MysteryEncounterPokemonData { - public spriteScale: number; - public ability: Abilities; - public passive: Abilities; - public types: Type[] = []; + public spriteScale: number | undefined; + public ability: Abilities | undefined; + public passive: Abilities | undefined; + public types: Type[]; constructor(spriteScale?: number, ability?: Abilities, passive?: Abilities, types?: Type[]) { this.spriteScale = spriteScale; this.ability = ability; this.passive = passive; - this.types = types; + this.types = types ?? []; } } diff --git a/src/data/mystery-encounters/mystery-encounter-requirements.ts b/src/data/mystery-encounters/mystery-encounter-requirements.ts index 1596cb6b549..24e5f02b6f4 100644 --- a/src/data/mystery-encounters/mystery-encounter-requirements.ts +++ b/src/data/mystery-encounters/mystery-encounter-requirements.ts @@ -48,7 +48,7 @@ export class CombinationSceneRequirement extends EncounterSceneRequirement { } } - return null; + return this.orRequirements[0].getDialogueToken(scene, pokemon); } } @@ -104,7 +104,7 @@ export class CombinationPokemonRequirement extends EncounterPokemonRequirement { } } - return null; + return this.orRequirements[0].getDialogueToken(scene, pokemon); } } @@ -125,7 +125,7 @@ export class PreviousEncounterRequirement extends EncounterSceneRequirement { } getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] { - return ["previousEncounter", scene.mysteryEncounterData.encounteredEvents.find(e => e[0] === this.previousEncounterRequirement)[0].toString()]; + return ["previousEncounter", scene.mysteryEncounterData.encounteredEvents.find(e => e[0] === this.previousEncounterRequirement)?.[0].toString() ?? ""]; } } @@ -158,7 +158,7 @@ export class WaveRangeRequirement extends EncounterSceneRequirement { } export class TimeOfDayRequirement extends EncounterSceneRequirement { - requiredTimeOfDay?: TimeOfDay[]; + requiredTimeOfDay: TimeOfDay[]; constructor(timeOfDay: TimeOfDay | TimeOfDay[]) { super(); @@ -180,7 +180,7 @@ export class TimeOfDayRequirement extends EncounterSceneRequirement { } export class WeatherRequirement extends EncounterSceneRequirement { - requiredWeather?: WeatherType[]; + requiredWeather: WeatherType[]; constructor(weather: WeatherType | WeatherType[]) { super(); @@ -188,8 +188,8 @@ export class WeatherRequirement extends EncounterSceneRequirement { } meetsRequirement(scene: BattleScene): boolean { - const currentWeather = scene.arena?.weather?.weatherType; - if (!isNullOrUndefined(currentWeather) && this?.requiredWeather?.length > 0 && !this.requiredWeather.includes(currentWeather)) { + const currentWeather = scene.arena.weather?.weatherType; + if (!isNullOrUndefined(currentWeather) && this?.requiredWeather?.length > 0 && !this.requiredWeather.includes(currentWeather!)) { return false; } @@ -197,7 +197,12 @@ export class WeatherRequirement extends EncounterSceneRequirement { } getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] { - return ["weather", WeatherType[scene.arena?.weather?.weatherType].replace("_", " ").toLocaleLowerCase()]; + const currentWeather = scene.arena.weather?.weatherType; + let token = ""; + if (!isNullOrUndefined(currentWeather)) { + token = WeatherType[currentWeather!].replace("_", " ").toLocaleLowerCase(); + } + return ["weather", token]; } } @@ -262,10 +267,7 @@ export class PersistentModifierRequirement extends EncounterSceneRequirement { } getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] { - if (this.requiredHeldItemModifiers.length > 0) { - return ["requiredItem", this.requiredHeldItemModifiers[0]]; - } - return null; + return ["requiredItem", this.requiredHeldItemModifiers[0]]; } } @@ -327,10 +329,10 @@ export class SpeciesRequirement extends EncounterPokemonRequirement { } getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] { - if (this.requiredSpecies.includes(pokemon.species.speciesId)) { + if (pokemon?.species.speciesId && this.requiredSpecies.includes(pokemon.species.speciesId)) { return ["species", Species[pokemon.species.speciesId]]; } - return null; + return ["species", ""]; } } @@ -410,11 +412,11 @@ export class TypeRequirement extends EncounterPokemonRequirement { } getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] { - const includedTypes = this.requiredType.filter((ty) => pokemon.getTypes().includes(ty)); + const includedTypes = this.requiredType.filter((ty) => pokemon?.getTypes().includes(ty)); if (includedTypes.length > 0) { return ["type", Type[includedTypes[0]]]; } - return null; + return ["type", ""]; } } @@ -441,19 +443,19 @@ export class MoveRequirement extends EncounterPokemonRequirement { queryParty(partyPokemon: PlayerPokemon[]): PlayerPokemon[] { if (!this.invertQuery) { - return partyPokemon.filter((pokemon) => this.requiredMoves.filter((reqMove) => pokemon.moveset.filter((move) => move.moveId === reqMove).length > 0).length > 0); + return partyPokemon.filter((pokemon) => this.requiredMoves.filter((reqMove) => pokemon.moveset.filter((move) => move?.moveId === reqMove).length > 0).length > 0); } else { // for an inverted query, we only want to get the pokemon that don't have ANY of the listed moves - return partyPokemon.filter((pokemon) => this.requiredMoves.filter((reqMove) => pokemon.moveset.filter((move) => move.moveId === reqMove).length === 0).length === 0); + return partyPokemon.filter((pokemon) => this.requiredMoves.filter((reqMove) => pokemon.moveset.filter((move) => move?.moveId === reqMove).length === 0).length === 0); } } getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] { - const includedMoves = pokemon.moveset.filter((move) => this.requiredMoves.includes(move.moveId)); - if (includedMoves.length > 0) { + const includedMoves = pokemon?.moveset.filter((move) => move?.moveId && this.requiredMoves.includes(move.moveId)); + if (includedMoves && includedMoves.length > 0 && includedMoves[0]) { return ["move", includedMoves[0].getName()]; } - return null; + return ["move", ""]; } } @@ -485,19 +487,19 @@ export class CompatibleMoveRequirement extends EncounterPokemonRequirement { queryParty(partyPokemon: PlayerPokemon[]): PlayerPokemon[] { if (!this.invertQuery) { - return partyPokemon.filter((pokemon) => this.requiredMoves.filter((learnableMove) => pokemon.compatibleTms.filter(tm => !pokemon.moveset.find(m => m.moveId === tm)).includes(learnableMove)).length > 0); + return partyPokemon.filter((pokemon) => this.requiredMoves.filter((learnableMove) => pokemon.compatibleTms.filter(tm => !pokemon.moveset.find(m => m?.moveId === tm)).includes(learnableMove)).length > 0); } else { // for an inverted query, we only want to get the pokemon that don't have ANY of the listed learnableMoves - return partyPokemon.filter((pokemon) => this.requiredMoves.filter((learnableMove) => pokemon.compatibleTms.filter(tm => !pokemon.moveset.find(m => m.moveId === tm)).includes(learnableMove)).length === 0); + return partyPokemon.filter((pokemon) => this.requiredMoves.filter((learnableMove) => pokemon.compatibleTms.filter(tm => !pokemon.moveset.find(m => m?.moveId === tm)).includes(learnableMove)).length === 0); } } getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] { - const includedCompatMoves = this.requiredMoves.filter((reqMove) => pokemon.compatibleTms.filter((tm) => !pokemon.moveset.find(m => m.moveId === tm)).includes(reqMove)); + const includedCompatMoves = this.requiredMoves.filter((reqMove) => pokemon?.compatibleTms.filter((tm) => !pokemon.moveset.find(m => m?.moveId === tm)).includes(reqMove)); if (includedCompatMoves.length > 0) { return ["compatibleMove", Moves[includedCompatMoves[0]]]; } - return null; + return ["compatibleMove", ""]; } } @@ -572,10 +574,10 @@ export class AbilityRequirement extends EncounterPokemonRequirement { } getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] { - if (this.requiredAbilities.some(a => pokemon.getAbility().id === a)) { + if (pokemon?.getAbility().id && this.requiredAbilities.some(a => pokemon.getAbility().id === a)) { return ["ability", pokemon.getAbility().name]; } - return null; + return ["ability", ""]; } } @@ -607,7 +609,7 @@ export class StatusEffectRequirement extends EncounterPokemonRequirement { return this.requiredStatusEffect.some((statusEffect) => { if (statusEffect === StatusEffect.NONE) { // StatusEffect.NONE also checks for null or undefined status - return isNullOrUndefined(pokemon.status) || isNullOrUndefined(pokemon.status.effect) || pokemon.status?.effect === statusEffect; + return isNullOrUndefined(pokemon.status) || isNullOrUndefined(pokemon.status!.effect) || pokemon.status?.effect === statusEffect; } else { return pokemon.status?.effect === statusEffect; } @@ -639,7 +641,7 @@ export class StatusEffectRequirement extends EncounterPokemonRequirement { if (reqStatus.length > 0) { return ["status", StatusEffect[reqStatus[0]]]; } - return null; + return ["status", ""]; } } diff --git a/src/data/mystery-encounters/mystery-encounter.ts b/src/data/mystery-encounters/mystery-encounter.ts index 866f19d925f..cae68150255 100644 --- a/src/data/mystery-encounters/mystery-encounter.ts +++ b/src/data/mystery-encounters/mystery-encounter.ts @@ -1,6 +1,6 @@ import { EnemyPartyConfig } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import Pokemon, { PlayerPokemon, PokemonMove } from "#app/field/pokemon"; -import { isNullOrUndefined } from "#app/utils"; +import { capitalizeFirstLetter, isNullOrUndefined } from "#app/utils"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import BattleScene from "#app/battle-scene"; import MysteryEncounterIntroVisuals, { MysteryEncounterSpriteConfig } from "#app/field/mystery-encounter-intro"; @@ -125,17 +125,17 @@ export default class MysteryEncounter implements IMysteryEncounter { /** * Dialogue object containing all the dialogue, messages, tooltips, etc. for an encounter */ - dialogue?: MysteryEncounterDialogue; + dialogue: MysteryEncounterDialogue; /** * Data used for setting up/initializing enemy party in battles * Can store multiple configs so that one can be chosen based on option selected * Should usually be defined in `onInit()` or `onPreOptionPhase()` */ - enemyPartyConfigs?: EnemyPartyConfig[]; + enemyPartyConfigs: EnemyPartyConfig[]; /** * Object instance containing sprite data for an encounter when it is being spawned * Otherwise, will be undefined - * You probably shouldn't do anything with this unless you have a very specific need + * You probably shouldn't do anything directly with this unless you have a very specific need */ introVisuals?: MysteryEncounterIntroVisuals; @@ -233,7 +233,7 @@ export default class MysteryEncounter implements IMysteryEncounter { return !this.primaryPokemonRequirements.some(req => !req.queryParty(scene.getParty()).map(p => p.id).includes(pokemon.id)); } - private meetsPrimaryRequirementAndPrimaryPokemonSelected(scene: BattleScene): boolean { + meetsPrimaryRequirementAndPrimaryPokemonSelected(scene: BattleScene): boolean { if (this.primaryPokemonRequirements.length === 0) { const activeMon = scene.getParty().filter(p => p.isActive(true)); if (activeMon.length > 0) { @@ -290,7 +290,7 @@ export default class MysteryEncounter implements IMysteryEncounter { } } - private meetsSecondaryRequirementAndSecondaryPokemonSelected(scene: BattleScene): boolean { + meetsSecondaryRequirementAndSecondaryPokemonSelected(scene: BattleScene): boolean { if (!this.secondaryPokemonRequirements) { this.secondaryPokemon = []; return true; @@ -338,7 +338,7 @@ export default class MysteryEncounter implements IMysteryEncounter { if (!req.invertQuery) { const value = req.getDialogueToken(scene, this.primaryPokemon); if (value?.length === 2) { - this.setDialogueToken("primary" + this.capitalizeFirstLetter(value[0]), value[1]); + this.setDialogueToken("primary" + capitalizeFirstLetter(value[0]), value[1]); } } } @@ -349,9 +349,9 @@ export default class MysteryEncounter implements IMysteryEncounter { if (!req.invertQuery) { const value = req.getDialogueToken(scene, this.secondaryPokemon[0]); if (value?.length === 2) { - this.setDialogueToken("primary" + this.capitalizeFirstLetter(value[0]), value[1]); + this.setDialogueToken("primary" + capitalizeFirstLetter(value[0]), value[1]); } - this.setDialogueToken("secondary" + this.capitalizeFirstLetter(value[0]), value[1]); + this.setDialogueToken("secondary" + capitalizeFirstLetter(value[0]), value[1]); } } } @@ -365,7 +365,7 @@ export default class MysteryEncounter implements IMysteryEncounter { for (const req of opt.requirements) { const dialogueToken = req.getDialogueToken(scene); if (dialogueToken?.length === 2) { - this.setDialogueToken("option" + j + this.capitalizeFirstLetter(dialogueToken[0]), dialogueToken[1]); + this.setDialogueToken("option" + j + capitalizeFirstLetter(dialogueToken[0]), dialogueToken[1]); } } } @@ -375,7 +375,7 @@ export default class MysteryEncounter implements IMysteryEncounter { if (!req.invertQuery) { const value = req.getDialogueToken(scene, opt.primaryPokemon); if (value?.length === 2) { - this.setDialogueToken("option" + j + "Primary" + this.capitalizeFirstLetter(value[0]), value[1]); + this.setDialogueToken("option" + j + "Primary" + capitalizeFirstLetter(value[0]), value[1]); } } } @@ -386,7 +386,7 @@ export default class MysteryEncounter implements IMysteryEncounter { if (!req.invertQuery) { const value = req.getDialogueToken(scene, opt.secondaryPokemon[0]); if (value?.length === 2) { - this.setDialogueToken("option" + j + "Secondary" + this.capitalizeFirstLetter(value[0]), value[1]); + this.setDialogueToken("option" + j + "Secondary" + capitalizeFirstLetter(value[0]), value[1]); } } } @@ -418,42 +418,8 @@ export default class MysteryEncounter implements IMysteryEncounter { const currentOffset = this.seedOffset ?? scene.currentBattle.waveIndex * 1000; this.seedOffset = currentOffset + 512; } - - private capitalizeFirstLetter(str: string) { - return str.charAt(0).toUpperCase() + str.slice(1); - } } -const baseMysteryEncounter = { - hideBattleIntroMessage: false, - autoHideIntroVisuals: true, - enterIntroVisualsFromRight: false, - catchAllowed: false, - continuousEncounter: false, - maxAllowedEncounters: 3, - requirements: [], - primaryPokemonRequirements: [], - secondaryPokemonRequirements: [], - excludePrimaryFromSupportRequirements: true, - dialogueTokens: new Map(), - encounterMode: MysteryEncounterMode.DEFAULT, - lockEncounterRewardTiers: false, - startOfBattleEffectsComplete: false, - expMultiplier: 1, -}; - -/* Picks non-optional fields from an "object" type alias and returns a union of literal types (keys) */ -type PickNonOptionalFieldsKeys = Exclude<{ [K in Keys]: T extends Record ? K : never; }[Keys], undefined>; -// type NonFunctionFieldsKeys = { [K in Keys]: T[K] extends Function ? never : K; }[Keys]; -// type FunctionPropertyKeys = { [K in Keys]: T[K] extends Function ? K : never; }[Keys]; -/* Extracts keys from T */ -type Keys = keyof T; -/* Filters out all optional fields from an "object" type alias, and all function fields */ -type PickNonOptionalFields = Pick>; -/* Omits keys that exist in the base object and optional keys on MysteryEncounter, as well as functions on MysteryEncounter */ -type OmitBaseAndOptionalKeys = Omit, Keys>; -// type OmitBaseSuppliedAndOptionalKeys = Omit, Keys>; - /** * Builder class for creating a MysteryEncounter * must call `build()` at the end after specifying all params for the MysteryEncounter @@ -461,8 +427,9 @@ type OmitBaseAndOptionalKeys = Omit, Keys>; export class MysteryEncounterBuilder implements Partial { encounterType: MysteryEncounterType; encounterMode: MysteryEncounterMode; - options: [MysteryEncounterOption, MysteryEncounterOption, ...MysteryEncounterOption[]]; + options: [MysteryEncounterOption, MysteryEncounterOption, ...MysteryEncounterOption[]] = [new MysteryEncounterOption(null), new MysteryEncounterOption(null)]; spriteConfigs: MysteryEncounterSpriteConfig[]; + enemyPartyConfigs: EnemyPartyConfig[] = []; dialogue: MysteryEncounterDialogue = {}; encounterTier: MysteryEncounterTier; @@ -478,15 +445,15 @@ export class MysteryEncounterBuilder implements Partial { onInit?: (scene: BattleScene) => boolean; onVisualsStart?: (scene: BattleScene) => boolean; - hideBattleIntroMessage: boolean; - hideIntroVisuals: boolean; - enterIntroVisualsFromRight: boolean; - continuousEncounter: boolean; - catchAllowed: boolean; - lockEncounterRewardTiers: boolean; - startOfBattleEffectsComplete: boolean; - maxAllowedEncounters: number; - expMultiplier: number; + hideBattleIntroMessage: boolean = false; + autoHideIntroVisuals: boolean = true; + enterIntroVisualsFromRight: boolean = false; + continuousEncounter: boolean = false; + catchAllowed: boolean = false; + lockEncounterRewardTiers: boolean = false; + startOfBattleEffectsComplete: boolean = false; + maxAllowedEncounters: number = 3; + expMultiplier: number = 1; /** * Builder class has to re-declare the {@link MysteryEncounter} class functions so @@ -502,7 +469,6 @@ export class MysteryEncounterBuilder implements Partial { updateSeedOffset = MysteryEncounter.prototype["updateSeedOffset"]; meetsPrimaryRequirementAndPrimaryPokemonSelected = MysteryEncounter.prototype["meetsPrimaryRequirementAndPrimaryPokemonSelected"]; meetsSecondaryRequirementAndSecondaryPokemonSelected = MysteryEncounter.prototype["meetsSecondaryRequirementAndSecondaryPokemonSelected"]; - capitalizeFirstLetter = MysteryEncounter.prototype["capitalizeFirstLetter"]; /** * REQUIRED @@ -514,15 +480,14 @@ export class MysteryEncounterBuilder implements Partial { * @param encounterType * @returns this */ - static withEncounterType(encounterType: MysteryEncounterType): MysteryEncounterBuilder & OmitBaseAndOptionalKeys & Pick { - return Object.assign(new MysteryEncounterBuilder(), { ...baseMysteryEncounter, encounterType }); + static withEncounterType(encounterType: MysteryEncounterType): MysteryEncounterBuilder & Pick { + return Object.assign(new MysteryEncounterBuilder(), { encounterType }); } /** * Defines an option for the encounter. * Use for complex options. * There should be at least 2 options defined and no more than 4. - * If easy/streamlined use {@linkcode MysteryEncounterBuilder.withOptionPhase} * * @param option - MysteryEncounterOption to add, can use MysteryEncounterOptionBuilder to create instance * @returns diff --git a/src/ui/mystery-encounter-ui-handler.ts b/src/ui/mystery-encounter-ui-handler.ts index 78eac8a3982..d5bae208629 100644 --- a/src/ui/mystery-encounter-ui-handler.ts +++ b/src/ui/mystery-encounter-ui-handler.ts @@ -552,7 +552,7 @@ export default class MysteryEncounterUiHandler extends UiHandler { duration: 750, onComplete: () => { this.dexProgressContainer.on("pointerover", () => { - (this.scene as BattleScene).ui.showTooltip(null, i18next.t("mysteryEncounter:affects_pokedex"), true); + (this.scene as BattleScene).ui.showTooltip("", i18next.t("mysteryEncounter:affects_pokedex"), true); }); this.dexProgressContainer.on("pointerout", () => { (this.scene as BattleScene).ui.hideTooltip(); diff --git a/src/utils.ts b/src/utils.ts index c51ac2b5b0b..52e817bc2b7 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -560,3 +560,7 @@ export function capitalizeString(str: string, sep: string, lowerFirstChar: boole export function isNullOrUndefined(object: any): boolean { return null === object || undefined === object; } + +export function capitalizeFirstLetter(str: string) { + return str.charAt(0).toUpperCase() + str.slice(1); +} From 39c6c375f8a40d61707b5905ff5372ca9fda2ab6 Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Thu, 22 Aug 2024 13:03:05 -0400 Subject: [PATCH 251/270] fix ME null checks and unit tests with beta update --- public/images/items.json | 7750 +++++++++-------- public/images/items.png | Bin 56828 -> 57799 bytes src/battle-scene.ts | 53 +- src/data/battle-anims.ts | 42 +- src/data/egg.ts | 4 +- .../encounters/a-trainers-test-encounter.ts | 4 +- .../encounters/absolute-avarice-encounter.ts | 26 +- .../an-offer-you-cant-refuse-encounter.ts | 2 +- .../encounters/berries-abound-encounter.ts | 14 +- .../encounters/clowning-around-encounter.ts | 22 +- .../encounters/dancing-lessons-encounter.ts | 14 +- .../encounters/delibirdy-encounter.ts | 28 +- .../department-store-sale-encounter.ts | 14 +- .../encounters/field-trip-encounter.ts | 12 +- .../encounters/fiery-fallout-encounter.ts | 22 +- .../encounters/fight-or-flight-encounter.ts | 8 +- .../mysterious-challengers-encounter.ts | 1 + .../encounters/mysterious-chest-encounter.ts | 2 +- .../encounters/part-timer-encounter.ts | 28 +- .../encounters/safari-zone-encounter.ts | 14 +- .../shady-vitamin-dealer-encounter.ts | 8 +- .../slumbering-snorlax-encounter.ts | 2 +- .../the-pokemon-salesman-encounter.ts | 12 +- .../encounters/the-strong-stuff-encounter.ts | 4 +- .../the-winstrate-challenge-encounter.ts | 54 +- .../encounters/training-session-encounter.ts | 78 +- .../encounters/trash-to-treasure-encounter.ts | 4 +- .../encounters/weird-dream-encounter.ts | 22 +- .../mystery-encounter-option.ts | 80 +- .../mystery-encounter-requirements.ts | 66 +- .../mystery-encounters/mystery-encounter.ts | 153 +- .../mystery-encounters/mystery-encounters.ts | 8 +- .../can-learn-move-requirement.ts | 6 +- .../utils/encounter-dialogue-utils.ts | 31 +- .../utils/encounter-phase-utils.ts | 110 +- .../utils/encounter-pokemon-utils.ts | 74 +- src/field/arena.ts | 2 +- src/field/mystery-encounter-intro.ts | 13 +- src/field/pokemon.ts | 2 +- .../mystery-encounters/delibirdy-dialogue.ts | 2 +- src/modifier/modifier-type.ts | 27 +- src/modifier/modifier.ts | 4 +- src/phases.ts | 53 +- src/phases/mystery-encounter-phases.ts | 53 +- .../mystery-encounter/encounterTestUtils.ts | 13 +- .../a-trainers-test-encounter.test.ts | 38 +- .../absolute-avarice-encounter.test.ts | 30 +- ...an-offer-you-cant-refuse-encounter.test.ts | 16 +- .../berries-abound-encounter.test.ts | 37 +- .../clowning-around-encounter.test.ts | 47 +- .../dancing-lessons-encounter.test.ts | 24 +- .../encounters/delibirdy-encounter.test.ts | 52 +- .../department-store-sale-encounter.test.ts | 16 +- .../fiery-fallout-encounter.test.ts | 28 +- .../fight-or-flight-encounter.test.ts | 28 +- .../encounters/lost-at-sea-encounter.test.ts | 32 +- .../mysterious-challengers-encounter.test.ts | 38 +- .../encounters/part-timer-encounter.test.ts | 22 +- .../the-pokemon-salesman-encounter.test.ts | 14 +- .../the-strong-stuff-encounter.test.ts | 31 +- .../the-winstrate-challenge-encounter.test.ts | 28 +- .../trash-to-treasure-encounter.test.ts | 26 +- .../encounters/weird-dream-encounter.test.ts | 16 +- .../mystery-encounter-utils.test.ts | 2 +- .../mystery-encounter.test.ts | 4 +- .../phases/mystery-encounter-phase.test.ts | 4 +- src/test/phases/select-modifier-phase.test.ts | 43 +- src/test/utils/gameManager.ts | 4 +- src/test/utils/gameManagerUtils.ts | 2 +- src/test/utils/helpers/overridesHelper.ts | 39 +- src/test/utils/mocks/mockGameObject.ts | 2 +- .../mocks/mocksContainer/mockContainer.ts | 2 +- .../mocks/mocksContainer/mockGraphics.ts | 1 + .../mocks/mocksContainer/mockRectangle.ts | 1 + .../utils/mocks/mocksContainer/mockSprite.ts | 1 + .../utils/mocks/mocksContainer/mockText.ts | 2 +- .../utils/mocks/mocksContainer/mockTexture.ts | 1 + src/test/utils/phaseInterceptor.ts | 2 +- src/ui/mystery-encounter-ui-handler.ts | 44 +- src/ui/text.ts | 2 +- 80 files changed, 4874 insertions(+), 4746 deletions(-) diff --git a/public/images/items.json b/public/images/items.json index c347790b92f..b318f79b0a0 100644 --- a/public/images/items.json +++ b/public/images/items.json @@ -4,8 +4,8 @@ "image": "items.png", "format": "RGBA8888", "size": { - "w": 425, - "h": 425 + "w": 428, + "h": 428 }, "scale": 1, "frames": [ @@ -387,6 +387,27 @@ "h": 28 } }, + { + "filename": "mega_bracelet", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 16 + }, + "frame": { + "x": 0, + "y": 412, + "w": 20, + "h": 16 + } + }, { "filename": "ability_charm", "rotated": false, @@ -619,7 +640,7 @@ } }, { - "filename": "elixir", + "filename": "catching_charm", "rotated": false, "trimmed": true, "sourceSize": { @@ -627,15 +648,15 @@ "h": 32 }, "spriteSourceSize": { - "x": 7, + "x": 5, "y": 4, - "w": 18, + "w": 21, "h": 24 }, "frame": { "x": 407, "y": 0, - "w": 18, + "w": 21, "h": 24 } }, @@ -892,7 +913,7 @@ } }, { - "filename": "coupon", + "filename": "exp_balance", "rotated": false, "trimmed": true, "sourceSize": { @@ -901,36 +922,15 @@ }, "spriteSourceSize": { "x": 4, - "y": 7, - "w": 23, - "h": 19 + "y": 5, + "w": 24, + "h": 22 }, "frame": { "x": 22, "y": 406, - "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": 45, - "y": 406, - "w": 23, - "h": 19 + "w": 24, + "h": 22 } }, { @@ -955,7 +955,7 @@ } }, { - "filename": "mega_bracelet", + "filename": "relic_band", "rotated": false, "trimmed": true, "sourceSize": { @@ -963,20 +963,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, + "x": 7, + "y": 9, + "w": 17, "h": 16 }, "frame": { "x": 28, "y": 70, - "w": 20, + "w": 17, "h": 16 } }, { - "filename": "calcium", + "filename": "abomasite", "rotated": false, "trimmed": true, "sourceSize": { @@ -985,57 +985,15 @@ }, "spriteSourceSize": { "x": 8, - "y": 4, + "y": 8, "w": 16, - "h": 24 + "h": 16 }, "frame": { - "x": 39, - "y": 86, + "x": 45, + "y": 70, "w": 16, - "h": 24 - } - }, - { - "filename": "carbos", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 39, - "y": 110, - "w": 16, - "h": 24 - } - }, - { - "filename": "catching_charm", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 21, - "h": 24 - }, - "frame": { - "x": 39, - "y": 134, - "w": 21, - "h": 24 + "h": 16 } }, { @@ -1054,7 +1012,7 @@ }, "frame": { "x": 39, - "y": 158, + "y": 86, "w": 24, "h": 24 } @@ -1075,7 +1033,7 @@ }, "frame": { "x": 39, - "y": 182, + "y": 110, "w": 24, "h": 24 } @@ -1094,6 +1052,69 @@ "w": 24, "h": 24 }, + "frame": { + "x": 39, + "y": 134, + "w": 24, + "h": 24 + } + }, + { + "filename": "golden_punch", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 39, + "y": 158, + "w": 24, + "h": 24 + } + }, + { + "filename": "gracidea", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 39, + "y": 182, + "w": 24, + "h": 24 + } + }, + { + "filename": "grip_claw", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, "frame": { "x": 44, "y": 206, @@ -1102,7 +1123,7 @@ } }, { - "filename": "golden_punch", + "filename": "icicle_plate", "rotated": false, "trimmed": true, "sourceSize": { @@ -1123,7 +1144,7 @@ } }, { - "filename": "gracidea", + "filename": "insect_plate", "rotated": false, "trimmed": true, "sourceSize": { @@ -1143,69 +1164,6 @@ "h": 24 } }, - { - "filename": "grip_claw", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 46, - "y": 278, - "w": 24, - "h": 24 - } - }, - { - "filename": "icicle_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 46, - "y": 302, - "w": 24, - "h": 24 - } - }, - { - "filename": "insect_plate", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 24, - "h": 24 - }, - "frame": { - "x": 46, - "y": 326, - "w": 24, - "h": 24 - } - }, { "filename": "iron_plate", "rotated": false, @@ -1222,7 +1180,7 @@ }, "frame": { "x": 46, - "y": 350, + "y": 278, "w": 24, "h": 24 } @@ -1243,137 +1201,11 @@ }, "frame": { "x": 46, - "y": 374, + "y": 302, "w": 24, "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": "ether", - "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": "full_restore", - "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": "hp_up", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 60, - "y": 134, - "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": 158, - "w": 16, - "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": "lucky_punch_great", "rotated": false, @@ -1389,8 +1221,8 @@ "h": 24 }, "frame": { - "x": 68, - "y": 206, + "x": 46, + "y": 326, "w": 24, "h": 24 } @@ -1410,8 +1242,8 @@ "h": 24 }, "frame": { - "x": 68, - "y": 230, + "x": 46, + "y": 350, "w": 24, "h": 24 } @@ -1431,8 +1263,8 @@ "h": 24 }, "frame": { - "x": 69, - "y": 254, + "x": 46, + "y": 374, "w": 24, "h": 24 } @@ -1452,112 +1284,7 @@ "h": 24 }, "frame": { - "x": 70, - "y": 278, - "w": 24, - "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": 302, - "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": 326, - "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": 350, - "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": 374, - "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": 68, + "x": 46, "y": 398, "w": 24, "h": 24 @@ -1585,7 +1312,7 @@ } }, { - "filename": "lure", + "filename": "calcium", "rotated": false, "trimmed": true, "sourceSize": { @@ -1595,39 +1322,18 @@ "spriteSourceSize": { "x": 8, "y": 4, - "w": 17, - "h": 24 - }, - "frame": { - "x": 92, - "y": 398, - "w": 17, - "h": 24 - } - }, - { - "filename": "max_elixir", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 18, + "w": 16, "h": 24 }, "frame": { "x": 59, "y": 27, - "w": 18, + "w": 16, "h": 24 } }, { - "filename": "scanner", + "filename": "meadow_plate", "rotated": false, "trimmed": true, "sourceSize": { @@ -1641,14 +1347,14 @@ "h": 24 }, "frame": { - "x": 77, + "x": 75, "y": 26, "w": 24, "h": 24 } }, { - "filename": "silk_scarf", + "filename": "mind_plate", "rotated": false, "trimmed": true, "sourceSize": { @@ -1662,12 +1368,33 @@ "h": 24 }, "frame": { - "x": 101, + "x": 99, "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, @@ -1732,7 +1459,7 @@ } }, { - "filename": "sky_plate", + "filename": "absolite", "rotated": false, "trimmed": true, "sourceSize": { @@ -1740,20 +1467,41 @@ "h": 32 }, "spriteSourceSize": { - "x": 4, + "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": 24, + "w": 16, "h": 24 }, "frame": { - "x": 125, - "y": 36, - "w": 24, + "x": 63, + "y": 86, + "w": 16, "h": 24 } }, { - "filename": "choice_specs", + "filename": "elixir", "rotated": false, "trimmed": true, "sourceSize": { @@ -1761,16 +1509,100 @@ "h": 32 }, "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 24, - "h": 18 + "x": 7, + "y": 4, + "w": 18, + "h": 24 }, "frame": { - "x": 125, - "y": 60, - "w": 24, - "h": 18 + "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 } }, { @@ -1788,14 +1620,140 @@ "h": 24 }, "frame": { - "x": 149, - "y": 36, + "x": 68, + "y": 230, "w": 18, "h": 24 } }, { - "filename": "adamant_crystal", + "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": { @@ -1804,15 +1762,183 @@ }, "spriteSourceSize": { "x": 4, - "y": 6, - "w": 23, - "h": 21 + "y": 4, + "w": 24, + "h": 24 }, "frame": { - "x": 149, - "y": 60, + "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": 21 + "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, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 4, + "w": 24, + "h": 24 + }, + "frame": { + "x": 105, + "y": 145, + "w": 24, + "h": 24 } }, { @@ -1830,8 +1956,8 @@ "h": 24 }, "frame": { - "x": 167, - "y": 21, + "x": 86, + "y": 169, "w": 24, "h": 24 } @@ -1851,8 +1977,8 @@ "h": 24 }, "frame": { - "x": 191, - "y": 21, + "x": 86, + "y": 193, "w": 24, "h": 24 } @@ -1872,8 +1998,8 @@ "h": 24 }, "frame": { - "x": 215, - "y": 21, + "x": 86, + "y": 217, "w": 24, "h": 24 } @@ -1893,8 +2019,8 @@ "h": 24 }, "frame": { - "x": 239, - "y": 21, + "x": 86, + "y": 241, "w": 24, "h": 24 } @@ -1914,8 +2040,8 @@ "h": 24 }, "frame": { - "x": 263, - "y": 21, + "x": 86, + "y": 265, "w": 24, "h": 24 } @@ -1935,14 +2061,14 @@ "h": 24 }, "frame": { - "x": 287, - "y": 21, + "x": 86, + "y": 289, "w": 24, "h": 24 } }, { - "filename": "silver_powder", + "filename": "red_orb", "rotated": false, "trimmed": true, "sourceSize": { @@ -1950,20 +2076,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 4, - "y": 11, - "w": 24, - "h": 15 + "x": 6, + "y": 4, + "w": 20, + "h": 24 }, "frame": { - "x": 167, - "y": 45, - "w": 24, - "h": 15 + "x": 110, + "y": 169, + "w": 20, + "h": 24 } }, { - "filename": "max_revive", + "filename": "black_belt", "rotated": false, "trimmed": true, "sourceSize": { @@ -1974,13 +2100,34 @@ "x": 5, "y": 4, "w": 22, - "h": 24 + "h": 23 }, "frame": { - "x": 311, - "y": 21, + "x": 110, + "y": 193, "w": 22, - "h": 24 + "h": 23 + } + }, + { + "filename": "bug_tera_shard", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 4, + "w": 22, + "h": 23 + }, + "frame": { + "x": 110, + "y": 216, + "w": 22, + "h": 23 } }, { @@ -1998,8 +2145,8 @@ "h": 23 }, "frame": { - "x": 333, - "y": 20, + "x": 110, + "y": 239, "w": 24, "h": 23 } @@ -2019,8 +2166,8 @@ "h": 23 }, "frame": { - "x": 357, - "y": 20, + "x": 110, + "y": 262, "w": 24, "h": 23 } @@ -2040,281 +2187,8 @@ "h": 23 }, "frame": { - "x": 381, - "y": 20, - "w": 24, - "h": 23 - } - }, - { - "filename": "red_orb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 20, - "h": 24 - }, - "frame": { - "x": 405, - "y": 24, - "w": 20, - "h": 24 - } - }, - { - "filename": "amulet_coin", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 5, - "w": 23, - "h": 21 - }, - "frame": { - "x": 172, - "y": 60, - "w": 23, - "h": 21 - } - }, - { - "filename": "candy_overlay", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 12, - "w": 16, - "h": 15 - }, - "frame": { - "x": 191, - "y": 45, - "w": 16, - "h": 15 - } - }, - { - "filename": "dragon_scale", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 24, - "h": 18 - }, - "frame": { - "x": 207, - "y": 45, - "w": 24, - "h": 18 - } - }, - { - "filename": "exp_balance", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 24, - "h": 22 - }, - "frame": { - "x": 231, - "y": 45, - "w": 24, - "h": 22 - } - }, - { - "filename": "exp_share", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 24, - "h": 22 - }, - "frame": { - "x": 255, - "y": 45, - "w": 24, - "h": 22 - } - }, - { - "filename": "leppa_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 24, - "h": 23 - }, - "frame": { - "x": 279, - "y": 45, - "w": 24, - "h": 23 - } - }, - { - "filename": "scope_lens", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 24, - "h": 23 - }, - "frame": { - "x": 303, - "y": 45, - "w": 24, - "h": 23 - } - }, - { - "filename": "revive", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 10, - "y": 8, - "w": 12, - "h": 17 - }, - "frame": { - "x": 195, - "y": 60, - "w": 12, - "h": 17 - } - }, - { - "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": 63, - "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": 231, - "y": 67, - "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": 255, - "y": 67, - "w": 24, - "h": 22 - } - }, - { - "filename": "twisted_spoon", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 24, - "h": 23 - }, - "frame": { - "x": 279, - "y": 68, + "x": 110, + "y": 285, "w": 24, "h": 23 } @@ -2334,77 +2208,14 @@ "h": 23 }, "frame": { - "x": 303, - "y": 68, + "x": 87, + "y": 313, "w": 23, "h": 23 } }, { - "filename": "black_belt", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 327, - "y": 45, - "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": 326, - "y": 68, - "w": 23, - "h": 23 - } - }, - { - "filename": "reveal_glass", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 4, - "w": 23, - "h": 24 - }, - "frame": { - "x": 349, - "y": 43, - "w": 23, - "h": 24 - } - }, - { - "filename": "leek", + "filename": "leppa_berry", "rotated": false, "trimmed": true, "sourceSize": { @@ -2414,144 +2225,18 @@ "spriteSourceSize": { "x": 4, "y": 5, - "w": 23, + "w": 24, "h": 23 }, "frame": { - "x": 372, - "y": 43, - "w": 23, + "x": 110, + "y": 308, + "w": 24, "h": 23 } }, { - "filename": "rare_candy", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 23, - "h": 23 - }, - "frame": { - "x": 349, - "y": 67, - "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": 372, - "y": 66, - "w": 23, - "h": 23 - } - }, - { - "filename": "bug_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 395, - "y": 48, - "w": 22, - "h": 23 - } - }, - { - "filename": "auspicious_armor", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 23, - "h": 21 - }, - "frame": { - "x": 395, - "y": 71, - "w": 23, - "h": 21 - } - }, - { - "filename": "binding_band", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 23, - "h": 20 - }, - "frame": { - "x": 372, - "y": 89, - "w": 23, - "h": 20 - } - }, - { - "filename": "healing_charm", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 23, - "h": 22 - }, - "frame": { - "x": 349, - "y": 90, - "w": 23, - "h": 22 - } - }, - { - "filename": "black_glasses", + "filename": "choice_specs", "rotated": false, "trimmed": true, "sourceSize": { @@ -2561,14 +2246,35 @@ "spriteSourceSize": { "x": 4, "y": 8, - "w": 23, - "h": 17 + "w": 24, + "h": 18 }, "frame": { - "x": 395, - "y": 92, + "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": 17 + "h": 19 + }, + "frame": { + "x": 125, + "y": 54, + "w": 23, + "h": 19 } }, { @@ -2586,7 +2292,7 @@ "h": 23 }, "frame": { - "x": 73, + "x": 126, "y": 73, "w": 22, "h": 23 @@ -2607,8 +2313,8 @@ "h": 23 }, "frame": { - "x": 95, - "y": 73, + "x": 126, + "y": 96, "w": 22, "h": 23 } @@ -2628,12 +2334,33 @@ "h": 23 }, "frame": { - "x": 73, - "y": 96, + "x": 126, + "y": 119, "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, @@ -2649,8 +2376,8 @@ "h": 23 }, "frame": { - "x": 95, - "y": 96, + "x": 130, + "y": 165, "w": 22, "h": 23 } @@ -2670,33 +2397,12 @@ "h": 23 }, "frame": { - "x": 117, - "y": 78, + "x": 132, + "y": 188, "w": 22, "h": 23 } }, - { - "filename": "blank_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 117, - "y": 101, - "w": 22, - "h": 22 - } - }, { "filename": "fire_stone", "rotated": false, @@ -2712,8 +2418,8 @@ "h": 23 }, "frame": { - "x": 139, - "y": 81, + "x": 132, + "y": 211, "w": 22, "h": 23 } @@ -2733,180 +2439,12 @@ "h": 23 }, "frame": { - "x": 161, - "y": 81, + "x": 134, + "y": 234, "w": 22, "h": 23 } }, - { - "filename": "quick_powder", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 6, - "w": 24, - "h": 20 - }, - "frame": { - "x": 139, - "y": 104, - "w": 24, - "h": 20 - } - }, - { - "filename": "big_nugget", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 163, - "y": 104, - "w": 20, - "h": 20 - } - }, - { - "filename": "max_lure", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 17, - "h": 24 - }, - "frame": { - "x": 183, - "y": 81, - "w": 17, - "h": 24 - } - }, - { - "filename": "rusted_sword", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 23, - "h": 22 - }, - "frame": { - "x": 200, - "y": 83, - "w": 23, - "h": 22 - } - }, - { - "filename": "rusted_shield", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 6, - "w": 24, - "h": 20 - }, - "frame": { - "x": 183, - "y": 105, - "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": 207, - "y": 105, - "w": 19, - "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": 223, - "y": 87, - "w": 23, - "h": 18 - } - }, - { - "filename": "blue_orb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 226, - "y": 105, - "w": 20, - "h": 20 - } - }, { "filename": "flying_tera_shard", "rotated": false, @@ -2922,33 +2460,12 @@ "h": 23 }, "frame": { - "x": 246, - "y": 89, + "x": 134, + "y": 257, "w": 22, "h": 23 } }, - { - "filename": "blunder_policy", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 19 - }, - "frame": { - "x": 246, - "y": 112, - "w": 22, - "h": 19 - } - }, { "filename": "focus_sash", "rotated": false, @@ -2964,8 +2481,8 @@ "h": 23 }, "frame": { - "x": 268, - "y": 91, + "x": 134, + "y": 280, "w": 22, "h": 23 } @@ -2985,159 +2502,12 @@ "h": 23 }, "frame": { - "x": 290, - "y": 91, + "x": 134, + "y": 303, "w": 22, "h": 23 } }, - { - "filename": "grass_tera_shard", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 312, - "y": 91, - "w": 22, - "h": 23 - } - }, - { - "filename": "full_heal", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 9, - "y": 4, - "w": 15, - "h": 23 - }, - "frame": { - "x": 334, - "y": 91, - "w": 15, - "h": 23 - } - }, - { - "filename": "sacred_ash", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 24, - "h": 20 - }, - "frame": { - "x": 268, - "y": 114, - "w": 24, - "h": 20 - } - }, - { - "filename": "shadow_reins_of_unity", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 24, - "h": 20 - }, - "frame": { - "x": 292, - "y": 114, - "w": 24, - "h": 20 - } - }, - { - "filename": "soft_sand", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 24, - "h": 20 - }, - "frame": { - "x": 316, - "y": 114, - "w": 24, - "h": 20 - } - }, - { - "filename": "eviolite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 15, - "h": 15 - }, - "frame": { - "x": 73, - "y": 119, - "w": 15, - "h": 15 - } - }, - { - "filename": "max_potion", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 4, - "w": 18, - "h": 24 - }, - "frame": { - "x": 76, - "y": 134, - "w": 18, - "h": 24 - } - }, { "filename": "max_repel", "rotated": false, @@ -3153,33 +2523,12 @@ "h": 24 }, "frame": { - "x": 79, - "y": 158, + "x": 148, + "y": 54, "w": 16, "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": 86, - "y": 182, - "w": 21, - "h": 24 - } - }, { "filename": "pp_max", "rotated": false, @@ -3195,8 +2544,8 @@ "h": 24 }, "frame": { - "x": 92, - "y": 206, + "x": 148, + "y": 78, "w": 16, "h": 24 } @@ -3216,14 +2565,14 @@ "h": 24 }, "frame": { - "x": 92, - "y": 230, + "x": 148, + "y": 102, "w": 16, "h": 24 } }, { - "filename": "protein", + "filename": "aerodactylite", "rotated": false, "trimmed": true, "sourceSize": { @@ -3232,19 +2581,19 @@ }, "spriteSourceSize": { "x": 8, - "y": 4, + "y": 8, "w": 16, - "h": 24 + "h": 16 }, "frame": { - "x": 93, - "y": 254, + "x": 148, + "y": 126, "w": 16, - "h": 24 + "h": 16 } }, { - "filename": "repel", + "filename": "full_heal", "rotated": false, "trimmed": true, "sourceSize": { @@ -3252,20 +2601,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 8, + "x": 9, "y": 4, - "w": 16, - "h": 24 + "w": 15, + "h": 23 }, "frame": { - "x": 94, - "y": 278, - "w": 16, - "h": 24 + "x": 150, + "y": 142, + "w": 15, + "h": 23 } }, { - "filename": "shiny_charm", + "filename": "grass_tera_shard", "rotated": false, "trimmed": true, "sourceSize": { @@ -3275,18 +2624,18 @@ "spriteSourceSize": { "x": 6, "y": 4, - "w": 21, - "h": 24 + "w": 22, + "h": 23 }, "frame": { - "x": 94, - "y": 302, - "w": 21, - "h": 24 + "x": 152, + "y": 165, + "w": 22, + "h": 23 } }, { - "filename": "dragon_fang", + "filename": "griseous_core", "rotated": false, "trimmed": true, "sourceSize": { @@ -3296,13 +2645,34 @@ "spriteSourceSize": { "x": 5, "y": 5, - "w": 21, + "w": 23, "h": 23 }, "frame": { - "x": 94, - "y": 326, - "w": 21, + "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 } }, @@ -3321,8 +2691,8 @@ "h": 23 }, "frame": { - "x": 94, - "y": 349, + "x": 156, + "y": 234, "w": 22, "h": 23 } @@ -3342,14 +2712,14 @@ "h": 23 }, "frame": { - "x": 94, - "y": 372, + "x": 156, + "y": 257, "w": 22, "h": 23 } }, { - "filename": "prism_scale", + "filename": "macho_brace", "rotated": false, "trimmed": true, "sourceSize": { @@ -3357,83 +2727,20 @@ "h": 32 }, "spriteSourceSize": { - "x": 9, - "y": 8, - "w": 15, - "h": 15 - }, - "frame": { - "x": 88, - "y": 119, - "w": 15, - "h": 15 - } - }, - { - "filename": "super_lure", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 17, - "h": 24 - }, - "frame": { - "x": 94, - "y": 134, - "w": 17, - "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": 95, - "y": 158, - "w": 16, - "h": 24 - } - }, - { - "filename": "berry_pot", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, + "x": 4, "y": 5, - "w": 18, - "h": 22 + "w": 23, + "h": 23 }, "frame": { - "x": 340, - "y": 114, - "w": 18, - "h": 22 + "x": 156, + "y": 280, + "w": 23, + "h": 23 } }, { - "filename": "unknown", + "filename": "rare_candy", "rotated": false, "trimmed": true, "sourceSize": { @@ -3441,16 +2748,16 @@ "h": 32 }, "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 + "x": 4, + "y": 5, + "w": 23, + "h": 23 }, "frame": { - "x": 358, - "y": 112, - "w": 16, - "h": 24 + "x": 156, + "y": 303, + "w": 23, + "h": 23 } }, { @@ -3468,14 +2775,14 @@ "h": 23 }, "frame": { - "x": 374, - "y": 109, + "x": 88, + "y": 336, "w": 22, "h": 23 } }, { - "filename": "normal_tera_shard", + "filename": "scope_lens", "rotated": false, "trimmed": true, "sourceSize": { @@ -3483,57 +2790,36 @@ "h": 32 }, "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 - }, - "frame": { - "x": 396, - "y": 109, - "w": 22, - "h": 23 - } - }, - { - "filename": "zinc", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 4, - "w": 16, - "h": 24 - }, - "frame": { - "x": 107, - "y": 182, - "w": 16, - "h": 24 - } - }, - { - "filename": "hyper_potion", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, + "x": 4, "y": 5, - "w": 17, + "w": 24, "h": 23 }, "frame": { - "x": 108, - "y": 206, - "w": 17, + "x": 110, + "y": 331, + "w": 24, + "h": 23 + } + }, + { + "filename": "twisted_spoon", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 24, + "h": 23 + }, + "frame": { + "x": 134, + "y": 326, + "w": 24, "h": 23 } }, @@ -3552,12 +2838,33 @@ "h": 23 }, "frame": { - "x": 108, - "y": 229, + "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, @@ -3573,8 +2880,8 @@ "h": 23 }, "frame": { - "x": 109, - "y": 252, + "x": 92, + "y": 374, "w": 21, "h": 23 } @@ -3594,12 +2901,54 @@ "h": 23 }, "frame": { - "x": 110, - "y": 275, + "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, @@ -3615,12 +2964,54 @@ "h": 23 }, "frame": { - "x": 115, - "y": 298, + "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, @@ -3636,12 +3027,96 @@ "h": 23 }, "frame": { - "x": 115, - "y": 321, + "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, @@ -3657,8 +3132,8 @@ "h": 23 }, "frame": { - "x": 116, - "y": 344, + "x": 175, + "y": 21, "w": 22, "h": 23 } @@ -3678,8 +3153,8 @@ "h": 23 }, "frame": { - "x": 116, - "y": 367, + "x": 197, + "y": 21, "w": 22, "h": 23 } @@ -3699,14 +3174,35 @@ "h": 23 }, "frame": { - "x": 111, - "y": 123, + "x": 219, + "y": 21, "w": 22, "h": 23 } }, { - "filename": "steel_tera_shard", + "filename": "rusted_sword", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 5, + "w": 23, + "h": 22 + }, + "frame": { + "x": 241, + "y": 21, + "w": 23, + "h": 22 + } + }, + { + "filename": "amulet_coin", "rotated": false, "trimmed": true, "sourceSize": { @@ -3715,19 +3211,19 @@ }, "spriteSourceSize": { "x": 6, - "y": 4, - "w": 22, - "h": 23 + "y": 5, + "w": 23, + "h": 21 }, "frame": { - "x": 111, - "y": 146, - "w": 22, - "h": 23 + "x": 264, + "y": 21, + "w": 23, + "h": 21 } }, { - "filename": "stellar_tera_shard", + "filename": "auspicious_armor", "rotated": false, "trimmed": true, "sourceSize": { @@ -3735,20 +3231,41 @@ "h": 32 }, "spriteSourceSize": { - "x": 6, - "y": 4, - "w": 22, - "h": 23 + "x": 4, + "y": 5, + "w": 23, + "h": 21 }, "frame": { - "x": 133, - "y": 124, - "w": 22, - "h": 23 + "x": 287, + "y": 21, + "w": 23, + "h": 21 } }, { - "filename": "water_tera_shard", + "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": { @@ -3756,16 +3273,16 @@ "h": 32 }, "spriteSourceSize": { - "x": 6, - "y": 4, + "x": 5, + "y": 5, "w": 22, - "h": 23 + "h": 22 }, "frame": { - "x": 155, - "y": 124, + "x": 332, + "y": 20, "w": 22, - "h": 23 + "h": 22 } }, { @@ -3783,8 +3300,8 @@ "h": 22 }, "frame": { - "x": 133, - "y": 147, + "x": 354, + "y": 20, "w": 22, "h": 22 } @@ -3804,12 +3321,159 @@ "h": 22 }, "frame": { - "x": 155, - "y": 147, + "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, @@ -3825,8 +3489,8 @@ "h": 23 }, "frame": { - "x": 177, - "y": 125, + "x": 181, + "y": 67, "w": 22, "h": 23 } @@ -3846,1247 +3510,8 @@ "h": 22 }, "frame": { - "x": 199, - "y": 125, - "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": 221, - "y": 125, - "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": 177, - "y": 148, - "w": 22, - "h": 21 - } - }, - { - "filename": "dna_splicers", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 199, - "y": 147, - "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": 221, - "y": 147, - "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": 243, - "y": 131, - "w": 22, - "h": 22 - } - }, - { - "filename": "moon_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 6, - "w": 23, - "h": 21 - }, - "frame": { - "x": 265, - "y": 134, - "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": 288, - "y": 134, - "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": 311, - "y": 134, - "w": 23, - "h": 21 - } - }, - { - "filename": "deep_sea_scale", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 20 - }, - "frame": { - "x": 243, - "y": 153, - "w": 22, - "h": 20 - } - }, - { - "filename": "mystic_ticket", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 7, - "w": 23, - "h": 19 - }, - "frame": { - "x": 265, - "y": 155, - "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": 288, - "y": 155, - "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": 311, - "y": 155, - "w": 23, - "h": 20 - } - }, - { - "filename": "electric_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 334, - "y": 136, - "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": 356, - "y": 136, - "w": 22, - "h": 22 - } - }, - { - "filename": "burn_drive", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 23, - "h": 17 - }, - "frame": { - "x": 334, - "y": 158, - "w": 23, - "h": 17 - } - }, - { - "filename": "fairy_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 378, - "y": 132, - "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": 400, - "y": 132, - "w": 22, - "h": 22 - } - }, - { - "filename": "chill_drive", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 23, - "h": 17 - }, - "frame": { - "x": 357, - "y": 158, - "w": 23, - "h": 17 - } - }, - { - "filename": "wellspring_mask", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 5, - "w": 23, - "h": 21 - }, - "frame": { - "x": 380, - "y": 154, - "w": 23, - "h": 21 - } - }, - { - "filename": "fire_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 403, - "y": 154, - "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": 123, - "y": 169, - "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": 145, - "y": 169, - "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": 167, - "y": 169, - "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": 189, - "y": 169, - "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": 211, - "y": 169, - "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": 233, - "y": 173, - "w": 23, - "h": 20 - } - }, - { - "filename": "dubious_disc", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 22, - "h": 19 - }, - "frame": { - "x": 256, - "y": 174, - "w": 22, - "h": 19 - } - }, - { - "filename": "fairy_feather", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 22, - "h": 20 - }, - "frame": { - "x": 278, - "y": 174, - "w": 22, - "h": 20 - } - }, - { - "filename": "guard_spec", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 300, - "y": 175, - "w": 22, - "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": 322, - "y": 175, - "w": 22, - "h": 22 - } - }, - { - "filename": "ice_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 344, - "y": 175, - "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": 366, - "y": 175, - "w": 22, - "h": 22 - } - }, - { - "filename": "leftovers", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 15, - "h": 22 - }, - "frame": { - "x": 388, - "y": 175, - "w": 15, - "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": 403, - "y": 176, - "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": 125, - "y": 191, - "w": 22, - "h": 22 - } - }, - { - "filename": "protector", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 147, - "y": 191, - "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": 169, - "y": 191, - "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": 191, - "y": 191, - "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": 213, - "y": 191, - "w": 20, - "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": 233, - "y": 193, - "w": 22, - "h": 21 - } - }, - { - "filename": "scroll_of_darkness", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 255, - "y": 193, - "w": 22, - "h": 22 - } - }, - { - "filename": "douse_drive", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 23, - "h": 17 - }, - "frame": { - "x": 277, - "y": 194, - "w": 23, - "h": 17 - } - }, - { - "filename": "relic_band", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 9, - "w": 17, - "h": 16 - }, - "frame": { - "x": 125, - "y": 213, - "w": 17, - "h": 16 - } - }, - { - "filename": "shock_drive", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 4, - "y": 8, - "w": 23, - "h": 17 - }, - "frame": { - "x": 142, - "y": 213, - "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": 165, - "y": 213, - "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": 188, - "y": 213, - "w": 22, - "h": 20 - } - }, - { - "filename": "scroll_of_waters", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 210, - "y": 213, - "w": 22, - "h": 22 - } - }, - { - "filename": "shed_shell", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 232, - "y": 214, - "w": 22, - "h": 22 - } - }, - { - "filename": "starf_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 254, - "y": 215, - "w": 22, - "h": 22 - } - }, - { - "filename": "steel_memory", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 300, - "y": 197, - "w": 22, - "h": 22 - } - }, - { - "filename": "thick_club", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 322, - "y": 197, - "w": 22, - "h": 22 - } - }, - { - "filename": "thunder_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 344, - "y": 197, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_bug", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 366, - "y": 197, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_dark", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 129, - "y": 230, - "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": 130, - "y": 252, - "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": 130, - "y": 275, - "w": 21, - "h": 23 - } - }, - { - "filename": "tm_dragon", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 151, - "y": 230, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_electric", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 151, - "y": 252, - "w": 22, - "h": 22 - } - }, - { - "filename": "tm_fairy", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 5, - "w": 22, - "h": 22 - }, - "frame": { - "x": 151, - "y": 274, + "x": 203, + "y": 67, "w": 22, "h": 22 } @@ -5106,12 +3531,54 @@ "h": 23 }, "frame": { - "x": 137, - "y": 298, + "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, @@ -5127,12 +3594,138 @@ "h": 23 }, "frame": { - "x": 137, - "y": 321, + "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, @@ -5148,12 +3741,1188 @@ "h": 23 }, "frame": { - "x": 138, - "y": 344, + "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 + } + }, + { + "filename": "quick_powder", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 24, + "h": 20 + }, + "frame": { + "x": 231, + "y": 175, + "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, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 6, + "w": 24, + "h": 20 + }, + "frame": { + "x": 223, + "y": 259, + "w": 24, + "h": 20 + } + }, + { + "filename": "sacred_ash", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 24, + "h": 20 + }, + "frame": { + "x": 247, + "y": 259, + "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, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 4, + "y": 7, + "w": 24, + "h": 20 + }, + "frame": { + "x": 245, + "y": 279, + "w": 24, + "h": 20 + } + }, + { + "filename": "shed_shell", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 201, + "y": 303, + "w": 22, + "h": 22 + } + }, + { + "filename": "starf_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 223, + "y": 301, + "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, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 201, + "y": 325, + "w": 22, + "h": 22 + } + }, + { + "filename": "thick_club", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 223, + "y": 323, + "w": 22, + "h": 22 + } + }, + { + "filename": "thunder_stone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 245, + "y": 319, + "w": 22, + "h": 22 + } + }, + { + "filename": "blue_orb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 271, + "y": 259, + "w": 20, + "h": 20 + } + }, + { + "filename": "tm_bug", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 269, + "y": 279, + "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, @@ -5169,8 +4938,8 @@ "h": 22 }, "frame": { - "x": 154, - "y": 296, + "x": 204, + "y": 347, "w": 19, "h": 22 } @@ -5190,14 +4959,203 @@ "h": 22 }, "frame": { - "x": 138, - "y": 367, + "x": 204, + "y": 369, "w": 19, "h": 22 } }, { - "filename": "sitrus_berry", + "filename": "tm_dark", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 223, + "y": 364, + "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, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 205, + "y": 406, + "w": 22, + "h": 22 + } + }, + { + "filename": "tm_electric", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 5, + "w": 22, + "h": 22 + }, + "frame": { + "x": 227, + "y": 406, + "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": { @@ -5206,14 +5164,98 @@ }, "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, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, "y": 5, - "w": 20, + "w": 22, "h": 22 }, "frame": { - "x": 155, - "y": 318, - "w": 20, + "x": 263, + "y": 61, + "w": 22, "h": 22 } }, @@ -5232,8 +5274,8 @@ "h": 22 }, "frame": { - "x": 155, - "y": 340, + "x": 263, + "y": 83, "w": 22, "h": 22 } @@ -5253,75 +5295,12 @@ "h": 22 }, "frame": { - "x": 157, - "y": 362, + "x": 263, + "y": 105, "w": 22, "h": 22 } }, - { - "filename": "relic_gold", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 9, - "y": 11, - "w": 15, - "h": 11 - }, - "frame": { - "x": 173, - "y": 230, - "w": 15, - "h": 11 - } - }, - { - "filename": "metronome", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 5, - "w": 17, - "h": 22 - }, - "frame": { - "x": 173, - "y": 241, - "w": 17, - "h": 22 - } - }, - { - "filename": "soothe_bell", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 5, - "w": 17, - "h": 22 - }, - "frame": { - "x": 173, - "y": 263, - "w": 17, - "h": 22 - } - }, { "filename": "tm_flying", "rotated": false, @@ -5337,14 +5316,14 @@ "h": 22 }, "frame": { - "x": 173, - "y": 285, + "x": 263, + "y": 127, "w": 22, "h": 22 } }, { - "filename": "dawn_stone", + "filename": "pair_of_tickets", "rotated": false, "trimmed": true, "sourceSize": { @@ -5352,121 +5331,16 @@ "h": 32 }, "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 21 + "x": 4, + "y": 7, + "w": 23, + "h": 19 }, "frame": { - "x": 190, - "y": 233, - "w": 20, - "h": 21 - } - }, - { - "filename": "sweet_apple", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 21 - }, - "frame": { - "x": 210, - "y": 235, - "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": 232, - "y": 236, - "w": 22, - "h": 21 - } - }, - { - "filename": "gb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 190, - "y": 254, - "w": 20, - "h": 20 - } - }, - { - "filename": "tart_apple", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 22, - "h": 21 - }, - "frame": { - "x": 254, - "y": 237, - "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": 210, - "y": 256, - "w": 22, - "h": 20 + "x": 287, + "y": 42, + "w": 23, + "h": 19 } }, { @@ -5484,8 +5358,8 @@ "h": 22 }, "frame": { - "x": 232, - "y": 257, + "x": 285, + "y": 61, "w": 22, "h": 22 } @@ -5505,8 +5379,8 @@ "h": 22 }, "frame": { - "x": 254, - "y": 258, + "x": 285, + "y": 83, "w": 22, "h": 22 } @@ -5526,8 +5400,8 @@ "h": 22 }, "frame": { - "x": 175, - "y": 307, + "x": 285, + "y": 105, "w": 22, "h": 22 } @@ -5547,12 +5421,96 @@ "h": 22 }, "frame": { - "x": 177, - "y": 329, + "x": 285, + "y": 127, "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, @@ -5568,8 +5526,8 @@ "h": 22 }, "frame": { - "x": 179, - "y": 351, + "x": 399, + "y": 42, "w": 22, "h": 22 } @@ -5589,8 +5547,8 @@ "h": 22 }, "frame": { - "x": 179, - "y": 373, + "x": 307, + "y": 62, "w": 22, "h": 22 } @@ -5610,138 +5568,12 @@ "h": 22 }, "frame": { - "x": 157, - "y": 384, + "x": 307, + "y": 84, "w": 22, "h": 22 } }, - { - "filename": "upgrade", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 22, - "h": 19 - }, - "frame": { - "x": 109, - "y": 406, - "w": 22, - "h": 19 - } - }, - { - "filename": "metal_alloy", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 7, - "w": 21, - "h": 19 - }, - "frame": { - "x": 131, - "y": 406, - "w": 21, - "h": 19 - } - }, - { - "filename": "lum_berry", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 7, - "w": 20, - "h": 19 - }, - "frame": { - "x": 152, - "y": 406, - "w": 20, - "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": 172, - "y": 406, - "w": 20, - "h": 19 - } - }, - { - "filename": "absolite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 116, - "y": 390, - "w": 16, - "h": 16 - } - }, - { - "filename": "aerodactylite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 132, - "y": 390, - "w": 16, - "h": 16 - } - }, { "filename": "tm_rock", "rotated": false, @@ -5757,8 +5589,8 @@ "h": 22 }, "frame": { - "x": 388, - "y": 198, + "x": 307, + "y": 106, "w": 22, "h": 22 } @@ -5778,8 +5610,8 @@ "h": 22 }, "frame": { - "x": 277, - "y": 211, + "x": 307, + "y": 128, "w": 22, "h": 22 } @@ -5799,8 +5631,8 @@ "h": 22 }, "frame": { - "x": 276, - "y": 233, + "x": 329, + "y": 63, "w": 22, "h": 22 } @@ -5820,8 +5652,8 @@ "h": 22 }, "frame": { - "x": 276, - "y": 255, + "x": 329, + "y": 85, "w": 22, "h": 22 } @@ -5841,8 +5673,8 @@ "h": 22 }, "frame": { - "x": 299, - "y": 219, + "x": 351, + "y": 63, "w": 22, "h": 22 } @@ -5862,8 +5694,8 @@ "h": 22 }, "frame": { - "x": 321, - "y": 219, + "x": 329, + "y": 107, "w": 22, "h": 22 } @@ -5883,8 +5715,8 @@ "h": 22 }, "frame": { - "x": 343, - "y": 219, + "x": 351, + "y": 85, "w": 22, "h": 22 } @@ -5904,8 +5736,8 @@ "h": 22 }, "frame": { - "x": 365, - "y": 219, + "x": 373, + "y": 63, "w": 22, "h": 22 } @@ -5925,8 +5757,8 @@ "h": 22 }, "frame": { - "x": 298, - "y": 241, + "x": 351, + "y": 107, "w": 22, "h": 22 } @@ -5946,8 +5778,8 @@ "h": 22 }, "frame": { - "x": 320, - "y": 241, + "x": 373, + "y": 85, "w": 22, "h": 22 } @@ -5967,33 +5799,12 @@ "h": 22 }, "frame": { - "x": 342, - "y": 241, + "x": 373, + "y": 107, "w": 22, "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": 364, - "y": 241, - "w": 21, - "h": 21 - } - }, { "filename": "poison_barb", "rotated": false, @@ -6009,33 +5820,12 @@ "h": 21 }, "frame": { - "x": 387, - "y": 220, + "x": 329, + "y": 129, "w": 21, "h": 21 } }, - { - "filename": "golden_egg", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 17, - "h": 20 - }, - "frame": { - "x": 408, - "y": 220, - "w": 17, - "h": 20 - } - }, { "filename": "shiny_stone", "rotated": false, @@ -6051,14 +5841,77 @@ "h": 21 }, "frame": { - "x": 385, - "y": 241, + "x": 350, + "y": 129, "w": 21, "h": 21 } }, { - "filename": "quick_claw", + "filename": "tera_orb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 22, + "h": 20 + }, + "frame": { + "x": 371, + "y": 129, + "w": 22, + "h": 20 + } + }, + { + "filename": "sitrus_berry", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 5, + "w": 20, + "h": 22 + }, + "frame": { + "x": 395, + "y": 64, + "w": 20, + "h": 22 + } + }, + { + "filename": "zoom_lens", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 5, + "y": 6, + "w": 21, + "h": 21 + }, + "frame": { + "x": 395, + "y": 86, + "w": 21, + "h": 21 + } + }, + { + "filename": "gb", "rotated": false, "trimmed": true, "sourceSize": { @@ -6068,14 +5921,140 @@ "spriteSourceSize": { "x": 6, "y": 6, - "w": 19, - "h": 21 + "w": 20, + "h": 20 }, "frame": { - "x": 406, - "y": 241, - "w": 19, - "h": 21 + "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 } }, { @@ -6093,12 +6072,54 @@ "h": 18 }, "frame": { - "x": 298, - "y": 263, + "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, @@ -6114,117 +6135,12 @@ "h": 18 }, "frame": { - "x": 319, - "y": 263, + "x": 356, + "y": 168, "w": 21, "h": 18 } }, - { - "filename": "unremarkable_teacup", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 7, - "w": 21, - "h": 18 - }, - "frame": { - "x": 340, - "y": 263, - "w": 21, - "h": 18 - } - }, - { - "filename": "zoom_lens", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 5, - "y": 6, - "w": 21, - "h": 21 - }, - "frame": { - "x": 276, - "y": 277, - "w": 21, - "h": 21 - } - }, - { - "filename": "everstone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 17 - }, - "frame": { - "x": 297, - "y": 281, - "w": 20, - "h": 17 - } - }, - { - "filename": "magnet", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 317, - "y": 281, - "w": 20, - "h": 20 - } - }, - { - "filename": "mb", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 20, - "h": 20 - }, - "frame": { - "x": 337, - "y": 281, - "w": 20, - "h": 20 - } - }, { "filename": "candy_jar", "rotated": false, @@ -6240,14 +6156,77 @@ "h": 20 }, "frame": { - "x": 357, - "y": 281, + "x": 378, + "y": 149, "w": 19, "h": 20 } }, { - "filename": "baton", + "filename": "everstone", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 17 + }, + "frame": { + "x": 377, + "y": 169, + "w": 20, + "h": 17 + } + }, + { + "filename": "golden_egg", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 6, + "w": 17, + "h": 20 + }, + "frame": { + "x": 393, + "y": 129, + "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": 410, + "y": 127, + "w": 18, + "h": 20 + } + }, + { + "filename": "oval_stone", "rotated": false, "trimmed": true, "sourceSize": { @@ -6258,15 +6237,99 @@ "x": 7, "y": 7, "w": 18, + "h": 19 + }, + "frame": { + "x": 410, + "y": 147, + "w": 18, + "h": 19 + } + }, + { + "filename": "magnet", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 397, + "y": 166, + "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": 361, - "y": 263, - "w": 18, + "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, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 333, + "y": 186, + "w": 20, + "h": 20 + } + }, { "filename": "pb", "rotated": false, @@ -6282,8 +6345,8 @@ "h": 20 }, "frame": { - "x": 379, - "y": 262, + "x": 353, + "y": 186, "w": 20, "h": 20 } @@ -6303,33 +6366,12 @@ "h": 20 }, "frame": { - "x": 399, - "y": 262, + "x": 373, + "y": 186, "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": 376, - "y": 282, - "w": 20, - "h": 19 - } - }, { "filename": "rb", "rotated": false, @@ -6345,8 +6387,71 @@ "h": 20 }, "frame": { - "x": 396, - "y": 282, + "x": 393, + "y": 186, + "w": 20, + "h": 20 + } + }, + { + "filename": "eviolite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 15, + "h": 15 + }, + "frame": { + "x": 413, + "y": 186, + "w": 15, + "h": 15 + } + }, + { + "filename": "prism_scale", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 9, + "y": 8, + "w": 15, + "h": 15 + }, + "frame": { + "x": 413, + "y": 201, + "w": 15, + "h": 15 + } + }, + { + "filename": "smooth_meteorite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 7, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 289, + "y": 204, "w": 20, "h": 20 } @@ -6366,14 +6471,14 @@ "h": 21 }, "frame": { - "x": 192, - "y": 395, + "x": 289, + "y": 224, "w": 19, "h": 21 } }, { - "filename": "smooth_meteorite", + "filename": "power_herb", "rotated": false, "trimmed": true, "sourceSize": { @@ -6381,16 +6486,16 @@ "h": 32 }, "spriteSourceSize": { - "x": 7, - "y": 6, + "x": 6, + "y": 7, "w": 20, - "h": 20 + "h": 19 }, "frame": { - "x": 211, - "y": 276, + "x": 309, + "y": 205, "w": 20, - "h": 20 + "h": 19 } }, { @@ -6408,12 +6513,33 @@ "h": 20 }, "frame": { - "x": 231, - "y": 279, + "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, @@ -6429,14 +6555,14 @@ "h": 20 }, "frame": { - "x": 251, - "y": 280, + "x": 349, + "y": 206, "w": 20, "h": 20 } }, { - "filename": "mystery_egg", + "filename": "hard_stone", "rotated": false, "trimmed": true, "sourceSize": { @@ -6444,16 +6570,16 @@ "h": 32 }, "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 18 + "x": 6, + "y": 6, + "w": 19, + "h": 20 }, "frame": { - "x": 195, - "y": 276, - "w": 16, - "h": 18 + "x": 369, + "y": 206, + "w": 19, + "h": 20 } }, { @@ -6471,8 +6597,8 @@ "h": 19 }, "frame": { - "x": 211, - "y": 296, + "x": 388, + "y": 206, "w": 20, "h": 19 } @@ -6492,54 +6618,12 @@ "h": 18 }, "frame": { - "x": 231, - "y": 299, + "x": 408, + "y": 216, "w": 20, "h": 18 } }, - { - "filename": "wl_antidote", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 251, - "y": 300, - "w": 20, - "h": 18 - } - }, - { - "filename": "hard_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 6, - "w": 19, - "h": 20 - }, - "frame": { - "x": 271, - "y": 298, - "w": 19, - "h": 20 - } - }, { "filename": "miracle_seed", "rotated": false, @@ -6555,12 +6639,33 @@ "h": 19 }, "frame": { - "x": 290, - "y": 298, + "x": 328, + "y": 225, "w": 19, "h": 19 } }, + { + "filename": "wl_antidote", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 8, + "w": 20, + "h": 18 + }, + "frame": { + "x": 347, + "y": 226, + "w": 20, + "h": 18 + } + }, { "filename": "wl_awakening", "rotated": false, @@ -6576,8 +6681,8 @@ "h": 18 }, "frame": { - "x": 309, - "y": 301, + "x": 367, + "y": 226, "w": 20, "h": 18 } @@ -6597,8 +6702,8 @@ "h": 18 }, "frame": { - "x": 329, - "y": 301, + "x": 388, + "y": 225, "w": 20, "h": 18 } @@ -6618,12 +6723,33 @@ "h": 18 }, "frame": { - "x": 349, - "y": 301, + "x": 408, + "y": 234, "w": 20, "h": 18 } }, + { + "filename": "soothe_bell", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 5, + "w": 17, + "h": 22 + }, + "frame": { + "x": 291, + "y": 245, + "w": 17, + "h": 22 + } + }, { "filename": "wl_custom_thief", "rotated": false, @@ -6639,8 +6765,8 @@ "h": 18 }, "frame": { - "x": 369, - "y": 301, + "x": 308, + "y": 244, "w": 20, "h": 18 } @@ -6660,54 +6786,12 @@ "h": 18 }, "frame": { - "x": 389, - "y": 302, + "x": 328, + "y": 244, "w": 20, "h": 18 } }, - { - "filename": "aggronite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 409, - "y": 302, - "w": 16, - "h": 16 - } - }, - { - "filename": "alakazite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 409, - "y": 318, - "w": 16, - "h": 16 - } - }, { "filename": "wl_ether", "rotated": false, @@ -6723,12 +6807,33 @@ "h": 18 }, "frame": { - "x": 211, - "y": 315, + "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, @@ -6744,8 +6849,8 @@ "h": 18 }, "frame": { - "x": 231, - "y": 317, + "x": 308, + "y": 262, "w": 20, "h": 18 } @@ -6765,8 +6870,8 @@ "h": 18 }, "frame": { - "x": 251, - "y": 318, + "x": 328, + "y": 262, "w": 20, "h": 18 } @@ -6786,33 +6891,12 @@ "h": 18 }, "frame": { - "x": 271, - "y": 318, + "x": 348, + "y": 262, "w": 20, "h": 18 } }, - { - "filename": "oval_stone", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 7, - "w": 18, - "h": 19 - }, - "frame": { - "x": 291, - "y": 317, - "w": 18, - "h": 19 - } - }, { "filename": "wl_hyper_potion", "rotated": false, @@ -6828,8 +6912,8 @@ "h": 18 }, "frame": { - "x": 309, - "y": 319, + "x": 368, + "y": 244, "w": 20, "h": 18 } @@ -6849,8 +6933,8 @@ "h": 18 }, "frame": { - "x": 329, - "y": 319, + "x": 388, + "y": 243, "w": 20, "h": 18 } @@ -6870,8 +6954,8 @@ "h": 18 }, "frame": { - "x": 349, - "y": 319, + "x": 408, + "y": 252, "w": 20, "h": 18 } @@ -6891,8 +6975,8 @@ "h": 18 }, "frame": { - "x": 369, - "y": 319, + "x": 368, + "y": 262, "w": 20, "h": 18 } @@ -6912,33 +6996,12 @@ "h": 18 }, "frame": { - "x": 389, - "y": 320, + "x": 388, + "y": 261, "w": 20, "h": 18 } }, - { - "filename": "altarianite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 409, - "y": 334, - "w": 16, - "h": 16 - } - }, { "filename": "wl_max_ether", "rotated": false, @@ -6954,197 +7017,8 @@ "h": 18 }, "frame": { - "x": 199, - "y": 333, - "w": 20, - "h": 18 - } - }, - { - "filename": "razor_fang", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 7, - "y": 6, - "w": 18, - "h": 20 - }, - "frame": { - "x": 201, - "y": 351, - "w": 18, - "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": 201, - "y": 371, - "w": 17, - "h": 20 - } - }, - { - "filename": "wl_max_potion", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 219, - "y": 335, - "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": 219, - "y": 353, - "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": 218, - "y": 371, - "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": 239, - "y": 336, - "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": 259, - "y": 336, - "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": 279, - "y": 336, - "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": 239, - "y": 354, + "x": 408, + "y": 270, "w": 20, "h": 18 } @@ -7164,8 +7038,8 @@ "h": 18 }, "frame": { - "x": 259, - "y": 354, + "x": 291, + "y": 287, "w": 18, "h": 18 } @@ -7185,12 +7059,159 @@ "h": 18 }, "frame": { - "x": 277, - "y": 354, + "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 + } + }, { "filename": "flame_orb", "rotated": false, @@ -7206,8 +7227,8 @@ "h": 18 }, "frame": { - "x": 238, - "y": 372, + "x": 329, + "y": 280, "w": 18, "h": 18 } @@ -7227,8 +7248,8 @@ "h": 18 }, "frame": { - "x": 256, - "y": 372, + "x": 329, + "y": 298, "w": 18, "h": 18 } @@ -7248,8 +7269,8 @@ "h": 18 }, "frame": { - "x": 274, - "y": 372, + "x": 347, + "y": 280, "w": 18, "h": 18 } @@ -7269,12 +7290,75 @@ "h": 18 }, "frame": { - "x": 299, - "y": 337, + "x": 347, + "y": 298, "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, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 310, + "y": 316, + "w": 16, + "h": 16 + } + }, { "filename": "ampharosite", "rotated": false, @@ -7290,8 +7374,8 @@ "h": 16 }, "frame": { - "x": 317, - "y": 337, + "x": 310, + "y": 332, "w": 16, "h": 16 } @@ -7311,8 +7395,8 @@ "h": 16 }, "frame": { - "x": 333, - "y": 337, + "x": 326, + "y": 316, "w": 16, "h": 16 } @@ -7332,8 +7416,8 @@ "h": 16 }, "frame": { - "x": 349, - "y": 337, + "x": 310, + "y": 348, "w": 16, "h": 16 } @@ -7353,8 +7437,8 @@ "h": 16 }, "frame": { - "x": 365, - "y": 337, + "x": 326, + "y": 332, "w": 16, "h": 16 } @@ -7374,8 +7458,8 @@ "h": 16 }, "frame": { - "x": 295, - "y": 355, + "x": 342, + "y": 316, "w": 16, "h": 16 } @@ -7395,8 +7479,8 @@ "h": 16 }, "frame": { - "x": 381, - "y": 338, + "x": 326, + "y": 348, "w": 16, "h": 16 } @@ -7416,8 +7500,8 @@ "h": 16 }, "frame": { - "x": 311, - "y": 355, + "x": 342, + "y": 332, "w": 16, "h": 16 } @@ -7437,8 +7521,8 @@ "h": 16 }, "frame": { - "x": 327, - "y": 353, + "x": 342, + "y": 348, "w": 16, "h": 16 } @@ -7458,8 +7542,8 @@ "h": 16 }, "frame": { - "x": 343, - "y": 353, + "x": 381, + "y": 280, "w": 16, "h": 16 } @@ -7479,8 +7563,8 @@ "h": 16 }, "frame": { - "x": 359, - "y": 353, + "x": 381, + "y": 296, "w": 16, "h": 16 } @@ -7500,8 +7584,8 @@ "h": 16 }, "frame": { - "x": 375, - "y": 354, + "x": 358, + "y": 316, "w": 16, "h": 16 } @@ -7521,8 +7605,8 @@ "h": 16 }, "frame": { - "x": 391, - "y": 354, + "x": 358, + "y": 332, "w": 16, "h": 16 } @@ -7542,8 +7626,8 @@ "h": 16 }, "frame": { - "x": 407, - "y": 350, + "x": 358, + "y": 348, "w": 16, "h": 16 } @@ -7563,8 +7647,8 @@ "h": 16 }, "frame": { - "x": 407, - "y": 366, + "x": 397, + "y": 288, "w": 16, "h": 16 } @@ -7584,8 +7668,8 @@ "h": 16 }, "frame": { - "x": 211, - "y": 391, + "x": 397, + "y": 304, "w": 16, "h": 16 } @@ -7605,8 +7689,8 @@ "h": 16 }, "frame": { - "x": 211, - "y": 407, + "x": 381, + "y": 312, "w": 16, "h": 16 } @@ -7626,8 +7710,8 @@ "h": 16 }, "frame": { - "x": 227, - "y": 390, + "x": 374, + "y": 328, "w": 16, "h": 16 } @@ -7647,8 +7731,8 @@ "h": 16 }, "frame": { - "x": 227, - "y": 406, + "x": 374, + "y": 344, "w": 16, "h": 16 } @@ -7668,8 +7752,8 @@ "h": 16 }, "frame": { - "x": 243, - "y": 390, + "x": 397, + "y": 320, "w": 16, "h": 16 } @@ -7689,8 +7773,8 @@ "h": 16 }, "frame": { - "x": 243, - "y": 406, + "x": 390, + "y": 336, "w": 16, "h": 16 } @@ -7710,8 +7794,8 @@ "h": 16 }, "frame": { - "x": 259, - "y": 390, + "x": 390, + "y": 352, "w": 16, "h": 16 } @@ -7731,8 +7815,8 @@ "h": 16 }, "frame": { - "x": 259, - "y": 406, + "x": 374, + "y": 360, "w": 16, "h": 16 } @@ -7752,8 +7836,8 @@ "h": 16 }, "frame": { - "x": 275, - "y": 390, + "x": 390, + "y": 368, "w": 16, "h": 16 } @@ -7773,8 +7857,8 @@ "h": 16 }, "frame": { - "x": 275, - "y": 406, + "x": 406, + "y": 336, "w": 16, "h": 16 } @@ -7794,8 +7878,8 @@ "h": 16 }, "frame": { - "x": 292, - "y": 372, + "x": 406, + "y": 352, "w": 16, "h": 16 } @@ -7815,8 +7899,8 @@ "h": 16 }, "frame": { - "x": 308, - "y": 371, + "x": 406, + "y": 368, "w": 16, "h": 16 } @@ -7836,8 +7920,8 @@ "h": 16 }, "frame": { - "x": 324, - "y": 371, + "x": 311, + "y": 364, "w": 16, "h": 16 } @@ -7857,8 +7941,8 @@ "h": 16 }, "frame": { - "x": 340, - "y": 369, + "x": 327, + "y": 364, "w": 16, "h": 16 } @@ -7878,8 +7962,8 @@ "h": 16 }, "frame": { - "x": 356, - "y": 369, + "x": 311, + "y": 380, "w": 16, "h": 16 } @@ -7899,8 +7983,8 @@ "h": 16 }, "frame": { - "x": 372, - "y": 370, + "x": 343, + "y": 364, "w": 16, "h": 16 } @@ -7920,8 +8004,8 @@ "h": 16 }, "frame": { - "x": 388, - "y": 370, + "x": 311, + "y": 396, "w": 16, "h": 16 } @@ -7941,8 +8025,8 @@ "h": 16 }, "frame": { - "x": 292, - "y": 388, + "x": 311, + "y": 412, "w": 16, "h": 16 } @@ -7962,8 +8046,8 @@ "h": 16 }, "frame": { - "x": 308, - "y": 387, + "x": 327, + "y": 380, "w": 16, "h": 16 } @@ -7983,8 +8067,8 @@ "h": 16 }, "frame": { - "x": 324, - "y": 387, + "x": 327, + "y": 396, "w": 16, "h": 16 } @@ -8004,8 +8088,8 @@ "h": 16 }, "frame": { - "x": 340, - "y": 385, + "x": 327, + "y": 412, "w": 16, "h": 16 } @@ -8025,8 +8109,8 @@ "h": 16 }, "frame": { - "x": 356, - "y": 385, + "x": 343, + "y": 380, "w": 16, "h": 16 } @@ -8046,8 +8130,8 @@ "h": 16 }, "frame": { - "x": 291, - "y": 404, + "x": 343, + "y": 396, "w": 16, "h": 16 } @@ -8067,8 +8151,8 @@ "h": 16 }, "frame": { - "x": 372, - "y": 386, + "x": 343, + "y": 412, "w": 16, "h": 16 } @@ -8088,8 +8172,8 @@ "h": 16 }, "frame": { - "x": 388, - "y": 386, + "x": 359, + "y": 376, "w": 16, "h": 16 } @@ -8109,8 +8193,8 @@ "h": 16 }, "frame": { - "x": 404, - "y": 382, + "x": 359, + "y": 392, "w": 16, "h": 16 } @@ -8130,8 +8214,8 @@ "h": 16 }, "frame": { - "x": 404, - "y": 398, + "x": 359, + "y": 408, "w": 16, "h": 16 } @@ -8151,8 +8235,8 @@ "h": 16 }, "frame": { - "x": 340, - "y": 401, + "x": 375, + "y": 384, "w": 16, "h": 16 } @@ -8172,8 +8256,8 @@ "h": 16 }, "frame": { - "x": 356, - "y": 401, + "x": 375, + "y": 400, "w": 16, "h": 16 } @@ -8193,8 +8277,8 @@ "h": 16 }, "frame": { - "x": 372, - "y": 402, + "x": 391, + "y": 384, "w": 16, "h": 16 } @@ -8214,8 +8298,8 @@ "h": 16 }, "frame": { - "x": 388, - "y": 402, + "x": 391, + "y": 400, "w": 16, "h": 16 } @@ -8226,6 +8310,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:4669e332ee400e355936594c14e7221c:1a1f5a801c94e8eb8589e13bc50105a1:110e074689c9edd2c54833ce2e4d9270$" + "smartupdate": "$TexturePacker:SmartUpdate:ae06b70c6800597c7ac11beefc1d8aad:b9f30512e12737247c8cb2691252baac:110e074689c9edd2c54833ce2e4d9270$" } } diff --git a/public/images/items.png b/public/images/items.png index 9de02d9e0e95643ae8f183cbaf08f9e55acbbe6c..a031b00ceb0af308f89835efab44d95fc6237b42 100644 GIT binary patch literal 57799 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⪙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 E1JgBQu>b%7 literal 56828 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 nRA*pg-6VRbq!a^DJKgGXoru- mt.newModifier(enemyPokemon).add(this.enemyModifiers, false, this)); } - if (isBoss) { - count = Math.max(count, Math.floor(chances / 2)); - } - getEnemyModifierTypesForWave(difficultyWaveIndex, count, [ enemyPokemon ], this.currentBattle.battleType === BattleType.TRAINER ? ModifierPoolType.TRAINER : ModifierPoolType.WILD, upgradeChance) - .map(mt => mt.newModifier(enemyPokemon).add(this.enemyModifiers, false, this)); - return true; }); this.updateModifiers(false).then(() => resolve()); @@ -2786,7 +2785,7 @@ export default class BattleScene extends SceneBase { } // Check for queued encounters first - if (!encounter && this.mysteryEncounterData?.nextEncounterQueue?.length > 0) { + if (!encounter && this.mysteryEncounterData?.nextEncounterQueue && this.mysteryEncounterData.nextEncounterQueue.length > 0) { let i = 0; while (i < this.mysteryEncounterData.nextEncounterQueue.length && !!encounter) { const candidate = this.mysteryEncounterData.nextEncounterQueue[i]; @@ -2801,7 +2800,7 @@ export default class BattleScene extends SceneBase { if (encounter) { encounter = new MysteryEncounter(encounter); - encounter.populateDialogueTokensFromRequirements!(this); + encounter.populateDialogueTokensFromRequirements(this); return encounter; } diff --git a/src/data/battle-anims.ts b/src/data/battle-anims.ts index 4dbab6666f0..9f5b85801fe 100644 --- a/src/data/battle-anims.ts +++ b/src/data/battle-anims.ts @@ -440,7 +440,7 @@ class AnimTimedAddBgEvent extends AnimTimedBgEvent { scene.field.add(moveAnim.bgSprite); const fieldPokemon = scene.getEnemyPokemon() || scene.getPlayerPokemon(); if (!isNullOrUndefined(priority)) { - scene.field.moveTo(moveAnim.bgSprite as Phaser.GameObjects.GameObject, priority); + scene.field.moveTo(moveAnim.bgSprite as Phaser.GameObjects.GameObject, priority!); } else if (fieldPokemon?.isOnField()) { scene.field.moveBelow(moveAnim.bgSprite as Phaser.GameObjects.GameObject, fieldPokemon); } @@ -540,7 +540,7 @@ export function initMoveAnim(scene: BattleScene, move: Moves): Promise { export async function initEncounterAnims(scene: BattleScene, encounterAnim: EncounterAnim | EncounterAnim[]): Promise { const anims = Array.isArray(encounterAnim) ? encounterAnim : [encounterAnim]; const encounterAnimNames = Utils.getEnumKeys(EncounterAnim); - const encounterAnimFetches = []; + const encounterAnimFetches: Promise>[] = []; for (const anim of anims) { if (encounterAnims.has(anim) && !isNullOrUndefined(encounterAnims.get(anim))) { continue; @@ -806,7 +806,7 @@ export abstract class BattleAnim { play(scene: BattleScene, callback?: Function) { const isOppAnim = this.isOppAnim(); const user = !isOppAnim ? this.user! : this.target!; // TODO: are those bangs correct? - const target = !isOppAnim ? this.target : this.user; + const target = !isOppAnim ? this.target! : this.user!; if (!target?.isOnField() && !this.playOnEmptyField) { if (callback) { @@ -1052,7 +1052,7 @@ export abstract class BattleAnim { y += targetInitialY; const angle = -frame.angle; const key = frame.target === AnimFrameTarget.GRAPHIC ? g++ : frame.target === AnimFrameTarget.USER ? u++ : t++; - ret.get(frame.target).set(key, { x: x, y: y, scaleX: scaleX, scaleY: scaleY, angle: angle }); + ret.get(frame.target)?.set(key, { x: x, y: y, scaleX: scaleX, scaleY: scaleY, angle: angle }); } return ret; @@ -1102,17 +1102,17 @@ export abstract class BattleAnim { this.srcLine = [ userFocusX, userFocusY, targetFocusX, targetFocusY ]; this.dstLine = [ 150, 75, targetInitialX, targetInitialY ]; - let r = anim.frames.length; + let r = anim!.frames.length; let f = 0; const existingFieldSprites = [...scene.field.getAll()]; scene.tweens.addCounter({ duration: Utils.getFrameMs(3) * frameTimeMult, - repeat: anim.frames.length, + repeat: anim!.frames.length, onRepeat: () => { - const spriteFrames = anim.frames[f]; - const frameData = this.getGraphicFrameDataWithoutTarget(anim.frames[f], targetInitialX, targetInitialY); + const spriteFrames = anim!.frames[f]; + const frameData = this.getGraphicFrameDataWithoutTarget(anim!.frames[f], targetInitialX, targetInitialY); const u = 0; const t = 0; let g = 0; @@ -1124,7 +1124,7 @@ export abstract class BattleAnim { const sprites = spriteCache[AnimFrameTarget.GRAPHIC]; if (g === sprites.length) { - const newSprite: Phaser.GameObjects.Sprite = scene.addFieldSprite(0, 0, anim.graphic, 1); + const newSprite: Phaser.GameObjects.Sprite = scene.addFieldSprite(0, 0, anim!.graphic, 1); sprites.push(newSprite); scene.field.add(newSprite); spritePriorities.push(1); @@ -1147,17 +1147,19 @@ export abstract class BattleAnim { } moveSprite.setFrame(frame.graphicFrame); - const graphicFrameData = frameData.get(frame.target).get(graphicIndex); - moveSprite.setPosition(graphicFrameData.x, graphicFrameData.y); - moveSprite.setAngle(graphicFrameData.angle); - moveSprite.setScale(graphicFrameData.scaleX, graphicFrameData.scaleY); + const graphicFrameData = frameData.get(frame.target)?.get(graphicIndex); + if (graphicFrameData) { + moveSprite.setPosition(graphicFrameData.x, graphicFrameData.y); + moveSprite.setAngle(graphicFrameData.angle); + moveSprite.setScale(graphicFrameData.scaleX, graphicFrameData.scaleY); - moveSprite.setAlpha(frame.opacity / 255); - moveSprite.setVisible(frame.visible); - moveSprite.setBlendMode(frame.blendType === AnimBlendType.NORMAL ? Phaser.BlendModes.NORMAL : frame.blendType === AnimBlendType.ADD ? Phaser.BlendModes.ADD : Phaser.BlendModes.DIFFERENCE); + moveSprite.setAlpha(frame.opacity / 255); + moveSprite.setVisible(frame.visible); + moveSprite.setBlendMode(frame.blendType === AnimBlendType.NORMAL ? Phaser.BlendModes.NORMAL : frame.blendType === AnimBlendType.ADD ? Phaser.BlendModes.ADD : Phaser.BlendModes.DIFFERENCE); + } } - if (anim.frameTimedEvents.has(f)) { - for (const event of anim.frameTimedEvents.get(f)) { + if (anim?.frameTimedEvents.get(f)) { + for (const event of anim.frameTimedEvents.get(f)!) { r = Math.max((anim.frames.length - f) + event.execute(scene, this, frameTimedEventPriority), r); } } @@ -1277,8 +1279,8 @@ export class EncounterBattleAnim extends BattleAnim { this.oppAnim = oppAnim ?? false; } - getAnim(): AnimConfig { - return encounterAnims.get(this.encounterAnim); + getAnim(): AnimConfig | null { + return encounterAnims.get(this.encounterAnim) ?? null; } isOppAnim(): boolean { diff --git a/src/data/egg.ts b/src/data/egg.ts index 9f5e8cb1edf..1406ff9d869 100644 --- a/src/data/egg.ts +++ b/src/data/egg.ts @@ -86,7 +86,7 @@ export class Egg { private _overrideHiddenAbility: boolean; - private _eventEggTypeDescriptor: string; + private _eventEggTypeDescriptor?: string; //// // #endregion @@ -186,7 +186,7 @@ export class Egg { this.addEggToGameData(eggOptions.scene!); // TODO: is this bang correct? } - this._eventEggTypeDescriptor = eggOptions.eventEggTypeDescriptor ?? null; + this._eventEggTypeDescriptor = eggOptions?.eventEggTypeDescriptor; } //// 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 d42d4051aa6..6cd0e8fe0ea 100644 --- a/src/data/mystery-encounters/encounters/a-trainers-test-encounter.ts +++ b/src/data/mystery-encounters/encounters/a-trainers-test-encounter.ts @@ -76,13 +76,13 @@ export const ATrainersTestEncounter: MysteryEncounter = text: `${namespace}.${trainerNameKey}.intro_dialogue` } ]; - encounter.options[0].dialogue.selected = [ + encounter.options[0].dialogue!.selected = [ { speaker: `trainerNames:${trainerNameKey}`, text: `${namespace}.${trainerNameKey}.accept` } ]; - encounter.options[1].dialogue.selected = [ + encounter.options[1].dialogue!.selected = [ { speaker: `trainerNames:${trainerNameKey}`, text: `${namespace}.${trainerNameKey}.decline` diff --git a/src/data/mystery-encounters/encounters/absolute-avarice-encounter.ts b/src/data/mystery-encounters/encounters/absolute-avarice-encounter.ts index 4cc3648beae..c8706d18d31 100644 --- a/src/data/mystery-encounters/encounters/absolute-avarice-encounter.ts +++ b/src/data/mystery-encounters/encounters/absolute-avarice-encounter.ts @@ -22,6 +22,7 @@ import { applyModifierTypeToPlayerPokemon, catchPokemon, getHighestLevelPlayerPo import { TrainerSlot } from "#app/data/trainer-config"; import { PokeballType } from "#app/data/pokeball"; import HeldModifierConfig from "#app/interfaces/held-modifier-config"; +import { BerryType } from "#enums/berry-type"; /** the i18n namespace for this encounter */ const namespace = "mysteryEncounter:absoluteAvarice"; @@ -39,8 +40,8 @@ export const AbsoluteAvariceEncounter: MysteryEncounter = .withIntroSpriteConfigs([ { // This sprite has the shadow - spriteKey: null, - fileRoot: null, + spriteKey: "", + fileRoot: "", species: Species.GREEDENT, hasShadow: true, alpha: 0.001, @@ -48,8 +49,8 @@ export const AbsoluteAvariceEncounter: MysteryEncounter = x: -5 }, { - spriteKey: null, - fileRoot: null, + spriteKey: "", + fileRoot: "", species: Species.GREEDENT, hasShadow: false, repeat: true, @@ -254,7 +255,7 @@ export const AbsoluteAvariceEncounter: MysteryEncounter = queueEncounterMessage(scene, `${namespace}.option.1.food_stash`); }; - setEncounterRewards(scene, { fillRemaining: true }, null, givePartyPokemonReviverSeeds); + setEncounterRewards(scene, { fillRemaining: true }, undefined, givePartyPokemonReviverSeeds); encounter.startOfBattleEffects.push({ sourceBattlerIndex: BattlerIndex.ENEMY, targets: [BattlerIndex.ENEMY], @@ -287,7 +288,7 @@ export const AbsoluteAvariceEncounter: MysteryEncounter = const party = scene.getParty(); party.forEach(pokemon => { const stolenBerries: BerryModifier[] = berryMap.get(pokemon.id); - const berryTypesAsArray = []; + const berryTypesAsArray: BerryType[] = []; stolenBerries?.forEach(bMod => berryTypesAsArray.push(...new Array(bMod.stackCount).fill(bMod.berryType))); const returnedBerryCount = Math.floor((berryTypesAsArray.length ?? 0) * 2 / 5); @@ -330,7 +331,7 @@ export const AbsoluteAvariceEncounter: MysteryEncounter = // Let it have the food // Greedent joins the team, level equal to 2 below highest party member const level = getHighestLevelPlayerPokemon(scene).level - 2; - const greedent = new EnemyPokemon(scene, getPokemonSpecies(Species.GREEDENT), level, TrainerSlot.NONE, false, null); + const greedent = new EnemyPokemon(scene, getPokemonSpecies(Species.GREEDENT), level, TrainerSlot.NONE, false); greedent.moveset = [new PokemonMove(Moves.THRASH), new PokemonMove(Moves.BODY_PRESS), new PokemonMove(Moves.STUFF_CHEEKS), new PokemonMove(Moves.SLACK_OFF)]; greedent.passive = true; @@ -346,7 +347,7 @@ function doGreedentSpriteSteal(scene: BattleScene) { const shakeDelay = 50; const slideDelay = 500; - const greedentSprites = scene.currentBattle.mysteryEncounter.introVisuals.getSpriteAtIndex(1); + const greedentSprites = scene.currentBattle.mysteryEncounter.introVisuals?.getSpriteAtIndex(1); scene.playSound("Follow Me"); scene.tweens.chain({ @@ -420,7 +421,7 @@ function doGreedentSpriteSteal(scene: BattleScene) { } function doGreedentEatBerries(scene: BattleScene) { - const greedentSprites = scene.currentBattle.mysteryEncounter.introVisuals.getSpriteAtIndex(1); + const greedentSprites = scene.currentBattle.mysteryEncounter.introVisuals?.getSpriteAtIndex(1); let index = 1; scene.tweens.add({ targets: greedentSprites, @@ -455,7 +456,12 @@ function doBerrySpritePile(scene: BattleScene, isEat: boolean = false) { const encounter = scene.currentBattle.mysteryEncounter; animationOrder.forEach((berry, i) => { const introVisualsIndex = encounter.spriteConfigs.findIndex(config => config.spriteKey?.includes(berry)); - const [ sprite, tintSprite ] = encounter.introVisuals.getSpriteAtIndex(introVisualsIndex); + let sprite: Phaser.GameObjects.Sprite, tintSprite: Phaser.GameObjects.Sprite; + const sprites = encounter.introVisuals?.getSpriteAtIndex(introVisualsIndex); + if (sprites) { + sprite = sprites[0]; + tintSprite = sprites[1]; + } scene.time.delayedCall(berryAddDelay * i + 400, () => { if (sprite) { sprite.setVisible(!isEat); 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 4e96b9f52d4..1ee1704c8b4 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 @@ -136,7 +136,7 @@ export const AnOfferYouCantRefuseEncounter: MysteryEncounter = // Update money and remove pokemon from party updatePlayerMoney(scene, encounter.misc.price); - setEncounterExp(scene, encounter.options[1].primaryPokemon.id, getPokemonSpecies(Species.LIEPARD).baseExp, true); + setEncounterExp(scene, encounter.options[1].primaryPokemon!.id, getPokemonSpecies(Species.LIEPARD).baseExp, true); leaveEncounterWithoutBattle(scene, true); }) diff --git a/src/data/mystery-encounters/encounters/berries-abound-encounter.ts b/src/data/mystery-encounters/encounters/berries-abound-encounter.ts index 6e75526076a..7e8279f383b 100644 --- a/src/data/mystery-encounters/encounters/berries-abound-encounter.ts +++ b/src/data/mystery-encounters/encounters/berries-abound-encounter.ts @@ -146,7 +146,7 @@ export const BerriesAboundEncounter: MysteryEncounter = // Calculate boss mon const bossSpecies = scene.arena.randomSpecies(scene.currentBattle.waveIndex, scene.currentBattle.waveIndex, 0, getPartyLuckValue(scene.getParty()), true); - const bossPokemon = new EnemyPokemon(scene, bossSpecies, scene.currentBattle.waveIndex, TrainerSlot.NONE, true, null); + const bossPokemon = new EnemyPokemon(scene, bossSpecies, scene.currentBattle.waveIndex, TrainerSlot.NONE, true); encounter.setDialogueToken("enemyPokemon", getPokemonNameWithAffix(bossPokemon)); const config: EnemyPartyConfig = { levelAdditiveMultiplier: 1, @@ -222,7 +222,7 @@ export const BerriesAboundEncounter: MysteryEncounter = shopOptions.push(generateModifierTypeOption(scene, modifierTypes.BERRY)); } - setEncounterRewards(scene, { guaranteedModifierTypeOptions: shopOptions, fillRemaining: false }, null, doBerryRewards); + setEncounterRewards(scene, { guaranteedModifierTypeOptions: shopOptions, fillRemaining: false }, undefined, doBerryRewards); await initBattleWithEnemyConfig(scene, scene.currentBattle.mysteryEncounter.enemyPartyConfigs[0]); } ) @@ -262,12 +262,12 @@ export const BerriesAboundEncounter: MysteryEncounter = }; const config = scene.currentBattle.mysteryEncounter.enemyPartyConfigs[0]; - config.pokemonConfigs[0].tags = [BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON]; - config.pokemonConfigs[0].mysteryEncounterBattleEffects = (pokemon: Pokemon) => { + config.pokemonConfigs![0].tags = [BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON]; + config.pokemonConfigs![0].mysteryEncounterBattleEffects = (pokemon: Pokemon) => { queueEncounterMessage(pokemon.scene, `${namespace}.option.2.boss_enraged`); pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [BattleStat.ATK, BattleStat.DEF, BattleStat.SPATK, BattleStat.SPDEF, BattleStat.SPD], 1)); }; - setEncounterRewards(scene, { guaranteedModifierTypeOptions: shopOptions, fillRemaining: false }, null, doBerryRewards); + setEncounterRewards(scene, { guaranteedModifierTypeOptions: shopOptions, fillRemaining: false }, undefined, doBerryRewards); await showEncounterText(scene, `${namespace}.option.2.selected_bad`); await initBattleWithEnemyConfig(scene, config); return; @@ -287,8 +287,8 @@ export const BerriesAboundEncounter: MysteryEncounter = } }; - setEncounterExp(scene, fastestPokemon.id, encounter.enemyPartyConfigs[0].pokemonConfigs[0].species.baseExp); - setEncounterRewards(scene, { guaranteedModifierTypeOptions: shopOptions, fillRemaining: false }, null, doFasterBerryRewards); + setEncounterExp(scene, fastestPokemon.id, encounter.enemyPartyConfigs[0].pokemonConfigs![0].species.baseExp); + setEncounterRewards(scene, { guaranteedModifierTypeOptions: shopOptions, fillRemaining: false }, undefined, doFasterBerryRewards); await showEncounterText(scene, `${namespace}.option.2.selected`); leaveEncounterWithoutBattle(scene); } diff --git a/src/data/mystery-encounters/encounters/clowning-around-encounter.ts b/src/data/mystery-encounters/encounters/clowning-around-encounter.ts index 85fbc2d2f18..c9c1f0dd335 100644 --- a/src/data/mystery-encounters/encounters/clowning-around-encounter.ts +++ b/src/data/mystery-encounters/encounters/clowning-around-encounter.ts @@ -1,4 +1,4 @@ -import { EnemyPartyConfig, generateModifierType, initBattleWithEnemyConfig, leaveEncounterWithoutBattle, loadCustomMovesForEncounter, selectPokemonForOption, setEncounterRewards, transitionMysteryEncounterIntroVisuals, } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { EnemyPartyConfig, generateModifierType, initBattleWithEnemyConfig, leaveEncounterWithoutBattle, loadCustomMovesForEncounter, selectPokemonForOption, setEncounterRewards, transitionMysteryEncounterIntroVisuals } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { trainerConfigs, TrainerPartyCompoundTemplate, TrainerPartyTemplate, } from "#app/data/trainer-config"; import { ModifierTier } from "#app/modifier/modifier-tier"; import { modifierTypes, PokemonHeldItemModifierType } from "#app/modifier/modifier-type"; @@ -28,7 +28,6 @@ import { BattlerIndex } from "#app/battle"; import { Moves } from "#enums/moves"; import { EncounterAnim, EncounterBattleAnim } from "#app/data/battle-anims"; import { MoveCategory } from "#app/data/move"; -import { MysteryEncounterPokemonData } from "#app/data/mystery-encounters/mystery-encounter-pokemon-data"; /** the i18n namespace for the encounter */ const namespace = "mysteryEncounter:clowningAround"; @@ -129,7 +128,7 @@ export const ClowningAroundEncounter: MysteryEncounter = }, { // Blacephalon has the random ability from pool, and 2 entirely random types to fit with the theme of the encounter species: getPokemonSpecies(Species.BLACEPHALON), - mysteryEncounterData: new MysteryEncounterPokemonData(null, ability, null, [randSeedInt(18), randSeedInt(18)]), + mysteryEncounterData: new MysteryEncounterPokemonData(undefined, ability, undefined, [randSeedInt(18), randSeedInt(18)]), isBoss: true, moveSet: [Moves.TRICK, Moves.HYPNOSIS, Moves.SHADOW_BALL, Moves.MIND_BLOWN] }, @@ -206,7 +205,7 @@ export const ClowningAroundEncounter: MysteryEncounter = ease: "Sine.easeInOut", duration: 250 }); - const background = new EncounterBattleAnim(EncounterAnim.SMOKESCREEN, scene.getPlayerPokemon(), scene.getPlayerPokemon()); + const background = new EncounterBattleAnim(EncounterAnim.SMOKESCREEN, scene.getPlayerPokemon()!, scene.getPlayerPokemon()); background.playWithoutTargets(scene, 230, 40, 2); return true; }) @@ -292,7 +291,7 @@ export const ClowningAroundEncounter: MysteryEncounter = }) .withPostOptionPhase(async (scene: BattleScene) => { // Play animations - const background = new EncounterBattleAnim(EncounterAnim.SMOKESCREEN, scene.getPlayerPokemon(), scene.getPlayerPokemon()); + const background = new EncounterBattleAnim(EncounterAnim.SMOKESCREEN, scene.getPlayerPokemon()!, scene.getPlayerPokemon()); background.playWithoutTargets(scene, 230, 40, 2); await transitionMysteryEncounterIntroVisuals(scene); }) @@ -327,8 +326,8 @@ export const ClowningAroundEncounter: MysteryEncounter = // If the Pokemon has non-status moves that don't match the Pokemon's type, prioritizes those as the new type // Makes the "randomness" of the shuffle slightly less punishing let priorityTypes = pokemon.moveset - .filter(move => !originalTypes.includes(move.getMove().type) && move.getMove().category !== MoveCategory.STATUS) - .map(move => move.getMove().type); + .filter(move => move && !originalTypes.includes(move.getMove().type) && move.getMove().category !== MoveCategory.STATUS) + .map(move => move!.getMove().type); if (priorityTypes?.length > 0) { priorityTypes = [...new Set(priorityTypes)]; randSeedShuffle(priorityTypes); @@ -350,7 +349,7 @@ export const ClowningAroundEncounter: MysteryEncounter = } if (!pokemon.mysteryEncounterData) { - pokemon.mysteryEncounterData = new MysteryEncounterPokemonData(null, null, null, newTypes); + pokemon.mysteryEncounterData = new MysteryEncounterPokemonData(undefined, undefined, undefined, newTypes); } else { pokemon.mysteryEncounterData.types = newTypes; } @@ -361,7 +360,7 @@ export const ClowningAroundEncounter: MysteryEncounter = }) .withPostOptionPhase(async (scene: BattleScene) => { // Play animations - const background = new EncounterBattleAnim(EncounterAnim.SMOKESCREEN, scene.getPlayerPokemon(), scene.getPlayerPokemon()); + const background = new EncounterBattleAnim(EncounterAnim.SMOKESCREEN, scene.getPlayerPokemon()!, scene.getPlayerPokemon()); background.playWithoutTargets(scene, 230, 40, 2); await transitionMysteryEncounterIntroVisuals(scene); }) @@ -441,8 +440,7 @@ function generateItemsOfTier(scene: BattleScene, pokemon: PlayerPokemon, numItem [modifierTypes.GOLDEN_PUNCH, 5], [modifierTypes.ATTACK_TYPE_BOOSTER, 99], [modifierTypes.QUICK_CLAW, 3], - [modifierTypes.WIDE_LENS, 3], - [modifierTypes.WHITE_HERB, 2] + [modifierTypes.WIDE_LENS, 3] ]; const roguePool = [ @@ -450,7 +448,7 @@ function generateItemsOfTier(scene: BattleScene, pokemon: PlayerPokemon, numItem [modifierTypes.SHELL_BELL, 4], [modifierTypes.SOUL_DEW, 10], [modifierTypes.SOOTHE_BELL, 3], - [modifierTypes.SCOPE_LENS, 5], + [modifierTypes.SCOPE_LENS, 1], [modifierTypes.BATON, 1], [modifierTypes.FOCUS_BAND, 5], [modifierTypes.KINGS_ROCK, 3], diff --git a/src/data/mystery-encounters/encounters/dancing-lessons-encounter.ts b/src/data/mystery-encounters/encounters/dancing-lessons-encounter.ts index ede6ecf5462..35b52c15c5a 100644 --- a/src/data/mystery-encounters/encounters/dancing-lessons-encounter.ts +++ b/src/data/mystery-encounters/encounters/dancing-lessons-encounter.ts @@ -87,7 +87,7 @@ export const DancingLessonsEncounter: MysteryEncounter = .withAutoHideIntroVisuals(false) .withCatchAllowed(true) .withOnVisualsStart((scene: BattleScene) => { - const danceAnim = new EncounterBattleAnim(EncounterAnim.DANCE, scene.getEnemyPokemon(), scene.getPlayerPokemon()); + const danceAnim = new EncounterBattleAnim(EncounterAnim.DANCE, scene.getEnemyPokemon()!, scene.getPlayerPokemon()); danceAnim.play(scene); return true; @@ -104,8 +104,8 @@ export const DancingLessonsEncounter: MysteryEncounter = const encounter = scene.currentBattle.mysteryEncounter; const species = getPokemonSpecies(Species.ORICORIO); - const enemyPokemon = scene.addEnemyPokemon(species, scene.currentBattle.enemyLevels[0], TrainerSlot.NONE, false); - if (!enemyPokemon.moveset.some(m => m.getMove().id === Moves.REVELATION_DANCE)) { + const enemyPokemon = scene.addEnemyPokemon(species, scene.currentBattle.enemyLevels![0], TrainerSlot.NONE, false); + if (!enemyPokemon.moveset.some(m => m && m.getMove().id === Moves.REVELATION_DANCE)) { if (enemyPokemon.moveset.length < 4) { enemyPokemon.moveset.push(new PokemonMove(Moves.REVELATION_DANCE)); } else { @@ -206,7 +206,7 @@ export const DancingLessonsEncounter: MysteryEncounter = scene.unshiftPhase(new LearnMovePhase(scene, scene.getParty().indexOf(pokemon), Moves.REVELATION_DANCE)); // Play animation again to "learn" the dance - const danceAnim = new EncounterBattleAnim(EncounterAnim.DANCE, scene.getEnemyPokemon(), scene.getPlayerPokemon()); + const danceAnim = new EncounterBattleAnim(EncounterAnim.DANCE, scene.getEnemyPokemon()!, scene.getPlayerPokemon()); danceAnim.play(scene); }; @@ -239,7 +239,7 @@ export const DancingLessonsEncounter: MysteryEncounter = const onPokemonSelected = (pokemon: PlayerPokemon) => { // Return the options for nature selection return pokemon.moveset - .filter(move => DANCING_MOVES.includes(move.getMove().id)) + .filter(move => move && DANCING_MOVES.includes(move.getMove().id)) .map((move: PokemonMove) => { const option: OptionSelectItem = { label: move.getName(), @@ -261,13 +261,13 @@ export const DancingLessonsEncounter: MysteryEncounter = // If pokemon meets primary pokemon reqs, it can be selected const meetsReqs = encounter.options[2].pokemonMeetsPrimaryRequirements(scene, pokemon); if (!meetsReqs) { - return getEncounterText(scene, `${namespace}.invalid_selection`); + return getEncounterText(scene, `${namespace}.invalid_selection`) ?? null; } return null; }; - return selectPokemonForOption(scene, onPokemonSelected, null, selectableFilter); + return selectPokemonForOption(scene, onPokemonSelected, undefined, selectableFilter); }) .withOptionPhase(async (scene: BattleScene) => { // Show the Oricorio a dance, and recruit it diff --git a/src/data/mystery-encounters/encounters/delibirdy-encounter.ts b/src/data/mystery-encounters/encounters/delibirdy-encounter.ts index 336d95bd156..bcb742f01d0 100644 --- a/src/data/mystery-encounters/encounters/delibirdy-encounter.ts +++ b/src/data/mystery-encounters/encounters/delibirdy-encounter.ts @@ -47,8 +47,8 @@ export const DelibirdyEncounter: MysteryEncounter = )) .withIntroSpriteConfigs([ { - spriteKey: null, - fileRoot: null, + spriteKey: "", + fileRoot: "", species: Species.DELIBIRD, hasShadow: true, repeat: true, @@ -56,16 +56,16 @@ export const DelibirdyEncounter: MysteryEncounter = scale: 0.94 }, { - spriteKey: null, - fileRoot: null, + spriteKey: "", + fileRoot: "", species: Species.DELIBIRD, hasShadow: true, repeat: true, scale: 1.06 }, { - spriteKey: null, - fileRoot: null, + spriteKey: "", + fileRoot: "", species: Species.DELIBIRD, hasShadow: true, repeat: true, @@ -116,7 +116,7 @@ export const DelibirdyEncounter: MysteryEncounter = const shellBell = generateModifierType(scene, modifierTypes.SHELL_BELL) as PokemonHeldItemModifierType; await applyModifierTypeToPlayerPokemon(scene, scene.getParty()[0], shellBell); scene.playSound("item_fanfare"); - await showEncounterText(scene, i18next.t("battle:rewardGain", { modifierName: shellBell.name }), null, true); + await showEncounterText(scene, i18next.t("battle:rewardGain", { modifierName: shellBell.name }), undefined, true); } else { scene.unshiftPhase(new ModifierRewardPhase(scene, modifierTypes.ABILITY_CHARM)); } @@ -169,13 +169,13 @@ export const DelibirdyEncounter: MysteryEncounter = // If pokemon meets primary pokemon reqs, it can be selected const meetsReqs = encounter.options[1].pokemonMeetsPrimaryRequirements(scene, pokemon); if (!meetsReqs) { - return getEncounterText(scene, `${namespace}.invalid_selection`); + return getEncounterText(scene, `${namespace}.invalid_selection`) ?? null; } return null; }; - return selectPokemonForOption(scene, onPokemonSelected, null, selectableFilter); + return selectPokemonForOption(scene, onPokemonSelected, undefined, selectableFilter); }) .withOptionPhase(async (scene: BattleScene) => { const encounter = scene.currentBattle.mysteryEncounter; @@ -191,7 +191,7 @@ export const DelibirdyEncounter: MysteryEncounter = const shellBell = generateModifierType(scene, modifierTypes.SHELL_BELL) as PokemonHeldItemModifierType; await applyModifierTypeToPlayerPokemon(scene, scene.getParty()[0], shellBell); scene.playSound("item_fanfare"); - await showEncounterText(scene, i18next.t("battle:rewardGain", { modifierName: shellBell.name }), null, true); + await showEncounterText(scene, i18next.t("battle:rewardGain", { modifierName: shellBell.name }), undefined, true); } else { scene.unshiftPhase(new ModifierRewardPhase(scene, modifierTypes.CANDY_JAR)); } @@ -204,7 +204,7 @@ export const DelibirdyEncounter: MysteryEncounter = const shellBell = generateModifierType(scene, modifierTypes.SHELL_BELL) as PokemonHeldItemModifierType; await applyModifierTypeToPlayerPokemon(scene, scene.getParty()[0], shellBell); scene.playSound("item_fanfare"); - await showEncounterText(scene, i18next.t("battle:rewardGain", { modifierName: shellBell.name }), null, true); + await showEncounterText(scene, i18next.t("battle:rewardGain", { modifierName: shellBell.name }), undefined, true); } else { scene.unshiftPhase(new ModifierRewardPhase(scene, modifierTypes.HEALING_CHARM)); } @@ -264,13 +264,13 @@ export const DelibirdyEncounter: MysteryEncounter = // If pokemon meets primary pokemon reqs, it can be selected const meetsReqs = encounter.options[2].pokemonMeetsPrimaryRequirements(scene, pokemon); if (!meetsReqs) { - return getEncounterText(scene, `${namespace}.invalid_selection`); + return getEncounterText(scene, `${namespace}.invalid_selection`) ?? null; } return null; }; - return selectPokemonForOption(scene, onPokemonSelected, null, selectableFilter); + return selectPokemonForOption(scene, onPokemonSelected, undefined, selectableFilter); }) .withOptionPhase(async (scene: BattleScene) => { const encounter = scene.currentBattle.mysteryEncounter; @@ -284,7 +284,7 @@ export const DelibirdyEncounter: MysteryEncounter = const shellBell = generateModifierType(scene, modifierTypes.SHELL_BELL) as PokemonHeldItemModifierType; await applyModifierTypeToPlayerPokemon(scene, scene.getParty()[0], shellBell); scene.playSound("item_fanfare"); - await showEncounterText(scene, i18next.t("battle:rewardGain", { modifierName: shellBell.name }), null, true); + 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 9a11a2e8888..09c991ee4a3 100644 --- a/src/data/mystery-encounters/encounters/department-store-sale-encounter.ts +++ b/src/data/mystery-encounters/encounters/department-store-sale-encounter.ts @@ -2,7 +2,7 @@ import { leaveEncounterWithoutBattle, setEncounterRewards, } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import { modifierTypes } from "#app/modifier/modifier-type"; +import { ModifierTypeFunc, modifierTypes } from "#app/modifier/modifier-type"; import { randSeedInt } from "#app/utils"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { Species } from "#enums/species"; @@ -32,8 +32,8 @@ export const DepartmentStoreSaleEncounter: MysteryEncounter = x: -20, }, { - spriteKey: null, - fileRoot: null, + spriteKey: "", + fileRoot: "", species: Species.FURFROU, hasShadow: true, repeat: true, @@ -60,7 +60,7 @@ export const DepartmentStoreSaleEncounter: MysteryEncounter = }, async (scene: BattleScene) => { // Choose TMs - const modifiers = []; + const modifiers: ModifierTypeFunc[] = []; let i = 0; while (i < 4) { // 2/2/1 weight on TM rarity @@ -86,7 +86,7 @@ export const DepartmentStoreSaleEncounter: MysteryEncounter = }, async (scene: BattleScene) => { // Choose Vitamins - const modifiers = []; + const modifiers: ModifierTypeFunc[] = []; let i = 0; while (i < 3) { // 2/1 weight on base stat booster vs PP Up @@ -110,7 +110,7 @@ export const DepartmentStoreSaleEncounter: MysteryEncounter = }, async (scene: BattleScene) => { // Choose X Items - const modifiers = []; + const modifiers: ModifierTypeFunc[] = []; let i = 0; while (i < 5) { // 4/1 weight on base stat booster vs Dire Hit @@ -134,7 +134,7 @@ export const DepartmentStoreSaleEncounter: MysteryEncounter = }, async (scene: BattleScene) => { // Choose Pokeballs - const modifiers = []; + const modifiers: ModifierTypeFunc[] = []; let i = 0; while (i < 4) { // 10/30/20/5 weight on pokeballs diff --git a/src/data/mystery-encounters/encounters/field-trip-encounter.ts b/src/data/mystery-encounters/encounters/field-trip-encounter.ts index 5024ba3c361..ca6f7424dc8 100644 --- a/src/data/mystery-encounters/encounters/field-trip-encounter.ts +++ b/src/data/mystery-encounters/encounters/field-trip-encounter.ts @@ -78,7 +78,7 @@ export const FieldTripEncounter: MysteryEncounter = const correctMove = move.getMove().category === MoveCategory.PHYSICAL; encounter.setDialogueToken("moveCategory", "Physical"); if (!correctMove) { - encounter.options[0].dialogue.selected = [ + encounter.options[0].dialogue!.selected = [ { text: `${namespace}.option.incorrect`, speaker: `${namespace}.speaker`, @@ -97,7 +97,7 @@ export const FieldTripEncounter: MysteryEncounter = } else { encounter.setDialogueToken("pokeName", pokemon.getNameToRender()); encounter.setDialogueToken("move", move.getName()); - encounter.options[0].dialogue.selected = [ + encounter.options[0].dialogue!.selected = [ { text: `${namespace}.option.selected`, }, @@ -164,7 +164,7 @@ export const FieldTripEncounter: MysteryEncounter = const correctMove = move.getMove().category === MoveCategory.SPECIAL; encounter.setDialogueToken("moveCategory", "Special"); if (!correctMove) { - encounter.options[1].dialogue.selected = [ + encounter.options[1].dialogue!.selected = [ { text: `${namespace}.option.incorrect`, speaker: `${namespace}.speaker`, @@ -189,7 +189,7 @@ export const FieldTripEncounter: MysteryEncounter = } else { encounter.setDialogueToken("pokeName", pokemon.getNameToRender()); encounter.setDialogueToken("move", move.getName()); - encounter.options[1].dialogue.selected = [ + encounter.options[1].dialogue!.selected = [ { text: `${namespace}.option.selected`, }, @@ -256,7 +256,7 @@ export const FieldTripEncounter: MysteryEncounter = const correctMove = move.getMove().category === MoveCategory.STATUS; encounter.setDialogueToken("moveCategory", "Status"); if (!correctMove) { - encounter.options[2].dialogue.selected = [ + encounter.options[2].dialogue!.selected = [ { text: `${namespace}.option.incorrect`, speaker: `${namespace}.speaker`, @@ -275,7 +275,7 @@ export const FieldTripEncounter: MysteryEncounter = } else { encounter.setDialogueToken("pokeName", pokemon.getNameToRender()); encounter.setDialogueToken("move", move.getName()); - encounter.options[2].dialogue.selected = [ + encounter.options[2].dialogue!.selected = [ { text: `${namespace}.option.selected`, }, diff --git a/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts b/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts index 99919b09e3c..1eea328927b 100644 --- a/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts +++ b/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts @@ -75,8 +75,8 @@ export const FieryFalloutEncounter: MysteryEncounter = // Load hidden Volcarona sprites encounter.spriteConfigs = [ { - spriteKey: null, - fileRoot: null, + spriteKey: "", + fileRoot: "", species: Species.VOLCARONA, repeat: true, hidden: true, @@ -85,8 +85,8 @@ export const FieryFalloutEncounter: MysteryEncounter = startFrame: 20 }, { - spriteKey: null, - fileRoot: null, + spriteKey: "", + fileRoot: "", species: Species.VOLCARONA, repeat: true, hidden: true, @@ -104,9 +104,9 @@ export const FieryFalloutEncounter: MysteryEncounter = }) .withOnVisualsStart((scene: BattleScene) => { // Play animations - const background = new EncounterBattleAnim(EncounterAnim.MAGMA_BG, scene.getPlayerPokemon(), scene.getPlayerPokemon()); + const background = new EncounterBattleAnim(EncounterAnim.MAGMA_BG, scene.getPlayerPokemon()!, scene.getPlayerPokemon()); background.playWithoutTargets(scene, 200, 70, 2, 3); - const animation = new EncounterBattleAnim(EncounterAnim.MAGMA_SPOUT, scene.getPlayerPokemon(), scene.getPlayerPokemon()); + const animation = new EncounterBattleAnim(EncounterAnim.MAGMA_SPOUT, scene.getPlayerPokemon()!, scene.getPlayerPokemon()); animation.playWithoutTargets(scene, 80, 100, 2); scene.time.delayedCall(600, () => { animation.playWithoutTargets(scene, -20, 100, 2); @@ -133,7 +133,7 @@ export const FieryFalloutEncounter: MysteryEncounter = async (scene: BattleScene) => { // Pick battle const encounter = scene.currentBattle.mysteryEncounter; - setEncounterRewards(scene, { fillRemaining: true }, null, () => giveLeadPokemonCharcoal(scene)); + setEncounterRewards(scene, { fillRemaining: true }, undefined, () => giveLeadPokemonCharcoal(scene)); encounter.startOfBattleEffects.push( { @@ -185,7 +185,7 @@ export const FieryFalloutEncounter: MysteryEncounter = } // Burn random member - const burnable = nonFireTypes.filter(p => isNullOrUndefined(p.status) || isNullOrUndefined(p.status.effect) || p.status?.effect === StatusEffect.BURN); + const burnable = nonFireTypes.filter(p => isNullOrUndefined(p.status) || isNullOrUndefined(p.status!.effect) || p.status?.effect === StatusEffect.BURN); if (burnable?.length > 0) { const roll = randSeedInt(burnable.length); const chosenPokemon = burnable[roll]; @@ -224,13 +224,13 @@ export const FieryFalloutEncounter: MysteryEncounter = transitionMysteryEncounterIntroVisuals(scene); setEncounterRewards(scene, { fillRemaining: true }, - null, + undefined, () => { giveLeadPokemonCharcoal(scene); }); - const primary = encounter.options[2].primaryPokemon; - const secondary = encounter.options[2].secondaryPokemon[0]; + const primary = encounter.options[2].primaryPokemon!; + const secondary = encounter.options[2].secondaryPokemon![0]; setEncounterExp(scene, [primary.id, secondary.id], getPokemonSpecies(Species.VOLCARONA).baseExp * 2); leaveEncounterWithoutBattle(scene); 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 10d9f21e8bb..616c81880df 100644 --- a/src/data/mystery-encounters/encounters/fight-or-flight-encounter.ts +++ b/src/data/mystery-encounters/encounters/fight-or-flight-encounter.ts @@ -50,7 +50,7 @@ export const FightOrFlightEncounter: MysteryEncounter = // Calculate boss mon const bossSpecies = scene.arena.randomSpecies(scene.currentBattle.waveIndex, scene.currentBattle.waveIndex, 0, getPartyLuckValue(scene.getParty()), true); - const bossPokemon = new EnemyPokemon(scene, bossSpecies, scene.currentBattle.waveIndex, TrainerSlot.NONE, true, null); + const bossPokemon = new EnemyPokemon(scene, bossSpecies, scene.currentBattle.waveIndex, TrainerSlot.NONE, true); const config: EnemyPartyConfig = { levelAdditiveMultiplier: 1, pokemonConfigs: [{ @@ -72,7 +72,7 @@ export const FightOrFlightEncounter: MysteryEncounter = ? ModifierTier.ULTRA : ModifierTier.GREAT; regenerateModifierPoolThresholds(scene.getParty(), ModifierPoolType.PLAYER, 0); - let item: ModifierTypeOption; + let item: ModifierTypeOption | null = null; // TMs excluded from possible rewards as they're too swingy in value for a singular item reward while (!item || item.type.id.includes("TM_")) { item = getPlayerModifierTypeOptions(1, scene.getParty(), [], { guaranteedModifierTiers: [tier], allowLuckUpgrades: false })[0]; @@ -147,8 +147,8 @@ export const FightOrFlightEncounter: MysteryEncounter = setEncounterRewards(scene, { guaranteedModifierTypeOptions: [item], fillRemaining: false }); // Use primaryPokemon to execute the thievery - const primaryPokemon = encounter.options[1].primaryPokemon; - setEncounterExp(scene, primaryPokemon.id, encounter.enemyPartyConfigs[0].pokemonConfigs[0].species.baseExp); + const primaryPokemon = encounter.options[1].primaryPokemon!; + setEncounterExp(scene, primaryPokemon.id, encounter.enemyPartyConfigs[0].pokemonConfigs![0].species.baseExp); leaveEncounterWithoutBattle(scene); }) .build() diff --git a/src/data/mystery-encounters/encounters/mysterious-challengers-encounter.ts b/src/data/mystery-encounters/encounters/mysterious-challengers-encounter.ts index f3738059b0b..1695466c1cd 100644 --- a/src/data/mystery-encounters/encounters/mysterious-challengers-encounter.ts +++ b/src/data/mystery-encounters/encounters/mysterious-challengers-encounter.ts @@ -87,6 +87,7 @@ export const MysteriousChallengersEncounter: MysteryEncounter = const e4Template = trainerPartyTemplates.ELITE_FOUR; const brutalConfig = trainerConfigs[brutalTrainerType].copy(); brutalConfig.setPartyTemplates(e4Template); + // @ts-ignore brutalConfig.partyTemplateFunc = null; // Overrides gym leader party template func female = false; if (brutalConfig.hasGenders) { diff --git a/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts b/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts index e4616c6f169..303beb57aae 100644 --- a/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts +++ b/src/data/mystery-encounters/encounters/mysterious-chest-encounter.ts @@ -57,7 +57,7 @@ export const MysteriousChestEncounter: MysteryEncounter = .withPreOptionPhase(async (scene: BattleScene) => { // Play animation const introVisuals = - scene.currentBattle.mysteryEncounter.introVisuals; + scene.currentBattle.mysteryEncounter.introVisuals!; introVisuals.spriteConfigs[0].disableAnimation = false; introVisuals.playAnim(); }) diff --git a/src/data/mystery-encounters/encounters/part-timer-encounter.ts b/src/data/mystery-encounters/encounters/part-timer-encounter.ts index 861e0bc0e8f..a17a47f23fe 100644 --- a/src/data/mystery-encounters/encounters/part-timer-encounter.ts +++ b/src/data/mystery-encounters/encounters/part-timer-encounter.ts @@ -100,8 +100,10 @@ export const PartTimerEncounter: MysteryEncounter = // Reduce all PP to 2 (if they started at greater than 2) pokemon.moveset.forEach(move => { - const newPpUsed = move.getMovePp() - 2; - move.ppUsed = move.ppUsed < newPpUsed ? newPpUsed : move.ppUsed; + if (move) { + const newPpUsed = move.getMovePp() - 2; + move.ppUsed = move.ppUsed < newPpUsed ? newPpUsed : move.ppUsed; + } }); setEncounterExp(scene, pokemon.id, 100); @@ -115,13 +117,13 @@ export const PartTimerEncounter: MysteryEncounter = // Only Pokemon non-KOd pokemon can be selected const selectableFilter = (pokemon: Pokemon) => { if (!pokemon.isAllowedInBattle()) { - return getEncounterText(scene, `${namespace}.invalid_selection`); + return getEncounterText(scene, `${namespace}.invalid_selection`) ?? null; } return null; }; - return selectPokemonForOption(scene, onPokemonSelected, null, selectableFilter); + return selectPokemonForOption(scene, onPokemonSelected, undefined, selectableFilter); }) .withOptionPhase(async (scene: BattleScene) => { // Pick Deliveries @@ -179,8 +181,10 @@ export const PartTimerEncounter: MysteryEncounter = // Reduce all PP to 2 (if they started at greater than 2) pokemon.moveset.forEach(move => { - const newPpUsed = move.getMovePp() - 2; - move.ppUsed = move.ppUsed < newPpUsed ? newPpUsed : move.ppUsed; + if (move) { + const newPpUsed = move.getMovePp() - 2; + move.ppUsed = move.ppUsed < newPpUsed ? newPpUsed : move.ppUsed; + } }); setEncounterExp(scene, pokemon.id, 100); @@ -194,13 +198,13 @@ export const PartTimerEncounter: MysteryEncounter = // Only Pokemon non-KOd pokemon can be selected const selectableFilter = (pokemon: Pokemon) => { if (!pokemon.isAllowedInBattle()) { - return getEncounterText(scene, `${namespace}.invalid_selection`); + return getEncounterText(scene, `${namespace}.invalid_selection`) ?? null; } return null; }; - return selectPokemonForOption(scene, onPokemonSelected, null, selectableFilter); + return selectPokemonForOption(scene, onPokemonSelected, undefined, selectableFilter); }) .withOptionPhase(async (scene: BattleScene) => { // Pick Move Warehouse items @@ -241,13 +245,15 @@ export const PartTimerEncounter: MysteryEncounter = }) .withPreOptionPhase(async (scene: BattleScene) => { const encounter = scene.currentBattle.mysteryEncounter; - const selectedPokemon = encounter.selectedOption.primaryPokemon; + const selectedPokemon = encounter.selectedOption?.primaryPokemon!; encounter.setDialogueToken("selectedPokemon", selectedPokemon.getNameToRender()); // Reduce all PP to 2 (if they started at greater than 2) selectedPokemon.moveset.forEach(move => { - const newPpUsed = move.getMovePp() - 2; - move.ppUsed = move.ppUsed < newPpUsed ? newPpUsed : move.ppUsed; + if (move) { + const newPpUsed = move.getMovePp() - 2; + move.ppUsed = move.ppUsed < newPpUsed ? newPpUsed : move.ppUsed; + } }); setEncounterExp(scene, selectedPokemon.id, 100); diff --git a/src/data/mystery-encounters/encounters/safari-zone-encounter.ts b/src/data/mystery-encounters/encounters/safari-zone-encounter.ts index 66f286653b9..a83d76a7cfa 100644 --- a/src/data/mystery-encounters/encounters/safari-zone-encounter.ts +++ b/src/data/mystery-encounters/encounters/safari-zone-encounter.ts @@ -172,9 +172,9 @@ const safariZoneGameOptions: MysteryEncounterOption[] = [ // 80% chance to increase flee stage +1 const fleeChangeResult = tryChangeFleeStage(scene, 1, 8); if (!fleeChangeResult) { - await showEncounterText(scene, getEncounterText(scene, `${namespace}.safari.busy_eating`), 1000, false ); + await showEncounterText(scene, getEncounterText(scene, `${namespace}.safari.busy_eating`) ?? "", 1000, false ); } else { - await showEncounterText(scene, getEncounterText(scene, `${namespace}.safari.eating`), 1000, false); + await showEncounterText(scene, getEncounterText(scene, `${namespace}.safari.eating`) ?? "", 1000, false); } await doEndTurn(scene, 1); @@ -201,9 +201,9 @@ const safariZoneGameOptions: MysteryEncounterOption[] = [ // 80% chance to decrease catch stage -1 const catchChangeResult = tryChangeCatchStage(scene, -1, 8); if (!catchChangeResult) { - await showEncounterText(scene, getEncounterText(scene, `${namespace}.safari.beside_itself_angry`), 1000, false ); + await showEncounterText(scene, getEncounterText(scene, `${namespace}.safari.beside_itself_angry`) ?? "", 1000, false ); } else { - await showEncounterText(scene, getEncounterText(scene, `${namespace}.safari.angry`), 1000, false ); + await showEncounterText(scene, getEncounterText(scene, `${namespace}.safari.angry`) ?? "", 1000, false ); } await doEndTurn(scene, 2); @@ -239,7 +239,7 @@ async function summonSafariPokemon(scene: BattleScene) { const encounter = scene.currentBattle.mysteryEncounter; // Message pokemon remaining encounter.setDialogueToken("remainingCount", encounter.misc.safariPokemonRemaining); - scene.queueMessage(getEncounterText(scene, `${namespace}.safari.remaining_count`), null, true); + scene.queueMessage(getEncounterText(scene, `${namespace}.safari.remaining_count`) ?? "", null, true); // Generate pokemon using safariPokemonRemaining so they are always the same pokemon no matter how many turns are taken // Safari pokemon roll twice on shiny and HA chances, but are otherwise normal @@ -288,7 +288,7 @@ async function summonSafariPokemon(scene: BattleScene) { scene.unshiftPhase(new SummonPhase(scene, 0, false)); encounter.setDialogueToken("pokemonName", getPokemonNameWithAffix(pokemon)); - showEncounterText(scene, getEncounterText(scene, "battle:singleWildAppeared"), 1500, false) + showEncounterText(scene, getEncounterText(scene, "battle:singleWildAppeared") ?? "", 1500, false) .then(() => { const ivScannerModifier = scene.findModifier(m => m instanceof IvScannerModifier); if (ivScannerModifier) { @@ -494,7 +494,7 @@ async function doEndTurn(scene: BattleScene, cursorIndex: number) { leaveEncounterWithoutBattle(scene, true); } } else { - scene.queueMessage(getEncounterText(scene, `${namespace}.safari.watching`), 0, null, 1000); + scene.queueMessage(getEncounterText(scene, `${namespace}.safari.watching`) ?? "", 0, null, 1000); initSubsequentOptionSelect(scene, { overrideOptions: safariZoneGameOptions, startingCursorIndex: cursorIndex, hideDescription: 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 3e4fe49da43..2876ce64c8f 100644 --- a/src/data/mystery-encounters/encounters/shady-vitamin-dealer-encounter.ts +++ b/src/data/mystery-encounters/encounters/shady-vitamin-dealer-encounter.ts @@ -95,13 +95,13 @@ export const ShadyVitaminDealerEncounter: MysteryEncounter = // If pokemon meets primary pokemon reqs, it can be selected const meetsReqs = encounter.pokemonMeetsPrimaryRequirements(scene, pokemon); if (!meetsReqs) { - return getEncounterText(scene, `${namespace}.invalid_selection`); + return getEncounterText(scene, `${namespace}.invalid_selection`) ?? null; } return null; }; - return selectPokemonForOption(scene, onPokemonSelected, null, selectableFilter); + return selectPokemonForOption(scene, onPokemonSelected, undefined, selectableFilter); }) .withOptionPhase(async (scene: BattleScene) => { // Choose Cheap Option @@ -178,13 +178,13 @@ export const ShadyVitaminDealerEncounter: MysteryEncounter = // If pokemon meets primary pokemon reqs, it can be selected const meetsReqs = encounter.pokemonMeetsPrimaryRequirements(scene, pokemon); if (!meetsReqs) { - return getEncounterText(scene, `${namespace}.invalid_selection`); + return getEncounterText(scene, `${namespace}.invalid_selection`) ?? null; } return null; }; - return selectPokemonForOption(scene, onPokemonSelected, null, selectableFilter); + return selectPokemonForOption(scene, onPokemonSelected, undefined, selectableFilter); }) .withOptionPhase(async (scene: BattleScene) => { // Choose Expensive Option diff --git a/src/data/mystery-encounters/encounters/slumbering-snorlax-encounter.ts b/src/data/mystery-encounters/encounters/slumbering-snorlax-encounter.ts index 35ba52cdce7..f56823a3445 100644 --- a/src/data/mystery-encounters/encounters/slumbering-snorlax-encounter.ts +++ b/src/data/mystery-encounters/encounters/slumbering-snorlax-encounter.ts @@ -140,7 +140,7 @@ export const SlumberingSnorlaxEncounter: MysteryEncounter = const instance = scene.currentBattle.mysteryEncounter; setEncounterRewards(scene, { guaranteedModifierTypeFuncs: [modifierTypes.LEFTOVERS], fillRemaining: false }); // Snorlax exp to Pokemon that did the stealing - setEncounterExp(scene, instance.primaryPokemon.id, getPokemonSpecies(Species.SNORLAX).baseExp); + setEncounterExp(scene, instance.primaryPokemon!.id, getPokemonSpecies(Species.SNORLAX).baseExp); leaveEncounterWithoutBattle(scene); }) .build() 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 e44d03da8f5..9604783d3ff 100644 --- a/src/data/mystery-encounters/encounters/the-pokemon-salesman-encounter.ts +++ b/src/data/mystery-encounters/encounters/the-pokemon-salesman-encounter.ts @@ -29,7 +29,7 @@ export const ThePokemonSalesmanEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.THE_POKEMON_SALESMAN) .withEncounterTier(MysteryEncounterTier.ULTRA) .withSceneWaveRangeRequirement(10, 180) - .withSceneRequirement(new MoneyRequirement(null, MAX_POKEMON_PRICE_MULTIPLIER)) // Some costs may not be as significant, this is the max you'd pay + .withSceneRequirement(new MoneyRequirement(undefined, MAX_POKEMON_PRICE_MULTIPLIER)) // Some costs may not be as significant, this is the max you'd pay .withAutoHideIntroVisuals(false) .withIntroSpriteConfigs([ { @@ -66,10 +66,10 @@ export const ThePokemonSalesmanEncounter: MysteryEncounter = // If no HA mon found or you roll 1%, give shiny Magikarp species = getPokemonSpecies(Species.MAGIKARP); const hiddenIndex = species.ability2 ? 2 : 1; - pokemon = new PlayerPokemon(scene, species, 5, hiddenIndex, species.formIndex, null, true, null, null, null, null); + pokemon = new PlayerPokemon(scene, species, 5, hiddenIndex, species.formIndex, undefined, true); } else { const hiddenIndex = species.ability2 ? 2 : 1; - pokemon = new PlayerPokemon(scene, species, 5, hiddenIndex, species.formIndex, null, null, null, null, null, null); + pokemon = new PlayerPokemon(scene, species, 5, hiddenIndex, species.formIndex); } const { spriteKey, fileRoot } = getSpriteKeysFromPokemon(pokemon); @@ -88,8 +88,8 @@ export const ThePokemonSalesmanEncounter: MysteryEncounter = // Always max price for shiny (flip HA back to normal), and add special messaging priceMultiplier = MAX_POKEMON_PRICE_MULTIPLIER; pokemon.abilityIndex = 0; - encounter.dialogue.encounterOptionsDialogue.description = `${namespace}.description_shiny`; - encounter.options[0].dialogue.buttonTooltip = `${namespace}.option.1.tooltip_shiny`; + encounter.dialogue.encounterOptionsDialogue!.description = `${namespace}.description_shiny`; + encounter.options[0].dialogue!.buttonTooltip = `${namespace}.option.1.tooltip_shiny`; } const price = scene.getWaveMoneyAmount(priceMultiplier); encounter.setDialogueToken("purchasePokemon", pokemon.getNameToRender()); @@ -107,7 +107,7 @@ export const ThePokemonSalesmanEncounter: MysteryEncounter = MysteryEncounterOptionBuilder .newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT) .withHasDexProgress(true) - .withSceneMoneyRequirement(null, MAX_POKEMON_PRICE_MULTIPLIER) // Wave scaling money multiplier of 2 + .withSceneMoneyRequirement(undefined, MAX_POKEMON_PRICE_MULTIPLIER) // Wave scaling money multiplier of 2 .withDialogue({ buttonLabel: `${namespace}.option.1.label`, buttonTooltip: `${namespace}.option.1.tooltip`, 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 fd67d2a0234..4eaec2fdca2 100644 --- a/src/data/mystery-encounters/encounters/the-strong-stuff-encounter.ts +++ b/src/data/mystery-encounters/encounters/the-strong-stuff-encounter.ts @@ -127,7 +127,7 @@ export const TheStrongStuffEncounter: MysteryEncounter = // -20 to all base stats of highest BST, +10 to all base stats of rest of party // Get highest BST mon const party = scene.getParty(); - let highestBst: PlayerPokemon = null; + let highestBst: PlayerPokemon | null = null; let statTotal = 0; for (const pokemon of party) { if (!highestBst) { @@ -157,7 +157,7 @@ export const TheStrongStuffEncounter: MysteryEncounter = } encounter.setDialogueToken("highBstPokemon", highestBst.getNameToRender()); - await showEncounterText(scene, `${namespace}.option.1.selected_2`, null, true); + await showEncounterText(scene, `${namespace}.option.1.selected_2`, undefined, true); setEncounterRewards(scene, { fillRemaining: true }); leaveEncounterWithoutBattle(scene, true); 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 c0886ed9f6b..5ae6d86ecdb 100644 --- a/src/data/mystery-encounters/encounters/the-winstrate-challenge-encounter.ts +++ b/src/data/mystery-encounters/encounters/the-winstrate-challenge-encounter.ts @@ -140,7 +140,7 @@ async function spawnNextTrainerOrEndEncounter(scene: BattleScene) { await transitionMysteryEncounterIntroVisuals(scene, false, false); await showEncounterDialogue(scene, `${namespace}.victory`, `${namespace}.speaker`); setEncounterRewards(scene, { guaranteedModifierTypeFuncs: [modifierTypes.MYSTERY_ENCOUNTER_MACHO_BRACE], fillRemaining: false }); - encounter.doContinueEncounter = null; + encounter.doContinueEncounter = undefined; leaveEncounterWithoutBattle(scene, false, MysteryEncounterMode.TRAINER_BATTLE); } else { await initBattleWithEnemyConfig(scene, nextConfig); @@ -151,17 +151,21 @@ function endTrainerBattleAndShowDialogue(scene: BattleScene): Promise { return new Promise(async resolve => { if (scene.currentBattle.mysteryEncounter.enemyPartyConfigs.length === 0) { // Battle is over - scene.tweens.add({ - targets: scene.currentBattle.trainer, - x: "+=16", - y: "-=16", - alpha: 0, - ease: "Sine.easeInOut", - duration: 750, - onComplete: () => { - scene.field.remove(scene.currentBattle.trainer, true); - } - }); + const trainer = scene.currentBattle.trainer; + if (trainer) { + scene.tweens.add({ + targets: trainer, + x: "+=16", + y: "-=16", + alpha: 0, + ease: "Sine.easeInOut", + duration: 750, + onComplete: () => { + scene.field.remove(trainer, true); + } + }); + } + await spawnNextTrainerOrEndEncounter(scene); resolve(); // Wait for all dialogue/post battle stuff to complete before resolving } else { @@ -186,18 +190,20 @@ function endTrainerBattleAndShowDialogue(scene: BattleScene): Promise { // Unassign previous trainer from battle so it isn't destroyed before animation completes scene.currentBattle.trainer = null; await spawnNextTrainerOrEndEncounter(scene); - scene.tweens.add({ - targets: trainer, - x: "+=16", - y: "-=16", - alpha: 0, - ease: "Sine.easeInOut", - duration: 750, - onComplete: () => { - scene.field.remove(trainer, true); - resolve(); - } - }); + if (trainer) { + scene.tweens.add({ + targets: trainer, + x: "+=16", + y: "-=16", + alpha: 0, + ease: "Sine.easeInOut", + duration: 750, + onComplete: () => { + scene.field.remove(trainer, true); + resolve(); + } + }); + } } }); } diff --git a/src/data/mystery-encounters/encounters/training-session-encounter.ts b/src/data/mystery-encounters/encounters/training-session-encounter.ts index e680268bc8f..54d48d4dcc5 100644 --- a/src/data/mystery-encounters/encounters/training-session-encounter.ts +++ b/src/data/mystery-encounters/encounters/training-session-encounter.ts @@ -6,11 +6,10 @@ import { Stat } from "#app/data/pokemon-stat"; import Pokemon, { PlayerPokemon } from "#app/field/pokemon"; import { pokemonInfo } from "#app/locales/en/pokemon-info"; import { PokemonHeldItemModifier } from "#app/modifier/modifier"; -import { PokemonHeldItemModifierType } from "#app/modifier/modifier-type"; import { AbilityAttr } from "#app/system/game-data"; import PokemonData from "#app/system/pokemon-data"; import { OptionSelectItem } from "#app/ui/abstact-option-select-ui-handler"; -import { randSeedShuffle } from "#app/utils"; +import { isNullOrUndefined, randSeedShuffle } from "#app/utils"; import { BattlerTagType } from "#enums/battler-tag-type"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import BattleScene from "#app/battle-scene"; @@ -19,6 +18,7 @@ import { MysteryEncounterOptionBuilder } from "../mystery-encounter-option"; import { getEncounterText, queueEncounterMessage } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; +import HeldModifierConfig from "#app/interfaces/held-modifier-config"; /** The i18n namespace for the encounter */ const namespace = "mysteryEncounter:trainingSession"; @@ -77,13 +77,13 @@ export const TrainingSessionEncounter: MysteryEncounter = const selectableFilter = (pokemon: Pokemon) => { const meetsReqs = pokemon.isAllowedInBattle(); if (!meetsReqs) { - return getEncounterText(scene, `${namespace}.invalid_selection`); + return getEncounterText(scene, `${namespace}.invalid_selection`) ?? null; } return null; }; - return selectPokemonForOption(scene, onPokemonSelected, null, selectableFilter); + return selectPokemonForOption(scene, onPokemonSelected, undefined, selectableFilter); }) .withOptionPhase(async (scene: BattleScene) => { const encounter = scene.currentBattle.mysteryEncounter; @@ -125,7 +125,7 @@ export const TrainingSessionEncounter: MysteryEncounter = encounter.setDialogueToken("stat1", "-"); encounter.setDialogueToken("stat2", "-"); // Add the pokemon back to party with IV boost - const ivIndexes = []; + const ivIndexes: any[] = []; playerPokemon.ivs.forEach((iv, index) => { if (iv < 31) { ivIndexes.push({ iv: iv, index: index }); @@ -147,12 +147,12 @@ export const TrainingSessionEncounter: MysteryEncounter = if (improvedCount === 0) { encounter.setDialogueToken( "stat1", - getIvName(ivToChange.index) + getIvName(ivToChange.index) ?? "" ); } else { encounter.setDialogueToken( "stat2", - getIvName(ivToChange.index) + getIvName(ivToChange.index) ?? "" ); } @@ -185,12 +185,7 @@ export const TrainingSessionEncounter: MysteryEncounter = queueEncounterMessage(scene, `${namespace}.option.1.finished`); }; - setEncounterRewards( - scene, - { fillRemaining: true }, - null, - onBeforeRewardsPhase - ); + setEncounterRewards(scene, { fillRemaining: true }, undefined, onBeforeRewardsPhase); return initBattleWithEnemyConfig(scene, config); }) @@ -237,13 +232,13 @@ export const TrainingSessionEncounter: MysteryEncounter = const selectableFilter = (pokemon: Pokemon) => { const meetsReqs = pokemon.isAllowedInBattle(); if (!meetsReqs) { - return getEncounterText(scene, `${namespace}.invalid_selection`); + return getEncounterText(scene, `${namespace}.invalid_selection`) ?? null; } return null; }; - return selectPokemonForOption(scene, onPokemonSelected, null, selectableFilter); + return selectPokemonForOption(scene, onPokemonSelected, undefined, selectableFilter); }) .withOptionPhase(async (scene: BattleScene) => { const encounter = scene.currentBattle.mysteryEncounter; @@ -278,12 +273,7 @@ export const TrainingSessionEncounter: MysteryEncounter = scene.updateModifiers(true); }; - setEncounterRewards( - scene, - { fillRemaining: true }, - null, - onBeforeRewardsPhase - ); + setEncounterRewards(scene, { fillRemaining: true }, undefined, onBeforeRewardsPhase); return initBattleWithEnemyConfig(scene, config); }) @@ -339,13 +329,13 @@ export const TrainingSessionEncounter: MysteryEncounter = const selectableFilter = (pokemon: Pokemon) => { const meetsReqs = pokemon.isAllowedInBattle(); if (!meetsReqs) { - return getEncounterText(scene, `${namespace}.invalid_selection`); + return getEncounterText(scene, `${namespace}.invalid_selection`) ?? null; } return null; }; - return selectPokemonForOption(scene, onPokemonSelected, null, selectableFilter); + return selectPokemonForOption(scene, onPokemonSelected, undefined, selectableFilter); }) .withOptionPhase(async (scene: BattleScene) => { const encounter = scene.currentBattle.mysteryEncounter; @@ -354,18 +344,10 @@ export const TrainingSessionEncounter: MysteryEncounter = // Spawn hard training session with chosen pokemon // Every 30 waves, add +1 boss segment, capping at 6 // Also starts with +1 to all stats - const segments = Math.min( - 2 + Math.floor(scene.currentBattle.waveIndex / 30), - 6 - ); + const segments = Math.min(2 + Math.floor(scene.currentBattle.waveIndex / 30), 6); const modifiers = new ModifiersHolder(); - const config = getEnemyConfig( - scene, - playerPokemon, - segments, - modifiers - ); - config.pokemonConfigs[0].tags = [ + const config = getEnemyConfig(scene, playerPokemon, segments, modifiers); + config.pokemonConfigs![0].tags = [ BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON, ]; scene.removePokemonFromPlayerParty(playerPokemon, false); @@ -376,15 +358,10 @@ export const TrainingSessionEncounter: MysteryEncounter = const abilityIndex = encounter.misc.abilityIndex; if (!!playerPokemon.getFusionSpeciesForm()) { playerPokemon.fusionAbilityIndex = abilityIndex; - if ( - speciesStarters.hasOwnProperty( - playerPokemon.fusionSpecies.speciesId - ) - ) { - scene.gameData.starterData[ - playerPokemon.fusionSpecies.speciesId - ].abilityAttr |= - abilityIndex !== 1 || playerPokemon.fusionSpecies.ability2 + if (!isNullOrUndefined(playerPokemon.fusionSpecies?.speciesId) && speciesStarters.hasOwnProperty(playerPokemon.fusionSpecies!.speciesId)) { + scene.gameData.starterData[playerPokemon.fusionSpecies!.speciesId] + .abilityAttr |= + abilityIndex !== 1 || playerPokemon.fusionSpecies!.ability2 ? Math.pow(2, playerPokemon.fusionAbilityIndex) : AbilityAttr.ABILITY_HIDDEN; } @@ -414,12 +391,7 @@ export const TrainingSessionEncounter: MysteryEncounter = scene.updateModifiers(true); }; - setEncounterRewards( - scene, - { fillRemaining: true }, - null, - onBeforeRewardsPhase - ); + setEncounterRewards(scene, { fillRemaining: true }, undefined, onBeforeRewardsPhase); return initBattleWithEnemyConfig(scene, config); }) @@ -432,7 +404,11 @@ function getEnemyConfig(scene: BattleScene, playerPokemon: PlayerPokemon,segment // Passes modifiers by reference modifiers.value = scene.findModifiers((m) => m instanceof PokemonHeldItemModifier && (m as PokemonHeldItemModifier).pokemonId === playerPokemon.id) as PokemonHeldItemModifier[]; - const modifierTypes = modifiers.value.map((mod) => mod.type) as PokemonHeldItemModifierType[]; + const modifierConfigs = modifiers.value.map((mod) => { + return { + modifierType: mod.type + }; + }) as HeldModifierConfig[]; const data = new PokemonData(playerPokemon); return { @@ -444,7 +420,7 @@ function getEnemyConfig(scene: BattleScene, playerPokemon: PlayerPokemon,segment formIndex: playerPokemon.formIndex, level: playerPokemon.level, dataSource: data, - modifierConfigs: modifierTypes, + modifierConfigs: modifierConfigs, }, ], }; 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 50de002e053..d8c95761952 100644 --- a/src/data/mystery-encounters/encounters/trash-to-treasure-encounter.ts +++ b/src/data/mystery-encounters/encounters/trash-to-treasure-encounter.ts @@ -178,7 +178,7 @@ async function tryApplyDigRewardItems(scene: BattleScene) { } scene.playSound("item_fanfare"); - await showEncounterText(scene, i18next.t("battle:rewardGain", { modifierName: "2 " + leftovers.name }), null, true); + await showEncounterText(scene, i18next.t("battle:rewardGain", { modifierName: "2 " + leftovers.name }), undefined, true); // First Shell bell for (const pokemon of party) { @@ -205,7 +205,7 @@ async function tryApplyDigRewardItems(scene: BattleScene) { } scene.playSound("item_fanfare"); - await showEncounterText(scene, i18next.t("battle:rewardGain", { modifierName: "2 " + shellBell.name }), null, true); + await showEncounterText(scene, i18next.t("battle:rewardGain", { modifierName: "2 " + shellBell.name }), undefined, true); } async function doGarbageDig(scene: BattleScene) { diff --git a/src/data/mystery-encounters/encounters/weird-dream-encounter.ts b/src/data/mystery-encounters/encounters/weird-dream-encounter.ts index 99d732f3107..d4ec3ab3c04 100644 --- a/src/data/mystery-encounters/encounters/weird-dream-encounter.ts +++ b/src/data/mystery-encounters/encounters/weird-dream-encounter.ts @@ -8,7 +8,7 @@ import { leaveEncounterWithoutBattle, setEncounterRewards, } from "../utils/enco import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import Pokemon, { PlayerPokemon, PokemonMove } from "#app/field/pokemon"; -import { IntegerHolder, randSeedInt, randSeedShuffle } from "#app/utils"; +import { IntegerHolder, isNullOrUndefined, randSeedInt, randSeedShuffle } from "#app/utils"; import PokemonSpecies, { allSpecies, getPokemonSpecies } from "#app/data/pokemon-species"; import { HiddenAbilityRateBoosterModifier, PokemonBaseStatTotalModifier, PokemonFormChangeItemModifier, PokemonHeldItemModifier } from "#app/modifier/modifier"; import { achvs } from "#app/system/achv"; @@ -362,7 +362,7 @@ async function doNewTeamPostProcess(scene: BattleScene, transformations: Pokemon } newTypes.push(newType); if (!newPokemon.mysteryEncounterData) { - newPokemon.mysteryEncounterData = new MysteryEncounterPokemonData(null, null, null, newTypes); + newPokemon.mysteryEncounterData = new MysteryEncounterPokemonData(undefined, undefined, undefined, newTypes); } else { newPokemon.mysteryEncounterData.types = newTypes; } @@ -381,9 +381,11 @@ async function doNewTeamPostProcess(scene: BattleScene, transformations: Pokemon // Def or SpDef stats.push(baseStats[Stat.DEF] < baseStats[Stat.SPDEF] ? Stat.DEF : Stat.SPDEF); // const mod = modifierTypes.MYSTERY_ENCOUNTER_OLD_GATEAU().newModifier(newPokemon, 20, stats); - const modType = modifierTypes.MYSTERY_ENCOUNTER_OLD_GATEAU().generateType(null, [20, stats]); - const modifier = modType.newModifier(newPokemon); - scene.addModifier(modifier); + const modType = modifierTypes.MYSTERY_ENCOUNTER_OLD_GATEAU().generateType(scene.getParty(), [20, stats]); + const modifier = modType?.newModifier(newPokemon); + if (modifier) { + scene.addModifier(modifier); + } } // Enable passive if previous had it @@ -422,8 +424,8 @@ function getOriginalBst(scene: BattleScene, pokemon: Pokemon) { } function getTransformedSpecies(originalBst: number, bstSearchRange: [number, number], hasPokemonBstHigherThan600: boolean, hasPokemonBstBetween570And600: boolean, alreadyUsedSpecies: PokemonSpecies[]): PokemonSpecies { - let newSpecies: PokemonSpecies; - while (!newSpecies) { + let newSpecies: PokemonSpecies | undefined; + while (isNullOrUndefined(newSpecies)) { const bstCap = originalBst + bstSearchRange[1]; const bstMin = Math.max(originalBst + bstSearchRange[0], 0); @@ -442,7 +444,7 @@ function getTransformedSpecies(originalBst: number, bstSearchRange: [number, num if (validSpecies?.length > 20) { validSpecies = randSeedShuffle(validSpecies); newSpecies = validSpecies.pop(); - while (alreadyUsedSpecies.includes(newSpecies)) { + while (isNullOrUndefined(newSpecies) || alreadyUsedSpecies.includes(newSpecies!)) { newSpecies = validSpecies.pop(); } } else { @@ -452,7 +454,7 @@ function getTransformedSpecies(originalBst: number, bstSearchRange: [number, num } } - return newSpecies; + return newSpecies!; } function doShowDreamBackground(scene: BattleScene) { @@ -503,7 +505,7 @@ function doHideDreamBackground(scene: BattleScene) { function doSideBySideTransformations(scene: BattleScene, transformations: PokemonTransformation[]) { return new Promise(resolve => { - const allTransformationPromises = []; + const allTransformationPromises: Promise[] = []; for (let i = 0; i < 3; i++) { const delay = i * 4000; scene.time.delayedCall(delay, () => { diff --git a/src/data/mystery-encounters/mystery-encounter-option.ts b/src/data/mystery-encounters/mystery-encounter-option.ts index d4cf56ae17c..086706075e7 100644 --- a/src/data/mystery-encounters/mystery-encounter-option.ts +++ b/src/data/mystery-encounters/mystery-encounter-option.ts @@ -8,16 +8,32 @@ import { EncounterPokemonRequirement, EncounterSceneRequirement, MoneyRequiremen import { CanLearnMoveRequirement, CanLearnMoveRequirementOptions } from "./requirements/can-learn-move-requirement"; import { isNullOrUndefined } from "#app/utils"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; -import MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter"; export type OptionPhaseCallback = (scene: BattleScene) => Promise; -// export default interface MysteryEncounterOption { -// -// } +/** + * Used by {@link MysteryEncounterOptionBuilder} class to define required/optional properties on the {@link MysteryEncounterOption} class when building. + * + * Should ONLY contain properties that are necessary for {@link MysteryEncounterOption} construction. + * Post-construct and flag data properties are defined in the {@link MysteryEncounterOption} class itself. + */ +export interface IMysteryEncounterOption { + optionMode: MysteryEncounterOptionMode; + hasDexProgress: boolean; + requirements: EncounterSceneRequirement[]; + primaryPokemonRequirements: EncounterPokemonRequirement[]; + secondaryPokemonRequirements: EncounterPokemonRequirement[]; + excludePrimaryFromSecondaryRequirements: boolean; -export default class MysteryEncounterOption { + dialogue?: OptionTextDisplay; + + onPreOptionPhase?: OptionPhaseCallback; + onOptionPhase: OptionPhaseCallback; + onPostOptionPhase?: OptionPhaseCallback; +} + +export default class MysteryEncounterOption implements IMysteryEncounterOption { optionMode: MysteryEncounterOptionMode; hasDexProgress: boolean; requirements: EncounterSceneRequirement[]; @@ -40,12 +56,14 @@ export default class MysteryEncounterOption { /** Executes after the encounter is over. Usually this will be for calculating dialogueTokens or performing data updates */ onPostOptionPhase?: OptionPhaseCallback; - constructor(option: MysteryEncounterOption | null) { - Object.assign(this, option); - this.hasDexProgress = !isNullOrUndefined(this.hasDexProgress) ? this.hasDexProgress : false; - this.requirements = this.requirements ? this.requirements : []; - this.primaryPokemonRequirements = this.primaryPokemonRequirements ? this.primaryPokemonRequirements : []; - this.secondaryPokemonRequirements = this.secondaryPokemonRequirements ? this.secondaryPokemonRequirements : []; + constructor(option: IMysteryEncounterOption | null) { + if (!isNullOrUndefined(option)) { + Object.assign(this, option); + } + this.hasDexProgress = this.hasDexProgress ?? false; + this.requirements = this.requirements ?? []; + this.primaryPokemonRequirements = this.primaryPokemonRequirements ?? []; + this.secondaryPokemonRequirements = this.secondaryPokemonRequirements ?? []; } hasRequirements() { @@ -70,7 +88,8 @@ export default class MysteryEncounterOption { for (const req of this.primaryPokemonRequirements) { if (req.meetsRequirement(scene)) { if (req instanceof EncounterPokemonRequirement) { - qualified = qualified.filter(pkmn => req.queryParty(scene.getParty()).includes(pkmn)); + const queryParty = req.queryParty(scene.getParty()); + qualified = qualified.filter(pkmn => queryParty.includes(pkmn)); } } else { this.primaryPokemon = undefined; @@ -125,8 +144,8 @@ export default class MysteryEncounterOption { for (const req of this.secondaryPokemonRequirements) { if (req.meetsRequirement(scene)) { if (req instanceof EncounterPokemonRequirement) { - qualified = qualified.filter(pkmn => req.queryParty(scene.getParty()).includes(pkmn)); - + const queryParty = req.queryParty(scene.getParty()); + qualified = qualified.filter(pkmn => queryParty.includes(pkmn)); } } else { this.secondaryPokemon = []; @@ -138,7 +157,7 @@ export default class MysteryEncounterOption { } } -export class MysteryEncounterOptionBuilder implements Partial { +export class MysteryEncounterOptionBuilder implements Partial { optionMode: MysteryEncounterOptionMode = MysteryEncounterOptionMode.DEFAULT; requirements: EncounterSceneRequirement[] = []; primaryPokemonRequirements: EncounterPokemonRequirement[] = []; @@ -146,26 +165,17 @@ export class MysteryEncounterOptionBuilder implements Partial { + static newOptionWithMode(optionMode: MysteryEncounterOptionMode): MysteryEncounterOptionBuilder & Pick { return Object.assign(new MysteryEncounterOptionBuilder(), { optionMode }); } - withHasDexProgress(hasDexProgress: boolean): this & Required> { + withHasDexProgress(hasDexProgress: boolean): this & Required> { return Object.assign(this, { hasDexProgress: hasDexProgress }); } - withSceneRequirement(requirement: EncounterSceneRequirement): this & Required> { + withSceneRequirement(requirement: EncounterSceneRequirement): this & Required> { if (requirement instanceof EncounterPokemonRequirement) { Error("Incorrectly added pokemon requirement as scene requirement."); } @@ -174,23 +184,23 @@ export class MysteryEncounterOptionBuilder implements Partial> { + withPreOptionPhase(onPreOptionPhase: OptionPhaseCallback): this & Required> { return Object.assign(this, { onPreOptionPhase: onPreOptionPhase }); } - withOptionPhase(onOptionPhase: OptionPhaseCallback): this & Required> { + withOptionPhase(onOptionPhase: OptionPhaseCallback): this & Required> { return Object.assign(this, { onOptionPhase: onOptionPhase }); } - withPostOptionPhase(onPostOptionPhase: OptionPhaseCallback): this & Required> { + withPostOptionPhase(onPostOptionPhase: OptionPhaseCallback): this & Required> { return Object.assign(this, { onPostOptionPhase: onPostOptionPhase }); } - withPrimaryPokemonRequirement(requirement: EncounterPokemonRequirement): this & Required> { + withPrimaryPokemonRequirement(requirement: EncounterPokemonRequirement): this & Required> { if (requirement instanceof EncounterSceneRequirement) { Error("Incorrectly added scene requirement as pokemon requirement."); } @@ -223,7 +233,7 @@ export class MysteryEncounterOptionBuilder implements Partial> { + withSecondaryPokemonRequirement(requirement: EncounterPokemonRequirement, excludePrimaryFromSecondaryRequirements: boolean = true): this & Required> { if (requirement instanceof EncounterSceneRequirement) { Error("Incorrectly added scene requirement as pokemon requirement."); } @@ -244,7 +254,7 @@ export class MysteryEncounterOptionBuilder implements Partial 0) { + if (this.scalingMultiplier > 0) { this.requiredMoney = scene.getWaveMoneyAmount(this.scalingMultiplier); } - return !(this?.requiredMoney > 0 && this.requiredMoney > money); + return !(this.requiredMoney > 0 && this.requiredMoney > money); } getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] { - const value = this?.scalingMultiplier > 0 ? scene.getWaveMoneyAmount(this.scalingMultiplier).toString() : this.requiredMoney.toString(); + const value = this.scalingMultiplier > 0 ? scene.getWaveMoneyAmount(this.scalingMultiplier).toString() : this.requiredMoney.toString(); return ["money", value]; } } @@ -367,10 +367,10 @@ export class NatureRequirement extends EncounterPokemonRequirement { } getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] { - if (this.requiredNature.includes(pokemon.nature)) { - return ["nature", Nature[pokemon.nature]]; + if (!isNullOrUndefined(pokemon?.nature) && this.requiredNature.includes(pokemon!.nature)) { + return ["nature", Nature[pokemon!.nature]]; } - return null; + return ["nature", ""]; } } @@ -537,9 +537,9 @@ export class EvolutionTargetSpeciesRequirement extends EncounterPokemonRequireme getMatchingDialogueToken(str:string, pokemon: PlayerPokemon): [RegExp, string] { const evos = this.requiredEvolutionTargetSpecies.filter((evolutionTargetSpecies) => pokemon.getEvolution().speciesId === evolutionTargetSpecies); if (evos.length > 0) { - return ["Evolution", Species[evos[0]]]; + return ["evolution", Species[evos[0]]]; } - return null; + return ["evolution", ""]; } }*/ @@ -622,7 +622,7 @@ export class StatusEffectRequirement extends EncounterPokemonRequirement { return !this.requiredStatusEffect.some((statusEffect) => { if (statusEffect === StatusEffect.NONE) { // StatusEffect.NONE also checks for null or undefined status - return isNullOrUndefined(pokemon.status) || isNullOrUndefined(pokemon.status.effect) || pokemon.status?.effect === statusEffect; + return isNullOrUndefined(pokemon.status) || isNullOrUndefined(pokemon.status!.effect) || pokemon.status?.effect === statusEffect; } else { return pokemon.status?.effect === statusEffect; } @@ -634,9 +634,9 @@ export class StatusEffectRequirement extends EncounterPokemonRequirement { getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] { const reqStatus = this.requiredStatusEffect.filter((a) => { if (a === StatusEffect.NONE) { - return isNullOrUndefined(pokemon.status) || isNullOrUndefined(pokemon.status.effect) || pokemon.status?.effect === a; + return isNullOrUndefined(pokemon?.status) || isNullOrUndefined(pokemon!.status!.effect) || pokemon!.status!.effect === a; } - return pokemon.status?.effect === a; + return pokemon!.status?.effect === a; }); if (reqStatus.length > 0) { return ["status", StatusEffect[reqStatus[0]]]; @@ -698,7 +698,7 @@ export class CanFormChangeWithItemRequirement extends EncounterPokemonRequiremen if (requiredItems.length > 0) { return ["formChangeItem", FormChangeItem[requiredItems[0]]]; } - return null; + return ["formChangeItem", ""]; } } @@ -748,7 +748,7 @@ export class CanEvolveWithItemRequirement extends EncounterPokemonRequirement { if (requiredItems.length > 0) { return ["evolutionItem", EvolutionItem[requiredItems[0]]]; } - return null; + return ["evolutionItem", ""]; } } @@ -789,18 +789,18 @@ export class HeldItemRequirement extends EncounterPokemonRequirement { } getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] { - const requiredItems = pokemon.getHeldItems().filter((it) => { + const requiredItems = pokemon?.getHeldItems().filter((it) => { return this.requiredHeldItemModifiers.some(heldItem => it.constructor.name === heldItem); }); - if (requiredItems.length > 0) { + if (requiredItems && requiredItems.length > 0) { return ["heldItem", requiredItems[0].type.name]; } - return null; + return ["heldItem", ""]; } } export class LevelRequirement extends EncounterPokemonRequirement { - requiredLevelRange?: [number, number]; + requiredLevelRange: [number, number]; minNumberOfPokemon: number; invertQuery: boolean; @@ -809,12 +809,11 @@ export class LevelRequirement extends EncounterPokemonRequirement { this.minNumberOfPokemon = minNumberOfPokemon; this.invertQuery = invertQuery; this.requiredLevelRange = requiredLevelRange; - } meetsRequirement(scene: BattleScene): boolean { // Party Pokemon inside required level range - if (!isNullOrUndefined(this?.requiredLevelRange) && this.requiredLevelRange?.[0] <= this.requiredLevelRange?.[1]) { + if (!isNullOrUndefined(this.requiredLevelRange) && this.requiredLevelRange[0] <= this.requiredLevelRange[1]) { const partyPokemon = scene.getParty(); const pokemonInRange = this.queryParty(partyPokemon); if (pokemonInRange.length < this.minNumberOfPokemon) { @@ -834,12 +833,12 @@ export class LevelRequirement extends EncounterPokemonRequirement { } getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] { - return ["level", pokemon.level.toString()]; + return ["level", pokemon?.level.toString() ?? ""]; } } export class FriendshipRequirement extends EncounterPokemonRequirement { - requiredFriendshipRange?: [number, number]; + requiredFriendshipRange: [number, number]; minNumberOfPokemon: number; invertQuery: boolean; @@ -852,7 +851,7 @@ export class FriendshipRequirement extends EncounterPokemonRequirement { meetsRequirement(scene: BattleScene): boolean { // Party Pokemon inside required friendship range - if (!isNullOrUndefined(this?.requiredFriendshipRange) && this.requiredFriendshipRange?.[0] <= this.requiredFriendshipRange?.[1]) { + if (!isNullOrUndefined(this.requiredFriendshipRange) && this.requiredFriendshipRange[0] <= this.requiredFriendshipRange[1]) { const partyPokemon = scene.getParty(); const pokemonInRange = this.queryParty(partyPokemon); if (pokemonInRange.length < this.minNumberOfPokemon) { @@ -872,7 +871,7 @@ export class FriendshipRequirement extends EncounterPokemonRequirement { } getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] { - return ["friendship", pokemon.friendship.toString()]; + return ["friendship", pokemon?.friendship.toString() ?? ""]; } } @@ -882,7 +881,7 @@ export class FriendshipRequirement extends EncounterPokemonRequirement { * 1 -> 100% hp */ export class HealthRatioRequirement extends EncounterPokemonRequirement { - requiredHealthRange?: [number, number]; + requiredHealthRange: [number, number]; minNumberOfPokemon: number; invertQuery: boolean; @@ -895,7 +894,7 @@ export class HealthRatioRequirement extends EncounterPokemonRequirement { meetsRequirement(scene: BattleScene): boolean { // Party Pokemon inside required level range - if (!isNullOrUndefined(this?.requiredHealthRange) && this.requiredHealthRange?.[0] <= this.requiredHealthRange?.[1]) { + if (!isNullOrUndefined(this.requiredHealthRange) && this.requiredHealthRange[0] <= this.requiredHealthRange[1]) { const partyPokemon = scene.getParty(); const pokemonInRange = this.queryParty(partyPokemon); if (pokemonInRange.length < this.minNumberOfPokemon) { @@ -917,12 +916,15 @@ export class HealthRatioRequirement extends EncounterPokemonRequirement { } getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] { - return ["healthRatio", Math.floor(pokemon.getHpRatio() * 100).toString() + "%"]; + if (!isNullOrUndefined(pokemon?.getHpRatio())) { + return ["healthRatio", Math.floor(pokemon!.getHpRatio() * 100).toString() + "%"]; + } + return ["healthRatio", ""]; } } export class WeightRequirement extends EncounterPokemonRequirement { - requiredWeightRange?: [number, number]; + requiredWeightRange: [number, number]; minNumberOfPokemon: number; invertQuery: boolean; @@ -935,7 +937,7 @@ export class WeightRequirement extends EncounterPokemonRequirement { meetsRequirement(scene: BattleScene): boolean { // Party Pokemon inside required friendship range - if (!isNullOrUndefined(this?.requiredWeightRange) && this.requiredWeightRange?.[0] <= this.requiredWeightRange?.[1]) { + if (!isNullOrUndefined(this.requiredWeightRange) && this.requiredWeightRange[0] <= this.requiredWeightRange[1]) { const partyPokemon = scene.getParty(); const pokemonInRange = this.queryParty(partyPokemon); if (pokemonInRange.length < this.minNumberOfPokemon) { @@ -955,7 +957,7 @@ export class WeightRequirement extends EncounterPokemonRequirement { } getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] { - return ["weight", pokemon.getWeight().toString()]; + return ["weight", pokemon?.getWeight().toString() ?? ""]; } } diff --git a/src/data/mystery-encounters/mystery-encounter.ts b/src/data/mystery-encounters/mystery-encounter.ts index cae68150255..3db97bf1f98 100644 --- a/src/data/mystery-encounters/mystery-encounter.ts +++ b/src/data/mystery-encounters/mystery-encounter.ts @@ -24,14 +24,41 @@ export interface EncounterStartOfBattleEffect { followUp?: boolean; } -interface IMysteryEncounter { - meetsRequirements(scene: BattleScene): boolean; - pokemonMeetsPrimaryRequirements(scene: BattleScene, pokemon: Pokemon): boolean; - initIntroVisuals(scene: BattleScene): void; - populateDialogueTokensFromRequirements(scene: BattleScene): void; - setDialogueToken(key: string, value: string): void; - getSeedOffset(): number; - updateSeedOffset(scene: BattleScene): void; +/** + * Used by {@link MysteryEncounterBuilder} class to define required/optional properties on the {@link MysteryEncounter} class when building. + * + * Should ONLY contain properties that are necessary for {@link MysteryEncounter} construction. + * Post-construct and flag data properties are defined in the {@link MysteryEncounter} class itself. + */ +export interface IMysteryEncounter { + encounterType: MysteryEncounterType; + options: [MysteryEncounterOption, MysteryEncounterOption, ...MysteryEncounterOption[]]; + spriteConfigs: MysteryEncounterSpriteConfig[]; + encounterTier: MysteryEncounterTier; + encounterAnimations?: EncounterAnim[]; + hideBattleIntroMessage: boolean; + autoHideIntroVisuals: boolean; + enterIntroVisualsFromRight: boolean; + catchAllowed: boolean; + continuousEncounter: boolean; + maxAllowedEncounters: number; + + onInit?: (scene: BattleScene) => boolean; + onVisualsStart?: (scene: BattleScene) => boolean; + doEncounterExp?: (scene: BattleScene) => boolean; + doEncounterRewards?: (scene: BattleScene) => boolean; + doContinueEncounter?: (scene: BattleScene) => Promise; + + requirements: EncounterSceneRequirement[]; + primaryPokemonRequirements: EncounterPokemonRequirement[]; + secondaryPokemonRequirements: EncounterPokemonRequirement[]; + excludePrimaryFromSupportRequirements: boolean; + + dialogue: MysteryEncounterDialogue; + enemyPartyConfigs: EnemyPartyConfig[]; + + dialogueTokens: Record; + expMultiplier: number; } /** @@ -147,7 +174,7 @@ export default class MysteryEncounter implements IMysteryEncounter { * Can be set for uses programatic dialogue during an encounter (storing the name of one of the party's pokemon, etc.) * Example use: see MYSTERIOUS_CHEST */ - dialogueTokens: Map; + dialogueTokens: Record; /** * Should be set depending upon option selected as part of an encounter * For example, if there is no battle as part of the encounter/selected option, should be set to NO_BATTLE @@ -171,7 +198,7 @@ export default class MysteryEncounter implements IMysteryEncounter { /** * Will be set by option select handlers automatically, and can be used to refer to which option was chosen by later phases */ - startOfBattleEffects?: EncounterStartOfBattleEffect[]; + startOfBattleEffects: EncounterStartOfBattleEffect[] = []; /** * Can be set higher or lower based on the type of battle or exp gained for an option/encounter * Defaults to 1 @@ -188,7 +215,7 @@ export default class MysteryEncounter implements IMysteryEncounter { */ private seedOffset?: any; - constructor(encounter: MysteryEncounter | null) { + constructor(encounter: IMysteryEncounter | null) { if (!isNullOrUndefined(encounter)) { Object.assign(this, encounter); } @@ -207,9 +234,9 @@ export default class MysteryEncounter implements IMysteryEncounter { // Reset any dirty flags or encounter data this.startOfBattleEffectsComplete = false; this.lockEncounterRewardTiers = true; - this.dialogueTokens = new Map(); + this.dialogueTokens = {}; this.enemyPartyConfigs = []; - this.startOfBattleEffects = []; + // this.startOfBattleEffects = []; this.introVisuals = undefined; this.misc = null; this.expMultiplier = 1; @@ -361,7 +388,7 @@ export default class MysteryEncounter implements IMysteryEncounter { const opt = this.options[i]; opt.meetsRequirements(scene); const j = i + 1; - if (opt.requirements?.length > 0) { + if (opt.requirements.length > 0) { for (const req of opt.requirements) { const dialogueToken = req.getDialogueToken(scene); if (dialogueToken?.length === 2) { @@ -369,7 +396,7 @@ export default class MysteryEncounter implements IMysteryEncounter { } } } - if (opt.primaryPokemonRequirements?.length > 0 && opt.primaryPokemon && opt.primaryPokemon.length > 0) { + if (opt.primaryPokemonRequirements.length > 0 && opt.primaryPokemon) { this.setDialogueToken("option" + j + "PrimaryName", opt.primaryPokemon.getNameToRender()); for (const req of opt.primaryPokemonRequirements) { if (!req.invertQuery) { @@ -424,26 +451,16 @@ export default class MysteryEncounter implements IMysteryEncounter { * Builder class for creating a MysteryEncounter * must call `build()` at the end after specifying all params for the MysteryEncounter */ -export class MysteryEncounterBuilder implements Partial { - encounterType: MysteryEncounterType; - encounterMode: MysteryEncounterMode; - options: [MysteryEncounterOption, MysteryEncounterOption, ...MysteryEncounterOption[]] = [new MysteryEncounterOption(null), new MysteryEncounterOption(null)]; - spriteConfigs: MysteryEncounterSpriteConfig[]; +export class MysteryEncounterBuilder implements Partial { + options: [MysteryEncounterOption, MysteryEncounterOption, ...MysteryEncounterOption[]]; enemyPartyConfigs: EnemyPartyConfig[] = []; dialogue: MysteryEncounterDialogue = {}; - encounterTier: MysteryEncounterTier; - encounterAnimations: EncounterAnim[]; requirements: EncounterSceneRequirement[] = []; primaryPokemonRequirements: EncounterPokemonRequirement[] = []; secondaryPokemonRequirements: EncounterPokemonRequirement[] = []; - excludePrimaryFromSupportRequirements: boolean; - dialogueTokens: Map = new Map(); - - doEncounterExp?: (scene: BattleScene) => boolean; - doEncounterRewards?: (scene: BattleScene) => boolean; - onInit?: (scene: BattleScene) => boolean; - onVisualsStart?: (scene: BattleScene) => boolean; + excludePrimaryFromSupportRequirements: boolean = true; + dialogueTokens: Record = {}; hideBattleIntroMessage: boolean = false; autoHideIntroVisuals: boolean = true; @@ -455,21 +472,6 @@ export class MysteryEncounterBuilder implements Partial { maxAllowedEncounters: number = 3; expMultiplier: number = 1; - /** - * Builder class has to re-declare the {@link MysteryEncounter} class functions so - * the compiler does not yell about user not defining a non-optional property - */ - - meetsRequirements = MysteryEncounter.prototype["meetsRequirements"]; - pokemonMeetsPrimaryRequirements = MysteryEncounter.prototype["pokemonMeetsPrimaryRequirements"]; - initIntroVisuals = MysteryEncounter.prototype["initIntroVisuals"]; - populateDialogueTokensFromRequirements = MysteryEncounter.prototype["populateDialogueTokensFromRequirements"]; - setDialogueToken = MysteryEncounter.prototype["setDialogueToken"]; - getSeedOffset = MysteryEncounter.prototype["getSeedOffset"]; - updateSeedOffset = MysteryEncounter.prototype["updateSeedOffset"]; - meetsPrimaryRequirementAndPrimaryPokemonSelected = MysteryEncounter.prototype["meetsPrimaryRequirementAndPrimaryPokemonSelected"]; - meetsSecondaryRequirementAndSecondaryPokemonSelected = MysteryEncounter.prototype["meetsSecondaryRequirementAndSecondaryPokemonSelected"]; - /** * REQUIRED */ @@ -480,7 +482,7 @@ export class MysteryEncounterBuilder implements Partial { * @param encounterType * @returns this */ - static withEncounterType(encounterType: MysteryEncounterType): MysteryEncounterBuilder & Pick { + static withEncounterType(encounterType: MysteryEncounterType): MysteryEncounterBuilder & Pick { return Object.assign(new MysteryEncounterBuilder(), { encounterType }); } @@ -492,14 +494,13 @@ export class MysteryEncounterBuilder implements Partial { * @param option - MysteryEncounterOption to add, can use MysteryEncounterOptionBuilder to create instance * @returns */ - withOption(option: MysteryEncounterOption): this & Pick { - if (this.options[0] === null) { - return Object.assign(this, { options: [option, this.options[0]] }); - } else if (this.options[1] === null) { - return Object.assign(this, { options: [this.options[0], option] }); + withOption(option: MysteryEncounterOption): this & Pick { + if (!this.options) { + const options = [option]; + return Object.assign(this, { options }); } else { this.options.push(option); - return Object.assign(this, { options: this.options }); + return this; } } @@ -514,7 +515,7 @@ export class MysteryEncounterBuilder implements Partial { * @param callback - {@linkcode OptionPhaseCallback} * @returns */ - withSimpleOption(dialogue: OptionTextDisplay, callback: OptionPhaseCallback): this & Pick { + withSimpleOption(dialogue: OptionTextDisplay, callback: OptionPhaseCallback): this & Pick { return this.withOption(MysteryEncounterOptionBuilder.newOptionWithMode(MysteryEncounterOptionMode.DEFAULT).withDialogue(dialogue).withOptionPhase(callback).build()); } @@ -528,7 +529,7 @@ export class MysteryEncounterBuilder implements Partial { * @param callback - {@linkcode OptionPhaseCallback} * @returns */ - withSimpleDexProgressOption(dialogue: OptionTextDisplay, callback: OptionPhaseCallback): this & Pick { + withSimpleDexProgressOption(dialogue: OptionTextDisplay, callback: OptionPhaseCallback): this & Pick { return this.withOption(MysteryEncounterOptionBuilder .newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) .withHasDexProgress(true) @@ -542,7 +543,7 @@ export class MysteryEncounterBuilder implements Partial { * @param spriteConfigs * @returns */ - withIntroSpriteConfigs(spriteConfigs: MysteryEncounterSpriteConfig[]): this & Pick { + withIntroSpriteConfigs(spriteConfigs: MysteryEncounterSpriteConfig[]): this & Pick { return Object.assign(this, { spriteConfigs: spriteConfigs }); } @@ -571,7 +572,7 @@ export class MysteryEncounterBuilder implements Partial { * @param encounterTier * @returns */ - withEncounterTier(encounterTier: MysteryEncounterTier): this & Pick { + withEncounterTier(encounterTier: MysteryEncounterTier): this & Pick { return Object.assign(this, { encounterTier: encounterTier }); } @@ -582,7 +583,7 @@ export class MysteryEncounterBuilder implements Partial { * @param encounterAnimations * @returns */ - withAnimations(...encounterAnimations: EncounterAnim[]): this & Required> { + withAnimations(...encounterAnimations: EncounterAnim[]): this & Required> { const animations = Array.isArray(encounterAnimations) ? encounterAnimations : [encounterAnimations]; return Object.assign(this, { encounterAnimations: animations }); } @@ -593,7 +594,7 @@ export class MysteryEncounterBuilder implements Partial { * Default false * @param continuousEncounter */ - withContinuousEncounter(continuousEncounter: boolean): this & Required> { + withContinuousEncounter(continuousEncounter: boolean): this & Required> { return Object.assign(this, { continuousEncounter: continuousEncounter }); } @@ -602,7 +603,7 @@ export class MysteryEncounterBuilder implements Partial { * @param maxAllowedEncounters * @returns */ - withMaxAllowedEncounters(maxAllowedEncounters: number): this & Required> { + withMaxAllowedEncounters(maxAllowedEncounters: number): this & Required> { return Object.assign(this, { maxAllowedEncounters: maxAllowedEncounters }); } @@ -613,12 +614,12 @@ export class MysteryEncounterBuilder implements Partial { * @param requirement * @returns */ - withSceneRequirement(requirement: EncounterSceneRequirement): this & Required> { + withSceneRequirement(requirement: EncounterSceneRequirement): this & Required> { if (requirement instanceof EncounterPokemonRequirement) { Error("Incorrectly added pokemon requirement as scene requirement."); } this.requirements.push(requirement); - return Object.assign(this, { requirements: this.requirements }); + return this; } /** @@ -628,7 +629,7 @@ export class MysteryEncounterBuilder implements Partial { * @param max optional max wave. If not given, defaults to min => exact wave * @returns */ - withSceneWaveRangeRequirement(min: number, max?: number): this & Required> { + withSceneWaveRangeRequirement(min: number, max?: number): this & Required> { return this.withSceneRequirement(new WaveRangeRequirement([min, max ?? min])); } @@ -640,7 +641,7 @@ export class MysteryEncounterBuilder implements Partial { * @param excludeFainted - if true, only counts unfainted mons * @returns */ - withScenePartySizeRequirement(min: number, max?: number, excludeFainted: boolean = false): this & Required> { + withScenePartySizeRequirement(min: number, max?: number, excludeFainted: boolean = false): this & Required> { return this.withSceneRequirement(new PartySizeRequirement([min, max ?? min], excludeFainted)); } @@ -650,7 +651,7 @@ export class MysteryEncounterBuilder implements Partial { * @param requirement {@linkcode EncounterPokemonRequirement} * @returns */ - withPrimaryPokemonRequirement(requirement: EncounterPokemonRequirement): this & Required> { + withPrimaryPokemonRequirement(requirement: EncounterPokemonRequirement): this & Required> { if (requirement instanceof EncounterSceneRequirement) { Error("Incorrectly added scene requirement as pokemon requirement."); } @@ -667,7 +668,7 @@ export class MysteryEncounterBuilder implements Partial { * @param invertQuery if true will invert the query * @returns */ - withPrimaryPokemonStatusEffectRequirement(statusEffect: StatusEffect | StatusEffect[], minNumberOfPokemon: number = 1, invertQuery: boolean = false): this & Required> { + withPrimaryPokemonStatusEffectRequirement(statusEffect: StatusEffect | StatusEffect[], minNumberOfPokemon: number = 1, invertQuery: boolean = false): this & Required> { return this.withPrimaryPokemonRequirement(new StatusEffectRequirement(statusEffect, minNumberOfPokemon, invertQuery)); } @@ -679,14 +680,14 @@ export class MysteryEncounterBuilder implements Partial { * @param invertQuery if true will invert the query * @returns */ - withPrimaryPokemonHealthRatioRequirement(requiredHealthRange: [number, number], minNumberOfPokemon: number = 1, invertQuery: boolean = false): this & Required> { + withPrimaryPokemonHealthRatioRequirement(requiredHealthRange: [number, number], minNumberOfPokemon: number = 1, invertQuery: boolean = false): this & Required> { return this.withPrimaryPokemonRequirement(new HealthRatioRequirement(requiredHealthRange, minNumberOfPokemon, invertQuery)); } // TODO: Maybe add an optional parameter for excluding primary pokemon from the support cast? // ex. if your only grass type pokemon, a snivy, is chosen as primary, if the support pokemon requires a grass type, the event won't trigger because // it's already been - withSecondaryPokemonRequirement(requirement: EncounterPokemonRequirement, excludePrimaryFromSecondaryRequirements: boolean = false): this & Required> { + withSecondaryPokemonRequirement(requirement: EncounterPokemonRequirement, excludePrimaryFromSecondaryRequirements: boolean = false): this & Required> { if (requirement instanceof EncounterSceneRequirement) { Error("Incorrectly added scene requirement as pokemon requirement."); } @@ -706,7 +707,7 @@ export class MysteryEncounterBuilder implements Partial { * @param doEncounterRewards - synchronous callback function to perform during rewards phase of the encounter * @returns */ - withRewards(doEncounterRewards: (scene: BattleScene) => boolean): this & Required> { + withRewards(doEncounterRewards: (scene: BattleScene) => boolean): this & Required> { return Object.assign(this, { doEncounterRewards: doEncounterRewards }); } @@ -720,7 +721,7 @@ export class MysteryEncounterBuilder implements Partial { * @param doEncounterExp - synchronous callback function to perform during rewards phase of the encounter * @returns */ - withExp(doEncounterExp: (scene: BattleScene) => boolean): this & Required> { + withExp(doEncounterExp: (scene: BattleScene) => boolean): this & Required> { return Object.assign(this, { doEncounterExp: doEncounterExp }); } @@ -731,8 +732,8 @@ export class MysteryEncounterBuilder implements Partial { * @param onInit - synchronous callback function to perform as soon as the encounter is selected for the next phase * @returns */ - withOnInit(onInit: (scene: BattleScene) => boolean): this & Required> { - return Object.assign(this, { onInit: onInit }); + withOnInit(onInit: (scene: BattleScene) => boolean): this & Required> { + return Object.assign(this, { onInit }); } /** @@ -741,7 +742,7 @@ export class MysteryEncounterBuilder implements Partial { * @param onVisualsStart - synchronous callback function to perform as soon as the enemy field finishes sliding in * @returns */ - withOnVisualsStart(onVisualsStart: (scene: BattleScene) => boolean): this & Required> { + withOnVisualsStart(onVisualsStart: (scene: BattleScene) => boolean): this & Required> { return Object.assign(this, { onVisualsStart: onVisualsStart }); } @@ -751,7 +752,7 @@ export class MysteryEncounterBuilder implements Partial { * @param catchAllowed - if true, allows enemy pokemon to be caught during the encounter * @returns */ - withCatchAllowed(catchAllowed: boolean): this & Required> { + withCatchAllowed(catchAllowed: boolean): this & Required> { return Object.assign(this, { catchAllowed: catchAllowed }); } @@ -759,7 +760,7 @@ export class MysteryEncounterBuilder implements Partial { * @param hideBattleIntroMessage - if true, will not show the trainerAppeared/wildAppeared/bossAppeared message for an encounter * @returns */ - withHideWildIntroMessage(hideBattleIntroMessage: boolean): this & Required> { + withHideWildIntroMessage(hideBattleIntroMessage: boolean): this & Required> { return Object.assign(this, { hideBattleIntroMessage: hideBattleIntroMessage }); } @@ -767,7 +768,7 @@ export class MysteryEncounterBuilder implements Partial { * @param autoHideIntroVisuals - if false, will not hide the intro visuals that are displayed at the beginning of encounter * @returns */ - withAutoHideIntroVisuals(autoHideIntroVisuals: boolean): this & Required> { + withAutoHideIntroVisuals(autoHideIntroVisuals: boolean): this & Required> { return Object.assign(this, { autoHideIntroVisuals: autoHideIntroVisuals }); } @@ -776,7 +777,7 @@ export class MysteryEncounterBuilder implements Partial { * Default false * @returns */ - withEnterIntroVisualsFromRight(enterIntroVisualsFromRight: boolean): this & Required> { + withEnterIntroVisualsFromRight(enterIntroVisualsFromRight: boolean): this & Required> { return Object.assign(this, { enterIntroVisualsFromRight: enterIntroVisualsFromRight }); } @@ -856,7 +857,7 @@ export class MysteryEncounterBuilder implements Partial { * * @returns */ - build(this: MysteryEncounter): MysteryEncounter { + build(this: IMysteryEncounter): MysteryEncounter { return new MysteryEncounter(this); } } diff --git a/src/data/mystery-encounters/mystery-encounters.ts b/src/data/mystery-encounters/mystery-encounters.ts index 44f4ecf2420..b9e15302fe4 100644 --- a/src/data/mystery-encounters/mystery-encounters.ts +++ b/src/data/mystery-encounters/mystery-encounters.ts @@ -278,7 +278,7 @@ export function initMysteryEncounters() { extremeBiomeEncounters.forEach(encounter => { EXTREME_ENCOUNTER_BIOMES.forEach(biome => { const encountersForBiome = mysteryEncountersByBiome.get(biome); - if (!encountersForBiome.includes(encounter)) { + if (encountersForBiome && !encountersForBiome.includes(encounter)) { encountersForBiome.push(encounter); } }); @@ -287,7 +287,7 @@ export function initMysteryEncounters() { nonExtremeBiomeEncounters.forEach(encounter => { NON_EXTREME_ENCOUNTER_BIOMES.forEach(biome => { const encountersForBiome = mysteryEncountersByBiome.get(biome); - if (!encountersForBiome.includes(encounter)) { + if (encountersForBiome && !encountersForBiome.includes(encounter)) { encountersForBiome.push(encounter); } }); @@ -296,7 +296,7 @@ export function initMysteryEncounters() { humanTransitableBiomeEncounters.forEach(encounter => { HUMAN_TRANSITABLE_BIOMES.forEach(biome => { const encountersForBiome = mysteryEncountersByBiome.get(biome); - if (!encountersForBiome.includes(encounter)) { + if (encountersForBiome && !encountersForBiome.includes(encounter)) { encountersForBiome.push(encounter); } }); @@ -305,7 +305,7 @@ export function initMysteryEncounters() { civilizationBiomeEncounters.forEach(encounter => { CIVILIZATION_ENCOUNTER_BIOMES.forEach(biome => { const encountersForBiome = mysteryEncountersByBiome.get(biome); - if (!encountersForBiome.includes(encounter)) { + if (encountersForBiome && !encountersForBiome.includes(encounter)) { encountersForBiome.push(encounter); } }); diff --git a/src/data/mystery-encounters/requirements/can-learn-move-requirement.ts b/src/data/mystery-encounters/requirements/can-learn-move-requirement.ts index fb1d65342c1..9a0447d816d 100644 --- a/src/data/mystery-encounters/requirements/can-learn-move-requirement.ts +++ b/src/data/mystery-encounters/requirements/can-learn-move-requirement.ts @@ -1,6 +1,6 @@ import BattleScene from "#app/battle-scene"; import { Moves } from "#app/enums/moves"; -import { PlayerPokemon } from "#app/field/pokemon"; +import { PlayerPokemon, PokemonMove } from "#app/field/pokemon"; import { isNullOrUndefined } from "#app/utils"; import { EncounterPokemonRequirement } from "../mystery-encounter-requirements"; @@ -37,7 +37,7 @@ export class CanLearnMoveRequirement extends EncounterPokemonRequirement { this.excludeEggMoves = excludeEggMoves ?? false; this.includeFainted = includeFainted ?? false; this.minNumberOfPokemon = minNumberOfPokemon ?? 1; - this.invertQuery = invertQuery; + this.invertQuery = invertQuery ?? false; } override meetsRequirement(scene: BattleScene): boolean { @@ -66,7 +66,7 @@ export class CanLearnMoveRequirement extends EncounterPokemonRequirement { } override getDialogueToken(_scene: BattleScene, _pokemon?: PlayerPokemon): [string, string] { - return ["requiredMoves", this.requiredMoves.join(", ")]; + return ["requiredMoves", this.requiredMoves.map(m => new PokemonMove(m).getName()).join(", ")]; } private getPokemonLevelMoves(pkm: PlayerPokemon): Moves[] { diff --git a/src/data/mystery-encounters/utils/encounter-dialogue-utils.ts b/src/data/mystery-encounters/utils/encounter-dialogue-utils.ts index 382b2c7dde8..2ed2696182b 100644 --- a/src/data/mystery-encounters/utils/encounter-dialogue-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-dialogue-utils.ts @@ -4,34 +4,37 @@ import { UiTheme } from "#enums/ui-theme"; import { isNullOrUndefined } from "#app/utils"; import i18next from "i18next"; -export function getEncounterText(scene: BattleScene, keyOrString: string, primaryStyle?: TextStyle, uiTheme: UiTheme = UiTheme.DEFAULT): string { +export function getEncounterText(scene: BattleScene, keyOrString?: string, primaryStyle?: TextStyle, uiTheme: UiTheme = UiTheme.DEFAULT): string | null { if (isNullOrUndefined(keyOrString)) { return null; } - let textString: string = getTextWithDialogueTokens(scene, keyOrString); + let textString: string | null = getTextWithDialogueTokens(scene, keyOrString); // Can only color the text if a Primary Style is defined // primaryStyle is applied to all text that does not have its own specified style - if (primaryStyle) { + if (primaryStyle && textString) { textString = getTextWithColors(textString, primaryStyle, uiTheme); } return textString; } -function getTextWithDialogueTokens(scene: BattleScene, keyOrString: string): string { +function getTextWithDialogueTokens(scene: BattleScene, keyOrString?: string): string | null { if (isNullOrUndefined(keyOrString)) { return null; } - if (i18next.exists(keyOrString, scene.currentBattle?.mysteryEncounter?.dialogueTokens)) { + const tokens = scene.currentBattle?.mysteryEncounter?.dialogueTokens; + // @ts-ignore + if (i18next.exists(keyOrString, tokens)) { const stringArray = [`${keyOrString}`] as any; stringArray.raw = [`${keyOrString}`]; - return i18next.t(stringArray, scene.currentBattle?.mysteryEncounter?.dialogueTokens); + // @ts-ignore + return i18next.t(stringArray, tokens) as string; } - return keyOrString; + return keyOrString ?? null; } /** @@ -40,8 +43,8 @@ function getTextWithDialogueTokens(scene: BattleScene, keyOrString: string): str * @param contentKey */ export function queueEncounterMessage(scene: BattleScene, contentKey: string): void { - const text: string = getEncounterText(scene, contentKey); - scene.queueMessage(text, null, true); + const text: string | null = getEncounterText(scene, contentKey); + scene.queueMessage(text ?? "", null, true); } /** @@ -53,8 +56,8 @@ export function queueEncounterMessage(scene: BattleScene, contentKey: string): v */ export function showEncounterText(scene: BattleScene, contentKey: string, callbackDelay: number = 0, prompt: boolean = true): Promise { return new Promise(resolve => { - const text: string = getEncounterText(scene, contentKey); - scene.ui.showText(text, null, () => resolve(), callbackDelay, prompt); + const text: string | null = getEncounterText(scene, contentKey); + scene.ui.showText(text ?? "", null, () => resolve(), callbackDelay, prompt); }); } @@ -67,8 +70,8 @@ export function showEncounterText(scene: BattleScene, contentKey: string, callba */ export function showEncounterDialogue(scene: BattleScene, textContentKey: string, speakerContentKey: string, callbackDelay: number = 0): Promise { return new Promise(resolve => { - const text: string = getEncounterText(scene, textContentKey); - const speaker: string = getEncounterText(scene, speakerContentKey); - scene.ui.showDialogue(text, speaker, null, () => resolve(), callbackDelay); + const text: string | null = getEncounterText(scene, textContentKey); + const speaker: string | null = getEncounterText(scene, speakerContentKey); + scene.ui.showDialogue(text ?? "", speaker ?? "", null, () => resolve(), callbackDelay); }); } diff --git a/src/data/mystery-encounters/utils/encounter-phase-utils.ts b/src/data/mystery-encounters/utils/encounter-phase-utils.ts index c58e0fbad1f..9d74fa79ff0 100644 --- a/src/data/mystery-encounters/utils/encounter-phase-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-phase-utils.ts @@ -1,4 +1,4 @@ -import { BattlerIndex, BattleType } from "#app/battle"; +import Battle, { BattlerIndex, BattleType } from "#app/battle"; import { biomeLinks, BiomePoolTier } from "#app/data/biomes"; import MysteryEncounterOption from "#app/data/mystery-encounters/mystery-encounter-option"; import { WEIGHT_INCREMENT_ON_SPAWN_MISS } from "#app/data/mystery-encounters/mystery-encounters"; @@ -10,7 +10,7 @@ import { BattleEndPhase, EggLapsePhase, ExpPhase, GameOverPhase, MovePhase, Sele import { MysteryEncounterBattlePhase, MysteryEncounterBattleStartCleanupPhase, MysteryEncounterPhase, MysteryEncounterRewardsPhase } from "#app/phases/mystery-encounter-phases"; import PokemonData from "#app/system/pokemon-data"; import { OptionSelectConfig, OptionSelectItem } from "#app/ui/abstact-option-select-ui-handler"; -import { PartyOption, PartyUiMode } from "#app/ui/party-ui-handler"; +import { PartyOption, PartyUiMode, PokemonSelectFilter } from "#app/ui/party-ui-handler"; import { Mode } from "#app/ui/ui"; import * as Utils from "#app/utils"; import { isNullOrUndefined } from "#app/utils"; @@ -101,29 +101,30 @@ export interface EnemyPartyConfig { * @param partyConfig - Can pass various customizable attributes for the enemy party, see EnemyPartyConfig */ export async function initBattleWithEnemyConfig(scene: BattleScene, partyConfig: EnemyPartyConfig): Promise { - const loaded = false; - const loadEnemyAssets = []; + const loaded: boolean = false; + const loadEnemyAssets: Promise[] = []; - const battle = scene.currentBattle; + const battle: Battle = scene.currentBattle; - let doubleBattle = partyConfig?.doubleBattle; + let doubleBattle: boolean = partyConfig?.doubleBattle ?? false; // Trainer const trainerType = partyConfig?.trainerType; - let trainerConfig = partyConfig?.trainerConfig; - if (trainerType || trainerConfig) { + const partyTrainerConfig = partyConfig?.trainerConfig; + let trainerConfig: TrainerConfig; + if (!isNullOrUndefined(trainerType) || partyTrainerConfig) { scene.currentBattle.mysteryEncounter.encounterMode = MysteryEncounterMode.TRAINER_BATTLE; if (scene.currentBattle.trainer) { scene.currentBattle.trainer.setVisible(false); scene.currentBattle.trainer.destroy(); } - trainerConfig = partyConfig?.trainerConfig ? partyConfig?.trainerConfig : trainerConfigs[trainerType]; + trainerConfig = partyConfig?.trainerConfig ? partyConfig?.trainerConfig : trainerConfigs[trainerType!]; - const doubleTrainer = trainerConfig.doubleOnly || (trainerConfig.hasDouble && partyConfig.doubleBattle); + const doubleTrainer = trainerConfig.doubleOnly || (trainerConfig.hasDouble && !!partyConfig.doubleBattle); doubleBattle = doubleTrainer; const trainerFemale = isNullOrUndefined(partyConfig.female) ? !!(Utils.randSeedInt(2)) : partyConfig.female; - const newTrainer = new Trainer(scene, trainerConfig.trainerType, doubleTrainer ? TrainerVariant.DOUBLE : trainerFemale ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT, null, null, null, trainerConfig); + const newTrainer = new Trainer(scene, trainerConfig.trainerType, doubleTrainer ? TrainerVariant.DOUBLE : trainerFemale ? TrainerVariant.FEMALE : TrainerVariant.DEFAULT, undefined, undefined, undefined, trainerConfig); newTrainer.x += 300; newTrainer.setVisible(false); scene.field.add(newTrainer); @@ -134,7 +135,8 @@ export async function initBattleWithEnemyConfig(scene: BattleScene, partyConfig: } else { // Wild scene.currentBattle.mysteryEncounter.encounterMode = MysteryEncounterMode.WILD_BATTLE; - battle.enemyLevels = new Array(partyConfig?.pokemonConfigs?.length > 0 ? partyConfig?.pokemonConfigs?.length : doubleBattle ? 2 : 1).fill(null).map(() => scene.currentBattle.getLevelForWave()); + const numEnemies = partyConfig?.pokemonConfigs && partyConfig.pokemonConfigs.length > 0 ? partyConfig?.pokemonConfigs?.length : doubleBattle ? 2 : 1; + battle.enemyLevels = new Array(numEnemies).fill(null).map(() => scene.currentBattle.getLevelForWave()); } scene.getEnemyParty().forEach(enemyPokemon => enemyPokemon.destroy()); @@ -146,7 +148,7 @@ export async function initBattleWithEnemyConfig(scene: BattleScene, partyConfig: // This can be amplified or counteracted by setting levelAdditiveMultiplier in config // levelAdditiveMultiplier value of 0.5 will halve the modifier scaling, 2 will double it, etc. // Leaving null/undefined will disable level scaling - const mult = !isNullOrUndefined(partyConfig.levelAdditiveMultiplier) ? partyConfig.levelAdditiveMultiplier : 0; + const mult: number = !isNullOrUndefined(partyConfig.levelAdditiveMultiplier) ? partyConfig.levelAdditiveMultiplier! : 0; const additive = Math.max(Math.round((scene.currentBattle.waveIndex / 10) * mult), 0); battle.enemyLevels = battle.enemyLevels.map(level => level + additive); @@ -155,10 +157,10 @@ export async function initBattleWithEnemyConfig(scene: BattleScene, partyConfig: let dataSource; let isBoss = false; if (!loaded) { - if (trainerType || trainerConfig) { + if ((!isNullOrUndefined(trainerType) || trainerConfig) && battle.trainer) { // Allows overriding a trainer's pokemon to use specific species/data - if (e < partyConfig?.pokemonConfigs?.length) { - const config = partyConfig?.pokemonConfigs?.[e]; + if (partyConfig?.pokemonConfigs && e < partyConfig.pokemonConfigs.length) { + const config = partyConfig.pokemonConfigs[e]; level = config.level ? config.level : level; dataSource = config.dataSource; enemySpecies = config.species; @@ -168,8 +170,8 @@ export async function initBattleWithEnemyConfig(scene: BattleScene, partyConfig: battle.enemyParty[e] = battle.trainer.genPartyMember(e); } } else { - if (e < partyConfig?.pokemonConfigs?.length) { - const config = partyConfig?.pokemonConfigs?.[e]; + if (partyConfig?.pokemonConfigs && e < partyConfig.pokemonConfigs.length) { + const config = partyConfig.pokemonConfigs[e]; level = config.level ? config.level : level; dataSource = config.dataSource; enemySpecies = config.species; @@ -201,8 +203,8 @@ export async function initBattleWithEnemyConfig(scene: BattleScene, partyConfig: scene.gameData.setPokemonSeen(enemyPokemon, true, !!(trainerType || trainerConfig)); } - if (e < partyConfig?.pokemonConfigs?.length) { - const config = partyConfig?.pokemonConfigs?.[e]; + if (partyConfig?.pokemonConfigs && e < partyConfig.pokemonConfigs.length) { + const config = partyConfig.pokemonConfigs[e]; // Generate new id, reset status and HP in case using data source if (config.dataSource) { @@ -211,24 +213,24 @@ export async function initBattleWithEnemyConfig(scene: BattleScene, partyConfig: // Set form if (!isNullOrUndefined(config.formIndex)) { - enemyPokemon.formIndex = config.formIndex; + enemyPokemon.formIndex = config.formIndex!; } // Set shiny if (!isNullOrUndefined(config.shiny)) { - enemyPokemon.shiny = config.shiny; + enemyPokemon.shiny = config.shiny!; } // Set custom mystery encounter data fields (such as sprite scale, custom abilities, types, etc.) if (!isNullOrUndefined(config.mysteryEncounterData)) { - enemyPokemon.mysteryEncounterData = config.mysteryEncounterData; + enemyPokemon.mysteryEncounterData = config.mysteryEncounterData!; } // Set Boss if (config.isBoss) { - let segments = !isNullOrUndefined(config.bossSegments) ? config.bossSegments : scene.getEncounterBossSegments(scene.currentBattle.waveIndex, level, enemySpecies, true); + let segments = !isNullOrUndefined(config.bossSegments) ? config.bossSegments! : scene.getEncounterBossSegments(scene.currentBattle.waveIndex, level, enemySpecies, true); if (!isNullOrUndefined(config.bossSegmentModifier)) { - segments += config.bossSegmentModifier; + segments += config.bossSegmentModifier!; } enemyPokemon.setBoss(true, segments); } @@ -253,7 +255,7 @@ export async function initBattleWithEnemyConfig(scene: BattleScene, partyConfig: if (statusEffects) { // Default to cureturn 3 for sleep const status = Array.isArray(statusEffects) ? statusEffects[0] : statusEffects; - const cureTurn = Array.isArray(statusEffects) ? statusEffects[1] : statusEffects === StatusEffect.SLEEP ? 3 : null; + const cureTurn = Array.isArray(statusEffects) ? statusEffects[1] : statusEffects === StatusEffect.SLEEP ? 3 : undefined; enemyPokemon.status = new Status(status, 0, cureTurn); } @@ -264,24 +266,24 @@ export async function initBattleWithEnemyConfig(scene: BattleScene, partyConfig: // Set ability if (!isNullOrUndefined(config.abilityIndex)) { - enemyPokemon.abilityIndex = config.abilityIndex; + enemyPokemon.abilityIndex = config.abilityIndex!; } // Set gender if (!isNullOrUndefined(config.gender)) { - enemyPokemon.gender = config.gender; - enemyPokemon.summonData.gender = config.gender; + enemyPokemon.gender = config.gender!; + enemyPokemon.summonData.gender = config.gender!; } // Set moves - if (config?.moveSet?.length > 0) { + if (config?.moveSet && config.moveSet.length > 0) { const moves = config.moveSet.map(m => new PokemonMove(m)); enemyPokemon.moveset = moves; enemyPokemon.summonData.moveset = moves; } // Set tags - if (config.tags?.length > 0) { + if (config.tags && config.tags.length > 0) { const tags = config.tags; tags.forEach(tag => enemyPokemon.addTag(tag)); } @@ -319,8 +321,12 @@ export async function initBattleWithEnemyConfig(scene: BattleScene, partyConfig: }); if (!loaded) { regenerateModifierPoolThresholds(scene.getEnemyField(), battle.battleType === BattleType.TRAINER ? ModifierPoolType.TRAINER : ModifierPoolType.WILD); - const customModifierTypes = partyConfig?.pokemonConfigs?.map(config => config?.modifierConfigs); - scene.generateEnemyModifiers(customModifierTypes); + const customModifierTypes = partyConfig?.pokemonConfigs + ?.filter(config => config?.modifierConfigs) + .map(config => config.modifierConfigs!); + if (customModifierTypes) { + scene.generateEnemyModifiers(customModifierTypes); + } } } @@ -368,7 +374,7 @@ export function updatePlayerMoney(scene: BattleScene, changeValue: number, playS * @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); + const modifierId = Object.keys(modifierTypes).find(k => modifierTypes[k] === modifier)!; let result: ModifierType = modifierTypes[modifierId]?.(); // Populates item id and tier (order matters) @@ -376,8 +382,8 @@ export function generateModifierType(scene: BattleScene, modifier: () => Modifie .withIdFromFunc(modifierTypes[modifierId]) .withTierFromPool(); - result = result instanceof ModifierTypeGenerator ? result.generateType(scene.getParty(), pregenArgs) : result; - return result; + const generatedResult = result instanceof ModifierTypeGenerator ? result.generateType(scene.getParty(), pregenArgs) : result; + return generatedResult ?? result; } /** @@ -399,7 +405,7 @@ export function generateModifierTypeOption(scene: BattleScene, modifier: () => M * @param onPokemonNotSelected - Any logic that needs to be performed if no Pokemon is chosen * @param selectablePokemonFilter */ -export function selectPokemonForOption(scene: BattleScene, onPokemonSelected: (pokemon: PlayerPokemon) => void | OptionSelectItem[], onPokemonNotSelected?: () => void, selectablePokemonFilter?: (pokemon: PlayerPokemon) => string): Promise { +export function selectPokemonForOption(scene: BattleScene, onPokemonSelected: (pokemon: PlayerPokemon) => void | OptionSelectItem[], onPokemonNotSelected?: () => void, selectablePokemonFilter?: PokemonSelectFilter): Promise { return new Promise(resolve => { const modeToSetOnExit = scene.ui.getMode(); @@ -451,7 +457,7 @@ export function selectPokemonForOption(scene: BattleScene, onPokemonSelected: (p scene.ui.setModeWithoutClear(Mode.OPTION_SELECT, config, null, true); }; - const textPromptKey = scene.currentBattle.mysteryEncounter.selectedOption.dialogue.secondOptionPrompt; + const textPromptKey = scene.currentBattle.mysteryEncounter?.selectedOption?.dialogue?.secondOptionPrompt; if (!textPromptKey) { displayOptions(); } else { @@ -486,7 +492,7 @@ export function setEncounterRewards(scene: BattleScene, customShopRewards?: Cust } if (customShopRewards) { - scene.unshiftPhase(new SelectModifierPhase(scene, 0, null, customShopRewards)); + scene.unshiftPhase(new SelectModifierPhase(scene, 0, undefined, customShopRewards)); } else { scene.tryRemovePhase(p => p instanceof SelectModifierPhase); } @@ -530,7 +536,7 @@ export function setEncounterExp(scene: BattleScene, participantId: integer | int const multipleParticipantExpBonusModifier = scene.findModifier(m => m instanceof MultipleParticipantExpBonusModifier) as MultipleParticipantExpBonusModifier; const nonFaintedPartyMembers = party.filter(p => p.hp); const expPartyMembers = nonFaintedPartyMembers.filter(p => p.level < scene.getMaxExpLevel()); - const partyMemberExp = []; + const partyMemberExp: number[] = []; // EXP value calculation is based off Pokemon.getExpValue let expValue = Math.floor(baseExpValue * (useWaveIndex ? scene.currentBattle.waveIndex : 1) / 5 + 1); @@ -581,7 +587,7 @@ export function setEncounterExp(scene: BattleScene, participantId: integer | int const medianLevel = Math.floor(totalLevel / expPartyMembers.length); - const recipientExpPartyMemberIndexes = []; + const recipientExpPartyMemberIndexes: number[] = []; expPartyMembers.forEach((expPartyMember, epm) => { if (expPartyMember.level <= medianLevel) { recipientExpPartyMemberIndexes.push(epm); @@ -720,7 +726,7 @@ export function transitionMysteryEncounterIntroVisuals(scene: BattleScene, hide: scene.field.remove(pokemon, true); }); - scene.currentBattle.mysteryEncounter.introVisuals = null; + scene.currentBattle.mysteryEncounter.introVisuals = undefined; } resolve(true); } @@ -808,11 +814,13 @@ export function calculateMEAggregateStats(scene: BattleScene, baseSpawnWeight: n }) .map(b => !Array.isArray(b) ? b : b[0]); }, i * 100); - const specialBiomes = biomes.filter(b => alwaysPickTheseBiomes.includes(b)); - if (specialBiomes.length > 0) { - currentBiome = specialBiomes[Utils.randSeedInt(specialBiomes.length)]; - } else { - currentBiome = biomes[Utils.randSeedInt(biomes.length)]; + if (biomes! && biomes.length > 0) { + const specialBiomes = biomes.filter(b => alwaysPickTheseBiomes.includes(b)); + if (specialBiomes.length > 0) { + currentBiome = specialBiomes[Utils.randSeedInt(specialBiomes.length)]; + } else { + currentBiome = biomes[Utils.randSeedInt(biomes.length)]; + } } } else if (biomeLinks.hasOwnProperty(currentBiome)) { currentBiome = (biomeLinks[currentBiome] as Biome); @@ -840,7 +848,7 @@ export function calculateMEAggregateStats(scene: BattleScene, baseSpawnWeight: n // Otherwise, roll encounter const roll = Utils.randSeedInt(256); - validMEfloorsByBiome.set(Biome[currentBiome], validMEfloorsByBiome.get(Biome[currentBiome]) + 1); + validMEfloorsByBiome.set(Biome[currentBiome], (validMEfloorsByBiome.get(Biome[currentBiome]) ?? 0) + 1); // If total number of encounters is lower than expected for the run, slightly favor a new encounter // Do the reverse as well @@ -866,7 +874,7 @@ export function calculateMEAggregateStats(scene: BattleScene, baseSpawnWeight: n const rareThreshold = totalWeight - tierWeights[0] - tierWeights[1] - tierWeights[2]; // 64 - 32 - 16 - 10 = 6 tierValue > commonThreshold ? ++numEncounters[0] : tierValue > uncommonThreshold ? ++numEncounters[1] : tierValue > rareThreshold ? ++numEncounters[2] : ++numEncounters[3]; - encountersByBiome.set(Biome[currentBiome], encountersByBiome.get(Biome[currentBiome]) + 1); + encountersByBiome.set(Biome[currentBiome], (encountersByBiome.get(Biome[currentBiome]) ?? 0) + 1); } else { encounterRate += WEIGHT_INCREMENT_ON_SPAWN_MISS; } @@ -899,7 +907,7 @@ export function calculateMEAggregateStats(scene: BattleScene, baseSpawnWeight: n const encountersPerRunPerBiome = encountersByBiomeRuns.reduce((a, b) => { for (const biome of a.keys()) { - a.set(biome, a.get(biome) + b.get(biome)); + a.set(biome, a.get(biome)! + b.get(biome)!); } return a; }); @@ -910,7 +918,7 @@ export function calculateMEAggregateStats(scene: BattleScene, baseSpawnWeight: n const validMEFloorsPerRunPerBiome = validFloorsByBiome.reduce((a, b) => { for (const biome of a.keys()) { - a.set(biome, a.get(biome) + b.get(biome)); + a.set(biome, a.get(biome)! + b.get(biome)!); } return a; }); diff --git a/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts b/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts index 307e0a095ff..81dff39da74 100644 --- a/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts @@ -52,13 +52,13 @@ export function getRandomPlayerPokemon(scene: BattleScene, isAllowedInBattle: bo if (doNotReturnLastAbleMon && unfaintedMons.length === 1) { chosenIndex = randSeedInt(faintedMons.length); - chosenPokemon = faintedMons.at(chosenIndex); + chosenPokemon = faintedMons[chosenIndex]; } else if (isAllowedInBattle) { chosenIndex = randSeedInt(unfaintedMons.length); - chosenPokemon = unfaintedMons.at(chosenIndex); + chosenPokemon = unfaintedMons[chosenIndex]; } else { chosenIndex = randSeedInt(party.length); - chosenPokemon = party.at(chosenIndex); + chosenPokemon = party[chosenIndex]; } return chosenPokemon; @@ -72,17 +72,17 @@ export function getRandomPlayerPokemon(scene: BattleScene, isAllowedInBattle: bo */ export function getHighestLevelPlayerPokemon(scene: BattleScene, unfainted: boolean = false): PlayerPokemon { const party = scene.getParty(); - let pokemon: PlayerPokemon; - party.every(p => { + let pokemon: PlayerPokemon | null = null; + + for (const p of party) { if (unfainted && p.isFainted()) { - return true; + continue; } pokemon = pokemon ? pokemon?.level < p?.level ? p : pokemon : p; - return true; - }); + } - return pokemon; + return pokemon!; } /** @@ -94,17 +94,17 @@ export function getHighestLevelPlayerPokemon(scene: BattleScene, unfainted: bool */ export function getHighestStatPlayerPokemon(scene: BattleScene, stat: Stat, unfainted: boolean = false): PlayerPokemon { const party = scene.getParty(); - let pokemon: PlayerPokemon; - party.every(p => { + let pokemon: PlayerPokemon | null = null; + + for (const p of party) { if (unfainted && p.isFainted()) { - return true; + continue; } pokemon = pokemon ? pokemon.getStat(stat) < p?.getStat(stat) ? p : pokemon : p; - return true; - }); + } - return pokemon; + return pokemon!; } /** @@ -115,17 +115,17 @@ export function getHighestStatPlayerPokemon(scene: BattleScene, stat: Stat, unfa */ export function getLowestLevelPlayerPokemon(scene: BattleScene, unfainted: boolean = false): PlayerPokemon { const party = scene.getParty(); - let pokemon: PlayerPokemon; - party.every(p => { + let pokemon: PlayerPokemon | null = null; + + for (const p of party) { if (unfainted && p.isFainted()) { - return true; + continue; } pokemon = pokemon ? pokemon?.level > p?.level ? p : pokemon : p; - return true; - }); + } - return pokemon; + return pokemon!; } /** @@ -136,17 +136,17 @@ export function getLowestLevelPlayerPokemon(scene: BattleScene, unfainted: boole */ export function getHighestStatTotalPlayerPokemon(scene: BattleScene, unfainted: boolean = false): PlayerPokemon { const party = scene.getParty(); - let pokemon: PlayerPokemon; - party.every(p => { + let pokemon: PlayerPokemon | null = null; + + for (const p of party) { if (unfainted && p.isFainted()) { - return true; + continue; } pokemon = pokemon ? pokemon?.stats.reduce((a, b) => a + b) < p?.stats.reduce((a, b) => a + b) ? p : pokemon : p; - return true; - }); + } - return pokemon; + return pokemon!; } /** @@ -166,8 +166,8 @@ export function getRandomSpeciesByStarterTier(starterTiers: number | [number, nu .filter(s => getPokemonSpecies(s[0]) && (!excludedSpecies || !excludedSpecies.includes(s[0]))) .map(s => [getPokemonSpecies(s[0]), s[1]]); - if (!isNullOrUndefined(types) && types.length > 0) { - filteredSpecies = filteredSpecies.filter(s => types.includes(s[0].type1) || types.includes(s[0].type2)); + if (types && types.length > 0) { + filteredSpecies = filteredSpecies.filter(s => types.includes(s[0].type1) || (!isNullOrUndefined(s[0].type2) && types.includes(s[0].type2!))); } // If no filtered mons exist at specified starter tiers, will expand starter search range until there are @@ -260,10 +260,12 @@ export function applyHealToPokemon(scene: BattleScene, pokemon: PlayerPokemon, h * @param value */ export async function modifyPlayerPokemonBST(pokemon: PlayerPokemon, value: number) { - const modType = modifierTypes.MYSTERY_ENCOUNTER_SHUCKLE_JUICE().generateType(null, [value]); - const modifier = modType.newModifier(pokemon); - await pokemon.scene.addModifier(modifier, false, false, false, true); - pokemon.calculateStats(); + const modType = modifierTypes.MYSTERY_ENCOUNTER_SHUCKLE_JUICE().generateType(pokemon.scene.getParty(), [value]); + const modifier = modType?.newModifier(pokemon); + if (modifier) { + await pokemon.scene.addModifier(modifier, false, false, false, true); + pokemon.calculateStats(); + } } /** @@ -479,7 +481,7 @@ function failCatch(scene: BattleScene, pokemon: EnemyPokemon, originalY: number, * @param showCatchObtainMessage * @param isObtain */ -export async function catchPokemon(scene: BattleScene, pokemon: EnemyPokemon, pokeball: Phaser.GameObjects.Sprite, pokeballType: PokeballType, showCatchObtainMessage: boolean = true, isObtain: boolean = false): Promise { +export async function catchPokemon(scene: BattleScene, pokemon: EnemyPokemon, pokeball: Phaser.GameObjects.Sprite | null, pokeballType: PokeballType, showCatchObtainMessage: boolean = true, isObtain: boolean = false): Promise { scene.unshiftPhase(new VictoryPhase(scene, BattlerIndex.ENEMY, true)); const speciesForm = !pokemon.fusionSpecies ? pokemon.getSpeciesForm() : pokemon.getFusionSpeciesForm(); @@ -508,7 +510,9 @@ export async function catchPokemon(scene: BattleScene, pokemon: EnemyPokemon, po const doPokemonCatchMenu = () => { const end = () => { scene.pokemonInfoContainer.hide(); - removePb(scene, pokeball); + if (pokeball) { + removePb(scene, pokeball); + } resolve(); }; const removePokemon = () => { diff --git a/src/field/arena.ts b/src/field/arena.ts index cf4e919abf5..da35f3f3281 100644 --- a/src/field/arena.ts +++ b/src/field/arena.ts @@ -146,7 +146,7 @@ export class Arena { return this.randomSpecies(waveIndex, level, (attempt || 0) + 1); } - const newSpeciesId = ret.getWildSpeciesForLevel(level, true, isBoss, this.scene.gameMode); + const newSpeciesId = ret.getWildSpeciesForLevel(level, true, !!isBoss, this.scene.gameMode); if (newSpeciesId !== ret.speciesId) { console.log("Replaced", Species[ret.speciesId], "with", Species[newSpeciesId]); ret = getPokemonSpecies(newSpeciesId); diff --git a/src/field/mystery-encounter-intro.ts b/src/field/mystery-encounter-intro.ts index 1192e1b5369..2adf26bb2b3 100644 --- a/src/field/mystery-encounter-intro.ts +++ b/src/field/mystery-encounter-intro.ts @@ -4,6 +4,7 @@ import MysteryEncounter from "../data/mystery-encounters/mystery-encounter"; import { Species } from "#enums/species"; import { isNullOrUndefined } from "#app/utils"; import { getSpriteKeysFromSpecies } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; +import PlayAnimationConfig = Phaser.Types.Animations.PlayAnimationConfig; type KnownFileRoot = | "arenas" @@ -85,7 +86,7 @@ export default class MysteryEncounterIntroVisuals extends Phaser.GameObjects.Con }; if (!isNullOrUndefined(result.species)) { - const keys = getSpriteKeysFromSpecies(result.species); + const keys = getSpriteKeysFromSpecies(result.species!); result.spriteKey = keys.spriteKey; result.fileRoot = keys.fileRoot; result.isPokemon = true; @@ -164,7 +165,7 @@ export default class MysteryEncounterIntroVisuals extends Phaser.GameObjects.Con } } - if (!isNaN(alpha)) { + if (!isNullOrUndefined(alpha)) { sprite.setAlpha(alpha); tintSprite.setAlpha(alpha); } @@ -290,7 +291,7 @@ export default class MysteryEncounterIntroVisuals extends Phaser.GameObjects.Con const tintSprites = this.getTintSprites(); this.spriteConfigs.forEach((config, i) => { if (!config.disableAnimation) { - const trainerAnimConfig = { + const trainerAnimConfig: PlayAnimationConfig = { key: config.spriteKey, repeat: config?.repeat ? -1 : 0, startFrame: config?.startFrame ?? 0 @@ -307,7 +308,7 @@ export default class MysteryEncounterIntroVisuals extends Phaser.GameObjects.Con */ getSpriteAtIndex(index: number): Phaser.GameObjects.Sprite[] { if (!this.spriteConfigs) { - return; + return []; } const ret: Phaser.GameObjects.Sprite[] = []; @@ -319,7 +320,7 @@ export default class MysteryEncounterIntroVisuals extends Phaser.GameObjects.Con getSprites(): Phaser.GameObjects.Sprite[] { if (!this.spriteConfigs) { - return; + return []; } const ret: Phaser.GameObjects.Sprite[] = []; @@ -331,7 +332,7 @@ export default class MysteryEncounterIntroVisuals extends Phaser.GameObjects.Con getTintSprites(): Phaser.GameObjects.Sprite[] { if (!this.spriteConfigs) { - return; + return []; } const ret: Phaser.GameObjects.Sprite[] = []; diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 7a6b26fcd3c..46b4fba06af 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -108,7 +108,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { public mysteryEncounterData: MysteryEncounterPokemonData; /** Used by Mystery Encounters to execute pokemon-specific logic (such as stat boosts) at start of battle */ - public mysteryEncounterBattleEffects: (pokemon: Pokemon) => void = null; + public mysteryEncounterBattleEffects?: (pokemon: Pokemon) => void; public fieldPosition: FieldPosition; diff --git a/src/locales/en/mystery-encounters/delibirdy-dialogue.ts b/src/locales/en/mystery-encounters/delibirdy-dialogue.ts index a77261573a3..2cca9416382 100644 --- a/src/locales/en/mystery-encounters/delibirdy-dialogue.ts +++ b/src/locales/en/mystery-encounters/delibirdy-dialogue.ts @@ -1,6 +1,6 @@ export const delibirdyDialogue = { intro: "A pack of Delibird have appeared!", - title: "Delibird-y", + title: "Delibir-dy", description: "The Delibirds are looking at you expectantly, as if they want something. Perhaps giving them an item or some money would satisfy them?", query: "What will you give them?", invalid_selection: "Pokémon doesn't have that kind of item.", diff --git a/src/modifier/modifier-type.ts b/src/modifier/modifier-type.ts index 8da6d701a9a..6a70b4c7737 100644 --- a/src/modifier/modifier-type.ts +++ b/src/modifier/modifier-type.ts @@ -28,7 +28,6 @@ import { BerryType } from "#enums/berry-type"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { getPokemonNameWithAffix } from "#app/messages.js"; -import { isNullOrUndefined } from "../utils"; const outputModifierData = false; const useMaxWeightForOutput = false; @@ -120,26 +119,6 @@ export class ModifierType { return this; } - /** - * Populates the tier field by performing a reverse lookup on the modifier pool specified by {@linkcode poolType} using the - * {@linkcode ModifierType}'s id. - * @param poolType the {@linkcode ModifierPoolType} to look into to derive the item's tier; defaults to {@linkcode ModifierPoolType.PLAYER} - */ - withTierFromPool(poolType: ModifierPoolType = ModifierPoolType.PLAYER): ModifierType { - for (const tier of Object.values(getModifierPoolForType(poolType))) { - for (const modifier of tier) { - if (this.id === modifier.modifierType.id) { - this.tier = modifier.modifierType.tier; - break; - } - } - if (this.tier) { - break; - } - } - return this; - } - /** * Populates item tier for ModifierType instance * Tier is a necessary field for items that appear in player shop (determines the Pokeball visual they use) @@ -2113,10 +2092,10 @@ function getModifierTypeOptionWithRetry(existingOptions: ModifierTypeOption[], r allowLuckUpgrades = allowLuckUpgrades ?? true; let candidate = getNewModifierTypeOption(party, ModifierPoolType.PLAYER, tier, undefined, 0, allowLuckUpgrades); let r = 0; - while (existingOptions.length && ++r < retryCount && existingOptions.filter(o => o.type.name === candidate.type.name || o.type.group === candidate.type.group).length) { - candidate = getNewModifierTypeOption(party, ModifierPoolType.PLAYER, candidate.type.tier, candidate.upgradeCount, 0, allowLuckUpgrades); + while (existingOptions.length && ++r < retryCount && existingOptions.filter(o => o.type.name === candidate?.type.name || o.type.group === candidate?.type.group).length) { + candidate = getNewModifierTypeOption(party, ModifierPoolType.PLAYER, candidate?.type.tier ?? tier, candidate?.upgradeCount, 0, allowLuckUpgrades); } - return candidate; + return candidate!; } /** diff --git a/src/modifier/modifier.ts b/src/modifier/modifier.ts index c1d379b97ea..538f34aded7 100644 --- a/src/modifier/modifier.ts +++ b/src/modifier/modifier.ts @@ -826,7 +826,7 @@ export class PokemonIncrementingStatModifier extends PokemonHeldItemModifier { args[1].forEach((v, i) => { const isHp = i === 0; let mult = 1; - if (this.stackCount === this.getMaxHeldItemCount(null)) { + if (this.stackCount === this.getMaxHeldItemCount()) { mult = isHp ? 1.05 : 1.1; } const newVal = Math.floor((v + this.stackCount * (isHp ? 1 : 2)) * mult); @@ -840,7 +840,7 @@ export class PokemonIncrementingStatModifier extends PokemonHeldItemModifier { return 1.2; } - getMaxHeldItemCount(pokemon: Pokemon): integer { + getMaxHeldItemCount(pokemon?: Pokemon): integer { return 50; } } diff --git a/src/phases.ts b/src/phases.ts index fff69caac7b..d525cd8f95b 100644 --- a/src/phases.ts +++ b/src/phases.ts @@ -5,7 +5,7 @@ import { allMoves, applyMoveAttrs, BypassSleepAttr, ChargeAttr, applyFilteredMov import { Mode } from "./ui/ui"; import { Command } from "./ui/command-ui-handler"; import { Stat } from "./data/pokemon-stat"; -import { BerryModifier, ContactHeldItemTransferChanceModifier, EnemyAttackStatusEffectChanceModifier, EnemyPersistentModifier, EnemyStatusEffectHealChanceModifier, EnemyTurnHealModifier, ExpBalanceModifier, ExpBoosterModifier, ExpShareModifier, ExtraModifierModifier, FlinchChanceModifier, HealingBoosterModifier, HitHealModifier, LapsingPersistentModifier, MapModifier, Modifier, MultipleParticipantExpBonusModifier, PokemonExpBoosterModifier, PokemonHeldItemModifier, PokemonInstantReviveModifier, SwitchEffectTransferModifier, TurnHealModifier, TurnHeldItemTransferModifier, MoneyMultiplierModifier, MoneyInterestModifier, IvScannerModifier, LapsingPokemonHeldItemModifier, PokemonMultiHitModifier, overrideModifiers, overrideHeldItems, BypassSpeedChanceModifier, TurnStatusEffectModifier, PokemonResetNegativeStatStageModifier } from "./modifier/modifier"; +import { BerryModifier, ContactHeldItemTransferChanceModifier, EnemyAttackStatusEffectChanceModifier, EnemyPersistentModifier, EnemyStatusEffectHealChanceModifier, EnemyTurnHealModifier, ExpBalanceModifier, ExpBoosterModifier, ExpShareModifier, ExtraModifierModifier, FlinchChanceModifier, HealingBoosterModifier, HitHealModifier, LapsingPersistentModifier, MapModifier, Modifier, MultipleParticipantExpBonusModifier, PokemonExpBoosterModifier, PokemonHeldItemModifier, PokemonInstantReviveModifier, SwitchEffectTransferModifier, TurnHealModifier, TurnHeldItemTransferModifier, MoneyMultiplierModifier, MoneyInterestModifier, IvScannerModifier, LapsingPokemonHeldItemModifier, PokemonMultiHitModifier, overrideModifiers, overrideHeldItems, BypassSpeedChanceModifier, TurnStatusEffectModifier, PokemonResetNegativeStatStageModifier, PokemonIncrementingStatModifier } from "./modifier/modifier"; import PartyUiHandler, { PartyOption, PartyUiMode } from "./ui/party-ui-handler"; import { doPokeballBounceAnim, getPokeballAtlasKey, getPokeballCatchMultiplier, getPokeballTintColor, PokeballType } from "./data/pokeball"; import { CommonAnim, CommonBattleAnim, initEncounterAnims, initMoveAnim, loadEncounterAnimAssets, loadMoveAnimAssets, MoveAnim } from "./data/battle-anims"; @@ -19,7 +19,7 @@ import { biomeLinks, getBiomeName } from "./data/biomes"; import { ModifierTier } from "./modifier/modifier-tier"; import { CustomModifierSettings, FusePokemonModifierType, getDailyRunStarterModifiers, getEnemyBuffModifierForWave, getModifierType, getPlayerModifierTypeOptions, getPlayerShopModifierTypeOptionsForWave, ModifierPoolType, ModifierType, ModifierTypeFunc, ModifierTypeOption, modifierTypes, PokemonModifierType, PokemonMoveModifierType, PokemonPpRestoreModifierType, PokemonPpUpModifierType, regenerateModifierPoolThresholds, RememberMoveModifierType, TmModifierType } from "./modifier/modifier-type"; import SoundFade from "phaser3-rex-plugins/plugins/soundfade"; -import { BattlerTagLapseType, CenterOfAttentionTag, EncoreTag, ProtectedTag, SemiInvulnerableTag, TrappedTag } from "./data/battler-tags"; +import { BattlerTagLapseType, CenterOfAttentionTag, EncoreTag, MysteryEncounterPostSummonTag, ProtectedTag, SemiInvulnerableTag, TrappedTag } from "./data/battler-tags"; import { getPokemonNameWithAffix } from "./messages"; import { Starter } from "./ui/starter-select-ui-handler"; import { Gender } from "./data/gender"; @@ -70,6 +70,7 @@ import { doTrainerExclamation, handleMysteryEncounterBattleStartEffects, handleM import ModifierSelectUiHandler, { SHOP_OPTIONS_ROW_LIMIT } from "#app/ui/modifier-select-ui-handler"; import { getEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; import { MysteryEncounterMode } from "#enums/mystery-encounter-mode"; +import { isNullOrUndefined } from "./utils"; const { t } = i18next; @@ -865,7 +866,7 @@ export class EncounterPhase extends BattlePhase { // Add intro visuals for mystery encounter mysteryEncounter.initIntroVisuals(this.scene); - this.scene.field.add(mysteryEncounter.introVisuals); + this.scene.field.add(mysteryEncounter.introVisuals!); } let totalBst = 0; @@ -930,7 +931,7 @@ export class EncounterPhase extends BattlePhase { const newEncounter = this.scene.getMysteryEncounter(mysteryEncounter); battle.mysteryEncounter = newEncounter; } - loadEnemyAssets.push(battle.mysteryEncounter.introVisuals.loadAssets().then(() => battle.mysteryEncounter.introVisuals.initSprite())); + loadEnemyAssets.push(battle.mysteryEncounter.introVisuals!.loadAssets().then(() => battle.mysteryEncounter.introVisuals!.initSprite())); // Load Mystery Encounter Exclamation bubble and sfx loadEnemyAssets.push(new Promise(resolve => { this.scene.loadSe("GEN8- Exclaim", "battle_anims", "GEN8- Exclaim.wav"); @@ -1130,7 +1131,7 @@ export class EncounterPhase extends BattlePhase { } } } else if (this.scene.currentBattle.battleType === BattleType.MYSTERY_ENCOUNTER) { - const introVisuals = this.scene.currentBattle.mysteryEncounter.introVisuals; + const introVisuals = this.scene.currentBattle.mysteryEncounter.introVisuals!; introVisuals.playAnim(); if (this.scene.currentBattle.mysteryEncounter.onVisualsStart) { @@ -1148,23 +1149,27 @@ export class EncounterPhase extends BattlePhase { if (showEncounterMessage) { const introDialogue = this.scene.currentBattle.mysteryEncounter.dialogue.intro; - const FIRST_DIALOGUE_PROMPT_DELAY = 750; - let i = 0; - const showNextDialogue = () => { - const nextAction = i === introDialogue.length - 1 ? doShowEncounterOptions : showNextDialogue; - const dialogue = introDialogue[i]; - const title = getEncounterText(this.scene, dialogue.speaker); - const text = getEncounterText(this.scene, dialogue.text); - i++; - if (title) { - this.scene.ui.showDialogue(text, title, null, nextAction, 0, i === 1 ? FIRST_DIALOGUE_PROMPT_DELAY : 0); - } else { - this.scene.ui.showText(text, null, nextAction, i === 1 ? FIRST_DIALOGUE_PROMPT_DELAY : 0, true); - } - }; + if (!introDialogue) { + doShowEncounterOptions(); + } else { + const FIRST_DIALOGUE_PROMPT_DELAY = 750; + let i = 0; + const showNextDialogue = () => { + const nextAction = i === introDialogue.length - 1 ? doShowEncounterOptions : showNextDialogue; + const dialogue = introDialogue[i]; + const title = getEncounterText(this.scene, dialogue?.speaker); + const text = getEncounterText(this.scene, dialogue.text)!; + i++; + if (title) { + this.scene.ui.showDialogue(text, title, null, nextAction, 0, i === 1 ? FIRST_DIALOGUE_PROMPT_DELAY : 0); + } else { + this.scene.ui.showText(text, null, nextAction, i === 1 ? FIRST_DIALOGUE_PROMPT_DELAY : 0, true); + } + }; - if (introDialogue.length > 0) { - showNextDialogue(); + if (introDialogue.length > 0) { + showNextDialogue(); + } } } else { doShowEncounterOptions(); @@ -1330,7 +1335,7 @@ export class NextEncounterPhase extends EncounterPhase { } if (lastEncounterVisuals) { this.scene.field.remove(lastEncounterVisuals, true); - this.scene.lastMysteryEncounter.introVisuals = null; + this.scene.lastMysteryEncounter.introVisuals = undefined; } if (!this.tryOverrideForBattleSpec()) { @@ -4378,7 +4383,7 @@ export class VictoryPhase extends PokemonPhase { if (participated) { partyMember.addFriendship(2); const machoBraceModifier = partyMember.getHeldItems().find(m => m instanceof PokemonIncrementingStatModifier); - if (!isNullOrUndefined(machoBraceModifier) && machoBraceModifier.stackCount < machoBraceModifier.getMaxStackCount(this.scene)) { + if (machoBraceModifier && machoBraceModifier.stackCount < machoBraceModifier.getMaxStackCount(this.scene)) { machoBraceModifier.stackCount++; this.scene.updateModifiers(true, true); partyMember.updateInfo(); @@ -5857,7 +5862,7 @@ export class SelectModifierPhase extends BattlePhase { } else { baseValue = 250; } - const multiplier = !isNullOrUndefined(this.customModifierSettings?.rerollMultiplier) ? this.customModifierSettings.rerollMultiplier : 1; + const multiplier = !isNullOrUndefined(this.customModifierSettings?.rerollMultiplier) ? this.customModifierSettings!.rerollMultiplier! : 1; return Math.min(Math.ceil(this.scene.currentBattle.waveIndex / 10) * baseValue * Math.pow(2, this.rerollCount) * multiplier, Number.MAX_SAFE_INTEGER); } diff --git a/src/phases/mystery-encounter-phases.ts b/src/phases/mystery-encounter-phases.ts index 160a081fda1..bb31ca999f8 100644 --- a/src/phases/mystery-encounter-phases.ts +++ b/src/phases/mystery-encounter-phases.ts @@ -27,7 +27,7 @@ import { MysteryEncounterMode } from "#enums/mystery-encounter-mode"; */ export class MysteryEncounterPhase extends Phase { private readonly FIRST_DIALOGUE_PROMPT_DELAY = 300; - optionSelectSettings: OptionSelectSettings; + optionSelectSettings?: OptionSelectSettings; /** * @@ -72,7 +72,7 @@ export class MysteryEncounterPhase extends Phase { if (option.onPreOptionPhase) { this.scene.executeWithSeedOffset(async () => { - return await option.onPreOptionPhase(this.scene) + return await option.onPreOptionPhase!(this.scene) .then((result) => { if (isNullOrUndefined(result) || result) { this.continueEncounter(); @@ -93,7 +93,7 @@ export class MysteryEncounterPhase extends Phase { }; const optionSelectDialogue = this.scene.currentBattle?.mysteryEncounter?.selectedOption?.dialogue; - if (optionSelectDialogue?.selected?.length > 0) { + if (optionSelectDialogue?.selected && optionSelectDialogue.selected.length > 0) { // Handle intermediate dialogue (between player selection event and the onOptionSelect logic) this.scene.ui.setMode(Mode.MESSAGE); const selectedDialogue = optionSelectDialogue.selected; @@ -101,17 +101,17 @@ export class MysteryEncounterPhase extends Phase { const showNextDialogue = () => { const nextAction = i === selectedDialogue.length - 1 ? endDialogueAndContinueEncounter : showNextDialogue; const dialogue = selectedDialogue[i]; - let title: string = null; - const text: string = getEncounterText(this.scene, dialogue.text); + let title: string | null = null; + const text: string | null = getEncounterText(this.scene, dialogue.text); if (dialogue.speaker) { title = getEncounterText(this.scene, dialogue.speaker); } i++; if (title) { - this.scene.ui.showDialogue(text, title, null, nextAction, 0, i === 1 ? this.FIRST_DIALOGUE_PROMPT_DELAY : 0); + this.scene.ui.showDialogue(text ?? "", title, null, nextAction, 0, i === 1 ? this.FIRST_DIALOGUE_PROMPT_DELAY : 0); } else { - this.scene.ui.showText(text, null, nextAction, i === 1 ? this.FIRST_DIALOGUE_PROMPT_DELAY : 0, true); + this.scene.ui.showText(text ?? "", null, nextAction, i === 1 ? this.FIRST_DIALOGUE_PROMPT_DELAY : 0, true); } }; @@ -142,7 +142,7 @@ export class MysteryEncounterOptionSelectedPhase extends Phase { constructor(scene: BattleScene) { super(scene); - this.onOptionSelect = this.scene.currentBattle.mysteryEncounter.selectedOption.onOptionPhase; + this.onOptionSelect = this.scene.currentBattle.mysteryEncounter.selectedOption!.onOptionPhase; } start() { @@ -223,10 +223,10 @@ export class MysteryEncounterBattlePhase extends Phase { if (encounterMode === MysteryEncounterMode.TRAINER_BATTLE) { if (scene.currentBattle.double) { - return i18next.t("battle:trainerAppearedDouble", { trainerName: scene.currentBattle.trainer.getName(TrainerSlot.NONE, true) }); + return i18next.t("battle:trainerAppearedDouble", { trainerName: scene.currentBattle.trainer?.getName(TrainerSlot.NONE, true) }); } else { - return i18next.t("battle:trainerAppeared", { trainerName: scene.currentBattle.trainer.getName(TrainerSlot.NONE, true) }); + return i18next.t("battle:trainerAppeared", { trainerName: scene.currentBattle.trainer?.getName(TrainerSlot.NONE, true) }); } } @@ -276,22 +276,22 @@ export class MysteryEncounterBattlePhase extends Phase { } }; - const encounterMessages = scene.currentBattle.trainer.getEncounterMessages(); + const encounterMessages = scene.currentBattle.trainer?.getEncounterMessages(); - if (!encounterMessages?.length) { + if (!encounterMessages || !encounterMessages.length) { doSummon(); } else { const trainer = this.scene.currentBattle.trainer; let message: string; scene.executeWithSeedOffset(() => message = Utils.randSeedItem(encounterMessages), this.scene.currentBattle.mysteryEncounter.getSeedOffset()); - + message = message!; // tell TS compiler it's defined now const showDialogueAndSummon = () => { - scene.ui.showDialogue(message, trainer.getName(TrainerSlot.NONE, true), null, () => { + scene.ui.showDialogue(message, trainer?.getName(TrainerSlot.NONE, true), null, () => { scene.charSprite.hide().then(() => scene.hideFieldOverlay(250).then(() => doSummon())); }); }; - if (scene.currentBattle.trainer.config.hasCharSprite && !scene.ui.shouldSkipDialogue(message)) { - scene.showFieldOverlay(500).then(() => scene.charSprite.showCharacter(trainer.getKey(), getCharVariantFromDialogue(encounterMessages[0])).then(() => showDialogueAndSummon())); + if (this.scene.currentBattle.trainer?.config.hasCharSprite && !this.scene.ui.shouldSkipDialogue(message)) { + this.scene.showFieldOverlay(500).then(() => this.scene.charSprite.showCharacter(trainer?.getKey()!, getCharVariantFromDialogue(encounterMessages[0])).then(() => showDialogueAndSummon())); // TODO: is this bang correct? } else { showDialogueAndSummon(); } @@ -349,6 +349,9 @@ export class MysteryEncounterBattlePhase extends Phase { showEnemyTrainer(): void { // Show enemy trainer const trainer = this.scene.currentBattle.trainer; + if (!trainer) { + return; + } trainer.alpha = 0; trainer.x += 16; trainer.y -= 16; @@ -416,7 +419,7 @@ export class MysteryEncounterRewardsPhase extends Phase { 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, null, { fillRemaining: false, rerollMultiplier: 0 })); + this.scene.unshiftPhase(new SelectModifierPhase(this.scene, 0, undefined, { fillRemaining: false, rerollMultiplier: 0 })); } // Do not use ME's seedOffset for rewards, these should always be consistent with waveIndex (once per wave) }, this.scene.currentBattle.waveIndex * 1000); @@ -436,11 +439,11 @@ export class MysteryEncounterRewardsPhase extends Phase { */ export class PostMysteryEncounterPhase extends Phase { private readonly FIRST_DIALOGUE_PROMPT_DELAY = 750; - onPostOptionSelect: OptionPhaseCallback; + onPostOptionSelect?: OptionPhaseCallback; constructor(scene: BattleScene) { super(scene); - this.onPostOptionSelect = this.scene.currentBattle.mysteryEncounter.selectedOption.onPostOptionPhase; + this.onPostOptionSelect = this.scene.currentBattle.mysteryEncounter.selectedOption?.onPostOptionPhase; } start() { @@ -448,7 +451,7 @@ export class PostMysteryEncounterPhase extends Phase { if (this.onPostOptionSelect) { this.scene.executeWithSeedOffset(async () => { - return await this.onPostOptionSelect(this.scene) + return await this.onPostOptionSelect!(this.scene) .then((result) => { if (isNullOrUndefined(result) || result) { this.continueEncounter(); @@ -467,13 +470,13 @@ export class PostMysteryEncounterPhase extends Phase { }; const outroDialogue = this.scene.currentBattle?.mysteryEncounter?.dialogue?.outro; - if (outroDialogue?.length > 0) { + if (outroDialogue && outroDialogue.length > 0) { let i = 0; const showNextDialogue = () => { const nextAction = i === outroDialogue.length - 1 ? endPhase : showNextDialogue; const dialogue = outroDialogue[i]; - let title: string = null; - const text: string = getEncounterText(this.scene, dialogue.text); + let title: string | null = null; + const text: string | null = getEncounterText(this.scene, dialogue.text); if (dialogue.speaker) { title = getEncounterText(this.scene, dialogue.speaker); } @@ -481,9 +484,9 @@ export class PostMysteryEncounterPhase extends Phase { i++; this.scene.ui.setMode(Mode.MESSAGE); if (title) { - this.scene.ui.showDialogue(text, title, null, nextAction, 0, i === 1 ? this.FIRST_DIALOGUE_PROMPT_DELAY : 0); + this.scene.ui.showDialogue(text ?? "", title, null, nextAction, 0, i === 1 ? this.FIRST_DIALOGUE_PROMPT_DELAY : 0); } else { - this.scene.ui.showText(text, null, nextAction, i === 1 ? this.FIRST_DIALOGUE_PROMPT_DELAY : 0, true); + this.scene.ui.showText(text ?? "", null, nextAction, i === 1 ? this.FIRST_DIALOGUE_PROMPT_DELAY : 0, true); } }; diff --git a/src/test/mystery-encounter/encounterTestUtils.ts b/src/test/mystery-encounter/encounterTestUtils.ts index 791c96b3437..3756d24df24 100644 --- a/src/test/mystery-encounter/encounterTestUtils.ts +++ b/src/test/mystery-encounter/encounterTestUtils.ts @@ -10,6 +10,7 @@ import { expect, vi } from "vitest"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import PartyUiHandler from "#app/ui/party-ui-handler"; import OptionSelectUiHandler from "#app/ui/settings/option-select-ui-handler"; +import { isNullOrUndefined } from "#app/utils"; /** * Runs a MysteryEncounter to either the start of a battle, or to the MysteryEncounterRewardsPhase, depending on the option selected @@ -18,7 +19,7 @@ import OptionSelectUiHandler from "#app/ui/settings/option-select-ui-handler"; * @param secondaryOptionSelect - * @param isBattle - if selecting option should lead to battle, set to true */ -export async function runMysteryEncounterToEnd(game: GameManager, optionNo: number, secondaryOptionSelect: { pokemonNo: number, optionNo?: number } = null, isBattle: boolean = false) { +export async function runMysteryEncounterToEnd(game: GameManager, optionNo: number, secondaryOptionSelect?: { pokemonNo: number, optionNo?: number }, isBattle: boolean = false) { vi.spyOn(EncounterPhaseUtils, "selectPokemonForOption"); await runSelectMysteryEncounterOption(game, optionNo, secondaryOptionSelect); @@ -65,7 +66,7 @@ export async function runMysteryEncounterToEnd(game: GameManager, optionNo: numb } } -export async function runSelectMysteryEncounterOption(game: GameManager, optionNo: number, secondaryOptionSelect: { pokemonNo: number, optionNo?: number } = null) { +export async function runSelectMysteryEncounterOption(game: GameManager, optionNo: number, secondaryOptionSelect?: { pokemonNo: number, optionNo?: number }) { // Handle any eventual queued messages (e.g. weather phase, etc.) game.onNextPrompt("MessagePhase", Mode.MESSAGE, () => { const uiHandler = game.scene.ui.getHandler(); @@ -107,8 +108,8 @@ export async function runSelectMysteryEncounterOption(game: GameManager, optionN uiHandler.processInput(Button.ACTION); - if (!isNaN(secondaryOptionSelect?.pokemonNo)) { - await handleSecondaryOptionSelect(game, secondaryOptionSelect.pokemonNo, secondaryOptionSelect.optionNo); + if (!isNullOrUndefined(secondaryOptionSelect?.pokemonNo)) { + await handleSecondaryOptionSelect(game, secondaryOptionSelect!.pokemonNo, secondaryOptionSelect!.optionNo); } } @@ -128,14 +129,14 @@ async function handleSecondaryOptionSelect(game: GameManager, pokemonNo: number, partyUiHandler.processInput(Button.ACTION); // If there is a second choice to make after selecting a Pokemon - if (!isNaN(optionNo)) { + if (!isNullOrUndefined(optionNo)) { // Wait for Summary menu to close and second options to spawn const secondOptionUiHandler = game.scene.ui.handlers[Mode.OPTION_SELECT] as OptionSelectUiHandler; vi.spyOn(secondOptionUiHandler, "show"); await vi.waitFor(() => expect(secondOptionUiHandler.show).toHaveBeenCalled()); // Navigate down to the correct option - for (let i = 1; i < optionNo; i++) { + for (let i = 1; i < optionNo!; i++) { secondOptionUiHandler.processInput(Button.DOWN); } 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 74effa3b29d..fc8460f1325 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 @@ -35,7 +35,7 @@ describe("A Trainer's Test - Mystery Encounter", () => { game.override.mysteryEncounterChance(100); game.override.startingWave(defaultWave); game.override.startingBiome(defaultBiome); - game.override.disableTrainerWaves(true); + game.override.disableTrainerWaves(); const biomeMap = new Map([ [Biome.VOLCANO, [MysteryEncounterType.MYSTERIOUS_CHALLENGERS]], @@ -59,11 +59,11 @@ describe("A Trainer's Test - Mystery Encounter", () => { expect(ATrainersTestEncounter.encounterTier).toBe(MysteryEncounterTier.ROGUE); expect(ATrainersTestEncounter.dialogue).toBeDefined(); expect(ATrainersTestEncounter.dialogue.intro).toBeDefined(); - expect(ATrainersTestEncounter.dialogue.intro[0].speaker).toBeDefined(); - expect(ATrainersTestEncounter.dialogue.intro[0].text).toBeDefined(); - expect(ATrainersTestEncounter.dialogue.encounterOptionsDialogue.title).toBe(`${namespace}.title`); - expect(ATrainersTestEncounter.dialogue.encounterOptionsDialogue.description).toBe(`${namespace}.description`); - expect(ATrainersTestEncounter.dialogue.encounterOptionsDialogue.query).toBe(`${namespace}.query`); + expect(ATrainersTestEncounter.dialogue.intro?.[0].speaker).toBeDefined(); + expect(ATrainersTestEncounter.dialogue.intro?.[0].text).toBeDefined(); + expect(ATrainersTestEncounter.dialogue.encounterOptionsDialogue?.title).toBe(`${namespace}.title`); + expect(ATrainersTestEncounter.dialogue.encounterOptionsDialogue?.description).toBe(`${namespace}.description`); + expect(ATrainersTestEncounter.dialogue.encounterOptionsDialogue?.query).toBe(`${namespace}.query`); expect(ATrainersTestEncounter.options.length).toBe(2); }); @@ -92,14 +92,14 @@ describe("A Trainer's Test - Mystery Encounter", () => { expect(ATrainersTestEncounter.onInit).toBeDefined(); ATrainersTestEncounter.populateDialogueTokensFromRequirements(scene); - const onInitResult = onInit(scene); + const onInitResult = onInit!(scene); expect(ATrainersTestEncounter.dialogueTokens?.statTrainerName).toBeDefined(); expect(ATrainersTestEncounter.misc.trainerType).toBeDefined(); expect(ATrainersTestEncounter.misc.trainerNameKey).toBeDefined(); expect(ATrainersTestEncounter.misc.trainerEggDescription).toBeDefined(); expect(ATrainersTestEncounter.dialogue.intro).toBeDefined(); - expect(ATrainersTestEncounter.options[1].dialogue.selected).toBeDefined(); + expect(ATrainersTestEncounter.options[1].dialogue?.selected).toBeDefined(); expect(onInitResult).toBe(true); }); @@ -108,19 +108,19 @@ describe("A Trainer's Test - Mystery Encounter", () => { const option = ATrainersTestEncounter.options[0]; expect(option.optionMode).toBe(MysteryEncounterOptionMode.DEFAULT); expect(option.dialogue).toBeDefined(); - expect(option.dialogue.buttonLabel).toStrictEqual(`${namespace}.option.1.label`); - expect(option.dialogue.buttonTooltip).toStrictEqual(`${namespace}.option.1.tooltip`); + expect(option.dialogue!.buttonLabel).toStrictEqual(`${namespace}.option.1.label`); + expect(option.dialogue!.buttonTooltip).toStrictEqual(`${namespace}.option.1.tooltip`); }); it("Should start battle against the trainer", async () => { await game.runToMysteryEncounter(MysteryEncounterType.A_TRAINERS_TEST, defaultParty); - await runMysteryEncounterToEnd(game, 1, null, true); + await runMysteryEncounterToEnd(game, 1, undefined, true); const enemyField = scene.getEnemyField(); - expect(scene.getCurrentPhase().constructor.name).toBe(CommandPhase.name); + expect(scene.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name); expect(enemyField.length).toBe(1); expect(scene.currentBattle.trainer).toBeDefined(); - expect(["buck", "cheryl", "marley", "mira", "riley"].includes(scene.currentBattle.trainer.config.name.toLowerCase())).toBeTruthy(); + expect(["buck", "cheryl", "marley", "mira", "riley"].includes(scene.currentBattle.trainer!.config.name.toLowerCase())).toBeTruthy(); expect(enemyField[0]).toBeDefined(); }); @@ -131,10 +131,10 @@ describe("A Trainer's Test - Mystery Encounter", () => { expect(eggsBefore).toBeDefined(); const eggsBeforeLength = eggsBefore.length; - await runMysteryEncounterToEnd(game, 1, null, true); + await runMysteryEncounterToEnd(game, 1, undefined, true); await skipBattleRunMysteryEncounterRewardsPhase(game); await game.phaseInterceptor.to(SelectModifierPhase, false); - expect(scene.getCurrentPhase().constructor.name).toBe(SelectModifierPhase.name); + expect(scene.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name); const eggsAfter = scene.gameData.eggs; expect(eggsAfter).toBeDefined(); @@ -151,7 +151,7 @@ describe("A Trainer's Test - Mystery Encounter", () => { return { totalDuration: 1, destroy: () => null - } as Phaser.Sound.NoAudioSound; + } as any; }); }); @@ -159,8 +159,8 @@ describe("A Trainer's Test - Mystery Encounter", () => { const option = ATrainersTestEncounter.options[1]; expect(option.optionMode).toBe(MysteryEncounterOptionMode.DEFAULT); expect(option.dialogue).toBeDefined(); - expect(option.dialogue.buttonLabel).toStrictEqual(`${namespace}.option.2.label`); - expect(option.dialogue.buttonTooltip).toStrictEqual(`${namespace}.option.2.tooltip`); + expect(option.dialogue?.buttonLabel).toStrictEqual(`${namespace}.option.2.label`); + expect(option.dialogue?.buttonTooltip).toStrictEqual(`${namespace}.option.2.tooltip`); }); it("Should fully heal the party", async () => { @@ -182,7 +182,7 @@ describe("A Trainer's Test - Mystery Encounter", () => { await runMysteryEncounterToEnd(game, 2); await game.phaseInterceptor.to(SelectModifierPhase, false); - expect(scene.getCurrentPhase().constructor.name).toBe(SelectModifierPhase.name); + expect(scene.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name); const eggsAfter = scene.gameData.eggs; expect(eggsAfter).toBeDefined(); 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 d21421cde2b..0c5495ba924 100644 --- a/src/test/mystery-encounter/encounters/absolute-avarice-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/absolute-avarice-encounter.test.ts @@ -35,7 +35,7 @@ describe("Absolute Avarice - Mystery Encounter", () => { game.override.mysteryEncounterChance(100); game.override.startingWave(defaultWave); game.override.startingBiome(defaultBiome); - game.override.disableTrainerWaves(true); + game.override.disableTrainerWaves(); vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue( new Map([ @@ -58,9 +58,9 @@ describe("Absolute Avarice - Mystery Encounter", () => { expect(AbsoluteAvariceEncounter.encounterTier).toBe(MysteryEncounterTier.GREAT); expect(AbsoluteAvariceEncounter.dialogue).toBeDefined(); expect(AbsoluteAvariceEncounter.dialogue.intro).toStrictEqual([{ text: `${namespace}.intro` }]); - expect(AbsoluteAvariceEncounter.dialogue.encounterOptionsDialogue.title).toBe(`${namespace}.title`); - expect(AbsoluteAvariceEncounter.dialogue.encounterOptionsDialogue.description).toBe(`${namespace}.description`); - expect(AbsoluteAvariceEncounter.dialogue.encounterOptionsDialogue.query).toBe(`${namespace}.query`); + expect(AbsoluteAvariceEncounter.dialogue.encounterOptionsDialogue?.title).toBe(`${namespace}.title`); + expect(AbsoluteAvariceEncounter.dialogue.encounterOptionsDialogue?.description).toBe(`${namespace}.description`); + expect(AbsoluteAvariceEncounter.dialogue.encounterOptionsDialogue?.query).toBe(`${namespace}.query`); expect(AbsoluteAvariceEncounter.options.length).toBe(3); }); @@ -98,7 +98,7 @@ describe("Absolute Avarice - Mystery Encounter", () => { it("should spawn if player has enough berries", async () => { game.override.mysteryEncounterTier(MysteryEncounterTier.GREAT); - game.override.starterHeldItems([{name: "BERRY", count: 2, type: BerryType.SITRUS}, {name: "BERRY", count: 3, type: BerryType.GANLON}]); + game.override.startingHeldItems([{name: "BERRY", count: 2, type: BerryType.SITRUS}, {name: "BERRY", count: 3, type: BerryType.GANLON}]); await game.runToMysteryEncounter(); @@ -106,7 +106,7 @@ describe("Absolute Avarice - Mystery Encounter", () => { }); it("should remove all player's berries at the start of the encounter", async () => { - game.override.starterHeldItems([{name: "BERRY", count: 2, type: BerryType.SITRUS}, {name: "BERRY", count: 3, type: BerryType.GANLON}]); + game.override.startingHeldItems([{name: "BERRY", count: 2, type: BerryType.SITRUS}, {name: "BERRY", count: 3, type: BerryType.GANLON}]); await game.runToMysteryEncounter(MysteryEncounterType.ABSOLUTE_AVARICE, defaultParty); @@ -134,13 +134,13 @@ describe("Absolute Avarice - Mystery Encounter", () => { const phaseSpy = vi.spyOn(scene, "pushPhase"); await game.runToMysteryEncounter(MysteryEncounterType.ABSOLUTE_AVARICE, defaultParty); - await runMysteryEncounterToEnd(game, 1, null, true); + await runMysteryEncounterToEnd(game, 1, undefined, true); const enemyField = scene.getEnemyField(); - expect(scene.getCurrentPhase().constructor.name).toBe(CommandPhase.name); + expect(scene.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name); expect(enemyField.length).toBe(1); expect(enemyField[0].species.speciesId).toBe(Species.GREEDENT); - const moveset = enemyField[0].moveset.map(m => m.moveId); + const moveset = enemyField[0].moveset.map(m => m?.moveId); expect(moveset?.length).toBe(4); expect(moveset).toEqual([Moves.THRASH, Moves.BODY_PRESS, Moves.STUFF_CHEEKS, Moves.SLACK_OFF]); @@ -151,10 +151,10 @@ describe("Absolute Avarice - Mystery Encounter", () => { it("should give reviver seed to each pokemon after battle", async () => { await game.runToMysteryEncounter(MysteryEncounterType.ABSOLUTE_AVARICE, defaultParty); - await runMysteryEncounterToEnd(game, 1, null, true); + await runMysteryEncounterToEnd(game, 1, undefined, true); await skipBattleRunMysteryEncounterRewardsPhase(game); await game.phaseInterceptor.to(SelectModifierPhase, false); - expect(scene.getCurrentPhase().constructor.name).toBe(SelectModifierPhase.name); + expect(scene.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name); for (const partyPokemon of scene.getParty()) { const pokemonId = partyPokemon.id; @@ -162,7 +162,7 @@ describe("Absolute Avarice - Mystery Encounter", () => { && (m as PokemonHeldItemModifier).pokemonId === pokemonId, true) as PokemonHeldItemModifier[]; const revSeed = pokemonItems.find(i => i.type.name === "Reviver Seed"); expect(revSeed).toBeDefined; - expect(revSeed.stackCount).toBe(1); + expect(revSeed?.stackCount).toBe(1); } }); }); @@ -184,7 +184,7 @@ describe("Absolute Avarice - Mystery Encounter", () => { }); it("Should return 3 (2/5ths floored) berries if 8 were stolen", async () => { - game.override.starterHeldItems([{name: "BERRY", count: 2, type: BerryType.SITRUS}, {name: "BERRY", count: 3, type: BerryType.GANLON}, {name: "BERRY", count: 3, type: BerryType.APICOT}]); + game.override.startingHeldItems([{name: "BERRY", count: 2, type: BerryType.SITRUS}, {name: "BERRY", count: 3, type: BerryType.GANLON}, {name: "BERRY", count: 3, type: BerryType.APICOT}]); await game.runToMysteryEncounter(MysteryEncounterType.ABSOLUTE_AVARICE, defaultParty); @@ -200,7 +200,7 @@ describe("Absolute Avarice - Mystery Encounter", () => { }); it("Should return 2 (2/5ths floored) berries if 7 were stolen", async () => { - game.override.starterHeldItems([{name: "BERRY", count: 2, type: BerryType.SITRUS}, {name: "BERRY", count: 3, type: BerryType.GANLON}, {name: "BERRY", count: 2, type: BerryType.APICOT}]); + game.override.startingHeldItems([{name: "BERRY", count: 2, type: BerryType.SITRUS}, {name: "BERRY", count: 3, type: BerryType.GANLON}, {name: "BERRY", count: 2, type: BerryType.APICOT}]); await game.runToMysteryEncounter(MysteryEncounterType.ABSOLUTE_AVARICE, defaultParty); @@ -251,7 +251,7 @@ describe("Absolute Avarice - Mystery Encounter", () => { expect(partyCountBefore + 1).toBe(partyCountAfter); const greedent = scene.getParty()[scene.getParty().length - 1]; expect(greedent.species.speciesId).toBe(Species.GREEDENT); - const moveset = greedent.moveset.map(m => m.moveId); + const moveset = greedent.moveset.map(m => m?.moveId); expect(moveset?.length).toBe(4); expect(moveset).toEqual([Moves.THRASH, Moves.BODY_PRESS, Moves.STUFF_CHEEKS, Moves.SLACK_OFF]); }); 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 128a4c109dc..bbc1a968b5c 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 @@ -38,7 +38,7 @@ describe("An Offer You Can't Refuse - Mystery Encounter", () => { game.override.mysteryEncounterChance(100); game.override.startingWave(defaultWave); game.override.startingBiome(defaultBiome); - game.override.disableTrainerWaves(true); + game.override.disableTrainerWaves(); const biomeMap = new Map([ [Biome.VOLCANO, [MysteryEncounterType.MYSTERIOUS_CHALLENGERS]], @@ -65,9 +65,9 @@ describe("An Offer You Can't Refuse - Mystery Encounter", () => { { text: `${namespace}.intro` }, { speaker: `${namespace}.speaker`, text: `${namespace}.intro_dialogue` } ]); - expect(AnOfferYouCantRefuseEncounter.dialogue.encounterOptionsDialogue.title).toBe(`${namespace}.title`); - expect(AnOfferYouCantRefuseEncounter.dialogue.encounterOptionsDialogue.description).toBe(`${namespace}.description`); - expect(AnOfferYouCantRefuseEncounter.dialogue.encounterOptionsDialogue.query).toBe(`${namespace}.query`); + expect(AnOfferYouCantRefuseEncounter.dialogue.encounterOptionsDialogue?.title).toBe(`${namespace}.title`); + expect(AnOfferYouCantRefuseEncounter.dialogue.encounterOptionsDialogue?.description).toBe(`${namespace}.description`); + expect(AnOfferYouCantRefuseEncounter.dialogue.encounterOptionsDialogue?.query).toBe(`${namespace}.query`); expect(AnOfferYouCantRefuseEncounter.options.length).toBe(3); }); @@ -104,7 +104,7 @@ describe("An Offer You Can't Refuse - Mystery Encounter", () => { expect(AnOfferYouCantRefuseEncounter.onInit).toBeDefined(); AnOfferYouCantRefuseEncounter.populateDialogueTokensFromRequirements(scene); - const onInitResult = onInit(scene); + const onInitResult = onInit!(scene); expect(AnOfferYouCantRefuseEncounter.dialogueTokens?.strongestPokemon).toBeDefined(); expect(AnOfferYouCantRefuseEncounter.dialogueTokens?.price).toBeDefined(); @@ -153,7 +153,7 @@ describe("An Offer You Can't Refuse - Mystery Encounter", () => { const itemModifier = scene.findModifier(m => m instanceof ShinyRateBoosterModifier) as ShinyRateBoosterModifier; expect(itemModifier).toBeDefined(); - expect(itemModifier.stackCount).toBe(1); + expect(itemModifier?.stackCount).toBe(1); }); it("Should remove the Pokemon from the party", async () => { @@ -199,7 +199,7 @@ describe("An Offer You Can't Refuse - Mystery Encounter", () => { it("should award EXP to a pokemon with an ability in EXTORTION_ABILITIES", async () => { await game.runToMysteryEncounter(MysteryEncounterType.AN_OFFER_YOU_CANT_REFUSE, defaultParty); const party = scene.getParty(); - const gyarados = party.find((pkm) => pkm.species.speciesId === Species.GYARADOS); + const gyarados = party.find((pkm) => pkm.species.speciesId === Species.GYARADOS)!; const expBefore = gyarados.exp; await runMysteryEncounterToEnd(game, 2); @@ -210,7 +210,7 @@ describe("An Offer You Can't Refuse - Mystery Encounter", () => { it("should award EXP to a pokemon with a move in EXTORTION_MOVES", async () => { await game.runToMysteryEncounter(MysteryEncounterType.AN_OFFER_YOU_CANT_REFUSE, [Species.ABRA]); const party = scene.getParty(); - const abra = party.find((pkm) => pkm.species.speciesId === Species.ABRA); + const abra = party.find((pkm) => pkm.species.speciesId === Species.ABRA)!; abra.moveset = [new PokemonMove(Moves.BEAT_UP)]; const expBefore = abra.exp; 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 435f890b857..0086cc869ef 100644 --- a/src/test/mystery-encounter/encounters/berries-abound-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/berries-abound-encounter.test.ts @@ -37,7 +37,7 @@ describe("Berries Abound - Mystery Encounter", () => { game.override.mysteryEncounterChance(100); game.override.startingWave(defaultWave); game.override.startingBiome(defaultBiome); - game.override.disableTrainerWaves(true); + game.override.disableTrainerWaves(); vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue( new Map([ @@ -59,9 +59,9 @@ describe("Berries Abound - Mystery Encounter", () => { expect(BerriesAboundEncounter.encounterTier).toBe(MysteryEncounterTier.COMMON); expect(BerriesAboundEncounter.dialogue).toBeDefined(); expect(BerriesAboundEncounter.dialogue.intro).toStrictEqual([{ text: `${namespace}.intro` }]); - expect(BerriesAboundEncounter.dialogue.encounterOptionsDialogue.title).toBe(`${namespace}.title`); - expect(BerriesAboundEncounter.dialogue.encounterOptionsDialogue.description).toBe(`${namespace}.description`); - expect(BerriesAboundEncounter.dialogue.encounterOptionsDialogue.query).toBe(`${namespace}.query`); + expect(BerriesAboundEncounter.dialogue.encounterOptionsDialogue?.title).toBe(`${namespace}.title`); + expect(BerriesAboundEncounter.dialogue.encounterOptionsDialogue?.description).toBe(`${namespace}.description`); + expect(BerriesAboundEncounter.dialogue.encounterOptionsDialogue?.query).toBe(`${namespace}.query`); expect(BerriesAboundEncounter.options.length).toBe(3); }); @@ -90,12 +90,12 @@ describe("Berries Abound - Mystery Encounter", () => { expect(BerriesAboundEncounter.onInit).toBeDefined(); BerriesAboundEncounter.populateDialogueTokensFromRequirements(scene); - const onInitResult = onInit(scene); + const onInitResult = onInit!(scene); const config = BerriesAboundEncounter.enemyPartyConfigs[0]; expect(config).toBeDefined(); expect(config.levelAdditiveMultiplier).toBe(1); - expect(config.pokemonConfigs[0].isBoss).toBe(true); + expect(config.pokemonConfigs?.[0].isBoss).toBe(true); expect(onInitResult).toBe(true); }); @@ -119,12 +119,12 @@ describe("Berries Abound - Mystery Encounter", () => { await game.runToMysteryEncounter(MysteryEncounterType.BERRIES_ABOUND, defaultParty); const config = game.scene.currentBattle.mysteryEncounter.enemyPartyConfigs[0]; - const speciesToSpawn = config.pokemonConfigs[0].species.speciesId; + const speciesToSpawn = config.pokemonConfigs?.[0].species.speciesId; - await runMysteryEncounterToEnd(game, 1, null, true); + await runMysteryEncounterToEnd(game, 1, undefined, true); const enemyField = scene.getEnemyField(); - expect(scene.getCurrentPhase().constructor.name).toBe(CommandPhase.name); + expect(scene.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name); expect(enemyField.length).toBe(1); expect(enemyField[0].species.speciesId).toBe(speciesToSpawn); }); @@ -133,11 +133,12 @@ describe("Berries Abound - Mystery Encounter", () => { await game.runToMysteryEncounter(MysteryEncounterType.BERRIES_ABOUND, defaultParty); const numBerries = game.scene.currentBattle.mysteryEncounter.misc.numBerries; + scene.modifiers = []; - await runMysteryEncounterToEnd(game, 1, null, true); + await runMysteryEncounterToEnd(game, 1, undefined, true); await skipBattleRunMysteryEncounterRewardsPhase(game); await game.phaseInterceptor.to(SelectModifierPhase, false); - expect(scene.getCurrentPhase().constructor.name).toBe(SelectModifierPhase.name); + expect(scene.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name); const berriesAfter = scene.findModifiers(m => m instanceof BerryModifier) as BerryModifier[]; const berriesAfterCount = berriesAfter.reduce((a, b) => a + b.stackCount, 0); @@ -147,10 +148,10 @@ describe("Berries Abound - Mystery Encounter", () => { it("should spawn a shop with 5 berries", async () => { await game.runToMysteryEncounter(MysteryEncounterType.BERRIES_ABOUND, defaultParty); - await runMysteryEncounterToEnd(game, 1, null, true); + await runMysteryEncounterToEnd(game, 1, undefined, true); await skipBattleRunMysteryEncounterRewardsPhase(game); await game.phaseInterceptor.to(SelectModifierPhase, false); - expect(scene.getCurrentPhase().constructor.name).toBe(SelectModifierPhase.name); + expect(scene.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name); await game.phaseInterceptor.run(SelectModifierPhase); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); @@ -178,14 +179,14 @@ describe("Berries Abound - Mystery Encounter", () => { await game.runToMysteryEncounter(MysteryEncounterType.BERRIES_ABOUND, defaultParty); const config = game.scene.currentBattle.mysteryEncounter.enemyPartyConfigs[0]; - const speciesToSpawn = config.pokemonConfigs[0].species.speciesId; + const speciesToSpawn = config.pokemonConfigs?.[0].species.speciesId; // Setting enemy's level arbitrarily high to outspeed - config.pokemonConfigs[0].dataSource.level = 1000; + config.pokemonConfigs![0].dataSource!.level = 1000; - await runMysteryEncounterToEnd(game, 2, null, true); + await runMysteryEncounterToEnd(game, 2, undefined, true); const enemyField = scene.getEnemyField(); - expect(scene.getCurrentPhase().constructor.name).toBe(CommandPhase.name); + expect(scene.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name); expect(enemyField.length).toBe(1); expect(enemyField[0].species.speciesId).toBe(speciesToSpawn); @@ -207,7 +208,7 @@ describe("Berries Abound - Mystery Encounter", () => { await runMysteryEncounterToEnd(game, 2); await game.phaseInterceptor.to(SelectModifierPhase, false); - expect(scene.getCurrentPhase().constructor.name).toBe(SelectModifierPhase.name); + expect(scene.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name); await game.phaseInterceptor.run(SelectModifierPhase); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); 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 80f022a3e3e..136ba5b3d32 100644 --- a/src/test/mystery-encounter/encounters/clowning-around-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/clowning-around-encounter.test.ts @@ -50,7 +50,7 @@ describe("Clowning Around - Mystery Encounter", () => { game.override.mysteryEncounterChance(100); game.override.startingWave(defaultWave); game.override.startingBiome(defaultBiome); - game.override.disableTrainerWaves(true); + game.override.disableTrainerWaves(); vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue( new Map([ @@ -78,9 +78,9 @@ describe("Clowning Around - Mystery Encounter", () => { text: `${namespace}.intro_dialogue`, }, ]); - expect(ClowningAroundEncounter.dialogue.encounterOptionsDialogue.title).toBe(`${namespace}.title`); - expect(ClowningAroundEncounter.dialogue.encounterOptionsDialogue.description).toBe(`${namespace}.description`); - expect(ClowningAroundEncounter.dialogue.encounterOptionsDialogue.query).toBe(`${namespace}.query`); + expect(ClowningAroundEncounter.dialogue.encounterOptionsDialogue?.title).toBe(`${namespace}.title`); + expect(ClowningAroundEncounter.dialogue.encounterOptionsDialogue?.description).toBe(`${namespace}.description`); + expect(ClowningAroundEncounter.dialogue.encounterOptionsDialogue?.query).toBe(`${namespace}.query`); expect(ClowningAroundEncounter.options.length).toBe(3); }); @@ -111,23 +111,23 @@ describe("Clowning Around - Mystery Encounter", () => { expect(ClowningAroundEncounter.onInit).toBeDefined(); ClowningAroundEncounter.populateDialogueTokensFromRequirements(scene); - const onInitResult = onInit(scene); + const onInitResult = onInit!(scene); const config = ClowningAroundEncounter.enemyPartyConfigs[0]; expect(config.doubleBattle).toBe(true); - expect(config.trainerConfig.trainerType).toBe(TrainerType.HARLEQUIN); - expect(config.pokemonConfigs[0]).toEqual({ + expect(config.trainerConfig?.trainerType).toBe(TrainerType.HARLEQUIN); + expect(config.pokemonConfigs?.[0]).toEqual({ species: getPokemonSpecies(Species.MR_MIME), isBoss: true, moveSet: [Moves.TEETER_DANCE, Moves.ALLY_SWITCH, Moves.DAZZLING_GLEAM, Moves.PSYCHIC] }); - expect(config.pokemonConfigs[1]).toEqual({ + expect(config.pokemonConfigs?.[1]).toEqual({ species: getPokemonSpecies(Species.BLACEPHALON), mysteryEncounterData: expect.anything(), isBoss: true, moveSet: [Moves.TRICK, Moves.HYPNOSIS, Moves.SHADOW_BALL, Moves.MIND_BLOWN] }); - expect(config.pokemonConfigs[1].mysteryEncounterData.types.length).toBe(2); + expect(config.pokemonConfigs?.[1].mysteryEncounterData?.types.length).toBe(2); expect([ Abilities.STURDY, Abilities.PICKUP, @@ -144,8 +144,8 @@ describe("Clowning Around - Mystery Encounter", () => { Abilities.MAGICIAN, Abilities.SHEER_FORCE, Abilities.PRANKSTER - ]).toContain(config.pokemonConfigs[1].mysteryEncounterData.ability); - expect(ClowningAroundEncounter.misc.ability).toBe(config.pokemonConfigs[1].mysteryEncounterData.ability); + ]).toContain(config.pokemonConfigs?.[1].mysteryEncounterData?.ability); + expect(ClowningAroundEncounter.misc.ability).toBe(config.pokemonConfigs?.[1].mysteryEncounterData?.ability); await vi.waitFor(() => expect(moveInitSpy).toHaveBeenCalled()); await vi.waitFor(() => expect(moveLoadSpy).toHaveBeenCalled()); expect(onInitResult).toBe(true); @@ -172,10 +172,10 @@ describe("Clowning Around - Mystery Encounter", () => { const phaseSpy = vi.spyOn(scene, "pushPhase"); await game.runToMysteryEncounter(MysteryEncounterType.CLOWNING_AROUND, defaultParty); - await runMysteryEncounterToEnd(game, 1, null, true); + await runMysteryEncounterToEnd(game, 1, undefined, true); const enemyField = scene.getEnemyField(); - expect(scene.getCurrentPhase().constructor.name).toBe(CommandPhase.name); + expect(scene.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name); expect(enemyField.length).toBe(2); expect(enemyField[0].species.speciesId).toBe(Species.MR_MIME); expect(enemyField[0].moveset).toEqual([new PokemonMove(Moves.TEETER_DANCE), new PokemonMove(Moves.ALLY_SWITCH), new PokemonMove(Moves.DAZZLING_GLEAM), new PokemonMove(Moves.PSYCHIC)]); @@ -191,10 +191,10 @@ describe("Clowning Around - Mystery Encounter", () => { it("should let the player gain the ability after battle completion", async () => { await game.runToMysteryEncounter(MysteryEncounterType.CLOWNING_AROUND, defaultParty); - await runMysteryEncounterToEnd(game, 1, null, true); + await runMysteryEncounterToEnd(game, 1, undefined, true); await skipBattleRunMysteryEncounterRewardsPhase(game); await game.phaseInterceptor.to(SelectModifierPhase, false); - expect(scene.getCurrentPhase().constructor.name).toBe(SelectModifierPhase.name); + expect(scene.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name); await game.phaseInterceptor.run(SelectModifierPhase); const abilityToTrain = scene.currentBattle.mysteryEncounter.misc.ability; @@ -209,7 +209,7 @@ describe("Clowning Around - Mystery Encounter", () => { vi.spyOn(partyUiHandler, "show"); game.endPhase(); await game.phaseInterceptor.to(PostMysteryEncounterPhase); - expect(scene.getCurrentPhase().constructor.name).toBe(PostMysteryEncounterPhase.name); + expect(scene.getCurrentPhase()?.constructor.name).toBe(PostMysteryEncounterPhase.name); // Wait for Yes/No confirmation to appear await vi.waitFor(() => expect(optionSelectUiHandler.show).toHaveBeenCalled()); @@ -224,7 +224,7 @@ describe("Clowning Around - Mystery Encounter", () => { await game.phaseInterceptor.to(NewBattlePhase, false); const leadPokemon = scene.getParty()[0]; - expect(leadPokemon.mysteryEncounterData.ability).toBe(abilityToTrain); + expect(leadPokemon.mysteryEncounterData?.ability).toBe(abilityToTrain); }); }); @@ -255,6 +255,9 @@ describe("Clowning Around - Mystery Encounter", () => { it("should randomize held items of the Pokemon with the most items, and not the held items of other pokemon", async () => { await game.runToMysteryEncounter(MysteryEncounterType.CLOWNING_AROUND, defaultParty); + // Set some moves on party for attack type booster generation + scene.getParty()[0].moveset = [new PokemonMove(Moves.TACKLE), new PokemonMove(Moves.THIEF)]; + // 2 Sitrus Berries on lead scene.modifiers = []; let itemType = generateModifierType(scene, modifierTypes.BERRY, [BerryType.SITRUS]) as PokemonHeldItemModifierType; @@ -294,8 +297,8 @@ describe("Clowning Around - Mystery Encounter", () => { const secondItemsAfter = scene.getParty()[1].getHeldItems(); expect(secondItemsAfter.length).toBe(1); expect(secondItemsAfter[0].type.id).toBe("SOUL_DEW"); - expect(secondItemsAfter[0].stackCount).toBe(5); - }); + expect(secondItemsAfter[0]?.stackCount).toBe(5); + }, 2000000); it("should leave encounter without battle", async () => { const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); @@ -342,9 +345,9 @@ describe("Clowning Around - Mystery Encounter", () => { scene.getParty()[2].moveset = []; await runMysteryEncounterToEnd(game, 3); - const leadTypesAfter = scene.getParty()[0].mysteryEncounterData.types; - const secondaryTypesAfter = scene.getParty()[1].mysteryEncounterData.types; - const thirdTypesAfter = scene.getParty()[2].mysteryEncounterData.types; + const leadTypesAfter = scene.getParty()[0].mysteryEncounterData?.types; + const secondaryTypesAfter = scene.getParty()[1].mysteryEncounterData?.types; + const thirdTypesAfter = scene.getParty()[2].mysteryEncounterData?.types; expect(leadTypesAfter.length).toBe(2); expect(leadTypesAfter).not.toBe([Type.ICE, Type.WATER]); 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 89afd9d43aa..1f4571c5d61 100644 --- a/src/test/mystery-encounter/encounters/dancing-lessons-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/dancing-lessons-encounter.test.ts @@ -37,7 +37,7 @@ describe("Dancing Lessons - Mystery Encounter", () => { game.override.mysteryEncounterChance(100); game.override.startingWave(defaultWave); game.override.startingBiome(defaultBiome); - game.override.disableTrainerWaves(true); + game.override.disableTrainerWaves(); vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue( new Map([ @@ -60,9 +60,9 @@ describe("Dancing Lessons - Mystery Encounter", () => { expect(DancingLessonsEncounter.encounterTier).toBe(MysteryEncounterTier.GREAT); expect(DancingLessonsEncounter.dialogue).toBeDefined(); expect(DancingLessonsEncounter.dialogue.intro).toStrictEqual([{ text: `${namespace}.intro` }]); - expect(DancingLessonsEncounter.dialogue.encounterOptionsDialogue.title).toBe(`${namespace}.title`); - expect(DancingLessonsEncounter.dialogue.encounterOptionsDialogue.description).toBe(`${namespace}.description`); - expect(DancingLessonsEncounter.dialogue.encounterOptionsDialogue.query).toBe(`${namespace}.query`); + expect(DancingLessonsEncounter.dialogue.encounterOptionsDialogue?.title).toBe(`${namespace}.title`); + expect(DancingLessonsEncounter.dialogue.encounterOptionsDialogue?.description).toBe(`${namespace}.description`); + expect(DancingLessonsEncounter.dialogue.encounterOptionsDialogue?.query).toBe(`${namespace}.query`); expect(DancingLessonsEncounter.options.length).toBe(3); }); @@ -110,14 +110,14 @@ describe("Dancing Lessons - Mystery Encounter", () => { const phaseSpy = vi.spyOn(scene, "pushPhase"); await game.runToMysteryEncounter(MysteryEncounterType.DANCING_LESSONS, defaultParty); - await runMysteryEncounterToEnd(game, 1, null, true); + await runMysteryEncounterToEnd(game, 1, undefined, true); const enemyField = scene.getEnemyField(); - expect(scene.getCurrentPhase().constructor.name).toBe(CommandPhase.name); + expect(scene.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name); expect(enemyField.length).toBe(1); expect(enemyField[0].species.speciesId).toBe(Species.ORICORIO); expect(enemyField[0].summonData.battleStats).toEqual([1, 1, 1, 1, 1, 0, 0]); - const moveset = enemyField[0].moveset.map(m => m.moveId); + const moveset = enemyField[0].moveset.map(m => m?.moveId); expect(moveset.some(m => m === Moves.REVELATION_DANCE)).toBeTruthy(); const movePhases = phaseSpy.mock.calls.filter(p => p[0] instanceof MovePhase).map(p => p[0]); @@ -127,10 +127,10 @@ describe("Dancing Lessons - Mystery Encounter", () => { it("should have a Baton in the rewards after battle", async () => { await game.runToMysteryEncounter(MysteryEncounterType.DANCING_LESSONS, defaultParty); - await runMysteryEncounterToEnd(game, 1, null, true); + await runMysteryEncounterToEnd(game, 1, undefined, true); await skipBattleRunMysteryEncounterRewardsPhase(game); await game.phaseInterceptor.to(SelectModifierPhase, false); - expect(scene.getCurrentPhase().constructor.name).toBe(SelectModifierPhase.name); + expect(scene.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name); await game.phaseInterceptor.run(SelectModifierPhase); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); @@ -205,7 +205,7 @@ describe("Dancing Lessons - Mystery Encounter", () => { expect(partyCountBefore + 1).toBe(partyCountAfter); const oricorio = scene.getParty()[scene.getParty().length - 1]; expect(oricorio.species.speciesId).toBe(Species.ORICORIO); - const moveset = oricorio.moveset.map(m => m.moveId); + const moveset = oricorio.moveset.map(m => m?.moveId); expect(moveset?.some(m => m === Moves.REVELATION_DANCE)).toBeTruthy(); expect(moveset?.some(m => m === Moves.DRAGON_DANCE)).toBeTruthy(); }); @@ -217,7 +217,7 @@ describe("Dancing Lessons - Mystery Encounter", () => { await game.phaseInterceptor.to(MysteryEncounterPhase, false); const encounterPhase = scene.getCurrentPhase(); - expect(encounterPhase.constructor.name).toBe(MysteryEncounterPhase.name); + expect(encounterPhase?.constructor.name).toBe(MysteryEncounterPhase.name); const mysteryEncounterPhase = encounterPhase as MysteryEncounterPhase; vi.spyOn(mysteryEncounterPhase, "continueEncounter"); vi.spyOn(mysteryEncounterPhase, "handleOptionSelect"); @@ -226,7 +226,7 @@ describe("Dancing Lessons - Mystery Encounter", () => { await runSelectMysteryEncounterOption(game, 3); const partyCountAfter = scene.getParty().length; - expect(scene.getCurrentPhase().constructor.name).toBe(MysteryEncounterPhase.name); + 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(); diff --git a/src/test/mystery-encounter/encounters/delibirdy-encounter.test.ts b/src/test/mystery-encounter/encounters/delibirdy-encounter.test.ts index 43f9c5612db..136df416ea7 100644 --- a/src/test/mystery-encounter/encounters/delibirdy-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/delibirdy-encounter.test.ts @@ -37,7 +37,7 @@ describe("Delibird-y - Mystery Encounter", () => { game.override.mysteryEncounterChance(100); game.override.startingWave(defaultWave); game.override.startingBiome(defaultBiome); - game.override.disableTrainerWaves(true); + game.override.disableTrainerWaves(); vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue( new Map([ @@ -60,9 +60,9 @@ describe("Delibird-y - Mystery Encounter", () => { expect(DelibirdyEncounter.dialogue).toBeDefined(); expect(DelibirdyEncounter.dialogue.intro).toStrictEqual([{ text: `${namespace}.intro` }]); expect(DelibirdyEncounter.dialogue.outro).toStrictEqual([{ text: `${namespace}.outro` }]); - expect(DelibirdyEncounter.dialogue.encounterOptionsDialogue.title).toBe(`${namespace}.title`); - expect(DelibirdyEncounter.dialogue.encounterOptionsDialogue.description).toBe(`${namespace}.description`); - expect(DelibirdyEncounter.dialogue.encounterOptionsDialogue.query).toBe(`${namespace}.query`); + expect(DelibirdyEncounter.dialogue.encounterOptionsDialogue?.title).toBe(`${namespace}.title`); + expect(DelibirdyEncounter.dialogue.encounterOptionsDialogue?.description).toBe(`${namespace}.description`); + expect(DelibirdyEncounter.dialogue.encounterOptionsDialogue?.query).toBe(`${namespace}.query`); expect(DelibirdyEncounter.options.length).toBe(3); }); @@ -128,7 +128,7 @@ describe("Delibird-y - Mystery Encounter", () => { const itemModifier = scene.findModifier(m => m instanceof HiddenAbilityRateBoosterModifier) as HiddenAbilityRateBoosterModifier; expect(itemModifier).toBeDefined(); - expect(itemModifier.stackCount).toBe(1); + expect(itemModifier?.stackCount).toBe(1); }); it("Should give the player a Shell Bell if they have max stacks of Berry Pouches", async () => { @@ -148,9 +148,9 @@ describe("Delibird-y - Mystery Encounter", () => { const shellBellAfter = scene.findModifier(m => m instanceof HitHealModifier); expect(abilityCharmAfter).toBeDefined(); - expect(abilityCharmAfter.stackCount).toBe(4); + expect(abilityCharmAfter?.stackCount).toBe(4); expect(shellBellAfter).toBeDefined(); - expect(shellBellAfter.stackCount).toBe(1); + expect(shellBellAfter?.stackCount).toBe(1); }); it("should be disabled if player does not have enough money", async () => { @@ -159,7 +159,7 @@ describe("Delibird-y - Mystery Encounter", () => { await game.phaseInterceptor.to(MysteryEncounterPhase, false); const encounterPhase = scene.getCurrentPhase(); - expect(encounterPhase.constructor.name).toBe(MysteryEncounterPhase.name); + expect(encounterPhase?.constructor.name).toBe(MysteryEncounterPhase.name); const mysteryEncounterPhase = encounterPhase as MysteryEncounterPhase; vi.spyOn(mysteryEncounterPhase, "continueEncounter"); vi.spyOn(mysteryEncounterPhase, "handleOptionSelect"); @@ -167,7 +167,7 @@ describe("Delibird-y - Mystery Encounter", () => { await runSelectMysteryEncounterOption(game, 1); - expect(scene.getCurrentPhase().constructor.name).toBe(MysteryEncounterPhase.name); + 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(); @@ -217,9 +217,9 @@ describe("Delibird-y - Mystery Encounter", () => { const sitrusAfter = scene.findModifier(m => m instanceof BerryModifier); const candyJarAfter = scene.findModifier(m => m instanceof LevelIncrementBoosterModifier); - expect(sitrusAfter.stackCount).toBe(1); + expect(sitrusAfter?.stackCount).toBe(1); expect(candyJarAfter).toBeDefined(); - expect(candyJarAfter.stackCount).toBe(1); + expect(candyJarAfter?.stackCount).toBe(1); }); it("Should remove Reviver Seed and give the player a Healing Charm", async () => { @@ -240,7 +240,7 @@ describe("Delibird-y - Mystery Encounter", () => { expect(reviverSeedAfter).toBeUndefined(); expect(healingCharmAfter).toBeDefined(); - expect(healingCharmAfter.stackCount).toBe(1); + expect(healingCharmAfter?.stackCount).toBe(1); }); it("Should give the player a Shell Bell if they have max stacks of Candy Jars", async () => { @@ -265,11 +265,11 @@ describe("Delibird-y - Mystery Encounter", () => { const candyJarAfter = scene.findModifier(m => m instanceof LevelIncrementBoosterModifier); const shellBellAfter = scene.findModifier(m => m instanceof HitHealModifier); - expect(sitrusAfter.stackCount).toBe(1); + expect(sitrusAfter?.stackCount).toBe(1); expect(candyJarAfter).toBeDefined(); - expect(candyJarAfter.stackCount).toBe(99); + expect(candyJarAfter?.stackCount).toBe(99); expect(shellBellAfter).toBeDefined(); - expect(shellBellAfter.stackCount).toBe(1); + expect(shellBellAfter?.stackCount).toBe(1); }); it("Should give the player a Shell Bell if they have max stacks of Healing Charms", async () => { @@ -296,9 +296,9 @@ describe("Delibird-y - Mystery Encounter", () => { expect(reviverSeedAfter).toBeUndefined(); expect(healingCharmAfter).toBeDefined(); - expect(healingCharmAfter.stackCount).toBe(5); + expect(healingCharmAfter?.stackCount).toBe(5); expect(shellBellAfter).toBeDefined(); - expect(shellBellAfter.stackCount).toBe(1); + expect(shellBellAfter?.stackCount).toBe(1); }); it("should be disabled if player does not have any proper items", async () => { @@ -314,7 +314,7 @@ describe("Delibird-y - Mystery Encounter", () => { await game.phaseInterceptor.to(MysteryEncounterPhase, false); const encounterPhase = scene.getCurrentPhase(); - expect(encounterPhase.constructor.name).toBe(MysteryEncounterPhase.name); + expect(encounterPhase?.constructor.name).toBe(MysteryEncounterPhase.name); const mysteryEncounterPhase = encounterPhase as MysteryEncounterPhase; vi.spyOn(mysteryEncounterPhase, "continueEncounter"); vi.spyOn(mysteryEncounterPhase, "handleOptionSelect"); @@ -322,7 +322,7 @@ describe("Delibird-y - Mystery Encounter", () => { await runSelectMysteryEncounterOption(game, 2); - expect(scene.getCurrentPhase().constructor.name).toBe(MysteryEncounterPhase.name); + 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(); @@ -379,9 +379,9 @@ describe("Delibird-y - Mystery Encounter", () => { const soulDewAfter = scene.findModifier(m => m instanceof PokemonNatureWeightModifier); const berryPouchAfter = scene.findModifier(m => m instanceof PreserveBerryModifier); - expect(soulDewAfter.stackCount).toBe(1); + expect(soulDewAfter?.stackCount).toBe(1); expect(berryPouchAfter).toBeDefined(); - expect(berryPouchAfter.stackCount).toBe(1); + expect(berryPouchAfter?.stackCount).toBe(1); }); it("Should remove held item and give the player a Berry Pouch", async () => { @@ -402,7 +402,7 @@ describe("Delibird-y - Mystery Encounter", () => { expect(soulDewAfter).toBeUndefined(); expect(berryPouchAfter).toBeDefined(); - expect(berryPouchAfter.stackCount).toBe(1); + expect(berryPouchAfter?.stackCount).toBe(1); }); it("Should give the player a Shell Bell if they have max stacks of Berry Pouches", async () => { @@ -429,9 +429,9 @@ describe("Delibird-y - Mystery Encounter", () => { expect(soulDewAfter).toBeUndefined(); expect(berryPouchAfter).toBeDefined(); - expect(berryPouchAfter.stackCount).toBe(3); + expect(berryPouchAfter?.stackCount).toBe(3); expect(shellBellAfter).toBeDefined(); - expect(shellBellAfter.stackCount).toBe(1); + expect(shellBellAfter?.stackCount).toBe(1); }); it("should be disabled if player does not have any proper items", async () => { @@ -447,7 +447,7 @@ describe("Delibird-y - Mystery Encounter", () => { await game.phaseInterceptor.to(MysteryEncounterPhase, false); const encounterPhase = scene.getCurrentPhase(); - expect(encounterPhase.constructor.name).toBe(MysteryEncounterPhase.name); + expect(encounterPhase?.constructor.name).toBe(MysteryEncounterPhase.name); const mysteryEncounterPhase = encounterPhase as MysteryEncounterPhase; vi.spyOn(mysteryEncounterPhase, "continueEncounter"); vi.spyOn(mysteryEncounterPhase, "handleOptionSelect"); @@ -455,7 +455,7 @@ describe("Delibird-y - Mystery Encounter", () => { await runSelectMysteryEncounterOption(game, 3); - expect(scene.getCurrentPhase().constructor.name).toBe(MysteryEncounterPhase.name); + 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(); 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 1ffd1708523..89387556cc5 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 @@ -35,7 +35,7 @@ describe("Department Store Sale - Mystery Encounter", () => { game.override.mysteryEncounterChance(100); game.override.startingWave(defaultWave); game.override.startingBiome(defaultBiome); - game.override.disableTrainerWaves(true); + game.override.disableTrainerWaves(); const biomeMap = new Map([ [Biome.VOLCANO, [MysteryEncounterType.MYSTERIOUS_CHALLENGERS]], @@ -65,9 +65,9 @@ describe("Department Store Sale - Mystery Encounter", () => { text: `${namespace}.intro_dialogue`, } ]); - expect(DepartmentStoreSaleEncounter.dialogue.encounterOptionsDialogue.title).toBe(`${namespace}.title`); - expect(DepartmentStoreSaleEncounter.dialogue.encounterOptionsDialogue.description).toBe(`${namespace}.description`); - expect(DepartmentStoreSaleEncounter.dialogue.encounterOptionsDialogue.query).toBe(`${namespace}.query`); + expect(DepartmentStoreSaleEncounter.dialogue.encounterOptionsDialogue?.title).toBe(`${namespace}.title`); + expect(DepartmentStoreSaleEncounter.dialogue.encounterOptionsDialogue?.description).toBe(`${namespace}.description`); + expect(DepartmentStoreSaleEncounter.dialogue.encounterOptionsDialogue?.query).toBe(`${namespace}.query`); expect(DepartmentStoreSaleEncounter.options.length).toBe(4); }); @@ -109,7 +109,7 @@ describe("Department Store Sale - Mystery Encounter", () => { it("should have shop with only TMs", async () => { await game.runToMysteryEncounter(MysteryEncounterType.DEPARTMENT_STORE_SALE, defaultParty); await runMysteryEncounterToEnd(game, 1); - expect(scene.getCurrentPhase().constructor.name).toBe(SelectModifierPhase.name); + expect(scene.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name); await game.phaseInterceptor.run(SelectModifierPhase); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); @@ -144,7 +144,7 @@ describe("Department Store Sale - Mystery Encounter", () => { it("should have shop with only Vitamins", async () => { await game.runToMysteryEncounter(MysteryEncounterType.DEPARTMENT_STORE_SALE, defaultParty); await runMysteryEncounterToEnd(game, 2); - expect(scene.getCurrentPhase().constructor.name).toBe(SelectModifierPhase.name); + expect(scene.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name); await game.phaseInterceptor.run(SelectModifierPhase); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); @@ -180,7 +180,7 @@ describe("Department Store Sale - Mystery Encounter", () => { it("should have shop with only X Items", async () => { await game.runToMysteryEncounter(MysteryEncounterType.DEPARTMENT_STORE_SALE, defaultParty); await runMysteryEncounterToEnd(game, 3); - expect(scene.getCurrentPhase().constructor.name).toBe(SelectModifierPhase.name); + expect(scene.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name); await game.phaseInterceptor.run(SelectModifierPhase); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); @@ -216,7 +216,7 @@ describe("Department Store Sale - Mystery Encounter", () => { it("should have shop with only Pokeballs", async () => { await game.runToMysteryEncounter(MysteryEncounterType.DEPARTMENT_STORE_SALE, defaultParty); await runMysteryEncounterToEnd(game, 4); - expect(scene.getCurrentPhase().constructor.name).toBe(SelectModifierPhase.name); + expect(scene.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name); await game.phaseInterceptor.run(SelectModifierPhase); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); 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 31f41a32701..e9c5e303ec1 100644 --- a/src/test/mystery-encounter/encounters/fiery-fallout-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/fiery-fallout-encounter.test.ts @@ -42,7 +42,7 @@ describe("Fiery Fallout - Mystery Encounter", () => { game.override.mysteryEncounterChance(100); game.override.startingWave(defaultWave); game.override.startingBiome(defaultBiome); - game.override.disableTrainerWaves(true); + game.override.disableTrainerWaves(); vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue( new Map([ @@ -65,9 +65,9 @@ describe("Fiery Fallout - Mystery Encounter", () => { expect(FieryFalloutEncounter.encounterTier).toBe(MysteryEncounterTier.COMMON); expect(FieryFalloutEncounter.dialogue).toBeDefined(); expect(FieryFalloutEncounter.dialogue.intro).toStrictEqual([{ text: `${namespace}.intro` }]); - expect(FieryFalloutEncounter.dialogue.encounterOptionsDialogue.title).toBe(`${namespace}.title`); - expect(FieryFalloutEncounter.dialogue.encounterOptionsDialogue.description).toBe(`${namespace}.description`); - expect(FieryFalloutEncounter.dialogue.encounterOptionsDialogue.query).toBe(`${namespace}.query`); + expect(FieryFalloutEncounter.dialogue.encounterOptionsDialogue?.title).toBe(`${namespace}.title`); + expect(FieryFalloutEncounter.dialogue.encounterOptionsDialogue?.description).toBe(`${namespace}.description`); + expect(FieryFalloutEncounter.dialogue.encounterOptionsDialogue?.query).toBe(`${namespace}.query`); expect(FieryFalloutEncounter.options.length).toBe(3); }); @@ -106,7 +106,7 @@ describe("Fiery Fallout - Mystery Encounter", () => { expect(FieryFalloutEncounter.onInit).toBeDefined(); FieryFalloutEncounter.populateDialogueTokensFromRequirements(scene); - const onInitResult = onInit(scene); + const onInitResult = onInit!(scene); expect(FieryFalloutEncounter.enemyPartyConfigs).toEqual([ { @@ -152,10 +152,10 @@ describe("Fiery Fallout - Mystery Encounter", () => { const phaseSpy = vi.spyOn(scene, "pushPhase"); await game.runToMysteryEncounter(MysteryEncounterType.FIERY_FALLOUT, defaultParty); - await runMysteryEncounterToEnd(game, 1, null, true); + await runMysteryEncounterToEnd(game, 1, undefined, true); const enemyField = scene.getEnemyField(); - expect(scene.getCurrentPhase().constructor.name).toBe(CommandPhase.name); + expect(scene.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name); expect(enemyField.length).toBe(2); expect(enemyField[0].species.speciesId).toBe(Species.VOLCARONA); expect(enemyField[1].species.speciesId).toBe(Species.VOLCARONA); @@ -169,10 +169,10 @@ describe("Fiery Fallout - Mystery Encounter", () => { it("should give charcoal to lead pokemon", async () => { await game.runToMysteryEncounter(MysteryEncounterType.FIERY_FALLOUT, defaultParty); - await runMysteryEncounterToEnd(game, 1, null, true); + await runMysteryEncounterToEnd(game, 1, undefined, true); await skipBattleRunMysteryEncounterRewardsPhase(game); await game.phaseInterceptor.to(SelectModifierPhase, false); - expect(scene.getCurrentPhase().constructor.name).toBe(SelectModifierPhase.name); + expect(scene.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name); const leadPokemonId = scene.getParty()?.[0].id; const leadPokemonItems = scene.findModifiers(m => m instanceof PokemonHeldItemModifier @@ -202,9 +202,9 @@ describe("Fiery Fallout - Mystery Encounter", () => { await game.runToMysteryEncounter(MysteryEncounterType.FIERY_FALLOUT, defaultParty); const party = scene.getParty(); - const lapras = party.find((pkm) => pkm.species.speciesId === Species.LAPRAS); + const lapras = party.find((pkm) => pkm.species.speciesId === Species.LAPRAS)!; lapras.status = new Status(StatusEffect.POISON); - const abra = party.find((pkm) => pkm.species.speciesId === Species.ABRA); + const abra = party.find((pkm) => pkm.species.speciesId === Species.ABRA)!; vi.spyOn(abra, "isAllowedInBattle").mockReturnValue(false); await runMysteryEncounterToEnd(game, 2); @@ -251,7 +251,7 @@ describe("Fiery Fallout - Mystery Encounter", () => { await runMysteryEncounterToEnd(game, 3); // await skipBattleRunMysteryEncounterRewardsPhase(game); await game.phaseInterceptor.to(SelectModifierPhase, false); - expect(scene.getCurrentPhase().constructor.name).toBe(SelectModifierPhase.name); + expect(scene.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name); const leadPokemonId = scene.getParty()?.[0].id; const leadPokemonItems = scene.findModifiers(m => m instanceof PokemonHeldItemModifier @@ -274,12 +274,12 @@ describe("Fiery Fallout - Mystery Encounter", () => { await game.phaseInterceptor.to(MysteryEncounterPhase, false); const encounterPhase = scene.getCurrentPhase(); - expect(encounterPhase.constructor.name).toBe(MysteryEncounterPhase.name); + expect(encounterPhase?.constructor.name).toBe(MysteryEncounterPhase.name); const continueEncounterSpy = vi.spyOn((encounterPhase as MysteryEncounterPhase), "continueEncounter"); await runSelectMysteryEncounterOption(game, 3); - expect(scene.getCurrentPhase().constructor.name).toBe(MysteryEncounterPhase.name); + expect(scene.getCurrentPhase()?.constructor.name).toBe(MysteryEncounterPhase.name); expect(continueEncounterSpy).not.toHaveBeenCalled(); }); }); 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 1c8cee8f8c3..a75fe05be0b 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 @@ -38,7 +38,7 @@ describe("Fight or Flight - Mystery Encounter", () => { game.override.mysteryEncounterChance(100); game.override.startingWave(defaultWave); game.override.startingBiome(defaultBiome); - game.override.disableTrainerWaves(true); + game.override.disableTrainerWaves(); vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue( new Map([ @@ -60,9 +60,9 @@ describe("Fight or Flight - Mystery Encounter", () => { expect(FightOrFlightEncounter.encounterTier).toBe(MysteryEncounterTier.COMMON); expect(FightOrFlightEncounter.dialogue).toBeDefined(); expect(FightOrFlightEncounter.dialogue.intro).toStrictEqual([{ text: `${namespace}.intro` }]); - expect(FightOrFlightEncounter.dialogue.encounterOptionsDialogue.title).toBe(`${namespace}.title`); - expect(FightOrFlightEncounter.dialogue.encounterOptionsDialogue.description).toBe(`${namespace}.description`); - expect(FightOrFlightEncounter.dialogue.encounterOptionsDialogue.query).toBe(`${namespace}.query`); + expect(FightOrFlightEncounter.dialogue.encounterOptionsDialogue?.title).toBe(`${namespace}.title`); + expect(FightOrFlightEncounter.dialogue.encounterOptionsDialogue?.description).toBe(`${namespace}.description`); + expect(FightOrFlightEncounter.dialogue.encounterOptionsDialogue?.query).toBe(`${namespace}.query`); expect(FightOrFlightEncounter.options.length).toBe(3); }); @@ -91,12 +91,12 @@ describe("Fight or Flight - Mystery Encounter", () => { expect(FightOrFlightEncounter.onInit).toBeDefined(); FightOrFlightEncounter.populateDialogueTokensFromRequirements(scene); - const onInitResult = onInit(scene); + const onInitResult = onInit!(scene); const config = FightOrFlightEncounter.enemyPartyConfigs[0]; expect(config).toBeDefined(); expect(config.levelAdditiveMultiplier).toBe(1); - expect(config.pokemonConfigs[0].isBoss).toBe(true); + expect(config.pokemonConfigs?.[0].isBoss).toBe(true); expect(onInitResult).toBe(true); }); @@ -120,12 +120,12 @@ describe("Fight or Flight - Mystery Encounter", () => { await game.runToMysteryEncounter(MysteryEncounterType.FIGHT_OR_FLIGHT, defaultParty); const config = game.scene.currentBattle.mysteryEncounter.enemyPartyConfigs[0]; - const speciesToSpawn = config.pokemonConfigs[0].species.speciesId; + const speciesToSpawn = config.pokemonConfigs?.[0].species.speciesId; - await runMysteryEncounterToEnd(game, 1, null, true); + await runMysteryEncounterToEnd(game, 1, undefined, true); const enemyField = scene.getEnemyField(); - expect(scene.getCurrentPhase().constructor.name).toBe(CommandPhase.name); + expect(scene.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name); expect(enemyField.length).toBe(1); expect(enemyField[0].species.speciesId).toBe(speciesToSpawn); }); @@ -135,10 +135,10 @@ describe("Fight or Flight - Mystery Encounter", () => { const item = game.scene.currentBattle.mysteryEncounter.misc; - await runMysteryEncounterToEnd(game, 1, null, true); + await runMysteryEncounterToEnd(game, 1, undefined, true); await skipBattleRunMysteryEncounterRewardsPhase(game); await game.phaseInterceptor.to(SelectModifierPhase, false); - expect(scene.getCurrentPhase().constructor.name).toBe(SelectModifierPhase.name); + expect(scene.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name); await game.phaseInterceptor.run(SelectModifierPhase); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); @@ -171,7 +171,7 @@ describe("Fight or Flight - Mystery Encounter", () => { await game.phaseInterceptor.to(MysteryEncounterPhase, false); const encounterPhase = scene.getCurrentPhase(); - expect(encounterPhase.constructor.name).toBe(MysteryEncounterPhase.name); + expect(encounterPhase?.constructor.name).toBe(MysteryEncounterPhase.name); const mysteryEncounterPhase = encounterPhase as MysteryEncounterPhase; vi.spyOn(mysteryEncounterPhase, "continueEncounter"); vi.spyOn(mysteryEncounterPhase, "handleOptionSelect"); @@ -179,7 +179,7 @@ describe("Fight or Flight - Mystery Encounter", () => { await runSelectMysteryEncounterOption(game, 2); - expect(scene.getCurrentPhase().constructor.name).toBe(MysteryEncounterPhase.name); + 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(); @@ -196,7 +196,7 @@ describe("Fight or Flight - Mystery Encounter", () => { await runMysteryEncounterToEnd(game, 2); await game.phaseInterceptor.to(SelectModifierPhase, false); - expect(scene.getCurrentPhase().constructor.name).toBe(SelectModifierPhase.name); + expect(scene.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name); await game.phaseInterceptor.run(SelectModifierPhase); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); 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 c9d2d276ecb..f77d9962f01 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 @@ -36,7 +36,7 @@ describe("Lost at Sea - Mystery Encounter", () => { game.override.mysteryEncounterChance(100); game.override.startingWave(defaultWave); game.override.startingBiome(defaultBiome); - game.override.disableTrainerWaves(true); + game.override.disableTrainerWaves(); vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue( new Map([ @@ -59,9 +59,9 @@ describe("Lost at Sea - Mystery Encounter", () => { expect(LostAtSeaEncounter.encounterTier).toBe(MysteryEncounterTier.COMMON); expect(LostAtSeaEncounter.dialogue).toBeDefined(); expect(LostAtSeaEncounter.dialogue.intro).toStrictEqual([{ text: `${namespace}.intro` }]); - expect(LostAtSeaEncounter.dialogue.encounterOptionsDialogue.title).toBe(`${namespace}.title`); - expect(LostAtSeaEncounter.dialogue.encounterOptionsDialogue.description).toBe(`${namespace}.description`); - expect(LostAtSeaEncounter.dialogue.encounterOptionsDialogue.query).toBe(`${namespace}.query`); + expect(LostAtSeaEncounter.dialogue.encounterOptionsDialogue?.title).toBe(`${namespace}.title`); + expect(LostAtSeaEncounter.dialogue.encounterOptionsDialogue?.description).toBe(`${namespace}.description`); + expect(LostAtSeaEncounter.dialogue.encounterOptionsDialogue?.query).toBe(`${namespace}.query`); expect(LostAtSeaEncounter.options.length).toBe(3); }); @@ -98,7 +98,7 @@ describe("Lost at Sea - Mystery Encounter", () => { expect(LostAtSeaEncounter.onInit).toBeDefined(); LostAtSeaEncounter.populateDialogueTokensFromRequirements(scene); - const onInitResult = onInit(scene); + const onInitResult = onInit!(scene); expect(LostAtSeaEncounter.dialogueTokens?.damagePercentage).toBe("25"); expect(LostAtSeaEncounter.dialogueTokens?.option1RequiredMove).toBe(Moves[Moves.SURF]); @@ -129,12 +129,12 @@ describe("Lost at Sea - Mystery Encounter", () => { await game.runToMysteryEncounter(MysteryEncounterType.LOST_AT_SEA, defaultParty); const party = game.scene.getParty(); - const blastoise = party.find((pkm) => pkm.species.speciesId === Species.PIDGEOT); - const expBefore = blastoise.exp; + const blastoise = party.find((pkm) => pkm.species.speciesId === Species.BLASTOISE); + const expBefore = blastoise!.exp; - await runMysteryEncounterToEnd(game, 2); + await runMysteryEncounterToEnd(game, 1); - expect(blastoise.exp).toBe(expBefore + Math.floor(laprasSpecies.baseExp * defaultWave / 5 + 1)); + expect(blastoise?.exp).toBe(expBefore + Math.floor(laprasSpecies.baseExp * defaultWave / 5 + 1)); }); it("should leave encounter without battle", async () => { @@ -152,7 +152,7 @@ describe("Lost at Sea - Mystery Encounter", () => { await game.phaseInterceptor.to(MysteryEncounterPhase, false); const encounterPhase = scene.getCurrentPhase(); - expect(encounterPhase.constructor.name).toBe(MysteryEncounterPhase.name); + expect(encounterPhase?.constructor.name).toBe(MysteryEncounterPhase.name); const mysteryEncounterPhase = encounterPhase as MysteryEncounterPhase; vi.spyOn(mysteryEncounterPhase, "continueEncounter"); vi.spyOn(mysteryEncounterPhase, "handleOptionSelect"); @@ -160,7 +160,7 @@ describe("Lost at Sea - Mystery Encounter", () => { await runSelectMysteryEncounterOption(game, 1); - expect(scene.getCurrentPhase().constructor.name).toBe(MysteryEncounterPhase.name); + 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(); @@ -194,11 +194,11 @@ describe("Lost at Sea - Mystery Encounter", () => { await game.runToMysteryEncounter(MysteryEncounterType.LOST_AT_SEA, defaultParty); const party = game.scene.getParty(); const pidgeot = party.find((pkm) => pkm.species.speciesId === Species.PIDGEOT); - const expBefore = pidgeot.exp; + const expBefore = pidgeot!.exp; await runMysteryEncounterToEnd(game, 2); - expect(pidgeot.exp).toBe(expBefore + Math.floor(laprasBaseExp * defaultWave / 5 + 1)); + expect(pidgeot!.exp).toBe(expBefore + Math.floor(laprasBaseExp * defaultWave / 5 + 1)); }); it("should leave encounter without battle", async () => { @@ -216,7 +216,7 @@ describe("Lost at Sea - Mystery Encounter", () => { await game.phaseInterceptor.to(MysteryEncounterPhase, false); const encounterPhase = scene.getCurrentPhase(); - expect(encounterPhase.constructor.name).toBe(MysteryEncounterPhase.name); + expect(encounterPhase?.constructor.name).toBe(MysteryEncounterPhase.name); const mysteryEncounterPhase = encounterPhase as MysteryEncounterPhase; vi.spyOn(mysteryEncounterPhase, "continueEncounter"); vi.spyOn(mysteryEncounterPhase, "handleOptionSelect"); @@ -224,7 +224,7 @@ describe("Lost at Sea - Mystery Encounter", () => { await runSelectMysteryEncounterOption(game, 2); - expect(scene.getCurrentPhase().constructor.name).toBe(MysteryEncounterPhase.name); + 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(); @@ -254,7 +254,7 @@ describe("Lost at Sea - Mystery Encounter", () => { await game.runToMysteryEncounter(MysteryEncounterType.LOST_AT_SEA, defaultParty); const party = game.scene.getParty(); - const abra = party.find((pkm) => pkm.species.speciesId === Species.ABRA); + const abra = party.find((pkm) => pkm.species.speciesId === Species.ABRA)!; vi.spyOn(abra, "isAllowedInBattle").mockReturnValue(false); await runMysteryEncounterToEnd(game, 3); 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 31fb03cb7d3..67cabad2af4 100644 --- a/src/test/mystery-encounter/encounters/mysterious-challengers-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/mysterious-challengers-encounter.test.ts @@ -40,7 +40,7 @@ describe("Mysterious Challengers - Mystery Encounter", () => { game.override.mysteryEncounterChance(100); game.override.startingWave(defaultWave); game.override.startingBiome(defaultBiome); - game.override.disableTrainerWaves(true); + game.override.disableTrainerWaves(); const biomeMap = new Map([ [Biome.VOLCANO, [MysteryEncounterType.FIGHT_OR_FLIGHT]], @@ -64,9 +64,9 @@ describe("Mysterious Challengers - Mystery Encounter", () => { expect(MysteriousChallengersEncounter.encounterTier).toBe(MysteryEncounterTier.GREAT); expect(MysteriousChallengersEncounter.dialogue).toBeDefined(); expect(MysteriousChallengersEncounter.dialogue.intro).toStrictEqual([{ text: `${namespace}.intro` }]); - expect(MysteriousChallengersEncounter.dialogue.encounterOptionsDialogue.title).toBe(`${namespace}.title`); - expect(MysteriousChallengersEncounter.dialogue.encounterOptionsDialogue.description).toBe(`${namespace}.description`); - expect(MysteriousChallengersEncounter.dialogue.encounterOptionsDialogue.query).toBe(`${namespace}.query`); + expect(MysteriousChallengersEncounter.dialogue.encounterOptionsDialogue?.title).toBe(`${namespace}.title`); + expect(MysteriousChallengersEncounter.dialogue.encounterOptionsDialogue?.description).toBe(`${namespace}.description`); + expect(MysteriousChallengersEncounter.dialogue.encounterOptionsDialogue?.query).toBe(`${namespace}.query`); expect(MysteriousChallengersEncounter.options.length).toBe(3); }); @@ -105,7 +105,7 @@ describe("Mysterious Challengers - Mystery Encounter", () => { expect(encounter.onInit).toBeDefined(); encounter.populateDialogueTokensFromRequirements(scene); - const onInitResult = onInit(scene); + const onInitResult = onInit!(scene); expect(encounter.enemyPartyConfigs).toBeDefined(); expect(encounter.enemyPartyConfigs.length).toBe(3); @@ -125,11 +125,11 @@ describe("Mysterious Challengers - Mystery Encounter", () => { female: expect.any(Boolean), } ]); - expect(encounter.enemyPartyConfigs[1].trainerConfig.partyTemplates[0]).toEqual(new TrainerPartyCompoundTemplate( + expect(encounter.enemyPartyConfigs[1].trainerConfig?.partyTemplates[0]).toEqual(new TrainerPartyCompoundTemplate( new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER, false, true), new TrainerPartyTemplate(3, PartyMemberStrength.AVERAGE, false, true) )); - expect(encounter.enemyPartyConfigs[2].trainerConfig.partyTemplates[0]).toEqual(new TrainerPartyCompoundTemplate( + expect(encounter.enemyPartyConfigs[2].trainerConfig?.partyTemplates[0]).toEqual(new TrainerPartyCompoundTemplate( new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(3, PartyMemberStrength.STRONG), new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER)) @@ -157,19 +157,19 @@ describe("Mysterious Challengers - Mystery Encounter", () => { it("should start battle against the trainer", async () => { await game.runToMysteryEncounter(MysteryEncounterType.MYSTERIOUS_CHALLENGERS, defaultParty); - await runMysteryEncounterToEnd(game, 1, null, true); + await runMysteryEncounterToEnd(game, 1, undefined, true); - expect(scene.getCurrentPhase().constructor.name).toBe(CommandPhase.name); + expect(scene.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name); expect(scene.currentBattle.trainer).toBeDefined(); expect(scene.currentBattle.mysteryEncounter.encounterMode).toBe(MysteryEncounterMode.TRAINER_BATTLE); }); it("should have normal trainer rewards after battle", async () => { await game.runToMysteryEncounter(MysteryEncounterType.MYSTERIOUS_CHALLENGERS, defaultParty); - await runMysteryEncounterToEnd(game, 1, null, true); + await runMysteryEncounterToEnd(game, 1, undefined, true); await skipBattleRunMysteryEncounterRewardsPhase(game); await game.phaseInterceptor.to(SelectModifierPhase, false); - expect(scene.getCurrentPhase().constructor.name).toBe(SelectModifierPhase.name); + expect(scene.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name); await game.phaseInterceptor.run(SelectModifierPhase); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); @@ -199,19 +199,19 @@ describe("Mysterious Challengers - Mystery Encounter", () => { it("should start battle against the trainer", async () => { await game.runToMysteryEncounter(MysteryEncounterType.MYSTERIOUS_CHALLENGERS, defaultParty); - await runMysteryEncounterToEnd(game, 2, null, true); + await runMysteryEncounterToEnd(game, 2, undefined, true); - expect(scene.getCurrentPhase().constructor.name).toBe(CommandPhase.name); + expect(scene.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name); expect(scene.currentBattle.trainer).toBeDefined(); expect(scene.currentBattle.mysteryEncounter.encounterMode).toBe(MysteryEncounterMode.TRAINER_BATTLE); }); it("should have hard trainer rewards after battle", async () => { await game.runToMysteryEncounter(MysteryEncounterType.MYSTERIOUS_CHALLENGERS, defaultParty); - await runMysteryEncounterToEnd(game, 2, null, true); + await runMysteryEncounterToEnd(game, 2, undefined, true); await skipBattleRunMysteryEncounterRewardsPhase(game); await game.phaseInterceptor.to(SelectModifierPhase, false); - expect(scene.getCurrentPhase().constructor.name).toBe(SelectModifierPhase.name); + expect(scene.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name); await game.phaseInterceptor.run(SelectModifierPhase); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); @@ -242,19 +242,19 @@ describe("Mysterious Challengers - Mystery Encounter", () => { it("should start battle against the trainer", async () => { await game.runToMysteryEncounter(MysteryEncounterType.MYSTERIOUS_CHALLENGERS, defaultParty); - await runMysteryEncounterToEnd(game, 3, null, true); + await runMysteryEncounterToEnd(game, 3, undefined, true); - expect(scene.getCurrentPhase().constructor.name).toBe(CommandPhase.name); + expect(scene.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name); expect(scene.currentBattle.trainer).toBeDefined(); expect(scene.currentBattle.mysteryEncounter.encounterMode).toBe(MysteryEncounterMode.TRAINER_BATTLE); }); it("should have brutal trainer rewards after battle", async () => { await game.runToMysteryEncounter(MysteryEncounterType.MYSTERIOUS_CHALLENGERS, defaultParty); - await runMysteryEncounterToEnd(game, 3, null, true); + await runMysteryEncounterToEnd(game, 3, undefined, true); await skipBattleRunMysteryEncounterRewardsPhase(game); await game.phaseInterceptor.to(SelectModifierPhase, false); - expect(scene.getCurrentPhase().constructor.name).toBe(SelectModifierPhase.name); + expect(scene.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name); await game.phaseInterceptor.run(SelectModifierPhase); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); 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 95e358bb6ae..df94e4fbe3e 100644 --- a/src/test/mystery-encounter/encounters/part-timer-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/part-timer-encounter.test.ts @@ -36,7 +36,7 @@ describe("Part-Timer - Mystery Encounter", () => { game.override.mysteryEncounterChance(100); game.override.startingWave(defaultWave); game.override.startingBiome(defaultBiome); - game.override.disableTrainerWaves(true); + game.override.disableTrainerWaves(); const biomeMap = new Map([ [Biome.VOLCANO, [MysteryEncounterType.MYSTERIOUS_CHALLENGERS]], @@ -66,9 +66,9 @@ describe("Part-Timer - Mystery Encounter", () => { text: `${namespace}.intro_dialogue`, } ]); - expect(PartTimerEncounter.dialogue.encounterOptionsDialogue.title).toBe(`${namespace}.title`); - expect(PartTimerEncounter.dialogue.encounterOptionsDialogue.description).toBe(`${namespace}.description`); - expect(PartTimerEncounter.dialogue.encounterOptionsDialogue.query).toBe(`${namespace}.query`); + expect(PartTimerEncounter.dialogue.encounterOptionsDialogue?.title).toBe(`${namespace}.title`); + expect(PartTimerEncounter.dialogue.encounterOptionsDialogue?.description).toBe(`${namespace}.description`); + expect(PartTimerEncounter.dialogue.encounterOptionsDialogue?.query).toBe(`${namespace}.query`); expect(PartTimerEncounter.options.length).toBe(3); }); @@ -127,7 +127,7 @@ describe("Part-Timer - Mystery Encounter", () => { // Expect PP of mon's moves to have been reduced to 2 const moves = scene.getParty()[0].moveset; for (const move of moves) { - expect(move.getMovePp() - move.ppUsed).toBe(2); + expect((move?.getMovePp() ?? 0) - (move?.ppUsed ?? 0)).toBe(2); } }); @@ -147,7 +147,7 @@ describe("Part-Timer - Mystery Encounter", () => { // Expect PP of mon's moves to have been reduced to 2 const moves = scene.getParty()[1].moveset; for (const move of moves) { - expect(move.getMovePp() - move.ppUsed).toBe(2); + expect((move?.getMovePp() ?? 0) - (move?.ppUsed ?? 0)).toBe(2); } }); @@ -192,7 +192,7 @@ describe("Part-Timer - Mystery Encounter", () => { // Expect PP of mon's moves to have been reduced to 2 const moves = scene.getParty()[2].moveset; for (const move of moves) { - expect(move.getMovePp() - move.ppUsed).toBe(2); + expect((move?.getMovePp() ?? 0) - (move?.ppUsed ?? 0)).toBe(2); } }); @@ -212,7 +212,7 @@ describe("Part-Timer - Mystery Encounter", () => { // Expect PP of mon's moves to have been reduced to 2 const moves = scene.getParty()[3].moveset; for (const move of moves) { - expect(move.getMovePp() - move.ppUsed).toBe(2); + expect((move?.getMovePp() ?? 0) - (move?.ppUsed ?? 0)).toBe(2); } }); @@ -252,7 +252,7 @@ describe("Part-Timer - Mystery Encounter", () => { await game.phaseInterceptor.to(MysteryEncounterPhase, false); const encounterPhase = scene.getCurrentPhase(); - expect(encounterPhase.constructor.name).toBe(MysteryEncounterPhase.name); + expect(encounterPhase?.constructor.name).toBe(MysteryEncounterPhase.name); const mysteryEncounterPhase = encounterPhase as MysteryEncounterPhase; vi.spyOn(mysteryEncounterPhase, "continueEncounter"); vi.spyOn(mysteryEncounterPhase, "handleOptionSelect"); @@ -260,7 +260,7 @@ describe("Part-Timer - Mystery Encounter", () => { await runSelectMysteryEncounterOption(game, 3); - expect(scene.getCurrentPhase().constructor.name).toBe(MysteryEncounterPhase.name); + 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(); @@ -279,7 +279,7 @@ describe("Part-Timer - Mystery Encounter", () => { // Expect PP of mon's moves to have been reduced to 2 const moves = scene.getParty()[0].moveset; for (const move of moves) { - expect(move.getMovePp() - move.ppUsed).toBe(2); + expect((move?.getMovePp() ?? 0) - (move?.ppUsed ?? 0)).toBe(2); } }); 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 833503e2636..7dcf10669d6 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 @@ -35,7 +35,7 @@ describe("The Pokemon Salesman - Mystery Encounter", () => { game.override.mysteryEncounterChance(100); game.override.startingWave(defaultWave); game.override.startingBiome(defaultBiome); - game.override.disableTrainerWaves(true); + game.override.disableTrainerWaves(); const biomeMap = new Map([ [Biome.VOLCANO, [MysteryEncounterType.MYSTERIOUS_CHALLENGERS]], @@ -62,9 +62,9 @@ describe("The Pokemon Salesman - Mystery Encounter", () => { { text: `${namespace}.intro` }, { speaker: `${namespace}.speaker`, text: `${namespace}.intro_dialogue` } ]); - expect(ThePokemonSalesmanEncounter.dialogue.encounterOptionsDialogue.title).toBe(`${namespace}.title`); - expect(ThePokemonSalesmanEncounter.dialogue.encounterOptionsDialogue.description).toBe(`${namespace}.description`); - expect(ThePokemonSalesmanEncounter.dialogue.encounterOptionsDialogue.query).toBe(`${namespace}.query`); + expect(ThePokemonSalesmanEncounter.dialogue.encounterOptionsDialogue?.title).toBe(`${namespace}.title`); + expect(ThePokemonSalesmanEncounter.dialogue.encounterOptionsDialogue?.description).toBe(`${namespace}.description`); + expect(ThePokemonSalesmanEncounter.dialogue.encounterOptionsDialogue?.query).toBe(`${namespace}.query`); expect(ThePokemonSalesmanEncounter.options.length).toBe(2); }); @@ -101,7 +101,7 @@ describe("The Pokemon Salesman - Mystery Encounter", () => { expect(ThePokemonSalesmanEncounter.onInit).toBeDefined(); ThePokemonSalesmanEncounter.populateDialogueTokensFromRequirements(scene); - const onInitResult = onInit(scene); + const onInitResult = onInit!(scene); expect(ThePokemonSalesmanEncounter.dialogueTokens?.purchasePokemon).toBeDefined(); expect(ThePokemonSalesmanEncounter.dialogueTokens?.price).toBeDefined(); @@ -167,7 +167,7 @@ describe("The Pokemon Salesman - Mystery Encounter", () => { await game.phaseInterceptor.to(MysteryEncounterPhase, false); const encounterPhase = scene.getCurrentPhase(); - expect(encounterPhase.constructor.name).toBe(MysteryEncounterPhase.name); + expect(encounterPhase?.constructor.name).toBe(MysteryEncounterPhase.name); const mysteryEncounterPhase = encounterPhase as MysteryEncounterPhase; vi.spyOn(mysteryEncounterPhase, "continueEncounter"); vi.spyOn(mysteryEncounterPhase, "handleOptionSelect"); @@ -175,7 +175,7 @@ describe("The Pokemon Salesman - Mystery Encounter", () => { await runSelectMysteryEncounterOption(game, 1); - expect(scene.getCurrentPhase().constructor.name).toBe(MysteryEncounterPhase.name); + 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(); 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 5c526ddeb57..e68ee9753df 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 @@ -11,7 +11,6 @@ import { runMysteryEncounterToEnd, skipBattleRunMysteryEncounterRewardsPhase } f import { CommandPhase, MovePhase, SelectModifierPhase } from "#app/phases"; import { Moves } from "#enums/moves"; import BattleScene from "#app/battle-scene"; -import * as Modifiers from "#app/modifier/modifier"; import { TheStrongStuffEncounter } from "#app/data/mystery-encounters/encounters/the-strong-stuff-encounter"; import { Nature } from "#app/data/nature"; import { BerryType } from "#enums/berry-type"; @@ -19,7 +18,7 @@ import { BattlerTagType } from "#enums/battler-tag-type"; import { PokemonMove } from "#app/field/pokemon"; import { Mode } from "#app/ui/ui"; import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; -import { PokemonBaseStatTotalModifier } from "#app/modifier/modifier"; +import { BerryModifier, PokemonBaseStatTotalModifier } 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"; @@ -45,7 +44,7 @@ describe("The Strong Stuff - Mystery Encounter", () => { game.override.mysteryEncounterChance(100); game.override.startingWave(defaultWave); game.override.startingBiome(defaultBiome); - game.override.disableTrainerWaves(true); + game.override.disableTrainerWaves(); vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue( new Map([ @@ -68,9 +67,9 @@ describe("The Strong Stuff - Mystery Encounter", () => { expect(TheStrongStuffEncounter.encounterTier).toBe(MysteryEncounterTier.COMMON); expect(TheStrongStuffEncounter.dialogue).toBeDefined(); expect(TheStrongStuffEncounter.dialogue.intro).toStrictEqual([{ text: `${namespace}.intro` }]); - expect(TheStrongStuffEncounter.dialogue.encounterOptionsDialogue.title).toBe(`${namespace}.title`); - expect(TheStrongStuffEncounter.dialogue.encounterOptionsDialogue.description).toBe(`${namespace}.description`); - expect(TheStrongStuffEncounter.dialogue.encounterOptionsDialogue.query).toBe(`${namespace}.query`); + expect(TheStrongStuffEncounter.dialogue.encounterOptionsDialogue?.title).toBe(`${namespace}.title`); + expect(TheStrongStuffEncounter.dialogue.encounterOptionsDialogue?.description).toBe(`${namespace}.description`); + expect(TheStrongStuffEncounter.dialogue.encounterOptionsDialogue?.query).toBe(`${namespace}.query`); expect(TheStrongStuffEncounter.options.length).toBe(2); }); @@ -109,7 +108,7 @@ describe("The Strong Stuff - Mystery Encounter", () => { expect(TheStrongStuffEncounter.onInit).toBeDefined(); TheStrongStuffEncounter.populateDialogueTokensFromRequirements(scene); - const onInitResult = onInit(scene); + const onInitResult = onInit!(scene); expect(TheStrongStuffEncounter.enemyPartyConfigs).toEqual([ { @@ -198,19 +197,19 @@ describe("The Strong Stuff - Mystery Encounter", () => { const phaseSpy = vi.spyOn(scene, "pushPhase"); await game.runToMysteryEncounter(MysteryEncounterType.THE_STRONG_STUFF, defaultParty); - await runMysteryEncounterToEnd(game, 2, null, true); + await runMysteryEncounterToEnd(game, 2, undefined, true); const enemyField = scene.getEnemyField(); - expect(scene.getCurrentPhase().constructor.name).toBe(CommandPhase.name); + expect(scene.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name); expect(enemyField.length).toBe(1); expect(enemyField[0].species.speciesId).toBe(Species.SHUCKLE); expect(enemyField[0].summonData.battleStats).toEqual([0, 2, 0, 2, 0, 0, 0]); - const shuckleItems = scene.getModifiers(Modifiers.BerryModifier, false); + const shuckleItems = enemyField[0].getHeldItems(); expect(shuckleItems.length).toBe(4); - expect(shuckleItems.find(m => m.berryType === BerryType.SITRUS)?.stackCount).toBe(1); - expect(shuckleItems.find(m => m.berryType === BerryType.GANLON)?.stackCount).toBe(1); - expect(shuckleItems.find(m => m.berryType === BerryType.APICOT)?.stackCount).toBe(1); - expect(shuckleItems.find(m => m.berryType === BerryType.LUM)?.stackCount).toBe(2); + expect(shuckleItems.find(m => m instanceof BerryModifier && m.berryType === BerryType.SITRUS)?.stackCount).toBe(1); + expect(shuckleItems.find(m => m instanceof BerryModifier && m.berryType === BerryType.GANLON)?.stackCount).toBe(1); + expect(shuckleItems.find(m => m instanceof BerryModifier && m.berryType === BerryType.APICOT)?.stackCount).toBe(1); + expect(shuckleItems.find(m => m instanceof BerryModifier && m.berryType === BerryType.LUM)?.stackCount).toBe(2); expect(enemyField[0].moveset).toEqual([new PokemonMove(Moves.INFESTATION), new PokemonMove(Moves.SALT_CURE), new PokemonMove(Moves.GASTRO_ACID), new PokemonMove(Moves.HEAL_ORDER)]); // Should have used moves pre-battle @@ -222,10 +221,10 @@ describe("The Strong Stuff - Mystery Encounter", () => { it("should have Soul Dew in rewards", async () => { await game.runToMysteryEncounter(MysteryEncounterType.THE_STRONG_STUFF, defaultParty); - await runMysteryEncounterToEnd(game, 2, null, true); + await runMysteryEncounterToEnd(game, 2, undefined, true); await skipBattleRunMysteryEncounterRewardsPhase(game); await game.phaseInterceptor.to(SelectModifierPhase, false); - expect(scene.getCurrentPhase().constructor.name).toBe(SelectModifierPhase.name); + expect(scene.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name); await game.phaseInterceptor.run(SelectModifierPhase); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); 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 667c2d2ec3d..f30acd3b0a4 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 @@ -43,7 +43,7 @@ describe("The Winstrate Challenge - Mystery Encounter", () => { game.override.mysteryEncounterChance(100); game.override.startingWave(defaultWave); game.override.startingBiome(defaultBiome); - game.override.disableTrainerWaves(true); + game.override.disableTrainerWaves(); const biomeMap = new Map([ [Biome.VOLCANO, [MysteryEncounterType.FIGHT_OR_FLIGHT]], @@ -73,9 +73,9 @@ describe("The Winstrate Challenge - Mystery Encounter", () => { text: `${namespace}.intro_dialogue`, } ]); - expect(TheWinstrateChallengeEncounter.dialogue.encounterOptionsDialogue.title).toBe(`${namespace}.title`); - expect(TheWinstrateChallengeEncounter.dialogue.encounterOptionsDialogue.description).toBe(`${namespace}.description`); - expect(TheWinstrateChallengeEncounter.dialogue.encounterOptionsDialogue.query).toBe(`${namespace}.query`); + expect(TheWinstrateChallengeEncounter.dialogue.encounterOptionsDialogue?.title).toBe(`${namespace}.title`); + expect(TheWinstrateChallengeEncounter.dialogue.encounterOptionsDialogue?.description).toBe(`${namespace}.description`); + expect(TheWinstrateChallengeEncounter.dialogue.encounterOptionsDialogue?.query).toBe(`${namespace}.query`); expect(TheWinstrateChallengeEncounter.options.length).toBe(2); }); @@ -114,7 +114,7 @@ describe("The Winstrate Challenge - Mystery Encounter", () => { expect(encounter.onInit).toBeDefined(); encounter.populateDialogueTokensFromRequirements(scene); - const onInitResult = onInit(scene); + const onInitResult = onInit!(scene); expect(encounter.enemyPartyConfigs).toBeDefined(); expect(encounter.enemyPartyConfigs.length).toBe(5); @@ -273,42 +273,42 @@ describe("The Winstrate Challenge - Mystery Encounter", () => { it("should battle all 5 trainers for a Macho Brace reward", async () => { await game.runToMysteryEncounter(MysteryEncounterType.THE_WINSTRATE_CHALLENGE, defaultParty); - await runMysteryEncounterToEnd(game, 1, null, true); + await runMysteryEncounterToEnd(game, 1, undefined, true); - expect(scene.getCurrentPhase().constructor.name).toBe(CommandPhase.name); + expect(scene.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name); expect(scene.currentBattle.trainer).toBeDefined(); - expect(scene.currentBattle.trainer.config.trainerType).toBe(TrainerType.VICTOR); + expect(scene.currentBattle.trainer!.config.trainerType).toBe(TrainerType.VICTOR); expect(scene.currentBattle.mysteryEncounter.enemyPartyConfigs.length).toBe(4); expect(scene.currentBattle.mysteryEncounter.encounterMode).toBe(MysteryEncounterMode.TRAINER_BATTLE); await skipBattleToNextBattle(game); expect(scene.currentBattle.trainer).toBeDefined(); - expect(scene.currentBattle.trainer.config.trainerType).toBe(TrainerType.VICTORIA); + expect(scene.currentBattle.trainer!.config.trainerType).toBe(TrainerType.VICTORIA); expect(scene.currentBattle.mysteryEncounter.enemyPartyConfigs.length).toBe(3); expect(scene.currentBattle.mysteryEncounter.encounterMode).toBe(MysteryEncounterMode.TRAINER_BATTLE); await skipBattleToNextBattle(game); expect(scene.currentBattle.trainer).toBeDefined(); - expect(scene.currentBattle.trainer.config.trainerType).toBe(TrainerType.VIVI); + expect(scene.currentBattle.trainer!.config.trainerType).toBe(TrainerType.VIVI); expect(scene.currentBattle.mysteryEncounter.enemyPartyConfigs.length).toBe(2); expect(scene.currentBattle.mysteryEncounter.encounterMode).toBe(MysteryEncounterMode.TRAINER_BATTLE); await skipBattleToNextBattle(game); expect(scene.currentBattle.trainer).toBeDefined(); - expect(scene.currentBattle.trainer.config.trainerType).toBe(TrainerType.VICKY); + expect(scene.currentBattle.trainer!.config.trainerType).toBe(TrainerType.VICKY); expect(scene.currentBattle.mysteryEncounter.enemyPartyConfigs.length).toBe(1); expect(scene.currentBattle.mysteryEncounter.encounterMode).toBe(MysteryEncounterMode.TRAINER_BATTLE); await skipBattleToNextBattle(game); expect(scene.currentBattle.trainer).toBeDefined(); - expect(scene.currentBattle.trainer.config.trainerType).toBe(TrainerType.VITO); + expect(scene.currentBattle.trainer!.config.trainerType).toBe(TrainerType.VITO); expect(scene.currentBattle.mysteryEncounter.enemyPartyConfigs.length).toBe(0); expect(scene.currentBattle.mysteryEncounter.encounterMode).toBe(MysteryEncounterMode.TRAINER_BATTLE); // Should have Macho Brace in the rewards await skipBattleToNextBattle(game, true); await game.phaseInterceptor.to(SelectModifierPhase, false); - expect(scene.getCurrentPhase().constructor.name).toBe(SelectModifierPhase.name); + expect(scene.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name); await game.phaseInterceptor.run(SelectModifierPhase); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); @@ -348,7 +348,7 @@ describe("The Winstrate Challenge - Mystery Encounter", () => { it("should have a Rarer Candy in the rewards", async () => { await game.runToMysteryEncounter(MysteryEncounterType.THE_WINSTRATE_CHALLENGE, defaultParty); await runMysteryEncounterToEnd(game, 2); - expect(scene.getCurrentPhase().constructor.name).toBe(SelectModifierPhase.name); + expect(scene.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name); await game.phaseInterceptor.run(SelectModifierPhase); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); 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 3d4cd8855cd..37e7ffd1e40 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 @@ -41,7 +41,7 @@ describe("Trash to Treasure - Mystery Encounter", () => { game.override.mysteryEncounterChance(100); game.override.startingWave(defaultWave); game.override.startingBiome(defaultBiome); - game.override.disableTrainerWaves(true); + game.override.disableTrainerWaves(); vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue( new Map([ @@ -63,9 +63,9 @@ describe("Trash to Treasure - Mystery Encounter", () => { expect(TrashToTreasureEncounter.encounterTier).toBe(MysteryEncounterTier.ULTRA); expect(TrashToTreasureEncounter.dialogue).toBeDefined(); expect(TrashToTreasureEncounter.dialogue.intro).toStrictEqual([{ text: `${namespace}.intro` }]); - expect(TrashToTreasureEncounter.dialogue.encounterOptionsDialogue.title).toBe(`${namespace}.title`); - expect(TrashToTreasureEncounter.dialogue.encounterOptionsDialogue.description).toBe(`${namespace}.description`); - expect(TrashToTreasureEncounter.dialogue.encounterOptionsDialogue.query).toBe(`${namespace}.query`); + expect(TrashToTreasureEncounter.dialogue.encounterOptionsDialogue?.title).toBe(`${namespace}.title`); + expect(TrashToTreasureEncounter.dialogue.encounterOptionsDialogue?.description).toBe(`${namespace}.description`); + expect(TrashToTreasureEncounter.dialogue.encounterOptionsDialogue?.query).toBe(`${namespace}.query`); expect(TrashToTreasureEncounter.options.length).toBe(2); }); @@ -96,7 +96,7 @@ describe("Trash to Treasure - Mystery Encounter", () => { expect(TrashToTreasureEncounter.onInit).toBeDefined(); TrashToTreasureEncounter.populateDialogueTokensFromRequirements(scene); - const onInitResult = onInit(scene); + const onInitResult = onInit!(scene); expect(TrashToTreasureEncounter.enemyPartyConfigs).toEqual([ { @@ -138,19 +138,19 @@ describe("Trash to Treasure - Mystery Encounter", () => { await game.runToMysteryEncounter(MysteryEncounterType.TRASH_TO_TREASURE, defaultParty); await runMysteryEncounterToEnd(game, 1); await game.phaseInterceptor.to(SelectModifierPhase, false); - expect(scene.getCurrentPhase().constructor.name).toBe(SelectModifierPhase.name); + expect(scene.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name); const leftovers = scene.findModifier(m => m instanceof TurnHealModifier) as TurnHealModifier; expect(leftovers).toBeDefined(); - expect(leftovers.stackCount).toBe(2); + expect(leftovers?.stackCount).toBe(2); const shellBell = scene.findModifier(m => m instanceof HitHealModifier) as HitHealModifier; expect(shellBell).toBeDefined(); - expect(shellBell.stackCount).toBe(2); + expect(shellBell?.stackCount).toBe(2); const blackSludge = scene.findModifier(m => m instanceof RemoveHealShopModifier) as RemoveHealShopModifier; expect(blackSludge).toBeDefined(); - expect(blackSludge.stackCount).toBe(1); + expect(blackSludge?.stackCount).toBe(1); }); it("should leave encounter without battle", async () => { @@ -183,10 +183,10 @@ describe("Trash to Treasure - Mystery Encounter", () => { const phaseSpy = vi.spyOn(scene, "pushPhase"); await game.runToMysteryEncounter(MysteryEncounterType.TRASH_TO_TREASURE, defaultParty); - await runMysteryEncounterToEnd(game, 2, null, true); + await runMysteryEncounterToEnd(game, 2, undefined, true); const enemyField = scene.getEnemyField(); - expect(scene.getCurrentPhase().constructor.name).toBe(CommandPhase.name); + expect(scene.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name); expect(enemyField.length).toBe(1); expect(enemyField[0].species.speciesId).toBe(Species.GARBODOR); expect(enemyField[0].moveset).toEqual([new PokemonMove(Moves.PAYBACK), new PokemonMove(Moves.GUNK_SHOT), new PokemonMove(Moves.STOMPING_TANTRUM), new PokemonMove(Moves.DRAIN_PUNCH)]); @@ -200,10 +200,10 @@ describe("Trash to Treasure - Mystery Encounter", () => { it("should have 2 Rogue, 1 Ultra, 1 Great in rewards", async () => { await game.runToMysteryEncounter(MysteryEncounterType.TRASH_TO_TREASURE, defaultParty); - await runMysteryEncounterToEnd(game, 2, null, true); + await runMysteryEncounterToEnd(game, 2, undefined, true); await skipBattleRunMysteryEncounterRewardsPhase(game); await game.phaseInterceptor.to(SelectModifierPhase, false); - expect(scene.getCurrentPhase().constructor.name).toBe(SelectModifierPhase.name); + expect(scene.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name); await game.phaseInterceptor.run(SelectModifierPhase); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); 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 0650b3b0ad4..fc5b868f1a1 100644 --- a/src/test/mystery-encounter/encounters/weird-dream-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/weird-dream-encounter.test.ts @@ -36,7 +36,7 @@ describe("Weird Dream - Mystery Encounter", () => { game.override.mysteryEncounterChance(100); game.override.startingWave(defaultWave); game.override.startingBiome(defaultBiome); - game.override.disableTrainerWaves(true); + game.override.disableTrainerWaves(); vi.spyOn(EncounterTransformationSequence, "doPokemonTransformationSequence").mockImplementation(() => new Promise(resolve => resolve())); vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue( @@ -67,9 +67,9 @@ describe("Weird Dream - Mystery Encounter", () => { text: `${namespace}.intro_dialogue`, }, ]); - expect(WeirdDreamEncounter.dialogue.encounterOptionsDialogue.title).toBe(`${namespace}.title`); - expect(WeirdDreamEncounter.dialogue.encounterOptionsDialogue.description).toBe(`${namespace}.description`); - expect(WeirdDreamEncounter.dialogue.encounterOptionsDialogue.query).toBe(`${namespace}.query`); + expect(WeirdDreamEncounter.dialogue.encounterOptionsDialogue?.title).toBe(`${namespace}.title`); + expect(WeirdDreamEncounter.dialogue.encounterOptionsDialogue?.description).toBe(`${namespace}.description`); + expect(WeirdDreamEncounter.dialogue.encounterOptionsDialogue?.query).toBe(`${namespace}.query`); expect(WeirdDreamEncounter.options.length).toBe(2); }); @@ -99,7 +99,7 @@ describe("Weird Dream - Mystery Encounter", () => { expect(WeirdDreamEncounter.onInit).toBeDefined(); WeirdDreamEncounter.populateDialogueTokensFromRequirements(scene); - const onInitResult = onInit(scene); + const onInitResult = onInit!(scene); expect(loadBgmSpy).toHaveBeenCalled(); expect(onInitResult).toBe(true); @@ -129,7 +129,7 @@ describe("Weird Dream - Mystery Encounter", () => { await runMysteryEncounterToEnd(game, 1); await game.phaseInterceptor.to(SelectModifierPhase, false); - expect(scene.getCurrentPhase().constructor.name).toBe(SelectModifierPhase.name); + expect(scene.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name); const pokemonAfter = scene.getParty(); const bstsAfter = pokemonAfter.map(pokemon => pokemon.getSpeciesForm().getBaseStatTotal()); @@ -138,7 +138,7 @@ describe("Weird Dream - Mystery Encounter", () => { for (let i = 0; i < pokemonAfter.length; i++) { const newPokemon = pokemonAfter[i]; expect(newPokemon.getSpeciesForm().speciesId).not.toBe(pokemonPrior[i].getSpeciesForm().speciesId); - expect(newPokemon.mysteryEncounterData.types.length).toBe(2); + expect(newPokemon.mysteryEncounterData?.types.length).toBe(2); } const plus90To110 = bstDiff.filter(bst => bst > 80); @@ -152,7 +152,7 @@ describe("Weird Dream - Mystery Encounter", () => { await game.runToMysteryEncounter(MysteryEncounterType.WEIRD_DREAM, defaultParty); await runMysteryEncounterToEnd(game, 1); await game.phaseInterceptor.to(SelectModifierPhase, false); - expect(scene.getCurrentPhase().constructor.name).toBe(SelectModifierPhase.name); + expect(scene.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name); await game.phaseInterceptor.run(SelectModifierPhase); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); diff --git a/src/test/mystery-encounter/mystery-encounter-utils.test.ts b/src/test/mystery-encounter/mystery-encounter-utils.test.ts index a0e055e3bcf..26442f9eaf4 100644 --- a/src/test/mystery-encounter/mystery-encounter-utils.test.ts +++ b/src/test/mystery-encounter/mystery-encounter-utils.test.ts @@ -230,7 +230,7 @@ describe("Mystery Encounter Utils", () => { it("gets species of specified types", () => { // Only 9 tiers are: Koraidon, Miraidon, Arceus, Rayquaza, Kyogre, Groudon, Zacian - const result = getRandomSpeciesByStarterTier(9, null, [Type.GROUND]); + const result = getRandomSpeciesByStarterTier(9, undefined, [Type.GROUND]); const pokeSpecies = getPokemonSpecies(result); expect(pokeSpecies.speciesId).toBe(Species.GROUDON); }); diff --git a/src/test/mystery-encounter/mystery-encounter.test.ts b/src/test/mystery-encounter/mystery-encounter.test.ts index 0ba28bb77ec..d2a2e7f9d92 100644 --- a/src/test/mystery-encounter/mystery-encounter.test.ts +++ b/src/test/mystery-encounter/mystery-encounter.test.ts @@ -29,14 +29,14 @@ describe("Mystery Encounters", () => { await game.runToMysteryEncounter(MysteryEncounterType.MYSTERIOUS_CHALLENGERS, [Species.CHARIZARD, Species.VOLCARONA]); await game.phaseInterceptor.to(MysteryEncounterPhase, false); - expect(game.scene.getCurrentPhase().constructor.name).toBe(MysteryEncounterPhase.name); + expect(game.scene.getCurrentPhase()!.constructor.name).toBe(MysteryEncounterPhase.name); }); it("", async () => { await game.runToMysteryEncounter(MysteryEncounterType.MYSTERIOUS_CHALLENGERS, [Species.CHARIZARD, Species.VOLCARONA]); await game.phaseInterceptor.to(MysteryEncounterPhase, false); - expect(game.scene.getCurrentPhase().constructor.name).toBe(MysteryEncounterPhase.name); + expect(game.scene.getCurrentPhase()!.constructor.name).toBe(MysteryEncounterPhase.name); }); it("spawns mysterious challengers encounter", async () => { diff --git a/src/test/phases/mystery-encounter-phase.test.ts b/src/test/phases/mystery-encounter-phase.test.ts index 74ed7ff190d..5e02f6c94ab 100644 --- a/src/test/phases/mystery-encounter-phase.test.ts +++ b/src/test/phases/mystery-encounter-phase.test.ts @@ -37,7 +37,7 @@ describe("Mystery Encounter Phases", () => { await game.runToMysteryEncounter(MysteryEncounterType.MYSTERIOUS_CHALLENGERS, [Species.CHARIZARD, Species.VOLCARONA]); await game.phaseInterceptor.to(MysteryEncounterPhase, false); - expect(game.scene.getCurrentPhase().constructor.name).toBe(MysteryEncounterPhase.name); + expect(game.scene.getCurrentPhase()?.constructor.name).toBe(MysteryEncounterPhase.name); }); it("Runs MysteryEncounterPhase", async() => { @@ -73,7 +73,7 @@ describe("Mystery Encounter Phases", () => { handler.processInput(Button.ACTION); // Waitfor required so that option select messages and preOptionPhase logic are handled - await vi.waitFor(() => expect(game.scene.getCurrentPhase().constructor.name).toBe(MysteryEncounterOptionSelectedPhase.name)); + await vi.waitFor(() => expect(game.scene.getCurrentPhase()?.constructor.name).toBe(MysteryEncounterOptionSelectedPhase.name)); expect(game.scene.ui.getMode()).toBe(Mode.MESSAGE); expect(dialogueSpy).toHaveBeenCalledTimes(1); expect(messageSpy).toHaveBeenCalledTimes(2); diff --git a/src/test/phases/select-modifier-phase.test.ts b/src/test/phases/select-modifier-phase.test.ts index 7efcf47ac03..13c907c6414 100644 --- a/src/test/phases/select-modifier-phase.test.ts +++ b/src/test/phases/select-modifier-phase.test.ts @@ -28,12 +28,6 @@ describe("SelectModifierPhase", () => { game = new GameManager(phaserGame); scene = game.scene; - vi.spyOn(scene, "resetSeed").mockImplementation(() => { - scene.waveSeed = "test"; - Phaser.Math.RND.sow([scene.waveSeed]); - scene.rngCounter = 0; - }); - initSceneWithoutEncounterPhase(scene, [Species.ABRA, Species.VOLCARONA]); }); @@ -49,7 +43,7 @@ describe("SelectModifierPhase", () => { await game.phaseInterceptor.run(SelectModifierPhase); expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); - }, 20000); + }); it("should generate random modifiers", async () => { const selectModifierPhase = new SelectModifierPhase(scene); @@ -60,10 +54,7 @@ describe("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).toEqual("TEMP_STAT_BOOSTER"); - expect(modifierSelectHandler.options[1].modifierTypeOption.type.id).toEqual("POKEBALL"); - expect(modifierSelectHandler.options[2].modifierTypeOption.type.id).toEqual("BERRY"); - }, 5000); + }); it("should modify reroll cost", async () => { const options = [ @@ -73,12 +64,12 @@ describe("SelectModifierPhase", () => { ]; const selectModifierPhase1 = new SelectModifierPhase(scene); - const selectModifierPhase2 = new SelectModifierPhase(scene, 0, null, { rerollMultiplier: 2 }); + const selectModifierPhase2 = new SelectModifierPhase(scene, 0, undefined, { rerollMultiplier: 2 }); const cost1 = selectModifierPhase1.getRerollCost(options, false); const cost2 = selectModifierPhase2.getRerollCost(options, false); expect(cost2).toEqual(cost1 * 2); - }, 5000); + }); it("should generate random modifiers from reroll", async () => { let selectModifierPhase = new SelectModifierPhase(scene); @@ -88,9 +79,6 @@ describe("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).toEqual("TEMP_STAT_BOOSTER"); - expect(modifierSelectHandler.options[1].modifierTypeOption.type.id).toEqual("POKEBALL"); - expect(modifierSelectHandler.options[2].modifierTypeOption.type.id).toEqual("BERRY"); // Simulate selecting reroll selectModifierPhase = new SelectModifierPhase(scene, 1, [ModifierTier.COMMON, ModifierTier.COMMON, ModifierTier.COMMON]); @@ -100,10 +88,7 @@ describe("SelectModifierPhase", () => { expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); expect(modifierSelectHandler.options.length).toEqual(3); - expect(modifierSelectHandler.options[0].modifierTypeOption.type.id).toEqual("TM_COMMON"); - expect(modifierSelectHandler.options[1].modifierTypeOption.type.id).toEqual("LURE"); - expect(modifierSelectHandler.options[2].modifierTypeOption.type.id).toEqual("PP_UP"); - }, 5000); + }); it("should generate random modifiers of same tier for reroll with reroll lock", async () => { // Just use fully random seed for this test @@ -137,13 +122,13 @@ describe("SelectModifierPhase", () => { expect(modifierSelectHandler.options[0].modifierTypeOption.type.tier - modifierSelectHandler.options[0].modifierTypeOption.upgradeCount).toEqual(firstRollTiers[0]); expect(modifierSelectHandler.options[1].modifierTypeOption.type.tier - modifierSelectHandler.options[1].modifierTypeOption.upgradeCount).toEqual(firstRollTiers[1]); expect(modifierSelectHandler.options[2].modifierTypeOption.type.tier - modifierSelectHandler.options[2].modifierTypeOption.upgradeCount).toEqual(firstRollTiers[2]); - }, 5000); + }); it("should generate custom modifiers", async () => { const customModifiers: CustomModifierSettings = { guaranteedModifierTypeFuncs: [modifierTypes.MEMORY_MUSHROOM, modifierTypes.TM_ULTRA, modifierTypes.LEFTOVERS, modifierTypes.AMULET_COIN, modifierTypes.GOLDEN_PUNCH] }; - const selectModifierPhase = new SelectModifierPhase(scene, 0, null, customModifiers); + const selectModifierPhase = new SelectModifierPhase(scene, 0, undefined, customModifiers); scene.pushPhase(selectModifierPhase); await game.phaseInterceptor.run(SelectModifierPhase); @@ -156,7 +141,7 @@ describe("SelectModifierPhase", () => { expect(modifierSelectHandler.options[2].modifierTypeOption.type.id).toEqual("LEFTOVERS"); expect(modifierSelectHandler.options[3].modifierTypeOption.type.id).toEqual("AMULET_COIN"); expect(modifierSelectHandler.options[4].modifierTypeOption.type.id).toEqual("GOLDEN_PUNCH"); - }, 5000); + }); it("should generate custom modifier tiers that can upgrade from luck", async () => { const customModifiers: CustomModifierSettings = { @@ -170,7 +155,7 @@ describe("SelectModifierPhase", () => { } scene.getParty().push(pokemon, pokemon, pokemon, pokemon, pokemon, pokemon); - const selectModifierPhase = new SelectModifierPhase(scene, 0, null, customModifiers); + const selectModifierPhase = new SelectModifierPhase(scene, 0, undefined, customModifiers); scene.pushPhase(selectModifierPhase); await game.phaseInterceptor.run(SelectModifierPhase); @@ -183,14 +168,14 @@ describe("SelectModifierPhase", () => { expect(modifierSelectHandler.options[2].modifierTypeOption.type.tier - modifierSelectHandler.options[2].modifierTypeOption.upgradeCount).toEqual(ModifierTier.ULTRA); expect(modifierSelectHandler.options[3].modifierTypeOption.type.tier - modifierSelectHandler.options[3].modifierTypeOption.upgradeCount).toEqual(ModifierTier.ROGUE); expect(modifierSelectHandler.options[4].modifierTypeOption.type.tier - modifierSelectHandler.options[4].modifierTypeOption.upgradeCount).toEqual(ModifierTier.MASTER); - }, 5000); + }); it("should generate custom modifiers and modifier tiers together", async () => { const customModifiers: CustomModifierSettings = { guaranteedModifierTypeFuncs: [modifierTypes.MEMORY_MUSHROOM, modifierTypes.TM_COMMON], guaranteedModifierTiers: [ModifierTier.MASTER, ModifierTier.MASTER] }; - const selectModifierPhase = new SelectModifierPhase(scene, 0, null, customModifiers); + const selectModifierPhase = new SelectModifierPhase(scene, 0, undefined, customModifiers); scene.pushPhase(selectModifierPhase); await game.phaseInterceptor.run(SelectModifierPhase); @@ -202,7 +187,7 @@ describe("SelectModifierPhase", () => { expect(modifierSelectHandler.options[1].modifierTypeOption.type.id).toEqual("TM_COMMON"); expect(modifierSelectHandler.options[2].modifierTypeOption.type.tier).toEqual(ModifierTier.MASTER); expect(modifierSelectHandler.options[3].modifierTypeOption.type.tier).toEqual(ModifierTier.MASTER); - }, 5000); + }); it("should fill remaining modifiers if fillRemaining is true with custom modifiers", async () => { const customModifiers: CustomModifierSettings = { @@ -210,7 +195,7 @@ describe("SelectModifierPhase", () => { guaranteedModifierTiers: [ModifierTier.MASTER], fillRemaining: true }; - const selectModifierPhase = new SelectModifierPhase(scene, 0, null, customModifiers); + const selectModifierPhase = new SelectModifierPhase(scene, 0, undefined, customModifiers); scene.pushPhase(selectModifierPhase); await game.phaseInterceptor.run(SelectModifierPhase); @@ -220,5 +205,5 @@ describe("SelectModifierPhase", () => { expect(modifierSelectHandler.options.length).toEqual(3); expect(modifierSelectHandler.options[0].modifierTypeOption.type.id).toEqual("MEMORY_MUSHROOM"); expect(modifierSelectHandler.options[1].modifierTypeOption.type.tier).toEqual(ModifierTier.MASTER); - }, 5000); + }); }); diff --git a/src/test/utils/gameManager.ts b/src/test/utils/gameManager.ts index 260df8e79c5..a3e0b972f63 100644 --- a/src/test/utils/gameManager.ts +++ b/src/test/utils/gameManager.ts @@ -171,8 +171,8 @@ export default class GameManager { */ async runToMysteryEncounter(encounterType?: MysteryEncounterType, species?: Species[]) { if (!isNullOrUndefined(encounterType)) { - this.override.disableTrainerWaves(true); - this.override.mysteryEncounter(encounterType); + this.override.disableTrainerWaves(); + this.override.mysteryEncounter(encounterType!); } await this.runToTitle(); diff --git a/src/test/utils/gameManagerUtils.ts b/src/test/utils/gameManagerUtils.ts index f4aecbbb096..ff0f735c82d 100644 --- a/src/test/utils/gameManagerUtils.ts +++ b/src/test/utils/gameManagerUtils.ts @@ -108,5 +108,5 @@ export function initSceneWithoutEncounterPhase(scene, species?: Species[]) { scene.getParty().push(starterPokemon); }); - scene.currentBattle = new Battle(getGameMode(GameModes.CLASSIC), 5, BattleType.WILD, null, false); + scene.currentBattle = new Battle(getGameMode(GameModes.CLASSIC), 5, BattleType.WILD, undefined, false); } diff --git a/src/test/utils/helpers/overridesHelper.ts b/src/test/utils/helpers/overridesHelper.ts index d5eaee003db..40f0111ae78 100644 --- a/src/test/utils/helpers/overridesHelper.ts +++ b/src/test/utils/helpers/overridesHelper.ts @@ -8,8 +8,10 @@ import * as GameMode from "#app/game-mode"; import { GameModes, getGameMode } from "#app/game-mode"; import { ModifierOverride } from "#app/modifier/modifier-type.js"; import Overrides from "#app/overrides"; -import { vi } from "vitest"; +import { MockInstance, vi } from "vitest"; import { GameManagerHelper } from "./gameManagerHelper"; +import { MysteryEncounterType } from "#enums/mystery-encounter-type"; +import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; /** * Helper to handle overrides in tests @@ -281,6 +283,41 @@ export class OverridesHelper extends GameManagerHelper { return this; } + /** + * Override the encounter chance for a mystery encounter. + * @param percentage the encounter chance in % + * @returns spy instance + */ + mysteryEncounterChance(percentage: number) { + const maxRate: number = 256; // 100% + const rate = maxRate * (percentage / 100); + const spy = vi.spyOn(Overrides, "MYSTERY_ENCOUNTER_RATE_OVERRIDE", "get").mockReturnValue(rate); + this.log(`Mystery encounter chance set to ${percentage}% (=${rate})!`); + return spy; + } + + /** + * Override the encounter chance for a mystery encounter. + * @returns spy instance + * @param tier + */ + mysteryEncounterTier(tier: MysteryEncounterTier): MockInstance { + const spy = vi.spyOn(Overrides, "MYSTERY_ENCOUNTER_TIER_OVERRIDE", "get").mockReturnValue(tier); + this.log(`Mystery encounter tier set to ${tier}!`); + return spy; + } + + /** + * Override the encounter that spawns for the scene + * @param encounterType + * @returns spy instance + */ + mysteryEncounter(encounterType: MysteryEncounterType) { + const spy = vi.spyOn(Overrides, "MYSTERY_ENCOUNTER_OVERRIDE", "get").mockReturnValue(encounterType); + this.log(`Mystery encounter override set to ${encounterType}!`); + return spy; + } + private log(...params: any[]) { console.log("Overrides:", ...params); } diff --git a/src/test/utils/mocks/mockGameObject.ts b/src/test/utils/mocks/mockGameObject.ts index 9138e0f687a..4c243ec9ca1 100644 --- a/src/test/utils/mocks/mockGameObject.ts +++ b/src/test/utils/mocks/mockGameObject.ts @@ -1,3 +1,3 @@ export interface MockGameObject { - + name: string; } diff --git a/src/test/utils/mocks/mocksContainer/mockContainer.ts b/src/test/utils/mocks/mocksContainer/mockContainer.ts index 319d702bfd9..78d84f7845b 100644 --- a/src/test/utils/mocks/mocksContainer/mockContainer.ts +++ b/src/test/utils/mocks/mocksContainer/mockContainer.ts @@ -14,7 +14,7 @@ export default class MockContainer implements MockGameObject { public frame; protected textureManager; public list: MockGameObject[] = []; - private name?: string; + name: string; constructor(textureManager: MockTextureManager, x, y) { this.x = x; diff --git a/src/test/utils/mocks/mocksContainer/mockGraphics.ts b/src/test/utils/mocks/mocksContainer/mockGraphics.ts index e026b212e16..70a38c80aa0 100644 --- a/src/test/utils/mocks/mocksContainer/mockGraphics.ts +++ b/src/test/utils/mocks/mocksContainer/mockGraphics.ts @@ -3,6 +3,7 @@ import { MockGameObject } from "../mockGameObject"; export default class MockGraphics implements MockGameObject { private scene; public list: MockGameObject[] = []; + name: string; constructor(textureManager, config) { this.scene = textureManager.scene; } diff --git a/src/test/utils/mocks/mocksContainer/mockRectangle.ts b/src/test/utils/mocks/mocksContainer/mockRectangle.ts index 26c2f74ea42..696427d10a3 100644 --- a/src/test/utils/mocks/mocksContainer/mockRectangle.ts +++ b/src/test/utils/mocks/mocksContainer/mockRectangle.ts @@ -4,6 +4,7 @@ export default class MockRectangle implements MockGameObject { private fillColor; private scene; public list: MockGameObject[] = []; + name: string; constructor(textureManager, x, y, width, height, fillColor) { this.fillColor = fillColor; diff --git a/src/test/utils/mocks/mocksContainer/mockSprite.ts b/src/test/utils/mocks/mocksContainer/mockSprite.ts index 9c566fc4bcb..6020b6aadc0 100644 --- a/src/test/utils/mocks/mocksContainer/mockSprite.ts +++ b/src/test/utils/mocks/mocksContainer/mockSprite.ts @@ -14,6 +14,7 @@ export default class MockSprite implements MockGameObject { public scene; public anims; public list: MockGameObject[] = []; + name: string; constructor(textureManager, x, y, texture) { this.textureManager = textureManager; this.scene = textureManager.scene; diff --git a/src/test/utils/mocks/mocksContainer/mockText.ts b/src/test/utils/mocks/mocksContainer/mockText.ts index 825f2474a6f..f307da99361 100644 --- a/src/test/utils/mocks/mocksContainer/mockText.ts +++ b/src/test/utils/mocks/mocksContainer/mockText.ts @@ -11,7 +11,7 @@ export default class MockText implements MockGameObject { public list: MockGameObject[] = []; public style; public text = ""; - private name?: string; + name: string; public color?: string; constructor(textureManager, x, y, content, styleOptions) { diff --git a/src/test/utils/mocks/mocksContainer/mockTexture.ts b/src/test/utils/mocks/mocksContainer/mockTexture.ts index 03bedb4751b..988e9be150f 100644 --- a/src/test/utils/mocks/mocksContainer/mockTexture.ts +++ b/src/test/utils/mocks/mocksContainer/mockTexture.ts @@ -12,6 +12,7 @@ export default class MockTexture implements MockGameObject { public source; public frames: object; public firstFrame: string; + name: string; constructor(manager, key: string, source) { this.manager = manager; diff --git a/src/test/utils/phaseInterceptor.ts b/src/test/utils/phaseInterceptor.ts index 40644683a99..d30adf11f7d 100644 --- a/src/test/utils/phaseInterceptor.ts +++ b/src/test/utils/phaseInterceptor.ts @@ -336,7 +336,7 @@ export default class PhaseInterceptor { const actionForNextPrompt = this.prompts[0]; const expireFn = actionForNextPrompt.expireFn && actionForNextPrompt.expireFn(); const currentMode = this.scene.ui.getMode(); - const currentPhase = this.scene.getCurrentPhase().constructor.name; + const currentPhase = this.scene.getCurrentPhase()?.constructor.name; const currentHandler = this.scene.ui.getHandler(); if (expireFn) { this.prompts.shift(); diff --git a/src/ui/mystery-encounter-ui-handler.ts b/src/ui/mystery-encounter-ui-handler.ts index d5bae208629..094b8264bb1 100644 --- a/src/ui/mystery-encounter-ui-handler.ts +++ b/src/ui/mystery-encounter-ui-handler.ts @@ -18,24 +18,24 @@ import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; export default class MysteryEncounterUiHandler extends UiHandler { private cursorContainer: Phaser.GameObjects.Container; - private cursorObj: Phaser.GameObjects.Image; + private cursorObj?: Phaser.GameObjects.Image; private optionsContainer: Phaser.GameObjects.Container; private tooltipWindow: Phaser.GameObjects.NineSlice; private tooltipContainer: Phaser.GameObjects.Container; - private tooltipScrollTween: Phaser.Tweens.Tween; + private tooltipScrollTween?: Phaser.Tweens.Tween; private descriptionWindow: Phaser.GameObjects.NineSlice; private descriptionContainer: Phaser.GameObjects.Container; - private descriptionScrollTween: Phaser.Tweens.Tween; + private descriptionScrollTween?: Phaser.Tweens.Tween; private rarityBall: Phaser.GameObjects.Sprite; private dexProgressWindow: Phaser.GameObjects.NineSlice; private dexProgressContainer: Phaser.GameObjects.Container; private showDexProgress: boolean = false; - private overrideSettings: OptionSelectSettings; + private overrideSettings?: OptionSelectSettings; private encounterOptions: MysteryEncounterOption[] = []; private optionsMeetsReqs: boolean[]; @@ -330,9 +330,9 @@ export default class MysteryEncounterUiHandler extends UiHandler { this.encounterOptions = this.overrideSettings?.overrideOptions ?? mysteryEncounter.options; this.optionsMeetsReqs = []; - const titleText: string = getEncounterText(this.scene, mysteryEncounter.dialogue.encounterOptionsDialogue.title, TextStyle.TOOLTIP_TITLE); - const descriptionText: string = getEncounterText(this.scene, mysteryEncounter.dialogue.encounterOptionsDialogue.description, TextStyle.TOOLTIP_CONTENT); - const queryText: string = getEncounterText(this.scene, mysteryEncounter.dialogue.encounterOptionsDialogue.query, TextStyle.TOOLTIP_CONTENT); + const titleText: string | null = getEncounterText(this.scene, mysteryEncounter.dialogue.encounterOptionsDialogue?.title, TextStyle.TOOLTIP_TITLE); + const descriptionText: string | null = getEncounterText(this.scene, mysteryEncounter.dialogue.encounterOptionsDialogue?.description, TextStyle.TOOLTIP_CONTENT); + const queryText: string | null = getEncounterText(this.scene, mysteryEncounter.dialogue.encounterOptionsDialogue?.query, TextStyle.TOOLTIP_CONTENT); // Clear options container (except cursor) this.optionsContainer.removeAll(true); @@ -355,9 +355,9 @@ export default class MysteryEncounterUiHandler extends UiHandler { } this.optionsMeetsReqs.push(option.meetsRequirements(this.scene)); - const optionDialogue = option.dialogue; + const optionDialogue = option.dialogue!; const label = !this.optionsMeetsReqs[i] && optionDialogue.disabledButtonLabel ? optionDialogue.disabledButtonLabel : optionDialogue.buttonLabel; - let text: string; + let text: string | null; if (option.hasRequirements() && this.optionsMeetsReqs[i] && (option.optionMode === MysteryEncounterOptionMode.DEFAULT_OR_SPECIAL || option.optionMode === MysteryEncounterOptionMode.DISABLED_OR_SPECIAL)) { // Options with special requirements that are met are automatically colored green text = getEncounterText(this.scene, label, TextStyle.SUMMARY_GREEN); @@ -383,7 +383,7 @@ export default class MysteryEncounterUiHandler extends UiHandler { this.optionsContainer.add(viewPartyText); // Description Window - const titleTextObject = addBBCodeTextObject(this.scene, 0, 0, titleText, TextStyle.TOOLTIP_TITLE, { wordWrap: { width: 750 }, align: "center", lineSpacing: -8 }); + const titleTextObject = addBBCodeTextObject(this.scene, 0, 0, titleText ?? "", TextStyle.TOOLTIP_TITLE, { wordWrap: { width: 750 }, align: "center", lineSpacing: -8 }); this.descriptionContainer.add(titleTextObject); titleTextObject.setPosition(72 - titleTextObject.displayWidth / 2, 5.5); @@ -395,7 +395,7 @@ export default class MysteryEncounterUiHandler extends UiHandler { const ballType = getPokeballAtlasKey(index); this.rarityBall.setTexture("pb", ballType); - const descriptionTextObject = addBBCodeTextObject(this.scene, 6, 25, descriptionText, TextStyle.TOOLTIP_CONTENT, { wordWrap: { width: 830 } }); + const descriptionTextObject = addBBCodeTextObject(this.scene, 6, 25, descriptionText ?? "", TextStyle.TOOLTIP_CONTENT, { wordWrap: { width: 830 } }); // Sets up the mask that hides the description text to give an illusion of scrolling const descriptionTextMaskRect = this.scene.make.graphics({}); @@ -412,7 +412,7 @@ export default class MysteryEncounterUiHandler extends UiHandler { if (this.descriptionScrollTween) { this.descriptionScrollTween.remove(); - this.descriptionScrollTween = null; + this.descriptionScrollTween = undefined; } // Animates the description text moving upwards @@ -429,7 +429,7 @@ export default class MysteryEncounterUiHandler extends UiHandler { this.descriptionContainer.add(descriptionTextObject); - const queryTextObject = addBBCodeTextObject(this.scene, 0, 0, queryText, TextStyle.TOOLTIP_CONTENT, { wordWrap: { width: 830 } }); + const queryTextObject = addBBCodeTextObject(this.scene, 0, 0, queryText ?? "", TextStyle.TOOLTIP_CONTENT, { wordWrap: { width: 830 } }); this.descriptionContainer.add(queryTextObject); queryTextObject.setPosition(75 - queryTextObject.displayWidth / 2, 90); @@ -460,9 +460,9 @@ export default class MysteryEncounterUiHandler extends UiHandler { return; } - let text: string; + let text: string | null; const cursorOption = this.encounterOptions[cursor]; - const optionDialogue = cursorOption.dialogue; + const optionDialogue = cursorOption.dialogue!; if (!this.optionsMeetsReqs[cursor] && (cursorOption.optionMode === MysteryEncounterOptionMode.DISABLED_OR_DEFAULT || cursorOption.optionMode === MysteryEncounterOptionMode.DISABLED_OR_SPECIAL) && optionDialogue.disabledButtonTooltip) { text = getEncounterText(this.scene, optionDialogue.disabledButtonTooltip, TextStyle.TOOLTIP_CONTENT); } else { @@ -470,9 +470,11 @@ export default class MysteryEncounterUiHandler extends UiHandler { } // Auto-color options green/blue for good/bad by looking for (+)/(-) - const primaryStyleString = [...text.match(new RegExp(/\[color=[^\[]*\]\[shadow=[^\[]*\]/i))][0]; - text = text.replace(/(\(\+\)[^\(\[]*)/gi, substring => "[/color][/shadow]" + getBBCodeFrag(substring, TextStyle.SUMMARY_GREEN) + "[/color][/shadow]" + primaryStyleString); - text = text.replace(/(\(\-\)[^\(\[]*)/gi, substring => "[/color][/shadow]" + getBBCodeFrag(substring, TextStyle.SUMMARY_BLUE) + "[/color][/shadow]" + primaryStyleString); + if (text) { + const primaryStyleString = [...text.match(new RegExp(/\[color=[^\[]*\]\[shadow=[^\[]*\]/i))!][0]; + text = text.replace(/(\(\+\)[^\(\[]*)/gi, substring => "[/color][/shadow]" + getBBCodeFrag(substring, TextStyle.SUMMARY_GREEN) + "[/color][/shadow]" + primaryStyleString); + text = text.replace(/(\(\-\)[^\(\[]*)/gi, substring => "[/color][/shadow]" + getBBCodeFrag(substring, TextStyle.SUMMARY_BLUE) + "[/color][/shadow]" + primaryStyleString); + } if (text) { const tooltipTextObject = addBBCodeTextObject(this.scene, 6, 7, text, TextStyle.TOOLTIP_CONTENT, { wordWrap: { width: 600 }, fontSize: "72px" }); @@ -492,7 +494,7 @@ export default class MysteryEncounterUiHandler extends UiHandler { if (this.tooltipScrollTween) { this.tooltipScrollTween.remove(); - this.tooltipScrollTween = null; + this.tooltipScrollTween = undefined; } // Animates the tooltip text moving upwards @@ -518,7 +520,7 @@ export default class MysteryEncounterUiHandler extends UiHandler { clear(): void { super.clear(); - this.overrideSettings = null; + this.overrideSettings = undefined; this.optionsContainer.setVisible(false); this.optionsContainer.removeAll(true); this.dexProgressContainer.setVisible(false); @@ -534,7 +536,7 @@ export default class MysteryEncounterUiHandler extends UiHandler { if (this.cursorObj) { this.cursorObj.destroy(); } - this.cursorObj = null; + this.cursorObj = undefined; } /** diff --git a/src/ui/text.ts b/src/ui/text.ts index 262e1280c38..62534f8ee45 100644 --- a/src/ui/text.ts +++ b/src/ui/text.ts @@ -243,7 +243,7 @@ export function getBBCodeFrag(content: string, textStyle: TextStyle, uiTheme: Ui export function getTextWithColors(content: string, primaryStyle: TextStyle, uiTheme: UiTheme = UiTheme.DEFAULT): string { // Apply primary styling before anything else let text = getBBCodeFrag(content, primaryStyle, uiTheme) + "[/color][/shadow]"; - const primaryStyleString = [...text.match(new RegExp(/\[color=[^\[]*\]\[shadow=[^\[]*\]/i))][0]; + const primaryStyleString = [...text.match(new RegExp(/\[color=[^\[]*\]\[shadow=[^\[]*\]/i))!][0]; // Set custom colors text = text.replace(/@\[([^{]*)\]{([^}]*)}/gi, (substring, textStyle: string, textToColor: string) => { From d0844d16a3940ff2776e19098af467caca04c204 Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Thu, 22 Aug 2024 13:05:27 -0400 Subject: [PATCH 252/270] fix ME null checks and unit tests with beta update --- .../mystery-encounters/encounters/clowning-around-encounter.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/data/mystery-encounters/encounters/clowning-around-encounter.ts b/src/data/mystery-encounters/encounters/clowning-around-encounter.ts index c9c1f0dd335..e8a7a238743 100644 --- a/src/data/mystery-encounters/encounters/clowning-around-encounter.ts +++ b/src/data/mystery-encounters/encounters/clowning-around-encounter.ts @@ -28,6 +28,7 @@ import { BattlerIndex } from "#app/battle"; import { Moves } from "#enums/moves"; import { EncounterAnim, EncounterBattleAnim } from "#app/data/battle-anims"; import { MoveCategory } from "#app/data/move"; +import { MysteryEncounterPokemonData } from "#app/data/mystery-encounters/mystery-encounter-pokemon-data"; /** the i18n namespace for the encounter */ const namespace = "mysteryEncounter:clowningAround"; From 189e15c7459cbd95031a6f5f637581c5e32899e3 Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Thu, 22 Aug 2024 14:15:54 -0400 Subject: [PATCH 253/270] MEs to pokerogue beta branch --- src/locales/en/mystery-encounters/clowning-around-dialogue.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/locales/en/mystery-encounters/clowning-around-dialogue.ts b/src/locales/en/mystery-encounters/clowning-around-dialogue.ts index dd7797a3035..87dc0169b87 100644 --- a/src/locales/en/mystery-encounters/clowning-around-dialogue.ts +++ b/src/locales/en/mystery-encounters/clowning-around-dialogue.ts @@ -1,7 +1,7 @@ export const clowningAroundDialogue = { intro: "It's...@d{64} a clown?", speaker: "Clown", - intro_dialogue: "Bumbling buffoon, brace for a brilliant battle!\nYou’ll be beaten by this brawling busker!", + intro_dialogue: "Bumbling buffoon, brace for a brilliant battle!\nYou'll be beaten by this brawling busker!", title: "Clowning Around", description: "Something is off about this encounter. The clown seems eager to goad you into a battle, but to what end?\n\nThe Blacephalon is especially strange, like it has @[TOOLTIP_TITLE]{weird types and ability.}", query: "What will you do?", From 0388e107d755a246f90b5e8549c477127c628d14 Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Thu, 22 Aug 2024 14:16:45 -0400 Subject: [PATCH 254/270] test dialogue changes --- src/locales/en/mystery-encounters/clowning-around-dialogue.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/locales/en/mystery-encounters/clowning-around-dialogue.ts b/src/locales/en/mystery-encounters/clowning-around-dialogue.ts index 87dc0169b87..dac5886c6d1 100644 --- a/src/locales/en/mystery-encounters/clowning-around-dialogue.ts +++ b/src/locales/en/mystery-encounters/clowning-around-dialogue.ts @@ -30,5 +30,5 @@ export const clowningAroundDialogue = { selected_3: "Flustered fool, fall for my flawless deception!", }, }, - outro: "The clown and his cohorts\ndisappear in a puff of smoke." + outro: "The clown and his cohorts\n in a puff of smoke." }; From c44336a55c1d6a831fa4027c88d4b128c07a93be Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Thu, 22 Aug 2024 14:20:21 -0400 Subject: [PATCH 255/270] test patch fix --- .../encounters/clowning-around-encounter.ts | 496 ------------------ .../clowning-around-dialogue.ts | 2 +- 2 files changed, 1 insertion(+), 497 deletions(-) delete mode 100644 src/data/mystery-encounters/encounters/clowning-around-encounter.ts diff --git a/src/data/mystery-encounters/encounters/clowning-around-encounter.ts b/src/data/mystery-encounters/encounters/clowning-around-encounter.ts deleted file mode 100644 index e8a7a238743..00000000000 --- a/src/data/mystery-encounters/encounters/clowning-around-encounter.ts +++ /dev/null @@ -1,496 +0,0 @@ -import { EnemyPartyConfig, generateModifierType, initBattleWithEnemyConfig, leaveEncounterWithoutBattle, loadCustomMovesForEncounter, selectPokemonForOption, setEncounterRewards, transitionMysteryEncounterIntroVisuals } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import { trainerConfigs, TrainerPartyCompoundTemplate, TrainerPartyTemplate, } from "#app/data/trainer-config"; -import { ModifierTier } from "#app/modifier/modifier-tier"; -import { modifierTypes, PokemonHeldItemModifierType } from "#app/modifier/modifier-type"; -import { MysteryEncounterType } from "#enums/mystery-encounter-type"; -import { PartyMemberStrength } from "#enums/party-member-strength"; -import BattleScene from "#app/battle-scene"; -import MysteryEncounter, { MysteryEncounterBuilder } from "../mystery-encounter"; -import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; -import { Species } from "#enums/species"; -import { TrainerType } from "#enums/trainer-type"; -import { getPokemonSpecies } from "#app/data/pokemon-species"; -import { Abilities } from "#enums/abilities"; -import { applyModifierTypeToPlayerPokemon } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; -import { Type } from "#app/data/type"; -import { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; -import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; -import { randSeedInt, randSeedShuffle } from "#app/utils"; -import { showEncounterDialogue, showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; -import { Mode } from "#app/ui/ui"; -import i18next from "i18next"; -import { OptionSelectConfig } from "#app/ui/abstact-option-select-ui-handler"; -import { PlayerPokemon, PokemonMove } from "#app/field/pokemon"; -import { Ability } from "#app/data/ability"; -import { BerryModifier } from "#app/modifier/modifier"; -import { BerryType } from "#enums/berry-type"; -import { BattlerIndex } from "#app/battle"; -import { Moves } from "#enums/moves"; -import { EncounterAnim, EncounterBattleAnim } from "#app/data/battle-anims"; -import { MoveCategory } from "#app/data/move"; -import { MysteryEncounterPokemonData } from "#app/data/mystery-encounters/mystery-encounter-pokemon-data"; - -/** the i18n namespace for the encounter */ -const namespace = "mysteryEncounter:clowningAround"; - -const RANDOM_ABILITY_POOL = [ - Abilities.STURDY, - Abilities.PICKUP, - Abilities.INTIMIDATE, - Abilities.GUTS, - Abilities.DROUGHT, - Abilities.DRIZZLE, - Abilities.SNOW_WARNING, - Abilities.SAND_STREAM, - Abilities.ELECTRIC_SURGE, - Abilities.PSYCHIC_SURGE, - Abilities.GRASSY_SURGE, - Abilities.MISTY_SURGE, - Abilities.MAGICIAN, - Abilities.SHEER_FORCE, - Abilities.PRANKSTER -]; - -/** - * Clowning Around encounter. - * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/69 | GitHub Issue #69} - * @see For biome requirements check {@linkcode mysteryEncountersByBiome} - */ -export const ClowningAroundEncounter: MysteryEncounter = - MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.CLOWNING_AROUND) - .withEncounterTier(MysteryEncounterTier.ULTRA) - .withSceneWaveRangeRequirement(80, 180) - .withAnimations(EncounterAnim.SMOKESCREEN) - .withAutoHideIntroVisuals(false) - .withIntroSpriteConfigs([ - { - spriteKey: Species.MR_MIME.toString(), - fileRoot: "pokemon", - hasShadow: true, - repeat: true, - x: -25, - tint: 0.3, - y: -3, - yShadow: -3 - }, - { - spriteKey: Species.BLACEPHALON.toString(), - fileRoot: "pokemon/exp", - hasShadow: true, - repeat: true, - x: 25, - tint: 0.3, - y: -3, - yShadow: -3 - }, - { - spriteKey: "harlequin", - fileRoot: "trainer", - hasShadow: true, - x: 0, - y: 2, - yShadow: 2 - }, - ]) - .withIntroDialogue([ - { - text: `${namespace}.intro`, - }, - { - text: `${namespace}.intro_dialogue`, - speaker: `${namespace}.speaker` - }, - ]) - .withOnInit((scene: BattleScene) => { - const encounter = scene.currentBattle.mysteryEncounter; - - const clownTrainerType = TrainerType.HARLEQUIN; - const clownConfig = trainerConfigs[clownTrainerType].copy(); - const clownPartyTemplate = new TrainerPartyCompoundTemplate( - new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), - new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER)); - clownConfig.setPartyTemplates(clownPartyTemplate); - clownConfig.setDoubleOnly(); - // @ts-ignore - clownConfig.partyTemplateFunc = null; // Overrides party template func if it exists - - // Generate random ability for Blacephalon from pool - const ability = RANDOM_ABILITY_POOL[randSeedInt(RANDOM_ABILITY_POOL.length)]; - encounter.setDialogueToken("ability", new Ability(ability, 3).name); - encounter.misc = { ability }; - - encounter.enemyPartyConfigs.push({ - trainerConfig: clownConfig, - pokemonConfigs: [ // Overrides first 2 pokemon to be Mr. Mime and Blacephalon - { - species: getPokemonSpecies(Species.MR_MIME), - isBoss: true, - moveSet: [Moves.TEETER_DANCE, Moves.ALLY_SWITCH, Moves.DAZZLING_GLEAM, Moves.PSYCHIC] - }, - { // Blacephalon has the random ability from pool, and 2 entirely random types to fit with the theme of the encounter - species: getPokemonSpecies(Species.BLACEPHALON), - mysteryEncounterData: new MysteryEncounterPokemonData(undefined, ability, undefined, [randSeedInt(18), randSeedInt(18)]), - isBoss: true, - moveSet: [Moves.TRICK, Moves.HYPNOSIS, Moves.SHADOW_BALL, Moves.MIND_BLOWN] - }, - ], - doubleBattle: true - }); - - // Load animations/sfx for start of fight moves - loadCustomMovesForEncounter(scene, [Moves.ROLE_PLAY, Moves.TAUNT]); - - return true; - }) - .withTitle(`${namespace}.title`) - .withDescription(`${namespace}.description`) - .withQuery(`${namespace}.query`) - .withOption( - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) - .withDialogue({ - buttonLabel: `${namespace}.option.1.label`, - buttonTooltip: `${namespace}.option.1.tooltip`, - selected: [ - { - text: `${namespace}.option.1.selected`, - speaker: `${namespace}.speaker` - }, - ], - }) - .withOptionPhase(async (scene: BattleScene) => { - const encounter = scene.currentBattle.mysteryEncounter; - // Spawn battle - const config: EnemyPartyConfig = encounter.enemyPartyConfigs[0]; - - setEncounterRewards(scene, { fillRemaining: true }); - - // TODO: when Magic Room and Wonder Room are implemented, add those to start of battle - encounter.startOfBattleEffects.push( - { // Mr. Mime copies the Blacephalon's random ability - sourceBattlerIndex: BattlerIndex.ENEMY, - targets: [BattlerIndex.ENEMY_2], - move: new PokemonMove(Moves.ROLE_PLAY), - ignorePp: true - }, - { - sourceBattlerIndex: BattlerIndex.ENEMY_2, - targets: [BattlerIndex.PLAYER], - move: new PokemonMove(Moves.TAUNT), - ignorePp: true - }, - { - sourceBattlerIndex: BattlerIndex.ENEMY_2, - targets: [BattlerIndex.PLAYER_2], - move: new PokemonMove(Moves.TAUNT), - ignorePp: true - }); - - await transitionMysteryEncounterIntroVisuals(scene); - await initBattleWithEnemyConfig(scene, config); - }) - .withPostOptionPhase(async (scene: BattleScene): Promise => { - // After the battle, offer the player the opportunity to permanently swap ability - const abilityWasSwapped = await handleSwapAbility(scene); - if (abilityWasSwapped) { - await showEncounterText(scene, `${namespace}.option.1.ability_gained`); - } - - // Play animations once ability swap is complete - // Trainer sprite that is shown at end of battle is not the same as mystery encounter intro visuals - scene.tweens.add({ - targets: scene.currentBattle.trainer, - x: "+=16", - y: "-=16", - alpha: 0, - ease: "Sine.easeInOut", - duration: 250 - }); - const background = new EncounterBattleAnim(EncounterAnim.SMOKESCREEN, scene.getPlayerPokemon()!, scene.getPlayerPokemon()); - background.playWithoutTargets(scene, 230, 40, 2); - return true; - }) - .build() - ) - .withOption( - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) - .withDialogue({ - buttonLabel: `${namespace}.option.2.label`, - buttonTooltip: `${namespace}.option.2.tooltip`, - selected: [ - { - text: `${namespace}.option.2.selected`, - speaker: `${namespace}.speaker` - }, - { - text: `${namespace}.option.2.selected_2`, - }, - { - text: `${namespace}.option.2.selected_3`, - speaker: `${namespace}.speaker` - }, - ], - }) - .withPreOptionPhase(async (scene: BattleScene) => { - // Swap player's items on pokemon with the most items - // Item comparisons look at whichever Pokemon has the greatest number of TRANSFERABLE, non-berry items - // So Vitamins, form change items, etc. are not included - const encounter = scene.currentBattle.mysteryEncounter; - - const party = scene.getParty(); - let mostHeldItemsPokemon = party[0]; - let count = mostHeldItemsPokemon.getHeldItems() - .filter(m => m.isTransferrable && !(m instanceof BerryModifier)) - .reduce((v, m) => v + m.stackCount, 0); - - party.forEach(pokemon => { - const nextCount = pokemon.getHeldItems() - .filter(m => m.isTransferrable && !(m instanceof BerryModifier)) - .reduce((v, m) => v + m.stackCount, 0); - if (nextCount > count) { - mostHeldItemsPokemon = pokemon; - count = nextCount; - } - }); - - encounter.setDialogueToken("switchPokemon", mostHeldItemsPokemon.getNameToRender()); - - const items = mostHeldItemsPokemon.getHeldItems(); - - // Shuffles Berries (if they have any) - let numBerries = 0; - items.filter(m => m instanceof BerryModifier) - .forEach(m => { - numBerries += m.stackCount; - scene.removeModifier(m); - }); - - generateItemsOfTier(scene, mostHeldItemsPokemon, numBerries, "Berries"); - - // Shuffle Transferable held items in the same tier (only shuffles Ultra and Rogue atm) - let numUltra = 0; - let numRogue = 0; - items.filter(m => m.isTransferrable && !(m instanceof BerryModifier)) - .forEach(m => { - const type = m.type.withTierFromPool(); - const tier = type.tier ?? ModifierTier.ULTRA; - if (type.id === "LUCKY_EGG" || tier === ModifierTier.ULTRA) { - numUltra += m.stackCount; - scene.removeModifier(m); - } else if (type.id === "GOLDEN_EGG" || tier === ModifierTier.ROGUE) { - numRogue += m.stackCount; - scene.removeModifier(m); - } - }); - - generateItemsOfTier(scene, mostHeldItemsPokemon, numUltra, ModifierTier.ULTRA); - generateItemsOfTier(scene, mostHeldItemsPokemon, numRogue, ModifierTier.ROGUE); - }) - .withOptionPhase(async (scene: BattleScene) => { - leaveEncounterWithoutBattle(scene, true); - }) - .withPostOptionPhase(async (scene: BattleScene) => { - // Play animations - const background = new EncounterBattleAnim(EncounterAnim.SMOKESCREEN, scene.getPlayerPokemon()!, scene.getPlayerPokemon()); - background.playWithoutTargets(scene, 230, 40, 2); - await transitionMysteryEncounterIntroVisuals(scene); - }) - .build() - ) - .withOption( - MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) - .withDialogue({ - buttonLabel: `${namespace}.option.3.label`, - buttonTooltip: `${namespace}.option.3.tooltip`, - selected: [ - { - text: `${namespace}.option.3.selected`, - speaker: `${namespace}.speaker` - }, - { - text: `${namespace}.option.3.selected_2`, - }, - { - text: `${namespace}.option.3.selected_3`, - speaker: `${namespace}.speaker` - }, - ], - }) - .withPreOptionPhase(async (scene: BattleScene) => { - // Swap player's types on all party pokemon - // If a Pokemon had a single type prior, they will still have a single type after - for (const pokemon of scene.getParty()) { - const originalTypes = pokemon.getTypes(false, false, true); - - // If the Pokemon has non-status moves that don't match the Pokemon's type, prioritizes those as the new type - // Makes the "randomness" of the shuffle slightly less punishing - let priorityTypes = pokemon.moveset - .filter(move => move && !originalTypes.includes(move.getMove().type) && move.getMove().category !== MoveCategory.STATUS) - .map(move => move!.getMove().type); - if (priorityTypes?.length > 0) { - priorityTypes = [...new Set(priorityTypes)]; - randSeedShuffle(priorityTypes); - } - - let newTypes; - if (!originalTypes || originalTypes.length < 1) { - newTypes = priorityTypes?.length > 0 ? [priorityTypes.pop()] : [(randSeedInt(18) as Type)]; - } else { - newTypes = originalTypes.map(m => { - if (priorityTypes?.length > 0) { - const ret = priorityTypes.pop(); - randSeedShuffle(priorityTypes); - return ret; - } - - return randSeedInt(18) as Type; - }); - } - - if (!pokemon.mysteryEncounterData) { - pokemon.mysteryEncounterData = new MysteryEncounterPokemonData(undefined, undefined, undefined, newTypes); - } else { - pokemon.mysteryEncounterData.types = newTypes; - } - } - }) - .withOptionPhase(async (scene: BattleScene) => { - leaveEncounterWithoutBattle(scene, true); - }) - .withPostOptionPhase(async (scene: BattleScene) => { - // Play animations - const background = new EncounterBattleAnim(EncounterAnim.SMOKESCREEN, scene.getPlayerPokemon()!, scene.getPlayerPokemon()); - background.playWithoutTargets(scene, 230, 40, 2); - await transitionMysteryEncounterIntroVisuals(scene); - }) - .build() - ) - .withOutroDialogue([ - { - text: `${namespace}.outro`, - }, - ]) - .build(); - -async function handleSwapAbility(scene: BattleScene) { - return new Promise(async resolve => { - await showEncounterDialogue(scene, `${namespace}.option.1.apply_ability_dialogue`, `${namespace}.speaker`); - await showEncounterText(scene, `${namespace}.option.1.apply_ability_message`); - - scene.ui.setMode(Mode.MESSAGE).then(() => { - displayYesNoOptions(scene, resolve); - }); - }); -} - -function displayYesNoOptions(scene: BattleScene, resolve) { - showEncounterText(scene, `${namespace}.option.1.ability_prompt`, 500, false); - const fullOptions = [ - { - label: i18next.t("menu:yes"), - handler: () => { - onYesAbilitySwap(scene, resolve); - return true; - } - }, - { - label: i18next.t("menu:no"), - handler: () => { - resolve(false); - return true; - } - } - ]; - - const config: OptionSelectConfig = { - options: fullOptions, - maxOptions: 7, - yOffset: 0 - }; - scene.ui.setModeWithoutClear(Mode.OPTION_SELECT, config, null, true); -} - -function onYesAbilitySwap(scene: BattleScene, resolve) { - const onPokemonSelected = (pokemon: PlayerPokemon) => { - // Do ability swap - if (!pokemon.mysteryEncounterData) { - pokemon.mysteryEncounterData = new MysteryEncounterPokemonData(undefined, Abilities.AERILATE); - } - pokemon.mysteryEncounterData.ability = scene.currentBattle.mysteryEncounter.misc.ability; - scene.currentBattle.mysteryEncounter.setDialogueToken("chosenPokemon", pokemon.getNameToRender()); - scene.ui.setMode(Mode.MESSAGE).then(() => resolve(true)); - }; - - const onPokemonNotSelected = () => { - scene.ui.setMode(Mode.MESSAGE).then(() => { - displayYesNoOptions(scene, resolve); - }); - }; - - selectPokemonForOption(scene, onPokemonSelected, onPokemonNotSelected); -} - -function generateItemsOfTier(scene: BattleScene, pokemon: PlayerPokemon, numItems: integer, tier: ModifierTier | "Berries") { - // These pools have to be defined at runtime so that modifierTypes exist - // Pools have instances of the modifier type equal to the max stacks that modifier can be applied to any one pokemon - // This is to prevent "over-generating" a random item of a certain type during item swaps - const ultraPool = [ - [modifierTypes.REVIVER_SEED, 1], - [modifierTypes.GOLDEN_PUNCH, 5], - [modifierTypes.ATTACK_TYPE_BOOSTER, 99], - [modifierTypes.QUICK_CLAW, 3], - [modifierTypes.WIDE_LENS, 3] - ]; - - const roguePool = [ - [modifierTypes.LEFTOVERS, 4], - [modifierTypes.SHELL_BELL, 4], - [modifierTypes.SOUL_DEW, 10], - [modifierTypes.SOOTHE_BELL, 3], - [modifierTypes.SCOPE_LENS, 1], - [modifierTypes.BATON, 1], - [modifierTypes.FOCUS_BAND, 5], - [modifierTypes.KINGS_ROCK, 3], - [modifierTypes.GRIP_CLAW, 5] - ]; - - const berryPool = [ - [BerryType.APICOT, 3], - [BerryType.ENIGMA, 2], - [BerryType.GANLON, 3], - [BerryType.LANSAT, 3], - [BerryType.LEPPA, 2], - [BerryType.LIECHI, 3], - [BerryType.LUM, 2], - [BerryType.PETAYA, 3], - [BerryType.SALAC, 2], - [BerryType.SITRUS, 2], - [BerryType.STARF, 3] - ]; - - let pool: any[]; - if (tier === "Berries") { - pool = berryPool; - } else { - pool = tier === ModifierTier.ULTRA ? ultraPool : roguePool; - } - - for (let i = 0; i < numItems; i++) { - const randIndex = randSeedInt(pool.length); - const newItemType = pool[randIndex]; - let newMod; - if (tier === "Berries") { - newMod = generateModifierType(scene, modifierTypes.BERRY, [newItemType[0]]) as PokemonHeldItemModifierType; - } else { - newMod = generateModifierType(scene, newItemType[0]) as PokemonHeldItemModifierType; - } - applyModifierTypeToPlayerPokemon(scene, pokemon, newMod); - // Decrement max stacks and remove from pool if at max - newItemType[1]--; - if (newItemType[1] <= 0) { - pool.splice(randIndex, 1); - } - } -} diff --git a/src/locales/en/mystery-encounters/clowning-around-dialogue.ts b/src/locales/en/mystery-encounters/clowning-around-dialogue.ts index dac5886c6d1..87dc0169b87 100644 --- a/src/locales/en/mystery-encounters/clowning-around-dialogue.ts +++ b/src/locales/en/mystery-encounters/clowning-around-dialogue.ts @@ -30,5 +30,5 @@ export const clowningAroundDialogue = { selected_3: "Flustered fool, fall for my flawless deception!", }, }, - outro: "The clown and his cohorts\n in a puff of smoke." + outro: "The clown and his cohorts\ndisappear in a puff of smoke." }; From c9d80a3a42338567055c79a37bfcebe3cb7d816c Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Thu, 22 Aug 2024 14:21:39 -0400 Subject: [PATCH 256/270] test patch fix --- .../encounters/the-strong-stuff-encounter.ts | 199 ------------------ .../clowning-around-dialogue.ts | 34 --- 2 files changed, 233 deletions(-) delete mode 100644 src/data/mystery-encounters/encounters/the-strong-stuff-encounter.ts delete mode 100644 src/locales/en/mystery-encounters/clowning-around-dialogue.ts diff --git a/src/data/mystery-encounters/encounters/the-strong-stuff-encounter.ts b/src/data/mystery-encounters/encounters/the-strong-stuff-encounter.ts deleted file mode 100644 index 0b4e60a16e4..00000000000 --- a/src/data/mystery-encounters/encounters/the-strong-stuff-encounter.ts +++ /dev/null @@ -1,199 +0,0 @@ -import { EnemyPartyConfig, initBattleWithEnemyConfig, loadCustomMovesForEncounter, leaveEncounterWithoutBattle, setEncounterRewards, transitionMysteryEncounterIntroVisuals, generateModifierType } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import { modifierTypes, PokemonHeldItemModifierType, } from "#app/modifier/modifier-type"; -import { MysteryEncounterType } from "#enums/mystery-encounter-type"; -import BattleScene from "#app/battle-scene"; -import MysteryEncounter, { MysteryEncounterBuilder } from "../mystery-encounter"; -import { getPokemonSpecies } from "#app/data/pokemon-species"; -import { Species } from "#enums/species"; -import { Nature } from "#app/data/nature"; -import Pokemon, { PlayerPokemon, PokemonMove } from "#app/field/pokemon"; -import { queueEncounterMessage, showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; -import { modifyPlayerPokemonBST } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; -import { Moves } from "#enums/moves"; -import { BattlerIndex } from "#app/battle"; -import { BattleStat } from "#app/data/battle-stat"; -import { BattlerTagType } from "#enums/battler-tag-type"; -import { BerryType } from "#enums/berry-type"; -import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; -import { MysteryEncounterPokemonData } from "#app/data/mystery-encounters/mystery-encounter-pokemon-data"; -import { StatChangePhase } from "#app/phases/stat-change-phase"; - -/** the i18n namespace for the encounter */ -const namespace = "mysteryEncounter:theStrongStuff"; - -/** - * The Strong Stuff encounter. - * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/54 | GitHub Issue #54} - * @see For biome requirements check {@linkcode mysteryEncountersByBiome} - */ -export const TheStrongStuffEncounter: MysteryEncounter = - MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.THE_STRONG_STUFF) - .withEncounterTier(MysteryEncounterTier.COMMON) - .withSceneWaveRangeRequirement(10, 180) // waves 10 to 180 - .withHideWildIntroMessage(true) - .withAutoHideIntroVisuals(false) - .withIntroSpriteConfigs([ - { - spriteKey: "berry_juice", - fileRoot: "items", - hasShadow: true, - isItem: true, - scale: 1.5, - x: -15, - y: 3, - disableAnimation: true - }, - { - spriteKey: Species.SHUCKLE.toString(), - fileRoot: "pokemon", - hasShadow: true, - repeat: true, - scale: 1.5, - x: 20, - y: 10, - yShadow: 7 - }, - ]) // Set in onInit() - .withIntroDialogue([ - { - text: `${namespace}.intro`, - }, - ]) - .withOnInit((scene: BattleScene) => { - const encounter = scene.currentBattle.mysteryEncounter; - - // Calculate boss mon - const config: EnemyPartyConfig = { - levelAdditiveMultiplier: 1, - disableSwitch: true, - pokemonConfigs: [ - { - species: getPokemonSpecies(Species.SHUCKLE), - isBoss: true, - bossSegments: 5, - mysteryEncounterData: new MysteryEncounterPokemonData(1.5), - nature: Nature.BOLD, - moveSet: [Moves.INFESTATION, Moves.SALT_CURE, Moves.GASTRO_ACID, Moves.HEAL_ORDER], - modifierConfigs: [ - { - modifierType: generateModifierType(scene, modifierTypes.BERRY, [BerryType.SITRUS]) as PokemonHeldItemModifierType - }, - { - modifierType: generateModifierType(scene, modifierTypes.BERRY, [BerryType.APICOT]) as PokemonHeldItemModifierType - }, - { - modifierType: generateModifierType(scene, modifierTypes.BERRY, [BerryType.GANLON]) as PokemonHeldItemModifierType - }, - { - modifierType: generateModifierType(scene, modifierTypes.BERRY, [BerryType.LUM]) as PokemonHeldItemModifierType, - stackCount: 2 - } - ], - tags: [BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON], - mysteryEncounterBattleEffects: (pokemon: Pokemon) => { - queueEncounterMessage(pokemon.scene, `${namespace}.option.2.stat_boost`); - pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [BattleStat.DEF, BattleStat.SPDEF], 2)); - } - } - ], - }; - - encounter.enemyPartyConfigs = [config]; - - loadCustomMovesForEncounter(scene, [Moves.GASTRO_ACID, Moves.STEALTH_ROCK]); - - return true; - }) - .withTitle(`${namespace}.title`) - .withDescription(`${namespace}.description`) - .withQuery(`${namespace}.query`) - .withSimpleOption( - { - buttonLabel: `${namespace}.option.1.label`, - buttonTooltip: `${namespace}.option.1.tooltip`, - selected: [ - { - text: `${namespace}.option.1.selected` - } - ] - }, - async (scene: BattleScene) => { - const encounter = scene.currentBattle.mysteryEncounter; - // Do blackout and hide intro visuals during blackout - scene.time.delayedCall(750, () => { - transitionMysteryEncounterIntroVisuals(scene, true, true, 50); - }); - - // -20 to all base stats of highest BST, +10 to all base stats of rest of party - // Get highest BST mon - const party = scene.getParty(); - let highestBst: PlayerPokemon | null = null; - let statTotal = 0; - for (const pokemon of party) { - if (!highestBst) { - highestBst = pokemon; - statTotal = pokemon.getSpeciesForm().getBaseStatTotal(); - continue; - } - - const total = pokemon.getSpeciesForm().getBaseStatTotal(); - if (total > statTotal) { - highestBst = pokemon; - statTotal = total; - } - } - - if (!highestBst) { - highestBst = party[0]; - } - - modifyPlayerPokemonBST(highestBst, -20); - for (const pokemon of party) { - if (highestBst.id === pokemon.id) { - continue; - } - - modifyPlayerPokemonBST(pokemon, 10); - } - - encounter.setDialogueToken("highBstPokemon", highestBst.getNameToRender()); - await showEncounterText(scene, `${namespace}.option.1.selected_2`, undefined, true); - - setEncounterRewards(scene, { fillRemaining: true }); - leaveEncounterWithoutBattle(scene, true); - return true; - } - ) - .withSimpleOption( - { - buttonLabel: `${namespace}.option.2.label`, - buttonTooltip: `${namespace}.option.2.tooltip`, - selected: [ - { - text: `${namespace}.option.2.selected`, - }, - ], - }, - async (scene: BattleScene) => { - // Pick battle - const encounter = scene.currentBattle.mysteryEncounter; - setEncounterRewards(scene, { guaranteedModifierTypeFuncs: [modifierTypes.SOUL_DEW], fillRemaining: true }); - encounter.startOfBattleEffects.push( - { - sourceBattlerIndex: BattlerIndex.ENEMY, - targets: [BattlerIndex.PLAYER], - move: new PokemonMove(Moves.GASTRO_ACID), - ignorePp: true - }, - { - sourceBattlerIndex: BattlerIndex.ENEMY, - targets: [BattlerIndex.PLAYER], - move: new PokemonMove(Moves.STEALTH_ROCK), - ignorePp: true - }); - - transitionMysteryEncounterIntroVisuals(scene, true, true, 500); - await initBattleWithEnemyConfig(scene, encounter.enemyPartyConfigs[0]); - } - ) - .build(); diff --git a/src/locales/en/mystery-encounters/clowning-around-dialogue.ts b/src/locales/en/mystery-encounters/clowning-around-dialogue.ts deleted file mode 100644 index 87dc0169b87..00000000000 --- a/src/locales/en/mystery-encounters/clowning-around-dialogue.ts +++ /dev/null @@ -1,34 +0,0 @@ -export const clowningAroundDialogue = { - intro: "It's...@d{64} a clown?", - speaker: "Clown", - intro_dialogue: "Bumbling buffoon, brace for a brilliant battle!\nYou'll be beaten by this brawling busker!", - title: "Clowning Around", - description: "Something is off about this encounter. The clown seems eager to goad you into a battle, but to what end?\n\nThe Blacephalon is especially strange, like it has @[TOOLTIP_TITLE]{weird types and ability.}", - query: "What will you do?", - option: { - 1: { - label: "Battle the Clown", - tooltip: "(-) Strange Battle\n(?) Affects Pokémon Abilities", - selected: "Your pitiful Pokémon are poised for a pathetic performance!", - apply_ability_dialogue: "A sensational showcase!\nYour savvy suits a sensational skill as spoils!", - apply_ability_message: "The clown is offering to permanently Skill Swap one of your Pokémon's ability to {{ability}}!", - ability_prompt: "Would you like to permanently teach a Pokémon the {{ability}} ability?", - ability_gained: "@s{level_up_fanfare}{{chosenPokemon}} gained the {{ability}} ability!" - }, - 2: { - label: "Remain Unprovoked", - tooltip: "(-) Upsets the Clown\n(?) Affects Pokémon Items", - selected: "Dismal dodger, you deny a delightful duel?\nFeel my fury!", - selected_2: "The clown's Blacephalon uses Trick!\nAll of your {{switchPokemon}}'s items were randomly swapped!", - selected_3: "Flustered fool, fall for my flawless deception!", - }, - 3: { - label: "Return the Insults", - tooltip: "(-) Upsets the Clown\n(?) Affects Pokémon Types", - selected: "Dismal dodger, you deny a delightful duel?\nFeel my fury!", - selected_2: "The clown's Blacephalon uses a strange move!\nAll of your team's types were randomly swapped!", - selected_3: "Flustered fool, fall for my flawless deception!", - }, - }, - outro: "The clown and his cohorts\ndisappear in a puff of smoke." -}; From 0b81f6fd77794e46f5de231181d235795ebb60d7 Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Thu, 22 Aug 2024 14:22:46 -0400 Subject: [PATCH 257/270] test patch fix --- .../encounters/clowning-around-encounter.ts | 496 ++++++++++++++++++ .../encounters/the-strong-stuff-encounter.ts | 199 +++++++ .../clowning-around-dialogue.ts | 34 ++ 3 files changed, 729 insertions(+) create mode 100644 src/data/mystery-encounters/encounters/clowning-around-encounter.ts create mode 100644 src/data/mystery-encounters/encounters/the-strong-stuff-encounter.ts create mode 100644 src/locales/en/mystery-encounters/clowning-around-dialogue.ts diff --git a/src/data/mystery-encounters/encounters/clowning-around-encounter.ts b/src/data/mystery-encounters/encounters/clowning-around-encounter.ts new file mode 100644 index 00000000000..e8a7a238743 --- /dev/null +++ b/src/data/mystery-encounters/encounters/clowning-around-encounter.ts @@ -0,0 +1,496 @@ +import { EnemyPartyConfig, generateModifierType, initBattleWithEnemyConfig, leaveEncounterWithoutBattle, loadCustomMovesForEncounter, selectPokemonForOption, setEncounterRewards, transitionMysteryEncounterIntroVisuals } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { trainerConfigs, TrainerPartyCompoundTemplate, TrainerPartyTemplate, } from "#app/data/trainer-config"; +import { ModifierTier } from "#app/modifier/modifier-tier"; +import { modifierTypes, PokemonHeldItemModifierType } from "#app/modifier/modifier-type"; +import { MysteryEncounterType } from "#enums/mystery-encounter-type"; +import { PartyMemberStrength } from "#enums/party-member-strength"; +import BattleScene from "#app/battle-scene"; +import MysteryEncounter, { MysteryEncounterBuilder } from "../mystery-encounter"; +import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; +import { Species } from "#enums/species"; +import { TrainerType } from "#enums/trainer-type"; +import { getPokemonSpecies } from "#app/data/pokemon-species"; +import { Abilities } from "#enums/abilities"; +import { applyModifierTypeToPlayerPokemon } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; +import { Type } from "#app/data/type"; +import { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; +import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; +import { randSeedInt, randSeedShuffle } from "#app/utils"; +import { showEncounterDialogue, showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; +import { Mode } from "#app/ui/ui"; +import i18next from "i18next"; +import { OptionSelectConfig } from "#app/ui/abstact-option-select-ui-handler"; +import { PlayerPokemon, PokemonMove } from "#app/field/pokemon"; +import { Ability } from "#app/data/ability"; +import { BerryModifier } from "#app/modifier/modifier"; +import { BerryType } from "#enums/berry-type"; +import { BattlerIndex } from "#app/battle"; +import { Moves } from "#enums/moves"; +import { EncounterAnim, EncounterBattleAnim } from "#app/data/battle-anims"; +import { MoveCategory } from "#app/data/move"; +import { MysteryEncounterPokemonData } from "#app/data/mystery-encounters/mystery-encounter-pokemon-data"; + +/** the i18n namespace for the encounter */ +const namespace = "mysteryEncounter:clowningAround"; + +const RANDOM_ABILITY_POOL = [ + Abilities.STURDY, + Abilities.PICKUP, + Abilities.INTIMIDATE, + Abilities.GUTS, + Abilities.DROUGHT, + Abilities.DRIZZLE, + Abilities.SNOW_WARNING, + Abilities.SAND_STREAM, + Abilities.ELECTRIC_SURGE, + Abilities.PSYCHIC_SURGE, + Abilities.GRASSY_SURGE, + Abilities.MISTY_SURGE, + Abilities.MAGICIAN, + Abilities.SHEER_FORCE, + Abilities.PRANKSTER +]; + +/** + * Clowning Around encounter. + * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/69 | GitHub Issue #69} + * @see For biome requirements check {@linkcode mysteryEncountersByBiome} + */ +export const ClowningAroundEncounter: MysteryEncounter = + MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.CLOWNING_AROUND) + .withEncounterTier(MysteryEncounterTier.ULTRA) + .withSceneWaveRangeRequirement(80, 180) + .withAnimations(EncounterAnim.SMOKESCREEN) + .withAutoHideIntroVisuals(false) + .withIntroSpriteConfigs([ + { + spriteKey: Species.MR_MIME.toString(), + fileRoot: "pokemon", + hasShadow: true, + repeat: true, + x: -25, + tint: 0.3, + y: -3, + yShadow: -3 + }, + { + spriteKey: Species.BLACEPHALON.toString(), + fileRoot: "pokemon/exp", + hasShadow: true, + repeat: true, + x: 25, + tint: 0.3, + y: -3, + yShadow: -3 + }, + { + spriteKey: "harlequin", + fileRoot: "trainer", + hasShadow: true, + x: 0, + y: 2, + yShadow: 2 + }, + ]) + .withIntroDialogue([ + { + text: `${namespace}.intro`, + }, + { + text: `${namespace}.intro_dialogue`, + speaker: `${namespace}.speaker` + }, + ]) + .withOnInit((scene: BattleScene) => { + const encounter = scene.currentBattle.mysteryEncounter; + + const clownTrainerType = TrainerType.HARLEQUIN; + const clownConfig = trainerConfigs[clownTrainerType].copy(); + const clownPartyTemplate = new TrainerPartyCompoundTemplate( + new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), + new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER)); + clownConfig.setPartyTemplates(clownPartyTemplate); + clownConfig.setDoubleOnly(); + // @ts-ignore + clownConfig.partyTemplateFunc = null; // Overrides party template func if it exists + + // Generate random ability for Blacephalon from pool + const ability = RANDOM_ABILITY_POOL[randSeedInt(RANDOM_ABILITY_POOL.length)]; + encounter.setDialogueToken("ability", new Ability(ability, 3).name); + encounter.misc = { ability }; + + encounter.enemyPartyConfigs.push({ + trainerConfig: clownConfig, + pokemonConfigs: [ // Overrides first 2 pokemon to be Mr. Mime and Blacephalon + { + species: getPokemonSpecies(Species.MR_MIME), + isBoss: true, + moveSet: [Moves.TEETER_DANCE, Moves.ALLY_SWITCH, Moves.DAZZLING_GLEAM, Moves.PSYCHIC] + }, + { // Blacephalon has the random ability from pool, and 2 entirely random types to fit with the theme of the encounter + species: getPokemonSpecies(Species.BLACEPHALON), + mysteryEncounterData: new MysteryEncounterPokemonData(undefined, ability, undefined, [randSeedInt(18), randSeedInt(18)]), + isBoss: true, + moveSet: [Moves.TRICK, Moves.HYPNOSIS, Moves.SHADOW_BALL, Moves.MIND_BLOWN] + }, + ], + doubleBattle: true + }); + + // Load animations/sfx for start of fight moves + loadCustomMovesForEncounter(scene, [Moves.ROLE_PLAY, Moves.TAUNT]); + + return true; + }) + .withTitle(`${namespace}.title`) + .withDescription(`${namespace}.description`) + .withQuery(`${namespace}.query`) + .withOption( + MysteryEncounterOptionBuilder + .newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) + .withDialogue({ + buttonLabel: `${namespace}.option.1.label`, + buttonTooltip: `${namespace}.option.1.tooltip`, + selected: [ + { + text: `${namespace}.option.1.selected`, + speaker: `${namespace}.speaker` + }, + ], + }) + .withOptionPhase(async (scene: BattleScene) => { + const encounter = scene.currentBattle.mysteryEncounter; + // Spawn battle + const config: EnemyPartyConfig = encounter.enemyPartyConfigs[0]; + + setEncounterRewards(scene, { fillRemaining: true }); + + // TODO: when Magic Room and Wonder Room are implemented, add those to start of battle + encounter.startOfBattleEffects.push( + { // Mr. Mime copies the Blacephalon's random ability + sourceBattlerIndex: BattlerIndex.ENEMY, + targets: [BattlerIndex.ENEMY_2], + move: new PokemonMove(Moves.ROLE_PLAY), + ignorePp: true + }, + { + sourceBattlerIndex: BattlerIndex.ENEMY_2, + targets: [BattlerIndex.PLAYER], + move: new PokemonMove(Moves.TAUNT), + ignorePp: true + }, + { + sourceBattlerIndex: BattlerIndex.ENEMY_2, + targets: [BattlerIndex.PLAYER_2], + move: new PokemonMove(Moves.TAUNT), + ignorePp: true + }); + + await transitionMysteryEncounterIntroVisuals(scene); + await initBattleWithEnemyConfig(scene, config); + }) + .withPostOptionPhase(async (scene: BattleScene): Promise => { + // After the battle, offer the player the opportunity to permanently swap ability + const abilityWasSwapped = await handleSwapAbility(scene); + if (abilityWasSwapped) { + await showEncounterText(scene, `${namespace}.option.1.ability_gained`); + } + + // Play animations once ability swap is complete + // Trainer sprite that is shown at end of battle is not the same as mystery encounter intro visuals + scene.tweens.add({ + targets: scene.currentBattle.trainer, + x: "+=16", + y: "-=16", + alpha: 0, + ease: "Sine.easeInOut", + duration: 250 + }); + const background = new EncounterBattleAnim(EncounterAnim.SMOKESCREEN, scene.getPlayerPokemon()!, scene.getPlayerPokemon()); + background.playWithoutTargets(scene, 230, 40, 2); + return true; + }) + .build() + ) + .withOption( + MysteryEncounterOptionBuilder + .newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) + .withDialogue({ + buttonLabel: `${namespace}.option.2.label`, + buttonTooltip: `${namespace}.option.2.tooltip`, + selected: [ + { + text: `${namespace}.option.2.selected`, + speaker: `${namespace}.speaker` + }, + { + text: `${namespace}.option.2.selected_2`, + }, + { + text: `${namespace}.option.2.selected_3`, + speaker: `${namespace}.speaker` + }, + ], + }) + .withPreOptionPhase(async (scene: BattleScene) => { + // Swap player's items on pokemon with the most items + // Item comparisons look at whichever Pokemon has the greatest number of TRANSFERABLE, non-berry items + // So Vitamins, form change items, etc. are not included + const encounter = scene.currentBattle.mysteryEncounter; + + const party = scene.getParty(); + let mostHeldItemsPokemon = party[0]; + let count = mostHeldItemsPokemon.getHeldItems() + .filter(m => m.isTransferrable && !(m instanceof BerryModifier)) + .reduce((v, m) => v + m.stackCount, 0); + + party.forEach(pokemon => { + const nextCount = pokemon.getHeldItems() + .filter(m => m.isTransferrable && !(m instanceof BerryModifier)) + .reduce((v, m) => v + m.stackCount, 0); + if (nextCount > count) { + mostHeldItemsPokemon = pokemon; + count = nextCount; + } + }); + + encounter.setDialogueToken("switchPokemon", mostHeldItemsPokemon.getNameToRender()); + + const items = mostHeldItemsPokemon.getHeldItems(); + + // Shuffles Berries (if they have any) + let numBerries = 0; + items.filter(m => m instanceof BerryModifier) + .forEach(m => { + numBerries += m.stackCount; + scene.removeModifier(m); + }); + + generateItemsOfTier(scene, mostHeldItemsPokemon, numBerries, "Berries"); + + // Shuffle Transferable held items in the same tier (only shuffles Ultra and Rogue atm) + let numUltra = 0; + let numRogue = 0; + items.filter(m => m.isTransferrable && !(m instanceof BerryModifier)) + .forEach(m => { + const type = m.type.withTierFromPool(); + const tier = type.tier ?? ModifierTier.ULTRA; + if (type.id === "LUCKY_EGG" || tier === ModifierTier.ULTRA) { + numUltra += m.stackCount; + scene.removeModifier(m); + } else if (type.id === "GOLDEN_EGG" || tier === ModifierTier.ROGUE) { + numRogue += m.stackCount; + scene.removeModifier(m); + } + }); + + generateItemsOfTier(scene, mostHeldItemsPokemon, numUltra, ModifierTier.ULTRA); + generateItemsOfTier(scene, mostHeldItemsPokemon, numRogue, ModifierTier.ROGUE); + }) + .withOptionPhase(async (scene: BattleScene) => { + leaveEncounterWithoutBattle(scene, true); + }) + .withPostOptionPhase(async (scene: BattleScene) => { + // Play animations + const background = new EncounterBattleAnim(EncounterAnim.SMOKESCREEN, scene.getPlayerPokemon()!, scene.getPlayerPokemon()); + background.playWithoutTargets(scene, 230, 40, 2); + await transitionMysteryEncounterIntroVisuals(scene); + }) + .build() + ) + .withOption( + MysteryEncounterOptionBuilder + .newOptionWithMode(MysteryEncounterOptionMode.DEFAULT) + .withDialogue({ + buttonLabel: `${namespace}.option.3.label`, + buttonTooltip: `${namespace}.option.3.tooltip`, + selected: [ + { + text: `${namespace}.option.3.selected`, + speaker: `${namespace}.speaker` + }, + { + text: `${namespace}.option.3.selected_2`, + }, + { + text: `${namespace}.option.3.selected_3`, + speaker: `${namespace}.speaker` + }, + ], + }) + .withPreOptionPhase(async (scene: BattleScene) => { + // Swap player's types on all party pokemon + // If a Pokemon had a single type prior, they will still have a single type after + for (const pokemon of scene.getParty()) { + const originalTypes = pokemon.getTypes(false, false, true); + + // If the Pokemon has non-status moves that don't match the Pokemon's type, prioritizes those as the new type + // Makes the "randomness" of the shuffle slightly less punishing + let priorityTypes = pokemon.moveset + .filter(move => move && !originalTypes.includes(move.getMove().type) && move.getMove().category !== MoveCategory.STATUS) + .map(move => move!.getMove().type); + if (priorityTypes?.length > 0) { + priorityTypes = [...new Set(priorityTypes)]; + randSeedShuffle(priorityTypes); + } + + let newTypes; + if (!originalTypes || originalTypes.length < 1) { + newTypes = priorityTypes?.length > 0 ? [priorityTypes.pop()] : [(randSeedInt(18) as Type)]; + } else { + newTypes = originalTypes.map(m => { + if (priorityTypes?.length > 0) { + const ret = priorityTypes.pop(); + randSeedShuffle(priorityTypes); + return ret; + } + + return randSeedInt(18) as Type; + }); + } + + if (!pokemon.mysteryEncounterData) { + pokemon.mysteryEncounterData = new MysteryEncounterPokemonData(undefined, undefined, undefined, newTypes); + } else { + pokemon.mysteryEncounterData.types = newTypes; + } + } + }) + .withOptionPhase(async (scene: BattleScene) => { + leaveEncounterWithoutBattle(scene, true); + }) + .withPostOptionPhase(async (scene: BattleScene) => { + // Play animations + const background = new EncounterBattleAnim(EncounterAnim.SMOKESCREEN, scene.getPlayerPokemon()!, scene.getPlayerPokemon()); + background.playWithoutTargets(scene, 230, 40, 2); + await transitionMysteryEncounterIntroVisuals(scene); + }) + .build() + ) + .withOutroDialogue([ + { + text: `${namespace}.outro`, + }, + ]) + .build(); + +async function handleSwapAbility(scene: BattleScene) { + return new Promise(async resolve => { + await showEncounterDialogue(scene, `${namespace}.option.1.apply_ability_dialogue`, `${namespace}.speaker`); + await showEncounterText(scene, `${namespace}.option.1.apply_ability_message`); + + scene.ui.setMode(Mode.MESSAGE).then(() => { + displayYesNoOptions(scene, resolve); + }); + }); +} + +function displayYesNoOptions(scene: BattleScene, resolve) { + showEncounterText(scene, `${namespace}.option.1.ability_prompt`, 500, false); + const fullOptions = [ + { + label: i18next.t("menu:yes"), + handler: () => { + onYesAbilitySwap(scene, resolve); + return true; + } + }, + { + label: i18next.t("menu:no"), + handler: () => { + resolve(false); + return true; + } + } + ]; + + const config: OptionSelectConfig = { + options: fullOptions, + maxOptions: 7, + yOffset: 0 + }; + scene.ui.setModeWithoutClear(Mode.OPTION_SELECT, config, null, true); +} + +function onYesAbilitySwap(scene: BattleScene, resolve) { + const onPokemonSelected = (pokemon: PlayerPokemon) => { + // Do ability swap + if (!pokemon.mysteryEncounterData) { + pokemon.mysteryEncounterData = new MysteryEncounterPokemonData(undefined, Abilities.AERILATE); + } + pokemon.mysteryEncounterData.ability = scene.currentBattle.mysteryEncounter.misc.ability; + scene.currentBattle.mysteryEncounter.setDialogueToken("chosenPokemon", pokemon.getNameToRender()); + scene.ui.setMode(Mode.MESSAGE).then(() => resolve(true)); + }; + + const onPokemonNotSelected = () => { + scene.ui.setMode(Mode.MESSAGE).then(() => { + displayYesNoOptions(scene, resolve); + }); + }; + + selectPokemonForOption(scene, onPokemonSelected, onPokemonNotSelected); +} + +function generateItemsOfTier(scene: BattleScene, pokemon: PlayerPokemon, numItems: integer, tier: ModifierTier | "Berries") { + // These pools have to be defined at runtime so that modifierTypes exist + // Pools have instances of the modifier type equal to the max stacks that modifier can be applied to any one pokemon + // This is to prevent "over-generating" a random item of a certain type during item swaps + const ultraPool = [ + [modifierTypes.REVIVER_SEED, 1], + [modifierTypes.GOLDEN_PUNCH, 5], + [modifierTypes.ATTACK_TYPE_BOOSTER, 99], + [modifierTypes.QUICK_CLAW, 3], + [modifierTypes.WIDE_LENS, 3] + ]; + + const roguePool = [ + [modifierTypes.LEFTOVERS, 4], + [modifierTypes.SHELL_BELL, 4], + [modifierTypes.SOUL_DEW, 10], + [modifierTypes.SOOTHE_BELL, 3], + [modifierTypes.SCOPE_LENS, 1], + [modifierTypes.BATON, 1], + [modifierTypes.FOCUS_BAND, 5], + [modifierTypes.KINGS_ROCK, 3], + [modifierTypes.GRIP_CLAW, 5] + ]; + + const berryPool = [ + [BerryType.APICOT, 3], + [BerryType.ENIGMA, 2], + [BerryType.GANLON, 3], + [BerryType.LANSAT, 3], + [BerryType.LEPPA, 2], + [BerryType.LIECHI, 3], + [BerryType.LUM, 2], + [BerryType.PETAYA, 3], + [BerryType.SALAC, 2], + [BerryType.SITRUS, 2], + [BerryType.STARF, 3] + ]; + + let pool: any[]; + if (tier === "Berries") { + pool = berryPool; + } else { + pool = tier === ModifierTier.ULTRA ? ultraPool : roguePool; + } + + for (let i = 0; i < numItems; i++) { + const randIndex = randSeedInt(pool.length); + const newItemType = pool[randIndex]; + let newMod; + if (tier === "Berries") { + newMod = generateModifierType(scene, modifierTypes.BERRY, [newItemType[0]]) as PokemonHeldItemModifierType; + } else { + newMod = generateModifierType(scene, newItemType[0]) as PokemonHeldItemModifierType; + } + applyModifierTypeToPlayerPokemon(scene, pokemon, newMod); + // Decrement max stacks and remove from pool if at max + newItemType[1]--; + if (newItemType[1] <= 0) { + pool.splice(randIndex, 1); + } + } +} diff --git a/src/data/mystery-encounters/encounters/the-strong-stuff-encounter.ts b/src/data/mystery-encounters/encounters/the-strong-stuff-encounter.ts new file mode 100644 index 00000000000..0b4e60a16e4 --- /dev/null +++ b/src/data/mystery-encounters/encounters/the-strong-stuff-encounter.ts @@ -0,0 +1,199 @@ +import { EnemyPartyConfig, initBattleWithEnemyConfig, loadCustomMovesForEncounter, leaveEncounterWithoutBattle, setEncounterRewards, transitionMysteryEncounterIntroVisuals, generateModifierType } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { modifierTypes, PokemonHeldItemModifierType, } from "#app/modifier/modifier-type"; +import { MysteryEncounterType } from "#enums/mystery-encounter-type"; +import BattleScene from "#app/battle-scene"; +import MysteryEncounter, { MysteryEncounterBuilder } from "../mystery-encounter"; +import { getPokemonSpecies } from "#app/data/pokemon-species"; +import { Species } from "#enums/species"; +import { Nature } from "#app/data/nature"; +import Pokemon, { PlayerPokemon, PokemonMove } from "#app/field/pokemon"; +import { queueEncounterMessage, showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; +import { modifyPlayerPokemonBST } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; +import { Moves } from "#enums/moves"; +import { BattlerIndex } from "#app/battle"; +import { BattleStat } from "#app/data/battle-stat"; +import { BattlerTagType } from "#enums/battler-tag-type"; +import { BerryType } from "#enums/berry-type"; +import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; +import { MysteryEncounterPokemonData } from "#app/data/mystery-encounters/mystery-encounter-pokemon-data"; +import { StatChangePhase } from "#app/phases/stat-change-phase"; + +/** the i18n namespace for the encounter */ +const namespace = "mysteryEncounter:theStrongStuff"; + +/** + * The Strong Stuff encounter. + * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/54 | GitHub Issue #54} + * @see For biome requirements check {@linkcode mysteryEncountersByBiome} + */ +export const TheStrongStuffEncounter: MysteryEncounter = + MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.THE_STRONG_STUFF) + .withEncounterTier(MysteryEncounterTier.COMMON) + .withSceneWaveRangeRequirement(10, 180) // waves 10 to 180 + .withHideWildIntroMessage(true) + .withAutoHideIntroVisuals(false) + .withIntroSpriteConfigs([ + { + spriteKey: "berry_juice", + fileRoot: "items", + hasShadow: true, + isItem: true, + scale: 1.5, + x: -15, + y: 3, + disableAnimation: true + }, + { + spriteKey: Species.SHUCKLE.toString(), + fileRoot: "pokemon", + hasShadow: true, + repeat: true, + scale: 1.5, + x: 20, + y: 10, + yShadow: 7 + }, + ]) // Set in onInit() + .withIntroDialogue([ + { + text: `${namespace}.intro`, + }, + ]) + .withOnInit((scene: BattleScene) => { + const encounter = scene.currentBattle.mysteryEncounter; + + // Calculate boss mon + const config: EnemyPartyConfig = { + levelAdditiveMultiplier: 1, + disableSwitch: true, + pokemonConfigs: [ + { + species: getPokemonSpecies(Species.SHUCKLE), + isBoss: true, + bossSegments: 5, + mysteryEncounterData: new MysteryEncounterPokemonData(1.5), + nature: Nature.BOLD, + moveSet: [Moves.INFESTATION, Moves.SALT_CURE, Moves.GASTRO_ACID, Moves.HEAL_ORDER], + modifierConfigs: [ + { + modifierType: generateModifierType(scene, modifierTypes.BERRY, [BerryType.SITRUS]) as PokemonHeldItemModifierType + }, + { + modifierType: generateModifierType(scene, modifierTypes.BERRY, [BerryType.APICOT]) as PokemonHeldItemModifierType + }, + { + modifierType: generateModifierType(scene, modifierTypes.BERRY, [BerryType.GANLON]) as PokemonHeldItemModifierType + }, + { + modifierType: generateModifierType(scene, modifierTypes.BERRY, [BerryType.LUM]) as PokemonHeldItemModifierType, + stackCount: 2 + } + ], + tags: [BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON], + mysteryEncounterBattleEffects: (pokemon: Pokemon) => { + queueEncounterMessage(pokemon.scene, `${namespace}.option.2.stat_boost`); + pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [BattleStat.DEF, BattleStat.SPDEF], 2)); + } + } + ], + }; + + encounter.enemyPartyConfigs = [config]; + + loadCustomMovesForEncounter(scene, [Moves.GASTRO_ACID, Moves.STEALTH_ROCK]); + + return true; + }) + .withTitle(`${namespace}.title`) + .withDescription(`${namespace}.description`) + .withQuery(`${namespace}.query`) + .withSimpleOption( + { + buttonLabel: `${namespace}.option.1.label`, + buttonTooltip: `${namespace}.option.1.tooltip`, + selected: [ + { + text: `${namespace}.option.1.selected` + } + ] + }, + async (scene: BattleScene) => { + const encounter = scene.currentBattle.mysteryEncounter; + // Do blackout and hide intro visuals during blackout + scene.time.delayedCall(750, () => { + transitionMysteryEncounterIntroVisuals(scene, true, true, 50); + }); + + // -20 to all base stats of highest BST, +10 to all base stats of rest of party + // Get highest BST mon + const party = scene.getParty(); + let highestBst: PlayerPokemon | null = null; + let statTotal = 0; + for (const pokemon of party) { + if (!highestBst) { + highestBst = pokemon; + statTotal = pokemon.getSpeciesForm().getBaseStatTotal(); + continue; + } + + const total = pokemon.getSpeciesForm().getBaseStatTotal(); + if (total > statTotal) { + highestBst = pokemon; + statTotal = total; + } + } + + if (!highestBst) { + highestBst = party[0]; + } + + modifyPlayerPokemonBST(highestBst, -20); + for (const pokemon of party) { + if (highestBst.id === pokemon.id) { + continue; + } + + modifyPlayerPokemonBST(pokemon, 10); + } + + encounter.setDialogueToken("highBstPokemon", highestBst.getNameToRender()); + await showEncounterText(scene, `${namespace}.option.1.selected_2`, undefined, true); + + setEncounterRewards(scene, { fillRemaining: true }); + leaveEncounterWithoutBattle(scene, true); + return true; + } + ) + .withSimpleOption( + { + buttonLabel: `${namespace}.option.2.label`, + buttonTooltip: `${namespace}.option.2.tooltip`, + selected: [ + { + text: `${namespace}.option.2.selected`, + }, + ], + }, + async (scene: BattleScene) => { + // Pick battle + const encounter = scene.currentBattle.mysteryEncounter; + setEncounterRewards(scene, { guaranteedModifierTypeFuncs: [modifierTypes.SOUL_DEW], fillRemaining: true }); + encounter.startOfBattleEffects.push( + { + sourceBattlerIndex: BattlerIndex.ENEMY, + targets: [BattlerIndex.PLAYER], + move: new PokemonMove(Moves.GASTRO_ACID), + ignorePp: true + }, + { + sourceBattlerIndex: BattlerIndex.ENEMY, + targets: [BattlerIndex.PLAYER], + move: new PokemonMove(Moves.STEALTH_ROCK), + ignorePp: true + }); + + transitionMysteryEncounterIntroVisuals(scene, true, true, 500); + await initBattleWithEnemyConfig(scene, encounter.enemyPartyConfigs[0]); + } + ) + .build(); diff --git a/src/locales/en/mystery-encounters/clowning-around-dialogue.ts b/src/locales/en/mystery-encounters/clowning-around-dialogue.ts new file mode 100644 index 00000000000..87dc0169b87 --- /dev/null +++ b/src/locales/en/mystery-encounters/clowning-around-dialogue.ts @@ -0,0 +1,34 @@ +export const clowningAroundDialogue = { + intro: "It's...@d{64} a clown?", + speaker: "Clown", + intro_dialogue: "Bumbling buffoon, brace for a brilliant battle!\nYou'll be beaten by this brawling busker!", + title: "Clowning Around", + description: "Something is off about this encounter. The clown seems eager to goad you into a battle, but to what end?\n\nThe Blacephalon is especially strange, like it has @[TOOLTIP_TITLE]{weird types and ability.}", + query: "What will you do?", + option: { + 1: { + label: "Battle the Clown", + tooltip: "(-) Strange Battle\n(?) Affects Pokémon Abilities", + selected: "Your pitiful Pokémon are poised for a pathetic performance!", + apply_ability_dialogue: "A sensational showcase!\nYour savvy suits a sensational skill as spoils!", + apply_ability_message: "The clown is offering to permanently Skill Swap one of your Pokémon's ability to {{ability}}!", + ability_prompt: "Would you like to permanently teach a Pokémon the {{ability}} ability?", + ability_gained: "@s{level_up_fanfare}{{chosenPokemon}} gained the {{ability}} ability!" + }, + 2: { + label: "Remain Unprovoked", + tooltip: "(-) Upsets the Clown\n(?) Affects Pokémon Items", + selected: "Dismal dodger, you deny a delightful duel?\nFeel my fury!", + selected_2: "The clown's Blacephalon uses Trick!\nAll of your {{switchPokemon}}'s items were randomly swapped!", + selected_3: "Flustered fool, fall for my flawless deception!", + }, + 3: { + label: "Return the Insults", + tooltip: "(-) Upsets the Clown\n(?) Affects Pokémon Types", + selected: "Dismal dodger, you deny a delightful duel?\nFeel my fury!", + selected_2: "The clown's Blacephalon uses a strange move!\nAll of your team's types were randomly swapped!", + selected_3: "Flustered fool, fall for my flawless deception!", + }, + }, + outro: "The clown and his cohorts\ndisappear in a puff of smoke." +}; From 5af5992db4675fe7a269d88f470fc4017f9f6eae Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Thu, 22 Aug 2024 17:39:02 -0400 Subject: [PATCH 258/270] adds teleporting hijinks encounter --- .../images/mystery-encounters/berry_bush.json | 41 +++ .../images/mystery-encounters/berry_bush.png | Bin 0 -> 719 bytes .../mystery-encounters/starry_background.png | Bin 10232 -> 0 bytes .../images/mystery-encounters/teleporter.json | 41 +++ .../images/mystery-encounters/teleporter.png | Bin 0 -> 661 bytes .../encounters/berries-abound-encounter.ts | 132 ++------- .../encounters/fiery-fallout-encounter.ts | 4 +- .../encounters/fight-or-flight-encounter.ts | 6 +- .../teleporting-hijinks-encounter.ts | 258 ++++++++++++++++++ .../mystery-encounter-requirements.ts | 31 ++- .../mystery-encounters/mystery-encounters.ts | 5 +- src/enums/mystery-encounter-type.ts | 3 +- src/locales/en/mystery-encounter.ts | 4 +- .../teleporting-hijinks-dialogue.ts | 30 ++ src/overrides.ts | 4 +- 15 files changed, 445 insertions(+), 114 deletions(-) create mode 100644 public/images/mystery-encounters/berry_bush.json create mode 100644 public/images/mystery-encounters/berry_bush.png delete mode 100644 public/images/mystery-encounters/starry_background.png create mode 100644 public/images/mystery-encounters/teleporter.json create mode 100644 public/images/mystery-encounters/teleporter.png create mode 100644 src/data/mystery-encounters/encounters/teleporting-hijinks-encounter.ts create mode 100644 src/locales/en/mystery-encounters/teleporting-hijinks-dialogue.ts diff --git a/public/images/mystery-encounters/berry_bush.json b/public/images/mystery-encounters/berry_bush.json new file mode 100644 index 00000000000..397538d8af2 --- /dev/null +++ b/public/images/mystery-encounters/berry_bush.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "berry_bush.png", + "format": "RGBA8888", + "size": { + "w": 49, + "h": 53 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 49, + "h": 53 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 49, + "h": 53 + }, + "frame": { + "x": 0, + "y": 0, + "w": 49, + "h": 53 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:d5f83625477b5f98b726343f4a3a396f:f4665258986e97345cfeee041b4b8bcf:e7781fcc447e6d12deb2af78c9493c7f$" + } +} diff --git a/public/images/mystery-encounters/berry_bush.png b/public/images/mystery-encounters/berry_bush.png new file mode 100644 index 0000000000000000000000000000000000000000..e9be20b4863b927e6c1a3d26973ba946305131af GIT binary patch literal 719 zcmV;=0x0!`lk zao4&{hPHHfJ;P=6>G)-bEX)5GT;s0&UgHim+XwYa`yUXqmpJ<7O9Vi4q+KB6Bp=tn z_Ig18;xY0;gy<@x?e%tN4TL#!-?OA>ySBCJ zhhBj|k$cwMD~dC$R7Z3LB5`zS=3HHKPx_7sozPUtr>c#vaVoCHBLKkDk&&uR5$U|N zR=%3ZypJ)`Ka2p^$|fVYyA9|1XeU!Ti4ap?jM(Wmorfph5UmoRZZ=zNmCo(bIuCAw zc(HsTP>8D%qrqYNiW^I5Xjagoku4(xlayP^5|MN@`UKcug2TZ7E?Y7N(_N z5IhlFqSvJe+fr)YfD<%zfcvUj3gd|YmlINvX41rtG8!0!@8+zpu7fyooz8&okxZpi zbafCt_6b;QkyUfKmr^fI!to(*St& zkwO659F{}g*#+>658=qn4Mz^>4?ggludSOQt~v}-^!vX6YOy}n7(ZFZP~c(EJ^N+- z{2Su&Fyt1oMu^)8nx%=0_wsVvyuV+{%>Vm;!asTdB>5@Q%7p*`002ovPDHLkV1mb3 BLs|d; literal 0 HcmV?d00001 diff --git a/public/images/mystery-encounters/starry_background.png b/public/images/mystery-encounters/starry_background.png deleted file mode 100644 index 759c624ddc1134067ecf7b29e94c9b1d9576219b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10232 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 literal 0 HcmV?d00001 diff --git a/src/data/mystery-encounters/encounters/berries-abound-encounter.ts b/src/data/mystery-encounters/encounters/berries-abound-encounter.ts index 62ef5631736..7a464a5fd55 100644 --- a/src/data/mystery-encounters/encounters/berries-abound-encounter.ts +++ b/src/data/mystery-encounters/encounters/berries-abound-encounter.ts @@ -46,96 +46,7 @@ export const BerriesAboundEncounter: MysteryEncounter = .withSceneWaveRangeRequirement(10, 180) // waves 10 to 180 .withCatchAllowed(true) .withHideWildIntroMessage(true) - .withIntroSpriteConfigs([ - { - spriteKey: "lum_berry", - fileRoot: "items", - isItem: true, - x: 7, - y: -14, - disableAnimation: true - }, - { - spriteKey: "salac_berry", - fileRoot: "items", - isItem: true, - x: 2, - y: 4, - disableAnimation: true - }, - { - spriteKey: "lansat_berry", - fileRoot: "items", - isItem: true, - x: 32, - y: 5, - disableAnimation: true - }, - { - spriteKey: "liechi_berry", - fileRoot: "items", - isItem: true, - x: 6, - y: -5, - disableAnimation: true - }, - { - spriteKey: "sitrus_berry", - fileRoot: "items", - isItem: true, - x: 7, - y: 8, - disableAnimation: true - }, - { - spriteKey: "enigma_berry", - fileRoot: "items", - isItem: true, - x: 26, - y: -4, - disableAnimation: true - }, - { - spriteKey: "leppa_berry", - fileRoot: "items", - isItem: true, - x: 16, - y: -27, - disableAnimation: true - }, - { - spriteKey: "petaya_berry", - fileRoot: "items", - isItem: true, - x: 30, - y: -17, - disableAnimation: true - }, - { - spriteKey: "ganlon_berry", - fileRoot: "items", - isItem: true, - x: 16, - y: -11, - disableAnimation: true - }, - { - spriteKey: "apicot_berry", - fileRoot: "items", - isItem: true, - x: 14, - y: -2, - disableAnimation: true - }, - { - spriteKey: "starf_berry", - fileRoot: "items", - isItem: true, - x: 18, - y: 9, - disableAnimation: true - }, - ]) // Set in onInit() + .withIntroSpriteConfigs([]) // Set in onInit() .withIntroDialogue([ { text: `${namespace}.intro`, @@ -145,12 +56,14 @@ export const BerriesAboundEncounter: MysteryEncounter = const encounter = scene.currentBattle.mysteryEncounter; // Calculate boss mon - const bossSpecies = scene.arena.randomSpecies(scene.currentBattle.waveIndex, scene.currentBattle.waveIndex, 0, getPartyLuckValue(scene.getParty()), true); - const bossPokemon = new EnemyPokemon(scene, bossSpecies, scene.currentBattle.waveIndex, TrainerSlot.NONE, true); + const level = (scene.currentBattle.enemyLevels?.[0] ?? scene.currentBattle.waveIndex) + Math.max(Math.round((scene.currentBattle.waveIndex / 10)), 0); + const bossSpecies = scene.arena.randomSpecies(scene.currentBattle.waveIndex, level, 0, getPartyLuckValue(scene.getParty()), true); + const bossPokemon = new EnemyPokemon(scene, bossSpecies, level, TrainerSlot.NONE, true); encounter.setDialogueToken("enemyPokemon", getPokemonNameWithAffix(bossPokemon)); const config: EnemyPartyConfig = { levelAdditiveMultiplier: 1, pokemonConfigs: [{ + level: level, species: bossSpecies, dataSource: new PokemonData(bossPokemon), isBoss: true @@ -168,15 +81,26 @@ export const BerriesAboundEncounter: MysteryEncounter = encounter.misc = { numBerries }; const { spriteKey, fileRoot } = getSpriteKeysFromPokemon(bossPokemon); - encounter.spriteConfigs.push({ - spriteKey: spriteKey, - fileRoot: fileRoot, - hasShadow: true, - tint: 0.25, - x: -5, - repeat: true, - isPokemon: true - }); + encounter.spriteConfigs = [ + { + spriteKey: "berry_bush", + fileRoot: "mystery-encounters", + x: 25, + y: -6, + yShadow: -7, + disableAnimation: true, + hasShadow: true + }, + { + spriteKey: spriteKey, + fileRoot: fileRoot, + hasShadow: true, + tint: 0.25, + x: -5, + repeat: true, + isPokemon: true + } + ]; // Get fastest party pokemon for option 2 const fastestPokemon = getHighestStatPlayerPokemon(scene, Stat.SPD, true); @@ -238,7 +162,7 @@ export const BerriesAboundEncounter: MysteryEncounter = const encounter = scene.currentBattle.mysteryEncounter; const fastestPokemon = encounter.misc.fastestPokemon; const enemySpeed = encounter.misc.enemySpeed; - const speedDiff = fastestPokemon.getStat(Stat.SPD) / enemySpeed; + const speedDiff = fastestPokemon.getStat(Stat.SPD) / (enemySpeed * 1.1); const numBerries = encounter.misc.numBerries; const shopOptions: ModifierTypeOption[] = []; @@ -272,8 +196,8 @@ export const BerriesAboundEncounter: MysteryEncounter = await initBattleWithEnemyConfig(scene, config); return; } else { - // Gains 1 berry for every 10% faster the player's pokemon is than the enemy, up to a max of numBerries, minimum of 1 - const numBerriesGrabbed = Math.max(Math.min(Math.round((speedDiff - 1)/0.1), numBerries), 1); + // Gains 1 berry for every 10% faster the player's pokemon is than the enemy, up to a max of numBerries, minimum of 2 + const numBerriesGrabbed = Math.max(Math.min(Math.round((speedDiff - 1)/0.08), numBerries), 2); encounter.setDialogueToken("numBerries", String(numBerriesGrabbed)); const doFasterBerryRewards = async () => { const berryText = numBerriesGrabbed + " " + i18next.t(`${namespace}.berries`); diff --git a/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts b/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts index 1eea328927b..fe5cf320401 100644 --- a/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts +++ b/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts @@ -1,5 +1,5 @@ import { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; -import { EnemyPartyConfig, generateModifierTypeOption, initBattleWithEnemyConfig, loadCustomMovesForEncounter, leaveEncounterWithoutBattle, setEncounterExp, setEncounterRewards, transitionMysteryEncounterIntroVisuals } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { EnemyPartyConfig, initBattleWithEnemyConfig, loadCustomMovesForEncounter, leaveEncounterWithoutBattle, setEncounterExp, setEncounterRewards, transitionMysteryEncounterIntroVisuals, generateModifierType } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { AttackTypeBoosterModifierType, modifierTypes, } from "#app/modifier/modifier-type"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import BattleScene from "#app/battle-scene"; @@ -243,7 +243,7 @@ function giveLeadPokemonCharcoal(scene: BattleScene) { // Give first party pokemon Charcoal for free at end of battle const leadPokemon = scene.getParty()?.[0]; if (leadPokemon) { - const charcoal = generateModifierTypeOption(scene, modifierTypes.ATTACK_TYPE_BOOSTER, [Type.FIRE]).type as AttackTypeBoosterModifierType; + const charcoal = generateModifierType(scene, modifierTypes.ATTACK_TYPE_BOOSTER, [Type.FIRE]) as AttackTypeBoosterModifierType; applyModifierTypeToPlayerPokemon(scene, leadPokemon, charcoal); scene.currentBattle.mysteryEncounter.setDialogueToken("leadPokemon", leadPokemon.getNameToRender()); queueEncounterMessage(scene, `${namespace}.found_charcoal`); 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 616c81880df..a7aeefe2db5 100644 --- a/src/data/mystery-encounters/encounters/fight-or-flight-encounter.ts +++ b/src/data/mystery-encounters/encounters/fight-or-flight-encounter.ts @@ -49,11 +49,13 @@ export const FightOrFlightEncounter: MysteryEncounter = const encounter = scene.currentBattle.mysteryEncounter; // Calculate boss mon - const bossSpecies = scene.arena.randomSpecies(scene.currentBattle.waveIndex, scene.currentBattle.waveIndex, 0, getPartyLuckValue(scene.getParty()), true); - const bossPokemon = new EnemyPokemon(scene, bossSpecies, scene.currentBattle.waveIndex, TrainerSlot.NONE, true); + const level = (scene.currentBattle.enemyLevels?.[0] ?? scene.currentBattle.waveIndex) + Math.max(Math.round((scene.currentBattle.waveIndex / 10)), 0); + const bossSpecies = scene.arena.randomSpecies(scene.currentBattle.waveIndex, level, 0, getPartyLuckValue(scene.getParty()), true); + const bossPokemon = new EnemyPokemon(scene, bossSpecies, level, TrainerSlot.NONE, true); const config: EnemyPartyConfig = { levelAdditiveMultiplier: 1, pokemonConfigs: [{ + level: level, species: bossSpecies, dataSource: new PokemonData(bossPokemon), isBoss: true diff --git a/src/data/mystery-encounters/encounters/teleporting-hijinks-encounter.ts b/src/data/mystery-encounters/encounters/teleporting-hijinks-encounter.ts new file mode 100644 index 00000000000..c6c41445bd0 --- /dev/null +++ b/src/data/mystery-encounters/encounters/teleporting-hijinks-encounter.ts @@ -0,0 +1,258 @@ +import { EnemyPartyConfig, generateModifierTypeOption, initBattleWithEnemyConfig, setEncounterExp, setEncounterRewards, transitionMysteryEncounterIntroVisuals, updatePlayerMoney, } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { randSeedInt } from "#app/utils"; +import { MysteryEncounterType } from "#enums/mystery-encounter-type"; +import BattleScene from "#app/battle-scene"; +import MysteryEncounter, { MysteryEncounterBuilder } from "../mystery-encounter"; +import { MoneyRequirement, WaveModulusRequirement } from "../mystery-encounter-requirements"; +import Pokemon, { EnemyPokemon } from "#app/field/pokemon"; +import { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; +import { queueEncounterMessage, showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; +import PokemonData from "#app/system/pokemon-data"; +import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; +import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; +import { Biome } from "#enums/biome"; +import { getBiomeKey } from "#app/field/arena"; +import { Type } from "#app/data/type"; +import { getPartyLuckValue, modifierTypes } from "#app/modifier/modifier-type"; +import { TrainerSlot } from "#app/data/trainer-config"; +import { BattlerTagType } from "#enums/battler-tag-type"; +import { StatChangePhase } from "#app/phases/stat-change-phase"; +import { BattleStat } from "#app/data/battle-stat"; +import { getPokemonNameWithAffix } from "#app/messages"; + +/** the i18n namespace for this encounter */ +const namespace = "mysteryEncounter:teleportingHijinks"; + +const MONEY_COST_MULTIPLIER = 2.5; +const BIOME_CANDIDATES = [Biome.SPACE, Biome.FAIRY_CAVE, Biome.LABORATORY, Biome.ISLAND]; + +/** + * Teleporting Hijinks encounter. + * @see {@link https://github.com/AsdarDevelops/PokeRogue-Events/issues/119 | GitHub Issue #119} + * @see For biome requirements check {@linkcode mysteryEncountersByBiome} + */ +export const TeleportingHijinksEncounter: MysteryEncounter = + MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.TELEPORTING_HIJINKS) + .withEncounterTier(MysteryEncounterTier.COMMON) + .withSceneWaveRangeRequirement(10, 180) + .withSceneRequirement(new WaveModulusRequirement([1, 2, 3], 10)) // Must be in first 3 waves after boss wave + .withSceneRequirement(new MoneyRequirement(undefined, MONEY_COST_MULTIPLIER)) // Must be able to pay teleport cost + .withAutoHideIntroVisuals(false) + .withCatchAllowed(true) + .withIntroSpriteConfigs([ + { + spriteKey: "teleporter", + fileRoot: "mystery-encounters", + hasShadow: true, + y: 4 + } + ]) + .withIntroDialogue([ + { + text: `${namespace}.intro`, + } + ]) + .withTitle(`${namespace}.title`) + .withDescription(`${namespace}.description`) + .withQuery(`${namespace}.query`) + .withOnInit((scene: BattleScene) => { + const encounter = scene.currentBattle.mysteryEncounter; + const price = scene.getWaveMoneyAmount(MONEY_COST_MULTIPLIER); + encounter.setDialogueToken("price", price.toString()); + encounter.misc = { + price + }; + + return true; + }) + .withOption( + MysteryEncounterOptionBuilder + .newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT) + .withSceneMoneyRequirement(undefined, MONEY_COST_MULTIPLIER) // Must be able to pay teleport cost + .withDialogue({ + buttonLabel: `${namespace}.option.1.label`, + buttonTooltip: `${namespace}.option.1.tooltip`, + selected: [ + { + text: `${namespace}.option.1.selected`, + } + ], + }) + .withPreOptionPhase(async (scene: BattleScene) => { + // Update money + updatePlayerMoney(scene, -scene.currentBattle.mysteryEncounter.misc.price, true, false); + }) + .withOptionPhase(async (scene: BattleScene) => { + const encounter = scene.currentBattle.mysteryEncounter; + + // Calculate new biome (cannot be current biome) + const filteredBiomes = BIOME_CANDIDATES.filter(b => scene.arena.biomeType !== b); + const newBiome = filteredBiomes[randSeedInt(filteredBiomes.length)]; + + // Show dialogue + await showEncounterText(scene, `${namespace}.transport`); + await Promise.all([animateBiomeChange(scene, newBiome), transitionMysteryEncounterIntroVisuals(scene)]); + scene.playBgm(); + await showEncounterText(scene, `${namespace}.attacked`); + + // Init enemy + const level = (scene.currentBattle.enemyLevels?.[0] ?? scene.currentBattle.waveIndex) + Math.max(Math.round((scene.currentBattle.waveIndex / 10)), 0); + const bossSpecies = scene.arena.randomSpecies(scene.currentBattle.waveIndex, level, 0, getPartyLuckValue(scene.getParty()), true); + const bossPokemon = new EnemyPokemon(scene, bossSpecies, level, TrainerSlot.NONE, true); + encounter.setDialogueToken("enemyPokemon", getPokemonNameWithAffix(bossPokemon)); + const config: EnemyPartyConfig = { + pokemonConfigs: [{ + level: level, + species: bossSpecies, + dataSource: new PokemonData(bossPokemon), + isBoss: true, + tags: [BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON], + mysteryEncounterBattleEffects: (pokemon: Pokemon) => { + queueEncounterMessage(pokemon.scene, `${namespace}.boss_enraged`); + pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [BattleStat.ATK, BattleStat.DEF, BattleStat.SPATK, BattleStat.SPDEF, BattleStat.SPD], 1)); + } + }], + }; + + setEncounterRewards(scene, { fillRemaining: true }); + await initBattleWithEnemyConfig(scene, config); + }) + .build() + ) + .withOption( + MysteryEncounterOptionBuilder + .newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT) + .withPokemonTypeRequirement([Type.ELECTRIC, Type.STEEL], true, 1) // Must have Steel or Electric type + .withDialogue({ + buttonLabel: `${namespace}.option.2.label`, + buttonTooltip: `${namespace}.option.2.tooltip`, + selected: [ + { + text: `${namespace}.option.2.selected`, + } + ], + }) + .withOptionPhase(async (scene: BattleScene) => { + const encounter = scene.currentBattle.mysteryEncounter; + + // Calculate new biome (cannot be current biome) + const filteredBiomes = BIOME_CANDIDATES.filter(b => scene.arena.biomeType !== b); + const newBiome = filteredBiomes[randSeedInt(filteredBiomes.length)]; + + // Show dialogue + await showEncounterText(scene, `${namespace}.transport`); + await Promise.all([animateBiomeChange(scene, newBiome), transitionMysteryEncounterIntroVisuals(scene)]); + scene.playBgm(); + await showEncounterText(scene, `${namespace}.attacked`); + + // Init enemy + const level = (scene.currentBattle.enemyLevels?.[0] ?? scene.currentBattle.waveIndex) + Math.max(Math.round((scene.currentBattle.waveIndex / 10)), 0); + const bossSpecies = scene.arena.randomSpecies(scene.currentBattle.waveIndex, level, 0, getPartyLuckValue(scene.getParty()), true); + const bossPokemon = new EnemyPokemon(scene, bossSpecies, level, TrainerSlot.NONE, true); + encounter.setDialogueToken("enemyPokemon", getPokemonNameWithAffix(bossPokemon)); + const config: EnemyPartyConfig = { + pokemonConfigs: [{ + level: level, + species: bossSpecies, + dataSource: new PokemonData(bossPokemon), + isBoss: true, + tags: [BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON], + mysteryEncounterBattleEffects: (pokemon: Pokemon) => { + queueEncounterMessage(pokemon.scene, `${namespace}.boss_enraged`); + pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [BattleStat.ATK, BattleStat.DEF, BattleStat.SPATK, BattleStat.SPDEF, BattleStat.SPD], 1)); + } + }], + }; + + setEncounterRewards(scene, { fillRemaining: true }); + setEncounterExp(scene, encounter.selectedOption!.primaryPokemon!.id, 100); + await initBattleWithEnemyConfig(scene, config); + }) + .build() + ) + .withSimpleOption( + { + buttonLabel: `${namespace}.option.3.label`, + buttonTooltip: `${namespace}.option.3.tooltip`, + selected: [ + { + text: `${namespace}.option.3.selected`, + }, + ], + }, + async (scene: BattleScene) => { + // Inspect the Machine + const encounter = scene.currentBattle.mysteryEncounter; + + // Init enemy + const level = (scene.currentBattle.enemyLevels?.[0] ?? scene.currentBattle.waveIndex) + Math.max(Math.round((scene.currentBattle.waveIndex / 10)), 0); + const bossSpecies = scene.arena.randomSpecies(scene.currentBattle.waveIndex, level, 0, getPartyLuckValue(scene.getParty()), true); + const bossPokemon = new EnemyPokemon(scene, bossSpecies, level, TrainerSlot.NONE, true); + encounter.setDialogueToken("enemyPokemon", getPokemonNameWithAffix(bossPokemon)); + const config: EnemyPartyConfig = { + pokemonConfigs: [{ + level: level, + species: bossSpecies, + dataSource: new PokemonData(bossPokemon), + isBoss: true, + }], + }; + + 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); + } + ) + .build(); + +async function animateBiomeChange(scene: BattleScene, nextBiome: Biome) { + return new Promise(resolve => { + scene.tweens.add({ + targets: [scene.arenaEnemy, scene.lastEnemyTrainer], + x: "+=300", + duration: 2000, + onComplete: () => { + scene.newArena(nextBiome); + + const biomeKey = getBiomeKey(nextBiome); + const bgTexture = `${biomeKey}_bg`; + scene.arenaBgTransition.setTexture(bgTexture); + scene.arenaBgTransition.setAlpha(0); + scene.arenaBgTransition.setVisible(true); + scene.arenaPlayerTransition.setBiome(nextBiome); + scene.arenaPlayerTransition.setAlpha(0); + scene.arenaPlayerTransition.setVisible(true); + + scene.tweens.add({ + targets: [scene.arenaPlayer, scene.arenaBgTransition, scene.arenaPlayerTransition], + duration: 1000, + ease: "Sine.easeInOut", + alpha: (target: any) => target === scene.arenaPlayer ? 0 : 1, + onComplete: () => { + scene.arenaBg.setTexture(bgTexture); + scene.arenaPlayer.setBiome(nextBiome); + scene.arenaPlayer.setAlpha(1); + scene.arenaEnemy.setBiome(nextBiome); + scene.arenaEnemy.setAlpha(1); + scene.arenaNextEnemy.setBiome(nextBiome); + scene.arenaBgTransition.setVisible(false); + scene.arenaPlayerTransition.setVisible(false); + if (scene.lastEnemyTrainer) { + scene.lastEnemyTrainer.destroy(); + } + + resolve(); + + scene.tweens.add({ + targets: scene.arenaEnemy, + x: "-=300", + }); + } + }); + } + }); + }); +} diff --git a/src/data/mystery-encounters/mystery-encounter-requirements.ts b/src/data/mystery-encounters/mystery-encounter-requirements.ts index 4163ece8cd8..042f967a23d 100644 --- a/src/data/mystery-encounters/mystery-encounter-requirements.ts +++ b/src/data/mystery-encounters/mystery-encounter-requirements.ts @@ -153,7 +153,36 @@ export class WaveRangeRequirement extends EncounterSceneRequirement { } getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] { - return ["waveCount", scene.currentBattle.waveIndex.toString()]; + return ["waveIndex", scene.currentBattle.waveIndex.toString()]; + } +} + +export class WaveModulusRequirement extends EncounterSceneRequirement { + waveModuli: number[]; + modulusValue: number; + + /** + * Used for specifying a modulus requirement on the wave index + * For example, can be used to require the wave index to end with 1, 2, or 3 + * @param waveModuli - number[], the allowed modulus results + * @param modulusValue - number, the modulus calculation value + * + * Example: + * new WaveModulusRequirement([1, 2, 3], 10) will check for 1st/2nd/3rd waves that are immediately after a multiple of 10 wave + * So waves 21, 32, 53 all return true. 58, 14, 99 return false. + */ + constructor(waveModuli: number[], modulusValue: number) { + super(); + this.waveModuli = waveModuli; + this.modulusValue = modulusValue; + } + + meetsRequirement(scene: BattleScene): boolean { + return this.waveModuli.includes(scene.currentBattle.waveIndex % this.modulusValue); + } + + getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] { + return ["waveIndex", scene.currentBattle.waveIndex.toString()]; } } diff --git a/src/data/mystery-encounters/mystery-encounters.ts b/src/data/mystery-encounters/mystery-encounters.ts index b9e15302fe4..79a3b6ed635 100644 --- a/src/data/mystery-encounters/mystery-encounters.ts +++ b/src/data/mystery-encounters/mystery-encounters.ts @@ -26,6 +26,7 @@ import { PartTimerEncounter } from "#app/data/mystery-encounters/encounters/part import { DancingLessonsEncounter } from "#app/data/mystery-encounters/encounters/dancing-lessons-encounter"; 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"; // Spawn chance: (BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT + WIGHT_INCREMENT_ON_SPAWN_MISS * ) / 256 export const BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT = 1; @@ -169,7 +170,8 @@ const anyBiomeEncounters: MysteryEncounterType[] = [ MysteryEncounterType.TRASH_TO_TREASURE, MysteryEncounterType.BERRIES_ABOUND, MysteryEncounterType.CLOWNING_AROUND, - MysteryEncounterType.WEIRD_DREAM + MysteryEncounterType.WEIRD_DREAM, + MysteryEncounterType.TELEPORTING_HIJINKS ]; /** @@ -273,6 +275,7 @@ export function initMysteryEncounters() { allMysteryEncounters[MysteryEncounterType.DANCING_LESSONS] = DancingLessonsEncounter; allMysteryEncounters[MysteryEncounterType.WEIRD_DREAM] = WeirdDreamEncounter; allMysteryEncounters[MysteryEncounterType.THE_WINSTRATE_CHALLENGE] = TheWinstrateChallengeEncounter; + allMysteryEncounters[MysteryEncounterType.TELEPORTING_HIJINKS] = TeleportingHijinksEncounter; // Add extreme encounters to biome map extremeBiomeEncounters.forEach(encounter => { diff --git a/src/enums/mystery-encounter-type.ts b/src/enums/mystery-encounter-type.ts index f9871a1a3dd..b36a2c4ce41 100644 --- a/src/enums/mystery-encounter-type.ts +++ b/src/enums/mystery-encounter-type.ts @@ -23,5 +23,6 @@ export enum MysteryEncounterType { PART_TIMER, DANCING_LESSONS, WEIRD_DREAM, - THE_WINSTRATE_CHALLENGE + THE_WINSTRATE_CHALLENGE, + TELEPORTING_HIJINKS } diff --git a/src/locales/en/mystery-encounter.ts b/src/locales/en/mystery-encounter.ts index 2779900eeff..bb3bc043e75 100644 --- a/src/locales/en/mystery-encounter.ts +++ b/src/locales/en/mystery-encounter.ts @@ -23,6 +23,7 @@ import { partTimerDialogue } from "#app/locales/en/mystery-encounters/part-timer import { dancingLessonsDialogue } from "#app/locales/en/mystery-encounters/dancing-lessons-dialogue"; import { weirdDreamDialogue } from "#app/locales/en/mystery-encounters/weird-dream-dialogue"; import { theWinstrateChallengeDialogue } from "#app/locales/en/mystery-encounters/the-winstrate-challenge-dialogue"; +import { teleportingHijinksDialogue } from "#app/locales/en/mystery-encounters/teleporting-hijinks-dialogue"; /** * Injection patterns that can be used: @@ -73,5 +74,6 @@ export const mysteryEncounter = { partTimer: partTimerDialogue, dancingLessons: dancingLessonsDialogue, weirdDream: weirdDreamDialogue, - theWinstrateChallenge: theWinstrateChallengeDialogue + theWinstrateChallenge: theWinstrateChallengeDialogue, + teleportingHijinks: teleportingHijinksDialogue } as const; diff --git a/src/locales/en/mystery-encounters/teleporting-hijinks-dialogue.ts b/src/locales/en/mystery-encounters/teleporting-hijinks-dialogue.ts new file mode 100644 index 00000000000..5480b9fb720 --- /dev/null +++ b/src/locales/en/mystery-encounters/teleporting-hijinks-dialogue.ts @@ -0,0 +1,30 @@ +export const teleportingHijinksDialogue = { + intro: "It's a strange machine, whirring noisily...", + title: "Teleportating Hijinks", + description: "The machine has a sign on it that reads:\n \"To use, insert money then step into the capsule.\"\n\nPerhaps it can transport you somewhere...", + query: "What will you do?", + option: { + 1: { + label: "Put Money In", + tooltip: "(-) Pay {{price, money}}\n(?) Teleport to New Biome", + selected: "You insert some money, and the capsule opens.\nYou step inside...", + }, + 2: { + label: "A Pokémon Helps", + tooltip: "(-) {{option2PrimaryName}} Helps\n(+) {{option2PrimaryName}} gains EXP\n(?) Teleport to New Biome", + selected: `{{option2PrimaryName}} uses its typing and overloads the machine! + $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... + $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! + $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!" +}; diff --git a/src/overrides.ts b/src/overrides.ts index 1ec9df4b442..7d091243938 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.TELEPORTING_HIJINKS; // ------------------------- // MODIFIER / ITEM OVERRIDES From 36d60f5f9847b0b37c62c3215c05dc698f278335 Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Fri, 23 Aug 2024 16:37:34 -0400 Subject: [PATCH 259/270] add unit tests for Teleporting Hijinks --- .../teleporting-hijinks-encounter.ts | 104 +++--- .../teleporting-hijinks-dialogue.ts | 1 + src/overrides.ts | 4 +- .../teleporting-hijinks-encounter.test.ts | 300 ++++++++++++++++++ 4 files changed, 343 insertions(+), 66 deletions(-) create mode 100644 src/test/mystery-encounter/encounters/teleporting-hijinks-encounter.test.ts diff --git a/src/data/mystery-encounters/encounters/teleporting-hijinks-encounter.ts b/src/data/mystery-encounters/encounters/teleporting-hijinks-encounter.ts index c6c41445bd0..e4bc8b499bb 100644 --- a/src/data/mystery-encounters/encounters/teleporting-hijinks-encounter.ts +++ b/src/data/mystery-encounters/encounters/teleporting-hijinks-encounter.ts @@ -83,37 +83,7 @@ export const TeleportingHijinksEncounter: MysteryEncounter = updatePlayerMoney(scene, -scene.currentBattle.mysteryEncounter.misc.price, true, false); }) .withOptionPhase(async (scene: BattleScene) => { - const encounter = scene.currentBattle.mysteryEncounter; - - // Calculate new biome (cannot be current biome) - const filteredBiomes = BIOME_CANDIDATES.filter(b => scene.arena.biomeType !== b); - const newBiome = filteredBiomes[randSeedInt(filteredBiomes.length)]; - - // Show dialogue - await showEncounterText(scene, `${namespace}.transport`); - await Promise.all([animateBiomeChange(scene, newBiome), transitionMysteryEncounterIntroVisuals(scene)]); - scene.playBgm(); - await showEncounterText(scene, `${namespace}.attacked`); - - // Init enemy - const level = (scene.currentBattle.enemyLevels?.[0] ?? scene.currentBattle.waveIndex) + Math.max(Math.round((scene.currentBattle.waveIndex / 10)), 0); - const bossSpecies = scene.arena.randomSpecies(scene.currentBattle.waveIndex, level, 0, getPartyLuckValue(scene.getParty()), true); - const bossPokemon = new EnemyPokemon(scene, bossSpecies, level, TrainerSlot.NONE, true); - encounter.setDialogueToken("enemyPokemon", getPokemonNameWithAffix(bossPokemon)); - const config: EnemyPartyConfig = { - pokemonConfigs: [{ - level: level, - species: bossSpecies, - dataSource: new PokemonData(bossPokemon), - isBoss: true, - tags: [BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON], - mysteryEncounterBattleEffects: (pokemon: Pokemon) => { - queueEncounterMessage(pokemon.scene, `${namespace}.boss_enraged`); - pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [BattleStat.ATK, BattleStat.DEF, BattleStat.SPATK, BattleStat.SPDEF, BattleStat.SPD], 1)); - } - }], - }; - + const config: EnemyPartyConfig = await doBiomeTransitionDialogueAndBattleInit(scene); setEncounterRewards(scene, { fillRemaining: true }); await initBattleWithEnemyConfig(scene, config); }) @@ -121,11 +91,12 @@ export const TeleportingHijinksEncounter: MysteryEncounter = ) .withOption( MysteryEncounterOptionBuilder - .newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT) + .newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_SPECIAL) .withPokemonTypeRequirement([Type.ELECTRIC, Type.STEEL], true, 1) // Must have Steel or Electric type .withDialogue({ buttonLabel: `${namespace}.option.2.label`, buttonTooltip: `${namespace}.option.2.tooltip`, + disabledButtonTooltip: `${namespace}.option.2.disabled_tooltip`, selected: [ { text: `${namespace}.option.2.selected`, @@ -133,39 +104,9 @@ export const TeleportingHijinksEncounter: MysteryEncounter = ], }) .withOptionPhase(async (scene: BattleScene) => { - const encounter = scene.currentBattle.mysteryEncounter; - - // Calculate new biome (cannot be current biome) - const filteredBiomes = BIOME_CANDIDATES.filter(b => scene.arena.biomeType !== b); - const newBiome = filteredBiomes[randSeedInt(filteredBiomes.length)]; - - // Show dialogue - await showEncounterText(scene, `${namespace}.transport`); - await Promise.all([animateBiomeChange(scene, newBiome), transitionMysteryEncounterIntroVisuals(scene)]); - scene.playBgm(); - await showEncounterText(scene, `${namespace}.attacked`); - - // Init enemy - const level = (scene.currentBattle.enemyLevels?.[0] ?? scene.currentBattle.waveIndex) + Math.max(Math.round((scene.currentBattle.waveIndex / 10)), 0); - const bossSpecies = scene.arena.randomSpecies(scene.currentBattle.waveIndex, level, 0, getPartyLuckValue(scene.getParty()), true); - const bossPokemon = new EnemyPokemon(scene, bossSpecies, level, TrainerSlot.NONE, true); - encounter.setDialogueToken("enemyPokemon", getPokemonNameWithAffix(bossPokemon)); - const config: EnemyPartyConfig = { - pokemonConfigs: [{ - level: level, - species: bossSpecies, - dataSource: new PokemonData(bossPokemon), - isBoss: true, - tags: [BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON], - mysteryEncounterBattleEffects: (pokemon: Pokemon) => { - queueEncounterMessage(pokemon.scene, `${namespace}.boss_enraged`); - pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [BattleStat.ATK, BattleStat.DEF, BattleStat.SPATK, BattleStat.SPDEF, BattleStat.SPD], 1)); - } - }], - }; - + const config: EnemyPartyConfig = await doBiomeTransitionDialogueAndBattleInit(scene); setEncounterRewards(scene, { fillRemaining: true }); - setEncounterExp(scene, encounter.selectedOption!.primaryPokemon!.id, 100); + setEncounterExp(scene, scene.currentBattle.mysteryEncounter.selectedOption!.primaryPokemon!.id, 100); await initBattleWithEnemyConfig(scene, config); }) .build() @@ -208,6 +149,41 @@ export const TeleportingHijinksEncounter: MysteryEncounter = ) .build(); +async function doBiomeTransitionDialogueAndBattleInit(scene: BattleScene) { + const encounter = scene.currentBattle.mysteryEncounter; + + // Calculate new biome (cannot be current biome) + const filteredBiomes = BIOME_CANDIDATES.filter(b => scene.arena.biomeType !== b); + const newBiome = filteredBiomes[randSeedInt(filteredBiomes.length)]; + + // Show dialogue and transition biome + await showEncounterText(scene, `${namespace}.transport`); + await Promise.all([animateBiomeChange(scene, newBiome), transitionMysteryEncounterIntroVisuals(scene)]); + scene.playBgm(); + await showEncounterText(scene, `${namespace}.attacked`); + + // Init enemy + const level = (scene.currentBattle.enemyLevels?.[0] ?? scene.currentBattle.waveIndex) + Math.max(Math.round((scene.currentBattle.waveIndex / 10)), 0); + const bossSpecies = scene.arena.randomSpecies(scene.currentBattle.waveIndex, level, 0, getPartyLuckValue(scene.getParty()), true); + const bossPokemon = new EnemyPokemon(scene, bossSpecies, level, TrainerSlot.NONE, true); + encounter.setDialogueToken("enemyPokemon", getPokemonNameWithAffix(bossPokemon)); + const config: EnemyPartyConfig = { + pokemonConfigs: [{ + level: level, + species: bossSpecies, + dataSource: new PokemonData(bossPokemon), + isBoss: true, + tags: [BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON], + mysteryEncounterBattleEffects: (pokemon: Pokemon) => { + queueEncounterMessage(pokemon.scene, `${namespace}.boss_enraged`); + pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [BattleStat.ATK, BattleStat.DEF, BattleStat.SPATK, BattleStat.SPDEF, BattleStat.SPD], 1)); + } + }], + }; + + return config; +} + async function animateBiomeChange(scene: BattleScene, nextBiome: Biome) { return new Promise(resolve => { scene.tweens.add({ diff --git a/src/locales/en/mystery-encounters/teleporting-hijinks-dialogue.ts b/src/locales/en/mystery-encounters/teleporting-hijinks-dialogue.ts index 5480b9fb720..2cf13e21882 100644 --- a/src/locales/en/mystery-encounters/teleporting-hijinks-dialogue.ts +++ b/src/locales/en/mystery-encounters/teleporting-hijinks-dialogue.ts @@ -12,6 +12,7 @@ export const teleportingHijinksDialogue = { 2: { 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}} uses its typing and overloads the machine! $The capsule opens, and you step inside...` }, diff --git a/src/overrides.ts b/src/overrides.ts index 7d091243938..1ec9df4b442 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 = 256; + readonly MYSTERY_ENCOUNTER_RATE_OVERRIDE: number | null = null; readonly MYSTERY_ENCOUNTER_TIER_OVERRIDE: MysteryEncounterTier | null = null; - readonly MYSTERY_ENCOUNTER_OVERRIDE: MysteryEncounterType | null = MysteryEncounterType.TELEPORTING_HIJINKS; + readonly MYSTERY_ENCOUNTER_OVERRIDE: MysteryEncounterType | null = null; // ------------------------- // MODIFIER / ITEM OVERRIDES diff --git a/src/test/mystery-encounter/encounters/teleporting-hijinks-encounter.test.ts b/src/test/mystery-encounter/encounters/teleporting-hijinks-encounter.test.ts new file mode 100644 index 00000000000..cd88846de7b --- /dev/null +++ b/src/test/mystery-encounter/encounters/teleporting-hijinks-encounter.test.ts @@ -0,0 +1,300 @@ +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/encounterTestUtils"; +import BattleScene from "#app/battle-scene"; +import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; +import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; +import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; +import { MysteryEncounterPhase } from "#app/phases/mystery-encounter-phases"; +import { CommandPhase } from "#app/phases/command-phase"; +import { TeleportingHijinksEncounter } from "#app/data/mystery-encounters/encounters/teleporting-hijinks-encounter"; +import { SelectModifierPhase } from "#app/phases/select-modifier-phase"; +import { Mode } from "#app/ui/ui"; +import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; + +const namespace = "mysteryEncounter:teleportingHijinks"; +const defaultParty = [Species.LAPRAS, Species.GENGAR, Species.ABRA]; +const defaultBiome = Biome.CAVE; +const defaultWave = 45; + +describe("Teleporting Hijinks - 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; + scene.money = 20000; + 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.TELEPORTING_HIJINKS]], + ]) + ); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + vi.clearAllMocks(); + vi.resetAllMocks(); + }); + + it("should have the correct properties", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.TELEPORTING_HIJINKS, defaultParty); + + expect(TeleportingHijinksEncounter.encounterType).toBe(MysteryEncounterType.TELEPORTING_HIJINKS); + expect(TeleportingHijinksEncounter.encounterTier).toBe(MysteryEncounterTier.COMMON); + expect(TeleportingHijinksEncounter.dialogue).toBeDefined(); + expect(TeleportingHijinksEncounter.dialogue.intro).toStrictEqual([{ text: `${namespace}.intro` }]); + expect(TeleportingHijinksEncounter.dialogue.encounterOptionsDialogue?.title).toBe(`${namespace}.title`); + expect(TeleportingHijinksEncounter.dialogue.encounterOptionsDialogue?.description).toBe(`${namespace}.description`); + expect(TeleportingHijinksEncounter.dialogue.encounterOptionsDialogue?.query).toBe(`${namespace}.query`); + expect(TeleportingHijinksEncounter.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.TELEPORTING_HIJINKS); + }); + + it("should not run above wave 179", async () => { + game.override.startingWave(181); + + await game.runToMysteryEncounter(); + + expect(scene.currentBattle.mysteryEncounter).toBeUndefined(); + }); + + it("should run in waves that are X1", async () => { + game.override.startingWave(11); + game.override.mysteryEncounterTier(MysteryEncounterTier.COMMON); + + await game.runToMysteryEncounter(); + + expect(scene.currentBattle?.mysteryEncounter?.encounterType).toBe(MysteryEncounterType.TELEPORTING_HIJINKS); + }); + + it("should run in waves that are X2", async () => { + game.override.startingWave(32); + game.override.mysteryEncounterTier(MysteryEncounterTier.COMMON); + + await game.runToMysteryEncounter(); + + expect(scene.currentBattle?.mysteryEncounter?.encounterType).toBe(MysteryEncounterType.TELEPORTING_HIJINKS); + }); + + it("should run in waves that are X3", async () => { + game.override.startingWave(23); + game.override.mysteryEncounterTier(MysteryEncounterTier.COMMON); + + await game.runToMysteryEncounter(); + + expect(scene.currentBattle?.mysteryEncounter?.encounterType).toBe(MysteryEncounterType.TELEPORTING_HIJINKS); + }); + + it("should NOT run in waves that are not X1, X2, or X3", async () => { + game.override.startingWave(54); + + await game.runToMysteryEncounter(); + + expect(scene.currentBattle.mysteryEncounter).not.toBe(MysteryEncounterType.TELEPORTING_HIJINKS); + }); + + it("should initialize fully", async () => { + initSceneWithoutEncounterPhase(scene, defaultParty); + scene.currentBattle.mysteryEncounter = TeleportingHijinksEncounter; + + const { onInit } = TeleportingHijinksEncounter; + + expect(TeleportingHijinksEncounter.onInit).toBeDefined(); + + TeleportingHijinksEncounter.populateDialogueTokensFromRequirements(scene); + const onInitResult = onInit!(scene); + + expect(TeleportingHijinksEncounter.misc.price).toBeDefined(); + expect(TeleportingHijinksEncounter.dialogueTokens.price).toBeDefined(); + expect(onInitResult).toBe(true); + }); + + describe("Option 1 - Pay Money", () => { + it("should have the correct properties", () => { + const option = TeleportingHijinksEncounter.options[0]; + expect(option.optionMode).toBe(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT); + expect(option.dialogue).toBeDefined(); + expect(option.dialogue).toStrictEqual({ + buttonLabel: `${namespace}.option.1.label`, + buttonTooltip: `${namespace}.option.1.tooltip`, + selected: [ + { + text: `${namespace}.option.1.selected`, + }, + ], + }); + }); + + 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(); + 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, 1); + + 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 be selectable if the player has enough money", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.TELEPORTING_HIJINKS, defaultParty); + await runMysteryEncounterToEnd(game, 1, undefined, true); + + expect(scene.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name); + }); + + it("should transport to a new area", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.TELEPORTING_HIJINKS, defaultParty); + + const previousBiome = scene.arena.biomeType; + + await runMysteryEncounterToEnd(game, 1, undefined, true); + + expect(previousBiome).not.toBe(scene.arena.biomeType); + expect([Biome.SPACE, Biome.ISLAND, Biome.LABORATORY, Biome.FAIRY_CAVE]).toContain(scene.arena.biomeType); + }); + + it("should start a battle against an enraged boss", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.TELEPORTING_HIJINKS, defaultParty); + await runMysteryEncounterToEnd(game, 1, undefined, true); + const enemyField = scene.getEnemyField(); + expect(enemyField[0].summonData.battleStats).toEqual([1, 1, 1, 1, 1, 0, 0]); + expect(enemyField[0].isBoss()).toBe(true); + }); + }); + + describe("Option 2 - Attempt to Steal", () => { + it("should have the correct properties", () => { + const option = TeleportingHijinksEncounter.options[1]; + expect(option.optionMode).toBe(MysteryEncounterOptionMode.DISABLED_OR_SPECIAL); + expect(option.dialogue).toBeDefined(); + expect(option.dialogue).toStrictEqual({ + buttonLabel: `${namespace}.option.2.label`, + buttonTooltip: `${namespace}.option.2.tooltip`, + disabledButtonTooltip: `${namespace}.option.2.disabled_tooltip`, + selected: [ + { + text: `${namespace}.option.2.selected`, + } + ], + }); + }); + + it("should NOT be selectable if the player doesn't the right type pokemon", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.TELEPORTING_HIJINKS, [Species.BLASTOISE]); + 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 be selectable if the player has the right type pokemon", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.TELEPORTING_HIJINKS, [Species.METAGROSS]); + await runMysteryEncounterToEnd(game, 2, undefined, true); + + expect(scene.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name); + }); + + it("should transport to a new area", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.TELEPORTING_HIJINKS, [Species.PIKACHU]); + + const previousBiome = scene.arena.biomeType; + + await runMysteryEncounterToEnd(game, 2, undefined, true); + + expect(previousBiome).not.toBe(scene.arena.biomeType); + expect([Biome.SPACE, Biome.ISLAND, Biome.LABORATORY, Biome.FAIRY_CAVE]).toContain(scene.arena.biomeType); + }); + + it("should start a battle against an enraged boss", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.TELEPORTING_HIJINKS, [Species.PIKACHU]); + await runMysteryEncounterToEnd(game, 2, undefined, true); + const enemyField = scene.getEnemyField(); + expect(enemyField[0].summonData.battleStats).toEqual([1, 1, 1, 1, 1, 0, 0]); + expect(enemyField[0].isBoss()).toBe(true); + }); + }); + + describe("Option 3 - Inspect the Machine", () => { + it("should have the correct properties", () => { + const option = TeleportingHijinksEncounter.options[2]; + expect(option.optionMode).toBe(MysteryEncounterOptionMode.DEFAULT); + expect(option.dialogue).toBeDefined(); + expect(option.dialogue).toStrictEqual({ + buttonLabel: `${namespace}.option.3.label`, + buttonTooltip: `${namespace}.option.3.tooltip`, + selected: [ + { + text: `${namespace}.option.3.selected`, + }, + ], + }); + }); + + it("should start a battle against a boss", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.TELEPORTING_HIJINKS, defaultParty); + await runMysteryEncounterToEnd(game, 3, undefined, true); + const enemyField = scene.getEnemyField(); + expect(enemyField[0].summonData.battleStats).toEqual([0, 0, 0, 0, 0, 0, 0]); + expect(enemyField[0].isBoss()).toBe(true); + }); + + it("should have Magnet and Metal Coat in rewards after battle", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.TELEPORTING_HIJINKS, defaultParty); + await runMysteryEncounterToEnd(game, 3, undefined, true); + await skipBattleRunMysteryEncounterRewardsPhase(game); + await game.phaseInterceptor.to(SelectModifierPhase, false); + 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.some(opt => opt.modifierTypeOption.type.name === "Metal Coat")).toBe(true); + expect(modifierSelectHandler.options.some(opt => opt.modifierTypeOption.type.name === "Magnet")).toBe(true); + }); + }); +}); From 13e7f7907961215b7dd74ab3fa13d7432bc4bb2c Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Fri, 23 Aug 2024 17:22:22 -0400 Subject: [PATCH 260/270] small change to teleporting hijinks dialogue --- .../encounters/teleporting-hijinks-encounter.ts | 3 ++- .../en/mystery-encounters/teleporting-hijinks-dialogue.ts | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/data/mystery-encounters/encounters/teleporting-hijinks-encounter.ts b/src/data/mystery-encounters/encounters/teleporting-hijinks-encounter.ts index e4bc8b499bb..346a736fbe9 100644 --- a/src/data/mystery-encounters/encounters/teleporting-hijinks-encounter.ts +++ b/src/data/mystery-encounters/encounters/teleporting-hijinks-encounter.ts @@ -25,6 +25,7 @@ const namespace = "mysteryEncounter:teleportingHijinks"; const MONEY_COST_MULTIPLIER = 2.5; const BIOME_CANDIDATES = [Biome.SPACE, Biome.FAIRY_CAVE, Biome.LABORATORY, Biome.ISLAND]; +const MACHINE_INTERFACING_TYPES = [Type.ELECTRIC, Type.FLYING]; /** * Teleporting Hijinks encounter. @@ -92,7 +93,7 @@ export const TeleportingHijinksEncounter: MysteryEncounter = .withOption( MysteryEncounterOptionBuilder .newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_SPECIAL) - .withPokemonTypeRequirement([Type.ELECTRIC, Type.STEEL], true, 1) // Must have Steel or Electric type + .withPokemonTypeRequirement(MACHINE_INTERFACING_TYPES, true, 1) // Must have Steel or Electric type .withDialogue({ buttonLabel: `${namespace}.option.2.label`, buttonTooltip: `${namespace}.option.2.tooltip`, diff --git a/src/locales/en/mystery-encounters/teleporting-hijinks-dialogue.ts b/src/locales/en/mystery-encounters/teleporting-hijinks-dialogue.ts index 2cf13e21882..4a6c1fc7b08 100644 --- a/src/locales/en/mystery-encounters/teleporting-hijinks-dialogue.ts +++ b/src/locales/en/mystery-encounters/teleporting-hijinks-dialogue.ts @@ -13,7 +13,7 @@ export const teleportingHijinksDialogue = { 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}} uses its typing and overloads the machine! + selected: `{{option2PrimaryName}}'s Type allows it to bypass the machine's paywall! $The capsule opens, and you step inside...` }, 3: { From 24fb80801aeeb07982eba2e98a1565509c0e23c0 Mon Sep 17 00:00:00 2001 From: flx-sta <50131232+flx-sta@users.noreply.github.com> Date: Fri, 23 Aug 2024 14:58:32 -0700 Subject: [PATCH 261/270] migrate ME translations to json --- src/locales/en/mystery-encounter.ts | 52 +++++++------- .../a-trainers-test-dialogue.json | 47 +++++++++++++ .../a-trainers-test-dialogue.ts | 67 ------------------- .../absolute-avarice-dialogue.json | 25 +++++++ .../absolute-avarice-dialogue.ts | 30 --------- .../an-offer-you-cant-refuse-dialogue.json | 26 +++++++ .../an-offer-you-cant-refuse-dialogue.ts | 33 --------- .../berries-abound-dialogue.json | 26 +++++++ .../berries-abound-dialogue.ts | 29 -------- .../clowning-around-dialogue.json | 34 ++++++++++ .../clowning-around-dialogue.ts | 34 ---------- .../dancing-lessons-dialogue.json | 27 ++++++++ .../dancing-lessons-dialogue.ts | 30 --------- .../dark-deal-dialogue.json | 24 +++++++ .../mystery-encounters/dark-deal-dialogue.ts | 29 -------- .../delibirdy-dialogue.json | 29 ++++++++ .../mystery-encounters/delibirdy-dialogue.ts | 31 --------- .../department-store-sale-dialogue.json | 27 ++++++++ .../department-store-sale-dialogue.ts | 29 -------- .../field-trip-dialogue.json | 28 ++++++++ .../mystery-encounters/field-trip-dialogue.ts | 33 --------- .../fiery-fallout-dialogue.json | 26 +++++++ .../fiery-fallout-dialogue.ts | 30 --------- .../fight-or-flight-dialogue.json | 24 +++++++ .../fight-or-flight-dialogue.ts | 26 ------- .../lost-at-sea-dialogue.json | 28 ++++++++ .../lost-at-sea-dialogue.ts | 31 --------- .../mysterious-challengers-dialogue.json | 22 ++++++ .../mysterious-challengers-dialogue.ts | 22 ------ .../mysterious-chest-dialogue.json | 23 +++++++ .../mysterious-chest-dialogue.ts | 27 -------- .../part-timer-dialogue.json | 31 +++++++++ .../mystery-encounters/part-timer-dialogue.ts | 34 ---------- .../safari-zone-dialogue.json | 46 +++++++++++++ .../safari-zone-dialogue.ts | 46 ------------- .../shady-vitamin-dealer-dialogue.json | 29 ++++++++ .../shady-vitamin-dealer-dialogue.ts | 35 ---------- .../slumbering-snorlax-dialogue.json | 25 +++++++ .../slumbering-snorlax-dialogue.ts | 28 -------- .../teleporting-hijinks-dialogue.json | 27 ++++++++ .../teleporting-hijinks-dialogue.ts | 31 --------- .../the-pokemon-salesman-dialogue.json | 23 +++++++ .../the-pokemon-salesman-dialogue.ts | 26 ------- .../the-strong-stuff-dialogue.json | 21 ++++++ .../the-strong-stuff-dialogue.ts | 25 ------- .../the-winstrate-challenge-dialogue.json | 21 ++++++ .../the-winstrate-challenge-dialogue.ts | 24 ------- .../training-session-dialogue.json | 28 ++++++++ .../training-session-dialogue.ts | 31 --------- .../trash-to-treasure-dialogue.json | 19 ++++++ .../trash-to-treasure-dialogue.ts | 22 ------ .../weird-dream-dialogue.json | 22 ++++++ .../weird-dream-dialogue.ts | 29 -------- 53 files changed, 734 insertions(+), 838 deletions(-) create mode 100644 src/locales/en/mystery-encounters/a-trainers-test-dialogue.json delete mode 100644 src/locales/en/mystery-encounters/a-trainers-test-dialogue.ts create mode 100644 src/locales/en/mystery-encounters/absolute-avarice-dialogue.json delete mode 100644 src/locales/en/mystery-encounters/absolute-avarice-dialogue.ts create mode 100644 src/locales/en/mystery-encounters/an-offer-you-cant-refuse-dialogue.json delete mode 100644 src/locales/en/mystery-encounters/an-offer-you-cant-refuse-dialogue.ts create mode 100644 src/locales/en/mystery-encounters/berries-abound-dialogue.json delete mode 100644 src/locales/en/mystery-encounters/berries-abound-dialogue.ts create mode 100644 src/locales/en/mystery-encounters/clowning-around-dialogue.json delete mode 100644 src/locales/en/mystery-encounters/clowning-around-dialogue.ts create mode 100644 src/locales/en/mystery-encounters/dancing-lessons-dialogue.json delete mode 100644 src/locales/en/mystery-encounters/dancing-lessons-dialogue.ts create mode 100644 src/locales/en/mystery-encounters/dark-deal-dialogue.json delete mode 100644 src/locales/en/mystery-encounters/dark-deal-dialogue.ts create mode 100644 src/locales/en/mystery-encounters/delibirdy-dialogue.json delete mode 100644 src/locales/en/mystery-encounters/delibirdy-dialogue.ts create mode 100644 src/locales/en/mystery-encounters/department-store-sale-dialogue.json delete mode 100644 src/locales/en/mystery-encounters/department-store-sale-dialogue.ts create mode 100644 src/locales/en/mystery-encounters/field-trip-dialogue.json delete mode 100644 src/locales/en/mystery-encounters/field-trip-dialogue.ts create mode 100644 src/locales/en/mystery-encounters/fiery-fallout-dialogue.json delete mode 100644 src/locales/en/mystery-encounters/fiery-fallout-dialogue.ts create mode 100644 src/locales/en/mystery-encounters/fight-or-flight-dialogue.json delete mode 100644 src/locales/en/mystery-encounters/fight-or-flight-dialogue.ts create mode 100644 src/locales/en/mystery-encounters/lost-at-sea-dialogue.json delete mode 100644 src/locales/en/mystery-encounters/lost-at-sea-dialogue.ts create mode 100644 src/locales/en/mystery-encounters/mysterious-challengers-dialogue.json delete mode 100644 src/locales/en/mystery-encounters/mysterious-challengers-dialogue.ts create mode 100644 src/locales/en/mystery-encounters/mysterious-chest-dialogue.json delete mode 100644 src/locales/en/mystery-encounters/mysterious-chest-dialogue.ts create mode 100644 src/locales/en/mystery-encounters/part-timer-dialogue.json delete mode 100644 src/locales/en/mystery-encounters/part-timer-dialogue.ts create mode 100644 src/locales/en/mystery-encounters/safari-zone-dialogue.json delete mode 100644 src/locales/en/mystery-encounters/safari-zone-dialogue.ts create mode 100644 src/locales/en/mystery-encounters/shady-vitamin-dealer-dialogue.json delete mode 100644 src/locales/en/mystery-encounters/shady-vitamin-dealer-dialogue.ts create mode 100644 src/locales/en/mystery-encounters/slumbering-snorlax-dialogue.json delete mode 100644 src/locales/en/mystery-encounters/slumbering-snorlax-dialogue.ts create mode 100644 src/locales/en/mystery-encounters/teleporting-hijinks-dialogue.json delete mode 100644 src/locales/en/mystery-encounters/teleporting-hijinks-dialogue.ts create mode 100644 src/locales/en/mystery-encounters/the-pokemon-salesman-dialogue.json delete mode 100644 src/locales/en/mystery-encounters/the-pokemon-salesman-dialogue.ts create mode 100644 src/locales/en/mystery-encounters/the-strong-stuff-dialogue.json delete mode 100644 src/locales/en/mystery-encounters/the-strong-stuff-dialogue.ts create mode 100644 src/locales/en/mystery-encounters/the-winstrate-challenge-dialogue.json delete mode 100644 src/locales/en/mystery-encounters/the-winstrate-challenge-dialogue.ts create mode 100644 src/locales/en/mystery-encounters/training-session-dialogue.json delete mode 100644 src/locales/en/mystery-encounters/training-session-dialogue.ts create mode 100644 src/locales/en/mystery-encounters/trash-to-treasure-dialogue.json delete mode 100644 src/locales/en/mystery-encounters/trash-to-treasure-dialogue.ts create mode 100644 src/locales/en/mystery-encounters/weird-dream-dialogue.json delete mode 100644 src/locales/en/mystery-encounters/weird-dream-dialogue.ts diff --git a/src/locales/en/mystery-encounter.ts b/src/locales/en/mystery-encounter.ts index bb3bc043e75..7328c2d5b1b 100644 --- a/src/locales/en/mystery-encounter.ts +++ b/src/locales/en/mystery-encounter.ts @@ -1,29 +1,29 @@ -import { lostAtSeaDialogue } from "./mystery-encounters/lost-at-sea-dialogue"; -import { mysteriousChestDialogue } from "#app/locales/en/mystery-encounters/mysterious-chest-dialogue"; -import { mysteriousChallengersDialogue } from "#app/locales/en/mystery-encounters/mysterious-challengers-dialogue"; -import { darkDealDialogue } from "#app/locales/en/mystery-encounters/dark-deal-dialogue"; -import { departmentStoreSaleDialogue } from "#app/locales/en/mystery-encounters/department-store-sale-dialogue"; -import { fieldTripDialogue } from "#app/locales/en/mystery-encounters/field-trip-dialogue"; -import { fieryFalloutDialogue } from "#app/locales/en/mystery-encounters/fiery-fallout-dialogue"; -import { fightOrFlightDialogue } from "#app/locales/en/mystery-encounters/fight-or-flight-dialogue"; -import { safariZoneDialogue } from "#app/locales/en/mystery-encounters/safari-zone-dialogue"; -import { shadyVitaminDealerDialogue } from "#app/locales/en/mystery-encounters/shady-vitamin-dealer-dialogue"; -import { slumberingSnorlaxDialogue } from "#app/locales/en/mystery-encounters/slumbering-snorlax-dialogue"; -import { trainingSessionDialogue } from "#app/locales/en/mystery-encounters/training-session-dialogue"; -import { theStrongStuffDialogue } from "#app/locales/en/mystery-encounters/the-strong-stuff-dialogue"; -import { thePokemonSalesmanDialogue } from "#app/locales/en/mystery-encounters/the-pokemon-salesman-dialogue"; -import { anOfferYouCantRefuseDialogue } from "#app/locales/en/mystery-encounters/an-offer-you-cant-refuse-dialogue"; -import { delibirdyDialogue } from "#app/locales/en/mystery-encounters/delibirdy-dialogue"; -import { absoluteAvariceDialogue } from "#app/locales/en/mystery-encounters/absolute-avarice-dialogue"; -import { aTrainersTestDialogue } from "#app/locales/en/mystery-encounters/a-trainers-test-dialogue"; -import { trashToTreasureDialogue } from "#app/locales/en/mystery-encounters/trash-to-treasure-dialogue"; -import { berriesAboundDialogue } from "#app/locales/en/mystery-encounters/berries-abound-dialogue"; -import { clowningAroundDialogue } from "#app/locales/en/mystery-encounters/clowning-around-dialogue"; -import { partTimerDialogue } from "#app/locales/en/mystery-encounters/part-timer-dialogue"; -import { dancingLessonsDialogue } from "#app/locales/en/mystery-encounters/dancing-lessons-dialogue"; -import { weirdDreamDialogue } from "#app/locales/en/mystery-encounters/weird-dream-dialogue"; -import { theWinstrateChallengeDialogue } from "#app/locales/en/mystery-encounters/the-winstrate-challenge-dialogue"; -import { teleportingHijinksDialogue } from "#app/locales/en/mystery-encounters/teleporting-hijinks-dialogue"; +import lostAtSeaDialogue from "./mystery-encounters/lost-at-sea-dialogue.json"; +import mysteriousChestDialogue from "#app/locales/en/mystery-encounters/mysterious-chest-dialogue.json"; +import mysteriousChallengersDialogue from "#app/locales/en/mystery-encounters/mysterious-challengers-dialogue.json"; +import darkDealDialogue from "#app/locales/en/mystery-encounters/dark-deal-dialogue.json"; +import departmentStoreSaleDialogue from "#app/locales/en/mystery-encounters/department-store-sale-dialogue.json"; +import fieldTripDialogue from "#app/locales/en/mystery-encounters/field-trip-dialogue.json"; +import fieryFalloutDialogue from "#app/locales/en/mystery-encounters/fiery-fallout-dialogue.json"; +import fightOrFlightDialogue from "#app/locales/en/mystery-encounters/fight-or-flight-dialogue.json"; +import safariZoneDialogue from "#app/locales/en/mystery-encounters/safari-zone-dialogue.json"; +import shadyVitaminDealerDialogue from "#app/locales/en/mystery-encounters/shady-vitamin-dealer-dialogue.json"; +import slumberingSnorlaxDialogue from "#app/locales/en/mystery-encounters/slumbering-snorlax-dialogue.json"; +import trainingSessionDialogue from "#app/locales/en/mystery-encounters/training-session-dialogue.json"; +import theStrongStuffDialogue from "#app/locales/en/mystery-encounters/the-strong-stuff-dialogue.json"; +import thePokemonSalesmanDialogue from "#app/locales/en/mystery-encounters/the-pokemon-salesman-dialogue.json"; +import anOfferYouCantRefuseDialogue from "#app/locales/en/mystery-encounters/an-offer-you-cant-refuse-dialogue.json"; +import delibirdyDialogue from "#app/locales/en/mystery-encounters/delibirdy-dialogue.json"; +import absoluteAvariceDialogue from "#app/locales/en/mystery-encounters/absolute-avarice-dialogue.json"; +import aTrainersTestDialogue from "#app/locales/en/mystery-encounters/a-trainers-test-dialogue.json"; +import trashToTreasureDialogue from "#app/locales/en/mystery-encounters/trash-to-treasure-dialogue.json"; +import berriesAboundDialogue from "#app/locales/en/mystery-encounters/berries-abound-dialogue.json"; +import clowningAroundDialogue from "#app/locales/en/mystery-encounters/clowning-around-dialogue.json"; +import partTimerDialogue from "#app/locales/en/mystery-encounters/part-timer-dialogue.json"; +import dancingLessonsDialogue from "#app/locales/en/mystery-encounters/dancing-lessons-dialogue.json"; +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"; /** * Injection patterns that can be used: diff --git a/src/locales/en/mystery-encounters/a-trainers-test-dialogue.json b/src/locales/en/mystery-encounters/a-trainers-test-dialogue.json new file mode 100644 index 00000000000..a28d31841a3 --- /dev/null +++ b/src/locales/en/mystery-encounters/a-trainers-test-dialogue.json @@ -0,0 +1,47 @@ +{ + "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!", + "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." + }, + "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!", + "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." + }, + "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.", + "accept": "... I see.", + "decline": "... I see.\n $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!", + "accept": "You'll battle Mira?\nYay!", + "decline": "Aww, no battle?\nThat's okay!\n $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!", + "accept": "That look you have...\nLet's do this.", + "decline": "I understand, your team looks beat up.\n $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.", + "query": "What will you do?", + "option": { + "1": { + "label": "Accept the Challenge", + "tooltip": "(-) Tough Battle\n(+) Gain a @[TOOLTIP_TITLE]{Very Rare Egg}" + }, + "2": { + "label": "Refuse the Challenge", + "tooltip": "(+) Full Heal Party\n(+) Gain an @[TOOLTIP_TITLE]{Egg}" + } + }, + "eggTypes": { + "rare": "a Rare Egg", + "epic": "an Epic Egg", + "legendary": "a Legendary Egg" + }, + "outro": "{{statTrainerName}} gave you {{eggType}}!" +} \ No newline at end of file diff --git a/src/locales/en/mystery-encounters/a-trainers-test-dialogue.ts b/src/locales/en/mystery-encounters/a-trainers-test-dialogue.ts deleted file mode 100644 index 13fe8209c19..00000000000 --- a/src/locales/en/mystery-encounters/a-trainers-test-dialogue.ts +++ /dev/null @@ -1,67 +0,0 @@ -export const aTrainersTestDialogue = { - intro: "An extremely strong trainer approaches you...", - buck: { - 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. - $Here, let me help with that.` - }, - cheryl: { - 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. - $Here, let me help with that.` - }, - marley: { - 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. - $Your Pokémon look hurt...\nLet me help.` - }, - mira: { - 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! - $Here, Mira will heal your team!` - }, - riley: { - 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. - $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.", - query: "What will you do?", - option: { - 1: { - label: "Accept the Challenge", - tooltip: "(-) Tough Battle\n(+) Gain a @[TOOLTIP_TITLE]{Very Rare Egg}" - }, - 2: { - label: "Refuse the Challenge", - tooltip: "(+) Full Heal Party\n(+) Gain an @[TOOLTIP_TITLE]{Egg}", - }, - }, - eggTypes: { - rare: "a Rare Egg", - epic: "an Epic Egg", - legendary: "a Legendary Egg" - }, - outro: "{{statTrainerName}} gave you {{eggType}}!" -}; diff --git a/src/locales/en/mystery-encounters/absolute-avarice-dialogue.json b/src/locales/en/mystery-encounters/absolute-avarice-dialogue.json new file mode 100644 index 00000000000..9e58b3ec8ac --- /dev/null +++ b/src/locales/en/mystery-encounters/absolute-avarice-dialogue.json @@ -0,0 +1,25 @@ +{ + "intro": "A Greedent ambushes you\nand steals your party's berries!", + "title": "Absolute Avarice", + "description": "The Greedent has caught you totally off guard now all your berries are gone!\n\nThe Greedent looks like it's about to eat them when it pauses to look at you, interested.", + "query": "What will you do?", + "option": { + "1": { + "label": "Battle It", + "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!" + }, + "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." + }, + "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!" + } + } +} \ No newline at end of file diff --git a/src/locales/en/mystery-encounters/absolute-avarice-dialogue.ts b/src/locales/en/mystery-encounters/absolute-avarice-dialogue.ts deleted file mode 100644 index afd1597219d..00000000000 --- a/src/locales/en/mystery-encounters/absolute-avarice-dialogue.ts +++ /dev/null @@ -1,30 +0,0 @@ -export const absoluteAvariceDialogue = { - intro: "A Greedent ambushes you\nand steals your party's berries!", - title: "Absolute Avarice", - description: "The Greedent has caught you totally off guard now all your berries are gone!\n\nThe Greedent looks like it's about to eat them when it pauses to look at you, interested.", - query: "What will you do?", - option: { - 1: { - label: "Battle It", - 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! - $@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. - $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! - $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!`, - }, - } -}; 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 new file mode 100644 index 00000000000..30665fdb5d1 --- /dev/null +++ b/src/locales/en/mystery-encounters/an-offer-you-cant-refuse-dialogue.json @@ -0,0 +1,26 @@ +{ + "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!", + "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?", + "option": { + "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!" + }, + "2": { + "label": "Extort the Kid", + "tooltip": "(+) {{option2PrimaryName}} uses {{moveOrAbility}}\n(+) Gain {{price, money}}", + "tooltip_disabled": "Your Pokémon need to have certain moves or abilities to choose this", + "selected": "My word, we're being robbed, Liepard!\n $You'll be hearing from my lawyers for this!" + }, + "3": { + "label": "Leave", + "tooltip": "(-) No Rewards", + "selected": "What a rotten day...\n $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/an-offer-you-cant-refuse-dialogue.ts b/src/locales/en/mystery-encounters/an-offer-you-cant-refuse-dialogue.ts deleted file mode 100644 index 1148b5c1425..00000000000 --- a/src/locales/en/mystery-encounters/an-offer-you-cant-refuse-dialogue.ts +++ /dev/null @@ -1,33 +0,0 @@ -export const anOfferYouCantRefuseDialogue = { - intro: "You're stopped by a rich looking boy.", - speaker: "Rich Boy", - 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?", - option: { - 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}}! - $It's time to show you off to everyone at the yacht club! - $They'll be so jealous!`, - }, - 2: { - label: "Extort the Kid", - tooltip: "(+) {{option2PrimaryName}} uses {{moveOrAbility}}\n(+) Gain {{price, money}}", - tooltip_disabled: "Your Pokémon need to have certain moves or abilities to choose this", - selected: `My word, we're being robbed, Liepard! - $You'll be hearing from my lawyers for this!`, - }, - 3: { - label: "Leave", - tooltip: "(-) No Rewards", - selected: `What a rotten day... - $Ah, well. Let's return to the yacht club then, Liepard.`, - } - }, -}; diff --git a/src/locales/en/mystery-encounters/berries-abound-dialogue.json b/src/locales/en/mystery-encounters/berries-abound-dialogue.json new file mode 100644 index 00000000000..1a6ed26e661 --- /dev/null +++ b/src/locales/en/mystery-encounters/berries-abound-dialogue.json @@ -0,0 +1,26 @@ +{ + "intro": "There's a huge berry bush\nnear that Pokémon!", + "title": "Berries Abound", + "description": "It looks like there's a strong Pokémon guarding a berry bush. Battling is the straightforward approach, but this Pokémon looks strong. Maybe a fast Pokémon would be able to grab some without getting caught?", + "query": "What will you do?", + "berries": "Berries!", + "option": { + "1": { + "label": "Battle the Pokémon", + "tooltip": "(-) Hard Battle\n(+) Gain Berries", + "selected": "You approach the\nPokémon without fear." + }, + "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!", + "boss_enraged": "The opposing {{enemyPokemon}} has become enraged!" + }, + "3": { + "label": "Leave", + "tooltip": "(-) No Rewards", + "selected": "You leave the strong Pokémon\nwith its prize and continue on." + } + } +} \ No newline at end of file diff --git a/src/locales/en/mystery-encounters/berries-abound-dialogue.ts b/src/locales/en/mystery-encounters/berries-abound-dialogue.ts deleted file mode 100644 index c17a989821d..00000000000 --- a/src/locales/en/mystery-encounters/berries-abound-dialogue.ts +++ /dev/null @@ -1,29 +0,0 @@ -export const berriesAboundDialogue = { - intro: "There's a huge berry bush\nnear that Pokémon!", - title: "Berries Abound", - description: "It looks like there's a strong Pokémon guarding a berry bush. Battling is the straightforward approach, but this Pokémon looks strong. Maybe a fast Pokémon would be able to grab some without getting caught?", - query: "What will you do?", - berries: "Berries!", - option: { - 1: { - label: "Battle the Pokémon", - tooltip: "(-) Hard Battle\n(+) Gain Berries", - selected: "You approach the\nPokémon without fear.", - }, - 2: { - label: "Race to the Bush", - tooltip: "(-) {{fastestPokemon}} Uses its Speed\n(+) Gain Berries", - 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: { - label: "Leave", - tooltip: "(-) No Rewards", - selected: "You leave the strong Pokémon\nwith its prize and continue on.", - }, - } -}; diff --git a/src/locales/en/mystery-encounters/clowning-around-dialogue.json b/src/locales/en/mystery-encounters/clowning-around-dialogue.json new file mode 100644 index 00000000000..8aa8a8b74d9 --- /dev/null +++ b/src/locales/en/mystery-encounters/clowning-around-dialogue.json @@ -0,0 +1,34 @@ +{ + "intro": "It's...@d{64} a clown?", + "speaker": "Clown", + "intro_dialogue": "Bumbling buffoon, brace for a brilliant battle!\nYou'll be beaten by this brawling busker!", + "title": "Clowning Around", + "description": "Something is off about this encounter. The clown seems eager to goad you into a battle, but to what end?\n\nThe Blacephalon is especially strange, like it has @[TOOLTIP_TITLE]{weird types and ability.}", + "query": "What will you do?", + "option": { + "1": { + "label": "Battle the Clown", + "tooltip": "(-) Strange Battle\n(?) Affects Pokémon Abilities", + "selected": "Your pitiful Pokémon are poised for a pathetic performance!", + "apply_ability_dialogue": "A sensational showcase!\nYour savvy suits a sensational skill as spoils!", + "apply_ability_message": "The clown is offering to permanently Skill Swap one of your Pokémon's ability to {{ability}}!", + "ability_prompt": "Would you like to permanently teach a Pokémon the {{ability}} ability?", + "ability_gained": "@s{level_up_fanfare}{{chosenPokemon}} gained the {{ability}} ability!" + }, + "2": { + "label": "Remain Unprovoked", + "tooltip": "(-) Upsets the Clown\n(?) Affects Pokémon Items", + "selected": "Dismal dodger, you deny a delightful duel?\nFeel my fury!", + "selected_2": "The clown's Blacephalon uses Trick!\nAll of your {{switchPokemon}}'s items were randomly swapped!", + "selected_3": "Flustered fool, fall for my flawless deception!" + }, + "3": { + "label": "Return the Insults", + "tooltip": "(-) Upsets the Clown\n(?) Affects Pokémon Types", + "selected": "Dismal dodger, you deny a delightful duel?\nFeel my fury!", + "selected_2": "The clown's Blacephalon uses a strange move!\nAll of your team's types were randomly swapped!", + "selected_3": "Flustered fool, fall for my flawless deception!" + } + }, + "outro": "The clown and his cohorts\ndisappear in a puff of smoke." +} \ No newline at end of file diff --git a/src/locales/en/mystery-encounters/clowning-around-dialogue.ts b/src/locales/en/mystery-encounters/clowning-around-dialogue.ts deleted file mode 100644 index 87dc0169b87..00000000000 --- a/src/locales/en/mystery-encounters/clowning-around-dialogue.ts +++ /dev/null @@ -1,34 +0,0 @@ -export const clowningAroundDialogue = { - intro: "It's...@d{64} a clown?", - speaker: "Clown", - intro_dialogue: "Bumbling buffoon, brace for a brilliant battle!\nYou'll be beaten by this brawling busker!", - title: "Clowning Around", - description: "Something is off about this encounter. The clown seems eager to goad you into a battle, but to what end?\n\nThe Blacephalon is especially strange, like it has @[TOOLTIP_TITLE]{weird types and ability.}", - query: "What will you do?", - option: { - 1: { - label: "Battle the Clown", - tooltip: "(-) Strange Battle\n(?) Affects Pokémon Abilities", - selected: "Your pitiful Pokémon are poised for a pathetic performance!", - apply_ability_dialogue: "A sensational showcase!\nYour savvy suits a sensational skill as spoils!", - apply_ability_message: "The clown is offering to permanently Skill Swap one of your Pokémon's ability to {{ability}}!", - ability_prompt: "Would you like to permanently teach a Pokémon the {{ability}} ability?", - ability_gained: "@s{level_up_fanfare}{{chosenPokemon}} gained the {{ability}} ability!" - }, - 2: { - label: "Remain Unprovoked", - tooltip: "(-) Upsets the Clown\n(?) Affects Pokémon Items", - selected: "Dismal dodger, you deny a delightful duel?\nFeel my fury!", - selected_2: "The clown's Blacephalon uses Trick!\nAll of your {{switchPokemon}}'s items were randomly swapped!", - selected_3: "Flustered fool, fall for my flawless deception!", - }, - 3: { - label: "Return the Insults", - tooltip: "(-) Upsets the Clown\n(?) Affects Pokémon Types", - selected: "Dismal dodger, you deny a delightful duel?\nFeel my fury!", - selected_2: "The clown's Blacephalon uses a strange move!\nAll of your team's types were randomly swapped!", - selected_3: "Flustered fool, fall for my flawless deception!", - }, - }, - outro: "The clown and his cohorts\ndisappear in a puff of smoke." -}; diff --git a/src/locales/en/mystery-encounters/dancing-lessons-dialogue.json b/src/locales/en/mystery-encounters/dancing-lessons-dialogue.json new file mode 100644 index 00000000000..bd75ab13f24 --- /dev/null +++ b/src/locales/en/mystery-encounters/dancing-lessons-dialogue.json @@ -0,0 +1,27 @@ +{ + "intro": "An Oricorio dances sadly alone, without a partner.", + "title": "Dancing Lessons", + "description": "The Oricorio doesn't seem aggressive, if anything it seems sad.\n\nMaybe it just wants someone to dance with...", + "query": "What will you do?", + "option": { + "1": { + "label": "Battle It", + "tooltip": "(-) Tough Battle\n(+) Gain a Baton", + "selected": "The Oricorio is distraught and moves to defend itself!", + "boss_enraged": "The Oricorio's fear boosted its stats!" + }, + "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!" + }, + "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!" + } + }, + "invalid_selection": "This Pokémon doesn't know a Dance move" +} \ No newline at end of file diff --git a/src/locales/en/mystery-encounters/dancing-lessons-dialogue.ts b/src/locales/en/mystery-encounters/dancing-lessons-dialogue.ts deleted file mode 100644 index 23e0bd60650..00000000000 --- a/src/locales/en/mystery-encounters/dancing-lessons-dialogue.ts +++ /dev/null @@ -1,30 +0,0 @@ -export const dancingLessonsDialogue = { - intro: "An Oricorio dances sadly alone, without a partner.", - title: "Dancing Lessons", - description: "The Oricorio doesn't seem aggressive, if anything it seems sad.\n\nMaybe it just wants someone to dance with...", - query: "What will you do?", - option: { - 1: { - label: "Battle It", - tooltip: "(-) Tough Battle\n(+) Gain a Baton", - selected: "The Oricorio is distraught and moves to defend itself!", - boss_enraged: "The Oricorio's fear boosted its stats!" - }, - 2: { - label: "Learn Its Dance", - tooltip: "(+) Teach a Pokémon 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}}! - $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 new file mode 100644 index 00000000000..d3a94a312d3 --- /dev/null +++ b/src/locales/en/mystery-encounters/dark-deal-dialogue.json @@ -0,0 +1,24 @@ + + +{ + "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.", + "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?", + "option": { + "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!" + }, + "2": { + "label": "Refuse", + "tooltip": "(-) No Rewards", + "selected": "Not gonna help a poor fellow out?\nPah!" + } + }, + "outro": "After the harrowing encounter,\nyou collect yourself and depart." +} \ No newline at end of file diff --git a/src/locales/en/mystery-encounters/dark-deal-dialogue.ts b/src/locales/en/mystery-encounters/dark-deal-dialogue.ts deleted file mode 100644 index 113209bf61a..00000000000 --- a/src/locales/en/mystery-encounters/dark-deal-dialogue.ts +++ /dev/null @@ -1,29 +0,0 @@ -export const darkDealDialogue = { - intro: "A strange man in a tattered coat\nstands in your way...", - speaker: "Shady Guy", - 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?", - option: { - 1: { - label: "Accept", - tooltip: "(+) 5 Rogue Balls\n(?) Enhance a Random Pokémon", - 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", - tooltip: "(-) No Rewards", - selected: "Not gonna help a poor fellow out?\nPah!", - } - }, - outro: "After the harrowing encounter,\nyou collect yourself and depart." -}; diff --git a/src/locales/en/mystery-encounters/delibirdy-dialogue.json b/src/locales/en/mystery-encounters/delibirdy-dialogue.json new file mode 100644 index 00000000000..d5bdf608663 --- /dev/null +++ b/src/locales/en/mystery-encounters/delibirdy-dialogue.json @@ -0,0 +1,29 @@ + + +{ + "intro": "A pack of Delibird have appeared!", + "title": "Delibir-dy", + "description": "The Delibirds are looking at you expectantly, as if they want something. Perhaps giving them an item or some money would satisfy them?", + "query": "What will you give them?", + "invalid_selection": "Pokémon doesn't have that kind of item.", + "option": { + "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!" + }, + "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!" + }, + "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!" + } + }, + "outro": "The Delibird pack happily waddles off into the distance.\n $What a curious little exchange!" +} \ No newline at end of file diff --git a/src/locales/en/mystery-encounters/delibirdy-dialogue.ts b/src/locales/en/mystery-encounters/delibirdy-dialogue.ts deleted file mode 100644 index 2cca9416382..00000000000 --- a/src/locales/en/mystery-encounters/delibirdy-dialogue.ts +++ /dev/null @@ -1,31 +0,0 @@ -export const delibirdyDialogue = { - intro: "A pack of Delibird have appeared!", - title: "Delibir-dy", - description: "The Delibirds are looking at you expectantly, as if they want something. Perhaps giving them an item or some money would satisfy them?", - query: "What will you give them?", - invalid_selection: "Pokémon doesn't have that kind of item.", - option: { - 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. - $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. - $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. - $They turn back to you and happily give you a present!`, - }, - }, - outro: `The Delibird pack happily waddles off into the distance. - $What a curious little exchange!` -}; diff --git a/src/locales/en/mystery-encounters/department-store-sale-dialogue.json b/src/locales/en/mystery-encounters/department-store-sale-dialogue.json new file mode 100644 index 00000000000..d7ef07f7462 --- /dev/null +++ b/src/locales/en/mystery-encounters/department-store-sale-dialogue.json @@ -0,0 +1,27 @@ +{ + "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!", + "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?", + "option": { + "1": { + "label": "TM Counter", + "tooltip": "(+) TM Shop" + }, + "2": { + "label": "Vitamin Counter", + "tooltip": "(+) Vitamin Shop" + }, + "3": { + "label": "Battle Item Counter", + "tooltip": "(+) X Item Shop" + }, + "4": { + "label": "Pokéball Counter", + "tooltip": "(+) Pokéball Shop" + } + }, + "outro": "What a deal! You should shop there more often." +} \ No newline at end of file diff --git a/src/locales/en/mystery-encounters/department-store-sale-dialogue.ts b/src/locales/en/mystery-encounters/department-store-sale-dialogue.ts deleted file mode 100644 index 5b7fe9a0af0..00000000000 --- a/src/locales/en/mystery-encounters/department-store-sale-dialogue.ts +++ /dev/null @@ -1,29 +0,0 @@ -export const departmentStoreSaleDialogue = { - intro: "It's a lady with a ton of shopping bags.", - speaker: "Shopper", - 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?", - option: { - 1: { - label: "TM Counter", - tooltip: "(+) TM Shop", - }, - 2: { - label: "Vitamin Counter", - tooltip: "(+) Vitamin Shop", - }, - 3: { - label: "Battle Item Counter", - tooltip: "(+) X Item Shop", - }, - 4: { - label: "Pokéball Counter", - tooltip: "(+) Pokéball Shop", - }, - }, - outro: "What a deal! You should shop there more often." -}; diff --git a/src/locales/en/mystery-encounters/field-trip-dialogue.json b/src/locales/en/mystery-encounters/field-trip-dialogue.json new file mode 100644 index 00000000000..1bb58be363b --- /dev/null +++ b/src/locales/en/mystery-encounters/field-trip-dialogue.json @@ -0,0 +1,28 @@ +{ + "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?", + "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?", + "option": { + "1": { + "label": "A Physical Move", + "tooltip": "(+) Physical Item Rewards" + }, + "2": { + "label": "A Special Move", + "tooltip": "(+) Special Item Rewards" + }, + "3": { + "label": "A Status Move", + "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." + }, + "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!", + "outro_bad": "Come along children, we'll\nfind a better demonstration elsewhere." +} \ No newline at end of file diff --git a/src/locales/en/mystery-encounters/field-trip-dialogue.ts b/src/locales/en/mystery-encounters/field-trip-dialogue.ts deleted file mode 100644 index 62ee175e073..00000000000 --- a/src/locales/en/mystery-encounters/field-trip-dialogue.ts +++ /dev/null @@ -1,33 +0,0 @@ -export const fieldTripDialogue = { - 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? - $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?", - option: { - 1: { - label: "A Physical Move", - tooltip: "(+) Physical Item Rewards", - }, - 2: { - label: "A Special Move", - tooltip: "(+) Special Item Rewards", - }, - 3: { - label: "A Status Move", - tooltip: "(+) Status Item Rewards", - }, - selected: "{{pokeName}} shows off an awesome display of {{move}}!", - 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!", - outro_bad: "Come along children, we'll\nfind a better demonstration elsewhere." -}; diff --git a/src/locales/en/mystery-encounters/fiery-fallout-dialogue.json b/src/locales/en/mystery-encounters/fiery-fallout-dialogue.json new file mode 100644 index 00000000000..5c36f3a8b99 --- /dev/null +++ b/src/locales/en/mystery-encounters/fiery-fallout-dialogue.json @@ -0,0 +1,26 @@ +{ + "intro": "You encounter a blistering storm of smoke and ash!", + "title": "Fiery Fallout", + "description": "The whirling ash and embers have cut visibility to nearly zero. It seems like there might be some... source that is causing these conditions. But what could be behind a phenomenon of this magnitude?", + "query": "What will you do?", + "option": { + "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!" + }, + "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!", + "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." + } + }, + "found_charcoal": "After the weather clears,\nyour {{leadPokemon}} spots something on the ground.\n $@s{item_fanfare}{{leadPokemon}} gained a Charcoal!" +} \ No newline at end of file diff --git a/src/locales/en/mystery-encounters/fiery-fallout-dialogue.ts b/src/locales/en/mystery-encounters/fiery-fallout-dialogue.ts deleted file mode 100644 index c8c5813b25e..00000000000 --- a/src/locales/en/mystery-encounters/fiery-fallout-dialogue.ts +++ /dev/null @@ -1,30 +0,0 @@ -export const fieryFalloutDialogue = { - intro: "You encounter a blistering storm of smoke and ash!", - title: "Fiery Fallout", - description: "The whirling ash and embers have cut visibility to nearly zero. It seems like there might be some... source that is causing these conditions. But what could be behind a phenomenon of this magnitude?", - query: "What will you do?", - option: { - 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! - $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! - $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! - $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. - $@s{item_fanfare}{{leadPokemon}} gained a Charcoal!` -}; diff --git a/src/locales/en/mystery-encounters/fight-or-flight-dialogue.json b/src/locales/en/mystery-encounters/fight-or-flight-dialogue.json new file mode 100644 index 00000000000..3ba99b7ba17 --- /dev/null +++ b/src/locales/en/mystery-encounters/fight-or-flight-dialogue.json @@ -0,0 +1,24 @@ +{ + "intro": "Something shiny is sparkling\non the ground near that Pokémon!", + "title": "Fight or Flight", + "description": "It looks like there's a strong Pokémon guarding an item. Battling is the straightforward approach, but this Pokémon looks strong. You could also try to sneak around, though the Pokémon might catch you.", + "query": "What will you do?", + "option": { + "1": { + "label": "Battle the Pokémon", + "tooltip": "(-) Hard Battle\n(+) New Item", + "selected": "You approach the\nPokémon without fear." + }, + "2": { + "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!" + }, + "3": { + "label": "Leave", + "tooltip": "(-) No Rewards", + "selected": "You leave the strong Pokémon\nwith its prize and continue on." + } + } +} \ No newline at end of file diff --git a/src/locales/en/mystery-encounters/fight-or-flight-dialogue.ts b/src/locales/en/mystery-encounters/fight-or-flight-dialogue.ts deleted file mode 100644 index 7ce80b42d9b..00000000000 --- a/src/locales/en/mystery-encounters/fight-or-flight-dialogue.ts +++ /dev/null @@ -1,26 +0,0 @@ -export const fightOrFlightDialogue = { - intro: "Something shiny is sparkling\non the ground near that Pokémon!", - title: "Fight or Flight", - description: "It looks like there's a strong Pokémon guarding an item. Battling is the straightforward approach, but this Pokémon looks strong. You could also try to sneak around, though the Pokémon might catch you.", - query: "What will you do?", - option: { - 1: { - label: "Battle the Pokémon", - tooltip: "(-) Hard Battle\n(+) New Item", - selected: "You approach the\nPokémon without fear.", - }, - 2: { - 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} - $Your {{option2PrimaryName}} helps you out and uses {{option2PrimaryMove}}! - $You nabbed the item!`, - }, - 3: { - label: "Leave", - tooltip: "(-) No Rewards", - selected: "You leave the strong Pokémon\nwith its prize and continue on.", - }, - } -}; diff --git a/src/locales/en/mystery-encounters/lost-at-sea-dialogue.json b/src/locales/en/mystery-encounters/lost-at-sea-dialogue.json new file mode 100644 index 00000000000..8e10a39b479 --- /dev/null +++ b/src/locales/en/mystery-encounters/lost-at-sea-dialogue.json @@ -0,0 +1,28 @@ +{ + "intro": "Wandering aimlessly through the sea, you've effectively gotten nowhere.", + "title": "Lost at Sea", + "description": "The sea is turbulent in this area, and you're running out of energy.\nThis is bad. Is there a way out of the situation?", + "query": "What will you do?", + "option": { + "1": { + "label": "{{option1PrimaryName}} Might Help", + "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!" + }, + "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!" + }, + "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." + } + }, + "outro": "You are back on track." +} \ No newline at end of file diff --git a/src/locales/en/mystery-encounters/lost-at-sea-dialogue.ts b/src/locales/en/mystery-encounters/lost-at-sea-dialogue.ts deleted file mode 100644 index 16b7661e174..00000000000 --- a/src/locales/en/mystery-encounters/lost-at-sea-dialogue.ts +++ /dev/null @@ -1,31 +0,0 @@ -export const lostAtSeaDialogue = { - intro: "Wandering aimlessly through the sea, you've effectively gotten nowhere.", - title: "Lost at Sea", - description: "The sea is turbulent in this area, and you're running out of energy.\nThis is bad. Is there a way out of the situation?", - query: "What will you do?", - option: { - 1: { - label: "{{option1PrimaryName}} Might Help", - 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. - \${{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. - \${{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. - $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-challengers-dialogue.json b/src/locales/en/mystery-encounters/mysterious-challengers-dialogue.json new file mode 100644 index 00000000000..01f4e6092eb --- /dev/null +++ b/src/locales/en/mystery-encounters/mysterious-challengers-dialogue.json @@ -0,0 +1,22 @@ +{ + "intro": "Mysterious challengers have appeared!", + "title": "Mysterious Challengers", + "description": "If you defeat a challenger, you might impress them enough to receive a boon. But some look tough, are you up to the challenge?", + "query": "Who will you battle?", + "option": { + "1": { + "label": "A Clever, Mindful Foe", + "tooltip": "(-) Standard Battle\n(+) Move Item Rewards" + }, + "2": { + "label": "A Strong Foe", + "tooltip": "(-) Hard Battle\n(+) Good Rewards" + }, + "3": { + "label": "The Mightiest Foe", + "tooltip": "(-) Brutal Battle\n(+) Great Rewards" + }, + "selected": "The trainer steps forward..." + }, + "outro": "The mysterious challenger was defeated!" +} \ No newline at end of file diff --git a/src/locales/en/mystery-encounters/mysterious-challengers-dialogue.ts b/src/locales/en/mystery-encounters/mysterious-challengers-dialogue.ts deleted file mode 100644 index 8586a524fb1..00000000000 --- a/src/locales/en/mystery-encounters/mysterious-challengers-dialogue.ts +++ /dev/null @@ -1,22 +0,0 @@ -export const mysteriousChallengersDialogue = { - intro: "Mysterious challengers have appeared!", - title: "Mysterious Challengers", - description: "If you defeat a challenger, you might impress them enough to receive a boon. But some look tough, are you up to the challenge?", - query: "Who will you battle?", - option: { - 1: { - label: "A Clever, Mindful Foe", - tooltip: "(-) Standard Battle\n(+) Move Item Rewards", - }, - 2: { - label: "A Strong Foe", - tooltip: "(-) Hard Battle\n(+) Good Rewards", - }, - 3: { - label: "The Mightiest Foe", - tooltip: "(-) Brutal Battle\n(+) Great Rewards", - }, - selected: "The trainer steps forward...", - }, - outro: "The mysterious challenger was defeated!" -}; diff --git a/src/locales/en/mystery-encounters/mysterious-chest-dialogue.json b/src/locales/en/mystery-encounters/mysterious-chest-dialogue.json new file mode 100644 index 00000000000..cbe5df1cda8 --- /dev/null +++ b/src/locales/en/mystery-encounters/mysterious-chest-dialogue.json @@ -0,0 +1,23 @@ +{ + "intro": "You found...@d{32} a chest?", + "title": "The Mysterious Chest", + "description": "A beautifully ornamented chest stands on the ground. There must be something good inside... right?", + "query": "Will you open it?", + "option": { + "1": { + "label": "Open It", + "tooltip": "@[SUMMARY_BLUE]{(35%) Something terrible}\n@[SUMMARY_GREEN]{(40%) Okay Rewards}\n@[SUMMARY_GREEN]{(20%) Good Rewards}\n@[SUMMARY_GREEN]{(4%) Great Rewards}\n@[SUMMARY_GREEN]{(1%) Amazing Rewards}", + "selected": "You open the chest to find...", + "normal": "Just some normal tools and items.", + "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." + }, + "2": { + "label": "Too Risky, Leave", + "tooltip": "(-) No Rewards", + "selected": "You hurry along your way,\nwith a slight feeling of regret." + } + } +} \ No newline at end of file diff --git a/src/locales/en/mystery-encounters/mysterious-chest-dialogue.ts b/src/locales/en/mystery-encounters/mysterious-chest-dialogue.ts deleted file mode 100644 index f351851ebaf..00000000000 --- a/src/locales/en/mystery-encounters/mysterious-chest-dialogue.ts +++ /dev/null @@ -1,27 +0,0 @@ -export const mysteriousChestDialogue = { - intro: "You found...@d{32} a chest?", - title: "The Mysterious Chest", - description: "A beautifully ornamented chest stands on the ground. There must be something good inside... right?", - query: "Will you open it?", - option: { - 1: { - label: "Open It", - tooltip: "@[SUMMARY_BLUE]{(35%) Something terrible}\n@[SUMMARY_GREEN]{(40%) Okay Rewards}\n@[SUMMARY_GREEN]{(20%) Good Rewards}\n@[SUMMARY_GREEN]{(4%) Great Rewards}\n@[SUMMARY_GREEN]{(1%) Amazing Rewards}", - selected: "You open the chest to find...", - normal: "Just some normal tools and items.", - 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! - $Your {{pokeName}} jumps in front of you\nbut is KOed in the process.`, - }, - 2: { - label: "Too Risky, Leave", - tooltip: "(-) No Rewards", - selected: "You hurry along your way,\nwith a slight feeling of regret.", - }, - } -}; - - - diff --git a/src/locales/en/mystery-encounters/part-timer-dialogue.json b/src/locales/en/mystery-encounters/part-timer-dialogue.json new file mode 100644 index 00000000000..918b1fb61b8 --- /dev/null +++ b/src/locales/en/mystery-encounters/part-timer-dialogue.json @@ -0,0 +1,31 @@ +{ + "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!", + "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?", + "invalid_selection": "Pokémon must be healthy enough.", + "option": { + "1": { + "label": "Make Deliveries", + "tooltip": "(-) Your Pokémon Uses its Speed\n(+) Earn @[MONEY]{Money}", + "selected": "Your {{selectedPokemon}} works a shift delivering orders to customers." + }, + "2": { + "label": "Warehouse Work", + "tooltip": "(-) Your Pokémon Uses its Strength and Endurance\n(+) Earn @[MONEY]{Money}", + "selected": "Your {{selectedPokemon}} works a shift moving items around the warehouse." + }, + "3": { + "label": "Sales Assistant", + "tooltip": "(-) Your {{option3PrimaryName}} uses {{option3PrimaryMove}}\n(+) Earn @[MONEY]{Money}", + "disabled_tooltip": "Your Pokémon need to know certain moves for this job", + "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.", + "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/part-timer-dialogue.ts b/src/locales/en/mystery-encounters/part-timer-dialogue.ts deleted file mode 100644 index ea7f50fbc08..00000000000 --- a/src/locales/en/mystery-encounters/part-timer-dialogue.ts +++ /dev/null @@ -1,34 +0,0 @@ -export const partTimerDialogue = { - intro: "A busy worker flags you down.", - speaker: "Worker", - 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?", - invalid_selection: "Pokémon must be healthy enough.", - option: { - 1: { - label: "Make Deliveries", - tooltip: "(-) Your Pokémon Uses its Speed\n(+) Earn @[MONEY]{Money}", - selected: "Your {{selectedPokemon}} works a shift delivering orders to customers.", - }, - 2: { - label: "Warehouse Work", - tooltip: "(-) Your Pokémon Uses its Strength and Endurance\n(+) Earn @[MONEY]{Money}", - selected: "Your {{selectedPokemon}} works a shift moving items around the warehouse.", - }, - 3: { - label: "Sales Assistant", - tooltip: "(-) Your {{option3PrimaryName}} uses {{option3PrimaryMove}}\n(+) Earn @[MONEY]{Money}", - disabled_tooltip: "Your Pokémon need to know certain moves for this job", - 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! - $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!" -}; diff --git a/src/locales/en/mystery-encounters/safari-zone-dialogue.json b/src/locales/en/mystery-encounters/safari-zone-dialogue.json new file mode 100644 index 00000000000..8869f2055e5 --- /dev/null +++ b/src/locales/en/mystery-encounters/safari-zone-dialogue.json @@ -0,0 +1,46 @@ +{ + "intro": "It's a safari zone!", + "title": "The Safari Zone", + "description": "There are all kinds of rare and special Pokémon that can be found here!\nIf you choose to enter, you'll have a time limit of 3 wild encounters where you can try to catch these special Pokémon.\n\nBeware, though. These Pokémon may flee before you're able to catch them!", + "query": "Would you like to enter?", + "option": { + "1": { + "label": "Enter", + "tooltip": "(-) Pay {{option1Money, money}}\n@[SUMMARY_GREEN]{(?) Safari Zone}", + "selected": "Time to test your luck!" + }, + "2": { + "label": "Leave", + "tooltip": "(-) No Rewards", + "selected": "You hurry along your way,\nwith a slight feeling of regret." + } + }, + "safari": { + "1": { + "label": "Throw a Pokéball", + "tooltip": "(+) Throw a Pokéball", + "selected": "You throw a Pokéball!" + }, + "2": { + "label": "Throw Bait", + "tooltip": "(+) Increases Capture Rate\n(-) Chance to Increase Flee Rate", + "selected": "You throw some bait!" + }, + "3": { + "label": "Throw Mud", + "tooltip": "(+) Decreases Flee Rate\n(-) Chance to Decrease Capture Rate", + "selected": "You throw some mud!" + }, + "4": { + "label": "Flee", + "tooltip": "(?) Flee from this Pokémon" + }, + "watching": "{{pokemonName}} is watching carefully!", + "eating": "{{pokemonName}} is eating!", + "busy_eating": "{{pokemonName}} is busy eating!", + "angry": "{{pokemonName}} is angry!", + "beside_itself_angry": "{{pokemonName}} is beside itself with anger!", + "remaining_count": "{{remainingCount}} Pokémon remaining!" + }, + "outro": "That was a fun little excursion!" +} \ No newline at end of file diff --git a/src/locales/en/mystery-encounters/safari-zone-dialogue.ts b/src/locales/en/mystery-encounters/safari-zone-dialogue.ts deleted file mode 100644 index 20d03567b83..00000000000 --- a/src/locales/en/mystery-encounters/safari-zone-dialogue.ts +++ /dev/null @@ -1,46 +0,0 @@ -export const safariZoneDialogue = { - intro: "It's a safari zone!", - title: "The Safari Zone", - description: "There are all kinds of rare and special Pokémon that can be found here!\nIf you choose to enter, you'll have a time limit of 3 wild encounters where you can try to catch these special Pokémon.\n\nBeware, though. These Pokémon may flee before you're able to catch them!", - query: "Would you like to enter?", - option: { - 1: { - label: "Enter", - tooltip: "(-) Pay {{option1Money, money}}\n@[SUMMARY_GREEN]{(?) Safari Zone}", - selected: "Time to test your luck!", - }, - 2: { - label: "Leave", - tooltip: "(-) No Rewards", - selected: "You hurry along your way,\nwith a slight feeling of regret.", - }, - }, - safari: { - 1: { - label: "Throw a Pokéball", - tooltip: "(+) Throw a Pokéball", - selected: "You throw a Pokéball!", - }, - 2: { - label: "Throw Bait", - tooltip: "(+) Increases Capture Rate\n(-) Chance to Increase Flee Rate", - selected: "You throw some bait!", - }, - 3: { - label: "Throw Mud", - tooltip: "(+) Decreases Flee Rate\n(-) Chance to Decrease Capture Rate", - selected: "You throw some mud!", - }, - 4: { - label: "Flee", - tooltip: "(?) Flee from this Pokémon", - }, - watching: "{{pokemonName}} is watching carefully!", - eating: "{{pokemonName}} is eating!", - busy_eating: "{{pokemonName}} is busy eating!", - angry: "{{pokemonName}} is angry!", - beside_itself_angry: "{{pokemonName}} is beside itself with anger!", - remaining_count: "{{remainingCount}} Pokémon remaining!", - }, - outro: "That was a fun little excursion!" -}; diff --git a/src/locales/en/mystery-encounters/shady-vitamin-dealer-dialogue.json b/src/locales/en/mystery-encounters/shady-vitamin-dealer-dialogue.json new file mode 100644 index 00000000000..94904fbcb12 --- /dev/null +++ b/src/locales/en/mystery-encounters/shady-vitamin-dealer-dialogue.json @@ -0,0 +1,29 @@ +{ + "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.", + "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?", + "invalid_selection": "Pokémon must be healthy enough.", + "option": { + "1": { + "label": "The Cheap Deal", + "tooltip": "(-) Pay {{option1Money, money}}\n(-) Side Effects?\n(+) Chosen Pokémon Gains 2 Random Vitamins" + }, + "2": { + "label": "The Pricey Deal", + "tooltip": "(-) Pay {{option2Money, money}}\n(-) Side Effects?\n(+) Chosen Pokémon Gains 2 Random Vitamins" + }, + "3": { + "label": "Leave", + "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!" + }, + "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...", + "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/shady-vitamin-dealer-dialogue.ts b/src/locales/en/mystery-encounters/shady-vitamin-dealer-dialogue.ts deleted file mode 100644 index 5570cc9b7ad..00000000000 --- a/src/locales/en/mystery-encounters/shady-vitamin-dealer-dialogue.ts +++ /dev/null @@ -1,35 +0,0 @@ -export const shadyVitaminDealerDialogue = { - intro: "A man in a dark coat approaches you.", - speaker: "Shady Salesman", - 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?", - invalid_selection: "Pokémon must be healthy enough.", - option: { - 1: { - label: "The Cheap Deal", - tooltip: "(-) Pay {{option1Money, money}}\n(-) Side Effects?\n(+) Chosen Pokémon Gains 2 Random Vitamins", - }, - 2: { - label: "The Pricey Deal", - tooltip: "(-) Pay {{option2Money, money}}\n(-) Side Effects?\n(+) Chosen Pokémon Gains 2 Random Vitamins", - }, - 3: { - label: "Leave", - tooltip: "(-) No Rewards", - selected: "Heh, wouldn't have figured you for a coward.", - }, - 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! - $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.", -}; diff --git a/src/locales/en/mystery-encounters/slumbering-snorlax-dialogue.json b/src/locales/en/mystery-encounters/slumbering-snorlax-dialogue.json new file mode 100644 index 00000000000..82e202d9367 --- /dev/null +++ b/src/locales/en/mystery-encounters/slumbering-snorlax-dialogue.json @@ -0,0 +1,25 @@ +{ + "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.", + "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?", + "option": { + "1": { + "label": "Battle It", + "tooltip": "(-) Fight Sleeping Snorlax\n(+) Special Reward", + "selected": "You approach the\nPokémon without fear." + }, + "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...", + "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!" + } + } +} \ No newline at end of file diff --git a/src/locales/en/mystery-encounters/slumbering-snorlax-dialogue.ts b/src/locales/en/mystery-encounters/slumbering-snorlax-dialogue.ts deleted file mode 100644 index 75e4a4adfb6..00000000000 --- a/src/locales/en/mystery-encounters/slumbering-snorlax-dialogue.ts +++ /dev/null @@ -1,28 +0,0 @@ -export const slumberingSnorlaxDialogue = { - 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?", - option: { - 1: { - label: "Battle It", - tooltip: "(-) Fight Sleeping Snorlax\n(+) Special Reward", - selected: "You approach the\nPokémon without fear.", - }, - 2: { - label: "Wait for It to Move", - tooltip: "(-) Wait a Long Time\n(+) Recover Party", - 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}}! - $@s{item_fanfare}It steals Leftovers off the sleeping\nSnorlax and you make out like bandits!`, - }, - } -}; diff --git a/src/locales/en/mystery-encounters/teleporting-hijinks-dialogue.json b/src/locales/en/mystery-encounters/teleporting-hijinks-dialogue.json new file mode 100644 index 00000000000..f847d5578ae --- /dev/null +++ b/src/locales/en/mystery-encounters/teleporting-hijinks-dialogue.json @@ -0,0 +1,27 @@ +{ + "intro": "It's a strange machine, whirring noisily...", + "title": "Teleportating Hijinks", + "description": "The machine has a sign on it that reads:\n \"To use, insert money then step into the capsule.\"\n\nPerhaps it can transport you somewhere...", + "query": "What will you do?", + "option": { + "1": { + "label": "Put Money In", + "tooltip": "(-) Pay {{price, money}}\n(?) Teleport to New Biome", + "selected": "You insert some money, and the capsule opens.\nYou step inside..." + }, + "2": { + "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}} uses its typing and overloads the machine!\n $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!" + } + }, + "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!", + "boss_enraged": "The opposing {{enemyPokemon}} has become enraged!" +} \ No newline at end of file diff --git a/src/locales/en/mystery-encounters/teleporting-hijinks-dialogue.ts b/src/locales/en/mystery-encounters/teleporting-hijinks-dialogue.ts deleted file mode 100644 index 2cf13e21882..00000000000 --- a/src/locales/en/mystery-encounters/teleporting-hijinks-dialogue.ts +++ /dev/null @@ -1,31 +0,0 @@ -export const teleportingHijinksDialogue = { - intro: "It's a strange machine, whirring noisily...", - title: "Teleportating Hijinks", - description: "The machine has a sign on it that reads:\n \"To use, insert money then step into the capsule.\"\n\nPerhaps it can transport you somewhere...", - query: "What will you do?", - option: { - 1: { - label: "Put Money In", - tooltip: "(-) Pay {{price, money}}\n(?) Teleport to New Biome", - selected: "You insert some money, and the capsule opens.\nYou step inside...", - }, - 2: { - 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}} uses its typing and overloads the machine! - $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... - $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! - $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!" -}; diff --git a/src/locales/en/mystery-encounters/the-pokemon-salesman-dialogue.json b/src/locales/en/mystery-encounters/the-pokemon-salesman-dialogue.json new file mode 100644 index 00000000000..88e93782062 --- /dev/null +++ b/src/locales/en/mystery-encounters/the-pokemon-salesman-dialogue.json @@ -0,0 +1,23 @@ +{ + "intro": "A chipper elderly man approaches you.", + "speaker": "Gentleman", + "intro_dialogue": "Hello there! Have I got a deal just for YOU!", + "title": "The Pokémon Salesman", + "description": "\"This {{purchasePokemon}} is extremely unique and carries an ability not normally found in its species! I'll let you have this swell {{purchasePokemon}} for just {{price, money}}!\"\n\n\"What do you say?\"", + "description_shiny": "\"This {{purchasePokemon}} is extremely unique and has a pigment not normally found in its species! I'll let you have this swell {{purchasePokemon}} for just {{price, money}}!\"\n\n\"What do you say?\"", + "query": "What will you do?", + "option": { + "1": { + "label": "Accept", + "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?" + }, + "2": { + "label": "Refuse", + "tooltip": "(-) No Rewards", + "selected": "No?@d{32} You say no?\n $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-pokemon-salesman-dialogue.ts b/src/locales/en/mystery-encounters/the-pokemon-salesman-dialogue.ts deleted file mode 100644 index 00b1f4beb6a..00000000000 --- a/src/locales/en/mystery-encounters/the-pokemon-salesman-dialogue.ts +++ /dev/null @@ -1,26 +0,0 @@ -export const thePokemonSalesmanDialogue = { - intro: "A chipper elderly man approaches you.", - speaker: "Gentleman", - intro_dialogue: "Hello there! Have I got a deal just for YOU!", - title: "The Pokémon Salesman", - description: "\"This {{purchasePokemon}} is extremely unique and carries an ability not normally found in its species! I'll let you have this swell {{purchasePokemon}} for just {{price, money}}!\"\n\n\"What do you say?\"", - description_shiny: "\"This {{purchasePokemon}} is extremely unique and has a pigment not normally found in its species! I'll let you have this swell {{purchasePokemon}} for just {{price, money}}!\"\n\n\"What do you say?\"", - query: "What will you do?", - option: { - 1: { - label: "Accept", - 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! - $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? - $I'm only doing this as a favor to you!`, - }, - }, -}; diff --git a/src/locales/en/mystery-encounters/the-strong-stuff-dialogue.json b/src/locales/en/mystery-encounters/the-strong-stuff-dialogue.json new file mode 100644 index 00000000000..b0174486b29 --- /dev/null +++ b/src/locales/en/mystery-encounters/the-strong-stuff-dialogue.json @@ -0,0 +1,21 @@ +{ + "intro": "It's a massive Shuckle and what appears\nto be an equally large stash of... juice?", + "title": "The Strong Stuff", + "description": "The Shuckle that blocks your path looks incredibly strong. Meanwhile, the juice next to it is emanating power of some kind.\n\nThe Shuckle extends its feelers in your direction. It seems like it wants to touch you, but is that really a good idea?", + "query": "What will you do?", + "option": { + "1": { + "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!" + }, + "2": { + "label": "Battle the Shuckle", + "tooltip": "(-) Hard Battle\n(+) Special Rewards", + "selected": "Enraged, the Shuckle drinks some of its juice and attacks!", + "stat_boost": "The Shuckle's juice boosts its stats!" + } + }, + "outro": "What a bizarre turn of events." +} \ No newline at end of file diff --git a/src/locales/en/mystery-encounters/the-strong-stuff-dialogue.ts b/src/locales/en/mystery-encounters/the-strong-stuff-dialogue.ts deleted file mode 100644 index baaca049f08..00000000000 --- a/src/locales/en/mystery-encounters/the-strong-stuff-dialogue.ts +++ /dev/null @@ -1,25 +0,0 @@ -export const theStrongStuffDialogue = { - intro: "It's a massive Shuckle and what appears\nto be an equally large stash of... juice?", - title: "The Strong Stuff", - description: "The Shuckle that blocks your path looks incredibly strong. Meanwhile, the juice next to it is emanating power of some kind.\n\nThe Shuckle extends its feelers in your direction. It seems like it wants to touch you, but is that really a good idea?", - query: "What will you do?", - option: { - 1: { - 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. - $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", - tooltip: "(-) Hard Battle\n(+) Special Rewards", - selected: "Enraged, the Shuckle drinks some of its juice and attacks!", - stat_boost: "The Shuckle's juice boosts its stats!", - }, - }, - outro: "What a bizarre turn of events." -}; diff --git a/src/locales/en/mystery-encounters/the-winstrate-challenge-dialogue.json b/src/locales/en/mystery-encounters/the-winstrate-challenge-dialogue.json new file mode 100644 index 00000000000..9f50b6abae1 --- /dev/null +++ b/src/locales/en/mystery-encounters/the-winstrate-challenge-dialogue.json @@ -0,0 +1,21 @@ +{ + "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?", + "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?", + "option": { + "1": { + "label": "Accept the Challenge", + "tooltip": "(-) Brutal Battle\n(+) Special Item Reward", + "selected": "That's the spirit! I like you!" + }, + "2": { + "label": "Refuse the Challenge", + "tooltip": "(+) Full Heal Party\n(+) Gain a Rarer Candy", + "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!" +} \ No newline at end of file diff --git a/src/locales/en/mystery-encounters/the-winstrate-challenge-dialogue.ts b/src/locales/en/mystery-encounters/the-winstrate-challenge-dialogue.ts deleted file mode 100644 index bd5d5560315..00000000000 --- a/src/locales/en/mystery-encounters/the-winstrate-challenge-dialogue.ts +++ /dev/null @@ -1,24 +0,0 @@ -export const theWinstrateChallengeDialogue = { - intro: "It's a family standing outside their house!", - speaker: "The Winstrates", - 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?", - option: { - 1: { - label: "Accept the Challenge", - tooltip: "(-) Brutal Battle\n(+) Special Item Reward", - selected: "That's the spirit! I like you!", - }, - 2: { - label: "Refuse the Challenge", - tooltip: "(+) Full Heal Party\n(+) Gain a Rarer Candy", - 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! - $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!`, -}; diff --git a/src/locales/en/mystery-encounters/training-session-dialogue.json b/src/locales/en/mystery-encounters/training-session-dialogue.json new file mode 100644 index 00000000000..62e89cd1dae --- /dev/null +++ b/src/locales/en/mystery-encounters/training-session-dialogue.json @@ -0,0 +1,28 @@ +{ + "intro": "You've come across some\ntraining tools and supplies.", + "title": "Training Session", + "description": "These supplies look like they could be used to train a member of your party! There are a few ways you could train your Pokémon, by battling against it with the rest of your team.", + "query": "How should you train?", + "invalid_selection": "Pokémon must be healthy enough.", + "option": { + "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!" + }, + "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}}!" + }, + "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}}!" + }, + "selected": "{{selectedPokemon}} moves across\nthe clearing to face you..." + }, + "outro": "That was a successful training session!" +} \ No newline at end of file diff --git a/src/locales/en/mystery-encounters/training-session-dialogue.ts b/src/locales/en/mystery-encounters/training-session-dialogue.ts deleted file mode 100644 index 66e9d7c9498..00000000000 --- a/src/locales/en/mystery-encounters/training-session-dialogue.ts +++ /dev/null @@ -1,31 +0,0 @@ -export const trainingSessionDialogue = { - intro: "You've come across some\ntraining tools and supplies.", - title: "Training Session", - description: "These supplies look like they could be used to train a member of your party! There are a few ways you could train your Pokémon, by battling against it with the rest of your team.", - query: "How should you train?", - invalid_selection: "Pokémon must be healthy enough.", - option: { - 1: { - label: "Light Training", - tooltip: "(-) Light Battle\n(+) Improve 2 Random IVs of Pokémon", - 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! - $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! - $Its ability was changed to {{ability}}!`, - }, - selected: "{{selectedPokemon}} moves across\nthe clearing to face you...", - }, - outro: "That was a successful training session!", -}; diff --git a/src/locales/en/mystery-encounters/trash-to-treasure-dialogue.json b/src/locales/en/mystery-encounters/trash-to-treasure-dialogue.json new file mode 100644 index 00000000000..1ec4a7102d7 --- /dev/null +++ b/src/locales/en/mystery-encounters/trash-to-treasure-dialogue.json @@ -0,0 +1,19 @@ +{ + "intro": "It's a massive pile of garbage!\nWhere did this come from?", + "title": "Trash to Treasure", + "description": "The garbage heap looms over you, and you can spot some items of value buried amidst the refuse. Are you sure you want to get covered in filth to get them, though?", + "query": "What will you do?", + "option": { + "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!" + }, + "2": { + "label": "Investigate Further", + "tooltip": "(?) Find the Source of the Garbage", + "selected": "You wander around the heap, searching for any indication as to how this might have appeared here...", + "selected_2": "Suddenly, the garbage shifts! It wasn't just garbage, it was a Pokémon!" + } + } +} \ No newline at end of file diff --git a/src/locales/en/mystery-encounters/trash-to-treasure-dialogue.ts b/src/locales/en/mystery-encounters/trash-to-treasure-dialogue.ts deleted file mode 100644 index 9242058b128..00000000000 --- a/src/locales/en/mystery-encounters/trash-to-treasure-dialogue.ts +++ /dev/null @@ -1,22 +0,0 @@ -export const trashToTreasureDialogue = { - intro: "It's a massive pile of garbage!\nWhere did this come from?", - title: "Trash to Treasure", - description: "The garbage heap looms over you, and you can spot some items of value buried amidst the refuse. Are you sure you want to get covered in filth to get them, though?", - query: "What will you do?", - option: { - 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. - $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", - tooltip: "(?) Find the Source of the Garbage", - selected: "You wander around the heap, searching for any indication as to how this might have appeared here...", - selected_2: "Suddenly, the garbage shifts! It wasn't just garbage, it was a Pokémon!" - }, - }, -}; diff --git a/src/locales/en/mystery-encounters/weird-dream-dialogue.json b/src/locales/en/mystery-encounters/weird-dream-dialogue.json new file mode 100644 index 00000000000..254c161d92d --- /dev/null +++ b/src/locales/en/mystery-encounters/weird-dream-dialogue.json @@ -0,0 +1,22 @@ +{ + "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?", + "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?", + "option": { + "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}", + "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?" + }, + "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!" + } + } +} \ No newline at end of file diff --git a/src/locales/en/mystery-encounters/weird-dream-dialogue.ts b/src/locales/en/mystery-encounters/weird-dream-dialogue.ts deleted file mode 100644 index 2def3b50d05..00000000000 --- a/src/locales/en/mystery-encounters/weird-dream-dialogue.ts +++ /dev/null @@ -1,29 +0,0 @@ -export const weirdDreamDialogue = { - intro: "A shadowy woman blocks your path.\nSomething about her is unsettling...", - speaker: "Woman", - 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?", - option: { - 1: { - label: "\"I See Them\"", - tooltip: "@[SUMMARY_GREEN]{(?) Affects your Pokémon}", - 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... - $.@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. - $When you finally stop to collect yourself, you check the Pokémon in your team. - $For some reason, all of their levels have decreased!`, - } - }, -}; From 5c040aeb4db4abde4a2467d3c00a667cc3da770f Mon Sep 17 00:00:00 2001 From: flx-sta <50131232+flx-sta@users.noreply.github.com> Date: Fri, 23 Aug 2024 14:58:55 -0700 Subject: [PATCH 262/270] add retries to berries-abound.Option1: should reward the player with X berries based on wave --- .../encounters/berries-abound-encounter.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 840de53cec8..23ec94683ee 100644 --- a/src/test/mystery-encounter/encounters/berries-abound-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/berries-abound-encounter.test.ts @@ -130,7 +130,7 @@ describe("Berries Abound - Mystery Encounter", () => { expect(enemyField[0].species.speciesId).toBe(speciesToSpawn); }); - it("should reward the player with X berries based on wave", async () => { + it("should reward the player with X berries based on wave", { retry: 5 }, async () => { await game.runToMysteryEncounter(MysteryEncounterType.BERRIES_ABOUND, defaultParty); const numBerries = game.scene.currentBattle.mysteryEncounter.misc.numBerries; From 762aa9e49b8df80d7ab2bea1a7074f5b6da53be3 Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Sun, 25 Aug 2024 09:28:29 -0700 Subject: [PATCH 263/270] Update the GitHub pull request template (#3755) --- .github/pull_request_template.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 3e6b8bf6d0d..a30cb642a46 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -30,7 +30,7 @@ - [ ] The PR is self-contained and cannot be split into smaller PRs? - [ ] Have I provided a clear explanation of the changes? - [ ] Have I considered writing automated tests for the issue? -- [ ] If I have text, did I add make it translatable and added a key in the English language? +- [ ] If I have text, did I make it translatable and add a key in the English locale file(s)? - [ ] Have I tested the changes (manually)? - [ ] Are all unit tests still passing? (`npm run test`) - [ ] Are the changes visual? From 35ddf97831ea4a1444546898f71dbb4761236d62 Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Mon, 26 Aug 2024 14:07:50 -0400 Subject: [PATCH 264/270] add missing ME dialogue back in --- src/locales/en/config.ts | 3 +- src/locales/en/dialogue-male.json | 100 ++++++++++++++++++++++++++++ src/locales/en/modifier-type.json | 21 +++++- src/locales/en/trainer-classes.json | 12 +++- 4 files changed, 133 insertions(+), 3 deletions(-) diff --git a/src/locales/en/config.ts b/src/locales/en/config.ts index d2d808e950e..0752a393711 100644 --- a/src/locales/en/config.ts +++ b/src/locales/en/config.ts @@ -58,6 +58,7 @@ import terrain from "./terrain.json"; 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"; export const enConfig = { ability, @@ -120,5 +121,5 @@ export const enConfig = { modifierSelectUiHandler, moveTriggers, runHistory, - mysteryEncounter + mysteryEncounter: mysteryEncounter }; diff --git a/src/locales/en/dialogue-male.json b/src/locales/en/dialogue-male.json index bf0612539d3..f10fc11fa7c 100644 --- a/src/locales/en/dialogue-male.json +++ b/src/locales/en/dialogue-male.json @@ -787,6 +787,106 @@ "1": "Fools with no vision will continue to befoul this beautiful world." } }, + "stat_trainer_buck": { + "encounter": { + "1": "...I'm telling you right now. I'm seriously tough. Act surprised!", + "2": "I can feel my Pokémon shivering inside their Pokéballs!" + }, + "victory": { + "1": "Heeheehee!\nSo hot, you!" + }, + "defeat": { + "1": "Whoa! You're all out of gas, I guess." + } + }, + "stat_trainer_cheryl": { + "encounter": { + "1": "My Pokémon have been itching for a battle.", + "2": "I should warn you, my Pokémon can be quite rambunctious." + }, + "victory": { + "1": "Striking the right balance of offense and defense... It's not easy to do." + }, + "defeat": { + "1": "Do your Pokémon need any healing?" + } + }, + "stat_trainer_marley": { + "encounter": { + "1": "... OK.\nI'll do my best.", + "2": "... OK.\nI... won't lose...!" + }, + "victory": { + "1": "... Awww." + }, + "defeat": { + "1": "... Goodbye." + } + }, + "stat_trainer_mira": { + "encounter": { + "1": "You will be shocked by Mira!", + "2": "Mira will show you that Mira doesn't get lost anymore!" + }, + "victory": { + "1": "Mira wonders if she can get very far in this land." + }, + "defeat": { + "1": "Mira knew she would win!" + } + }, + "stat_trainer_riley": { + "encounter": { + "1": "Battling is our way of greeting!", + "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." + }, + "defeat": { + "1": "You put up quite the display.\nBetter luck next time." + } + }, + "winstrates_victor": { + "encounter": { + "1": "That's the spirit! I like you!" + }, + "victory": { + "1": "A-ha! You're stronger than I thought!" + } + }, + "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!" + }, + "victory": { + "1": "Uwah! Just how strong are you?!" + } + }, + "winstrates_vivi": { + "encounter": { + "1": "You're stronger than Mom? Wow!\n $But I'm strong, too!\nReally! Honestly!" + }, + "victory": { + "1": "Huh? Did I really lose?\nSnivel... Grandmaaa!" + } + }, + "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!" + }, + "victory": { + "1": "Whoa! So strong!\nMy granddaughter wasn't lying." + } + }, + "winstrates_vito": { + "encounter": { + "1": "I trained together with my whole family,\nevery one of us!\n $I'm not losing to anyone!" + }, + "victory": { + "1": "I was better than everyone in my family.\nI've never lost before..." + } + }, "brock": { "encounter": { "1": "My expertise on Rock-type Pokémon will take you down! Come on!", diff --git a/src/locales/en/modifier-type.json b/src/locales/en/modifier-type.json index ed1ef900878..6bc3eab2f91 100644 --- a/src/locales/en/modifier-type.json +++ b/src/locales/en/modifier-type.json @@ -64,6 +64,20 @@ "PokemonBaseStatBoosterModifierType": { "description": "Increases the holder's base {{statName}} by 10%. The higher your IVs, the higher the stack limit." }, + "PokemonBaseStatTotalModifierType": { + "name": "Shuckle Juice", + "description": "{{increaseDecrease}} all of the holder's base stats by {{statValue}}. You were {{blessCurse}} by the Shuckle.", + "extra": { + "increase": "Increases", + "decrease": "Decreases", + "blessed": "blessed", + "cursed": "cursed" + } + }, + "PokemonBaseStatFlatModifierType": { + "name": "Old Gateau", + "description": "Increases the holder's {{stats}} base stats by {{statValue}}. Found after a strange dream.", + }, "AllPokemonFullHpRestoreModifierType": { "description": "Restores 100% HP for all Pokémon." }, @@ -242,7 +256,12 @@ "ENEMY_ATTACK_BURN_CHANCE": { "name": "Burn Token" }, "ENEMY_STATUS_EFFECT_HEAL_CHANCE": { "name": "Full Heal Token", "description": "Adds a 2.5% chance every turn to heal a status condition." }, "ENEMY_ENDURE_CHANCE": { "name": "Endure Token" }, - "ENEMY_FUSED_CHANCE": { "name": "Fusion Token", "description": "Adds a 1% chance that a wild Pokémon will be a fusion." } + "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_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}}." } }, "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/trainer-classes.json b/src/locales/en/trainer-classes.json index 1b827281a6a..f3b81b06acb 100644 --- a/src/locales/en/trainer-classes.json +++ b/src/locales/en/trainer-classes.json @@ -117,5 +117,15 @@ "plasma_grunts": "Plasma Grunts", "flare_grunt": "Flare Grunt", "flare_grunt_female": "Flare Grunt", - "flare_grunts": "Flare Grunts" + "flare_grunts": "Flare Grunts", + "buck": "Buck", + "cheryl": "Cheryl", + "marley": "Marley", + "mira": "Mira", + "riley": "Riley", + "victor": "Victor", + "victoria": "Victoria", + "vivi": "Vivi", + "vicky": "Vicky", + "vito": "Vito" } \ No newline at end of file From 6d61af396f75e8ae21fb8c5eaf35cfe747c641d3 Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Mon, 26 Aug 2024 14:08:55 -0400 Subject: [PATCH 265/270] revert template changes --- .github/pull_request_template.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index a30cb642a46..3e6b8bf6d0d 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -30,7 +30,7 @@ - [ ] The PR is self-contained and cannot be split into smaller PRs? - [ ] Have I provided a clear explanation of the changes? - [ ] Have I considered writing automated tests for the issue? -- [ ] If I have text, did I make it translatable and add a key in the English locale file(s)? +- [ ] If I have text, did I add make it translatable and added a key in the English language? - [ ] Have I tested the changes (manually)? - [ ] Are all unit tests still passing? (`npm run test`) - [ ] Are the changes visual? From b9a7064d5cda376e7c8b694528eab690cce134ff Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Mon, 26 Aug 2024 14:13:19 -0400 Subject: [PATCH 266/270] add ME unique trainer dialogue to both dialogue jsons --- src/locales/en/dialogue-female.json | 100 ++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) diff --git a/src/locales/en/dialogue-female.json b/src/locales/en/dialogue-female.json index 6be1c7586b6..2268b7ccebd 100644 --- a/src/locales/en/dialogue-female.json +++ b/src/locales/en/dialogue-female.json @@ -787,6 +787,106 @@ "1": "Fools with no vision will continue to befoul this beautiful world." } }, + "stat_trainer_buck": { + "encounter": { + "1": "...I'm telling you right now. I'm seriously tough. Act surprised!", + "2": "I can feel my Pokémon shivering inside their Pokéballs!" + }, + "victory": { + "1": "Heeheehee!\nSo hot, you!" + }, + "defeat": { + "1": "Whoa! You're all out of gas, I guess." + } + }, + "stat_trainer_cheryl": { + "encounter": { + "1": "My Pokémon have been itching for a battle.", + "2": "I should warn you, my Pokémon can be quite rambunctious." + }, + "victory": { + "1": "Striking the right balance of offense and defense... It's not easy to do." + }, + "defeat": { + "1": "Do your Pokémon need any healing?" + } + }, + "stat_trainer_marley": { + "encounter": { + "1": "... OK.\nI'll do my best.", + "2": "... OK.\nI... won't lose...!" + }, + "victory": { + "1": "... Awww." + }, + "defeat": { + "1": "... Goodbye." + } + }, + "stat_trainer_mira": { + "encounter": { + "1": "You will be shocked by Mira!", + "2": "Mira will show you that Mira doesn't get lost anymore!" + }, + "victory": { + "1": "Mira wonders if she can get very far in this land." + }, + "defeat": { + "1": "Mira knew she would win!" + } + }, + "stat_trainer_riley": { + "encounter": { + "1": "Battling is our way of greeting!", + "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." + }, + "defeat": { + "1": "You put up quite the display.\nBetter luck next time." + } + }, + "winstrates_victor": { + "encounter": { + "1": "That's the spirit! I like you!" + }, + "victory": { + "1": "A-ha! You're stronger than I thought!" + } + }, + "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!" + }, + "victory": { + "1": "Uwah! Just how strong are you?!" + } + }, + "winstrates_vivi": { + "encounter": { + "1": "You're stronger than Mom? Wow!\n $But I'm strong, too!\nReally! Honestly!" + }, + "victory": { + "1": "Huh? Did I really lose?\nSnivel... Grandmaaa!" + } + }, + "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!" + }, + "victory": { + "1": "Whoa! So strong!\nMy granddaughter wasn't lying." + } + }, + "winstrates_vito": { + "encounter": { + "1": "I trained together with my whole family,\nevery one of us!\n $I'm not losing to anyone!" + }, + "victory": { + "1": "I was better than everyone in my family.\nI've never lost before..." + } + }, "brock": { "encounter": { "1": "My expertise on Rock-type Pokémon will take you down! Come on!", From 6f4d0386d52b7735166d97d814c2954e94fe270b Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Mon, 26 Aug 2024 14:17:04 -0400 Subject: [PATCH 267/270] fix hanging comma in json --- src/locales/en/modifier-type.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/locales/en/modifier-type.json b/src/locales/en/modifier-type.json index 6bc3eab2f91..886b93a19f9 100644 --- a/src/locales/en/modifier-type.json +++ b/src/locales/en/modifier-type.json @@ -76,7 +76,7 @@ }, "PokemonBaseStatFlatModifierType": { "name": "Old Gateau", - "description": "Increases the holder's {{stats}} base stats by {{statValue}}. Found after a strange dream.", + "description": "Increases the holder's {{stats}} base stats by {{statValue}}. Found after a strange dream." }, "AllPokemonFullHpRestoreModifierType": { "description": "Restores 100% HP for all Pokémon." From 30b0822c01cbaa11c44d02b6b0300ed92bb4765c Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Mon, 26 Aug 2024 14:21:12 -0400 Subject: [PATCH 268/270] fix broken imports --- .../encounters/training-session-encounter.ts | 26 +++---------------- 1 file changed, 4 insertions(+), 22 deletions(-) diff --git a/src/data/mystery-encounters/encounters/training-session-encounter.ts b/src/data/mystery-encounters/encounters/training-session-encounter.ts index 54d48d4dcc5..19e8fc50136 100644 --- a/src/data/mystery-encounters/encounters/training-session-encounter.ts +++ b/src/data/mystery-encounters/encounters/training-session-encounter.ts @@ -2,9 +2,8 @@ import { Ability, allAbilities } from "#app/data/ability"; import { EnemyPartyConfig, initBattleWithEnemyConfig, selectPokemonForOption, setEncounterRewards, } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { getNatureName, Nature } from "#app/data/nature"; import { speciesStarters } from "#app/data/pokemon-species"; -import { Stat } from "#app/data/pokemon-stat"; +import { getStatName } from "#app/data/pokemon-stat"; import Pokemon, { PlayerPokemon } from "#app/field/pokemon"; -import { pokemonInfo } from "#app/locales/en/pokemon-info"; import { PokemonHeldItemModifier } from "#app/modifier/modifier"; import { AbilityAttr } from "#app/system/game-data"; import PokemonData from "#app/system/pokemon-data"; @@ -104,23 +103,6 @@ export const TrainingSessionEncounter: MysteryEncounter = ); scene.removePokemonFromPlayerParty(playerPokemon, false); - const getIvName = (index: number) => { - switch (index) { - case Stat.HP: - return pokemonInfo.Stat["HPshortened"]; - case Stat.ATK: - return pokemonInfo.Stat["ATKshortened"]; - case Stat.DEF: - return pokemonInfo.Stat["DEFshortened"]; - case Stat.SPATK: - return pokemonInfo.Stat["SPATKshortened"]; - case Stat.SPDEF: - return pokemonInfo.Stat["SPDEFshortened"]; - case Stat.SPD: - return pokemonInfo.Stat["SPDshortened"]; - } - }; - const onBeforeRewardsPhase = () => { encounter.setDialogueToken("stat1", "-"); encounter.setDialogueToken("stat2", "-"); @@ -147,12 +129,12 @@ export const TrainingSessionEncounter: MysteryEncounter = if (improvedCount === 0) { encounter.setDialogueToken( "stat1", - getIvName(ivToChange.index) ?? "" + getStatName(ivToChange.index) ?? "" ); } else { encounter.setDialogueToken( "stat2", - getIvName(ivToChange.index) ?? "" + getStatName(ivToChange.index) ?? "" ); } @@ -399,7 +381,7 @@ export const TrainingSessionEncounter: MysteryEncounter = ) .build(); -function getEnemyConfig(scene: BattleScene, playerPokemon: PlayerPokemon,segments: number,modifiers: ModifiersHolder): EnemyPartyConfig { +function getEnemyConfig(scene: BattleScene, playerPokemon: PlayerPokemon, segments: number, modifiers: ModifiersHolder): EnemyPartyConfig { playerPokemon.resetSummonData(); // Passes modifiers by reference From 71d1f72597fa95648cbbe26e9ff304a80c7290c3 Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Mon, 26 Aug 2024 14:26:01 -0400 Subject: [PATCH 269/270] resolve lint issues --- .../mystery-encounter/encounters/part-timer-encounter.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 df94e4fbe3e..4eb44af5f24 100644 --- a/src/test/mystery-encounter/encounters/part-timer-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/part-timer-encounter.test.ts @@ -138,7 +138,7 @@ describe("Part-Timer - Mystery Encounter", () => { // Override party levels to 50 so stats can be fully reflective scene.getParty().forEach(p => { p.level = 50; - p.ivs = [20,20,20,20,20,20]; + p.ivs = [20, 20, 20, 20, 20, 20]; p.calculateStats(); }); await runMysteryEncounterToEnd(game, 1, { pokemonNo: 2 }); @@ -203,7 +203,7 @@ describe("Part-Timer - Mystery Encounter", () => { // Override party levels to 50 so stats can be fully reflective scene.getParty().forEach(p => { p.level = 50; - p.ivs = [20,20,20,20,20,20]; + p.ivs = [20, 20, 20, 20, 20, 20]; p.calculateStats(); }); await runMysteryEncounterToEnd(game, 2, { pokemonNo: 4 }); From d926d1e9adb604860cac8ca3c46ed8099bff1d81 Mon Sep 17 00:00:00 2001 From: ImperialSympathizer Date: Mon, 26 Aug 2024 14:43:30 -0400 Subject: [PATCH 270/270] fix flaky test --- .../encounters/teleporting-hijinks-encounter.ts | 2 +- .../encounters/teleporting-hijinks-encounter.test.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/data/mystery-encounters/encounters/teleporting-hijinks-encounter.ts b/src/data/mystery-encounters/encounters/teleporting-hijinks-encounter.ts index 346a736fbe9..63e7674b05a 100644 --- a/src/data/mystery-encounters/encounters/teleporting-hijinks-encounter.ts +++ b/src/data/mystery-encounters/encounters/teleporting-hijinks-encounter.ts @@ -25,7 +25,7 @@ const namespace = "mysteryEncounter:teleportingHijinks"; const MONEY_COST_MULTIPLIER = 2.5; const BIOME_CANDIDATES = [Biome.SPACE, Biome.FAIRY_CAVE, Biome.LABORATORY, Biome.ISLAND]; -const MACHINE_INTERFACING_TYPES = [Type.ELECTRIC, Type.FLYING]; +const MACHINE_INTERFACING_TYPES = [Type.ELECTRIC, Type.STEEL]; /** * Teleporting Hijinks encounter. 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 cd88846de7b..f4a3b41bf1d 100644 --- a/src/test/mystery-encounter/encounters/teleporting-hijinks-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/teleporting-hijinks-encounter.test.ts @@ -196,7 +196,7 @@ describe("Teleporting Hijinks - Mystery Encounter", () => { }); }); - describe("Option 2 - Attempt to Steal", () => { + describe("Option 2 - Use Electric/Steel Typing", () => { it("should have the correct properties", () => { const option = TeleportingHijinksEncounter.options[1]; expect(option.optionMode).toBe(MysteryEncounterOptionMode.DISABLED_OR_SPECIAL);

=U?comdVku)0W-(9l$ypa5UkJZAMti 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%0A8!s0r z9TTa0VXVCi=~|EMy@Z|=DH29?dwuh&^fhUS7aDi<5ul3@&tdaNwLvuyF|MB92$LFv zOgu_AIcF4)4U0(+na6ACAi&_!?gI}&I$0fWTXgBYH~&ZfrYWlsg~sHvY}`e33(|rY zWLWIn%0lP}NWFlH0$`?;n=lJ$dp}Rd6~XtYL-mam)@(5|wlSBdIRl9dbl~BPHzTIr z-OmxjtdMZjErej6+NtGX1FAwA%??P?4)K9ixnXiFZZ=?e^v8`Hm81$?TijYajk`^w zyRUpnJ+DYvw?in=SV^L?;Ej>Z#dwR}zTU7EX>w?*;|UT389S3R$-bBWS_=(GDjGnm z(QFum96Xdv`G|C~Bx58W>T{j*1{kfSlg0zz3jF*2!`DP;lz6O*{Nq0Vqx@>16uD-3 z_ImH$r~b->2w^}BP@^4o_mtB!W7zPqN&y`ls0qeEhiOS6F(W8`UamEm-ir0b}*ZJ7}F{&`lNFcoXTlt;pt~*J?XjHMPS11h~ii_ zymdOiUTkmTuOrvX0 zP3A8Xt)F4+Bzb8s4eb4f8B~3Av|vvlC8hjTE+uTasqO#Y#D_@I!}&PL7o~83d^}`T z;Z+r#Vt=={>;9it|Mz!&HG;3g%Q)q`Zjpg&!KPpibld@(0uBQXji9K&(X%F@Ftl5; z(|MLdJb-OBd#;KbMB&%6P=hPVSH*&YdD-d{%GDsD^sG`xSq++B2KQn5U#BekIo)hX zZ8dLJ)BV4FX}Q+Zx@AfoYFAj?5L1xOF{A3V+!mn-6<{FuD-gwq7%JvY&+-j7Fi2$x zp&J>g!tRCc)eA8T9fjNO@I8671_Kc&NS9l`nwH>VvMXs}JjM>8qpqGAk! z>t;k>S@v1mg-1lKr_B8&>-a$P0rbSVI=Rs>kUq`3o5A|i6NkZByXXvxNa*z)dn zWH19iB3$x%4^hUQopnYRGtwTk8pldL(&J?Usf$wK@^P`5TvcgYfj|)NEW;TjyB81^ z%rB!v1r;P%JTzF@DhqDn4H|@$No_dQDXvl)+k1snm_~)}_^V<|bYag;MZH2ILPw*F zzcY!n7?pLsajoW#5jW6$vXJj+_~V|(Ev(3(NrT-!9>stH|NEe1*?S#f9~}Bz;a}ab(wavdgF(i=9Yjg5I~3s6o|iN0=R=AsOqeg zxeb+HD4REbXPN7TEN6tsC0?$D_G277hty#>>#5oa#Qh=fd;K zEoi1pTt_Gs4$6fw5h|e0st(NyjIM;1dxZLW-zJ(Ah2eCwP}xn~qz$%wxc+lZYsRr> z9?nlAlQ=CfqG+s{eEQic;33J7Nf}IHKIWx+64GV4Mea5=lT9RfH0nY(y*r-971M;(lC@H&9bVXq(fh4h8No(u`Uxs_ zietP7(n0J;yV#p?om3I30Z20fwMxQRxFp)MvU$9Qrg>&_u+oq=h$U1f)ny|tPbHi4 zSa^KGoHdDYf)DEVh790a=qAYrV@|NF3H%YX#0W7+E| z9ynG6`yFM7XB2&(VXQFKX~7Wdb%%{~KizO27D7%%Wg$q2WtK&hS12U0uO1jP0s=|P zA~hyqLWf;Rtj#P9KoMn&HY+oT{|B4qx4V8f@g<8uXHo*8+1RTXjGt~=9K`drVD}_)5QG&^v#i>aaG&-9IJHx9}B=TC4 zJ}RwtX`VdSt|CH3G-23-C)p6`gm+5KjUci`&pc3MP@!fHKIR34Qby7pqK>PA675ud zHRp)M7KcpzFZX{hE3A_emh#-pUOje2f%8h)=tE@{3EPc>NJ5|lNo{Ix-_y4dc!#3( z$I8OXAJzzWD=Ktmun=!K%tJdN$2%{)*oyb>O8C3Q|41-PLq0}$jqK@U-w9|Lcx2(a z>ekj}t|G6@TMQ1}tM`rRMX1sBeb1dib1(5#NjhYK0t5hw8g}U~8~|A*Su?PJn!vjS zgg6w(iKm*Ksl1t*#9YVz9%j@n77@iCQyAtOX*KD3`(3SBJFURhC%2|B)@pV;$mBgk z#%>iwn|jn6_B}`{^Gkd1rs~)hYiz{Z3~2fA8&Q6@I>H3uoH#*lpq{}pS8M7_H^(MQ zDsMqS(*x?02|!c9776TU8%8hEsRDA$46Q(jZLu1H50+85AfXCEW@H}PZ+=kbL3sw2 zFrmfH3*j!&E@|C>99uN5%U*@vV{o29PK}&z)6u{i7stU3gRCA31Xpk(rZ1v+Th zYY#*CVuiZxVd!5JC6i<9FnXy%5No}G8kDMh3tB@9UzD@7G`J*^O_lYDSFO zYeKBD-kC*=80NcAV2E5b%abopU*nihML+EC=l;=A_TEy*+spg?k?jssp3ZtJFjbRc zc3R@rTiX>7`a(zoV-dB6Q&o7_E2Q)Gk&vs`W{d?|!1$?Qgq?bfK9`bj&w7h`BZL(E zMR1+L#lKh7pZ?{i?(hHp->&r)2_rHjK}jXvbVOmCL;Pfl9NAC>l5mP?tfWfAtOg2! z_EuHZltGWhS0>E2bPUeHla?gVbZ|1`LB%u9?*jw^+eQ!~JOGjWk-u ze{EBYj&*yITY2bOEXe^U0U%Yd6oO_J+Fk#3be+;Af(v9e?f$7sWij9`(FDO$N_(Rj zTqxAYsOwJq^ya#;{Rw^FmZz-$Y6%#?iU0QK|Fu2T{U85lu4W9GX2ztt|NEe1=YRy* zXW45EH8@IxD?bkl9TQQDW$dL9sUH^X{fCJx+>7QU;R~a{fUsh6u;2%;OV@0A1nej+ z{iLwd-Fxn4b^BTNXwKB89k9bifPrF82@HvFuglyp-h!rh&0OL|s>$v`nhRRW>Gro$ zhj*W;*5cRpDiW4MGg#d$5FMPHxp@+N5_MQ>N;M+8&hxE}hgbM^>wM3id2Nh#=KV&J za1}3;)Lk_qlGt%pw+NvAl>x6nCaF4UO|HtQ5|N9=j7}djT0&WV#Ric-4g*ZpgMp|xkQTC(RhlF5qW}KB2%|0QVaq5fK;+wH)Z>zROJAFo#@ldiI#>( z4loZE1&!K#6yLjiqb-zdRHCdhu^{(WR-GY?h@uIIR567sF3pSyVXJq9_GYbV%|=|+ zS8b0a#ef8J=&ua@KTjMpQlsZr6ul~ZOW}R?|=Pw z7^189BK>s`&I=U*3YFY?05o+=DD_n#ib^S>tc}W{pq31BnL#lDln4U?!fgNhpk(%d z1i(>QYb-TdRD=5MV9Zw%B@1b+Fx2T@4C}Rrt&|QJ4S`U_R#L{aK*(5`7@9EHFp22 zdgJ+@uOQ$FD`OD@0Ct?0o41jWBtK2Eh@K5d%hlj?#TMtmfL>6r5fey<+|2~v2WMizmIRV)qk%4qAcS>E|a#|x`G&1YM7}&&?7<; zKv@GV(@&5<5;+Si7|i0dM+>=NfM&VqyM#2|J(2o*WsGOkU2>b2HvB{kde3A;TVfQ; zpC1sH42E^SX*7^rBBubXnI_qX+N=YtiFR_8GbE;zqj62wi1gL34Sl9v_AIRJuWr-* z^wA~WR*e|Enbh&p%ZPuG|1hc6*`(VVbK_c;-KRKO1X9LzhvRZ?_chSVkOUsv+7tvj z12>d|3~=X;iI3nNFf~NOC~BI6JNDkQY5Yb;v{#sZP|1{WJy9La||ND?+ z{(uDBU)Sp|GkQ)$8vknuClg(XWvo2S=?xHUG{=;@w=9%X)njX3eoLJv3y5l4E2I&_ zW7rTNWs^KynD}}zU%5uxc`PiXqjPXyiy3QYP?SfB^D6o2TDO>c-iuO3+}iY$!!~W= zD?KC7^GGi-$2n!nb#V?TnZ0dYjPI+uM!z!N`G^{?kLV8yu|t3);nmpZ*K(AegIecX zgJ^mlNi}oxkW5jeaH7j$s{!4{gN4jBZ$9Q5fvFNIi_JdWjSuP3e*k??a(M6mTKE6( z9f|*T=cKA6P^5~AM{-XNKyqjr6)-k!WVT|_1Sw0*z;=+O?OJn?i!0tySXK}^CX153 zz*v4$fOV=R*9yp}E2hJkc%szOtW{WN14W9wgptE@#i-lO5YI3ul-tTDvdC&-0O1>T zs#MQ$CG4A}L9sMQ0D+LyRmEnxJlkSb&G}AF4J4B>+h9k^3iXqUW%|9$+}57+?7yu& z_WR%cr3c@rKScyJ4JLtcwLU)n$KJNDRq|`(rEv-)L2r$6f#Hv+T(1Dsp~nIzR{#5; zWZ3`(31L`k3`QzRq#GSQC|MK%pJA*p(P3_m>$Qdo6hsHsq$2E?cGD|0I`a&XQAlV? z6alCj65N_@smE37;{W$e9WkJ3vgB6a5CQxN6qjPcf!c5@8nj%{7t zqvW5R|C{B{-lrtH`VX+$l77?2sx6P$fRhO!gwwn}vygyCvdU*Q(_QLuG&-MGfU|zE zvqu&_P8xy-Tu^&0BFRG~LNIxetyMpSJ>&#@E}snN^3oVW3XB*60VZ2)zlIGd;Vs!Q zq72zp!~pI<5x)&$srKCCcHjDX>?CMU(zXT+LIQ(IFkfdQfk8N|Hc5kb2pYSGIp;91 z3c3JPvshr5VLm5@A5s)35k7%`{k<=JpTpn-g~9PW&B5~Frzv8K28uyp5L#%uo#08B z=3PL2hXhOF)E>k$1S1b@3_J)9c$7tk*Gxo&KqK!Jtn^7Ta-kAt+YP^sHdnTNQbAgO zUki#~vmoVsG2#g(&61Izi6&-Qs?QZfVc{>Bh8fBl`45imi0MlZ8 z;W7s@|NF3H*nkA>XW4rOA1Y^L8vkJGW7Q z+2>o!E}M?Ub+I1F5hywSSRUB@KiUTReMZ#Nw^-=IIwP5u`qLmzY!DPYzZiU7qtSLa0Q^HVI%mEEcvg|i3#_kXSZ?MMTcOYW zTTuUG^+@|huW0Oz*sl@|F46C5jdY-UGMB$Ml?ohx?N)co^Ep{tz0F<~?Kt0CZ1y8F zvjKec#Z8zWD2I=TG;?M2hn?Gl2>rFeLTT!ha=;@RYt7!GQL)ED*CIcJl>9ZO%To7 zL^v|D1lmw*Dy=i`IO3y9l_t>f#o6|?Rsch>j36{3l$jAM`k7cj070PuQ-iSCfiMdU z(E{0-Sf_G$KtmvKYeGjDmtk`5s9_TxP~f=~3_LVAgOVUtT(x9&h5;ER8mqOnYL&Fq zj|o~J%mWt{9)v{^s?;V+mZCtPTp_Kks>OOvWqO$zX!K!nKNSKvWTEWP%(L<)Z)HRo z9yhZg3HB!ovp6Z;vStKG^FxPU6TFsHBghdq5?GCxZJ#k;8WCR-LU+3`xuOmN;GcR+ z(F~@X?-B$du;^zl;>MCzp@?M6_<1a5DeUpRo&%@sZ3*+>mRZ4#7LRA!#t0{3rJ5^h z-6;ve0xkdhuw?cC1gTEiYb-R{bBFs6X@Z3x9idFkVe*Nyk1YL`8PsW44irjSC(Oa{ zUsa2>=Y!~Az2P{5NCq_{6AN2pfAL4O2p2R>2+OjnL?W&JihzZ%!)r3lNC64KXj6Qt z&k%2U?BUsr&(i#~(*zb#R*d7aJnM~(0mVy(gD^k@EPVJOW5NND`{c+O3Q~cg{Moe% zDe6R4meR~A`l3XK2V+jNginy<+T&Is`w31qrPWzivfAURdXVg z>@Fr@>OjqN{5D0%otVcWqm!p z_wV8BaFSuH3ine34m-cdM ziBXztuph>~CNbZ^Y=N(7+-k!16<{KXf}t{gBu(MoCWjdudm|Gf{8~{;rmHItj-HD3 zZBL}J&eH{j|NF3H<$wq0Xw@rOdD2@#OFcazf*Q4xUu-><$vzD3y_N~k@_FR2>8F^7 zn12wfo55}PWK_h1Eg>>4kdV$|cez_mvzwfe3v#Wd)<`D^ubZ8kfx)XgE4%qKN?vxD znFy?Cd&`W}Qgcb?M$kI}>JHDqJR8B$XV}So^mn{>;1&yZ=M;h!qVio?h4$_J=N~vN z#HC8b%uJ~2A*d1cGh3efvy(efolG2#t>)9ZJP{aq zt85sOGeR}?i-v83k~0?otfHep z8l51*#am#o`y&F75;GqzR~j?Cnqrl0`AE8?X9kd-RRn{Bs-)XG_KJ354kN+wt6ONTh!rJdo(* z&eo@gWbB%K3*v?)to8xPX`^P=w&`5BH^HLeR$#`R>||^*wNb3+D;gY#&a0ZlGi4cF zOaJmB@kGFTo;X&xvqTbD(b`$#&mdrA=jl-3^_E7ITYtoK|M5bC8Jsx+d2Pl}IV80? ztL%N0mtHdBpnU)Ppk&Q}1#n|o<19pQOafa@VTM)|k)>&jJrBVphi!cPET}I3zLr8~ zSVbWq#?nsG3vn@XO^mTJMnafr#@qs{VlUeV#fiW0?MLuj-eT1OI659pJjN)H^B%bv zxubg;vdL>(|4;mfv;VotbM{m*gkwZPA;3XT@L;L7NFri`$Tb&d%BVzBiX>TiShK>p z5^zb0Yf8!vtoCuT8dMcFkf2o(#*T}F5K56^ZaYgwF%&013aR;PD=t8zVigC!YI4rm|htgO**cSr{tAzXJmfj)~}~Or!%m zL>D=+w+F33jR6Qn))H!9t3xfTy$($mQ$5_pFaG6G-75K28Et4?Z$ezezto?{dR!Vn8W$CjV{APy!2Aa7{LDOvygqwC z)O+5thC*6=U5ZOx1<@w22!ifmM{TmY(3nCF)EGq*W#Cbjj+$gOGS|N;52|vvO@7G3_SyY&@K--%m3+AsLd|CPj$Df+q29*C)H-U zM=BKwYLSCx1C?b&YO7)NiP|DX`{EX|SxTnX!dF?BxYJOQIEwHi-?Q{kZ-Fx|k0WeKM|GHOg zEXtJ=N~!~yB_!FK)hT-zjf8zVIKMK`584aG0J9Jo6Ak37Cy%qH9$p^xxqk!G+WzW~ zYX9|W|Ly+OH-D)Bm;e9@s3^E8K^oStM+V{c=bwDCIrPcMp<9|O6FK_@lWSb4mj5bdYj=9-5tKLOj12Mi4ush?X6y*0q|jV-j7h`0~} zIsm{o@Icq_V#M;fRIINo^aLS>Da^`0GZcid&R`c#F+E82y0_pr_6e%{GFTx^AJp7t z@@jfX>^!Pkzcs|$Io}i1f2d;ej2{deB8x^P!5vwMHWl4;>rgbQTx;1(%9ZV2y1D7S zD=^PH=vA(-X#P!BD_MV|$XM)8QmK9R)WhZqzaoITs*Xx|R#sJIi)VucZvx+p96<*_ zSe)QGW1aH_g%SZOccziIQs9kHj*fup<&xw5-HFuAr9-%A9A~CmhBHkW{;}{O2!m47 z@*nblH9`c%oO1tX`i}OgQaXl`uhZmp|Ns5k2`0iA0Rjrbg7y-ufdS%5BT@|v2+UTH zWQeIF&gyu|0a12Pia5g<#_(sb_hK_&PS^8tR+O1Q;GCx}=i9Bh?9~X%XumBnF||WO zo*t0j4vNK-CzvxN4^y+RvO;x!Caox5S@9i0bm?<({v4UiB#*fjzq?#c78@R6wlT!2 z-*zlJc0m|rj)$3#ikXg@g@~R5kD1FRni!*tNEPcY8bYi6RaH|QJhKX^g?x@p>lRb- zG!s#Uz!C6@0b^Q4mu$6lV5gwAi}&e*aFp9#X|5{Y{Xg~pPoMp3Z&yMtKa10n_Nqu^ zfPgB5lA&=3&=pxwLf~ug|NEe1^#BEzXIEPc9#B7HE018pbrj8gUyLyr!1@PnJoYUd z;Bb?`R0`gt9w%K#m=zM-cG~hTL-F_G47(I|t;SXbte^@eqCn695*{?v*->8_g-PqS zwoz@d$lHo8sZ6YV6cJJ&7HV=ST8@9Z40;AuD1@$<@*(C5UiP1!oBo!sxe42E5fmRg zoBCtr)tUORS-mWhKHF(L9IXP=TF=#fbJ>0T)Eg*r@&N74_Gr8NDF1@)9bXE$MwdjN z=aBjg(c%?d7>Oj3--pt|m=Ot)o(oZ&46IAIIf|VJJ}O0~YNQyGpK@L&%zoD8PAejC(WYAjxD06`a|Z6dxSrVZ^(v6fTIAyxX)1@w zx^<4v%*+JlHO5W=qV6z7^z|t3HCe`AxM-(NQ;ES%qSx`7={Tj)dpaXP|&D@VeD!f zXb|-B#J24_k_pJ`^$suwrrDdGsPeu1Bh2WoW6e%`E8945m6@m()Pl^=-70L21NOch zA{XWnT*Xc|%B2bC?CtgF2H#cQfsg_(xz#*Z5AdLyw^?f6y+JRgwhFKRY2VvF{i{vI zYl6>i#l?JyN%>l_Dqy%Q;aN}WEn1$&w9w}2!0m4P^E#V*rf9@ad$UTPV=?Y=WC3uxsnwQo0>bq zQybQ4cxTAZE|h~r5NH#Vi$@OGSr|gktBKXlMYSg|`ipBxGEe{aB82-|j}b*gJ~4yf zLL{W%r72)wv5nLqPAzt@tu0fHk3p$Adh-xa-o7AES~3Rrv<-`v`y^_Z#lA+R>RS=C zshgq+w%dLB?iAC-+d^m+CVLh%==QW0E>fDZIhY5!Yj7H9-xq$jFpG;^Q>bA;QtKr` z*Y)MUN7J+YEw}1V_PV~mLM#9P|NEe1?*IiyVpm&9HZVlPdtYUOW)#7lTa2X_0UQkN zJ%@=X60!jhOp<{B^9}%18KelOXo!x%fm8wsv^^ux$j8SbLW^#q%V<4nwrx2!o6OU) zGV!gLW~%Uaota!cl_(Te6OxA~j7gGJrjZ*^BFqF-A_oQ0g+;;jg+gSa+!B~bQwOAt zu|SAh9N}?keUJXPjnz^ck?~T65`GqWK@*mrp@_5#Kls9g4 zoZ0Z+mgamoSN}9-Yxi_6w|nr^B$Z2@#B5N+270@AS88kQ{!*rqry_|dL1jg(BWl)C z8M0U+SS3P834!kP5W%^pzPnE(wqIq--2+#1Xz0cIe@CzWV5RmjB$O(cDFMdFZz&;CiMAA}i#Bkf;}$X!`ZF!eY;1JnFP z>3OQ0D;AYZ@V$8>lgz}rjcsij$suVZ(WhGnK2OO1@_#8MC#Vzl#{Gc`&`Gu7op}if zx98X_a7NbK^mjc-5YW=prw6k+Hohc7LF5S7`%wTyegQZbpm<;=#t{7lDSkMEAk9E! zxSF$JOnL*hzm)}uq9{gGoNrK~P&xnmpk(xb1+-^XGgwM+Ljp^W2MHS%9h+G!y)OYv z4edPh9!y*M;DcIZ(uTYLUH_@qCPV-7nm1Jh2mk{i7-VW3pg;o>&=7+Vc)$00~M-X=2icqPzWm zk{py2EDBvpx6`wI(vR(Wm$J^r=+URHo!|c#`v438A|QccnwSOPvkI9K zFB&*{CtG3Dr9-MP@cNBk&m(9WZSsBX|95|D|9f2 zQrNl5DHMwiQHa9_c83LK2l*u5n%5H*|NEe1=z#^rW>mvT9>7hbJ8uUG85gOYQw=>a z0Wpp3eSn&br3wv)HHCtdnSiBb0nUH*5S^xo!H_?`&3CpeV81u`9ay!L$)+&k#SGt} zKh|?4W~cZ6Pr0AH9h+0#C8yK~2mf}^iNlpsM6iwaD$>adL< zAr|>K;pi?3%Ecq&UamB|edTc|2Oh7wl=ye_j5~L1NxZAlIc3+1FTp9STO!l029eIH z4Jc)->6U=l)4SJZ)z31!29XeAA%u_}bYZCVlttF27<9^jDAJ)t2c0W+Z4vgU(Fz(K zXI$cjbE|_s(Sy)ct~Eu*?fPgY8Q-Z<Xn4Vt z*NU=VG@TdDs;s<;tvXHBV-@6GEGpnRy8_I*qe}P11>HK_f-F84C-i z1(u@yX`2ci$cwmWNH)AqoQYrW)nrp^gENfA?IbLTOiraHbVL_FDBSrE#-zZ+!pzuw>JK1mI@Y%PB4}SOa@KGYLl+k)Kfw zF*<=TjxBwJm7MJY9G3s%C+JCu45!V*qH}RlF>HqhW@FoA-}7j&4cjStyi#DO#rTG- zh@drNcq0IVA~=aKj7y014TxdwH{$?TQDLR9WVN@kHqKvP{U5Jil=hf6y65fN-K(or z2mk;KAO$q=fdol|goFcwjm%t_st5uOFOeVtf(sIWDYJf1R0$U{kw@el3i`w9bqjqJ zm{1B)4LHmx@@CN72NO|tzKBxgPZizY2SX2{RYUVnqVouL&aQD7{E9NFFjX?S9m_R+ z^BRAd!Lf*~gDIXy2b-MI7HX>V#?|s7hFVS0;?u~_(+CbZ=64Fo8f`sAZ~qzjY}0fX zufAKp_vS|?b{Q6>2>Zz)nG(=RrZcLLRiym3?Xo70t;LJetx=D3I6;w6%Ce|iZnx|1 z>=tlUOke~^?tr^Z(830J!*n`U`joJs6av!)I=Z`r?at^|&-xQ6q^R27h@ZD@mOCnf zfK&D~h$COaugiA7`B7Y5HF6<8XQD?CK;rnQ+kh7BdpqZa-41 zimje&@m)DTdt|QIp~J|c1IbOlNY{yi;-d_>l=XUc+^2XeUUdc5JP4QIV{_f#yBdvuPrS8|W`A`vma@w;J+BDV9bQn9ptD6*7x8x} zA6^A9b&x=WW-ZoT`>8FddrW1iq;Oa;+QpE<|NEe1_yh(gXH+w6P9RK!dtYJVOBl7C zPA$DJ!3vD+eTEgB@vOuX0M#X=*Y*eFbd!EkJv;6h$FwnKMn5h;^jA;zY`6dJ|Nmku zqe=)M86m?|IO&fqaD)gX;fp+A$bbhSF(%Bj0g%NEAtj|47MV<;1aj!JGk#%`0VuZH z$ZEG(Op)+>+RPCLtPA%q#*cYFOWU7GloO3>@Khc7CexU!5dg2lgS5=lVX@U0l@W+u zQc)^H$%G8msLOKj|2@_aG2?NlJyG8pRPn>P2WrU0i^frjxl6(ZNf~Td@%+y9AG62v zB08-*qWxski7v^pj!&QPb z`8MleZ>FrC7oOQI+W#t&v$}Y1K8A+NXnM=yzetf0FqD4eL%q)lhX2!Oiep)B%T7|O z97@+%xXMHBsl6tkC)UG@!_ee73sSKrz;X@F9?c=?<}lG4p2j?kAVg|uBP4A}E>l%px?Xqow+XN1M4v~aZt(0w_+bD0pk&?x1*KMK z?XONPF&c>ojjes8iPYz2jEaQGZNGmjWTS(?Vyo~5JVXiCm1f!QELo_#NT!fFZ<80R z#Hmj0zO9*&fy;Jk1^%9Y^e?OQ{;h7i#((Poz#sq@i9m(mo7Mn;K*6L?Ov&I$;$nej zMe#BL$w`qd#Ru3(3EQBRGtYym9e-^q`Iw9_jib(SYNW|m-(VBdTOIT=ScIX1`C;kd&hWDj zgRCa8f)NF(iH3-N#0&N+Vo-Yqv!z7CObX9x@^;N?o7Q2Z@`KLeWFeHe?j+Kc%>FA7 zTR?)1z=NribB=HNq|&H7ainG+fMM!^M+gM2+HpQ(7(;zz-)$?YGQ}b8*_9ne>iG?X z+1LPB#|0W8(X0Di_q(IFvt`nNDJRK_)okbmq@j}(v)>U~a#JSg`LK!w4vIon4YE*b z5V{2G5`JXSFcO6`B!H9r$OLO+%BiJm!bdcYh#eiyH6W3`ahZnhqR}LrcN^=~u%-e7 zO`1SkLiQxC)9g3=Ek)2^v^SBzG@ukRMW8CSEpOYLiFf4EH(Ix@ep8@Qgz! ziCKOZtT>Y}yjVymL{Pc4K67yZ4@XeZv+ihF<|NF3H(uxJOXVl9~Mxa(hYcFZ# zSrz%8P%R{RL1B#SJ*SzRY8XJ1{4xg&j4VPCa&5vlM;NBhrpCW`k_Dofq9Ds{z0YM- zjnNk8Q!L#IIEMy?EE0O6)7E{i%B_vNJYap}vUwvX6{(7;=I?*_i0&rIAN9`+aWzRd zs~6@jWvdvo-S1|;|LEq$#3#;CS3)tV01N;Ch(ds78sA13$S{Dg!+Kx@P{OY>>%#{a z<)PoSyY)@Je_N|?OkiBBcw-%#Un?Fs=-$drlOyc)Xvue-7 zXsqP2k<|6Alg?zJfvi<@I$rTsR*Pd@WqZI4s>v`f51r%7G;@nliIp zwr|X4e;E_rt4NVV z`8Ji|hITkw&~ZY5y`G@%k{OrHw>n|TzEf)KN6O=s1p~)2^ivlBM8jPdVV~CZ?wyuh z-3FY%pbIL3CKPN&DJ-7^ah*?rtXeKCk3qDJaNGKY4Kn}xpk(g?1%+hPBTOE^N<%wO zW#U;EC5=xFqf2&{ zNK0x6006WU3K1ij)B!+18Ei24GB^}UL^NBW5V@U}jvKJrC78qz>hhQ%6B4s!7%>ro z4FW+5@rWjDupUh{kJ^~e|u=E}>?d7~rbw|cS=rNFKTNRSQf$Hr^vP3>Zk@2pN2Y00BT^=5T<-5h3abizsq2YJ#8v z(pM|ort2O6O?1^_5G&5CErkU?Ma*#JyG zG{ZAxwx=F*TV?Q47nWk98lubuSE6IHaMn+{eUu}nh}1cn|NEe1;Eo0fXj8LnHo#7U zyDdF}i59`1PAxFiQ6CEJ{fDKDBDX!?Z!Dl%gs>n zh;t;AFfJjj4Isj~nmASB&~>f<-+Fiapyi_6Ilt)*lqj(U2V5;BOK#;*Y6CQ)oI0nz zw%s-qzG?Ede(42`A%;@gwRpyC-5V2C)p41Md0^=Q1qTibE`?30f6Zi$@iF!DsZaqh z4Kzrht!bbwia}npELw-(ob3IbzyH(eQbd9c7pk&N|1l?xYYY9a{ zQ)9bd2M8Y$d7ESGq;siNiEKTGnOxRqW>En?L>b6xWbSlhrH|3@UZTfI%D_7H$Jj|_ z;Nf6t;nfSNh~$@NuSJ7Wq3*nT0T2F&(sk_ZBj}4}^eWF^QiHpG*M2*5_f17q#zGz< zWoic^dJ|S?vlT)Qf6QY5sUKkfa+NWBu8VSc3p!3X9pm)$X9J}VbB3yf={~aO-{~`<|#s@-rV@c?t!&IRjQNhuYlv&De(PVaUY&J&>%HHY*sF_E= z(xlQZh0PT)&_cUJ$dgd%n}N`%-I=8&#LdS{vwr;CtaPzy(;d~Xy&42egaiZvY8QB1 z3cgg`8<|3?tUQ$g3yBp+YQwbJ`)VX-=@2S^A|uf{RXR$U%T%wwqpb&8VIh(X2_w+h z9ig)BImN+o}iZuRuMGD zsLFViz#yo+SP`a@fRoGp*Lj&= zzimEPiIR*ykNc#f1$bN3`R$7bMBd-o)c}NYArmBv+e!a>j~G~k|NEe1(*OkoZHNVB zgq#wD&-&C|h90vkA_;=Qu^6x*00Ol{M=*MeF4n&3l5E*n1w>tzOVF4M$yAku1_i)I zrVl6xB~)BWXUnt@oZDjiYVS<+uv7u$GBzmE24eb4_BxICt4_Yg<87Q(4MoJg9VRV!W2x!u5{)K>1 zqpNXP|>3Tt{KBn7|Xp+Kprm2})0oP~<-lQQWRI2|IQ&kj5W<*4_5 zm2icfaqxa(3YH8g5ABvG+o#MmV7kGp4A%a6-!sbs8|oWex|XBD0?UNsoM6~n$`~|H z5R`leW2w-2?L`kpgLxj#)wGIJu`o_;D2VFm6~4Bf+%+mf?)7u}bM8>XJR$%!oMHDEJ^}Im1<^92!!=*Kcye= z>}&-_nga0ZO7qDSqeX(2GtgNP6USi`dD(A}mpqGJ%o8rGD0L|NF3H%>V@5 zW!UQvL;7KaOCM$FOA>LPYpf)Cp<@v2{gJOF*3^@6a#sCa6}6e` zt>*nzL~Kz-qps54hjOaNjJVQxios!lMl3|6eFYY>h=Bnn8ybe{EdA7&h3WBFY}>8* z@5eb^j%~reX5FvqJ2osYyH|rL6_*<5s`xXmsv0hA!vOqm0{++D)KHLAHv1u;4oVwe2 zDnQ`_gfv$}Tn~5vEKFdkaEE7k7$(b9%#=}>iUI$5+ang6fM=t0k~ntFtYWgvCLc$6 z%HDN2nocJw+MHT;`9%a^s|?~TG78fQEPJ((n)(xB$i}XV=n2MpBsg$NcNJNd&VHvipX4ywU0wj@+AOs1t zmHsrpw&EVfz}t#?p{G_K9_4yW3&+V|J4=K_;jmin6Fwrwv~1mGEof^dtdUpJ&lEbM zxVSc1z?wLyTW}|F6|^#`xBs`7Uhn_^|Lgz$cg;mQ4gep?B*W2~1e&lNRjgO2>KhzdO^L2Ir9TS#T(N(@x_P(tSzmFVLb z6cYp2h36SsmRY4k3&4=#^AYBzvJnc3vT5Yhji_&XP2OR5u8uZC{6SZhL-2ES!i{(xDvWjT}W&~SsS=qBUD+N;AS0k1Rp*jyGD1gN& zRHB82Y#cS_f|lManoYS~1Mkf*^}PIrKANc$xr>UfBfR87`7nzMKY#Gr$Q%v8tQtfa z5H-t6lW*qjaq%P4U_n5*m^ZO42bfqgRI=UFp#F1W(xing5h|V z-?F-9IyJb~Wpn40Z8UbMW3i1v1fAHTCTjkwR!`e)89(b^Uv2E&sb+Pz>9pPwB-$Y! zdSy<%{ogZ)?+FO9@*#>+#xGyypm7%uZA-1)4~ztiDNAh?62Uq|C?MkDYA6SPQp*

)5mKYAnr9h@jp|YOB=;9$&f@gOI2u=um8Fu#QRQ{+FuL!Jw+Q7lcfD z0)^|o5y0VJ)lhAL@XS)NMloomOYP}R zt=cuf?s~BkZOSQensR?f1qt?2unr+%^PWe^l(M(p!occGe-6VdS81lM1KA?+D#jsS)GoMK#&5*x;=p=)tr zIt1b^i%({-*X`@qfr#>UVNp8lZ*)e&@;_F1w)2MM1^zv*ramXe0KU0 z$HV7DPj}yLbK{Ea);X_yU4Jn+0;0-Nhq6J6^Z?uyW|EW<;gtfW*qIFxkwi-4|FR?< zi~YF2iIp#e&N5Vv$WG#-cp36gM&VH7Kv5{?$S}XhSUEU4(a|(B@;6plsKymh!)dV8 zE&pVu301P?!J)@%Vm{yAMP2#W;XQlbMbdd)Q`mKWGngVdv~5s5<=`u%>QL+WbS?6U z?Y57MWcI+Oj>r&zt||pUI9PhFF|@c*uf`D*9pO$Ib}+EVvGz*+KjOm8AW)0G_FJl+ zSyMCRn;qI{WC!Zi(JV1WmoRbvjouP{_cK7sFwQSRkA~nAcsKDubn#sIyOol{Dc72y zPF22#;QN&aPCXggnHG3TNeCC5xS10^ShC4TV?>99rl?D@Os2vKfHx0Mn{r1;6NVmQ zrUg_W41xBw11eLNXd&04tmV?JY31<)Vxg*lkq z_dH|>+!zJ9kG+*t7(fra;I}QCg!S6EK~4GD$S-2`IFY1@5Xu3@D>Jng9{g?Cy$?Mb z2emlb5~FZ4KP+X~jV@yZ|DYk_MTGlgGVssfV!c$V|I+{}1=+l!*_nrZq`lDlgZ8`)<#*1GATP{ z^35wVeQ6_dd^!BiZ?Q0)yH`K)3UVYDFeS&SsL(QR`>!=rhqJyn=7^zS&9QF-OO148 zm_#PJYa3MTwoUvY>ZP7pr@|D7@dF>Pd3U#O=f1Qy@_r4aWztv zTr3MOmQFh^27>AR$Ee^plxtFDKj(gdd}geCHdQcxJCB0bJGgxsL;g@=LXHw75$+8Q z5SZWEG!%F8rmNYZ{PEl?pNq?jm}Q|LA74Lh%E);#hn&60HkWZp+Geq|jpk@t-;PYh zTAhAZ-$#jC`^%JCNIV{&z7?W&5ccPP+9rQsz83Yz4ly&`HR|w4WxqaXUJR5rQ546) zkzx1=e<1vJzN}qi9^AA4uWpv1`N+m~Q0@!ps%gPB>N78T#q#+N5~Olw#3f{5qjKqi zoy0OzI1u0~g`74wIT>k+w&}0rFT>?fZQ{Hj7dOAtBRU$QtX5ldpsv{6C`6K)70SXx zL4r;#n`RxwL74vsK{z?sW31QpLvU0AJRKQj47wDCf6y>so=s`r6n%lZG$uknV)8o> z8-b8TTq$kajxEWRvgBg2Y+!1O8|9re2Sp80hX;^S6CAhdXG6X;QfaAos3Fv5KWF8=>wcxD z@-rW{a<)v`67T3<<3H;+H4x`>b9H^_;wSTOqCoqBOJ3fd`QBlBDpOCpyv|zv zVQ2c@eeU(bY7X}L^XbLrpO03}+RAr@Is}KT&EpRPu z@%jaGew)k^5Q1B})qT1#SqOfo?-=qf1Wy(SC`Qo>AMB;rlMgxSVC+}{wr8f1xM^1Y zu76cv?a9UkMG-^NhG=l3i3M)sqk|5Sw9SrY7f06nH8|wCfH%3k$DpIiZoKHN&H1q= zS_>}iZx)a$7MW=8?|B$|xA7H?qwJSOv*9JP@yzL&j+GF*9JHN@?u|cf)tYow5|v0T zUH8t_?ULVp4->4(9fJ^>u+f{R2hwULzTu)IW0m9ocbM)3Az+!UTsyqwium{K(_SF1 zQsLWY_5S1lk(t}34yw1I`N&QleC+BHi6{FBV-$y}zQ1ry=OOUgI(|jOfI9hhjL5`M z3!rpIOPX&$k1>Ci20%T8KJEI0{#2|C_O1Uwsa2WAqy? z4goKPk^_MTE{aPd%wN7}S0jl<4byb7b|erhW?LqDO(PQyroY2AiUP+AgIj#m7dPuC zTU%ocJBNQDYB1EUY(Vb~*h%X}a7IE17^E$&5YTY2Yw($Mvbl3T>=?SI3&mQukv98C zQWOa_w$0U?iux?tBfo@qzzNU0Y~`O%sTa-JLOrVVEsnGSGfAMs6nAk-e>zS19wcf61i9ov zz&nbepF~wrZ(cz$}5NkYFhm+l2-8CZKHR$UYbSX+&z z!Kj-Ksf`e)oihTyEgkX;O6IC2N1hGiQ2dfr51Sx2v!kYu5^<4IHvoVEKzSZvEKnP! z6h{dZBXU-4bo^&lZf4H?vX91{XF&bSzytXbZ2JYRj;Tr>^2?t4A8s`PTDg1;C(ucA zLFv4G+bN5%)Ym(L$Zp0U70r?xA)yNlddhGz`S9Ixkso>6Jx4?smgyvqM~wKjbPCKH z*Hvc8uqqGDpz51RN(xzs{1MRd&w7e$UBWRvUY)TqSo_#B#<(d>t9*k8pXXAkbxuUGdd(S z+k$kMig%Upz$7|e?2XeoH01WU;C{fXj0-^B7qj>kWd>ArGZO`foVQ=(`_J)WX4l(a zWMTEd$|o;Gw$-b3DBQFhIWh-AOl6QJSuc>Ob3`KTzpnTk0MB8&q9M=iD>S6wj~qjd z-Q@6p3M}}TvpXCXOHlOn7w*{I$@0#bwy0*GdQ>-xMRNh-Z3Sz^g!SeGH zEV>lAQVyn6BqUV6%KiDdjNz;il#rTj%OgC!ih;$rPjWZgKda4rJOY|CujbmS^>eH` zATx(~FZwG#5ZZ(8r>{$eqA-1&N^{e93Q z6`0h%5|_8xEbBT{;fQFo?x zBPW(WJyeKIbS$b;19nJ$p5AtX!d8FF>MzD{#!`(u>DGE;%UklcI7Kj)zJ;m&E#<;X z8EIAhQhuCE$}uPlx^e=9F&}1?j_FG%?qGkfmURx|6N?~^lqN!;H=>=Zds?hNJW-9< zb{MM^%j-*5#!^Ei@W7jRIClDf)1$vOVwEbs6%h{oRK?6!0dY;`WX*S z@SBi`#^Yow!hw6aPg8DO+u?WBh0BWa(aZto*oK4v6D&*`;AT%6W(^MdihbVPEImWV z1@R!p#cizf2F8pU1~p43*)zP;MSv(k<-$UE0^~|n<2=QLow4lg!6h~*xd#grbC!)fe4soH(_ioyz_w9;7t-|=@Q+)+FXhGH; ze$uDKyK7~_!z|ycKWu+I{Q@;93`|`g6~7UKyKla!k_G4e?Fr&sp!@=gt!BU_RkOgq zKXs_tsNg%th8(xk#hEr%?%l4SY7EM37;o&sSR0!DOVu~|NQ=_yISa|7Q1N$v^fP*_ zQNB0%h+7pf;;h$@d+P!V>|BK@cyFWcYz;RvitlEq8SrVyfpq#aBY_o$4zvEWkHgX} zE`RB3mU1&K9HQ2K-H*P&OX0XczV|)`e8Nu;`enP_Lb@00QNM{}sXi{Ghd;2nwSb3L zL;KB5N`h)TivW-}7iQj@j%yCmeNPuo*+CCsAtD#Q_HQN3SRbS)s3jgB@2YWNhp#4W z*0Rl=>Nz1P$hvd4u35%FZ82g`=%V>53WKWFB&38vjSh=KvnH%eeNRC#N?K+UG~K?L zK^o*C5){lc)4BI1Lx?~cDT=L2t7I0>Aa1P64~UiA!?7=35G->JM@X}23&qM6w<`vZD%IB$<l=|JvwIN<#4>*`0MgUa^(NGuC&^SAw{BFn9}EnKVrnpJyUt1}ak5FPAj zjki=?U<5?kc}9>f2RiLOiSA?8Aq`cV!4u(9VJiS4sig2&R*k7a=F?eU5rr9J5rok! zIVI!b@$k#)$a*LpPV9x?YG!1`iVkv=K1hE4kck@Zh4%BW&|jUt?D(GtrP+!JGOZ6L z;)ahCDwuBH!^yszMN3MW5$ux8o>fBUs)5>YX2y&}RTs{Q90 zp)uSzJCeenBTDp|m#*ZY_rRyTZ{p8vZz*e%2T#W(QR5&I@W%pxz|#FOfr@b4L{*Ol zkdzHspps`dDlFR9jKoCDq;0T6ZEp}U`Ak0N&g3HrI}h}|JXdCg!-3j!UsiPaj&fxvmr_7Z0jjeJrWspSC zhTqL0DhGi{iMpngZwEyc78j`@rICGSQ5%g}n(NBiQp*plJObNuwEI+zO-@eM=Rkfd z8=H~26SkazF`KntV^Upz^g<{{^Sy`$Bs)lPvM3TTJZXpZJ7+c@&&1FG0CoAlpqxZ$ z3t?VQEbfR`bDtP%N3%)gr_=BdM6j1wB#29J=d~g2AEp3o;{2yqmo_Mn`AzWsGw}N3`i+XhZGSUk-Zg?VSPEI<7_E9%GJwamDkS z2(EI(U;E!Ic_;qHoUUE+I39{cz<9f2*||ks(yKdI>2O>+)>`%Yw0E~E((;oDz<#`O zIwFO+CI4^KsT+2r_u!ekX#p3e8N&6h`_E5+_*hkml*9pC?AUq(@C~Gx1R<#wa~ls4 zpB$x-!LU=5r}|xzHl?01;F)tOxG2x$pQ7Wy$xsxt9Lma+(Xwh#yT{~Vspj)h-8f|9 z%wE3E>x{3wYZY5m-0{+)crryYEi(F7Y}VVkGAswFENoz0x>zfx{?3e?TCPcu-2uR; zCc#28{c08kI2calBblLKWyVDcFGs~lLzwZlgq$3J2`76YdrJOE5&O{~F~u1K08LU6 z${&spF^*U%WEuqAP&qL}Uh~a9fLLX9;e&oTcu2M8OG)4tuGz{N`1Jn>au_n*Fm; zrUhR&_T`j~rRvnJOL6phgD~7uCO68ZU`n(!*X{Zar||ip8sW%DzY=qZ+3c9rYz)w? zjEjqaG)BjM3-Gwy!_fifwj1;&NjkE^uKk&Xkb!w<r1P-H@)+GHW5b=_8tnVc26Y z>+ZgSz4MYHlS^8p6afBD}a;s5{p+F(*KC5!+B;Kmj~u2NMT zn%WPmx8Tsi%o)VnfZ@bMoh85}3V;j-vRE^m;8bK*L`W{-z2t%zlbEIWE)pCF!R_lr z9K+pT?jJLI!`OJ~!Vlyt1fQr<(s>xbt=JvOH9C&GN#1UPr-b{>wiswpAO0{JXXa>5 z{k&i-h1j1JU$Ty z*3S1e9d`6y#))1`gL?bcfAkA3c`IF>6F+X(Ik(x(IOud0JY}*5@Wamk^*;nA9`+ya zUfsSNKkx1!=e^@*HZ_L;G~g)EQi4YHx^V-62I`ODI3q;RUv*%guOON>MG#|w zA-^qI*fxRH4`y3i^CkcoGmZlAOG;JMc!Y}e7ESAD6k0T|ilhfXXGDg7x0}l4GpZK` ztUT*d9ao=Lh}4;?q}L393oov7EXDH1$g3KgCHRC161>{Mi1mu3J+F)IyK_UN4B>oC zL3F1FiZ-xVD8H+b>)w0Vciu8q1ok9K`=_6lV%gU8ABv^@+QQwL`hk#D_5IcTUlsfY z)R~82awFhuOxJT<&nzaNl;^Vy;4+p{V6#qVb`ow(mze}|BNG_--?!cngd7*tOYzV zmv29FTzg?~j`eR@X&rDS343dyN$uL}Ji6l*bosaA3EVt0(s1Fp%rukybNT7P(w5#I z=zjQod-zyb=roYrfy0Q~PL!zdfLl?Ju$-!-e7JS9^PoQy=tZ+`a&*%%O|-qDHp$^M z0E0~eh}5Jo3luIBu%kej3`j^Zj$h+vgpuTILA4e!%4U&4L`YaEnQu-MV%gDgM4i52 zEF-Gm38RQ|=-Y0XD;od|f!`m*_w@w0nMq;rd6Zo7aj{ruI=&-n-|HW#fcUl!)PDqj)gtEsHNY zI9>1%cvw|ofDn-V`0)H&35h4QXtT~6?MdQj7vtfQV+p(y^uncwe#3>>AND4y?sb3P zic!s!{>mkT1}q!OQM`HNl|9XDpGSpe7v^VjA#wN#yYsm%msbG7ex(v$^(*?>3K>T3 z$94U*u4|d*fR{4I&bPVgeC147ac8hv{A-?)&?-TVChyi{Jx25s_TUA38zcPR=hXxT zo8AB4KiJ=$DsV7S);#s$DF!EX=s=AMAx!RLYy}_EUFnWZwtK>Fneg{pofSG020&JwFFvBb<0jv~tbKff zy+1xGkZ{n* zHNe)$aAWhyh7i+=IGNrKgt#F7=5{O5bqgMcppqhf>L@C47({hiO~I0FwI)4k&7s}; zbsvk2*}=siV7P5^`)rmOe4k8N-5+>Q=Onc2mylJBCe`HTiyBF5Aw4B$ddbGAT&jL1 zV3}<7o{Qr@eNQg{zTZS^&g=(3Qlk6i0s_G8OEswFX!%No_NMPi*X88kB_BK3)9qDg zYU&yWEp#V2!K|v%N*OU`8Eu9u$%)Ib@YEXJNHDvmPOBu}n5lPlu zqO>l=OJWq%K^q2lvX-X#;X$KS{^DM9Gjv+-w3BdrA_bb_a~?KsnZ$-t@gKAxlt zdl`~UN=?BfgMRARKsKIi{@W>uZxqoZ3qQi#s%la`l8#Fm1?~!!wDW8YHyozV`nW03 zRLnO}08Y@xMCioeP&-elm^R`+2}MJ}`%JCtr6d=s7jmr@PK=sn{+HxmwjM&+ILds0 zLS_-wCzJQn4kezCFNJs4&|683T6K2oT81@~S(<@~o=Yig751j>J5G01p#B0bhE)^` z)`&v@h?RSKu+eQXym(@oTI?g+xv*P7yYm(!3N5|@y#7YV!f)Lh0)4M22IDj;^Z`6J zBTWYtGZlDp<*{oK9G8WHD|_m-NS^c$-tO7qw=IWbdnGbmy-b{3&aX|LpH`Q*e-Hc~s9pTt#vUbz7*<0|tQQYF ztS%$-*CVhgMbqz;2w2PP`ZXnXh=U`Vfo9!z)SxA_Jd*9@iks)GtY*jAIqX)^yj_r34^c)p$AnYH(9ti9H(kyry4F@?Z zh&NhS{5}z^AZ8mgK}?qP0t)DqpJsIHZBk{}L?8@>4KD!V;@}_Hl*iegKYV=mJoB%T z>qxtjD=36F`?T~z7TK%A&I1pfbXUnL>Armx_RP~&EH@jtg1?Bp^ru9C6k*h3aLCHy zbzrG26$vr@G{H-iP93#+Vm64|pz2$`09$%~MAO9j7RUMHGl%A|Yi>qE7;ywE>$$=7 zz_bB?y@A*IH`x=EnO{{TLewfRG^L~_L*m3kosE8poVN5A)Q)`xA|@k7<+G&4;0b*W z#LH?f!te4PjGIkL;GFl93qmx!e7-+O*2$i`*a62M9R zktf=m5b+eU`*97vW?b>64bkLZXjyYUq^sRwv{BzEu}~L)WF7U2`?5X$eb920ck5>T zPeDl_6Q8%ikKV|?ywq9@Xc(+Ux-j({JryzWQ0E=qv!@?@sIh<*DqXPU@11+?Z-(y( z66O>{W|)`4Rq6w+{~_U13!>NPlRhHeBpFQ4Y<%R3O_^<4L+M(HgUR4q5SL^54C8?M z^Cv(68@~Y~kpMFXYX4AyMj7JIfY4;(if|T=5@>v+;b+8RhBXpK3PRZ-Z8AnQUmM>K zvt->Hv%?by2?S%ShDZjRwcdzK6}55=ZxoM_?&k4awi+r4N)w|kRu0yhoqsM)adHIo z(470CO?FrqO#Bt4@lc)!v9@=6`d*{U|DJi)aDPWL!vk>hGM1O387&F*LeZeL|g=W!Ap4m+1!&L-6^h-Sc{ziJZ>~cTf!L?*aZ1 zonv&P5p}1Z{e>$uyr3_PkV&44e|r8ID5+_uw`{n^nTb#CR}CX_WMwWH^SiNfpy;Un*lm^+gMFc)h;j| z>|m=&Ck7_d+S}r9UIH~SIE_4fH6!d3u>P!R{|3mm0RVlK?~JKu5>NXZ3>D7i85{m! zv2@f}1}b%3vIcg%VFmg^*44B3J}K~(#UZg8gkYgGMwT2XWWI8}^`EW5Lc@ivH0xKY zbFe~IU%v@ezCv9uCuF?*x-sS+1mscEcIA}ntg#3bp?F{w2K?9%L@Z?Izz{1L4VD3; ze0#mfTE7Cx)-n(d@4xQ*IRJW4VZ|0rwv%V?9L$W&jp_V9Gwn(zqI1sREC!_cQ^Y7P zTTz68vNAOyM_lyoY_{4|qfra=5G*x?*>*Z=rJXb&omS#m5Or0-rfNqiYeXz$Fh>sy zY8~Ym4q3|a+2r(Dr%`e_e*iBJ zJ{DT1$VR}XEgN!R%g43d^JQ=X?2F8i0TQpKQsw92$YItn03B7YMjA|=`lI^I($xCQ z%;-uYq)F7oi7=^4y_HS3quH0qF8Zm=vX<`Np6?nhO8GQPZ4~<`R2g7|y9rQ2O8fU# z;|}XRl&OMjw~W74a@TPZUv;z-d2NnoW9u#xt<=n}u5iAG9^H7ReVUP95Uf~W3K<}c zySDQ|zw9BZs#x>`5byy6Zs`xu_0Li1nx~&anGO*E3o2+4UEhw_YLA(JPirFn*Q=9DRW(pTqjltju*>5T0?KBbxmvUow%oi4HT_Tka|LP1aX_!M0 zi=>oU1ciF=zOaRhnCPmc)mPdm;W|O?xO4VkQEi@ZAY4i|CQkc z0SF8w@*FF?K8I-8%}p`9b}jT9=gYMFWMb*iQmaX6#a zOw#l-*_qpR9LVQO!ZC2!%(aq}brZZhK}H?$Oh->Aq%g_}oRCNg73TT!2|t+$Erouh zNKsnhY3Y|U8~S~n*>{-d?t7Qq5E_dSlu$Hw-5J$X`1&Qv>8T;r$M;^+CC~fVeVe$5 zNXM41N4`mGd;zchjt%1?KoAIh;_+9?y1x)|0-dtk47hw45|Aw?iKdU>m+$|1x&HVb z9k`CglfYQ9czTp%d}bag1zyV~`Ody^C7&x%2g1HecSQ_A1RW)EScFAoLKLJ#qE7~h z893u(j~Uz89e)ZbCzxFUpj$r&WuHipH0iV+SB>+%LK5nTeftc6$4LKF|#;#6$ zXU?zP(JA`JD=)%32rf?>yNieSZLuQ#d+RLV3QQ`b9kVyc|GPDg?#g4-reJiewr3^) z01O~6f??TO+dPUbt~HT=W@AT!zgZCDs!-~u=G?m+F=5w$icv&^;*3#;=6p39f?q@r zgoh|2rOvz!fmF7Zf`G}yDRZLj{0V_+CXrDnUNS|_@-qovD&{Ob0;KH*biFrh^UFy% zLs!EWAzP4k6BBW0HCPIlgvXpfE75(zja+2%WJ9)f(o@JCGg$dxWeY3aQ1RxcPOJ`B zISMGbruQ_~-20qq&;3Wh3bI&Qw%$dQ9^|tr?}nfb!V&tU-5`#YTMKbE2xkj21s2)6 zfJUv0Qi~LmGg*D#Lnn`II;Ty53r12=taJ`e?|x#KVVNXLfq#-+>L<)yA8k8W7_(iX z1d6dRygV3HOIR63>~}JLY(-AuU0z>(<+^S zK6$DC>^xWhulsxgKh606-_r-aYx`T+(dSW~awH7CD|DHNTi%ovZgzcjypF*^cNjLJ zTff6^rxcDa7PXe-!ZXQ`2#9Ko0AqZ3WqdMpm*a7S(6UcjDIuy6IW&+({T-%V@d!Hh zHf^FrOX;zURJW(Ga?{Z=uKC^d?@C|uU8lXOR>7*H|Md|ij&6IkWjDBU*}v7K&3C!t z;9Uw?%q`K5H_W&F*?0zgGX3QB^a2k1?^V6ew|j?wOoQjw032w*6!1s2d(|iTCkRo( zq&+!KYf4$4?GJGHxghB*=zExn2q46Q8#UYRUci=Jc5EF%r5~ULZIvt&FcJXkqy@n5 zH?}|t8p!ZUV>6Zp;lLuXVWK031goo)5~6q18gG9wE~Pu-lXUrL3VCA3rHXxVNro0} zqTp4Pe2-;%4v`3EYb_?sa9B_e@&4jLHF2kvcy5z|nQ7a(MQFQ*(uGV2=NTxarYcE3 zz4jEt(#7iIkqart{CEA|fE)UxNUUK8W~g@3tZE+@Z7HjSy7jY?!?I2?2Z6lAwpF)B zZ54t%FGEHm`*+Q2eGlD|$O@_QGYe}YL@l3hbiPOES2AZ+eE0Je+=%UV9OtrHh&{F% ze~uJ1N;Z$y&f6|j!3Xv4A1`rz|MvrfAGU91N|)xe@2 zbMT%DdFanA0{kXy15r32IW9q2*dHID7YvhxDm{`M7Q_SG*CX<(g*(8aaJjVyMbQAy zi1Jtk+Uj+hL9uZiQ8XG&HoAO?JZFr#3nG+EWjdMCO|mj>%AV%#^E&G4q2lT#O34y; zZee*;Icw<@K3$3(-^|6Sf*RO_ZoV{=z6*h`0GP4Tn1>q%Rj|ncXJ{PYw|=ur0D`ZN zx~3~IA=4_0adZlRYoD*(lO90x1b=ps)&MPfR>)u@b=p@(BQjTbf#wrM4}(b#&+AH- z3hQ4ttzI0W`%+c$&EAmE!lt7?GS%WY^>+-1hvFZzq=p6podMTa-Qy_7roGATu~yBj zb<60q<;{JQOC1AOE6pc!4bxS}w>Cq<+xu9m9gk}Qw$~`FH9su4xJDns z$GTUwR%_jBzu&xrm1@<9l2%%G&)2uEYHWEQr>lK`yibSh0_Ci%Z=2wK~Z+n{| z9_-PhxgiOhQagk|=^ebK5^hhY8&CF`n%ml-uFmiLeeEC96yG)Tn3{gz7poA$W!msEZ=ol=)B%TSQP}BLbsP0-RkiQ7&qeCghg(VwuLIGZ> zGsTX;j%bqomLL@eo8Nl9jmU9@;<+TGnF5I06GGESnCA-(on2YZI?t(uvrW8Pny(e) ztv|X2Jo#N?+Q0J0S-xgPvgzIb)cf1Y{2e>8&9jX*?wj`t+nEKcoa^&ZxNh&>$(9BZ z-=Z`mglGoBWNB|C7TK;O&saFo{7P+l7*Wgtj;Kx97U|Yood5;SR^Pd!)T^gI7~BFc zo1mUHxh|ZhX5w~$$_5jh2qlIC%{-?vQ1oZvd)?rL(aMS=&J-tV4e_RBgLoUIN6;cy z)ENEi0vknCkwC&)Sss;5IjlNuw1$MEK$xZ2oTb!4~E zi?#ySPDg_;5kQCv@G>6QHOG_QhZ3zcl7pj3dM_PzjHJ>&j>BqlnSEB@ns;#}g>6&& z!+wLg{=Iu%88XX>y#I9?q!Q#&3V{j4qfELJ9w~z;r-5rS%_RGc%=ufN3dQCB+jGH? zS}xnl=)E%UMfE_>Qew^LYba3S(SAXwlu!Mn$>}1}Gl<#--Bmy%KM6PNJGIa2(r5Xi z+z!!*IGu;41GOU+1hT9=%#t$|BRaR7haxgVlgl|nV@Yg=QP@aXSW5huSE%jH;LX-&)zj`7Oe(WHT2)g_!P1Ie(k>YD&*%x#RgeDZB1rT z-HYSfx0cd8e&=hI^|y^Mqb&RNL(u&|nj5zN&MOJGn?qSl=*AU_^c zEWL!2+9r^3Bk=Oj9ESV(O}Otcv@s6|OvX?8|1B$2s3f>H|M#TQI-|Z4^e;%|8{5t` zVac}|MTLq(w?JQ)n8+;znIuo?Asyi`TM0RBILQm6pYRZJpxpl0h=#B9HWmL>+Mkvf zj8>m3Y4KC;psF6Sb2XgA&-$u|e)lQTI>#(k-setg6%ih`rIExP_i~bv+4;qjbMlLg zhqv-=*j`NvO}HUh{&_FWC;8j^?dNZcAKEE7Y#{(7mHdP8o<=ByL%hv zA&h`KUpSTqnkY;!SYwc;BmmY1ES8ob{}JL7tUfw2FR3QAYjTrjuKmVLXZL)Q!`pcG zh@P0oai*q}seRrdDb*gx5a6;*v(lVEj%snM9edhb7|mCd&p7HP8IndW9~t5Brx`s@ zuS^-wg7|yEbw|CL=U80hYD!={Awp>Y0Pz%%cAoseXh}n@0&$$Mm9;hTH4Y<-kq^Rz zASqsbta8yz_GbBbG@8F+t28nazkdFx_zNfK3Y~(Lu;p^0yESozGfKPyG>iX`hN6sHbAUrZga$;20G-Hw$ zWm!}uoL-{ccl%E0zd4uG%liGNLfW?!xtR>nlNvo+<#gx)im^o*#`o2dv#^1Qz$mLC znL6{JE%`qqN|r?;Ooy;?yFS+;SuT?!Xz4hWm=KA;2;>^Bl04z=ye>(+2T0Xe|F8Xj zhszY#Sp#!Ra_GrL5!t$0%VxQb)kRx6T1eZWvw14^FEv9hh*i|Wb0SQk0zUo1P8q+@ z{L#f|N?Ieyy5k*oNsfN<(nvX<`oML>+1bMxBb1&7KwKq2q)l5!fj;H*7XGpz7m@b> z#dror(sZ-^^3krABOIBY)C>#BBjnDJiS>tJDBSK<-VL+f$MtbWHH6`)q%p78uVp7_ z!*aNv$>0SB$@s$q2^gcPstgk$&qV6@xkM#lpaLQLg|#g-JR*s>cv|E(T?PZ#6LN3UW*cg<mUdr9NJ%~cn8Kk`*7Ck9bW;2*82^Vy zG-07}LCgLsTDWdcd7_5-`LFsP(TgVRjE1u$Mj+Y5*_{k8G7R;D zia5ex3q1-@OWN`6mmD@Q2mSH zwkt+GqcyqI)mlVGol=o*!YcPP*BL~Fk3B1wbzObyq%ZvbMd21oQdzlyC(sAVTw0uF zo{YbBBYhKQaVTB{(Vb8vnFMiy`SnT;+glc9i@*wftOWuN3b^Mp?3or#_v5}^D~l8< z+`5?mvc`OEoVxQPN69@GN+`ob(r&5F*EbRn&F5}mESuLyN=2E+BlxIKQ3V6e|> zS=?&tN+tHU5kkS@4es;pr6@M#$$C4w*_THHtNA{hLd~5T~vYm}*GKMmiR8l%( zcmNqCg#8uR6c=@r6Hypa4X$s`vQO!he#%C)26H~hG>{#z+qXK)5j&7A?9?kbNe$UETj0pp*m~w zi3DOF3FCErgmY@FJ=broVE~%vFglNf254)bcRf@YDMKQs+_fp7YJ?s?ZLcob$*9C! z(za9k0HYb^z}HQkMMdJz5ekc*a0hJS$nMRnRkhEg(V#~41l$&yY#<{Sbl1YI_F6Mj zc)D>2RtK&o^pR5;6;)2#2On4jF$>Kwt;ExkPIR3?dnc6F@n3CcYeWs#n?U35uX$Pn z=fZUq0|3U~4l0Ttj#4o)x49KrL9ZnrRB>$!6&!3p4z>a-=oCWzbju)xa+S;xBUNt z?+u6AwUFq8S-^YL8hx&<;KP8_%Aryob;8Ts>%Nz-!AV^JWYqBFAP0db#tA#JG6n>7U$sR}rQBF2bC4qF7$o8BV4{h66HP4tj8DnI~O#ba5 z9VzA%oot#J4`E^4tACh7jU-eRH7RqZvRZzxk%6$M*!b_FcA>#0;ZGwigW-dD>NtCnek z143;mDGu&`1rj%3tW0CW8X0f47Gela8m zv;&T3s?tIrm?MTKTxt?pUM928i<~{QBP5s>2!)j`MqhP zJ3S+LR`}NPNd9Q*##!^IwN&4FackwH4(@-VR}#~tMBS`iNEB|PrsM=+x0d2>f&UW+ z`v36&zI!)*FSz2ABYn4`0stg|gqTtJ(pPEky{mTidCo=@{g4TmVE%ojoX@N-WXYz) z){g;6E(wMEQ(l?P7!U+oxT_bWm9YRcH`=4YAV(ZZgTTybPxTa(e+;Ewwl%-dvV0lP z%ygla-e~zNf+|`@jvkYkmWUEc-(l)%yId{6ZBesQUU+#0vPH3kn-NrzT`ff)!ujI7 zHTLf1fzao}O9F%sag*GVV8XzKS}ujxL|Z9NlTlH(w7jSXd0{oTQOKs-F{LjR=kyAP3ry=} z#ztJM1YV;o3688eGW*$vsXWpQ0R#OvBJ@Y|7?n~QWY@R*Hv>c12KeV7qzFuOYa;~^ z$DC($2B-*MViW_7n9NV?4@lgHZ|qK(ykQsCDv?VY7k^K#vB`>6*nCO>*HnT{_{?b< z8fmP|DoDDb*Dfi|VRW`E=A}q6TgAMR;yT#9q+I(+CsWQ|*6+M#eyJq(!q+7iDyCd* zxlboq=d`HhLKirigb6nsz*2JRSVf9u25s8-8CVF&IxXthgO~wxVSD@UrMAu~@tG%K z$63P;*LMz0(zsME$zB)e>!ct{6bdEfCveY&(UQ7 zVInI`q4J84#beV&B+?e6lTm?aOih({nDdSK(>Q(kso!uhHH<+>`Hue(b&lhr3myaD zrO_B@u<>+_u4LkAUhYq>3qExnG!4n3i$E$Nkge!aC4s^9M(TxPVO{=c*`-7n5@E%0 z4x$0wGA;5e(0m>x!hph&h(=@u^`TLXoh^)dJs9-Tmrg&qqZ-yg zThYT|-GqO0IcgeVKs0)V!QP804IW2m!g* zwVN94aq??wE&(bPeMq^I9ff)lqr*vp%+eHrX=>jq_i(GqHHZA55-mcF%Z7#ug5khsISrJOcaZ2|svo&OhwZt= z%;M9WFnDPio&9)&OCAF{Z+raHF+k8EoP$R|E&TS0qXAxUe=u}JL zE^pWpkP4X9&aa8+Aj>x&(Da-~I{LUHz+{cjd8R^DZ{zF;(H^vQA@{Y>dQ? zqQopr5ViFseSZ&FQjLpuw1`9j_3yn#jG_@6^Lx>4h?d${)p^HEAz_^ zRbGo$I|)n=Dt+rkoBmeSJ|)7?kZ|$nd2K39j`PLyqpn6fDlZ~e6QBI%h~N}r#HQcLY$O%HrBQ~UG@MO8%$^Q z-L};AD=nt&%6e~+N0!LWh@711t3t`{-EMfFXc#oM zr0W|s%8*EYpS7A0RT!EM{1HH$J^{Z+m`B&CkG_6LW z&sD~!y6RK>jNsmGn+S%|Dz2!pv@)Lr@l=(nvUkhK0@tL&EuksBIl}5=vy-CMpM8s$ z%JcD`qPxzOFD3MuO^PT4VgCYI5o3k-&l&Sq^Dh0~dh{V`b$*jSeKc`eS1Q}|$oz3X z?5o%3EYJq~+PPE!q%Eo4DFi^6x7aRKzsP6cL&9Xt)!k;6^4piJr{ZQ!KK;{oTum}? zu70m$_ZOzwJQWtpqkpSnS{=3g1wmdV@)O+1gT*6_y1eV7P_jj#9r&I6L<= zG7J}}h(A+zND*n;OBu%6Z-Y?pIjdh2Ev5V}wU$HEG~NY=Y-;UXE)>sI%AfodG15qY zEC6JrY3g6}a7(tJ9Aov#jM@OeCL4q%riB z0sT%UxNxg-(A~auk|y%&H;cJ7WT9d!@%`WIsB+K`pP~+56e+TKUR3C4-S%U?p1rfw zdi}Mqu;kKxFJ04C9o+b_7QV%bL%;L(g-rC!SjB!Sm1m%)MuwyPpU0@9GsDO4Q`{*H zna02AqCwm+%wSxMZ*JB+{c|hTGEQ8GEftt<4WW@y zdD`~cE9w@}5ha-tfSEMdgH=n(cI(UYR~6rnE|oRozK6?CR1}!q1EAkOEqxFqlvSYU z4ULb2@lcZWV;Z>w;o#~7(|6JTlD4H`Edc>Y=fFG&R8u5mbc|Rgkw7@q2yw{>5%ie! zUueLJ165q#?I9*$R}k5jq|1PBNWVcG`DG{?==RxWdw&1hXw3Tg{qh-C(Sdf<3nihT z@fSNpO&31V4Z7VrLEPVkrzC~KbJn#OR248$2(R3&&LO5Z2NeKo(*H;vEjWF*E{_`FY~S(@4qkcmREWz1Koc{Kv_r~x5eXX{O?TBlJpo@@Ntb$KSF_g9{j|73P=X*pde$P!$ZVjX2|}Z;TbEC$ z&5veK+t%aERA1Y8c~JBgg89ehjJTNC%tw_v&i0r#aXzn8fG$YQC9WzCpOJ#q0y$J% zmB2JkJPOI;Suk6*+t~C*fG0f5Txw5A1)$pau>+*{naYz(_uPtBE29Tr_oRv~(#pMU z%)7hpIOF&zS$}VB{74{VgaQ!U!;&M4f87_I|5qiWMT5YKq%(-IBx5L}SqL<*Fs(yI zExeZXo?i89O|Ep`GQ^Pf4rr#dkA8o7#n0h zle!8<_J%7)Vvk%aI9fb75cI!y?~vgvp-UdQTwGx5Yw2OvumlIw=hR6yzhC9I@IRjB zL_)g9yvxTOU7j4}iVdwvT5wq^@6KwSFzX){fQl2jTAFI*FPeyO zi~w9oWj4{q^m)$BNWDlYmB(VtNO}?F0n zheq+!VBYMgN$0O!y0--C6h84d0Zc(NP*^k;Rylp&A&~=I)2Uob1CgLGsiL$K?E3A} zul#CzLtgQUcfgmZtAfeV z(bG8AN4F$Rb5hI9kcYuCg%bzfjD}Qfqs@S9__m)96;h~oS3GXT!^v(XXeEYhf}m5>(^Rf;1XY0_@$DwFOk?`!;5F=Ntwc3D?U`ydEm`s zIBM=XY5B*SCu$tBhJ3!5TtNsYYGfL8AssyR}ZQAccI&e`*HrV9%1ND;fQ%aB}PI5 zF^_h58X!nSmm2AU7FiN-x_dDO7vFZVX0)9jhdeH#aIt!3c|EfljnV zOfAHe>9U|r(33Ru;Hul~A;y|sFckRbg_KX69epioJ8C*u&AXz7y}L*?g(HlL)o!u! zmGNSyzUvprFg>>=L{FnHjU8~?j#q0&u7HnO@cTtKVo%w|c?$eu*hdQfP}tI-n4G>B zjPynb>vM6H8#?ZR!6!zq;B@-9jY%)0RxCo7C|E=U~WQUR4|1(d-L6>1!X zie%MNgvdzi654ESw3gvWD=KwKJ)xSqvoHGgY=^&oeDsxrKcWDD|8ma*00!yP$df^Q zP6CQZ$#~x#uQpc+rIBj@4X&mK*9blU9a8zv&GVm<&vP*0652f8C0Je;B?@ zF)|@(Uz&CJfgFN7Rqtxg>w9j6uI;GA#x|ojr)c#a=0PK2RoZ;+;S~LQf&FuIyClQWHLLNX+zP!85e?GGD{9u?J-)>z83sT z?}o*18#H!SI%YSw>HEV|8_cyv_Y6VhX=;3nfa02mhHefJ1J9LC;4YLTP z2#ivKm8hOHCRM*JF*6=)Jbbf(HXEN}zz-PliE+d#D#&27SWZcdEA}ReT60SGAG#im zkmoW*D#*aX3Y+76za?GdulSL^;$J)}G^>TY->mQQ4cw;SL#VZzws7l*WzGf*^8B&0 z%&y#;>-oH*h*C50GF8ymcRbs(q{jd1uD7Zse(oz#AR!s4(|`=A8*h5gOE`x~^Fk=- z7PyGXMkxr-Ry+m3Q0UPTyga1M($l$DUnj~#!mtGen403JMlN{O`zQ=6v-Z|kdN6uw zjh%1B6A)PuLKqT<@W*(ztK>9q4Lqy?GOnR;)8U1x5g9qwnK2L(+8B^2j-;cwDlIaC z^P|bkhesKu&IJv9vdqYcf{|HAliYiwgbuSpzSGT|<0AOp4-DSX=Su~U0fdnwlmq@l!c_qDu9cQ80>`Ps zzy|48W;Gn&Top!Etbn_4yMF>KC1-gd-=HrNU~rJ)Ss>sciLOP21JE`_+Rt9&^pWX0 z9f?amG^l$886C}MQV?hyx5~*?A0z>+uLogTVOj}n3}4CY8HO|nk5JSC-8RCGlo-RK zx8$P2#HNAf@yO6;mTA1;Rfk)dOz$xKAm|@)gzfDq)Hs>NiuI$xO`Jwv(cJ#-{?4<1 zSUw0R{P%{LE^7oy)U*@hU#KM8ao!*93m{;!Dr2AI7#A%uy)RU|x5Tr{>gq-yyEe?4 z1&RA?OP|wDPpi==2VKZ*1`SPjfy7QaWxfQ!WJvX!=LH+qq@lxgJ(Gden9k?llU zE<$}iO56li%#}f_cXr_?NBs3pesj?NF-yK9GA+CZ5@nLIb?y?0{-ozOPTvq* z*NeVnBH`I&W(n(}rcAfQ=i#2=oVJnKuMv{vt34BpR7Q{bF0ST0=KM zMD)SE-Y%Ie>B&FU%)fsZdLey#Qdzq2wHY`nd!#M4-=vd{9RgzhhlD2p46mj7ftJW0 z`JhQOm@`J4&|HmLR<{0+sLOxEG&N?O0dsL8=q!>@oC>y=xlvupI^4hw%OK(v=!Nvd z`_lw@9FR7-2GEQJ>&v{1g^fKrk*{DEr+^N>Oj8$K>Hfp4NaO1HRkijWr%GPBUX(Pd z`AleGUOW2;(FqUv`yfJK06zJ8;Hf_33hkPxqk+s{}JmM0;cR{ma`Sr%vfv~^~yGn(%*Qt~pNk!Tzw!Rt~DAsv3y73y`@t64S z-->vYaoCxVrjxUobs}+nzttE4&c)UsxVA`p|PBUH>)sCb#Z{(EV9KGefoCYFT+!pVs|nk zu}OS$WYSBYah>%XPwdbyuZ%v(Js($P9E(LoUuMD0ZT0ow=bqSea}i$MD(Wop4rKg4 zE7FGuHaeLRvE)#AgB{=TgE^8V*WMf+zfNB>JWdS@+lawWCSew`{kN2U1;D^sX@BxZ zo|PdxcZkrqF+&SYYd{MHH;9)%7~n4vKx7uw9?jEka73BCV!QPfHRY2bznH%%tPAG%H$IXW4JajN`BL}d{@pn>5wdR?I1r{15!dV}(I?s{u`zXg5 zI`y|joJ1*Hgx4i!2WKgEL(ph;4MFxRGVXSkco^8ye=fLG2ZO=g5D@haO}}81P-B%G z{DSrNuHV&t;rx`8=Jy9X85BPi0v?(-I^GLP8McaDX=%R{(ZFlMqGQwJW2*NuYlln* zo={?-6OC>Lm|(JEgDQM}LAW3NV3-R$sY}Va5Z00PXgv8KIOx*IuZHlAJ5pHQF(PBRtPVCy0o+!*x7=w`&yu95CX5xfNO7R?DhCmMy2_wiWxUX#3f}2 z%6KDk)I3(^IVl8!ph-qml2RRE@!^9P)zjHv6#bYwHhCOj5Fv_)GMl`Lt@n#ZxJzAK zr44w+yA%Hw&%5scTSRr~m!FxS&q;L_KC%&@x2_~`hbUcvtMc7=G^R9&JYtr*br=^q zR$~{DTcy&Fc6GNX^Q*HVYn2hZL8m#4tbY*q~M1qMa-awB8C$$tKdMy*zxeN+BtEn zvQLZ*j571V7_Q|GE%4d(gV^OBhd%>Ar1qveAK#;b$d!cGM>c(g~Q? z)}SC;{a3@c>K-+Uj^-mZlk2;|(fGAqPDr?2glcZS1Yf(9&T?bHrv6Q6=baA7E-j%d zA>hobk)dI&F36h0V}>cQ1eb{3A6uKX`lZvoJ&mfGKu z#bpHtUT@%#Xt6@`4QnW|tRBPd1QVB}a18zsF!(qTi$tRmP}B;E@rT?igfW{BqP`_RXS)t@ z|2U}Mc#9a4Sq?9i>hH7Ch`d-O!at9Ra0!U|yH0>`HGf@6G3aTH7#av!5DYb_IuOzt z5U(>Bpt8rdeUUHk$M~9@0hXLi1AD&dH-61GG-EWx6p_PHoL7dP(kUoM4A2U~?XT{h zFxdwTcC57=rvxTEySRyeiN|AohdI^9?p)a9P(Ld9-FeqPI1r<>k9M=FpefRzZ5cf0 z)qk{$K>%i)jLIZTf*e_=Dyaw0PW%i0mUm|z=uNQT7646u6_PBoyEPk^1Ofzc9Ny*b z>;8JRb(mczab%3&JXh!>Qrc{?R!aLMbL!{|<>_B(y8%{vdIx`O2r4NKICKW_oBtQ8E1#BdX20K% z#nyQszN6vMaAT1beunC_5jea?fEd)0MPHkA(=ZtcvH}z)vj~rMet}Q>rF^YUHxop2 zgfc}7I{|HU3WS?MQ^FGV;pY459ePYZOZkY^ooW(6lNj&7-+R?lm+vR2V~9dCnPhr@aHdPCRN7$P*ACL8OY;lmO`cgN7(4mWC6y$wre&uXtx2N?uW!j zIl97c&}b2pz~=I+>d5WME(7d>Qva!a!j zcekgc7cMrm;#gAd)O_a;RACEIaa+sa`_e$g;)$5rCfl<49HjIuIF!M2f2JtF^pUzu z0@`S4MlxU$5s4NClTsa>mt?w4sQLds5BoaGC`Zsf7aHsz9L}fFomiDD! zZ7&Q=~sxcrWZ~Avgl&?wV+&_dl$>P+6KJvPrux5Po zUCvq9BREv0uU{u=kfqiI zvfL}zUKbk5A5JWpT>ToBxib>fnr>p`77gk`j0lNKR}P;{4SWj%^L?i~KqPcMPkb0X zn(3zm=3`Fz*(8^DuLu7^sD{!#Ypbko>eSjh$=BTxCzIm(YJ!Ac+w0raB#%B`ZPR=k zocZa9jN4H=Z+FTQG+D=vKjgV{-*9rz&VOe=Pam-A?dN)|CH#qdN|iuY=ixP090cH& z7h|ya< zcqnX42ydp=R>83~IIt6P-{!qN8ohp_!xO7Cef#F{Smccs6@~5-I!jF{%DGu!%XU7} z>~GhF9L_QX8(fM(a|axO_5#qd75D_#N%zwOn%JPGRfnzpqm3>aj^{NbBiqANBDVDv ztU+D_fj%$e_p;IxIt_g`afWM!GS#d?MX84bqz;gsYy;Cpcqc5NL)2??bF(66W$Qh* zanaiLlj&{y?!~?{3URHge!5t1%QFd|+m47v!XIgwHE*HXO`{-0lux~z2D60#7onM|e+cUn$EgfqCl%EZd&)IATpb92k*2R~P;7N#+4ERJibqO_E0u_*i|~ zu|gaQJ}ksMsAj_@EU5Bl!HUb3d{iZvTdJ!xkSzKtuWPpAa(P7d-U*D?y#jGqS_SlU zjkH+ydi7mJ!O4F{c7MZTGVJo@Nf!a0Tb>sm<>^ti1L5UmfzA|3jZ0rbfW$0Ih^e{Czl057%T~i-Q2!rI=M)%e*F@`% z?T&5RoY=N)I}^;rwr$%sC$?=H6HiXQ|D1Ex-Iv{6wX5FRtJV|y19CFS4U^Q4frT&( zGEio$UeXT>_FM`Poh%{h$`;m3(wnOX@WtJ@V%q zNt`0&SW>bCh1AobYx0Y*Mv2K&v}rPLm7g4eCt^YXcB)=5&H%KV6#5bL(Eg~6DsCGJ zGLOdsFy&(nJ7)T$_T4l6@@g76 z76AkXbTZlcKox*=Q5xfLe#i8MX&k1=NVaaec?S`Co)TcBHC!*sd60*MnnThQ8ev3m z*Yt}N#5Kvtugt_+NQ+B+w z*OP@_OAgw0?gu8W3+#S>!vc=C!Ngx(L!$qR!?7O(sPW1L zjF`6L@Y{~ju^Vc>nL!ml67@K;4Sy1B(g4BLnbxB;8Ta7_#G>!5nHjS%07XZdJFv*U z@Ovw@!e1R|mnY}2N4S4TQJ07llDW(_`=FEh7ctGvp@xIeb*qbt z;iI`Q1n?748aaY$b!zML)0ZKRiD21U^sJ+Yoc7CbX=HGYPA>mvvck_ zH;E5jABcBbi8sFXZMG$Rf3=?V5Ek!F^wY%<)sW_Zd*W)dI?g#H+}(=tCrBmOB0K_o z1Pmvlinj21X<|33G@Ex;I1RUK#U>1df{ZDAYtv)P`OuU4mVjyvR=cRfJa4fPmmuE5 zc;t)mjT4ni22G*khkio(M&L23Zp(vg4565rlU}OaR#yX`O7&8qv(308!d@RK^*@Qh z*R*#qLTQ)0*Qo7o1aArB0zkS7JT?^LynRk6yng^*o|F~<$5E7nlxS{ljz00MsnHFX zxT+Pc=_XR57Oyq&XloxawA)ZZ-+ZG44*zqU9HkZdYWCh+M+3tQIK@%i7ht7u!A@bG zp%54zFD;WL8CX|3x|bZkP|>^$`4c*frsxhEJC0OQqu>4e>=FGofeq4L z@rK5?4yCDBHy!L$`o4L*By*!7tFU2D!QKMReP%}^G}sQPu^A}K$Y($&bEu%Qe0D4J!?O5pm2o^P!3hKNPY%I z&>!@W9SdN0t=}6h2HeJ4-kf2SOgWs+9Jo2yRU7mWSamo~?ik=B&gh){f^^W~THsEc zeX9SLGBSVz0OpGI-l!QU4SSG-s*pTD3A|me2FXIuYl6lm1Uag5RddgO5KZXoJRi|m zPpxI~#WQ-c*iPt;JHJ)xw4KV6w%FLiK#@m|l;LpV-Fngw&naY_%#r&IMVOzZaG|n* z2w?w00#TfZ;D|AIC1MMVl{K!KeYZWMJ~GcWS7nBTH+aKIHh=Zb~*BWTUaZsxlcil{YmcT6` z!08r{DlW}xN~q30=`Q{uUIPn(B~zrL+g(hD_Di?IBjL#lN~zXD zqERoIUo`S%1)OUy=|@_VS5gsQkoJq3e$XFcHG_ z2iWHP52}h$QWUG09-W4Zj*i;f^+cj{*T;pcBbIMqb9&w6cmCZ}g{WJ5F#lypk8z-b zC?1;4Y(pk)`PwB+c2Qiw8kg|&67KlcN*=+80j!o!vX}#?$!$3-50keS46$(o~^O4hIDep;K&$}`6h2~tQ_oq%`Z zn3J@PWXpR@L6STm$ZIxY!$vK|u)~1W>NlEEVpb5j9k#^F9o~{#9`ro&o63(Fc~PnW3c;Qt)Vy8F7Z`J|Z3$5I z=Agcq-EKrs|Lh5SJ=*^g&u2kauS@{&+xoJr73Wskye)%(`FQ9 zAUZ8oB4T)0CIj8b%S`{th6s*w$X1McwM-GXn7;~JCElcC?iw@$V~u1YvIJ3sBf~n4 z3a@x=my+f&%384Hnf7zUHrpo*r*rTH{ zb0$6h`ecHaB}Z$r0aXz9D|@W*!c4+B10h1TTnq(q03-{JDEmJGu-N?fG9ItEzOQHs z^A;KlVlue)cJ;?h!LZ9|*V$6hEJ8 z4kdFvry{^B86RMeulFlja@H>`(&gO#=3mgQN*k7^nAZtai&!dSWQ~(5Q#vR2chgUf(dUiX>wy*GZ2OJug3!_$g&ii=`B}&@YOQ4bqB|{9 z&$gqOVcRA8)^TcMG}gH+&ph$P$EM8G1! z1k(n6D(*u60Op`@RaH)A02!#PCM<9SLLQ8wTW94-=-`S(@tN|lu&E*4g{IYU)sRnd zDrPW6wBW~&u=VmOs}$ji$6sUEMWqqk{7Mkg-rpws@1gb{-kEjwsO58uJY}td%*9qM zW(|a^ifx2@CPS30J~hK#WX;+3mF5(gHO^h?K++N?stNO z5fF(;S;+9+3ZYLW0pg(JTHQGnhWm8Tw0QNG_0t~ zE|S0hR5$5~E3=wCkLPNYZFiL5=Dq}{CHf<3i(e{O<&a`2)2H?qqzTCxra=0yIRAly z{!EgiTNFbS62=Lq*Oar=aXXAqx&NV}J-n*d@uSop&reWT4r>TlK_u2m7;FaB#M2t>%JcG+(bH2d`&a7Qo7-Aa;hmjeBP{n{Bz#k= z%Pqe5pYXNK4|sAJsd-Vu^R?udobux_t$nians@}U9rsRPvbn7^ONy!7q6!|#h=N*} zhG?~H!v6%X6T9F=5T(tMhg`K>OEQtjS#Z>uop=3=xP@01p@3sm4HS2#7gaNT@E#G} z>uxq*2Z!BUzx){_NX~&8ff*d1K!g$^zCgeezohv%fqTqWCqE3(p;|3a5|`cEP|`YFOs1zZIF%FPIR9jerZgoM?ump@nF@&sOyS*R$2tJ9Pl{QOvZK$pe}Uf*^bPx~Q&=^qkMib1yr;_-UXZ-5d(? zBGXplJy3}hW`z=1o@NwQ9v<0cYW$Fu{mhnB$Dl4Y8YV`eYLhMO37;e%Gc)?XE9pHy z@KlrKZ*r`(rU^~909Z26s8Fk_9%=6tPINe_iS~A*Uqw2j~YFdrOambSTOs8BR8JLyX!yJ$Ku{UQWXMD4NO&p>0Z5 zElkE5^fKFaHwP;&m6|GJY1d6s)0iPK9mW^t5epCbN0LB;W(&H(9;%U`H#e+1b;8-| z<0;9igzvAEz>n51@B;z`L6e-nY}RjL-lEwUn(b9Lhz_t(+#1XDw14GXh5SOuP{qDa zJy-mi>)`ir75n?9*n2~LQJP4YWuL^Ip3Y~zft|!F#Ov-FgU7Sn{c7b4CJui~%-}5d z-faT|7g)aUw@^Kz+_BXf23m&LCtw(d~j>RyeF5jyM1s7@6?a-!#2ehq_!u0MboeIVpkPyz)e`C++i zc-sS))-dc;05aFmDlv36b^TVa=+O74>@UQ2&mUi3HF7o6q5($jbI@*pH4};d&V+3M zc%8bs3LT!8F_o7W-$A)jvxwd|5Tl$mx#AHstZ9Ha34NwxL;IKYg#i6ODTYp`$>e8B zF+Z3*a`KkDRXi@iTfA5sX^0>cy2zUZzY31SZsq<3-?XF}_yF@GsVC1z@;fiu+JcYR zQ4-N_u%FLkTijerbu7E&nj1NmQDmczmgVA;St5JX3f&mJi2U9#%|e?mWQ#^DW@i5I z-NjC%`4_S%iU4pX$`kemwNs6w?HLiTwm1m{I_B}tVQZe`?I;cDt$EQH@DXP@%$7l?589jUsu)x*WgzSLvNpOg;~{h~(+e zK%C$%)zX>@Xqi~t>BQFEfnYuM&`$&4d<0DjS$vqW=)cK66mOe@VV;J>@p^8D z@&TCFDki?)Th>!6%9VK<9M_F{3jcgLzM9v=GMaN1X)btLtk|7y43_dJvPY=~74n%Y zbsAP0X}z~+RI06b3Py{`eO+K4QLA zMMz;%Zhf$JAJ0gBaN@#3! zyOg900!HDgG_2(VvkRxcL+}x63>N+YB^Y!x1X;<3=N&={EYd7GK77??1$eH`^NGXa zxfj||Kfh(+r-IUw#}{s%{Rlu9Rdy}RWn}D__H}9^F)p96qZ~~oCz*{6F*$;ZLWowH zkzc;=*bc+d#5J3jM@UxEVm)UQsCD5LQtDd{cwDEp6+$JJ+?0Hlw+$7>nApD|V97zs z=lVESY!OBy1(Vru=Q!4!@|$<(u%or{*X6at5xGI*rfd?RBlex+u?T|I)^*<%U8d9Z z^TFj5E(CB=*L#DO0*Gm;2dGrs^;I$?_p|fuyzVr_IAm3LTWS*vy1n@wV_6wLq)L1r zG;h^gEx&)qn>){p8RdoNOU#j>M?ZKFCCezXqg3zIvf01cDUu4BXQ7sC(ZU{hIL${EzABX|38ND+avHfZ-XDJu#HdICPTUv< zC^Sa+kVchrUQPZ^%yClxOY>%)&c%knvLpr-Tv&QhEDY{CWkb6%i5O^FN}(#tEefmL zt*c{uQEfH?=m{5O8(8E@bG|SqDDb$_G?~Rec5L^{8&g^|O0#lWe+qQ__R5i4#N-N8 zKR18Ou$Er;o52Q{Hws9&4Awaqsz#I zeQH*A)$aD?{C9Puth_?<6-x}h2abB#Y0u~k#`=$TJ%uo zM?{#Knh=p6f3%r$;Iz6Bk9TyNwGykrtY4sFv#ghx#P3>^a31Hj?U3#W+<{wGcV z0iU;2zn~L2p~IWAL|S%VTpSYWg+UmQB~U$751mXHuhg-p3CBx@Y)p zCH`U#ITBSETwRZ6w!$PNWz|rMSNyxib1k~={p|VDuKerm7ccjblTc$nD7|)E)&gEc zE-9xSFJZ-4)tfr4)85%nQ|x90be~QXs&*`5-d~-K0MH~wmVDzX6TU&70OvIX;1FuW1539A|Q_+`nw{z#?kp$aV)GB+V zw$vXH6ZqGQr(I|jPzcUJz+kTOP4&- z5ye_)anJ9Gnv7?}hf4iUv!K<1|vExRFq-kUL(=2%LH3<2?RQdj611z&*1onp%Np<*({rzW%4igGSy*zPiWVLd7Wv$Y~lG^s8{qbt$ zt@dnH#N*^s2;$uq=O*&v3JXFIB-wsEP}xk8G(wRdx#W+N}OX5LuCNXJ!YCk%}f=zFqgo`t71H00s=*!I7b( z5@7a*7nM*tK6^YrSUz;Y1hX2+SDYFL&c`*WWkA)OJ*Rqa-z|a0kUNOrRs+t z__W2c3LWb?_g+T_ge3wReW;pjozoe1X!+xxd|4541*@d-3#D>m5kfw(2a|x&#Ui>| zwq)n~;c8EE=|m}QHFXcPq1{ew-XjSrQ467RUetFp=wOP!k+qLZc0KVSe_jnn#m|1g zVMlU>_(zY0U9VVhfIZVs0R+c%mF={~o|u`EZv~y@6#eIq zwQFnwHJa$@<*AT4uPBkTbCKVGL?MXLW(1EA$tmvTa=vog#)HfSifFfd}gq+rt$D~;_kQR(DWxAkvn zwIW`)O=6$pFEs|X^A&j$m2akY)NJ*b9mZ4IvAkXqU5Rc;{(4U~d)86X+>(ejufohO__vv~P7+c-LW+rxuSe8})rVQ_@%s z^}agVEXXbZREBe`rN0WagEShNyMRMn%(>9-!?z|=&LH*IjzsjwlLrI7WqzHfjmRXu z+plc)9atD>V*RTat-r)4u^lZ$VTdwl)Y$eL9+p^+$c_*3AFP4oSigRy-hmB46deu2 zC9?%{hMGF^s-f*frSbLrJ{K*e9ckFX$gnfL_7)F1rK-CdIdH5Y^9}-2d&^&cSLg%+ z6sohWrt1R!+#lfL?H7s^sacT{6>n{SSn<4TxEd>oQ-c|}u(aQ0B97Qge0kh_^>qEd zac|xH(y?>v@S@X1N?3zK_5%^c0sIlz*a{PaNJe@^txx41UW5xXc<(;ybY^+-_Qh)z z92_GqqYJTj!6#!}kN6i8^l~$A_fBKTutA2bySxo92<^Ws=7JLL&)<-mZBh9m}pwIvAh!IUz`P5pu=*;HdKp5 z5d^5qoly!Hvf47_EzefeQjjBztr+D1n2MiXeenOjy1i6hJ9`Ygz)!K^5t21B!WgD27lfJYZfX zp#NxWhV7lU0kMEVBAyGSiLpsCCma>dZn_jpBj#!v{+q_NnN+)f^07?jfqy-fwh?TF zfx|zJZrIe{a%0UCPIp7v8%sNbag8Q67Fv0GIHlf?{F0$-myWptr zWnI9J@dHqG#EaHxle`s8yREnt5o>`yo$As1jomIc-gDbLqXtlL6{Battn`rx+w>@RGW+d16|b zXPQr8H+x|?LD*MY{i`0RGV$^HD*ym5NS0DBSki0wm_!|7UacBm60y#Y7I$KKxzs!d zN6cVqGEb072p2AJA~FgR8wNQ54~;UE2S5vlg}D+;3cu0f%Aipp+9LM>$;e2AQmB6~ z02G6#>s417WKi`TNHyjEp3q<+3&N+T4Tk>|C90#{gJ0&YE49?0C50Gw?aEm9*j38#vc3kZ6@f$b% z#HM{IUR`Vc`0k~&vC~;A^t@a56{lJT7%DK$>u=WZ?j+^?wktPor=XWnQuij9I8!uu zg_ZUD;I5O!mWu3SCca#>!vHt8U0=f?#icxG^9R%f{rGV~yv(=T%=^Fp=Qs5I^50wE zng9R!9mk^T?%RC`8UhY*Lbl4{#22kk#S?!Jyd5IzG1OyW6;~JDC&r`|PYsU{scy82 zw>Jo2QxUJro`#Fdz>0JO1!p2A62}$SHZEwFa_u^jW+;vhkt4P<#2?Xibz{_9ah*kQ z77-czi2dr$`a_#?7t;B%nqop*nz(W1kP^0mR z0Yh@!`!5cxPZ=2^2m}HuYu%HNMa-q0gvsA8z>zcFPb`f}C?W+kU^utGsDuR8T!_|@ zhaLvtzh4#+4kd63ix>g+pS~Yp6jL}nu1&rRiP01_h%6X$Wu?MG@mfJgi|3gIhP_*m z9|!@?Ze$-3Zbf5@53&79Prhy{2rm@{p+ep@2+|VXm|9>?RkZg!m)z<>H0C-W8)gCx z3BEE<)O%laY}o+4!S0)4^SCo%c7H?@(F$1%HP`?x^Bma;KTdmq5w27MtDMh$k}}Aw z!$N%q7BhW(-;G)v)2BEE#9eJNHa1p6xx6lO^BTUMnNb=wSWapN=8LH-fkJ#bre=sS zC_lE$KD`8fp}H5i8*(}Ir_6~UZLQgTkT6pbpSm9a~m1a$9***$^9YNhRyMvl16ByLk>#L^GU94>j ztMH-W(CzKL)|u`OECvpRDa3Q}u+!^OWNJTBRm@W0UVyCAF<=5)PxJOM{=lt$V@#`2 zx!j(Jm&}L!1f6A9gSHTdv_M6YEq9%Wh-uX{he%3ZlB?8=)WQ3-co=n|&|~q3e6#7# z0^qUaRc6p5u3B2$x9_qCraAvfGBy*cdqX?~Kcu;PYsBqqV7w(CT3J~YNK{wqO(B3V%`0d1r$eQyQNO;D^N@9)xSZL+inYJ}lD6?0y7&>Y3sC2Y-%0C|;bzWN%oW z+g|nQdiy>zy61xN>Z9VzA39$K34@Q}rya_Z*QmO?qFP->MuMArISpi~YfCz9r~Mgt zn7X8q5k&Ab)wcu~v06$~cWz#768i9vG?*v9FSs>_HnnVdzj`t4f1Ne}!rXH8#%vdw zWiJx{Fbf0?B=uXdzfjHzd*KsB9rbGHRAfCv@@YAwD1<5r(-a?Hg@_aw9RyA65*0jI zPbJ)5M&z1vWaUzZ?ls1x41Z}iIrb3#L#pf2?4woY@qSD1nbLssqxa_K%*M*o)A#7- zU5ftlwAMD=x)Nh@!b&rMh}|`1A%5aId!|)17o?^iQc6lyCA^^h>G8sW3S;K2#xDD6 zy$L_BXu{pq@6+#Y)aWEt z@UeT8^Bej_W-J&R;^&GponEeIu?V2D#e11FR2P{UN|6Xt zkQi~nU|ceC@)1*mn%Kgi_u}iTRy?z_CwGh2`$?hRc+g&GpZMUv^1b2*o~g5D!^o=5 zA5d`xaY2n%{msp)n=3cSv*F`Rx|GBf@C(dfKDgoMyFe9wxZ&H_;do?EUIH(qr%Jj^ zn5M?tMqw=y9E5==dC?S}LXL>8soMkXQ^cFY-Vo5V*5ok;^~dRHlAX=}GdvTQ=R=|E z>fgMQ6pGvy6|XWiB2omGYb07E+Yrg`>fnq8g|4>f_r`luM$rXSFrl9#GqeZB(F6=K zp|5 zG;maK6Z8}{k#8e2PGZi`WClS7I#A#!;_vPl|J`XEV{5WHVW00^k?HMy2fY9~=G8;x zz-9@d{AsntI%$TgteHa~I(i8zbe;wPS#MQ9Uy@J_iy-l6KmcWa6F5xB8aPAQL(*E_ zz7V`0a^0%nqw>rQxWIg_wH9!q`6R2L@TKecY}}Nh9rC(R+p+(CqAF}dU85My|-LU)#P;1L?<95 zuP~U|ED$X5vW&X&l^OW~c98*ql+vI!IBKnwA5%c-H>kln%YBNZVbJ9w1gGlL)>J9K zw|=_M<=@O*4i-AAj-9%gkZSVh7}G`Y2p}WkrC695r+y4Ax`c~&GIGUHlSqc7xy3|lbt_U4nq(qV3_z)>GPR&L zK{Khov(q(id1C{T^VEp8=RBB)mc7V4$wbzNmci$go@fP}oSj?xmQSmH;lGY&X7O#v z7?}rOI^gpxRsJdSumBdO|o*^b^J*j>kNsKq9YEA`fZI4g2F?}ioCdCceNxRzxyMvuQur) z4?Pmo1XT`JW@D;SLMGD(gO(*^VG}=`!W|%LNcBEr^ca z;w&tvcy^DTb6^ITE zA1`lYI3n`N7hhmPLI83TK#ReHD)PgA!6qf_?!EF>$v@n!j?u4(rbzccyU+Tiry1MW z@3fmQIKrpJo$|zoNE?OEXS|k?g{9;Bdmk`qOir~q!>Wmg!Ba6rsF9lhO+b}F6-7ai zh+zR>i*X>R`?+a`PDYz{ZLEP*IPM0x1HGy1B49+#8HrC8{9d6V$!S6^n0j{(>l13D zWV>PzSZ3c02yvCSW(*dt{H5>+YGxeiDH;e1yf{pTF9%2vDkGZzBH`K({M7J!Ji=xz zR8VmPvCj)EFVv_ebJ?SZp>gG`I()%q76j>s=3=(ej2nK|v1Zy3C0;}pnK1=_DdDw3 z$;d*_R0h?S`pMQm=bZslfQ)6>$?8z_y}vw9T|)c1q>3X@{u2eMaNG)+0&5H<;mixn zP2M?}HAkG47P{t7+5@jA(oK+p4X!^Aa520l1t0l&h zKjX$rT}e#cw^P*%wEvmlyHP7?Sa@RzxO@wU7Y{2o^R`EEWEnF!W3Ra77h59PG|M1YZ^p_Cey20b;B`EPyGLX&Tv;3ke3#_JajL`jS<{6NtLGRKD-u!y>r{yw7vG1Za1BnOd602 z5U^!GsSPtpdli0Qp``bYP0w4!o3ffR@A8U=+oB z*by~K6_vrokvD?)AJvYh{#DQC+xI`BKTJ0}ra#(t95+)e3O{$D?#E57z$jnlG7_q1 z)I^uy2K{;$*mP1B4rp2Cei<$v@ge`X#|f1)$aktBN;a_!I9$K}FA`q;za6TGmfauhS9BigSak6PYG5!PWE6nS$rVQg#{u6>(S?N3 zCB&UYxBi2y^1YDL+#H~T?sFycZY6&af8{QYqfh*KB1Ub z;wo#u+=PV8bl6VbCy1-`7gJ}g*gC5{{?Lq8CUuIdmPJLEtGxk-1*8SQ{UcWj+Y~oc zco6`gFam(Zcz0Rr3?6uS6?ctwOljCc8i%a~b;7s|I$TaPLl}7zeCpOGW>03%e14tO zvTP`<@Q;73Oi7trb~Wc%F3#6UICOQi2@Vu*0yX~m!6>CDl6SHnbs7xj1!chK{L z5l4?{Uyhq!PP9txui>0jfhHV63w)fBAz)#48<=lVrUq zkA{NGO=?2UxtRJ1(yJ{WV5&0W(rT<3WRw@9J=VS%N@AjL4(oo8< zZCYZMC`ohhB;ZgC$39h7v(G`71RI}tMBJG+Od;WK>5$)}bmb!d3#4M7wYYV+V?sR&NA(7}4wc~$C zl}E%D8KV6}1`=oGbIoQ4#{dN;LqK}XcK@i>dw`^nzM^T>$&hD+XUsrHA9Bbsi? zP2siro@+=dYMOk7jm;-RxAIFUv4loG&c&res}d+z12}N!+5NXY%Iyg;Rha6K0v@*T zJhmWO_pjll^5oh-G~pjL%Y~@FC%zjC4A*uZVb68c05a!4x^t9dIr58%+`=6hb?G#- zk4U|jZQ*qUCGGBV zaOwqt?L$sSK9n{$Kp$cK|*U$Ber*5LfierLHJv!ooBiR0PodVzM#W< z6CBX)hS{e_3-{NlB6BOpfjal`q1%*H;WbfRlC1}Q0--1%A}eaO9~qRk>Ca0qXB(hK z7SuwS-By}~hEVpLX2<3y=PO>bTvIu5uC~!IS-$ryuYfaVlge{2#_{S^kS-*#KpWwJ zjikkko17iIO>Hq_26j0}G}5ZQ`#v2f4LR6G%N>~(sMxKyRr{Tb9=FS?;yK|R*=gCC z@kDG^FS{Vx*!}F-o{>{Q>h&2meWk0Yf^McruK8ZziVy_wWL^;omRT*tpCKnT9U8G8 z88fQU6DBB@otSsy>aN)2QMIThIlKZE)Q78#l{razuf8sKI%{9(1^&tcePlhfJp>~S zh3(hc#wkK2U_z{l0coP4;s$Kwba20kAP{R82L^)`AsKGNm zE5+?A1Xw5{y)cKWs^Zz{OhYy;YFa3j!me!H0i)0(T%{}QJbZWFT)8!Om|F*vCOYZJ z57iRZ?DwocDtfPa%KAwn$ti$`?Tgu}vfJYx$WwdkQoJ@zDxDAOzphO4udvYZ1Oa7X zqR>hgl&=N)_(_`NLRrp;py3wTn)d6bLBh*vw#ITQu$6A&-D@{(Y53xZB>d&>si8pu z{q=FHMtP+BBC;w;OPaBTBfc72kX~rWOLyEle2zIcoNC zi2~_p>ogMy^~A@!PCCIq9A&Sb~CVUUQbq$gP3R(>C566O<1&0s41A-5?Ng z7U>WAPc!Wr%SSOC8mfn$&ueLm37l867rusb^b2>zxfK?{=hQ`9N^6#NyAaR`%}6BX zLh5bvMQhr`T;q9f6gwM}&`B-V)EoJmb^4gpMkMAe#kfx*6WdnSak&{ePF*#<83n2= zq)4nO{Ie1_6aWP>K&Qs1KqIHGbeKpDedy?SPbW&n32fpgSQzo7+6KHBRZ3;^yYHG^ zBfXc_#gpmE`iKbY=`X8F=p`yDNL-?qCG;K~B920_gyM~V zOp1AvCd5SL>iyG($N{F|k)AMg5GX6M zm@f={^U(bcen^#ZH$fi0sjD9FRkUCiy=343eDne{S;jm@Rzj}lYQ@p@vbK$5o*wY_f4qh7^1W;EeI|%% zYrwvFF&~+s$rlTqMk`D%f zY>uazP;XwlRb@Yo^j9Q$$-F-4#l$~5d=IAL1OL)*8qCw26epG*GF>CIGU6%4kwk~# zH%owwB~BvZnZI|eR>RHC>uub3|2#~fvM4lRM7fmdMp?Z{tUY+1%;u=uYCRo53nmCU z9`h@W6mk;f$|zW;LY1~Vcx)ulS%hOa4$8^gD|%N|`nCeynM$$fze9V`54>G|#fFY; z{l@@LHo_?(FuhQts%V9nC-j^xitJF9>89|>Q?)3%%Glb9%<^loSADZU9}$bjuK)=f zm0vX&9fW2dI@Dzh~NTvst~Ea5}qHDt&@zp?i+@wSHcGnQLNxeHV2p zN&NFS;_%e-KOL`vgZPCH3Fd)4!Xq^3HCe#vD;U zpts(JpXMG81q>)OU?7r{4uVRJ1Xw#qFP9Se9{Iz&NG&rVk}v)ZbsJ%RqwRriJ(LuleEslB`Pp=9my6W3csz4sCN{Y_H#!jFJn2K&v|KB_+tn4^Cmz4*gB#T7n8#>4uG9c1k+ldj9LL_5tAG|100; z>_Y3^5bzLa2+2BC^{8iv5Ep!Od_(7~lAGq@A_OLB<5RcwEFp7sh)W_sd|?W8!6sy?A-pE`5mQ+ihuSziq!*gdY(TQGTGmPKmEY)Rw4B^{@oy=yN#jwmhl(EOaEpZSCN4xW3yw2r(#2~BX_jGwpNzNHcd<$S|DbbvfWaA zD3EjEE|2`})zs*bMJau-3gA;gCLzvH>CX}@Ddjp~ewwI_w9i|=l>vnb-NVX;wKjE_ zcN}JSZb2EhHnEPD@S^*W(0QwQTQuz|sHPhQ$O1s4XR?RfMOYdWs+GFFwVesPV<#*( zuw&INE9@p`kriwBRjs+T(TtbqXReVc%+Xj+_gfN8>^k0kqa_*trRod-JWpNyzegcX z;)*ToOBGZpq5s66XIwE>We>2ju3q9UB9Kjn$?+zFV`j+290^3gM1!kkrI1ro9Ol)y zD4--hJ*YojePVHkg}I@se2`ygep{wdAl_s#JoOK0A6?0uQSK9w)$!1ablG~N3zXb~ z%h4pASVpzUPu|`1u14VWxlrcpG}=t8Lz3rlHkawg<3(z%_V3~IQjV*OD5WPC9K{3W z^dI9%PK*_BzN{h_D3*d5=SKNasWI6USjUWIl25~bMTkUk{fNJ56$`0bT0;1Qc_r5m z8j9n4UdPTvuag=_vx_o(mFvziF^g2$u^vy}I?ugl*!fW2F%u=PONhdg>~|BoG9nU5 z!W{cVNlEMaaRV44&G2cJ*x%Zw4*lYvee(Bk#JE6>=rJMu^fmP3ehe26tgtip%H--8 zYHIUue}cCs|F_VVvjI=SF0;R}JRLUTT~Tc>>ESw(Z4WFyHq!SQ?6&LmbU%?PeD3L* z0{-2u62EkKmmwKyM>(Bw6klf^)0nSu8;m>p>z~TY4jU(ll)$xjhuscjlusWGgp6gg zA5o2x-eJ4 zisxK?o&92E{Fk~J3`$lPgj|qn|CnY;5RmPU9YVGiL~@KnlqCLNs$K%XpNv+#;ql%? zjNUTHk5zyWg*sJTF1uGD6^|N8o076p7VDZ(X(R+rStXJO8ukrqt3_B~!4pLjB4ASl zqFu+vj!t*kA|~{lEZz6UQmkLn;${zK(t6M7`jp!sTvmu&rD(GwQX( zelz;&bjCFM*XRa1qf70hmGxK6MC3@u?DX%k9+u<>n_N(Sv z{rjCxkE5d069dHohU@ZfDnSq`AwZ%1Hnl(4F&4x=F~n{qbTHq4sXE~Ye)g>y_`Z@B zFYvOUC#6R#w$Q4oTPWLrIB((%mt{Z1ppafw8ta;o?Ro#V(faw;Bu10-mCW@w-Z;0Kv->Zc2JyBXTnO;m|@+jS?L^Fp$E$S_{< zd$%$ztv!~y=_Lf}(o1Mj1A;^=>Z!bP<@8GE3sY5(GYbBPlB0oX-=@dLI<3-9HzxQ3 zk*fG@Cv0MS7~-J0B%Tw=1XCc_=`mwMSu8VUepc1v++Zx5Z6_851ITqSDq(+&xtSo? zEI>6ew})7FtFIxym@^G=th3&qnl&*tmr(bN=;URhw^v8tYb-+<)k_kq@JVdpE6Cu{ z*P%x+oAY;e$I0Bs8{4g9P@S-pTrWU~xuJipPdZ3iD|W)NBk0S|{}jD~61bT+Dv zf+%@LGEexQN30AWpir4Av3E6!?R`<snnaKtS_0#A9#n3#`iwg zxX2+-2llZF&Q+#PHQ&nla1~8+JZrFkB#MABS-DOV$45!ml$8pr_-NKuN$cqEKN@5j zvPN3ko7ZmDLhYN?$`0}ijZ!gn!>`EDC&EUH-J(aw%_(#+IPIDrun^4}hec86e5TQ%Br})=o(VKV>47)GJ4e&|oVI-uZl#BO9Cfew_p?Myznzx8 z&h?(r`@OQf$h@UW>b=*fv|C)7}(weCd6JveQMcvZ+Sq|0l3Vekbs902I1+c;LKntl+dr%_65f<`93{#;t3`+T^M6X;bGf_D9?8& zen%Sh!yTKrDnaFcR&|1IYWr@E`QNKvw8Nj1n`D?ybDff2{H<;}aNWq)&bD|eq_+NfLaPTSf#2JK!A1xqFxdbL12||q0w&u znwza4sfA##az5*zHKI|DAxA$dEi*n9RD{&_ieE1cj4FUI2O%5?4e(&O(qe`I2(qKa zIx0dr^<0MHd_~WeoanalAj0Y143LF^(G|}RiiqdZ-aATXLhe2$g*g&b^0F0yWzqoS zB}K|hB@c&IJ!%nIb#p7VSL0w~=X8;#VCEPO8%#~dfKSoOv}s*5(vIcQvRtsj zEXd=IMBi6z9xAn)_IwqGD-;(~F>aM4`Q{%rJbWB`$;qvwhA9$b`nv;rrE@ZH$z`tU z{kaZw17$%DAO(DaBP8r+7WI$G4TwS-HG?`q%?U0cKm_=uDkd1(O7nlH^E<4GgA$-X z+1mK_krPgAwJ+o`R9Ju%Mk}|-Tw|o*Z{;=33k61Hr3w^!(y$bUh{y%wr7<|AG0LqW zrWYcRz7$n$!ibsr!Xh*k%K5Abyte_HY^wLg%v27?#0bxT*;c-l+% zMjI@wABa^OG>#p67mpoBo1DgyljselpP5IMlRzo&zL^6phJipo<~wQjVgd7D8rtO4 z62uM$gyoJ%i*GA7EQ{sTVitp?EzwnFXL2KRyh&`}sL?J3hxxaKmxz+1NG16#6;)9O zu1z^I$~2%5pHcpzmY_0lq>^v1+AN5fGQeXXKf#JV_t+B^fRT8`L}^y#6OOg}Uj<9G zAKZhLs)Pdopa|V&aMlim<(O|)4q75>rM2xy0Pkz(_Hhe$L{`&cGjkI3XqblJO3|Dr z1@+OAYwc1P%IH7yVKJt(hoBIN){e2Zp(i%5gC|0{?G?rFrBCM#XCv5F0Mx@5%`W1C@ZeTP|`FMvEVCG)bm=tn}A7O||RY zs_XT;yTO_@OJ%2ue7pXJfQ-3O>u^mFS*=SY_Se0azj`~_EC+v(mfT*=esXQXNz_%b zr>EJ+Ppi$prh%YLDP>mA@yZzZc!uGVkP&>HM*?09$KAhZuFlPmx#|tyb8tvF@#r3^pt_*csG>FFt!FNT3UHNp?LH^4 zZ>h@!t#JHtE`RGbl3T%wDl$+0i-Ycp6go=GzDmn@4Rq<>$C2 zE&wPW6g4i6$@sH%gX1SEW8}ErU&FlB)G?kwW)+0C1$^ik>hGX(f>Gts3*F0g+o%8O zJ*R%KC*7_L_Is#f+R^%ua+alkeZL8#r#A2b^q`xaA=$`dbsBlN&&oi=&x4FMR zmz=$AosT^)`h?J27~D@~`)uO+e!eU3oz~)RPtp3#QsfS4q{pEpA;ii7I>nLayGcAe zmn1VZ+NljE_8`&@Cm@$upL8zl@ zam^9487Te*DL+{JPr2cqm$S2#qV$PfU*;2@8az^k{Hc}?gyZ^C9Xm&^NoMAk>>A{` zZn(Y7BPysx1hvm!AYHXZ79UWBLwH#58u~?_b(fE0aJ)07_3E)bHnQ-|;t8(>v6%Tn zB?>3ui=Knc+}(PS2w!_&Ly{Jq17jI;-`-b}1PK}Rl{eLIN?LxHIo;5bprymwWJ!kq zHq&_kaLrKjKjqJCu=Lf)I0aM4)j+m-u4It;${mryIrI&ye>A@0E#$^9I6 zqS{o+I9T8k&-?llZ`PkA3W_^Vk9-YM*#zs!fK{W^{_s4CT78^oL0KW0BNOTVKm>gl zF%)bPHgQro3Eq8ZAmVQ~=_$orhSURoGqYI=XT6kehwb(;;tzK_{rzYKgXfg`Zx8lgT*DP>MI6V8W(&nhBnyI8 zuh6cTYkOE+kTQ{k$&*nYjbXUCI7F>R8aG+Zl&ceR5-G$#Cq(548j3^HS^|-KjZs#t z1TI9`I}#f3Or!DLmGe%elK6kHy%I!EyK={tMJrQk&EY6~wo2oF`b{Wa{wQtG48J}806Q*cQqve;0$({u$@#)cv(b#?U$&*;NY zj%UWL_M^9R4z8mTbZ1F^xFn%iXESu1#?PNaq)1E+T0%-ejTa^?Fu?%EIiKpR@b69k zcPqa21CASOd=L#r^K{22r&gz+l=XV5B+1VX^5+W5rT z&G^F-cvI~-BxLT~NWf0NVeJk@TCJ^0^$`7y*tHowJDR0#T<#ASiRi${fQK4s8EjGu zUb}&Rm;JKv`|Yx~B(KbY#~qOj`kLBbo_ZZQJ@er9u?G$DV>=fr=N%ETO{kVIQq9QL zxbUH1@r48DDi{$7!IoIcLA;pqbv$XUI<5Vp-@;g>jfT);Ik3cYi`_;NP_Uv#uEI#+ z(V$Ij`%T?X-w_$1w(Os79rj}|r`8%oBIWdV85tV$R~j-02ve5ro7`ztokF+r%g9+#=msxE?v2+=5Pgq~7pQvz!~b}}`dKbQ8XK5{vV z$WZYW%XtDDx(Y!zrgy)q?T~veGf8cLfT(YFd9|y@iXJs6;%*0Dx}fYu8DCiEcrm(N z=f9J1?g#tHa_M6V4LiX-O&O8bsTc(tm4n=Addp8;gCfQWYJ@Ocf4D}hl-usQEM5?y z>mIhGsl09Kr{6iKaL1SCQ$31~nt&DxuCCC53e}i?Qr-V`frF=1y>!Q~G-sw->Hn>5JOM_Y2zb*j)~) zs}iW^;=1meu>fbM8@=)SUZS_m>>n;lX=xOhD^haduq(2Z9m=qu_&5BM$hLt%HdBZs zL(_Ygf>$aAQMTEmWLvDC^{UsPEQL44(F-DifuzJsz>foLwhV|=-ihVv>7^?;4R-yh z%Hh@fneD-8)|_)NSt^yHi)77eO8@Ha)8$S*{G+bL>hqtOcZgfkS={opAB(S5N5ueY z@iH(g{=O7m+8lG+)`C2dAs+|QTzM=MB8K2;tb}f?n=Fl&53p1_$RC?5WQ<*82BACQ zto2uR`Dwul2kxb>@nTPH?M~Iaj3LMQSUJznwa%M{?r33A-RIjD1`oRFP_TvP61LPb zHM0(HC{nm&bcJOI6H!lLIS%F6CL2wspO(h;anaG$1c^U6wSe)QfM;YZ@BnxqJpfwj zzbP~W0Ja${*?dTuwuPe=M!TNM3kiC%AH18KT5Ff9-*&%rT+JNuiSDqZ6Jl8sacu5Zcx=T-v#)FfKA5e%!uYSY?A)|DzmKP|i!4e8m zIYa-65{|nCks`cO7jtuNdo*pD`N^)}C0CpBE$f1P3V(_F;`&C8K`u4vhhFi>$WWuz z`sCTl?$3D^EFFSU7PRH`=r#pRZvgsiF*1ge!sfmC!hT6_oQ%F%BT9)T(`+AQx=rnK zm1Pg+m`f~^A&-T*?|yuGtG&|Cklk?0rEVa! z!uuIA5^M8gwz(sE9sPTQrkB!RH<{;hXfG3C4N#IQscxPPWQg1*0Bqvqr=V_lLD!zo zPzd;8SbEpB0^&&(SbG($xWa52j{69h$Q;&)`eoA#WJvZ zYUEFc`!Sss(5gsO6FOzT#`!A>Wn|p4t(98z0x;v$nE_a9+2)^>S6kgGgLtqw8?G4rWJp=h@q?V;T;hg&^1@H_3#5&2Ifw(>FT_bN(jW(u zNCp~>3ec&wuSE@zzamL`Y_L>TBN&9P!GwvQjib4Yf>g6JHACikOo{Adz(#_2 zcs{EY`N(nIS%KwZL*b}?nZUhBiL|>b#aV%EK`Lnk>R3rJgKR;j4vpkuplU>%_CzuO zF3c*tiE8bJ!01%V}GD0R=OkQ}VU;unq&h)al$2*&rw5vp+x7zlwQSoiNcq?Lw6 zG+YTxBk~sw2{=k3V-CX`i03@($-#7_BdXqEU}@$K2KWUd8%_hz9K*Z`%5sfe+fbC^ zn?zG_Fp(j9Sc+62D^ zJ?=lH>=XdIVxoR-0zmvZfml&g4@I$&BB#{>fFZB7a%YJJ==ZVswS=fw=l5uw*&85_ z9sKwu99-Mn@&~(vMeus;*pk9wpEe%BDxq>cgs0`vR$fa+3S)u3qLw2ay?qTOHAr2J zE1I}9KHLoX#ok&flY!$Y{?z3qdc8_Rl`k)5uuOg7*J0^s)$}H0&_^x$8TV9@&pIuu z>vdGS>jA_sh$aXH0~Zz|g;e33yk@Rw%-BkZ;T)__28Eu$&1l+3OyC~boG5MrPd%xG zLNU za(8}$q(rE&FbE=jj<+p_Im08sxu}?_)GXE?<$W;zAWa$!lbvdl=3$XJg6Jq)MhxgQ zUL5vRmf{zn1`9N^Ee)U=-Om!#EX*>8#B511*<*fXNuUl3m7)x_KEE6r4c{UnL}~;J z7rg&gp1j|TiQ1}~0#(PXaaRm4gqJ>k+$c4|uTi^T>UOAZGdRC>q3p)KQnu2z(mU9x`+zi!g7$q*a?iec&-yy}i$?4a3+d)!(d0_Vj7dP(M}6IQLv#Dxoo}dax>A zX^ZMFy6JKYnMecw;`+box&Qz3(cYQARF`(ZcQY6OfCa7_cBfK%kYsBl6mBz$cEMtz zS|S5FmPw}p*62qx@hD%A;X_Et#p4A@Nsnf002pwKnxFBGpl9lE(;lp3pleeiWlG$H zQ_}kNmJsG@v_sz1-qYljH|k%N=VmUus>b*qD!jjN|FN;tAY=(I)^)$y143kH^@O;!-ElKeY%^!}ZuGdSJG6!|m78r?x|CF** z0D_eJ(uK1T+9d5$^n@ieR)c|oUZ@|9SU8<~bv4i_#+R>avrFsk?op3k@u)g%4ZfOr zoBQS?k@IKaIedMBT_@Jl#0>&Vw~Ked%v}W5=(l z<4aBFi`2Vz8h4MDzdbhd{;f@L zNw0pp`7`;~BZSu!4Gq?O#pQ6CW6u*F5fla-BJZ?hjz9i$N~k}nbX;bd9JP`(nnC^R zt{X05{2#;SYK(Hi5E*eEZ7&(yxt;KtT&tR(ZIIfrA*9r;>b-J1O6<}VI!Ic-GLuVe z0lIoPD!>%{Rw^!41;r89Ewv3r6W@opLnSU+t%kw4r!Gzy4VDz85?1%JKyVFRxTC=? z75<%&Yy_%<(Nv2bTZ_oFivP<1mvkumt%=)e=^Yao*zr}H1McaXf=IoVU0mGk^GB7K zQzN}se=4)%6dI2z&KjhI$V-2l0r)$-32A_e)=-U&qKwb>}QKYgO>4AZ<7KA5TPQu z422z~DIum*U2J8749P`@563W!npun!HHnU+&aY!zx5q7^v2qaKji zvk`uT>E@;Dkj*6Y4fvb&%On0($q=P+73bu5G?Sw#o<+)ERcWM`FWEXa&9arUM5U;z z;j~wc#_qBL$dw#$y6^@D|9$A9>GW-!_+s^}e)tvdH8RT)XBJy1<9Rmf}Y5HJqLYzQ~_a7NMSgxk2hFvvzJ9xA6D%)kQ8YbAut~VqvyQiy<^69>biZ#iqNsw_2?)l+5_#_;r`-6Aw?RkJ zL|s2;g#|OLpx2T&JIB*|=A$h?a-q-W^U<86JxbrG=`_!;8+EmKyz^(lk`tzblTR8H8PRh)Ibe<)m z%zuCncR2z83TyozFc6cKWK^5DI@4SblL#KeM9fm_7gDP%VSs|dui;8OI;tjO?p7yW z-Z^xnevBx&TE2v)hHpR*+d+t2)V%G-Z%;mDF=E!0|R zY74@P&yb1(BcPNKuv5?=kicjw=^6V7eIggcFtoL-&I%O?@u4e%_AXjO&P?g$C=DIY zuVbBe9KO=RB|pnmGRRx34rB;7e(k{7{3KzL(6Vj!=yM;q^j_6Q0|;L5QF0j#YX&wJ z+cKI(FId-24tlxt-X7XaE}jWr%q#u=nfMd;(a@u=~@Ls~hF|nJeOivi5CDF!*;@EutOp zn;Qt|+k25I=xH82VUS6=SQ>F5`j@ucYEg5DmPC+2+dfjq2*0>mC`Vn&`6%KfE2}`ITg?Nvg==G@Par9YE)a7==;iX{MwMBeyJUwqN?t~D(B8{x8bR&@y+=t7W2+_%2+4;e*b%Y0fX=JTs@Ui zE!b|V^5h#}*`jBaH(Z%55O2Es$7S(wIBL0los9P!v=ZLLPDtwca&8=V_XLk?Xt%#u z!{O0y75FMc>i?O!SuCy>njP-Gi4}6kL%Yxx%1x=Uu zV^^n2G>ReIVtyLjyIPW&D==af@k;ijI(1#oU5{s|1ygV_AR(OPo7zb+Od$~9SE;Ue|P*@Fe7aDJ#1?s(;?#{&Gc8}-c?J;Yn(yOCMonpu8-;6nKLZLIUE&0zU3 zoq`s|YLX2FFm06H0`JE&t7S2AM>)B*pYOs4^YVzh&Sc@^W$Cs>e_PP@t8nROHLU59 zI3Km))^Qf>olfAbUxZ+>1}7$7qXtW>taljJ!&2_7NYH z#S4A7UAuURUlLiSKUSl!rVV&OJ;cKo|a{4y{2%*5^3zURXDG@QtfkfRo3A^$ezZ>J;Hv>X8G9CL0hDP4O%Q@caM zx0Ae#A{|(@1ZZDx4n}nc&ZGPiUqy+TWk$*|1hM1YnD|48hwb{mkgHcDt1AG}^FR5B*ag#$fFL4ir1z@Gfu zDu&D1*Z{Ju#ZS{QRL1eUQ>#)+AMh1&Dq~wOQgUy15)hj`rzJ#jt9S~Tkl8BFR066G zQ8Q0XjEG_v47xi3ReUA>NoypmO9_g9)@Me;A?4Ur1pt*z>7v3$(GNM{;KeCgU#dPW@{!e~ z`=e-0@*>mIQW9aYk(q4P3p0jagSEXaC6%&IY>3`GsKD|CvyWg^QOxK>aF!999_|9(q^^Q0P z8Vvv#ak$E%vter|9uUaF1mWst?(j7Knxv&kZcxzOv}FC+tnUr;rD@OW_Fdsk&-i)- z#VHyDt716;|NgVb_DB)mMj0$1`(UKRNs;VBJ=MfIHMfmqAfwFA5F_|Snv}79KOR-bW5pO7m%kCRkpA86N0C%YcuKPIBCp2d$XE~ ze_Z3;_Aj}J24c3)IFOKZtU z)(D4d0-?CWvHm>W7_76py(=MF+xI#Ktg>oX;rj2g2du5d&Y% zV39y{)tE_h7+-S;e#X1u)-5)SVaH6v#QrJRkU~00;MJ3W3yoT(eqh~_y882%=WRYT zjpHHbla~7V+xO8E9YXo-D<0U7O8W-C4MjErxech*=Nmdt|7gOieaKHq~bC_d29GcsS1^q^T?W(HH`unj?*!&e=;nK9N!>d zi)$ft`xfT%7u4XSm2J3 z^F6wX)%z3WKUv(DZZ|{x4n_{Gn+73j-?P1nc*=bi-5ym?-$+8P`;vHCQ;o*2mrk4i zTN6Gwe<$kytqH4MC*Tc3s}|gnY=ed<0L^)UtxpXAXcY22^8=7R9T8RrNmzTo`DWid zOuXPD=P}TKD@{B;^;t8+8H(RuR}C9cIOQ7+*>X+1Q)=CC?{O_c>u53QsR@_aLSC!1 zwRMB+n2;r_0gvD{YwL`3eS%ATY89L7hPZq|W5LC1!kt=Ww6$G4JD?b?`SIqMd|zzl z8;64&Ndb^W&``ABc*w40b3EpDICKI*b^sX}jJJk3ZmQ_9J~V`^s|(b(`C6!p1%fjc z%LNw3BLhJ!S?uXRUJ4JyYFK7?athTC2W%oY0w@42C-_09str~+3{`a+8GxeLBX<6i zMGeh9h7hDZEL<&{iVPL2I1LCup-6GztyI$L@hv3D(D8u&h1F9@2+ib2eIN41B@td; zeJH!G57sy_hw(Ejt0v-Whafe5O%`yXawbe3$^U(E&Ra9gsG+~PRdh|hvk*SGM=x-h zY12e-R&!qfNpamgUk-{<$)t}+drA?B?XP(r9f*+oBZV7npUmNtY@HPXkxy2ED}FYJ z>5jLGZ0pKmDrh#wW}}NJi#MX*dM0M`p zX2E9dSp6;L)f5HufR${cQ^M8D`z9ynhJKORfvv*x%bDYSK>i2%bKCUL50Nr#UfqEd za8h{93+JIB#3v@7I;VObtwWEK-&$cUaYFB!6ENYi>|U`6 z`9tADA!H-tHT#39Qg@4uVyWpF5n^{@Y9`Tb6`|p~H^v8pdcrWcNnJkWo&nCn?Je)xgdIFk zv8#mvddkBokCCN3reY0(bZEcXzv2i<50OO(sJfX((VXc`)#G!(^(0)l`0u4fj~J`W z7Rd>L)eB~5d>&B5zR;=Pxv`MP4VrN{w(!3idHJxhm>{^mm*|JIE8s3AnJC)uM6{yl z%inH#85SS39~+}iv&0Sv#Ht-5bR-^ST;TkOx5kbP>dldwz2|*dc zB6mv)Q+z>AM?R9sCGyKxInWajUr>sJ&Xs!{QYM0&^|D_ggi#bD1t3BJa<|PzP`Y~! zLCrAuNbGQi@c1C%VXBZ{%l?JlXv4YP7)B68w1KhWe}>G^y3jkKM}QtF7rDuN?X-hA zw*9{W=3}Pnfm*J5pG4#=$LFM$-XJrzWkMV!k`)YP<}01`8#*f%IQr~btz(0q2$B@c zOCv0>+g4;s!Q-VBaRs6?h^222ANnncfoYT)rRZ1?T15IAw$Y#=pPx3p2z=DBJV1yr z@0h>}pyd*7+XL+8>LtqKm7L{8TFA^w4H-bcS8HleZJ6M~e@cc)h{8*MtL1ZyhCLlB zm+3O_K&!3{w2MqZ#o*cBz6wJn-Ya;zGfKFk2U# zcC8)_x@i9=Yc4Y{ne&}ToFhr5iQx!yoM5ngL|6cz1ap#MTr#%syo5uo(BoAv>37~` zt{QmrNpp3)?{hs5;cr4geAAgA%M=b8bXqL&yb)Gu(OYLdkZF+QG!6U0)x7dzCAjVM z!ot7%2}C_F!fI|u(^tA$gTt9tkdJlfgID?Q`y#E9MqXQsj!$DlnH2?oW|!L(E3e~C zYi&u&1$BN;lT}p4s`RNz-7f3XjYp%UXaEmJYjLn?(>oA9qKU=34<+6j( zHb5?~jp0lZ3JWUDtQ<0TY?E`=5r`<7XU3k~GBV6Zqrxh$J!2E?;V1V%jkZf?@Y`5G zlsqdZcroJrc5d$d$+yW$W62@Dic-eOJK%W-Z;_v8~VgsU7Vq9Z+ zlRgcMiPU(YKL#Z=4_!ajwBb-9A9OcWg>mnmbM(ucff0g`H5X9F=i<+IoDgjJY&9y1 z8L*bvMhNH$Y)ZmA3ePABk@PdBwi_wIkYW&cL8H#>otL20_CA=XK}X?;?5bee^7b(& zK*FEH`zEf0w2*J=ruq40ME&eX6KNeR-<^iF zU1sbbKi98{Oyf5;A|!B`*z5fWHm zffBG&y`@pN+|7~S(dUrHj4pq`|ozFei{4;EZK z5xdWPtwj}Q`C5L~!^e<)jaN-ysY}n~Zd$M|_1o-qK&U%*Pg(lp&Cf*-q zpLdja5;G&O+fwfoaTOrKH+eEry7}Zn;{9=0^UJq8S;+l95sf1N0CpN$yg8li70D-i z66CH)9dR3o3MI)R6I9FQ-%mvc}UJ5v87IftKBbA_)siD zIL3IwOG1{%b6WncSw~=Gi)49MP`1bE-Q>OIiXkN5-Ts>xMYNdK)GgO!!>iw}U^uTj z7v54dZFDjYp872eQ4H2V|5P2B;X^H3sfSf&i| zjAi6Kf^Dpbu0HeYiP$3PuqCAs^D)wRte-TiE2z(Kezr^~qCZyHd_;TZ!!6fug|^us zI`;qv)AT#=_o8Z4UREzG=f>mmXkZp=bvyFK8C-fZk!2rGG=vL z4V#w6vhIslGiSVe$(X|<107PNLdc{cEK!(->CFAx{SR_Vsi&GYl5w)!mJ#7hiFu)8 z`U1TfXq8q!1R=NXcQj>|(@3aLy6Aho)AB@&F|h#PG{0Ux@> zM?_7lw{?OInd<{^tWyqgr@=v>tG_`+7UbcLjaSpZD32`IR}dZegczO8o3{0SG51~) zwvxvQ)%Fpp(T5zl;>kK1v$BO#AY|J_K?4?Fya(iP(U@h4iXe>wpYbuvL3Ip zW-ysx1oJvbO8})gUem-`A|*>y=f2K#M8$|N2V{pa4+$GhOykv#!I|O9@WyVnZ^r^) zYb^m#pX{>cp*3SLf1u?B7t!MbgdZ8D1aAnQ}c&_>SOrb|J z9Z6^5id^+8&8!kYx-8!Dp6Lc-Ulp@wJo9 zbWkE*j{7bJ=`AVRjMyw>9mzLCfF>OkpNq}POy$gj60iilL(5?D>^F$?|i2kIr#bpxmWR=0JcOV$dB^lZ~ zib3d*ED=hB__B<1fbu!DV;S}p-n8Q?Xm5UL|@LV;cRC9Pj{@tWS=b@uh#@Z ztA>x9T(HmEX>@az&!(?N_;bf9n(mma-=;<0RhZnrU`dwg67rwXKal@79rpZy^_CwB z7O|$xuJ+bfDjp0W6FpgwtCc1SUHdrROSD0St1;G$HE4g$o|hDVY?kT}@VVPrOEo9a z?gX8s-akP=9`V+Ue$_Duasbwh|0R?2ReRn(M89&!Etw!3A1&9tHVCqr7ZXB2MyXez z<7Y->gjQ0xeh?y|=myHk-J&;kF4g_^IwD72B-Q_!xQ9C*)(OuzmJ9`JIeKL?trJp2#$cULqMx<28^VJLh%Y18Fe7R(Ss*!G?!K*`D{gv? z)4vk~{`$ofxxCt=2a${5%Lh~Gjea4yiw~ROIl@n5S~RQ&A)CL4k9Jiixl}5QJug0L zys;OnQD977ZFTu)w0^!36$5n<=#xsc%|+db0&>K=YMry#wWWicsqr=04mOh6bJnaU zo=i32??e@+k6!OVIj)UU_clPIuZK=I_RhY%qK)aGf-5~?#v03{=_O55;ndlggUBUq z;Go=kUB8h5LeSXD&ifV)N5XZxf zSq6%fg)1k-(jx1S!uwf6R-PzBGFH0}()TlC-4KRCnx6^GHZsTEEI>|Lk!pU^#PIA8 zVouItH^m8U;j@;8i!>SCU;XN6Sh2AKi5zk3DipA3dwG`*fMU$CoiUkOJ?^l;=+K z1RopMo8a%snl+(hVD$_P>oEVmge4c+Gm-QQ06;4#`JTo3eB&6*isi*Hh7N+qzDcG1 zQtmqoXx#?*CA$5yS`5p?+240R*f62%bxM1$0XbZJmy8iI5nI{(2s`Bb_x>qcW$A-~ zbt1Z}eGYp}h$-OkF}__(NI%|5<3|13+W5P>za}Dp%XHV02IV4)o1(LyKb;#&70aBP z+`&}S31Qeli<2WyZ@eIdjNOK_6bFVtiK8Zp(*|^~2$QWZsz>m9NkzDk{zO)quYK={ zZM8&Mip}w3WTtsw4f!Uod$X_{n(exZP7o0ddbB^l7*!D7yE~T(B45Cl|LaM<9;h(q zUh3~&z8kEbXcKJ{jmJA0M~yD)%@2izEqs}Ws0^aUNS)X)855J zyqRsG4fVmlftX_eJoSG&g;(0J{g>?~dN{VYUNF>lyNx|xb&GwYYQ*VFa}A%C}7iC!6?zh)%b_xVE*2~WbX$pa_&iV4fv8MQIA4v?s$~u z9Uz27lkVQGB`5#sq(!R#&YkF(p&R8kAhLlByUk&h-ED)@Ss4vS{hm>1#Wwk~_E{yb zW?`F?_L#{m|6B<@FM~hrULaC^W0{6`V_A@6@rUM3;)*!V>^1WhmFmK}V0ZM$q@aS# zq{h&a^I~4ygAu>VI&!Bo&lA6&0=6i{=H3VQ*?;b{VHOaZe)Up1#F-*dfsC4O7GU8N z76g52gWOM7yeCMS6L;!?4B|l2{#AP-L$G`L+v;zSdZL)?))Qjo+W!%oU;kU=#I(f% zq&L{-IIw7JjLK{9j$z^GioZglUZwBogaPr~lAzhOi(a9OLPuR>Q8;QG;T$YmMT`VZ zG-!3v?SxhR!oBN0v=#{Yc0%9G!e`~w&jJ;g>?>7e3Sm)M^z!;!F>oqv)3S&rSu+A7 zX-0N5Y{%s%7=t16zH2OARz!A!mz{Tq+**#8c4PWBFyPiRg9c*`IxD%txr;e`pgY@J zdatIrgTT)r6b7rnGJ%Iz<#I|EgazSbttY!EZ-(BU(E&CBcu8rti09x*nQH z_!)BBKl1cuQzB4e`H=1+sfc$@J#bzqUy17yu`v^{1`0w!FSc!n{_0ZUqc!Mw^i}B* zhSR3R>0Dc4=NA-Xh80M}l_Q&;=a~uoF@jiS-Bu^7b?r|wydTj~yo+m@y1uN5i8+fU zN^VrjtU@GcMTg$yNMY5PISW7EWwi8)?#t_UbWJ^g*qjHe?)bV7959YkWm3U3^5zij7skT1Y5a(&B5jZ7_fXHrAdWE*=w#^KSicHsrzs zP)!pam^x24n5Z1p{e8D-wrpe3BzKSC;E{`Egi$XdBDq$a`Mxp7IBU|u>&|ebw^bZg zu`>Sk;^4Hp_@gB9pfaR0FicvL*64k3w;(2$1DzCeyUFS&&)V|eNx1TZMb*}@;Wo6E z2=KauJs`#;^Vch<#5@*>Eo}%aI2->V9OQ?nL3xOWy3%Oef`fhLVUTnz|0tY>B$gd; zKy8nrkbY>{5;ot5F-YuyHdCazNFQ?__3xUuuwb}+%i1@wf>CI5)Bnv|)=F+8JufM- zsJ6RIEfUA@HDh0c79rr5oq=hMGrG)#`k*@k)x2KN57U0k0bNzSS$sVd)Rq7#R(Usb zH)3F?fPo$DpfZu5CYm8EhVP#~o?N(bXrN}EkgmkJ)V1peW>I$L!1?@2uYJv#F!=ez z7wn<%qT6zJnGm<6!Vp_F#s2WF^V0Rl$Kdq+=q;_p`KP&VrMdXfTjpnGKrtCTV6E;F z4nXZIWfc{y8@?#noudtjk|r|(jlrhKS8M)R*8g0ujiOu7*%D1+mK4F{hL!C44^o&Y z`c(heetS?9(IUxHkwY>6(h70kO!~L=8N2>0*Wz`6I;c_q{MfPeeJhLJzhK2^(m{te z#HOt#OdS_qLzYfMpG{|9{}s$NxtnKsnVzIyn|{CI^4%kPawVf04F*o@dlokZGc2=i zrDOivpb_epD?QB(eNoM=Bl5M5+ywn53hK}zrR{V5ZawPHa_ zT3-MkwAZ?s8&HcuVW3xWjQfl=FcVx0B8Ov`8nqhxZ+w5iwyw=T+5tsR zRL7sd{1g+)e?R)4nCA@NqG;EX5faIEz-q(89O?AU*BkqdZXQdG+gKrY(JW?g*ME&Z z73=p8Xtrt^`S^^6{pqZxn@qeUFSN__ao>k74#7Z?MV%pC!JTHOC#MlX!H*&P)^?Qe zbfQU~SbI+~_iKk~h`+~_f5v|x*ym4h{Wee-0El_L;ly&r)T1UBFYWYclPEX3AR7PI zqO$exm4|@L#oM>i;LrQxS=?fIYufMZ=k!`NyZqy5;H%zx0i!A?A@tKNF>WG_H+i-< zh{Me?UM6{CHII^rj5H{=XL}G{3d1BQ8x5{9&kmMb9bNw`9P$$GEL7~=>qT*)KyF%i z(CO+I#(6Kx)YXE}+zWDu?e)_TCMXjGyT$!^D?zFH;n&-LOLg84JW*%myI1U~ z0Ne3BK((ka->2^)SHqWB8@79x#Teg5HjV<8SPPuLc_nx8Y+0@P7(#3Figrg8k|?TC z;kS%(|C9)dMij*ZvWS5vmmt` z&ljW3&W;Lo2KZrEs-{JTwTKob$7EZm0chy}^i+dSKH5ISaK5FqtmwEx6nU3EIoXAk zj3kTtW>3##?N3Zf=haG}vfh)O*TP7Ejg!-v^u2C+_k46WBF8$MvO+!9hn}qkz7uLz zuFh7YE+Ag%85SCI4-~{v4LWEpujVAHO}D) zv}M3Drf~K(P@BJF9d)i&1fup^z z)CA_a7o*&mahNrVfRyMYV%8`|jW`8Z^Uy}8D(04s3rAce!Y^3oyQ47}KtH$xKg_Hr zUuJC5ZYY*P?ThMRl%NgfBiepT>C0C5gZ$q{t2LLhuXLiCQz!nr5o zd!_{>@;V)TVJ_i*&oNo*#{$rrol}O!)YAcC%gLfvweSlZw<)_xwRY=1`bKeH8gwmq z$+`>@NjxyEZO-FlmPv~Nh3(scM3_$Xz!SZ=t_B^53TDZE-R|bot z#Pa34fv0B_DfXzvA|lPJ$pyrP__rb~qqv}$KA1Q6hvZB}EmVu@B=Lbt(!@gGrT_$D z2(2HLp*EH3LqSFSX0;-ue=7NY0ZgQ1dDf~(vzsGQ^!Lzk$JV5@|68ixCDXsA|J_hq z=N|C9gxKds-Lw0Knf^MZg0b!@tuu9d=NmmKTNq9mhim_Ruhi)7F!$JDTKVm@#(@p| zwMabGahqTA9bAw3r|zgLBueHtfGkRl3n8!q1{SFLT9wipyTK*l&gq&n%`bWUvZRQu zCnPtS3rD#!V~2$kok90?$3=42Z|06dB(uZo(d~dRZE!*tU?=bcMe~e+lrNZwGc-5U z2f2|5I`!eV#PIES;uv~V9D`I=_79vXuEkO>a}~afCANP{2sNt5tOt}g4h=&r5pOR& zk?9$u7O`oO#eVqU0CfBJg5u(#?gYvjW1>L6@f{vpLY)Cn3CKT@Q|kBKh&mlUa*({` z3&%aZFXql$&^D;uU?FFH@pdo)lY>DeW>5B#e_<432ItvwnB!pUBuO(+n=#=L)YhX} z=ev>!Ww+&*EimoMbBgn)iMW)~imq*8$_q{a_LT3v!n6fx8AtYxcx%HSuwrko{ zP6y&Jtoe>{n@%8;erY5N9AFKE#k%9+#_~MaXsNj=n1l->SAB zY-a)>5g8PxO6VWadR1L>rx-~U4?$s@zkR>*iJUvEmDqwwMId!j^~TFNTp?#BF%-GY zky7~xg&cF|>LP*_J8wg<7jn&8$8InLnij`k@F?-|w8wb%XD9-4H=%Lkg=&M#li6Cx zIB6KJ*(~BH{~hEjv3DJAm$j83rPA{f?O}OlNud zuH}YF$-1#)E8^72jtR7fH!jAR{=Obm;l>{B`JE+BA%xkV2DyhF2tD!RHUPvctyy=N zWf^`zAt+aAz`wxw&K)|r)Mr#O=O>k;2YjVl?PihTfd!Q(VIMG1{< z)mElLS@3h>Da~Mz4deh4JwLEWu#~sB0#jZpI)4Z{I`s;qO^M+&`gHfdnQ#pNf7e_2 zjfC$hw6DE|1V@D??D6f_TrvvCuwlDF+$5b$aKrXu?hj$=>t7P$*+JK~udmN9X_P1q zU8vUb)6htDY9sY)g}c=spLVYvRA3sA$WuiX)#Rjp^g5kUct|NDoYP#Lz_*A|p`~j} zGo1SQ1XC&S=CfmI72w3!6<6N&HeK3sZslNVY;PkEC zQPW|NkP>KVtQ1~0^*@$NcWq>Cj#_yj`QUlgSjda`t)&u@theCJQQrVfnkZn|?1eTM zyt1O-Ed-wtB+^g);8_?yY2<##&c$=r2*u2F1G1+=0m`&^N63tU!a6vJ4o*TyX~4{d ztmG65U;EEUDFWSc6Do-*S~e{?4Z#JJZPt%Nq(5_c0yI7wgaH8(b6>I%vlG=a&gJzYwi7Y%NL_bVu8$tbZZ!QnLsdPx zUR2?AC_>G`rh7$Ajl3@YXpP2D!AwikMjbH`SS7t!ZBR3!MUs*3^OsWdznf$Ceh_Y! zD{4l&(7$A~yQ|nhOpgln+Pjg#9GWhDIe~txphBbGi|&pAM-ElSbPVlC3N~p!FRTZ7 zogPAV9>=$iU=`E*`VG-w>%-bR0$J*{6VxDXA1hQ1 z#`!MV{@pilVu$2#L8SS9UdMdhe?4U1`w@fsYa;k5qJszzsgtW-L0f>(L5q+1ZB(3t z?_!fOf&c0k-fV)%1X)W&Lc>9f!XfStkMvK$g+fL)VS>a22Y^ue8P)lh;erqYoP^Dy znLrs40z8T!DY|Tp3Kn zN+c41g%{Bcm^SybQOdH)#@jNPNulEv7Ahju2m}FQD#_^~l)yS}bsEk`BkW`6TJP^!paD=27>}>`whH14T95 z2Ou{=V2>6w5Ie;MrtWGI62}V}7IGr^Pk=flF#&?TxKa|P2$J=_)IFnC4%^O9b*OpC|BTCyxH!R=N-8$n2 z_ngi}9!6RsFx+P)tT{AO1oVYBBZRP@Vo?M(!FC z%F$4z_M5S!P|!(q!3Tm@->=B9>)uZaW7C{PZs{@vzSq^{45XlucP+bQ;KZzIppnuK zgr)6X+P403+IiCL=RQ814HxUC#7K-M!3m@6Wc)q`{}Bubb9vz4h$&>2CXE>+m4XR5 zj0<;!MMGg9XMA^!S=?oUf|%d*vgAg7p$r#wmK*{7#*=2wAUeIC?O!eUO6^R))Vdq{ zn#X?q75tI|Km$Nl9c6F(-us%z<#=N1dZlAP=I=d6jO;h>i) zE0Je3E^U!j6nXr;1-Gcao9_A0H!4&am-cfWl9e)%f};t2iN&m8i++&I2rV0ThpJ1v zVevqm^Q}+1WbxNb&Q`$v{q*9Wd-M6h9&7OQ^pN|Mt9`}jzZd{zL{=HWF!FAj@exy! z55cjaKwaoaP!<*YrtL%<1EHCv8wREtP&4lC zO=a0xyVcqFC2gESeLgio+?XeX+8(4uw7Zg`7;VZM7;579tSN40)!ttNfKjh$H->%1 z)5S0>ccp982N$s;hBr{EkLu7IuY{v<3x`@Jgn?_ZPI-}%AviZqZY7dT{bkocZ-bLN zI;FvI`)-2kUfC;x|JZPjhrECsvDOwr^S6Q)RMb)-41pXSqyZe1x&aoKc!_=7o%QQg zkIwz+{i&y=T0!NW9rMkQG~BvqpLUI|pgs>_ZSr!x11OngSP7Ruo?^{A=t*z$-}Ze7 zfTT546_xd_69(13v?6mx$4E7+D#jQii@5L(4X39`Wb9rpQ)1(3nhN-d?uansh33KI z`dioHdVA*U`c+`PN3bcV+N~TE0Dvs_TZ~mobW58+S0z@VcN{_jfj2&eC<}vK(uiWO z2P>9mJK0hrS@cith|PWo@g_(kxgGwcHXv~=6S;b$-@VDw%u z82bUMjN$$DHTPy{hr2+*5l2S~^9T`#OMJI5D>m#UQbeJN3`l}w_vvG1t7}Csw!bc- zyuhKK`kP&3SA}QZ;;E|Ssz;86Qn$XUSJgL~b4{9t@&2HaH7L7+dAJ2fb{Cq?ZgS}{ zeI4M|&cVo)oc$;}@N{=b>9 z1ArJYRb^EmxE1w(`@whp6Ft7rsEQe5_Z7<4>xNI(O);`Owgmc9MYfwDaCHrqpD00M z+Un}jr|0AAz4Xi3Guc?|Acn0lKp^v&5MsAemW&P%KymtQ$lgnooF#5ERbeEP^G%Ot z1!`fECEcVSC*4Y5^AZNRN~NGjPOUAsBdn&c*KhGSTiNi=nzCmUOYFp9blA1^Y)c1! zM<(f>FLs=}Sy@*s>}(Cx+pTBHN9&)BFP56k)3$PA*c6ARlFPjL?VtM!7;XFw;a?aXWN7QmYLaqa$tRkm!-TF(Ee4-Rs6cQ4U@IQ7grYG}M7ZnqDEf}Hq zqmdLzP&h(14SpFK@n|pB>*&BpR6q3Zw&WJSm~-8E)B1t9A|4v)P(uB?n)cH4qSAiJ zKLUa%EVj6y0_(wyYR2LM_imie6jDrDsgp|LuH4&a#ZM80QBZ4+4@TI+ZsVk4AIRM+ z6C6)u!u$$ycwSM}Up#7~EenXe6k=}I3+}iE@^{Gz%yW<1J70OVC9xO&4P;X2ng7j% zeE{1X~0`=ynK@|l`*sS-7q!vZY9b+1HoT7-7-)NY$83RpTV(VWNzo@{7?6&cj~XGVanfda*cu zxO7%p6eL(sr%X^gZfdfQn;^LA0KojvFjHRsNIY}*wg*q*uZ-D_=X4W$0I4^PQ1Mg{TBJ z68IDi6+`lbioNVWJpFIrGHCgN$`wpGHOYV2{MgX*#VJec`YX>_CckE1^Bqu|+Xv&8 z<_Xv`DEDC;mPyaHDQfsSNvo_~-)E<)1i3XdsN)^dPJp-9m8j$)4~3pm&@FthT{Gj& zf3tisU5}4B*2gdSsYj_*H~95Kox{9lMgpR~k)mEs;;`Go$Pu6n;B|AD*QG9hCjVD^ z@+qDG!_?Ra_-Udgf}-4>Lw(B0S^eoFWqqI+6~1iQyR~&~N$)g)y5skPvGT}^xSWZ* z50#T@78R4Gp7TIjXW~Ozxbe9v44G$mSAYWw0*M-0k&fs-3rVe`;z>ht57URt>a6x( zMeY#*UiV$_fg#YA6^$5YCiO=RX8mrh&Xu#pRs8Lz)SWY(v%O^Qi72e*n+@wY1e?=! z3sw2ahR*V#Z)>hXId=QAC6q}za1|`0T$4FEa1%Fm-BemZ0Jv-N(1{Ks!TmbN1kM70;C3&Pz(Zk2 z`{p!~B?j?%d^3y%@^OroMHtABEp&$|(lIXFwQY2IpFW(pojg}wW?1i7?rwKCxXHgx zI9?i+C%C3?`jw?#nlc9-sSWS`?qgBuAWJ*w{r*G}A`D(3{YL}9{?^nM_y6iIkX(NC zL{u#o?U-*7srYwo$m^O8kwXvz7ctpR4SzwSncxi8yqJ%=b(l)#t@cy(Ophl1sB~UL zYihde)EzwqG1gp5y8JV>{n2T{1_j-5Ai9Bx1ST9)FwjsLTC~jEXj)?=X^DZP^~CE= z24YY>E|APe~L!hl*`I;d_HigY{%c$7Fn%Q%~t#>rK1CXE0Mh)8hv8K)G=Vo;*Fhu! zH9}WDvS8uwJsU*iPE}s}@Srxtc>zUTx2Gpc!%o2t8}`qs<;k;N%e2SRdtXk?w9{V4 zMELy!Tx-YJyR%^yb9xxjAoWx0Eoj_8t5&ICEzxZTC2m~&rD4Z{l?ZMoS%LlG8 zYcJ!CHS|$*Rv-9r8jia#(c3}ymDy6p=5rUp5ws|e7~a$zby7N?qCPyinxK?J(#NQX z@lXThjUl=8Fort;RqMREzU~!Jg*lDQvNLtG;O@_5qDONa;#7Lu{HHTj>G{( z{KEYhCmfyiqJA}y&crxT3)688!++b(uop!mDRreSyDhd){7>I{3m;**39J8m zXm0?(mo1kT=-DOZ2WY(!&IwQ--2W3zl|6^hd3n_h3D%#z>QG*7ty@pOl4B6II)i{| zG8(5;qtOX#X&kANuyq*@aYN_L%|d}N$vB7ue~nri+R{+2Qx-F-pTW@^>57u7b5`gx z>cdBusr7hPXE8$C1QKoc&Ybb zU(6vy)utY>&kNBX$-n<%#u0%g94=NJLD5Qk_Pul`X!H?&h$P-f=E(6)5z>jD^@k%( z09hgLO;$|6d7fo88n>-}?_sxXPY}J~+@=5JNIR5}dKw6Htuzun#)9F7H(2iN3e6XM z6TI>{a_jVo$#{(mFG2y~csBDP&nYx1BPwD z(T|2?>f!>A?pqugv(=>|Lh9Ino^M0Ei(BLXurel4r_QIc-4-$!ie^Dx=}+0dO{@-aQMFP=t+hmE$rq z4WKZ*)qX!$3NK;fSk$L<`x5KZYNW6G8zIBfmzl}p{5jM2X{UP;v` zhE?9Kx**M$^h8rR2@>{vjuI$obJ4*gqgy^n9g^W@ZCmhfNV#^r^34uP@Y0&GP(e?p z`>Dlz*~;qeexQQS*3L#%sWZ_>VDPT(V2LsA;+3-c^6pB&*Tg!m}d3s7wfa z|Me3d*47A*giINAmn1BVnwazwHh^LLT|~OBkQVtJ4lRinX;7lstpfrI!dp~REUWRq z?fV@7zGC{Fj1uFL1Us8zqAW)9Pc)EanmYvvqjQNXh8GLySZY2OdN~t!=Wk9IM-F7s zwhB9Nw~IOPcCwH?)%4)6Z7L33RT7rI;s}X^q~A2naXU~ddw9a$o-&|npm$$!&^KU3 zInD{fG#r#kptEI!6J!RiE7b11EPIXEeO<=Hqm)21CiC-zPZ{aC#Xl*)+<_YdIl;Jf?pq{KfX@ExwJIpsF{vq%xxyW zYVY67A71Ao*2FbMqU4e^?m1)Oj!*YAqiOr6|HO5z zyTCWIhIcHQD610q{>-=N1uP#OinyMQJUr7zoY7OvcAgmb&P~)n?F<6 zpO;^mCt8npf}FmKPV|11tv?>ef?Pr)04KNwhZKM7-_pud+8XIXLe;QLsWAEl2!Dj#_+V=Q_fl<0ZL z?rOINx&WYyDYu|`@gqm&Tm_28LZF3{D9L6}FigZr?T|VdCnm5S_hsux$V`|Fw3(Io zva5{cB8Xq{)#a3_GDRoa0=beN_VU8&$GHdUPAd;oR|}D5Q4@3XowK4N^|E-P#V)KQq*l|UX3O!h%WO}iV0*#F)*}{@K(7cSr<&HaJhx-vox6KJKOyif;awi@s(XW&=otuC{cMKSf(T3L=TMF8Y5$POro7l+SIP-~ zgiCy}Zimxh8bA-PHeplAQ6!m>2=W3bGc&IJ0Lo?LyBvL|ani7sn#@*yBDIE0uu$Jh zjJWUHu@I2o4K-OdPj;h>Zk!V(G=ki3C!9MC7|fX^2YM53#w`V-?mx%i4qc8mhP$DX zFgB}#_T3QGpe@(JOdkv@{-74sCBc#C=`3)`HeC)vcQ-1G*ABOJ$@W(g@WUQqv&tJg zwo&?qcZ9!9`!y~xznrp?*wvhpliK!6$hMbuPlJoPYkg&|XinPOaBjmp93R5qK)6xl z-0mwp2oruFN*0$frl3d(Dx=T$Y1G7Dwqb-*oIm;qlev>!n?+ZvZEStLdcU{Uf$!H* zs@Pxlg8FAekWuer2nmCsg+L*YhP%~1cwi(MH#5jw@Yq8{GOV(R@R({ww}W1^bwbWj z$D@*iloD1&`VQrTW5 z*TS%!*64y|gx3S`9Fw?}2abYi@0GXROs24W-mx6?uhRkG;v)zSHeK05Ayqk4$HPgJ zfZcmT$M!>UwP+o1M_HtKNb`CF!Uqja|acQ9l`GzwKh zR7N>5|Hd*B>U6{X8*5y@Kr#yez~zBv$Gq8&BA;L{5tP_`Lb3tqpp-odEBV>$MQ>rkhJQvM!_}8D4#>sCLU8^(VkB? zW@}yw4n@zub>klAull(WFYz1L1(_NWpGnxxAX=i zg5KXRL>=IQaRseShzpi0v`-ag=ehTv>h}r}RU8703C9&l_W8kcu`P+$lYHt=WdW7w zjpBrQu1!lJzvvVjrX{F65So}2p}x6)ZaOE)&HXUUoOK}7yv+YXG&wC5+X7l)5qe9X zemr`&d{y2ky!(EACL3vyjs;|F*b^JG!Bi0iECvK@{V|+Oc@-;-5N873{B;gXnaK;4 zGa?93>Xu@?H7aIgEvAbp;O~E-*Vb-qn~^D3^IVxAEotARVf|W^YW=&r_KhFRR&mfD z`){c}`++xWf0K_yU)l0Ix*?>f(CTx)m17>njgV)5G2!ulHO|njAIERml%xQEOFhK% zbHzMYrX@@yTxeNzk&kw#-+oa2ZrNPB!>csQ3LY6>D7w~5ccWI&RWjnk_xmyL2SDG< zKBJzUIv0^PX@vQgx1p<3jZaqhisvyFj;K;>vv&XG-h290+Bo+n(5WZB;y$MXTChN$ zkiFuxMve?4#FPwK-FF410g{aQC(cq8f%&vx z8onRrrwUb2_QmgyzQSs+H4ime&Rk``TnA<&wms%TTi|Ju;#P3gm=-F~HR^J(7`|Kr z<&adPHCIC+ZVAjjfV!A31D96xi0v#d-U}}SCkZvL(b9Q1YJD*e1SEVF2GIHAs%`(& zc~fjSZ~S04PXS;S6z2!$v5ip>*)5gbGH$&!_v!v=VsJf`b0O6~3!PugF3$tJw>QQ_ zWEeu#XgSg`Mo*V-a)d)v4s7|i`bHaf^oxO7=RhheN+9CjHX8+!JQeZysBQ^$`-AWeK{39G%h@gKmTOdo3cNObF5{y2zaBuNTC_xc&l zHeY%8sC#9vB3u<^tB~frc5V6<{}u9UZQR!4#E2CP0(lQFkKUg}(w~F#YUkS_Pgk%h zf4oL)c^QE^BCI*zH6v2c(mo7MdYb!tHtS^+oskbuhwGl<-R(J&O$Ci zF;&y2hC8nxZw3Nb?vqqt4-_h%)eGVhS-7SM5+d_?m>JIX)Ind2Z>>!Z61J{GM;Dgn z(&6RxjPAPlv5x(Q8DsXu!Oi7MvqD1j=o9->W<6vA(`r>-(2VV_Vs4l_1TD<2=%Df8 z*c=vhWFba&d*SkvzW9+nf~M5w1lu%6rA zy^FnNO23|cLH2i|SYRNJK>ddU-NiQN(8L%?eh-~zWpjo5M|LPO8-s;@qp3{72d4rM zsfk^HA7sLBLW!=V^W$Ox`|(rqW&l{?0=&33IRfLVrVv^;q*XuJ`P;c4^?6qd4mf&6 zfWRxDy0^NCe!BL&6f})ZMe=^yb58L?(cDnmM{N636lo_+mp|B*kHoo6D_^l4hl-1n zYJ&%u@8eGHpW-JxtwX3~A_f6zPiM#I))Y-tY8WA)n16OzAyprqnrvWjKPorbDo51ERSI_zD_D~q<5!&}PImgezZN@2$_@C> z^%Q<=8*2RCYL@-2ytw>y-EF}6JWRQXM&_z$&egqEv-9J`Y&9t)+bBc^a!R{;Sd}3B zzZv%lfM7QHFIs3FMQ4LxMBS)1R%p;1>PN~&XZu-?4B)O;ZAL0v#>R|=l%$O*+PzWZyEYA_?j!{kCN=hs#(kN`?T|?JhVQ^RWTw#~J!$Jj4 zD5IyAYq%DTNRcM1My+9xu?kCVAJdknoY^$E+O#hVM|GGuW$?E?ISg(UqeBY|1B8Tt zxZ33owI<*bh?-KcF;Ps#u>SC8;4J?1{U?J+FoW;|D4Kp8Fi7cqf5{P;v6G-tn7*x~ z5v<64A@Cpr0VEMoFe=Eu`a{(3K?^JNqtKW`dYA>CQ&$6%ojf5+P*l_@ja=?u)t)}f^IipOJD1j0rLi3+gnFwv zlqcgh{y}qIsDrhfAjMO~#6JQ*zXODw&*OgtjHuZl9;hq%WL(mBTs(MdMr@SyDo?Yu zZ_E!!7f)AewX##&UR|akymu46dt_78UO)NHeEr|&^E~6^|Ns2&>s;+}c#?FqX)n$%Mw-7$|Ck!6n*8y?kMDnrQ6RB91#6jdH{sBe-k z$`C)uPjQx18WKDYhj}*)yL}WSkAsUi!?X@Zv2SCLM_ih+G9AGKzzEw10gF?=OqzwA zrx;*8=8bJq4!VCcMD5LC&1< zXu;W)JmFleI(6Av&lRtzPy#sVI;r$SbFyn(>F76IYvuPJ@F9}}w*dJa2_b{W0mI`Y zlc!VB2Ja67!(x?;CmsfPfFXl{!a+*UIt?P@4<%$;(L>=GsQUpISL~2r2qBN^uz>MXG z{SYq3BzH5`s69&2eqGosYOO7gYIV1<;G`ax$u;GcxwP<{R=2ddN=K-Q2UV3*sH= zFmK>su2zj)SAbyO?)%udh*Qij*EC3~S4q|3*Rm(X1Xi^%C>d7ar~$*vgNAYBMa6IH zk^(BQ{8+P;_PX^M?fcdFc@=xnPAl?_?gG#<&&g3uItwR&-kFCjigD@gN>!EhqXU0p zT3XucF1mN4hXO;9<&#+2c?610cmaOZ(wJ5eUb6^%wn=V6nek+ytFk}?T6|$4%U^~? zmK+3eDXDRJjMzSbabZybph7~Beg9JAXl-oeu&&82CePvn)9e)I7E}1u@lz@_jqdIo za!3a!3m6c{B``xcyAt&$J>zDx`c;CTiG$rq%ByP&t9&!zwokXjyEwHc7(RHmB;MsL z{EY}~F}YpEoRJ}Xy1$wtwwIbzBQ8ahiS33w@h44?&|u0HB)35hZ|~MJQ(6tK?|(DU zhi2>No~R`w$Uq6gB^KA6+E`5IePAir!kfSB})J@86 z1SvCvoKr|LuioSFG2%Dx)o4{n2*@GeZPtnqjtOH2OiBU?<>G(qwL6EX9yJf6#0!R-yS*E7H?u@+F$9 z#jT21g_6>|lQYLrqY2d6y;!QNBfX1`{J`lXc{J${awdkhw9TD48vqOdaM}%VA&rfR-OzF|`En+}y{lr9VB1qO)0JEA0}YI#HjFcIUr z?jJz=OFwc@&n6hA1htc=EioN2gG4@{V9B&t6XM7W)E{TioJ@zJ?DGFw3D@M!>0rs8Tiz?9Z z-+Ce%ap#8>coabGmVT_XIQ0lgfS+=S9jzMwghs;Eo%Ui!^PjFC_^pwZ44qCvB-X_- zGTU!HU#;~Im%Yws0L-Q&me_!)nO_UgmJ@`?p-g+C$g#9SgFOD<2h;qaK13XJuJ3&} z%CH#}6m%eC)0U~>*hNB!_Xt)fC1^d5D_t57B+NI8^jZMvc|zi5H-#Oe7CAVjs9+)9 z*SzEV1!jT`<6msa1k;&7vh^xlSmX9QVSSZgcraGnyQDQbJsr*=D(y*{h%zF+@R=}Z zzOe)*m5grVr8u^3MW~ewx<(Uu3eSSkxg8mH|6O0V*6E`P_OhDg6aN`A;gQyp`uWSA z>KGI0g=wrT#+NQJ_)f;xb^$Ca*MgU(KY1#aSl8Nke#^+=JQ9eL%dgof%97XC%h%g4 zna`|Y9$VPDM5vAHtl{A-NB-YKi6k2aI+hyu+*@G3@|gVqI9jIz2u0)i*ot|MG@)VG z$T}FXD8ZqUewrY`2*vqf0etis3%t@6o`gY6q14D&aN3DLR5qiszM?$GDD*(qxcrdg zWY*|IFwj%|4jWy{Tv{5|Cv9z|KU&I7Onl1ufe(E8zsYzR*e#i%z_FFjbSfKJ11Xi! z@_8!4^Tn#4@};rSP)C}e=~U9x-~v%gF1d#w#BL~lwP;rqk%!f$jpIO!{x{=x5h3;L zRT34%>!gP(`HhT!V(z)h%XPW+6NTG$hbA@Y>kh#i3=7wVA1!Q~nWKl5NPe5G$9$g@ z>Os)KWehVRl0>negg1{JNKpC9Hj(ymEQRixUL;7#n;DXQ4z1IbRf1IA>Qj<+I=6OC z7ZxtN=c&!aD}>?z0EC47ys7+Y=6_`rC;;Q)`k#_5Id8P4wziA=68y%(%c0bf1NzU# zP2fj^@!$9lB!{AJkFo7>YiLmm= zt2*xgO;MsG8;Vvo4#g$nLdJB+8aJv1 z-cODA3{mbwsyxPMCKro!$Trrn79{62weub?83_qSsH4q%e zOA9oFLQ=*uf`ZW8XfN(&RZJ_?56~A)oMB!qhivx=X&k!oaXQ@Pa_BTEsxks_5rAFS z4;+i4)|G}%oXBA-ZWJ2kFv%1hA`m`SEj3ukK^ZV8@L&hZm2!_Lvr2a;kAjV5lMb36<)bdB4ig;$#&TWSHM>En-aMyD2 zYPWh7TDErmXwLVi-%OLEc~}G;Pk-kP)BNLf`;L%7*{LDFl^&xU;hZ>r#LH63HTH=V z@tl^$UzSM;ujXwNt6gwf%4$K@F+El})OrD8>^!<5)_;xApwmL)K^ur6$s!<&A63@= z>_v8Xm}WNbHZqkLCb;ibC~1%0h*NwzH-_!26lezw- zHV`xikroEZ8QP+6FEL^KGE4y^b=aLT6|W|*x4U1->rM!SN^<3N_q+$}IGb5|!n!&Op+`{mtxtI2QhqZvJVjFp%hQnQO&tcd@I3ZiaunYXK-(@TT|at%2xc;^FfAONOU8PAo1CAW8K@wq74fvSCkzuFsMxG7e=J zQ64=Il@I=nHj$^AnQIYq=mCCV#ZJ|%zMUqWR3^%S%+S}KEUXLH%Bo+3(EtD#M7EG( z0E&a@$mbC;cOOr8*O*Q7IuPwE)db$DfL-*`7A3pJTJGYQ=LA^`O6ob#v;#%$wWN~f z`|6Y|!<%KO_6|sZ8;#-Fe_T|8i7mJ`EVTriFWEdDg%mRuguryqNluAVS9}{LWe|lVFC^J>yfm(EVML4=vBBD8L{WOPEivXDYK8*ow79584K& zhBwQ>)B*{cCdR;A4dfFwA?J#Yrln}6j9pC}KWbXKD&5$=Rk##I^E6jG5Mc&E;WKR> zw`4e+DlC`{C3Cz?Nw~NE{Xza4FQBn&1!&+?m*6F)T0-UQQu-UZJOe8}lji`R%gY_s zI7vIOOl!eYjGBl_Nw!?bidVH$0R+l~q3=`@WFCSX5|F6ufo)kGNS{@J43Scs!OI-# z3eibYZ$pvtYp`vu%0b4Q+#Qis9F%9Kce1_yG*W19nb>|tAwlNDD_KSbj80L_Q|F`X zBJvD+jxV+S5J=H+G>@F=e);MdKq_uR3g4|Og3J%%62Y*8BLzkz9vG9)XFnsx(9!Qi zGa)YqW3ObtFy1ZWb~JK!m7#top^`Ib-dy-G@>oMu=FZWma?e;!q9SOXqHKBghvDI!qKsL|(ec1(e~N_f&wb=}*}T-+XogZ6*< zt8tBhju|+3B8;g*i|@AGo?v*@J3U|4{YM!#^G_t=)(`_=r4=MV2#}SqqB@Mk42y)^ zM1ULznMsaH?w>)!tR#M{6wVsL0*{}F9_OFlP*$;KV}Of?qw zucS>rp3vq~PvLn{?sHC;bqb&{DVNh0gBps&PA=+5hsChpgc>B_tf>?)_CRq7(=JL) zGM(8LD&|F!Zj01yJ^Y70^X zyVAyI9|$MhXi5&>yTb|%RPY5KR#6snH%auj0#{PladLivSQAHkga8B@vydUIDa;-6 zRq}>Y6RX8gr&bS1FQsIxpoJ#Gk~)w%D2Fab7i`v5VAPFEe8HecauGFjZn)lNJS5zT zy}44{(NnsS_Ya3Cq$Em`Ka=TV6ibuHyz)?#m?{zNuuuVH6+G#KNEFGEGAkMiIBi8Z z88x*CpF#f#P2cI-y_YbUa4;(|AQf#V#jiaYjt8@1*)6U}{&k-HB9>SXLgBO%`0M@r zCroGSiKSc5*Q4*(W^x42k#e$syc$syfDDy60N@dgm}L0rcc_e8#2o_EKcX}51NkFs z7)6H-ZAsabLnB|zq;p3UXg4)vK)Z2}yjY>lB7sHok!!@@>IOK8W79YCd5 zRD#&CplDs5Wl0vsdFfeLZSU@sF5mf@=Z*-S(O%X4Tw~__l5zTGkv-MF+M$QJSsAgK zucIr$G)!BP;R#5uh^Dtjy-JU7FEQo-Cy>V_q3eHw6jP;6A2rA^^(o;DYPF)OZ=J%~`w2*9Wf(2(j>2rlt|MmLszReOI(UsE8~AV-^%Li$|)i#g%^oYd^H?X@cu zt1kmp>9|67GK zcpBH`N%CGH7cJ6dn&F8O7qMimmJavAaU*oVKc%h_&k_B=f=F z!R(7iCmV^)%dhMg`t!6k!D;FZ?IjabZ90l%_a7aIM1rNSGJye~zNo;H8jJm1O(|(l zf8d$PSMRx9Ajw17TmGZxYPhOtWL+M!@UO-@2%;ttlG46qsa(xO%O5e`80)lubQ=33 z4nNE3pAk&b7DRIbUD8E0)`d&S|Bsv6zGRh-xw!dSNgO?mbhkB9r-;!+9Z+%5)h**; zH@9_!JCc=i6>b|P(c2uYu1#u?`6OLj1lnOB<+c{cNRrYMCmu;CofnBPRkeTcD8-_X z+4qaoyTtK2z)P5HVAw2_>?9;22_`UgFlHXDKhvWRrh?Z7x3XQE!Svt$%>&8N)#2`M9@h)(HQ3hBOhWr_r=7IsX=_O zSDEooaQZ?ik0eYzu&GV*!;e!kiw(S$7SJ9slj<0kF;segaBIMq&P+RyQI{h<4}-7( zpZd$TrR~J|iiw4eoa~rEU&Ld{H}azryz!Oj`@X{5EM7|S#=V--+yn=2b8W(K0$~92~v`%foLgv6>{KL(aN~|%jel~s~)2lQh^)MK3t|I}Y2?u^^ zH}i1Jm(k`~tz3(j@w@5$yM*#vpU``hqB;&iO>P#RCXpuqq?M<1%B0RjBfV}viTmaA zgj#xXv^|mid-HfmKpS9g;1W0ZYf`T^kKMhCy`ol!wdm{cz(GdjJ}n&bJOGQ0Y1I{6 zLC-<*VC{HqHCIDvT3ol+R~7UD!#iW&Pvw;;xepbY$OZc&IAHNGvS?Bv+wGIU@Y>qR z$sk`I3_&{YkYKp`HvL2lqnQV71I&8UMT0Uv3Np?g)zEM=EgP7MF~O>!eD?pWdIf=- zHu|4crKK`n;CI<@Wzzq<(nG}}>>5~UE7Z*NuJxVFm87PuZ2jv@M*BmLsaJcz$M1H-L}_8L<|naw8cI1him zG&SlADaNcmC?&isSWI+@?4Pz5An|T+X>Z*mL!NU=?K}<|MXo_=w>to+U_)9ksOgd) z(ueRMF19%FPw}Hqvb;U77KH&<^sCfAfe!9c>+JHC8xO&CwVQy6OXDGu#kscf+pV{7 zx2_807P&Z*BqT)ab*i=+d?bTLpHjiqlqo+2T{j?{W4I68@;2h z-N?Y<20z>ni(NAS8_Wt!DS_KjLP3BI4X>#=TDsOP)U@!1J~%v2FutZiq)}KB!%e>J z&hr@Yad{QV7d@w>Q{S-e+0qCLm;;IoI+l?>U9weas5t07>kQ>qz@1&qhE3sG)u8M_ zbDs?scUn~A?`^%UAupW%EQ7i~=0??=ORI*!$a)p{o75M!VbN&!qV7Md{sMw3Ro@f6 z_}aws#xCLS8F1C~->tgDgc4TX!3wI#7B;$xLe+m0g+`~oR5mHQFLtpkRljKVjB1F( z?X6z$Fdj?GBg=}zM$)!vHe;z`5?PSIytF+t&=_;Eb-{!-AI&y}mEhX2I&yqLG_tfj zccs$P5h>E--y5AWG@hvvZDg(eOCH68xFqb8Dr%}AWbtvotto@reF@&CP`N%~)yUJR zpyAi4^;-9a_mI_>jh{3JzL_Z|Ld8~#6D3_6s_kZR`-)91#pIa?)6YiE%5n^>LPUa z6G>~1qHtUGh%S`?-&#mFmoBfe;7H*28XgQFqb@B?a6(Gn(G!dULy8A#Eul?*!Uxm^ z1K75gJ_(5^!U_0W=TaXUOoP@GqR6;@)NYRU%kDNU1814JuK8a=f2cJ9XvLN=De-^_ zre(q^dshEX4e;nnp;)=Sry7kC;g;AdHi^VTw!hu?;*9G2Nm9P;g+VP6;bVpGRq=(8 zAy}TRBY!xfB`d6HbhR}1J@@6>14UD1{ygO$yPVwpJy!TLMes16*!^^GK!Z%AAI_HJ zs9^s<;pI#rw?cgt6E@EGn^}DE5ec%ssFIkAR$6Ke%#)xBrR!%C@-d|S&#H$2xHA1^ zdsd!DX<*wMA{q^jOq6LwjVtth%kdvWbVCYpxZs&sJan8z#*5qsWaZbkvCbo!EK||r zKWV5U^zqUD%q#-NUnH>2t_i86Lt5c5yirnir>3PeOVcEJ&QaKI)FHu&uvXR@*fZTL zRYtg?*);zh%$LV-vKY@b%b)pY3~Ya+-xyM~y-pd*$MMxTCB(`7kKUL#CaaP-Zld9H zo@{<4qdWVWs)oV3a5r+FhAii6S0$?**6ZH9If_dc z{XhEZPD|t{y7>~q|10PFTkI>8L&E>Lkz!oaEHK$*aA3DpED=uZ7AfAGqLL;ds@gn~ zeGa){m6o|Vl~IC97Hd(E>SP&f@^oPZlw0FDxEE$OF`dq$Y#V$N=<-qaAB}f|4Z-JZ z(>6;Tf~t03QwJW2uo`gTjtSB_{j|tskP4%$-+@pA<;$pDrXPoM56OG-*t=E7-*cS) zhXEUt=zaf#kOgpN%-_#apQAm*3SNBLb*{${f|5L?g}2SOBT3WEGe(%xJ7)#HxG@5y z9$ws#jN{mFq@qVT8f1pqhpM(124Zgmq%>-aioK-FIxd}>^~)5t5QN8CdBL48_Aei& zKyy`|5ucMW%guc;K&cQnz1YPmE%^%JLVy8a&HWUbUc^lMWJ-sN zhS7&%BP-}!YNA1HfvN*yYh+>@3<%2na^LgqVWd{RK8oQ9L(@XyVvXgnxjnaoLz4g1a*bjcCU*+vKCX6RF6!1w&_6mEs~GF@ z(U)PaI7#72N$8n()k28B@g=D8x&LLx*k2LATa>Elh{gC_w!H#7as7mudWI!zF`Bb2 z?&qFVUEZr%SykJuY*fVGK{aGE8}v1m94+MuBvD3tKx4qt>zkGbVq3 zM&G(HhYA=vKN@#_6;3kMit)|3nsC}lmR{YJhRdvT`VI>cjK=GOWyIp>gBS(P`>Eb* z(3yNS5$JqO?Bb{wwGtY&#M-x(wc{#z7>phll5!(Tdma12DXB0o)sz#y6;x#}>AW;$!{pQ%%xm8$dHanI*#6OxsDuG3d zckIR;jc3c{g1_F3@x63z#qJRg#OJGj%KA2un*o=As7y#wg~5#(8JGh74(9_O%jsk- z!Gwrk5!^~WI_vf2yR?AsEDV>g5YtTnC}#0hx~8& zloKR0H*bQgUdKSd>H;PxO0lG_CYo|TO3B{3XgIwK;lo`>5Uo?oxLN)6`N-y^p8#;Y zu3zNq<%>?1(CHAqs$w+ZL2A1cQiL_ZtcJq7hzEl)Uh>x3#q5WZjB;PG^s&!hG^!z248-%&az{?Lp(@Zl&nrv&WRhD}PJv;DB*^5;vQ zc0)j9ClkJ7D@@xs@2j>i(HPSVEHDMYWzIUWh>z`P!yJbq(1uGWnA8o!nZTO{+LOBh zlIj=JnHaUM8;-V062@4>l^fTo-BsxD(9m1086j~emENlTs?mv5|Bh}b;GZIPvqc$7z$KUw=^r{vNVITs0h6}2Sr zU9I(5xbWTD+@fkyXHny?pIN#3L!1S{!etWrxR-Q<(k!?&DL&Uj zubmR2_p^*<5JvEP9~qofkMZLmc^IxDmCx5}W`(7m?)FI_rDM=Xg6(@zI(AJTbWLdEOddoKU(U6XM0vo&O#heeBK@h;mqHDk11hQ*r%or6EKlQw?;sv zMI^0M_*3U4PyNS|^$K%;*`2~rU2+U7sj6~zn6>;1EKM@ok7~+X_ldPYU4KBn6@z4^ zJx0Hc8yU3pLv2z! zz5m$1<_#?n&AR?3o>*WD{;ZzCg8(C@_y;ho`dz)S)f-Nv@MJz#1g7iW~*pwD*0NTnpW(zKGFHmk7E z4@L(wl7RO{n_Pl+R}>d~ih<1@aNk(^FZ6g?gFkY^^48;udZtzP&DTOpjafh-TYG~h{c^tep`;qEmqai0n3mLlkL5x?(Zg(W zHu6&C(o-a5K6$k(C_q}*<(rlWHmdtO2#GJ+v(QGFd2&)xuraM}5|%%*d0ms&O7YqV zogL+s{(PHT`*%^(vaUD`aa~b77AeRL`jXR~8y=cNZw@dGIMgxd^+=ZeIS*OQ6GF8fm=W|^Rqs=X2!4d*3V)rzlj4fPx}RV3>&OjG2&h+y_dTp1k#Hp0t05==1~vGO>5ye>TKoS;P%~F7$l<4-zk>=`wIOA zz||VRmu7ia?U400Oz9HAfoksq`}4;mm3B8_5o}D6{$S#{J-69aYrQmy1557kvttRK zlp^sPWo##neWDxNj6v1`x}QVh9{SIVbNTg)6Xu2PR@7-8?@TV5)*-v#JOCg#YjKks zc~TrmWAhhVdAipyrJM+m2l;^@Oud^K@iC^bHFF<9agVoJuCgF}jny0Mn zmU4y!vllyP52j|Smu7_4bl9)pq<^$LYic=->maU6XL|K-D7OV zS{#9Y3kP@4Xr)1UKnHm4CA$!X&REJ`vY z=yB>|gB5k)`W*_qR9$93{3f-^kH2T21u#QqCNO*qcM+B6e^av!C99_B-@l4FgI>M&;n7>h0|A3)*MNm(ZL*VFcz5wk1uqW=*9oj z#GZDfCe$b1lhw{r$)vfF!L3yiY6d1*N{jO#>K}y#oBARRf zV<2z_9b2tjX@*GTPXrc;NcM(AR@^u8#4%KyM)V>KYggJ3%$x=VMu*J8BCV;V!2-4T zY2}m|oAV9+mw6zwvSb9Evyrp_Q$PiARLAOSZazB!FB#<|=jEf0gkbxc&_roE)-TDDfT&73LSp5KnjN%Ma{Xw=#M@?f05Iq*zge}M)%&%?~XAORlDdvB}@U} z^p)Ss38W`#eR^+}N1t%8&Hp34K;1G=JHwJ`KOSO6f}rX|<|6|$WNuF?yDHIwJJMM; zq?D}4X)!{Ij`|byBer1e0u)@u1##RgZ?S@+9^YdU|;< zTA(bo`v>xx`Shm%0V1e8>BIU5?%T1dni^73x-0Qr27ASF%-OtVZF|Hfqsj5-{Mxsh zsa)}Jn{uRM1j@+OZ1Mi^X`9@kBrI-P@NpCpNd1c?8y2HrNWuqrOFHv8Ix}TWd~7{u z%@Q<7K4R64|BeSTY#RfY*|ALTHkwF!U~v zBD1Fq+NqZF?{Y;Ca97mV%@0-drbVAch4Q#hIUu=?s-oS|WAG{S$pmEtgG`j~HSiS{ zM6Rl(``lnfp*dol@~NiOL@JclP|2%MQxSwI)t*HnU3rqGhqnzHaf9o4&W>%eY06&d zmjdCUab8Xh)F{+O*)s?JC1@>hHhJui;KEODh595Rel1*tF+y{~gOl=E;D1V3e@6)G z{g3LPw5v$LfGU6^@%g_U5vUr<>2n9`dYd8bx_n=3qe6?`vhT&Ctt79WDX4Juq61w9 z2piP_UkXF1q4``2zDZ0m#IP9X+h{VmRr|;hl`sXZ+VILRmuzVDrtOiH9+IJtzimTK za{heS(I45iunQnN$uFkN%VJ0 zsV`t$*&n6wz_D$~r1 zN@mtr*5&YPZx%eluMr`$MLPl(Bk;%C@Du@mz#494tDFVKX{>jS?F~%ZSCDJsH!a7y6z4q#C zef|I!fB75_dX+YKRk6#7KRn@L`dEa$FTih&z}dUrbmKh)t^7IvAsUiP&86!GE3m^2 z)~*II+ZJ=s`KCT@55_IsnBiez(6poBb7PDXx2Jzb_;2nL&hTL-NHE5ePr<_Q^I3g# z`o-qA@4MV&LZks1owaInoPR4`a(74gq{uJKS^af8pNYE(afv6$T~=+(=z@M5ZzI3q9DlkTHJ z1lb=8M!7U4{evoYge%+VDiru^40+?rMA~x8sl!`43AdHa8I1DQLL;vP)9VEkX##y? zCd9)$)$!>oO9x#2_P!Y^rrH+nXt{BX3`;z3&Q@X@sA+FR z$(GGoAALlmI>Brt?@I8n-Qr~CONz8qPS=E^QgvnT1&kfC7=j7MXeXL~jyT;mO-@MF zHhG9*g7ei~eG`xIuSYc{8uesl3!9x)EF*bimitsCBz6JFeauN3j6m7l<9ZL3t%hea zHyx@4KL%>dK_=VOGuJnN^QvGVN8=eSg^BurMh35TBazN1D}B=ZytZPWSbp3wkRlZl zYQ*nT;_dvi@3>!%Gt4Clxo28Gjduuu(^8x!E3GH;0Up9Ryu>ZbjV4tF{`nb&OR5~{ zzTsH3&{MLr=)3FXkN0VKs;oEwaET&ATvr`dFpE8l9MHVypsB~6JBn=1jI~Dw3*+;> z=v$eTq}Uepz3ybS?vidsz2Ugep%UfLe)8JHp@>O(V8%N6JT3>W|*`9)zp|TXIu0zvi!yn|5L&S5N^@pzYgJ; z5{yDO52p<1CC9iT-T#;{^0dRD5=7z&uC~c1ZVAr&pgUu2eY||Rc6z&cCs5s9iF_2C zkmTkbgV6JVFrZlNKn^(b9iCjCIcS?*hSYztHy6z|Lt?U>-7{G{O|;jUj`?QNKY`A0 zx7$q)=tWNFn#UZ*oh+z1-?>EemhNkr7ov)MWd)VVq6xmO6!D|~2CQ~};?aGtgY zsEdUVSa7o)|9v^Or_Eqj$WzF!ONbY_&}vsR34 z*KTa%FR)-KpQ|ppeet<(Uu`X{$_afv7-uP|Y+%m+nQsbZU2|e0{7(t{5V&irMRg{b zHo0AeP6lKyT-!uLB|6-r+t_km>+mzK9sYJR(I?T4I_JPh@>1C=Uq8fQz?;hqcfB1FYdZJS?rAEDK4H12RZg}q><{I ztajy_(p6_c{jw4Lmizr6&qnY>@`+v|Kb;o2%~)%aed(%ZxZIXrE|sU zT5mQGCU^(gP#_ved#n~x*rBW%Sb_~(4?bb+^*so1hlEOq`1M>>Ds z3R9DfhSEcV&o6C4A>z$izU)I2s?~7ePb?wPviv=!2mmcLe-~ekzyyxk5RS z)W8zP9nf8!5tH9Vgp5WEhx@C57-fGqi^Sx?Qbt1N?uq3 z9{tw>oQ>b=t{F;Rty8VVY?#y(c`M?}09E4fIQqAn1y(@1NW`Q6lyDCSUblH~KuPOp zJ3L0xQg>^3C+b(cSG5_c?A%9C;Ow>~;>azd&G2EO1?eWT5^JS{at`+9CRYKnYYyVn z*{s4$_kucm>)NcdsO46Fz%7wti|cuX7gRY~o?#2)XVo7c4nF0ttRpV65WHsTsbf&G z7viu6cT1Tp5i1;i_kstdhhXJVGE{r?VBqd2TDX{rM9&{PSgEp~$1%`EP)Pd7qWV~J zmRpgVOryim14{VcMuy$@QW8k0&pBnjN3MiW~tZ(O8iox{}BMN)Lr7xCqL48ki3nC$rObzxbGSrS1N8 z`y}Pu%VVal4;iPf+X@#U?k|(n&LuJ?au7NgHR@N?*~3~M!}q8mIY0ubhT%f>@?hko zgJj@9SU{z4i=O09X7D*OObT=Lze;chM}lXNqTAI}&kYwUezcXYuAZlVTYK^?YHz*o zD!XtpEntZr>AO``ZT9433s86Gy88-swb^uczCFx;ef z1c;v;(wM&_>VZvts8TwFM>J1WN3?DIZ(NMtclY}+~iy)bRZ6`4^@$r9~NW$n~bCYUYw+m$f2I8HtC7=H~#_gPem2V z1^9XL0O3g~;n|wriqb_C=eAUzA!l1(Nnun>rZfpD#qOn4UqE!tpN&0sC?$4OGgxg==PZK4Q9^R zLc;Clm!c0?n)@EzLPBu;uzn2!K}l8yO;fYs>`EhvabroWIfDMRdrZnz>W1Dx{w>dU$zAXz^Hs@btdgy~22JM& z+RFHBHCNlPZ2%+5@2SztFLBI?tg16sIsRf%S!Gl>tI@c)?f?6HL*Od4wBMikJ|6+hLlRD{=p(Lpz z9g6t-LPAQlGL)jjetDzc7sP;iulvK_UHZSmbGwrb>mB`z0e#ZE2+ww7q zG1I5&egE@zhj+e;PiYvfNJ%0d%K;{%=|WRZOT7>s~_{a~DS!Bb22fMY;A6P?!DIvsd+2LfLe z$75X#|NK!>NTvdVK={+)snD9U8aHWSCK}`6r|Nl9Oo3D$!sr^c0E&DJ^iSB{pg7&N zH=j@tu22sErVtxYRP}}{oT??_tIYUr83R)q!WaSUYj+ z)7yMR+0xt6>##{^hwWKxVy|NrTiDjqAo<0_?T5kF?ATYjTjuRMAurLVmjHZa@sf2q z+P!wC4*+EuC08N?Ej5cZEY9+UW#%!Z+7udExp0J_LW$MlxZ(e-di#!)(OZ0<*|(F( z7p_Dndw!hc?Xl@2C1^gA@ka z+E-pM4K1q4cbbHIJXvo3>1Co8Oc8*`p6VVFFsP6k8(zriDs}_){#ae*L#4-8@ke_n zY&=o2!Cf;1Jbt!d?(G|1Cf^J74*}JWJQRasTZ+8)PyCJ&Xl3JYpyJgVX5LZi0Y|f= zcu7JUTx=vxHP_%!O5itcA`P^Rzo}NlU*xP$N0qaZMvf`in#h~N;42UacYoQ?QIIqp zYc%@pDWZbzuU2@XhEx`oVn5Gl?|f5~`N28U%(sR5B5N`aQgMhcCaXA}D@-nO8I>hA zlf`*&4#M?&{w%6?e3iYdc(ZmQ8vnA(!~Zn!R5~$i)mGI=w=|^fpl<;IE&_lkx_`o6T)CJAgeAT!Wr?RPT+h2^YJc{{%>Rel-6al39Awz{-IEk+sPe-x^J3T>Y zTtAHwX^X3lm-c!#>BLaav#BaM={3L9!Cg15rqn?&92(1I8Ns3M2V*5yBDIvbWpMjAgGGvp6PLUecl8 zDQ#3N(SP%IH)0u54#Y@ug=RE6ynOOCJ5zBrk#GG?b-cxb>>F~SoqZlM--dO}&Y4db zy1T!x5jy5jZsBYFfWVyBh#+P0I7q(wPBPeRlQxHJZ9cEMIHbCu07*{D060G>;r@;k zKMtT;@)|}#Az5T5wLroYyuod@0c+WU%m=Ui=&5&xaT!yNbTx%(Jw%uT4u3WoOeRyr zuo=KA_4YD5=Jzq2EP)UX4#tB3i}me=SUB9ookLIH=5f9mZl+LE|VcZ)g{`!6Tc!5LDL*DwCZB;@>lKmk)vz7n@34#+(YC6WXwO zBfl#67U?xYR|6ZLX61Q*Ehp)sX%WM5X<*eu`UEk+Jj%KYWk1rwj9sOHnl~VP41<{h zY2ExMQcpVX+nf2M9`Y|%k**9?PS z?QFi&wyE`XKugF`UA=9r&U4BGOhf{uzsolrg4U)n)7l0!FgODv7-cNCpMV)cF6NqH z$h(w6j<#sQNP(13)Rd+C>jK=`Da$w?u&PJ_Hb$*HKR{~ZIG-5Mb!TF(uMNST@CSZD zA#_~oU;Jc3P4Tpo?3kD^R(VlC!Gzz5=$0~mlGv&Na7F7BY%4Ey)*p+@e$-+gAegN! z+PFiIl41;d;LxaWxCl#8%$ZLL6>IWF8|Q46u6Ezz7;*coWEUtoA#0aPYKuW@J5sO*EgS@CA>X_ zNq;g3FUR>2|?457cO(cq&|z&}x?l?qnZW=q)^q>jziFXg6SmJozTuM4JQFj3LO^&SF9^ZxIJ*!Stkvi+X}jhLkFfR0D$;70B5Ryjv0nj z6QPvDa*`dJnrAYTUIzF(WwZpwq@$@Waf*v3z1lMy3^^qk;a!a0X~4?+SYJKGyV%pj`B0<{fl}*P9~X)ouq9y)|ILpqL*PSASA5ZU@4qUx zWt$X~sQuM{U$2>k3Lvxih0w!Ut#z+G%XERUu>|>X-~>l~&Pqe%Yg=sVEfv34uu?h{ zIEC;6h*n6P{T>l3AitPzthMF_VQEwrKeM~d45wh$@fudqYmL871-yNhdacect6C0u zvN!TOGKu{G3$5Xz1k)p;A(?1jq4`Z;1Oe^X%1!K}RK4}(%NU_Q zO6{BO@NGepx3xN_e@;e!FExK0_#m1PGo2&u5&<80RVQlEF1y@lt4~qW3R)exa1+EzA<~I zrHEo87pUCdhl;0Lgl1ABVURx(dSTxurRn@lO;3|>wVgQP?CX!u3UmM!n*xW3kxW3r z(@OF@(Hg7Fh#Xkq>?XY18q6QVWeT>Z)hJ`Wj>4+$#8o^C;<_icP1H!EKbY7qlOn)H z)eMKc215%*T21KQkS$Ts?(&%Rw%Za~$f+!=#LkW{0{Q!Mnljl+LX;GX+~`#vWvEK1 z+f9AW4lVmU^VODb^z`rY`6wb4F=Pzo&V8{V229I7iVE9HL6(>TGzsIpwJ~zga@XZf zj+j|BQ?BIdVa5fK614r+ewWX*RUx7=8WCf*mCAxKor*Z}_IGbjJ@1jJ@GS<*j+Waf zaxmo_6_h~ghjhbth|#+wPPzpo0aA7e`?2cBHy+h3Go?jY2kgtqdYO?MW*^_)#=;|W zk;G^4C6IfP)QS|?kU`fbjNWzdk>N3{DRBMB#BzCm8PjyISh)cNyqq+!8Qi%vKunRH zIk-R!5kO2>F-wpF3xqQl}$TRo_oRto56_iH{#G+A7 zRGDmKLTZfL*>jERoocSjX6-2I1UZaZEI7*PqR;tO1u4y+R3%g-C|!d<4H}J$6HA6M z6Q3!E%GKKG6CxvsbH7){OWxGm)Mn=WhK-7ckE<^7001H=;iTaU!74-~P17h6GOoC_ zgYhKPe^cXPG1FFoC|{3zi+-lp`e>yyCIrE%_NSvU(mMAlK+*^}b+(IA@2@yDf~pX) z`7}qQGnPqq60ku{G`-1EQmCGCr-m8cLN99P}M z;Hxqnr|cZ=8ydEHwO#hvO5YVFc(k%|V(p6%x>D@%FR84O$_z6%j7MvNltv^z9sh5d zI0YFbA}5R1#iEK4jSj>Bw3=+XaMH^6NTR`n;sd5AV6-9i68cdRe7krd5H+XLv{hKUOGHd@?ajd<_b*h6f>bWyYiu5;5ZpyowS3Gze z8tb+FRuJ^wWBX6#QPz7}S4{x*PX0|Kay6Ucf#}hDI6YG0i-7;6eGWm!v7B>yhYJ;* zDQx{x#nG%yHSY|AFe#x_e5{LuOQ)K`HK~}dW1iI2wi3Au8&z4aqz}TdFG~~gU^^L% z?2vRgX$W8?Sp`k${J-2L0fmx~V{!+Uy0 z5kzfaNJ-?sEeUTNM~ZYY@zJ?B0$D1+fDPhUmA(n{Wu<@rD!Ooc7{Y^!rA%>HGp4sG zB}eZg@p@o-}8}=l(OgB{6N*(sj{3_W2gPw)?#P5-tJm+{Sqd1tL^Pu46&$V=ZpQ?Wq?N% zfpOP2EU->}8S`d6#jRD(40@3q65HMu78(jd!t~zs2}3XCU_J8S9L$`IMkQOnh9YLc zGXEH@fN)G=9(4Y-Tl4KA?1n8>=CN5*K0m%DH|_6q*uVVCW3Zp&n>a?ChJmc|MPWXf zE?xy1oI;@dpq2x7CcNcwv?SJmgpzh{KjAMe+KKUCDJxGO$#_pxJ{LhS6<*$k*O?XGql(7!dlyj1n`K6qCY2f(t^hL@QOg6c9=Gnz^hN=q_!0o2l;*i+S+$Fi@g6Gx=~5!Y}Yi81A7~+W?LDEN-)2FzJmFT4bA) zD*tzI4Zt+EaUd}ymsy9CG;gjZP$dhL1~FOtE}E_6r5M#FZ5rLZD2x-Aq1R&3jg;H7 z0jAQ!y&X;=%B~>@(kBhgO8<~&W|}?1raU(S&D2>N#7?}Kb>K_d$dTRskuTkz%tU!2 z=D&ia6lFYK0DuXJ?Eudb2=vB+?hlMDQ@`~Tr!E^0z2Ev~tO<(JUz`r6a zBV%XYQt4~2rrrpmDfKW3&NU;&wz&`%K66U~)Wtvpg}C@CHp(Up8W4$bKpF>7V2`yi z+y%`Rz;6XJDn675>=$2_hUtenfnZUVpo+8!_7hOE#*?C@^^(C6@u+2T^01N9Djq7x zx20kned{mury2^2%Tk#ft&G#VR6d2SbY`Q-8D;w2_)U_E7<-AGUaVPi!Q!~2=AGQ^ z3h~CnQVZr!a(aEEQ1y7(U+s;qLBjKR;96?-=cCl9f%aPj$Ak|pTJK0kLk`Pxn zCZ>bvZuURxz9)c77L*CRZ|?#>5Sy^;=E18mTWmlKDd)wqF0wd~cT&Z|}A4=WT#ECpwY16=wt`C_klSU!&N_j`y*|kWz%s zsNal(RlF`#sd_@N4iW^hv=k49FYHn$-sL6D%fJ-0s~cmiCn|;vd-orrt9_B4 zmN=d-0n75PPR#4Buo!D5RE?Gdcx@5Le3s3RZ7Oe z-U$oPuUHQHT(Mf-&@GRaoeGv~@AKL+ z5e{W7{|BYX45`1wP)}f|Jz@Ei09)KQSQ*97>}3~qr4!JiR_(3Im0F{eMO}rhDC{*= zI7yQD^}?+DO{@ve6gJ?;C2v@5zh*7FWdICZhh&GSX7+hQeuAOEtU_b?H)PhTDlG(i zGu>F1k>DTFf8n+jw!Hv0@{VJjqQO6~%*n8#x2&P({0i&DiJ}^~Ja&!3%Wl!b4us)Bgux+_prs9w z$!ws6p{H$44CTy~i_-z8p`oG%!gIs2bHiZ^){XqJfCr?7z^2Cohkm*Nsnk*Pupkmx z_%Wea08?2#!uAB1DmNhodYCJt_oDC-oz_dFh)cl z|1}VRf(|c}gdi>$z6REiqMX<W(r5EJF6BG)HM!%CxJ2*S@IBeIWhng(G6dEhn1c5|g3 z8;h1rZnxSNHsrL)BI+Ydj9RvE4EL5-czkv2_94*` zt8QPAd*MsH6k zoAYn`XWq`|O3bNlwe&IVE~`S=W%UyFunmSTLxz&7Tkv=mgYb3Qi3H};DMBSmH5qzD zl)&Yrl6J<^R>0S#jGX$Ab+>c8GnN&%Vk;r@ldWgg`rC>^r`(L@U`s zE0NDMuIZp-H1T^*ESko~d~eOR85L7K1~xY*4iJ&L-c>@S#f4 zX+@yGQo?QWEvOOW*Avg_+up3u=ord9)=Z(idRb4u^H#QN@%1v|sLwocg5}; zQu(#@9M}D##-~B(b{xYb|?)x5x0|W>VAb9ZL4#A}s+=9EcxVsi8#a#-) zwYWoZElzQFEl{LLffi_s6!>$0=l7ZC#giAwT$#ztb)DH+d!MuST8oChf?%k4`t~r` z?9iQG?w@o@?eq86dTP$E_-uZ$dN8Cus{_`bp^#cb1?6GZqN_rsnGgMRsng2MPkCb7 z67|$ew$^!YK>*Tlj?X960W7PVYByZ~bjRG|Kw&uO3J|ULSPY~jzhtz}#<%E9Nf_n& z>UaKSom5ceP)s7IQZpDGA+rGW{H}i!3UMFGMlWc0M+MoMLUjv0z|1`TatP&K zT2idMNcC?H!ff$Vb$Mf$7y6mZv0vtKkA1xA8`G5I8ct7Ui~q<9rJ&Tbjx}dZRBBT@ z7fqTQh5b2H7d3R!H;qhcOjLb?BY}!dxy|ny26f8;z$nL=OdPOEOA-qswZyJAKV1xb zuJ1_eg^pOhd4z`9j92Ars9Bqk{(z)9v&#+ZFv^hF(mnqYqCJcW4@1YLk+)^WCI%xv z?6{v=ww9{bLxLGO1QrdIl=!&|SOHW8wU_Wxu_b62;6tVEsKzf`=tgu+Bd9Zf({KPB zX)N<81S1kw<(IwiqkX6o&_apv3w=OLdH-mg)3iY(T_aTJiwDHPHAW9VSye-ZOXl}O z^pwQ56O)h0_5RwgQWLYClJSlRx6_Ij*}SI?M2{sQv}FS84eQl|`=%s9hBbDFL*BGw zd-b2X6Hn@YR=n3_C(v4Jtn3mfhJd@23{q*ZdTCeRb@=@zHT&b>w2A6oi{$Q|5#}YH zetZZF{2y36eZE~Re|)HeKr!;Yu`C&Zo{aelarUsZcIlD^OPS`yHD?aWw*4_;a4xbs zh9mE=YM~b^pKKeS9se^PHF_18JR`KP4TGKt(6POmPheNY6N`27TzFLTrZ9EZ$(p4= z91F?iZR5qFIk$kagR(aBs7QqvsZ6lLO6&rER85s*0Ys@xsU>)%CqL2z{jvngCx%9o zYFGiy46W|GpKkA8AwcL~>WGsp>%0{6eA=#=@iGWv`3x9`G^=K9Du{u*4&)=q6gWvq z<5qbAxbQL+NQyMSHZKhoI(vRT=@;yv2m+lg=_)?-5!=t7qjj}Xq;=dN=M(r0T4l8R z`C3>w=&zpWjHEXET~Egcwo7IEr)~)&xW;icC%jgLr%KGFZGIQ zASvRm8=88Wn)A6JyJFF|O&WhbhH#jxYFAb-P{`a2B&(OxVW;<|H|+bnPx08`FTSO{ z=J=Y{;^OK&X#GR3@Y9d|byqS&UmayZ%$C4wQ2E&7Gys56qkuxSu}@U73R6|y{%-7S zs-tGI!#iF?OSgx;6k`7pi6mR|22+KW1hYdaB4;2g%}K>FIZPlitQ5TGXvM9D99jBt zeC?If%xa9qy1Bqi@nFke9TVhTx?aM_jNG YEYBVPIeu^S z!AkcHzrw<1IQ+>-{hbLZv9j5!qmM9sE0=@%gvLsWme7$=HeT7MoHv&}$&}7;;ug+^ zQ7sU<#Ja>>D{=G6l_-NZk3w0M)De>i->%W)y)ytX$^ftklEDzcF-ktb(iLO5>NrMM zV&GCPGvcg^YY=%O)>R^B24pLm9AoXfQh=#im{GIzaz(AuAVI9wR?Al7<+?Gf<0d+s z_Ax1c&$Vh4cvNJK0@ZF;^%hPPZC(5;x{jDp6O)^7=I)Wn4`Z71FJ0Mx9me3`8`cjf zN6SP?Y&{-pis)nuE=FL56jKPn6!Vl9X@4IqSfTnP2eZB*&Q` z#EK4JQC?{H*Skp=>7b=HF;=G7`wUIy2>x7y-~`^R3yt7dj3ODCA_mz%oN;y0@>(a2U1 zppg(J9!p(24KiC(&aU>xuq9bcCL$QN!mnOo#ucJ^l&%S0@#nZ79r(Mp^UwujbU@rU z1b_2I5=4L^F6aX~rw%1TqEe|P?@SQfjERK@3(7#lm=hDT{4cFm1Hg9?n(uu~(P-;p z@F$-Gm}WEe{!6P&6ppWi1wcVWstcQ@p%_}3B+LJ3WbiSE=N6Hha|l4)vuE*~MO*wt zj$1bm5BulKul|SQf8!sQ&maB9|KIh)ci+d(ZLCBvU@YE%xy7h?b>t@$qQ%MsB!J1_ zS9@hrG01HflwLW=g(Pq!{+uJ`{5%>9xDKc5Z3GD56nLUXDU$Zi;U$^Vn_l9Et$0NB zUsER?&5n_QE9XIeDh>bMjMuM48;kHxBoBrb6gOw;M>|qS*(rok2)o~~i0u~aw_lx( zVYC-_7U$^3-gZdLPUtVNbu!E}sU}`?GB+quhNKxt&G3zKqwBvJb*mLykiXde{kEK! zoieEsBc>FuL_&Z@8i&!6i`Tnb3~UzVQAk!dTEHduu_W3(^5fHdyx-ZCW%?GKE>#=6 zYGoUNLa&s+o{Mm*M+CHxJ-6DJ`L_Hz+2;N`>HjN&r$l#@2`STNd;V{ME)B{vArMAp zX2Dbz*+yAP6!Kt&6rJWDRIUxY61Nr=%*+(T3S&1lI}oGdUaRS~Yy<>h(?ZCBP;96; z>i|ZGBoGH4R5%P}*G6GXfHVqG3khcSGfY^ktKx9h@P-X!)I}7-SYu9Zvx}O5-U@Q zc0a~|C1PL(%P>ljf#O00nODYVrjDS!8@;-0utLu$YesHibPq>ZpB5`UhInvD2pA-{ zp{{rh3<1Q_0ltyg5zs202r1-?p0)}tvQURqQbS**=CuB305lAc&L+Z#I!=4kaBl~ywrNU~c_dqx$jpVd#*nB8MmHkK8keV!7i zz0lrAoHwVbfc6yf<&@|U2p$?~RIa|2Tia6dYH(r;26zQ>s_P&I=mmzG2h!i*Nz|<= zekn!~ssrp@>yX$qbibnC<%!8e^pOa`GuTW8;v5o!*^df~&sE}9$0z4ia(xVhOyH8N zhBy^=+4euOsq;TRoseOxyuiQZEyzbl_1962^T-}=l@1fzm>@+lw0d}RxmXK0#4{>2R=q&U)K24=oVfd%Pbz}7 z=+4P(fi_*{_;l^WGO<~nl`7CIBV;g`gXJRfn|$@WY>Z*7M3OCmG|HrSBbnS6A`P!vnjyn%7y2kQ zX_E+ZWFBT@p@yyS*TBZC_Z+Z42iL=Nphf()rtWmz_n-bLKkm3cRRm}}q{rf^Bub(n z`wZiB^~^FUfa2gct^HOj$JMuOjn*657OkkZpAFhr9xsCPBeu;FXP~44`yq!=btpL$ z7~E@048RA6#i;{@r>XNtlCdXMAS$_vtSuJNJXlVAHPu<;KgKP2YCn}04SjTuI3s=E zu>g8k(HXGVBF5%NSeqI(D7)5Y58%YZNS8kH=A^_1YgsUKa@b&^Q(oJ}veAv0g{5WN zv7>JC)2KnSiCF0QVF|LBl4!fwdy>k%bbT8kO$6q|D{vk_CY1C7BOc5s(GV*fhYPi1 z$2A=>93bI;nkCH<9<*2WHirkRw_>8o%@!p1{`_dyM_s+Cs>P7bD#eZF(-=+foDd!{ zR86U5-WOUBww|6G37~^gy?K?OdEl;(cRi|~l3U!Xk-tCmG1BcpH45DTmfBMjJ({K^ zTbC~FXtl-}@5(9XmdiQlPv2^m(In>Q^xeT8o6sm-T7NZ8xO}UpwzxK-8ej7bPTIcE zZ{d@(+i6|QrTXoW!S*j!e{3k6-ErrCPIA{8@q-7;TGI%wTDV&(@^t5TC=xZ{sC;LARwa z;LA%40aqS47-Wv60mh;bpm?HHY+E)5;rQ9s21?{!kX$; zHQsyA6kg^0l78z^krChu3~}euQIE~W4;qj3;Z%l|#9~1r*lbB#v^#@(+sKOL*$>cv zwwrDfx~hk~SC5l=0E_^J!lLB*(gr=bw&P=?>5!A8npi_D? zyB3;qy*zk75#cshpikgKMhAF_NsJ8#Hj!r6aWo4Zh2c^XZNd}>p@&_dq-2_KKd(A%N<$|8(d&7JC^Ggo#!ZIaSYb&5pJJCT< zs9j_*gBE!V%i3#10zW%mREIQXP(E@~78a%p2`TjFL1f1z+WpAq#F=^BsTDlikb8Qeg_^Kt0%e@|b!sN7+r}jlHD2D5hK~H1)PVOIi5#VI|1U zj%%C}{g2=BKLZ*HquR4K5tOv$zPtK$4^#yu`OSJ_xj84lIu}BVH4eYo56>*C>7x9Qh-!< zvJ`=2*MVLTQ6dHk^Z}==;$1O@3WiBHi#)0Juuwx(_aLUE>C~1AeIT}SEJg#Y+q-yBC4wN!Jkqa1c9XaR>}Z^*Vt_)HL8ipIa#p$@3Ff1_c6G@lI$3{ouMw;rV}~$ zl0cJk%r?a2Y8fxv&ZCQIDePW#wlP!djlE_#@?80%ov;TkbC>EuEks>|Yf5YzM+p5O zWm`KXT?IZL)RTSY9dTw)m)?{ifu1r{qvLk2NF(Q2n$+g~{=GMStI}iFjP&uTd_E3o zhob%GZmqa)N0A11#n;l8XI^W@j5@WscTd%ap0LHYl0$hE?QELENdXild)-YzLPtCI^pBP3uy^mR9~`N0Q-E%#VP69sSlh zfvBYZbbKSZckQiz)*PN3yB5{}GJ?pGZw3;$%=yvo8WRPU?ox$t!B?`vS6al1oZQh& zp>hfd$w7+~6VXlR5DT;jb`f()Y=tK(*0n7ven>`Ea$6l@&g?S=*o%T`mR55Wh%+o= z=#c7YoyxQZ!TS1P{eqJW*?8vTOPB##r2-|RYn2IjLT_+}LlbsO8B?mutHn-RLzp?-1PHd10Zzqk;(fN_v@QPokB4NyL z{`+Q>x%#HRvWhZA9P$O{*`W9bM&cu{vD)2KVZhWRQs!4=)lv*1*(Ljt*EA{1hbOI+ z2C!5pQYD?_kBZb~!8hN19RxdRVWU6t)?`~VH(s^Q|DO3bWukZPn6G9s@ZN`m@Zt7Y z?ca$i2?1INsGkEvq7vgHG>Vaym|mJvx=rV}RuYhW@NQ@%E;#Ce2Bg6nV5jE5gi%bd=5ct!moZM8Um0?#5ZIv7y|SJ1p|f} z2qdI+Na8ZTA%_eJ5GMJe>5U)-p-9`;vmfD-vOG)4ua9M|BR9U-ifn0|SG}%zSXjGX zcBxpe;FEu}+4zR*q8E63Pd`CS0sc&_`RegsPzc8$em+yIdX5Gl*bGsfZ-Llrd|@L( zW+A*PfI(smq{T$X$jEqNT4kU`rvzu&D+t-9(2P$`9wy45g*X(VK~g+x0RU!oPN6^u zL6oFaR^mv+>OuIBq1Bws{@BwW%sdTXn2Qn>? zz9nE>D|xan+y%@1dCtZq4*P>9PA2yWN;FG7xH_ubEp0zvG^A@@PL1gk>r}N8#~3L( zT@~xI5B8(g2isbkMWS7$$+4*I#~}Z5mIYH?)U~OR8nT5gJOejuiip{;a~*3MS5f50 zIr9hXOy-OII4T}1ftL>v`;H6zPUxjC>D^Uwi{qzC+%v?DEJ&|Je_Jq|nWNW;vDD5L zd06v!-t+kHU+e!c*+&1er^e;EL*V>V^-t=sB7kD9sF4Y7v`uo#c3r62I*gHSl+c25 zp>b1Rx#bH<{28qpjV{&{!^&GQ2ROU?nshESJveoYs4+t3bcT7(yLu+v59(Si9SBP= z2%zoSOMmBT?&%&fCC)}U916en^fJC5)Aqk#)hoea>d3hSWppGX7)QPK==YBEBk@~U=%N80=gq*EfeMLK@KI=(4-1JK8!kwd5Mer zd>e|BE-*;RKsOH4O?m2Yhh#{@5Ha@M>fl2tq#6QzksTVDmN9_CLRu-sulNc*(>)#z zWVaKTSAhfv|6C7q%dqts`O}1n?E#x0CU_k>h@*ZH|Xcz~5 zfS5`~7zd59v-AbhSiQ~v5+pMi(yxJ7z(jy>ak1s*fBGi7tFz}oQL2~3%I+4yQgUK& zgiN}Cg%n=NjoV3$HKdEe_}z4Zs+puk#LPk1as#3CK5}BNncs-`vC)Ia%0s8&;qU)~ z;J2px8$}E5XPv(P`^G1p<}y-kwRH-=zxX^Sef8N(|jOA>XLxA zfYn=Wj*76xvM`Hq3}L=5u~b8c=OZLR73CbHbYc^_qBo3ly1do@VZt8(J|b%F%m;x6 zob*$f+zVoCPc^xz4nk{>seTl>01&MI;YQDtaOa@no$GP4im-`)(NkQzAPlo6)olHW zIBHAy9G=?e`02<}h*+G)Pjz>;FL9&bB0F_TTJvxt_ER3To4CEa$S&oz9;Zv{Nygmj z%ctgs8whjIA+`PfF0OvVxYm*Uq?Z`a+YCRANrfZe8wymk4Az``C6M#A(mHI8dSoN% zO9XerFiys(>D%GUN8=?y%1bJ6U{0s}XW>q72ZICZM!yYy-axT`GB;ey+{1T|H4krY zI|6S4je5#u7AC)@F&g6I8=`>4BtBZq3$&&wzp}8*y=g`U>=C6ZkbYuo4si#a^07i} zMMpNQClwlFINVf6Iu;%bd5M+N3#2hG;zoVJe(C)TukN1)M?Q-a_k=@z}8 zuI}=umU>n`d?8ltEZKXvtyP-&sNLEXP7aEa3PLdzt6^vNu@5<=*roni*ezXvHdS417FZ`See0ep?hxdvc3&*k4n}Hc^C0fR=_I=fm=*`*&!@ z$xPirf*&qG9D@YNL9D5$&OZ~>NH~uVTim%h$*1ZgE9K^r)&?D@)_aG`9!kJQUzc$3+^ajJ`mK0 zOUJ$oZ_SyaMU#D28n5mu5Ei4B8g9(UcmNfDN8+W~`YG>dw$GEpqV&x#^F4-%iWy8t>S6<-I06m_B*1|%^orC`ncip$FtQ5Zb2GpDYMi(a~)otPh7Gyn!^lun3s z_4RHGED2Q;{oDk?<-p%Cke0nz#JCmn#UQj{`>GckuN_9l#c?CBsrmc*hA|QO4l@Pi zmX+t7`OG`Zv+1ysC=pVOnk`8#hKLl=hQgoKTKE*!rzM2dhde>75+s< zKlwzcea~ca(-kCn4dDqC3<3SWAO3SseYa5Q-?Yw%0DS@#hm^9ip1Kt$Ig6d3V)6Q{ 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 z zmt2hnT6m74$Y@CST2l5Jdi*E}x7p$mwTc^eJf{LO_duEGYR>W6aq-eq_<#b4ia2RDVwXQ z|2Kp=e<#1!v2A5ZnzqU=U8WVN^B1?r;|@-%VErVdQrnzHQP=;&!RQaXfr853`&BM! z&b#MTcl*$pcb8zNCznhFNJlO@$TUNIsTJ?Lz+D;Xr^{~dU`i^_1k#oyrJ~Ua#T}WP zAR`Him%L%!Q+?w#k>6RlETJ8-K5QSd)wH(DVK~r}IP_gbRE}cOkTh7}S;0k;UHnDp z|6&2qSIC7tNU>=GFIbnXsdoB5T$C%m_0@0*;${YHtGR;GKnL>puNZ-Kia|mUY1PJ~ zUqmA#%sKNuXW;wpDl>SD3FC*wr5Il}xvt!m=Z-VsdHEdThiADA3DAIYvs++jUkP zZ7*~23JKMl~gX3pEurX%M*>c5J>dV~n;L5yQLUI$|1<+8o7Q z>9(tspYP-Iz$cnIT_lioG(WQKCA-qzrTDHI9jAs{;j1roh_Z&dm;7hY(Q>i-xva2s z2@zdJR|9UP&0*_O?R(Kh75>pR%kvsCU3}UJo}cXO4VN&E^VD8JtE?)!yLA1qe;^5c@biPrw+LZT7d00O=A^^OoY}?4IdXZ`GB)j<+leQ3NpX zxvsw6Kkl9$=Dw#43(w|B`!sOiY2s+rBCr`<8#CaF~%}uSLlk{&!K0ooMi>MX`=%cBdFI zE8bM`khWG9qMHK+;~hrrIuLbK+u?nl#Zj8G)?IX^M2i!~z&&zKiFNmX&7QOcGd2M> zvASbnEHccFth?58v%)nVdM*unZF~eejqAE=JQe7lMWbIm-$Hqi`Pdd2wTo4>HAkmi zrcyQoj3a2N!+8{4B?XA_4ugbHEKSMl63WVXX~qc$3pC>8mgRt?>1-Le_RczmQ%d}+ zXH`H7tPJC|Z56fYUF}>RZF#0cmBbvq2hOF_H}!MN#TiO{OP?D~*Hwy37fmmsvHjYu zwXB!hmXQSPW8iF#FC8%*gr4OEtpn0n1juNrjO61|$;7S`k%_TUXfU>Z7JBD&8#ZEm zjE|D^rDP~^lz((lr=k4YHlRYlvR0v|ez;}YE|U@8B ze9~|#DIG2M^?J3+9&L`WC={>52Q{#h){5G%2iGz=M@W~*@pZwh2|jpZII|}VPGDu+ zy1i&dGz1x*B?0*#2ALOs-fzdYS(va6XQvU^807{%$wYB}Ry59fTBJaur8ZJl8ns?* z_BiCf5IO^3G}`Mwz4VXxAD%x?s{$AynI?bh07xg~u6?}H09z0aAbv;^RE8;8BqK%O zhl`O-SIj0@`p0B0e%Vr(2EHw2pUMSqu`Apk!pn&fJKr!}(VY5nyOYd|q5BQ9-FV2s zrcN}I`=(w^kX3i~zRt_?6Cpx|XLGuLWAXFhkN~d%XIkU2oJ@xD9V3TeL098;B7fz| zw&75XcDdd+!=jv=LuqeS+J8~G42miqx6^y0b{ym`G!)7AHQ!sh3>0Q8Ah23XlIKiOyTjYb=(?I-A7P9u zM?Pj=HiQ&qjuv#%70Si{_ASV^4YZXF5LN_|F1N0s3(ri`*r>(^@M4TW3 zwK7dn)wRhtI(c=IoOr2pENyc3D&*@a$qj{!If&t>*|^96G;lk?*TNKr{+vWXs|~jN z&t*v5h|`A6i{t}ub^WfKiH+LVp*b7ekoOc44SSCD&(*q;?h|gf19bu-2F}`dlG_nx zfASV#==|%xZ85^Ftyg*ysNKz(Fsq}+%r^??k9j6Zpt3aoupb9Z2Fhr^1lQ#_*Jn3A z7%VYokLH-WKh`Us>n6$6Myc5?EwfK?=?u(7{c~2+#`fAD6F{NLAo%XZlRegASjKjkPz z2Jksa)&eb41aQ#gm-luaKMTBTBU?JeLh#NzM;;*EpnPYKQQGTwwGJ$|&1EoiFd|ym7bfTFvo%^VCrDXpDcOw=`q-Xr?6Ai#V4t7JK9tn9K85 zvT+88ykOS=RPtCjo>*u`XffIR=y>1cVRX_jO)}ZM#7)7x!j93VXrqq*!RHR4m?aS_ zPcC%GE;W>MW77m=moS5T1ON#I`0cro0BEiupQREd_TzclIr4o{Br|nfWKxUsg|9zK zcj3nhw*v=(%driniYSVOr?yNUJrMTqw{f1WmD(JsF#^XC1D%zv1duEk-Pu0$h0jY> z#A#d>5&ugkXuJ1&&0F1NV|%No&)EbTp6AJWR_+E zB`naH8G8*vj3|qzaROm zL5z-^wPiLe^pQO~t?W||JT{2yEsMQQ>FOr@;!|z1i28tsC?0#;0G)*hYiHGB`9{{V z{r24KgT(A==Nt9_;T54TEg5RPmnY&yt;z{uR?AkCOqk&Xl3L}DCH$&d2j{HAcBe8S zBE{ibaAn!R^<>o{(G?S%KUk@s**1Fan+$oN+Sqx2r&8MSE9e|IydP@J|7+F0f}*CF zuN)`|&MOUxzeUHPA*0DK;E?z-poCf1BhmAoNXY_4j=Aa5|My(!k|qBFYT1ynf2xC>2? z&2?jGq_3<>D)%v+*&VH^^-4KI6TaEzC+B(`5|osUF!6)52QxAgQ95rHWCy zb;JExcLJQZN)lpwY${0wZ1Wq{kF?m<+lvnNm?YIz-q57-@!Pkrv-C(e!IxLTIjmAbNc@t3awu#@&BP*ae_= z+OI$0$QP?izkB7NfkPCP?o`XTa7K;6`To6xZ7Sne?6%j@9P~|53$xX=xT_8A8UOAY zLX6031d3k^x)Xr!d^DUP0nbkx1Pn58TU#CVi*X?M6ZcRd6UQDBXf4G$+@;?dk9?&B z1z&RM*DecX?4=lSU5V`Yx>;<(`@MeLsG4xMzd{`gPY`(Mi&RdO@o zfcF)Xv)58!?=x+ub3Xm898WEcx0 z@IT zWhCsxvUlg49h%8p6}>-4QC``2iG0ow5RSZSWC9BXU`50(wvnXLV(}^jl{dSd1@+1# zRo9OgJ2BN|eF)V~&u*&X;->@^CN~a7aN)hSORLN3%(nW?xvIyQ`OQ7@Z(3WEj#0CI z2#yv|^{ZMP>xz80-Bf%J$qxUb#FbW^6Gj%By|f7@t3&6XC~s%~NbT_nGET zM3Mo>GHaP9$-G_R>AC*nqDBp8*67~94*J9c(T24+> zl?eGpP_^EyWl%sWM3EZi0<&gzB4Giyh#i!O-_ zrzZy&Vvq2*Z%rSqUluT`oDJ7?{?Cg9{)q^;Y-LV=nt&8lSnx`0!u15_@;4sZB0< z+@Rcd+1#%Sfda(jAg)iBTj4wtqc$@@f?nKV%i`Gha%(?s` z0c_=O2!r7_3t=y&48;^waHq6it#6qBI?OYgI=&&fXpwcjz3A}2`crL7xH1&_l6z#I zp+Id%qjzYuD)i?eu-TD`^1F$wc0;jCN$tsMd zHTpEiuEjhtZVbJO;JhzgO!k-I0o)wa7m`Ox>r#312LnN<<~af9sz;I0a{Apo5;|Bh zXK(lFZ+vI)2kXC@vL>0@Wl;MPAuHKC25nyD?y}W!-QtAHk4?8C_1i%)?&m8E)`)#S zPa&bR3MyHuz|_fsCI6(-|E=Q>U-Y~OxxTZ(aU&8cOi4;P%m1(|2gXu1nnHH?HkMOp z<%ON`{k=n<#}tQNsXePh`RZf-OkH$J)wD{QN~e2bGmiBvG9Utznl)BH(lJ>x%?-zw z9tK*&>G?+cwR9e?!LLZkMM(#;5?--^DV}c6B6cH#goo`6&5#8oJy0M68*2;SjRQY} zYnrFamds+gs%MS|`5lwBBiHpflXb%+2``vr{~+kBUR>$_ z%RRtp{WTW|t(cSC<}0Uz7-Eu-FUG?GkjB!Q$0)p7Z+U$s`p?&l7_W7n8U#u{EF?+) zszoj?654lR4*xk}Gsj^3_U*%$7T=)q>fm2zp%i&9*435orwd3^;*uNKTBe`#wAR+j z&`giDQ&X5~?(qzdbTeS(>}e%7X*;4m&e;17)uKe5)N2sw^N@^@F<2dIP-jKoLCC;uv!)e!_Gpx>K7N|y_8a3UneEv>t&*($ z|9IW>eLb%H?cr4W!-vb$Vucegh3%3>Rp}Vwzu8!Eolu8!n{?`ZjE_m_X(a1b=^afL zMH@mLl+J-mx@j#lZmm>QMe6Q1j0rY#WgJ$QHbYp9%OGL-B}(sErddx$AxQ~JhL6HE zZ;Iq^(=f2gh?O{`7;d|g$Z%6osNP$i(1L%;`c$k+6RVk0UXUm?+lv};B#F{Cf0j77 z;{0-QpSUjgBSKExTsiDKWW9|0`{d8@zhT~EHnT3H+NaI)VkbniQr`X7;f8l=m_eH% z7UP+{Ifx(?OwsI2uTk|^<;~ny!IO4WF zwwJtPo*FyFTAjrfu)cq1q#ikcj}^0bh;rhr80ko=Z7+v?%IqmHzS61FvGeW6RG4C9 z|5x|?g8~m63|`nMm0oDdyOuIdpf6EowOIjY&3PAoF-ZbhXi%?2ULCEEUmmM;%zgiY z9hniw=OW9}pR^KKIJ=%sKS0TJfHMQ=1Wk0GB3U?o;~pQ$zVJ}?Aw^cM$eg}rKQH!?_BFj z%^GA>fco0mrU__6!Pjs>7*@X>1OhtweAJ=`>KV%e#3mB zhiQVWk8*amd?^*3)no`n_S6D7aQD$6htbi}yC;)WxJ0kKz6)be;+Xul>6ZxkL?-@X z#I5MKdtH=o5hJy#e2U*!BDzfQ?E`AH5JjOW;S}jvcF*e#`{{Wf$VY^cCwc393={ns zbF;HH0xwHX`>FHkDszy!?@&^;ABS_oZMzGAh7I+qT^~#0z?qp@qzv>Ofh%MHxV=R~ z%VvIdHsCeiJNe|&o4^+|n_#~+W|6Q`I{Cr;@2@J;-$9g5_iVl{$wx$yYx)$P$3&8I z4dJp*Yh`OE4MqOrIVaCShHCu6+bF!hyk`5oPzt~l@eB8= zkp52zFD9c|x~msxv~0m=)pM2yCE9xmCbdn(RgKK-ei4XBR;sHa0=z#&2jaC?3csIE zcXji`Xn9d(ie3h3EX6U8LSi;WA@lU5 zKiBq_PovSU?5kxWNTh0=3nGfS0u)NC^B~T#|Ev}4W1^hQGG*g@TRTcr!Id3ErlVNR zNnMuN(PY7#|NEhC?hfncO|@wLUBkuMPU!E;Zi-p6h+mQVRunG3@7YQ5dH5~VAIw5J z4ybJ?x9ToIya-fX5l1C$?KC8eO=OEsJqQ1NgZUID`37)(KT-nQ%D;%!+RZ?B+o<+< zl~nfJ!`)0Ogx$*gmrTsPWxB7#j7w!~hr_ST78XG=}tCqAo#CJ_^U`6F-x1(5lS|sd*!c z9M13k*EcErxDDp7S(&4!5JM}6s-nRILC=$*3T~j10bOY?0~#@cmI^*jU^;;KEHrwg zC^Q}YK#JSy-0;46lqnH&027mBgrZ3tm42{0oM1!=LqW;Em8l zC4QN?Yqb3W1s3c72ee{yFPpryI>;cR$Tz8N^n>*9pSMND>pg0hgt4_#o}L4-5t@9r z@>L*;-I70PP0_{d>7C^O8p45&wQQF6Y3xtViK|s4)bvW`-`Y!_<7>c(g-Fec43Z?@ z;@>iS<$YVpC-s$azMYr~o7~x7L`gi1{&JhPvm4jPDCt!=6Muca`Nw|Kt$EgG8@OrFV#Bc{Uw2_LpLos#-l6KrtXGoH+-LN{`nz8-_`P z(b>=_)C@<;c*mw{j=;VqZoN)p=hxXfI`%EXA2=4Y={%O<1>DL7?^N>rFN(N80^63e zDA?P1d4W1M1Ui~;F>IZ0@2q*?&I&Da41x@_8H_Xd!YGc8s0ckRrVR04`-2X~T3FZ^ zL8W?3&X~xDBNHfSuv#iMeDbqJ%MUPu6c~Yq?0bhlWPa~t&4{PJ$<0qH)b<=^d|6v+ z?v4`NqRIb4JZ5ZO^Zau;*y53_r5RD%Y`$zE_E-Z^9w)hP7WYX*y;xoDKQjG=hN36QLloPz#|KI7Qe3vg>CJJn zN0(Om1=N|&bu`9zb&khji>nf78RXL3IF1wDvnSIc9TDrhJ0Iak5>}cGS|s%rtT#Iz zLKF`xEVDzK*@pyz0 zj3Q*nJQ&^Os_eYhkSH8#JfjLzwAAz8?$1O1zG+4r1wRjl{FghpD&^n2OU(zCp=Xk& zRPQk!kGkL}%Pvn%gT5?D#K2=K7+^0SK;fWdPp_9&J`csVE#~l4AYCrOvq}?@79Fig zH(0M(Y^ScSPwwyW%MC2}WTV}gD;OLb@MFE1bEp=%Nlcn(U>E@G2M}mh+~x|l=>1Nq za8COmbhP2cl@@ESq5G!L5cwU|Pn)D*sPqe|kM?0D?BOx1O1N96^PRD-#Zzd~$<(fM zpYij3drzImUHcqgl0@kJtAYg9z4IGX09}H&(GC$TveN+Z3|km} zWg_<2ck_J1@8gpx6*w+G7pAbRt=x*-#^c$a8du&btsin*bj)>8WW_v;naR|mKA|d` z+&H6^`VVJ34GA?0=n|Wjd!)Ji&q~esr@;?iQ&lF-Bk@J{FeV-ECQ(exaDB~Mh|$tt z%amldB5Go^^CX(}mivG}sGwu8f1a_zD=h83R5h2RZo33$i`OcXBx#8It?GDI^&jxc z#d;?h3Ktftu4=Ya;q@-_x2h_1OFAa0`Z3__Unsr6WU0Re#Q+on4qzVVpCvA#x1`C| zY_V2?G#W_fgh>w+n50d8gj0$=5}&yqNpy2)W;>$z*|d?%{a?T8K3KaHa9Mp`6TNhb zN|+f>)|+u8fm_(xM^9s$ z`=Pn@t{lsL=GO7u=wfH8Q+=z{bhks z3cJvMN?3&gd+k5*siW2IHDRL4S*l{d!>cn=Bm@!#%j9T8zllcbRZUT zWym2Bof{obYD8j8cCBAm<%XX!Y;d{aH?)FV+p9C2Hgtf166h#)=&`Y zdR?yybTVcuTS{?|BWoCdipfK76DdWObFaZ_rN-;JK1|N>l}r5x`Tmftl@xynb+v{Z9;g|&|r>hpxoa7*JZYOKrHB7+<+2w9{&7 z@i(y^hg6-lUziywZrZh6J^b?f{DOWIEUo$Fp*QLks9L{h%^SE|U}S6KSRscXZsyKz0sL!H9F)DU0$VWNdYr+~sXo%B?qGwjW#Jv&b#*Njz4uGy@v2qtI(h;e^zOyP zX(8C)oEYftS2*&g48e>hGF$`Ma5Cb(!SR6vqh&p2qZ(ry@{y` zCrS=*Y)0L#cp!02Q^P=^FwJu2dbR*H8kGn*dwR})KWt! z^r!_MgY0JG?JS-|Al#)y(3a2pwv~u>;@FQ>(i)kYiHnb48t^4z=c)oZib;j$f&R$I zj2yh{^-sSn1^NL%&elE6O9EVtBOhwYYjJ(HoKeiroEl?K9f$50&-q)2a?^E>&+g#> zq&?Uk0reMxgh>&}G4f?!9q$#r`>W7y$Pc@$ChKJ>099FdUh__;Mj{jM^)Y+qA1X39 z{eMb0ec7Y@4+vr7Z8+sNss{~7D(0m!^{Udzeo;c405_`-4G9_>=*_T=)6H3tmKK-h z8#KHUH1sXo1LVdOzAX(_Kf_HniTbuG65)=J`UxhFr5i?4g?TB`L1zZP6+C(c?Q1D= zYQ=JICEy3exYv!;hEQuHd__f!lzqKg12WEbwiUB2`lWR3t+PJG7y@$Tu;Rlh7Y2g+ zZ>n#kj8Pc@e1p*a)Hy37$$V(g=nv5xH^i{5MLDleJf2tz!!i=>CGy$l zWI6sxgkIioOe1W1c^nQyK0A_5wvs;;scHfJCFT-4l*vXL(Sn&;M4E-+-rE7xK+kZ5 zE}y65fd~PBhITTNfB+MVkprmY)(7sl^NMA9S1!nbh%P{w(0g>eXOoxU8jbqYZn-|O z&lHX#m7z9!kWeqFK@~dcfVyizm)d~J@`J6qHm``>re-7n?A^W~cc+xWd#W1#;$ zAD;lgPqr^4Pikj9uyZ~-It`Iim_Z$*UzIKf+k3K72{hQ}!yLXF2xXAV<(nHS)&9>| z@#&L%GBNsgF%)hWjmXtB_)SgA_Zj%ZgxSkckk6o6wQ1uMT{x+MwQ8t*KGXZk^0{;~BnUR`%n|^Qb z(s=sen~p{2CIHcRKGu6h(W86b+dCL~PhaAg$q>lXLFSTVvjS`XRyUXg9DVCX_>+pU zxO4IOjiqOzvG=ReMenBF{~Ju%@h!kWcNWxI=RxhTfY{9Wy%tYrup05``?q_i_dk5> zSpX1f@?v#OeXfIk-phc@4x)E3s^#&jQp>7l{gv!`r(f29!XZ;Qzv)FkKLi-V0tK}p zKA3&CKiMipkQk{|IDM}EF>+Mx;bMI&Ba$nd@p5j^l>`EA^HcIlGt)_1kD;NWF-%@a z{bBA5W+V{5B(_T-5frREJumvB)CAi96huM483*Sm%ta?WV^hN)R+axkUEnFt^Ltb6 z_1~XmE!|NZ)A56^@f@sGg&mq*sq;cdgD?D*SlMsR%jZ7|3&Z!PFDWVqYT~lD1+=wy zxlJ^w@vFrsN1hojz~hCrqyQ$%FY+pGpDQBRUYeF9AEDNsc4*!;!KU-Uf&@7vzOL^6 zIyD8K>)76;9ezlV94#MfqffUB*TAieN=C;@m94DL{$jSw@Vwj7fxy=+&@YwpzwF=> zfAdpN4sB%|=>l1o8!531i7=al1d9+6++yaGYCyB@AB)?Jg_Ry84$`3EQ!1j2^QX0+ zU1p7St5xN#`ILgzvV9%qB<;mds9MmBL0MM^$93 z*dORBjs^r$gJ9<3tSaL4VEM(+U1mOb-1ICVA))=ccAe^Nwd6`8k~AL%YW3Ewb#5|_ z*-siKYB|$R!HhhCl_0%Vhpt#K{RnR5=E?Ks(}TrR$o&zMBsXCSK>^4n1=7bJ-|}D5 z-Ua|GUN(0S>OX4IFMNU%d?L;lW=ZLb65wa8)YKBI?|%urBk@W85IhFH0n+_oiRUoo zgVv^5q1COr18JQZVGZP@g9LjKQz!(Eic(Mvv$R6e!pXI?gg&1e_FkScFM8Qp38Gnq z$f34|WxMub&d?D_!J*4{6ZQLdA3Fef&NIbbRAg#WbLmGS&4%Pqs3KkR5b?Kgl2-M5 zzYT^X*H7-U_%>^?f;Z)0&O|xZqAApDyC);>}!e zei)EQ%a6q!a_;-;dHMMV_S%5N{Zv#*6smD17K{Hkq87KVQrgJxtSj&+0`dqjH!)G& zfK66+gjmExLwbJ$@pUvUYaT-65;}Z?v4^v3T7B6MK4V`S(4~cAa63fhK6} z>;%2JJ2|%Rd24Srq`Nzm4r!3?1_=QrL_wGbzyII!ZtmN;=iIZ;+G~Fn8X#ht+ckROHPte*wkUzhc_52gfj)0`&2>(BhZ84sV8G;#OM}2)wH&&v zSys~erfE!blJYv9iH%?mD^vtGJaKt@M zXBp`A%nAUWNU*9?lzW>u(j~sRRd76h5TYSL;EK7wZT_WUT{+2m@p>OuH+3yDh z{2TepNjeSanXkXISIiC!3RROkN`8u!Ghh7cEN5)OPz=+%pc9eRAWY5teY2i2TdliC;}i?|p0LG+zwqSxZrVpNA~`W9E0 z^IGs0?U(h|j!)f5B(I)|=&*vGqIBc|R8U>8Vn}lEa$ul7NpP$A9snXjp~bmLq1$XO z;TMNoPKZ<#!%;fgF9nLs*8rfJ(clBz3j67}k>bI4VTfg8;>FZ)=&_~}vV;n``T$u3 z94;IJ!!ZylKszE#`%9o1W><0e7|aSv#WEO$ht+7+f`a*qCh6#w!;*B|Ss8~1!X|x= z1hU6J22e2|qNOfp+c9)o2yg z5h?iB`u$Bd3}cf}ZfZ}ED@`6!{A|K2-fBpwSXkd-y2iZ1x4`tv1YzWmAR(j1tGslu zwO)@T-8k4R$G7HFx^Ux_Zj(#fKK4Op;W_1Fk%RLmU|vK(+jWEx*K+aAhQDi=YZK{c zkDn8Un9l}z%lO!kl5_VEmJj^LlLz+ymfEt&zaLLQ|M&Q$jZc5!X zWdt1GWdu!eZj*F zy5LLifIr>`?VQrcS*n+gdl+VvE0BPcPm;L~`6Vz~KU(!EG0T!x#4>#9z^yG_%}~k5 z&U~eN1)KPtW=4wE9a~wa_2Y(_tZ9^%MZb60n|^v$?#DONvWE96xPQ}3NS8L7$eP+Z z1xq_;THYnd_&(wk4gR^g+~|O_x!d2zygysp+H>(qLV{N>kcT8W>30o3&OYp{EZxK% zkUpmQe(a8lQoBQa>yzK2s+-jLqblg8fUTczX{(ZFJ9ppxzH<6yc!KcS)efP8pjR-g zik(nIN%f`WLaAhjceLVEv2|CzpjdKUDoX^Ns`T_ug8MYcO}uqKRs38{EcCrec5BD) zrg1=ph#CyuMX{#hQr~OaBY6!0bd4`5k*0nv7h{{a871q)CX^?V9vwjA;H!ppzf=Hg z8Kq0p1V)+#r_==9wmQ_}GeS;10%K$-xTz>;6S9&=P}Hc3PF9ks=E!&Y0YaRV5KKB- zcP|#rQcPXz^J6%DipzmYd1M1S3tJhZC1ky51tjlZ!76H`w_S1<0$NhgR(oMXH(HJX zkfF9~S7y5)8FTWN)CB~5y37}Y55Apufx}Z+Y`CC{a~PqsUbW8i$Cn$b>!$Wd^H*+d z>S>iuG;EbogfFLufh0$=vA9@$#CP?VdYCOvlaB^)xJg*mue*);b&g4QP_2boT4ynX z`NE+N-`<@rb!oLbI-oPeo3F%sn^qc;Q@9_p$>BPL07=%AsE5(v>V=Gen|iW>N+#$$ zvUW96iRm`-fWhfQOZt8Z;D!5!LgPsV6rn*YR#cjl-ONZ}xEDQg(3)eQV9tr9_JQeJ!z>8m7d`TVs4YYnNEv+OG`Uf-RM8Sl!=Gh4ER_FCa^EKv^b$DfAFb+Jl*)lys&ifk4}q zpA5vF!CD33adWQSAKQda7vK#mkGBOkxm8hkNMJ>AQ(5TbnvR`ktKO+_Qpz3tdnsDJ zq7iHJRp->P>tPWX5O?g`Xd96M2^o8)@OZ1nr@zRuXAf4(`lV!@{hNz1Vnkp9*yy)isK*6c`B{VoID(E9S8YyB=@hJJ94&&tm;s6? z(ndv=c_B-p3yis(Np!lN+Di$FnNFU&u`yMKs^*_`LA>~WX(7=7X@k< zGwb4s<&!uZ{e%rcLvaGF=fb()K6p+_&Ys^nK3Pc=l~;h{FKkd!PRFlFvE@UhBWXDK zt9+_yy>k88FzmakONAxCgoNAq zt_Y2r>R8LwoFEpP7>X2MRy=id;h!uspk>Gj)aDTpV>ouPsnDTQq@RhCK3navB#=pH zFKc!h3>C+1rB7Fn!eyN6`AvgFXj}yrhn(Y4bgLa2X>x|#(p4VMd)&%P>CIWHvS?wA zTO8$${{;1FCe-A<{k|mYh)esS!lOmOGOTEyk{+{-5~z1{temp=g-bCZwp*ri|K8J$ zYq|#7dn4jGw~6Z}a$vsNG$-v?poKLfh%8jUu181Ux6AWw?vv#qQE9LYTGq0-zn;rF z#Mqwu<|{-UX+~o1Z_y(wGtBzM8U+EYbPJg{Q0k_^7=JbuyUrzk1Ri_Ln(O>FOTa} zdc>|}1Q@%Z(X}o>F3R57{ex?pomwSaE2kjuuW}CtEAy{7;#T(eI_K{;o-x?Vr`9J} zpMe4rX2ZMD-0=~3It`GYHcnCoD><(=tm>-Ea(}k$ua>G?^6}Y+cP(OQb6d_k$I2x` z#Q`DRo-eZ7W8GJ3uec#3E+WaL6FfHAoRV_p5oEucs{bDyT@vnTen z*SR|?>pKB;1@m;vH(i03P?8e71KM0O&#^VcM*63u;+q+6{k(M;E@;KP0$s9ka)e&c zFi(ULtgm-|8X$;ox+3=GXXgNtT@k7|P!hNR})7U)}C+(yn zM!2{L#HnSFC50@HCc92ZS!H7kH#JzHKh$bHc>=Y z(=TB!HvgjEecdbk^G#{npj945wGi)9$!LeqQxq?$8B|ieYcc>C2XlIqHMX7<4V|kg z4qksk3wqm9AUJC(SQ0gH$*eFI)lB{dF=UA~@RQ6Y9r5Sl=-#5M;7}s~@Ej1NjMsKvQPU<}}e@u#ukWCO9v$h^465 z&6*XLN-Ul!3-<9VX);VzU7d^W2jBJK0{wdhwN_2-uj03y_`Jz@n^2-22;DuE5U^CJ8^#y0v|B{F}9gJM9<_J#uWb*=b0& zRi66ON5(GAHFI_Ni5j7dl!}fm)4l%)H{^iJh=iJOfF^4&EJS?&A>#p20lF83%37Ko zLI6_&wkkJ%ylS9lwybC**2=LdE87rk$tvu6Z*jGJlK3sV=dYgBiTx3U^{n;qM&g3g zd^<{(!+r=C&hgT`wv4F}=UNzbvH1u}kr40+WV34$t1(8&J0pnJ5Pu}F)%X=+MLd<#ab+_5N6 zdwLnU{i5J z90|&`)^%{rCqdu2gDvER>_PW_9-m4}rnzuHzDA<0`gk@S-Fsi_rgl#PPyW#uxPKVQ_b>&L`Hzh$FUf5~uOo{QjUhC;h zR)>0-rm2NZfxmbN!`yhjUh?wNcu^qr{dN-ndfql&Bmf{`8XT;^vht^O35NzbJ??fI zFlPBZAv0+A3@ftLl3uOIJ|t;hG`R?>8!{V+T(3A-N?T@%R6LqZ=Wh%}qB5n>B?xIT zkNC)Us!er!p~p(RM>T8BCW%2Coo@ZGeG7o$grb6YynYFgc{L`xA%HWT%+eKJrcsh# zxVFHC7kT6*=2F2)=euZsnjE!13@oO#Xd_GvFJ9Jn zU+HUp2Mi~$7mEuvdXbUqwXQ2Jju#p6(2YMJFJG!dG=l8Vd8yxM7sf)kY~(x57=chi z>>11C3-*VH!L092)pg8yEJf*J(iiUCX~y~9>G%)L^me~>2+U@n0M32DaK=XOj&+>4 zEVi?UQtwiP6;0PbCdyO2{rxDlm!R`;Pt^HsB-!J=j@jSf$`&BK8lrA>RwU>7h*rgE zlF8%KAH5s-S!n9z@-_#xn(J8XcXV`=;9<}tm?OLYaDa;KHmQBARJFK^L> zGN)|7JS){V-(HXWo!4aBfj6g4^WEDWDpK25wJY$3{6~!|-9LA^dNVGa_gg`!UG0pD zD}2FQGOWn&YHKbf$lL%(^oWAgU91KEqe*UpYqr;ASNhblB(zna%hp4Rt_hlme_M4X z7#L~!Ps#L`D`x6>gTqT81aHoK7t zg-;L0Dz%7DEcBCfE$}oHH2_!`jtF$- zr${B3Qj!PXL8eS2G1XO-IT@$372`)RlzCnaNHj$i#Uu`P#SQp{nCb=hBgF6fMTKzi zXmFA+ayO;0LbI0WX&4Zb39`H-)rTe#i)1p(a;Wk0*ct8PlBaaUU5i5$MgJ0@vO>1J~P6Q6=ZT(AIeO$xb~StKqhNMZu@Ln3qFkB+KVxv zzu_|t&hF5=O{nsf^a&}@XevfKbJWH76Hp?7Iz!Pk=9T-|T?1CAl?TkdW35EMHET-0 zw3;sbiC2vM=(D*x1A|J^!Z%!2jOWZ+`n$XSDLa=Vy38Z5(eu0FgkVD42@H zJcTbAxibv8!_~Btp{Gt{kll4aRhk1V6ijWkjz9qUTnRAz886EOz{!q8jToH6qb5|g zK*s@-m=w<8nX=IpqfI#?8tReRWNPS`d_VHkVc%@~Q0{-BV)5SapRV*Z80|WIR@+A$ zv8PIJYuXV2;cR%P_j34uWwg8JrUHGzy4v{64L0cF{#bnj?v-J#3U4n{GU`Ya(9KJj z+;0&XdOOKdex*6d3|C6>`t$V1=T|%F&HKNuvv9+w`lOhA05EmHLIuzKdj3cPYqx~DC7>UZfJsb_dk) z(37D(4Mfn?ge>R$k9oilfzv9>S^!}82P~P?l;)nXD}2ohL-q$7k?Yy0J_ch50l1Hm z4!L5INSn9#9vkJcs$_Ipt*H$W32cFH(zsaHJly;t#{(}$&isCRB@ESGN%C33O=!j- z82*;kDO+4kN zx+ZF|K4-?h;3%OdgNRg*;o4Vay2+04I=g+z_n}3DGuzT*gmz$LPv+wHmu=y=a~I|- zFXDIiH>|Ir$sIAaOP~8%?ZvigL~IFjkee!+Sf0*T7A7m(tpl-$_B-?SRvzshH&p_3 zf?f-3@h3Q_8TQ^(f7JSnWzyX_+~~}(`W*l$l_qlpu}?eSHQ8(Ay@?UWXK46Z3c z8Ex&-;s&bAbhMr0m-Y6!L05|+2O_qC1rCb}Z<>e=uvIGo*o92REkh({KBpWy8z@o{ z8%X6&ZFug4^43I4%EhZpkAY%Gx7laWHi3Olf_i~f?@r;rV}_Dw3I4p$Itnd!gOLsN zm#(aK(WPI)eZNBx@X{UhUJ}_E-+W|Z;D-ee-F-+Fn9MT$T-~~8905S20wCt9s-EP` z%IXdbM$(AUicphbiiOFWmRXk)B~vY@l>qBP^_UEYUnuIk62i(orQ0;f^e6TzduAxe z)14-$Xm60x3Y41u4j#Kq5zi(qomsDjjA0d4f2jknv)+>p%kEe&C0*%R#FT)VDs(@$ zWJB#zu(wC~@-BRiq8Lv4PF&#dCR zYFx8?_A4Ko{f4ue##HTD>zySH8`rm9E0Pw)F^og_>2rViQiWS$g}a+uQ=tL8L8)~K zy2*$zoX5p7uBgsW04-PFoaS)*LZN10I)pj=NSG4}C!lk4iV3p!%AQMrSo?6CFUyf?MQnkwHR~C$cfB;ztdRIdvNL@0ET1lMlX+eK~ zZHw}UX`HC;T8rW~iu8?nXP?fP*RD;IDDSOm{nIb+8kb#a;W5$5%IZ%w4hw+4xuo04IpHW zUP}^M=?gryyjq#z(IxyFi&%>0h%9xf2Vy8J)2`Y(bT{9vY~6LkT}wO57HL1cndI)E zFy{EFRR8)?zJrsnE1Qc{)l(ShkF9;ffl=;6&8v=2d*M6u`a5lX2JPQ}O;Z?pwe!8- zvJP_BP_NTqBu;3EQPS+y`V~;w;hf;Y7YqO)0EiBh9zA@Ce7%Xmi}v&t(0G-{iNn*kr8A zv95Bb<n#bsbNe)TN4VIvP`H#%>7AAVlNUfp|lw;>PT-#HxTI8P9~ zW+Q$TJaI|~fJ%l*Lbl--2iBkvuB9VEuQ28xurdyL>NQ9JRGBQva83g zxyYqC;kZ@r(+016@IIqfO4|`f9KKViTrlKg1H|BD9VZyUxEzqszH{fpx_u$!?)4L$ z`0p8RqRC@iqvI|e!jS>hr+{RXvaP`SLL(%9vb*{(^T+&wm+W2+vJLRWA&UinQX1)L zgg@S{Le{QGFn1AtXZ zEAQF4h2+i265gU(;K{r=&mnFnf1{aNwHd+ZXU{uN9d|2CiK2iR2fOCWM>zO}J=esZ zN`cHPjjGEiNlUGNERJ60iIMSFiT2$BzI$k8@OI=3Q~dteWN_FNWwUi*3%YK#bX{SE zK&L3dc;ZClmfN)D3@^rx`v)a_CNaS5S zp*=jz^@nP#w+LZY_93(v=e?4b%WSAH{kXIbHCImsLC*y~{qsr0jh=?~55_5_0=Z6& zTN_5Zg1q+LThVcOBQ#&wF*%wFO*0vMb%X% z#72)uNsd*Dv%j`H300XzN7ryqVN`XmvyeC9v*^uORXlR+W}aojQCc3?w#y3uS#K$_ zRZeKNwF`=Bo}2ds+(awm&6_@CBc*avLh}BwGJ`A?3TXniqR?rz;sJ>9z(e;S8>baf z`!d#N(xSO6&6AQ~hQLCNM@0y=XBe*dJ#J*a*i@j1EQK#v&WX3&YU{{@bb-!N5t| z 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