diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/battle/battle_4.c | 4 | ||||
-rw-r--r-- | src/battle/battle_party_menu.c | 2 | ||||
-rw-r--r-- | src/data/text/move_descriptions_de.h | 1771 | ||||
-rw-r--r-- | src/data/text/move_descriptions_en.h | 1772 | ||||
-rw-r--r-- | src/data/text/nature_names_de.h | 53 | ||||
-rw-r--r-- | src/data/text/nature_names_en.h | 53 | ||||
-rw-r--r-- | src/engine/trade.c | 4 | ||||
-rw-r--r-- | src/field/choose_party.c | 5 | ||||
-rw-r--r-- | src/field/party_menu.c | 2 | ||||
-rw-r--r-- | src/pokemon/learn_move.c | 24 | ||||
-rw-r--r-- | src/pokemon/mon_markings.c | 16 | ||||
-rw-r--r-- | src/pokemon/pokemon_menu.c | 2 | ||||
-rw-r--r-- | src/pokemon/pokemon_summary_screen.c | 5423 | ||||
-rw-r--r-- | src/scene/evolution_scene.c | 4 | ||||
-rw-r--r-- | src/script_pokemon_util_80F99CC.c | 2 | ||||
-rw-r--r-- | src/strings.c | 2 |
16 files changed, 9085 insertions, 54 deletions
diff --git a/src/battle/battle_4.c b/src/battle/battle_4.c index 088f30669..4483c252a 100644 --- a/src/battle/battle_4.c +++ b/src/battle/battle_4.c @@ -18,6 +18,7 @@ #include "sound.h" #include "task.h" #include "decompress.h" +#include "pokemon_summary_screen.h" #include "naming_screen.h" #include "ewram.h" @@ -139,7 +140,6 @@ u16 GetPokedexHeightWeight(u16 national_num, u8 heightweight); u8 sub_814A5C0(u8 a1, u16 a2, u8 a3, u16 a4, u8 a5); void DestroyMenuCursor(void); void sub_802BC6C(void); -void sub_809D9F0(struct Pokemon *party, u8, u8, void *, u32); u8 sub_809FA30(void); bool32 IsHMMove2(u16 move); void sub_802BBD4(u8 r0, u8 r1, u8 r2, u8 r3, u8 sp0); @@ -10833,7 +10833,7 @@ static void atk5A(void) case 2: if (!gPaletteFade.active) { - sub_809D9F0(gPlayerParty, BATTLE_STRUCT->expGetterID, gPlayerPartyCount - 1, ReshowBattleScreenAfterMenu, gMoveToLearn); + ShowSelectMovePokemonSummaryScreen(gPlayerParty, BATTLE_STRUCT->expGetterID, gPlayerPartyCount - 1, ReshowBattleScreenAfterMenu, gMoveToLearn); BATTLE_STRUCT->atk5A_StateTracker++; } break; diff --git a/src/battle/battle_party_menu.c b/src/battle/battle_party_menu.c index 97e9dc0fc..5531ead4b 100644 --- a/src/battle/battle_party_menu.c +++ b/src/battle/battle_party_menu.c @@ -625,7 +625,7 @@ static void Task_ShowSummaryScreen(u8 taskId) { DestroyTask(taskId); EWRAM_1B000.unk262 = 1; - ShowPokemonSummaryScreen(gPlayerParty, partySelection, gPlayerPartyCount - 1, Task_809535C, 4); + ShowPokemonSummaryScreen(gPlayerParty, partySelection, gPlayerPartyCount - 1, Task_809535C, PSS_MODE_NO_MOVE_ORDER_EDIT); } } diff --git a/src/data/text/move_descriptions_de.h b/src/data/text/move_descriptions_de.h new file mode 100644 index 000000000..854336295 --- /dev/null +++ b/src/data/text/move_descriptions_de.h @@ -0,0 +1,1771 @@ +static const u8 MoveDescription_Pound[] = _( + "Ein Hieb mit den Vorder-\n" + "beinen oder dem Schweif."); + +static const u8 MoveDescription_KarateChop[] = _( + "Gute Möglichkeit, einen\n" + "Volltreffer zu landen."); + +static const u8 MoveDescription_DoubleSlap[] = _( + "Trifft den Gegner 2 - 5-mal\n" + "hintereinander."); + +static const u8 MoveDescription_CometPunch[] = _( + "Trifft den Gegner 2 - 5-mal\n" + "hintereinander."); + +static const u8 MoveDescription_MegaPunch[] = _( + "Ein unglaublich kräftiger\n" + "Hieb."); + +static const u8 MoveDescription_PayDay[] = _( + "Wirft Münzen auf Gegner.\n" + "Geld wird erstattet."); + +static const u8 MoveDescription_FirePunch[] = _( + "Schlag, der dem Gegner evtl.\n" + "Verbrennungen zufügt."); + +static const u8 MoveDescription_IcePunch[] = _( + "Ein Schlag, der den Gegner\n" + "evtl. einfriert."); + +static const u8 MoveDescription_ThunderPunch[] = _( + "Schlag, der den Gegner evtl.\n" + "paralysiert."); + +static const u8 MoveDescription_Scratch[] = _( + "Der Gegner wird mit\n" + "scharfen Klauen zerkratzt."); + +static const u8 MoveDescription_ViceGrip[] = _( + "Umklammert den Gegner mit\n" + "großen, kräftigen Zangen."); + +static const u8 MoveDescription_Guillotine[] = _( + "Kräftige Scheren-Attacke.\n" + "Führt evtl. zum K.O."); + +static const u8 MoveDescription_RazorWind[] = _( + "Eine Attacke, die auf 2\n" + "Runden basiert."); + +static const u8 MoveDescription_SwordsDance[] = _( + "Erhöht den Angriffs-Wert\n" + "drastisch."); + +static const u8 MoveDescription_Cut[] = _( + "Trifft den Gegner mit\n" + "Klauen, Scheren o. ä."); + +static const u8 MoveDescription_Gust[] = _( + "Trifft den Gegner mit Wind-\n" + "stoß durch Flügelschlag."); + +static const u8 MoveDescription_WingAttack[] = _( + "Trifft den Gegner mit weit\n" + "gespreizten Flügeln."); + +static const u8 MoveDescription_Whirlwind[] = _( + "Weht Gegner weg und be-\n" + "endet den Kampf in Wildnis."); + +static const u8 MoveDescription_Fly[] = _( + "Steigt empor in der 1. Runde\n" + "und trifft Gegner in der 2."); + +static const u8 MoveDescription_Bind[] = _( + "Umklammert und trifft den\n" + "Gegner 2 - 5-mal."); + +static const u8 MoveDescription_Slam[] = _( + "Schlag mit einem langen\n" + "Schweif, einer Ranke o. ä."); + +static const u8 MoveDescription_VineWhip[] = _( + "Peitschenähnlicher Schlag\n" + "mit Ranken."); + +static const u8 MoveDescription_Stomp[] = _( + "Stampfen mit Fuß. Gegner\n" + "schreckt evtl. zurück."); + +static const u8 MoveDescription_DoubleKick[] = _( + "Doppeltritt. Der Gegner\n" + "wird zweimal getroffen."); + +static const u8 MoveDescription_MegaKick[] = _( + "Ein extrem heftiger Tritt."); + +static const u8 MoveDescription_JumpKick[] = _( + "Sprung-Tritt. Selbstschä-\n" + "digung bei Misserfolg."); + +static const u8 MoveDescription_RollingKick[] = _( + "Schneller Tritt aus der\n" + "Drehung."); + +static const u8 MoveDescription_SandAttack[] = _( + "Senkt Genauigkeit des Geg-\n" + "ners durch Sand."); + +static const u8 MoveDescription_Headbutt[] = _( + "Rammt den Gegner und lässt\n" + "ihn evtl. zurückschrecken."); + +static const u8 MoveDescription_HornAttack[] = _( + "Spießt den Gegner mit\n" + "spitzen Hörnern auf."); + +static const u8 MoveDescription_FuryAttack[] = _( + "Spießt den Gegner 2 - 5-mal\n" + "mit spitzen Hörnern auf."); + +static const u8 MoveDescription_HornDrill[] = _( + "K.O.-Attacke, die ein Horn\n" + "als Bohrer einsetzt."); + +static const u8 MoveDescription_Tackle[] = _( + "Trifft den Gegner mit vollem\n" + "Körpereinsatz."); + +static const u8 MoveDescription_BodySlam[] = _( + "Körper-Ramme, kann\n" + "Paralyse hervorrufen."); + +static const u8 MoveDescription_Wrap[] = _( + "Umwickelt Gegner 2 - 5-mal\n" + "mit Ranken o. ä."); + +static const u8 MoveDescription_TakeDown[] = _( + "Rücksichtslose Attacke,\n" + "mit Selbstschädigung."); + +static const u8 MoveDescription_Thrash[] = _( + "Attacke in 2 bis 3 Runden,\n" + "die Anwender verwirrt."); + +static const u8 MoveDescription_DoubleEdge[] = _( + "Lebensgefährlicher Angriff\n" + "mit Selbstschädigung."); + +static const u8 MoveDescription_TailWhip[] = _( + "Hieb mit dem Schweif, senkt\n" + "die VERT. des Gegners."); + +static const u8 MoveDescription_PoisonSting[] = _( + "Angriff mit Widerhaken,\n" + "kann Gegner vergiften."); + +static const u8 MoveDescription_Twineedle[] = _( + "Stacheln an den Vorderbei-\n" + "nen treffen Gegner 2-mal."); + +static const u8 MoveDescription_PinMissile[] = _( + "Spitze Nadeln treffen den\n" + "Gegner 2 - 5-mal."); + +static const u8 MoveDescription_Leer[] = _( + "Gegners VERT.-Wert wird\n" + "durch Blick gesenkt."); + +static const u8 MoveDescription_Bite[] = _( + "Beißt zu und lässt den Geg-\n" + "ner evtl. zurückschrecken."); + +static const u8 MoveDescription_Growl[] = _( + "Knurren, das den ANGR.-Wert\n" + "des Gegners senkt."); + +static const u8 MoveDescription_Roar[] = _( + "Verjagt den Gegner und be-\n" + "endet den Kampf in Wildnis."); + +static const u8 MoveDescription_Sing[] = _( + "Ein Lied, das den Gegner\n" + "in tiefen Schlaf versetzt."); + +static const u8 MoveDescription_Supersonic[] = _( + "Ausstoß bizarrer Schallwel-\n" + "len. Verwirrt Gegner evtl."); + +static const u8 MoveDescription_SonicBoom[] = _( + "Schockwellen. Richten immer\n" + "20 KP Schaden an."); + +static const u8 MoveDescription_Disable[] = _( + "Psycho-Attacke. Blockiert\n" + "eine Attacke des Gegners."); + +static const u8 MoveDescription_Acid[] = _( + "Versprüht ätzende Flüssig-\n" + "keit, senkt evtl. VERT."); + +static const u8 MoveDescription_Ember[] = _( + "Schwache Feuer-Attacke.\n" + "Verbrennt Gegner evtl."); + +static const u8 MoveDescription_Flamethrower[] = _( + "Starke Feuer-Attacke.\n" + "Verbrennt Gegner evtl."); + +static const u8 MoveDescription_Mist[] = _( + "Nebel, der die Änderung der\n" + "Werte verhindert."); + +static const u8 MoveDescription_WaterGun[] = _( + "Der Gegner wird mit Wasser\n" + "bespritzt."); + +static const u8 MoveDescription_HydroPump[] = _( + "Spritzt Wasser mit\n" + "Hochdruck auf den Gegner."); + +static const u8 MoveDescription_Surf[] = _( + "Eine riesige Welle bricht\n" + "über den Gegner herein."); + +static const u8 MoveDescription_IceBeam[] = _( + "Gegner wird von Eisstrahl\n" + "getroffen, friert evtl. ein."); + +static const u8 MoveDescription_Blizzard[] = _( + "Ein Schneesturm, der den\n" + "Gegner einfrieren kann."); + +static const u8 MoveDescription_Psybeam[] = _( + "Feuert einen Strahl ab, der\n" + "Gegner verwirren kann."); + +static const u8 MoveDescription_BubbleBeam[] = _( + "Versprüht Blasen, die den\n" + "INIT.-Wert evtl. senken."); + +static const u8 MoveDescription_AuroraBeam[] = _( + "Regenbogenfarbener Strahl,\n" + "senkt evtl. ANGR.-Wert."); + +static const u8 MoveDescription_HyperBeam[] = _( + "Starke Attacke. Angreifer\n" + "setzt eine Runde aus."); + +static const u8 MoveDescription_Peck[] = _( + "Greift Gegner mit dem\n" + "Schnabel an."); + +static const u8 MoveDescription_DrillPeck[] = _( + "Attacke, bei der der Schna-\n" + "bel als Bohrer dient."); + +static const u8 MoveDescription_Submission[] = _( + "Rücksichtsloser Rempler. \n" + "Schädigt auch Angreifer."); + +static const u8 MoveDescription_LowKick[] = _( + "Tritt, der massigen Gegnern\n" + "mehr Schaden zufügt."); + +static const u8 MoveDescription_Counter[] = _( + "Kontert physischen Tref-\n" + "fer mit doppelter Kraft."); + +static const u8 MoveDescription_SeismicToss[] = _( + "Richtet Schaden gemäß\n" + "Level d. Angreifers an."); + +static const u8 MoveDescription_Strength[] = _( + "Erzeugt enorme Kraft und\n" + "rammt den Gegner."); + +static const u8 MoveDescription_Absorb[] = _( + "Attacke, die die Hälfte des\n" + "Schadens absorbiert."); + +static const u8 MoveDescription_MegaDrain[] = _( + "Attacke, die die Hälfte des\n" + "Schadens absorbiert."); + +static const u8 MoveDescription_LeechSeed[] = _( + "Gegner wird bepflanzt und\n" + "verliert jede Runde KP."); + +static const u8 MoveDescription_Growth[] = _( + "Der Körper wächst und\n" + "SPEZ. ANGR. wird erhöht."); + +static const u8 MoveDescription_RazorLeaf[] = _( + "Trifft Gegner mit Blättern.\n" + "Hohe Volltrefferquote."); + +static const u8 MoveDescription_SolarBeam[] = _( + "Absorbiert Licht in der 1.\n" + "Runde, 2. Runde Angriff."); + +static const u8 MoveDescription_PoisonPowder[] = _( + "Verstreut giftigen Puder,\n" + "der Gegner vergiften kann."); + +static const u8 MoveDescription_StunSpore[] = _( + "Verstreut Puder, der den\n" + "Gegner evtl. paralysiert."); + +static const u8 MoveDescription_SleepPowder[] = _( + "Verstreut Puder, der Geg.\n" + "evtl. in Schlaf versetzt."); + +static const u8 MoveDescription_PetalDance[] = _( + "Angriff in 2-3 Runden.\n" + "Angreifer wird verwirrt."); + +static const u8 MoveDescription_StringShot[] = _( + "Umwickelt Gegner mit Faden\n" + "und senkt INIT.-Wert."); + +static const u8 MoveDescription_DragonRage[] = _( + "Stößt Schockwellen aus, die\n" + "40 KP Schaden anrichten."); + +static const u8 MoveDescription_FireSpin[] = _( + "Schließt Gegner für 2-5\n" + "Runden in Feuerkreis ein."); + +static const u8 MoveDescription_ThunderShock[] = _( + "Elektro-Attacke. Gegner\n" + "evtl. paralysiert."); + +static const u8 MoveDescription_Thunderbolt[] = _( + "Starke Elektro-Attacke,\n" + "Gegner evtl. paralysiert."); + +static const u8 MoveDescription_ThunderWave[] = _( + "Ein schwacher Stromstoß,\n" + "der den Gegner paralysiert."); + +static const u8 MoveDescription_Thunder[] = _( + "Elektro-Attacke, die den\n" + "Gegner evtl. paralysiert."); + +static const u8 MoveDescription_RockThrow[] = _( + "Wirft kleine Steine auf den\n" + "Gegner."); + +static const u8 MoveDescription_Earthquake[] = _( + "Mächtiges Beben. Ist bei\n" + "fliegenden Feinden nutzlos."); + +static const u8 MoveDescription_Fissure[] = _( + "Sofort-K.O. Wirft Gegner\n" + "in Gebirgsspalte."); + +static const u8 MoveDescription_Dig[] = _( + "Gräbt sich in der 1. Runde\n" + "ein und trifft in der 2."); + +static const u8 MoveDescription_Toxic[] = _( + "Vergiftet den Gegner mit \n" + "einem starken Toxin."); + +static const u8 MoveDescription_Confusion[] = _( + "Psycho-Attacke, die den\n" + "Gegner evtl. verwirrt."); + +static const u8 MoveDescription_Psychic[] = _( + "Starke Psycho-Attacke, die\n" + "evtl. SPEZ. VERT. senkt."); + +static const u8 MoveDescription_Hypnosis[] = _( + "Hypno-Attacke, die Gegner\n" + "evtl. in Schlaf versetzt."); + +static const u8 MoveDescription_Meditate[] = _( + "Friedliche Meditation, um\n" + "ANGR.-Wert zu steigern."); + +static const u8 MoveDescription_Agility[] = _( + "Entspannt den Körper, um\n" + "INIT.-Wert. zu steigern."); + +static const u8 MoveDescription_QuickAttack[] = _( + "Sehr schneller Angriff mit\n" + "Erstschlaggarantie."); + +static const u8 MoveDescription_Rage[] = _( + "Erhöht ANGR. des Anwenders\n" + "bei jedem gegn. Treffer."); + +static const u8 MoveDescription_Teleport[] = _( + "Psycho-Angriff, um sofort\n" + "aus einem Kampf zu fliehen."); + +static const u8 MoveDescription_NightShade[] = _( + "Richtet Schaden gemäß\n" + "Level d. Angreifers an."); + +static const u8 MoveDescription_Mimic[] = _( + "Kopiert eine zuvor ausge-\n" + "führte Attacke d. Gegners."); + +static const u8 MoveDescription_Screech[] = _( + "Stößt einen Schrei aus, um\n" + "gegn. VERT. zu senken."); + +static const u8 MoveDescription_DoubleTeam[] = _( + "Erzeugt Ebenbilder, um \n" + "Fluchtwert zu erhöhen."); + +static const u8 MoveDescription_Recover[] = _( + "Max. KP des Anwenders w.\n" + "bis zur Hälfte aufgefüllt."); + +static const u8 MoveDescription_Harden[] = _( + "Stärkt die Muskulatur und\n" + "erhöht VERT.-Wert."); + +static const u8 MoveDescription_Minimize[] = _( + "Anwender schrumpft, um\n" + "Fluchtwert zu erhöhen."); + +static const u8 MoveDescription_Smokescreen[] = _( + "Senkt Genauigkeit d. Geg-\n" + "ners mit Rauch, Tinte o. ä."); + +static const u8 MoveDescription_ConfuseRay[] = _( + "Ein fieser Strahl, der den\n" + "Gegner verwirrt."); + +static const u8 MoveDescription_Withdraw[] = _( + "Rückzug in den harten\n" + "Panzer. Erhöht VERT.-Wert."); + +static const u8 MoveDescription_DefenseCurl[] = _( + "Verbirgt Schwächen durch\n" + "Einrollen, VERT.-Wert hoch."); + +static const u8 MoveDescription_Barrier[] = _( + "Erzeugt Barriere, die den\n" + "VERT.-Wert stark erhöht."); + +static const u8 MoveDescription_LightScreen[] = _( + "Erzeugt Lichtwand u. senkt\n" + "SPEZ. ANGR.-Schaden."); + +static const u8 MoveDescription_Haze[] = _( + "Erzeugt dunklen Dunst.\n" + "Löscht alle Statusänder."); + +static const u8 MoveDescription_Reflect[] = _( + "Erzeugt Lichtwand, schützt\n" + "teilweise vor phys. Angr."); + +static const u8 MoveDescription_FocusEnergy[] = _( + "Bündelt Kraft. Volltreffer-\n" + "chance wird erhöht."); + +static const u8 MoveDescription_Bide[] = _( + "Erträgt 2 Runden Angriffe,\n" + "schlägt doppelt zurück."); + +static const u8 MoveDescription_Metronome[] = _( + "Bewegt Finger und wählt\n" + "PKMN-Attacke zufällig aus."); + +static const u8 MoveDescription_MirrorMove[] = _( + "Erwidert gegn. Angriff mit\n" + "derselben Attacke."); + +static const u8 MoveDescription_SelfDestruct[] = _( + "Richtet großen Schaden an.\n" + "Anwender wird besiegt."); + +static const u8 MoveDescription_EggBomb[] = _( + "Ein Ei wird auf den Gegner\n" + "abgefeuert."); + +static const u8 MoveDescription_Lick[] = _( + "Leck-Attacke mit Zunge.\n" + "Gegner evtl. paralysiert."); + +static const u8 MoveDescription_Smog[] = _( + "Angriff mit Gas. Gegner wird\n" + "evtl. vergiftet."); + +static const u8 MoveDescription_Sludge[] = _( + "Wirft Schlamm auf Gegner.\n" + "Evtl. Vergiftung."); + +static const u8 MoveDescription_BoneClub[] = _( + "Schlägt Gegner mit Keule\n" + "und verschreckt ihn evtl."); + +static const u8 MoveDescription_FireBlast[] = _( + "Feuersbrunst, die alles ver-\n" + "sengt. Verbrennt Geg. evtl."); + +static const u8 MoveDescription_Waterfall[] = _( + "Attacke basiert auf Tempo.\n" + "Erklimmt Wasserfälle."); + +static const u8 MoveDescription_Clamp[] = _( + "Fängt und drückt Gegner\n" + "für 2-5 Runden."); + +static const u8 MoveDescription_Swift[] = _( + "Verschießt sternförmige\n" + "Strahlen. Treffergarantie!"); + +static const u8 MoveDescription_SkullBash[] = _( + "Zieht Kopf ein und greift in\n" + "der nächsten Runde an."); + +static const u8 MoveDescription_SpikeCannon[] = _( + "Verschießt spitze Stacheln\n" + "und trifft 2 - 5-mal."); + +static const u8 MoveDescription_Constrict[] = _( + "Schmerzvoller Klammergriff.\n" + "Senkt evtl. INIT.-Wert."); + +static const u8 MoveDescription_Amnesia[] = _( + "Gedächtnisverlust, der\n" + "SPEZ. VERT. deutlich erhöht."); + +static const u8 MoveDescription_Kinesis[] = _( + "Lenkt Gegner ab und senkt\n" + "evtl. seine Genauigkeit."); + +static const u8 MoveDescription_SoftBoiled[] = _( + "Max. KP des Anwenders w.\n" + "bis zur Hälfte aufgefüllt."); + +static const u8 MoveDescription_HiJumpKick[] = _( + "Sprung-Tritt mit Knie. Miss-\n" + "erfolg verletzt Anwender."); + +static const u8 MoveDescription_Glare[] = _( + "Schüchtert Gegner ein, so\n" + "dass er paralysiert ist."); + +static const u8 MoveDescription_DreamEater[] = _( + "Schlafendem Gegner wird\n" + "halber Schaden abgezogen."); + +static const u8 MoveDescription_PoisonGas[] = _( + "Hüllt Gegner in giftiges Gas\n" + "ein, kann vergiften."); + +static const u8 MoveDescription_Barrage[] = _( + "Wirft 2 - 5-mal runde Gegen-\n" + "stände auf den Gegner."); + +static const u8 MoveDescription_LeechLife[] = _( + "Ein Angriff, der die Hälfte\n" + "des Schadens saugt."); + +static const u8 MoveDescription_LovelyKiss[] = _( + "Fordert Kuss mit bösem\n" + "Blick. Evtl. Schlaf."); + +static const u8 MoveDescription_SkyAttack[] = _( + "Sucht nach Schwächen,\n" + "Treffer nächste Runde."); + +static const u8 MoveDescription_Transform[] = _( + "Ändert die Anwenderzellen\n" + "für ein Ebenbild d. Gegners."); + +static const u8 MoveDescription_Bubble[] = _( + "Angriff mit Blasen. INIT.-\n" + "Wert wird evtl. gesenkt."); + +static const u8 MoveDescription_DizzyPunch[] = _( + "Rhythmischer Schlag, der\n" + "den Gegner verwirren kann."); + +static const u8 MoveDescription_Spore[] = _( + "Erzeugt eine Wolke aus ein-\n" + "schläfernden Sporen."); + +static const u8 MoveDescription_Flash[] = _( + "Erzeugt helles Licht, das\n" + "gegn. Genauigkeit senkt."); + +static const u8 MoveDescription_Psywave[] = _( + "Psycho-Welle mit unter-\n" + "schiedlicher Intensität."); + +static const u8 MoveDescription_Splash[] = _( + "Nur ein Platscher..., der\n" + "überhaupt nichts bewirkt."); + +static const u8 MoveDescription_AcidArmor[] = _( + "Verflüssigt Körper d. An-\n" + "wenders. Erhört VERT."); + +static const u8 MoveDescription_Crabhammer[] = _( + "Schlägt mit Schere zu.\n" + "Volltrefferchance hoch."); + +static const u8 MoveDescription_Explosion[] = _( + "Richtet großen Schaden an.\n" + "Anwender wird besiegt."); + +static const u8 MoveDescription_FurySwipes[] = _( + "Beharkt Gegner 2 - 5-mal\n" + "mit scharfen Klauen o. ä."); + +static const u8 MoveDescription_Bonemerang[] = _( + "Ein Bumerang aus Knochen,\n" + "der zweimal trifft."); + +static const u8 MoveDescription_Rest[] = _( + "Anwender schläft 2 Runden,\n" + "KP und Status erneuert."); + +static const u8 MoveDescription_RockSlide[] = _( + "Schleudert riesige Felsen.\n" + "Verschreckt evtl. Gegner."); + +static const u8 MoveDescription_HyperFang[] = _( + "Angriff mit Zähnen.\n" + "Verschreckt evtl. Gegner."); + +static const u8 MoveDescription_Sharpen[] = _( + "Reduziert Polygonzahl und\n" + "erhöht ANGR.-Wert."); + +static const u8 MoveDescription_Conversion[] = _( + "Wandelt Typ d. Anwenders in\n" + "eigenen Attacken-Typ."); + +static const u8 MoveDescription_TriAttack[] = _( + "Feuert 3 Arten von Strahlen\n" + "gleichzeitig ab."); + +static const u8 MoveDescription_SuperFang[] = _( + "Greift mit scharfen Zähnen\n" + "an. Halbiert gegnerische KP."); + +static const u8 MoveDescription_Slash[] = _( + "Hieb mit Klauen o. ä. Hohe\n" + "Volltrefferquote."); + +static const u8 MoveDescription_Substitute[] = _( + "Lockvogel, der 1/4 der max.\n" + "KP des Anwenders besitzt."); + +static const u8 MoveDescription_Struggle[] = _( + "Einsatz nur bei verbrauch-\n" + "ten AP. Selbstschädigung!"); + +static const u8 MoveDescription_Sketch[] = _( + "Kopiert stets den zuletzt\n" + "erlittenen Angriff."); + +static const u8 MoveDescription_TripleKick[] = _( + "Tritt Gegner 3-mal nach-\n" + "einander. Härte nimmt zu."); + +static const u8 MoveDescription_Thief[] = _( + "Kann das vom Gegner\n" + "gehaltene Item stehlen."); + +static const u8 MoveDescription_SpiderWeb[] = _( + "Wickelt Gegner ein. Flucht \n" + "oder Tausch unmöglich."); + +static const u8 MoveDescription_MindReader[] = _( + "Ahnt gegnerische Aktion.\n" + "Nächste Attacke trifft."); + +static const u8 MoveDescription_Nightmare[] = _( + "Bewirkt 1/4 Schaden pro\n" + "Zug bei schlafendem Gegner."); + +static const u8 MoveDescription_FlameWheel[] = _( + "Feuer-Attacke, die Gegner\n" + "evtl. verbrennt."); + +static const u8 MoveDescription_Snore[] = _( + "Laute Attacke. Kann nur im\n" + "Schlaf benutzt werden."); + +static const u8 MoveDescription_Curse[] = _( + "Ein Angriff, der bei GEIST-\n" + "PKMN anders funktioniert."); + +static const u8 MoveDescription_Flail[] = _( + "Richtet mehr Schaden an,\n" + "wenn eigene KP niedrig sind."); + +static const u8 MoveDescription_Conversion2[] = _( + "Anwender wird resistent\n" + "gegen letzten Angr.-Typ."); + +static const u8 MoveDescription_Aeroblast[] = _( + "Erzeugt ein Vakuum.\n" + "Hohe Volltrefferquote."); + +static const u8 MoveDescription_CottonSpore[] = _( + "Sporen heften sich an den\n" + "Gegner. Senkt INIT.-Wert."); + +static const u8 MoveDescription_Reversal[] = _( + "Richtet mehr Schaden an,\n" + "wenn eigene KP niedrig sind."); + +static const u8 MoveDescription_Spite[] = _( + "AP des letzten gegner.\n" + "Angriffs werden gesenkt."); + +static const u8 MoveDescription_PowderSnow[] = _( + "Schnee auf Gegner, der\n" + "evtl. eingefroren wird."); + +static const u8 MoveDescription_Protect[] = _( + "Weicht Angriff aus.\n" + "Scheitert evtl. bei Wdh."); + +static const u8 MoveDescription_MachPunch[] = _( + "Schneller Hieb, der stets\n" + "zuerst trifft."); + +static const u8 MoveDescription_ScaryFace[] = _( + "Erschreckt mit Grimasse. \n" + "INIT.-Wert sinkt deutlich."); + +static const u8 MoveDescription_FaintAttack[] = _( + "Zieht Gegner heran und\n" + "trifft mit Sicherheit."); + +static const u8 MoveDescription_SweetKiss[] = _( + "Fordert Kuss mit süßem\n" + "Blick. Verwirrt Gegner evtl."); + +static const u8 MoveDescription_BellyDrum[] = _( + "Erhöht ANGR.-Wert,\n" + "opfert jedoch KP."); + +static const u8 MoveDescription_SludgeBomb[] = _( + "Wirft Schlamm auf Gegner\n" + "und vergiftet ihn evtl."); + +static const u8 MoveDescription_MudSlap[] = _( + "Wirft Gegner Matsch ins Ge-\n" + "sicht. Genauigkeit sinkt."); + +static const u8 MoveDescription_Octazooka[] = _( + "Verschießt Tinte und senkt\n" + "dadurch Genauigkeit."); + +static const u8 MoveDescription_Spikes[] = _( + "Richtet bei Tausch Schaden\n" + "mit Stacheln an."); + +static const u8 MoveDescription_ZapCannon[] = _( + "Kräftige, ungenaue At-\n" + "tacke, die evtl. paralysiert."); + +static const u8 MoveDescription_Foresight[] = _( + "Verhindert Anstieg von\n" + "gegnerischem Fluchtwert."); + +static const u8 MoveDescription_DestinyBond[] = _( + "Wird der Angreifer besiegt,\n" + "gilt das auch für d. Gegner."); + +static const u8 MoveDescription_PerishSong[] = _( + "Wer dieses Lied hört, wird\n" + "nach 3 Runden besiegt."); + +static const u8 MoveDescription_IcyWind[] = _( + "Eis-Attacke, die den INIT.-\n" + "Wert des Gegners senkt."); + +static const u8 MoveDescription_Detect[] = _( + "Wendet Attacken ab, Erfolg\n" + "sinkt bei Wiederholung."); + +static const u8 MoveDescription_BoneRush[] = _( + "Greift Gegner 2 - 5-mal in\n" + "Folge mit einem Knochen an."); + +static const u8 MoveDescription_LockOn[] = _( + "Visiert Gegner an u. trifft\n" + "in der nächsten Runde."); + +static const u8 MoveDescription_Outrage[] = _( + "Wiederholt Angriff 2-3 Run-\n" + "den lang. Verwirrt Anwender."); + +static const u8 MoveDescription_Sandstorm[] = _( + "Erzeugt einen Sandsturm,\n" + "der mehrere Runden wütet."); + +static const u8 MoveDescription_GigaDrain[] = _( + "Absorbiert die Hälfte des\n" + "angerichteten Schadens."); + +static const u8 MoveDescription_Endure[] = _( + "Hält jeder Attacke 1 Runde\n" + "stand. 1 KP bleibt stets."); + +static const u8 MoveDescription_Charm[] = _( + "Betört den Gegner u. redu-\n" + "ziert seinen ANGR. deutlich."); + +static const u8 MoveDescription_Rollout[] = _( + "Attacke, die 5 Runden\n" + "dauert. Die Härte nimmt zu."); + +static const u8 MoveDescription_FalseSwipe[] = _( + "Ein Angriff, der dem Gegner\n" + "zumindest 1 KP lässt."); + +static const u8 MoveDescription_Swagger[] = _( + "Verwirrt den Gegner und\n" + "erhöht ANGR.-Wert deutlich."); + +static const u8 MoveDescription_MilkDrink[] = _( + "Füllt bis zur Hälfte der max.\n" + "KP des Benutzers auf."); + +static const u8 MoveDescription_Spark[] = _( + "Elektro-Hieb, der Gegner\n" + "paralysieren kann."); + +static const u8 MoveDescription_FuryCutter[] = _( + "Eine Attacke, deren Härte\n" + "bei jedem Treffer zunimmt."); + +static const u8 MoveDescription_SteelWing[] = _( + "Trifft den Gegner hart mit\n" + "ausgebreiteten Flügeln."); + +static const u8 MoveDescription_MeanLook[] = _( + "Böser Blick, der die Flucht\n" + "des Gegners vereitelt."); + +static const u8 MoveDescription_Attract[] = _( + "Angriff des anderen Ge-\n" + "schlechts unwahrscheinl."); + +static const u8 MoveDescription_SleepTalk[] = _( + "Benutzt per Zufall eine\n" + "Attacke im Schlaf."); + +static const u8 MoveDescription_HealBell[] = _( + "Läutet beruhigend, heilt\n" + "alle Status-Veränderungen."); + +static const u8 MoveDescription_Return[] = _( + "Angriff, dessen Kraft bei \n" + "Freundschaft größer wird."); + +static const u8 MoveDescription_Present[] = _( + "Eine Bombe als Geschenk. Es\n" + "kann KP wiederherstellen."); + +static const u8 MoveDescription_Frustration[] = _( + "Die Attacke ist stärker bei\n" + "verhassten TRAINERn."); + +static const u8 MoveDescription_Safeguard[] = _( + "Mystische Kraft, die alle\n" + "Statusprobleme verhindert."); + +static const u8 MoveDescription_PainSplit[] = _( + "Addiert KP v. Anwender u.\n" + "Gegner, teilt gerecht auf."); + +static const u8 MoveDescription_SacredFire[] = _( + "Mystische Feuer-Attacke, \n" + "die d. Geg. evtl. verbrennt."); + +static const u8 MoveDescription_Magnitude[] = _( + "Ein erdbebenartiger An-\n" + "griff von zufälliger Stärke."); + +static const u8 MoveDescription_DynamicPunch[] = _( + "Kräftige Attacke, die ver-\n" + "wirrt, aber ungenau ist."); + +static const u8 MoveDescription_Megahorn[] = _( + "Brutaler Frontalangriff\n" + "mit spitzen Hörnern."); + +static const u8 MoveDescription_DragonBreath[] = _( + "Fegt den Gegner mit zer-\n" + "störerisch heißem Atem weg."); + +static const u8 MoveDescription_BatonPass[] = _( + "Tauscht PKMN aus. Alle Än-\n" + "derungen bleiben bestehen."); + +static const u8 MoveDescription_Encore[] = _( + "Gegner wiederholt letzten\n" + "Angriff 2 - 6-mal."); + +static const u8 MoveDescription_Pursuit[] = _( + "Richtet großen Schaden bei\n" + "Austausch des Gegners an."); + +static const u8 MoveDescription_RapidSpin[] = _( + "Trifft den Gegner durch\n" + "Drehen mit max. Tempo."); + +static const u8 MoveDescription_SweetScent[] = _( + "Lockt Gegner an und senkt\n" + "seinen Fluchtwert."); + +static const u8 MoveDescription_IronTail[] = _( + "Att. mit hartem Schweif. \n" + "Senkt evtl. VERT.-Wert."); + +static const u8 MoveDescription_MetalClaw[] = _( + "Klauen-Attacke. Evtl. Er-\n" + "höhung d. ANGR.-Wert d. Anw."); + +static const u8 MoveDescription_VitalThrow[] = _( + "Attacke stets gleich, aber\n" + "mit Treffergarantie."); + +static const u8 MoveDescription_MorningSun[] = _( + "Füllt KP auf. Die Menge\n" + "hängt vom Wetter ab."); + +static const u8 MoveDescription_Synthesis[] = _( + "Füllt KP auf. Die Menge\n" + "hängt vom Wetter ab."); + +static const u8 MoveDescription_Moonlight[] = _( + "Füllt KP auf. Die Menge\n" + "hängt vom Wetter ab."); + +static const u8 MoveDescription_HiddenPower[] = _( + "Die Wirkung dieser Attacke\n" + "hängt vom Benutzer ab."); + +static const u8 MoveDescription_CrossChop[] = _( + "Doppelter Hieb. Hohe \n" + "Volltrefferquote."); + +static const u8 MoveDescription_Twister[] = _( + "Trifft Gegner mit\n" + "heftigem Wirbelsturm."); + +static const u8 MoveDescription_RainDance[] = _( + "Erhöht Stärke von WASSER-\n" + "Attacken 5 Runden lang."); + +static const u8 MoveDescription_SunnyDay[] = _( + "Erhöht Stärke von FEUER-\n" + "Attacken 5 Runden lang."); + +static const u8 MoveDescription_Crunch[] = _( + "Beißt mit Reißzähnen zu und\n" + "senkt evtl. SPEZ. VERT."); + +static const u8 MoveDescription_MirrorCoat[] = _( + "Kontert d. Spezial-Attacke\n" + "d. Geg. mit 2-facher Kraft."); + +static const u8 MoveDescription_PsychUp[] = _( + "Kopiert Effekte d. Gegners\n" + "u. gibt sie dem Angreifer."); + +static const u8 MoveDescription_ExtremeSpeed[] = _( + "Extrem schnelle und kraft-\n" + "volle Attacke."); + +static const u8 MoveDescription_AncientPower[] = _( + "Ein Angriff, der alle\n" + "Status-Werte erhöhen kann."); + +static const u8 MoveDescription_ShadowBall[] = _( + "Bewirft Gegner und senkt\n" + "evtl. SPEZ. VERT."); + +static const u8 MoveDescription_FutureSight[] = _( + "Stärkt innere Kraft. Trifft\n" + "2 Runden später."); + +static const u8 MoveDescription_RockSmash[] = _( + "Zertrümmernder Angriff, \n" + "der evtl. VERT.-Wert senkt."); + +static const u8 MoveDescription_Whirlpool[] = _( + "Hält Gegner 2-5 Züge in\n" + "einem Strudel gefangen."); + +static const u8 MoveDescription_BeatUp[] = _( + "Ruft POKéMON hinzu, um an\n" + "dem Angriff teilzuhaben."); + +static const u8 MoveDescription_FakeOut[] = _( + "Trifft schon mit dem ersten\n" + "Schlag. Verjagt Gegner evtl."); + +static const u8 MoveDescription_Uproar[] = _( + "Erzeugt für 2-5 Züge einen\n" + "Aufruhr. Verhindert Schlaf."); + +static const u8 MoveDescription_Stockpile[] = _( + "Lädt Kraft für bis zu 3\n" + "Runden auf."); + +static const u8 MoveDescription_SpitUp[] = _( + "Entlädt gehortete Kraft.\n" + "Je mehr, desto besser."); + +static const u8 MoveDescription_Swallow[] = _( + "Absorbiert gehortete\n" + "Kraft. Stellt KP wieder her."); + +static const u8 MoveDescription_HeatWave[] = _( + "Gegner wird von heißem Atem\n" + "getroffen. Verbrennt evtl."); + +static const u8 MoveDescription_Hail[] = _( + "Erzeugt Hagelsturm, der in\n" + "jeder Runde trifft."); + +static const u8 MoveDescription_Torment[] = _( + "Quält Gegner u. verhindert\n" + "Wdh. eines Angriffs."); + +static const u8 MoveDescription_Flatter[] = _( + "Verwirrt den Gegner, erhöht\n" + "aber dessen SPEZ. ANGR."); + +static const u8 MoveDescription_WillOWisp[] = _( + "Fügt dem Gegner \n" + "Verbrennungen zu."); + +static const u8 MoveDescription_Memento[] = _( + "Der Benutzer ist besiegt\n" + "und senkt die gegn. Werte."); + +static const u8 MoveDescription_Facade[] = _( + "Erhöht ANGR. nach Verbren-\n" + "nung, Paralyse o. Vergift."); + +static const u8 MoveDescription_FocusPunch[] = _( + "Angriff, der später trifft.\n" + "Ben. schreckt evtl. zurück."); + +static const u8 MoveDescription_SmellingSalt[] = _( + "Effektiv geg. paralysierte\n" + "Gegner. Heilt sie aber auch."); + +static const u8 MoveDescription_FollowMe[] = _( + "Zieht Aufmerksamkeit an.\n" + "Gegner greift nur Anw. an."); + +static const u8 MoveDescription_NaturePower[] = _( + "Die Elementklasse des\n" + "Angriffs hängt vom Ort ab."); + +static const u8 MoveDescription_Charge[] = _( + "Lädt Energie für den kom-\n" + "menden Elektro-Angr. auf."); + +static const u8 MoveDescription_Taunt[] = _( + "Legt den Gegner rein. Er\n" + "benutzt nur noch Angriffe."); + +static const u8 MoveDescription_HelpingHand[] = _( + "Steigert die Kraft der An-\n" + "griffe des Getroffenen."); + +static const u8 MoveDescription_Trick[] = _( + "Betrügt beim Handel\n" + "mit Gegenständen."); + +static const u8 MoveDescription_RolePlay[] = _( + "Parodiert Gegner u. kopiert\n" + "seine Spezialfähigkeiten."); + +static const u8 MoveDescription_Wish[] = _( + "Ein Wunsch, der KP auffüllt.\n" + "Die Erfüllung braucht Zeit."); + +static const u8 MoveDescription_Assist[] = _( + "Greift zufällig mit einem\n" + "Angriff d. Partners an."); + +static const u8 MoveDescription_Ingrain[] = _( + "Verwurzelung füllt KP auf.\n" + "Austausch unmöglich."); + +static const u8 MoveDescription_Superpower[] = _( + "Steigert Stärke deutlich,\n" + "senkt aber Status-Werte."); + +static const u8 MoveDescription_MagicCoat[] = _( + "Gibt Spezialeffekte zurück\n" + "an Benutzer."); + +static const u8 MoveDescription_Recycle[] = _( + "Recycling eines\n" + "verwendeten Items."); + +static const u8 MoveDescription_Revenge[] = _( + "Attacke wird stärker, wenn\n" + "Anwender Schaden nimmt."); + +static const u8 MoveDescription_BrickBreak[] = _( + "Durchbricht Barrieren und\n" + "verursacht Schaden."); + +static const u8 MoveDescription_Yawn[] = _( + "Gegner gähnt und schläft\n" + "in der nächsten Runde ein."); + +static const u8 MoveDescription_KnockOff[] = _( + "Schlägt Gegner Item weg.\n" + "Vereitelt so den Gebrauch."); + +static const u8 MoveDescription_Endeavor[] = _( + "Wird stärker, wenn Anw.-KP\n" + "geringer als Gegner-KP ist."); + +static const u8 MoveDescription_Eruption[] = _( + "Je höher KP des Benutzers,\n" + "desto mehr Schaden."); + +static const u8 MoveDescription_SkillSwap[] = _( + "Anw. tauscht Spezial-\n" + "fähigkeit mit POKéMON."); + +static const u8 MoveDescription_Imprison[] = _( + "Hindert Gegner an Atta-\n" + "cken, die d. Benutzer kennt."); + +static const u8 MoveDescription_Refresh[] = _( + "Kuriert Vergiftungen, Para-\n" + "lyse und Verbrennung."); + +static const u8 MoveDescription_Grudge[] = _( + "Wenn Anw. bes., werden AP\n" + "der Finalattacke gelöscht."); + +static const u8 MoveDescription_Snatch[] = _( + "Immunität geg. den Effekt\n" + "d. nächsten gegn. Angriffs."); + +static const u8 MoveDescription_SecretPower[] = _( + "Angriff, dessen Auswirkung\n" + "abhängig vom Ort ist."); + +static const u8 MoveDescription_Dive[] = _( + "Taucht in der 1. Runde\n" + "unter u. trifft in der 2."); + +static const u8 MoveDescription_ArmThrust[] = _( + "Schläge mit geradem Arm, die\n" + "Gegner 2 - 5-mal treffen."); + +static const u8 MoveDescription_Camouflage[] = _( + "Die Elementklasse des\n" + "POKéMON hängt vom Ort ab."); + +static const u8 MoveDescription_TailGlow[] = _( + "Ein blinkendes Licht. SPEZ.\n" + "ANGR. wird deutlich erhöht."); + +static const u8 MoveDescription_LusterPurge[] = _( + "Angriff mit grellem Licht.\n" + "Senkt evtl. SPEZ. VERT."); + +static const u8 MoveDescription_MistBall[] = _( + "Angriff m. Daunengestöber,\n" + "Senkt evtl. SPEZ. ANGR."); + +static const u8 MoveDescription_FeatherDance[] = _( + "Hüllt Gegner in Daunen und\n" + "senkt ANGR.-Wert deutlich."); + +static const u8 MoveDescription_TeeterDance[] = _( + "Verwirrt alle POKéMON im \n" + "Kampf."); + +static const u8 MoveDescription_BlazeKick[] = _( + "Hohe Volltrefferquote. Ver-\n" + "ursacht evtl. Verbrennung."); + +static const u8 MoveDescription_MudSport[] = _( + "Bedeckt Anw. mit Lehm u. er-\n" + "höht Schutz geg. Elek.-Att."); + +static const u8 MoveDescription_IceBall[] = _( + "Angriff für 5 Runden. \n" + "Stärker, wenn Treffer."); + +static const u8 MoveDescription_NeedleArm[] = _( + "Angriff mit dornigen Armen. \n" + "Geg. schreckt evtl. zurück."); + +static const u8 MoveDescription_SlackOff[] = _( + "Durch Müßiggang wird die\n" + "Hälfte d. max. KP aufgefüllt."); + +static const u8 MoveDescription_HyperVoice[] = _( + "Laute Attacke mit Schall-\n" + "wellen."); + +static const u8 MoveDescription_PoisonFang[] = _( + "Angriff mit Reißzähnen. \n" + "Gegner wird evtl. vergiftet."); + +static const u8 MoveDescription_CrushClaw[] = _( + "Angriff mit scharfen Klau-\n" + "en. Senkt evtl. VERT.-Wert."); + +static const u8 MoveDescription_BlastBurn[] = _( + "Starker Angriff. Angreifer\n" + "muss eine Runde aussetzen."); + +static const u8 MoveDescription_HydroCannon[] = _( + "Starker Angriff. Angreifer\n" + "muss eine Runde aussetzen."); + +static const u8 MoveDescription_MeteorMash[] = _( + "Ein Schlag wie ein Meteor.\n" + "Erhöht evtl. ANGR.-Wert."); + +static const u8 MoveDescription_Astonish[] = _( + "Angriff, der Gegner evtl.\n" + "zurückschrecken lässt."); + +static const u8 MoveDescription_WeatherBall[] = _( + "Elementkl. u. Stärke der At-\n" + "tacke sind wetterabhängig."); + +static const u8 MoveDescription_Aromatherapy[] = _( + "Heilt alle Status-Probleme\n" + "mit beruhigendem Duft."); + +static const u8 MoveDescription_FakeTears[] = _( + "Täuscht Weinen vor, um\n" + "gegn. SPEZ. VERT. zu senken."); + +static const u8 MoveDescription_AirCutter[] = _( + "Greift mit heftigem Wind an.\n" + "Hohe Volltrefferquote."); + +static const u8 MoveDescription_Overheat[] = _( + "Angriff mit voller Kraft.\n" + "SPEZ. ANGR. sinkt deutlich."); + +static const u8 MoveDescription_OdorSleuth[] = _( + "Hindert Gegner daran, ihren\n" + "Fluchtwert zu erhöhen."); + +static const u8 MoveDescription_RockTomb[] = _( + "Hält den Feind mit Steinen\n" + "auf u. senkt INIT.-Wert."); + +static const u8 MoveDescription_SilverWind[] = _( + "Pulver-Attacke, die evtl.\n" + "die Werte erhöht."); + +static const u8 MoveDescription_MetalSound[] = _( + "Stößt einen spitzen Schrei\n" + "aus. Senkt SPEZ. VERT."); + +static const u8 MoveDescription_GrassWhistle[] = _( + "Versetzt Gegner mit schö-\n" + "ner Melodie in den Schlaf."); + +static const u8 MoveDescription_Tickle[] = _( + "Bringt Gegner zum Lachen.\n" + "ANGR. u. VERT. sinken."); + +static const u8 MoveDescription_CosmicPower[] = _( + "Erhöht VERT. u. SPEZ. VERT.\n" + "durch mystische Kraft."); + +static const u8 MoveDescription_WaterSpout[] = _( + "Ist wirkungsvoller, wenn KP\n" + "des Benutzers hoch sind."); + +static const u8 MoveDescription_SignalBeam[] = _( + "Seltsame Strahlenattacke.\n" + "Verwirrt evtl. den Gegner."); + +static const u8 MoveDescription_ShadowPunch[] = _( + "Schattenhieb. Ausweichen\n" + "unmöglich."); + +static const u8 MoveDescription_Extrasensory[] = _( + "Besonderer Angriff. Gegner\n" + "schreckt evtl. zurück."); + +static const u8 MoveDescription_SkyUppercut[] = _( + "Kinnhaken, als würde man in\n" + "die Luft springen."); + +static const u8 MoveDescription_SandTomb[] = _( + "Gegner leidet für 2-5\n" + "Runden in Sandhose."); + +static const u8 MoveDescription_SheerCold[] = _( + "Eis-Attacke. Besiegt den\n" + "Gegner, wenn sie trifft."); + +static const u8 MoveDescription_MuddyWater[] = _( + "Greift mit Matsch an und\n" + "senkt evtl. Genauigkeit."); + +static const u8 MoveDescription_BulletSeed[] = _( + "Verschießt 2 bis 5 Samen\n" + "gleichzeitig auf Gegner."); + +static const u8 MoveDescription_AerialAce[] = _( + "Eine extrem schnelle und\n" + "unausweichbare Attacke."); + +static const u8 MoveDescription_IcicleSpear[] = _( + "Feuert 2-5 Eiszapfen auf\n" + "den Gegner."); + +static const u8 MoveDescription_IronDefense[] = _( + "Stärkt den Körper.\n" + "Erhöht VERT.-Wert deutlich."); + +static const u8 MoveDescription_Block[] = _( + "Versperrt den Fluchtweg\n" + "des Gegners."); + +static const u8 MoveDescription_Howl[] = _( + "Jault, um in sich zu gehen.\n" + "Erhöht ANGR.-Wert."); + +static const u8 MoveDescription_DragonClaw[] = _( + "Der Gegner wird mit\n" + "scharfen Klauen verletzt."); + +static const u8 MoveDescription_FrenzyPlant[] = _( + "Starker Angriff. Angreifer\n" + "muss eine Runde aussetzen."); + +static const u8 MoveDescription_BulkUp[] = _( + "Pumpt den Körper auf. ANGR.\n" + "u. VERT. werden erhöht."); + +static const u8 MoveDescription_Bounce[] = _( + "Springt hoch u. landet in\n" + "nächstem Zug. Evtl. Para."); + +static const u8 MoveDescription_MudShot[] = _( + "Bewirft den Gegner mit Lehm\n" + "und senkt INIT.-Wert."); + +static const u8 MoveDescription_PoisonTail[] = _( + "Hohe Volltrefferquote.\n" + "Gegner evtl. vergiftet."); + +static const u8 MoveDescription_Covet[] = _( + "Bittet charmant um das ge-\n" + "haltene Item des Gegners."); + +static const u8 MoveDescription_VoltTackle[] = _( + "Lebensgefährliche Attacke,\n" + "leichte Selbstschädigung."); + +static const u8 MoveDescription_MagicalLeaf[] = _( + "Magischer Blattangriff.\n" + "Ausweichen unmöglich."); + +static const u8 MoveDescription_WaterSport[] = _( + "Benutzer wird nass, so dass\n" + "er Feuer besser standhält."); + +static const u8 MoveDescription_CalmMind[] = _( + "Erhöht SPEZ. ANGR. u. SPEZ.\n" + "VERT. durch Konzentration."); + +static const u8 MoveDescription_LeafBlade[] = _( + "Hieb mit scharfkantigem\n" + "Blatt. Hohe Volltrefferqu."); + +static const u8 MoveDescription_DragonDance[] = _( + "Ein mystischer Tanz, der\n" + "ANGR.- u. INIT.-Wert erhöht."); + +static const u8 MoveDescription_RockBlast[] = _( + "Wirft 2 - 5-mal in Folge\n" + "Felsblöcke auf den Gegner."); + +static const u8 MoveDescription_ShockWave[] = _( + "Schnelle Elektro-Attacke\n" + "mit Treffergarantie."); + +static const u8 MoveDescription_WaterPulse[] = _( + "Ultraschallwellen, die den\n" + "Gegner verwirren können."); + +static const u8 MoveDescription_DoomDesire[] = _( + "Speichert Sonnenenergie.\n" + "Angriff 2 Runden später."); + +static const u8 MoveDescription_PsychoBoost[] = _( + "Angriff mit voller Kraft.\n" + "SPEZ. ANGR. sinkt deutlich."); + +const u8 * const gMoveDescriptions[] = { + MoveDescription_Pound, + MoveDescription_KarateChop, + MoveDescription_DoubleSlap, + MoveDescription_CometPunch, + MoveDescription_MegaPunch, + MoveDescription_PayDay, + MoveDescription_FirePunch, + MoveDescription_IcePunch, + MoveDescription_ThunderPunch, + MoveDescription_Scratch, + MoveDescription_ViceGrip, + MoveDescription_Guillotine, + MoveDescription_RazorWind, + MoveDescription_SwordsDance, + MoveDescription_Cut, + MoveDescription_Gust, + MoveDescription_WingAttack, + MoveDescription_Whirlwind, + MoveDescription_Fly, + MoveDescription_Bind, + MoveDescription_Slam, + MoveDescription_VineWhip, + MoveDescription_Stomp, + MoveDescription_DoubleKick, + MoveDescription_MegaKick, + MoveDescription_JumpKick, + MoveDescription_RollingKick, + MoveDescription_SandAttack, + MoveDescription_Headbutt, + MoveDescription_HornAttack, + MoveDescription_FuryAttack, + MoveDescription_HornDrill, + MoveDescription_Tackle, + MoveDescription_BodySlam, + MoveDescription_Wrap, + MoveDescription_TakeDown, + MoveDescription_Thrash, + MoveDescription_DoubleEdge, + MoveDescription_TailWhip, + MoveDescription_PoisonSting, + MoveDescription_Twineedle, + MoveDescription_PinMissile, + MoveDescription_Leer, + MoveDescription_Bite, + MoveDescription_Growl, + MoveDescription_Roar, + MoveDescription_Sing, + MoveDescription_Supersonic, + MoveDescription_SonicBoom, + MoveDescription_Disable, + MoveDescription_Acid, + MoveDescription_Ember, + MoveDescription_Flamethrower, + MoveDescription_Mist, + MoveDescription_WaterGun, + MoveDescription_HydroPump, + MoveDescription_Surf, + MoveDescription_IceBeam, + MoveDescription_Blizzard, + MoveDescription_Psybeam, + MoveDescription_BubbleBeam, + MoveDescription_AuroraBeam, + MoveDescription_HyperBeam, + MoveDescription_Peck, + MoveDescription_DrillPeck, + MoveDescription_Submission, + MoveDescription_LowKick, + MoveDescription_Counter, + MoveDescription_SeismicToss, + MoveDescription_Strength, + MoveDescription_Absorb, + MoveDescription_MegaDrain, + MoveDescription_LeechSeed, + MoveDescription_Growth, + MoveDescription_RazorLeaf, + MoveDescription_SolarBeam, + MoveDescription_PoisonPowder, + MoveDescription_StunSpore, + MoveDescription_SleepPowder, + MoveDescription_PetalDance, + MoveDescription_StringShot, + MoveDescription_DragonRage, + MoveDescription_FireSpin, + MoveDescription_ThunderShock, + MoveDescription_Thunderbolt, + MoveDescription_ThunderWave, + MoveDescription_Thunder, + MoveDescription_RockThrow, + MoveDescription_Earthquake, + MoveDescription_Fissure, + MoveDescription_Dig, + MoveDescription_Toxic, + MoveDescription_Confusion, + MoveDescription_Psychic, + MoveDescription_Hypnosis, + MoveDescription_Meditate, + MoveDescription_Agility, + MoveDescription_QuickAttack, + MoveDescription_Rage, + MoveDescription_Teleport, + MoveDescription_NightShade, + MoveDescription_Mimic, + MoveDescription_Screech, + MoveDescription_DoubleTeam, + MoveDescription_Recover, + MoveDescription_Harden, + MoveDescription_Minimize, + MoveDescription_Smokescreen, + MoveDescription_ConfuseRay, + MoveDescription_Withdraw, + MoveDescription_DefenseCurl, + MoveDescription_Barrier, + MoveDescription_LightScreen, + MoveDescription_Haze, + MoveDescription_Reflect, + MoveDescription_FocusEnergy, + MoveDescription_Bide, + MoveDescription_Metronome, + MoveDescription_MirrorMove, + MoveDescription_SelfDestruct, + MoveDescription_EggBomb, + MoveDescription_Lick, + MoveDescription_Smog, + MoveDescription_Sludge, + MoveDescription_BoneClub, + MoveDescription_FireBlast, + MoveDescription_Waterfall, + MoveDescription_Clamp, + MoveDescription_Swift, + MoveDescription_SkullBash, + MoveDescription_SpikeCannon, + MoveDescription_Constrict, + MoveDescription_Amnesia, + MoveDescription_Kinesis, + MoveDescription_SoftBoiled, + MoveDescription_HiJumpKick, + MoveDescription_Glare, + MoveDescription_DreamEater, + MoveDescription_PoisonGas, + MoveDescription_Barrage, + MoveDescription_LeechLife, + MoveDescription_LovelyKiss, + MoveDescription_SkyAttack, + MoveDescription_Transform, + MoveDescription_Bubble, + MoveDescription_DizzyPunch, + MoveDescription_Spore, + MoveDescription_Flash, + MoveDescription_Psywave, + MoveDescription_Splash, + MoveDescription_AcidArmor, + MoveDescription_Crabhammer, + MoveDescription_Explosion, + MoveDescription_FurySwipes, + MoveDescription_Bonemerang, + MoveDescription_Rest, + MoveDescription_RockSlide, + MoveDescription_HyperFang, + MoveDescription_Sharpen, + MoveDescription_Conversion, + MoveDescription_TriAttack, + MoveDescription_SuperFang, + MoveDescription_Slash, + MoveDescription_Substitute, + MoveDescription_Struggle, + MoveDescription_Sketch, + MoveDescription_TripleKick, + MoveDescription_Thief, + MoveDescription_SpiderWeb, + MoveDescription_MindReader, + MoveDescription_Nightmare, + MoveDescription_FlameWheel, + MoveDescription_Snore, + MoveDescription_Curse, + MoveDescription_Flail, + MoveDescription_Conversion2, + MoveDescription_Aeroblast, + MoveDescription_CottonSpore, + MoveDescription_Reversal, + MoveDescription_Spite, + MoveDescription_PowderSnow, + MoveDescription_Protect, + MoveDescription_MachPunch, + MoveDescription_ScaryFace, + MoveDescription_FaintAttack, + MoveDescription_SweetKiss, + MoveDescription_BellyDrum, + MoveDescription_SludgeBomb, + MoveDescription_MudSlap, + MoveDescription_Octazooka, + MoveDescription_Spikes, + MoveDescription_ZapCannon, + MoveDescription_Foresight, + MoveDescription_DestinyBond, + MoveDescription_PerishSong, + MoveDescription_IcyWind, + MoveDescription_Detect, + MoveDescription_BoneRush, + MoveDescription_LockOn, + MoveDescription_Outrage, + MoveDescription_Sandstorm, + MoveDescription_GigaDrain, + MoveDescription_Endure, + MoveDescription_Charm, + MoveDescription_Rollout, + MoveDescription_FalseSwipe, + MoveDescription_Swagger, + MoveDescription_MilkDrink, + MoveDescription_Spark, + MoveDescription_FuryCutter, + MoveDescription_SteelWing, + MoveDescription_MeanLook, + MoveDescription_Attract, + MoveDescription_SleepTalk, + MoveDescription_HealBell, + MoveDescription_Return, + MoveDescription_Present, + MoveDescription_Frustration, + MoveDescription_Safeguard, + MoveDescription_PainSplit, + MoveDescription_SacredFire, + MoveDescription_Magnitude, + MoveDescription_DynamicPunch, + MoveDescription_Megahorn, + MoveDescription_DragonBreath, + MoveDescription_BatonPass, + MoveDescription_Encore, + MoveDescription_Pursuit, + MoveDescription_RapidSpin, + MoveDescription_SweetScent, + MoveDescription_IronTail, + MoveDescription_MetalClaw, + MoveDescription_VitalThrow, + MoveDescription_MorningSun, + MoveDescription_Synthesis, + MoveDescription_Moonlight, + MoveDescription_HiddenPower, + MoveDescription_CrossChop, + MoveDescription_Twister, + MoveDescription_RainDance, + MoveDescription_SunnyDay, + MoveDescription_Crunch, + MoveDescription_MirrorCoat, + MoveDescription_PsychUp, + MoveDescription_ExtremeSpeed, + MoveDescription_AncientPower, + MoveDescription_ShadowBall, + MoveDescription_FutureSight, + MoveDescription_RockSmash, + MoveDescription_Whirlpool, + MoveDescription_BeatUp, + MoveDescription_FakeOut, + MoveDescription_Uproar, + MoveDescription_Stockpile, + MoveDescription_SpitUp, + MoveDescription_Swallow, + MoveDescription_HeatWave, + MoveDescription_Hail, + MoveDescription_Torment, + MoveDescription_Flatter, + MoveDescription_WillOWisp, + MoveDescription_Memento, + MoveDescription_Facade, + MoveDescription_FocusPunch, + MoveDescription_SmellingSalt, + MoveDescription_FollowMe, + MoveDescription_NaturePower, + MoveDescription_Charge, + MoveDescription_Taunt, + MoveDescription_HelpingHand, + MoveDescription_Trick, + MoveDescription_RolePlay, + MoveDescription_Wish, + MoveDescription_Assist, + MoveDescription_Ingrain, + MoveDescription_Superpower, + MoveDescription_MagicCoat, + MoveDescription_Recycle, + MoveDescription_Revenge, + MoveDescription_BrickBreak, + MoveDescription_Yawn, + MoveDescription_KnockOff, + MoveDescription_Endeavor, + MoveDescription_Eruption, + MoveDescription_SkillSwap, + MoveDescription_Imprison, + MoveDescription_Refresh, + MoveDescription_Grudge, + MoveDescription_Snatch, + MoveDescription_SecretPower, + MoveDescription_Dive, + MoveDescription_ArmThrust, + MoveDescription_Camouflage, + MoveDescription_TailGlow, + MoveDescription_LusterPurge, + MoveDescription_MistBall, + MoveDescription_FeatherDance, + MoveDescription_TeeterDance, + MoveDescription_BlazeKick, + MoveDescription_MudSport, + MoveDescription_IceBall, + MoveDescription_NeedleArm, + MoveDescription_SlackOff, + MoveDescription_HyperVoice, + MoveDescription_PoisonFang, + MoveDescription_CrushClaw, + MoveDescription_BlastBurn, + MoveDescription_HydroCannon, + MoveDescription_MeteorMash, + MoveDescription_Astonish, + MoveDescription_WeatherBall, + MoveDescription_Aromatherapy, + MoveDescription_FakeTears, + MoveDescription_AirCutter, + MoveDescription_Overheat, + MoveDescription_OdorSleuth, + MoveDescription_RockTomb, + MoveDescription_SilverWind, + MoveDescription_MetalSound, + MoveDescription_GrassWhistle, + MoveDescription_Tickle, + MoveDescription_CosmicPower, + MoveDescription_WaterSpout, + MoveDescription_SignalBeam, + MoveDescription_ShadowPunch, + MoveDescription_Extrasensory, + MoveDescription_SkyUppercut, + MoveDescription_SandTomb, + MoveDescription_SheerCold, + MoveDescription_MuddyWater, + MoveDescription_BulletSeed, + MoveDescription_AerialAce, + MoveDescription_IcicleSpear, + MoveDescription_IronDefense, + MoveDescription_Block, + MoveDescription_Howl, + MoveDescription_DragonClaw, + MoveDescription_FrenzyPlant, + MoveDescription_BulkUp, + MoveDescription_Bounce, + MoveDescription_MudShot, + MoveDescription_PoisonTail, + MoveDescription_Covet, + MoveDescription_VoltTackle, + MoveDescription_MagicalLeaf, + MoveDescription_WaterSport, + MoveDescription_CalmMind, + MoveDescription_LeafBlade, + MoveDescription_DragonDance, + MoveDescription_RockBlast, + MoveDescription_ShockWave, + MoveDescription_WaterPulse, + MoveDescription_DoomDesire, + MoveDescription_PsychoBoost, +}; diff --git a/src/data/text/move_descriptions_en.h b/src/data/text/move_descriptions_en.h new file mode 100644 index 000000000..3c3a961d1 --- /dev/null +++ b/src/data/text/move_descriptions_en.h @@ -0,0 +1,1772 @@ +static const u8 MoveDescription_Pound[] = _( + "Pounds the foe with\n" + "forelegs or tail."); + +static const u8 MoveDescription_KarateChop[] = _( + "A chopping attack with a\n" + "high critical-hit ratio."); + +static const u8 MoveDescription_DoubleSlap[] = _( + "Repeatedly slaps the foe\n" + "2 to 5 times."); + +static const u8 MoveDescription_CometPunch[] = _( + "Repeatedly punches the foe\n" + "2 to 5 times."); + +static const u8 MoveDescription_MegaPunch[] = _( + "A strong punch thrown with\n" + "incredible power."); + +static const u8 MoveDescription_PayDay[] = _( + "Throws coins at the foe.\n" + "Money is recovered after."); + +static const u8 MoveDescription_FirePunch[] = _( + "A fiery punch that may burn\n" + "the foe."); + +static const u8 MoveDescription_IcePunch[] = _( + "An icy punch that may\n" + "freeze the foe."); + +static const u8 MoveDescription_ThunderPunch[] = _( + "An electrified punch that\n" + "may paralyze the foe."); + +static const u8 MoveDescription_Scratch[] = _( + "Scratches the foe with\n" + "sharp claws."); + +static const u8 MoveDescription_ViceGrip[] = _( + "Grips the foe with large and\n" + "powerful pincers."); + +static const u8 MoveDescription_Guillotine[] = _( + "A powerful pincer attack\n" + "that may cause fainting."); + +static const u8 MoveDescription_RazorWind[] = _( + "A 2-turn move that strikes\n" + "the foe on the 2nd turn."); + +static const u8 MoveDescription_SwordsDance[] = _( + "A fighting dance that\n" + "sharply raises ATTACK."); + +static const u8 MoveDescription_Cut[] = _( + "Cuts the foe with sharp\n" + "scythes, claws, etc."); + +static const u8 MoveDescription_Gust[] = _( + "Strikes the foe with a gust\n" + "of wind whipped up by wings."); + +static const u8 MoveDescription_WingAttack[] = _( + "Strikes the foe with wings\n" + "spread wide."); + +static const u8 MoveDescription_Whirlwind[] = _( + "Blows away the foe with\n" + "wind and ends the battle."); + +static const u8 MoveDescription_Fly[] = _( + "Flies up on the first turn,\n" + "then strikes the next turn."); + +static const u8 MoveDescription_Bind[] = _( + "Binds and squeezes the foe\n" + "for 2 to 5 turns."); + +static const u8 MoveDescription_Slam[] = _( + "Slams the foe with a long\n" + "tail, vine, etc."); + +static const u8 MoveDescription_VineWhip[] = _( + "Strikes the foe with\n" + "slender, whiplike vines."); + +static const u8 MoveDescription_Stomp[] = _( + "Stomps the enemy with a big\n" + "foot. May cause flinching."); + +static const u8 MoveDescription_DoubleKick[] = _( + "A double-kicking attack\n" + "that strikes the foe twice."); + +static const u8 MoveDescription_MegaKick[] = _( + "An extremely powerful kick\n" + "with intense force."); + +static const u8 MoveDescription_JumpKick[] = _( + "A strong jumping kick. May\n" + "miss and hurt the kicker."); + +static const u8 MoveDescription_RollingKick[] = _( + "A fast kick delivered from\n" + "a rapid spin."); + +static const u8 MoveDescription_SandAttack[] = _( + "Reduces the foe’s accuracy\n" + "by hurling sand in its face."); + +static const u8 MoveDescription_Headbutt[] = _( + "A ramming attack that may\n" + "cause flinching."); + +static const u8 MoveDescription_HornAttack[] = _( + "Jabs the foe with sharp\n" + "horns."); + +static const u8 MoveDescription_FuryAttack[] = _( + "Jabs the foe 2 to 5 times\n" + "with sharp horns, etc."); + +static const u8 MoveDescription_HornDrill[] = _( + "A one-hit KO attack that\n" + "uses a horn like a drill."); + +static const u8 MoveDescription_Tackle[] = _( + "Charges the foe with a full-\n" + "body tackle."); + +static const u8 MoveDescription_BodySlam[] = _( + "A full-body slam that may\n" + "cause paralysis."); + +static const u8 MoveDescription_Wrap[] = _( + "Wraps and squeezes the foe\n" + "2 to 5 times with vines, etc."); + +static const u8 MoveDescription_TakeDown[] = _( + "A reckless charge attack\n" + "that also hurts the user."); + +static const u8 MoveDescription_Thrash[] = _( + "A rampage of 2 to 3 turns\n" + "that confuses the user."); + +static const u8 MoveDescription_DoubleEdge[] = _( + "A life-risking tackle that\n" + "also hurts the user."); + +static const u8 MoveDescription_TailWhip[] = _( + "Wags the tail to lower the\n" + "foe’s DEFENSE."); + +static const u8 MoveDescription_PoisonSting[] = _( + "A toxic attack with barbs,\n" + "etc., that may poison."); + +static const u8 MoveDescription_Twineedle[] = _( + "Stingers on the forelegs\n" + "jab the foe twice."); + +static const u8 MoveDescription_PinMissile[] = _( + "Sharp pins are fired to\n" + "strike 2 to 5 times."); + +static const u8 MoveDescription_Leer[] = _( + "Frightens the foe with a\n" + "leer to lower DEFENSE."); + +static const u8 MoveDescription_Bite[] = _( + "Bites with vicious fangs.\n" + "May cause flinching."); + +static const u8 MoveDescription_Growl[] = _( + "Growls cutely to reduce the\n" + "foe’s ATTACK."); + +static const u8 MoveDescription_Roar[] = _( + "Makes the foe flee to end\n" + "the battle."); + +static const u8 MoveDescription_Sing[] = _( + "A soothing song lulls the\n" + "foe into a deep slumber."); + +static const u8 MoveDescription_Supersonic[] = _( + "Emits bizarre sound waves\n" + "that may confuse the foe."); + +static const u8 MoveDescription_SonicBoom[] = _( + "Launches shock waves that\n" + "always inflict 20 HP damage."); + +static const u8 MoveDescription_Disable[] = _( + "Psychically disables one of\n" + "the foe’s moves."); + +static const u8 MoveDescription_Acid[] = _( + "Sprays a hide-melting acid.\n" + "May lower DEFENSE."); + +static const u8 MoveDescription_Ember[] = _( + "A weak fire attack that may\n" + "inflict a burn."); + +static const u8 MoveDescription_Flamethrower[] = _( + "A powerful fire attack that\n" + "may inflict a burn."); + +static const u8 MoveDescription_Mist[] = _( + "Creates a mist that stops\n" + "reduction of abilities."); + +static const u8 MoveDescription_WaterGun[] = _( + "Squirts water to attack\n" + "the foe."); + +static const u8 MoveDescription_HydroPump[] = _( + "Blasts water at high power\n" + "to strike the foe."); + +static const u8 MoveDescription_Surf[] = _( + "Creates a huge wave, then\n" + "crashes it down on the foe."); + +static const u8 MoveDescription_IceBeam[] = _( + "Blasts the foe with an icy\n" + "beam that may freeze it."); + +static const u8 MoveDescription_Blizzard[] = _( + "Hits the foe with an icy\n" + "storm that may freeze it."); + +static const u8 MoveDescription_Psybeam[] = _( + "Fires a peculiar ray that\n" + "may confuse the foe."); + +static const u8 MoveDescription_BubbleBeam[] = _( + "Forcefully sprays bubbles\n" + "that may lower SPEED."); + +static const u8 MoveDescription_AuroraBeam[] = _( + "Fires a rainbow-colored\n" + "beam that may lower ATTACK."); + +static const u8 MoveDescription_HyperBeam[] = _( + "Powerful, but leaves the\n" + "user immobile the next turn."); + +static const u8 MoveDescription_Peck[] = _( + "Attacks the foe with a\n" + "jabbing beak, etc."); + +static const u8 MoveDescription_DrillPeck[] = _( + "A corkscrewing attack with\n" + "the beak acting as a drill."); + +static const u8 MoveDescription_Submission[] = _( + "A reckless body slam that\n" + "also hurts the user."); + +static const u8 MoveDescription_LowKick[] = _( + "A kick that inflicts more\n" + "damage on heavier foes."); + +static const u8 MoveDescription_Counter[] = _( + "Retaliates any physical hit\n" + "with double the power."); + +static const u8 MoveDescription_SeismicToss[] = _( + "Inflicts damage identical\n" + "to the user’s level."); + +static const u8 MoveDescription_Strength[] = _( + "Builds enormous power,\n" + "then slams the foe."); + +static const u8 MoveDescription_Absorb[] = _( + "An attack that absorbs\n" + "half the damage inflicted."); + +static const u8 MoveDescription_MegaDrain[] = _( + "An attack that absorbs\n" + "half the damage inflicted."); + +static const u8 MoveDescription_LeechSeed[] = _( + "Plants a seed on the foe to\n" + "steal HP on every turn."); + +static const u8 MoveDescription_Growth[] = _( + "Forces the body to grow\n" + "and heightens SP. ATK."); + +static const u8 MoveDescription_RazorLeaf[] = _( + "Cuts the enemy with leaves.\n" + "High critical-hit ratio."); + +static const u8 MoveDescription_SolarBeam[] = _( + "Absorbs light in one turn,\n" + "then attacks next turn."); + +static const u8 MoveDescription_PoisonPowder[] = _( + "Scatters a toxic powder\n" + "that may poison the foe."); + +static const u8 MoveDescription_StunSpore[] = _( + "Scatters a powder that may\n" + "paralyze the foe."); + +static const u8 MoveDescription_SleepPowder[] = _( + "Scatters a powder that may\n" + "cause the foe to sleep."); + +static const u8 MoveDescription_PetalDance[] = _( + "A rampage of 2 to 3 turns\n" + "that confuses the user."); + +static const u8 MoveDescription_StringShot[] = _( + "Binds the foe with string\n" + "to reduce its SPEED."); + +static const u8 MoveDescription_DragonRage[] = _( + "Launches shock waves that\n" + "always inflict 40 HP damage."); + +static const u8 MoveDescription_FireSpin[] = _( + "Traps the foe in a ring of\n" + "fire for 2 to 5 turns."); + +static const u8 MoveDescription_ThunderShock[] = _( + "An electrical attack that\n" + "may paralyze the foe."); + +static const u8 MoveDescription_Thunderbolt[] = _( + "A strong electrical attack\n" + "that may paralyze the foe."); + +static const u8 MoveDescription_ThunderWave[] = _( + "A weak jolt of electricity\n" + "that paralyzes the foe."); + +static const u8 MoveDescription_Thunder[] = _( + "A lightning attack that may\n" + "cause paralysis."); + +static const u8 MoveDescription_RockThrow[] = _( + "Throws small rocks to\n" + "strike the foe."); + +static const u8 MoveDescription_Earthquake[] = _( + "A powerful quake, but has\n" + "no effect on flying foes."); + +static const u8 MoveDescription_Fissure[] = _( + "A one-hit KO move that\n" + "drops the foe in a fissure."); + +static const u8 MoveDescription_Dig[] = _( + "Digs underground the first\n" + "turn and strikes next turn."); + +static const u8 MoveDescription_Toxic[] = _( + "Poisons the foe with an\n" + "intensifying toxin."); + +static const u8 MoveDescription_Confusion[] = _( + "A psychic attack that may\n" + "cause confusion."); + +static const u8 MoveDescription_Psychic[] = _( + "A powerful psychic attack\n" + "that may lower SP. DEF."); + +static const u8 MoveDescription_Hypnosis[] = _( + "A hypnotizing move that\n" + "may induce sleep."); + +static const u8 MoveDescription_Meditate[] = _( + "Meditates in a peaceful\n" + "fashion to raise ATTACK."); + +static const u8 MoveDescription_Agility[] = _( + "Relaxes the body to sharply\n" + "boost SPEED."); + +static const u8 MoveDescription_QuickAttack[] = _( + "An extremely fast attack\n" + "that always strikes first."); + +static const u8 MoveDescription_Rage[] = _( + "Raises the user’s ATTACK\n" + "every time it is hit."); + +static const u8 MoveDescription_Teleport[] = _( + "A psychic move for fleeing\n" + "from battle instantly."); + +static const u8 MoveDescription_NightShade[] = _( + "Inflicts damage identical\n" + "to the user’s level."); + +static const u8 MoveDescription_Mimic[] = _( + "Copies a move used by the\n" + "foe during one battle."); + +static const u8 MoveDescription_Screech[] = _( + "Emits a screech to sharply\n" + "reduce the foe’s DEFENSE."); + +static const u8 MoveDescription_DoubleTeam[] = _( + "Creates illusory copies to\n" + "raise evasiveness."); + +static const u8 MoveDescription_Recover[] = _( + "Recovers up to half the\n" + "user’s maximum HP."); + +static const u8 MoveDescription_Harden[] = _( + "Stiffens the body’s \n" + "muscles to raise DEFENSE."); + +static const u8 MoveDescription_Minimize[] = _( + "Minimizes the user’s size\n" + "to raise evasiveness."); + +static const u8 MoveDescription_Smokescreen[] = _( + "Lowers the foe’s accuracy\n" + "using smoke, ink, etc."); + +static const u8 MoveDescription_ConfuseRay[] = _( + "A sinister ray that\n" + "confuses the foe."); + +static const u8 MoveDescription_Withdraw[] = _( + "Withdraws the body into its\n" + "hard shell to raise DEFENSE."); + +static const u8 MoveDescription_DefenseCurl[] = _( + "Curls up to conceal weak\n" + "spots and raise DEFENSE."); + +static const u8 MoveDescription_Barrier[] = _( + "Creates a barrier that\n" + "sharply raises DEFENSE."); + +static const u8 MoveDescription_LightScreen[] = _( + "Creates a wall of light that\n" + "lowers SP. ATK damage."); + +static const u8 MoveDescription_Haze[] = _( + "Creates a black haze that\n" + "eliminates all stat changes."); + +static const u8 MoveDescription_Reflect[] = _( + "Creates a wall of light that\n" + "weakens physical attacks."); + +static const u8 MoveDescription_FocusEnergy[] = _( + "Focuses power to raise the\n" + "critical-hit ratio."); + +static const u8 MoveDescription_Bide[] = _( + "Endures attack for 2\n" + "turns to retaliate double."); + +static const u8 MoveDescription_Metronome[] = _( + "Waggles a finger to use any\n" + "POKéMON move at random."); + +static const u8 MoveDescription_MirrorMove[] = _( + "Counters the foe’s attack\n" + "with the same move."); + +static const u8 MoveDescription_SelfDestruct[] = _( + "Inflicts severe damage but\n" + "makes the user faint."); + +static const u8 MoveDescription_EggBomb[] = _( + "An egg is forcibly hurled at\n" + "the foe."); + +static const u8 MoveDescription_Lick[] = _( + "Licks with a long tongue to\n" + "injure. May also paralyze."); + +static const u8 MoveDescription_Smog[] = _( + "An exhaust-gas attack\n" + "that may also poison."); + +static const u8 MoveDescription_Sludge[] = _( + "Sludge is hurled to inflict\n" + "damage. May also poison."); + +static const u8 MoveDescription_BoneClub[] = _( + "Clubs the foe with a bone.\n" + "May cause flinching."); + +static const u8 MoveDescription_FireBlast[] = _( + "A fiery blast that scorches\n" + "all. May cause a burn."); + +static const u8 MoveDescription_Waterfall[] = _( + "Charges the foe with speed\n" + "to climb waterfalls."); + +static const u8 MoveDescription_Clamp[] = _( + "Traps and squeezes the\n" + "foe for 2 to 5 turns."); + +static const u8 MoveDescription_Swift[] = _( + "Sprays star-shaped rays\n" + "that never miss."); + +static const u8 MoveDescription_SkullBash[] = _( + "Tucks in the head, then\n" + "attacks on the next turn."); + +static const u8 MoveDescription_SpikeCannon[] = _( + "Launches sharp spikes that\n" + "strike 2 to 5 times."); + +static const u8 MoveDescription_Constrict[] = _( + "Constricts to inflict pain.\n" + "May lower SPEED."); + +static const u8 MoveDescription_Amnesia[] = _( + "Forgets about something\n" + "and sharply raises SP. DEF."); + +static const u8 MoveDescription_Kinesis[] = _( + "Distracts the foe.\n" + "May lower accuracy."); + +static const u8 MoveDescription_SoftBoiled[] = _( + "Recovers up to half the\n" + "user’s maximum HP."); + +static const u8 MoveDescription_HiJumpKick[] = _( + "A jumping knee kick. If it\n" + "misses, the user is hurt."); + +static const u8 MoveDescription_Glare[] = _( + "Intimidates and frightens\n" + "the foe into paralysis."); + +static const u8 MoveDescription_DreamEater[] = _( + "Takes one half the damage\n" + "inflicted on a sleeping foe."); + +static const u8 MoveDescription_PoisonGas[] = _( + "Envelops the foe in a toxic\n" + "gas that may poison."); + +static const u8 MoveDescription_Barrage[] = _( + "Hurls round objects at the\n" + "foe 2 to 5 times."); + +static const u8 MoveDescription_LeechLife[] = _( + "An attack that steals half\n" + "the damage inflicted."); + +static const u8 MoveDescription_LovelyKiss[] = _( + "Demands a kiss with a scary\n" + "face that induces sleep."); + +static const u8 MoveDescription_SkyAttack[] = _( + "Searches out weak spots,\n" + "then strikes the next turn."); + +static const u8 MoveDescription_Transform[] = _( + "Alters the user’s cells to\n" + "become a copy of the foe."); + +static const u8 MoveDescription_Bubble[] = _( + "An attack using bubbles.\n" + "May lower the foe’s SPEED."); + +static const u8 MoveDescription_DizzyPunch[] = _( + "A rhythmic punch that may\n" + "confuse the foe."); + +static const u8 MoveDescription_Spore[] = _( + "Scatters a cloud of spores\n" + "that always induce sleep."); + +static const u8 MoveDescription_Flash[] = _( + "Looses a powerful blast of\n" + "light that cuts accuracy."); + +static const u8 MoveDescription_Psywave[] = _( + "Attacks with a psychic\n" + "wave of varying intensity."); + +static const u8 MoveDescription_Splash[] = _( + "It’s just a splash...\n" + "Has no effect whatsoever."); + +static const u8 MoveDescription_AcidArmor[] = _( + "Liquifies the user’s body\n" + "to sharply raise DEFENSE."); + +static const u8 MoveDescription_Crabhammer[] = _( + "Hammers with a pincer. Has a\n" + "high critical-hit ratio."); + +static const u8 MoveDescription_Explosion[] = _( + "Inflicts severe damage but\n" + "makes the user faint."); + +static const u8 MoveDescription_FurySwipes[] = _( + "Rakes the foe with sharp\n" + "claws, etc., 2 to 5 times."); + +static const u8 MoveDescription_Bonemerang[] = _( + "Throws a bone boomerang\n" + "that strikes twice."); + +static const u8 MoveDescription_Rest[] = _( + "The user sleeps for 2 turns,\n" + "restoring HP and status."); + +static const u8 MoveDescription_RockSlide[] = _( + "Large boulders are hurled.\n" + "May cause flinching."); + +static const u8 MoveDescription_HyperFang[] = _( + "Attacks with sharp fangs.\n" + "May cause flinching."); + +static const u8 MoveDescription_Sharpen[] = _( + "Reduces the polygon count\n" + "and raises ATTACK."); + +static const u8 MoveDescription_Conversion[] = _( + "Changes the user’s type\n" + "into an own move’s type."); + +static const u8 MoveDescription_TriAttack[] = _( + "Fires three types of beams\n" + "at the same time."); + +static const u8 MoveDescription_SuperFang[] = _( + "Attacks with sharp fangs\n" + "and cuts half the foe’s HP."); + +static const u8 MoveDescription_Slash[] = _( + "Slashes with claws, etc. Has\n" + "a high critical-hit ratio."); + +static const u8 MoveDescription_Substitute[] = _( + "Creates a decoy using 1/4\n" + "of the user’s maximum HP."); + +static const u8 MoveDescription_Struggle[] = _( + "Used only if all PP are gone.\n" + "Also hurts the user a little."); + +static const u8 MoveDescription_Sketch[] = _( + "Copies the foe’s last move\n" + "permanently."); + +static const u8 MoveDescription_TripleKick[] = _( + "Kicks the foe 3 times in a\n" + "row with rising intensity."); + +static const u8 MoveDescription_Thief[] = _( + "While attacking, it may\n" + "steal the foe’s held item."); + +static const u8 MoveDescription_SpiderWeb[] = _( + "Ensnares the foe to stop it\n" + "from fleeing or switching."); + +static const u8 MoveDescription_MindReader[] = _( + "Senses the foe’s action to\n" + "ensure the next move’s hit."); + +static const u8 MoveDescription_Nightmare[] = _( + "Inflicts 1/4 damage on a\n" + "sleeping foe every turn."); + +static const u8 MoveDescription_FlameWheel[] = _( + "A fiery charge attack that\n" + "may inflict a burn."); + +static const u8 MoveDescription_Snore[] = _( + "A loud attack that can be\n" + "used only while asleep."); + +static const u8 MoveDescription_Curse[] = _( + "A move that functions\n" + "differently for GHOSTS."); + +static const u8 MoveDescription_Flail[] = _( + "Inflicts more damage when\n" + "the user’s HP is down."); + +static const u8 MoveDescription_Conversion2[] = _( + "Makes the user resistant\n" + "to the last attack’s type."); + +static const u8 MoveDescription_Aeroblast[] = _( + "Launches a vacuumed blast.\n" + "High critical-hit ratio."); + +static const u8 MoveDescription_CottonSpore[] = _( + "Spores cling to the foe,\n" + "sharply reducing SPEED."); + +static const u8 MoveDescription_Reversal[] = _( + "Inflicts more damage when\n" + "the user’s HP is down."); + +static const u8 MoveDescription_Spite[] = _( + "Spitefully cuts the PP\n" + "of the foe’s last move."); + +static const u8 MoveDescription_PowderSnow[] = _( + "Blasts the foe with a snowy\n" + "gust. May cause freezing."); + +static const u8 MoveDescription_Protect[] = _( + "Evades attack, but may fail\n" + "if used in succession."); + +static const u8 MoveDescription_MachPunch[] = _( + "A punch is thrown at wicked\n" + "speed to strike first."); + +static const u8 MoveDescription_ScaryFace[] = _( + "Frightens with a scary face\n" + "to sharply reduce SPEED."); + +static const u8 MoveDescription_FaintAttack[] = _( + "Draws the foe close, then\n" + "strikes without fail."); + +static const u8 MoveDescription_SweetKiss[] = _( + "Demands a kiss with a cute\n" + "look. May cause confusion."); + +static const u8 MoveDescription_BellyDrum[] = _( + "Maximizes ATTACK while\n" + "sacrificing HP."); + +static const u8 MoveDescription_SludgeBomb[] = _( + "Sludge is hurled to inflict\n" + "damage. May also poison."); + +static const u8 MoveDescription_MudSlap[] = _( + "Hurls mud in the foe’s face\n" + "to reduce its accuracy."); + +static const u8 MoveDescription_Octazooka[] = _( + "Fires a lump of ink to\n" + "damage and cut accuracy."); + +static const u8 MoveDescription_Spikes[] = _( + "Sets spikes that hurt a \n" + "foe switching out."); + +static const u8 MoveDescription_ZapCannon[] = _( + "Powerful and sure to cause\n" + "paralysis, but inaccurate."); + +static const u8 MoveDescription_Foresight[] = _( + "Negates the foe’s efforts\n" + "to heighten evasiveness."); + +static const u8 MoveDescription_DestinyBond[] = _( + "If the user faints, the foe\n" + "is also made to faint."); + +static const u8 MoveDescription_PerishSong[] = _( + "Any POKéMON hearing this\n" + "song faints in 3 turns."); + +static const u8 MoveDescription_IcyWind[] = _( + "A chilling attack that\n" + "lowers the foe’s SPEED."); + +static const u8 MoveDescription_Detect[] = _( + "Evades attack, but may fail\n" + "if used in succession."); + +static const u8 MoveDescription_BoneRush[] = _( + "Strikes the foe with a bone\n" + "in hand 2 to 5 times."); + +static const u8 MoveDescription_LockOn[] = _( + "Locks on to the foe to\n" + "ensure the next move hits."); + +static const u8 MoveDescription_Outrage[] = _( + "A rampage of 2 to 3 turns\n" + "that confuses the user."); + +static const u8 MoveDescription_Sandstorm[] = _( + "Causes a sandstorm that\n" + "rages for several turns."); + +static const u8 MoveDescription_GigaDrain[] = _( + "An attack that steals half\n" + "the damage inflicted."); + +static const u8 MoveDescription_Endure[] = _( + "Endures any attack for\n" + "1 turn, leaving at least 1HP."); + +static const u8 MoveDescription_Charm[] = _( + "Charms the foe and sharply\n" + "reduces its ATTACK."); + +static const u8 MoveDescription_Rollout[] = _( + "An attack lasting 5 turns\n" + "with rising intensity."); + +static const u8 MoveDescription_FalseSwipe[] = _( + "An attack that leaves the\n" + "foe with at least 1 HP."); + +static const u8 MoveDescription_Swagger[] = _( + "Confuses the foe, but also\n" + "sharply raises ATTACK."); + +static const u8 MoveDescription_MilkDrink[] = _( + "Recovers up to half the\n" + "user’s maximum HP."); + +static const u8 MoveDescription_Spark[] = _( + "An electrified tackle that\n" + "may paralyze the foe."); + +static const u8 MoveDescription_FuryCutter[] = _( + "An attack that intensifies\n" + "on each successive hit."); + +static const u8 MoveDescription_SteelWing[] = _( + "Strikes the foe with hard\n" + "wings spread wide."); + +static const u8 MoveDescription_MeanLook[] = _( + "Fixes the foe with a mean\n" + "look that prevents escape."); + +static const u8 MoveDescription_Attract[] = _( + "Makes the opposite gender\n" + "less likely to attack."); + +static const u8 MoveDescription_SleepTalk[] = _( + "Uses an own move randomly\n" + "while asleep."); + +static const u8 MoveDescription_HealBell[] = _( + "Chimes soothingly to heal\n" + "all status abnormalities."); + +static const u8 MoveDescription_Return[] = _( + "An attack that increases\n" + "in power with friendship."); + +static const u8 MoveDescription_Present[] = _( + "A gift in the form of a\n" + "bomb. May restore HP."); + +static const u8 MoveDescription_Frustration[] = _( + "An attack that is stronger\n" + "if the TRAINER is disliked."); + +static const u8 MoveDescription_Safeguard[] = _( + "A mystical force prevents\n" + "all status problems."); + +static const u8 MoveDescription_PainSplit[] = _( + "Adds the user and foe’s HP,\n" + "then shares them equally."); + +static const u8 MoveDescription_SacredFire[] = _( + "A mystical fire attack that\n" + "may inflict a burn."); + +static const u8 MoveDescription_Magnitude[] = _( + "A ground-shaking attack\n" + "of random intensity."); + +static const u8 MoveDescription_DynamicPunch[] = _( + "Powerful and sure to cause\n" + "confusion, but inaccurate."); + +static const u8 MoveDescription_Megahorn[] = _( + "A brutal ramming attack\n" + "using out-thrust horns."); + +static const u8 MoveDescription_DragonBreath[] = _( + "Strikes the foe with an\n" + "incredible blast of breath."); + +static const u8 MoveDescription_BatonPass[] = _( + "Switches out the user while\n" + "keeping effects in play."); + +static const u8 MoveDescription_Encore[] = _( + "Makes the foe repeat its\n" + "last move over 2 to 6 turns."); + +static const u8 MoveDescription_Pursuit[] = _( + "Inflicts bad damage if used\n" + "on a foe switching out."); + +static const u8 MoveDescription_RapidSpin[] = _( + "Spins the body at high\n" + "speed to strike the foe."); + +static const u8 MoveDescription_SweetScent[] = _( + "Allures the foe to reduce\n" + "evasiveness."); + +static const u8 MoveDescription_IronTail[] = _( + "Attacks with a rock-hard\n" + "tail. May lower DEFENSE."); + +static const u8 MoveDescription_MetalClaw[] = _( + "A claw attack that may\n" + "raise the user’s ATTACK."); + +static const u8 MoveDescription_VitalThrow[] = _( + "Makes the user’s move last,\n" + "but it never misses."); + +static const u8 MoveDescription_MorningSun[] = _( + "Restores HP. The amount\n" + "varies with the weather."); + +static const u8 MoveDescription_Synthesis[] = _( + "Restores HP. The amount\n" + "varies with the weather."); + +static const u8 MoveDescription_Moonlight[] = _( + "Restores HP. The amount\n" + "varies with the weather."); + +static const u8 MoveDescription_HiddenPower[] = _( + "The effectiveness varies\n" + "with the user."); + +static const u8 MoveDescription_CrossChop[] = _( + "A double-chopping attack.\n" + "High critical-hit ratio."); + +static const u8 MoveDescription_Twister[] = _( + "Whips up a vicious twister\n" + "to tear at the foe."); + +static const u8 MoveDescription_RainDance[] = _( + "Boosts the power of WATER-\n" + "type moves for 5 turns."); + +static const u8 MoveDescription_SunnyDay[] = _( + "Boosts the power of FIRE-\n" + "type moves for 5 turns."); + +static const u8 MoveDescription_Crunch[] = _( + "Crunches with sharp fangs.\n" + "May lower SP. DEF."); + +static const u8 MoveDescription_MirrorCoat[] = _( + "Counters the foe’s special\n" + "attack at double the power."); + +static const u8 MoveDescription_PsychUp[] = _( + "Copies the foe’s effect(s)\n" + "and gives to the user."); + +static const u8 MoveDescription_ExtremeSpeed[] = _( + "An extremely fast and\n" + "powerful attack."); + +static const u8 MoveDescription_AncientPower[] = _( + "An attack that may raise\n" + "all stats."); + +static const u8 MoveDescription_ShadowBall[] = _( + "Hurls a black blob that may\n" + "lower the foe’s SP. DEF."); + +static const u8 MoveDescription_FutureSight[] = _( + "Heightens inner power to\n" + "strike 2 turns later."); + +static const u8 MoveDescription_RockSmash[] = _( + "A rock-crushing attack\n" + "that may lower DEFENSE."); + +static const u8 MoveDescription_Whirlpool[] = _( + "Traps and hurts the foe in\n" + "a whirlpool for 2 to 5 turns."); + +static const u8 MoveDescription_BeatUp[] = _( + "Summons party POKéMON to\n" + "join in the attack."); + +static const u8 MoveDescription_FakeOut[] = _( + "A 1st-turn, 1st-strike move\n" + "that causes flinching."); + +static const u8 MoveDescription_Uproar[] = _( + "Causes an uproar for 2 to 5\n" + "turns and prevents sleep."); + +static const u8 MoveDescription_Stockpile[] = _( + "Charges up power for up to\n" + "3 turns."); + +static const u8 MoveDescription_SpitUp[] = _( + "Releases stockpiled power\n" + "(the more the better)."); + +static const u8 MoveDescription_Swallow[] = _( + "Absorbs stockpiled power\n" + "and restores HP."); + +static const u8 MoveDescription_HeatWave[] = _( + "Exhales a hot breath on the\n" + "foe. May inflict a burn."); + +static const u8 MoveDescription_Hail[] = _( + "Summons a hailstorm that\n" + "strikes every turn."); + +static const u8 MoveDescription_Torment[] = _( + "Torments the foe and stops\n" + "successive use of a move."); + +static const u8 MoveDescription_Flatter[] = _( + "Confuses the foe, but\n" + "raises its SP. ATK."); + +static const u8 MoveDescription_WillOWisp[] = _( + "Inflicts a burn on the foe\n" + "with intense fire."); + +static const u8 MoveDescription_Memento[] = _( + "The user faints and lowers\n" + "the foe’s abilities."); + +static const u8 MoveDescription_Facade[] = _( + "Boosts ATTACK when burned,\n" + "paralyzed, or poisoned."); + +static const u8 MoveDescription_FocusPunch[] = _( + "A powerful loyalty attack.\n" + "The user flinches if hit."); + +static const u8 MoveDescription_SmellingSalt[] = _( + "Powerful against paralyzed\n" + "foes, but also heals them."); + +static const u8 MoveDescription_FollowMe[] = _( + "Draws attention to make\n" + "foes attack only the user."); + +static const u8 MoveDescription_NaturePower[] = _( + "The type of attack varies\n" + "depending on the location."); + +static const u8 MoveDescription_Charge[] = _( + "Charges power to boost the\n" + "electric move used next."); + +static const u8 MoveDescription_Taunt[] = _( + "Taunts the foe into only\n" + "using attack moves."); + +static const u8 MoveDescription_HelpingHand[] = _( + "Boosts the power of the\n" + "recipient’s moves."); + +static const u8 MoveDescription_Trick[] = _( + "Tricks the foe into trading\n" + "held items."); + +static const u8 MoveDescription_RolePlay[] = _( + "Mimics the target and\n" + "copies its special ability."); + +static const u8 MoveDescription_Wish[] = _( + "A wish that restores HP.\n" + "It takes time to work."); + +static const u8 MoveDescription_Assist[] = _( + "Attacks randomly with one\n" + "of the partner’s moves."); + +static const u8 MoveDescription_Ingrain[] = _( + "Lays roots that restore HP.\n" + "The user can’t switch out."); + +static const u8 MoveDescription_Superpower[] = _( + "Boosts strength sharply,\n" + "but lowers abilities."); + +static const u8 MoveDescription_MagicCoat[] = _( + "Reflects special effects\n" + "back to the attacker."); + +static const u8 MoveDescription_Recycle[] = _( + "Recycles a used item for\n" + "one more use."); + +static const u8 MoveDescription_Revenge[] = _( + "An attack that gains power\n" + "if injured by the foe."); + +static const u8 MoveDescription_BrickBreak[] = _( + "Destroys barriers such as\n" + "REFLECT and causes damage."); + +static const u8 MoveDescription_Yawn[] = _( + "Lulls the foe into yawning,\n" + "then sleeping next turn."); + +static const u8 MoveDescription_KnockOff[] = _( + "Knocks down the foe’s held\n" + "item to prevent its use."); + +static const u8 MoveDescription_Endeavor[] = _( + "Gains power if the user’s HP\n" + "is lower than the foe’s HP."); + +static const u8 MoveDescription_Eruption[] = _( + "The higher the user’s HP,\n" + "the more damage caused."); + +static const u8 MoveDescription_SkillSwap[] = _( + "The user swaps special\n" + "abilities with the target."); + +static const u8 MoveDescription_Imprison[] = _( + "Prevents foes from using\n" + "moves known by the user."); + +static const u8 MoveDescription_Refresh[] = _( + "Heals poisoning, paralysis,\n" + "or a burn."); + +static const u8 MoveDescription_Grudge[] = _( + "If the user faints, deletes\n" + "the PP of the final move."); + +static const u8 MoveDescription_Snatch[] = _( + "Steals the effects of the\n" + "move the foe uses next."); + +static const u8 MoveDescription_SecretPower[] = _( + "An attack with effects\n" + "that vary by location."); + +static const u8 MoveDescription_Dive[] = _( + "Dives underwater the first\n" + "turn and strikes next turn."); + +static const u8 MoveDescription_ArmThrust[] = _( + "Straight-arm punches that\n" + "strike the foe 2 to 5 times."); + +static const u8 MoveDescription_Camouflage[] = _( + "Alters the POKéMON’s type\n" + "depending on the location."); + +static const u8 MoveDescription_TailGlow[] = _( + "Flashes a light that sharply\n" + "raises SP. ATK."); + +static const u8 MoveDescription_LusterPurge[] = _( + "Attacks with a burst of\n" + "light. May lower SP. DEF."); + +static const u8 MoveDescription_MistBall[] = _( + "Attacks with a flurry of\n" + "down. May lower SP. ATK."); + +static const u8 MoveDescription_FeatherDance[] = _( + "Envelops the foe with down\n" + "to sharply reduce ATTACK."); + +static const u8 MoveDescription_TeeterDance[] = _( + "Confuses all POKéMON on\n" + "the scene."); + +static const u8 MoveDescription_BlazeKick[] = _( + "A kick with a high critical-\n" + "hit ratio. May cause a burn."); + +static const u8 MoveDescription_MudSport[] = _( + "Covers the user in mud to\n" + "raise electrical resistance."); + +static const u8 MoveDescription_IceBall[] = _( + "A 5-turn attack that gains\n" + "power on successive hits."); + +static const u8 MoveDescription_NeedleArm[] = _( + "Attacks with thorny arms.\n" + "May cause flinching."); + +static const u8 MoveDescription_SlackOff[] = _( + "Slacks off and restores\n" + "half the maximum HP."); + +static const u8 MoveDescription_HyperVoice[] = _( + "A loud attack that uses\n" + "sound waves to injure."); + +static const u8 MoveDescription_PoisonFang[] = _( + "A sharp-fanged attack.\n" + "May badly poison the foe."); + +static const u8 MoveDescription_CrushClaw[] = _( + "Tears at the foe with sharp\n" + "claws. May lower DEFENSE."); + +static const u8 MoveDescription_BlastBurn[] = _( + "Powerful, but leaves the\n" + "user immobile the next turn."); + +static const u8 MoveDescription_HydroCannon[] = _( + "Powerful, but leaves the\n" + "user immobile the next turn."); + +static const u8 MoveDescription_MeteorMash[] = _( + "Fires a meteor-like punch.\n" + "May raise ATTACK."); + +static const u8 MoveDescription_Astonish[] = _( + "An attack that may shock\n" + "the foe into flinching."); + +static const u8 MoveDescription_WeatherBall[] = _( + "The move’s type and power\n" + "change with the weather."); + +static const u8 MoveDescription_Aromatherapy[] = _( + "Heals all status problems\n" + "with a soothing scent."); + +static const u8 MoveDescription_FakeTears[] = _( + "Feigns crying to sharply\n" + "lower the foe’s SP. DEF."); + +static const u8 MoveDescription_AirCutter[] = _( + "Hacks with razorlike wind.\n" + "High critical-hit ratio."); + +static const u8 MoveDescription_Overheat[] = _( + "Allows a full-power attack,\n" + "but sharply lowers SP. ATK."); + +static const u8 MoveDescription_OdorSleuth[] = _( + "Negates the foe’s efforts\n" + "to heighten evasiveness."); + +static const u8 MoveDescription_RockTomb[] = _( + "Stops the foe from moving\n" + "with rocks and cuts SPEED."); + +static const u8 MoveDescription_SilverWind[] = _( + "A powdery attack that may\n" + "raise abilities."); + +static const u8 MoveDescription_MetalSound[] = _( + "Emits a horrible screech\n" + "that sharply lowers SP. DEF."); + +static const u8 MoveDescription_GrassWhistle[] = _( + "Lulls the foe into sleep\n" + "with a pleasant melody."); + +static const u8 MoveDescription_Tickle[] = _( + "Makes the foe laugh to\n" + "lower ATTACK and DEFENSE."); + +static const u8 MoveDescription_CosmicPower[] = _( + "Raises DEFENSE and SP. DEF\n" + "with a mystic power."); + +static const u8 MoveDescription_WaterSpout[] = _( + "Inflicts more damage if the\n" + "user’s HP is high."); + +static const u8 MoveDescription_SignalBeam[] = _( + "A strange beam attack that\n" + "may confuse the foe."); + +static const u8 MoveDescription_ShadowPunch[] = _( + "An unavoidable punch that\n" + "is thrown from shadows."); + +static const u8 MoveDescription_Extrasensory[] = _( + "Attacks with a peculiar\n" + "power. May cause flinching."); + +static const u8 MoveDescription_SkyUppercut[] = _( + "An uppercut thrown as if\n" + "leaping into the sky."); + +static const u8 MoveDescription_SandTomb[] = _( + "Traps and hurts the foe in\n" + "quicksand for 2 to 5 turns."); + +static const u8 MoveDescription_SheerCold[] = _( + "A chilling attack that\n" + "causes fainting if it hits."); + +static const u8 MoveDescription_MuddyWater[] = _( + "Attacks with muddy water.\n" + "May lower accuracy."); + +static const u8 MoveDescription_BulletSeed[] = _( + "Shoots 2 to 5 seeds in a row\n" + "to strike the foe."); + +static const u8 MoveDescription_AerialAce[] = _( + "An extremely speedy and\n" + "unavoidable attack."); + +static const u8 MoveDescription_IcicleSpear[] = _( + "Attacks the foe by firing\n" + "2 to 5 icicles in a row."); + +static const u8 MoveDescription_IronDefense[] = _( + "Hardens the body’s surface\n" + "to sharply raise DEFENSE."); + +static const u8 MoveDescription_Block[] = _( + "Blocks the foe’s way to\n" + "prevent escape."); + +static const u8 MoveDescription_Howl[] = _( + "Howls to raise the spirit\n" + "and boosts ATTACK."); + +static const u8 MoveDescription_DragonClaw[] = _( + "Slashes the foe with sharp\n" + "claws."); + +static const u8 MoveDescription_FrenzyPlant[] = _( + "Powerful, but leaves the\n" + "user immobile the next turn."); + +static const u8 MoveDescription_BulkUp[] = _( + "Bulks up the body to boost\n" + "both ATTACK and DEFENSE."); + +static const u8 MoveDescription_Bounce[] = _( + "Bounces up, then down the\n" + "next turn. May paralyze."); + +static const u8 MoveDescription_MudShot[] = _( + "Hurls mud at the foe and\n" + "reduces SPEED."); + +static const u8 MoveDescription_PoisonTail[] = _( + "Has a high critical-hit\n" + "ratio. May also poison."); + +static const u8 MoveDescription_Covet[] = _( + "Cutely begs to obtain an\n" + "item held by the foe."); + +static const u8 MoveDescription_VoltTackle[] = _( + "A life-risking tackle that\n" + "slightly hurts the user."); + +static const u8 MoveDescription_MagicalLeaf[] = _( + "Attacks with a strange leaf\n" + "that cannot be evaded."); + +static const u8 MoveDescription_WaterSport[] = _( + "The user becomes soaked to\n" + "raise resistance to fire."); + +static const u8 MoveDescription_CalmMind[] = _( + "Raises SP. ATK and SP. DEF\n" + "by focusing the mind."); + +static const u8 MoveDescription_LeafBlade[] = _( + "Slashes with a sharp leaf.\n" + "High critical-hit ratio."); + +static const u8 MoveDescription_DragonDance[] = _( + "A mystical dance that ups\n" + "ATTACK and SPEED."); + +static const u8 MoveDescription_RockBlast[] = _( + "Hurls boulders at the foe\n" + "2 to 5 times in a row."); + +static const u8 MoveDescription_ShockWave[] = _( + "A fast and unavoidable\n" + "electric attack."); + +static const u8 MoveDescription_WaterPulse[] = _( + "Attacks with ultrasonic\n" + "waves. May confuse the foe"); + +static const u8 MoveDescription_DoomDesire[] = _( + "Summons strong sunlight to\n" + "attack 2 turns later."); + +static const u8 MoveDescription_PsychoBoost[] = _( + "Allows a full-power attack,\n" + "but sharply lowers SP. ATK."); + +const u8 * const gMoveDescriptions[] = { + MoveDescription_Pound, + MoveDescription_KarateChop, + MoveDescription_DoubleSlap, + MoveDescription_CometPunch, + MoveDescription_MegaPunch, + MoveDescription_PayDay, + MoveDescription_FirePunch, + MoveDescription_IcePunch, + MoveDescription_ThunderPunch, + MoveDescription_Scratch, + MoveDescription_ViceGrip, + MoveDescription_Guillotine, + MoveDescription_RazorWind, + MoveDescription_SwordsDance, + MoveDescription_Cut, + MoveDescription_Gust, + MoveDescription_WingAttack, + MoveDescription_Whirlwind, + MoveDescription_Fly, + MoveDescription_Bind, + MoveDescription_Slam, + MoveDescription_VineWhip, + MoveDescription_Stomp, + MoveDescription_DoubleKick, + MoveDescription_MegaKick, + MoveDescription_JumpKick, + MoveDescription_RollingKick, + MoveDescription_SandAttack, + MoveDescription_Headbutt, + MoveDescription_HornAttack, + MoveDescription_FuryAttack, + MoveDescription_HornDrill, + MoveDescription_Tackle, + MoveDescription_BodySlam, + MoveDescription_Wrap, + MoveDescription_TakeDown, + MoveDescription_Thrash, + MoveDescription_DoubleEdge, + MoveDescription_TailWhip, + MoveDescription_PoisonSting, + MoveDescription_Twineedle, + MoveDescription_PinMissile, + MoveDescription_Leer, + MoveDescription_Bite, + MoveDescription_Growl, + MoveDescription_Roar, + MoveDescription_Sing, + MoveDescription_Supersonic, + MoveDescription_SonicBoom, + MoveDescription_Disable, + MoveDescription_Acid, + MoveDescription_Ember, + MoveDescription_Flamethrower, + MoveDescription_Mist, + MoveDescription_WaterGun, + MoveDescription_HydroPump, + MoveDescription_Surf, + MoveDescription_IceBeam, + MoveDescription_Blizzard, + MoveDescription_Psybeam, + MoveDescription_BubbleBeam, + MoveDescription_AuroraBeam, + MoveDescription_HyperBeam, + MoveDescription_Peck, + MoveDescription_DrillPeck, + MoveDescription_Submission, + MoveDescription_LowKick, + MoveDescription_Counter, + MoveDescription_SeismicToss, + MoveDescription_Strength, + MoveDescription_Absorb, + MoveDescription_MegaDrain, + MoveDescription_LeechSeed, + MoveDescription_Growth, + MoveDescription_RazorLeaf, + MoveDescription_SolarBeam, + MoveDescription_PoisonPowder, + MoveDescription_StunSpore, + MoveDescription_SleepPowder, + MoveDescription_PetalDance, + MoveDescription_StringShot, + MoveDescription_DragonRage, + MoveDescription_FireSpin, + MoveDescription_ThunderShock, + MoveDescription_Thunderbolt, + MoveDescription_ThunderWave, + MoveDescription_Thunder, + MoveDescription_RockThrow, + MoveDescription_Earthquake, + MoveDescription_Fissure, + MoveDescription_Dig, + MoveDescription_Toxic, + MoveDescription_Confusion, + MoveDescription_Psychic, + MoveDescription_Hypnosis, + MoveDescription_Meditate, + MoveDescription_Agility, + MoveDescription_QuickAttack, + MoveDescription_Rage, + MoveDescription_Teleport, + MoveDescription_NightShade, + MoveDescription_Mimic, + MoveDescription_Screech, + MoveDescription_DoubleTeam, + MoveDescription_Recover, + MoveDescription_Harden, + MoveDescription_Minimize, + MoveDescription_Smokescreen, + MoveDescription_ConfuseRay, + MoveDescription_Withdraw, + MoveDescription_DefenseCurl, + MoveDescription_Barrier, + MoveDescription_LightScreen, + MoveDescription_Haze, + MoveDescription_Reflect, + MoveDescription_FocusEnergy, + MoveDescription_Bide, + MoveDescription_Metronome, + MoveDescription_MirrorMove, + MoveDescription_SelfDestruct, + MoveDescription_EggBomb, + MoveDescription_Lick, + MoveDescription_Smog, + MoveDescription_Sludge, + MoveDescription_BoneClub, + MoveDescription_FireBlast, + MoveDescription_Waterfall, + MoveDescription_Clamp, + MoveDescription_Swift, + MoveDescription_SkullBash, + MoveDescription_SpikeCannon, + MoveDescription_Constrict, + MoveDescription_Amnesia, + MoveDescription_Kinesis, + MoveDescription_SoftBoiled, + MoveDescription_HiJumpKick, + MoveDescription_Glare, + MoveDescription_DreamEater, + MoveDescription_PoisonGas, + MoveDescription_Barrage, + MoveDescription_LeechLife, + MoveDescription_LovelyKiss, + MoveDescription_SkyAttack, + MoveDescription_Transform, + MoveDescription_Bubble, + MoveDescription_DizzyPunch, + MoveDescription_Spore, + MoveDescription_Flash, + MoveDescription_Psywave, + MoveDescription_Splash, + MoveDescription_AcidArmor, + MoveDescription_Crabhammer, + MoveDescription_Explosion, + MoveDescription_FurySwipes, + MoveDescription_Bonemerang, + MoveDescription_Rest, + MoveDescription_RockSlide, + MoveDescription_HyperFang, + MoveDescription_Sharpen, + MoveDescription_Conversion, + MoveDescription_TriAttack, + MoveDescription_SuperFang, + MoveDescription_Slash, + MoveDescription_Substitute, + MoveDescription_Struggle, + MoveDescription_Sketch, + MoveDescription_TripleKick, + MoveDescription_Thief, + MoveDescription_SpiderWeb, + MoveDescription_MindReader, + MoveDescription_Nightmare, + MoveDescription_FlameWheel, + MoveDescription_Snore, + MoveDescription_Curse, + MoveDescription_Flail, + MoveDescription_Conversion2, + MoveDescription_Aeroblast, + MoveDescription_CottonSpore, + MoveDescription_Reversal, + MoveDescription_Spite, + MoveDescription_PowderSnow, + MoveDescription_Protect, + MoveDescription_MachPunch, + MoveDescription_ScaryFace, + MoveDescription_FaintAttack, + MoveDescription_SweetKiss, + MoveDescription_BellyDrum, + MoveDescription_SludgeBomb, + MoveDescription_MudSlap, + MoveDescription_Octazooka, + MoveDescription_Spikes, + MoveDescription_ZapCannon, + MoveDescription_Foresight, + MoveDescription_DestinyBond, + MoveDescription_PerishSong, + MoveDescription_IcyWind, + MoveDescription_Detect, + MoveDescription_BoneRush, + MoveDescription_LockOn, + MoveDescription_Outrage, + MoveDescription_Sandstorm, + MoveDescription_GigaDrain, + MoveDescription_Endure, + MoveDescription_Charm, + MoveDescription_Rollout, + MoveDescription_FalseSwipe, + MoveDescription_Swagger, + MoveDescription_MilkDrink, + MoveDescription_Spark, + MoveDescription_FuryCutter, + MoveDescription_SteelWing, + MoveDescription_MeanLook, + MoveDescription_Attract, + MoveDescription_SleepTalk, + MoveDescription_HealBell, + MoveDescription_Return, + MoveDescription_Present, + MoveDescription_Frustration, + MoveDescription_Safeguard, + MoveDescription_PainSplit, + MoveDescription_SacredFire, + MoveDescription_Magnitude, + MoveDescription_DynamicPunch, + MoveDescription_Megahorn, + MoveDescription_DragonBreath, + MoveDescription_BatonPass, + MoveDescription_Encore, + MoveDescription_Pursuit, + MoveDescription_RapidSpin, + MoveDescription_SweetScent, + MoveDescription_IronTail, + MoveDescription_MetalClaw, + MoveDescription_VitalThrow, + MoveDescription_MorningSun, + MoveDescription_Synthesis, + MoveDescription_Moonlight, + MoveDescription_HiddenPower, + MoveDescription_CrossChop, + MoveDescription_Twister, + MoveDescription_RainDance, + MoveDescription_SunnyDay, + MoveDescription_Crunch, + MoveDescription_MirrorCoat, + MoveDescription_PsychUp, + MoveDescription_ExtremeSpeed, + MoveDescription_AncientPower, + MoveDescription_ShadowBall, + MoveDescription_FutureSight, + MoveDescription_RockSmash, + MoveDescription_Whirlpool, + MoveDescription_BeatUp, + MoveDescription_FakeOut, + MoveDescription_Uproar, + MoveDescription_Stockpile, + MoveDescription_SpitUp, + MoveDescription_Swallow, + MoveDescription_HeatWave, + MoveDescription_Hail, + MoveDescription_Torment, + MoveDescription_Flatter, + MoveDescription_WillOWisp, + MoveDescription_Memento, + MoveDescription_Facade, + MoveDescription_FocusPunch, + MoveDescription_SmellingSalt, + MoveDescription_FollowMe, + MoveDescription_NaturePower, + MoveDescription_Charge, + MoveDescription_Taunt, + MoveDescription_HelpingHand, + MoveDescription_Trick, + MoveDescription_RolePlay, + MoveDescription_Wish, + MoveDescription_Assist, + MoveDescription_Ingrain, + MoveDescription_Superpower, + MoveDescription_MagicCoat, + MoveDescription_Recycle, + MoveDescription_Revenge, + MoveDescription_BrickBreak, + MoveDescription_Yawn, + MoveDescription_KnockOff, + MoveDescription_Endeavor, + MoveDescription_Eruption, + MoveDescription_SkillSwap, + MoveDescription_Imprison, + MoveDescription_Refresh, + MoveDescription_Grudge, + MoveDescription_Snatch, + MoveDescription_SecretPower, + MoveDescription_Dive, + MoveDescription_ArmThrust, + MoveDescription_Camouflage, + MoveDescription_TailGlow, + MoveDescription_LusterPurge, + MoveDescription_MistBall, + MoveDescription_FeatherDance, + MoveDescription_TeeterDance, + MoveDescription_BlazeKick, + MoveDescription_MudSport, + MoveDescription_IceBall, + MoveDescription_NeedleArm, + MoveDescription_SlackOff, + MoveDescription_HyperVoice, + MoveDescription_PoisonFang, + MoveDescription_CrushClaw, + MoveDescription_BlastBurn, + MoveDescription_HydroCannon, + MoveDescription_MeteorMash, + MoveDescription_Astonish, + MoveDescription_WeatherBall, + MoveDescription_Aromatherapy, + MoveDescription_FakeTears, + MoveDescription_AirCutter, + MoveDescription_Overheat, + MoveDescription_OdorSleuth, + MoveDescription_RockTomb, + MoveDescription_SilverWind, + MoveDescription_MetalSound, + MoveDescription_GrassWhistle, + MoveDescription_Tickle, + MoveDescription_CosmicPower, + MoveDescription_WaterSpout, + MoveDescription_SignalBeam, + MoveDescription_ShadowPunch, + MoveDescription_Extrasensory, + MoveDescription_SkyUppercut, + MoveDescription_SandTomb, + MoveDescription_SheerCold, + MoveDescription_MuddyWater, + MoveDescription_BulletSeed, + MoveDescription_AerialAce, + MoveDescription_IcicleSpear, + MoveDescription_IronDefense, + MoveDescription_Block, + MoveDescription_Howl, + MoveDescription_DragonClaw, + MoveDescription_FrenzyPlant, + MoveDescription_BulkUp, + MoveDescription_Bounce, + MoveDescription_MudShot, + MoveDescription_PoisonTail, + MoveDescription_Covet, + MoveDescription_VoltTackle, + MoveDescription_MagicalLeaf, + MoveDescription_WaterSport, + MoveDescription_CalmMind, + MoveDescription_LeafBlade, + MoveDescription_DragonDance, + MoveDescription_RockBlast, + MoveDescription_ShockWave, + MoveDescription_WaterPulse, + MoveDescription_DoomDesire, + MoveDescription_PsychoBoost, +}; diff --git a/src/data/text/nature_names_de.h b/src/data/text/nature_names_de.h new file mode 100644 index 000000000..695b0b62c --- /dev/null +++ b/src/data/text/nature_names_de.h @@ -0,0 +1,53 @@ +static const u8 NatureName_Hardy[] = _("ROBUST"); +static const u8 NatureName_Lonely[] = _("SOLO"); +static const u8 NatureName_Brave[] = _("MUTIG"); +static const u8 NatureName_Adamant[] = _("HART"); +static const u8 NatureName_Naughty[] = _("FRECH"); +static const u8 NatureName_Bold[] = _("KÜHN"); +static const u8 NatureName_Docile[] = _("SANFT"); +static const u8 NatureName_Relaxed[] = _("LOCKER"); +static const u8 NatureName_Impish[] = _("PFIFFIG"); +static const u8 NatureName_Lax[] = _("LASCH"); +static const u8 NatureName_Timid[] = _("SCHEU"); +static const u8 NatureName_Hasty[] = _("HASTIG"); +static const u8 NatureName_Serious[] = _("ERNST"); +static const u8 NatureName_Jolly[] = _("FROH"); +static const u8 NatureName_Naive[] = _("NAIV"); +static const u8 NatureName_Modest[] = _("MÄSSIG"); +static const u8 NatureName_Mild[] = _("MILD"); +static const u8 NatureName_Quiet[] = _("RUHIG"); +static const u8 NatureName_Bashful[] = _("ZAGHAFT"); +static const u8 NatureName_Rash[] = _("HITZIG"); +static const u8 NatureName_Calm[] = _("STILL"); +static const u8 NatureName_Gentle[] = _("ZART"); +static const u8 NatureName_Sassy[] = _("FORSCH"); +static const u8 NatureName_Careful[] = _("SACHT"); +static const u8 NatureName_Quirky[] = _("KAUZIG"); + +const u8 * const gNatureNames[] = { + NatureName_Hardy, + NatureName_Lonely, + NatureName_Brave, + NatureName_Adamant, + NatureName_Naughty, + NatureName_Bold, + NatureName_Docile, + NatureName_Relaxed, + NatureName_Impish, + NatureName_Lax, + NatureName_Timid, + NatureName_Hasty, + NatureName_Serious, + NatureName_Jolly, + NatureName_Naive, + NatureName_Modest, + NatureName_Mild, + NatureName_Quiet, + NatureName_Bashful, + NatureName_Rash, + NatureName_Calm, + NatureName_Gentle, + NatureName_Sassy, + NatureName_Careful, + NatureName_Quirky, +}; diff --git a/src/data/text/nature_names_en.h b/src/data/text/nature_names_en.h new file mode 100644 index 000000000..305b43690 --- /dev/null +++ b/src/data/text/nature_names_en.h @@ -0,0 +1,53 @@ +static const u8 NatureName_Hardy[] = _("HARDY"); +static const u8 NatureName_Lonely[] = _("LONELY"); +static const u8 NatureName_Brave[] = _("BRAVE"); +static const u8 NatureName_Adamant[] = _("ADAMANT"); +static const u8 NatureName_Naughty[] = _("NAUGHTY"); +static const u8 NatureName_Bold[] = _("BOLD"); +static const u8 NatureName_Docile[] = _("DOCILE"); +static const u8 NatureName_Relaxed[] = _("RELAXED"); +static const u8 NatureName_Impish[] = _("IMPISH"); +static const u8 NatureName_Lax[] = _("LAX"); +static const u8 NatureName_Timid[] = _("TIMID"); +static const u8 NatureName_Hasty[] = _("HASTY"); +static const u8 NatureName_Serious[] = _("SERIOUS"); +static const u8 NatureName_Jolly[] = _("JOLLY"); +static const u8 NatureName_Naive[] = _("NAIVE"); +static const u8 NatureName_Modest[] = _("MODEST"); +static const u8 NatureName_Mild[] = _("MILD"); +static const u8 NatureName_Quiet[] = _("QUIET"); +static const u8 NatureName_Bashful[] = _("BASHFUL"); +static const u8 NatureName_Rash[] = _("RASH"); +static const u8 NatureName_Calm[] = _("CALM"); +static const u8 NatureName_Gentle[] = _("GENTLE"); +static const u8 NatureName_Sassy[] = _("SASSY"); +static const u8 NatureName_Careful[] = _("CAREFUL"); +static const u8 NatureName_Quirky[] = _("QUIRKY"); + +const u8 * const gNatureNames[] = { + NatureName_Hardy, + NatureName_Lonely, + NatureName_Brave, + NatureName_Adamant, + NatureName_Naughty, + NatureName_Bold, + NatureName_Docile, + NatureName_Relaxed, + NatureName_Impish, + NatureName_Lax, + NatureName_Timid, + NatureName_Hasty, + NatureName_Serious, + NatureName_Jolly, + NatureName_Naive, + NatureName_Modest, + NatureName_Mild, + NatureName_Quiet, + NatureName_Bashful, + NatureName_Rash, + NatureName_Calm, + NatureName_Gentle, + NatureName_Sassy, + NatureName_Careful, + NatureName_Quirky, +}; diff --git a/src/engine/trade.c b/src/engine/trade.c index 729791aff..e09942589 100644 --- a/src/engine/trade.c +++ b/src/engine/trade.c @@ -2186,11 +2186,11 @@ static void sub_804997C(void) { if (gUnknown_03004824->tradeMenuCursorPosition < PARTY_SIZE) { - ShowPokemonSummaryScreen(gPlayerParty, gUnknown_03004824->tradeMenuCursorPosition, gUnknown_03004824->partyCounts[0] - 1, sub_80484F4, 4); + ShowPokemonSummaryScreen(gPlayerParty, gUnknown_03004824->tradeMenuCursorPosition, gUnknown_03004824->partyCounts[0] - 1, sub_80484F4, PSS_MODE_NO_MOVE_ORDER_EDIT); } else { - ShowPokemonSummaryScreen(gEnemyParty, gUnknown_03004824->tradeMenuCursorPosition - 6, gUnknown_03004824->partyCounts[1] - 1, sub_80484F4, 4); + ShowPokemonSummaryScreen(gEnemyParty, gUnknown_03004824->tradeMenuCursorPosition - 6, gUnknown_03004824->partyCounts[1] - 1, sub_80484F4, PSS_MODE_NO_MOVE_ORDER_EDIT); } } } diff --git a/src/field/choose_party.c b/src/field/choose_party.c index c3845e48b..e16da3a58 100644 --- a/src/field/choose_party.c +++ b/src/field/choose_party.c @@ -32,7 +32,6 @@ EWRAM_DATA u8 gSelectedOrderFromParty[3] = {0}; extern u8 sub_806BD58(u8, u8); extern void PartyMenuPrintMonsLevelOrStatus(void); extern void sub_806BC3C(u8, u8); -extern void ShowPokemonSummaryScreen(struct Pokemon *, u8, u8, void (*)(void), int); extern u8 GetMonStatusAndPokerus(); extern void PartyMenuPrintHP(); extern bool8 sub_80F9344(void); @@ -434,7 +433,7 @@ static void sub_81225D4(u8 taskId) DestroyTask(taskId); ewram1B000.unk262 = 1; - ShowPokemonSummaryScreen(gPlayerParty, r4, gPlayerPartyCount - 1, sub_81225A4, 0); + ShowPokemonSummaryScreen(gPlayerParty, r4, gPlayerPartyCount - 1, sub_81225A4, PSS_MODE_NORMAL); } } @@ -884,7 +883,7 @@ static void sub_8123034(u8 taskId) DestroyTask(taskId); ewram1B000.unk262 = 1; - ShowPokemonSummaryScreen(gPlayerParty, r4, gPlayerPartyCount - 1, sub_8123004, 0); + ShowPokemonSummaryScreen(gPlayerParty, r4, gPlayerPartyCount - 1, sub_8123004, PSS_MODE_NORMAL); } } diff --git a/src/field/party_menu.c b/src/field/party_menu.c index a8620570b..bee64fb27 100644 --- a/src/field/party_menu.c +++ b/src/field/party_menu.c @@ -4292,7 +4292,7 @@ void sub_806F3FC(u8 taskId) { if (!gPaletteFade.active) { - sub_809D9F0(gPlayerParty, ewram1C000.unk5, gPlayerPartyCount - 1, sub_808B564, ewram1C000.unk8); + ShowSelectMovePokemonSummaryScreen(gPlayerParty, ewram1C000.unk5, gPlayerPartyCount - 1, sub_808B564, ewram1C000.unk8); DestroyTask(taskId); } } diff --git a/src/pokemon/learn_move.c b/src/pokemon/learn_move.c index 55aac840f..730717965 100644 --- a/src/pokemon/learn_move.c +++ b/src/pokemon/learn_move.c @@ -4,8 +4,10 @@ #include "main.h" #include "menu.h" #include "menu_cursor.h" +#include "learn_move.h" #include "palette.h" #include "pokemon.h" +#include "pokemon_summary_screen.h" #include "overworld.h" #include "script.h" #include "songs.h" @@ -22,26 +24,11 @@ extern u16 gSpecialVar_0x8004; extern u16 gSpecialVar_0x8005; extern u8 gTileBuffer[]; -struct ContestMove -{ - u8 effect; - u8 contestCategory:3; - u8 comboStarterId; - u8 comboMoves[4]; -}; - -struct ContestEffect -{ - u8 effectType; - u8 appeal; - u8 jam; -}; - extern const struct ContestMove gContestMoves[]; extern const struct ContestEffect gContestEffects[]; extern const struct WindowConfig gWindowConfig_81E6CE4; extern const struct WindowConfig gWindowConfig_81E7240; -extern const u8 *const gUnknown_083CADD4[]; +extern const u8 *const gContestEffectStrings[]; extern const u8 *const gMoveDescriptions[]; extern const u8 gTypeNames[][7]; extern const u8 *const gUnknown_083CAF70[]; @@ -50,7 +37,6 @@ extern const u8 *const gUnknown_083CAF70[]; extern const u8 deuOtherText_ForgotAndLearned[]; #endif -extern void sub_809D9F0(struct Pokemon *, u8, u8, void *, u32); struct LearnMoveStruct { @@ -557,7 +543,7 @@ void LearnMoveMain(void) case 20: if (!gPaletteFade.active) { - sub_809D9F0(gPlayerParty, sLearnMoveStruct->partyMon, gPlayerPartyCount - 1, sub_81327A4, sLearnMoveStruct->movesToLearn[sLearnMoveStruct->menuSelection]); + ShowSelectMovePokemonSummaryScreen(gPlayerParty, sLearnMoveStruct->partyMon, gPlayerPartyCount - 1, sub_81327A4, sLearnMoveStruct->movesToLearn[sLearnMoveStruct->menuSelection]); sLearnMoveStruct->state = 28; } break; @@ -1039,7 +1025,7 @@ void sub_8133AEC(bool8 contestInfo, int unused) gSprites[sLearnMoveStruct->spriteIDs[i + 4]].invisible = FALSE; for (i = 0; i < 3; i++) PrintMoveInfo(moveId, gUnknown_08402E24[gUnknown_08402E3D[i]]); - sub_8072AB0(gUnknown_083CADD4[gContestMoves[moveId].effect], 0x58, 0x48, 0x90, 32, 1); + sub_8072AB0(gContestEffectStrings[gContestMoves[moveId].effect], 0x58, 0x48, 0x90, 32, 1); } else { diff --git a/src/pokemon/mon_markings.c b/src/pokemon/mon_markings.c index 29e8c5127..e330fed65 100644 --- a/src/pokemon/mon_markings.c +++ b/src/pokemon/mon_markings.c @@ -45,11 +45,11 @@ extern const union AnimCmd *const gSpriteAnimTable_83E533C[]; static EWRAM_DATA struct PokemonMarkMenu *sMenu = NULL; -void sub_80F761C(s16, s16, u16, u16); -void nullsub_65(struct Sprite *); -void sub_80F78CC(struct Sprite *); -void sub_80F7908(struct Sprite *); -struct Sprite *sub_80F7960(u16, u16, u16 *, u16); +static void sub_80F761C(s16, s16, u16, u16); +static void nullsub_65(struct Sprite *); +static void sub_80F78CC(struct Sprite *); +static void sub_80F7908(struct Sprite *); +static struct Sprite *sub_80F7960(u16, u16, const u16 *, u16); void sub_80F727C(struct PokemonMarkMenu *ptr) { @@ -335,21 +335,21 @@ void sub_80F7908(struct Sprite *sprite) sprite->pos1.y = 16 * sMenu->cursorPos + sMenu->cursorBaseY; } -struct Sprite *sub_80F7920(u16 tileTag, u16 paletteTag, u16 *palette) +struct Sprite *sub_80F7920(u16 tileTag, u16 paletteTag, const u16 *palette) { if (!palette) palette = gUnknown_083E49F4; return sub_80F7960(tileTag, paletteTag, palette, 16); } -struct Sprite *sub_80F7940(u16 tileTag, u16 paletteTag, u16 *palette) +struct Sprite *sub_80F7940(u16 tileTag, u16 paletteTag, const u16 *palette) { if (!palette) palette = gUnknown_083E49F4; return sub_80F7960(tileTag, paletteTag, palette, 1); } -struct Sprite *sub_80F7960(u16 tileTag, u16 paletteTag, u16 *palette, u16 size) +struct Sprite *sub_80F7960(u16 tileTag, u16 paletteTag, const u16 *palette, u16 size) { u8 spriteId; struct SpriteTemplate sprTemplate; diff --git a/src/pokemon/pokemon_menu.c b/src/pokemon/pokemon_menu.c index 07d7e5322..ae9fcefea 100644 --- a/src/pokemon/pokemon_menu.c +++ b/src/pokemon/pokemon_menu.c @@ -350,7 +350,7 @@ static void sub_8089F44(u8 taskID) u8 spriteID = gSprites[gTasks[taskID].data[3] >> 8].data[0]; DestroyTask(taskID); ewram1B000_alt.unk262 = 1; - ShowPokemonSummaryScreen(gPlayerParty, spriteID, gPlayerPartyCount - 1, sub_8089F14, 0); + ShowPokemonSummaryScreen(gPlayerParty, spriteID, gPlayerPartyCount - 1, sub_8089F14, PSS_MODE_NORMAL); } } diff --git a/src/pokemon/pokemon_summary_screen.c b/src/pokemon/pokemon_summary_screen.c index 70b9b7d94..c0f643818 100644 --- a/src/pokemon/pokemon_summary_screen.c +++ b/src/pokemon/pokemon_summary_screen.c @@ -1,13 +1,3348 @@ #include "global.h" -#include "pokemon_summary_screen.h" +#include "battle.h" +#include "data2.h" +#include "decompress.h" +#include "event_data.h" +#include "ewram.h" +#include "item.h" +#include "items.h" +#include "learn_move.h" #include "link.h" +#include "m4a.h" +#include "main.h" #include "menu.h" +#include "menu_helpers.h" +#include "overworld.h" +#include "palette.h" +#include "party_menu.h" +#include "pokeball.h" #include "pokemon.h" +#include "pokemon_summary_screen.h" #include "region_map.h" +#include "songs.h" +#include "sound.h" +#include "species.h" +#include "sprite.h" #include "string_util.h" +#include "strings.h" #include "strings2.h" +#include "task.h" #include "tv.h" -#include "ewram.h" +#include "unknown_task.h" + +static void sub_809FC0C(void); +static void sub_809FEB8(void); +static void sub_809F63C(struct Pokemon *); +static void sub_809F650(struct Pokemon *); +static void sub_809F664(struct Pokemon *); +static void sub_809FE6C(struct Pokemon *); +static void sub_80A0090(struct Pokemon *); +static void sub_80A015C(struct Pokemon *); +static void sub_809DE44(void); +static void sub_809EB40(u8); +static void sub_809EBC4(void); +static void sub_809E044(void); +static void sub_80A1D84(struct Pokemon *); +static void sub_80A18C4(void); +static bool8 LoadPokemonSummaryScreenGraphics(void); +static bool8 MonKnowsMultipleMoves(struct Pokemon *); +static void PrintSummaryWindowHeaderText(void); +static void sub_80A1DCC(struct Pokemon *); +static void sub_809FE80(void); +static void sub_80A00A4(void); +static void sub_80A0390(void); +extern u8 sub_80A1808(struct Pokemon *); +static void sub_80A1F98(s32, u8, u8, u8, u8, u16, s32); +static void sub_80A0958(struct Pokemon *); +static void PokemonSummaryScreen_PrintTrainerMemo(struct Pokemon *, u8, u8); +static void PokemonSummaryScreen_PrintEggTrainerMemo(struct Pokemon *, u8, u8); +static void sub_80A1EF8(const u8 *, u8, u8, u16, s32); +static void sub_80A1F48(const u8 *, u8, u8, u8, u16); +static void PrintHeldItemName(u16, u8, u8); +static void PrintNumRibbons(struct Pokemon *); +static void DrawExperienceProgressBar(struct Pokemon *, u8, u8); +static void sub_809E13C(u8 taskId); +static void sub_80A1950(void); +static void sub_809DE64(void); +static void SummaryScreenHandleAButton(u8); +static void SummaryScreenHandleUpDownInput(u8, s8); +static bool8 sub_809F7D0(u8); +static void sub_809F9D0(u8, u8); +static void sub_809EAC8(u8); +static void sub_809E534(u8); +static void sub_809E83C(u8, s8); +static void sub_80A1B40(u8); +static void sub_80A2078(int); +static void sub_809E3FC(u8); +static void SummaryScreenHandleKeyInput(u8); +static void sub_80A1B1C(u8); +static void sub_80A16CC(u8); +static void sub_80A1A30(u8); +static void DrawSummaryScreenNavigationDots(void); +static void sub_80A00F4(u8); +static void sub_80A029C(struct Pokemon *); +static void sub_809FBE4(void); +static void sub_80A1500(u8); +static void sub_80A1334(u8); +extern void sub_809F43C(u8); +extern s8 sub_809F284(s8); +extern s8 sub_809F3CC(s8); +static bool8 sub_809F5F8(void); +static void sub_80A1DE8(struct Pokemon *); +static u8 sub_809F6B4(struct Pokemon *, u8 *); +static void DrawPokerusSurvivorDot(struct Pokemon *); +static void sub_80A12D0(s8); +static void sub_809FAC8(struct Pokemon *); +static void SummaryScreenHandleLeftRightInput(u8, s8); +static void sub_809E8F0(); +static void sub_80A1654(s8, u8); +static void sub_80A1488(s8, u8); +static void sub_809FC34(struct Pokemon *); +static void sub_809FF64(struct Pokemon *); +static void sub_80A1918(u8, u8); +static void sub_80A198C(u8, u8, u8, u8); +static u16 GetMonMove(struct Pokemon *, u8); +static void sub_80A04CC(u16); +static void sub_80A057C(u16); +static void sub_80A0498(u16); +static void sub_80A046C(u16); +static void sub_80A20A8(u8); +static void sub_809F678(struct Pokemon *); +static void sub_80A1BC0(struct Sprite *sprite); +static void sub_80A1888(struct Sprite *); +static void sub_80A0428(struct Pokemon *, u8 *); +static void sub_80A18E4(u8); +static u8 *sub_80A1E58(u8 *, u8); +static void sub_80A0A2C(struct Pokemon *, u8, u8); +static void sub_80A1FF8(const u8 *, u8, u8, u8); + +extern u8 ball_number_to_ball_processing_index(u16); +extern u8 StorageSystemGetNextMonIndex(struct BoxPokemon *, u8, u8, u8); + +extern struct MusicPlayerInfo gMPlay_BGM; +extern u8 gUnknown_020384F0; +extern u8 gUnknown_08208238[]; +extern u16 gUnknown_030041B8; +extern u16 gUnknown_03004280; +extern u16 gUnknown_030041B4; +extern u16 gUnknown_030042C0; +extern u16 gUnknown_03004288; +extern u16 gUnknown_030041B0; +extern TaskFunc gUnknown_03005CF0; +extern struct Sprite *gUnknown_020384F4; +extern struct SpriteTemplate gUnknown_02024E8C; + +extern const u8 gStatusPal_Icons[]; +extern const u8 gStatusGfx_Icons[]; +extern const u8 gMenuSummaryPal[]; +extern const u8 gMenuSummaryGfx[]; +extern const u8 gMoveTypes_Gfx[]; +extern const u8 gMoveTypes_Pal[]; +extern const u8 gStatusScreen_Pal[]; +extern const u8 gStatusScreen_Tilemap[]; +extern const u8 gUnknown_08E74688[]; +extern const u8 gUnknown_08E74E88[]; +extern const u8 gUnknown_08E73508[]; +extern const u8 gStatusScreen_Gfx[]; +extern const u8 gFontDefaultPalette[]; +extern const u8 gUnknownPalette_81E6692[]; +extern const u8 gAbilityNames[][13]; +extern const u8 * const gAbilityDescriptions[]; +extern const u8 * const gContestEffectStrings[]; +extern const struct ContestMove gContestMoves[]; +extern const struct ContestEffect gContestEffects[]; +extern const u16 gUnknown_08E94510[]; +extern const u16 gUnknown_08E94550[]; +extern const u16 gUnknown_08E94590[]; +extern const u8 gUnknown_08E73E88[]; + +#if ENGLISH +#include "../data/text/move_descriptions_en.h" +#include "../data/text/nature_names_en.h" +#elif GERMAN +#include "../data/text/move_descriptions_de.h" +#include "../data/text/nature_names_de.h" +#endif + +static const u8 * const sPageHeaderTexts[] = { + gEmptyString_81E72B0, + OtherText_PokeInfo, + OtherText_PokeSkills, + OtherText_BattleMoves, + OtherText_ContestMoves, + OtherText_Switch, + OtherText_Info, + gOtherText_CancelNoTerminator, +}; + +static const union AffineAnimCmd sUnusedSpriteAffineAnim[] = { + AFFINEANIMCMD_FRAME(0xFF00, 0x100, 0, 0), + AFFINEANIMCMD_END, +}; + +static const union AffineAnimCmd *const sUnsuedSpriteAffineAnimTable[] = { + sUnusedSpriteAffineAnim, +}; + +static const struct OamData sOamData_83C109C = { + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 1, + .x = 0, + .matrixNum = 0, + .size = 2, + .tileNum = 0, + .priority = 1, + .paletteNum = 0, + .affineParam = 0, +}; + +static const union AnimCmd sSpriteAnim_83C10A4[] = { + ANIMCMD_FRAME(0, 0), + ANIMCMD_END, +}; + +static const union AnimCmd sSpriteAnim_83C10AC[] = { + ANIMCMD_FRAME(8, 0), + ANIMCMD_END, +}; + +static const union AnimCmd sSpriteAnim_83C10B4[] = { + ANIMCMD_FRAME(16, 0), + ANIMCMD_END, +}; + +static const union AnimCmd sSpriteAnim_83C10BC[] = { + ANIMCMD_FRAME(24, 0), + ANIMCMD_END, +}; + +static const union AnimCmd sSpriteAnim_83C10C4[] = { + ANIMCMD_FRAME(32, 0), + ANIMCMD_END, +}; + +static const union AnimCmd sSpriteAnim_83C10CC[] = { + ANIMCMD_FRAME(40, 0), + ANIMCMD_END, +}; + +static const union AnimCmd sSpriteAnim_83C10D4[] = { + ANIMCMD_FRAME(48, 0), + ANIMCMD_END, +}; + +static const union AnimCmd sSpriteAnim_83C10DC[] = { + ANIMCMD_FRAME(56, 0), + ANIMCMD_END, +}; + +static const union AnimCmd sSpriteAnim_83C10E4[] = { + ANIMCMD_FRAME(64, 0), + ANIMCMD_END, +}; + +static const union AnimCmd sSpriteAnim_83C10EC[] = { + ANIMCMD_FRAME(72, 0), + ANIMCMD_END, +}; + +static const union AnimCmd sSpriteAnim_83C10F4[] = { + ANIMCMD_FRAME(80, 0), + ANIMCMD_END, +}; + +static const union AnimCmd sSpriteAnim_83C10FC[] = { + ANIMCMD_FRAME(88, 0), + ANIMCMD_END, +}; + +static const union AnimCmd sSpriteAnim_83C1104[] = { + ANIMCMD_FRAME(96, 0), + ANIMCMD_END, +}; + +static const union AnimCmd sSpriteAnim_83C110C[] = { + ANIMCMD_FRAME(104, 0), + ANIMCMD_END, +}; + +static const union AnimCmd sSpriteAnim_83C1114[] = { + ANIMCMD_FRAME(112, 0), + ANIMCMD_END, +}; + +static const union AnimCmd sSpriteAnim_83C111C[] = { + ANIMCMD_FRAME(120, 0), + ANIMCMD_END, +}; + +static const union AnimCmd sSpriteAnim_83C1124[] = { + ANIMCMD_FRAME(128, 0), + ANIMCMD_END, +}; + +static const union AnimCmd sSpriteAnim_83C112C[] = { + ANIMCMD_FRAME(136, 0), + ANIMCMD_END, +}; + +static const union AnimCmd sSpriteAnim_83C1134[] = { + ANIMCMD_FRAME(144, 0), + ANIMCMD_END, +}; + +static const union AnimCmd sSpriteAnim_83C113C[] = { + ANIMCMD_FRAME(152, 0), + ANIMCMD_END, +}; + +static const union AnimCmd sSpriteAnim_83C1144[] = { + ANIMCMD_FRAME(160, 0), + ANIMCMD_END, +}; + +static const union AnimCmd sSpriteAnim_83C114C[] = { + ANIMCMD_FRAME(168, 0), + ANIMCMD_END, +}; + +static const union AnimCmd sSpriteAnim_83C1154[] = { + ANIMCMD_FRAME(176, 0), + ANIMCMD_END, +}; + +static const union AnimCmd *const sSpriteAnimTable_83C115C[] = { + sSpriteAnim_83C10A4, + sSpriteAnim_83C10AC, + sSpriteAnim_83C10B4, + sSpriteAnim_83C10BC, + sSpriteAnim_83C10C4, + sSpriteAnim_83C10CC, + sSpriteAnim_83C10D4, + sSpriteAnim_83C10DC, + sSpriteAnim_83C10E4, + sSpriteAnim_83C10EC, + sSpriteAnim_83C10F4, + sSpriteAnim_83C10FC, + sSpriteAnim_83C1104, + sSpriteAnim_83C110C, + sSpriteAnim_83C1114, + sSpriteAnim_83C111C, + sSpriteAnim_83C1124, + sSpriteAnim_83C112C, + sSpriteAnim_83C1134, + sSpriteAnim_83C113C, + sSpriteAnim_83C1144, + sSpriteAnim_83C114C, + sSpriteAnim_83C1154, +}; + +static const struct CompressedSpriteSheet sUnknown_083C11B8 = { gMoveTypes_Gfx, 0x1700, 30002 }; + +static const struct SpriteTemplate sSpriteTemplate_83C11C0 = { + .tileTag = 30002, + .paletteTag = 30002, + .oam = &sOamData_83C109C, + .anims = sSpriteAnimTable_83C115C, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy, +}; + +static const u8 sUnknown_PaletteNums[] = { 0xD, 0xD, 0xE, 0xE, 0xD, 0xD, 0xF, 0xE, 0xD, 0xF, 0xD, 0xE, 0xF, 0xD, 0xE, 0xE, 0xF, 0xD, 0xD, 0xE, 0xE, 0xF, 0xD }; + +static const struct OamData sOamData_83C11F0 = { + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 1, + .tileNum = 0, + .priority = 1, + .paletteNum = 0, + .affineParam = 0, +}; + +static const union AnimCmd sSpriteAnim_83C11F8[] = { + ANIMCMD_FRAME(0, 0), + ANIMCMD_END, +}; + +static const union AnimCmd sSpriteAnim_83C1200[] = { + ANIMCMD_FRAME(4, 0), + ANIMCMD_END, +}; + +static const union AnimCmd sSpriteAnim_83C1208[] = { + ANIMCMD_FRAME(8, 0), + ANIMCMD_END, +}; + +static const union AnimCmd sSpriteAnim_83C1210[] = { + ANIMCMD_FRAME(12, 0), + ANIMCMD_END, +}; + +static const union AnimCmd sSpriteAnim_83C1218[] = { + ANIMCMD_FRAME(16, 0), + ANIMCMD_END, +}; + +static const union AnimCmd sSpriteAnim_83C1220[] = { + ANIMCMD_FRAME(16, 0, .hFlip = TRUE), + ANIMCMD_END, +}; + +static const union AnimCmd sSpriteAnim_83C1228[] = { + ANIMCMD_FRAME(20, 0), + ANIMCMD_END, +}; + +static const union AnimCmd sSpriteAnim_83C1230[] = { + ANIMCMD_FRAME(24, 0), + ANIMCMD_END, +}; + +static const union AnimCmd sSpriteAnim_83C1238[] = { + ANIMCMD_FRAME(24, 0, .hFlip = TRUE), + ANIMCMD_END, +}; + +static const union AnimCmd sSpriteAnim_83C1240[] = { + ANIMCMD_FRAME(28, 0), + ANIMCMD_END, +}; + +static const union AnimCmd *const sSpriteAnimTable_83C1248[] = { + sSpriteAnim_83C11F8, + sSpriteAnim_83C1200, + sSpriteAnim_83C1208, + sSpriteAnim_83C1210, + sSpriteAnim_83C1218, + sSpriteAnim_83C1220, + sSpriteAnim_83C1228, + sSpriteAnim_83C1230, + sSpriteAnim_83C1238, + sSpriteAnim_83C1240, +}; + +static const struct CompressedSpriteSheet sUnknown_083C1270 = { gMenuSummaryGfx, 0x400, 30000 }; +static const struct CompressedSpritePalette sUnknown_083C1278 = { gMenuSummaryPal, 30000 }; + +static const struct SpriteTemplate sSpriteTemplate_83C1280 = { + .tileTag = 30000, + .paletteTag = 30000, + .oam = &sOamData_83C11F0, + .anims = sSpriteAnimTable_83C1248, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy, +}; + +static const struct OamData sOamData_83C1298 = { + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 1, + .x = 0, + .matrixNum = 0, + .size = 1, + .tileNum = 0, + .priority = 3, + .paletteNum = 0, + .affineParam = 0, +}; + +static const union AnimCmd sSpriteAnim_83C12A0[] = { + ANIMCMD_FRAME(0, 0), + ANIMCMD_END, +}; + +static const union AnimCmd sSpriteAnim_83C12A8[] = { + ANIMCMD_FRAME(4, 0), + ANIMCMD_END, +}; + +static const union AnimCmd sSpriteAnim_83C12B0[] = { + ANIMCMD_FRAME(8, 0), + ANIMCMD_END, +}; + +static const union AnimCmd sSpriteAnim_83C12B8[] = { + ANIMCMD_FRAME(12, 0), + ANIMCMD_END, +}; + +static const union AnimCmd sSpriteAnim_83C12C0[] = { + ANIMCMD_FRAME(16, 0), + ANIMCMD_END, +}; + +static const union AnimCmd sSpriteAnim_83C12C8[] = { + ANIMCMD_FRAME(20, 0), + ANIMCMD_END, +}; + +static const union AnimCmd sSpriteAnim_83C12D0[] = { + ANIMCMD_FRAME(24, 0), + ANIMCMD_END, +}; + +static const union AnimCmd *const sSpriteAnimTable_83C12D8[] = { + sSpriteAnim_83C12A0, + sSpriteAnim_83C12A8, + sSpriteAnim_83C12B0, + sSpriteAnim_83C12B8, + sSpriteAnim_83C12C0, + sSpriteAnim_83C12C8, + sSpriteAnim_83C12D0, +}; + +static const struct CompressedSpriteSheet sUnknown_083C12F4 = { gStatusGfx_Icons, 0x380, 30001 }; +static const struct CompressedSpritePalette sUnknown_083C12FC = { gStatusPal_Icons, 30001 }; + +static const struct SpriteTemplate sSpriteTemplate_83C1304 = { + .tileTag = 30001, + .paletteTag = 30001, + .oam = &sOamData_83C1298, + .anims = sSpriteAnimTable_83C12D8, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy, +}; + +static const u16 sSummaryScreenMonMarkingsPalette[] = INCBIN_U16("graphics/summary_screen/mon_markings.gbapal"); + +#if ENGLISH +static const u16 gSummaryScreenTextTiles[] = INCBIN_U16("graphics/summary_screen/text.4bpp"); +#elif GERMAN +extern const u16 gSummaryScreenTextTiles[]; +#endif + +static const u16 sSummaryScreenButtonTiles[] = INCBIN_U16("graphics/summary_screen/buttons.4bpp"); + +static const u16 sUnknown_083C157C[] = { RGB(26, 26, 23) }; +static const u16 sUnknown_083C157E[] = { RGB(30, 30, 27) }; + +static void (*const sUnknown_083C1580[])(void) = { + sub_809FC0C, + sub_809FEB8, +}; + +static void (*const sUnknown_083C1588[])(struct Pokemon *) = { + sub_809F63C, + sub_809F650, + sub_809F664, + sub_809F664, +}; + +static void (*const sUnknown_083C1598[])(struct Pokemon *) = { + sub_809FE6C, + sub_80A0090, + sub_80A015C, + sub_80A015C, +}; + +static const u8 sDoubleBattlePartyOrder[] = { 0, 2, 3, 1, 4, 5 }; + +static const u8 sUnknown_083C15AE[] = _("{STR_VAR_1}{CLEAR_TO 64}"); +static const u8 sUnknown_083C15B4[] = _("{STR_VAR_1}{CLEAR_TO 72}"); + +asm(".align 2"); // TODO: this array is probably not correctly-typed +static const u8 sUnknown_083C15BC[] = { + 9, 1, 0, 2, + 10, 3, 0, 4, + 8, 5, 0, 6, + 11, 7, 0, 8, + 14, 9, 0, 10, + 12, 11, 0, 12, + 13, 13, 0, 14, + -1, 15, 0, 10, +}; + + +void sub_809D844(void) +{ + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + UpdatePaletteFade(); +} + +void sub_809D85C(void) +{ + REG_BG1HOFS = gUnknown_030042C0; + REG_BG1VOFS = gUnknown_030041B4; + REG_BG2HOFS = gUnknown_03004288; + REG_BG2VOFS = gUnknown_03004280; + REG_BG3HOFS = gUnknown_030041B0; + REG_BG3VOFS = gUnknown_030041B8; + + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); +} + +void ShowPokemonSummaryScreen(struct Pokemon *party, u8 monIndex, u8 maxMonIndex, MainCallback callback, u8 mode) +{ + gPaletteFade.bufferTransferDisabled = 1; + + pssData.monList.partyMons = party; + pssData.mode = mode; + pssData.monIndex = monIndex; + pssData.maxMonIndex = maxMonIndex; + pssData.callback = callback; + pssData.loadGfxState = 0; + pssData.selectedMoveIndex = 4; + pssData.moveToLearn = 0; + pssData.bgToggle = 0; + pssData.disableMoveOrderEditing = FALSE; + + if (mode >= PSS_MODE_PC_NORMAL) + { + pssData.usingPC = TRUE; + } + else + { + pssData.usingPC = FALSE; + } + + switch (mode) + { + case PSS_MODE_NORMAL: + case PSS_MODE_PC_NORMAL: + pssData.firstPage = PSS_PAGE_INFO; + pssData.lastPage = PSS_PAGE_CONTEST_MOVES; + pssData.unk77 = 0; + pssData.unk78 = 0; + pssData.headerTextId = 1; + pssData.headerActionTextId = 7; + break; + case PSS_MODE_NO_MOVE_ORDER_EDIT: + pssData.firstPage = PSS_PAGE_INFO; + pssData.lastPage = PSS_PAGE_CONTEST_MOVES; + pssData.unk77 = 0; + pssData.unk78 = 0; + pssData.headerTextId = 1; + pssData.headerActionTextId = 7; + pssData.disableMoveOrderEditing = TRUE; + break; + case PSS_MODE_SELECT_MOVE: + pssData.firstPage = PSS_PAGE_BATTLE_MOVES; + pssData.lastPage = PSS_PAGE_CONTEST_MOVES; + pssData.unk77 = 1; + pssData.unk78 = 1; + pssData.headerTextId = 3; + pssData.headerActionTextId = 0; + pssData.selectedMoveIndex = 0; + break; + case PSS_MODE_MOVES_ONLY: + case PSS_MODE_PC_MOVES_ONLY: + pssData.firstPage = PSS_PAGE_BATTLE_MOVES; + pssData.lastPage = PSS_PAGE_CONTEST_MOVES; + pssData.unk77 = 1; + pssData.unk78 = 1; + break; + } + + pssData.page = pssData.firstPage; + SetMainCallback2(sub_809DE44); +} + +void ShowSelectMovePokemonSummaryScreen(struct Pokemon *party, u8 monIndex, u8 maxMonIndex, MainCallback callback, u16 move) +{ + ShowPokemonSummaryScreen(party, monIndex, maxMonIndex, callback, PSS_MODE_SELECT_MOVE); + pssData.moveToLearn = move; +} + +void sub_809DA1C(void) +{ + switch (pssData.mode) + { + case PSS_MODE_NORMAL: + case PSS_MODE_PC_NORMAL: + pssData.inputHandlingTaskId = CreateTask(SummaryScreenHandleKeyInput, 0); + break; + case PSS_MODE_NO_MOVE_ORDER_EDIT: + pssData.inputHandlingTaskId = CreateTask(SummaryScreenHandleKeyInput, 0); + break; + case PSS_MODE_SELECT_MOVE: + case PSS_MODE_UNKNOWN: + pssData.inputHandlingTaskId = CreateTask(sub_809EB40, 0); + break; + case PSS_MODE_MOVES_ONLY: + case PSS_MODE_PC_MOVES_ONLY: + pssData.inputHandlingTaskId = CreateTask(sub_809E3FC, 0); + break; + } +} + +bool8 sub_809DA84(void) +{ + const u16 *src; + void *dest; + + switch (gMain.state) + { + case 0: + SetVBlankCallback(NULL); + ResetSpriteData(); + gMain.state++; + break; + case 1: + remove_some_task(); + gMain.state++; + break; + case 2: + FreeAllSpritePalettes(); + gMain.state++; + break; + case 3: + dest = (void *)VRAM; + DmaClearLarge(3, dest, 0x10000, 0x1000, 32); + gMain.state++; + break; + case 4: + sub_809DE64(); + gMain.state++; + break; + case 5: + SetUpWindowConfig(&gWindowConfig_81E6E6C); + gMain.state++; + break; + case 6: + MultistepInitMenuWindowBegin(&gWindowConfig_81E6E6C); + gMain.state++; + break; + case 7: + if (MultistepInitMenuWindowContinue()) + { + gMain.state++; + } + break; + case 8: + sub_809DA1C(); + gMain.state++; + break; + case 9: + src = gSummaryScreenTextTiles; + dest = (void *)VRAM + 0xD000; + DmaCopy16(3, src, dest, 320); + + src = sSummaryScreenButtonTiles; + dest = (void *)VRAM + 0xD140; + DmaCopy16(3, src, dest, 256); + + pssData.loadGfxState = 0; + gMain.state++; + break; + case 10: + if (LoadPokemonSummaryScreenGraphics()) + { + pssData.loadGfxState = 0; + gMain.state++; + } + break; + case 11: + sub_80A18C4(); + gMain.state++; + break; + case 12: + sub_809F678(&pssData.loadedMon); + if (!GetMonStatusAndPokerus(&pssData.loadedMon)) + { + sub_80A12D0(0); + } + else + { + sub_80A12D0(10); + } + + DrawPokerusSurvivorDot(&pssData.loadedMon); + gMain.state++; + break; + case 13: + sub_80A1950(); + sub_80A1D84(&pssData.loadedMon); + gMain.state++; + break; + case 14: + sub_80A1DE8(&pssData.loadedMon); + pssData.loadGfxState = 0; + gMain.state++; + break; + case 15: + if ((pssData.monSpriteId = sub_809F6B4(&pssData.loadedMon, &pssData.loadGfxState)) != 0xFF) + { + pssData.loadGfxState = 0; + gMain.state++; + } + break; + case 16: + sub_809E044(); + DrawSummaryScreenNavigationDots(); + gMain.state++; + break; + case 17: + if (pssData.page <= PSS_PAGE_SKILLS) + { + sUnknown_083C1580[pssData.page](); + } + + gMain.state++; + break; + case 18: + sub_809FAC8(&pssData.loadedMon); + gMain.state++; + break; + case 19: + sUnknown_083C1598[pssData.page](&pssData.loadedMon); + gMain.state++; + break; + case 20: + if (GetMonData(&pssData.loadedMon, MON_DATA_IS_EGG)) + { + gUnknown_030041B0 = 256; + } + else + { + gUnknown_030041B0 = 0; + } + + gMain.state++; + break; + case 21: + sub_809EBC4(); + if (pssData.selectedMoveIndex != 0) + { + sub_80A1488(0, 0); + sub_80A1654(0, 0); + } + else + { + sub_80A1488(10, 0); + sub_80A1654(10, 0); + } + + PrintSummaryWindowHeaderText(); + gMain.state++; + break; + case 22: + if (sub_8055870() != TRUE) + { + gMain.state++; + } + break; + default: + SetVBlankCallback(sub_809D85C); + BeginHardwarePaletteFade(0xFF, 0, 16, 0, 1); + SetMainCallback2(sub_809D844); + gPaletteFade.bufferTransferDisabled = 0; + return TRUE; + break; + } + + return FALSE; +} + +static void sub_809DE44(void) +{ + while (sub_809DA84() != TRUE && sub_80F9344() != TRUE); +} + +static void sub_809DE64(void) +{ + REG_BG0CNT = 0x1E08; + REG_BG1CNT = 0x4801; + REG_BG2CNT = 0x4A02; + REG_BG3CNT = 0x5C03; + + gUnknown_030042C0 = 0; + gUnknown_030041B4 = 0; + gUnknown_03004288 = 0; + gUnknown_03004280 = 0; + gUnknown_030041B0 = 0; + gUnknown_030041B8 = 0; + + REG_BG0HOFS = 0; + REG_BG0VOFS = 0; + REG_BG1HOFS = 0; + REG_BG1VOFS = 0; + REG_BG2HOFS = 0; + REG_BG2VOFS = 0; + REG_BG3HOFS = 0; + REG_BG3VOFS = 0; + + REG_BLDCNT = 0; + REG_DISPCNT = 0x1F40; +} + +static bool8 LoadPokemonSummaryScreenGraphics(void) +{ + switch (pssData.loadGfxState) + { + case 0: + LZDecompressVram(gStatusScreen_Gfx, (void *)VRAM + 0); + break; + case 1: + CpuSet(gUnknown_08E73508, (void *)VRAM + 0xE000, 0x400); + break; + case 2: + LZDecompressVram(gUnknown_08E74E88, (void *)VRAM + 0xE800); + break; + case 3: + LZDecompressVram(gStatusScreen_Tilemap, (void *)VRAM + 0x4800); + break; + case 4: + CpuSet(gUnknown_08E73E88, (void *)VRAM + 0x5800, 0x400); + break; + case 5: + CpuSet(gUnknown_08E74688, (void *)VRAM + 0x6800, 0x400); + break; + case 6: + LoadCompressedPalette(gStatusScreen_Pal, 0, 160); + break; + case 7: + LoadCompressedObjectPic(&sUnknown_083C11B8); + break; + case 8: + LoadCompressedObjectPic(&sUnknown_083C1270); + break; + case 9: + LoadCompressedObjectPic(&sUnknown_083C12F4); + break; + case 10: + LoadCompressedObjectPalette(&sUnknown_083C12FC); + break; + case 11: + LoadCompressedObjectPalette(&sUnknown_083C1278); + break; + case 12: + LoadCompressedPalette(gMoveTypes_Pal, 464, 96); + pssData.loadGfxState = 0; + return TRUE; + } + + pssData.loadGfxState++; + return FALSE; +} + +static void sub_809E044(void) +{ + LoadPalette(&gUnknownPalette_81E6692[28], 129, 2); + LoadPalette(&gUnknownPalette_81E6692[30], 136, 2); + LoadPalette(&gUnknownPalette_81E6692[28], 143, 2); + LoadPalette(&gUnknownPalette_81E6692[30], 137, 2); + LoadPalette(&gUnknownPalette_81E6692[12], 209, 4); + LoadPalette(&gUnknownPalette_81E6692[20], 211, 4); + LoadPalette(&gUnknownPalette_81E6692[28], 213, 4); + LoadPalette(&gUnknownPalette_81E6692[12], 215, 4); + LoadPalette(&gUnknownPalette_81E6692[8], 217, 4); + LoadPalette(&gUnknownPalette_81E6692[16], 219, 4); + LoadPalette(&gUnknownPalette_81E6692[4], 221, 2); + LoadPalette(&gUnknownPalette_81E6692[6], 222, 2); + LoadPalette(&gUnknownPalette_81E6692[2], 223, 2); + LoadPalette(gFontDefaultPalette, 240, 32); + LoadPalette(&gUnknownPalette_81E6692[6], 249, 2); +} + +static void SummaryScreenExit(u8 taskId) +{ + PlaySE(SE_SELECT); + BeginNormalPaletteFade(-1, 0, 0, 16, 0); + gTasks[taskId].func = sub_809E13C; +} + +static void sub_809E13C(u8 taskId) +{ + if (sub_8055870() != TRUE && !gPaletteFade.active) + { + gUnknown_020384F0 = pssData.monIndex; + + ResetSpriteData(); + FreeAllSpritePalettes(); + StopCryAndClearCrySongs(); + m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 0x100); + SetMainCallback2(pssData.callback); + DestroyTask(taskId); + } +} + +static void SummaryScreenHandleKeyInput(u8 taskId) +{ + if (gPaletteFade.active) + return; + + if (gMain.newKeys & DPAD_UP) + { + SummaryScreenHandleUpDownInput(taskId, -1); + } + else if (gMain.newKeys & DPAD_DOWN) + { + SummaryScreenHandleUpDownInput(taskId, 1); + } + else if ((gMain.newKeys & DPAD_LEFT) || sub_80F9284() == 1) + { + SummaryScreenHandleLeftRightInput(taskId, -1); + } + else if ((gMain.newKeys & DPAD_RIGHT) || sub_80F9284() == 2) + { + SummaryScreenHandleLeftRightInput(taskId, 1); + } + else if (gMain.newKeys & A_BUTTON) + { + if (pssData.page >= PSS_PAGE_BATTLE_MOVES) + { + SummaryScreenHandleAButton(taskId); + } + + if (pssData.page == PSS_PAGE_INFO) + { + SummaryScreenExit(taskId); + } + } + else if (gMain.newKeys & B_BUTTON) + { + SummaryScreenExit(taskId); + } +} + +static void sub_809E260(u8 taskId) +{ + if (gPaletteFade.active) + return; + + if (gMain.newKeys & DPAD_UP) + { + gTasks[taskId].data[0] = 4; + sub_809E8F0(taskId, -1, &pssData.selectedMoveIndex); + } + else if (gMain.newKeys & DPAD_DOWN) + { + gTasks[taskId].data[0] = 4; + sub_809E8F0(taskId, 1, &pssData.selectedMoveIndex); + } + else if ((gMain.newKeys & DPAD_LEFT) || sub_80F9284() == 1) + { + if (pssData.page == PSS_PAGE_CONTEST_MOVES && (pssData.selectedMoveIndex != 4 || pssData.moveToLearn != 0)) + { + MenuZeroFillWindowRect(0, 14, 9, 18); + } + + SummaryScreenHandleLeftRightInput(taskId, -1); + } + else if ((gMain.newKeys & DPAD_RIGHT) || sub_80F9284() == 2) + { + if (pssData.page != pssData.lastPage) + { + if (pssData.page == PSS_PAGE_BATTLE_MOVES && (pssData.selectedMoveIndex != 4 || pssData.moveToLearn != 0)) + { + MenuZeroFillWindowRect(0, 14, 9, 18); + } + + SummaryScreenHandleLeftRightInput(taskId, 1); + } + } + else if (gMain.newKeys & A_BUTTON) + { + if (sub_809F7D0(taskId) == TRUE || pssData.selectedMoveIndex == 4) + { + pssData.switchMoveIndex = pssData.selectedMoveIndex; + gSpecialVar_0x8005 = pssData.switchMoveIndex; + SummaryScreenExit(taskId); + } + else + { + PlaySE(SE_HAZURE); + sub_809F9D0(taskId, pssData.selectedMoveIndex); + } + } + else if (gMain.newKeys & B_BUTTON) + { + pssData.switchMoveIndex = 4; + gSpecialVar_0x8005 = 4; + SummaryScreenExit(taskId); + } +} + +static void sub_809E3FC(u8 taskId) +{ + if (gPaletteFade.active) + return; + + if (gMain.newKeys & DPAD_UP) + { + gTasks[taskId].data[0] = 4; + sub_809E8F0(taskId, -1, &pssData.selectedMoveIndex); + } + else if (gMain.newKeys & DPAD_DOWN) + { + gTasks[taskId].data[0] = 4; + sub_809E8F0(taskId, 1, &pssData.selectedMoveIndex); + } + else if (gMain.newKeys & A_BUTTON) + { + if (pssData.selectedMoveIndex != 4 && !pssData.disableMoveOrderEditing) + { + if (!MonKnowsMultipleMoves(&pssData.loadedMon)) + { + PlaySE(SE_HAZURE); + } + else + { + PlaySE(SE_SELECT); + + pssData.switchMoveIndex = pssData.selectedMoveIndex; + sub_80A1B40(1); + sub_80A1A30(19); + + gTasks[taskId].func = sub_809E534; + } + } + else + { + PlaySE(SE_SELECT); + sub_809EAC8(taskId); + } + } + else if (gMain.newKeys & B_BUTTON) + { + PlaySE(SE_SELECT); + sub_809EAC8(taskId); + } + +} + +static bool8 MonKnowsMultipleMoves(struct Pokemon *mon) +{ + u8 i; + + for (i = 1; i < 4; i++) + { + if (GetMonMove(mon, i)) + { + return TRUE; + } + } + + return FALSE; +} + +static void sub_809E534(u8 taskId) +{ + if (gMain.newKeys & DPAD_UP) + { + gTasks[taskId].data[0] = 3; + sub_809E8F0(taskId, -1, &pssData.switchMoveIndex); + } + else if (gMain.newKeys & DPAD_DOWN) + { + gTasks[taskId].data[0] = 3; + sub_809E8F0(taskId, 1, &pssData.switchMoveIndex); + } + else if (gMain.newKeys & A_BUTTON) + { + sub_809E83C(taskId, 1); + } + else if (gMain.newKeys & B_BUTTON) + { + sub_809E83C(taskId, -1); + } +} + +static void sub_809E5C4(void) +{ + struct Pokemon *party = pssData.monList.partyMons; + struct Pokemon *pkmn = &party[pssData.monIndex]; + u8 moveIndex1 = pssData.selectedMoveIndex; + u8 moveIndex2 = pssData.switchMoveIndex; + + u16 move1 = GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex1); + u16 move2 = GetMonData(pkmn, MON_DATA_MOVE1 + moveIndex2); + u8 move1pp = GetMonData(pkmn, MON_DATA_PP1 + moveIndex1); + u8 move2pp = GetMonData(pkmn, MON_DATA_PP1 + moveIndex2); + u8 ppBonuses = GetMonData(pkmn, MON_DATA_PP_BONUSES); + + // Calculate PP bonuses + u8 r9 = gUnknown_08208238[moveIndex1]; + u8 r2 = (ppBonuses & r9) >> (moveIndex1 * 2); + u8 r3 = gUnknown_08208238[moveIndex2]; + u8 r1 = (ppBonuses & r3) >> (moveIndex2 * 2); + ppBonuses &= ~r9; + ppBonuses &= ~r3; + ppBonuses |= (r2 << (moveIndex2 * 2)) + (r1 << (moveIndex1 * 2)); + + // Swap the moves + SetMonData(pkmn, MON_DATA_MOVE1 + moveIndex1, &move2); + SetMonData(pkmn, MON_DATA_MOVE1 + moveIndex2, &move1); + SetMonData(pkmn, MON_DATA_PP1 + moveIndex1, &move2pp); + SetMonData(pkmn, MON_DATA_PP1 + moveIndex2, &move1pp); + SetMonData(pkmn, MON_DATA_PP_BONUSES, &ppBonuses); +} + +static void sub_809E6D8(void) +{ + struct BoxPokemon *boxMons = pssData.monList.boxMons; + struct BoxPokemon *pkmn = &boxMons[pssData.monIndex]; + u8 moveIndex1 = pssData.selectedMoveIndex; + u8 moveIndex2 = pssData.switchMoveIndex; + + u16 move1 = GetBoxMonData(pkmn, MON_DATA_MOVE1 + moveIndex1); + u16 move2 = GetBoxMonData(pkmn, MON_DATA_MOVE1 + moveIndex2); + u8 move1pp = GetBoxMonData(pkmn, MON_DATA_PP1 + moveIndex1); + u8 move2pp = GetBoxMonData(pkmn, MON_DATA_PP1 + moveIndex2); + u8 ppBonuses = GetBoxMonData(pkmn, MON_DATA_PP_BONUSES); + + // Calculate PP bonuses + u8 r9 = gUnknown_08208238[moveIndex1]; + u8 r2 = (ppBonuses & r9) >> (moveIndex1 * 2); + u8 r3 = gUnknown_08208238[moveIndex2]; + u8 r1 = (ppBonuses & r3) >> (moveIndex2 * 2); + ppBonuses &= ~r9; + ppBonuses &= ~r3; + ppBonuses |= (r2 << (moveIndex2 * 2)) + (r1 << (moveIndex1 * 2)); + + // Swap the moves + SetBoxMonData(pkmn, MON_DATA_MOVE1 + moveIndex1, &move2); + SetBoxMonData(pkmn, MON_DATA_MOVE1 + moveIndex2, &move1); + SetBoxMonData(pkmn, MON_DATA_PP1 + moveIndex1, &move2pp); + SetBoxMonData(pkmn, MON_DATA_PP1 + moveIndex2, &move1pp); + SetBoxMonData(pkmn, MON_DATA_PP_BONUSES, &ppBonuses); +} + +void sub_809E7F0(u8 taskId) +{ + if (sub_809F5F8()) + { + pssData.loadGfxState = 0; + sub_80A0428(&pssData.loadedMon, &pssData.selectedMoveIndex); + gTasks[taskId].func = sub_809E3FC; + sub_80A2078(taskId); + } +} + +static void sub_809E83C(u8 taskId, s8 b) +{ + PlaySE(SE_SELECT); + + sub_80A1B1C(19); + sub_80A1B40(0); + + if (b == 1) + { + if (pssData.selectedMoveIndex != pssData.switchMoveIndex) + { + if (pssData.usingPC == FALSE) + { + sub_809E5C4(); + } + else + { + sub_809E6D8(); + } + + pssData.selectedMoveIndex = pssData.switchMoveIndex; + sub_809F678(&pssData.loadedMon); + pssData.loadGfxState = 1; + + gTasks[taskId].func = sub_809E7F0; + return; + } + } + else + { + sub_80A0428(&pssData.loadedMon, &pssData.selectedMoveIndex); + } + + gTasks[taskId].func = sub_809E3FC; + sub_80A2078(taskId); +} + +__attribute__((naked)) +static void sub_809E8F0(/*u8 taskId, s8 direction, u8 *c*/) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0x8\n\ + adds r4, r1, 0\n\ + mov r9, r2\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + mov r8, r0\n\ + lsls r4, 24\n\ + lsrs r4, 24\n\ + movs r0, 0x1\n\ + str r0, [sp]\n\ + movs r0, 0x5\n\ + bl PlaySE\n\ + mov r1, r9\n\ + ldrb r6, [r1]\n\ + ldr r1, _0809E944 @ =gTasks\n\ + mov r2, r8\n\ + lsls r0, r2, 2\n\ + add r0, r8\n\ + lsls r0, 3\n\ + adds r0, r1\n\ + ldrb r0, [r0, 0x8]\n\ + movs r2, 0\n\ + lsls r4, 24\n\ + asrs r4, 24\n\ + mov r10, r4\n\ + lsls r7, r0, 24\n\ +_0809E930:\n\ + lsls r0, r6, 24\n\ + asrs r0, 24\n\ + add r0, r10\n\ + lsls r0, 24\n\ + lsrs r6, r0, 24\n\ + asrs r1, r0, 24\n\ + cmp r0, r7\n\ + ble _0809E948\n\ + movs r6, 0\n\ + b _0809E94E\n\ + .align 2, 0\n\ +_0809E944: .4byte gTasks\n\ +_0809E948:\n\ + cmp r1, 0\n\ + bge _0809E94E\n\ + lsrs r6, r7, 24\n\ +_0809E94E:\n\ + lsls r4, r6, 24\n\ + lsrs r1, r4, 24\n\ + ldr r0, _0809EA10 @ =gSharedMem + 0x18010\n\ + str r2, [sp, 0x4]\n\ + bl GetMonMove\n\ + lsls r0, 16\n\ + adds r5, r4, 0\n\ + ldr r2, [sp, 0x4]\n\ + cmp r0, 0\n\ + bne _0809E97A\n\ + asrs r0, r5, 24\n\ + cmp r0, 0x4\n\ + beq _0809E97A\n\ + lsls r0, r2, 24\n\ + movs r3, 0x80\n\ + lsls r3, 17\n\ + adds r0, r3\n\ + lsrs r2, r0, 24\n\ + asrs r0, 24\n\ + cmp r0, 0x3\n\ + ble _0809E930\n\ +_0809E97A:\n\ + mov r1, r9\n\ + ldrb r0, [r1]\n\ + cmp r0, 0x4\n\ + bne _0809E996\n\ + asrs r0, r5, 24\n\ + cmp r0, 0x4\n\ + beq _0809E996\n\ + ldr r0, _0809EA14 @ =gSharedMem + 0x18000\n\ + adds r0, 0x7C\n\ + ldrh r0, [r0]\n\ + mov r2, r8\n\ + lsls r7, r2, 2\n\ + cmp r0, 0\n\ + beq _0809E9AC\n\ +_0809E996:\n\ + ldr r2, _0809EA18 @ =gTasks\n\ + mov r3, r8\n\ + lsls r1, r3, 2\n\ + adds r0, r1, r3\n\ + lsls r0, 3\n\ + adds r0, r2\n\ + movs r2, 0x22\n\ + ldrsh r0, [r0, r2]\n\ + adds r7, r1, 0\n\ + cmp r0, 0x1\n\ + bne _0809E9D0\n\ +_0809E9AC:\n\ + lsrs r4, r5, 24\n\ + movs r0, 0x2\n\ + adds r1, r4, 0\n\ + bl sub_80A1488\n\ + movs r0, 0x2\n\ + adds r1, r4, 0\n\ + bl sub_80A1654\n\ + ldr r1, _0809EA18 @ =gTasks\n\ + mov r3, r8\n\ + adds r0, r7, r3\n\ + lsls r0, 3\n\ + adds r0, r1\n\ + movs r1, 0\n\ + strh r1, [r0, 0x22]\n\ + movs r0, 0\n\ + str r0, [sp]\n\ +_0809E9D0:\n\ + mov r1, r9\n\ + ldrb r0, [r1]\n\ + cmp r0, 0x4\n\ + beq _0809E9FE\n\ + asrs r0, r5, 24\n\ + cmp r0, 0x4\n\ + bne _0809E9FE\n\ + ldr r0, _0809EA14 @ =gSharedMem + 0x18000\n\ + adds r0, 0x7C\n\ + ldrh r0, [r0]\n\ + cmp r0, 0\n\ + bne _0809E9FE\n\ + movs r4, 0x2\n\ + negs r4, r4\n\ + lsrs r5, 24\n\ + adds r0, r4, 0\n\ + adds r1, r5, 0\n\ + bl sub_80A1488\n\ + adds r0, r4, 0\n\ + adds r1, r5, 0\n\ + bl sub_80A1654\n\ +_0809E9FE:\n\ + mov r2, r9\n\ + strb r6, [r2]\n\ + ldr r0, _0809EA1C @ =gSharedMem + 0x18079\n\ + cmp r9, r0\n\ + bne _0809EA20\n\ + movs r0, 0\n\ + bl sub_80A1C30\n\ + b _0809EA26\n\ + .align 2, 0\n\ +_0809EA10: .4byte gSharedMem + 0x18010\n\ +_0809EA14: .4byte gSharedMem + 0x18000\n\ +_0809EA18: .4byte gTasks\n\ +_0809EA1C: .4byte gSharedMem + 0x18079\n\ +_0809EA20:\n\ + movs r0, 0x1\n\ + bl sub_80A1C30\n\ +_0809EA26:\n\ + ldr r3, [sp]\n\ + cmp r3, 0\n\ + beq _0809EA34\n\ + ldr r0, _0809EA4C @ =gSharedMem + 0x18010\n\ + mov r1, r9\n\ + bl sub_80A0428\n\ +_0809EA34:\n\ + mov r0, r8\n\ + bl sub_80A2078\n\ + add sp, 0x8\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_0809EA4C: .4byte gSharedMem + 0x18010\n\ + .syntax divided\n"); +} + +static void SummaryScreenHandleAButton(u8 taskId) +{ + PlaySE(SE_SELECT); + + pssData.selectedMoveIndex = 0; + sub_80A1488(2, 0); + sub_80A1654(2, 0); + + if (!pssData.disableMoveOrderEditing) + { + pssData.headerActionTextId = 5; + PrintSummaryWindowHeaderText(); + } + + sub_80A16CC(0); + sub_80A029C(&pssData.loadedMon); + sub_80A1A30(9); + + gTasks[taskId].func = sub_809E3FC; + sub_80A2078(taskId); +} + +static void sub_809EAC8(u8 taskId) +{ + if (pssData.selectedMoveIndex != 4) + { + sub_80A1488(-2, 0); + sub_80A1654(-2, 0); + } + + sub_80A1B1C(9); + sub_80A16CC(1); + + MenuZeroFillWindowRect(15, 12, 28, 13); + MenuZeroFillWindowRect(11, 15, 28, 18); + + pssData.headerActionTextId = 6; + PrintSummaryWindowHeaderText(); + + gTasks[taskId].func = SummaryScreenHandleKeyInput; +} + +static void sub_809EB40(u8 taskId) +{ + switch (gTasks[taskId].data[0]) + { + case 5: + sub_80A1A30(9); + gTasks[taskId].data[0] = 0; + gTasks[taskId].func = sub_809E260; + break; + case 0: + pssData.selectedMoveIndex = 0; + if (pssData.moveToLearn != 0) + { + sub_80A1488(10, 0); + sub_80A1654(10, pssData.selectedMoveIndex); + } + + sub_80A16CC(0); + sub_80A029C(&pssData.loadedMon); + // fall through + default: + gTasks[taskId].data[0]++; + break; + } +} + +static void sub_809EBC4(void) +{ + if (pssData.page != PSS_PAGE_INFO) + { + DrawSummaryScreenNavigationDots(); + gUnknown_030042C0 = 0x100; + + if (pssData.page == PSS_PAGE_SKILLS) + REG_BG1CNT = (REG_BG1CNT & 0xE0FF) + 0x800; + + if (pssData.page == PSS_PAGE_BATTLE_MOVES) + REG_BG1CNT = (REG_BG1CNT & 0xE0FF) + 0xA00; + + if (pssData.page == PSS_PAGE_CONTEST_MOVES) + REG_BG1CNT = (REG_BG1CNT & 0xE0FF) + 0xC00; + } +} + +void sub_809EC38(u8 taskId) +{ + u8 minus2; + s16 *taskData = gTasks[taskId].data; + + switch (taskData[0]) + { + case 0: + if (pssData.bgToggle == 0) + { + if (pssData.page != PSS_PAGE_INFO) + { + gUnknown_03004288 = 0x100; + } + + if (pssData.page == PSS_PAGE_SKILLS) + { + REG_BG2CNT = (REG_BG2CNT & 0xE0FF) + 0x800; + } + + if (pssData.page == PSS_PAGE_BATTLE_MOVES) + { + REG_BG2CNT = (REG_BG2CNT & 0xE0FF) + 0xA00; + } + } + else + { + if (pssData.page != PSS_PAGE_INFO) + { + gUnknown_030042C0 = 0x100; + } + + if (pssData.page == PSS_PAGE_SKILLS) + { + REG_BG1CNT = (REG_BG1CNT & 0xE0FF) + 0x800; + } + + if (pssData.page == PSS_PAGE_BATTLE_MOVES) + { + REG_BG1CNT = (REG_BG1CNT & 0xE0FF) + 0xA00; + } + } + + taskData[0]++; + break; + case 1: + if (pssData.bgToggle == 0) + { + int var2 = gUnknown_030042C0 - 0x20; + gUnknown_030042C0 = var2; + if (var2 << 16 == 0) + { + REG_BG1CNT = (REG_BG1CNT & 0xFFFC) + 2; + REG_BG2CNT = (REG_BG2CNT & 0xFFFC) + 1; + taskData[0]++; + } + } + else + { + int var2 = gUnknown_03004288 - 0x20; + gUnknown_03004288 = var2; + if (var2 << 16 == 0) + { + REG_BG1CNT = (REG_BG1CNT & 0xFFFC) + 1; + REG_BG2CNT = (REG_BG2CNT & 0xFFFC) + 2; + taskData[0]++; + } + } + break; + case 2: + pssData.headerTextId = pssData.page + 1; + minus2 = pssData.mode - 2; + if (minus2 < 2) + { + pssData.headerActionTextId = 0; + sub_80A029C(&pssData.loadedMon); + sub_80A0428(&pssData.loadedMon, &pssData.selectedMoveIndex); + sub_80A00F4(pssData.selectedMoveIndex); + } + else + { + if (pssData.page >= PSS_PAGE_BATTLE_MOVES && (!pssData.disableMoveOrderEditing || pssData.mode == PSS_MODE_NO_MOVE_ORDER_EDIT)) + { + pssData.headerActionTextId = 6; + } + else if (pssData.page == PSS_PAGE_INFO) + { + pssData.headerActionTextId = 7; + } + else + { + pssData.headerActionTextId = 0; + } + } + + taskData[0]++; + break; + case 3: + DrawSummaryScreenNavigationDots(); + PrintSummaryWindowHeaderText(); + taskData[0]++; + break; + case 4: + sUnknown_083C1598[pssData.page](&pssData.loadedMon); + pssData.bgToggle ^= 1; + taskData[0]++; + break; + case 5: + if (sub_8055870() != TRUE) + { + gTasks[taskId].func = gUnknown_03005CF0; + } + break; + } +} + +void sub_809EE74(u8 taskId) +{ + int var1; + u8 minus2; + s16 *taskData = gTasks[taskId].data; + + switch (taskData[0]) + { + case 0: + var1 = pssData.bgToggle; + if (var1 == 0) + { + gUnknown_03004288 = pssData.bgToggle; + taskData[0]++; + } + else + { + gUnknown_030042C0 = 0; + taskData[0]++; + } + break; + case 1: + if (pssData.bgToggle == 0) + { + if (pssData.page == PSS_PAGE_SKILLS) + REG_BG2CNT = (REG_BG2CNT & 0xE0FC) + 0x801; + + if (pssData.page == PSS_PAGE_BATTLE_MOVES) + REG_BG2CNT = (REG_BG2CNT & 0xE0FC) + 0xA01; + + if (pssData.page == PSS_PAGE_CONTEST_MOVES) + REG_BG2CNT = (REG_BG2CNT & 0xE0FC) + 0xC01; + + REG_BG1CNT = (REG_BG1CNT & 0xFFFC) + 2; + } + else + { + if (pssData.page == PSS_PAGE_SKILLS) + REG_BG1CNT = (REG_BG1CNT & 0xE0FC) + 0x801; + + if (pssData.page == PSS_PAGE_BATTLE_MOVES) + REG_BG1CNT = (REG_BG1CNT & 0xE0FC) + 0xA01; + + if (pssData.page == PSS_PAGE_CONTEST_MOVES) + REG_BG1CNT = (REG_BG1CNT & 0xE0FC) + 0xC01; + + REG_BG2CNT = (REG_BG2CNT & 0xFFFC) + 2; + } + + taskData[0]++; + break; + case 2: + if (pssData.bgToggle == 0) + { + int var2 = gUnknown_03004288 + 0x20; + gUnknown_03004288 = var2; + if ((var2 << 16) == 0x1000000) + { + taskData[0]++; + } + } + else + { + int var2 = gUnknown_030042C0 + 0x20; + gUnknown_030042C0 = var2; + if ((var2 << 16) == 0x1000000) + { + taskData[0]++; + } + } + break; + case 3: + pssData.headerTextId = pssData.page + 1; + minus2 = pssData.mode - 2; + if (minus2 < 2) + { + pssData.headerActionTextId = 0; + sub_80A029C(&pssData.loadedMon); + sub_80A0428(&pssData.loadedMon, &pssData.selectedMoveIndex); + sub_80A00F4(pssData.selectedMoveIndex); + } + else + { + if (pssData.page >= PSS_PAGE_BATTLE_MOVES && (!pssData.disableMoveOrderEditing || pssData.mode == PSS_MODE_NO_MOVE_ORDER_EDIT)) + { + pssData.headerActionTextId = 6; + } + else if (pssData.page == PSS_PAGE_INFO) + { + pssData.headerActionTextId = 7; + } + else + { + pssData.headerActionTextId = 0; + } + } + + taskData[0]++; + break; + case 4: + DrawSummaryScreenNavigationDots(); + PrintSummaryWindowHeaderText(); + taskData[0]++; + break; + case 5: + sUnknown_083C1598[pssData.page](&pssData.loadedMon); + pssData.bgToggle ^= 1; + taskData[0]++; + break; + case 6: + if (sub_8055870() != TRUE) + { + gTasks[taskId].func = gUnknown_03005CF0; + } + break; + } +} + +void sub_809F0D0(u8 taskId, s8 direction) +{ + pssData.page += direction; + gUnknown_03005CF0 = gTasks[taskId].func; + sub_809FBE4(); + gTasks[taskId].data[0] = 0; + + if (direction == -1) + { + gTasks[taskId].func = sub_809EC38; + } + else + { + gTasks[taskId].func = sub_809EE74; + gTasks[taskId].func(taskId); + } +} + +static void SummaryScreenHandleLeftRightInput(u8 taskId, s8 direction) +{ + if (!GetMonData(&pssData.loadedMon, MON_DATA_IS_EGG)) + { + if (direction == -1 && pssData.page == pssData.firstPage) return; + if (direction == 1 && pssData.page == pssData.lastPage) return; + + if (FindTaskIdByFunc(sub_80A1334) == 0xFF && FindTaskIdByFunc(sub_80A1500) == 0xFF) + { + PlaySE(SE_SELECT); + sub_809F0D0(taskId, direction); + } + } +} + +#ifdef NONMATCHING +static void SummaryScreenHandleUpDownInput(u8 taskId, s8 direction) +{ + s8 var3; + u8 var1 = direction; + + if (pssData.usingPC == TRUE) + { + if (pssData.page != PSS_PAGE_INFO) + { + var1 = (direction == 1) ? 0 : 1; + } + else + { + var1 = (direction == 1) ? 2 : 3; + } + + var3 = StorageSystemGetNextMonIndex(pssData.monList.boxMons, pssData.monIndex, pssData.maxMonIndex, var1); + } + else + { + if (sub_80F9344() == TRUE && IsLinkDoubleBattle() == TRUE) + { + var3 = sub_809F3CC(var1); + } + else + { + var3 = sub_809F284(var1); + } + } + + if (var3 != -1) + { + PlaySE(SE_SELECT); + if (GetMonStatusAndPokerus(&pssData.loadedMon)) + { + sub_80A12D0(-2); + } + + pssData.monIndex = var3; + pssData.unk84 = gTasks[taskId].func; + gTasks[taskId].func = sub_809F43C; + } +} +#else +__attribute__((naked)) +static void SummaryScreenHandleUpDownInput(u8 taskId, s8 direction) +{ + asm(".syntax unified\n\ + push {r4-r6,lr}\n\ + lsls r0, 24\n\ + lsrs r6, r0, 24\n\ + lsls r1, 24\n\ + lsrs r4, r1, 24\n\ + ldr r0, _0809F1E4 @ =gSharedMem + 0x18000\n\ + ldrb r1, [r0, 0xE]\n\ + adds r2, r0, 0\n\ + cmp r1, 0x1\n\ + bne _0809F202\n\ + ldrb r0, [r2, 0xB]\n\ + cmp r0, 0\n\ + beq _0809F1E8\n\ + lsls r1, r4, 24\n\ + asrs r1, 24\n\ + movs r4, 0x1\n\ + eors r1, r4\n\ + negs r0, r1\n\ + orrs r0, r1\n\ + lsrs r4, r0, 31\n\ + b _0809F1F4\n\ + .align 2, 0\n\ +_0809F1E4: .4byte gSharedMem + 0x18000\n\ +_0809F1E8:\n\ + lsls r0, r4, 24\n\ + asrs r0, 24\n\ + movs r4, 0x3\n\ + cmp r0, 0x1\n\ + bne _0809F1F4\n\ + movs r4, 0x2\n\ +_0809F1F4:\n\ + ldr r0, [r2]\n\ + ldrb r1, [r2, 0x9]\n\ + ldrb r2, [r2, 0xA]\n\ + adds r3, r4, 0\n\ + bl StorageSystemGetNextMonIndex\n\ + b _0809F22C\n\ +_0809F202:\n\ + bl sub_80F9344\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0x1\n\ + bne _0809F224\n\ + bl IsLinkDoubleBattle\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0x1\n\ + bne _0809F224\n\ + lsls r0, r4, 24\n\ + asrs r0, 24\n\ + bl sub_809F3CC\n\ + b _0809F22C\n\ +_0809F224:\n\ + lsls r0, r4, 24\n\ + asrs r0, 24\n\ + bl sub_809F284\n\ +_0809F22C:\n\ + lsls r0, 24\n\ + lsrs r4, r0, 24\n\ + lsls r0, r4, 24\n\ + asrs r0, 24\n\ + movs r1, 0x1\n\ + negs r1, r1\n\ + cmp r0, r1\n\ + beq _0809F270\n\ + movs r0, 0x5\n\ + bl PlaySE\n\ + ldr r5, _0809F278 @ =gSharedMem + 0x18010\n\ + adds r0, r5, 0\n\ + bl GetMonStatusAndPokerus\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + beq _0809F258\n\ + movs r0, 0x2\n\ + negs r0, r0\n\ + bl sub_80A12D0\n\ +_0809F258:\n\ + adds r0, r5, 0\n\ + subs r0, 0x10\n\ + strb r4, [r0, 0x9]\n\ + ldr r1, _0809F27C @ =gTasks\n\ + lsls r0, r6, 2\n\ + adds r0, r6\n\ + lsls r0, 3\n\ + adds r0, r1\n\ + ldr r1, [r0]\n\ + str r1, [r5, 0x74]\n\ + ldr r1, _0809F280 @ =sub_809F43C\n\ + str r1, [r0]\n\ +_0809F270:\n\ + pop {r4-r6}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_0809F278: .4byte gSharedMem + 0x18010\n\ +_0809F27C: .4byte gTasks\n\ +_0809F280: .4byte sub_809F43C\n\ + .syntax divided\n"); +} +#endif // NONMATCHING + +#ifdef NONMATCHING +s8 sub_809F284(s8 a) +{ + struct Pokemon *mons = pssData.monList.partyMons; + s8 r6 = 0; + + if (pssData.page == PSS_PAGE_INFO) + { + if (a == -1 && pssData.monIndex == 0) + return -1; + if (a == 1 && pssData.monIndex >= pssData.maxMonIndex) + return -1; + return pssData.monIndex + a; + } + else + { + do + { + r6 += a; + if (pssData.monIndex + r6 < 0 || pssData.monIndex + r6 > pssData.maxMonIndex) + return -1; + } while (GetMonData(&mons[pssData.monIndex + r6], MON_DATA_IS_EGG) != 0); + return pssData.monIndex + r6; + } +} +#else +__attribute__((naked)) +s8 sub_809F284(s8 a) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + lsls r0, 24\n\ + lsrs r3, r0, 24\n\ + ldr r0, _0809F2C0 @ =gSharedMem + 0x18000\n\ + ldr r7, [r0]\n\ + movs r6, 0\n\ + ldrb r1, [r0, 0xB]\n\ + adds r4, r0, 0\n\ + cmp r1, 0\n\ + bne _0809F2C4\n\ + lsls r0, r3, 24\n\ + asrs r2, r0, 24\n\ + movs r1, 0x1\n\ + negs r1, r1\n\ + adds r5, r0, 0\n\ + cmp r2, r1\n\ + bne _0809F2AC\n\ + ldrb r0, [r4, 0x9]\n\ + cmp r0, 0\n\ + beq _0809F2E4\n\ +_0809F2AC:\n\ + asrs r0, r5, 24\n\ + cmp r0, 0x1\n\ + bne _0809F2BA\n\ + ldrb r0, [r4, 0x9]\n\ + ldrb r1, [r4, 0xA]\n\ + cmp r0, r1\n\ + bcs _0809F2E4\n\ +_0809F2BA:\n\ + ldrb r0, [r4, 0x9]\n\ + adds r0, r3\n\ + b _0809F304\n\ + .align 2, 0\n\ +_0809F2C0: .4byte gSharedMem + 0x18000\n\ +_0809F2C4:\n\ + lsls r5, r3, 24\n\ +_0809F2C6:\n\ + lsls r0, r6, 24\n\ + asrs r0, 24\n\ + asrs r1, r5, 24\n\ + adds r0, r1\n\ + lsls r0, 24\n\ + ldr r4, _0809F2EC @ =gSharedMem + 0x18000\n\ + lsrs r6, r0, 24\n\ + asrs r0, 24\n\ + ldrb r2, [r4, 0x9]\n\ + adds r1, r0, r2\n\ + cmp r1, 0\n\ + blt _0809F2E4\n\ + ldrb r0, [r4, 0xA]\n\ + cmp r1, r0\n\ + ble _0809F2F0\n\ +_0809F2E4:\n\ + movs r0, 0x1\n\ + negs r0, r0\n\ + b _0809F308\n\ + .align 2, 0\n\ +_0809F2EC: .4byte gSharedMem + 0x18000\n\ +_0809F2F0:\n\ + movs r0, 0x64\n\ + muls r0, r1\n\ + adds r0, r7, r0\n\ + movs r1, 0x2D\n\ + bl GetMonData\n\ + cmp r0, 0\n\ + bne _0809F2C6\n\ + ldrb r0, [r4, 0x9]\n\ + adds r0, r6\n\ +_0809F304:\n\ + lsls r0, 24\n\ + asrs r0, 24\n\ +_0809F308:\n\ + pop {r4-r7}\n\ + pop {r1}\n\ + bx r1\n\ + .syntax divided\n"); +} +#endif // NONMATCHING + +bool8 sub_809F310(struct Pokemon *mon) +{ + if (GetMonData(mon, MON_DATA_SPECIES)) + { + if (pssData.page != PSS_PAGE_INFO || !GetMonData(mon, MON_DATA_IS_EGG)) + { + return TRUE; + } + } + + return FALSE; +} + +s8 sub_809F344(u8 partyIndex) +{ + while (1) + { + partyIndex++; + if (partyIndex == PARTY_SIZE) + { + return -1; + } + + if (sub_809F310(&gPlayerParty[sDoubleBattlePartyOrder[partyIndex]]) == TRUE) + { + return sDoubleBattlePartyOrder[partyIndex]; + } + } +} + +s8 sub_809F388(u8 partyIndex) +{ + while (1) + { + if (partyIndex == 0) + { + return -1; + } + + partyIndex--; + if (sub_809F310(&gPlayerParty[sDoubleBattlePartyOrder[partyIndex]]) == TRUE) + { + return sDoubleBattlePartyOrder[partyIndex]; + } + } +} + +s8 sub_809F3CC(s8 direction) +{ + u8 i; + u8 monIndex = 0; + + for (i = 0; i < PARTY_SIZE; i++) + { + if (sDoubleBattlePartyOrder[i] == pssData.monIndex) + { + monIndex = i; + break; + } + } + + if ((direction == -1 && monIndex == 0) || (direction == 1 && monIndex == 5)) + { + return -1; + } + + if (direction != 1) + { + return sub_809F388(monIndex); + } + else if (monIndex != 5) + { + return sub_809F344(monIndex); + } + + return -1; +} + +void sub_809F43C(u8 taskId) +{ + switch (gMain.state) + { + case 0: + StopCryAndClearCrySongs(); + gMain.state++; + break; + case 1: + DestroySpriteAndFreeResources(&gSprites[pssData.monSpriteId]); + gMain.state++; + break; + case 2: + DestroySpriteAndFreeResources(&gSprites[pssData.ballSpriteId]); + gMain.state++; + break; + case 3: + pssData.loadGfxState = 0; + pssData.selectedMoveIndex = 0; + gMain.state++; + break; + case 4: + sub_809F678(&pssData.loadedMon); + if (GetMonStatusAndPokerus(&pssData.loadedMon)) + { + sub_80A12D0(2); + } + + DrawPokerusSurvivorDot(&pssData.loadedMon); + gMain.state++; + break; + case 5: + if ((pssData.monSpriteId = sub_809F6B4(&pssData.loadedMon, &pssData.loadGfxState)) != 0xFF) + { + pssData.loadGfxState = 0; + if (GetMonData(&pssData.loadedMon, MON_DATA_IS_EGG)) + { + gUnknown_030041B0 = 256; + } + else + { + gUnknown_030041B0 = 0; + } + + gMain.state++; + } + break; + case 6: + sub_80A1DCC(&pssData.loadedMon); + gMain.state++; + break; + case 7: + sub_80A1DE8(&pssData.loadedMon); + gMain.state++; + break; + case 8: + if (sub_809F5F8()) + { + pssData.loadGfxState = 0; + gMain.state++; + } + break; + default: + if (sub_8055870() != TRUE) + { + gMain.state = 0; + gTasks[taskId].func = pssData.unk84; + } + break; + } +} + +static bool8 sub_809F5F8(void) +{ + if (pssData.loadGfxState == 0) + { + sub_809FAC8(&pssData.loadedMon); + pssData.loadGfxState++; + return FALSE; + } + else + { + sUnknown_083C1588[pssData.page](&pssData.loadedMon); + return TRUE; + } +} + +static void sub_809F63C(struct Pokemon *mon) +{ + sub_809FE80(); + sub_809FC34(mon); +} + +static void sub_809F650(struct Pokemon *mon) +{ + sub_80A00A4(); + sub_809FF64(mon); +} + +static void sub_809F664(struct Pokemon *mon) +{ + sub_80A0390(); + sub_80A015C(mon); +} + +static void sub_809F678(struct Pokemon *mon) +{ + if (pssData.usingPC == FALSE) + { + struct Pokemon *mons = pssData.monList.partyMons; + *mon = mons[pssData.monIndex]; + } + else + { + struct BoxPokemon *mons = pssData.monList.boxMons; + sub_803B4B4(&mons[pssData.monIndex], mon); + } +} + +static u8 sub_809F6B4(struct Pokemon *mon, u8 *b) +{ + u16 species; + u32 personality; + u32 otId; + const struct CompressedSpritePalette *palette; + + switch (*b) + { + default: + return sub_80A1808(mon); + case 0: + species = GetMonData(mon, MON_DATA_SPECIES2); + personality = GetMonData(mon, MON_DATA_PERSONALITY); + + HandleLoadSpecialPokePic( + &gMonFrontPicTable[species], + gMonFrontPicCoords[species].coords, + gMonFrontPicCoords[species].y_offset, + ewram_addr, + gUnknown_081FAF4C[1], + species, + personality); + *b += 1; + return 0xFF; + case 1: + species = GetMonData(mon, MON_DATA_SPECIES2); + personality = GetMonData(mon, MON_DATA_PERSONALITY); + otId = GetMonData(mon, MON_DATA_OT_ID); + + palette = GetMonSpritePalStructFromOtIdPersonality(species, otId, personality); + LoadCompressedObjectPalette(palette); + GetMonSpriteTemplate_803C56C(palette->tag, 1); + *b += 1; + return 0xFF; + } +} + +static u16 GetMonMove(struct Pokemon *mon, u8 moveId) +{ + switch (moveId) + { + case 0: + return GetMonData(mon, MON_DATA_MOVE1); + case 1: + return GetMonData(mon, MON_DATA_MOVE2); + case 2: + return GetMonData(mon, MON_DATA_MOVE3); + default: + return GetMonData(mon, MON_DATA_MOVE4); + } +} + +static u16 GetMonMovePP(struct Pokemon *mon, u8 moveId) +{ + switch (moveId) + { + case 0: + return GetMonData(mon, MON_DATA_PP1); + case 1: + return GetMonData(mon, MON_DATA_PP2); + case 2: + return GetMonData(mon, MON_DATA_PP3); + default: + return GetMonData(mon, MON_DATA_PP4); + } +} + +static bool8 sub_809F7D0(u8 taskId) +{ + struct Pokemon mon; + u16 move; + + sub_809F678(&mon); + move = GetMonMove(&mon, pssData.selectedMoveIndex); + if (IsHMMove(move) == TRUE && pssData.mode != PSS_MODE_UNKNOWN) + { + return FALSE; + } + + return TRUE; +} + +#ifdef NONMATCHING // The two "pssData.selectedMoveIndex = taskData[15];" lines have small register differences. +void sub_809F814(u8 taskId) +{ + u16 var1; + + s16 *taskData = gTasks[taskId].data; + + var1 = taskData[14]; + if (taskData[14] < 4) + { + taskData[14] = var1 + 1; + } + else if (gMain.newKeys & DPAD_UP) + { + gTasks[taskId].func = sub_809E260; + taskData[0] = 4; + taskData[13] = 1; + pssData.selectedMoveIndex = taskData[15]; + sub_809E8F0(taskId, -1); + } + else if (gMain.newKeys & DPAD_DOWN) + { + gTasks[taskId].func = sub_809E260; + taskData[0] = 4; + taskData[13] = 1; + pssData.selectedMoveIndex = taskData[15]; + sub_809E8F0(taskId, 1); + } + else if ((gMain.newKeys & DPAD_LEFT) || sub_80F9284() == 1) + { + if (pssData.page != PSS_PAGE_BATTLE_MOVES) + { + if (pssData.page == PSS_PAGE_CONTEST_MOVES && (pssData.selectedMoveIndex != 4 || pssData.moveToLearn != 0)) + { + MenuZeroFillWindowRect(0, 14, 9, 18); + } + + gTasks[taskId].func = sub_809E260; + + SummaryScreenHandleLeftRightInput(taskId, -1); + sub_80A1488(1, taskData[15]); + sub_80A1654(1, taskData[15]); + } + } + else if ((gMain.newKeys & DPAD_RIGHT) || sub_80F9284() == 2) + { + if (pssData.page != pssData.lastPage) + { + if (pssData.page == PSS_PAGE_BATTLE_MOVES && (pssData.selectedMoveIndex != 4 || pssData.moveToLearn != 0)) + { + MenuZeroFillWindowRect(0, 14, 9, 18); + } + + gTasks[taskId].func = sub_809E260; + + SummaryScreenHandleLeftRightInput(taskId, 1); + sub_80A1488(1, taskData[15]); + sub_80A1654(1, taskData[15]); + } + } + else if ((gMain.newKeys & A_BUTTON) || (gMain.newKeys & B_BUTTON)) + { + sub_80A1488(2, taskData[15]); + sub_80A1654(2, taskData[15]); + + gTasks[taskId].func = sub_809E260; + } +} + +#else +__attribute__((naked)) +void sub_809F814(u8 taskId) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r8\n\ + push {r7}\n\ + lsls r0, 24\n\ + lsrs r5, r0, 24\n\ + lsls r0, r5, 2\n\ + adds r0, r5\n\ + lsls r6, r0, 3\n\ + ldr r0, _0809F83C @ =gTasks + 0x8\n\ + mov r8, r0\n\ + adds r4, r6, r0\n\ + ldrh r1, [r4, 0x1C]\n\ + movs r2, 0x1C\n\ + ldrsh r0, [r4, r2]\n\ + cmp r0, 0x3\n\ + bgt _0809F840\n\ + adds r0, r1, 0x1\n\ + strh r0, [r4, 0x1C]\n\ + b _0809F9C0\n\ + .align 2, 0\n\ +_0809F83C: .4byte gTasks + 0x8\n\ +_0809F840:\n\ + ldr r7, _0809F874 @ =gMain\n\ + ldrh r1, [r7, 0x2E]\n\ + movs r0, 0x40\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _0809F880\n\ + mov r0, r8\n\ + subs r0, 0x8\n\ + adds r0, r6, r0\n\ + ldr r1, _0809F878 @ =sub_809E260\n\ + str r1, [r0]\n\ + movs r0, 0x4\n\ + strh r0, [r4]\n\ + movs r0, 0x1\n\ + strh r0, [r4, 0x1A]\n\ + ldr r2, _0809F87C @ =gSharedMem + 0x18000\n\ + ldrh r0, [r4, 0x1E]\n\ + adds r2, 0x79\n\ + strb r0, [r2]\n\ + movs r1, 0x1\n\ + negs r1, r1\n\ + adds r0, r5, 0\n\ + bl sub_809E8F0\n\ + b _0809F9C0\n\ + .align 2, 0\n\ +_0809F874: .4byte gMain\n\ +_0809F878: .4byte sub_809E260\n\ +_0809F87C: .4byte gSharedMem + 0x18000\n\ +_0809F880:\n\ + movs r0, 0x80\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _0809F8B4\n\ + mov r0, r8\n\ + subs r0, 0x8\n\ + adds r0, r6, r0\n\ + ldr r1, _0809F8AC @ =sub_809E260\n\ + str r1, [r0]\n\ + movs r0, 0x4\n\ + strh r0, [r4]\n\ + movs r0, 0x1\n\ + strh r0, [r4, 0x1A]\n\ + ldr r2, _0809F8B0 @ =gSharedMem + 0x18000\n\ + ldrh r0, [r4, 0x1E]\n\ + adds r2, 0x79\n\ + strb r0, [r2]\n\ + adds r0, r5, 0\n\ + movs r1, 0x1\n\ + bl sub_809E8F0\n\ + b _0809F9C0\n\ + .align 2, 0\n\ +_0809F8AC: .4byte sub_809E260\n\ +_0809F8B0: .4byte gSharedMem + 0x18000\n\ +_0809F8B4:\n\ + movs r0, 0x20\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + bne _0809F8C8\n\ + bl sub_80F9284\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0x1\n\ + bne _0809F918\n\ +_0809F8C8:\n\ + ldr r1, _0809F90C @ =gSharedMem + 0x18000\n\ + ldrb r0, [r1, 0xB]\n\ + cmp r0, 0x2\n\ + beq _0809F9C0\n\ + cmp r0, 0x3\n\ + bne _0809F8F4\n\ + adds r0, r1, 0\n\ + adds r0, 0x79\n\ + ldrb r0, [r0]\n\ + cmp r0, 0x4\n\ + bne _0809F8E8\n\ + adds r0, r1, 0\n\ + adds r0, 0x7C\n\ + ldrh r0, [r0]\n\ + cmp r0, 0\n\ + beq _0809F8F4\n\ +_0809F8E8:\n\ + movs r0, 0\n\ + movs r1, 0xE\n\ + movs r2, 0x9\n\ + movs r3, 0x12\n\ + bl MenuZeroFillWindowRect\n\ +_0809F8F4:\n\ + ldr r1, _0809F910 @ =gTasks\n\ + lsls r0, r5, 2\n\ + adds r0, r5\n\ + lsls r0, 3\n\ + adds r0, r1\n\ + ldr r1, _0809F914 @ =sub_809E260\n\ + str r1, [r0]\n\ + movs r1, 0x1\n\ + negs r1, r1\n\ + adds r0, r5, 0\n\ + b _0809F972\n\ + .align 2, 0\n\ +_0809F90C: .4byte gSharedMem + 0x18000\n\ +_0809F910: .4byte gTasks\n\ +_0809F914: .4byte sub_809E260\n\ +_0809F918:\n\ + ldrh r1, [r7, 0x2E]\n\ + movs r0, 0x10\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + bne _0809F92E\n\ + bl sub_80F9284\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0x2\n\ + bne _0809F994\n\ +_0809F92E:\n\ + ldr r1, _0809F988 @ =gSharedMem + 0x18000\n\ + adds r2, r1, 0\n\ + adds r2, 0x76\n\ + ldrb r0, [r1, 0xB]\n\ + ldrb r2, [r2]\n\ + cmp r0, r2\n\ + beq _0809F9C0\n\ + cmp r0, 0x2\n\ + bne _0809F960\n\ + adds r0, r1, 0\n\ + adds r0, 0x79\n\ + ldrb r0, [r0]\n\ + cmp r0, 0x4\n\ + bne _0809F954\n\ + adds r0, r1, 0\n\ + adds r0, 0x7C\n\ + ldrh r0, [r0]\n\ + cmp r0, 0\n\ + beq _0809F960\n\ +_0809F954:\n\ + movs r0, 0\n\ + movs r1, 0xE\n\ + movs r2, 0x9\n\ + movs r3, 0x12\n\ + bl MenuZeroFillWindowRect\n\ +_0809F960:\n\ + ldr r1, _0809F98C @ =gTasks\n\ + lsls r0, r5, 2\n\ + adds r0, r5\n\ + lsls r0, 3\n\ + adds r0, r1\n\ + ldr r1, _0809F990 @ =sub_809E260\n\ + str r1, [r0]\n\ + adds r0, r5, 0\n\ + movs r1, 0x1\n\ +_0809F972:\n\ + bl SummaryScreenHandleLeftRightInput\n\ + ldrb r1, [r4, 0x1E]\n\ + movs r0, 0x1\n\ + bl sub_80A1488\n\ + ldrb r1, [r4, 0x1E]\n\ + movs r0, 0x1\n\ + bl sub_80A1654\n\ + b _0809F9C0\n\ + .align 2, 0\n\ +_0809F988: .4byte gSharedMem + 0x18000\n\ +_0809F98C: .4byte gTasks\n\ +_0809F990: .4byte sub_809E260\n\ +_0809F994:\n\ + ldrh r1, [r7, 0x2E]\n\ + movs r0, 0x1\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + bne _0809F9A6\n\ + movs r0, 0x2\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + beq _0809F9C0\n\ +_0809F9A6:\n\ + ldrb r1, [r4, 0x1E]\n\ + movs r0, 0x2\n\ + bl sub_80A1488\n\ + ldrb r1, [r4, 0x1E]\n\ + movs r0, 0x2\n\ + bl sub_80A1654\n\ + mov r0, r8\n\ + subs r0, 0x8\n\ + adds r0, r6, r0\n\ + ldr r1, _0809F9CC @ =sub_809E260\n\ + str r1, [r0]\n\ +_0809F9C0:\n\ + pop {r3}\n\ + mov r8, r3\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_0809F9CC: .4byte sub_809E260\n\ + .syntax divided\n"); +} +#endif // NONMATCHING + +static void sub_809F9D0(u8 taskId, u8 b) +{ + s16 *taskData = gTasks[taskId].data; + taskData[14] = 0; + taskData[15] = b; + + sub_80A1488(-2, 4); + sub_80A1654(-2, 4); + MenuZeroFillWindowRect(11, 15, 28, 18); + MenuPrint(gOtherText_CantForgetHMs, 11, 15); + + gTasks[taskId].func = sub_809F814; +} + +u8 sub_809FA30(void) +{ + return pssData.switchMoveIndex; +} + +// void GetStringCenterAlignXOffsetWithLetterSpacing(u8 a, u8 b, u8 c, u8 d) +// { +// u16 *vramAddr = (u16 *)(VRAM + 0xF000); + +// vramAddr[(d * 32) + c] = (b * 0x1000) + (a * 2) + 0x200 + 0x80; +// vramAddr[(d * 32) + c + 32] = (b * 0x1000) + (a * 2) + 0x200 + 0x81; +// } +__attribute__((naked)) +void GetStringCenterAlignXOffsetWithLetterSpacing(u8 a, u8 b, u8 c, u8 d) +{ + asm(".syntax unified\n\ + push {r4,lr}\n\ + lsls r0, 24\n\ + lsls r1, 24\n\ + lsls r2, 24\n\ + lsls r3, 24\n\ + lsrs r2, 23\n\ + lsrs r3, 18\n\ + ldr r4, _0809FA70 @ =0x0600f000\n\ + adds r3, r4\n\ + adds r2, r3\n\ + lsrs r1, 12\n\ + lsrs r0, 23\n\ + movs r4, 0x80\n\ + lsls r4, 2\n\ + adds r3, r4, 0\n\ + adds r0, r3\n\ + adds r1, r0\n\ + adds r0, r1, 0\n\ + adds r0, 0x80\n\ + strh r0, [r2]\n\ + adds r2, 0x40\n\ + adds r1, 0x81\n\ + strh r1, [r2]\n\ + pop {r4}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_0809FA70: .4byte 0x0600f000\n\ + .syntax divided\n"); +} + +void GetStringCenterAlignXOffset(u8 a, u8 b, u8 c) +{ + GetStringCenterAlignXOffsetWithLetterSpacing(a, 15, b, c); +} + +bool8 sub_809FA94(struct Pokemon *mon) +{ + if (!IsShiny(mon)) + { + LoadPalette(sUnknown_083C157C, 4, 2); + return FALSE; + } + else + { + LoadPalette(sUnknown_083C157E, 4, 2); + return TRUE; + } +} + +static void sub_809FAC8(struct Pokemon *mon) +{ + bool8 shinyDexNum; + u16 dexNum; + u8 *buffer; + + if (GetMonData(mon, MON_DATA_IS_EGG)) + { + MenuZeroFillWindowRect(1, 2, 4, 3); + MenuZeroFillWindowRect(3, 16, 9, 17); + MenuZeroFillWindowRect(0, 12, 11, 15); + GetMonNickname(mon, gStringVar1); + sub_80A1FF8(gStringVar1, 13, 3, 16); + LoadPalette(sUnknown_083C157C, 4, 2); + } + else + { + shinyDexNum = sub_809FA94(mon); + dexNum = SpeciesToPokedexNum(GetMonData(mon, MON_DATA_SPECIES)); + if (dexNum != 0xFFFF) + { + if (!shinyDexNum) + { + GetStringCenterAlignXOffset(2, 1, 2); + sub_80A1F98(dexNum, 13, 3, 2, 17, 16, 1); + } + else + { + GetStringCenterAlignXOffsetWithLetterSpacing(2, 8, 1, 2); + sub_80A1F98(dexNum, 8, 3, 2, 17, 16, 1); + } + } + else + { + MenuZeroFillWindowRect(1, 2, 4, 3); + } + + buffer = gStringVar1; + buffer = sub_80A1E58(buffer, 13); + buffer = GetMonNickname(mon, buffer); + buffer[0] = EXT_CTRL_CODE_BEGIN; + buffer[1] = 0x13; + buffer[2] = 0x3C; + buffer[3] = EOS; + MenuPrint(gStringVar1, 1, 12); + + sub_80A0958(mon); + } +} + +static void sub_809FBE4(void) +{ + u8 i; + + for (i = 0; i < 28; i++) + { + sub_80A1918(i, 1); + } + + MenuZeroFillWindowRect(11, 4, 29, 18); +} + +static void sub_809FC0C(void) +{ + MenuPrint(gOtherText_Type2, 11, 6); + GetStringCenterAlignXOffset(0, 22, 4); + GetStringCenterAlignXOffset(2, 23, 4); +} + +static void sub_809FC34(struct Pokemon *mon) +{ + u8 i; + u8 *buffer; + u16 friendship; + u8 language; + u16 species; + u8 ability; + + for (i = 0; i < 5; i++) + { + sub_80A1918(i, 1); + } + + MenuZeroFillWindowRect(11, 9, 28, 12); + if (GetMonData(mon, MON_DATA_IS_EGG)) + { + buffer = gStringVar1; + buffer = sub_80A1E58(buffer, 13); + buffer = StringCopy(buffer, gOtherText_OriginalTrainer); + buffer = StringCopy(buffer, gOtherText_FiveQuestionsAndSlash); + buffer[0] = EXT_CTRL_CODE_BEGIN; + buffer[1] = 0x13; + buffer[2] = 0x4E; + buffer[3] = EOS; + MenuPrint(gStringVar1, 11, 4); + + sub_80A1EF8(gOtherText_FiveQuestionsAndSlash, 13, 193, 32, 1); + sub_80A198C(9, 120, 48, 0); + + friendship = GetMonData(mon, MON_DATA_FRIENDSHIP); + if (friendship < 6) + { + MenuPrint(gOtherText_EggAbout, 11, 9); + } + else if (friendship < 11) + { + MenuPrint(gOtherText_EggSoon, 11, 9); + } + else if (friendship < 41) + { + MenuPrint(gOtherText_EggSomeTime, 11, 9); + } + else + { + MenuPrint(gOtherText_EggLongTime, 11, 9); + } + + PokemonSummaryScreen_PrintEggTrainerMemo(mon, 11, 14); + } + else + { + GetMonData(mon, MON_DATA_OT_NAME, gStringVar2); + language = GetMonData(mon, MON_DATA_LANGUAGE); + ConvertInternationalString(gStringVar2, language); + + buffer = gStringVar1; + buffer = sub_80A1E58(buffer, 13); + buffer = StringCopy(buffer, gOtherText_OriginalTrainer); + + if (GetMonData(mon, MON_DATA_OT_GENDER) == MALE) + { + buffer = sub_80A1E58(buffer, 9); + } + else + { + buffer = sub_80A1E58(buffer, 10); + } + + buffer = StringCopy(buffer, gStringVar2); + buffer[0] = EXT_CTRL_CODE_BEGIN; + buffer[1] = 0x13; + buffer[2] = 0x4E; + buffer[3] = EOS; + MenuPrint(gStringVar1, 11, 4); + + sub_80A1F98(GetMonData(mon, MON_DATA_OT_ID) & 0xFFFF, 13, 5, 2, 193, 32, 1); + + species = GetMonData(mon, MON_DATA_SPECIES); + sub_80A198C(gBaseStats[species].type1, 120, 48, 0); + if (gBaseStats[species].type1 != gBaseStats[species].type2) + { + sub_80A198C(gBaseStats[species].type2, 160, 48, 1); + } + + ability = GetAbilityBySpecies(GetMonData(mon, MON_DATA_SPECIES), GetMonData(mon, MON_DATA_ALT_ABILITY)); + sub_80A1FF8(gAbilityNames[ability], 13, 11, 9); + MenuPrint(gAbilityDescriptions[ability], 11, 11); + + PokemonSummaryScreen_PrintTrainerMemo(mon, 11, 14); + } +} + +static void sub_809FE6C(struct Pokemon *mon) +{ + sub_809FC0C(); + sub_809FC34(mon); +} + +static void sub_809FE80(void) +{ + MenuZeroFillWindowRect(14, 4, 18, 5); + MenuZeroFillWindowRect(25, 4, 30, 5); + MenuZeroFillWindowRect(11, 9, 28, 12); + MenuZeroFillWindowRect(11, 14, 28, 17); +} + +static void sub_809FEB8(void) +{ + sub_80A1FF8(gOtherText_ExpPoints, 13, 11, 14); + sub_80A1FF8(gOtherText_NextLv, 13, 11, 16); + MenuPrint(gOtherText_Terminator18, 21, 16); + + sub_80A1F48(gOtherText_HP, 13, 11, 7, 42); + sub_80A1F48(gOtherText_Attack, 13, 11, 9, 42); + sub_80A1F48(gOtherText_Defense, 13, 11, 11, 42); + sub_80A1F48(gOtherText_SpAtk, 13, 22, 7, 36); + sub_80A1F48(gOtherText_SpDef, 13, 22, 9, 36); + sub_80A1F48(gOtherText_Speed, 13, 22, 11, 36); +} + +static void sub_809FF64(struct Pokemon *mon) +{ + u8 i; + u16 heldItem; + u8 *buffer; + + for (i = 0; i < 5; i++) + { + sub_80A1918(i, 1); + } + + heldItem = GetMonData(mon, MON_DATA_HELD_ITEM); + PrintHeldItemName(heldItem, 11, 4); + PrintNumRibbons(mon); + + buffer = gStringVar1; + + ConvertIntToDecimalString(buffer, GetMonData(mon, MON_DATA_EXP)); + MenuPrint_RightAligned(buffer, 29, 14); + DrawExperienceProgressBar(mon, 23, 16); + + ConvertIntToDecimalString(buffer, GetMonData(mon, MON_DATA_ATK)); + sub_8072BD8(buffer, 16, 9, 50); + + ConvertIntToDecimalString(buffer, GetMonData(mon, MON_DATA_DEF)); + sub_8072BD8(buffer, 16, 11, 50); + + ConvertIntToDecimalString(buffer, GetMonData(mon, MON_DATA_SPATK)); + sub_8072BD8(buffer, 27, 7, 18); + + ConvertIntToDecimalString(buffer, GetMonData(mon, MON_DATA_SPDEF)); + sub_8072BD8(buffer, 27, 9, 18); + + ConvertIntToDecimalString(buffer, GetMonData(mon, MON_DATA_SPEED)); + sub_8072BD8(buffer, 27, 11, 18); + + buffer = sub_8072C14(buffer, GetMonData(mon, MON_DATA_HP), 24, 1); + *buffer++ = CHAR_SLASH; + buffer = sub_8072C14(buffer, GetMonData(mon, MON_DATA_MAX_HP), 48, 1); + + MenuPrint_PixelCoords(gStringVar1, 126, 56, 1); +} + +static void sub_80A0090(struct Pokemon *mon) +{ + sub_809FEB8(); + sub_809FF64(mon); +} + +static void sub_80A00A4(void) +{ + MenuZeroFillWindowRect(11, 4, 19, 5); + MenuZeroFillWindowRect(16, 7, 21, 8); + MenuZeroFillWindowRect(17, 9, 21, 12); + MenuZeroFillWindowRect(27, 7, 29, 12); + MenuZeroFillWindowRect(22, 14, 28, 15); + MenuZeroFillWindowRect(23, 16, 28, 17); +} + +static void sub_80A00F4(u8 a) +{ + if (pssData.moveToLearn != 0 || a != 4) + { + if (pssData.page == PSS_PAGE_BATTLE_MOVES) + { + sub_80A1FF8(gOtherText_Power2, 13, 1, 15); + sub_80A1FF8(gOtherText_Accuracy2, 13, 1, 17); + } + else + { + sub_80A1FF8(gOtherText_Appeal2, 13, 1, 15); + sub_80A1FF8(gOtherText_Jam2, 13, 1, 17); + } + } +} + +static void sub_80A015C(struct Pokemon *mon) +{ + u8 i; + u16 move; + u16 curPP; + u8 ppBonuses; + u8 maxPP; + u8 *buffer; + + for (i = 0; i < 4; i++) + { + move = GetMonMove(mon, i); + curPP = GetMonMovePP(mon, i); + + if (move == 0) + { + sub_80A1918(i, 1); + sub_80A1FF8(gOtherText_OneDash, 13, 15, (2 * i) + 4); + MenuPrint(gOtherText_TwoDashes, 26, (2 * i) + 4); + } + else + { + if (pssData.page == PSS_PAGE_BATTLE_MOVES) + { + sub_80A198C(gBattleMoves[move].type, 87, ((2 * i) + 4) * 8, i); + } + else + { + sub_80A198C(gContestMoves[move].contestCategory + 18, 87, ((2 * i) + 4) * 8, i); + } + + sub_80A1FF8(gMoveNames[move], 13, 15, (2 * i) + 4); + GetStringCenterAlignXOffset(1, 24, (2 * i) + 4); + + ppBonuses = GetMonData(mon, MON_DATA_PP_BONUSES); + maxPP = CalculatePPWithBonus(move, ppBonuses, i); + + buffer = gStringVar1; + buffer = sub_8072C14(buffer, curPP, 14, 1); + *buffer++ = CHAR_SLASH; + sub_8072C14(buffer, maxPP, 32, 1); + MenuPrint(gStringVar1, 25, (2 * i) + 4); + } + } +} + +static void sub_80A029C(struct Pokemon *mon) +{ + u8 *buffer; + u16 move; + u8 pp; + + if (pssData.moveToLearn == 0) + { + sub_80A1FF8(gOtherText_CancelNoTerminator, 13, 15, 12); + return; + } + + move = pssData.moveToLearn; + + if (pssData.page == PSS_PAGE_BATTLE_MOVES) + sub_80A198C(gBattleMoves[move].type, 87, 96, 4); + else + sub_80A198C(gContestMoves[move].contestCategory + 18, 87, 96, 4); + + if (pssData.page == PSS_PAGE_BATTLE_MOVES) + sub_80A1FF8(gMoveNames[move], 10, 15, 12); + else + sub_80A1FF8(gMoveNames[move], 9, 15, 12); + + GetStringCenterAlignXOffset(1, 24, 12); + + buffer = gStringVar1; + pp = gBattleMoves[move].pp; + buffer = sub_8072C14(buffer, pp, 14, 1); + *buffer++ = CHAR_SLASH; + buffer = sub_8072C14(buffer, pp, 32, 1); + MenuPrint(gStringVar1, 25, 12); +} + +static void sub_80A0390(void) +{ + u8 i; + + for (i = 0; i < MAX_MON_MOVES; i++) + { + MenuZeroFillWindowRect(15, (i * 2) + 4, 28, (i * 2) + 5); + } +} + +u16 sub_80A03BC(struct Pokemon *mon, u8 selectedMoveIndex) +{ + u16 move; + + if (selectedMoveIndex != MAX_MON_MOVES) + { + move = GetMonMove(mon, selectedMoveIndex); + } + else + { + if (pssData.moveToLearn != 0) + { + move = pssData.moveToLearn; + } + else + { + move = 0xFFFF; + } + } + + return move; +} + +void sub_80A03F0(struct Pokemon *mon, u8 *selectedMoveIndex) +{ + u16 move = sub_80A03BC(mon, *selectedMoveIndex); + + if (pssData.page == PSS_PAGE_BATTLE_MOVES) + { + sub_80A04CC(move); + sub_80A057C(0xFFFF); + } + else + { + sub_80A057C(move); + } +} + +static void sub_80A0428(struct Pokemon *mon, u8 *selectedMoveIndex) +{ + u16 move = sub_80A03BC(mon, *selectedMoveIndex); + MenuZeroFillWindowRect(11, 15, 28, 18); + + if (pssData.page == PSS_PAGE_BATTLE_MOVES) + { + sub_80A046C(move); + } + else + { + sub_80A0498(move); + } + + sub_80A03F0(mon, selectedMoveIndex); +} + +static void sub_80A046C(u16 move) +{ + if (move == 0xFFFF) return; + + MenuPrint(gMoveDescriptions[move - 1], 11, 15); +} + +static void sub_80A0498(u16 move) +{ + if (move == 0xFFFF) return; + + MenuPrint(gContestEffectStrings[gContestMoves[move].effect], 11, 15); +} + +static void sub_80A04CC(u16 move) +{ + u8 *buffer; + + if (move == 0xFFFF) return; + + if (gBattleMoves[move].power <= 1) + { + buffer = gStringVar1; + buffer = sub_8072C74(buffer, gOtherText_ThreeDashes2, 21, 1); + MenuPrint(gStringVar1, 7, 15); + } + else + { + buffer = gStringVar1; + buffer = sub_8072C14(buffer, gBattleMoves[move].power, 21, 1); + MenuPrint(gStringVar1, 7, 15); + } + + if (gBattleMoves[move].accuracy == 0) + { + buffer = gStringVar1; + buffer = sub_8072C74(buffer, gOtherText_ThreeDashes2, 21, 1); + MenuPrint(gStringVar1, 7, 17); + } + else + { + buffer = gStringVar1; + buffer = sub_8072C14(buffer, gBattleMoves[move].accuracy, 21, 1); + MenuPrint(gStringVar1, 7, 17); + } +} + +#ifdef NONMATCHING // The two vramAddr lines are non-matching. +static void sub_80A057C(u16 move) +{ + u8 appeal; + u8 jam; + u8 i; + u16 *vramAddr = (u16 *)(VRAM + 0x6800); + + if (move == 0xFFFF) return; + + appeal = gContestEffects[gContestMoves[move].effect].appeal; + if (appeal != 0xFF) + { + appeal = appeal / 10; + } + + for (i = 0; i < 8; i++) + { + u16 tile = 0x1039; + int and = 3; + int offset = 0x3CC / 2; + if (appeal != 0xFF && i < appeal) + { + tile = 0x103A; + } + + *(&vramAddr[(i >> 2 << 5) + (i & and)] + offset) = tile; + } + + if (move == 0xFFFF) return; + + jam = gContestEffects[gContestMoves[move].effect].jam; + if (jam != 0xFF) + { + jam = jam / 10; + } + + for (i = 0; i < 8; i++) + { + u16 tile = 0x103D; + int and = 3; + int offset = 0x226; + if (jam != 0xFF && i < jam) + { + tile = 0x103C; + } + + *(&vramAddr[(i >> 2 << 5) + (i & and)] + offset) = tile; + } +} +#else +__attribute__((naked)) +static void sub_80A057C(u16 move) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + lsls r0, 16\n\ + lsrs r5, r0, 16\n\ + ldr r0, _080A0648 @ =0x06006800\n\ + mov r8, r0\n\ + ldr r0, _080A064C @ =0x0000ffff\n\ + cmp r5, r0\n\ + beq _080A063A\n\ + ldr r1, _080A0650 @ =gContestEffects\n\ + ldr r2, _080A0654 @ =gContestMoves\n\ + lsls r3, r5, 3\n\ + adds r0, r3, r2\n\ + ldrb r0, [r0]\n\ + lsls r0, 2\n\ + adds r0, r1\n\ + ldrb r4, [r0, 0x1]\n\ + mov r10, r2\n\ + mov r9, r3\n\ + cmp r4, 0xFF\n\ + beq _080A05B8\n\ + adds r0, r4, 0\n\ + movs r1, 0xA\n\ + bl __udivsi3\n\ + lsls r0, 24\n\ + lsrs r4, r0, 24\n\ +_080A05B8:\n\ + movs r2, 0\n\ + movs r7, 0x3\n\ + movs r6, 0xF3\n\ + lsls r6, 2\n\ +_080A05C0:\n\ + ldr r3, _080A0658 @ =0x00001039\n\ + cmp r4, 0xFF\n\ + beq _080A05CC\n\ + cmp r2, r4\n\ + bcs _080A05CC\n\ + adds r3, 0x1\n\ +_080A05CC:\n\ + lsrs r0, r2, 2\n\ + lsls r0, 5\n\ + adds r1, r2, 0\n\ + ands r1, r7\n\ + adds r1, r0\n\ + lsls r1, 1\n\ + add r1, r8\n\ + adds r1, r6\n\ + strh r3, [r1]\n\ + adds r0, r2, 0x1\n\ + lsls r0, 24\n\ + lsrs r2, r0, 24\n\ + cmp r2, 0x7\n\ + bls _080A05C0\n\ + ldr r0, _080A064C @ =0x0000ffff\n\ + cmp r5, r0\n\ + beq _080A063A\n\ + mov r0, r9\n\ + add r0, r10\n\ + ldrb r0, [r0]\n\ + lsls r0, 2\n\ + ldr r1, _080A0650 @ =gContestEffects\n\ + adds r0, r1\n\ + ldrb r4, [r0, 0x2]\n\ + cmp r4, 0xFF\n\ + beq _080A060C\n\ + adds r0, r4, 0\n\ + movs r1, 0xA\n\ + bl __udivsi3\n\ + lsls r0, 24\n\ + lsrs r4, r0, 24\n\ +_080A060C:\n\ + movs r2, 0\n\ + movs r6, 0x3\n\ + ldr r5, _080A065C @ =0x0000044c\n\ +_080A0612:\n\ + ldr r3, _080A0660 @ =0x0000103d\n\ + cmp r4, 0xFF\n\ + beq _080A061E\n\ + cmp r2, r4\n\ + bcs _080A061E\n\ + subs r3, 0x1\n\ +_080A061E:\n\ + lsrs r0, r2, 2\n\ + lsls r0, 5\n\ + adds r1, r2, 0\n\ + ands r1, r6\n\ + adds r1, r0\n\ + lsls r1, 1\n\ + add r1, r8\n\ + adds r1, r5\n\ + strh r3, [r1]\n\ + adds r0, r2, 0x1\n\ + lsls r0, 24\n\ + lsrs r2, r0, 24\n\ + cmp r2, 0x7\n\ + bls _080A0612\n\ +_080A063A:\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_080A0648: .4byte 0x06006800\n\ +_080A064C: .4byte 0x0000ffff\n\ +_080A0650: .4byte gContestEffects\n\ +_080A0654: .4byte gContestMoves\n\ +_080A0658: .4byte 0x00001039\n\ +_080A065C: .4byte 0x0000044c\n\ +_080A0660: .4byte 0x0000103d\n\ + .syntax divided\n"); +} +#endif // NONMATCHING bool8 PokemonSummaryScreen_CheckOT(struct Pokemon *mon) { @@ -37,7 +3372,7 @@ bool8 PokemonSummaryScreen_CheckOT(struct Pokemon *mon) return FALSE; } -void PokemonSummaryScreen_PrintEggTrainerMemo(struct Pokemon *mon, u8 left, u8 top) +static void PokemonSummaryScreen_PrintEggTrainerMemo(struct Pokemon *mon, u8 left, u8 top) { u8 locationMet; u8 gameMet = GetMonData(mon, MON_DATA_MET_GAME); @@ -74,12 +3409,12 @@ void PokemonSummaryScreen_PrintEggTrainerMemo(struct Pokemon *mon, u8 left, u8 t MenuPrint(gOtherText_EggDayCare, left, top); } -void PokemonSummaryScreen_PrintTrainerMemo(struct Pokemon *pokemon, u8 left, u8 top) +static void PokemonSummaryScreen_PrintTrainerMemo(struct Pokemon *mon, u8 left, u8 top) { u8 locationMet; u8 gameMet; u8 *ptr = gStringVar4; - u8 nature = GetNature(pokemon); + u8 nature = GetNature(mon); #if ENGLISH ptr = sub_80A1E9C(ptr, gNatureNames[nature], 14); @@ -96,11 +3431,11 @@ void PokemonSummaryScreen_PrintTrainerMemo(struct Pokemon *pokemon, u8 left, u8 ptr = StringCopy(ptr, gOtherText_Terminator4); #endif - if (PokemonSummaryScreen_CheckOT(pokemon) == TRUE) + if (PokemonSummaryScreen_CheckOT(mon) == TRUE) { - locationMet = GetMonData(pokemon, MON_DATA_MET_LOCATION); + locationMet = GetMonData(mon, MON_DATA_MET_LOCATION); - if (GetMonData(pokemon, MON_DATA_MET_LEVEL) == 0) + if (GetMonData(mon, MON_DATA_MET_LEVEL) == 0) { ptr = PokemonSummaryScreen_CopyPokemonLevel(ptr, 5); *ptr = CHAR_NEWLINE; @@ -119,7 +3454,7 @@ void PokemonSummaryScreen_PrintTrainerMemo(struct Pokemon *pokemon, u8 left, u8 } else { - u8 levelMet = GetMonData(pokemon, MON_DATA_MET_LEVEL); + u8 levelMet = GetMonData(mon, MON_DATA_MET_LEVEL); ptr = PokemonSummaryScreen_CopyPokemonLevel(ptr, levelMet); *ptr = CHAR_NEWLINE; @@ -132,7 +3467,7 @@ void PokemonSummaryScreen_PrintTrainerMemo(struct Pokemon *pokemon, u8 left, u8 } else { - gameMet = GetMonData(pokemon, MON_DATA_MET_GAME); + gameMet = GetMonData(mon, MON_DATA_MET_GAME); if (!(gameMet == VERSION_RUBY || gameMet == VERSION_SAPPHIRE || gameMet == VERSION_EMERALD)) { @@ -143,10 +3478,10 @@ void PokemonSummaryScreen_PrintTrainerMemo(struct Pokemon *pokemon, u8 left, u8 } else { - locationMet = GetMonData(pokemon, MON_DATA_MET_LOCATION); + locationMet = GetMonData(mon, MON_DATA_MET_LOCATION); if (locationMet == 0xFF) { - u8 levelMet = GetMonData(pokemon, MON_DATA_MET_LEVEL); + u8 levelMet = GetMonData(mon, MON_DATA_MET_LEVEL); ptr = PokemonSummaryScreen_CopyPokemonLevel(ptr, levelMet); *ptr = CHAR_NEWLINE; @@ -163,7 +3498,7 @@ void PokemonSummaryScreen_PrintTrainerMemo(struct Pokemon *pokemon, u8 left, u8 } else { - u8 levelMet = GetMonData(pokemon, MON_DATA_MET_LEVEL); + u8 levelMet = GetMonData(mon, MON_DATA_MET_LEVEL); ptr = PokemonSummaryScreen_CopyPokemonLevel(ptr, levelMet); *ptr = CHAR_NEWLINE; @@ -178,3 +3513,2065 @@ void PokemonSummaryScreen_PrintTrainerMemo(struct Pokemon *pokemon, u8 left, u8 MenuPrint(gStringVar4, left++, top++); } + +static void sub_80A0958(struct Pokemon *mon) +{ + u16 species; + u8 *buffer; + u8 level; + + species = GetMonData(mon, MON_DATA_SPECIES); + + buffer = gStringVar1; + buffer = sub_80A1E58(buffer, 13); + buffer[0] = EXT_CTRL_CODE_BEGIN; + buffer[1] = 0x11; + buffer[2] = 0x7; + buffer[3] = CHAR_SLASH; + buffer += 4; + buffer = StringCopy(buffer, gSpeciesNames[species]); + + buffer[0] = EXT_CTRL_CODE_BEGIN; + buffer[1] = 0x13; + buffer[2] = 0x50; + buffer[3] = EOS; + + MenuPrint(gStringVar1, 0, 14); + MenuZeroFillWindowRect(3, 16, 9, 17); + + level = GetMonData(mon, MON_DATA_LEVEL); + + buffer = sub_80A1E58(gStringVar1, 13); + buffer[0] = 0x34; + buffer += 1; + buffer = ConvertIntToDecimalString(buffer, level); + + buffer[0] = EXT_CTRL_CODE_BEGIN; + buffer[1] = 0x13; + buffer[2] = 0x20; + buffer[3] = EOS; + + MenuPrint(gStringVar1, 3, 16); + sub_80A0A2C(mon, 7, 16); +} + +static void sub_80A0A2C(struct Pokemon *mon, u8 left, u8 top) +{ + const u8 *genderSymbol; + u8 var1; + u8 bottom; + u16 species = GetMonData(mon, MON_DATA_SPECIES2); + + if (species != SPECIES_NIDORAN_M && species != SPECIES_NIDORAN_F) + { + u8 gender = GetMonGender(mon); + switch (gender) + { + default: + bottom = top + 1; + MenuZeroFillWindowRect(left, top, left, bottom); + return; + case MON_MALE: + genderSymbol = gOtherText_MaleSymbol2; + var1 = 11; + break; + case MON_FEMALE: + genderSymbol = gOtherText_FemaleSymbolAndLv; + var1 = 12; + break; + } + + sub_80A1FF8(genderSymbol, var1, left, top); + } +} + +u8 GetNumRibbons(struct Pokemon *mon) +{ + u8 numRibbons = GetMonData(mon, MON_DATA_COOL_RIBBON); + numRibbons += GetMonData(mon, MON_DATA_BEAUTY_RIBBON); + numRibbons += GetMonData(mon, MON_DATA_CUTE_RIBBON); + numRibbons += GetMonData(mon, MON_DATA_SMART_RIBBON); + numRibbons += GetMonData(mon, MON_DATA_TOUGH_RIBBON); + numRibbons += GetMonData(mon, MON_DATA_CHAMPION_RIBBON); + numRibbons += GetMonData(mon, MON_DATA_WINNING_RIBBON); + numRibbons += GetMonData(mon, MON_DATA_VICTORY_RIBBON); + numRibbons += GetMonData(mon, MON_DATA_ARTIST_RIBBON); + numRibbons += GetMonData(mon, MON_DATA_EFFORT_RIBBON); + numRibbons += GetMonData(mon, MON_DATA_GIFT_RIBBON_1); + numRibbons += GetMonData(mon, MON_DATA_GIFT_RIBBON_2); + numRibbons += GetMonData(mon, MON_DATA_GIFT_RIBBON_3); + numRibbons += GetMonData(mon, MON_DATA_GIFT_RIBBON_4); + numRibbons += GetMonData(mon, MON_DATA_GIFT_RIBBON_5); + numRibbons += GetMonData(mon, MON_DATA_GIFT_RIBBON_6); + numRibbons += GetMonData(mon, MON_DATA_GIFT_RIBBON_7); + + return numRibbons; +} + +static void PrintNumRibbons(struct Pokemon *mon) +{ + u8 numRibbons = GetNumRibbons(mon); + + if (numRibbons == 0) + { + StringCopy(gStringVar1, gOtherText_None); + } + else + { + u8 ribbonsStringLength; + u8 *text; + + StringCopy(gStringVar1, gOtherText_Ribbons00); + ribbonsStringLength = StringLength(gStringVar1); + + text = &gStringVar1[ribbonsStringLength - 2]; + + text[0] = EXT_CTRL_CODE_BEGIN; + text[1] = 0x14; + text[2] = 6; + ConvertIntToDecimalStringN(&text[3], numRibbons, 1, 2); + } + + MenuPrint(sUnknown_083C15AE, 21, 4); +} + +static void PrintHeldItemName(u16 itemId, u8 left, u8 top) +{ + if (itemId == ITEM_ENIGMA_BERRY + && sub_80F9344() == TRUE + && IsLinkDoubleBattle() == TRUE + && (pssData.monIndex == 1 || pssData.monIndex == 4 || pssData.monIndex == 5)) + { + StringCopy(gStringVar1, ItemId_GetItem(itemId)->name); + } + else if (itemId == 0) + { + StringCopy(gStringVar1, gOtherText_None); + } + else + { + CopyItemName(itemId, gStringVar1); + } + + MenuPrint(sUnknown_083C15B4, left, top); +} + +static void DrawExperienceProgressBar(struct Pokemon *mon, u8 left, u8 top) +{ + u32 curExperience; + u8 level; + u16 species; + u8 i; + u16 *vramAddr; + u32 expToNextLevel = 0; + s64 numExpProgressBarTicks = 0; + + curExperience = GetMonData(mon, MON_DATA_EXP); + level = GetMonData(mon, MON_DATA_LEVEL); + species = GetMonData(mon, MON_DATA_SPECIES); + + // The experience progress bar is shown as empty when the Pokemon is already level 100. + if (level < 100) + { + u32 nextLevelExp; + u32 expSinceLastLevel; + u32 expBetweenLevels; + u32 curLevelExperience; + + nextLevelExp = gExperienceTables[gBaseStats[species].growthRate][level + 1]; + expToNextLevel = nextLevelExp - curExperience; + curLevelExperience = gExperienceTables[gBaseStats[species].growthRate][level]; + expBetweenLevels = (nextLevelExp - curLevelExperience); + expSinceLastLevel = curExperience - curLevelExperience; + + // Calculate the number of 1-pixel "ticks" to illuminate in the experience progress bar. + // There are 8 tiles that make up the bar, and each tile has 8 "ticks". Hence, the numerator + // is multiplied by 64. + numExpProgressBarTicks = (expSinceLastLevel * 64) / expBetweenLevels; + if (numExpProgressBarTicks == 0 && expSinceLastLevel != 0) + { + // Ensure sure some exp. gain is visible in the progress bar. + numExpProgressBarTicks = 1; + } + } + + ConvertIntToDecimalString(gStringVar1, expToNextLevel); + MenuPrint_RightAligned(gStringVar1, left + 6, top); + + + // Draw each of the 8 tiles that make up the experience progress bar. + vramAddr = (u16 *)(VRAM + 0x4CAA); + for (i = 0; i < 8; i++) + { + u16 tile; + u16 baseTile = 0x2062; + + if (numExpProgressBarTicks > 7) + { + tile = 0x206A; // full exp. bar block + } + else + { + tile = (numExpProgressBarTicks % 8) + baseTile; + } + + vramAddr[i] = tile; + + numExpProgressBarTicks -= 8; + if (numExpProgressBarTicks < 0) + { + numExpProgressBarTicks = 0; + } + } +} + +// Prints the text displayed in the top-left or top-right of the screen. +// Each of the 4 summary screens displays different text. +static void PrintSummaryWindowHeaderText(void) +{ + u8 *buffer = gStringVar1; + + buffer[0] = EXT_CTRL_CODE_BEGIN; + buffer[1] = 0x12; + buffer[2] = 0x2; + + buffer += 3; + buffer = sub_80A1E58(buffer, 13); + buffer = StringCopy(buffer, sPageHeaderTexts[pssData.headerTextId]); + + buffer[0] = EXT_CTRL_CODE_BEGIN; + buffer[1] = 0x13; + buffer[2] = 0x58; + buffer[3] = EOS; + + MenuPrint(gStringVar1, 0, 0); + + if (pssData.headerActionTextId != 0) + { + GetStringCenterAlignXOffset(5, 23, 0); + GetStringCenterAlignXOffset(6, 24, 0); + } + else + { + MenuZeroFillWindowRect(23, 0, 24, 1); + } + + buffer = gStringVar1; + buffer = sub_80A1E58(buffer, 13); + buffer = StringCopy(buffer, sPageHeaderTexts[pssData.headerActionTextId]); + + buffer[0] = EXT_CTRL_CODE_BEGIN; + buffer[1] = 0x13; + buffer[2] = 0x28; + buffer[3] = EOS; + + MenuPrint(gStringVar1, 25, 0); +} + +// If the given pokemon previously had the pokerus virus, a small +// dot will be drawn in between the pokeball and the mon's level. +static void DrawPokerusSurvivorDot(struct Pokemon *mon) +{ + u16 *vram1 = (u16 *)(VRAM + 0xE444); + u16 *vram2 = (u16 *)(VRAM + 0xEC44); + + if (!CheckPartyPokerus(mon, 0) && CheckPartyHasHadPokerus(mon, 0)) + { + *vram1 = 0x2C; + *vram2 = 0x2C; + } + else + { + *vram1 = 0x081A; + *vram2 = 0x081A; + } +} + +// Draws the 4 small navigation circles at the top of the pokemon summary screen. +#ifdef NONMATCHING +static void DrawSummaryScreenNavigationDots(void) +{ + void *dest; + u16 arr[8]; + u8 i = 0; + struct PokemonSummaryScreenStruct *SS = (struct PokemonSummaryScreenStruct *)(gSharedMem + 0x18000); + u16 var1 = 0x4040; + u16 var2 = 0x404A; + + for (i = 0; i < 4; i++) + { + if (i < SS->unk75) + { + arr[i * 2] = var1; + arr[(i * 2) + 1] = var1 + 1; + } + else if (i > SS->unk76) + { + arr[i * 2] = var2; + arr[(i * 2) + 1] = var2 + 1; + } + else + { + if (i < SS->unkB) + { + arr[i * 2] = 0x4046; + arr[(i * 2) + 1] = 0x4046 + 1; + } + + if (i == SS->unkB) + { + if (i != SS->unk76) + { + arr[i * 2] = 0x4041; + arr[(i * 2) + 1] = 0x4041 + 1; + } + else + { + arr[i * 2] = 0x404B; + arr[(i * 2) + 1] = 0x404B + 1; + } + } + + if (i > SS->unkB) + { + if (i != SS->unk76) + { + arr[i * 2] = 0x4043; + arr[(i * 2) + 1] = 0x4043 + 1; + } + else + { + arr[i * 2] = 0x4048; + arr[(i * 2) + 1] = 0x4048 + 1; + } + } + } + } + + dest = (void *)(VRAM + 0xE016); + DmaCopy16(3, arr, dest, 16); + + for (i = 0; i < 8; i++) + { + arr[i] += 0x10; + } + + dest = (void *)(VRAM + 0xE056); + DmaCopy16(3, arr, dest, 16); +} +#else +__attribute__((naked)) +static void DrawSummaryScreenNavigationDots(void) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0x10\n\ + movs r3, 0\n\ + ldr r6, _080A0F24 @ =gSharedMem + 0x18000\n\ + adds r5, r6, 0\n\ + ldr r1, _080A0F28 @ =0x00004040\n\ + mov r8, r1\n\ + ldr r2, _080A0F2C @ =0x0000404a\n\ + mov r10, r2\n\ +_080A0F02:\n\ + adds r0, r5, 0\n\ + adds r0, 0x75\n\ + ldrb r0, [r0]\n\ + cmp r3, r0\n\ + bcs _080A0F30\n\ + lsls r1, r3, 1\n\ + lsls r0, r3, 2\n\ + add r0, sp\n\ + mov r4, r8\n\ + strh r4, [r0]\n\ + adds r1, 0x1\n\ + lsls r1, 1\n\ + mov r7, sp\n\ + adds r0, r7, r1\n\ + strh r4, [r0]\n\ + b _080A0FE2\n\ + .align 2, 0\n\ +_080A0F24: .4byte gSharedMem + 0x18000\n\ +_080A0F28: .4byte 0x00004040\n\ +_080A0F2C: .4byte 0x0000404a\n\ +_080A0F30:\n\ + movs r0, 0x76\n\ + adds r0, r6\n\ + mov r12, r0\n\ + ldrb r1, [r0]\n\ + cmp r3, r1\n\ + bls _080A0F52\n\ + lsls r1, r3, 1\n\ + lsls r0, r3, 2\n\ + add r0, sp\n\ + mov r2, r10\n\ + strh r2, [r0]\n\ + adds r1, 0x1\n\ + lsls r1, 1\n\ + mov r4, sp\n\ + adds r0, r4, r1\n\ + strh r2, [r0]\n\ + b _080A0FE2\n\ +_080A0F52:\n\ + ldrb r4, [r5, 0xB]\n\ + cmp r3, r4\n\ + bcs _080A0F6E\n\ + lsls r1, r3, 1\n\ + lsls r0, r3, 2\n\ + mov r7, sp\n\ + adds r2, r7, r0\n\ + ldr r0, _080A0F88 @ =0x00004046\n\ + strh r0, [r2]\n\ + adds r1, 0x1\n\ + lsls r1, 1\n\ + add r1, sp\n\ + adds r0, 0x1\n\ + strh r0, [r1]\n\ +_080A0F6E:\n\ + cmp r3, r4\n\ + bne _080A0FA6\n\ + mov r0, r12\n\ + ldrb r0, [r0]\n\ + cmp r3, r0\n\ + beq _080A0F90\n\ + lsls r1, r3, 1\n\ + lsls r0, r3, 2\n\ + mov r4, sp\n\ + adds r2, r4, r0\n\ + ldr r0, _080A0F8C @ =0x00004041\n\ + b _080A0F9A\n\ + .align 2, 0\n\ +_080A0F88: .4byte 0x00004046\n\ +_080A0F8C: .4byte 0x00004041\n\ +_080A0F90:\n\ + lsls r1, r3, 1\n\ + lsls r0, r3, 2\n\ + mov r7, sp\n\ + adds r2, r7, r0\n\ + ldr r0, _080A0FC4 @ =0x0000404b\n\ +_080A0F9A:\n\ + strh r0, [r2]\n\ + adds r1, 0x1\n\ + lsls r1, 1\n\ + add r1, sp\n\ + adds r0, 0x1\n\ + strh r0, [r1]\n\ +_080A0FA6:\n\ + ldrb r0, [r5, 0xB]\n\ + cmp r3, r0\n\ + bls _080A0FE2\n\ + adds r0, r6, 0\n\ + adds r0, 0x76\n\ + ldrb r0, [r0]\n\ + cmp r3, r0\n\ + beq _080A0FCC\n\ + lsls r1, r3, 1\n\ + lsls r0, r3, 2\n\ + mov r4, sp\n\ + adds r2, r4, r0\n\ + ldr r0, _080A0FC8 @ =0x00004043\n\ + b _080A0FD6\n\ + .align 2, 0\n\ +_080A0FC4: .4byte 0x0000404b\n\ +_080A0FC8: .4byte 0x00004043\n\ +_080A0FCC:\n\ + lsls r1, r3, 1\n\ + lsls r0, r3, 2\n\ + mov r7, sp\n\ + adds r2, r7, r0\n\ + ldr r0, _080A1034 @ =0x00004048\n\ +_080A0FD6:\n\ + strh r0, [r2]\n\ + adds r1, 0x1\n\ + lsls r1, 1\n\ + add r1, sp\n\ + adds r0, 0x1\n\ + strh r0, [r1]\n\ +_080A0FE2:\n\ + adds r0, r3, 0x1\n\ + lsls r0, 24\n\ + lsrs r3, r0, 24\n\ + cmp r3, 0x3\n\ + bls _080A0F02\n\ + ldr r1, _080A1038 @ =0x0600e016\n\ + ldr r0, _080A103C @ =0x040000d4\n\ + mov r2, sp\n\ + str r2, [r0]\n\ + str r1, [r0, 0x4]\n\ + ldr r1, _080A1040 @ =0x80000008\n\ + str r1, [r0, 0x8]\n\ + ldr r0, [r0, 0x8]\n\ + movs r3, 0\n\ +_080A0FFE:\n\ + lsls r0, r3, 1\n\ + mov r4, sp\n\ + adds r1, r4, r0\n\ + ldrh r0, [r1]\n\ + adds r0, 0x10\n\ + strh r0, [r1]\n\ + adds r0, r3, 0x1\n\ + lsls r0, 24\n\ + lsrs r3, r0, 24\n\ + cmp r3, 0x7\n\ + bls _080A0FFE\n\ + ldr r1, _080A1044 @ =0x0600e056\n\ + ldr r0, _080A103C @ =0x040000d4\n\ + str r4, [r0]\n\ + str r1, [r0, 0x4]\n\ + ldr r1, _080A1040 @ =0x80000008\n\ + str r1, [r0, 0x8]\n\ + ldr r0, [r0, 0x8]\n\ + add sp, 0x10\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_080A1034: .4byte 0x00004048\n\ +_080A1038: .4byte 0x0600e016\n\ +_080A103C: .4byte 0x040000d4\n\ +_080A1040: .4byte 0x80000008\n\ +_080A1044: .4byte 0x0600e056\n\ + .syntax divided\n"); +} +#endif // NONMATCHING + +__attribute__((naked)) +void sub_80A1048(u8 taskId) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r8\n\ + push {r7}\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + mov r8, r0\n\ + lsls r0, 2\n\ + add r0, r8\n\ + lsls r0, 3\n\ + ldr r1, _080A10A0 @ =gTasks + 0x8\n\ + adds r6, r0, r1\n\ + ldrh r0, [r6]\n\ + ldrh r1, [r6, 0x2]\n\ + adds r0, r1\n\ + strh r0, [r6, 0x2]\n\ + lsls r0, 16\n\ + cmp r0, 0\n\ + bne _080A106E\n\ + b _080A1224\n\ +_080A106E:\n\ + movs r5, 0x2\n\ + ldrsh r2, [r6, r5]\n\ + ldr r0, _080A10A4 @ =0x0000024a\n\ + subs r0, r2\n\ + lsls r0, 1\n\ + ldr r1, _080A10A8 @ =gUnknown_08E73508\n\ + adds r4, r0, r1\n\ + ldr r5, _080A10AC @ =0x0600e480\n\ + lsls r2, 1\n\ + movs r0, 0x80\n\ + lsls r0, 5\n\ + adds r7, r1, 0\n\ + cmp r2, r0\n\ + bhi _080A10B4\n\ + ldr r0, _080A10B0 @ =0x040000d4\n\ + str r4, [r0]\n\ + str r5, [r0, 0x4]\n\ + lsrs r1, r2, 1\n\ + movs r2, 0x80\n\ + lsls r2, 24\n\ + orrs r1, r2\n\ + str r1, [r0, 0x8]\n\ + ldr r0, [r0, 0x8]\n\ + b _080A10E0\n\ + .align 2, 0\n\ +_080A10A0: .4byte gTasks + 0x8\n\ +_080A10A4: .4byte 0x0000024a\n\ +_080A10A8: .4byte gUnknown_08E73508\n\ +_080A10AC: .4byte 0x0600e480\n\ +_080A10B0: .4byte 0x040000d4\n\ +_080A10B4:\n\ + ldr r3, _080A110C @ =0x040000d4\n\ + str r4, [r3]\n\ + str r5, [r3, 0x4]\n\ + ldr r0, _080A1110 @ =0x80000800\n\ + str r0, [r3, 0x8]\n\ + ldr r0, [r3, 0x8]\n\ + movs r0, 0x80\n\ + lsls r0, 5\n\ + adds r4, r0\n\ + adds r5, r0\n\ + ldr r1, _080A1114 @ =0xfffff000\n\ + adds r2, r1\n\ + cmp r2, r0\n\ + bhi _080A10B4\n\ + str r4, [r3]\n\ + str r5, [r3, 0x4]\n\ + lsrs r0, r2, 1\n\ + movs r1, 0x80\n\ + lsls r1, 24\n\ + orrs r0, r1\n\ + str r0, [r3, 0x8]\n\ + ldr r0, [r3, 0x8]\n\ +_080A10E0:\n\ + movs r5, 0x2\n\ + ldrsh r0, [r6, r5]\n\ + ldr r1, _080A1118 @ =0x0000026a\n\ + subs r1, r0\n\ + lsls r1, 1\n\ + adds r3, r1, r7\n\ + ldr r4, _080A111C @ =0x0600e4c0\n\ + lsls r1, r0, 1\n\ + movs r0, 0x80\n\ + lsls r0, 5\n\ + cmp r1, r0\n\ + bhi _080A1120\n\ + ldr r0, _080A110C @ =0x040000d4\n\ + str r3, [r0]\n\ + str r4, [r0, 0x4]\n\ + lsrs r1, 1\n\ + movs r2, 0x80\n\ + lsls r2, 24\n\ + orrs r1, r2\n\ + str r1, [r0, 0x8]\n\ + ldr r0, [r0, 0x8]\n\ + b _080A114C\n\ + .align 2, 0\n\ +_080A110C: .4byte 0x040000d4\n\ +_080A1110: .4byte 0x80000800\n\ +_080A1114: .4byte 0xfffff000\n\ +_080A1118: .4byte 0x0000026a\n\ +_080A111C: .4byte 0x0600e4c0\n\ +_080A1120:\n\ + ldr r2, _080A1178 @ =0x040000d4\n\ + str r3, [r2]\n\ + str r4, [r2, 0x4]\n\ + ldr r0, _080A117C @ =0x80000800\n\ + str r0, [r2, 0x8]\n\ + ldr r0, [r2, 0x8]\n\ + movs r0, 0x80\n\ + lsls r0, 5\n\ + adds r3, r0\n\ + adds r4, r0\n\ + ldr r5, _080A1180 @ =0xfffff000\n\ + adds r1, r5\n\ + cmp r1, r0\n\ + bhi _080A1120\n\ + str r3, [r2]\n\ + str r4, [r2, 0x4]\n\ + lsrs r0, r1, 1\n\ + movs r1, 0x80\n\ + lsls r1, 24\n\ + orrs r0, r1\n\ + str r0, [r2, 0x8]\n\ + ldr r0, [r2, 0x8]\n\ +_080A114C:\n\ + movs r1, 0x2\n\ + ldrsh r0, [r6, r1]\n\ + ldr r1, _080A1184 @ =0x0000024a\n\ + subs r1, r0\n\ + lsls r1, 1\n\ + adds r3, r1, r7\n\ + ldr r4, _080A1188 @ =0x0600ec80\n\ + lsls r1, r0, 1\n\ + movs r0, 0x80\n\ + lsls r0, 5\n\ + cmp r1, r0\n\ + bhi _080A118C\n\ + ldr r0, _080A1178 @ =0x040000d4\n\ + str r3, [r0]\n\ + str r4, [r0, 0x4]\n\ + lsrs r1, 1\n\ + movs r2, 0x80\n\ + lsls r2, 24\n\ + orrs r1, r2\n\ + str r1, [r0, 0x8]\n\ + ldr r0, [r0, 0x8]\n\ + b _080A11B8\n\ + .align 2, 0\n\ +_080A1178: .4byte 0x040000d4\n\ +_080A117C: .4byte 0x80000800\n\ +_080A1180: .4byte 0xfffff000\n\ +_080A1184: .4byte 0x0000024a\n\ +_080A1188: .4byte 0x0600ec80\n\ +_080A118C:\n\ + ldr r2, _080A11E4 @ =0x040000d4\n\ + str r3, [r2]\n\ + str r4, [r2, 0x4]\n\ + ldr r0, _080A11E8 @ =0x80000800\n\ + str r0, [r2, 0x8]\n\ + ldr r0, [r2, 0x8]\n\ + movs r0, 0x80\n\ + lsls r0, 5\n\ + adds r3, r0\n\ + adds r4, r0\n\ + ldr r5, _080A11EC @ =0xfffff000\n\ + adds r1, r5\n\ + cmp r1, r0\n\ + bhi _080A118C\n\ + str r3, [r2]\n\ + str r4, [r2, 0x4]\n\ + lsrs r0, r1, 1\n\ + movs r1, 0x80\n\ + lsls r1, 24\n\ + orrs r0, r1\n\ + str r0, [r2, 0x8]\n\ + ldr r0, [r2, 0x8]\n\ +_080A11B8:\n\ + movs r1, 0x2\n\ + ldrsh r0, [r6, r1]\n\ + ldr r1, _080A11F0 @ =0x0000026a\n\ + subs r1, r0\n\ + lsls r1, 1\n\ + adds r3, r1, r7\n\ + ldr r4, _080A11F4 @ =0x0600ecc0\n\ + lsls r1, r0, 1\n\ + movs r0, 0x80\n\ + lsls r0, 5\n\ + cmp r1, r0\n\ + bhi _080A11F8\n\ + ldr r0, _080A11E4 @ =0x040000d4\n\ + str r3, [r0]\n\ + str r4, [r0, 0x4]\n\ + lsrs r1, 1\n\ + movs r2, 0x80\n\ + lsls r2, 24\n\ + orrs r1, r2\n\ + str r1, [r0, 0x8]\n\ + ldr r0, [r0, 0x8]\n\ + b _080A1224\n\ + .align 2, 0\n\ +_080A11E4: .4byte 0x040000d4\n\ +_080A11E8: .4byte 0x80000800\n\ +_080A11EC: .4byte 0xfffff000\n\ +_080A11F0: .4byte 0x0000026a\n\ +_080A11F4: .4byte 0x0600ecc0\n\ +_080A11F8:\n\ + ldr r2, _080A12B0 @ =0x040000d4\n\ + str r3, [r2]\n\ + str r4, [r2, 0x4]\n\ + ldr r0, _080A12B4 @ =0x80000800\n\ + str r0, [r2, 0x8]\n\ + ldr r0, [r2, 0x8]\n\ + movs r0, 0x80\n\ + lsls r0, 5\n\ + adds r3, r0\n\ + adds r4, r0\n\ + ldr r5, _080A12B8 @ =0xfffff000\n\ + adds r1, r5\n\ + cmp r1, r0\n\ + bhi _080A11F8\n\ + str r3, [r2]\n\ + str r4, [r2, 0x4]\n\ + lsrs r0, r1, 1\n\ + movs r1, 0x80\n\ + lsls r1, 24\n\ + orrs r0, r1\n\ + str r0, [r2, 0x8]\n\ + ldr r0, [r2, 0x8]\n\ +_080A1224:\n\ + ldrb r4, [r6, 0x2]\n\ + ldrh r7, [r6, 0x2]\n\ + ldrh r0, [r6]\n\ + mov r12, r0\n\ + cmp r4, 0x9\n\ + bhi _080A1272\n\ + adds r3, r6, 0x4\n\ + ldr r2, _080A12B0 @ =0x040000d4\n\ + ldr r5, _080A12BC @ =0x80000001\n\ +_080A1236:\n\ + lsls r1, r4, 1\n\ + ldr r6, _080A12C0 @ =0x0600e480\n\ + adds r0, r1, r6\n\ + str r3, [r2]\n\ + str r0, [r2, 0x4]\n\ + str r5, [r2, 0x8]\n\ + ldr r0, [r2, 0x8]\n\ + adds r6, 0x40\n\ + adds r0, r1, r6\n\ + str r3, [r2]\n\ + str r0, [r2, 0x4]\n\ + str r5, [r2, 0x8]\n\ + ldr r0, [r2, 0x8]\n\ + ldr r6, _080A12C4 @ =0x0600ec80\n\ + adds r0, r1, r6\n\ + str r3, [r2]\n\ + str r0, [r2, 0x4]\n\ + str r5, [r2, 0x8]\n\ + ldr r0, [r2, 0x8]\n\ + ldr r0, _080A12C8 @ =0x0600ecc0\n\ + adds r1, r0\n\ + str r3, [r2]\n\ + str r1, [r2, 0x4]\n\ + str r5, [r2, 0x8]\n\ + ldr r0, [r2, 0x8]\n\ + adds r0, r4, 0x1\n\ + lsls r0, 24\n\ + lsrs r4, r0, 24\n\ + cmp r4, 0x9\n\ + bls _080A1236\n\ +_080A1272:\n\ + mov r1, r12\n\ + lsls r0, r1, 16\n\ + cmp r0, 0\n\ + beq _080A1286\n\ + lsls r0, r7, 16\n\ + asrs r0, 16\n\ + cmp r0, 0\n\ + ble _080A1286\n\ + cmp r0, 0x9\n\ + ble _080A12A4\n\ +_080A1286:\n\ + lsls r0, r7, 16\n\ + asrs r0, 16\n\ + cmp r0, 0x9\n\ + ble _080A129A\n\ + ldr r0, _080A12CC @ =gOtherText_Status\n\ + movs r1, 0xD\n\ + movs r2, 0x1\n\ + movs r3, 0x12\n\ + bl sub_80A1FF8\n\ +_080A129A:\n\ + bl sub_80A1D18\n\ + mov r0, r8\n\ + bl DestroyTask\n\ +_080A12A4:\n\ + pop {r3}\n\ + mov r8, r3\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_080A12B0: .4byte 0x040000d4\n\ +_080A12B4: .4byte 0x80000800\n\ +_080A12B8: .4byte 0xfffff000\n\ +_080A12BC: .4byte 0x80000001\n\ +_080A12C0: .4byte 0x0600e480\n\ +_080A12C4: .4byte 0x0600ec80\n\ +_080A12C8: .4byte 0x0600ecc0\n\ +_080A12CC: .4byte gOtherText_Status\n\ + .syntax divided\n"); +} + +static void sub_80A12D0(s8 a) +{ + u8 newTaskId; + + MenuZeroFillWindowRect(1, 18, 5, 19); + sub_80A18E4(29); + + newTaskId = CreateTask(sub_80A1048, 0); + gTasks[newTaskId].data[0] = a; + + if (a < 0) + { + gTasks[newTaskId].data[1] = 10; + } + else + { + gTasks[newTaskId].data[1] = 0; + } + + gTasks[newTaskId].data[2] = 1; +} + +// void sub_80A1334(u8 taskId) +// { +// u8 i; +// s16 var1; + +// gTasks[taskId].data[1] += gTasks[taskId].data[0]; + +// var1 = 0; +// if (gTasks[taskId].data[1] >= 0) +// { +// var1 = 10; +// if (gTasks[taskId].data[1] < 10) +// { +// var1 = gTasks[taskId].data[1]; +// } +// } + +// if (var1 > 0) +// { +// u8 *vramAddr = (u8 *)(VRAM + 0x5B40); +// for (i = 0; i < 7; i++) +// { +// CpuSet(&gUnknown_08E73E88[(i + 13) * 64], vramAddr, var1 & 0x1FFFFF); +// vramAddr += 64; +// } +// } + +// if (var1 <= 9) +// { +// u8 *vramAddr = (u8 *)(VRAM + 0x5B40); +// for (i = 0; i < 64; i++) +// { +// u16 val = gTasks[taskId].data[2]; +// CpuSet(&val, vramAddr, ((10 - var1) & 0x1FFFFF) | 0x800000); +// } +// } +// else +// { +// MenuZeroFillWindowRect(0, 19, 9, 19); +// } + +// if (gTasks[taskId].data[0] == 0 || gTasks[taskId].data[1] < 0) +// { +// if (pssData.page == PSS_PAGE_BATTLE_MOVES) +// { +// MenuZeroFillWindowRect(0, 14, 9, 18); +// sub_80A0958(pssData.loadedMon); + +// if (GetMonStatusAndPokerus(pssData.loadedMon)) +// { +// sub_80A1FF8(gOtherText_Status, 13, 1, 18); +// } + +// DestroyTask(taskId); +// } +// } + +// if (gTasks[taskId].data[1] > 9) +// { +// if (pssData.page == PSS_PAGE_BATTLE_MOVES) +// { +// sub_80A00F4(gTasks[taskId].data[3]); +// } + +// sub_80A0428(pssData.loadedMon, &gTasks[taskId].data[3]); +// DestroyTask(taskId); +// } +// } +__attribute__((naked)) +static void sub_80A1334(u8 taskId) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0x4\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + mov r10, r0\n\ + lsls r0, 2\n\ + add r0, r10\n\ + lsls r0, 3\n\ + ldr r1, _080A13E4 @ =gTasks + 0x8\n\ + adds r7, r0, r1\n\ + ldrh r0, [r7]\n\ + ldrh r1, [r7, 0x2]\n\ + adds r0, r1\n\ + strh r0, [r7, 0x2]\n\ + lsls r0, 16\n\ + asrs r1, r0, 16\n\ + movs r0, 0\n\ + cmp r1, 0\n\ + blt _080A136A\n\ + movs r0, 0xA\n\ + cmp r1, 0xA\n\ + bgt _080A136A\n\ + ldrh r0, [r7, 0x2]\n\ +_080A136A:\n\ + lsls r0, 16\n\ + asrs r2, r0, 16\n\ + mov r9, r0\n\ + cmp r2, 0\n\ + ble _080A13A6\n\ + movs r0, 0xA\n\ + subs r0, r2\n\ + lsls r0, 1\n\ + ldr r1, _080A13E8 @ =0x06005b40\n\ + adds r4, r0, r1\n\ + movs r5, 0\n\ + adds r6, r2, 0\n\ + ldr r0, _080A13EC @ =0x001fffff\n\ + mov r8, r0\n\ +_080A1386:\n\ + adds r0, r5, 0\n\ + adds r0, 0xD\n\ + lsls r0, 6\n\ + ldr r1, _080A13F0 @ =gUnknown_08E73E88\n\ + adds r0, r1\n\ + adds r1, r4, 0\n\ + mov r2, r8\n\ + ands r2, r6\n\ + bl CpuSet\n\ + adds r4, 0x40\n\ + adds r0, r5, 0x1\n\ + lsls r0, 24\n\ + lsrs r5, r0, 24\n\ + cmp r5, 0x6\n\ + bls _080A1386\n\ +_080A13A6:\n\ + mov r1, r9\n\ + asrs r2, r1, 16\n\ + cmp r2, 0x9\n\ + bgt _080A13F4\n\ + ldr r4, _080A13E8 @ =0x06005b40\n\ + movs r5, 0\n\ + mov r8, sp\n\ + movs r0, 0xA\n\ + subs r6, r0, r2\n\ + ldr r0, _080A13EC @ =0x001fffff\n\ + ands r6, r0\n\ + movs r0, 0x80\n\ + lsls r0, 17\n\ + mov r9, r0\n\ +_080A13C2:\n\ + ldrh r0, [r7, 0x4]\n\ + mov r1, r8\n\ + strh r0, [r1]\n\ + mov r0, sp\n\ + adds r1, r4, 0\n\ + mov r2, r9\n\ + orrs r2, r6\n\ + bl CpuSet\n\ + adds r4, 0x40\n\ + adds r0, r5, 0x1\n\ + lsls r0, 24\n\ + lsrs r5, r0, 24\n\ + cmp r5, 0x6\n\ + bls _080A13C2\n\ + b _080A1400\n\ + .align 2, 0\n\ +_080A13E4: .4byte gTasks + 0x8\n\ +_080A13E8: .4byte 0x06005b40\n\ +_080A13EC: .4byte 0x001fffff\n\ +_080A13F0: .4byte gUnknown_08E73E88\n\ +_080A13F4:\n\ + movs r0, 0\n\ + movs r1, 0x13\n\ + movs r2, 0x9\n\ + movs r3, 0x13\n\ + bl MenuZeroFillWindowRect\n\ +_080A1400:\n\ + movs r1, 0\n\ + ldrsh r0, [r7, r1]\n\ + cmp r0, 0\n\ + beq _080A1410\n\ + movs r1, 0x2\n\ + ldrsh r0, [r7, r1]\n\ + cmp r0, 0\n\ + bge _080A144A\n\ +_080A1410:\n\ + ldr r4, _080A1480 @ =gSharedMem + 0x18000\n\ + ldrb r0, [r4, 0xB]\n\ + cmp r0, 0x2\n\ + bne _080A1444\n\ + movs r0, 0\n\ + movs r1, 0xE\n\ + movs r2, 0x9\n\ + movs r3, 0x12\n\ + bl MenuZeroFillWindowRect\n\ + adds r4, 0x10\n\ + adds r0, r4, 0\n\ + bl sub_80A0958\n\ + adds r0, r4, 0\n\ + bl GetMonStatusAndPokerus\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + beq _080A1444\n\ + ldr r0, _080A1484 @ =gOtherText_Status\n\ + movs r1, 0xD\n\ + movs r2, 0x1\n\ + movs r3, 0x12\n\ + bl sub_80A1FF8\n\ +_080A1444:\n\ + mov r0, r10\n\ + bl DestroyTask\n\ +_080A144A:\n\ + movs r1, 0x2\n\ + ldrsh r0, [r7, r1]\n\ + cmp r0, 0x9\n\ + ble _080A1470\n\ + ldr r4, _080A1480 @ =gSharedMem + 0x18000\n\ + ldrb r0, [r4, 0xB]\n\ + cmp r0, 0x2\n\ + bne _080A1460\n\ + ldrb r0, [r7, 0x6]\n\ + bl sub_80A00F4\n\ +_080A1460:\n\ + adds r0, r4, 0\n\ + adds r0, 0x10\n\ + adds r1, r7, 0x6\n\ + bl sub_80A0428\n\ + mov r0, r10\n\ + bl DestroyTask\n\ +_080A1470:\n\ + add sp, 0x4\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_080A1480: .4byte gSharedMem + 0x18000\n\ +_080A1484: .4byte gOtherText_Status\n\ + .syntax divided\n"); +} + +// Related to re-drawing the summary area underneath the pokemon's picture +// in all of the summary screen tabs. +static void sub_80A1488(s8 a, u8 b) +{ + u8 taskId; + + if (pssData.page == PSS_PAGE_BATTLE_MOVES) + { + MenuZeroFillWindowRect(0, 14, 9, 19); + } + + taskId = FindTaskIdByFunc(sub_80A1334); + if (taskId == 0xFF) + { + taskId = CreateTask(sub_80A1334, 0); + } + + gTasks[taskId].data[0] = (s8)a; + + if ((s8)a < 0) + { + gTasks[taskId].data[1] = 10; + } + else + { + gTasks[taskId].data[1] = 0; + } + + gTasks[taskId].data[2] = 0; + gTasks[taskId].data[3] = b; +} + +__attribute__((naked)) +static void sub_80A1500(u8 taskId) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0x4\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + mov r10, r0\n\ + lsls r0, 2\n\ + add r0, r10\n\ + lsls r0, 3\n\ + ldr r1, _080A15B0 @ =gTasks + 0x8\n\ + adds r7, r0, r1\n\ + ldrh r0, [r7]\n\ + ldrh r1, [r7, 0x2]\n\ + adds r0, r1\n\ + strh r0, [r7, 0x2]\n\ + lsls r0, 16\n\ + asrs r1, r0, 16\n\ + movs r0, 0\n\ + cmp r1, 0\n\ + blt _080A1536\n\ + movs r0, 0xA\n\ + cmp r1, 0xA\n\ + bgt _080A1536\n\ + ldrh r0, [r7, 0x2]\n\ +_080A1536:\n\ + lsls r0, 16\n\ + asrs r2, r0, 16\n\ + mov r9, r0\n\ + cmp r2, 0\n\ + ble _080A1572\n\ + movs r0, 0xA\n\ + subs r0, r2\n\ + lsls r0, 1\n\ + ldr r1, _080A15B4 @ =0x06006b40\n\ + adds r4, r0, r1\n\ + movs r5, 0\n\ + adds r6, r2, 0\n\ + ldr r0, _080A15B8 @ =0x001fffff\n\ + mov r8, r0\n\ +_080A1552:\n\ + adds r0, r5, 0\n\ + adds r0, 0xD\n\ + lsls r0, 6\n\ + ldr r1, _080A15BC @ =gUnknown_08E74688\n\ + adds r0, r1\n\ + adds r1, r4, 0\n\ + mov r2, r8\n\ + ands r2, r6\n\ + bl CpuSet\n\ + adds r4, 0x40\n\ + adds r0, r5, 0x1\n\ + lsls r0, 24\n\ + lsrs r5, r0, 24\n\ + cmp r5, 0x6\n\ + bls _080A1552\n\ +_080A1572:\n\ + mov r1, r9\n\ + asrs r2, r1, 16\n\ + cmp r2, 0x9\n\ + bgt _080A15C0\n\ + ldr r4, _080A15B4 @ =0x06006b40\n\ + movs r5, 0\n\ + mov r8, sp\n\ + movs r0, 0xA\n\ + subs r6, r0, r2\n\ + ldr r0, _080A15B8 @ =0x001fffff\n\ + ands r6, r0\n\ + movs r0, 0x80\n\ + lsls r0, 17\n\ + mov r9, r0\n\ +_080A158E:\n\ + ldrh r0, [r7, 0x4]\n\ + mov r1, r8\n\ + strh r0, [r1]\n\ + mov r0, sp\n\ + adds r1, r4, 0\n\ + mov r2, r9\n\ + orrs r2, r6\n\ + bl CpuSet\n\ + adds r4, 0x40\n\ + adds r0, r5, 0x1\n\ + lsls r0, 24\n\ + lsrs r5, r0, 24\n\ + cmp r5, 0x6\n\ + bls _080A158E\n\ + b _080A15CC\n\ + .align 2, 0\n\ +_080A15B0: .4byte gTasks + 0x8\n\ +_080A15B4: .4byte 0x06006b40\n\ +_080A15B8: .4byte 0x001fffff\n\ +_080A15BC: .4byte gUnknown_08E74688\n\ +_080A15C0:\n\ + movs r0, 0\n\ + movs r1, 0x13\n\ + movs r2, 0x9\n\ + movs r3, 0x13\n\ + bl MenuZeroFillWindowRect\n\ +_080A15CC:\n\ + movs r1, 0\n\ + ldrsh r0, [r7, r1]\n\ + cmp r0, 0\n\ + beq _080A15DC\n\ + movs r1, 0x2\n\ + ldrsh r0, [r7, r1]\n\ + cmp r0, 0\n\ + bge _080A1616\n\ +_080A15DC:\n\ + ldr r4, _080A164C @ =gSharedMem + 0x18000\n\ + ldrb r0, [r4, 0xB]\n\ + cmp r0, 0x3\n\ + bne _080A1610\n\ + movs r0, 0\n\ + movs r1, 0xE\n\ + movs r2, 0x9\n\ + movs r3, 0x12\n\ + bl MenuZeroFillWindowRect\n\ + adds r4, 0x10\n\ + adds r0, r4, 0\n\ + bl sub_80A0958\n\ + adds r0, r4, 0\n\ + bl GetMonStatusAndPokerus\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + beq _080A1610\n\ + ldr r0, _080A1650 @ =gOtherText_Status\n\ + movs r1, 0xD\n\ + movs r2, 0x1\n\ + movs r3, 0x12\n\ + bl sub_80A1FF8\n\ +_080A1610:\n\ + mov r0, r10\n\ + bl DestroyTask\n\ +_080A1616:\n\ + movs r1, 0x2\n\ + ldrsh r0, [r7, r1]\n\ + cmp r0, 0x9\n\ + ble _080A163C\n\ + ldr r4, _080A164C @ =gSharedMem + 0x18000\n\ + ldrb r0, [r4, 0xB]\n\ + cmp r0, 0x3\n\ + bne _080A162C\n\ + ldrb r0, [r7, 0x6]\n\ + bl sub_80A00F4\n\ +_080A162C:\n\ + adds r0, r4, 0\n\ + adds r0, 0x10\n\ + adds r1, r7, 0x6\n\ + bl sub_80A0428\n\ + mov r0, r10\n\ + bl DestroyTask\n\ +_080A163C:\n\ + add sp, 0x4\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_080A164C: .4byte gSharedMem + 0x18000\n\ +_080A1650: .4byte gOtherText_Status\n\ + .syntax divided\n"); +} + +static void sub_80A1654(s8 a, u8 b) +{ + u8 taskId; + + if (pssData.page == PSS_PAGE_CONTEST_MOVES) + { + MenuZeroFillWindowRect(0, 14, 9, 19); + } + + taskId = FindTaskIdByFunc(sub_80A1500); + if (taskId == 0xFF) + { + taskId = CreateTask(sub_80A1500, 0); + } + + gTasks[taskId].data[0] = (s8)a; + + if ((s8)a < 0) + { + gTasks[taskId].data[1] = 10; + } + else + { + gTasks[taskId].data[1] = 0; + } + + gTasks[taskId].data[2] = 0; + gTasks[taskId].data[3] = b; +} + +#ifdef NONMATCHING +static void sub_80A16CC(u8 a) +{ + u8 i; + u16 *vramAddr = (u16 *)(VRAM + 0x6AD4); + + if (a == 0) + { + for (i = 0; i < 20; i++) + { + vramAddr[i] = gUnknown_08E94510[i] + 0x1000; + vramAddr[i + 0x20] = gUnknown_08E94510[i] + 0x1000; + vramAddr[i + 0x40] = gUnknown_08E94550[i] + 0x1000; + } + } + else + { + i = 0; + for (i = 0; i < 20; i++) + { + vramAddr[i] = gUnknown_08E94550[i] + 0x1000; + vramAddr[i + 0x20] = gUnknown_08E94590[i] + 0x1000; + vramAddr[i + 0x40] = gUnknown_08E94590[i] + 0x1000; + } + } + + vramAddr = (u16 *)(VRAM + 0x5AD4); + + if (a == 0) + { + for (i = 0; i < 20; i++) + { + vramAddr[i] = gUnknown_08E94510[i] + 0x3000; + vramAddr[i + 0x20] = gUnknown_08E94510[i] + 0x3000; + vramAddr[i + 0x40] = gUnknown_08E94550[i] + 0x3000; + } + } + else + { + for (i = 0; i < 20; i++) + { + vramAddr[i] = gUnknown_08E94550[i] + 0x3000; + vramAddr[i + 0x20] = gUnknown_08E94590[i] + 0x3000; + vramAddr[i + 0x40] = gUnknown_08E94590[i] + 0x3000; + } + } +} +#else +__attribute__((naked)) +static void sub_80A16CC(u8 a) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r9\n\ + mov r6, r8\n\ + push {r6,r7}\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + mov r9, r0\n\ + ldr r0, _080A1724 @ =0x06006ad4\n\ + mov r12, r0\n\ + mov r1, r9\n\ + cmp r1, 0\n\ + bne _080A172C\n\ + movs r5, 0\n\ + ldr r7, _080A1728 @ =gUnknown_08E94510\n\ + movs r0, 0x80\n\ + lsls r0, 5\n\ + adds r6, r0, 0\n\ + movs r1, 0x40\n\ + adds r1, r7\n\ + mov r8, r1\n\ +_080A16F4:\n\ + lsls r2, r5, 1\n\ + mov r0, r12\n\ + adds r3, r2, r0\n\ + adds r4, r2, r7\n\ + ldrh r1, [r4]\n\ + adds r0, r6, r1\n\ + strh r0, [r3]\n\ + adds r1, r3, 0\n\ + adds r1, 0x40\n\ + ldrh r4, [r4]\n\ + adds r0, r6, r4\n\ + strh r0, [r1]\n\ + adds r3, 0x80\n\ + add r2, r8\n\ + ldrh r2, [r2]\n\ + adds r0, r6, r2\n\ + strh r0, [r3]\n\ + adds r0, r5, 0x1\n\ + lsls r0, 24\n\ + lsrs r5, r0, 24\n\ + cmp r5, 0x13\n\ + bls _080A16F4\n\ + b _080A1768\n\ + .align 2, 0\n\ +_080A1724: .4byte 0x06006ad4\n\ +_080A1728: .4byte gUnknown_08E94510\n\ +_080A172C:\n\ + movs r5, 0\n\ + ldr r6, _080A17B0 @ =gUnknown_08E94550\n\ + movs r7, 0x80\n\ + lsls r7, 5\n\ + adds r4, r7, 0\n\ + movs r0, 0x40\n\ + adds r0, r6\n\ + mov r8, r0\n\ +_080A173C:\n\ + lsls r1, r5, 1\n\ + mov r7, r12\n\ + adds r2, r1, r7\n\ + adds r0, r1, r6\n\ + ldrh r0, [r0]\n\ + adds r0, r4, r0\n\ + strh r0, [r2]\n\ + adds r3, r2, 0\n\ + adds r3, 0x40\n\ + add r1, r8\n\ + ldrh r7, [r1]\n\ + adds r0, r4, r7\n\ + strh r0, [r3]\n\ + adds r2, 0x80\n\ + ldrh r1, [r1]\n\ + adds r0, r4, r1\n\ + strh r0, [r2]\n\ + adds r0, r5, 0x1\n\ + lsls r0, 24\n\ + lsrs r5, r0, 24\n\ + cmp r5, 0x13\n\ + bls _080A173C\n\ +_080A1768:\n\ + ldr r0, _080A17B4 @ =0x06005ad4\n\ + mov r12, r0\n\ + mov r1, r9\n\ + cmp r1, 0\n\ + bne _080A17BC\n\ + movs r5, 0\n\ + ldr r7, _080A17B8 @ =gUnknown_08E94510\n\ + movs r0, 0xC0\n\ + lsls r0, 6\n\ + adds r6, r0, 0\n\ + movs r1, 0x40\n\ + adds r1, r7\n\ + mov r8, r1\n\ +_080A1782:\n\ + lsls r2, r5, 1\n\ + mov r0, r12\n\ + adds r3, r2, r0\n\ + adds r4, r2, r7\n\ + ldrh r1, [r4]\n\ + adds r0, r6, r1\n\ + strh r0, [r3]\n\ + adds r1, r3, 0\n\ + adds r1, 0x40\n\ + ldrh r4, [r4]\n\ + adds r0, r6, r4\n\ + strh r0, [r1]\n\ + adds r3, 0x80\n\ + add r2, r8\n\ + ldrh r2, [r2]\n\ + adds r0, r6, r2\n\ + strh r0, [r3]\n\ + adds r0, r5, 0x1\n\ + lsls r0, 24\n\ + lsrs r5, r0, 24\n\ + cmp r5, 0x13\n\ + bls _080A1782\n\ + b _080A17F8\n\ + .align 2, 0\n\ +_080A17B0: .4byte gUnknown_08E94550\n\ +_080A17B4: .4byte 0x06005ad4\n\ +_080A17B8: .4byte gUnknown_08E94510\n\ +_080A17BC:\n\ + movs r5, 0\n\ + ldr r6, _080A1804 @ =gUnknown_08E94550\n\ + movs r7, 0xC0\n\ + lsls r7, 6\n\ + adds r4, r7, 0\n\ + movs r0, 0x40\n\ + adds r0, r6\n\ + mov r8, r0\n\ +_080A17CC:\n\ + lsls r1, r5, 1\n\ + mov r7, r12\n\ + adds r2, r1, r7\n\ + adds r0, r1, r6\n\ + ldrh r0, [r0]\n\ + adds r0, r4, r0\n\ + strh r0, [r2]\n\ + adds r3, r2, 0\n\ + adds r3, 0x40\n\ + add r1, r8\n\ + ldrh r7, [r1]\n\ + adds r0, r4, r7\n\ + strh r0, [r3]\n\ + adds r2, 0x80\n\ + ldrh r1, [r1]\n\ + adds r0, r4, r1\n\ + strh r0, [r2]\n\ + adds r0, r5, 0x1\n\ + lsls r0, 24\n\ + lsrs r5, r0, 24\n\ + cmp r5, 0x13\n\ + bls _080A17CC\n\ +_080A17F8:\n\ + pop {r3,r4}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_080A1804: .4byte gUnknown_08E94550\n\ + .syntax divided\n"); +} +#endif // NONMATCHING + +u8 sub_80A1808(struct Pokemon *mon) +{ + u16 species; + u8 spriteId; + + species = GetMonData(mon, MON_DATA_SPECIES2); + spriteId = CreateSprite(&gUnknown_02024E8C, 40, 64, 5); + + FreeSpriteOamMatrix(&gSprites[spriteId]); + + gSprites[spriteId].data[0] = species; + gSprites[spriteId].callback = sub_80A1888; + + if (!IsPokeSpriteNotFlipped(species)) + { + gSprites[spriteId].hFlip = 1; + } + else + { + gSprites[spriteId].hFlip = 0; + } + + return spriteId; +} + +static void sub_80A1888(struct Sprite *sprite) +{ + if (!gPaletteFade.active) + { + sprite->callback = SpriteCallbackDummy; + + if (!GetMonData(&pssData.loadedMon, MON_DATA_IS_EGG)) + { + PlayCry1(sprite->data[0], 0); + } + } +} + +static void sub_80A18C4(void) +{ + u8 i; + + for (i = 0; i < 30; i++) + { + ewram1A000[i] = 0xFF; + } +} + +static void sub_80A18E4(u8 a) +{ + if (ewram1A000[a] != 0xFF) + { + DestroySprite(&gSprites[ewram1A000[a]]); + ewram1A000[a] = 0xFF; + } +} + +static void sub_80A1918(u8 a, u8 invisible) +{ + gSprites[ewram1A000[a]].invisible = invisible; +} + +static void sub_80A1950(void) +{ + u8 i; + + for (i = 0; i < 5; i++) + { + if (ewram1A000[i] == 0xFF) + { + ewram1A000[i] = CreateSprite(&sSpriteTemplate_83C11C0, 0, 0, 2); + } + + sub_80A1918(i, 1); + } +} + +static void sub_80A198C(u8 animNum, u8 x, u8 y, u8 d) +{ + StartSpriteAnim(&gSprites[ewram1A000[d]], animNum); + + gSprites[ewram1A000[d]].oam.paletteNum = sUnknown_PaletteNums[animNum]; + gSprites[ewram1A000[d]].pos1.x = x + 16; + gSprites[ewram1A000[d]].pos1.y = y + 8; + + sub_80A1918(d, 0); +} + +static void sub_80A1A30(u8 a) +{ + u8 i; + s16 x; + u8 subPriority = 0; + + if (pssData.page >= PSS_PAGE_BATTLE_MOVES) + { + if (a == 9) + { + subPriority = 1; + } + + for (i = 0; i < 10; i++) + { + x = (i * 16) + 0x58; + ewram1A000[a + i] = CreateSprite(&sSpriteTemplate_83C1280, x, 40, subPriority); + + if (i == 0) + { + StartSpriteAnim(&gSprites[ewram1A000[a]], 4); + } + else if (i == 9) + { + StartSpriteAnim(&gSprites[ewram1A000[a + i]], 5); + } + else + { + StartSpriteAnim(&gSprites[ewram1A000[a + i]], 6); + } + + gSprites[ewram1A000[a + i]].callback = sub_80A1BC0; + gSprites[ewram1A000[a + i]].data[0] = a; + gSprites[ewram1A000[a + i]].data[1] = 0; + } + } +} + +static void sub_80A1B1C(u8 a) +{ + u8 i; + + for (i = 0; i < 10; i++) + { + sub_80A18E4(a + i); + } +} + +static void sub_80A1B40(u8 a) +{ + u8 i; + a *= 3; + + StartSpriteAnim(&gSprites[ewram1A000[9]], a + 4); + + for (i = 0; i < 8; i++) + { + StartSpriteAnim(&gSprites[ewram1A000[10 + i]], a + 6); + } + + StartSpriteAnim(&gSprites[ewram1A000[18]], a + 5); +} + +static void sub_80A1BC0(struct Sprite *sprite) +{ + u8 animNum = sprite->animNum - 4; + if (animNum < 3) + { + sprite->data[1] = (sprite->data[1] + 1) & 0x1F; + + if (sprite->data[1] > 24) + { + sprite->invisible = 1; + } + else + { + sprite->invisible = 0; + } + } + else + { + sprite->data[1] = 0; + sprite->invisible = 0; + } + + if (sprite->data[0] == 9) + { + sprite->pos2.y = pssData.selectedMoveIndex * 16; + } + else + { + sprite->pos2.y = pssData.switchMoveIndex * 16; + } +} + +__attribute__((naked)) +void sub_80A1C30(u8 a) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + lsls r0, 24\n\ + lsrs r4, r0, 24\n\ + lsls r0, r4, 2\n\ + adds r0, r4\n\ + lsls r0, 25\n\ + lsrs r3, r0, 24\n\ + adds r4, r3, 0\n\ + adds r0, r3, 0\n\ + adds r0, 0xA\n\ + cmp r3, r0\n\ + bge _080A1C82\n\ + ldr r5, _080A1C88 @ =gSprites\n\ + movs r7, 0x5\n\ + negs r7, r7\n\ + ldr r6, _080A1C8C @ =gSharedMem + 0x1A009\n\ +_080A1C50:\n\ + adds r2, r3, r6\n\ + ldrb r1, [r2]\n\ + lsls r0, r1, 4\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + adds r0, r5\n\ + movs r1, 0\n\ + strh r1, [r0, 0x30]\n\ + ldrb r0, [r2]\n\ + lsls r1, r0, 4\n\ + adds r1, r0\n\ + lsls r1, 2\n\ + adds r1, r5\n\ + adds r1, 0x3E\n\ + ldrb r2, [r1]\n\ + adds r0, r7, 0\n\ + ands r0, r2\n\ + strb r0, [r1]\n\ + adds r0, r3, 0x1\n\ + lsls r0, 24\n\ + lsrs r3, r0, 24\n\ + adds r0, r4, 0\n\ + adds r0, 0xA\n\ + cmp r3, r0\n\ + blt _080A1C50\n\ +_080A1C82:\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_080A1C88: .4byte gSprites\n\ +_080A1C8C: .4byte gSharedMem + 0x1A009\n\ + .syntax divided\n"); +} + +u8 pokemon_ailments_get_primary(u32 status) +{ + if (status & 0x88) + return 1; + if (status & 0x40) + return 2; + if (status & 0x7) + return 3; + if (status & 0x20) + return 4; + if (status & 0x10) + return 5; + + return 0; +} + +u8 GetMonStatusAndPokerus(struct Pokemon *mon) +{ + u8 statusAilment; + + if (GetMonData(mon, MON_DATA_HP) == 0) + { + return 7; + } + + statusAilment = pokemon_ailments_get_primary(GetMonData(mon, MON_DATA_STATUS)); + if (statusAilment == 0) + { + if (!CheckPartyPokerus(mon, 0)) + { + return 0; + } + else + { + return 6; + } + } + + return statusAilment; +} + +#ifdef NONMATCHING +void sub_80A1D18(void) +{ + struct Pokemon mon; + u8 statusAndPkrs; + u8 statusAndPkrs2; + + sub_809F678(&mon); + statusAndPkrs = GetMonStatusAndPokerus(&mon); + + if (statusAndPkrs) + { + statusAndPkrs2 = statusAndPkrs - 1; + + if (ewram1A000[29] == 0xFF) + { + ewram1A000[29] = CreateSprite(&sSpriteTemplate_83C1304, 64, 152, 0); + } + } + else + { + sub_80A18E4(29); + return; + } + + StartSpriteAnim(&gSprites[ewram1A000[29]], statusAndPkrs2); +} +#else +__attribute__((naked)) +void sub_80A1D18(void) +{ + asm(".syntax unified\n\ + push {r4,r5,lr}\n\ + sub sp, 0x64\n\ + mov r0, sp\n\ + bl sub_809F678\n\ + mov r0, sp\n\ + bl GetMonStatusAndPokerus\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0\n\ + beq _080A1D58\n\ + subs r0, 0x1\n\ + lsls r0, 24\n\ + lsrs r5, r0, 24\n\ + ldr r4, _080A1D50 @ =gSharedMem + 0x1A01D\n\ + ldrb r0, [r4]\n\ + cmp r0, 0xFF\n\ + bne _080A1D60\n\ + ldr r0, _080A1D54 @ =sSpriteTemplate_83C1304\n\ + movs r1, 0x40\n\ + movs r2, 0x98\n\ + movs r3, 0\n\ + bl CreateSprite\n\ + strb r0, [r4]\n\ + b _080A1D60\n\ + .align 2, 0\n\ +_080A1D50: .4byte gSharedMem + 0x1A01D\n\ +_080A1D54: .4byte sSpriteTemplate_83C1304\n\ +_080A1D58:\n\ + movs r0, 0x1D\n\ + bl sub_80A18E4\n\ + b _080A1D74\n\ +_080A1D60:\n\ + ldr r0, _080A1D7C @ =gSharedMem + 0x1A01D\n\ + ldrb r1, [r0]\n\ + lsls r0, r1, 4\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + ldr r1, _080A1D80 @ =gSprites\n\ + adds r0, r1\n\ + adds r1, r5, 0\n\ + bl StartSpriteAnim\n\ +_080A1D74:\n\ + add sp, 0x64\n\ + pop {r4,r5}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_080A1D7C: .4byte gSharedMem + 0x1A01D\n\ +_080A1D80: .4byte gSprites\n\ + .syntax divided\n"); +} +#endif // NONMATCHING + +static void sub_80A1D84(struct Pokemon *mon) +{ + struct Sprite *sprite; + + sprite = sub_80F7920(0x7533, 0x7533, sSummaryScreenMonMarkingsPalette); + gUnknown_020384F4 = sprite; + + if (sprite != NULL) + { + u8 markings = GetMonData(mon, MON_DATA_MARKINGS); + StartSpriteAnim(sprite, markings); + + gUnknown_020384F4->pos1.x = 60; + gUnknown_020384F4->pos1.y = 26; + } +} + +static void sub_80A1DCC(struct Pokemon *mon) +{ + DestroySprite(gUnknown_020384F4); + sub_80A1D84(mon); +} + +static void sub_80A1DE8(struct Pokemon *mon) +{ + u8 ball = ball_number_to_ball_processing_index(GetMonData(mon, MON_DATA_POKEBALL)); + sub_80478DC(ball); + + pssData.ballSpriteId = CreateSprite(&gBallSpriteTemplates[ball], 6, 136, 0); + gSprites[pssData.ballSpriteId].callback = SpriteCallbackDummy; + gSprites[pssData.ballSpriteId].oam.priority = 3; +} + +static u8 *sub_80A1E58(u8 *text, u8 id) +{ + if (id != 0xFF) + { + const u8 *ptr = sUnknown_083C15BC; + while (*ptr != 0xFF && *ptr != id) + { + ptr += 4; + } + + text[0] = EXT_CTRL_CODE_BEGIN; + text[1] = 4; + text[2] = ptr[1]; + text[3] = ptr[2]; + text[4] = ptr[3]; + + text += 5; + } + + return text; +} + +u8 *sub_80A1E9C(u8 *dest, const u8 *src, u8 id) +{ + u8 arr[3]; + + sub_8072CD4(&arr[0], &arr[1], &arr[2]); + + dest = sub_80A1E58(dest, id); + dest = StringCopy(dest, src); + + if (id != 0xFF) + { + dest[0] = EXT_CTRL_CODE_BEGIN; + dest[1] = 4; + dest[2] = arr[0]; + dest[3] = arr[1]; + dest[4] = arr[2]; + dest[5] = 0xFF; + + dest += 5; + } + + return dest; +} + +static void sub_80A1EF8(const u8 *text, u8 id, u8 left, u16 top, s32 e) +{ + sub_80A1E9C(gStringVar4, text, id); + MenuPrint_PixelCoords(gStringVar4, left, top, (bool8)e); +} + +static void sub_80A1F48(const u8 *text, u8 id, u8 c, u8 d, u16 e) +{ + sub_80A1E9C(gStringVar4, text, id); + sub_8072BD8(gStringVar4, c, d, e); +} + +static void sub_80A1F98(s32 value, u8 id, u8 n, u8 mode, u8 left, u16 top, s32 e) +{ + ConvertIntToDecimalStringN(gStringVar1, value, mode, n); + sub_80A1EF8(gStringVar1, id, left, top, e); +} + +static void sub_80A1FF8(const u8 *text, u8 id, u8 left, u8 top) +{ + sub_80A1E9C(gStringVar4, text, id); + MenuPrint(gStringVar4, left, top); +} + +u8 *PokemonSummaryScreen_CopyPokemonLevel(u8 *dest, u8 level) +{ + u8 buffer[12]; + + dest[0] = 0x34; + dest++; + + if (level == 0) + { + level = 5; + } + + ConvertIntToDecimalString(buffer, level); + dest = sub_80A1E9C(dest, buffer, 14); + dest = StringCopy(dest, gOtherText_Comma); + + return dest; +} + +static void sub_80A2078(int taskId) +{ + gUnknown_03005CF0 = gTasks[taskId].func; + gTasks[taskId].func = sub_80A20A8; + gTasks[taskId].func((u8)taskId); +} + +static void sub_80A20A8(u8 taskId) +{ + if (sub_8055870() != TRUE) + { + gTasks[taskId].func = gUnknown_03005CF0; + } +} diff --git a/src/scene/evolution_scene.c b/src/scene/evolution_scene.c index 1bbb8d485..d4c6417c7 100644 --- a/src/scene/evolution_scene.c +++ b/src/scene/evolution_scene.c @@ -817,7 +817,7 @@ static void Task_EvolutionScene(u8 taskID) case 5: if (!gPaletteFade.active) { - sub_809D9F0(gPlayerParty, gTasks[taskID].tPartyID, + ShowSelectMovePokemonSummaryScreen(gPlayerParty, gTasks[taskID].tPartyID, gPlayerPartyCount - 1, CB2_EvolutionSceneLoadGraphics, gMoveToLearn); gTasks[taskID].tLearnMoveState++; @@ -1137,7 +1137,7 @@ static void Task_TradeEvolutionScene(u8 taskID) case 5: if (!gPaletteFade.active) { - sub_809D9F0(gPlayerParty, gTasks[taskID].tPartyID, + ShowSelectMovePokemonSummaryScreen(gPlayerParty, gTasks[taskID].tPartyID, gPlayerPartyCount - 1, CB2_TradeEvolutionSceneLoadGraphics, gMoveToLearn); gTasks[taskID].tLearnMoveState++; diff --git a/src/script_pokemon_util_80F99CC.c b/src/script_pokemon_util_80F99CC.c index 21ff220d2..d95a0ed39 100644 --- a/src/script_pokemon_util_80F99CC.c +++ b/src/script_pokemon_util_80F99CC.c @@ -272,7 +272,7 @@ void HandleMoveTutorPartyMenu(u8 var) void sub_80F9EEC(void) { - sub_809D9F0(&gPlayerParty[0], gSpecialVar_0x8004, gPlayerPartyCount - 1, c2_exit_to_overworld_2_switch, 0); + ShowSelectMovePokemonSummaryScreen(&gPlayerParty[0], gSpecialVar_0x8004, gPlayerPartyCount - 1, c2_exit_to_overworld_2_switch, 0); UNK_2018000_STRUCT.unk8 = 3; gFieldCallback = sub_8080990; } diff --git a/src/strings.c b/src/strings.c index 6c8dce9d6..06bbadb8f 100644 --- a/src/strings.c +++ b/src/strings.c @@ -409,7 +409,7 @@ const u8 OtherText_Switch[] = _("SWITCH"); const u8 OtherText_PokeInfo[] = _("POKéMON INFO"); const u8 OtherText_PokeSkills[] = _("POKéMON SKILLS"); const u8 OtherText_BattleMoves[] = _("BATTLE MOVES"); -const u8 OtherText_ContestMoves[] = _("C0NTEST MOVES"); // why the l33t 0, that's stupid +const u8 OtherText_ContestMoves[] = _("C0NTEST MOVES"); // The "O" in "CONTEST" is actually a 0. const u8 OtherText_Info[] = _("INFO"); const u8 gOtherText_EggLongTime[] = _("It looks like this EGG will\ntake a long time to hatch."); |