Merge branch 'beta' into romanian-workspace
624
CREDITS.md
Normal file
@ -0,0 +1,624 @@
|
|||||||
|
# 🎵 Music
|
||||||
|
|
||||||
|
## BGM
|
||||||
|
- Pokémon Mystery Dungeon: Explorers of Sky
|
||||||
|
- Arata Iiyoshi
|
||||||
|
- Hideki Sakamoto
|
||||||
|
- Keisuke Ito
|
||||||
|
- Ken-ichi Saito
|
||||||
|
- Yoshihiro Maeda
|
||||||
|
- Pokémon Black/White
|
||||||
|
- Go Ichinose
|
||||||
|
- Hitomi Sato
|
||||||
|
- Shota Kageyama
|
||||||
|
- Pokémon Mystery Dungeon: Rescue Team DX
|
||||||
|
- Keisuke Ito
|
||||||
|
- Arata Iiyoshi
|
||||||
|
- Atsuhiro Ishizuna
|
||||||
|
- Pokémon HeartGold/SoulSilver
|
||||||
|
- Pokémon Black/White 2
|
||||||
|
- Pokémon X/Y
|
||||||
|
- Pokémon Omega Ruby/Alpha Sapphire
|
||||||
|
- Pokémon Sun/Moon
|
||||||
|
- Pokémon Ultra Sun/Ultra Moon
|
||||||
|
- Pokémon Sword/Shield
|
||||||
|
- Pokémon Legends: Arceus
|
||||||
|
- Pokémon Scarlet/Violet
|
||||||
|
- Firel (Custom Graveyard, Ice Cave, Laboratory, Metropolis, Plains, Power Plant, Seabed, Space, and Volcano biome music)
|
||||||
|
- Lmz (Custom Ancient Ruins, Jungle, and Lake biome music)
|
||||||
|
- Andr06 (Custom Forest, Slum and Sea biome music)
|
||||||
|
- _tresnoir
|
||||||
|
- unveiler
|
||||||
|
|
||||||
|
## Sound Effects
|
||||||
|
- Pokémon Emerald
|
||||||
|
- Pokémon Black/White
|
||||||
|
|
||||||
|
|
||||||
|
# 🎨 Art
|
||||||
|
|
||||||
|
## Backgrounds
|
||||||
|
- Squip (Paid Commissions)
|
||||||
|
- Contributions by Someonealive-QN
|
||||||
|
|
||||||
|
## UI
|
||||||
|
- GAMEFREAK
|
||||||
|
- LJ Birdman
|
||||||
|
|
||||||
|
## Pagefault Games Intro
|
||||||
|
- Spectremint
|
||||||
|
|
||||||
|
## Game Logo
|
||||||
|
- Gonstar (Paid Commission)
|
||||||
|
|
||||||
|
## Trainer Sprites
|
||||||
|
- GAMEFREAK (Pokémon Black/White 2, Pokémon Diamond/Pearl)
|
||||||
|
- kyledove
|
||||||
|
- Brumirage
|
||||||
|
- pkmn_realidea (Paid Commissions)
|
||||||
|
- IceJkai
|
||||||
|
- Leparagon
|
||||||
|
- wormhood
|
||||||
|
|
||||||
|
## Mystery Event Sprites
|
||||||
|
- chrysomelinae
|
||||||
|
- koda_want_to_sleep
|
||||||
|
- “🐺Kieran/YJ 🐍” rival_kieran aka thedreadedden
|
||||||
|
- ImperialSympathizer
|
||||||
|
- wormhood
|
||||||
|
- gerolau
|
||||||
|
- otterwatch
|
||||||
|
|
||||||
|
## Trainer Portraits
|
||||||
|
- pkmn_realidea (Paid Commissions)
|
||||||
|
|
||||||
|
## Pokémon Sprites and Animation
|
||||||
|
In addition to the lists below, please check [the PokéRogue wiki](https://wiki.pokerogue.net/credits:credits) for a more detailed list of Pokémon Sprite credits.
|
||||||
|
|
||||||
|
- GAMEFREAK (Pokémon Black/White 2)
|
||||||
|
- Smogon Sprite Project (Various Artists)
|
||||||
|
- Skyflyer
|
||||||
|
- Nolo33
|
||||||
|
- Ebaru
|
||||||
|
- EricLostie
|
||||||
|
- kiriaura
|
||||||
|
- Caruban
|
||||||
|
- Sopita_Yorita
|
||||||
|
- Azrita
|
||||||
|
- AshnixsLaw
|
||||||
|
- Hellfire0raptor
|
||||||
|
- RetroNC
|
||||||
|
- Franark122k
|
||||||
|
- OldSoulja
|
||||||
|
- PKMarioG
|
||||||
|
- ItsYugen
|
||||||
|
- lucasomi
|
||||||
|
- Pkm Sinfonia
|
||||||
|
- Poki Papillon
|
||||||
|
- Fleimer_
|
||||||
|
- bizcoeindoloro
|
||||||
|
- mangalos810
|
||||||
|
- selstar
|
||||||
|
|
||||||
|
### Static Sprites and Base Shiny Replacements Credits
|
||||||
|
- AMVictory
|
||||||
|
- Antiant
|
||||||
|
- Arhops
|
||||||
|
- arinoelle
|
||||||
|
- Arkeis
|
||||||
|
- aXl
|
||||||
|
- BananaToast
|
||||||
|
- Basic Vanillite
|
||||||
|
- BlackWhiteRobin
|
||||||
|
- Blaquaza
|
||||||
|
- Branflakes325
|
||||||
|
- Brylark
|
||||||
|
- Buna
|
||||||
|
- Bynine
|
||||||
|
- Corson
|
||||||
|
- Cynda
|
||||||
|
- “Diashi” diazhi
|
||||||
|
- Dleep
|
||||||
|
- doomchaos
|
||||||
|
- Espeon Scientist
|
||||||
|
- Farriella
|
||||||
|
- fishbowlsoul90
|
||||||
|
- “Follower” rulerofthesea11
|
||||||
|
- Galifia
|
||||||
|
- GeoisEvil
|
||||||
|
- G.E.Z.
|
||||||
|
- Glustora
|
||||||
|
- Harrie
|
||||||
|
- HealnDeal
|
||||||
|
- Hematite
|
||||||
|
- HM100
|
||||||
|
- Ice-cold Claws
|
||||||
|
- Involuntary Twitch
|
||||||
|
- “Jay” itsamejay
|
||||||
|
- KattenK
|
||||||
|
- KingOfThe-X-Roads
|
||||||
|
- KyleDove
|
||||||
|
- Kyleo
|
||||||
|
- Kyuzeth
|
||||||
|
- Larryturbo
|
||||||
|
- Layell
|
||||||
|
- Legitimate Username
|
||||||
|
- leParagon
|
||||||
|
- “LJ” lj_birdman
|
||||||
|
- Luigi Player
|
||||||
|
- Madmadness65
|
||||||
|
- Mega-Pokebattlerz
|
||||||
|
- Mintly
|
||||||
|
- mjco
|
||||||
|
- “Momo” sphinx_sage
|
||||||
|
- MrDollSteak
|
||||||
|
- MyMarshlands
|
||||||
|
- N-Kin
|
||||||
|
- Noscium
|
||||||
|
- “Nova” fabunova
|
||||||
|
- “Omniv” omniv
|
||||||
|
- paintseagull
|
||||||
|
- princessofmusic
|
||||||
|
- PumpkinPastel
|
||||||
|
- Quanyails
|
||||||
|
- RadicalCharizard
|
||||||
|
- RedRooster
|
||||||
|
- “♂ROMEO⚧” gerolau
|
||||||
|
- ruleroftheseas11
|
||||||
|
- SelenaArmorclaw
|
||||||
|
- “serif” serifaizawa
|
||||||
|
- Siiilver
|
||||||
|
- Sleet
|
||||||
|
- Snivy101
|
||||||
|
- Speed-X
|
||||||
|
- Sphex
|
||||||
|
- Spook
|
||||||
|
- Squip
|
||||||
|
- TeraVolt
|
||||||
|
- TheAetherPlayer
|
||||||
|
- TheCynicalPoet
|
||||||
|
- Tooni
|
||||||
|
- TrainerSplash
|
||||||
|
- Travis
|
||||||
|
- Turtleye
|
||||||
|
- Tyrell D. Barnes
|
||||||
|
- “Vari” \_vari\_
|
||||||
|
- Wobblebuns
|
||||||
|
- WolfPP
|
||||||
|
- WPS
|
||||||
|
- Wyverii
|
||||||
|
- “zan” smtif
|
||||||
|
- Zerudez
|
||||||
|
- Z-nogyroP
|
||||||
|
|
||||||
|
### Animated Sprites Credits
|
||||||
|
- Antiant
|
||||||
|
- arinoelle
|
||||||
|
- Blaquaza
|
||||||
|
- Claire Starsword
|
||||||
|
- Coyotango
|
||||||
|
- DanEx
|
||||||
|
- “Diashi” diazhi
|
||||||
|
- GalacticArtistMuffin
|
||||||
|
- G.E.Z.
|
||||||
|
- hexagonereal
|
||||||
|
- HM100
|
||||||
|
- Katten
|
||||||
|
- LeParagon
|
||||||
|
- localghost
|
||||||
|
- MallowOut
|
||||||
|
- mattiwarden
|
||||||
|
- “Momo” sphinx_sage
|
||||||
|
- N-Kin
|
||||||
|
- NoelleMBrooks
|
||||||
|
- Nyx
|
||||||
|
- “Omniv” omniv
|
||||||
|
- princessofmusic
|
||||||
|
- PumpkinPastel
|
||||||
|
- RadicalCharizard
|
||||||
|
- seleccion
|
||||||
|
- SelenaArmorclaw
|
||||||
|
- TheAetherPlayer
|
||||||
|
- Tinkatooni
|
||||||
|
- Typhlito
|
||||||
|
- uppa
|
||||||
|
- “Vari” \_vari\_
|
||||||
|
|
||||||
|
### Rare/Epic Shiny Variants Credits
|
||||||
|
- “Andr06” andr06
|
||||||
|
- “Appo” appo
|
||||||
|
- “Ashhawk” k_redacted
|
||||||
|
- “Auralite” _auralite
|
||||||
|
- “Awesome_Soul” awesome_soul
|
||||||
|
- “Bagon” bagonganda
|
||||||
|
- “Bibble” nuts_.
|
||||||
|
- “BloomOfWoods” bloomofwoods
|
||||||
|
- “Buge” buge
|
||||||
|
- “bun” bunove
|
||||||
|
- “bukie” bukie
|
||||||
|
- cameranian
|
||||||
|
- “Caramel” saltedcarriemel
|
||||||
|
- “Chocolate Niblets” choconibs
|
||||||
|
- “CKC” ckc_
|
||||||
|
- “ClawsHDi” clawshdi
|
||||||
|
- “Clown Princess” clown_princess
|
||||||
|
- “Cmac2173” cmac2173
|
||||||
|
- “Corsola” corsola_bandit
|
||||||
|
- “Criminon” criminon
|
||||||
|
- “Cryptican Gogoat Enthusiast” crypticanexe
|
||||||
|
- “Diashi” diazhi
|
||||||
|
- “deviant.daffodil, bug enthusiast” deviant.daffodil
|
||||||
|
- “DigitalVaporeon” digitalvaporeon
|
||||||
|
- dingosig
|
||||||
|
- “Eku” ekusas00
|
||||||
|
- “Elefante”
|
||||||
|
- “Esca” colossalsquid
|
||||||
|
- “Folf” folf.
|
||||||
|
- “Follower” ruleroftheseas11
|
||||||
|
- “Fontbane” fontbane
|
||||||
|
- “Gallow” gallowhound
|
||||||
|
- “Giojoe” giojoe10
|
||||||
|
- “Gonfold” gonfold
|
||||||
|
- greenninja757
|
||||||
|
- “Grassy_Storm” grassy_storm
|
||||||
|
- “GreenMegaMan” greenmegaman
|
||||||
|
- “GROWL” myflixer.to
|
||||||
|
- “guy claiming to work on a guide” 7thatlas
|
||||||
|
- “h. 🍄” letterh.
|
||||||
|
- “hamez” .hamez
|
||||||
|
- “Hanniel” hanniel.15
|
||||||
|
- “ImaginaryNeon” imaginaryneon
|
||||||
|
- “Jay” itsamejay
|
||||||
|
- “Jelke” jelke
|
||||||
|
- kalikimothy
|
||||||
|
- “🐺Kieran/YJ 🐍” rival_kieran aka thedreadedden
|
||||||
|
- “Koda” Koda_want_to_sleep
|
||||||
|
- “Lana” smogonian
|
||||||
|
- “LJ” lj_birdman
|
||||||
|
- “Long Girl” docamakesart
|
||||||
|
- “Lucky” luckyluckylucky
|
||||||
|
- “MissingNo.” clickonflareblitz
|
||||||
|
- “Momo” sphinx_sage
|
||||||
|
- monkehestman
|
||||||
|
- “Nexxus” nexxus_
|
||||||
|
- “Nik :3” realniktrustme
|
||||||
|
- “Nikolatsu”
|
||||||
|
- “nora” ora.n
|
||||||
|
- “NOVA” fabunova
|
||||||
|
- officerporkchops
|
||||||
|
- “Omniv” omniv
|
||||||
|
- “Otterwatch” otterwatch_
|
||||||
|
- “Pandoraz” pandoraz
|
||||||
|
- “Papa Pepsm An” papapepsman
|
||||||
|
- “Penguin” peng06
|
||||||
|
- “Prodigy” lorekeeperprodigy
|
||||||
|
- “Purpenigma” purpenigma
|
||||||
|
- “Rage” ragerevival
|
||||||
|
- “♂ROMEO⚧” gerolau
|
||||||
|
- “Sagrell D'Arcadia” coffeerequired
|
||||||
|
- “serif” serifaizawa
|
||||||
|
- “SillyTopplingGoose” sillytopplinggoose
|
||||||
|
- “Splash Damage” splashceles
|
||||||
|
- “Sweg1b01” sweg1b01
|
||||||
|
- “SyntheGrim” synthegrim
|
||||||
|
- “TaMenace” tamariontherestless
|
||||||
|
- “TheTRUEgge” thetruegge
|
||||||
|
- “Thorn” crownofthorns
|
||||||
|
- “Togepi” togepimax
|
||||||
|
- “Toopy” .toopy
|
||||||
|
- “Tristan” tristan.w
|
||||||
|
- “Umbreon” umbreon\_.\_
|
||||||
|
- “Vari” \_vari\_
|
||||||
|
- “Waasephi”
|
||||||
|
- wormhood
|
||||||
|
- “Yep, it's Caio” yepitscaio
|
||||||
|
- “Ymri” ymri
|
||||||
|
- “zaccie” zaccie
|
||||||
|
- “zan” smtif
|
||||||
|
|
||||||
|
## Move Animations
|
||||||
|
- Pokémon Reborn
|
||||||
|
|
||||||
|
|
||||||
|
# ⚖️ Balance
|
||||||
|
|
||||||
|
## Balance Team
|
||||||
|
- damocleas
|
||||||
|
- Blitzy aka Kazapple
|
||||||
|
- Cynthia_calliope
|
||||||
|
- Esca
|
||||||
|
- Fontbane
|
||||||
|
- Plasto
|
||||||
|
- Sethcurry
|
||||||
|
- Starkrieg
|
||||||
|
|
||||||
|
## Past Members
|
||||||
|
- Swizzo
|
||||||
|
- Zaccie
|
||||||
|
|
||||||
|
## Past Contributors
|
||||||
|
- chrysomelinae (Mystery Events)
|
||||||
|
- AsdarDevelops (Mystery Events)
|
||||||
|
|
||||||
|
|
||||||
|
# 💻 Development
|
||||||
|
|
||||||
|
## Server Owner/Administrator
|
||||||
|
- pancakes aka patapancakes
|
||||||
|
|
||||||
|
## Senior Developers
|
||||||
|
- Walker
|
||||||
|
- NightKev
|
||||||
|
- Moka
|
||||||
|
- Temp aka Tempo-anon
|
||||||
|
- Madmadness65
|
||||||
|
|
||||||
|
## Developers
|
||||||
|
- CodeTappert
|
||||||
|
- flx-sta
|
||||||
|
- innerthunder
|
||||||
|
- frutescens
|
||||||
|
- Opaquer
|
||||||
|
- SN34KZ
|
||||||
|
- Swain aka torranx
|
||||||
|
|
||||||
|
## Junior Developers
|
||||||
|
- KimJeongSun
|
||||||
|
- ImperialSympathizer
|
||||||
|
|
||||||
|
## Bug/Issue Managers
|
||||||
|
- Snailman
|
||||||
|
- Daleks
|
||||||
|
- Lily
|
||||||
|
- PigeonBar
|
||||||
|
|
||||||
|
## Other Code Contributors
|
||||||
|
- Admiral-Billy
|
||||||
|
- allen925
|
||||||
|
- arColm
|
||||||
|
- Arxalc
|
||||||
|
- AsdarDevelops
|
||||||
|
- bennybroseph
|
||||||
|
- Brain Frog
|
||||||
|
- Corrade
|
||||||
|
- Dakurei
|
||||||
|
- DustinLin
|
||||||
|
- ElizaAlex
|
||||||
|
- EmberCM
|
||||||
|
- EmoUsedHM01
|
||||||
|
- EvasiveAce
|
||||||
|
- Fontbane
|
||||||
|
- francktrouillez
|
||||||
|
- FredeX
|
||||||
|
- geeilhan
|
||||||
|
- Greenlamp
|
||||||
|
- happinyz
|
||||||
|
- hayuna
|
||||||
|
- InfernoVulpix
|
||||||
|
- j-diefenbach
|
||||||
|
- jaimefd
|
||||||
|
- JakubHanko
|
||||||
|
- JonStudders
|
||||||
|
- karl-police
|
||||||
|
- lucfd
|
||||||
|
- Lugiadrien
|
||||||
|
- madibye
|
||||||
|
- mattrossdev
|
||||||
|
- mcmontag
|
||||||
|
- meepen
|
||||||
|
- Mewtwo2387
|
||||||
|
- muscode
|
||||||
|
- Neverblade
|
||||||
|
- NxKarim
|
||||||
|
- okimin
|
||||||
|
- OrangeRed
|
||||||
|
- PigeonBar
|
||||||
|
- PrabbyDD
|
||||||
|
- prateau
|
||||||
|
- prime-dialga
|
||||||
|
- PyGaVS
|
||||||
|
- rationality6
|
||||||
|
- RedstonewolfX
|
||||||
|
- ReneGV
|
||||||
|
- rnicar245
|
||||||
|
- Sam aka Flashfyre (initial developer, started PokéRogue)
|
||||||
|
- schmidtc1
|
||||||
|
- shayebeadling
|
||||||
|
- sirzento
|
||||||
|
- snoozbuster
|
||||||
|
- sodaMelon
|
||||||
|
- td76099
|
||||||
|
- Vassiat
|
||||||
|
- Xiaphear
|
||||||
|
- zaccie
|
||||||
|
- zacharied
|
||||||
|
- Zé Ricardo
|
||||||
|
|
||||||
|
|
||||||
|
# 🌎 Translation
|
||||||
|
|
||||||
|
## In-Game Translators
|
||||||
|
|
||||||
|
### 🇩🇪 German (de)
|
||||||
|
- CodeTappert
|
||||||
|
|
||||||
|
### 🇪🇸 Spanish (es-ES)
|
||||||
|
- Dan Stevenson
|
||||||
|
- Javi
|
||||||
|
- Lily Alterni
|
||||||
|
- Qyxgames
|
||||||
|
|
||||||
|
### 🇫🇷 French (fr)
|
||||||
|
- Lugiadrien
|
||||||
|
|
||||||
|
### 🇮🇹 Italian (it)
|
||||||
|
- Nicus
|
||||||
|
|
||||||
|
### 🇯🇵 Japanese (ja)
|
||||||
|
- 6mozuke9
|
||||||
|
- Chapybara
|
||||||
|
- PeachFresca
|
||||||
|
|
||||||
|
### 🇰🇷 Korean (ko)
|
||||||
|
- Enoch
|
||||||
|
- KimJeongSun
|
||||||
|
- Returntoice
|
||||||
|
- sodamelon
|
||||||
|
|
||||||
|
### 🇧🇷 Portuguese (pt-BR)
|
||||||
|
- Zé Ricardo
|
||||||
|
|
||||||
|
### 🇨🇳 Chinese (zh-CN)
|
||||||
|
- dddsenic
|
||||||
|
- mercurius
|
||||||
|
- VittorioVeneto
|
||||||
|
- Yonmaru
|
||||||
|
|
||||||
|
### 🇹🇼 Chinese (zh-TW)
|
||||||
|
- mercurius
|
||||||
|
- Seagull
|
||||||
|
|
||||||
|
### Past contributors
|
||||||
|
- Asdar (es-ES)
|
||||||
|
- Rafa (es-ES)
|
||||||
|
- GINK-SS (ko)
|
||||||
|
- prostagma (pt-BR)
|
||||||
|
- Ei (zh-TW)
|
||||||
|
|
||||||
|
## Wiki Translators
|
||||||
|
|
||||||
|
### 🇪🇸 Spanish (es-ES)
|
||||||
|
- victorcooler
|
||||||
|
|
||||||
|
### 🇫🇷 French (fr)
|
||||||
|
- Evan
|
||||||
|
- Mitsue
|
||||||
|
- Papier
|
||||||
|
- Sangara
|
||||||
|
- Voltarix
|
||||||
|
|
||||||
|
### 🇮🇹 Italian (it)
|
||||||
|
- Purce
|
||||||
|
- T-reds
|
||||||
|
|
||||||
|
### 🇰🇷 Korean (ko)
|
||||||
|
- LeKaaN
|
||||||
|
- Returntoice
|
||||||
|
- sodamelon
|
||||||
|
|
||||||
|
### 🇵🇱 Polish (pl)
|
||||||
|
- Talo
|
||||||
|
|
||||||
|
### 🇧🇷 Portuguese (pt-BR)
|
||||||
|
- Beast
|
||||||
|
- Sushi
|
||||||
|
- Zé Ricardo
|
||||||
|
|
||||||
|
### 🇨🇳 Chinese (zh-CN)
|
||||||
|
- jw-0-
|
||||||
|
|
||||||
|
### Past contributors
|
||||||
|
- Dietaube (de)
|
||||||
|
- Gnorpelltroll (de)
|
||||||
|
- xRegix (de)
|
||||||
|
- Broly Ikari (fr)
|
||||||
|
- Leo Edgar_Zimmer (fr)
|
||||||
|
- Telor (fr)
|
||||||
|
- dorri (ko)
|
||||||
|
- Little Moder_eldenring (ko)
|
||||||
|
- Andy (zh-CN)
|
||||||
|
- Black Feather (zh-CN)
|
||||||
|
- itschili (zh-CN)
|
||||||
|
- RimKnight (zh-CN)
|
||||||
|
- Yubari (zh-CN)
|
||||||
|
|
||||||
|
## 🇺🇸 English Proofreaders
|
||||||
|
- Cheyu
|
||||||
|
- Faust
|
||||||
|
- HaywiredUp
|
||||||
|
- Irridescence
|
||||||
|
- Ke'ahi
|
||||||
|
- Louie
|
||||||
|
- Nully
|
||||||
|
- PeD
|
||||||
|
- The Programmer
|
||||||
|
|
||||||
|
### Past contributors
|
||||||
|
- I...
|
||||||
|
|
||||||
|
|
||||||
|
# 📰 Wiki
|
||||||
|
|
||||||
|
## Wiki Head
|
||||||
|
- H.A.R.V.
|
||||||
|
|
||||||
|
## Wiki Lead
|
||||||
|
- Sangara
|
||||||
|
- Zac
|
||||||
|
- Smew
|
||||||
|
- Brain Frog
|
||||||
|
- Hannah
|
||||||
|
|
||||||
|
## Editor
|
||||||
|
- Prodigy
|
||||||
|
- Akuma
|
||||||
|
- Dan Gioia
|
||||||
|
- Shimizoki
|
||||||
|
- Stave
|
||||||
|
- NalysArbur
|
||||||
|
- Ceimir
|
||||||
|
- Solanum Tuberosum
|
||||||
|
- Pom
|
||||||
|
|
||||||
|
## Artist
|
||||||
|
- dub
|
||||||
|
- SmashMania
|
||||||
|
- Wren
|
||||||
|
- Lugiadrien
|
||||||
|
|
||||||
|
## Contributor
|
||||||
|
- Daleks <3
|
||||||
|
- Inferno Vulpix
|
||||||
|
- Embri
|
||||||
|
- Nekod
|
||||||
|
- P0kemonY
|
||||||
|
- Scoom
|
||||||
|
- BlueVaron
|
||||||
|
|
||||||
|
|
||||||
|
# ☎️ Discord
|
||||||
|
|
||||||
|
## Head Moderator
|
||||||
|
- leah
|
||||||
|
|
||||||
|
## Senior Moderators
|
||||||
|
- Solanum Tuberosum
|
||||||
|
- Madmadness65
|
||||||
|
- Necrowmancer
|
||||||
|
- lana
|
||||||
|
|
||||||
|
## Moderators
|
||||||
|
- Sethcurry
|
||||||
|
|
||||||
|
## Junior Moderators
|
||||||
|
- chacolah
|
||||||
|
- ChaosGrimmon
|
||||||
|
- Cynthia
|
||||||
|
- Kat
|
||||||
|
- lyn
|
||||||
|
- Pom
|
||||||
|
|
||||||
|
|
||||||
|
# ✨ Special Thanks
|
||||||
|
|
||||||
|
## Reddit Moderators
|
||||||
|
- TheZigglez
|
||||||
|
- Vicksin
|
||||||
|
- Sapphire
|
||||||
|
- Javi
|
||||||
|
- roi
|
||||||
|
|
||||||
|
## External Tools
|
||||||
|
- Ydarissep (creator of the now defunct "Yda's Dex")
|
||||||
|
- Admiral-Billy (Offline App - Desktop)
|
||||||
|
- Red aka StonedModder (iOS App)
|
91
README.md
@ -37,93 +37,6 @@ For detailed guidelines on documenting your code, refer to the [comments.md](./d
|
|||||||
Check out [Github Issues](https://github.com/pagefaultgames/pokerogue/issues) to see how can you help us!
|
Check out [Github Issues](https://github.com/pagefaultgames/pokerogue/issues) to see how can you help us!
|
||||||
|
|
||||||
# 📝 Credits
|
# 📝 Credits
|
||||||
> If this project contains assets you have produced and you do not see your name here, **please** reach out.
|
> If this project contains assets you have produced and you do not see your name, **please** reach out, either [here on GitHub](https://github.com/pagefaultgames/pokerogue/issues/new) or via [Discord](https://discord.gg/pokerogue).
|
||||||
|
|
||||||
### 🎵 BGM
|
Thank you to all the wonderful people that have contributed to the PokéRogue project! You can find the credits [here](./CREDITS.md).
|
||||||
- Pokémon Mystery Dungeon: Explorers of Sky
|
|
||||||
- Arata Iiyoshi
|
|
||||||
- Hideki Sakamoto
|
|
||||||
- Keisuke Ito
|
|
||||||
- Ken-ichi Saito
|
|
||||||
- Yoshihiro Maeda
|
|
||||||
- Pokémon Black/White
|
|
||||||
- Go Ichinose
|
|
||||||
- Hitomi Sato
|
|
||||||
- Shota Kageyama
|
|
||||||
- Pokémon Mystery Dungeon: Rescue Team DX
|
|
||||||
- Keisuke Ito
|
|
||||||
- Arata Iiyoshi
|
|
||||||
- Atsuhiro Ishizuna
|
|
||||||
- Pokémon HeartGold/SoulSilver
|
|
||||||
- Pokémon Black/White 2
|
|
||||||
- Pokémon X/Y
|
|
||||||
- Pokémon Omega Ruby/Alpha Sapphire
|
|
||||||
- Pokémon Sun/Moon
|
|
||||||
- Pokémon Ultra Sun/Ultra Moon
|
|
||||||
- Pokémon Sword/Shield
|
|
||||||
- Pokémon Legends: Arceus
|
|
||||||
- Pokémon Scarlet/Violet
|
|
||||||
- Firel (Custom Ice Cave, Laboratory, Metropolis, Plains, Power Plant, Seabed, Space, and Volcano biome music)
|
|
||||||
- Lmz (Custom Ancient Ruins, Jungle, and Lake biome music)
|
|
||||||
- Andr06 (Custom Slum and Sea biome music)
|
|
||||||
|
|
||||||
### 🎵 Sound Effects
|
|
||||||
- Pokémon Emerald
|
|
||||||
- Pokémon Black/White
|
|
||||||
|
|
||||||
### 🎨 Backgrounds
|
|
||||||
- Squip (Paid Commissions)
|
|
||||||
- Contributions by Someonealive-QN
|
|
||||||
|
|
||||||
### 🎨 UI
|
|
||||||
- GAMEFREAK
|
|
||||||
- LJ Birdman
|
|
||||||
|
|
||||||
### 🎨 Pagefault Games Intro
|
|
||||||
- Spectremint
|
|
||||||
|
|
||||||
### 🎨 Game Logo
|
|
||||||
- Gonstar (Paid Commission)
|
|
||||||
|
|
||||||
### 🎨 Trainer Sprites
|
|
||||||
- GAMEFREAK (Pokémon Black/White 2, Pokémon Diamond/Pearl)
|
|
||||||
- kyledove
|
|
||||||
- Brumirage
|
|
||||||
- pkmn_realidea (Paid Commissions)
|
|
||||||
- IceJkai
|
|
||||||
|
|
||||||
### 🎨 Trainer Portraits
|
|
||||||
- pkmn_realidea (Paid Commissions)
|
|
||||||
|
|
||||||
### 🎨 Pokemon Sprites and Animation
|
|
||||||
- GAMEFREAK (Pokémon Black/White 2)
|
|
||||||
- Smogon Sprite Project (Various Artists)
|
|
||||||
- Skyflyer
|
|
||||||
- Nolo33
|
|
||||||
- Ebaru
|
|
||||||
- EricLostie
|
|
||||||
- KingOfThe-X-Roads
|
|
||||||
- kiriaura
|
|
||||||
- Caruban
|
|
||||||
- Sopita_Yorita
|
|
||||||
- Azrita
|
|
||||||
- AshnixsLaw
|
|
||||||
- Hellfire0raptor
|
|
||||||
- RetroNC
|
|
||||||
- Franark122k
|
|
||||||
- OldSoulja
|
|
||||||
- PKMarioG
|
|
||||||
- ItsYugen
|
|
||||||
- lucasomi
|
|
||||||
- Pkm Sinfonia
|
|
||||||
- Poki Papillon
|
|
||||||
- Fleimer_
|
|
||||||
- bizcoeindoloro
|
|
||||||
- mangalos810
|
|
||||||
- Involuntary-Twitch
|
|
||||||
- selstar
|
|
||||||
- koda_want_to_sleep
|
|
||||||
- thedreadedden
|
|
||||||
|
|
||||||
### 🎨 Move Animations
|
|
||||||
- Pokémon Reborn
|
|
||||||
|
4
package-lock.json
generated
@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "pokemon-rogue-battle",
|
"name": "pokemon-rogue-battle",
|
||||||
"version": "1.3.0",
|
"version": "1.4.3",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "pokemon-rogue-battle",
|
"name": "pokemon-rogue-battle",
|
||||||
"version": "1.3.0",
|
"version": "1.4.3",
|
||||||
"hasInstallScript": true,
|
"hasInstallScript": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@material/material-color-utilities": "^0.2.7",
|
"@material/material-color-utilities": "^0.2.7",
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "pokemon-rogue-battle",
|
"name": "pokemon-rogue-battle",
|
||||||
"private": true,
|
"private": true,
|
||||||
"version": "1.3.0",
|
"version": "1.4.3",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"start": "vite",
|
"start": "vite",
|
||||||
|
BIN
public/images/events/winter_holidays2024-event-de.png
Normal file
After Width: | Height: | Size: 34 KiB |
BIN
public/images/events/winter_holidays2024-event-en.png
Normal file
After Width: | Height: | Size: 32 KiB |
BIN
public/images/events/winter_holidays2024-event-es-ES.png
Normal file
After Width: | Height: | Size: 33 KiB |
BIN
public/images/events/winter_holidays2024-event-fr.png
Normal file
After Width: | Height: | Size: 33 KiB |
BIN
public/images/events/winter_holidays2024-event-it.png
Normal file
After Width: | Height: | Size: 33 KiB |
BIN
public/images/events/winter_holidays2024-event-ja.png
Normal file
After Width: | Height: | Size: 37 KiB |
BIN
public/images/events/winter_holidays2024-event-ko.png
Normal file
After Width: | Height: | Size: 35 KiB |
BIN
public/images/events/winter_holidays2024-event-pt-BR.png
Normal file
After Width: | Height: | Size: 32 KiB |
BIN
public/images/events/winter_holidays2024-event-zh-CN.png
Normal file
After Width: | Height: | Size: 38 KiB |
@ -1 +1 @@
|
|||||||
Subproject commit 7ad20e64caa9367b444712f10036fa9bbe4837a5
|
Subproject commit 2e03bc8f2736269bfa365faad587c3ec54a37621
|
@ -147,6 +147,7 @@ export default class BattleScene extends SceneBase {
|
|||||||
public damageNumbersMode: integer = 0;
|
public damageNumbersMode: integer = 0;
|
||||||
public reroll: boolean = false;
|
public reroll: boolean = false;
|
||||||
public shopCursorTarget: number = ShopCursorTarget.REWARDS;
|
public shopCursorTarget: number = ShopCursorTarget.REWARDS;
|
||||||
|
public commandCursorMemory: boolean = false;
|
||||||
public showMovesetFlyout: boolean = true;
|
public showMovesetFlyout: boolean = true;
|
||||||
public showArenaFlyout: boolean = true;
|
public showArenaFlyout: boolean = true;
|
||||||
public showTimeOfDayWidget: boolean = true;
|
public showTimeOfDayWidget: boolean = true;
|
||||||
@ -173,7 +174,7 @@ export default class BattleScene extends SceneBase {
|
|||||||
public uiTheme: UiTheme = UiTheme.DEFAULT;
|
public uiTheme: UiTheme = UiTheme.DEFAULT;
|
||||||
public windowType: integer = 0;
|
public windowType: integer = 0;
|
||||||
public experimentalSprites: boolean = false;
|
public experimentalSprites: boolean = false;
|
||||||
public musicPreference: number = MusicPreference.MIXED;
|
public musicPreference: number = MusicPreference.ALLGENS;
|
||||||
public moveAnimations: boolean = true;
|
public moveAnimations: boolean = true;
|
||||||
public expGainsSpeed: ExpGainsSpeed = ExpGainsSpeed.DEFAULT;
|
public expGainsSpeed: ExpGainsSpeed = ExpGainsSpeed.DEFAULT;
|
||||||
public skipSeenDialogues: boolean = false;
|
public skipSeenDialogues: boolean = false;
|
||||||
|
@ -222,7 +222,7 @@ export default class 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()}`;
|
return `encounter_${this.trainer?.getEncounterBgm()}`;
|
||||||
}
|
}
|
||||||
if (scene.musicPreference === MusicPreference.CONSISTENT) {
|
if (scene.musicPreference === MusicPreference.GENFIVE) {
|
||||||
return this.trainer?.getBattleBgm() ?? null;
|
return this.trainer?.getBattleBgm() ?? null;
|
||||||
} else {
|
} else {
|
||||||
return this.trainer?.getMixedBattleBgm() ?? null;
|
return this.trainer?.getMixedBattleBgm() ?? null;
|
||||||
@ -239,7 +239,7 @@ export default class Battle {
|
|||||||
return "battle_final_encounter";
|
return "battle_final_encounter";
|
||||||
}
|
}
|
||||||
if (pokemon.species.legendary || pokemon.species.subLegendary || pokemon.species.mythical) {
|
if (pokemon.species.legendary || pokemon.species.subLegendary || pokemon.species.mythical) {
|
||||||
if (scene.musicPreference === MusicPreference.CONSISTENT) {
|
if (scene.musicPreference === MusicPreference.GENFIVE) {
|
||||||
switch (pokemon.species.speciesId) {
|
switch (pokemon.species.speciesId) {
|
||||||
case Species.REGIROCK:
|
case Species.REGIROCK:
|
||||||
case Species.REGICE:
|
case Species.REGICE:
|
||||||
@ -256,7 +256,7 @@ export default class Battle {
|
|||||||
}
|
}
|
||||||
return "battle_legendary_unova";
|
return "battle_legendary_unova";
|
||||||
}
|
}
|
||||||
} else if (scene.musicPreference === MusicPreference.MIXED) {
|
} else if (scene.musicPreference === MusicPreference.ALLGENS) {
|
||||||
switch (pokemon.species.speciesId) {
|
switch (pokemon.species.speciesId) {
|
||||||
case Species.ARTICUNO:
|
case Species.ARTICUNO:
|
||||||
case Species.ZAPDOS:
|
case Species.ZAPDOS:
|
||||||
|
@ -107,7 +107,7 @@ export const speciesEggMoves = {
|
|||||||
[Species.SNEASEL]: [ Moves.DIRE_CLAW, Moves.DARKEST_LARIAT, Moves.TRIPLE_AXEL, Moves.CLOSE_COMBAT ],
|
[Species.SNEASEL]: [ Moves.DIRE_CLAW, Moves.DARKEST_LARIAT, Moves.TRIPLE_AXEL, Moves.CLOSE_COMBAT ],
|
||||||
[Species.TEDDIURSA]: [ Moves.MOUNTAIN_GALE, Moves.FAKE_OUT, Moves.SLACK_OFF, Moves.PRECIPICE_BLADES ],
|
[Species.TEDDIURSA]: [ Moves.MOUNTAIN_GALE, Moves.FAKE_OUT, Moves.SLACK_OFF, Moves.PRECIPICE_BLADES ],
|
||||||
[Species.SLUGMA]: [ Moves.BURNING_BULWARK, Moves.POWER_GEM, Moves.SOLAR_BEAM, Moves.MAGMA_STORM ],
|
[Species.SLUGMA]: [ Moves.BURNING_BULWARK, Moves.POWER_GEM, Moves.SOLAR_BEAM, Moves.MAGMA_STORM ],
|
||||||
[Species.SWINUB]: [ Moves.SLACK_OFF, Moves.LANDS_WRATH, Moves.STONE_AXE, Moves.GLACIAL_LANCE ],
|
[Species.SWINUB]: [ Moves.SLACK_OFF, Moves.MOUNTAIN_GALE, Moves.STONE_AXE, Moves.PRECIPICE_BLADES ],
|
||||||
[Species.CORSOLA]: [ Moves.SCALD, Moves.FREEZE_DRY, Moves.STRENGTH_SAP, Moves.SALT_CURE ],
|
[Species.CORSOLA]: [ Moves.SCALD, Moves.FREEZE_DRY, Moves.STRENGTH_SAP, Moves.SALT_CURE ],
|
||||||
[Species.REMORAID]: [ Moves.WATER_SHURIKEN, Moves.TAKE_HEART, Moves.SHELL_SIDE_ARM, Moves.BOUNCY_BUBBLE ],
|
[Species.REMORAID]: [ Moves.WATER_SHURIKEN, Moves.TAKE_HEART, Moves.SHELL_SIDE_ARM, Moves.BOUNCY_BUBBLE ],
|
||||||
[Species.DELIBIRD]: [ Moves.BONEMERANG, Moves.FLOATY_FALL, Moves.VICTORY_DANCE, Moves.GLACIAL_LANCE ],
|
[Species.DELIBIRD]: [ Moves.BONEMERANG, Moves.FLOATY_FALL, Moves.VICTORY_DANCE, Moves.GLACIAL_LANCE ],
|
||||||
@ -360,7 +360,7 @@ export const speciesEggMoves = {
|
|||||||
[Species.CLAUNCHER]: [ Moves.SHELL_SMASH, Moves.ARMOR_CANNON, Moves.ENERGY_BALL, Moves.ORIGIN_PULSE ],
|
[Species.CLAUNCHER]: [ Moves.SHELL_SMASH, Moves.ARMOR_CANNON, Moves.ENERGY_BALL, Moves.ORIGIN_PULSE ],
|
||||||
[Species.HELIOPTILE]: [ Moves.WEATHER_BALL, Moves.HYDRO_STEAM, Moves.EARTH_POWER, Moves.BOOMBURST ],
|
[Species.HELIOPTILE]: [ Moves.WEATHER_BALL, Moves.HYDRO_STEAM, Moves.EARTH_POWER, Moves.BOOMBURST ],
|
||||||
[Species.TYRUNT]: [ Moves.DRAGON_HAMMER, Moves.FLARE_BLITZ, Moves.VOLT_TACKLE, Moves.SHIFT_GEAR ],
|
[Species.TYRUNT]: [ Moves.DRAGON_HAMMER, Moves.FLARE_BLITZ, Moves.VOLT_TACKLE, Moves.SHIFT_GEAR ],
|
||||||
[Species.AMAURA]: [ Moves.RECOVER, Moves.TERA_STARSTORM, Moves.POWER_GEM, Moves.GEOMANCY ],
|
[Species.AMAURA]: [ Moves.RECOVER, Moves.WRING_OUT, Moves.POWER_GEM, Moves.GEOMANCY ],
|
||||||
[Species.HAWLUCHA]: [ Moves.TRIPLE_AXEL, Moves.HIGH_HORSEPOWER, Moves.FLOATY_FALL, Moves.WICKED_BLOW ],
|
[Species.HAWLUCHA]: [ Moves.TRIPLE_AXEL, Moves.HIGH_HORSEPOWER, Moves.FLOATY_FALL, Moves.WICKED_BLOW ],
|
||||||
[Species.DEDENNE]: [ Moves.BOOMBURST, Moves.FAKE_OUT, Moves.NASTY_PLOT, Moves.REVIVAL_BLESSING ],
|
[Species.DEDENNE]: [ Moves.BOOMBURST, Moves.FAKE_OUT, Moves.NASTY_PLOT, Moves.REVIVAL_BLESSING ],
|
||||||
[Species.CARBINK]: [ Moves.BODY_PRESS, Moves.SHORE_UP, Moves.SPARKLY_SWIRL, Moves.DIAMOND_STORM ],
|
[Species.CARBINK]: [ Moves.BODY_PRESS, Moves.SHORE_UP, Moves.SPARKLY_SWIRL, Moves.DIAMOND_STORM ],
|
||||||
@ -468,7 +468,7 @@ export const speciesEggMoves = {
|
|||||||
[Species.PINCURCHIN]: [ Moves.TRICK_ROOM, Moves.VOLT_SWITCH, Moves.STRENGTH_SAP, Moves.THUNDERCLAP ],
|
[Species.PINCURCHIN]: [ Moves.TRICK_ROOM, Moves.VOLT_SWITCH, Moves.STRENGTH_SAP, Moves.THUNDERCLAP ],
|
||||||
[Species.SNOM]: [ Moves.FROST_BREATH, Moves.HEAL_ORDER, Moves.EARTH_POWER, Moves.SPORE ],
|
[Species.SNOM]: [ Moves.FROST_BREATH, Moves.HEAL_ORDER, Moves.EARTH_POWER, Moves.SPORE ],
|
||||||
[Species.STONJOURNER]: [ Moves.BODY_PRESS, Moves.HELPING_HAND, Moves.ACCELEROCK, Moves.DIAMOND_STORM ],
|
[Species.STONJOURNER]: [ Moves.BODY_PRESS, Moves.HELPING_HAND, Moves.ACCELEROCK, Moves.DIAMOND_STORM ],
|
||||||
[Species.EISCUE]: [ Moves.TRIPLE_AXEL, Moves.AQUA_STEP, Moves.SHELL_SMASH, Moves.GLACIAL_LANCE ],
|
[Species.EISCUE]: [ Moves.TRIPLE_AXEL, Moves.AQUA_STEP, Moves.AXE_KICK, Moves.SHELL_SMASH ],
|
||||||
[Species.INDEEDEE]: [ Moves.MATCHA_GOTCHA, Moves.EXPANDING_FORCE, Moves.MOONBLAST, Moves.REVIVAL_BLESSING ],
|
[Species.INDEEDEE]: [ Moves.MATCHA_GOTCHA, Moves.EXPANDING_FORCE, Moves.MOONBLAST, Moves.REVIVAL_BLESSING ],
|
||||||
[Species.MORPEKO]: [ Moves.TRIPLE_AXEL, Moves.OBSTRUCT, Moves.SWORDS_DANCE, Moves.COLLISION_COURSE ],
|
[Species.MORPEKO]: [ Moves.TRIPLE_AXEL, Moves.OBSTRUCT, Moves.SWORDS_DANCE, Moves.COLLISION_COURSE ],
|
||||||
[Species.CUFANT]: [ Moves.LIQUIDATION, Moves.CURSE, Moves.COMBAT_TORQUE, Moves.GIGATON_HAMMER ],
|
[Species.CUFANT]: [ Moves.LIQUIDATION, Moves.CURSE, Moves.COMBAT_TORQUE, Moves.GIGATON_HAMMER ],
|
||||||
@ -559,7 +559,7 @@ export const speciesEggMoves = {
|
|||||||
[Species.FRIGIBAX]: [ Moves.BEHEMOTH_BLADE, Moves.DRAGON_DANCE, Moves.MOUNTAIN_GALE, Moves.PRECIPICE_BLADES ],
|
[Species.FRIGIBAX]: [ Moves.BEHEMOTH_BLADE, Moves.DRAGON_DANCE, Moves.MOUNTAIN_GALE, Moves.PRECIPICE_BLADES ],
|
||||||
[Species.GIMMIGHOUL]: [ Moves.HAPPY_HOUR, Moves.AURA_SPHERE, Moves.SURF, Moves.ASTRAL_BARRAGE ],
|
[Species.GIMMIGHOUL]: [ Moves.HAPPY_HOUR, Moves.AURA_SPHERE, Moves.SURF, Moves.ASTRAL_BARRAGE ],
|
||||||
[Species.WO_CHIEN]: [ Moves.SPORE, Moves.FIERY_WRATH, Moves.SAPPY_SEED, Moves.STRENGTH_SAP ],
|
[Species.WO_CHIEN]: [ Moves.SPORE, Moves.FIERY_WRATH, Moves.SAPPY_SEED, Moves.STRENGTH_SAP ],
|
||||||
[Species.CHIEN_PAO]: [ Moves.KNOCK_OFF, Moves.PARTING_SHOT, Moves.BITTER_BLADE, Moves.GLACIAL_LANCE ],
|
[Species.CHIEN_PAO]: [ Moves.KNOCK_OFF, Moves.PARTING_SHOT, Moves.TRIPLE_AXEL, Moves.BITTER_BLADE ],
|
||||||
[Species.TING_LU]: [ Moves.SHORE_UP, Moves.CEASELESS_EDGE, Moves.SAPPY_SEED, Moves.PRECIPICE_BLADES ],
|
[Species.TING_LU]: [ Moves.SHORE_UP, Moves.CEASELESS_EDGE, Moves.SAPPY_SEED, Moves.PRECIPICE_BLADES ],
|
||||||
[Species.CHI_YU]: [ Moves.FIERY_WRATH, Moves.HYDRO_STEAM, Moves.MORNING_SUN, Moves.BLUE_FLARE ],
|
[Species.CHI_YU]: [ Moves.FIERY_WRATH, Moves.HYDRO_STEAM, Moves.MORNING_SUN, Moves.BLUE_FLARE ],
|
||||||
[Species.ROARING_MOON]: [ Moves.FIRE_LASH, Moves.DRAGON_HAMMER, Moves.SUCKER_PUNCH, Moves.WICKED_BLOW ],
|
[Species.ROARING_MOON]: [ Moves.FIRE_LASH, Moves.DRAGON_HAMMER, Moves.SUCKER_PUNCH, Moves.WICKED_BLOW ],
|
||||||
|
@ -19464,7 +19464,6 @@ export const pokemonFormLevelMoves: PokemonSpeciesFormLevelMoves = {
|
|||||||
},
|
},
|
||||||
[Species.GRENINJA]: {
|
[Species.GRENINJA]: {
|
||||||
1: [
|
1: [
|
||||||
[ EVOLVE_MOVE, Moves.WATER_SHURIKEN ],
|
|
||||||
[ EVOLVE_MOVE, Moves.WATER_SHURIKEN ],
|
[ EVOLVE_MOVE, Moves.WATER_SHURIKEN ],
|
||||||
[ 1, Moves.POUND ],
|
[ 1, Moves.POUND ],
|
||||||
[ 1, Moves.GROWL ],
|
[ 1, Moves.GROWL ],
|
||||||
@ -19475,6 +19474,7 @@ export const pokemonFormLevelMoves: PokemonSpeciesFormLevelMoves = {
|
|||||||
[ 1, Moves.SMACK_DOWN ], // Previous Stage Move
|
[ 1, Moves.SMACK_DOWN ], // Previous Stage Move
|
||||||
[ 1, Moves.BOUNCE ], // Previous Stage Move
|
[ 1, Moves.BOUNCE ], // Previous Stage Move
|
||||||
[ 1, Moves.HAZE ],
|
[ 1, Moves.HAZE ],
|
||||||
|
[ 1, Moves.MAT_BLOCK ],
|
||||||
[ 1, Moves.ROLE_PLAY ],
|
[ 1, Moves.ROLE_PLAY ],
|
||||||
[ 1, Moves.NIGHT_SLASH ],
|
[ 1, Moves.NIGHT_SLASH ],
|
||||||
[ 10, Moves.LICK ],
|
[ 10, Moves.LICK ],
|
||||||
|
@ -67148,6 +67148,7 @@ export const tmSpecies: TmSpecies = {
|
|||||||
Species.VELUZA,
|
Species.VELUZA,
|
||||||
Species.DONDOZO,
|
Species.DONDOZO,
|
||||||
Species.TATSUGIRI,
|
Species.TATSUGIRI,
|
||||||
|
Species.ANNIHILAPE,
|
||||||
Species.CLODSIRE,
|
Species.CLODSIRE,
|
||||||
Species.FARIGIRAF,
|
Species.FARIGIRAF,
|
||||||
Species.DUDUNSPARCE,
|
Species.DUDUNSPARCE,
|
||||||
|
@ -1881,8 +1881,14 @@ export class FlameBurstAttr extends MoveEffectAttr {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export class SacrificialFullRestoreAttr extends SacrificialAttr {
|
export class SacrificialFullRestoreAttr extends SacrificialAttr {
|
||||||
constructor() {
|
protected restorePP: boolean;
|
||||||
|
protected moveMessage: string;
|
||||||
|
|
||||||
|
constructor(restorePP: boolean, moveMessage: string) {
|
||||||
super();
|
super();
|
||||||
|
|
||||||
|
this.restorePP = restorePP;
|
||||||
|
this.moveMessage = moveMessage;
|
||||||
}
|
}
|
||||||
|
|
||||||
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
|
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
|
||||||
@ -1893,8 +1899,19 @@ export class SacrificialFullRestoreAttr extends SacrificialAttr {
|
|||||||
// We don't know which party member will be chosen, so pick the highest max HP in the party
|
// We don't know which party member will be chosen, so pick the highest max HP in the party
|
||||||
const maxPartyMemberHp = user.scene.getPlayerParty().map(p => p.getMaxHp()).reduce((maxHp: integer, hp: integer) => Math.max(hp, maxHp), 0);
|
const maxPartyMemberHp = user.scene.getPlayerParty().map(p => p.getMaxHp()).reduce((maxHp: integer, hp: integer) => Math.max(hp, maxHp), 0);
|
||||||
|
|
||||||
user.scene.pushPhase(new PokemonHealPhase(user.scene, user.getBattlerIndex(),
|
user.scene.pushPhase(
|
||||||
maxPartyMemberHp, i18next.t("moveTriggers:sacrificialFullRestore", { pokemonName: getPokemonNameWithAffix(user) }), true, false, false, true), true);
|
new PokemonHealPhase(
|
||||||
|
user.scene,
|
||||||
|
user.getBattlerIndex(),
|
||||||
|
maxPartyMemberHp,
|
||||||
|
i18next.t(this.moveMessage, { pokemonName: getPokemonNameWithAffix(user) }),
|
||||||
|
true,
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
true,
|
||||||
|
false,
|
||||||
|
this.restorePP),
|
||||||
|
true);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -9002,7 +9019,7 @@ export function initMoves() {
|
|||||||
.attr(GyroBallPowerAttr)
|
.attr(GyroBallPowerAttr)
|
||||||
.ballBombMove(),
|
.ballBombMove(),
|
||||||
new SelfStatusMove(Moves.HEALING_WISH, Type.PSYCHIC, -1, 10, -1, 0, 4)
|
new SelfStatusMove(Moves.HEALING_WISH, Type.PSYCHIC, -1, 10, -1, 0, 4)
|
||||||
.attr(SacrificialFullRestoreAttr)
|
.attr(SacrificialFullRestoreAttr, false, "moveTriggers:sacrificialFullRestore")
|
||||||
.triageMove(),
|
.triageMove(),
|
||||||
new AttackMove(Moves.BRINE, Type.WATER, MoveCategory.SPECIAL, 65, 100, 10, -1, 0, 4)
|
new AttackMove(Moves.BRINE, Type.WATER, MoveCategory.SPECIAL, 65, 100, 10, -1, 0, 4)
|
||||||
.attr(MovePowerMultiplierAttr, (user, target, move) => target.getHpRatio() < 0.5 ? 2 : 1),
|
.attr(MovePowerMultiplierAttr, (user, target, move) => target.getHpRatio() < 0.5 ? 2 : 1),
|
||||||
@ -9279,10 +9296,9 @@ export function initMoves() {
|
|||||||
new AttackMove(Moves.SPACIAL_REND, Type.DRAGON, MoveCategory.SPECIAL, 100, 95, 5, -1, 0, 4)
|
new AttackMove(Moves.SPACIAL_REND, Type.DRAGON, MoveCategory.SPECIAL, 100, 95, 5, -1, 0, 4)
|
||||||
.attr(HighCritAttr),
|
.attr(HighCritAttr),
|
||||||
new SelfStatusMove(Moves.LUNAR_DANCE, Type.PSYCHIC, -1, 10, -1, 0, 4)
|
new SelfStatusMove(Moves.LUNAR_DANCE, Type.PSYCHIC, -1, 10, -1, 0, 4)
|
||||||
.attr(SacrificialAttrOnHit)
|
.attr(SacrificialFullRestoreAttr, true, "moveTriggers:lunarDanceRestore")
|
||||||
.danceMove()
|
.danceMove()
|
||||||
.triageMove()
|
.triageMove(),
|
||||||
.unimplemented(),
|
|
||||||
new AttackMove(Moves.CRUSH_GRIP, Type.NORMAL, MoveCategory.PHYSICAL, -1, 100, 5, -1, 0, 4)
|
new AttackMove(Moves.CRUSH_GRIP, Type.NORMAL, MoveCategory.PHYSICAL, -1, 100, 5, -1, 0, 4)
|
||||||
.attr(OpponentHighHpPowerAttr, 120),
|
.attr(OpponentHighHpPowerAttr, 120),
|
||||||
new AttackMove(Moves.MAGMA_STORM, Type.FIRE, MoveCategory.SPECIAL, 100, 75, 5, -1, 0, 4)
|
new AttackMove(Moves.MAGMA_STORM, Type.FIRE, MoveCategory.SPECIAL, 100, 75, 5, -1, 0, 4)
|
||||||
|
@ -13,7 +13,7 @@ import {
|
|||||||
ModifierTypeOption, modifierTypes,
|
ModifierTypeOption, modifierTypes,
|
||||||
regenerateModifierPoolThresholds,
|
regenerateModifierPoolThresholds,
|
||||||
} from "#app/modifier/modifier-type";
|
} from "#app/modifier/modifier-type";
|
||||||
import { randSeedInt } from "#app/utils";
|
import { randSeedInt, randSeedItem } from "#app/utils";
|
||||||
import { BattlerTagType } from "#enums/battler-tag-type";
|
import { BattlerTagType } from "#enums/battler-tag-type";
|
||||||
import { MysteryEncounterType } from "#enums/mystery-encounter-type";
|
import { MysteryEncounterType } from "#enums/mystery-encounter-type";
|
||||||
import BattleScene from "#app/battle-scene";
|
import BattleScene from "#app/battle-scene";
|
||||||
@ -31,6 +31,7 @@ import { BerryType } from "#enums/berry-type";
|
|||||||
import { PERMANENT_STATS, Stat } from "#enums/stat";
|
import { PERMANENT_STATS, Stat } from "#enums/stat";
|
||||||
import { StatStageChangePhase } from "#app/phases/stat-stage-change-phase";
|
import { StatStageChangePhase } from "#app/phases/stat-stage-change-phase";
|
||||||
import { CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES } from "#app/game-mode";
|
import { CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES } from "#app/game-mode";
|
||||||
|
import PokemonSpecies, { getPokemonSpecies } from "#app/data/pokemon-species";
|
||||||
|
|
||||||
/** the i18n namespace for the encounter */
|
/** the i18n namespace for the encounter */
|
||||||
const namespace = "mysteryEncounters/berriesAbound";
|
const namespace = "mysteryEncounters/berriesAbound";
|
||||||
@ -58,7 +59,14 @@ export const BerriesAboundEncounter: MysteryEncounter =
|
|||||||
|
|
||||||
// Calculate boss mon
|
// Calculate boss mon
|
||||||
const level = getEncounterPokemonLevelForWave(scene, STANDARD_ENCOUNTER_BOOSTED_LEVEL_MODIFIER);
|
const level = getEncounterPokemonLevelForWave(scene, STANDARD_ENCOUNTER_BOOSTED_LEVEL_MODIFIER);
|
||||||
const bossSpecies = scene.arena.randomSpecies(scene.currentBattle.waveIndex, level, 0, getPartyLuckValue(scene.getPlayerParty()), true);
|
let bossSpecies: PokemonSpecies;
|
||||||
|
if (scene.eventManager.isEventActive() && scene.eventManager.activeEvent()?.uncommonBreedEncounters && randSeedInt(2) === 1) {
|
||||||
|
const eventEncounter = randSeedItem(scene.eventManager.activeEvent()!.uncommonBreedEncounters!);
|
||||||
|
const levelSpecies = getPokemonSpecies(eventEncounter.species).getWildSpeciesForLevel(level, eventEncounter.allowEvolution ?? false, true, scene.gameMode);
|
||||||
|
bossSpecies = getPokemonSpecies( levelSpecies );
|
||||||
|
} else {
|
||||||
|
bossSpecies = scene.arena.randomSpecies(scene.currentBattle.waveIndex, level, 0, getPartyLuckValue(scene.getPlayerParty()), true);
|
||||||
|
}
|
||||||
const bossPokemon = new EnemyPokemon(scene, bossSpecies, level, TrainerSlot.NONE, true);
|
const bossPokemon = new EnemyPokemon(scene, bossSpecies, level, TrainerSlot.NONE, true);
|
||||||
encounter.setDialogueToken("enemyPokemon", getPokemonNameWithAffix(bossPokemon));
|
encounter.setDialogueToken("enemyPokemon", getPokemonNameWithAffix(bossPokemon));
|
||||||
const config: EnemyPartyConfig = {
|
const config: EnemyPartyConfig = {
|
||||||
|
@ -13,6 +13,7 @@ import { modifierTypes, PokemonHeldItemModifierType } from "#app/modifier/modifi
|
|||||||
import { ModifierRewardPhase } from "#app/phases/modifier-reward-phase";
|
import { ModifierRewardPhase } from "#app/phases/modifier-reward-phase";
|
||||||
import i18next from "#app/plugins/i18n";
|
import i18next from "#app/plugins/i18n";
|
||||||
import { OptionSelectItem } from "#app/ui/abstact-option-select-ui-handler";
|
import { OptionSelectItem } from "#app/ui/abstact-option-select-ui-handler";
|
||||||
|
import { randSeedItem } from "#app/utils";
|
||||||
import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode";
|
import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode";
|
||||||
import { MysteryEncounterTier } from "#enums/mystery-encounter-tier";
|
import { MysteryEncounterTier } from "#enums/mystery-encounter-tier";
|
||||||
import { MysteryEncounterType } from "#enums/mystery-encounter-type";
|
import { MysteryEncounterType } from "#enums/mystery-encounter-type";
|
||||||
@ -35,6 +36,23 @@ const OPTION_3_DISALLOWED_MODIFIERS = [
|
|||||||
|
|
||||||
const DELIBIRDY_MONEY_PRICE_MULTIPLIER = 2;
|
const DELIBIRDY_MONEY_PRICE_MULTIPLIER = 2;
|
||||||
|
|
||||||
|
const doEventReward = (scene: BattleScene) => {
|
||||||
|
const event_buff = scene.eventManager.activeEvent()?.delibirdyBuff ?? [];
|
||||||
|
if (event_buff.length > 0) {
|
||||||
|
const candidates = event_buff.filter((c => {
|
||||||
|
const mtype = generateModifierType(scene, modifierTypes[c]);
|
||||||
|
const existingCharm = scene.findModifier(m => m.type.id === mtype?.id);
|
||||||
|
return !(existingCharm && existingCharm.getStackCount() >= existingCharm.getMaxStackCount(scene));
|
||||||
|
}));
|
||||||
|
if (candidates.length > 0) {
|
||||||
|
scene.unshiftPhase(new ModifierRewardPhase(scene, modifierTypes[randSeedItem(candidates)]));
|
||||||
|
} else {
|
||||||
|
// At max stacks, give a Voucher instead
|
||||||
|
scene.unshiftPhase(new ModifierRewardPhase(scene, modifierTypes.VOUCHER));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Delibird-y encounter.
|
* Delibird-y encounter.
|
||||||
* @see {@link https://github.com/pagefaultgames/pokerogue/issues/3804 | GitHub Issue #3804}
|
* @see {@link https://github.com/pagefaultgames/pokerogue/issues/3804 | GitHub Issue #3804}
|
||||||
@ -136,8 +154,10 @@ export const DelibirdyEncounter: MysteryEncounter =
|
|||||||
await applyModifierTypeToPlayerPokemon(scene, scene.getPlayerPokemon()!, shellBell);
|
await applyModifierTypeToPlayerPokemon(scene, scene.getPlayerPokemon()!, shellBell);
|
||||||
scene.playSound("item_fanfare");
|
scene.playSound("item_fanfare");
|
||||||
await showEncounterText(scene, i18next.t("battle:rewardGain", { modifierName: shellBell.name }), null, undefined, true);
|
await showEncounterText(scene, i18next.t("battle:rewardGain", { modifierName: shellBell.name }), null, undefined, true);
|
||||||
|
doEventReward(scene);
|
||||||
} else {
|
} else {
|
||||||
scene.unshiftPhase(new ModifierRewardPhase(scene, modifierTypes.AMULET_COIN));
|
scene.unshiftPhase(new ModifierRewardPhase(scene, modifierTypes.AMULET_COIN));
|
||||||
|
doEventReward(scene);
|
||||||
}
|
}
|
||||||
|
|
||||||
leaveEncounterWithoutBattle(scene, true);
|
leaveEncounterWithoutBattle(scene, true);
|
||||||
@ -211,8 +231,10 @@ export const DelibirdyEncounter: MysteryEncounter =
|
|||||||
await applyModifierTypeToPlayerPokemon(scene, scene.getPlayerPokemon()!, shellBell);
|
await applyModifierTypeToPlayerPokemon(scene, scene.getPlayerPokemon()!, shellBell);
|
||||||
scene.playSound("item_fanfare");
|
scene.playSound("item_fanfare");
|
||||||
await showEncounterText(scene, i18next.t("battle:rewardGain", { modifierName: shellBell.name }), null, undefined, true);
|
await showEncounterText(scene, i18next.t("battle:rewardGain", { modifierName: shellBell.name }), null, undefined, true);
|
||||||
|
doEventReward(scene);
|
||||||
} else {
|
} else {
|
||||||
scene.unshiftPhase(new ModifierRewardPhase(scene, modifierTypes.CANDY_JAR));
|
scene.unshiftPhase(new ModifierRewardPhase(scene, modifierTypes.CANDY_JAR));
|
||||||
|
doEventReward(scene);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// Check if the player has max stacks of that Berry Pouch already
|
// Check if the player has max stacks of that Berry Pouch already
|
||||||
@ -224,8 +246,10 @@ export const DelibirdyEncounter: MysteryEncounter =
|
|||||||
await applyModifierTypeToPlayerPokemon(scene, scene.getPlayerPokemon()!, shellBell);
|
await applyModifierTypeToPlayerPokemon(scene, scene.getPlayerPokemon()!, shellBell);
|
||||||
scene.playSound("item_fanfare");
|
scene.playSound("item_fanfare");
|
||||||
await showEncounterText(scene, i18next.t("battle:rewardGain", { modifierName: shellBell.name }), null, undefined, true);
|
await showEncounterText(scene, i18next.t("battle:rewardGain", { modifierName: shellBell.name }), null, undefined, true);
|
||||||
|
doEventReward(scene);
|
||||||
} else {
|
} else {
|
||||||
scene.unshiftPhase(new ModifierRewardPhase(scene, modifierTypes.BERRY_POUCH));
|
scene.unshiftPhase(new ModifierRewardPhase(scene, modifierTypes.BERRY_POUCH));
|
||||||
|
doEventReward(scene);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -300,8 +324,10 @@ export const DelibirdyEncounter: MysteryEncounter =
|
|||||||
await applyModifierTypeToPlayerPokemon(scene, scene.getPlayerParty()[0], shellBell);
|
await applyModifierTypeToPlayerPokemon(scene, scene.getPlayerParty()[0], shellBell);
|
||||||
scene.playSound("item_fanfare");
|
scene.playSound("item_fanfare");
|
||||||
await showEncounterText(scene, i18next.t("battle:rewardGain", { modifierName: shellBell.name }), null, undefined, true);
|
await showEncounterText(scene, i18next.t("battle:rewardGain", { modifierName: shellBell.name }), null, undefined, true);
|
||||||
|
doEventReward(scene);
|
||||||
} else {
|
} else {
|
||||||
scene.unshiftPhase(new ModifierRewardPhase(scene, modifierTypes.HEALING_CHARM));
|
scene.unshiftPhase(new ModifierRewardPhase(scene, modifierTypes.HEALING_CHARM));
|
||||||
|
doEventReward(scene);
|
||||||
}
|
}
|
||||||
|
|
||||||
chosenPokemon.loseHeldItem(modifier, false);
|
chosenPokemon.loseHeldItem(modifier, false);
|
||||||
|
@ -26,9 +26,10 @@ import { getEncounterPokemonLevelForWave, getSpriteKeysFromPokemon, STANDARD_ENC
|
|||||||
import PokemonData from "#app/system/pokemon-data";
|
import PokemonData from "#app/system/pokemon-data";
|
||||||
import { BattlerTagType } from "#enums/battler-tag-type";
|
import { BattlerTagType } from "#enums/battler-tag-type";
|
||||||
import { queueEncounterMessage } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils";
|
import { queueEncounterMessage } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils";
|
||||||
import { randSeedInt } from "#app/utils";
|
import { randSeedInt, randSeedItem } from "#app/utils";
|
||||||
import { StatStageChangePhase } from "#app/phases/stat-stage-change-phase";
|
import { StatStageChangePhase } from "#app/phases/stat-stage-change-phase";
|
||||||
import { CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES } from "#app/game-mode";
|
import { CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES } from "#app/game-mode";
|
||||||
|
import PokemonSpecies, { getPokemonSpecies } from "#app/data/pokemon-species";
|
||||||
|
|
||||||
/** the i18n namespace for the encounter */
|
/** the i18n namespace for the encounter */
|
||||||
const namespace = "mysteryEncounters/fightOrFlight";
|
const namespace = "mysteryEncounters/fightOrFlight";
|
||||||
@ -56,7 +57,14 @@ export const FightOrFlightEncounter: MysteryEncounter =
|
|||||||
|
|
||||||
// Calculate boss mon
|
// Calculate boss mon
|
||||||
const level = getEncounterPokemonLevelForWave(scene, STANDARD_ENCOUNTER_BOOSTED_LEVEL_MODIFIER);
|
const level = getEncounterPokemonLevelForWave(scene, STANDARD_ENCOUNTER_BOOSTED_LEVEL_MODIFIER);
|
||||||
const bossSpecies = scene.arena.randomSpecies(scene.currentBattle.waveIndex, level, 0, getPartyLuckValue(scene.getPlayerParty()), true);
|
let bossSpecies: PokemonSpecies;
|
||||||
|
if (scene.eventManager.isEventActive() && scene.eventManager.activeEvent()?.uncommonBreedEncounters && randSeedInt(2) === 1) {
|
||||||
|
const eventEncounter = randSeedItem(scene.eventManager.activeEvent()!.uncommonBreedEncounters!);
|
||||||
|
const levelSpecies = getPokemonSpecies(eventEncounter.species).getWildSpeciesForLevel(level, eventEncounter.allowEvolution ?? false, true, scene.gameMode);
|
||||||
|
bossSpecies = getPokemonSpecies( levelSpecies );
|
||||||
|
} else {
|
||||||
|
bossSpecies = scene.arena.randomSpecies(scene.currentBattle.waveIndex, level, 0, getPartyLuckValue(scene.getPlayerParty()), true);
|
||||||
|
}
|
||||||
const bossPokemon = new EnemyPokemon(scene, bossSpecies, level, TrainerSlot.NONE, true);
|
const bossPokemon = new EnemyPokemon(scene, bossSpecies, level, TrainerSlot.NONE, true);
|
||||||
encounter.setDialogueToken("enemyPokemon", bossPokemon.getNameToRender());
|
encounter.setDialogueToken("enemyPokemon", bossPokemon.getNameToRender());
|
||||||
const config: EnemyPartyConfig = {
|
const config: EnemyPartyConfig = {
|
||||||
|
@ -107,7 +107,7 @@ export const GlobalTradeSystemEncounter: MysteryEncounter =
|
|||||||
|
|
||||||
// Load bgm
|
// Load bgm
|
||||||
let bgmKey: string;
|
let bgmKey: string;
|
||||||
if (scene.musicPreference === MusicPreference.CONSISTENT) {
|
if (scene.musicPreference === MusicPreference.GENFIVE) {
|
||||||
bgmKey = "mystery_encounter_gen_5_gts";
|
bgmKey = "mystery_encounter_gen_5_gts";
|
||||||
scene.loadBgm(bgmKey, `${bgmKey}.mp3`);
|
scene.loadBgm(bgmKey, `${bgmKey}.mp3`);
|
||||||
} else {
|
} else {
|
||||||
|
@ -12,7 +12,7 @@ import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode
|
|||||||
import { TrainerSlot } from "#app/data/trainer-config";
|
import { TrainerSlot } from "#app/data/trainer-config";
|
||||||
import { catchPokemon, getHighestLevelPlayerPokemon, getSpriteKeysFromPokemon } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils";
|
import { catchPokemon, getHighestLevelPlayerPokemon, getSpriteKeysFromPokemon } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils";
|
||||||
import PokemonData from "#app/system/pokemon-data";
|
import PokemonData from "#app/system/pokemon-data";
|
||||||
import { isNullOrUndefined, randSeedInt } from "#app/utils";
|
import { isNullOrUndefined, randSeedInt, randSeedItem } from "#app/utils";
|
||||||
import { Moves } from "#enums/moves";
|
import { Moves } from "#enums/moves";
|
||||||
import { BattlerIndex } from "#app/battle";
|
import { BattlerIndex } from "#app/battle";
|
||||||
import { SelfStatusMove } from "#app/data/move";
|
import { SelfStatusMove } from "#app/data/move";
|
||||||
@ -23,6 +23,7 @@ import { BerryModifier } from "#app/modifier/modifier";
|
|||||||
import { StatStageChangePhase } from "#app/phases/stat-stage-change-phase";
|
import { StatStageChangePhase } from "#app/phases/stat-stage-change-phase";
|
||||||
import { Stat } from "#enums/stat";
|
import { Stat } from "#enums/stat";
|
||||||
import { CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES } from "#app/game-mode";
|
import { CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES } from "#app/game-mode";
|
||||||
|
import PokemonSpecies, { getPokemonSpecies } from "#app/data/pokemon-species";
|
||||||
|
|
||||||
/** the i18n namespace for the encounter */
|
/** the i18n namespace for the encounter */
|
||||||
const namespace = "mysteryEncounters/uncommonBreed";
|
const namespace = "mysteryEncounters/uncommonBreed";
|
||||||
@ -51,7 +52,14 @@ export const UncommonBreedEncounter: MysteryEncounter =
|
|||||||
// Calculate boss mon
|
// Calculate boss mon
|
||||||
// Level equal to 2 below highest party member
|
// Level equal to 2 below highest party member
|
||||||
const level = getHighestLevelPlayerPokemon(scene, false, true).level - 2;
|
const level = getHighestLevelPlayerPokemon(scene, false, true).level - 2;
|
||||||
const species = scene.arena.randomSpecies(scene.currentBattle.waveIndex, level, 0, getPartyLuckValue(scene.getPlayerParty()), true);
|
let species: PokemonSpecies;
|
||||||
|
if (scene.eventManager.isEventActive() && scene.eventManager.activeEvent()?.uncommonBreedEncounters && randSeedInt(2) === 1) {
|
||||||
|
const eventEncounter = randSeedItem(scene.eventManager.activeEvent()!.uncommonBreedEncounters!);
|
||||||
|
const levelSpecies = getPokemonSpecies(eventEncounter.species).getWildSpeciesForLevel(level, eventEncounter.allowEvolution ?? false, true, scene.gameMode);
|
||||||
|
species = getPokemonSpecies( levelSpecies );
|
||||||
|
} else {
|
||||||
|
species = scene.arena.randomSpecies(scene.currentBattle.waveIndex, level, 0, getPartyLuckValue(scene.getPlayerParty()), true);
|
||||||
|
}
|
||||||
const pokemon = new EnemyPokemon(scene, species, level, TrainerSlot.NONE, true);
|
const pokemon = new EnemyPokemon(scene, species, level, TrainerSlot.NONE, true);
|
||||||
|
|
||||||
// Pokemon will always have one of its egg moves in its moveset
|
// Pokemon will always have one of its egg moves in its moveset
|
||||||
|
@ -177,7 +177,7 @@ export const allMysteryEncounters: { [encounterType: number]: MysteryEncounter }
|
|||||||
const extremeBiomeEncounters: MysteryEncounterType[] = [];
|
const extremeBiomeEncounters: MysteryEncounterType[] = [];
|
||||||
|
|
||||||
const nonExtremeBiomeEncounters: MysteryEncounterType[] = [
|
const nonExtremeBiomeEncounters: MysteryEncounterType[] = [
|
||||||
MysteryEncounterType.FIELD_TRIP,
|
// MysteryEncounterType.FIELD_TRIP, Disabled
|
||||||
MysteryEncounterType.DANCING_LESSONS, // Is also in BADLANDS, DESERT, VOLCANO, WASTELAND, ABYSS
|
MysteryEncounterType.DANCING_LESSONS, // Is also in BADLANDS, DESERT, VOLCANO, WASTELAND, ABYSS
|
||||||
];
|
];
|
||||||
|
|
||||||
@ -185,7 +185,7 @@ const humanTransitableBiomeEncounters: MysteryEncounterType[] = [
|
|||||||
MysteryEncounterType.MYSTERIOUS_CHALLENGERS,
|
MysteryEncounterType.MYSTERIOUS_CHALLENGERS,
|
||||||
MysteryEncounterType.SHADY_VITAMIN_DEALER,
|
MysteryEncounterType.SHADY_VITAMIN_DEALER,
|
||||||
MysteryEncounterType.THE_POKEMON_SALESMAN,
|
MysteryEncounterType.THE_POKEMON_SALESMAN,
|
||||||
MysteryEncounterType.AN_OFFER_YOU_CANT_REFUSE,
|
// MysteryEncounterType.AN_OFFER_YOU_CANT_REFUSE, Disabled
|
||||||
MysteryEncounterType.THE_WINSTRATE_CHALLENGE,
|
MysteryEncounterType.THE_WINSTRATE_CHALLENGE,
|
||||||
MysteryEncounterType.THE_EXPERT_POKEMON_BREEDER
|
MysteryEncounterType.THE_EXPERT_POKEMON_BREEDER
|
||||||
];
|
];
|
||||||
|
@ -770,8 +770,8 @@ export const pokemonFormChanges: PokemonFormChanges = {
|
|||||||
new SpeciesFormChange(Species.KYUREM, "", "white", new SpeciesFormChangeItemTrigger(FormChangeItem.LIGHT_STONE), false, getSpeciesDependentFormChangeCondition(Species.RESHIRAM))
|
new SpeciesFormChange(Species.KYUREM, "", "white", new SpeciesFormChangeItemTrigger(FormChangeItem.LIGHT_STONE), false, getSpeciesDependentFormChangeCondition(Species.RESHIRAM))
|
||||||
],
|
],
|
||||||
[Species.KELDEO]: [
|
[Species.KELDEO]: [
|
||||||
new SpeciesFormChange(Species.KELDEO, "ordinary", "resolute", new SpeciesFormChangeMoveLearnedTrigger(Moves.SECRET_SWORD)),
|
new SpeciesFormChange(Species.KELDEO, "ordinary", "resolute", new SpeciesFormChangeMoveLearnedTrigger(Moves.SECRET_SWORD), false, new SpeciesFormChangeCondition((p) => p.scene.gameMode.isDaily !== true)),
|
||||||
new SpeciesFormChange(Species.KELDEO, "resolute", "ordinary", new SpeciesFormChangeMoveLearnedTrigger(Moves.SECRET_SWORD, false))
|
new SpeciesFormChange(Species.KELDEO, "resolute", "ordinary", new SpeciesFormChangeMoveLearnedTrigger(Moves.SECRET_SWORD, false), false, new SpeciesFormChangeCondition((p) => p.scene.gameMode.isDaily !== true))
|
||||||
],
|
],
|
||||||
[Species.MELOETTA]: [
|
[Species.MELOETTA]: [
|
||||||
new SpeciesFormChange(Species.MELOETTA, "aria", "pirouette", new MeloettaFormChangePostMoveTrigger(Moves.RELIC_SONG), true),
|
new SpeciesFormChange(Species.MELOETTA, "aria", "pirouette", new MeloettaFormChangePostMoveTrigger(Moves.RELIC_SONG), true),
|
||||||
|
@ -1170,6 +1170,9 @@ function getGymLeaderPartyTemplate(scene: BattleScene) {
|
|||||||
export function getRandomPartyMemberFunc(speciesPool: Species[], trainerSlot: TrainerSlot = TrainerSlot.TRAINER, ignoreEvolution: boolean = false, postProcess?: (enemyPokemon: EnemyPokemon) => void) {
|
export function getRandomPartyMemberFunc(speciesPool: Species[], trainerSlot: TrainerSlot = TrainerSlot.TRAINER, ignoreEvolution: boolean = false, postProcess?: (enemyPokemon: EnemyPokemon) => void) {
|
||||||
return (scene: BattleScene, level: number, strength: PartyMemberStrength) => {
|
return (scene: BattleScene, level: number, strength: PartyMemberStrength) => {
|
||||||
let species = Utils.randSeedItem(speciesPool);
|
let species = Utils.randSeedItem(speciesPool);
|
||||||
|
if (scene.gameMode.isClassic && scene.currentBattle.waveIndex === 20) {
|
||||||
|
ignoreEvolution = true;
|
||||||
|
}
|
||||||
if (!ignoreEvolution) {
|
if (!ignoreEvolution) {
|
||||||
species = getPokemonSpecies(species).getTrainerSpeciesForLevel(level, true, strength, scene.currentBattle.waveIndex);
|
species = getPokemonSpecies(species).getTrainerSpeciesForLevel(level, true, strength, scene.currentBattle.waveIndex);
|
||||||
}
|
}
|
||||||
@ -1229,7 +1232,7 @@ export const signatureSpecies: SignatureSpecies = {
|
|||||||
GIOVANNI: [ Species.SANDILE, Species.MURKROW, Species.NIDORAN_M, Species.NIDORAN_F ],
|
GIOVANNI: [ Species.SANDILE, Species.MURKROW, Species.NIDORAN_M, Species.NIDORAN_F ],
|
||||||
FALKNER: [ Species.PIDGEY, Species.HOOTHOOT, Species.DODUO ],
|
FALKNER: [ Species.PIDGEY, Species.HOOTHOOT, Species.DODUO ],
|
||||||
BUGSY: [ Species.SCYTHER, Species.HERACROSS, Species.SHUCKLE, Species.PINSIR ],
|
BUGSY: [ Species.SCYTHER, Species.HERACROSS, Species.SHUCKLE, Species.PINSIR ],
|
||||||
WHITNEY: [ Species.GIRAFARIG, Species.MILTANK ],
|
WHITNEY: [ Species.JIGGLYPUFF, Species.MILTANK, Species.AIPOM, Species.GIRAFARIG ],
|
||||||
MORTY: [ Species.GASTLY, Species.MISDREAVUS, Species.SABLEYE ],
|
MORTY: [ Species.GASTLY, Species.MISDREAVUS, Species.SABLEYE ],
|
||||||
CHUCK: [ Species.POLIWRATH, Species.MANKEY ],
|
CHUCK: [ Species.POLIWRATH, Species.MANKEY ],
|
||||||
JASMINE: [ Species.MAGNEMITE, Species.STEELIX ],
|
JASMINE: [ Species.MAGNEMITE, Species.STEELIX ],
|
||||||
@ -1239,7 +1242,7 @@ export const signatureSpecies: SignatureSpecies = {
|
|||||||
BRAWLY: [ Species.MACHOP, Species.MAKUHITA ],
|
BRAWLY: [ Species.MACHOP, Species.MAKUHITA ],
|
||||||
WATTSON: [ Species.MAGNEMITE, Species.VOLTORB, Species.ELECTRIKE ],
|
WATTSON: [ Species.MAGNEMITE, Species.VOLTORB, Species.ELECTRIKE ],
|
||||||
FLANNERY: [ Species.SLUGMA, Species.TORKOAL, Species.NUMEL ],
|
FLANNERY: [ Species.SLUGMA, Species.TORKOAL, Species.NUMEL ],
|
||||||
NORMAN: [ Species.SLAKOTH, Species.SPINDA, Species.CHANSEY, Species.KANGASKHAN ],
|
NORMAN: [ Species.SLAKOTH, Species.SPINDA, Species.ZIGZAGOON, Species.KECLEON ],
|
||||||
WINONA: [ Species.SWABLU, Species.WINGULL, Species.TROPIUS, Species.SKARMORY ],
|
WINONA: [ Species.SWABLU, Species.WINGULL, Species.TROPIUS, Species.SKARMORY ],
|
||||||
TATE: [ Species.SOLROCK, Species.NATU, Species.CHIMECHO, Species.GALLADE ],
|
TATE: [ Species.SOLROCK, Species.NATU, Species.CHIMECHO, Species.GALLADE ],
|
||||||
LIZA: [ Species.LUNATONE, Species.SPOINK, Species.BALTOY, Species.GARDEVOIR ],
|
LIZA: [ Species.LUNATONE, Species.SPOINK, Species.BALTOY, Species.GARDEVOIR ],
|
||||||
@ -1247,16 +1250,16 @@ export const signatureSpecies: SignatureSpecies = {
|
|||||||
ROARK: [ Species.CRANIDOS, Species.LARVITAR, Species.GEODUDE ],
|
ROARK: [ Species.CRANIDOS, Species.LARVITAR, Species.GEODUDE ],
|
||||||
GARDENIA: [ Species.ROSELIA, Species.TANGELA, Species.TURTWIG ],
|
GARDENIA: [ Species.ROSELIA, Species.TANGELA, Species.TURTWIG ],
|
||||||
MAYLENE: [ Species.LUCARIO, Species.MEDITITE, Species.CHIMCHAR ],
|
MAYLENE: [ Species.LUCARIO, Species.MEDITITE, Species.CHIMCHAR ],
|
||||||
CRASHER_WAKE: [ Species.BUIZEL, Species.MAGIKARP, Species.PIPLUP ],
|
CRASHER_WAKE: [ Species.BUIZEL, Species.WOOPER, Species.PIPLUP, Species.MAGIKARP ],
|
||||||
FANTINA: [ Species.MISDREAVUS, Species.DRIFLOON, Species.SPIRITOMB ],
|
FANTINA: [ Species.MISDREAVUS, Species.DRIFLOON, Species.SPIRITOMB ],
|
||||||
BYRON: [ Species.SHIELDON, Species.BRONZOR, Species.AGGRON ],
|
BYRON: [ Species.SHIELDON, Species.BRONZOR, Species.AGGRON ],
|
||||||
CANDICE: [ Species.SNEASEL, Species.SNOVER, Species.SNORUNT ],
|
CANDICE: [ Species.SNEASEL, Species.SNOVER, Species.SNORUNT ],
|
||||||
VOLKNER: [ Species.SHINX, Species.CHINCHOU, Species.ROTOM ],
|
VOLKNER: [ Species.SHINX, Species.CHINCHOU, Species.ROTOM ],
|
||||||
CILAN: [ Species.PANSAGE, Species.COTTONEE, Species.PETILIL ],
|
CILAN: [ Species.PANSAGE, Species.FOONGUS, Species.PETILIL ],
|
||||||
CHILI: [ Species.PANSEAR, Species.DARUMAKA, Species.HEATMOR ],
|
CHILI: [ Species.PANSEAR, Species.DARUMAKA, Species.NUMEL ],
|
||||||
CRESS: [ Species.PANPOUR, Species.BASCULIN, Species.TYMPOLE ],
|
CRESS: [ Species.PANPOUR, Species.TYMPOLE, Species.SLOWPOKE ],
|
||||||
CHEREN: [ Species.LILLIPUP, Species.MINCCINO, Species.PATRAT ],
|
CHEREN: [ Species.LILLIPUP, Species.MINCCINO, Species.PIDOVE ],
|
||||||
LENORA: [ Species.KANGASKHAN, Species.DEERLING, Species.AUDINO ],
|
LENORA: [ Species.PATRAT, Species.DEERLING, Species.AUDINO ],
|
||||||
ROXIE: [ Species.VENIPEDE, Species.TRUBBISH, Species.SKORUPI ],
|
ROXIE: [ Species.VENIPEDE, Species.TRUBBISH, Species.SKORUPI ],
|
||||||
BURGH: [ Species.SEWADDLE, Species.SHELMET, Species.KARRABLAST ],
|
BURGH: [ Species.SEWADDLE, Species.SHELMET, Species.KARRABLAST ],
|
||||||
ELESA: [ Species.EMOLGA, Species.BLITZLE, Species.JOLTIK ],
|
ELESA: [ Species.EMOLGA, Species.BLITZLE, Species.JOLTIK ],
|
||||||
@ -1289,7 +1292,7 @@ export const signatureSpecies: SignatureSpecies = {
|
|||||||
BRASSIUS: [ Species.SMOLIV, Species.SHROOMISH, Species.ODDISH ],
|
BRASSIUS: [ Species.SMOLIV, Species.SHROOMISH, Species.ODDISH ],
|
||||||
IONO: [ Species.TADBULB, Species.WATTREL, Species.VOLTORB ],
|
IONO: [ Species.TADBULB, Species.WATTREL, Species.VOLTORB ],
|
||||||
KOFU: [ Species.VELUZA, Species.WIGLETT, Species.WINGULL ],
|
KOFU: [ Species.VELUZA, Species.WIGLETT, Species.WINGULL ],
|
||||||
LARRY: [ Species.STARLY, Species.DUNSPARCE, Species.KOMALA ],
|
LARRY: [ Species.STARLY, Species.DUNSPARCE, Species.LECHONK, Species.KOMALA ],
|
||||||
RYME: [ Species.GREAVARD, Species.SHUPPET, Species.MIMIKYU ],
|
RYME: [ Species.GREAVARD, Species.SHUPPET, Species.MIMIKYU ],
|
||||||
TULIP: [ Species.GIRAFARIG, Species.FLITTLE, Species.RALTS ],
|
TULIP: [ Species.GIRAFARIG, Species.FLITTLE, Species.RALTS ],
|
||||||
GRUSHA: [ Species.CETODDLE, Species.ALOLA_VULPIX, Species.CUBCHOO ],
|
GRUSHA: [ Species.CETODDLE, Species.ALOLA_VULPIX, Species.CUBCHOO ],
|
||||||
@ -1852,7 +1855,7 @@ export const trainerConfigs: TrainerConfigs = {
|
|||||||
|
|
||||||
[TrainerType.RIVAL]: new TrainerConfig((t = TrainerType.RIVAL)).setName("Finn").setHasGenders("Ivy").setHasCharSprite().setTitle("Rival").setStaticParty().setEncounterBgm(TrainerType.RIVAL).setBattleBgm("battle_rival").setMixedBattleBgm("battle_rival").setPartyTemplates(trainerPartyTemplates.RIVAL)
|
[TrainerType.RIVAL]: new TrainerConfig((t = TrainerType.RIVAL)).setName("Finn").setHasGenders("Ivy").setHasCharSprite().setTitle("Rival").setStaticParty().setEncounterBgm(TrainerType.RIVAL).setBattleBgm("battle_rival").setMixedBattleBgm("battle_rival").setPartyTemplates(trainerPartyTemplates.RIVAL)
|
||||||
.setModifierRewardFuncs(() => modifierTypes.SUPER_EXP_CHARM, () => modifierTypes.EXP_SHARE)
|
.setModifierRewardFuncs(() => modifierTypes.SUPER_EXP_CHARM, () => modifierTypes.EXP_SHARE)
|
||||||
.setEventModifierRewardFuncs(() => modifierTypes.SHINY_CHARM, () => modifierTypes.ABILITY_CHARM)
|
.setEventModifierRewardFuncs(() => modifierTypes.SHINY_CHARM, () => modifierTypes.ABILITY_CHARM, () => modifierTypes.CATCHING_CHARM)
|
||||||
.setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE, Species.CHIKORITA, Species.CYNDAQUIL, Species.TOTODILE, Species.TREECKO, Species.TORCHIC, Species.MUDKIP, Species.TURTWIG, Species.CHIMCHAR, Species.PIPLUP, Species.SNIVY, Species.TEPIG, Species.OSHAWOTT, Species.CHESPIN, Species.FENNEKIN, Species.FROAKIE, Species.ROWLET, Species.LITTEN, Species.POPPLIO, Species.GROOKEY, Species.SCORBUNNY, Species.SOBBLE, Species.SPRIGATITO, Species.FUECOCO, Species.QUAXLY ], TrainerSlot.TRAINER, true,
|
.setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE, Species.CHIKORITA, Species.CYNDAQUIL, Species.TOTODILE, Species.TREECKO, Species.TORCHIC, Species.MUDKIP, Species.TURTWIG, Species.CHIMCHAR, Species.PIPLUP, Species.SNIVY, Species.TEPIG, Species.OSHAWOTT, Species.CHESPIN, Species.FENNEKIN, Species.FROAKIE, Species.ROWLET, Species.LITTEN, Species.POPPLIO, Species.GROOKEY, Species.SCORBUNNY, Species.SOBBLE, Species.SPRIGATITO, Species.FUECOCO, Species.QUAXLY ], TrainerSlot.TRAINER, true,
|
||||||
(p => p.abilityIndex = 0)))
|
(p => p.abilityIndex = 0)))
|
||||||
.setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.PIDGEY, Species.HOOTHOOT, Species.TAILLOW, Species.STARLY, Species.PIDOVE, Species.FLETCHLING, Species.PIKIPEK, Species.ROOKIDEE, Species.WATTREL ], TrainerSlot.TRAINER, true)),
|
.setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.PIDGEY, Species.HOOTHOOT, Species.TAILLOW, Species.STARLY, Species.PIDOVE, Species.FLETCHLING, Species.PIKIPEK, Species.ROOKIDEE, Species.WATTREL ], TrainerSlot.TRAINER, true)),
|
||||||
|
@ -242,7 +242,7 @@ export function getTerrainBlockMessage(pokemon: Pokemon, terrainType: TerrainTyp
|
|||||||
return i18next.t("terrain:defaultBlockMessage", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), terrainName: getTerrainName(terrainType) });
|
return i18next.t("terrain:defaultBlockMessage", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), terrainName: getTerrainName(terrainType) });
|
||||||
}
|
}
|
||||||
|
|
||||||
interface WeatherPoolEntry {
|
export interface WeatherPoolEntry {
|
||||||
weatherType: WeatherType;
|
weatherType: WeatherType;
|
||||||
weight: integer;
|
weight: integer;
|
||||||
}
|
}
|
||||||
@ -373,6 +373,10 @@ export function getRandomWeatherType(arena: any /* Importing from arena causes a
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (arena.biomeType === Biome.TOWN && arena.scene.eventManager.isEventActive() && arena.scene.eventManager.activeEvent()?.weather?.length > 0) {
|
||||||
|
arena.scene.eventManager.activeEvent().weather.map(w => weatherPool.push(w));
|
||||||
|
}
|
||||||
|
|
||||||
if (weatherPool.length > 1) {
|
if (weatherPool.length > 1) {
|
||||||
let totalWeight = 0;
|
let totalWeight = 0;
|
||||||
weatherPool.forEach(w => totalWeight += w.weight);
|
weatherPool.forEach(w => totalWeight += w.weight);
|
||||||
|
@ -4484,6 +4484,7 @@ export class PlayerPokemon extends Pokemon {
|
|||||||
newPokemon.moveset = this.moveset.slice();
|
newPokemon.moveset = this.moveset.slice();
|
||||||
newPokemon.moveset = this.copyMoveset();
|
newPokemon.moveset = this.copyMoveset();
|
||||||
newPokemon.luck = this.luck;
|
newPokemon.luck = this.luck;
|
||||||
|
newPokemon.gender = Gender.GENDERLESS;
|
||||||
newPokemon.metLevel = this.metLevel;
|
newPokemon.metLevel = this.metLevel;
|
||||||
newPokemon.metBiome = this.metBiome;
|
newPokemon.metBiome = this.metBiome;
|
||||||
newPokemon.metSpecies = this.metSpecies;
|
newPokemon.metSpecies = this.metSpecies;
|
||||||
|
@ -246,9 +246,9 @@ export class LoadingScene extends SceneBase {
|
|||||||
}
|
}
|
||||||
const availableLangs = [ "en", "de", "it", "fr", "ja", "ko", "es-ES", "pt-BR", "zh-CN" ];
|
const availableLangs = [ "en", "de", "it", "fr", "ja", "ko", "es-ES", "pt-BR", "zh-CN" ];
|
||||||
if (lang && availableLangs.includes(lang)) {
|
if (lang && availableLangs.includes(lang)) {
|
||||||
this.loadImage("halloween2024-event-" + lang, "events");
|
this.loadImage("winter_holidays2024-event-" + lang, "events");
|
||||||
} else {
|
} else {
|
||||||
this.loadImage("halloween2024-event-en", "events");
|
this.loadImage("winter_holidays2024-event-en", "events");
|
||||||
}
|
}
|
||||||
|
|
||||||
this.loadAtlas("statuses", "");
|
this.loadAtlas("statuses", "");
|
||||||
|
@ -1093,7 +1093,10 @@ class TmModifierTypeGenerator extends ModifierTypeGenerator {
|
|||||||
if (pregenArgs && (pregenArgs.length === 1) && (pregenArgs[0] in Moves)) {
|
if (pregenArgs && (pregenArgs.length === 1) && (pregenArgs[0] in Moves)) {
|
||||||
return new TmModifierType(pregenArgs[0] as Moves);
|
return new TmModifierType(pregenArgs[0] as Moves);
|
||||||
}
|
}
|
||||||
const partyMemberCompatibleTms = party.map(p => (p as PlayerPokemon).compatibleTms.filter(tm => !p.moveset.find(m => m?.moveId === tm)));
|
const partyMemberCompatibleTms = party.map(p => {
|
||||||
|
const previousLevelMoves = p.getLearnableLevelMoves();
|
||||||
|
return (p as PlayerPokemon).compatibleTms.filter(tm => !p.moveset.find(m => m?.moveId === tm) && !previousLevelMoves.find(lm=>lm === tm));
|
||||||
|
});
|
||||||
const tierUniqueCompatibleTms = partyMemberCompatibleTms.flat().filter(tm => tmPoolTiers[tm] === tier).filter(tm => !allMoves[tm].name.endsWith(" (N)")).filter((tm, i, array) => array.indexOf(tm) === i);
|
const tierUniqueCompatibleTms = partyMemberCompatibleTms.flat().filter(tm => tmPoolTiers[tm] === tier).filter(tm => !allMoves[tm].name.endsWith(" (N)")).filter((tm, i, array) => array.indexOf(tm) === i);
|
||||||
if (!tierUniqueCompatibleTms.length) {
|
if (!tierUniqueCompatibleTms.length) {
|
||||||
return null;
|
return null;
|
||||||
|
@ -35,8 +35,14 @@ export class CommandPhase extends FieldPhase {
|
|||||||
this.scene.updateGameInfo();
|
this.scene.updateGameInfo();
|
||||||
|
|
||||||
const commandUiHandler = this.scene.ui.handlers[Mode.COMMAND];
|
const commandUiHandler = this.scene.ui.handlers[Mode.COMMAND];
|
||||||
|
|
||||||
|
// If one of these conditions is true, we always reset the cursor to Command.FIGHT
|
||||||
|
const cursorResetEvent = this.scene.currentBattle.battleType === BattleType.MYSTERY_ENCOUNTER ||
|
||||||
|
this.scene.currentBattle.battleType === BattleType.TRAINER ||
|
||||||
|
this.scene.arena.biomeType === Biome.END;
|
||||||
|
|
||||||
if (commandUiHandler) {
|
if (commandUiHandler) {
|
||||||
if (this.scene.currentBattle.turn === 1 || commandUiHandler.getCursor() === Command.POKEMON) {
|
if ((this.scene.currentBattle.turn === 1 && (!this.scene.commandCursorMemory || cursorResetEvent)) || commandUiHandler.getCursor() === Command.POKEMON) {
|
||||||
commandUiHandler.setCursor(Command.FIGHT);
|
commandUiHandler.setCursor(Command.FIGHT);
|
||||||
} else {
|
} else {
|
||||||
commandUiHandler.setCursor(commandUiHandler.getCursor());
|
commandUiHandler.setCursor(commandUiHandler.getCursor());
|
||||||
|
@ -21,8 +21,9 @@ export class PokemonHealPhase extends CommonAnimPhase {
|
|||||||
private revive: boolean;
|
private revive: boolean;
|
||||||
private healStatus: boolean;
|
private healStatus: boolean;
|
||||||
private preventFullHeal: boolean;
|
private preventFullHeal: boolean;
|
||||||
|
private fullRestorePP: boolean;
|
||||||
|
|
||||||
constructor(scene: BattleScene, battlerIndex: BattlerIndex, hpHealed: integer, message: string | null, showFullHpMessage: boolean, skipAnim: boolean = false, revive: boolean = false, healStatus: boolean = false, preventFullHeal: boolean = false) {
|
constructor(scene: BattleScene, battlerIndex: BattlerIndex, hpHealed: integer, message: string | null, showFullHpMessage: boolean, skipAnim: boolean = false, revive: boolean = false, healStatus: boolean = false, preventFullHeal: boolean = false, fullRestorePP: boolean = false) {
|
||||||
super(scene, battlerIndex, undefined, CommonAnim.HEALTH_UP);
|
super(scene, battlerIndex, undefined, CommonAnim.HEALTH_UP);
|
||||||
|
|
||||||
this.hpHealed = hpHealed;
|
this.hpHealed = hpHealed;
|
||||||
@ -32,6 +33,7 @@ export class PokemonHealPhase extends CommonAnimPhase {
|
|||||||
this.revive = revive;
|
this.revive = revive;
|
||||||
this.healStatus = healStatus;
|
this.healStatus = healStatus;
|
||||||
this.preventFullHeal = preventFullHeal;
|
this.preventFullHeal = preventFullHeal;
|
||||||
|
this.fullRestorePP = fullRestorePP;
|
||||||
}
|
}
|
||||||
|
|
||||||
start() {
|
start() {
|
||||||
@ -86,6 +88,13 @@ export class PokemonHealPhase extends CommonAnimPhase {
|
|||||||
lastStatusEffect = pokemon.status.effect;
|
lastStatusEffect = pokemon.status.effect;
|
||||||
pokemon.resetStatus();
|
pokemon.resetStatus();
|
||||||
}
|
}
|
||||||
|
if (this.fullRestorePP) {
|
||||||
|
for (const move of this.getPokemon().getMoveset()) {
|
||||||
|
if (move) {
|
||||||
|
move.ppUsed = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
pokemon.updateInfo().then(() => super.end());
|
pokemon.updateInfo().then(() => super.end());
|
||||||
} else if (this.healStatus && !this.revive && pokemon.status) {
|
} else if (this.healStatus && !this.revive && pokemon.status) {
|
||||||
lastStatusEffect = pokemon.status.effect;
|
lastStatusEffect = pokemon.status.effect;
|
||||||
|
@ -157,6 +157,7 @@ export const SettingKeys = {
|
|||||||
Move_Animations: "MOVE_ANIMATIONS",
|
Move_Animations: "MOVE_ANIMATIONS",
|
||||||
Show_Stats_on_Level_Up: "SHOW_LEVEL_UP_STATS",
|
Show_Stats_on_Level_Up: "SHOW_LEVEL_UP_STATS",
|
||||||
Shop_Cursor_Target: "SHOP_CURSOR_TARGET",
|
Shop_Cursor_Target: "SHOP_CURSOR_TARGET",
|
||||||
|
Command_Cursor_Memory: "COMMAND_CURSOR_MEMORY",
|
||||||
Candy_Upgrade_Notification: "CANDY_UPGRADE_NOTIFICATION",
|
Candy_Upgrade_Notification: "CANDY_UPGRADE_NOTIFICATION",
|
||||||
Candy_Upgrade_Display: "CANDY_UPGRADE_DISPLAY",
|
Candy_Upgrade_Display: "CANDY_UPGRADE_DISPLAY",
|
||||||
Move_Info: "MOVE_INFO",
|
Move_Info: "MOVE_INFO",
|
||||||
@ -180,8 +181,8 @@ export const SettingKeys = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
export enum MusicPreference {
|
export enum MusicPreference {
|
||||||
CONSISTENT,
|
GENFIVE,
|
||||||
MIXED
|
ALLGENS
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -339,6 +340,13 @@ export const Setting: Array<Setting> = [
|
|||||||
default: 0,
|
default: 0,
|
||||||
type: SettingType.GENERAL
|
type: SettingType.GENERAL
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
key: SettingKeys.Command_Cursor_Memory,
|
||||||
|
label: i18next.t("settings:commandCursorMemory"),
|
||||||
|
options: OFF_ON,
|
||||||
|
default: 0,
|
||||||
|
type: SettingType.GENERAL
|
||||||
|
},
|
||||||
{
|
{
|
||||||
key: SettingKeys.Enable_Retries,
|
key: SettingKeys.Enable_Retries,
|
||||||
label: i18next.t("settings:enableRetries"),
|
label: i18next.t("settings:enableRetries"),
|
||||||
@ -662,15 +670,15 @@ export const Setting: Array<Setting> = [
|
|||||||
label: i18next.t("settings:musicPreference"),
|
label: i18next.t("settings:musicPreference"),
|
||||||
options: [
|
options: [
|
||||||
{
|
{
|
||||||
value: "Consistent",
|
value: "Gen V + PMD",
|
||||||
label: i18next.t("settings:consistent")
|
label: i18next.t("settings:musicGenFive")
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
value: "Mixed",
|
value: "All Gens",
|
||||||
label: i18next.t("settings:mixed")
|
label: i18next.t("settings:musicAllGens")
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
default: MusicPreference.MIXED,
|
default: MusicPreference.ALLGENS,
|
||||||
type: SettingType.AUDIO,
|
type: SettingType.AUDIO,
|
||||||
requireReload: true
|
requireReload: true
|
||||||
},
|
},
|
||||||
@ -827,6 +835,9 @@ export function setSetting(scene: BattleScene, setting: string, value: integer):
|
|||||||
const selectedValue = shopCursorTargetIndexMap[value];
|
const selectedValue = shopCursorTargetIndexMap[value];
|
||||||
scene.shopCursorTarget = selectedValue;
|
scene.shopCursorTarget = selectedValue;
|
||||||
break;
|
break;
|
||||||
|
case SettingKeys.Command_Cursor_Memory:
|
||||||
|
scene.commandCursorMemory = Setting[index].options[value].value === "On";
|
||||||
|
break;
|
||||||
case SettingKeys.EXP_Gains_Speed:
|
case SettingKeys.EXP_Gains_Speed:
|
||||||
scene.expGainsSpeed = value;
|
scene.expGainsSpeed = value;
|
||||||
break;
|
break;
|
||||||
|
@ -78,12 +78,15 @@ describe("Evolution", () => {
|
|||||||
const nincada = game.scene.getPlayerPokemon()!;
|
const nincada = game.scene.getPlayerPokemon()!;
|
||||||
nincada.abilityIndex = 2;
|
nincada.abilityIndex = 2;
|
||||||
nincada.metBiome = -1;
|
nincada.metBiome = -1;
|
||||||
|
nincada.gender = 1;
|
||||||
|
|
||||||
nincada.evolve(pokemonEvolutions[Species.NINCADA][0], nincada.getSpeciesForm());
|
nincada.evolve(pokemonEvolutions[Species.NINCADA][0], nincada.getSpeciesForm());
|
||||||
const ninjask = game.scene.getPlayerParty()[0];
|
const ninjask = game.scene.getPlayerParty()[0];
|
||||||
const shedinja = game.scene.getPlayerParty()[1];
|
const shedinja = game.scene.getPlayerParty()[1];
|
||||||
expect(ninjask.abilityIndex).toBe(2);
|
expect(ninjask.abilityIndex).toBe(2);
|
||||||
expect(shedinja.abilityIndex).toBe(1);
|
expect(shedinja.abilityIndex).toBe(1);
|
||||||
|
expect(ninjask.gender).toBe(1);
|
||||||
|
expect(shedinja.gender).toBe(-1);
|
||||||
// Regression test for https://github.com/pagefaultgames/pokerogue/issues/3842
|
// Regression test for https://github.com/pagefaultgames/pokerogue/issues/3842
|
||||||
expect(shedinja.metBiome).toBe(-1);
|
expect(shedinja.metBiome).toBe(-1);
|
||||||
});
|
});
|
||||||
|
77
src/test/moves/lunar_dance.test.ts
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
import { StatusEffect } from "#app/enums/status-effect";
|
||||||
|
import { CommandPhase } from "#app/phases/command-phase";
|
||||||
|
import { Abilities } from "#enums/abilities";
|
||||||
|
import { Moves } from "#enums/moves";
|
||||||
|
import { Species } from "#enums/species";
|
||||||
|
import GameManager from "#test/utils/gameManager";
|
||||||
|
import Phaser from "phaser";
|
||||||
|
import { afterEach, beforeAll, beforeEach, describe, it, expect } from "vitest";
|
||||||
|
|
||||||
|
describe("Moves - Lunar Dance", () => {
|
||||||
|
let phaserGame: Phaser.Game;
|
||||||
|
let game: GameManager;
|
||||||
|
|
||||||
|
beforeAll(() => {
|
||||||
|
phaserGame = new Phaser.Game({
|
||||||
|
type: Phaser.HEADLESS,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
afterEach(() => {
|
||||||
|
game.phaseInterceptor.restoreOg();
|
||||||
|
});
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
game = new GameManager(phaserGame);
|
||||||
|
game.override
|
||||||
|
.statusEffect(StatusEffect.BURN)
|
||||||
|
.battleType("double")
|
||||||
|
.enemyAbility(Abilities.BALL_FETCH)
|
||||||
|
.enemyMoveset(Moves.SPLASH);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should full restore HP, PP and status of switched in pokemon, then fail second use because no remaining backup pokemon in party", async () => {
|
||||||
|
await game.classicMode.startBattle([ Species.BULBASAUR, Species.ODDISH, Species.RATTATA ]);
|
||||||
|
|
||||||
|
const [ bulbasaur, oddish, rattata ] = game.scene.getPlayerParty();
|
||||||
|
game.move.changeMoveset(bulbasaur, [ Moves.LUNAR_DANCE, Moves.SPLASH ]);
|
||||||
|
game.move.changeMoveset(oddish, [ Moves.LUNAR_DANCE, Moves.SPLASH ]);
|
||||||
|
game.move.changeMoveset(rattata, [ Moves.LUNAR_DANCE, Moves.SPLASH ]);
|
||||||
|
|
||||||
|
game.move.select(Moves.SPLASH, 0);
|
||||||
|
game.move.select(Moves.SPLASH, 1);
|
||||||
|
await game.phaseInterceptor.to(CommandPhase);
|
||||||
|
await game.toNextTurn();
|
||||||
|
|
||||||
|
// Bulbasaur should still be burned and have used a PP for splash and not at max hp
|
||||||
|
expect(bulbasaur.status?.effect).toBe(StatusEffect.BURN);
|
||||||
|
expect(bulbasaur.moveset[1]?.ppUsed).toBe(1);
|
||||||
|
expect(bulbasaur.hp).toBeLessThan(bulbasaur.getMaxHp());
|
||||||
|
|
||||||
|
// Switch out Bulbasaur for Rattata so we can swtich bulbasaur back in with lunar dance
|
||||||
|
game.doSwitchPokemon(2);
|
||||||
|
game.move.select(Moves.SPLASH, 1);
|
||||||
|
await game.phaseInterceptor.to(CommandPhase);
|
||||||
|
await game.toNextTurn();
|
||||||
|
|
||||||
|
game.move.select(Moves.SPLASH, 0);
|
||||||
|
game.move.select(Moves.LUNAR_DANCE);
|
||||||
|
game.doSelectPartyPokemon(2);
|
||||||
|
await game.phaseInterceptor.to("SwitchPhase", false);
|
||||||
|
await game.toNextTurn();
|
||||||
|
|
||||||
|
// Bulbasaur should NOT have any status and have full PP for splash and be at max hp
|
||||||
|
expect(bulbasaur.status?.effect).toBeUndefined();
|
||||||
|
expect(bulbasaur.moveset[1]?.ppUsed).toBe(0);
|
||||||
|
expect(bulbasaur.isFullHp()).toBe(true);
|
||||||
|
|
||||||
|
game.move.select(Moves.SPLASH, 0);
|
||||||
|
game.move.select(Moves.LUNAR_DANCE);
|
||||||
|
await game.phaseInterceptor.to(CommandPhase);
|
||||||
|
await game.toNextTurn();
|
||||||
|
|
||||||
|
// Using Lunar dance again should fail because nothing in party and rattata should be alive
|
||||||
|
expect(rattata.status?.effect).toBe(StatusEffect.BURN);
|
||||||
|
expect(rattata.hp).toBeLessThan(rattata.getMaxHp());
|
||||||
|
});
|
||||||
|
});
|
@ -2,6 +2,9 @@ import BattleScene from "#app/battle-scene";
|
|||||||
import { TextStyle, addTextObject } from "#app/ui/text";
|
import { TextStyle, addTextObject } from "#app/ui/text";
|
||||||
import { nil } from "#app/utils";
|
import { nil } from "#app/utils";
|
||||||
import i18next from "i18next";
|
import i18next from "i18next";
|
||||||
|
import { Species } from "#enums/species";
|
||||||
|
import { WeatherPoolEntry } from "#app/data/weather";
|
||||||
|
import { WeatherType } from "#enums/weather-type";
|
||||||
|
|
||||||
export enum EventType {
|
export enum EventType {
|
||||||
SHINY,
|
SHINY,
|
||||||
@ -16,6 +19,11 @@ interface EventBanner {
|
|||||||
availableLangs?: string[];
|
availableLangs?: string[];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
interface EventEncounter {
|
||||||
|
species: Species;
|
||||||
|
allowEvolution?: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
interface TimedEvent extends EventBanner {
|
interface TimedEvent extends EventBanner {
|
||||||
name: string;
|
name: string;
|
||||||
eventType: EventType;
|
eventType: EventType;
|
||||||
@ -23,19 +31,46 @@ interface TimedEvent extends EventBanner {
|
|||||||
friendshipMultiplier?: number;
|
friendshipMultiplier?: number;
|
||||||
startDate: Date;
|
startDate: Date;
|
||||||
endDate: Date;
|
endDate: Date;
|
||||||
|
uncommonBreedEncounters?: EventEncounter[];
|
||||||
|
delibirdyBuff?: string[];
|
||||||
|
weather?: WeatherPoolEntry[];
|
||||||
}
|
}
|
||||||
|
|
||||||
const timedEvents: TimedEvent[] = [
|
const timedEvents: TimedEvent[] = [
|
||||||
{
|
{
|
||||||
name: "Halloween Update",
|
name: "Winter Holiday Update",
|
||||||
eventType: EventType.SHINY,
|
eventType: EventType.SHINY,
|
||||||
shinyMultiplier: 2,
|
shinyMultiplier: 2,
|
||||||
friendshipMultiplier: 2,
|
friendshipMultiplier: 1,
|
||||||
startDate: new Date(Date.UTC(2024, 9, 27, 0)),
|
startDate: new Date(Date.UTC(2024, 11, 21, 0)),
|
||||||
endDate: new Date(Date.UTC(2024, 10, 4, 0)),
|
endDate: new Date(Date.UTC(2025, 0, 4, 0)),
|
||||||
bannerKey: "halloween2024-event-",
|
bannerKey: "winter_holidays2024-event-",
|
||||||
scale: 0.21,
|
scale: 0.21,
|
||||||
availableLangs: [ "en", "de", "it", "fr", "ja", "ko", "es-ES", "pt-BR", "zh-CN" ]
|
availableLangs: [ "en", "de", "it", "fr", "ja", "ko", "es-ES", "pt-BR", "zh-CN" ],
|
||||||
|
uncommonBreedEncounters: [
|
||||||
|
{ species: Species.GIMMIGHOUL },
|
||||||
|
{ species: Species.DELIBIRD },
|
||||||
|
{ species: Species.STANTLER, allowEvolution: true },
|
||||||
|
{ species: Species.CYNDAQUIL, allowEvolution: true },
|
||||||
|
{ species: Species.PIPLUP, allowEvolution: true },
|
||||||
|
{ species: Species.CHESPIN, allowEvolution: true },
|
||||||
|
{ species: Species.BALTOY, allowEvolution: true },
|
||||||
|
{ species: Species.SNOVER, allowEvolution: true },
|
||||||
|
{ species: Species.CHINGLING, allowEvolution: true },
|
||||||
|
{ species: Species.LITWICK, allowEvolution: true },
|
||||||
|
{ species: Species.CUBCHOO, allowEvolution: true },
|
||||||
|
{ species: Species.SWIRLIX, allowEvolution: true },
|
||||||
|
{ species: Species.AMAURA, allowEvolution: true },
|
||||||
|
{ species: Species.MUDBRAY, allowEvolution: true },
|
||||||
|
{ species: Species.ROLYCOLY, allowEvolution: true },
|
||||||
|
{ species: Species.MILCERY, allowEvolution: true },
|
||||||
|
{ species: Species.SMOLIV, allowEvolution: true },
|
||||||
|
{ species: Species.ALOLA_VULPIX, allowEvolution: true },
|
||||||
|
{ species: Species.GALAR_DARUMAKA, allowEvolution: true },
|
||||||
|
{ species: Species.IRON_BUNDLE }
|
||||||
|
],
|
||||||
|
delibirdyBuff: [ "CATCHING_CHARM", "SHINY_CHARM", "ABILITY_CHARM", "EXP_CHARM", "SUPER_EXP_CHARM", "HEALING_CHARM" ],
|
||||||
|
weather: [{ weatherType: WeatherType.SNOW, weight: 1 }]
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
|
|
||||||
@ -189,7 +224,7 @@ export class TimedEventDisplay extends Phaser.GameObjects.Container {
|
|||||||
const secs = Math.round(diff % 6e4 / 1e3);
|
const secs = Math.round(diff % 6e4 / 1e3);
|
||||||
|
|
||||||
// Return formatted string
|
// Return formatted string
|
||||||
return "Event Ends in : " + z(days) + "d " + z(hours) + "h " + z(mins) + "m " + z(secs) + "s";
|
return i18next.t("menu:eventTimer", { days: z(days), hours: z(hours), mins: z(mins), secs: z(secs) });
|
||||||
}
|
}
|
||||||
|
|
||||||
updateCountdown() {
|
updateCountdown() {
|
||||||
|
@ -81,7 +81,11 @@ export default class LoginFormUiHandler extends FormModalUiHandler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
override getModalTitle(_config?: ModalConfig): string {
|
override getModalTitle(_config?: ModalConfig): string {
|
||||||
return i18next.t("menu:login");
|
let key = "menu:login";
|
||||||
|
if (import.meta.env.VITE_SERVER_URL === "https://apibeta.pokerogue.net") {
|
||||||
|
key = "menu:loginBeta";
|
||||||
|
}
|
||||||
|
return i18next.t(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
override getWidth(_config?: ModalConfig): number {
|
override getWidth(_config?: ModalConfig): number {
|
||||||
|
@ -362,12 +362,12 @@ export default class PartyUiHandler extends MessageUiHandler {
|
|||||||
if (p !== this.transferCursor) { // this skips adding the able/not able labels on the pokemon doing the transfer
|
if (p !== this.transferCursor) { // this skips adding the able/not able labels on the pokemon doing the transfer
|
||||||
if (matchingModifier) { // if matchingModifier exists then the item exists on the new pokemon
|
if (matchingModifier) { // if matchingModifier exists then the item exists on the new pokemon
|
||||||
if (matchingModifier.getMaxStackCount(this.scene) === matchingModifier.stackCount) { // checks to see if the stack of items is at max stack; if so, set the description label to "Not able"
|
if (matchingModifier.getMaxStackCount(this.scene) === matchingModifier.stackCount) { // checks to see if the stack of items is at max stack; if so, set the description label to "Not able"
|
||||||
ableToTransfer = "Not able";
|
ableToTransfer = i18next.t("partyUiHandler:notAble");
|
||||||
} else { // if the pokemon isn't at max stack, make the label "Able"
|
} else { // if the pokemon isn't at max stack, make the label "Able"
|
||||||
ableToTransfer = "Able";
|
ableToTransfer = i18next.t("partyUiHandler:able");
|
||||||
}
|
}
|
||||||
} else { // if matchingModifier doesn't exist, that means the pokemon doesn't have any of the item, and we need to show "Able"
|
} else { // if matchingModifier doesn't exist, that means the pokemon doesn't have any of the item, and we need to show "Able"
|
||||||
ableToTransfer = "Able";
|
ableToTransfer = i18next.t("partyUiHandler:able");
|
||||||
}
|
}
|
||||||
} else { // this else relates to the transfer pokemon. We set the text to be blank so there's no "Able"/"Not able" text
|
} else { // this else relates to the transfer pokemon. We set the text to be blank so there's no "Able"/"Not able" text
|
||||||
ableToTransfer = "";
|
ableToTransfer = "";
|
||||||
|