diff --git a/INSTALL.md b/INSTALL.md index 0ae7a2eae..b3ea173aa 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -9,7 +9,7 @@ If you run into trouble, ask for help on Discord or IRC (see [README.md](README. ## Windows Windows has instructions for building with three possible terminals, providing 3 different options in case the user stumbles upon unexpected errors. -- [Windows 10 (WSL1)](#windows-10-wsl1) (**Fastest, highly recommended**, Windows 10 only) +- [Windows 10/11 (WSL1)](#windows-1011-wsl1) (**Fastest, highly recommended**, Windows 10 and 11 only) - [Windows (msys2)](#windows-msys2) (Second fastest) - [Windows (Cygwin)](#windows-cygwin) (Slowest) @@ -26,7 +26,7 @@ All of the Windows instructions assume that the default drive is C:\\. If this d **A note of caution**: As Windows 7 is officially unsupported by Microsoft and Windows 8 has very little usage, some maintainers are unwilling to maintain the Windows 7/8 instructions. Thus, these instructions may break in the future with fixes taking longer than fixes to the Windows 10 instructions. -## Windows 10 (WSL1) +## Windows 10/11 (WSL1) WSL1 is the preferred terminal to build **pokefirered**. The following instructions will explain how to install WSL1 (referred to interchangeably as WSL). - If WSL (Debian or Ubuntu) is **not installed**, then go to [Installing WSL1](#Installing-WSL1). - Otherwise, if WSL is installed, but it **hasn't previously been set up for another decompilation project**, then go to [Setting up WSL1](#Setting-up-WSL1). @@ -404,21 +404,16 @@ If you aren't in the pokefirered directory already, then **change directory** to ```bash cd pokefirered ``` -To build **pokefirered.gba** for the first time and confirm it matches the official ROM image (Note: to speed up builds, see [Parallel builds](#parallel-builds)): +To build **pokefirered.gba** (Note: to speed up builds, see [Parallel builds](#parallel-builds)): ```bash -make compare +make ``` -If an OK is returned, then the installation went smoothly. +If it has built successfully you will have the output file **pokefirered.gba** in your project folder.
Note for Windows... > If you switched terminals since the last build (e.g. from msys2 to WSL1), you must run `make clean-tools` once before any subsequent `make` commands.
-To build **pokefirered.gba** with your changes: -```bash -make -``` - ## Build pokeleafgreen and REV1 Pokemon FireRed and LeafGreen were both released together. As such, this project is capable of building both ROMs. To do so, simply run ```bash @@ -449,11 +444,20 @@ Replace `` with the number that the `nproc` command returned. `nproc` is not available on macOS. The alternative is `sysctl -n hw.ncpu` ([relevant Stack Overflow thread](https://stackoverflow.com/questions/1715580)). -## Debug info +## Compare ROM to the original -To build **pokefirered.elf** with enhanced debug info: +For contributing, or if you'd simply like to verify that your ROM is identical to the original game, run: ```bash -make DINFO=1 +make compare # or compare_leafgreen, compare_firered_rev1, compare_leafgreen_rev1 +``` +If it matches, you will see the following at the end of the output: +```bash +pokefirered.gba: OK +``` +If there are any changes from the original game, you will instead see: +```bash +pokefirered.gba: FAILED +shasum: WARNING: 1 computed checksum did NOT match ``` ## devkitARM's C compiler @@ -548,4 +552,4 @@ To compile the `modern` target with this toolchain, the subdirectories `lib`, `i * [porymap](https://github.com/huderlem/porymap) for viewing and editing maps * [poryscript](https://github.com/huderlem/poryscript) for scripting ([VS Code extension](https://marketplace.visualstudio.com/items?itemName=karathan.poryscript)) -* [Tilemap Studio](https://github.com/Rangi42/tilemap-studio) for viewing and editing tilemaps \ No newline at end of file +* [Tilemap Studio](https://github.com/Rangi42/tilemap-studio) for viewing and editing tilemaps diff --git a/constants/m4a_constants.inc b/constants/m4a_constants.inc index 62ca5bb55..1a744dc7f 100644 --- a/constants/m4a_constants.inc +++ b/constants/m4a_constants.inc @@ -1,12 +1,43 @@ .equiv ID_NUMBER, 0x68736d53 .equiv PCM_DMA_BUF_SIZE, 1584 + .equiv MAX_DIRECTSOUND_CHANNELS, 12 + + .equiv C_V, 0x40 .equiv TONEDATA_TYPE_CGB, 0x07 .equiv TONEDATA_TYPE_FIX, 0x08 + .equiv TONEDATA_TYPE_REV, 0x10 + .equiv TONEDATA_TYPE_CMP, 0x20 .equiv TONEDATA_TYPE_SPL, 0x40 @ key split .equiv TONEDATA_TYPE_RHY, 0x80 @ rhythm + .equiv TONEDATA_P_S_PAN, 0xc0 + + .equiv SOUND_CHANNEL_SF_START, 0x80 + .equiv SOUND_CHANNEL_SF_STOP, 0x40 + .equiv SOUND_CHANNEL_SF_SPECIAL, 0x20 + .equiv SOUND_CHANNEL_SF_LOOP, 0x10 + .equiv SOUND_CHANNEL_SF_IEC, 0x04 + .equiv SOUND_CHANNEL_SF_ENV, 0x03 + .equiv SOUND_CHANNEL_SF_ENV_ATTACK, 0x03 + .equiv SOUND_CHANNEL_SF_ENV_DECAY, 0x02 + .equiv SOUND_CHANNEL_SF_ENV_SUSTAIN, 0x01 + .equiv SOUND_CHANNEL_SF_ENV_RELEASE, 0x00 + .equiv SOUND_CHANNEL_SF_ON, (SOUND_CHANNEL_SF_START | SOUND_CHANNEL_SF_STOP | SOUND_CHANNEL_SF_IEC | SOUND_CHANNEL_SF_ENV) + + .equiv CGB_CHANNEL_MO_PIT, 0x02 + .equiv CGB_CHANNEL_MO_VOL, 0x01 + + .equiv WAVE_DATA_FLAG_LOOP, 0xC0 + + .equiv MPT_FLG_VOLSET, 0x01 + .equiv MPT_FLG_VOLCHG, 0x03 + .equiv MPT_FLG_PITSET, 0x04 + .equiv MPT_FLG_PITCHG, 0x0C + .equiv MPT_FLG_START, 0x40 + .equiv MPT_FLG_EXIST, 0x80 + .macro struct_begin .struct 0 .endm @@ -16,6 +47,28 @@ .struct \name + \size .endm + struct_begin + struct_field o_WaveData_type, 2 + struct_field o_WaveData_d1, 1 + struct_field o_WaveData_flags, 1 + struct_field o_WaveData_freq, 4 + struct_field o_WaveData_loopStart, 4 + struct_field o_WaveData_size, 4 + struct_field o_WaveData_data, 0 + struct_field WaveData_size, 0 + + struct_begin + struct_field o_ToneData_type, 1 + struct_field o_ToneData_key, 1 + struct_field o_ToneData_length, 1 + struct_field o_ToneData_pan_sweep, 1 + struct_field o_ToneData_wav, 4 + struct_field o_ToneData_attack, 1 + struct_field o_ToneData_decay, 1 + struct_field o_ToneData_sustain, 1 + struct_field o_ToneData_release, 1 + struct_field ToneData_size, 0 + struct_begin struct_field o_SoundInfo_ident, 4 struct_field o_SoundInfo_pcmDmaCounter, 1 @@ -32,8 +85,8 @@ struct_field o_SoundInfo_pcmFreq, 4 struct_field o_SoundInfo_divFreq, 4 struct_field o_SoundInfo_cgbChans, 4 - struct_field o_SoundInfo_func, 4 - struct_field o_SoundInfo_intp, 4 + struct_field o_SoundInfo_MPlayMainHead, 4 + struct_field o_SoundInfo_musicPlayerHead, 4 struct_field o_SoundInfo_CgbSound, 4 struct_field o_SoundInfo_CgbOscOff, 4 struct_field o_SoundInfo_MidiKeyToCgbFreq, 4 @@ -41,12 +94,12 @@ struct_field o_SoundInfo_plynote, 4 struct_field o_SoundInfo_ExtVolPit, 4 struct_field o_SoundInfo_gap2, 16 - struct_field o_SoundInfo_chans, 768 + struct_field o_SoundInfo_chans, MAX_DIRECTSOUND_CHANNELS * 64 struct_field o_SoundInfo_pcmBuffer, PCM_DMA_BUF_SIZE * 2 struct_field SoundInfo_size, 0 struct_begin - struct_field o_SoundChannel_status, 1 + struct_field o_SoundChannel_statusFlags, 1 struct_field o_SoundChannel_type, 1 struct_field o_SoundChannel_rightVolume, 1 struct_field o_SoundChannel_leftVolume, 1 @@ -54,29 +107,29 @@ struct_field o_SoundChannel_decay, 1 struct_field o_SoundChannel_sustain, 1 struct_field o_SoundChannel_release, 1 - struct_field o_SoundChannel_ky, 1 - struct_field o_SoundChannel_ev, 1 - struct_field o_SoundChannel_er, 1 - struct_field o_SoundChannel_el, 1 - struct_field o_SoundChannel_iev, 1 - struct_field o_SoundChannel_iel, 1 - struct_field o_SoundChannel_d1, 1 - struct_field o_SoundChannel_d2, 1 - struct_field o_SoundChannel_gt, 1 - struct_field o_SoundChannel_mk, 1 - struct_field o_SoundChannel_ve, 1 - struct_field o_SoundChannel_pr, 1 - struct_field o_SoundChannel_rp, 1 - struct_field o_SoundChannel_d3, 3 - struct_field o_SoundChannel_ct, 4 + struct_field o_SoundChannel_key, 1 + struct_field o_SoundChannel_envelopeVolume, 1 + struct_field o_SoundChannel_envelopeVolumeRight, 1 + struct_field o_SoundChannel_envelopeVolumeLeft, 1 + struct_field o_SoundChannel_pseudoEchoVolume, 1 + struct_field o_SoundChannel_pseudoEchoLength, 1 + struct_field o_SoundChannel_dummy1, 1 + struct_field o_SoundChannel_dummy2, 1 + struct_field o_SoundChannel_gateTime, 1 + struct_field o_SoundChannel_midiKey, 1 + struct_field o_SoundChannel_velocity, 1 + struct_field o_SoundChannel_priority, 1 + struct_field o_SoundChannel_rhythmPan, 1 + struct_field o_SoundChannel_dummy3, 3 + struct_field o_SoundChannel_count, 4 struct_field o_SoundChannel_fw, 4 - struct_field o_SoundChannel_freq, 4 + struct_field o_SoundChannel_frequency, 4 struct_field o_SoundChannel_wav, 4 - struct_field o_SoundChannel_cp, 4 + struct_field o_SoundChannel_currentPointer, 4 struct_field o_SoundChannel_track, 4 - struct_field o_SoundChannel_pp, 4 - struct_field o_SoundChannel_np, 4 - struct_field o_SoundChannel_d4, 4 + struct_field o_SoundChannel_prevChannelPointer, 4 + struct_field o_SoundChannel_nextChannelPointer, 4 + struct_field o_SoundChannel_dummy4, 4 struct_field o_SoundChannel_xpi, 2 struct_field o_SoundChannel_xpc, 2 struct_field SoundChannel_size, 0 @@ -112,8 +165,8 @@ struct_field o_MusicPlayerTrack_lfoDelay, 1 struct_field o_MusicPlayerTrack_lfoDelayC, 1 struct_field o_MusicPlayerTrack_priority, 1 - struct_field o_MusicPlayerTrack_echoVolume, 1 - struct_field o_MusicPlayerTrack_echoLength, 1 + struct_field o_MusicPlayerTrack_pseudoEchoVolume, 1 + struct_field o_MusicPlayerTrack_pseudoEchoLength, 1 struct_field o_MusicPlayerTrack_chan, 4 struct_field o_MusicPlayerTrack_ToneData_type, 1 struct_field o_MusicPlayerTrack_ToneData_key, 1 @@ -159,41 +212,41 @@ struct_field MusicPlayerInfo_size, 0 struct_begin - struct_field o_CgbChannel_sf, 1 - struct_field o_CgbChannel_ty, 1 + struct_field o_CgbChannel_statusFlags, 1 + struct_field o_CgbChannel_type, 1 struct_field o_CgbChannel_rightVolume, 1 struct_field o_CgbChannel_leftVolume, 1 - struct_field o_CgbChannel_at, 1 - struct_field o_CgbChannel_de, 1 - struct_field o_CgbChannel_su, 1 - struct_field o_CgbChannel_re, 1 - struct_field o_CgbChannel_ky, 1 - struct_field o_CgbChannel_ev, 1 - struct_field o_CgbChannel_eg, 1 - struct_field o_CgbChannel_ec, 1 - struct_field o_CgbChannel_echoVolume, 1 - struct_field o_CgbChannel_echoLength, 1 - struct_field o_CgbChannel_d1, 1 - struct_field o_CgbChannel_d2, 1 - struct_field o_CgbChannel_gt, 1 - struct_field o_CgbChannel_mk, 1 - struct_field o_CgbChannel_ve, 1 - struct_field o_CgbChannel_pr, 1 - struct_field o_CgbChannel_rp, 1 - struct_field o_CgbChannel_d3, 3 - struct_field o_CgbChannel_d5, 1 - struct_field o_CgbChannel_sg, 1 + struct_field o_CgbChannel_attack, 1 + struct_field o_CgbChannel_decay, 1 + struct_field o_CgbChannel_sustain, 1 + struct_field o_CgbChannel_release, 1 + struct_field o_CgbChannel_key, 1 + struct_field o_CgbChannel_envelopeVolume, 1 + struct_field o_CgbChannel_envelopeGoal, 1 + struct_field o_CgbChannel_envelopeCounter, 1 + struct_field o_CgbChannel_pseudoEchoVolume, 1 + struct_field o_CgbChannel_pseudoEchoLength, 1 + struct_field o_CgbChannel_dummy1, 1 + struct_field o_CgbChannel_dummy2, 1 + struct_field o_CgbChannel_gateTime, 1 + struct_field o_CgbChannel_midiKey, 1 + struct_field o_CgbChannel_velocity, 1 + struct_field o_CgbChannel_priority, 1 + struct_field o_CgbChannel_rhythmPan, 1 + struct_field o_CgbChannel_dummy3, 3 + struct_field o_CgbChannel_dummy5, 1 + struct_field o_CgbChannel_sustainGoal, 1 struct_field o_CgbChannel_n4, 1 struct_field o_CgbChannel_pan, 1 struct_field o_CgbChannel_panMask, 1 - struct_field o_CgbChannel_mo, 1 - struct_field o_CgbChannel_le, 1 - struct_field o_CgbChannel_sw, 1 - struct_field o_CgbChannel_fr, 4 - struct_field o_CgbChannel_wp, 4 - struct_field o_CgbChannel_cp, 4 - struct_field o_CgbChannel_tp, 4 - struct_field o_CgbChannel_pp, 4 - struct_field o_CgbChannel_np, 4 - struct_field o_CgbChannel_d4, 8 + struct_field o_CgbChannel_modify, 1 + struct_field o_CgbChannel_length, 1 + struct_field o_CgbChannel_sweep, 1 + struct_field o_CgbChannel_frequency, 4 + struct_field o_CgbChannel_wavePointer, 4 + struct_field o_CgbChannel_currentPointer, 4 + struct_field o_CgbChannel_track, 4 + struct_field o_CgbChannel_prevChannelPointer, 4 + struct_field o_CgbChannel_nextChannelPointer, 4 + struct_field o_CgbChannel_dummy4, 8 struct_field CgbChannel_size, 0 diff --git a/data/text/move_descriptions.inc b/data/text/move_descriptions.inc deleted file mode 100644 index ce0d91d19..000000000 --- a/data/text/move_descriptions.inc +++ /dev/null @@ -1,1062 +0,0 @@ -gMoveDescription_Pound:: - .string "A physical attack\ndelivered with a\nlong tail or a\nforeleg, etc.$" - -gMoveDescription_KarateChop:: - .string "The foe is attacked\nwith a sharp chop.\nIt has a high\ncritical-hit ratio.$" - -gMoveDescription_DoubleSlap:: - .string "The foe is slapped\nrepeatedly, back\nand forth, two to\nfive times.$" - -gMoveDescription_CometPunch:: - .string "The foe is hit with\na flurry of punches\nthat strike two to\nfive times.$" - -gMoveDescription_MegaPunch:: - .string "The foe is slugged\nby a punch thrown\nwith muscle-packed\npower.$" - -gMoveDescription_PayDay:: - .string "Numerous coins are\nhurled at the foe.\nMoney is earned\nafter battle.$" - -gMoveDescription_FirePunch:: - .string "The foe is punched\nwith a fiery fist.\nIt may leave the\nfoe with a burn.$" - -gMoveDescription_IcePunch:: - .string "The foe is punched\nwith an icy fist.\nIt may leave the\nfoe frozen.$" - -gMoveDescription_ThunderPunch:: - .string "The foe is punched\nwith an electrified\nfist. It may leave\nthe foe paralyzed.$" - -gMoveDescription_Scratch:: - .string "Hard, pointed, and\nsharp claws rake\nthe foe.$" - -gMoveDescription_ViceGrip:: - .string "Huge, impressive\npincers grip and\nsqueeze the foe.$" - -gMoveDescription_Guillotine:: - .string "A vicious tearing\nattack with pincers.\nThe foe will faint\nif it hits.$" - -gMoveDescription_RazorWind:: - .string "Blades of wind hit\nthe foe on the 2nd\nturn. It has a high\ncritical-hit ratio.$" - -gMoveDescription_SwordsDance:: - .string "A frenetic dance of\nfighting. It sharply\nraises the ATTACK\nstat.$" - -gMoveDescription_Cut:: - .string "A basic attack.\nIt can be used to\ncut down thin trees\nand grass.$" - -gMoveDescription_Gust:: - .string "Strikes the foe\nwith a gust of wind\nwhipped up by\nwings.$" - -gMoveDescription_WingAttack:: - .string "The foe is struck\nwith large, imposing\nwings spread wide.$" - -gMoveDescription_Whirlwind:: - .string "The foe is made to\nswitch out with an\nally. In the wild,\nthe battle ends.$" - -gMoveDescription_Fly:: - .string "A 2-turn move that\nhits on the 2nd\nturn. Use it to fly\nto any known town.$" - -gMoveDescription_Bind:: - .string "A long body or\ntentacles are used\nto bind the foe for\ntwo to five turns.$" - -gMoveDescription_Slam:: - .string "The foe is struck\nwith a long tail,\nvines, etc.$" - -gMoveDescription_VineWhip:: - .string "The foe is struck\nwith slender, whip-\nlike vines.$" - -gMoveDescription_Stomp:: - .string "The foe is stomped\nwith a big foot.\nIt may make the\nfoe flinch.$" - -gMoveDescription_DoubleKick:: - .string "Two legs are used\nto quickly kick the\nfoe twice in one\nturn.$" - -gMoveDescription_MegaKick:: - .string "The foe is attacked\nby a kick fired\nwith muscle-packed\npower.$" - -gMoveDescription_JumpKick:: - .string "The user jumps up\nhigh, then kicks.\nIf it misses, the\nuser hurts itself.$" - -gMoveDescription_RollingKick:: - .string "A quick kick from a\nrolling spin.\nIt may make the\nfoe flinch.$" - -gMoveDescription_SandAttack:: - .string "A lot of sand is\nhurled in the foe's\nface, reducing its\naccuracy.$" - -gMoveDescription_Headbutt:: - .string "The user sticks its\nhead out and rams.\nIt may make the\nfoe flinch.$" - -gMoveDescription_HornAttack:: - .string "The foe is jabbed\nwith a sharply\npointed horn to\ninflict damage.$" - -gMoveDescription_FuryAttack:: - .string "The foe is jabbed\nrepeatedly with a\nhorn or beak two to\nfive times.$" - -gMoveDescription_HornDrill:: - .string "The horn is rotated\nlike a drill to ram.\nThe foe will faint\nif it hits.$" - -gMoveDescription_Tackle:: - .string "A physical attack\nin which the user\ncharges, full body,\ninto the foe.$" - -gMoveDescription_BodySlam:: - .string "The user drops its\nfull body on the\nfoe. It may leave\nthe foe paralyzed.$" - -gMoveDescription_Wrap:: - .string "A long body or\nvines are used to\nwrap the foe for\ntwo to five turns.$" - -gMoveDescription_TakeDown:: - .string "A reckless, full-\nbody charge attack\nthat also hurts the\nuser a little.$" - -gMoveDescription_Thrash:: - .string "The user rampages\nabout for two to\nthree turns, then\nbecomes confused.$" - -gMoveDescription_DoubleEdge:: - .string "A reckless, life-\nrisking tackle that\nalso hurts the user\na little.$" - -gMoveDescription_TailWhip:: - .string "The user wags its\ntail cutely, making\nthe foe lower its\nDEFENSE stat.$" - -gMoveDescription_PoisonSting:: - .string "The foe is stabbed\nwith a toxic barb,\netc. It may poison\nthe foe.$" - -gMoveDescription_Twineedle:: - .string "The foe is stabbed\ntwice with foreleg\nstingers. It may\npoison the foe.$" - -gMoveDescription_PinMissile:: - .string "Sharp pins are shot\nat the foe and hit\ntwo to five times\nat once.$" - -gMoveDescription_Leer:: - .string "The foe is given an\nintimidating look\nthat lowers its\nDEFENSE stat.$" - -gMoveDescription_Bite:: - .string "The user bites with\nvicious fangs.\nIt may make the\nfoe flinch.$" - -gMoveDescription_Growl:: - .string "The user growls in\na cute way, making\nthe foe lower its\nATTACK stat.$" - -gMoveDescription_Roar:: - .string "The foe is made to\nswitch out with an\nally. In the wild,\nthe battle ends.$" - -gMoveDescription_Sing:: - .string "A soothing song\nin a calming voice\nlulls the foe into\na deep slumber.$" - -gMoveDescription_Supersonic:: - .string "The user generates\nodd sound waves.\nIt may confuse the\nfoe.$" - -gMoveDescription_SonicBoom:: - .string "The foe is hit with\na shock wave that\nalways inflicts 20-\nHP damage.$" - -gMoveDescription_Disable:: - .string "For a few turns,\nit prevents the foe\nfrom using the move\nit last used.$" - -gMoveDescription_Acid:: - .string "The foe is sprayed\nwith a harsh, hide-\nmelting acid that\nmay lower DEFENSE.$" - -gMoveDescription_Ember:: - .string "The foe is attacked\nwith small flames.\nThe foe may suffer\na burn.$" - -gMoveDescription_Flamethrower:: - .string "The foe is scorched\nwith intense flames.\nThe foe may suffer\na burn.$" - -gMoveDescription_Mist:: - .string "The ally party is\nprotected by a\nmist that prevents\nstat reductions.$" - -gMoveDescription_WaterGun:: - .string "The foe is struck\nwith a lot of water\nexpelled forcibly\nfrom the mouth.$" - -gMoveDescription_HydroPump:: - .string "A high volume of\nwater is blasted at\nthe foe under great\npressure.$" - -gMoveDescription_Surf:: - .string "A big wave crashes\ndown on the foe.\nCan also be used\nfor crossing water.$" - -gMoveDescription_IceBeam:: - .string "The foe is struck\nwith an icy beam.\nIt may freeze the\nfoe solid.$" - -gMoveDescription_Blizzard:: - .string "The foe is blasted\nwith a blizzard.\nIt may freeze the\nfoe solid.$" - -gMoveDescription_Psybeam:: - .string "A peculiar ray is\nshot at the foe.\nIt may leave the\nfoe confused.$" - -gMoveDescription_BubbleBeam:: - .string "A spray of bubbles\nstrikes the foe.\nIt may lower the\nfoe's SPEED stat.$" - -gMoveDescription_AuroraBeam:: - .string "A rainbow-colored\nattack beam.\nIt may lower the\nfoe's ATTACK stat.$" - -gMoveDescription_HyperBeam:: - .string "A severely damaging\nattack that makes\nthe user rest on\nthe next turn.$" - -gMoveDescription_Peck:: - .string "The foe is jabbed\nwith a sharply\npointed beak or\nhorn.$" - -gMoveDescription_DrillPeck:: - .string "A corkscrewing\nattack with the\nsharp beak acting\nas a drill.$" - -gMoveDescription_Submission:: - .string "A reckless, full-\nbody throw attack\nthat also hurts the\nuser a little.$" - -gMoveDescription_LowKick:: - .string "A low, tripping kick\nthat inflicts more\ndamage on heavier\nfoes.$" - -gMoveDescription_Counter:: - .string "A retaliation move\nthat counters any\nphysical hit with\ndouble the damage.$" - -gMoveDescription_SeismicToss:: - .string "A gravity-fed throw\nthat causes damage\nmatching the user's\nlevel.$" - -gMoveDescription_Strength:: - .string "The foe is slugged\nat maximum power.\nCan also be used\nto move boulders.$" - -gMoveDescription_Absorb:: - .string "An attack that\nabsorbs half the\ndamage it inflicted\nto restore HP.$" - -gMoveDescription_MegaDrain:: - .string "A tough attack that\ndrains half the\ndamage it inflicted\nto restore HP.$" - -gMoveDescription_LeechSeed:: - .string "A seed is planted\non the foe to steal\nsome HP for the \nuser on every turn.$" - -gMoveDescription_Growth:: - .string "The user's body is\nforced to grow,\nraising the SP.\nATK stat.$" - -gMoveDescription_RazorLeaf:: - .string "The foe is hit with\na cutting leaf.\nIt has a high\ncritical-hit ratio.$" - -gMoveDescription_SolarBeam:: - .string "A 2-turn move that\nblasts the foe with\nabsorbed energy in\nthe 2nd turn.$" - -gMoveDescription_PoisonPowder:: - .string "A cloud of toxic\ndust is scattered.\nIt may poison the\nfoe.$" - -gMoveDescription_StunSpore:: - .string "Paralyzing dust is\nscattered wildly.\nIt may paralyze\nthe foe.$" - -gMoveDescription_SleepPowder:: - .string "A sleep-inducing\ndust is scattered\nin high volume\naround a foe.$" - -gMoveDescription_PetalDance:: - .string "The user attacks\nwith petals for two\nto three turns,\nthen gets confused.$" - -gMoveDescription_StringShot:: - .string "The foe is bound\nwith strings shot\nfrom the mouth to\nreduce its SPEED.$" - -gMoveDescription_DragonRage:: - .string "The foe is hit with\na shock wave that\nalways inflicts 40-\nHP damage.$" - -gMoveDescription_FireSpin:: - .string "The foe is trapped\nin an intense spiral\nof fire that rages\ntwo to five turns.$" - -gMoveDescription_ThunderShock:: - .string "An electric shock\nattack that may\nalso leave the foe\nparalyzed.$" - -gMoveDescription_Thunderbolt:: - .string "A strong electrical\nattack that may\nalso leave the foe\nparalyzed.$" - -gMoveDescription_ThunderWave:: - .string "A weak electric\nshock that is sure\nto cause paralysis\nif it hits.$" - -gMoveDescription_Thunder:: - .string "A brutal lightning\nattack that may\nalso leave the foe\nparalyzed.$" - -gMoveDescription_RockThrow:: - .string "The foe is attacked\nwith a shower of\nsmall, easily\nthrown rocks.$" - -gMoveDescription_Earthquake:: - .string "An earthquake that\nstrikes all POKéMON\nin battle excluding\nthe user.$" - -gMoveDescription_Fissure:: - .string "The foe is dropped\ninto a fissure.\nThe foe faints if it\nhits.$" - -gMoveDescription_Dig:: - .string "An attack that hits\non the 2nd turn.\nCan also be used\nto exit dungeons.$" - -gMoveDescription_Toxic:: - .string "A move that badly\npoisons the foe.\nIts poison damage\nworsens every turn.$" - -gMoveDescription_Confusion:: - .string "A weak telekinetic\nattack that may\nalso leave the foe\nconfused.$" - -gMoveDescription_Psychic:: - .string "A strong telekinetic\nattack. It may also\nlower the foe's\nSP. DEF stat.$" - -gMoveDescription_Hypnosis:: - .string "Hypnotic suggestion\nis used to make the\nfoe fall into a\ndeep sleep.$" - -gMoveDescription_Meditate:: - .string "The user meditates\nto awaken its power\nand raise its\nATTACK stat.$" - -gMoveDescription_Agility:: - .string "The user relaxes\nand lightens its\nbody to sharply\nboost its SPEED.$" - -gMoveDescription_QuickAttack:: - .string "An almost invisibly\nfast attack that\nis certain to strike\nfirst.$" - -gMoveDescription_Rage:: - .string "An attack that\nbecomes stronger\neach time the user\nis hit in battle.$" - -gMoveDescription_Teleport:: - .string "Use it to flee from\nany wild POKéMON.\nAlso warps to the\nlast POKé CENTER.$" - -gMoveDescription_NightShade:: - .string "An attack with a\nmirage that inflicts\ndamage matching\nthe user's level.$" - -gMoveDescription_Mimic:: - .string "The user copies the\nmove last used by\nthe foe for the\nrest of the battle.$" - -gMoveDescription_Screech:: - .string "An ear-splitting\nscreech is emitted\nto sharply reduce\nthe foe's DEFENSE.$" - -gMoveDescription_DoubleTeam:: - .string "The user creates\nillusory copies of\nitself to raise its\nevasiveness.$" - -gMoveDescription_Recover:: - .string "A self-healing move\nthat restores HP by\nup to half of the\nuser's maximum HP.$" - -gMoveDescription_Harden:: - .string "The user stiffens\nall the muscles in\nits body to raise\nits DEFENSE stat.$" - -gMoveDescription_Minimize:: - .string "The user compresses\nall the cells in its\nbody to raise its\nevasiveness.$" - -gMoveDescription_Smokescreen:: - .string "An obscuring cloud\nof smoke or ink\nreduces the foe's\naccuracy.$" - -gMoveDescription_ConfuseRay:: - .string "The foe is exposed\nto a sinister ray\nthat triggers\nconfusion.$" - -gMoveDescription_Withdraw:: - .string "The user withdraws\nits body in its hard\nshell, raising its\nDEFENSE stat.$" - -gMoveDescription_DefenseCurl:: - .string "The user curls up\nto conceal weak\nspots and raise its\nDEFENSE stat.$" - -gMoveDescription_Barrier:: - .string "The user creates a\nsturdy wall that\nsharply raises its\nDEFENSE stat.$" - -gMoveDescription_LightScreen:: - .string "A wall of light\ncuts damage from\nSP. ATK attacks\nfor five turns.$" - -gMoveDescription_Haze:: - .string "Eliminates all stat\nchanges among all\nPOKéMON engaged in\nbattle.$" - -gMoveDescription_Reflect:: - .string "A wall of light\ncuts damage from\nphysical attacks\nfor five turns.$" - -gMoveDescription_FocusEnergy:: - .string "The user takes a\ndeep breath and\nfocuses to raise its\ncritical-hit ratio.$" - -gMoveDescription_Bide:: - .string "The user endures\nattacks for two\nturns, then strikes\nback double.$" - -gMoveDescription_Metronome:: - .string "Waggles a finger\nand stimulates the\nbrain into using any\nmove at random.$" - -gMoveDescription_MirrorMove:: - .string "The user counters\nthe move last used\nby the foe with the\nsame move.$" - -gMoveDescription_SelfDestruct:: - .string "The user blows up\nto inflict severe\ndamage, even\nmaking itself faint.$" - -gMoveDescription_EggBomb:: - .string "A large egg is\nhurled with great\nforce at the foe to\ninflict damage.$" - -gMoveDescription_Lick:: - .string "The foe is licked\nand hit with a long\ntongue. It may\nalso paralyze.$" - -gMoveDescription_Smog:: - .string "The foe is attacked\nwith exhaust gases.\nIt may also poison\nthe foe.$" - -gMoveDescription_Sludge:: - .string "Toxic sludge is\nhurled at the foe.\nIt may poison the\ntarget.$" - -gMoveDescription_BoneClub:: - .string "The foe is clubbed\nwith a bone held in\nhand. It may make\nthe foe flinch.$" - -gMoveDescription_FireBlast:: - .string "The foe is hit with\nan intense flame.\nIt may leave the\ntarget with a burn.$" - -gMoveDescription_Waterfall:: - .string "A powerful charge\nattack. It can also\nbe used to climb\na waterfall.$" - -gMoveDescription_Clamp:: - .string "The foe is clamped\nand squeezed by\nthe user's shell for\ntwo to five turns.$" - -gMoveDescription_Swift:: - .string "Star-shaped rays\nthat never miss are\nfired at all foes in\nbattle.$" - -gMoveDescription_SkullBash:: - .string "The user raises its\nDEFENSE in the 1st\nturn, then attacks\nin the 2nd turn.$" - -gMoveDescription_SpikeCannon:: - .string "Sharp spikes are\nfired at the foe to\nstrike two to five\ntimes.$" - -gMoveDescription_Constrict:: - .string "The foe is attacked\nwith long tentacles\nor vines. It may\nlower SPEED.$" - -gMoveDescription_Amnesia:: - .string "Forgets about\nsomething and\nsharply raises\nSP. DEF.$" - -gMoveDescription_Kinesis:: - .string "The user distracts\nthe foe by bending\na spoon. It may\nlower accuracy.$" - -gMoveDescription_SoftBoiled:: - .string "Heals the user by\nup to half its full\nHP. It can be used\nto heal an ally.$" - -gMoveDescription_HiJumpKick:: - .string "A strong jumping\nknee kick. If it\nmisses, the user is\nhurt.$" - -gMoveDescription_Glare:: - .string "The user intimidates\nthe foe with the\ndesign on its belly\nto cause paralysis.$" - -gMoveDescription_DreamEater:: - .string "Absorbs half the\ndamage it inflicted\non a sleeping foe\nto restore HP.$" - -gMoveDescription_PoisonGas:: - .string "The foe is sprayed\nwith a cloud of\ntoxic gas that may\npoison the foe.$" - -gMoveDescription_Barrage:: - .string "Round objects are\nhurled at the foe\nto strike two to\nfive times.$" - -gMoveDescription_LeechLife:: - .string "An attack that\nabsorbs half the\ndamage it inflicted\nto restore HP.$" - -gMoveDescription_LovelyKiss:: - .string "The user forces a\nkiss on the foe\nwith a scary face\nthat induces sleep.$" - -gMoveDescription_SkyAttack:: - .string "A 2nd-turn attack\nmove with a high\ncritical-hit ratio.\nThe foe may flinch.$" - -gMoveDescription_Transform:: - .string "The user transforms\ninto a copy of the\nfoe with even the\nsame move set.$" - -gMoveDescription_Bubble:: - .string "A spray of bubbles\nhits the foe.\nIt may lower the\nfoe's SPEED stat.$" - -gMoveDescription_DizzyPunch:: - .string "The foe is hit with\na rhythmic punch\nthat may leave it\nconfused.$" - -gMoveDescription_Spore:: - .string "The user scatters\nbursts of fine\nspores that induce\nsleep.$" - -gMoveDescription_Flash:: - .string "A blast of light\nthat cuts the foe's\naccuracy. It also\nilluminates caves.$" - -gMoveDescription_Psywave:: - .string "The foe is attacked\nwith an odd, hot\nenergy wave that\nvaries in intensity.$" - -gMoveDescription_Splash:: - .string "The user just flops\nand splashes around\nwithout having any\neffect.$" - -gMoveDescription_AcidArmor:: - .string "The user alters its\ncells to liquefy\nitself and sharply\nraise DEFENSE.$" - -gMoveDescription_Crabhammer:: - .string "A large pincer is\nused to hammer the\nfoe. It has a high\ncritical-hit ratio.$" - -gMoveDescription_Explosion:: - .string "The user explodes\nto inflict terrible\ndamage even while\nfainting itself.$" - -gMoveDescription_FurySwipes:: - .string "The foe is raked\nwith sharp claws or\nscythes two to five\ntimes.$" - -gMoveDescription_Bonemerang:: - .string "The user throws a\nbone that hits the\nfoe once, then once\nagain on return.$" - -gMoveDescription_Rest:: - .string "The user sleeps for\ntwo turns to fully\nrestore HP and heal\nany status problem.$" - -gMoveDescription_RockSlide:: - .string "Large boulders are\nhurled at the foe.\nIt may make the\nfoe flinch.$" - -gMoveDescription_HyperFang:: - .string "The foe is attacked\nwith sharp fangs.\nIt may make the\nfoe flinch.$" - -gMoveDescription_Sharpen:: - .string "The user reduces\nits polygon count\nto sharpen edges\nand raise ATTACK.$" - -gMoveDescription_Conversion:: - .string "The user changes\nits type to match\nthe type of one of\nits moves.$" - -gMoveDescription_TriAttack:: - .string "A simultaneous\n3-beam attack that\nmay paralyze, burn,\nor freeze the foe.$" - -gMoveDescription_SuperFang:: - .string "The user attacks\nwith sharp fangs\nand halves the\nfoe's HP.$" - -gMoveDescription_Slash:: - .string "The foe is slashed\nwith claws, etc.\nIt has a high\ncritical-hit ratio.$" - -gMoveDescription_Substitute:: - .string "The user creates a\ndecoy using one-\nquarter of its full\nHP.$" - -gMoveDescription_Struggle:: - .string "An attack that is\nused only if there\nis no PP. It also\nhurts the user.$" - -gMoveDescription_Sketch:: - .string "This move copies\nthe move last used\nby the foe, then\ndisappears.$" - -gMoveDescription_TripleKick:: - .string "A 3-kick attack\nthat becomes more\npowerful with each\nsuccessive hit.$" - -gMoveDescription_Thief:: - .string "An attack that may\ntake the foe's held\nitem if the user\nisn't holding one.$" - -gMoveDescription_SpiderWeb:: - .string "Ensnares the foe \nwith sticky string\nso it doesn't flee\nor switch out.$" - -gMoveDescription_MindReader:: - .string "The user predicts\nthe foe's action to\nensure its next\nattack hits.$" - -gMoveDescription_Nightmare:: - .string "A sleeping foe is\nshown a nightmare\nthat inflicts some\ndamage every turn.$" - -gMoveDescription_FlameWheel:: - .string "The user makes a\nfiery charge at the\nfoe. It may cause\na burn.$" - -gMoveDescription_Snore:: - .string "An attack that can\nbe used only while\nasleep. It may\ncause flinching.$" - -gMoveDescription_Curse:: - .string "A move that works\ndifferently for the\nGHOST-type and all\nthe other types.$" - -gMoveDescription_Flail:: - .string "A desperate attack\nthat becomes more\npowerful the less\nHP the user has.$" - -gMoveDescription_Conversion2:: - .string "The user changes\ntype to make itself\nresistant to the\nlast attack it took.$" - -gMoveDescription_Aeroblast:: - .string "A vortex of air is\nshot at the foe.\nIt has a high\ncritical-hit ratio.$" - -gMoveDescription_CottonSpore:: - .string "Cotton-like spores\ncling to the foe,\nsharply reducing\nits SPEED stat.$" - -gMoveDescription_Reversal:: - .string "An all-out attack\nthat becomes more\npowerful the less\nHP the user has.$" - -gMoveDescription_Spite:: - .string "A move that cuts\n2 to 5 PP from the\nmove last used by\nthe foe.$" - -gMoveDescription_PowderSnow:: - .string "Blasts the foe with\na snowy gust.\nIt may cause\nfreezing.$" - -gMoveDescription_Protect:: - .string "Enables the user to\nevade all attacks.\nIt may fail if used\nin succession.$" - -gMoveDescription_MachPunch:: - .string "A punch thrown at\nblinding speed.\nIt is certain to\nstrike first.$" - -gMoveDescription_ScaryFace:: - .string "Frightens the foe\nwith a scary face\nto sharply reduce\nits SPEED.$" - -gMoveDescription_FaintAttack:: - .string "The user draws up\nclose to the foe\ndisarmingly, then\nhits without fail.$" - -gMoveDescription_SweetKiss:: - .string "The user kisses\nthe foe with sweet\ncuteness that\ncauses confusion.$" - -gMoveDescription_BellyDrum:: - .string "The user maximizes\nits ATTACK stat at\nthe cost of half\nits full HP.$" - -gMoveDescription_SludgeBomb:: - .string "Filthy sludge is\nhurled at the foe.\nIt may poison the\ntarget.$" - -gMoveDescription_MudSlap:: - .string "Mud is hurled in\nthe foe's face to\ninflict damage and\nlower its accuracy.$" - -gMoveDescription_Octazooka:: - .string "Ink is blasted in\nthe foe's face or\neyes to damage and\nlower accuracy.$" - -gMoveDescription_Spikes:: - .string "A trap of spikes is\nlaid around the\nfoe's party to hurt\nfoes switching in.$" - -gMoveDescription_ZapCannon:: - .string "An electric blast is\nfired like a cannon\nto inflict damage\nand paralyze.$" - -gMoveDescription_Foresight:: - .string "Completely negates\nthe foe's efforts to\nheighten its ability\nto evade.$" - -gMoveDescription_DestinyBond:: - .string "If the user faints,\nthe foe delivering\nthe final hit also\nfaints.$" - -gMoveDescription_PerishSong:: - .string "Any battler that\nhears this faints\nin three turns\nunless it switches.$" - -gMoveDescription_IcyWind:: - .string "A chilling wind is\nused to attack.\nIt also lowers the\nSPEED stat.$" - -gMoveDescription_Detect:: - .string "Enables the user to\nevade all attacks.\nIt may fail if used\nin succession.$" - -gMoveDescription_BoneRush:: - .string "The user strikes\nthe foe with a bone\nin hand two to five\ntimes.$" - -gMoveDescription_LockOn:: - .string "The user locks on\nto the foe, making\nthe next move sure\nto hit.$" - -gMoveDescription_Outrage:: - .string "The user thrashes\nabout for two to\nthree turns, then\nbecomes confused.$" - -gMoveDescription_Sandstorm:: - .string "A 5-turn sandstorm\nthat damages all\ntypes except ROCK,\nGROUND, and STEEL.$" - -gMoveDescription_GigaDrain:: - .string "A harsh attack that\nabsorbs half the\ndamage it inflicted\nto restore HP.$" - -gMoveDescription_Endure:: - .string "The user endures\nany hit with 1 HP\nleft. It may fail if\nused in succession.$" - -gMoveDescription_Charm:: - .string "The foe is charmed\nby the user's cute\nappeals, sharply\ncutting its ATTACK.$" - -gMoveDescription_Rollout:: - .string "A 5-turn rolling\nattack that becomes\nstronger each time\nit hits.$" - -gMoveDescription_FalseSwipe:: - .string "A restrained attack\nthat always leaves\nthe foe with at\nleast 1 HP.$" - -gMoveDescription_Swagger:: - .string "A move that makes\nthe foe confused,\nbut also sharply\nraises its ATTACK.$" - -gMoveDescription_MilkDrink:: - .string "Heals the user by\nup to half its full\nHP. It can be used\nto heal an ally.$" - -gMoveDescription_Spark:: - .string "An electrically\ncharged tackle that\nmay also paralyze\nthe foe.$" - -gMoveDescription_FuryCutter:: - .string "An attack that\ngrows stronger on\neach successive\nhit.$" - -gMoveDescription_SteelWing:: - .string "The foe is hit with\nwings of steel.\nIt may also raise\nthe user's DEFENSE.$" - -gMoveDescription_MeanLook:: - .string "The foe is fixed\nwith a mean look\nthat prevents it\nfrom escaping.$" - -gMoveDescription_Attract:: - .string "If it is the other\ngender, the foe is\nmade infatuated and\nunlikely to attack.$" - -gMoveDescription_SleepTalk:: - .string "While asleep, the\nuser randomly uses\none of the moves it\nknows.$" - -gMoveDescription_HealBell:: - .string "A soothing bell\nchimes to heal the\nstatus problems of\nall allies.$" - -gMoveDescription_Return:: - .string "This attack move\ngrows more powerful\nthe more the user\nlikes its TRAINER.$" - -gMoveDescription_Present:: - .string "The foe is given a\nbooby-trapped gift.\nIt restores HP\nsometimes, however.$" - -gMoveDescription_Frustration:: - .string "This attack move\ngrows more powerful\nthe less the user\nlikes its TRAINER.$" - -gMoveDescription_Safeguard:: - .string "It protects the\nuser's party from\nall status problems\nfor five turns.$" - -gMoveDescription_PainSplit:: - .string "The user adds its\nHP to the foe's HP,\nthen equally shares\nthe total HP.$" - -gMoveDescription_SacredFire:: - .string "A mystical and\npowerful fire\nattack that may\ninflict a burn.$" - -gMoveDescription_Magnitude:: - .string "A ground-shaking\nattack against all\nstanding POKéMON.\nIts power varies.$" - -gMoveDescription_DynamicPunch:: - .string "The foe is punched\nwith the user's full\npower. It confuses\nthe foe if it hits.$" - -gMoveDescription_Megahorn:: - .string "A brutal ramming\nattack delivered\nwith a tough and\nimpressive horn.$" - -gMoveDescription_DragonBreath:: - .string "The foe is hit with\nan incredible blast\nof breath that may\nalso paralyze.$" - -gMoveDescription_BatonPass:: - .string "The user switches\nout, passing along\nany stat changes\nto the new battler.$" - -gMoveDescription_Encore:: - .string "Makes the foe use\nthe move it last\nused repeatedly for\ntwo to six turns.$" - -gMoveDescription_Pursuit:: - .string "An attack move that\nworks especially\nwell on a foe that\nis switching out.$" - -gMoveDescription_RapidSpin:: - .string "An attack that\nfrees the user from\nBIND, WRAP, LEECH\nSEED, and SPIKES.$" - -gMoveDescription_SweetScent:: - .string "Allures the foe to\nreduce evasiveness.\nIt also attracts\nwild POKéMON.$" - -gMoveDescription_IronTail:: - .string "An attack with a\nsteel-hard tail.\nIt may lower the\nfoe's DEFENSE stat.$" - -gMoveDescription_MetalClaw:: - .string "The foe is attacked\nwith steel claws.\nIt may also raise\nthe user's ATTACK.$" - -gMoveDescription_VitalThrow:: - .string "Makes the user\nattack after the\nfoe. In return,\nit will not miss.$" - -gMoveDescription_MorningSun:: - .string "Restores the user's\nHP. The amount of\nHP regained varies\nwith the weather.$" - -gMoveDescription_Synthesis:: - .string "Restores the user's\nHP. The amount of\nHP regained varies\nwith the weather.$" - -gMoveDescription_Moonlight:: - .string "Restores the user's\nHP. The amount of\nHP regained varies\nwith the weather.$" - -gMoveDescription_HiddenPower:: - .string "An attack that\nvaries in type and\nintensity depending\non the user.$" - -gMoveDescription_CrossChop:: - .string "The foe is hit with\ndouble chops.\nIt has a high\ncritical-hit ratio.$" - -gMoveDescription_Twister:: - .string "A vicious twister\nattacks the foe.\nIt may make the\nfoe flinch.$" - -gMoveDescription_RainDance:: - .string "A heavy rain falls\nfor five turns,\npowering up WATER-\ntype moves.$" - -gMoveDescription_SunnyDay:: - .string "The sun blazes for\nfive turns, powering\nup FIRE-type\nmoves.$" - -gMoveDescription_Crunch:: - .string "The foe is crunched\nwith sharp fangs.\nIt may lower the\nfoe's SP. DEF.$" - -gMoveDescription_MirrorCoat:: - .string "A retaliation move\nthat pays back the\nfoe's special attack\ndouble.$" - -gMoveDescription_PsychUp:: - .string "The user hypnotizes\nitself into copying\nany stat change\nmade by the foe.$" - -gMoveDescription_ExtremeSpeed:: - .string "A blindingly speedy\ncharge attack that\nalways goes before\nany other.$" - -gMoveDescription_AncientPower:: - .string "An ancient power is\nused to attack. It\nmay also raise all\nthe user's stats.$" - -gMoveDescription_ShadowBall:: - .string "A shadowy blob is\nhurled at the foe.\nMay also lower the\nfoe's SP. DEF.$" - -gMoveDescription_FutureSight:: - .string "Two turns after\nthis move is used,\nthe foe is attacked\npsychically.$" - -gMoveDescription_RockSmash:: - .string "An attack that may\nalso cut DEFENSE.\nIt can also smash\ncracked boulders.$" - -gMoveDescription_Whirlpool:: - .string "The foe is trapped\nin a fast, vicious\nwhirlpool for two\nto five turns.$" - -gMoveDescription_BeatUp:: - .string "All party POKéMON\njoin in the attack.\nThe more allies,\nthe more damage.$" - -gMoveDescription_FakeOut:: - .string "An attack that hits\nfirst and causes\nflinching. Usable\nonly on 1st turn.$" - -gMoveDescription_Uproar:: - .string "The user attacks in\nan uproar that\nprevents sleep for\ntwo to five turns.$" - -gMoveDescription_Stockpile:: - .string "The user charges\nup power for use\nlater. It can be\nused three times.$" - -gMoveDescription_SpitUp:: - .string "The power built\nusing STOCKPILE is\nreleased at once\nfor attack.$" - -gMoveDescription_Swallow:: - .string "The energy it built\nusing STOCKPILE is\nabsorbed to restore\nHP.$" - -gMoveDescription_HeatWave:: - .string "The user exhales a\nheated breath to\nattack. It may also\ninflict a burn.$" - -gMoveDescription_Hail:: - .string "A hailstorm lasting\nfive turns damages\nall POKéMON except\nthe ICE-type.$" - -gMoveDescription_Torment:: - .string "It enrages the foe,\nmaking it incapable\nof using the same\nmove successively.$" - -gMoveDescription_Flatter:: - .string "Flattery is used to\nconfuse the foe,\nbut its SP. ATK\nalso rises.$" - -gMoveDescription_WillOWisp:: - .string "A sinister, bluish\nwhite flame is shot\nat the foe to\ninflict a burn.$" - -gMoveDescription_Memento:: - .string "The user faints,\nbut sharply lowers\nthe foe's ATTACK\nand SP. ATK.$" - -gMoveDescription_Facade:: - .string "An attack that is\nboosted if user is\nburned, poisoned,\nor paralyzed.$" - -gMoveDescription_FocusPunch:: - .string "An attack that is\nexecuted last.\nThe user flinches\nif hit beforehand.$" - -gMoveDescription_SmellingSalt:: - .string "Doubly effective on\na paralyzed foe,\nbut it also cures\nthe foe's paralysis.$" - -gMoveDescription_FollowMe:: - .string "The user draws\nattention to itself,\nmaking foes attack\nonly the user.$" - -gMoveDescription_NaturePower:: - .string "An attack that\nchanges type\ndepending on the\nuser's location.$" - -gMoveDescription_Charge:: - .string "The user charges\npower to boost the\nELECTRIC move it\nuses next.$" - -gMoveDescription_Taunt:: - .string "The foe is taunted\ninto a rage that\nallows it to use\nonly attack moves.$" - -gMoveDescription_HelpingHand:: - .string "A move that boosts\nthe power of the\nally's attack in a\nbattle.$" - -gMoveDescription_Trick:: - .string "A move that tricks\nthe foe into\ntrading held items\nwith the user.$" - -gMoveDescription_RolePlay:: - .string "The user mimics the\nfoe completely and\ncopies the foe's\nability.$" - -gMoveDescription_Wish:: - .string "A self-healing move\nthat restores half\nthe full HP on the\nnext turn.$" - -gMoveDescription_Assist:: - .string "The user randomly\npicks and uses a\nmove of an allied\nPOKéMON.$" - -gMoveDescription_Ingrain:: - .string "The user lays roots\nthat restore HP on\nevery turn.\nIt can't switch out.$" - -gMoveDescription_Superpower:: - .string "A powerful attack,\nbut it also lowers\nthe user's ATTACK\nand DEFENSE stats.$" - -gMoveDescription_MagicCoat:: - .string "Reflects back the\nfoe's LEECH SEED\nand any status-\ndamaging move.$" - -gMoveDescription_Recycle:: - .string "A move that\nrecycles a used\nitem for use once\nmore.$" - -gMoveDescription_Revenge:: - .string "An attack move that\ngains in intensity if\nthe target has hurt\nthe user.$" - -gMoveDescription_BrickBreak:: - .string "An attack that also\nbreaks any barrier\nlike LIGHT SCREEN\nand REFLECT.$" - -gMoveDescription_Yawn:: - .string "A huge yawn lulls\nthe foe into falling\nasleep on the next\nturn.$" - -gMoveDescription_KnockOff:: - .string "Knocks down the\nfoe's held item to\nprevent its use\nduring the battle.$" - -gMoveDescription_Endeavor:: - .string "Gains power the\nfewer HP the user\nhas compared with\nthe foe.$" - -gMoveDescription_Eruption:: - .string "The higher the\nuser's HP, the more\npowerful this\nattack becomes.$" - -gMoveDescription_SkillSwap:: - .string "The user employs\nits psychic power\nto swap abilities\nwith the foe.$" - -gMoveDescription_Imprison:: - .string "Prevents foes from\nusing any move\nthat is also known\nby the user.$" - -gMoveDescription_Refresh:: - .string "A self-healing move\nthat cures the user\nof a poisoning,\nburn, or paralysis.$" - -gMoveDescription_Grudge:: - .string "If the user faints,\nthis move deletes\nthe PP of the move\nthat finished it.$" - -gMoveDescription_Snatch:: - .string "Steals the effects\nof the foe's\nhealing or status-\nchanging move.$" - -gMoveDescription_SecretPower:: - .string "An attack that may\nhave an additional\neffect that varies\nwith the terrain.$" - -gMoveDescription_Dive:: - .string "The user dives\nunderwater on the\nfirst turn and\nstrikes next turn.$" - -gMoveDescription_ArmThrust:: - .string "A quick flurry of\nstraight-arm\npunches that hit\ntwo to five times.$" - -gMoveDescription_Camouflage:: - .string "Alters the user's\ntype depending on\nthe location's\nterrain.$" - -gMoveDescription_TailGlow:: - .string "The user flashes a\nlight that sharply\nraises its SP. ATK\nstat.$" - -gMoveDescription_LusterPurge:: - .string "A burst of light\ninjures the foe. It\nmay also lower the\nfoe's SP. DEF.$" - -gMoveDescription_MistBall:: - .string "A flurry of down\nhits the foe. It\nmay also lower the\nfoe's SP. ATK.$" - -gMoveDescription_FeatherDance:: - .string "The foe is covered\nwith a mass of down\nthat sharply cuts\nthe ATTACK stat.$" - -gMoveDescription_TeeterDance:: - .string "A wobbly dance\nthat confuses all\nthe POKéMON in\nbattle.$" - -gMoveDescription_BlazeKick:: - .string "A fiery kick with a\nhigh critical-hit\nratio. It may also\nburn the foe.$" - -gMoveDescription_MudSport:: - .string "Weakens ELECTRIC-\ntype attacks while\nthe user is in the\nbattle.$" - -gMoveDescription_IceBall:: - .string "A 5-turn rolling\nattack that becomes\nstronger each time\nit rolls.$" - -gMoveDescription_NeedleArm:: - .string "An attack using\nthorny arms.\nIt may make the\nfoe flinch.$" - -gMoveDescription_SlackOff:: - .string "The user slacks off\nand restores its HP\nby half its full\nHP.$" - -gMoveDescription_HyperVoice:: - .string "The user lets loose\na horribly loud\nshout with the\npower to damage.$" - -gMoveDescription_PoisonFang:: - .string "The foe is bitten\nwith toxic fangs.\nIt may also badly\npoison the foe.$" - -gMoveDescription_CrushClaw:: - .string "The foe is attacked\nwith sharp claws.\nIt may also lower\nthe foe's DEFENSE.$" - -gMoveDescription_BlastBurn:: - .string "The foe is hit with\na huge explosion.\nThe user can't move\non the next turn.$" - -gMoveDescription_HydroCannon:: - .string "The foe is hit with\na watery cannon.\nThe user can't move\non the next turn.$" - -gMoveDescription_MeteorMash:: - .string "The foe is hit with\na hard, fast punch.\nIt may also raise\nthe user's ATTACK.$" - -gMoveDescription_Astonish:: - .string "An attack using a\nstartling shout.\nIt also may make\nthe foe flinch.$" - -gMoveDescription_WeatherBall:: - .string "An attack that\nvaries in power and\ntype depending on\nthe weather.$" - -gMoveDescription_Aromatherapy:: - .string "A soothing scent is\nreleased to heal\nall status problems\nin the user's party.$" - -gMoveDescription_FakeTears:: - .string "The user feigns\ncrying to sharply\nlower the foe's\nSP. DEF stat.$" - -gMoveDescription_AirCutter:: - .string "The foe is hit with\nrazor-like wind.\nIt has a high\ncritical-hit ratio.$" - -gMoveDescription_Overheat:: - .string "An intense attack\nthat also sharply\nreduces the user's\nSP. ATK stat.$" - -gMoveDescription_OdorSleuth:: - .string "Completely negates\nthe foe's efforts to\nheighten its ability\nto evade.$" - -gMoveDescription_RockTomb:: - .string "Boulders are hurled\nat the foe. It also\nlowers the foe's\nSPEED if it hits.$" - -gMoveDescription_SilverWind:: - .string "The foe is attacked\nwith a silver dust.\nIt may raise all\nthe user's stats.$" - -gMoveDescription_MetalSound:: - .string "A horrible metallic\nscreech is used to\nsharply lower the\nfoe's SP. DEF.$" - -gMoveDescription_GrassWhistle:: - .string "A pleasant melody\nis played to lull\nthe foe into a deep\nsleep.$" - -gMoveDescription_Tickle:: - .string "The foe is made to\nlaugh, reducing its\nATTACK and DEFENSE\nstats.$" - -gMoveDescription_CosmicPower:: - .string "The user absorbs a\nmystic power to\nraise its DEFENSE\nand SP. DEF.$" - -gMoveDescription_WaterSpout:: - .string "The higher the\nuser's HP, the more\npowerful this\nattack becomes.$" - -gMoveDescription_SignalBeam:: - .string "The foe is hit with\na flashing beam\nthat may also\ncause confusion.$" - -gMoveDescription_ShadowPunch:: - .string "The user throws a\npunch from the\nshadows. It cannot\nbe evaded.$" - -gMoveDescription_Extrasensory:: - .string "The user attacks\nwith an odd power\nthat may make the\nfoe flinch.$" - -gMoveDescription_SkyUppercut:: - .string "The user attacks\nwith an uppercut\nthrown skywards\nwith force.$" - -gMoveDescription_SandTomb:: - .string "The foe is trapped\ninside a painful\nsandstorm for two\nto five turns.$" - -gMoveDescription_SheerCold:: - .string "The foe is attacked\nwith ultimate cold\nthat causes fainting\nif it hits.$" - -gMoveDescription_MuddyWater:: - .string "The user attacks\nwith muddy water.\nIt may also lower\nthe foe's accuracy.$" - -gMoveDescription_BulletSeed:: - .string "The user shoots\nseeds at the foe.\nTwo to five seeds\nare shot at once.$" - -gMoveDescription_AerialAce:: - .string "An extremely fast\nattack against one\ntarget. It can't be\nevaded.$" - -gMoveDescription_IcicleSpear:: - .string "Sharp icicles are\nfired at the foe.\nIt strikes two to\nfive times.$" - -gMoveDescription_IronDefense:: - .string "The user hardens\nits body's surface\nto sharply raise its\nDEFENSE stat.$" - -gMoveDescription_Block:: - .string "The user blocks the\nfoe's way with arms\nspread wide to\nprevent escape.$" - -gMoveDescription_Howl:: - .string "The user howls to\nraise its spirit and\nboost its ATTACK\nstat.$" - -gMoveDescription_DragonClaw:: - .string "Sharp, huge claws\nhook and slash the\nfoe quickly and\nwith great power.$" - -gMoveDescription_FrenzyPlant:: - .string "The foe is hit with\nan enormous branch.\nThe user can't move\non the next turn.$" - -gMoveDescription_BulkUp:: - .string "The user bulks up\nits body to boost\nboth its ATTACK and\nDEFENSE stats.$" - -gMoveDescription_Bounce:: - .string "The user bounces\non the foe on the\n2nd turn. It may\nparalyze the foe.$" - -gMoveDescription_MudShot:: - .string "The user attacks by\nhurling mud.\nIt also reduces the\nfoe's SPEED.$" - -gMoveDescription_PoisonTail:: - .string "An attack with a\nhigh critical-hit\nratio. It may also\npoison the foe.$" - -gMoveDescription_Covet:: - .string "A cutely executed\nattack that also\nsteals the foe's\nhold item.$" - -gMoveDescription_VoltTackle:: - .string "The user throws an\nelectrified tackle.\nIt hurts the user\na little.$" - -gMoveDescription_MagicalLeaf:: - .string "The foe is attacked\nwith a strange leaf\nthat cannot be\nevaded.$" - -gMoveDescription_WaterSport:: - .string "Weakens FIRE-type\nattacks while the\nuser is in the\nbattle.$" - -gMoveDescription_CalmMind:: - .string "The user focuses\nits mind to raise\nthe SP. ATK and\nSP. DEF stats.$" - -gMoveDescription_LeafBlade:: - .string "The foe is slashed\nwith a sharp leaf.\nIt has a high\ncritical-hit ratio.$" - -gMoveDescription_DragonDance:: - .string "A mystic, powerful\ndance that boosts\nthe user's ATTACK\nand SPEED stats.$" - -gMoveDescription_RockBlast:: - .string "The user hurls two\nto five hard rocks\nat the foe to\nattack.$" - -gMoveDescription_ShockWave:: - .string "A rapid jolt of\nelectricity strikes\nthe foe. It can't\nbe evaded.$" - -gMoveDescription_WaterPulse:: - .string "An attack with a\npulsing blast of\nwater. It may also\nconfuse the foe.$" - -gMoveDescription_DoomDesire:: - .string "A move that attacks\nthe foe with a\nblast of light two\nturns after use.$" - -gMoveDescription_PsychoBoost:: - .string "An intense attack\nthat also sharply\nreduces the user's\nSP. ATK stat.$" - diff --git a/data/text/new_game_intro.inc b/data/text/new_game_intro.inc index 504d0675f..e667b68d9 100644 --- a/data/text/new_game_intro.inc +++ b/data/text/new_game_intro.inc @@ -124,41 +124,41 @@ gNameChoice_Momo:: gNameChoice_Suzi:: .string "SUZI$" -gNewGame_HelpDocs1:: +gControlsGuide_Text_Intro:: .string "The various buttons will be explained in\n" .string "the order of their importance.$" -gNewGame_HelpDocs2:: +gControlsGuide_Text_DPad:: .string "Moves the main character.\n" .string "Also used to choose various data\n" .string "headings.$" -gNewGame_HelpDocs3:: +gControlsGuide_Text_AButton:: .string "Used to confirm a choice, check\n" .string "things, chat, and scroll text.$" -gNewGame_HelpDocs4:: +gControlsGuide_Text_BButton:: .string "Used to exit, cancel a choice,\n" .string "and cancel a mode.$" -gNewGame_HelpDocs5:: +gControlsGuide_Text_StartButton:: .string "Press this button to open the\n" .string "MENU.$" -gNewGame_HelpDocs6:: +gControlsGuide_Text_SelectButton:: .string "Used to shift items and to use\n" .string "a registered item.$" -gNewGame_HelpDocs7:: +gControlsGuide_Text_LRButtons:: .string "If you need help playing the\n" .string "game, or on how to do things,\n" .string "press the L or R Button.$" -gOakText_AskPlayerGender:: +gOakSpeech_Text_AskPlayerGender:: .string "Now tell me. Are you a boy?\n" .string "Or are you a girl?$" -gNewGameAdventureIntro1:: +gPikachuIntro_Text_Page1:: .string "In the world which you are about to\n" .string "enter, you will embark on a grand\n" .string "adventure with you as the hero.\n" @@ -168,7 +168,7 @@ gNewGameAdventureIntro1:: .string "or caves. Gather information and\n" .string "hints from every source.$" -gNewGameAdventureIntro2:: +gPikachuIntro_Text_Page2:: .string "New paths will open to you by helping\n" .string "people in need, overcoming challenges,\n" .string "and solving mysteries.\n" @@ -177,7 +177,7 @@ gNewGameAdventureIntro2:: .string "others and attacked by wild creatures.\n" .string "Be brave and keep pushing on.$" -gNewGameAdventureIntro3:: +gPikachuIntro_Text_Page3:: .string "Through your adventure, we hope\n" .string "that you will interact with all sorts\n" .string "of people and achieve personal growth.\n" @@ -186,49 +186,58 @@ gNewGameAdventureIntro3:: .string "Press the A Button, and let your\n" .string "adventure begin!$" -gOakText_WelcomeToTheWorld:: +gOakSpeech_Text_WelcomeToTheWorld:: .string "Hello, there!\n" - .string "Glad to meet you!\pWelcome to the world of POKéMON!\pMy name is OAK.\pPeople affectionately refer to me\n" + .string "Glad to meet you!\p" + .string "Welcome to the world of POKéMON!\p" + .string "My name is OAK.\p" + .string "People affectionately refer to me\n" .string "as the POKéMON PROFESSOR.\p$" -gOakText_WorldInhabited1:: +gOakSpeech_Text_ThisWorld:: .string "This world…$" -gOakText_WorldInhabited2:: +gOakSpeech_Text_IsInhabitedFarAndWide:: .string "…is inhabited far and wide by\n" .string "creatures called POKéMON.\p$" -gOakText_PetsBattlingStudy:: +gOakSpeech_Text_IStudyPokemon:: .string "For some people, POKéMON are pets.\n" - .string "Others use them for battling.\pAs for myself…\pI study POKéMON as a profession.\p$" + .string "Others use them for battling.\p" + .string "As for myself…\p" + .string "I study POKéMON as a profession.\p$" -gOakText_TellMeALittleAboutYourself:: +gOakSpeech_Text_TellMeALittleAboutYourself:: .string "But first, tell me a little about\n" .string "yourself.\p$" -gOakText_AskPlayerName:: +gOakSpeech_Text_YourNameWhatIsIt:: .string "Let's begin with your name.\n" .string "What is it?\p$" -gOakText_FinalizePlayerName:: +gOakSpeech_Text_SoYourNameIsPlayer:: .string "Right…\n" .string "So your name is {PLAYER}.$" -gOakText_IntroduceRival:: - .string "This is my grandson.\pHe's been your rival since you both\n" - .string "were babies.\p…Erm, what was his name now?$" +gOakSpeech_Text_WhatWasHisName:: + .string "This is my grandson.\p" + .string "He's been your rival since you both\n" + .string "were babies.\p" + .string "…Erm, what was his name now?$" -gOakText_AskRivalName:: +gOakSpeech_Text_YourRivalsNameWhatWasIt:: .string "Your rival's name, what was it now?$" -gOakText_ConfirmRivalName:: +gOakSpeech_Text_ConfirmRivalName:: .string "…Er, was it {RIVAL}?$" -gOakText_RememberRivalName:: +gOakSpeech_Text_RememberRivalsName:: .string "That's right! I remember now!\n" .string "His name is {RIVAL}!\p$" -gOakText_LegendAboutToUnfold:: - .string "{PLAYER}!\pYour very own POKéMON legend is\n" - .string "about to unfold!\pA world of dreams and adventures\n" +gOakSpeech_Text_LetsGo:: + .string "{PLAYER}!\p" + .string "Your very own POKéMON legend is\n" + .string "about to unfold!\p" + .string "A world of dreams and adventures\n" .string "with POKéMON awaits! Let's go!$" diff --git a/graphics/berry_crush/berry_crush.pal b/graphics/berry_crush/berry_crush.pal deleted file mode 100644 index 8ee3398d5..000000000 --- a/graphics/berry_crush/berry_crush.pal +++ /dev/null @@ -1,99 +0,0 @@ -JASC-PAL -0100 -96 -98 172 180 -255 213 156 -255 197 139 -255 164 106 -238 131 82 -222 123 74 -213 98 49 -197 82 41 -156 213 189 -123 180 156 -222 156 255 -172 123 222 -255 0 255 -255 0 255 -230 230 255 -65 74 90 -156 148 172 -255 213 156 -255 197 139 -255 164 106 -238 131 82 -222 123 74 -213 98 49 -197 82 41 -255 238 0 -230 189 0 -180 180 180 -139 139 139 -255 0 255 -255 0 255 -230 230 255 -65 74 90 -156 148 172 -255 213 156 -255 197 139 -255 164 106 -238 131 82 -222 123 74 -213 98 49 -197 82 41 -197 213 246 -255 255 255 -238 238 246 -205 205 213 -255 0 255 -255 0 255 -230 230 255 -65 74 90 -255 180 255 -164 172 172 -98 106 115 -123 131 139 -139 148 156 -148 222 164 -156 189 222 -197 213 246 -180 164 115 -205 189 148 -213 205 172 -230 222 189 -246 238 205 -139 123 74 -74 131 189 -65 74 90 -0 0 0 -148 222 164 -164 230 172 -180 238 189 -197 246 205 -213 255 222 -238 255 238 -255 255 255 -65 180 238 -255 255 255 -0 197 57 -255 255 255 -246 213 0 -255 0 255 -246 238 205 -139 123 74 -255 164 106 -164 172 172 -98 106 115 -123 131 139 -139 148 156 -115 156 189 -156 189 222 -197 213 246 -180 164 115 -205 189 148 -213 205 172 -230 222 189 -246 238 205 -139 123 74 -74 131 189 -65 74 90 diff --git a/graphics/berry_crush/berry_crush.png b/graphics/berry_crush/berry_crush.png deleted file mode 100644 index 6e43adb27..000000000 Binary files a/graphics/berry_crush/berry_crush.png and /dev/null differ diff --git a/graphics/berry_crush/crusher.png b/graphics/berry_crush/crusher.png new file mode 100644 index 000000000..6a57360a7 Binary files /dev/null and b/graphics/berry_crush/crusher.png differ diff --git a/graphics/berry_crush/crusher_base.png b/graphics/berry_crush/crusher_base.png index 88659471b..ee448d15c 100644 Binary files a/graphics/berry_crush/crusher_base.png and b/graphics/berry_crush/crusher_base.png differ diff --git a/graphics/berry_crush/data_EB0ADC.bin b/graphics/berry_crush/text_windows.bin similarity index 100% rename from graphics/berry_crush/data_EB0ADC.bin rename to graphics/berry_crush/text_windows.bin diff --git a/graphics/berry_pouch/background.pal b/graphics/berry_pouch/background.pal deleted file mode 100644 index 3398ff143..000000000 --- a/graphics/berry_pouch/background.pal +++ /dev/null @@ -1,51 +0,0 @@ -JASC-PAL -0100 -48 -0 65 90 -255 0 255 -41 57 82 -65 180 164 -255 0 255 -255 0 255 -106 205 197 -164 205 238 -189 238 255 -255 255 205 -180 189 180 -148 148 148 -238 230 172 -106 106 106 -106 156 238 -0 90 131 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -189 213 213 -238 255 255 -222 246 255 -255 255 255 -164 222 255 -16 172 222 -0 82 115 -0 115 139 -0 123 197 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -189 213 213 -238 255 255 -222 246 255 -255 255 255 -164 222 255 -24 82 180 -0 90 131 -24 82 180 -24 82 180 diff --git a/graphics/berry_pouch/background.png b/graphics/berry_pouch/background.png index 14113b2f9..ee3f0b377 100644 Binary files a/graphics/berry_pouch/background.png and b/graphics/berry_pouch/background.png differ diff --git a/graphics/diploma/diploma.pal b/graphics/diploma/diploma.pal deleted file mode 100644 index 3ba0bc65d..000000000 --- a/graphics/diploma/diploma.pal +++ /dev/null @@ -1,35 +0,0 @@ -JASC-PAL -0100 -32 -123 205 172 -255 0 255 -222 230 139 -205 246 156 -230 222 164 -197 238 172 -205 230 213 -213 246 172 -205 230 164 -238 255 156 -197 238 172 -222 230 238 -222 238 238 -213 246 172 -246 238 172 -238 238 139 -123 205 172 -255 0 255 -255 0 255 -246 246 205 -230 230 148 -230 230 148 -230 230 148 -238 238 164 -222 222 148 -255 238 180 -238 230 164 -238 222 180 -246 246 164 -246 230 131 -246 230 172 -222 238 222 diff --git a/graphics/diploma/diploma.png b/graphics/diploma/diploma.png index 2bf9cb27a..5f7003ddd 100644 Binary files a/graphics/diploma/diploma.png and b/graphics/diploma/diploma.png differ diff --git a/graphics/door_anims/dept_store.png b/graphics/door_anims/dept_store.png index 914b1d56c..07efce86a 100644 Binary files a/graphics/door_anims/dept_store.png and b/graphics/door_anims/dept_store.png differ diff --git a/graphics/door_anims/general.png b/graphics/door_anims/general.png index 44b047626..0e0b67c2d 100644 Binary files a/graphics/door_anims/general.png and b/graphics/door_anims/general.png differ diff --git a/graphics/door_anims/hideout_elevator.png b/graphics/door_anims/hideout_elevator.png index 5aedc200d..2483e7775 100644 Binary files a/graphics/door_anims/hideout_elevator.png and b/graphics/door_anims/hideout_elevator.png differ diff --git a/graphics/door_anims/joyful_game_corner.png b/graphics/door_anims/joyful_game_corner.png index c9ae5f3bf..a334a057e 100644 Binary files a/graphics/door_anims/joyful_game_corner.png and b/graphics/door_anims/joyful_game_corner.png differ diff --git a/graphics/door_anims/one_island_poke_center.png b/graphics/door_anims/one_island_poke_center.png index d651b5d40..21f670f2d 100644 Binary files a/graphics/door_anims/one_island_poke_center.png and b/graphics/door_anims/one_island_poke_center.png differ diff --git a/graphics/door_anims/pallet.png b/graphics/door_anims/pallet.png index 7882f461d..1bc68a6e7 100644 Binary files a/graphics/door_anims/pallet.png and b/graphics/door_anims/pallet.png differ diff --git a/graphics/door_anims/pewter.png b/graphics/door_anims/pewter.png index 35dc63e92..c22f07f82 100644 Binary files a/graphics/door_anims/pewter.png and b/graphics/door_anims/pewter.png differ diff --git a/graphics/door_anims/pokemon_fan_club.png b/graphics/door_anims/pokemon_fan_club.png index cd04984cb..4775d54a7 100644 Binary files a/graphics/door_anims/pokemon_fan_club.png and b/graphics/door_anims/pokemon_fan_club.png differ diff --git a/graphics/door_anims/rocket_warehouse.png b/graphics/door_anims/rocket_warehouse.png index 6e1037ee2..46fa84b2d 100644 Binary files a/graphics/door_anims/rocket_warehouse.png and b/graphics/door_anims/rocket_warehouse.png differ diff --git a/graphics/door_anims/safari_zone.png b/graphics/door_anims/safari_zone.png index a713663fd..fae7fd50e 100644 Binary files a/graphics/door_anims/safari_zone.png and b/graphics/door_anims/safari_zone.png differ diff --git a/graphics/door_anims/saffron.png b/graphics/door_anims/saffron.png index 21962600b..3f9ca5640 100644 Binary files a/graphics/door_anims/saffron.png and b/graphics/door_anims/saffron.png differ diff --git a/graphics/door_anims/sevii_123.png b/graphics/door_anims/sevii_123.png index e49c7c3db..00dca20b8 100644 Binary files a/graphics/door_anims/sevii_123.png and b/graphics/door_anims/sevii_123.png differ diff --git a/graphics/door_anims/sevii_45.png b/graphics/door_anims/sevii_45.png index e8f7d9c7b..00dca20b8 100644 Binary files a/graphics/door_anims/sevii_45.png and b/graphics/door_anims/sevii_45.png differ diff --git a/graphics/door_anims/sevii_67.png b/graphics/door_anims/sevii_67.png index e146010ab..00dca20b8 100644 Binary files a/graphics/door_anims/sevii_67.png and b/graphics/door_anims/sevii_67.png differ diff --git a/graphics/door_anims/silph_co.png b/graphics/door_anims/silph_co.png index cc50aeaeb..729de5df0 100644 Binary files a/graphics/door_anims/silph_co.png and b/graphics/door_anims/silph_co.png differ diff --git a/graphics/door_anims/silph_co_elevator.png b/graphics/door_anims/silph_co_elevator.png index 11b1981b0..17d3a5ab6 100644 Binary files a/graphics/door_anims/silph_co_elevator.png and b/graphics/door_anims/silph_co_elevator.png differ diff --git a/graphics/door_anims/sliding_double.png b/graphics/door_anims/sliding_double.png index b07c2a619..dc7a03bf7 100644 Binary files a/graphics/door_anims/sliding_double.png and b/graphics/door_anims/sliding_double.png differ diff --git a/graphics/door_anims/sliding_single.png b/graphics/door_anims/sliding_single.png index b57a39158..b9d489fc8 100644 Binary files a/graphics/door_anims/sliding_single.png and b/graphics/door_anims/sliding_single.png differ diff --git a/graphics/door_anims/ss_anne.png b/graphics/door_anims/ss_anne.png index 1a5f91bb2..c45063432 100644 Binary files a/graphics/door_anims/ss_anne.png and b/graphics/door_anims/ss_anne.png differ diff --git a/graphics/door_anims/teleporter.png b/graphics/door_anims/teleporter.png index f28d6531c..c3fe56b4a 100644 Binary files a/graphics/door_anims/teleporter.png and b/graphics/door_anims/teleporter.png differ diff --git a/graphics/door_anims/trainer_tower_lobby_elevator.png b/graphics/door_anims/trainer_tower_lobby_elevator.png index ed1d5305b..23ace6b75 100644 Binary files a/graphics/door_anims/trainer_tower_lobby_elevator.png and b/graphics/door_anims/trainer_tower_lobby_elevator.png differ diff --git a/graphics/door_anims/trainer_tower_roof_elevator.png b/graphics/door_anims/trainer_tower_roof_elevator.png index 87111311b..774cedf75 100644 Binary files a/graphics/door_anims/trainer_tower_roof_elevator.png and b/graphics/door_anims/trainer_tower_roof_elevator.png differ diff --git a/graphics/door_anims/vermilion.png b/graphics/door_anims/vermilion.png index 374552c1a..a747def44 100644 Binary files a/graphics/door_anims/vermilion.png and b/graphics/door_anims/vermilion.png differ diff --git a/graphics/door_anims/viridian.png b/graphics/door_anims/viridian.png index 28e3ca689..85333a386 100644 Binary files a/graphics/door_anims/viridian.png and b/graphics/door_anims/viridian.png differ diff --git a/graphics/easy_chat/text_input_frame.png b/graphics/easy_chat/text_input_frame.png index 5dd47f481..c0fbba87d 100644 Binary files a/graphics/easy_chat/text_input_frame.png and b/graphics/easy_chat/text_input_frame.png differ diff --git a/graphics/fame_checker/bg.pal b/graphics/fame_checker/bg.pal deleted file mode 100644 index 9fc41db87..000000000 --- a/graphics/fame_checker/bg.pal +++ /dev/null @@ -1,35 +0,0 @@ -JASC-PAL -0100 -32 -246 222 82 -255 255 156 -246 222 82 -255 238 98 -255 255 213 -255 172 106 -222 148 74 -255 246 222 -156 148 164 -238 230 180 -255 255 213 -123 123 123 -213 213 213 -255 255 255 -106 106 106 -24 98 197 -246 222 82 -172 164 90 -148 156 230 -98 106 180 -123 131 205 -255 255 255 -213 213 213 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -115 0 0 -0 255 0 -205 213 213 -238 238 246 -106 106 106 diff --git a/graphics/fame_checker/bg.png b/graphics/fame_checker/bg.png index 5116e4480..871592028 100644 Binary files a/graphics/fame_checker/bg.png and b/graphics/fame_checker/bg.png differ diff --git a/graphics/interface/hold_icons.pal b/graphics/interface/hold_icons.pal deleted file mode 100644 index e31d717c9..000000000 --- a/graphics/interface/hold_icons.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -57 205 106 -255 255 255 -213 213 255 -148 148 180 -255 246 156 -222 222 115 -246 82 41 -164 90 82 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -98 98 98 diff --git a/graphics/interface/hold_icons.png b/graphics/interface/hold_icons.png index 15df00440..53eeedde3 100644 Binary files a/graphics/interface/hold_icons.png and b/graphics/interface/hold_icons.png differ diff --git a/graphics/map_preview/altering_cave/pal.pal b/graphics/map_preview/altering_cave/pal.pal deleted file mode 100644 index f451adce2..000000000 --- a/graphics/map_preview/altering_cave/pal.pal +++ /dev/null @@ -1,35 +0,0 @@ -JASC-PAL -0100 -32 -255 255 0 -65 74 90 -139 205 123 -90 164 98 -213 205 172 -189 172 139 -156 205 164 -230 230 205 -148 213 106 -189 222 197 -148 131 90 -238 230 189 -213 246 255 -164 205 255 -205 230 255 -238 246 255 -255 255 90 -246 246 255 -74 98 123 -213 213 213 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 diff --git a/graphics/map_preview/altering_cave/tiles.png b/graphics/map_preview/altering_cave/tiles.png index 46dbcfde3..29b90475c 100644 Binary files a/graphics/map_preview/altering_cave/tiles.png and b/graphics/map_preview/altering_cave/tiles.png differ diff --git a/graphics/map_preview/berry_forest/pal.pal b/graphics/map_preview/berry_forest/pal.pal deleted file mode 100644 index 755a6c2ed..000000000 --- a/graphics/map_preview/berry_forest/pal.pal +++ /dev/null @@ -1,35 +0,0 @@ -JASC-PAL -0100 -32 -255 255 90 -238 238 246 -197 197 98 -180 180 90 -106 115 24 -156 156 49 -197 164 90 -164 131 74 -131 106 65 -213 213 156 -222 238 172 -156 189 115 -131 156 82 -131 123 57 -246 246 246 -189 213 139 -255 255 90 -246 246 255 -74 98 123 -213 213 213 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 diff --git a/graphics/map_preview/berry_forest/tiles.png b/graphics/map_preview/berry_forest/tiles.png index 84d269594..51fced11c 100644 Binary files a/graphics/map_preview/berry_forest/tiles.png and b/graphics/map_preview/berry_forest/tiles.png differ diff --git a/graphics/map_preview/cerulean_cave/pal.pal b/graphics/map_preview/cerulean_cave/pal.pal deleted file mode 100644 index 074a6b6f7..000000000 --- a/graphics/map_preview/cerulean_cave/pal.pal +++ /dev/null @@ -1,35 +0,0 @@ -JASC-PAL -0100 -32 -255 255 0 -49 57 106 -222 205 246 -189 164 205 -156 123 164 -238 230 255 -82 106 123 -123 156 172 -222 230 238 -189 197 205 -164 172 180 -139 172 148 -180 205 189 -115 123 131 -213 238 222 -49 57 74 -255 255 90 -246 246 255 -74 98 123 -213 213 213 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 diff --git a/graphics/map_preview/cerulean_cave/tiles.png b/graphics/map_preview/cerulean_cave/tiles.png index cc73c782e..20fa05c49 100644 Binary files a/graphics/map_preview/cerulean_cave/tiles.png and b/graphics/map_preview/cerulean_cave/tiles.png differ diff --git a/graphics/map_preview/digletts_cave/pal.pal b/graphics/map_preview/digletts_cave/pal.pal deleted file mode 100644 index 923d83144..000000000 --- a/graphics/map_preview/digletts_cave/pal.pal +++ /dev/null @@ -1,35 +0,0 @@ -JASC-PAL -0100 -32 -255 255 0 -49 57 74 -197 197 205 -189 180 172 -148 148 115 -222 238 246 -90 98 90 -106 148 106 -222 222 180 -189 189 148 -164 164 123 -156 197 123 -115 164 82 -106 106 98 -197 222 156 -74 74 65 -255 255 90 -246 246 255 -74 98 123 -213 213 213 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 diff --git a/graphics/map_preview/digletts_cave/tiles.png b/graphics/map_preview/digletts_cave/tiles.png index 543cc2e85..e42544456 100644 Binary files a/graphics/map_preview/digletts_cave/tiles.png and b/graphics/map_preview/digletts_cave/tiles.png differ diff --git a/graphics/map_preview/dotted_hole/pal.pal b/graphics/map_preview/dotted_hole/pal.pal deleted file mode 100644 index fd424fa28..000000000 --- a/graphics/map_preview/dotted_hole/pal.pal +++ /dev/null @@ -1,35 +0,0 @@ -JASC-PAL -0100 -32 -255 255 0 -65 74 90 -238 246 246 -74 156 106 -115 197 115 -156 230 148 -180 189 197 -213 222 230 -230 238 246 -115 123 90 -156 164 123 -197 205 156 -213 222 189 -222 230 197 -213 238 255 -255 255 255 -255 255 90 -246 246 255 -74 98 123 -213 213 213 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 diff --git a/graphics/map_preview/dotted_hole/tiles.png b/graphics/map_preview/dotted_hole/tiles.png index cd72bfa11..07f8cdb89 100644 Binary files a/graphics/map_preview/dotted_hole/tiles.png and b/graphics/map_preview/dotted_hole/tiles.png differ diff --git a/graphics/map_preview/icefall_cave/pal.pal b/graphics/map_preview/icefall_cave/pal.pal deleted file mode 100644 index 4e31e5380..000000000 --- a/graphics/map_preview/icefall_cave/pal.pal +++ /dev/null @@ -1,35 +0,0 @@ -JASC-PAL -0100 -32 -255 255 0 -65 74 106 -238 246 246 -82 139 115 -131 180 131 -172 213 164 -205 205 189 -222 222 205 -238 238 222 -115 115 115 -156 156 139 -180 180 156 -197 197 189 -213 213 205 -213 238 255 -255 255 255 -255 255 90 -246 246 255 -74 98 123 -213 213 213 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 diff --git a/graphics/map_preview/icefall_cave/tiles.png b/graphics/map_preview/icefall_cave/tiles.png index ca8e1c390..5b6be5b5a 100644 Binary files a/graphics/map_preview/icefall_cave/tiles.png and b/graphics/map_preview/icefall_cave/tiles.png differ diff --git a/graphics/map_preview/lost_cave/pal.pal b/graphics/map_preview/lost_cave/pal.pal deleted file mode 100644 index 33b29a07b..000000000 --- a/graphics/map_preview/lost_cave/pal.pal +++ /dev/null @@ -1,35 +0,0 @@ -JASC-PAL -0100 -32 -255 255 0 -65 74 90 -98 106 123 -123 131 148 -189 189 164 -164 156 131 -238 238 222 -213 213 197 -213 238 238 -189 213 213 -131 123 98 -213 213 180 -197 222 222 -172 189 230 -189 205 222 -230 230 213 -255 255 90 -246 246 255 -74 98 123 -213 213 213 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 diff --git a/graphics/map_preview/lost_cave/tiles.png b/graphics/map_preview/lost_cave/tiles.png index bb685f5a5..ab72a86cb 100644 Binary files a/graphics/map_preview/lost_cave/tiles.png and b/graphics/map_preview/lost_cave/tiles.png differ diff --git a/graphics/map_preview/monean_chamber/pal.pal b/graphics/map_preview/monean_chamber/pal.pal deleted file mode 100644 index ce72a4891..000000000 --- a/graphics/map_preview/monean_chamber/pal.pal +++ /dev/null @@ -1,35 +0,0 @@ -JASC-PAL -0100 -32 -255 255 0 -74 82 98 -205 213 139 -156 164 82 -123 131 82 -213 189 164 -222 230 164 -115 189 106 -172 213 131 -172 148 123 -213 238 238 -230 205 180 -131 106 98 -180 189 123 -197 230 255 -230 246 255 -255 255 90 -246 246 255 -74 98 123 -213 213 213 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 diff --git a/graphics/map_preview/monean_chamber/tiles.png b/graphics/map_preview/monean_chamber/tiles.png index f53026124..ca23b6ecf 100644 Binary files a/graphics/map_preview/monean_chamber/tiles.png and b/graphics/map_preview/monean_chamber/tiles.png differ diff --git a/graphics/map_preview/mt_ember/pal.pal b/graphics/map_preview/mt_ember/pal.pal deleted file mode 100644 index 4f5066e64..000000000 --- a/graphics/map_preview/mt_ember/pal.pal +++ /dev/null @@ -1,35 +0,0 @@ -JASC-PAL -0100 -32 -255 255 0 -65 74 90 -238 246 246 -222 246 255 -230 230 255 -156 230 148 -205 189 213 -222 205 230 -238 222 246 -131 106 106 -172 148 148 -197 172 172 -222 197 197 -238 213 213 -213 238 255 -255 255 255 -255 255 90 -246 246 255 -74 98 123 -213 213 213 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 diff --git a/graphics/map_preview/mt_ember/tiles.png b/graphics/map_preview/mt_ember/tiles.png index 854e6f22c..542038e3c 100644 Binary files a/graphics/map_preview/mt_ember/tiles.png and b/graphics/map_preview/mt_ember/tiles.png differ diff --git a/graphics/map_preview/mt_moon/pal.pal b/graphics/map_preview/mt_moon/pal.pal deleted file mode 100644 index 9a858a8c6..000000000 --- a/graphics/map_preview/mt_moon/pal.pal +++ /dev/null @@ -1,35 +0,0 @@ -JASC-PAL -0100 -32 -255 255 0 -74 82 98 -230 238 255 -65 131 90 -115 180 115 -156 213 148 -205 205 230 -230 222 255 -222 222 180 -115 106 90 -148 139 98 -172 164 115 -205 197 164 -205 197 164 -205 230 255 -238 230 213 -255 255 90 -246 246 255 -74 98 123 -213 213 213 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 diff --git a/graphics/map_preview/mt_moon/tiles.png b/graphics/map_preview/mt_moon/tiles.png index 5bada0e75..31c358198 100644 Binary files a/graphics/map_preview/mt_moon/tiles.png and b/graphics/map_preview/mt_moon/tiles.png differ diff --git a/graphics/map_preview/pokemon_mansion/pal.pal b/graphics/map_preview/pokemon_mansion/pal.pal deleted file mode 100644 index 7f6ef22a5..000000000 --- a/graphics/map_preview/pokemon_mansion/pal.pal +++ /dev/null @@ -1,35 +0,0 @@ -JASC-PAL -0100 -32 -255 255 0 -106 115 131 -213 164 180 -180 131 148 -238 189 205 -230 238 213 -115 82 131 -172 180 172 -131 139 139 -205 213 205 -238 213 238 -238 238 205 -230 222 189 -246 238 164 -222 213 139 -246 246 255 -255 255 90 -246 246 255 -74 98 123 -213 213 213 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 diff --git a/graphics/map_preview/pokemon_mansion/tiles.png b/graphics/map_preview/pokemon_mansion/tiles.png index 0be4ddc03..e09d8e62c 100644 Binary files a/graphics/map_preview/pokemon_mansion/tiles.png and b/graphics/map_preview/pokemon_mansion/tiles.png differ diff --git a/graphics/map_preview/pokemon_tower/pal.pal b/graphics/map_preview/pokemon_tower/pal.pal deleted file mode 100644 index 93f4847ae..000000000 --- a/graphics/map_preview/pokemon_tower/pal.pal +++ /dev/null @@ -1,35 +0,0 @@ -JASC-PAL -0100 -32 -255 255 0 -222 213 246 -213 230 213 -172 180 205 -205 197 156 -180 205 180 -148 164 148 -238 246 238 -238 230 189 -230 238 255 -148 156 180 -255 246 205 -172 164 123 -115 123 148 -197 205 230 -238 246 255 -255 255 90 -246 246 255 -74 98 123 -213 213 213 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 diff --git a/graphics/map_preview/pokemon_tower/tiles.png b/graphics/map_preview/pokemon_tower/tiles.png index 0539f2380..7bc8274c1 100644 Binary files a/graphics/map_preview/pokemon_tower/tiles.png and b/graphics/map_preview/pokemon_tower/tiles.png differ diff --git a/graphics/map_preview/power_plant/pal.pal b/graphics/map_preview/power_plant/pal.pal deleted file mode 100644 index 49e5d6800..000000000 --- a/graphics/map_preview/power_plant/pal.pal +++ /dev/null @@ -1,35 +0,0 @@ -JASC-PAL -0100 -32 -255 255 0 -74 82 98 -255 246 205 -189 180 189 -189 189 222 -230 222 123 -222 205 205 -246 230 230 -139 156 189 -222 238 255 -106 123 156 -213 189 164 -164 156 164 -238 246 255 -255 238 238 -255 255 255 -255 255 90 -246 246 255 -74 98 123 -213 213 213 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 diff --git a/graphics/map_preview/power_plant/tiles.png b/graphics/map_preview/power_plant/tiles.png index 0d152cf2d..345b80d01 100644 Binary files a/graphics/map_preview/power_plant/tiles.png and b/graphics/map_preview/power_plant/tiles.png differ diff --git a/graphics/map_preview/rock_tunnel/pal.pal b/graphics/map_preview/rock_tunnel/pal.pal deleted file mode 100644 index 1412128d0..000000000 --- a/graphics/map_preview/rock_tunnel/pal.pal +++ /dev/null @@ -1,35 +0,0 @@ -JASC-PAL -0100 -32 -255 255 0 -65 74 90 -238 246 246 -74 156 106 -115 197 115 -156 230 148 -205 205 189 -222 222 205 -238 238 222 -123 123 90 -164 164 123 -197 197 148 -213 213 180 -230 230 197 -213 238 255 -255 255 255 -255 255 90 -246 246 255 -74 98 123 -213 213 213 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 diff --git a/graphics/map_preview/rock_tunnel/tiles.png b/graphics/map_preview/rock_tunnel/tiles.png index 68c63c2d3..2e078ff1e 100644 Binary files a/graphics/map_preview/rock_tunnel/tiles.png and b/graphics/map_preview/rock_tunnel/tiles.png differ diff --git a/graphics/map_preview/rocket_hideout/pal.pal b/graphics/map_preview/rocket_hideout/pal.pal deleted file mode 100644 index 9c969e843..000000000 --- a/graphics/map_preview/rocket_hideout/pal.pal +++ /dev/null @@ -1,35 +0,0 @@ -JASC-PAL -0100 -32 -255 255 0 -98 106 123 -156 180 156 -222 213 172 -238 238 246 -246 238 197 -189 156 131 -222 189 164 -213 213 222 -222 238 222 -139 156 139 -197 222 197 -197 230 180 -131 139 156 -238 205 180 -255 255 255 -255 255 90 -246 246 255 -74 98 123 -213 213 213 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 diff --git a/graphics/map_preview/rocket_hideout/tiles.png b/graphics/map_preview/rocket_hideout/tiles.png index c5c63ce24..e302418e6 100644 Binary files a/graphics/map_preview/rocket_hideout/tiles.png and b/graphics/map_preview/rocket_hideout/tiles.png differ diff --git a/graphics/map_preview/rocket_warehouse/pal.pal b/graphics/map_preview/rocket_warehouse/pal.pal deleted file mode 100644 index c4fffd171..000000000 --- a/graphics/map_preview/rocket_warehouse/pal.pal +++ /dev/null @@ -1,35 +0,0 @@ -JASC-PAL -0100 -32 -255 255 0 -98 106 123 -139 180 172 -222 213 172 -238 238 246 -246 238 197 -189 156 131 -222 189 164 -213 213 222 -222 238 222 -139 156 139 -197 222 197 -197 230 180 -131 139 156 -238 205 180 -255 255 255 -255 255 90 -246 246 255 -74 98 123 -213 213 213 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 diff --git a/graphics/map_preview/rocket_warehouse/tiles.png b/graphics/map_preview/rocket_warehouse/tiles.png index 0ac5d6048..ea8a3d2d3 100644 Binary files a/graphics/map_preview/rocket_warehouse/tiles.png and b/graphics/map_preview/rocket_warehouse/tiles.png differ diff --git a/graphics/map_preview/safari_zone/pal.pal b/graphics/map_preview/safari_zone/pal.pal deleted file mode 100644 index 0434848d8..000000000 --- a/graphics/map_preview/safari_zone/pal.pal +++ /dev/null @@ -1,35 +0,0 @@ -JASC-PAL -0100 -32 -0 0 0 -222 230 213 -222 213 148 -197 230 148 -213 238 164 -123 164 90 -230 246 246 -222 238 246 -213 222 255 -180 222 98 -205 180 115 -205 213 197 -180 156 106 -164 197 90 -222 238 197 -222 246 213 -255 255 90 -246 246 255 -74 98 123 -213 213 213 -0 0 0 -189 222 98 -172 205 90 -115 172 65 -222 213 148 -139 197 98 -205 180 115 -205 230 246 -180 156 106 -222 238 246 -189 213 255 -197 230 148 diff --git a/graphics/map_preview/safari_zone/tiles.png b/graphics/map_preview/safari_zone/tiles.png index a226f731e..ccf1d87a5 100644 Binary files a/graphics/map_preview/safari_zone/tiles.png and b/graphics/map_preview/safari_zone/tiles.png differ diff --git a/graphics/map_preview/seafoam_islands/pal.pal b/graphics/map_preview/seafoam_islands/pal.pal deleted file mode 100644 index 348275aca..000000000 --- a/graphics/map_preview/seafoam_islands/pal.pal +++ /dev/null @@ -1,35 +0,0 @@ -JASC-PAL -0100 -32 -255 255 0 -65 74 90 -156 222 123 -106 180 98 -197 205 172 -172 172 139 -172 222 164 -222 230 205 -164 230 106 -205 238 197 -131 131 90 -238 230 189 -213 246 255 -164 205 255 -205 230 255 -238 246 255 -255 255 90 -246 246 255 -74 98 123 -213 213 213 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 diff --git a/graphics/map_preview/seafoam_islands/tiles.png b/graphics/map_preview/seafoam_islands/tiles.png index ad31c1aa7..73e0c0161 100644 Binary files a/graphics/map_preview/seafoam_islands/tiles.png and b/graphics/map_preview/seafoam_islands/tiles.png differ diff --git a/graphics/map_preview/silph_co/pal.pal b/graphics/map_preview/silph_co/pal.pal deleted file mode 100644 index 07acfb986..000000000 --- a/graphics/map_preview/silph_co/pal.pal +++ /dev/null @@ -1,35 +0,0 @@ -JASC-PAL -0100 -32 -255 255 0 -238 246 246 -213 238 246 -164 205 197 -131 197 123 -197 230 230 -139 180 172 -180 180 205 -131 131 164 -205 205 230 -172 222 172 -197 213 246 -90 164 90 -123 172 164 -205 238 246 -246 246 255 -255 255 90 -246 246 255 -74 98 123 -213 213 213 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 diff --git a/graphics/map_preview/silph_co/tiles.png b/graphics/map_preview/silph_co/tiles.png index 886892168..06256bf27 100644 Binary files a/graphics/map_preview/silph_co/tiles.png and b/graphics/map_preview/silph_co/tiles.png differ diff --git a/graphics/map_preview/victory_road/pal.pal b/graphics/map_preview/victory_road/pal.pal deleted file mode 100644 index 828ff7e22..000000000 --- a/graphics/map_preview/victory_road/pal.pal +++ /dev/null @@ -1,35 +0,0 @@ -JASC-PAL -0100 -32 -255 255 0 -74 82 98 -222 238 246 -98 139 106 -131 172 98 -164 205 123 -180 189 197 -205 213 222 -222 230 238 -139 131 74 -172 172 98 -197 197 123 -213 205 148 -222 213 156 -213 230 246 -246 246 246 -0 0 0 -246 246 255 -74 98 123 -213 213 213 -0 0 0 -131 172 98 -164 205 123 -139 131 74 -172 172 98 -197 197 123 -213 205 148 -222 213 156 -148 189 131 -205 213 222 -222 238 246 -98 139 106 diff --git a/graphics/map_preview/victory_road/tiles.png b/graphics/map_preview/victory_road/tiles.png index a4a6b6104..157b03b16 100644 Binary files a/graphics/map_preview/victory_road/tiles.png and b/graphics/map_preview/victory_road/tiles.png differ diff --git a/graphics/map_preview/viridian_forest/pal.pal b/graphics/map_preview/viridian_forest/pal.pal deleted file mode 100644 index ff1655587..000000000 --- a/graphics/map_preview/viridian_forest/pal.pal +++ /dev/null @@ -1,35 +0,0 @@ -JASC-PAL -0100 -32 -255 255 90 -222 246 246 -156 230 148 -115 197 115 -41 106 106 -90 172 123 -197 189 106 -148 139 90 -106 98 74 -205 246 197 -180 213 230 -123 189 205 -90 156 164 -65 131 139 -246 246 255 -32 41 41 -255 255 90 -246 246 255 -74 98 123 -213 213 213 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 diff --git a/graphics/map_preview/viridian_forest/tiles.png b/graphics/map_preview/viridian_forest/tiles.png index 6fcea90f5..80ea098e6 100644 Binary files a/graphics/map_preview/viridian_forest/tiles.png and b/graphics/map_preview/viridian_forest/tiles.png differ diff --git a/graphics/oak_speech/bg_tiles.png b/graphics/oak_speech/bg_tiles.png new file mode 100644 index 000000000..80af31b52 Binary files /dev/null and b/graphics/oak_speech/bg_tiles.png differ diff --git a/graphics/oak_speech/help_docs_page2_tilemap.bin b/graphics/oak_speech/controls_guide_page_2.bin similarity index 100% rename from graphics/oak_speech/help_docs_page2_tilemap.bin rename to graphics/oak_speech/controls_guide_page_2.bin diff --git a/graphics/oak_speech/help_docs_page3_tilemap.bin b/graphics/oak_speech/controls_guide_page_3.bin similarity index 100% rename from graphics/oak_speech/help_docs_page3_tilemap.bin rename to graphics/oak_speech/controls_guide_page_3.bin diff --git a/graphics/oak_speech/game_start_help_ui.png b/graphics/oak_speech/game_start_help_ui.png deleted file mode 100644 index 419858b1b..000000000 Binary files a/graphics/oak_speech/game_start_help_ui.png and /dev/null differ diff --git a/graphics/oak_speech/help_docs_palette.pal b/graphics/oak_speech/help_docs_palette.pal deleted file mode 100644 index b6905b913..000000000 --- a/graphics/oak_speech/help_docs_palette.pal +++ /dev/null @@ -1,67 +0,0 @@ -JASC-PAL -0100 -64 -16 115 230 -65 139 131 -82 148 139 -106 164 156 -131 180 172 -156 197 189 -180 213 205 -205 230 222 -230 246 238 -255 0 255 -255 0 255 -0 90 16 -255 0 0 -49 82 205 -255 255 255 -32 32 32 -16 115 230 -255 255 164 -255 255 106 -222 222 90 -189 189 74 -156 156 57 -156 156 57 -123 123 49 -90 90 32 -57 57 16 -255 0 0 -255 0 0 -255 0 0 -255 0 0 -255 0 0 -0 0 0 -238 230 172 -115 180 197 -156 213 238 -205 238 246 -246 255 255 -230 246 246 -106 106 106 -74 82 106 -82 98 180 -230 246 246 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 74 139 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -255 0 255 -123 123 123 -172 172 156 -197 197 197 -222 222 222 -238 238 238 -255 255 255 diff --git a/graphics/oak_speech/leaf_pal.pal b/graphics/oak_speech/leaf/pal.pal similarity index 100% rename from graphics/oak_speech/leaf_pal.pal rename to graphics/oak_speech/leaf/pal.pal diff --git a/graphics/oak_speech/leaf/pic.png b/graphics/oak_speech/leaf/pic.png new file mode 100644 index 000000000..d71e38ca2 Binary files /dev/null and b/graphics/oak_speech/leaf/pic.png differ diff --git a/graphics/oak_speech/leaf_pic.png b/graphics/oak_speech/leaf_pic.png deleted file mode 100644 index 1825f9960..000000000 Binary files a/graphics/oak_speech/leaf_pic.png and /dev/null differ diff --git a/graphics/oak_speech/oak_pal.pal b/graphics/oak_speech/oak/pal.pal similarity index 100% rename from graphics/oak_speech/oak_pal.pal rename to graphics/oak_speech/oak/pal.pal diff --git a/graphics/oak_speech/oak/pic.png b/graphics/oak_speech/oak/pic.png new file mode 100644 index 000000000..2fb9cc863 Binary files /dev/null and b/graphics/oak_speech/oak/pic.png differ diff --git a/graphics/oak_speech/oak_pic.png b/graphics/oak_speech/oak_pic.png deleted file mode 100644 index 9ac602944..000000000 Binary files a/graphics/oak_speech/oak_pic.png and /dev/null differ diff --git a/graphics/oak_speech/background_tilemap.bin b/graphics/oak_speech/oak_speech_bg.bin similarity index 100% rename from graphics/oak_speech/background_tilemap.bin rename to graphics/oak_speech/oak_speech_bg.bin diff --git a/graphics/oak_speech/oak_speech_bg.png b/graphics/oak_speech/oak_speech_bg.png new file mode 100644 index 000000000..4980199ef Binary files /dev/null and b/graphics/oak_speech/oak_speech_bg.png differ diff --git a/graphics/oak_speech/pika1.png b/graphics/oak_speech/pikachu_intro/body.png similarity index 100% rename from graphics/oak_speech/pika1.png rename to graphics/oak_speech/pikachu_intro/body.png diff --git a/graphics/oak_speech/pika2.png b/graphics/oak_speech/pikachu_intro/ears.png similarity index 100% rename from graphics/oak_speech/pika2.png rename to graphics/oak_speech/pikachu_intro/ears.png diff --git a/graphics/oak_speech/pika_eyes.png b/graphics/oak_speech/pikachu_intro/eyes.png similarity index 100% rename from graphics/oak_speech/pika_eyes.png rename to graphics/oak_speech/pikachu_intro/eyes.png diff --git a/graphics/oak_speech/pika_palette.pal b/graphics/oak_speech/pikachu_intro/pikachu.pal similarity index 100% rename from graphics/oak_speech/pika_palette.pal rename to graphics/oak_speech/pikachu_intro/pikachu.pal diff --git a/graphics/oak_speech/new_game_adventure_intro_tilemap.bin b/graphics/oak_speech/pikachu_intro/tilemap.bin similarity index 100% rename from graphics/oak_speech/new_game_adventure_intro_tilemap.bin rename to graphics/oak_speech/pikachu_intro/tilemap.bin diff --git a/graphics/oak_speech/grass_platform_palette.pal b/graphics/oak_speech/platform.pal similarity index 100% rename from graphics/oak_speech/grass_platform_palette.pal rename to graphics/oak_speech/platform.pal diff --git a/graphics/oak_speech/grass_platform.png b/graphics/oak_speech/platform.png similarity index 100% rename from graphics/oak_speech/grass_platform.png rename to graphics/oak_speech/platform.png diff --git a/graphics/oak_speech/red_pal.pal b/graphics/oak_speech/red/pal.pal similarity index 100% rename from graphics/oak_speech/red_pal.pal rename to graphics/oak_speech/red/pal.pal diff --git a/graphics/oak_speech/red/pic.png b/graphics/oak_speech/red/pic.png new file mode 100644 index 000000000..0f24d0f59 Binary files /dev/null and b/graphics/oak_speech/red/pic.png differ diff --git a/graphics/oak_speech/red_pic.png b/graphics/oak_speech/red_pic.png deleted file mode 100644 index edf5cf9b1..000000000 Binary files a/graphics/oak_speech/red_pic.png and /dev/null differ diff --git a/graphics/oak_speech/rival_pal.pal b/graphics/oak_speech/rival/pal.pal similarity index 100% rename from graphics/oak_speech/rival_pal.pal rename to graphics/oak_speech/rival/pal.pal diff --git a/graphics/oak_speech/rival/pic.png b/graphics/oak_speech/rival/pic.png new file mode 100644 index 000000000..ed31011d2 Binary files /dev/null and b/graphics/oak_speech/rival/pic.png differ diff --git a/graphics/oak_speech/rival_pic.png b/graphics/oak_speech/rival_pic.png deleted file mode 100644 index 317cbc038..000000000 Binary files a/graphics/oak_speech/rival_pic.png and /dev/null differ diff --git a/graphics/oak_speech/solid_colors.png b/graphics/oak_speech/solid_colors.png deleted file mode 100644 index 30066cdd8..000000000 Binary files a/graphics/oak_speech/solid_colors.png and /dev/null differ diff --git a/graphics/pokemon_storage/wallpapers/beach/box.pal b/graphics/pokemon_storage/wallpapers/beach/box.pal deleted file mode 100644 index b7cb930c4..000000000 --- a/graphics/pokemon_storage/wallpapers/beach/box.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 255 255 -255 255 222 -246 238 180 -238 230 148 -238 222 131 -222 205 115 -213 189 98 -205 164 90 -197 172 65 -255 98 197 -255 148 172 -49 213 205 -164 230 213 -0 0 0 -82 98 255 -49 65 156 diff --git a/graphics/pokemon_storage/wallpapers/beach/tiles.png b/graphics/pokemon_storage/wallpapers/beach/tiles.png index f2594ae88..fcabb6cc2 100644 Binary files a/graphics/pokemon_storage/wallpapers/beach/tiles.png and b/graphics/pokemon_storage/wallpapers/beach/tiles.png differ diff --git a/graphics/pokemon_storage/wallpapers/beach/title.pal b/graphics/pokemon_storage/wallpapers/beach/title.pal deleted file mode 100644 index 360d77bde..000000000 --- a/graphics/pokemon_storage/wallpapers/beach/title.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 255 255 -156 106 57 -197 230 255 -197 246 255 -230 255 255 -98 164 98 -148 222 57 -189 164 90 -246 230 164 -255 246 180 -246 238 164 -98 213 213 -139 230 205 -255 255 255 -82 98 255 -49 65 156 diff --git a/graphics/pokemon_storage/wallpapers/cave/box.pal b/graphics/pokemon_storage/wallpapers/cave/box.pal deleted file mode 100644 index 6b783cdd5..000000000 --- a/graphics/pokemon_storage/wallpapers/cave/box.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 255 255 -246 213 131 -213 180 98 -180 148 65 -148 115 32 -115 82 0 -82 49 0 -49 16 0 -139 90 115 -156 106 131 -115 65 90 -0 0 0 -238 238 238 -255 255 255 -90 90 131 -49 49 90 diff --git a/graphics/pokemon_storage/wallpapers/cave/tiles.png b/graphics/pokemon_storage/wallpapers/cave/tiles.png index 8a1a6e81e..28890b953 100644 Binary files a/graphics/pokemon_storage/wallpapers/cave/tiles.png and b/graphics/pokemon_storage/wallpapers/cave/tiles.png differ diff --git a/graphics/pokemon_storage/wallpapers/cave/title.pal b/graphics/pokemon_storage/wallpapers/cave/title.pal deleted file mode 100644 index f6e731395..000000000 --- a/graphics/pokemon_storage/wallpapers/cave/title.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 255 255 -230 197 123 -213 180 98 -180 148 65 -148 115 32 -115 82 0 -0 0 0 -0 0 0 -139 90 115 -156 106 131 -115 65 90 -0 0 0 -230 230 230 -255 255 255 -90 90 131 -49 49 90 diff --git a/graphics/pokemon_storage/wallpapers/city/box.pal b/graphics/pokemon_storage/wallpapers/city/box.pal deleted file mode 100644 index ba67b3414..000000000 --- a/graphics/pokemon_storage/wallpapers/city/box.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 255 255 -255 255 246 -255 238 246 -230 213 222 -205 189 197 -164 148 156 -139 123 131 -0 0 0 -0 0 0 -180 164 172 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -156 123 82 -115 82 41 diff --git a/graphics/pokemon_storage/wallpapers/city/tiles.png b/graphics/pokemon_storage/wallpapers/city/tiles.png index f5684850a..48588ef6d 100644 Binary files a/graphics/pokemon_storage/wallpapers/city/tiles.png and b/graphics/pokemon_storage/wallpapers/city/tiles.png differ diff --git a/graphics/pokemon_storage/wallpapers/city/title.pal b/graphics/pokemon_storage/wallpapers/city/title.pal deleted file mode 100644 index a5387638a..000000000 --- a/graphics/pokemon_storage/wallpapers/city/title.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 255 255 -246 246 246 -90 131 197 -123 164 213 -156 197 230 -82 131 115 -115 164 148 -180 189 197 -148 156 164 -115 123 131 -82 90 98 -189 189 230 -222 246 246 -189 213 213 -156 123 82 -106 74 32 diff --git a/graphics/pokemon_storage/wallpapers/crag/box.pal b/graphics/pokemon_storage/wallpapers/crag/box.pal deleted file mode 100644 index f72b27d13..000000000 --- a/graphics/pokemon_storage/wallpapers/crag/box.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 255 255 -222 222 222 -189 189 189 -156 156 156 -123 123 123 -90 90 90 -57 57 57 -41 41 41 -222 189 205 -197 164 180 -172 139 156 -246 213 230 -238 238 238 -255 255 255 -213 189 82 -172 148 41 diff --git a/graphics/pokemon_storage/wallpapers/crag/tiles.png b/graphics/pokemon_storage/wallpapers/crag/tiles.png index bfdc0a7e3..f47111a9e 100644 Binary files a/graphics/pokemon_storage/wallpapers/crag/tiles.png and b/graphics/pokemon_storage/wallpapers/crag/tiles.png differ diff --git a/graphics/pokemon_storage/wallpapers/crag/title.pal b/graphics/pokemon_storage/wallpapers/crag/title.pal deleted file mode 100644 index c4f85c644..000000000 --- a/graphics/pokemon_storage/wallpapers/crag/title.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 255 255 -222 222 222 -189 189 189 -222 189 205 -197 164 180 -172 139 156 -246 213 230 -139 139 131 -189 189 189 -156 156 156 -123 123 123 -213 189 65 -230 230 230 -255 255 255 -213 189 82 -172 148 41 diff --git a/graphics/pokemon_storage/wallpapers/desert/box.pal b/graphics/pokemon_storage/wallpapers/desert/box.pal deleted file mode 100644 index c5ca027d2..000000000 --- a/graphics/pokemon_storage/wallpapers/desert/box.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 255 255 -255 238 189 -255 213 164 -230 189 139 -205 164 115 -180 139 90 -156 115 65 -131 90 41 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -164 139 82 -123 98 41 diff --git a/graphics/pokemon_storage/wallpapers/desert/tiles.png b/graphics/pokemon_storage/wallpapers/desert/tiles.png index 373749994..4e6dcec04 100644 Binary files a/graphics/pokemon_storage/wallpapers/desert/tiles.png and b/graphics/pokemon_storage/wallpapers/desert/tiles.png differ diff --git a/graphics/pokemon_storage/wallpapers/desert/title.pal b/graphics/pokemon_storage/wallpapers/desert/title.pal deleted file mode 100644 index 4cf04f8ae..000000000 --- a/graphics/pokemon_storage/wallpapers/desert/title.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 255 255 -255 255 139 -205 189 131 -230 197 98 -230 180 90 -172 164 172 -57 57 57 -172 172 172 -123 123 123 -57 57 57 -213 189 98 -246 205 74 -255 230 106 -255 255 255 -164 139 82 -123 98 41 diff --git a/graphics/pokemon_storage/wallpapers/forest/box.pal b/graphics/pokemon_storage/wallpapers/forest/box.pal deleted file mode 100644 index 946becabb..000000000 --- a/graphics/pokemon_storage/wallpapers/forest/box.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 255 255 -230 255 172 -205 255 148 -180 230 123 -156 205 98 -131 180 74 -106 156 49 -82 131 24 -0 0 0 -205 213 172 -172 180 139 -0 0 0 -0 0 0 -0 0 0 -164 139 82 -123 98 41 diff --git a/graphics/pokemon_storage/wallpapers/forest/tiles.png b/graphics/pokemon_storage/wallpapers/forest/tiles.png index 1c00feb82..e305ce607 100644 Binary files a/graphics/pokemon_storage/wallpapers/forest/tiles.png and b/graphics/pokemon_storage/wallpapers/forest/tiles.png differ diff --git a/graphics/pokemon_storage/wallpapers/forest/title.pal b/graphics/pokemon_storage/wallpapers/forest/title.pal deleted file mode 100644 index 1b4166087..000000000 --- a/graphics/pokemon_storage/wallpapers/forest/title.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 255 255 -246 255 230 -255 255 213 -222 255 189 -197 246 164 -156 255 139 -123 222 106 -90 189 74 -172 123 41 -205 213 172 -172 180 139 -148 156 115 -123 131 90 -255 255 255 -164 139 82 -123 98 41 diff --git a/graphics/pokemon_storage/wallpapers/pokecenter/box.pal b/graphics/pokemon_storage/wallpapers/pokecenter/box.pal deleted file mode 100644 index 60b96bbd9..000000000 --- a/graphics/pokemon_storage/wallpapers/pokecenter/box.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 255 115 -41 82 82 -65 115 115 -115 164 156 -90 131 82 -131 172 123 -172 213 172 -189 230 197 -213 255 222 -255 164 139 -213 213 230 -0 0 255 -0 0 255 -0 0 255 -0 0 255 -255 255 255 diff --git a/graphics/pokemon_storage/wallpapers/pokecenter/tiles.png b/graphics/pokemon_storage/wallpapers/pokecenter/tiles.png index e82b88e07..182ac6a5a 100644 Binary files a/graphics/pokemon_storage/wallpapers/pokecenter/tiles.png and b/graphics/pokemon_storage/wallpapers/pokecenter/tiles.png differ diff --git a/graphics/pokemon_storage/wallpapers/pokecenter/title.pal b/graphics/pokemon_storage/wallpapers/pokecenter/title.pal deleted file mode 100644 index 332fff38b..000000000 --- a/graphics/pokemon_storage/wallpapers/pokecenter/title.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 255 115 -41 82 82 -65 115 115 -115 164 156 -197 172 148 -255 164 139 -255 197 172 -0 0 255 -0 0 255 -255 230 172 -189 205 197 -213 213 230 -139 180 148 -164 205 172 -230 230 230 -255 255 255 diff --git a/graphics/pokemon_storage/wallpapers/river/box.pal b/graphics/pokemon_storage/wallpapers/river/box.pal deleted file mode 100644 index 09d45090a..000000000 --- a/graphics/pokemon_storage/wallpapers/river/box.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 255 255 -230 255 156 -197 255 123 -164 230 90 -131 197 57 -98 164 24 -65 131 0 -32 98 0 -230 255 255 -139 230 230 -164 255 255 -197 255 255 -238 238 238 -255 255 255 -180 148 106 -139 106 65 diff --git a/graphics/pokemon_storage/wallpapers/river/tiles.png b/graphics/pokemon_storage/wallpapers/river/tiles.png index 0a6d4d416..ab4758295 100644 Binary files a/graphics/pokemon_storage/wallpapers/river/tiles.png and b/graphics/pokemon_storage/wallpapers/river/tiles.png differ diff --git a/graphics/pokemon_storage/wallpapers/river/title.pal b/graphics/pokemon_storage/wallpapers/river/title.pal deleted file mode 100644 index 9fcc4cbca..000000000 --- a/graphics/pokemon_storage/wallpapers/river/title.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 255 255 -238 255 255 -205 255 255 -164 255 255 -131 222 222 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -115 180 0 -148 213 24 -180 246 57 -230 230 230 -255 255 255 -180 148 106 -139 106 65 diff --git a/graphics/pokemon_storage/wallpapers/savanna/box.pal b/graphics/pokemon_storage/wallpapers/savanna/box.pal deleted file mode 100644 index d80816c35..000000000 --- a/graphics/pokemon_storage/wallpapers/savanna/box.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 255 255 -255 255 131 -222 222 98 -189 189 65 -156 156 32 -123 123 0 -90 90 0 -57 57 0 -189 189 65 -131 180 57 -115 164 41 -205 205 82 -238 238 238 -255 255 255 -189 156 82 -148 115 41 diff --git a/graphics/pokemon_storage/wallpapers/savanna/tiles.png b/graphics/pokemon_storage/wallpapers/savanna/tiles.png index ec1e4e8fd..6eb097109 100644 Binary files a/graphics/pokemon_storage/wallpapers/savanna/tiles.png and b/graphics/pokemon_storage/wallpapers/savanna/tiles.png differ diff --git a/graphics/pokemon_storage/wallpapers/savanna/title.pal b/graphics/pokemon_storage/wallpapers/savanna/title.pal deleted file mode 100644 index 1c1742cc2..000000000 --- a/graphics/pokemon_storage/wallpapers/savanna/title.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 255 255 -222 222 222 -189 189 189 -238 255 255 -213 230 246 -189 205 222 -57 57 57 -222 222 98 -164 164 41 -115 164 41 -148 197 74 -189 189 65 -230 230 230 -255 255 255 -189 156 82 -148 115 41 diff --git a/graphics/pokemon_storage/wallpapers/seafloor/box.pal b/graphics/pokemon_storage/wallpapers/seafloor/box.pal deleted file mode 100644 index 43b2eecab..000000000 --- a/graphics/pokemon_storage/wallpapers/seafloor/box.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 255 255 -164 213 255 -131 180 255 -98 148 222 -65 115 189 -32 82 156 -0 49 123 -0 16 90 -139 90 115 -156 106 131 -115 65 90 -0 0 0 -238 238 238 -255 255 255 -148 180 41 -106 139 0 diff --git a/graphics/pokemon_storage/wallpapers/seafloor/tiles.png b/graphics/pokemon_storage/wallpapers/seafloor/tiles.png index 192f7126c..e662d247c 100644 Binary files a/graphics/pokemon_storage/wallpapers/seafloor/tiles.png and b/graphics/pokemon_storage/wallpapers/seafloor/tiles.png differ diff --git a/graphics/pokemon_storage/wallpapers/seafloor/title.pal b/graphics/pokemon_storage/wallpapers/seafloor/title.pal deleted file mode 100644 index 79c7650b4..000000000 --- a/graphics/pokemon_storage/wallpapers/seafloor/title.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 255 255 -131 180 255 -98 148 222 -65 115 189 -32 82 156 -0 24 98 -0 0 0 -0 0 0 -139 90 115 -156 106 131 -115 65 90 -0 0 0 -230 230 230 -255 255 255 -148 180 41 -106 139 0 diff --git a/graphics/pokemon_storage/wallpapers/simple/box.pal b/graphics/pokemon_storage/wallpapers/simple/box.pal deleted file mode 100644 index 86596441a..000000000 --- a/graphics/pokemon_storage/wallpapers/simple/box.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 156 213 -82 65 115 -106 90 139 -131 115 164 -189 189 148 -205 205 156 -230 230 164 -238 238 189 -255 255 213 -65 90 115 -90 115 139 -123 148 172 -156 172 197 -189 205 230 -0 0 255 -255 255 255 diff --git a/graphics/pokemon_storage/wallpapers/simple/tiles.png b/graphics/pokemon_storage/wallpapers/simple/tiles.png index df046d843..daefeed49 100644 Binary files a/graphics/pokemon_storage/wallpapers/simple/tiles.png and b/graphics/pokemon_storage/wallpapers/simple/tiles.png differ diff --git a/graphics/pokemon_storage/wallpapers/simple/title.pal b/graphics/pokemon_storage/wallpapers/simple/title.pal deleted file mode 100644 index 9b4ffb97f..000000000 --- a/graphics/pokemon_storage/wallpapers/simple/title.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 156 213 -82 65 115 -106 90 139 -131 115 164 -172 172 255 -189 189 255 -0 0 255 -0 0 255 -0 0 255 -0 0 255 -0 0 255 -0 0 255 -0 0 255 -0 0 255 -0 0 255 -255 255 255 diff --git a/graphics/pokemon_storage/wallpapers/sky/box.pal b/graphics/pokemon_storage/wallpapers/sky/box.pal deleted file mode 100644 index 3d722ed6d..000000000 --- a/graphics/pokemon_storage/wallpapers/sky/box.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 255 255 -238 255 255 -205 255 255 -164 255 255 -123 213 246 -90 180 213 -57 148 180 -24 115 148 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -238 238 238 -255 255 255 -205 139 41 -164 98 0 diff --git a/graphics/pokemon_storage/wallpapers/sky/tiles.png b/graphics/pokemon_storage/wallpapers/sky/tiles.png index 2b28d3897..d2a425b09 100644 Binary files a/graphics/pokemon_storage/wallpapers/sky/tiles.png and b/graphics/pokemon_storage/wallpapers/sky/tiles.png differ diff --git a/graphics/pokemon_storage/wallpapers/sky/title.pal b/graphics/pokemon_storage/wallpapers/sky/title.pal deleted file mode 100644 index 951f59ecf..000000000 --- a/graphics/pokemon_storage/wallpapers/sky/title.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 255 255 -238 255 255 -205 255 255 -164 255 255 -123 213 246 -90 180 213 -57 148 180 -24 115 148 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -230 230 230 -255 255 255 -205 139 41 -164 98 0 diff --git a/graphics/pokemon_storage/wallpapers/snow/box.pal b/graphics/pokemon_storage/wallpapers/snow/box.pal deleted file mode 100644 index 01e46d027..000000000 --- a/graphics/pokemon_storage/wallpapers/snow/box.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 255 255 -230 230 230 -205 205 205 -139 148 189 -106 115 156 -74 82 123 -41 49 90 -8 16 57 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -238 238 238 -255 255 255 -213 131 139 -172 90 98 diff --git a/graphics/pokemon_storage/wallpapers/snow/tiles.png b/graphics/pokemon_storage/wallpapers/snow/tiles.png index 00225d6fc..531effeeb 100644 Binary files a/graphics/pokemon_storage/wallpapers/snow/tiles.png and b/graphics/pokemon_storage/wallpapers/snow/tiles.png differ diff --git a/graphics/pokemon_storage/wallpapers/snow/title.pal b/graphics/pokemon_storage/wallpapers/snow/title.pal deleted file mode 100644 index 437ccb934..000000000 --- a/graphics/pokemon_storage/wallpapers/snow/title.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 255 255 -230 230 230 -205 205 205 -139 148 189 -106 115 156 -74 82 123 -172 180 222 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -230 230 230 -255 255 255 -213 131 139 -172 90 98 diff --git a/graphics/pokemon_storage/wallpapers/stars/box.pal b/graphics/pokemon_storage/wallpapers/stars/box.pal deleted file mode 100644 index fc4215468..000000000 --- a/graphics/pokemon_storage/wallpapers/stars/box.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 255 115 -106 8 115 -156 41 148 -205 74 180 -123 98 139 -164 139 189 -197 172 222 -213 189 230 -230 205 246 -164 246 74 -222 255 148 -255 106 189 -255 156 230 -115 156 255 -180 213 255 -255 255 255 diff --git a/graphics/pokemon_storage/wallpapers/stars/tiles.png b/graphics/pokemon_storage/wallpapers/stars/tiles.png index 51c9f8674..611228a53 100644 Binary files a/graphics/pokemon_storage/wallpapers/stars/tiles.png and b/graphics/pokemon_storage/wallpapers/stars/tiles.png differ diff --git a/graphics/pokemon_storage/wallpapers/stars/title.pal b/graphics/pokemon_storage/wallpapers/stars/title.pal deleted file mode 100644 index e7b45e524..000000000 --- a/graphics/pokemon_storage/wallpapers/stars/title.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 255 115 -106 8 115 -156 41 148 -205 74 180 -74 106 156 -98 123 205 -123 139 255 -238 238 57 -213 156 123 -156 230 82 -180 164 131 -213 106 189 -156 115 197 -139 180 164 -230 213 213 -255 255 255 diff --git a/graphics/pokemon_storage/wallpapers/tiles/box.pal b/graphics/pokemon_storage/wallpapers/tiles/box.pal deleted file mode 100644 index 9ff5c0789..000000000 --- a/graphics/pokemon_storage/wallpapers/tiles/box.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 255 115 -156 90 41 -205 106 8 -230 156 8 -131 131 131 -156 156 156 -180 180 180 -197 197 197 -213 213 213 -0 0 255 -0 0 255 -0 0 255 -164 156 156 -172 172 164 -197 197 189 -255 255 255 diff --git a/graphics/pokemon_storage/wallpapers/tiles/tiles.png b/graphics/pokemon_storage/wallpapers/tiles/tiles.png index 1b3443a0a..6247b5561 100644 Binary files a/graphics/pokemon_storage/wallpapers/tiles/tiles.png and b/graphics/pokemon_storage/wallpapers/tiles/tiles.png differ diff --git a/graphics/pokemon_storage/wallpapers/tiles/title.pal b/graphics/pokemon_storage/wallpapers/tiles/title.pal deleted file mode 100644 index efcd01fa6..000000000 --- a/graphics/pokemon_storage/wallpapers/tiles/title.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 255 115 -156 90 41 -205 106 8 -230 156 8 -0 0 255 -0 0 255 -0 0 255 -164 156 139 -213 205 172 -0 0 255 -131 131 131 -164 164 164 -180 180 180 -197 197 197 -213 213 213 -255 255 255 diff --git a/graphics/pokemon_storage/wallpapers/volcano/box.pal b/graphics/pokemon_storage/wallpapers/volcano/box.pal deleted file mode 100644 index 8ea563b6e..000000000 --- a/graphics/pokemon_storage/wallpapers/volcano/box.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 255 255 -255 246 230 -255 238 205 -255 205 172 -246 172 139 -213 139 106 -180 106 74 -148 74 41 -246 156 98 -222 131 74 -205 115 57 -180 82 24 -238 238 238 -255 255 255 -213 131 139 -172 90 98 diff --git a/graphics/pokemon_storage/wallpapers/volcano/tiles.png b/graphics/pokemon_storage/wallpapers/volcano/tiles.png index 812ce08c9..d4d0bf8a0 100644 Binary files a/graphics/pokemon_storage/wallpapers/volcano/tiles.png and b/graphics/pokemon_storage/wallpapers/volcano/tiles.png differ diff --git a/graphics/pokemon_storage/wallpapers/volcano/title.pal b/graphics/pokemon_storage/wallpapers/volcano/title.pal deleted file mode 100644 index 0378aff29..000000000 --- a/graphics/pokemon_storage/wallpapers/volcano/title.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -255 255 255 -222 222 222 -189 189 189 -139 148 189 -106 115 156 -74 82 123 -172 180 222 -0 0 0 -222 131 74 -205 115 57 -180 82 24 -0 0 0 -230 230 230 -255 255 255 -213 131 139 -172 90 98 diff --git a/graphics/region_map/background.png b/graphics/region_map/background.png index 26fb0c84c..ae1447db6 100644 Binary files a/graphics/region_map/background.png and b/graphics/region_map/background.png differ diff --git a/graphics/region_map/map_edge.pal b/graphics/region_map/map_edge.pal deleted file mode 100644 index e6eff3c7e..000000000 --- a/graphics/region_map/map_edge.pal +++ /dev/null @@ -1,19 +0,0 @@ -JASC-PAL -0100 -16 -0 0 0 -139 74 49 -180 82 49 -230 115 49 -246 205 49 -189 156 41 -57 164 49 -82 213 49 -222 189 49 -255 0 255 -255 0 255 -164 164 164 -230 230 238 -65 65 74 -115 115 115 -255 255 255 diff --git a/graphics/region_map/map_edge.png b/graphics/region_map/map_edge.png index 149e64abe..4def326bf 100644 Binary files a/graphics/region_map/map_edge.png and b/graphics/region_map/map_edge.png differ diff --git a/graphics/region_map/region_map.png b/graphics/region_map/region_map.png index 0fc27d0b9..4e2d06c82 100644 Binary files a/graphics/region_map/region_map.png and b/graphics/region_map/region_map.png differ diff --git a/graphics/region_map/switch_map_menu.bin b/graphics/region_map/switch_map_menu.bin deleted file mode 100644 index d851eb1d6..000000000 Binary files a/graphics/region_map/switch_map_menu.bin and /dev/null differ diff --git a/graphics/region_map/switch_map_menu.png b/graphics/region_map/switch_map_menu.png new file mode 100644 index 000000000..c09282d09 Binary files /dev/null and b/graphics/region_map/switch_map_menu.png differ diff --git a/graphics/shop_menu/shop_menu.pal b/graphics/shop_menu/shop_menu.pal deleted file mode 100644 index b0fec0a30..000000000 --- a/graphics/shop_menu/shop_menu.pal +++ /dev/null @@ -1,35 +0,0 @@ -JASC-PAL -0100 -32 -238 230 172 -222 156 106 -255 189 131 -255 222 164 -255 255 213 -238 230 172 -106 106 106 -189 213 213 -238 255 255 -222 246 255 -255 255 255 -164 222 255 -16 172 222 -0 82 115 -0 115 139 -0 123 197 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -0 0 0 -189 213 213 -238 255 255 -222 246 255 -255 255 255 -164 222 255 -24 82 180 -0 90 131 -24 82 180 -24 82 180 diff --git a/graphics/shop_menu/shop_menu.png b/graphics/shop_menu/shop_menu.png index 23af464a2..2fdc6cd6e 100644 Binary files a/graphics/shop_menu/shop_menu.png and b/graphics/shop_menu/shop_menu.png differ diff --git a/graphics/shop_menu/shop_tilemap.bin b/graphics/shop_menu/shop_tilemap.bin index 8d5ab35b7..801a5c6ff 100644 Binary files a/graphics/shop_menu/shop_tilemap.bin and b/graphics/shop_menu/shop_tilemap.bin differ diff --git a/graphics/shop_menu/shop_tm_hm_tilemap.bin b/graphics/shop_menu/shop_tm_hm_tilemap.bin index 92fbb7dad..4d0a67f05 100644 Binary files a/graphics/shop_menu/shop_tm_hm_tilemap.bin and b/graphics/shop_menu/shop_tm_hm_tilemap.bin differ diff --git a/graphics/teachy_tv/bg1_tilemap.bin b/graphics/teachy_tv/screen.bin similarity index 100% rename from graphics/teachy_tv/bg1_tilemap.bin rename to graphics/teachy_tv/screen.bin diff --git a/graphics/teachy_tv/tiles.png b/graphics/teachy_tv/tiles.png index fdf32ca30..ecc121d02 100644 Binary files a/graphics/teachy_tv/tiles.png and b/graphics/teachy_tv/tiles.png differ diff --git a/graphics/teachy_tv/bg2_tilemap.bin b/graphics/teachy_tv/title.bin similarity index 100% rename from graphics/teachy_tv/bg2_tilemap.bin rename to graphics/teachy_tv/title.bin diff --git a/graphics/trade/ball.png b/graphics/trade/ball.png deleted file mode 100644 index 97cc86a6f..000000000 Binary files a/graphics/trade/ball.png and /dev/null differ diff --git a/graphics/trade/unknown_DDB444.pal b/graphics/trade/cursor.pal similarity index 100% rename from graphics/trade/unknown_DDB444.pal rename to graphics/trade/cursor.pal diff --git a/graphics/trade/buttons.png b/graphics/trade/cursor.png similarity index 100% rename from graphics/trade/buttons.png rename to graphics/trade/cursor.png diff --git a/graphics/trade/misc.pal b/graphics/trade/link_mon.pal similarity index 100% rename from graphics/trade/misc.pal rename to graphics/trade/link_mon.pal diff --git a/graphics/trade/glow1.png b/graphics/trade/link_mon_glow.png similarity index 100% rename from graphics/trade/glow1.png rename to graphics/trade/link_mon_glow.png diff --git a/graphics/trade/glow2.png b/graphics/trade/link_mon_shadow.png similarity index 100% rename from graphics/trade/glow2.png rename to graphics/trade/link_mon_shadow.png diff --git a/graphics/trade/unknown_DDCF04.bin b/graphics/trade/menu.bin similarity index 100% rename from graphics/trade/unknown_DDCF04.bin rename to graphics/trade/menu.bin diff --git a/graphics/trade/unknown_338EA4.pal b/graphics/trade/unknown_338EA4.pal deleted file mode 100644 index 346db3df8..000000000 --- a/graphics/trade/unknown_338EA4.pal +++ /dev/null @@ -1,15 +0,0 @@ -JASC-PAL -0100 -12 -148 197 255 -148 197 255 -148 197 255 -255 255 255 -255 255 255 -255 255 255 -148 197 255 -148 197 255 -148 197 255 -255 255 255 -255 255 255 -255 255 255 diff --git a/graphics/unused/unused_DDCEE4.bin b/graphics/trade/unused.bin similarity index 100% rename from graphics/unused/unused_DDCEE4.bin rename to graphics/trade/unused.bin diff --git a/graphics/trade/unknown_3308C0.pal b/graphics/trade/unused1.pal similarity index 100% rename from graphics/trade/unknown_3308C0.pal rename to graphics/trade/unused1.pal diff --git a/graphics/trade/unknown_3379A0.bin b/graphics/trade/wireless_signal_closeup.bin similarity index 100% rename from graphics/trade/unknown_3379A0.bin rename to graphics/trade/wireless_signal_closeup.bin diff --git a/include/battle_anim.h b/include/battle_anim.h index 120935880..a53750093 100644 --- a/include/battle_anim.h +++ b/include/battle_anim.h @@ -258,7 +258,7 @@ void InitAnimBgTilemapBuffer(u32 bgId, const void *src); void AnimLoadCompressedBgTilemap(u32 bgId, const u32 *src); u8 GetBattleBgPaletteNum(void); void ToggleBg3Mode(bool8 arg0); -void TradeMenuBouncePartySprites(struct Sprite *sprite); +void Trade_MoveSelectedMonToTarget(struct Sprite *sprite); void InitSpriteDataForLinearTranslation(struct Sprite *sprite); void InitAnimLinearTranslation(struct Sprite *sprite); void StartAnimLinearTranslation(struct Sprite *sprite); diff --git a/include/battle_controllers.h b/include/battle_controllers.h index 7172ad793..334485c15 100644 --- a/include/battle_controllers.h +++ b/include/battle_controllers.h @@ -120,16 +120,16 @@ struct HpAndStatus struct MovePpInfo { - u16 moves[4]; - u8 pp[4]; + u16 moves[MAX_MON_MOVES]; + u8 pp[MAX_MON_MOVES]; u8 ppBonuses; }; struct ChooseMoveStruct { - u16 moves[4]; - u8 currentPp[4]; - u8 maxPp[4]; + u16 moves[MAX_MON_MOVES]; + u8 currentPp[MAX_MON_MOVES]; + u8 maxPp[MAX_MON_MOVES]; u16 species; u8 monType1; u8 monType2; diff --git a/include/constants/metatile_behaviors.h b/include/constants/metatile_behaviors.h index 4e71cdb7e..38a02075f 100644 --- a/include/constants/metatile_behaviors.h +++ b/include/constants/metatile_behaviors.h @@ -12,7 +12,7 @@ #define MB_MOUNTAIN_TOP 0x0C // #define MB_POND_WATER 0x10 -#define MB_SEMI_DEEP_WATER 0x11 +#define MB_FAST_WATER 0x11 #define MB_DEEP_WATER 0x12 #define MB_WATERFALL 0x13 // diff --git a/include/constants/metatile_labels.h b/include/constants/metatile_labels.h index a9642eeac..4816800fe 100644 --- a/include/constants/metatile_labels.h +++ b/include/constants/metatile_labels.h @@ -94,7 +94,7 @@ // gTileset_VermilionCity #define METATILE_VermilionCity_Door 0x29E -#define METATILE_VermilionCity_PokemonFanClubDoor 0x2E1 // Used to reference door tiles in field_door.c, but the metatile in the tileset is dummied +#define METATILE_VermilionCity_SSAnneWarp 0x2E1 // gTileset_VermilionGym #define METATILE_VermilionGym_Floor 0x281 diff --git a/include/constants/moves.h b/include/constants/moves.h index 9d5ca3555..14738f1b2 100644 --- a/include/constants/moves.h +++ b/include/constants/moves.h @@ -357,8 +357,6 @@ #define MOVE_DOOM_DESIRE 353 #define MOVE_PSYCHO_BOOST 354 -#define LAST_MOVE_INDEX MOVE_PSYCHO_BOOST - #define MOVES_COUNT 355 // Used for checks for moves affected by Disable, Mimic, etc. diff --git a/include/constants/trade.h b/include/constants/trade.h index e9964c4c3..04e667eb0 100644 --- a/include/constants/trade.h +++ b/include/constants/trade.h @@ -20,21 +20,13 @@ #define INGAME_TRADE_TANGELA 7 #define INGAME_TRADE_SEEL 8 -// Flag IDs for sending link data -#define INITIATE_TRADE 1 -#define CANCEL_TRADE 2 -#define WANTS_TO_TRADE 1 -#define WANTS_TO_CANCEL 2 -#define READY_FINISH_TRADE 1 -#define FINISH_TRADE 2 - // Return values for CanTradeSelectedMon and CanSpinTradeMon -#define CAN_TRADE_MON 0 -#define CANT_TRADE_LAST_MON 1 -#define CANT_TRADE_NATIONAL 2 -#define CANT_TRADE_EGG_YET 3 -#define CANT_TRADE_INVALID_MON 4 -#define CANT_TRADE_EGG_YET2 5 +#define CAN_TRADE_MON 0 +#define CANT_TRADE_LAST_MON 1 +#define CANT_TRADE_NATIONAL 2 +#define CANT_TRADE_EGG_YET 3 +#define CANT_TRADE_INVALID_MON 4 +#define CANT_TRADE_PARTNER_EGG_YET 5 // Return values for CheckValidityOfTradeMons #define PLAYER_MON_INVALID 0 @@ -46,63 +38,6 @@ #define TRADE_PLAYER_NOT_READY 1 #define TRADE_PARTNER_NOT_READY 2 -// Indexes for sTradeActionTexts -#define TRADE_TEXT_CANCEL 0 -#define TRADE_TEXT_CHOOSE_MON 1 -#define TRADE_TEXT_SUMMARY 2 -#define TRADE_TEXT_TRADE 3 -#define TRADE_TEXT_CANCEL_TRADE 4 -#define TRADE_TEXT_JP_QUIT 5 - -// Checked to confirm DrawTradeMenuParty has reached final state -#define DRAW_PARTY_FINISH 5 - -// Message indexes for sTradeMessages -#define TRADE_MSG_STANDBY 0 -#define TRADE_MSG_CANCELED 1 -#define TRADE_MSG_ONLY_MON1 2 -#define TRADE_MSG_ONLY_MON2 3 -#define TRADE_MSG_WAITING_FOR_FRIEND 4 -#define TRADE_MSG_FRIEND_WANTS_TO_TRADE 5 -#define TRADE_MSG_MON_CANT_BE_TRADED 6 -#define TRADE_MSG_EGG_CANT_BE_TRADED 7 -#define TRADE_MSG_FRIENDS_MON_CANT_BE_TRADED 8 - -// IDs for QueueAction -#define QUEUE_SEND_DATA 0 -#define QUEUE_STANDBY 1 -#define QUEUE_ONLY_MON1 2 -#define QUEUE_ONLY_MON2 3 -#define QUEUE_UNUSED1 4 -#define QUEUE_UNUSED2 5 -#define QUEUE_MON_CANT_BE_TRADED 6 -#define QUEUE_EGG_CANT_BE_TRADED 7 -#define QUEUE_FRIENDS_MON_CANT_BE_TRADED 8 - -#define QUEUE_DELAY_MSG 3 -#define QUEUE_DELAY_DATA 5 - -// IDs for CallTradeMenuFunc -#define TRADEMENUFUNC_MAIN_MENU 0 -#define TRADEMENUFUNC_SELECTED_MON 1 -#define TRADEMENUFUNC_SHOW_MON_SUMMARY 2 -#define TRADEMENUFUNC_CONFIRM_OR_CANCEL_TRADE 3 -#define TRADEMENUFUNC_CANCEL_TRADE_PROMPT 4 -#define TRADEMENUFUNC_UNUSED_5 5 -#define TRADEMENUFUNC_BOTH_MONS_SELECTED 6 -#define TRADEMENUFUNC_CONFIRM_TRADE_PROMPT 7 -#define TRADEMENUFUNC_REDRAW_MAIN_MENU 8 -#define TRADEMENUFUNC_LINK_TRADE_FADE_OUT 9 -#define TRADEMENUFUNC_LINK_TRADE_WAIT_FADE 10 -#define TRADEMENUFUNC_CANCEL_TRADE_1 11 -#define TRADEMENUFUNC_CANCEL_TRADE_2 12 -#define TRADEMENUFUNC_START_LINK_TRADE 13 -#define TRADEMENUFUNC_DELAY_TRADE_CONFIRM 14 -#define TRADEMENUFUNC_UNUSED_15 15 -#define TRADEMENUFUNC_LINK_TRADE_WAIT_QUEUE 16 -#define TRADEMENUFUNC_PARTNER_MON_INVALID 17 -#define TRADEMENUFUNC_STANDBY 100 - // Message indexes for sUnionRoomTradeMessages #define UR_TRADE_MSG_NONE 0 #define UR_TRADE_MSG_NOT_MON_PARTNER_WANTS 1 diff --git a/include/data.h b/include/data.h index cf98e1572..88854ae27 100644 --- a/include/data.h +++ b/include/data.h @@ -19,7 +19,7 @@ struct MonCoords #define GET_MON_COORDS_HEIGHT(size)((size & 0xF) * 8) extern const u8 gSpeciesNames[][POKEMON_NAME_LENGTH + 1]; -extern const u8 gMoveNames[][13]; +extern const u8 gMoveNames[][MOVE_NAME_LENGTH + 1]; extern const u8 gTrainerClassNames[][13]; diff --git a/include/event_scripts.h b/include/event_scripts.h index 49857a76b..a9603119c 100644 --- a/include/event_scripts.h +++ b/include/event_scripts.h @@ -748,29 +748,29 @@ extern const u8 gNameChoice_Norie[]; extern const u8 gNameChoice_Sai[]; extern const u8 gNameChoice_Momo[]; extern const u8 gNameChoice_Suzi[]; -extern const u8 gNewGame_HelpDocs1[]; -extern const u8 gNewGame_HelpDocs2[]; -extern const u8 gNewGame_HelpDocs3[]; -extern const u8 gNewGame_HelpDocs4[]; -extern const u8 gNewGame_HelpDocs5[]; -extern const u8 gNewGame_HelpDocs6[]; -extern const u8 gNewGame_HelpDocs7[]; -extern const u8 gOakText_AskPlayerGender[]; -extern const u8 gNewGameAdventureIntro1[]; -extern const u8 gNewGameAdventureIntro2[]; -extern const u8 gNewGameAdventureIntro3[]; -extern const u8 gOakText_WelcomeToTheWorld[]; -extern const u8 gOakText_WorldInhabited1[]; -extern const u8 gOakText_WorldInhabited2[]; -extern const u8 gOakText_PetsBattlingStudy[]; -extern const u8 gOakText_TellMeALittleAboutYourself[]; -extern const u8 gOakText_AskPlayerName[]; -extern const u8 gOakText_FinalizePlayerName[]; -extern const u8 gOakText_IntroduceRival[]; -extern const u8 gOakText_AskRivalName[]; -extern const u8 gOakText_ConfirmRivalName[]; -extern const u8 gOakText_RememberRivalName[]; -extern const u8 gOakText_LegendAboutToUnfold[]; +extern const u8 gControlsGuide_Text_Intro[]; +extern const u8 gControlsGuide_Text_DPad[]; +extern const u8 gControlsGuide_Text_AButton[]; +extern const u8 gControlsGuide_Text_BButton[]; +extern const u8 gControlsGuide_Text_StartButton[]; +extern const u8 gControlsGuide_Text_SelectButton[]; +extern const u8 gControlsGuide_Text_LRButtons[]; +extern const u8 gOakSpeech_Text_AskPlayerGender[]; +extern const u8 gPikachuIntro_Text_Page1[]; +extern const u8 gPikachuIntro_Text_Page2[]; +extern const u8 gPikachuIntro_Text_Page3[]; +extern const u8 gOakSpeech_Text_WelcomeToTheWorld[]; +extern const u8 gOakSpeech_Text_ThisWorld[]; +extern const u8 gOakSpeech_Text_IsInhabitedFarAndWide[]; +extern const u8 gOakSpeech_Text_IStudyPokemon[]; +extern const u8 gOakSpeech_Text_TellMeALittleAboutYourself[]; +extern const u8 gOakSpeech_Text_YourNameWhatIsIt[]; +extern const u8 gOakSpeech_Text_SoYourNameIsPlayer[]; +extern const u8 gOakSpeech_Text_WhatWasHisName[]; +extern const u8 gOakSpeech_Text_YourRivalsNameWhatWasIt[]; +extern const u8 gOakSpeech_Text_ConfirmRivalName[]; +extern const u8 gOakSpeech_Text_RememberRivalsName[]; +extern const u8 gOakSpeech_Text_LetsGo[]; // Help System extern const u8 Help_Text_WhatShouldIDo[]; diff --git a/include/graphics.h b/include/graphics.h index e86ea2e27..e81098e0c 100644 --- a/include/graphics.h +++ b/include/graphics.h @@ -2883,10 +2883,10 @@ extern const u32 gTradeGba2_Pal[]; extern const u32 gTradeGba_Gfx[]; // teachy_tv -extern const u8 gUnknown_8E86240[]; -extern const u8 gUnknown_8E86BE8[]; -extern const u8 gUnknown_8E86D6C[]; -extern const u32 gUnknown_8E86F98[]; +extern const u8 gTeachyTv_Gfx[]; +extern const u8 gTeachyTvScreen_Tilemap[]; +extern const u8 gTeachyTvTitle_Tilemap[]; +extern const u32 gTeachyTv_Pal[]; // berry_fix_program extern const u8 gBerryFixGameboy_Gfx[]; @@ -4822,10 +4822,10 @@ extern const u8 gMonIcon_QuestionMark[]; // trade extern const u16 gTradeMenu_Pal[]; -extern const u16 gTradeButtons_Pal[]; +extern const u16 gTradeCursor_Pal[]; extern const u16 gTradeMenu_Gfx[]; -extern const u16 gUnknown_8E9E9FC[]; -extern const u16 gTradeButtons_Gfx[]; +extern const u16 gTradeMenu_Tilemap[]; +extern const u16 gTradeCursor_Gfx[]; extern const u16 gTradeMenuMonBox_Tilemap[]; // mon_markings @@ -4892,7 +4892,7 @@ extern const u32 gFile_graphics_battle_transitions_vs_frame_tilemap[]; // berry_crush extern const u16 gBerryCrush_Crusher_Pal[]; extern const u32 gBerryCrush_Crusher_Gfx[]; -extern const u32 gBerryCrush_Crusher_Tilemap[]; +extern const u32 gBerryCrush_TextWindows_Tilemap[]; // easy_chat_3 extern const u32 gEasyChatWindow_Gfx[]; diff --git a/include/link_rfu.h b/include/link_rfu.h index dbc14ea03..affbebe3d 100644 --- a/include/link_rfu.h +++ b/include/link_rfu.h @@ -84,7 +84,7 @@ struct RfuGameCompatibilityData u16 hasNews:1; u16 hasCard:1; u16 unknown:1; // Never read - u16 isChampion:1; + u16 canLinkNationally:1; u16 hasNationalDex:1; u16 gameClear:1; u16 version:4; diff --git a/include/menu.h b/include/menu.h index 5b12047ee..4adf467ca 100644 --- a/include/menu.h +++ b/include/menu.h @@ -41,7 +41,7 @@ void DestroyYesNoMenu(void); s8 Menu_ProcessInputNoWrapClearOnChoose(void); void CreateYesNoMenu(const struct WindowTemplate *window, u8 fontId, u8 left, u8 top, u16 baseTileNum, u8 paletteNum, u8 initialCursorPos); void AddItemMenuActionTextPrinters(u8 windowId, u8 fontId, u8 left, u8 top, u8 letterSpacing, u8 lineHeight, u8 itemCount, const struct MenuAction *strs, const u8 *orderArray); -void UnionRoomAndTradeMenuPrintOptions(u8 windowId, u8 fontId, u8 lineHeight, u8 itemCount, const struct MenuAction *strs); +void PrintMenuTable(u8 windowId, u8 fontId, u8 lineHeight, u8 itemCount, const struct MenuAction *strs); void MultichoiceList_PrintItems(u8 windowId, u8 fontId, u8 left, u8 top, u8 lineHeight, u8 itemCount, const struct MenuAction *strs, u8 letterSpacing, u8 lineSpacing); void PrintTextArray(u8 windowId, u8 fontId, u8 left, u8 top, u8 lineHeight, u8 itemCount, const struct MenuAction *strs); s8 Menu_ProcessInputNoWrapAround_other(void); diff --git a/include/metatile_behavior.h b/include/metatile_behavior.h index 6e129c830..e378e77ff 100644 --- a/include/metatile_behavior.h +++ b/include/metatile_behavior.h @@ -26,7 +26,7 @@ bool8 MetatileBehavior_IsLadder(u8 metatileBehavior); bool8 MetatileBehavior_IsNonAnimDoor(u8 metatileBehavior); bool8 MetatileBehavior_IsDeepSouthWarp(u8 metatileBehavior); bool8 MetatileBehavior_IsSurfable(u8 metatileBehavior); -bool8 MetatileBehavior_IsSemiDeepWater(u8 metatileBehavior); +bool8 MetatileBehavior_IsFastWater(u8 metatileBehavior); bool8 MetatileBehavior_IsEastArrowWarp(u8 metatileBehavior); bool8 MetatileBehavior_IsWestArrowWarp(u8 metatileBehavior); bool8 MetatileBehavior_IsNorthArrowWarp(u8 metatileBehavior); @@ -64,7 +64,7 @@ bool8 MetatileBehavior_IsUnableToEmerge(u8 metatileBehavior); bool8 MetatileBehavior_IsShallowFlowingWater(u8 metatileBehavior); bool8 MetatileBehavior_IsThinIce(u8 metatileBehavior); bool8 MetatileBehavior_IsCrackedIce(u8 metatileBehavior); -bool8 MetatileBehavior_IsDeepSemiDeepOrSplashingWater(u8 metatileBehavior); +bool8 MetatileBehavior_IsDeepWaterTerrain(u8 metatileBehavior); bool8 MetatileBehavior_IsSurfableAndNotWaterfall(u8 metatileBehavior); bool8 MetatileBehavior_IsEastBlocked(u8 metatileBehavior); bool8 MetatileBehavior_IsWestBlocked(u8 metatileBehavior); diff --git a/include/pokeball.h b/include/pokeball.h index 0ef6d4357..5c4785f4c 100644 --- a/include/pokeball.h +++ b/include/pokeball.h @@ -36,8 +36,8 @@ extern const struct SpriteTemplate gBallSpriteTemplates[]; #define POKEBALL_OPPONENT_SENDOUT 0xFE u8 DoPokeballSendOutAnimation(s16 pan, u8 kindOfThrow); -void CreatePokeballSpriteToReleaseMon(u8 monSpriteId, u8 bank, u8 x, u8 y, u8 oamPriority, u8 subpriortiy, u8 g, u32 h); -u8 CreateTradePokeballSprite(u8 monSpriteId, u8 bank, u8 x, u8 y, u8 oamPriority, u8 subpriortiy, u8 g, u32 h); +void CreatePokeballSpriteToReleaseMon(u8 monSpriteId, u8 monPalNum, u8 x, u8 y, u8 oamPriority, u8 subpriortiy, u8 delay, u32 fadePalettes); +u8 CreateTradePokeballSprite(u8 monSpriteId, u8 monPalNum, u8 x, u8 y, u8 oamPriority, u8 subPriority, u8 delay, u32 fadePalettes); void DoHitAnimHealthboxEffect(u8 bank); void LoadBallGfx(u8 ballId); void FreeBallGfx(u8 ballId); diff --git a/include/pokemon.h b/include/pokemon.h index 29ed66072..825683fd5 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -443,7 +443,7 @@ const u32 *GetMonSpritePalFromSpeciesAndPersonality(u16 species, u32 otId, u32 p const struct CompressedSpritePalette *GetMonSpritePalStruct(struct Pokemon *mon); const struct CompressedSpritePalette *GetMonSpritePalStructFromOtIdPersonality(u16 species, u32 otId , u32 personality); bool32 IsHMMove2(u16 move); -bool8 IsPokeSpriteNotFlipped(u16 species); +bool8 IsMonSpriteNotFlipped(u16 species); s8 GetFlavorRelationByPersonality(u32 personality, u8 flavor); bool8 IsTradedMon(struct Pokemon *mon); bool8 IsOtherTrainer(u32 otId, u8 *otName); diff --git a/include/trade.h b/include/trade.h index 2380b2213..d7c1f369c 100644 --- a/include/trade.h +++ b/include/trade.h @@ -14,7 +14,7 @@ extern const u8 gText_GenderlessSymbol[]; extern const u16 gTradeOrHatchMonShadowTilemap[]; void CB2_StartCreateTradeMenu(void); -s32 Trade_CalcLinkPlayerCompatibilityParam(void); +s32 GetGameProgressForLinkTrade(void); s32 CanRegisterMonForTradingBoard(struct RfuGameCompatibilityData rfuPlayer, u16 species2, u16 species, u8 isEventLegal); s32 GetUnionRoomTradeMessageId(struct RfuGameCompatibilityData rfuPlayer, struct RfuGameCompatibilityData rfuPartner, u16 playerSpecies2, u16 partnerSpecies, u8 requestedType, u16 playerSpecies, u8 isEventLegal); void CB2_ReturnToTradeMenuFromSummary(void); diff --git a/sound/music_player_table.inc b/sound/music_player_table.inc index 6c74a1352..f54238966 100644 --- a/sound/music_player_table.inc +++ b/sound/music_player_table.inc @@ -1,6 +1,32 @@ + .equiv TRACK_SIZE, 0x50 + .equiv NUM_TRACKS_BGM, 10 + .equiv NUM_TRACKS_SE1, 3 + .equiv NUM_TRACKS_SE2, 9 + .equiv NUM_TRACKS_SE3, 1 + + .bss + +gMPlayTrack_BGM:: + .space TRACK_SIZE * NUM_TRACKS_BGM + .size gMPlayTrack_BGM, .-gMPlayTrack_BGM + +gMPlayTrack_SE1:: + .space TRACK_SIZE * NUM_TRACKS_SE1 + .size gMPlayTrack_SE1, .-gMPlayTrack_SE1 + +gMPlayTrack_SE2:: + .space TRACK_SIZE * NUM_TRACKS_SE2 + .size gMPlayTrack_SE2, .-gMPlayTrack_SE2 + +gMPlayTrack_SE3:: + .space TRACK_SIZE * NUM_TRACKS_SE3 + .size gMPlayTrack_SE3, .-gMPlayTrack_SE3 + + .section .rodata + .align 2 gMPlayTable:: - music_player gMPlayInfo_BGM, gMPlayTrack_BGM, 10, 0 - music_player gMPlayInfo_SE1, gMPlayTrack_SE1, 3, 1 - music_player gMPlayInfo_SE2, gMPlayTrack_SE2, 9, 1 - music_player gMPlayInfo_SE3, gMPlayTrack_SE3, 1, 0 + music_player gMPlayInfo_BGM, gMPlayTrack_BGM, NUM_TRACKS_BGM, 0 + music_player gMPlayInfo_SE1, gMPlayTrack_SE1, NUM_TRACKS_SE1, 1 + music_player gMPlayInfo_SE2, gMPlayTrack_SE2, NUM_TRACKS_SE2, 1 + music_player gMPlayInfo_SE3, gMPlayTrack_SE3, NUM_TRACKS_SE3, 0 diff --git a/src/battle_anim_mons.c b/src/battle_anim_mons.c index 0060a881b..3b6b34d63 100644 --- a/src/battle_anim_mons.c +++ b/src/battle_anim_mons.c @@ -965,7 +965,7 @@ void ToggleBg3Mode(bool8 largeScreenSize) } } -void TradeMenuBouncePartySprites(struct Sprite *sprite) +void Trade_MoveSelectedMonToTarget(struct Sprite *sprite) { sprite->data[1] = sprite->x; sprite->data[3] = sprite->y; diff --git a/src/battle_controller_oak_old_man.c b/src/battle_controller_oak_old_man.c index a1d06d4d1..cf9ef722a 100644 --- a/src/battle_controller_oak_old_man.c +++ b/src/battle_controller_oak_old_man.c @@ -98,63 +98,63 @@ static void Task_StartSendOutAnim(u8 taskId); static void (*const sOakOldManBufferCommands[CONTROLLER_CMDS_COUNT])(void) = { - OakOldManHandleGetMonData, - OakOldManHandleGetRawMonData, - OakOldManHandleSetMonData, - OakOldManHandleSetRawMonData, - OakOldManHandleLoadMonSprite, - OakOldManHandleSwitchInAnim, - OakOldManHandleReturnMonToBall, - OakOldManHandleDrawTrainerPic, - OakOldManHandleTrainerSlide, - OakOldManHandleTrainerSlideBack, - OakOldManHandleFaintAnimation, - OakOldManHandlePaletteFade, - OakOldManHandleSuccessBallThrowAnim, - OakOldManHandleBallThrowAnim, - OakOldManHandlePause, - OakOldManHandleMoveAnimation, - OakOldManHandlePrintString, - OakOldManHandlePrintSelectionString, - OakOldManHandleChooseAction, - OakOldManHandleUnknownYesNoBox, - OakOldManHandleChooseMove, - OakOldManHandleChooseItem, - OakOldManHandleChoosePokemon, - OakOldManHandleCmd23, - OakOldManHandleHealthBarUpdate, - OakOldManHandleExpUpdate, - OakOldManHandleStatusIconUpdate, - OakOldManHandleStatusAnimation, - OakOldManHandleStatusXor, - OakOldManHandleDataTransfer, - OakOldManHandleDMA3Transfer, - OakOldManHandlePlayBGM, - OakOldManHandleCmd32, - OakOldManHandleTwoReturnValues, - OakOldManHandleChosenMonReturnValue, - OakOldManHandleOneReturnValue, - OakOldManHandleOneReturnValue_Duplicate, - OakOldManHandleCmd37, - OakOldManHandleCmd38, - OakOldManHandleCmd39, - OakOldManHandleCmd40, - OakOldManHandleHitAnimation, - OakOldManHandleCmd42, - OakOldManHandlePlaySE, - OakOldManHandlePlayFanfare, - OakOldManHandleFaintingCry, - OakOldManHandleIntroSlide, - OakOldManHandleIntroTrainerBallThrow, - OakOldManHandleDrawPartyStatusSummary, - OakOldManHandleHidePartyStatusSummary, - OakOldManHandleEndBounceEffect, - OakOldManHandleSpriteInvisibility, - OakOldManHandleBattleAnimation, - OakOldManHandleLinkStandbyMsg, - OakOldManHandleResetActionMoveSelection, - OakOldManHandleCmd55, - OakOldManCmdEnd, + [CONTROLLER_GETMONDATA] = OakOldManHandleGetMonData, + [CONTROLLER_GETRAWMONDATA] = OakOldManHandleGetRawMonData, + [CONTROLLER_SETMONDATA] = OakOldManHandleSetMonData, + [CONTROLLER_SETRAWMONDATA] = OakOldManHandleSetRawMonData, + [CONTROLLER_LOADMONSPRITE] = OakOldManHandleLoadMonSprite, + [CONTROLLER_SWITCHINANIM] = OakOldManHandleSwitchInAnim, + [CONTROLLER_RETURNMONTOBALL] = OakOldManHandleReturnMonToBall, + [CONTROLLER_DRAWTRAINERPIC] = OakOldManHandleDrawTrainerPic, + [CONTROLLER_TRAINERSLIDE] = OakOldManHandleTrainerSlide, + [CONTROLLER_TRAINERSLIDEBACK] = OakOldManHandleTrainerSlideBack, + [CONTROLLER_FAINTANIMATION] = OakOldManHandleFaintAnimation, + [CONTROLLER_PALETTEFADE] = OakOldManHandlePaletteFade, + [CONTROLLER_SUCCESSBALLTHROWANIM] = OakOldManHandleSuccessBallThrowAnim, + [CONTROLLER_BALLTHROWANIM] = OakOldManHandleBallThrowAnim, + [CONTROLLER_PAUSE] = OakOldManHandlePause, + [CONTROLLER_MOVEANIMATION] = OakOldManHandleMoveAnimation, + [CONTROLLER_PRINTSTRING] = OakOldManHandlePrintString, + [CONTROLLER_PRINTSTRINGPLAYERONLY] = OakOldManHandlePrintSelectionString, + [CONTROLLER_CHOOSEACTION] = OakOldManHandleChooseAction, + [CONTROLLER_UNKNOWNYESNOBOX] = OakOldManHandleUnknownYesNoBox, + [CONTROLLER_CHOOSEMOVE] = OakOldManHandleChooseMove, + [CONTROLLER_OPENBAG] = OakOldManHandleChooseItem, + [CONTROLLER_CHOOSEPOKEMON] = OakOldManHandleChoosePokemon, + [CONTROLLER_23] = OakOldManHandleCmd23, + [CONTROLLER_HEALTHBARUPDATE] = OakOldManHandleHealthBarUpdate, + [CONTROLLER_EXPUPDATE] = OakOldManHandleExpUpdate, + [CONTROLLER_STATUSICONUPDATE] = OakOldManHandleStatusIconUpdate, + [CONTROLLER_STATUSANIMATION] = OakOldManHandleStatusAnimation, + [CONTROLLER_STATUSXOR] = OakOldManHandleStatusXor, + [CONTROLLER_DATATRANSFER] = OakOldManHandleDataTransfer, + [CONTROLLER_DMA3TRANSFER] = OakOldManHandleDMA3Transfer, + [CONTROLLER_PLAYBGM] = OakOldManHandlePlayBGM, + [CONTROLLER_32] = OakOldManHandleCmd32, + [CONTROLLER_TWORETURNVALUES] = OakOldManHandleTwoReturnValues, + [CONTROLLER_CHOSENMONRETURNVALUE] = OakOldManHandleChosenMonReturnValue, + [CONTROLLER_ONERETURNVALUE] = OakOldManHandleOneReturnValue, + [CONTROLLER_ONERETURNVALUE_DUPLICATE] = OakOldManHandleOneReturnValue_Duplicate, + [CONTROLLER_CLEARUNKVAR] = OakOldManHandleCmd37, + [CONTROLLER_SETUNKVAR] = OakOldManHandleCmd38, + [CONTROLLER_CLEARUNKFLAG] = OakOldManHandleCmd39, + [CONTROLLER_TOGGLEUNKFLAG] = OakOldManHandleCmd40, + [CONTROLLER_HITANIMATION] = OakOldManHandleHitAnimation, + [CONTROLLER_CANTSWITCH] = OakOldManHandleCmd42, + [CONTROLLER_PLAYSE] = OakOldManHandlePlaySE, + [CONTROLLER_PLAYFANFARE] = OakOldManHandlePlayFanfare, + [CONTROLLER_FAINTINGCRY] = OakOldManHandleFaintingCry, + [CONTROLLER_INTROSLIDE] = OakOldManHandleIntroSlide, + [CONTROLLER_INTROTRAINERBALLTHROW] = OakOldManHandleIntroTrainerBallThrow, + [CONTROLLER_DRAWPARTYSTATUSSUMMARY] = OakOldManHandleDrawPartyStatusSummary, + [CONTROLLER_HIDEPARTYSTATUSSUMMARY] = OakOldManHandleHidePartyStatusSummary, + [CONTROLLER_ENDBOUNCE] = OakOldManHandleEndBounceEffect, + [CONTROLLER_SPRITEINVISIBILITY] = OakOldManHandleSpriteInvisibility, + [CONTROLLER_BATTLEANIMATION] = OakOldManHandleBattleAnimation, + [CONTROLLER_LINKSTANDBYMSG] = OakOldManHandleLinkStandbyMsg, + [CONTROLLER_RESETACTIONMOVESELECTION] = OakOldManHandleResetActionMoveSelection, + [CONTROLLER_ENDLINKBATTLE] = OakOldManHandleCmd55, + [CONTROLLER_TERMINATOR_NOP] = OakOldManCmdEnd, }; static void OakOldManDummy(void) diff --git a/src/battle_controller_opponent.c b/src/battle_controller_opponent.c index 19ad30441..b4b6ebbdf 100644 --- a/src/battle_controller_opponent.c +++ b/src/battle_controller_opponent.c @@ -92,63 +92,63 @@ static void EndDrawPartyStatusSummary(void); static void (*const sOpponentBufferCommands[CONTROLLER_CMDS_COUNT])(void) = { - OpponentHandleGetMonData, - OpponentHandleGetRawMonData, - OpponentHandleSetMonData, - OpponentHandleSetRawMonData, - OpponentHandleLoadMonSprite, - OpponentHandleSwitchInAnim, - OpponentHandleReturnMonToBall, - OpponentHandleDrawTrainerPic, - OpponentHandleTrainerSlide, - OpponentHandleTrainerSlideBack, - OpponentHandleFaintAnimation, - OpponentHandlePaletteFade, - OpponentHandleSuccessBallThrowAnim, - OpponentHandleBallThrowAnim, - OpponentHandlePause, - OpponentHandleMoveAnimation, - OpponentHandlePrintString, - OpponentHandlePrintSelectionString, - OpponentHandleChooseAction, - OpponentHandleUnknownYesNoBox, - OpponentHandleChooseMove, - OpponentHandleChooseItem, - OpponentHandleChoosePokemon, - OpponentHandleCmd23, - OpponentHandleHealthBarUpdate, - OpponentHandleExpUpdate, - OpponentHandleStatusIconUpdate, - OpponentHandleStatusAnimation, - OpponentHandleStatusXor, - OpponentHandleDataTransfer, - OpponentHandleDMA3Transfer, - OpponentHandlePlayBGM, - OpponentHandleCmd32, - OpponentHandleTwoReturnValues, - OpponentHandleChosenMonReturnValue, - OpponentHandleOneReturnValue, - OpponentHandleOneReturnValue_Duplicate, - OpponentHandleCmd37, - OpponentHandleCmd38, - OpponentHandleCmd39, - OpponentHandleCmd40, - OpponentHandleHitAnimation, - OpponentHandleCmd42, - OpponentHandlePlaySE, - OpponentHandlePlayFanfare, - OpponentHandleFaintingCry, - OpponentHandleIntroSlide, - OpponentHandleIntroTrainerBallThrow, - OpponentHandleDrawPartyStatusSummary, - OpponentHandleHidePartyStatusSummary, - OpponentHandleEndBounceEffect, - OpponentHandleSpriteInvisibility, - OpponentHandleBattleAnimation, - OpponentHandleLinkStandbyMsg, - OpponentHandleResetActionMoveSelection, - OpponentHandleCmd55, - OpponentCmdEnd + [CONTROLLER_GETMONDATA] = OpponentHandleGetMonData, + [CONTROLLER_GETRAWMONDATA] = OpponentHandleGetRawMonData, + [CONTROLLER_SETMONDATA] = OpponentHandleSetMonData, + [CONTROLLER_SETRAWMONDATA] = OpponentHandleSetRawMonData, + [CONTROLLER_LOADMONSPRITE] = OpponentHandleLoadMonSprite, + [CONTROLLER_SWITCHINANIM] = OpponentHandleSwitchInAnim, + [CONTROLLER_RETURNMONTOBALL] = OpponentHandleReturnMonToBall, + [CONTROLLER_DRAWTRAINERPIC] = OpponentHandleDrawTrainerPic, + [CONTROLLER_TRAINERSLIDE] = OpponentHandleTrainerSlide, + [CONTROLLER_TRAINERSLIDEBACK] = OpponentHandleTrainerSlideBack, + [CONTROLLER_FAINTANIMATION] = OpponentHandleFaintAnimation, + [CONTROLLER_PALETTEFADE] = OpponentHandlePaletteFade, + [CONTROLLER_SUCCESSBALLTHROWANIM] = OpponentHandleSuccessBallThrowAnim, + [CONTROLLER_BALLTHROWANIM] = OpponentHandleBallThrowAnim, + [CONTROLLER_PAUSE] = OpponentHandlePause, + [CONTROLLER_MOVEANIMATION] = OpponentHandleMoveAnimation, + [CONTROLLER_PRINTSTRING] = OpponentHandlePrintString, + [CONTROLLER_PRINTSTRINGPLAYERONLY] = OpponentHandlePrintSelectionString, + [CONTROLLER_CHOOSEACTION] = OpponentHandleChooseAction, + [CONTROLLER_UNKNOWNYESNOBOX] = OpponentHandleUnknownYesNoBox, + [CONTROLLER_CHOOSEMOVE] = OpponentHandleChooseMove, + [CONTROLLER_OPENBAG] = OpponentHandleChooseItem, + [CONTROLLER_CHOOSEPOKEMON] = OpponentHandleChoosePokemon, + [CONTROLLER_23] = OpponentHandleCmd23, + [CONTROLLER_HEALTHBARUPDATE] = OpponentHandleHealthBarUpdate, + [CONTROLLER_EXPUPDATE] = OpponentHandleExpUpdate, + [CONTROLLER_STATUSICONUPDATE] = OpponentHandleStatusIconUpdate, + [CONTROLLER_STATUSANIMATION] = OpponentHandleStatusAnimation, + [CONTROLLER_STATUSXOR] = OpponentHandleStatusXor, + [CONTROLLER_DATATRANSFER] = OpponentHandleDataTransfer, + [CONTROLLER_DMA3TRANSFER] = OpponentHandleDMA3Transfer, + [CONTROLLER_PLAYBGM] = OpponentHandlePlayBGM, + [CONTROLLER_32] = OpponentHandleCmd32, + [CONTROLLER_TWORETURNVALUES] = OpponentHandleTwoReturnValues, + [CONTROLLER_CHOSENMONRETURNVALUE] = OpponentHandleChosenMonReturnValue, + [CONTROLLER_ONERETURNVALUE] = OpponentHandleOneReturnValue, + [CONTROLLER_ONERETURNVALUE_DUPLICATE] = OpponentHandleOneReturnValue_Duplicate, + [CONTROLLER_CLEARUNKVAR] = OpponentHandleCmd37, + [CONTROLLER_SETUNKVAR] = OpponentHandleCmd38, + [CONTROLLER_CLEARUNKFLAG] = OpponentHandleCmd39, + [CONTROLLER_TOGGLEUNKFLAG] = OpponentHandleCmd40, + [CONTROLLER_HITANIMATION] = OpponentHandleHitAnimation, + [CONTROLLER_CANTSWITCH] = OpponentHandleCmd42, + [CONTROLLER_PLAYSE] = OpponentHandlePlaySE, + [CONTROLLER_PLAYFANFARE] = OpponentHandlePlayFanfare, + [CONTROLLER_FAINTINGCRY] = OpponentHandleFaintingCry, + [CONTROLLER_INTROSLIDE] = OpponentHandleIntroSlide, + [CONTROLLER_INTROTRAINERBALLTHROW] = OpponentHandleIntroTrainerBallThrow, + [CONTROLLER_DRAWPARTYSTATUSSUMMARY] = OpponentHandleDrawPartyStatusSummary, + [CONTROLLER_HIDEPARTYSTATUSSUMMARY] = OpponentHandleHidePartyStatusSummary, + [CONTROLLER_ENDBOUNCE] = OpponentHandleEndBounceEffect, + [CONTROLLER_SPRITEINVISIBILITY] = OpponentHandleSpriteInvisibility, + [CONTROLLER_BATTLEANIMATION] = OpponentHandleBattleAnimation, + [CONTROLLER_LINKSTANDBYMSG] = OpponentHandleLinkStandbyMsg, + [CONTROLLER_RESETACTIONMOVESELECTION] = OpponentHandleResetActionMoveSelection, + [CONTROLLER_ENDLINKBATTLE] = OpponentHandleCmd55, + [CONTROLLER_TERMINATOR_NOP] = OpponentCmdEnd }; // unknown unused data diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c index 7928a7031..64a47823f 100644 --- a/src/battle_controller_player.c +++ b/src/battle_controller_player.c @@ -109,63 +109,63 @@ static void EndDrawPartyStatusSummary(void); static void (*const sPlayerBufferCommands[CONTROLLER_CMDS_COUNT])(void) = { - PlayerHandleGetMonData, - PlayerHandleGetRawMonData, - PlayerHandleSetMonData, - PlayerHandleSetRawMonData, - PlayerHandleLoadMonSprite, - PlayerHandleSwitchInAnim, - PlayerHandleReturnMonToBall, - PlayerHandleDrawTrainerPic, - PlayerHandleTrainerSlide, - PlayerHandleTrainerSlideBack, - PlayerHandleFaintAnimation, - PlayerHandlePaletteFade, - PlayerHandleSuccessBallThrowAnim, - PlayerHandleBallThrowAnim, - PlayerHandlePause, - PlayerHandleMoveAnimation, - PlayerHandlePrintString, - PlayerHandlePrintSelectionString, - PlayerHandleChooseAction, - PlayerHandleUnknownYesNoBox, - PlayerHandleChooseMove, - PlayerHandleChooseItem, - PlayerHandleChoosePokemon, - PlayerHandleCmd23, - PlayerHandleHealthBarUpdate, - PlayerHandleExpUpdate, - PlayerHandleStatusIconUpdate, - PlayerHandleStatusAnimation, - PlayerHandleStatusXor, - PlayerHandleDataTransfer, - PlayerHandleDMA3Transfer, - PlayerHandlePlayBGM, - PlayerHandleCmd32, - PlayerHandleTwoReturnValues, - PlayerHandleChosenMonReturnValue, - PlayerHandleOneReturnValue, - PlayerHandleOneReturnValue_Duplicate, - PlayerHandleCmd37, - PlayerHandleCmd38, - PlayerHandleCmd39, - PlayerHandleCmd40, - PlayerHandleHitAnimation, - PlayerHandleCmd42, - PlayerHandlePlaySE, - PlayerHandlePlayFanfare, - PlayerHandleFaintingCry, - PlayerHandleIntroSlide, - PlayerHandleIntroTrainerBallThrow, - PlayerHandleDrawPartyStatusSummary, - PlayerHandleHidePartyStatusSummary, - PlayerHandleEndBounceEffect, - PlayerHandleSpriteInvisibility, - PlayerHandleBattleAnimation, - PlayerHandleLinkStandbyMsg, - PlayerHandleResetActionMoveSelection, - PlayerHandleCmd55, - PlayerCmdEnd, + [CONTROLLER_GETMONDATA] = PlayerHandleGetMonData, + [CONTROLLER_GETRAWMONDATA] = PlayerHandleGetRawMonData, + [CONTROLLER_SETMONDATA] = PlayerHandleSetMonData, + [CONTROLLER_SETRAWMONDATA] = PlayerHandleSetRawMonData, + [CONTROLLER_LOADMONSPRITE] = PlayerHandleLoadMonSprite, + [CONTROLLER_SWITCHINANIM] = PlayerHandleSwitchInAnim, + [CONTROLLER_RETURNMONTOBALL] = PlayerHandleReturnMonToBall, + [CONTROLLER_DRAWTRAINERPIC] = PlayerHandleDrawTrainerPic, + [CONTROLLER_TRAINERSLIDE] = PlayerHandleTrainerSlide, + [CONTROLLER_TRAINERSLIDEBACK] = PlayerHandleTrainerSlideBack, + [CONTROLLER_FAINTANIMATION] = PlayerHandleFaintAnimation, + [CONTROLLER_PALETTEFADE] = PlayerHandlePaletteFade, + [CONTROLLER_SUCCESSBALLTHROWANIM] = PlayerHandleSuccessBallThrowAnim, + [CONTROLLER_BALLTHROWANIM] = PlayerHandleBallThrowAnim, + [CONTROLLER_PAUSE] = PlayerHandlePause, + [CONTROLLER_MOVEANIMATION] = PlayerHandleMoveAnimation, + [CONTROLLER_PRINTSTRING] = PlayerHandlePrintString, + [CONTROLLER_PRINTSTRINGPLAYERONLY] = PlayerHandlePrintSelectionString, + [CONTROLLER_CHOOSEACTION] = PlayerHandleChooseAction, + [CONTROLLER_UNKNOWNYESNOBOX] = PlayerHandleUnknownYesNoBox, + [CONTROLLER_CHOOSEMOVE] = PlayerHandleChooseMove, + [CONTROLLER_OPENBAG] = PlayerHandleChooseItem, + [CONTROLLER_CHOOSEPOKEMON] = PlayerHandleChoosePokemon, + [CONTROLLER_23] = PlayerHandleCmd23, + [CONTROLLER_HEALTHBARUPDATE] = PlayerHandleHealthBarUpdate, + [CONTROLLER_EXPUPDATE] = PlayerHandleExpUpdate, + [CONTROLLER_STATUSICONUPDATE] = PlayerHandleStatusIconUpdate, + [CONTROLLER_STATUSANIMATION] = PlayerHandleStatusAnimation, + [CONTROLLER_STATUSXOR] = PlayerHandleStatusXor, + [CONTROLLER_DATATRANSFER] = PlayerHandleDataTransfer, + [CONTROLLER_DMA3TRANSFER] = PlayerHandleDMA3Transfer, + [CONTROLLER_PLAYBGM] = PlayerHandlePlayBGM, + [CONTROLLER_32] = PlayerHandleCmd32, + [CONTROLLER_TWORETURNVALUES] = PlayerHandleTwoReturnValues, + [CONTROLLER_CHOSENMONRETURNVALUE] = PlayerHandleChosenMonReturnValue, + [CONTROLLER_ONERETURNVALUE] = PlayerHandleOneReturnValue, + [CONTROLLER_ONERETURNVALUE_DUPLICATE] = PlayerHandleOneReturnValue_Duplicate, + [CONTROLLER_CLEARUNKVAR] = PlayerHandleCmd37, + [CONTROLLER_SETUNKVAR] = PlayerHandleCmd38, + [CONTROLLER_CLEARUNKFLAG] = PlayerHandleCmd39, + [CONTROLLER_TOGGLEUNKFLAG] = PlayerHandleCmd40, + [CONTROLLER_HITANIMATION] = PlayerHandleHitAnimation, + [CONTROLLER_CANTSWITCH] = PlayerHandleCmd42, + [CONTROLLER_PLAYSE] = PlayerHandlePlaySE, + [CONTROLLER_PLAYFANFARE] = PlayerHandlePlayFanfare, + [CONTROLLER_FAINTINGCRY] = PlayerHandleFaintingCry, + [CONTROLLER_INTROSLIDE] = PlayerHandleIntroSlide, + [CONTROLLER_INTROTRAINERBALLTHROW] = PlayerHandleIntroTrainerBallThrow, + [CONTROLLER_DRAWPARTYSTATUSSUMMARY] = PlayerHandleDrawPartyStatusSummary, + [CONTROLLER_HIDEPARTYSTATUSSUMMARY] = PlayerHandleHidePartyStatusSummary, + [CONTROLLER_ENDBOUNCE] = PlayerHandleEndBounceEffect, + [CONTROLLER_SPRITEINVISIBILITY] = PlayerHandleSpriteInvisibility, + [CONTROLLER_BATTLEANIMATION] = PlayerHandleBattleAnimation, + [CONTROLLER_LINKSTANDBYMSG] = PlayerHandleLinkStandbyMsg, + [CONTROLLER_RESETACTIONMOVESELECTION] = PlayerHandleResetActionMoveSelection, + [CONTROLLER_ENDLINKBATTLE] = PlayerHandleCmd55, + [CONTROLLER_TERMINATOR_NOP] = PlayerCmdEnd, }; static const u8 sTargetIdentities[] = { B_POSITION_PLAYER_LEFT, B_POSITION_PLAYER_RIGHT, B_POSITION_OPPONENT_RIGHT, B_POSITION_OPPONENT_LEFT }; diff --git a/src/battle_controller_pokedude.c b/src/battle_controller_pokedude.c index 83c44a19c..3b1084aa4 100644 --- a/src/battle_controller_pokedude.c +++ b/src/battle_controller_pokedude.c @@ -34,7 +34,7 @@ struct PokedudeBattlePartyInfo u8 side; u8 level; u16 species; - u16 moves[4]; + u16 moves[MAX_MON_MOVES]; u8 nature; u8 gender; }; @@ -121,65 +121,65 @@ static void Task_StartSendOutAnim(u8 taskId); static const u8 *GetPokedudeText(void); static void (*const sPokedudeBufferCommands[CONTROLLER_CMDS_COUNT])(void) = - { - PokedudeHandleGetMonData, - PokedudeHandleGetRawMonData, - PokedudeHandleSetMonData, - PokedudeHandleSetRawMonData, - PokedudeHandleLoadMonSprite, - PokedudeHandleSwitchInAnim, - PokedudeHandleReturnMonToBall, - PokedudeHandleDrawTrainerPic, - PokedudeHandleTrainerSlide, - PokedudeHandleTrainerSlideBack, - PokedudeHandleFaintAnimation, - PokedudeHandlePaletteFade, - PokedudeHandleSuccessBallThrowAnim, - PokedudeHandleBallThrowAnim, - PokedudeHandlePause, - PokedudeHandleMoveAnimation, - PokedudeHandlePrintString, - PokedudeHandlePrintSelectionString, - PokedudeHandleChooseAction, - PokedudeHandleUnknownYesNoBox, - PokedudeHandleChooseMove, - PokedudeHandleChooseItem, - PokedudeHandleChoosePokemon, - PokedudeHandleCmd23, - PokedudeHandleHealthBarUpdate, - PokedudeHandleExpUpdate, - PokedudeHandleStatusIconUpdate, - PokedudeHandleStatusAnimation, - PokedudeHandleStatusXor, - PokedudeHandleDataTransfer, - PokedudeHandleDMA3Transfer, - PokedudeHandlePlayBGM, - PokedudeHandleCmd32, - PokedudeHandleTwoReturnValues, - PokedudeHandleChosenMonReturnValue, - PokedudeHandleOneReturnValue, - PokedudeHandleOneReturnValue_Duplicate, - PokedudeHandleCmd37, - PokedudeHandleCmd38, - PokedudeHandleCmd39, - PokedudeHandleCmd40, - PokedudeHandleHitAnimation, - PokedudeHandleCmd42, - PokedudeHandlePlaySE, - PokedudeHandlePlayFanfare, - PokedudeHandleFaintingCry, - PokedudeHandleIntroSlide, - PokedudeHandleIntroTrainerBallThrow, - PokedudeHandleDrawPartyStatusSummary, - PokedudeHandleHidePartyStatusSummary, - PokedudeHandleEndBounceEffect, - PokedudeHandleSpriteInvisibility, - PokedudeHandleBattleAnimation, - PokedudeHandleLinkStandbyMsg, - PokedudeHandleResetActionMoveSelection, - PokedudeHandleCmd55, - PokedudeCmdEnd, - }; +{ + [CONTROLLER_GETMONDATA] = PokedudeHandleGetMonData, + [CONTROLLER_GETRAWMONDATA] = PokedudeHandleGetRawMonData, + [CONTROLLER_SETMONDATA] = PokedudeHandleSetMonData, + [CONTROLLER_SETRAWMONDATA] = PokedudeHandleSetRawMonData, + [CONTROLLER_LOADMONSPRITE] = PokedudeHandleLoadMonSprite, + [CONTROLLER_SWITCHINANIM] = PokedudeHandleSwitchInAnim, + [CONTROLLER_RETURNMONTOBALL] = PokedudeHandleReturnMonToBall, + [CONTROLLER_DRAWTRAINERPIC] = PokedudeHandleDrawTrainerPic, + [CONTROLLER_TRAINERSLIDE] = PokedudeHandleTrainerSlide, + [CONTROLLER_TRAINERSLIDEBACK] = PokedudeHandleTrainerSlideBack, + [CONTROLLER_FAINTANIMATION] = PokedudeHandleFaintAnimation, + [CONTROLLER_PALETTEFADE] = PokedudeHandlePaletteFade, + [CONTROLLER_SUCCESSBALLTHROWANIM] = PokedudeHandleSuccessBallThrowAnim, + [CONTROLLER_BALLTHROWANIM] = PokedudeHandleBallThrowAnim, + [CONTROLLER_PAUSE] = PokedudeHandlePause, + [CONTROLLER_MOVEANIMATION] = PokedudeHandleMoveAnimation, + [CONTROLLER_PRINTSTRING] = PokedudeHandlePrintString, + [CONTROLLER_PRINTSTRINGPLAYERONLY] = PokedudeHandlePrintSelectionString, + [CONTROLLER_CHOOSEACTION] = PokedudeHandleChooseAction, + [CONTROLLER_UNKNOWNYESNOBOX] = PokedudeHandleUnknownYesNoBox, + [CONTROLLER_CHOOSEMOVE] = PokedudeHandleChooseMove, + [CONTROLLER_OPENBAG] = PokedudeHandleChooseItem, + [CONTROLLER_CHOOSEPOKEMON] = PokedudeHandleChoosePokemon, + [CONTROLLER_23] = PokedudeHandleCmd23, + [CONTROLLER_HEALTHBARUPDATE] = PokedudeHandleHealthBarUpdate, + [CONTROLLER_EXPUPDATE] = PokedudeHandleExpUpdate, + [CONTROLLER_STATUSICONUPDATE] = PokedudeHandleStatusIconUpdate, + [CONTROLLER_STATUSANIMATION] = PokedudeHandleStatusAnimation, + [CONTROLLER_STATUSXOR] = PokedudeHandleStatusXor, + [CONTROLLER_DATATRANSFER] = PokedudeHandleDataTransfer, + [CONTROLLER_DMA3TRANSFER] = PokedudeHandleDMA3Transfer, + [CONTROLLER_PLAYBGM] = PokedudeHandlePlayBGM, + [CONTROLLER_32] = PokedudeHandleCmd32, + [CONTROLLER_TWORETURNVALUES] = PokedudeHandleTwoReturnValues, + [CONTROLLER_CHOSENMONRETURNVALUE] = PokedudeHandleChosenMonReturnValue, + [CONTROLLER_ONERETURNVALUE] = PokedudeHandleOneReturnValue, + [CONTROLLER_ONERETURNVALUE_DUPLICATE] = PokedudeHandleOneReturnValue_Duplicate, + [CONTROLLER_CLEARUNKVAR] = PokedudeHandleCmd37, + [CONTROLLER_SETUNKVAR] = PokedudeHandleCmd38, + [CONTROLLER_CLEARUNKFLAG] = PokedudeHandleCmd39, + [CONTROLLER_TOGGLEUNKFLAG] = PokedudeHandleCmd40, + [CONTROLLER_HITANIMATION] = PokedudeHandleHitAnimation, + [CONTROLLER_CANTSWITCH] = PokedudeHandleCmd42, + [CONTROLLER_PLAYSE] = PokedudeHandlePlaySE, + [CONTROLLER_PLAYFANFARE] = PokedudeHandlePlayFanfare, + [CONTROLLER_FAINTINGCRY] = PokedudeHandleFaintingCry, + [CONTROLLER_INTROSLIDE] = PokedudeHandleIntroSlide, + [CONTROLLER_INTROTRAINERBALLTHROW] = PokedudeHandleIntroTrainerBallThrow, + [CONTROLLER_DRAWPARTYSTATUSSUMMARY] = PokedudeHandleDrawPartyStatusSummary, + [CONTROLLER_HIDEPARTYSTATUSSUMMARY] = PokedudeHandleHidePartyStatusSummary, + [CONTROLLER_ENDBOUNCE] = PokedudeHandleEndBounceEffect, + [CONTROLLER_SPRITEINVISIBILITY] = PokedudeHandleSpriteInvisibility, + [CONTROLLER_BATTLEANIMATION] = PokedudeHandleBattleAnimation, + [CONTROLLER_LINKSTANDBYMSG] = PokedudeHandleLinkStandbyMsg, + [CONTROLLER_RESETACTIONMOVESELECTION] = PokedudeHandleResetActionMoveSelection, + [CONTROLLER_ENDLINKBATTLE] = PokedudeHandleCmd55, + [CONTROLLER_TERMINATOR_NOP] = PokedudeCmdEnd, +}; // unknown unused data static const u8 sUnused[] = { 0x48, 0x48, 0x20, 0x5a, 0x50, 0x50, 0x50, 0x58 }; diff --git a/src/battle_controller_safari.c b/src/battle_controller_safari.c index 50bfdb205..4337dd723 100644 --- a/src/battle_controller_safari.c +++ b/src/battle_controller_safari.c @@ -79,63 +79,63 @@ static void CompleteWhenChosePokeblock(void); static void (*const sSafariBufferCommands[CONTROLLER_CMDS_COUNT])(void) = { - SafariHandleGetMonData, - SafariHandleGetRawMonData, - SafariHandleSetMonData, - SafariHandleSetRawMonData, - SafariHandleLoadMonSprite, - SafariHandleSwitchInAnim, - SafariHandleReturnMonToBall, - SafariHandleDrawTrainerPic, - SafariHandleTrainerSlide, - SafariHandleTrainerSlideBack, - SafariHandleFaintAnimation, - SafariHandlePaletteFade, - SafariHandleSuccessBallThrowAnim, - SafariHandleBallThrowAnim, - SafariHandlePause, - SafariHandleMoveAnimation, - SafariHandlePrintString, - SafariHandlePrintSelectionString, - SafariHandleChooseAction, - SafariHandleUnknownYesNoBox, - SafariHandleChooseMove, - SafariHandleChooseItem, - SafariHandleChoosePokemon, - SafariHandleCmd23, - SafariHandleHealthBarUpdate, - SafariHandleExpUpdate, - SafariHandleStatusIconUpdate, - SafariHandleStatusAnimation, - SafariHandleStatusXor, - SafariHandleDataTransfer, - SafariHandleDMA3Transfer, - SafariHandlePlayBGM, - SafariHandleCmd32, - SafariHandleTwoReturnValues, - SafariHandleChosenMonReturnValue, - SafariHandleOneReturnValue, - SafariHandleOneReturnValue_Duplicate, - SafariHandleCmd37, - SafariHandleCmd38, - SafariHandleCmd39, - SafariHandleCmd40, - SafariHandleHitAnimation, - SafariHandleCmd42, - SafariHandlePlaySE, - SafariHandlePlayFanfareOrBGM, - SafariHandleFaintingCry, - SafariHandleIntroSlide, - SafariHandleIntroTrainerBallThrow, - SafariHandleDrawPartyStatusSummary, - SafariHandleHidePartyStatusSummary, - SafariHandleEndBounceEffect, - SafariHandleSpriteInvisibility, - SafariHandleBattleAnimation, - SafariHandleLinkStandbyMsg, - SafariHandleResetActionMoveSelection, - SafariHandleCmd55, - SafariCmdEnd, + [CONTROLLER_GETMONDATA] = SafariHandleGetMonData, + [CONTROLLER_GETRAWMONDATA] = SafariHandleGetRawMonData, + [CONTROLLER_SETMONDATA] = SafariHandleSetMonData, + [CONTROLLER_SETRAWMONDATA] = SafariHandleSetRawMonData, + [CONTROLLER_LOADMONSPRITE] = SafariHandleLoadMonSprite, + [CONTROLLER_SWITCHINANIM] = SafariHandleSwitchInAnim, + [CONTROLLER_RETURNMONTOBALL] = SafariHandleReturnMonToBall, + [CONTROLLER_DRAWTRAINERPIC] = SafariHandleDrawTrainerPic, + [CONTROLLER_TRAINERSLIDE] = SafariHandleTrainerSlide, + [CONTROLLER_TRAINERSLIDEBACK] = SafariHandleTrainerSlideBack, + [CONTROLLER_FAINTANIMATION] = SafariHandleFaintAnimation, + [CONTROLLER_PALETTEFADE] = SafariHandlePaletteFade, + [CONTROLLER_SUCCESSBALLTHROWANIM] = SafariHandleSuccessBallThrowAnim, + [CONTROLLER_BALLTHROWANIM] = SafariHandleBallThrowAnim, + [CONTROLLER_PAUSE] = SafariHandlePause, + [CONTROLLER_MOVEANIMATION] = SafariHandleMoveAnimation, + [CONTROLLER_PRINTSTRING] = SafariHandlePrintString, + [CONTROLLER_PRINTSTRINGPLAYERONLY] = SafariHandlePrintSelectionString, + [CONTROLLER_CHOOSEACTION] = SafariHandleChooseAction, + [CONTROLLER_UNKNOWNYESNOBOX] = SafariHandleUnknownYesNoBox, + [CONTROLLER_CHOOSEMOVE] = SafariHandleChooseMove, + [CONTROLLER_OPENBAG] = SafariHandleChooseItem, + [CONTROLLER_CHOOSEPOKEMON] = SafariHandleChoosePokemon, + [CONTROLLER_23] = SafariHandleCmd23, + [CONTROLLER_HEALTHBARUPDATE] = SafariHandleHealthBarUpdate, + [CONTROLLER_EXPUPDATE] = SafariHandleExpUpdate, + [CONTROLLER_STATUSICONUPDATE] = SafariHandleStatusIconUpdate, + [CONTROLLER_STATUSANIMATION] = SafariHandleStatusAnimation, + [CONTROLLER_STATUSXOR] = SafariHandleStatusXor, + [CONTROLLER_DATATRANSFER] = SafariHandleDataTransfer, + [CONTROLLER_DMA3TRANSFER] = SafariHandleDMA3Transfer, + [CONTROLLER_PLAYBGM] = SafariHandlePlayBGM, + [CONTROLLER_32] = SafariHandleCmd32, + [CONTROLLER_TWORETURNVALUES] = SafariHandleTwoReturnValues, + [CONTROLLER_CHOSENMONRETURNVALUE] = SafariHandleChosenMonReturnValue, + [CONTROLLER_ONERETURNVALUE] = SafariHandleOneReturnValue, + [CONTROLLER_ONERETURNVALUE_DUPLICATE] = SafariHandleOneReturnValue_Duplicate, + [CONTROLLER_CLEARUNKVAR] = SafariHandleCmd37, + [CONTROLLER_SETUNKVAR] = SafariHandleCmd38, + [CONTROLLER_CLEARUNKFLAG] = SafariHandleCmd39, + [CONTROLLER_TOGGLEUNKFLAG] = SafariHandleCmd40, + [CONTROLLER_HITANIMATION] = SafariHandleHitAnimation, + [CONTROLLER_CANTSWITCH] = SafariHandleCmd42, + [CONTROLLER_PLAYSE] = SafariHandlePlaySE, + [CONTROLLER_PLAYFANFARE] = SafariHandlePlayFanfareOrBGM, + [CONTROLLER_FAINTINGCRY] = SafariHandleFaintingCry, + [CONTROLLER_INTROSLIDE] = SafariHandleIntroSlide, + [CONTROLLER_INTROTRAINERBALLTHROW] = SafariHandleIntroTrainerBallThrow, + [CONTROLLER_DRAWPARTYSTATUSSUMMARY] = SafariHandleDrawPartyStatusSummary, + [CONTROLLER_HIDEPARTYSTATUSSUMMARY] = SafariHandleHidePartyStatusSummary, + [CONTROLLER_ENDBOUNCE] = SafariHandleEndBounceEffect, + [CONTROLLER_SPRITEINVISIBILITY] = SafariHandleSpriteInvisibility, + [CONTROLLER_BATTLEANIMATION] = SafariHandleBattleAnimation, + [CONTROLLER_LINKSTANDBYMSG] = SafariHandleLinkStandbyMsg, + [CONTROLLER_RESETACTIONMOVESELECTION] = SafariHandleResetActionMoveSelection, + [CONTROLLER_ENDLINKBATTLE] = SafariHandleCmd55, + [CONTROLLER_TERMINATOR_NOP] = SafariCmdEnd, }; // not used diff --git a/src/battle_setup.c b/src/battle_setup.c index aaad88c9f..36f4d860a 100644 --- a/src/battle_setup.c +++ b/src/battle_setup.c @@ -497,7 +497,7 @@ u8 BattleSetup_GetTerrainId(void) return BATTLE_TERRAIN_WATER; return BATTLE_TERRAIN_PLAIN; } - if (MetatileBehavior_IsDeepSemiDeepOrSplashingWater(tileBehavior)) + if (MetatileBehavior_IsDeepWaterTerrain(tileBehavior)) return BATTLE_TERRAIN_WATER; if (MetatileBehavior_IsSurfable(tileBehavior)) return BATTLE_TERRAIN_POND; diff --git a/src/berry_crush.c b/src/berry_crush.c index 78a9e6fba..4adf42a6a 100644 --- a/src/berry_crush.c +++ b/src/berry_crush.c @@ -3274,7 +3274,7 @@ static void CopyPlayerNameWindowGfxToBg(struct BerryCrushGame * game) u8 i = 0; u8 *crusherGfx; - LZ77UnCompWram(gBerryCrush_Crusher_Tilemap, gDecompressionBuffer); + LZ77UnCompWram(gBerryCrush_TextWindows_Tilemap, gDecompressionBuffer); for (crusherGfx = gDecompressionBuffer; i < game->playerCount; ++i) { CopyToBgTilemapBufferRect( diff --git a/src/data/pokemon_graphics/back_pic_coordinates.h b/src/data/pokemon_graphics/back_pic_coordinates.h index b8a96febc..17f818f45 100644 --- a/src/data/pokemon_graphics/back_pic_coordinates.h +++ b/src/data/pokemon_graphics/back_pic_coordinates.h @@ -2,2203 +2,2203 @@ const struct MonCoords gMonBackPicCoords[] = { [SPECIES_NONE] = { - .size = 0x88, - .y_offset = 0x00, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 0, }, [SPECIES_BULBASAUR] = { - .size = 0x64, - .y_offset = 0x10, + .size = MON_COORDS_SIZE(48, 32), + .y_offset = 16, }, [SPECIES_IVYSAUR] = { - .size = 0x76, - .y_offset = 0x0a, + .size = MON_COORDS_SIZE(56, 48), + .y_offset = 10, }, [SPECIES_VENUSAUR] = { - .size = 0x86, - .y_offset = 0x0a, + .size = MON_COORDS_SIZE(64, 48), + .y_offset = 10, }, [SPECIES_CHARMANDER] = { - .size = 0x66, - .y_offset = 0x0a, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 10, }, [SPECIES_CHARMELEON] = { - .size = 0x77, - .y_offset = 0x07, + .size = MON_COORDS_SIZE(56, 56), + .y_offset = 7, }, [SPECIES_CHARIZARD] = { - .size = 0x87, - .y_offset = 0x04, + .size = MON_COORDS_SIZE(64, 56), + .y_offset = 4, }, [SPECIES_SQUIRTLE] = { - .size = 0x75, - .y_offset = 0x0f, + .size = MON_COORDS_SIZE(56, 40), + .y_offset = 15, }, [SPECIES_WARTORTLE] = { - .size = 0x86, - .y_offset = 0x0a, + .size = MON_COORDS_SIZE(64, 48), + .y_offset = 10, }, [SPECIES_BLASTOISE] = { - .size = 0x86, - .y_offset = 0x0a, + .size = MON_COORDS_SIZE(64, 48), + .y_offset = 10, }, [SPECIES_CATERPIE] = { - .size = 0x55, - .y_offset = 0x0f, + .size = MON_COORDS_SIZE(40, 40), + .y_offset = 15, }, [SPECIES_METAPOD] = { - .size = 0x65, - .y_offset = 0x0c, + .size = MON_COORDS_SIZE(48, 40), + .y_offset = 12, }, [SPECIES_BUTTERFREE] = { - .size = 0x87, - .y_offset = 0x04, + .size = MON_COORDS_SIZE(64, 56), + .y_offset = 4, }, [SPECIES_WEEDLE] = { - .size = 0x56, - .y_offset = 0x0b, + .size = MON_COORDS_SIZE(40, 48), + .y_offset = 11, }, [SPECIES_KAKUNA] = { - .size = 0x46, - .y_offset = 0x0a, + .size = MON_COORDS_SIZE(32, 48), + .y_offset = 10, }, [SPECIES_BEEDRILL] = { - .size = 0x86, - .y_offset = 0x09, + .size = MON_COORDS_SIZE(64, 48), + .y_offset = 9, }, [SPECIES_PIDGEY] = { - .size = 0x66, - .y_offset = 0x08, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 8, }, [SPECIES_PIDGEOTTO] = { - .size = 0x85, - .y_offset = 0x0c, + .size = MON_COORDS_SIZE(64, 40), + .y_offset = 12, }, [SPECIES_PIDGEOT] = { - .size = 0x87, - .y_offset = 0x06, + .size = MON_COORDS_SIZE(64, 56), + .y_offset = 6, }, [SPECIES_RATTATA] = { - .size = 0x75, - .y_offset = 0x0d, + .size = MON_COORDS_SIZE(56, 40), + .y_offset = 13, }, [SPECIES_RATICATE] = { - .size = 0x75, - .y_offset = 0x0d, + .size = MON_COORDS_SIZE(56, 40), + .y_offset = 13, }, [SPECIES_SPEAROW] = { - .size = 0x65, - .y_offset = 0x0c, + .size = MON_COORDS_SIZE(48, 40), + .y_offset = 12, }, [SPECIES_FEAROW] = { - .size = 0x87, - .y_offset = 0x05, + .size = MON_COORDS_SIZE(64, 56), + .y_offset = 5, }, [SPECIES_EKANS] = { - .size = 0x66, - .y_offset = 0x09, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 9, }, [SPECIES_ARBOK] = { - .size = 0x77, - .y_offset = 0x04, + .size = MON_COORDS_SIZE(56, 56), + .y_offset = 4, }, [SPECIES_PIKACHU] = { - .size = 0x77, - .y_offset = 0x07, + .size = MON_COORDS_SIZE(56, 56), + .y_offset = 7, }, [SPECIES_RAICHU] = { - .size = 0x66, - .y_offset = 0x08, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 8, }, [SPECIES_SANDSHREW] = { - .size = 0x65, - .y_offset = 0x0d, + .size = MON_COORDS_SIZE(48, 40), + .y_offset = 13, }, [SPECIES_SANDSLASH] = { - .size = 0x86, - .y_offset = 0x09, + .size = MON_COORDS_SIZE(64, 48), + .y_offset = 9, }, [SPECIES_NIDORAN_F] = { - .size = 0x55, - .y_offset = 0x0c, + .size = MON_COORDS_SIZE(40, 40), + .y_offset = 12, }, [SPECIES_NIDORINA] = { - .size = 0x86, - .y_offset = 0x0a, + .size = MON_COORDS_SIZE(64, 48), + .y_offset = 10, }, [SPECIES_NIDOQUEEN] = { - .size = 0x77, - .y_offset = 0x06, + .size = MON_COORDS_SIZE(56, 56), + .y_offset = 6, }, [SPECIES_NIDORAN_M] = { - .size = 0x56, - .y_offset = 0x08, + .size = MON_COORDS_SIZE(40, 48), + .y_offset = 8, }, [SPECIES_NIDORINO] = { - .size = 0x86, - .y_offset = 0x09, + .size = MON_COORDS_SIZE(64, 48), + .y_offset = 9, }, [SPECIES_NIDOKING] = { - .size = 0x88, - .y_offset = 0x03, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 3, }, [SPECIES_CLEFAIRY] = { - .size = 0x65, - .y_offset = 0x0d, + .size = MON_COORDS_SIZE(48, 40), + .y_offset = 13, }, [SPECIES_CLEFABLE] = { - .size = 0x76, - .y_offset = 0x0a, + .size = MON_COORDS_SIZE(56, 48), + .y_offset = 10, }, [SPECIES_VULPIX] = { - .size = 0x76, - .y_offset = 0x09, + .size = MON_COORDS_SIZE(56, 48), + .y_offset = 9, }, [SPECIES_NINETALES] = { - .size = 0x87, - .y_offset = 0x04, + .size = MON_COORDS_SIZE(64, 56), + .y_offset = 4, }, [SPECIES_JIGGLYPUFF] = { - .size = 0x65, - .y_offset = 0x0d, + .size = MON_COORDS_SIZE(48, 40), + .y_offset = 13, }, [SPECIES_WIGGLYTUFF] = { - .size = 0x66, - .y_offset = 0x08, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 8, }, [SPECIES_ZUBAT] = { - .size = 0x76, - .y_offset = 0x0b, + .size = MON_COORDS_SIZE(56, 48), + .y_offset = 11, }, [SPECIES_GOLBAT] = { - .size = 0x87, - .y_offset = 0x06, + .size = MON_COORDS_SIZE(64, 56), + .y_offset = 6, }, [SPECIES_ODDISH] = { - .size = 0x66, - .y_offset = 0x08, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 8, }, [SPECIES_GLOOM] = { - .size = 0x76, - .y_offset = 0x0b, + .size = MON_COORDS_SIZE(56, 48), + .y_offset = 11, }, [SPECIES_VILEPLUME] = { - .size = 0x87, - .y_offset = 0x07, + .size = MON_COORDS_SIZE(64, 56), + .y_offset = 7, }, [SPECIES_PARAS] = { - .size = 0x63, - .y_offset = 0x14, + .size = MON_COORDS_SIZE(48, 24), + .y_offset = 20, }, [SPECIES_PARASECT] = { - .size = 0x87, - .y_offset = 0x07, + .size = MON_COORDS_SIZE(64, 56), + .y_offset = 7, }, [SPECIES_VENONAT] = { - .size = 0x77, - .y_offset = 0x06, + .size = MON_COORDS_SIZE(56, 56), + .y_offset = 6, }, [SPECIES_VENOMOTH] = { - .size = 0x77, - .y_offset = 0x04, + .size = MON_COORDS_SIZE(56, 56), + .y_offset = 4, }, [SPECIES_DIGLETT] = { - .size = 0x54, - .y_offset = 0x10, + .size = MON_COORDS_SIZE(40, 32), + .y_offset = 16, }, [SPECIES_DUGTRIO] = { - .size = 0x66, - .y_offset = 0x0b, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 11, }, [SPECIES_MEOWTH] = { - .size = 0x65, - .y_offset = 0x0c, + .size = MON_COORDS_SIZE(48, 40), + .y_offset = 12, }, [SPECIES_PERSIAN] = { - .size = 0x87, - .y_offset = 0x07, + .size = MON_COORDS_SIZE(64, 56), + .y_offset = 7, }, [SPECIES_PSYDUCK] = { - .size = 0x67, - .y_offset = 0x07, + .size = MON_COORDS_SIZE(48, 56), + .y_offset = 7, }, [SPECIES_GOLDUCK] = { - .size = 0x77, - .y_offset = 0x05, + .size = MON_COORDS_SIZE(56, 56), + .y_offset = 5, }, [SPECIES_MANKEY] = { - .size = 0x76, - .y_offset = 0x0b, + .size = MON_COORDS_SIZE(56, 48), + .y_offset = 11, }, [SPECIES_PRIMEAPE] = { - .size = 0x77, - .y_offset = 0x07, + .size = MON_COORDS_SIZE(56, 56), + .y_offset = 7, }, [SPECIES_GROWLITHE] = { - .size = 0x66, - .y_offset = 0x08, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 8, }, [SPECIES_ARCANINE] = { - .size = 0x87, - .y_offset = 0x06, + .size = MON_COORDS_SIZE(64, 56), + .y_offset = 6, }, [SPECIES_POLIWAG] = { - .size = 0x74, - .y_offset = 0x10, + .size = MON_COORDS_SIZE(56, 32), + .y_offset = 16, }, [SPECIES_POLIWHIRL] = { - .size = 0x65, - .y_offset = 0x0d, + .size = MON_COORDS_SIZE(48, 40), + .y_offset = 13, }, [SPECIES_POLIWRATH] = { - .size = 0x86, - .y_offset = 0x0a, + .size = MON_COORDS_SIZE(64, 48), + .y_offset = 10, }, [SPECIES_ABRA] = { - .size = 0x55, - .y_offset = 0x0c, + .size = MON_COORDS_SIZE(40, 40), + .y_offset = 12, }, [SPECIES_KADABRA] = { - .size = 0x86, - .y_offset = 0x09, + .size = MON_COORDS_SIZE(64, 48), + .y_offset = 9, }, [SPECIES_ALAKAZAM] = { - .size = 0x87, - .y_offset = 0x06, + .size = MON_COORDS_SIZE(64, 56), + .y_offset = 6, }, [SPECIES_MACHOP] = { - .size = 0x65, - .y_offset = 0x0c, + .size = MON_COORDS_SIZE(48, 40), + .y_offset = 12, }, [SPECIES_MACHOKE] = { - .size = 0x76, - .y_offset = 0x09, + .size = MON_COORDS_SIZE(56, 48), + .y_offset = 9, }, [SPECIES_MACHAMP] = { - .size = 0x67, - .y_offset = 0x04, + .size = MON_COORDS_SIZE(48, 56), + .y_offset = 4, }, [SPECIES_BELLSPROUT] = { - .size = 0x66, - .y_offset = 0x0a, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 10, }, [SPECIES_WEEPINBELL] = { - .size = 0x66, - .y_offset = 0x09, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 9, }, [SPECIES_VICTREEBEL] = { - .size = 0x87, - .y_offset = 0x06, + .size = MON_COORDS_SIZE(64, 56), + .y_offset = 6, }, [SPECIES_TENTACOOL] = { - .size = 0x56, - .y_offset = 0x0a, + .size = MON_COORDS_SIZE(40, 48), + .y_offset = 10, }, [SPECIES_TENTACRUEL] = { - .size = 0x86, - .y_offset = 0x0b, + .size = MON_COORDS_SIZE(64, 48), + .y_offset = 11, }, [SPECIES_GEODUDE] = { - .size = 0x66, - .y_offset = 0x0b, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 11, }, [SPECIES_GRAVELER] = { - .size = 0x75, - .y_offset = 0x0c, + .size = MON_COORDS_SIZE(56, 40), + .y_offset = 12, }, [SPECIES_GOLEM] = { - .size = 0x84, - .y_offset = 0x10, + .size = MON_COORDS_SIZE(64, 32), + .y_offset = 16, }, [SPECIES_PONYTA] = { - .size = 0x66, - .y_offset = 0x09, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 9, }, [SPECIES_RAPIDASH] = { - .size = 0x87, - .y_offset = 0x05, + .size = MON_COORDS_SIZE(64, 56), + .y_offset = 5, }, [SPECIES_SLOWPOKE] = { - .size = 0x85, - .y_offset = 0x0e, + .size = MON_COORDS_SIZE(64, 40), + .y_offset = 14, }, [SPECIES_SLOWBRO] = { - .size = 0x86, - .y_offset = 0x0a, + .size = MON_COORDS_SIZE(64, 48), + .y_offset = 10, }, [SPECIES_MAGNEMITE] = { - .size = 0x43, - .y_offset = 0x14, + .size = MON_COORDS_SIZE(32, 24), + .y_offset = 20, }, [SPECIES_MAGNETON] = { - .size = 0x66, - .y_offset = 0x0a, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 10, }, [SPECIES_FARFETCHD] = { - .size = 0x66, - .y_offset = 0x0a, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 10, }, [SPECIES_DODUO] = { - .size = 0x66, - .y_offset = 0x08, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 8, }, [SPECIES_DODRIO] = { - .size = 0x88, - .y_offset = 0x01, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 1, }, [SPECIES_SEEL] = { - .size = 0x66, - .y_offset = 0x0a, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 10, }, [SPECIES_DEWGONG] = { - .size = 0x77, - .y_offset = 0x05, + .size = MON_COORDS_SIZE(56, 56), + .y_offset = 5, }, [SPECIES_GRIMER] = { - .size = 0x75, - .y_offset = 0x0d, + .size = MON_COORDS_SIZE(56, 40), + .y_offset = 13, }, [SPECIES_MUK] = { - .size = 0x85, - .y_offset = 0x0d, + .size = MON_COORDS_SIZE(64, 40), + .y_offset = 13, }, [SPECIES_SHELLDER] = { - .size = 0x76, - .y_offset = 0x0b, + .size = MON_COORDS_SIZE(56, 48), + .y_offset = 11, }, [SPECIES_CLOYSTER] = { - .size = 0x87, - .y_offset = 0x06, + .size = MON_COORDS_SIZE(64, 56), + .y_offset = 6, }, [SPECIES_GASTLY] = { - .size = 0x85, - .y_offset = 0x0e, + .size = MON_COORDS_SIZE(64, 40), + .y_offset = 14, }, [SPECIES_HAUNTER] = { - .size = 0x76, - .y_offset = 0x09, + .size = MON_COORDS_SIZE(56, 48), + .y_offset = 9, }, [SPECIES_GENGAR] = { - .size = 0x86, - .y_offset = 0x0a, + .size = MON_COORDS_SIZE(64, 48), + .y_offset = 10, }, [SPECIES_ONIX] = { - .size = 0x78, - .y_offset = 0x00, + .size = MON_COORDS_SIZE(56, 64), + .y_offset = 0, }, [SPECIES_DROWZEE] = { - .size = 0x65, - .y_offset = 0x0d, + .size = MON_COORDS_SIZE(48, 40), + .y_offset = 13, }, [SPECIES_HYPNO] = { - .size = 0x66, - .y_offset = 0x09, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 9, }, [SPECIES_KRABBY] = { - .size = 0x66, - .y_offset = 0x0a, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 10, }, [SPECIES_KINGLER] = { - .size = 0x77, - .y_offset = 0x04, + .size = MON_COORDS_SIZE(56, 56), + .y_offset = 4, }, [SPECIES_VOLTORB] = { - .size = 0x55, - .y_offset = 0x0e, + .size = MON_COORDS_SIZE(40, 40), + .y_offset = 14, }, [SPECIES_ELECTRODE] = { - .size = 0x65, - .y_offset = 0x0d, + .size = MON_COORDS_SIZE(48, 40), + .y_offset = 13, }, [SPECIES_EXEGGCUTE] = { - .size = 0x65, - .y_offset = 0x0d, + .size = MON_COORDS_SIZE(48, 40), + .y_offset = 13, }, [SPECIES_EXEGGUTOR] = { - .size = 0x87, - .y_offset = 0x07, + .size = MON_COORDS_SIZE(64, 56), + .y_offset = 7, }, [SPECIES_CUBONE] = { - .size = 0x76, - .y_offset = 0x0a, + .size = MON_COORDS_SIZE(56, 48), + .y_offset = 10, }, [SPECIES_MAROWAK] = { - .size = 0x66, - .y_offset = 0x08, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 8, }, [SPECIES_HITMONLEE] = { - .size = 0x65, - .y_offset = 0x0c, + .size = MON_COORDS_SIZE(48, 40), + .y_offset = 12, }, [SPECIES_HITMONCHAN] = { - .size = 0x65, - .y_offset = 0x0c, + .size = MON_COORDS_SIZE(48, 40), + .y_offset = 12, }, [SPECIES_LICKITUNG] = { - .size = 0x85, - .y_offset = 0x0e, + .size = MON_COORDS_SIZE(64, 40), + .y_offset = 14, }, [SPECIES_KOFFING] = { - .size = 0x66, - .y_offset = 0x09, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 9, }, [SPECIES_WEEZING] = { - .size = 0x85, - .y_offset = 0x0c, + .size = MON_COORDS_SIZE(64, 40), + .y_offset = 12, }, [SPECIES_RHYHORN] = { - .size = 0x85, - .y_offset = 0x0c, + .size = MON_COORDS_SIZE(64, 40), + .y_offset = 12, }, [SPECIES_RHYDON] = { - .size = 0x88, - .y_offset = 0x03, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 3, }, [SPECIES_CHANSEY] = { - .size = 0x85, - .y_offset = 0x0e, + .size = MON_COORDS_SIZE(64, 40), + .y_offset = 14, }, [SPECIES_TANGELA] = { - .size = 0x85, - .y_offset = 0x0e, + .size = MON_COORDS_SIZE(64, 40), + .y_offset = 14, }, [SPECIES_KANGASKHAN] = { - .size = 0x77, - .y_offset = 0x05, + .size = MON_COORDS_SIZE(56, 56), + .y_offset = 5, }, [SPECIES_HORSEA] = { - .size = 0x66, - .y_offset = 0x09, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 9, }, [SPECIES_SEADRA] = { - .size = 0x66, - .y_offset = 0x08, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 8, }, [SPECIES_GOLDEEN] = { - .size = 0x66, - .y_offset = 0x08, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 8, }, [SPECIES_SEAKING] = { - .size = 0x76, - .y_offset = 0x0b, + .size = MON_COORDS_SIZE(56, 48), + .y_offset = 11, }, [SPECIES_STARYU] = { - .size = 0x75, - .y_offset = 0x0d, + .size = MON_COORDS_SIZE(56, 40), + .y_offset = 13, }, [SPECIES_STARMIE] = { - .size = 0x85, - .y_offset = 0x0e, + .size = MON_COORDS_SIZE(64, 40), + .y_offset = 14, }, [SPECIES_MR_MIME] = { - .size = 0x85, - .y_offset = 0x0d, + .size = MON_COORDS_SIZE(64, 40), + .y_offset = 13, }, [SPECIES_SCYTHER] = { - .size = 0x87, - .y_offset = 0x04, + .size = MON_COORDS_SIZE(64, 56), + .y_offset = 4, }, [SPECIES_JYNX] = { - .size = 0x85, - .y_offset = 0x0d, + .size = MON_COORDS_SIZE(64, 40), + .y_offset = 13, }, [SPECIES_ELECTABUZZ] = { - .size = 0x66, - .y_offset = 0x08, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 8, }, [SPECIES_MAGMAR] = { - .size = 0x77, - .y_offset = 0x07, + .size = MON_COORDS_SIZE(56, 56), + .y_offset = 7, }, [SPECIES_PINSIR] = { - .size = 0x66, - .y_offset = 0x09, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 9, }, [SPECIES_TAUROS] = { - .size = 0x85, - .y_offset = 0x0d, + .size = MON_COORDS_SIZE(64, 40), + .y_offset = 13, }, [SPECIES_MAGIKARP] = { - .size = 0x76, - .y_offset = 0x09, + .size = MON_COORDS_SIZE(56, 48), + .y_offset = 9, }, [SPECIES_GYARADOS] = { - .size = 0x88, - .y_offset = 0x00, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 0, }, [SPECIES_LAPRAS] = { - .size = 0x77, - .y_offset = 0x04, + .size = MON_COORDS_SIZE(56, 56), + .y_offset = 4, }, [SPECIES_DITTO] = { - .size = 0x54, - .y_offset = 0x11, + .size = MON_COORDS_SIZE(40, 32), + .y_offset = 17, }, [SPECIES_EEVEE] = { - .size = 0x66, - .y_offset = 0x0a, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 10, }, [SPECIES_VAPOREON] = { - .size = 0x66, - .y_offset = 0x0a, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 10, }, [SPECIES_JOLTEON] = { - .size = 0x87, - .y_offset = 0x06, + .size = MON_COORDS_SIZE(64, 56), + .y_offset = 6, }, [SPECIES_FLAREON] = { - .size = 0x67, - .y_offset = 0x05, + .size = MON_COORDS_SIZE(48, 56), + .y_offset = 5, }, [SPECIES_PORYGON] = { - .size = 0x65, - .y_offset = 0x0d, + .size = MON_COORDS_SIZE(48, 40), + .y_offset = 13, }, [SPECIES_OMANYTE] = { - .size = 0x66, - .y_offset = 0x0a, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 10, }, [SPECIES_OMASTAR] = { - .size = 0x66, - .y_offset = 0x08, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 8, }, [SPECIES_KABUTO] = { - .size = 0x65, - .y_offset = 0x0d, + .size = MON_COORDS_SIZE(48, 40), + .y_offset = 13, }, [SPECIES_KABUTOPS] = { - .size = 0x77, - .y_offset = 0x05, + .size = MON_COORDS_SIZE(56, 56), + .y_offset = 5, }, [SPECIES_AERODACTYL] = { - .size = 0x86, - .y_offset = 0x08, + .size = MON_COORDS_SIZE(64, 48), + .y_offset = 8, }, [SPECIES_SNORLAX] = { - .size = 0x86, - .y_offset = 0x0b, + .size = MON_COORDS_SIZE(64, 48), + .y_offset = 11, }, [SPECIES_ARTICUNO] = { - .size = 0x65, - .y_offset = 0x0c, + .size = MON_COORDS_SIZE(48, 40), + .y_offset = 12, }, [SPECIES_ZAPDOS] = { - .size = 0x76, - .y_offset = 0x0b, + .size = MON_COORDS_SIZE(56, 48), + .y_offset = 11, }, [SPECIES_MOLTRES] = { - .size = 0x87, - .y_offset = 0x04, + .size = MON_COORDS_SIZE(64, 56), + .y_offset = 4, }, [SPECIES_DRATINI] = { - .size = 0x66, - .y_offset = 0x09, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 9, }, [SPECIES_DRAGONAIR] = { - .size = 0x78, - .y_offset = 0x00, + .size = MON_COORDS_SIZE(56, 64), + .y_offset = 0, }, [SPECIES_DRAGONITE] = { - .size = 0x87, - .y_offset = 0x06, + .size = MON_COORDS_SIZE(64, 56), + .y_offset = 6, }, [SPECIES_MEWTWO] = { - .size = 0x78, - .y_offset = 0x01, + .size = MON_COORDS_SIZE(56, 64), + .y_offset = 1, }, [SPECIES_MEW] = { - .size = 0x88, - .y_offset = 0x01, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 1, }, [SPECIES_CHIKORITA] = { - .size = 0x56, - .y_offset = 0x0a, + .size = MON_COORDS_SIZE(40, 48), + .y_offset = 10, }, [SPECIES_BAYLEEF] = { - .size = 0x66, - .y_offset = 0x08, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 8, }, [SPECIES_MEGANIUM] = { - .size = 0x78, - .y_offset = 0x00, + .size = MON_COORDS_SIZE(56, 64), + .y_offset = 0, }, [SPECIES_CYNDAQUIL] = { - .size = 0x76, - .y_offset = 0x09, + .size = MON_COORDS_SIZE(56, 48), + .y_offset = 9, }, [SPECIES_QUILAVA] = { - .size = 0x87, - .y_offset = 0x04, + .size = MON_COORDS_SIZE(64, 56), + .y_offset = 4, }, [SPECIES_TYPHLOSION] = { - .size = 0x87, - .y_offset = 0x04, + .size = MON_COORDS_SIZE(64, 56), + .y_offset = 4, }, [SPECIES_TOTODILE] = { - .size = 0x66, - .y_offset = 0x0b, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 11, }, [SPECIES_CROCONAW] = { - .size = 0x67, - .y_offset = 0x07, + .size = MON_COORDS_SIZE(48, 56), + .y_offset = 7, }, [SPECIES_FERALIGATR] = { - .size = 0x88, - .y_offset = 0x01, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 1, }, [SPECIES_SENTRET] = { - .size = 0x67, - .y_offset = 0x05, + .size = MON_COORDS_SIZE(48, 56), + .y_offset = 5, }, [SPECIES_FURRET] = { - .size = 0x66, - .y_offset = 0x08, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 8, }, [SPECIES_HOOTHOOT] = { - .size = 0x66, - .y_offset = 0x08, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 8, }, [SPECIES_NOCTOWL] = { - .size = 0x68, - .y_offset = 0x03, + .size = MON_COORDS_SIZE(48, 64), + .y_offset = 3, }, [SPECIES_LEDYBA] = { - .size = 0x76, - .y_offset = 0x0b, + .size = MON_COORDS_SIZE(56, 48), + .y_offset = 11, }, [SPECIES_LEDIAN] = { - .size = 0x77, - .y_offset = 0x07, + .size = MON_COORDS_SIZE(56, 56), + .y_offset = 7, }, [SPECIES_SPINARAK] = { - .size = 0x73, - .y_offset = 0x15, + .size = MON_COORDS_SIZE(56, 24), + .y_offset = 21, }, [SPECIES_ARIADOS] = { - .size = 0x86, - .y_offset = 0x0b, + .size = MON_COORDS_SIZE(64, 48), + .y_offset = 11, }, [SPECIES_CROBAT] = { - .size = 0x87, - .y_offset = 0x05, + .size = MON_COORDS_SIZE(64, 56), + .y_offset = 5, }, [SPECIES_CHINCHOU] = { - .size = 0x86, - .y_offset = 0x08, + .size = MON_COORDS_SIZE(64, 48), + .y_offset = 8, }, [SPECIES_LANTURN] = { - .size = 0x86, - .y_offset = 0x08, + .size = MON_COORDS_SIZE(64, 48), + .y_offset = 8, }, [SPECIES_PICHU] = { - .size = 0x66, - .y_offset = 0x0b, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 11, }, [SPECIES_CLEFFA] = { - .size = 0x65, - .y_offset = 0x0f, + .size = MON_COORDS_SIZE(48, 40), + .y_offset = 15, }, [SPECIES_IGGLYBUFF] = { - .size = 0x66, - .y_offset = 0x0b, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 11, }, [SPECIES_TOGEPI] = { - .size = 0x54, - .y_offset = 0x10, + .size = MON_COORDS_SIZE(40, 32), + .y_offset = 16, }, [SPECIES_TOGETIC] = { - .size = 0x66, - .y_offset = 0x08, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 8, }, [SPECIES_NATU] = { - .size = 0x54, - .y_offset = 0x11, + .size = MON_COORDS_SIZE(40, 32), + .y_offset = 17, }, [SPECIES_XATU] = { - .size = 0x76, - .y_offset = 0x08, + .size = MON_COORDS_SIZE(56, 48), + .y_offset = 8, }, [SPECIES_MAREEP] = { - .size = 0x66, - .y_offset = 0x09, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 9, }, [SPECIES_FLAAFFY] = { - .size = 0x66, - .y_offset = 0x09, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 9, }, [SPECIES_AMPHAROS] = { - .size = 0x88, - .y_offset = 0x01, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 1, }, [SPECIES_BELLOSSOM] = { - .size = 0x66, - .y_offset = 0x0b, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 11, }, [SPECIES_MARILL] = { - .size = 0x75, - .y_offset = 0x0c, + .size = MON_COORDS_SIZE(56, 40), + .y_offset = 12, }, [SPECIES_AZUMARILL] = { - .size = 0x86, - .y_offset = 0x08, + .size = MON_COORDS_SIZE(64, 48), + .y_offset = 8, }, [SPECIES_SUDOWOODO] = { - .size = 0x66, - .y_offset = 0x08, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 8, }, [SPECIES_POLITOED] = { - .size = 0x66, - .y_offset = 0x09, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 9, }, [SPECIES_HOPPIP] = { - .size = 0x66, - .y_offset = 0x0b, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 11, }, [SPECIES_SKIPLOOM] = { - .size = 0x65, - .y_offset = 0x0d, + .size = MON_COORDS_SIZE(48, 40), + .y_offset = 13, }, [SPECIES_JUMPLUFF] = { - .size = 0x87, - .y_offset = 0x04, + .size = MON_COORDS_SIZE(64, 56), + .y_offset = 4, }, [SPECIES_AIPOM] = { - .size = 0x66, - .y_offset = 0x09, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 9, }, [SPECIES_SUNKERN] = { - .size = 0x56, - .y_offset = 0x0a, + .size = MON_COORDS_SIZE(40, 48), + .y_offset = 10, }, [SPECIES_SUNFLORA] = { - .size = 0x66, - .y_offset = 0x08, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 8, }, [SPECIES_YANMA] = { - .size = 0x77, - .y_offset = 0x04, + .size = MON_COORDS_SIZE(56, 56), + .y_offset = 4, }, [SPECIES_WOOPER] = { - .size = 0x85, - .y_offset = 0x0f, + .size = MON_COORDS_SIZE(64, 40), + .y_offset = 15, }, [SPECIES_QUAGSIRE] = { - .size = 0x76, - .y_offset = 0x08, + .size = MON_COORDS_SIZE(56, 48), + .y_offset = 8, }, [SPECIES_ESPEON] = { - .size = 0x76, - .y_offset = 0x0b, + .size = MON_COORDS_SIZE(56, 48), + .y_offset = 11, }, [SPECIES_UMBREON] = { - .size = 0x87, - .y_offset = 0x04, + .size = MON_COORDS_SIZE(64, 56), + .y_offset = 4, }, [SPECIES_MURKROW] = { - .size = 0x66, - .y_offset = 0x09, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 9, }, [SPECIES_SLOWKING] = { - .size = 0x66, - .y_offset = 0x08, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 8, }, [SPECIES_MISDREAVUS] = { - .size = 0x66, - .y_offset = 0x0a, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 10, }, [SPECIES_UNOWN] = { - .size = 0x36, - .y_offset = 0x08, + .size = MON_COORDS_SIZE(24, 48), + .y_offset = 8, }, [SPECIES_WOBBUFFET] = { - .size = 0x75, - .y_offset = 0x0c, + .size = MON_COORDS_SIZE(56, 40), + .y_offset = 12, }, [SPECIES_GIRAFARIG] = { - .size = 0x87, - .y_offset = 0x05, + .size = MON_COORDS_SIZE(64, 56), + .y_offset = 5, }, [SPECIES_PINECO] = { - .size = 0x65, - .y_offset = 0x0f, + .size = MON_COORDS_SIZE(48, 40), + .y_offset = 15, }, [SPECIES_FORRETRESS] = { - .size = 0x84, - .y_offset = 0x10, + .size = MON_COORDS_SIZE(64, 32), + .y_offset = 16, }, [SPECIES_DUNSPARCE] = { - .size = 0x85, - .y_offset = 0x0f, + .size = MON_COORDS_SIZE(64, 40), + .y_offset = 15, }, [SPECIES_GLIGAR] = { - .size = 0x87, - .y_offset = 0x05, + .size = MON_COORDS_SIZE(64, 56), + .y_offset = 5, }, [SPECIES_STEELIX] = { - .size = 0x88, - .y_offset = 0x00, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 0, }, [SPECIES_SNUBBULL] = { - .size = 0x76, - .y_offset = 0x0a, + .size = MON_COORDS_SIZE(56, 48), + .y_offset = 10, }, [SPECIES_GRANBULL] = { - .size = 0x87, - .y_offset = 0x05, + .size = MON_COORDS_SIZE(64, 56), + .y_offset = 5, }, [SPECIES_QWILFISH] = { - .size = 0x77, - .y_offset = 0x07, + .size = MON_COORDS_SIZE(56, 56), + .y_offset = 7, }, [SPECIES_SCIZOR] = { - .size = 0x77, - .y_offset = 0x04, + .size = MON_COORDS_SIZE(56, 56), + .y_offset = 4, }, [SPECIES_SHUCKLE] = { - .size = 0x56, - .y_offset = 0x0b, + .size = MON_COORDS_SIZE(40, 48), + .y_offset = 11, }, [SPECIES_HERACROSS] = { - .size = 0x77, - .y_offset = 0x04, + .size = MON_COORDS_SIZE(56, 56), + .y_offset = 4, }, [SPECIES_SNEASEL] = { - .size = 0x66, - .y_offset = 0x08, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 8, }, [SPECIES_TEDDIURSA] = { - .size = 0x66, - .y_offset = 0x08, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 8, }, [SPECIES_URSARING] = { - .size = 0x88, - .y_offset = 0x03, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 3, }, [SPECIES_SLUGMA] = { - .size = 0x66, - .y_offset = 0x08, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 8, }, [SPECIES_MAGCARGO] = { - .size = 0x76, - .y_offset = 0x09, + .size = MON_COORDS_SIZE(56, 48), + .y_offset = 9, }, [SPECIES_SWINUB] = { - .size = 0x63, - .y_offset = 0x15, + .size = MON_COORDS_SIZE(48, 24), + .y_offset = 21, }, [SPECIES_PILOSWINE] = { - .size = 0x75, - .y_offset = 0x0d, + .size = MON_COORDS_SIZE(56, 40), + .y_offset = 13, }, [SPECIES_CORSOLA] = { - .size = 0x65, - .y_offset = 0x0c, + .size = MON_COORDS_SIZE(48, 40), + .y_offset = 12, }, [SPECIES_REMORAID] = { - .size = 0x75, - .y_offset = 0x0d, + .size = MON_COORDS_SIZE(56, 40), + .y_offset = 13, }, [SPECIES_OCTILLERY] = { - .size = 0x66, - .y_offset = 0x0a, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 10, }, [SPECIES_DELIBIRD] = { - .size = 0x67, - .y_offset = 0x06, + .size = MON_COORDS_SIZE(48, 56), + .y_offset = 6, }, [SPECIES_MANTINE] = { - .size = 0x87, - .y_offset = 0x07, + .size = MON_COORDS_SIZE(64, 56), + .y_offset = 7, }, [SPECIES_SKARMORY] = { - .size = 0x87, - .y_offset = 0x04, + .size = MON_COORDS_SIZE(64, 56), + .y_offset = 4, }, [SPECIES_HOUNDOUR] = { - .size = 0x55, - .y_offset = 0x0c, + .size = MON_COORDS_SIZE(40, 40), + .y_offset = 12, }, [SPECIES_HOUNDOOM] = { - .size = 0x87, - .y_offset = 0x07, + .size = MON_COORDS_SIZE(64, 56), + .y_offset = 7, }, [SPECIES_KINGDRA] = { - .size = 0x87, - .y_offset = 0x06, + .size = MON_COORDS_SIZE(64, 56), + .y_offset = 6, }, [SPECIES_PHANPY] = { - .size = 0x65, - .y_offset = 0x0e, + .size = MON_COORDS_SIZE(48, 40), + .y_offset = 14, }, [SPECIES_DONPHAN] = { - .size = 0x85, - .y_offset = 0x0d, + .size = MON_COORDS_SIZE(64, 40), + .y_offset = 13, }, [SPECIES_PORYGON2] = { - .size = 0x76, - .y_offset = 0x0a, + .size = MON_COORDS_SIZE(56, 48), + .y_offset = 10, }, [SPECIES_STANTLER] = { - .size = 0x78, - .y_offset = 0x03, + .size = MON_COORDS_SIZE(56, 64), + .y_offset = 3, }, [SPECIES_SMEARGLE] = { - .size = 0x76, - .y_offset = 0x0a, + .size = MON_COORDS_SIZE(56, 48), + .y_offset = 10, }, [SPECIES_TYROGUE] = { - .size = 0x66, - .y_offset = 0x08, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 8, }, [SPECIES_HITMONTOP] = { - .size = 0x87, - .y_offset = 0x05, + .size = MON_COORDS_SIZE(64, 56), + .y_offset = 5, }, [SPECIES_SMOOCHUM] = { - .size = 0x56, - .y_offset = 0x09, + .size = MON_COORDS_SIZE(40, 48), + .y_offset = 9, }, [SPECIES_ELEKID] = { - .size = 0x66, - .y_offset = 0x08, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 8, }, [SPECIES_MAGBY] = { - .size = 0x66, - .y_offset = 0x0b, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 11, }, [SPECIES_MILTANK] = { - .size = 0x87, - .y_offset = 0x07, + .size = MON_COORDS_SIZE(64, 56), + .y_offset = 7, }, [SPECIES_BLISSEY] = { - .size = 0x85, - .y_offset = 0x0d, + .size = MON_COORDS_SIZE(64, 40), + .y_offset = 13, }, [SPECIES_RAIKOU] = { - .size = 0x86, - .y_offset = 0x0a, + .size = MON_COORDS_SIZE(64, 48), + .y_offset = 10, }, [SPECIES_ENTEI] = { - .size = 0x87, - .y_offset = 0x06, + .size = MON_COORDS_SIZE(64, 56), + .y_offset = 6, }, [SPECIES_SUICUNE] = { - .size = 0x88, - .y_offset = 0x03, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 3, }, [SPECIES_LARVITAR] = { - .size = 0x66, - .y_offset = 0x08, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 8, }, [SPECIES_PUPITAR] = { - .size = 0x67, - .y_offset = 0x05, + .size = MON_COORDS_SIZE(48, 56), + .y_offset = 5, }, [SPECIES_TYRANITAR] = { - .size = 0x88, - .y_offset = 0x00, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 0, }, [SPECIES_LUGIA] = { - .size = 0x88, - .y_offset = 0x01, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 1, }, [SPECIES_HO_OH] = { - .size = 0x88, - .y_offset = 0x01, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 1, }, [SPECIES_CELEBI] = { - .size = 0x66, - .y_offset = 0x08, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 8, }, [SPECIES_OLD_UNOWN_B] = { - .size = 0x88, - .y_offset = 0x01, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 1, }, [SPECIES_OLD_UNOWN_C] = { - .size = 0x88, - .y_offset = 0x01, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 1, }, [SPECIES_OLD_UNOWN_D] = { - .size = 0x88, - .y_offset = 0x01, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 1, }, [SPECIES_OLD_UNOWN_E] = { - .size = 0x88, - .y_offset = 0x01, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 1, }, [SPECIES_OLD_UNOWN_F] = { - .size = 0x88, - .y_offset = 0x01, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 1, }, [SPECIES_OLD_UNOWN_G] = { - .size = 0x88, - .y_offset = 0x01, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 1, }, [SPECIES_OLD_UNOWN_H] = { - .size = 0x88, - .y_offset = 0x01, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 1, }, [SPECIES_OLD_UNOWN_I] = { - .size = 0x88, - .y_offset = 0x01, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 1, }, [SPECIES_OLD_UNOWN_J] = { - .size = 0x88, - .y_offset = 0x01, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 1, }, [SPECIES_OLD_UNOWN_K] = { - .size = 0x88, - .y_offset = 0x01, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 1, }, [SPECIES_OLD_UNOWN_L] = { - .size = 0x88, - .y_offset = 0x01, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 1, }, [SPECIES_OLD_UNOWN_M] = { - .size = 0x88, - .y_offset = 0x01, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 1, }, [SPECIES_OLD_UNOWN_N] = { - .size = 0x88, - .y_offset = 0x01, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 1, }, [SPECIES_OLD_UNOWN_O] = { - .size = 0x88, - .y_offset = 0x01, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 1, }, [SPECIES_OLD_UNOWN_P] = { - .size = 0x88, - .y_offset = 0x01, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 1, }, [SPECIES_OLD_UNOWN_Q] = { - .size = 0x88, - .y_offset = 0x01, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 1, }, [SPECIES_OLD_UNOWN_R] = { - .size = 0x88, - .y_offset = 0x01, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 1, }, [SPECIES_OLD_UNOWN_S] = { - .size = 0x88, - .y_offset = 0x01, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 1, }, [SPECIES_OLD_UNOWN_T] = { - .size = 0x88, - .y_offset = 0x01, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 1, }, [SPECIES_OLD_UNOWN_U] = { - .size = 0x88, - .y_offset = 0x01, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 1, }, [SPECIES_OLD_UNOWN_V] = { - .size = 0x88, - .y_offset = 0x01, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 1, }, [SPECIES_OLD_UNOWN_W] = { - .size = 0x88, - .y_offset = 0x01, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 1, }, [SPECIES_OLD_UNOWN_X] = { - .size = 0x88, - .y_offset = 0x01, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 1, }, [SPECIES_OLD_UNOWN_Y] = { - .size = 0x88, - .y_offset = 0x01, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 1, }, [SPECIES_OLD_UNOWN_Z] = { - .size = 0x88, - .y_offset = 0x01, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 1, }, [SPECIES_TREECKO] = { - .size = 0x87, - .y_offset = 0x06, + .size = MON_COORDS_SIZE(64, 56), + .y_offset = 6, }, [SPECIES_GROVYLE] = { - .size = 0x86, - .y_offset = 0x08, + .size = MON_COORDS_SIZE(64, 48), + .y_offset = 8, }, [SPECIES_SCEPTILE] = { - .size = 0x88, - .y_offset = 0x01, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 1, }, [SPECIES_TORCHIC] = { - .size = 0x67, - .y_offset = 0x05, + .size = MON_COORDS_SIZE(48, 56), + .y_offset = 5, }, [SPECIES_COMBUSKEN] = { - .size = 0x88, - .y_offset = 0x00, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 0, }, [SPECIES_BLAZIKEN] = { - .size = 0x88, - .y_offset = 0x00, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 0, }, [SPECIES_MUDKIP] = { - .size = 0x77, - .y_offset = 0x05, + .size = MON_COORDS_SIZE(56, 56), + .y_offset = 5, }, [SPECIES_MARSHTOMP] = { - .size = 0x87, - .y_offset = 0x04, + .size = MON_COORDS_SIZE(64, 56), + .y_offset = 4, }, [SPECIES_SWAMPERT] = { - .size = 0x87, - .y_offset = 0x05, + .size = MON_COORDS_SIZE(64, 56), + .y_offset = 5, }, [SPECIES_POOCHYENA] = { - .size = 0x76, - .y_offset = 0x09, + .size = MON_COORDS_SIZE(56, 48), + .y_offset = 9, }, [SPECIES_MIGHTYENA] = { - .size = 0x87, - .y_offset = 0x04, + .size = MON_COORDS_SIZE(64, 56), + .y_offset = 4, }, [SPECIES_ZIGZAGOON] = { - .size = 0x76, - .y_offset = 0x0b, + .size = MON_COORDS_SIZE(56, 48), + .y_offset = 11, }, [SPECIES_LINOONE] = { - .size = 0x85, - .y_offset = 0x0f, + .size = MON_COORDS_SIZE(64, 40), + .y_offset = 15, }, [SPECIES_WURMPLE] = { - .size = 0x76, - .y_offset = 0x0b, + .size = MON_COORDS_SIZE(56, 48), + .y_offset = 11, }, [SPECIES_SILCOON] = { - .size = 0x83, - .y_offset = 0x15, + .size = MON_COORDS_SIZE(64, 24), + .y_offset = 21, }, [SPECIES_BEAUTIFLY] = { - .size = 0x88, - .y_offset = 0x00, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 0, }, [SPECIES_CASCOON] = { - .size = 0x73, - .y_offset = 0x14, + .size = MON_COORDS_SIZE(56, 24), + .y_offset = 20, }, [SPECIES_DUSTOX] = { - .size = 0x83, - .y_offset = 0x14, + .size = MON_COORDS_SIZE(64, 24), + .y_offset = 20, }, [SPECIES_LOTAD] = { - .size = 0x75, - .y_offset = 0x0f, + .size = MON_COORDS_SIZE(56, 40), + .y_offset = 15, }, [SPECIES_LOMBRE] = { - .size = 0x86, - .y_offset = 0x08, + .size = MON_COORDS_SIZE(64, 48), + .y_offset = 8, }, [SPECIES_LUDICOLO] = { - .size = 0x86, - .y_offset = 0x0a, + .size = MON_COORDS_SIZE(64, 48), + .y_offset = 10, }, [SPECIES_SEEDOT] = { - .size = 0x86, - .y_offset = 0x09, + .size = MON_COORDS_SIZE(64, 48), + .y_offset = 9, }, [SPECIES_NUZLEAF] = { - .size = 0x76, - .y_offset = 0x0a, + .size = MON_COORDS_SIZE(56, 48), + .y_offset = 10, }, [SPECIES_SHIFTRY] = { - .size = 0x86, - .y_offset = 0x08, + .size = MON_COORDS_SIZE(64, 48), + .y_offset = 8, }, [SPECIES_NINCADA] = { - .size = 0x83, - .y_offset = 0x14, + .size = MON_COORDS_SIZE(64, 24), + .y_offset = 20, }, [SPECIES_NINJASK] = { - .size = 0x86, - .y_offset = 0x08, + .size = MON_COORDS_SIZE(64, 48), + .y_offset = 8, }, [SPECIES_SHEDINJA] = { - .size = 0x77, - .y_offset = 0x06, + .size = MON_COORDS_SIZE(56, 56), + .y_offset = 6, }, [SPECIES_TAILLOW] = { - .size = 0x64, - .y_offset = 0x11, + .size = MON_COORDS_SIZE(48, 32), + .y_offset = 17, }, [SPECIES_SWELLOW] = { - .size = 0x86, - .y_offset = 0x08, + .size = MON_COORDS_SIZE(64, 48), + .y_offset = 8, }, [SPECIES_SHROOMISH] = { - .size = 0x85, - .y_offset = 0x0d, + .size = MON_COORDS_SIZE(64, 40), + .y_offset = 13, }, [SPECIES_BRELOOM] = { - .size = 0x87, - .y_offset = 0x04, + .size = MON_COORDS_SIZE(64, 56), + .y_offset = 4, }, [SPECIES_SPINDA] = { - .size = 0x77, - .y_offset = 0x04, + .size = MON_COORDS_SIZE(56, 56), + .y_offset = 4, }, [SPECIES_WINGULL] = { - .size = 0x85, - .y_offset = 0x0e, + .size = MON_COORDS_SIZE(64, 40), + .y_offset = 14, }, [SPECIES_PELIPPER] = { - .size = 0x87, - .y_offset = 0x06, + .size = MON_COORDS_SIZE(64, 56), + .y_offset = 6, }, [SPECIES_SURSKIT] = { - .size = 0x86, - .y_offset = 0x0b, + .size = MON_COORDS_SIZE(64, 48), + .y_offset = 11, }, [SPECIES_MASQUERAIN] = { - .size = 0x88, - .y_offset = 0x00, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 0, }, [SPECIES_WAILMER] = { - .size = 0x83, - .y_offset = 0x15, + .size = MON_COORDS_SIZE(64, 24), + .y_offset = 21, }, [SPECIES_WAILORD] = { - .size = 0x83, - .y_offset = 0x16, + .size = MON_COORDS_SIZE(64, 24), + .y_offset = 22, }, [SPECIES_SKITTY] = { - .size = 0x86, - .y_offset = 0x0a, + .size = MON_COORDS_SIZE(64, 48), + .y_offset = 10, }, [SPECIES_DELCATTY] = { - .size = 0x86, - .y_offset = 0x08, + .size = MON_COORDS_SIZE(64, 48), + .y_offset = 8, }, [SPECIES_KECLEON] = { - .size = 0x87, - .y_offset = 0x06, + .size = MON_COORDS_SIZE(64, 56), + .y_offset = 6, }, [SPECIES_BALTOY] = { - .size = 0x86, - .y_offset = 0x08, + .size = MON_COORDS_SIZE(64, 48), + .y_offset = 8, }, [SPECIES_CLAYDOL] = { - .size = 0x87, - .y_offset = 0x07, + .size = MON_COORDS_SIZE(64, 56), + .y_offset = 7, }, [SPECIES_NOSEPASS] = { - .size = 0x85, - .y_offset = 0x0c, + .size = MON_COORDS_SIZE(64, 40), + .y_offset = 12, }, [SPECIES_TORKOAL] = { - .size = 0x86, - .y_offset = 0x0a, + .size = MON_COORDS_SIZE(64, 48), + .y_offset = 10, }, [SPECIES_SABLEYE] = { - .size = 0x76, - .y_offset = 0x08, + .size = MON_COORDS_SIZE(56, 48), + .y_offset = 8, }, [SPECIES_BARBOACH] = { - .size = 0x66, - .y_offset = 0x0a, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 10, }, [SPECIES_WHISCASH] = { - .size = 0x86, - .y_offset = 0x0a, + .size = MON_COORDS_SIZE(64, 48), + .y_offset = 10, }, [SPECIES_LUVDISC] = { - .size = 0x46, - .y_offset = 0x0a, + .size = MON_COORDS_SIZE(32, 48), + .y_offset = 10, }, [SPECIES_CORPHISH] = { - .size = 0x77, - .y_offset = 0x07, + .size = MON_COORDS_SIZE(56, 56), + .y_offset = 7, }, [SPECIES_CRAWDAUNT] = { - .size = 0x87, - .y_offset = 0x05, + .size = MON_COORDS_SIZE(64, 56), + .y_offset = 5, }, [SPECIES_FEEBAS] = { - .size = 0x67, - .y_offset = 0x07, + .size = MON_COORDS_SIZE(48, 56), + .y_offset = 7, }, [SPECIES_MILOTIC] = { - .size = 0x68, - .y_offset = 0x02, + .size = MON_COORDS_SIZE(48, 64), + .y_offset = 2, }, [SPECIES_CARVANHA] = { - .size = 0x87, - .y_offset = 0x07, + .size = MON_COORDS_SIZE(64, 56), + .y_offset = 7, }, [SPECIES_SHARPEDO] = { - .size = 0x88, - .y_offset = 0x02, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 2, }, [SPECIES_TRAPINCH] = { - .size = 0x75, - .y_offset = 0x0e, + .size = MON_COORDS_SIZE(56, 40), + .y_offset = 14, }, [SPECIES_VIBRAVA] = { - .size = 0x74, - .y_offset = 0x11, + .size = MON_COORDS_SIZE(56, 32), + .y_offset = 17, }, [SPECIES_FLYGON] = { - .size = 0x88, - .y_offset = 0x02, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 2, }, [SPECIES_MAKUHITA] = { - .size = 0x76, - .y_offset = 0x0b, + .size = MON_COORDS_SIZE(56, 48), + .y_offset = 11, }, [SPECIES_HARIYAMA] = { - .size = 0x87, - .y_offset = 0x07, + .size = MON_COORDS_SIZE(64, 56), + .y_offset = 7, }, [SPECIES_ELECTRIKE] = { - .size = 0x84, - .y_offset = 0x10, + .size = MON_COORDS_SIZE(64, 32), + .y_offset = 16, }, [SPECIES_MANECTRIC] = { - .size = 0x87, - .y_offset = 0x04, + .size = MON_COORDS_SIZE(64, 56), + .y_offset = 4, }, [SPECIES_NUMEL] = { - .size = 0x86, - .y_offset = 0x0b, + .size = MON_COORDS_SIZE(64, 48), + .y_offset = 11, }, [SPECIES_CAMERUPT] = { - .size = 0x84, - .y_offset = 0x13, + .size = MON_COORDS_SIZE(64, 32), + .y_offset = 19, }, [SPECIES_SPHEAL] = { - .size = 0x64, - .y_offset = 0x12, + .size = MON_COORDS_SIZE(48, 32), + .y_offset = 18, }, [SPECIES_SEALEO] = { - .size = 0x86, - .y_offset = 0x0a, + .size = MON_COORDS_SIZE(64, 48), + .y_offset = 10, }, [SPECIES_WALREIN] = { - .size = 0x87, - .y_offset = 0x06, + .size = MON_COORDS_SIZE(64, 56), + .y_offset = 6, }, [SPECIES_CACNEA] = { - .size = 0x85, - .y_offset = 0x0f, + .size = MON_COORDS_SIZE(64, 40), + .y_offset = 15, }, [SPECIES_CACTURNE] = { - .size = 0x87, - .y_offset = 0x07, + .size = MON_COORDS_SIZE(64, 56), + .y_offset = 7, }, [SPECIES_SNORUNT] = { - .size = 0x76, - .y_offset = 0x0a, + .size = MON_COORDS_SIZE(56, 48), + .y_offset = 10, }, [SPECIES_GLALIE] = { - .size = 0x85, - .y_offset = 0x0c, + .size = MON_COORDS_SIZE(64, 40), + .y_offset = 12, }, [SPECIES_LUNATONE] = { - .size = 0x87, - .y_offset = 0x05, + .size = MON_COORDS_SIZE(64, 56), + .y_offset = 5, }, [SPECIES_SOLROCK] = { - .size = 0x87, - .y_offset = 0x05, + .size = MON_COORDS_SIZE(64, 56), + .y_offset = 5, }, [SPECIES_AZURILL] = { - .size = 0x86, - .y_offset = 0x0a, + .size = MON_COORDS_SIZE(64, 48), + .y_offset = 10, }, [SPECIES_SPOINK] = { - .size = 0x56, - .y_offset = 0x0b, + .size = MON_COORDS_SIZE(40, 48), + .y_offset = 11, }, [SPECIES_GRUMPIG] = { - .size = 0x87, - .y_offset = 0x04, + .size = MON_COORDS_SIZE(64, 56), + .y_offset = 4, }, [SPECIES_PLUSLE] = { - .size = 0x76, - .y_offset = 0x08, + .size = MON_COORDS_SIZE(56, 48), + .y_offset = 8, }, [SPECIES_MINUN] = { - .size = 0x76, - .y_offset = 0x08, + .size = MON_COORDS_SIZE(56, 48), + .y_offset = 8, }, [SPECIES_MAWILE] = { - .size = 0x87, - .y_offset = 0x04, + .size = MON_COORDS_SIZE(64, 56), + .y_offset = 4, }, [SPECIES_MEDITITE] = { - .size = 0x76, - .y_offset = 0x0b, + .size = MON_COORDS_SIZE(56, 48), + .y_offset = 11, }, [SPECIES_MEDICHAM] = { - .size = 0x68, - .y_offset = 0x03, + .size = MON_COORDS_SIZE(48, 64), + .y_offset = 3, }, [SPECIES_SWABLU] = { - .size = 0x86, - .y_offset = 0x09, + .size = MON_COORDS_SIZE(64, 48), + .y_offset = 9, }, [SPECIES_ALTARIA] = { - .size = 0x87, - .y_offset = 0x06, + .size = MON_COORDS_SIZE(64, 56), + .y_offset = 6, }, [SPECIES_WYNAUT] = { - .size = 0x77, - .y_offset = 0x07, + .size = MON_COORDS_SIZE(56, 56), + .y_offset = 7, }, [SPECIES_DUSKULL] = { - .size = 0x66, - .y_offset = 0x0b, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 11, }, [SPECIES_DUSCLOPS] = { - .size = 0x86, - .y_offset = 0x08, + .size = MON_COORDS_SIZE(64, 48), + .y_offset = 8, }, [SPECIES_ROSELIA] = { - .size = 0x86, - .y_offset = 0x08, + .size = MON_COORDS_SIZE(64, 48), + .y_offset = 8, }, [SPECIES_SLAKOTH] = { - .size = 0x85, - .y_offset = 0x0f, + .size = MON_COORDS_SIZE(64, 40), + .y_offset = 15, }, [SPECIES_VIGOROTH] = { - .size = 0x86, - .y_offset = 0x0a, + .size = MON_COORDS_SIZE(64, 48), + .y_offset = 10, }, [SPECIES_SLAKING] = { - .size = 0x86, - .y_offset = 0x08, + .size = MON_COORDS_SIZE(64, 48), + .y_offset = 8, }, [SPECIES_GULPIN] = { - .size = 0x66, - .y_offset = 0x0b, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 11, }, [SPECIES_SWALOT] = { - .size = 0x77, - .y_offset = 0x06, + .size = MON_COORDS_SIZE(56, 56), + .y_offset = 6, }, [SPECIES_TROPIUS] = { - .size = 0x87, - .y_offset = 0x07, + .size = MON_COORDS_SIZE(64, 56), + .y_offset = 7, }, [SPECIES_WHISMUR] = { - .size = 0x85, - .y_offset = 0x0d, + .size = MON_COORDS_SIZE(64, 40), + .y_offset = 13, }, [SPECIES_LOUDRED] = { - .size = 0x86, - .y_offset = 0x09, + .size = MON_COORDS_SIZE(64, 48), + .y_offset = 9, }, [SPECIES_EXPLOUD] = { - .size = 0x88, - .y_offset = 0x03, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 3, }, [SPECIES_CLAMPERL] = { - .size = 0x85, - .y_offset = 0x0d, + .size = MON_COORDS_SIZE(64, 40), + .y_offset = 13, }, [SPECIES_HUNTAIL] = { - .size = 0x68, - .y_offset = 0x02, + .size = MON_COORDS_SIZE(48, 64), + .y_offset = 2, }, [SPECIES_GOREBYSS] = { - .size = 0x77, - .y_offset = 0x05, + .size = MON_COORDS_SIZE(56, 56), + .y_offset = 5, }, [SPECIES_ABSOL] = { - .size = 0x78, - .y_offset = 0x03, + .size = MON_COORDS_SIZE(56, 64), + .y_offset = 3, }, [SPECIES_SHUPPET] = { - .size = 0x77, - .y_offset = 0x06, + .size = MON_COORDS_SIZE(56, 56), + .y_offset = 6, }, [SPECIES_BANETTE] = { - .size = 0x65, - .y_offset = 0x0c, + .size = MON_COORDS_SIZE(48, 40), + .y_offset = 12, }, [SPECIES_SEVIPER] = { - .size = 0x88, - .y_offset = 0x03, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 3, }, [SPECIES_ZANGOOSE] = { - .size = 0x88, - .y_offset = 0x01, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 1, }, [SPECIES_RELICANTH] = { - .size = 0x86, - .y_offset = 0x0a, + .size = MON_COORDS_SIZE(64, 48), + .y_offset = 10, }, [SPECIES_ARON] = { - .size = 0x54, - .y_offset = 0x11, + .size = MON_COORDS_SIZE(40, 32), + .y_offset = 17, }, [SPECIES_LAIRON] = { - .size = 0x84, - .y_offset = 0x11, + .size = MON_COORDS_SIZE(64, 32), + .y_offset = 17, }, [SPECIES_AGGRON] = { - .size = 0x87, - .y_offset = 0x07, + .size = MON_COORDS_SIZE(64, 56), + .y_offset = 7, }, [SPECIES_CASTFORM] = { - .size = 0x45, - .y_offset = 0x0d, + .size = MON_COORDS_SIZE(32, 40), + .y_offset = 13, }, [SPECIES_VOLBEAT] = { - .size = 0x76, - .y_offset = 0x08, + .size = MON_COORDS_SIZE(56, 48), + .y_offset = 8, }, [SPECIES_ILLUMISE] = { - .size = 0x67, - .y_offset = 0x06, + .size = MON_COORDS_SIZE(48, 56), + .y_offset = 6, }, [SPECIES_LILEEP] = { - .size = 0x86, - .y_offset = 0x09, + .size = MON_COORDS_SIZE(64, 48), + .y_offset = 9, }, [SPECIES_CRADILY] = { - .size = 0x77, - .y_offset = 0x04, + .size = MON_COORDS_SIZE(56, 56), + .y_offset = 4, }, [SPECIES_ANORITH] = { - .size = 0x83, - .y_offset = 0x17, + .size = MON_COORDS_SIZE(64, 24), + .y_offset = 23, }, [SPECIES_ARMALDO] = { - .size = 0x77, - .y_offset = 0x05, + .size = MON_COORDS_SIZE(56, 56), + .y_offset = 5, }, [SPECIES_RALTS] = { - .size = 0x45, - .y_offset = 0x0d, + .size = MON_COORDS_SIZE(32, 40), + .y_offset = 13, }, [SPECIES_KIRLIA] = { - .size = 0x57, - .y_offset = 0x06, + .size = MON_COORDS_SIZE(40, 56), + .y_offset = 6, }, [SPECIES_GARDEVOIR] = { - .size = 0x77, - .y_offset = 0x04, + .size = MON_COORDS_SIZE(56, 56), + .y_offset = 4, }, [SPECIES_BAGON] = { - .size = 0x66, - .y_offset = 0x08, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 8, }, [SPECIES_SHELGON] = { - .size = 0x85, - .y_offset = 0x0d, + .size = MON_COORDS_SIZE(64, 40), + .y_offset = 13, }, [SPECIES_SALAMENCE] = { - .size = 0x77, - .y_offset = 0x06, + .size = MON_COORDS_SIZE(56, 56), + .y_offset = 6, }, [SPECIES_BELDUM] = { - .size = 0x66, - .y_offset = 0x0a, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 10, }, [SPECIES_METANG] = { - .size = 0x84, - .y_offset = 0x10, + .size = MON_COORDS_SIZE(64, 32), + .y_offset = 16, }, [SPECIES_METAGROSS] = { - .size = 0x83, - .y_offset = 0x14, + .size = MON_COORDS_SIZE(64, 24), + .y_offset = 20, }, [SPECIES_REGIROCK] = { - .size = 0x86, - .y_offset = 0x0a, + .size = MON_COORDS_SIZE(64, 48), + .y_offset = 10, }, [SPECIES_REGICE] = { - .size = 0x85, - .y_offset = 0x0e, + .size = MON_COORDS_SIZE(64, 40), + .y_offset = 14, }, [SPECIES_REGISTEEL] = { - .size = 0x85, - .y_offset = 0x0e, + .size = MON_COORDS_SIZE(64, 40), + .y_offset = 14, }, [SPECIES_KYOGRE] = { - .size = 0x84, - .y_offset = 0x13, + .size = MON_COORDS_SIZE(64, 32), + .y_offset = 19, }, [SPECIES_GROUDON] = { - .size = 0x87, - .y_offset = 0x07, + .size = MON_COORDS_SIZE(64, 56), + .y_offset = 7, }, [SPECIES_RAYQUAZA] = { - .size = 0x78, - .y_offset = 0x00, + .size = MON_COORDS_SIZE(56, 64), + .y_offset = 0, }, [SPECIES_LATIAS] = { - .size = 0x88, - .y_offset = 0x02, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 2, }, [SPECIES_LATIOS] = { - .size = 0x88, - .y_offset = 0x03, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 3, }, [SPECIES_JIRACHI] = { - .size = 0x87, - .y_offset = 0x05, + .size = MON_COORDS_SIZE(64, 56), + .y_offset = 5, }, [SPECIES_DEOXYS] = { - .size = 0x87, - .y_offset = 0x07, + .size = MON_COORDS_SIZE(64, 56), + .y_offset = 7, }, [SPECIES_CHIMECHO] = { - .size = 0x47, - .y_offset = 0x07, + .size = MON_COORDS_SIZE(32, 56), + .y_offset = 7, }, [SPECIES_EGG] = { - .size = 0x36, - .y_offset = 0x0a, + .size = MON_COORDS_SIZE(24, 48), + .y_offset = 10, }, [SPECIES_UNOWN_B] = { - .size = 0x56, - .y_offset = 0x09, + .size = MON_COORDS_SIZE(40, 48), + .y_offset = 9, }, [SPECIES_UNOWN_C] = { - .size = 0x67, - .y_offset = 0x06, + .size = MON_COORDS_SIZE(48, 56), + .y_offset = 6, }, [SPECIES_UNOWN_D] = { - .size = 0x56, - .y_offset = 0x08, + .size = MON_COORDS_SIZE(40, 48), + .y_offset = 8, }, [SPECIES_UNOWN_E] = { - .size = 0x56, - .y_offset = 0x0a, + .size = MON_COORDS_SIZE(40, 48), + .y_offset = 10, }, [SPECIES_UNOWN_F] = { - .size = 0x66, - .y_offset = 0x0a, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 10, }, [SPECIES_UNOWN_G] = { - .size = 0x57, - .y_offset = 0x05, + .size = MON_COORDS_SIZE(40, 56), + .y_offset = 5, }, [SPECIES_UNOWN_H] = { - .size = 0x66, - .y_offset = 0x08, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 8, }, [SPECIES_UNOWN_I] = { - .size = 0x37, - .y_offset = 0x07, + .size = MON_COORDS_SIZE(24, 56), + .y_offset = 7, }, [SPECIES_UNOWN_J] = { - .size = 0x46, - .y_offset = 0x09, + .size = MON_COORDS_SIZE(32, 48), + .y_offset = 9, }, [SPECIES_UNOWN_K] = { - .size = 0x57, - .y_offset = 0x07, + .size = MON_COORDS_SIZE(40, 56), + .y_offset = 7, }, [SPECIES_UNOWN_L] = { - .size = 0x46, - .y_offset = 0x0a, + .size = MON_COORDS_SIZE(32, 48), + .y_offset = 10, }, [SPECIES_UNOWN_M] = { - .size = 0x65, - .y_offset = 0x0d, + .size = MON_COORDS_SIZE(48, 40), + .y_offset = 13, }, [SPECIES_UNOWN_N] = { - .size = 0x65, - .y_offset = 0x0d, + .size = MON_COORDS_SIZE(48, 40), + .y_offset = 13, }, [SPECIES_UNOWN_O] = { - .size = 0x66, - .y_offset = 0x08, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 8, }, [SPECIES_UNOWN_P] = { - .size = 0x46, - .y_offset = 0x0a, + .size = MON_COORDS_SIZE(32, 48), + .y_offset = 10, }, [SPECIES_UNOWN_Q] = { - .size = 0x55, - .y_offset = 0x0f, + .size = MON_COORDS_SIZE(40, 40), + .y_offset = 15, }, [SPECIES_UNOWN_R] = { - .size = 0x45, - .y_offset = 0x0c, + .size = MON_COORDS_SIZE(32, 40), + .y_offset = 12, }, [SPECIES_UNOWN_S] = { - .size = 0x57, - .y_offset = 0x04, + .size = MON_COORDS_SIZE(40, 56), + .y_offset = 4, }, [SPECIES_UNOWN_T] = { - .size = 0x45, - .y_offset = 0x0d, + .size = MON_COORDS_SIZE(32, 40), + .y_offset = 13, }, [SPECIES_UNOWN_U] = { - .size = 0x65, - .y_offset = 0x0d, + .size = MON_COORDS_SIZE(48, 40), + .y_offset = 13, }, [SPECIES_UNOWN_V] = { - .size = 0x56, - .y_offset = 0x0b, + .size = MON_COORDS_SIZE(40, 48), + .y_offset = 11, }, [SPECIES_UNOWN_W] = { - .size = 0x55, - .y_offset = 0x0d, + .size = MON_COORDS_SIZE(40, 40), + .y_offset = 13, }, [SPECIES_UNOWN_X] = { - .size = 0x55, - .y_offset = 0x0f, + .size = MON_COORDS_SIZE(40, 40), + .y_offset = 15, }, [SPECIES_UNOWN_Y] = { - .size = 0x46, - .y_offset = 0x0a, + .size = MON_COORDS_SIZE(32, 48), + .y_offset = 10, }, [SPECIES_UNOWN_Z] = { - .size = 0x46, - .y_offset = 0x0a, + .size = MON_COORDS_SIZE(32, 48), + .y_offset = 10, }, [SPECIES_UNOWN_EMARK] = { - .size = 0x37, - .y_offset = 0x06, + .size = MON_COORDS_SIZE(24, 56), + .y_offset = 6, }, [SPECIES_UNOWN_QMARK] = { - .size = 0x47, - .y_offset = 0x06, + .size = MON_COORDS_SIZE(32, 56), + .y_offset = 6, }, }; diff --git a/src/data/pokemon_graphics/front_pic_coordinates.h b/src/data/pokemon_graphics/front_pic_coordinates.h index 1bb67f1f5..d521b615f 100644 --- a/src/data/pokemon_graphics/front_pic_coordinates.h +++ b/src/data/pokemon_graphics/front_pic_coordinates.h @@ -2,2202 +2,2202 @@ const struct MonCoords gMonFrontPicCoords[] = { [SPECIES_NONE] = { - .size = 0x88, - .y_offset = 0x00, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 0, }, [SPECIES_BULBASAUR] = { - .size = 0x55, - .y_offset = 0x10, + .size = MON_COORDS_SIZE(40, 40), + .y_offset = 16, }, [SPECIES_IVYSAUR] = { - .size = 0x66, - .y_offset = 0x0a, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 10, }, [SPECIES_VENUSAUR] = { - .size = 0x87, - .y_offset = 0x04, + .size = MON_COORDS_SIZE(64, 56), + .y_offset = 4, }, [SPECIES_CHARMANDER] = { - .size = 0x55, - .y_offset = 0x0d, + .size = MON_COORDS_SIZE(40, 40), + .y_offset = 13, }, [SPECIES_CHARMELEON] = { - .size = 0x76, - .y_offset = 0x09, + .size = MON_COORDS_SIZE(56, 48), + .y_offset = 9, }, [SPECIES_CHARIZARD] = { - .size = 0x88, - .y_offset = 0x01, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 1, }, [SPECIES_SQUIRTLE] = { - .size = 0x65, - .y_offset = 0x0c, + .size = MON_COORDS_SIZE(48, 40), + .y_offset = 12, }, [SPECIES_WARTORTLE] = { - .size = 0x76, - .y_offset = 0x09, + .size = MON_COORDS_SIZE(56, 48), + .y_offset = 9, }, [SPECIES_BLASTOISE] = { - .size = 0x87, - .y_offset = 0x05, + .size = MON_COORDS_SIZE(64, 56), + .y_offset = 5, }, [SPECIES_CATERPIE] = { - .size = 0x54, - .y_offset = 0x10, + .size = MON_COORDS_SIZE(40, 32), + .y_offset = 16, }, [SPECIES_METAPOD] = { - .size = 0x54, - .y_offset = 0x14, + .size = MON_COORDS_SIZE(40, 32), + .y_offset = 20, }, [SPECIES_BUTTERFREE] = { - .size = 0x76, - .y_offset = 0x09, + .size = MON_COORDS_SIZE(56, 48), + .y_offset = 9, }, [SPECIES_WEEDLE] = { - .size = 0x54, - .y_offset = 0x11, + .size = MON_COORDS_SIZE(40, 32), + .y_offset = 17, }, [SPECIES_KAKUNA] = { - .size = 0x45, - .y_offset = 0x0e, + .size = MON_COORDS_SIZE(32, 40), + .y_offset = 14, }, [SPECIES_BEEDRILL] = { - .size = 0x86, - .y_offset = 0x09, + .size = MON_COORDS_SIZE(64, 48), + .y_offset = 9, }, [SPECIES_PIDGEY] = { - .size = 0x55, - .y_offset = 0x0d, + .size = MON_COORDS_SIZE(40, 40), + .y_offset = 13, }, [SPECIES_PIDGEOTTO] = { - .size = 0x67, - .y_offset = 0x07, + .size = MON_COORDS_SIZE(48, 56), + .y_offset = 7, }, [SPECIES_PIDGEOT] = { - .size = 0x88, - .y_offset = 0x01, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 1, }, [SPECIES_RATTATA] = { - .size = 0x65, - .y_offset = 0x0e, + .size = MON_COORDS_SIZE(48, 40), + .y_offset = 14, }, [SPECIES_RATICATE] = { - .size = 0x76, - .y_offset = 0x0b, + .size = MON_COORDS_SIZE(56, 48), + .y_offset = 11, }, [SPECIES_SPEAROW] = { - .size = 0x55, - .y_offset = 0x0c, + .size = MON_COORDS_SIZE(40, 40), + .y_offset = 12, }, [SPECIES_FEAROW] = { - .size = 0x88, - .y_offset = 0x00, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 0, }, [SPECIES_EKANS] = { - .size = 0x65, - .y_offset = 0x0f, + .size = MON_COORDS_SIZE(48, 40), + .y_offset = 15, }, [SPECIES_ARBOK] = { - .size = 0x78, - .y_offset = 0x03, + .size = MON_COORDS_SIZE(56, 64), + .y_offset = 3, }, [SPECIES_PIKACHU] = { - .size = 0x67, - .y_offset = 0x09, + .size = MON_COORDS_SIZE(48, 56), + .y_offset = 9, }, [SPECIES_RAICHU] = { - .size = 0x88, - .y_offset = 0x00, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 0, }, [SPECIES_SANDSHREW] = { - .size = 0x56, - .y_offset = 0x0b, + .size = MON_COORDS_SIZE(40, 48), + .y_offset = 11, }, [SPECIES_SANDSLASH] = { - .size = 0x77, - .y_offset = 0x06, + .size = MON_COORDS_SIZE(56, 56), + .y_offset = 6, }, [SPECIES_NIDORAN_F] = { - .size = 0x54, - .y_offset = 0x10, + .size = MON_COORDS_SIZE(40, 32), + .y_offset = 16, }, [SPECIES_NIDORINA] = { - .size = 0x66, - .y_offset = 0x0b, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 11, }, [SPECIES_NIDOQUEEN] = { - .size = 0x78, - .y_offset = 0x02, + .size = MON_COORDS_SIZE(56, 64), + .y_offset = 2, }, [SPECIES_NIDORAN_M] = { - .size = 0x55, - .y_offset = 0x0c, + .size = MON_COORDS_SIZE(40, 40), + .y_offset = 12, }, [SPECIES_NIDORINO] = { - .size = 0x66, - .y_offset = 0x08, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 8, }, [SPECIES_NIDOKING] = { - .size = 0x88, - .y_offset = 0x02, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 2, }, [SPECIES_CLEFAIRY] = { - .size = 0x55, - .y_offset = 0x10, + .size = MON_COORDS_SIZE(40, 40), + .y_offset = 16, }, [SPECIES_CLEFABLE] = { - .size = 0x67, - .y_offset = 0x07, + .size = MON_COORDS_SIZE(48, 56), + .y_offset = 7, }, [SPECIES_VULPIX] = { - .size = 0x65, - .y_offset = 0x0c, + .size = MON_COORDS_SIZE(48, 40), + .y_offset = 12, }, [SPECIES_NINETALES] = { - .size = 0x88, - .y_offset = 0x03, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 3, }, [SPECIES_JIGGLYPUFF] = { - .size = 0x55, - .y_offset = 0x10, + .size = MON_COORDS_SIZE(40, 40), + .y_offset = 16, }, [SPECIES_WIGGLYTUFF] = { - .size = 0x67, - .y_offset = 0x08, + .size = MON_COORDS_SIZE(48, 56), + .y_offset = 8, }, [SPECIES_ZUBAT] = { - .size = 0x66, - .y_offset = 0x0d, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 13, }, [SPECIES_GOLBAT] = { - .size = 0x88, - .y_offset = 0x01, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 1, }, [SPECIES_ODDISH] = { - .size = 0x45, - .y_offset = 0x0c, + .size = MON_COORDS_SIZE(32, 40), + .y_offset = 12, }, [SPECIES_GLOOM] = { - .size = 0x66, - .y_offset = 0x08, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 8, }, [SPECIES_VILEPLUME] = { - .size = 0x76, - .y_offset = 0x0a, + .size = MON_COORDS_SIZE(56, 48), + .y_offset = 10, }, [SPECIES_PARAS] = { - .size = 0x64, - .y_offset = 0x12, + .size = MON_COORDS_SIZE(48, 32), + .y_offset = 18, }, [SPECIES_PARASECT] = { - .size = 0x86, - .y_offset = 0x08, + .size = MON_COORDS_SIZE(64, 48), + .y_offset = 8, }, [SPECIES_VENONAT] = { - .size = 0x57, - .y_offset = 0x0b, + .size = MON_COORDS_SIZE(40, 56), + .y_offset = 11, }, [SPECIES_VENOMOTH] = { - .size = 0x87, - .y_offset = 0x08, + .size = MON_COORDS_SIZE(64, 56), + .y_offset = 8, }, [SPECIES_DIGLETT] = { - .size = 0x54, - .y_offset = 0x11, + .size = MON_COORDS_SIZE(40, 32), + .y_offset = 17, }, [SPECIES_DUGTRIO] = { - .size = 0x75, - .y_offset = 0x0c, + .size = MON_COORDS_SIZE(56, 40), + .y_offset = 12, }, [SPECIES_MEOWTH] = { - .size = 0x55, - .y_offset = 0x0c, + .size = MON_COORDS_SIZE(40, 40), + .y_offset = 12, }, [SPECIES_PERSIAN] = { - .size = 0x76, - .y_offset = 0x0a, + .size = MON_COORDS_SIZE(56, 48), + .y_offset = 10, }, [SPECIES_PSYDUCK] = { - .size = 0x56, - .y_offset = 0x09, + .size = MON_COORDS_SIZE(40, 48), + .y_offset = 9, }, [SPECIES_GOLDUCK] = { - .size = 0x77, - .y_offset = 0x06, + .size = MON_COORDS_SIZE(56, 56), + .y_offset = 6, }, [SPECIES_MANKEY] = { - .size = 0x66, - .y_offset = 0x0e, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 14, }, [SPECIES_PRIMEAPE] = { - .size = 0x77, - .y_offset = 0x06, + .size = MON_COORDS_SIZE(56, 56), + .y_offset = 6, }, [SPECIES_GROWLITHE] = { - .size = 0x65, - .y_offset = 0x0c, + .size = MON_COORDS_SIZE(48, 40), + .y_offset = 12, }, [SPECIES_ARCANINE] = { - .size = 0x88, - .y_offset = 0x02, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 2, }, [SPECIES_POLIWAG] = { - .size = 0x74, - .y_offset = 0x10, + .size = MON_COORDS_SIZE(56, 32), + .y_offset = 16, }, [SPECIES_POLIWHIRL] = { - .size = 0x76, - .y_offset = 0x0b, + .size = MON_COORDS_SIZE(56, 48), + .y_offset = 11, }, [SPECIES_POLIWRATH] = { - .size = 0x77, - .y_offset = 0x07, + .size = MON_COORDS_SIZE(56, 56), + .y_offset = 7, }, [SPECIES_ABRA] = { - .size = 0x66, - .y_offset = 0x0b, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 11, }, [SPECIES_KADABRA] = { - .size = 0x87, - .y_offset = 0x04, + .size = MON_COORDS_SIZE(64, 56), + .y_offset = 4, }, [SPECIES_ALAKAZAM] = { - .size = 0x88, - .y_offset = 0x01, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 1, }, [SPECIES_MACHOP] = { - .size = 0x46, - .y_offset = 0x0b, + .size = MON_COORDS_SIZE(32, 48), + .y_offset = 11, }, [SPECIES_MACHOKE] = { - .size = 0x77, - .y_offset = 0x06, + .size = MON_COORDS_SIZE(56, 56), + .y_offset = 6, }, [SPECIES_MACHAMP] = { - .size = 0x88, - .y_offset = 0x03, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 3, }, [SPECIES_BELLSPROUT] = { - .size = 0x66, - .y_offset = 0x0f, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 15, }, [SPECIES_WEEPINBELL] = { - .size = 0x66, - .y_offset = 0x0b, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 11, }, [SPECIES_VICTREEBEL] = { - .size = 0x77, - .y_offset = 0x05, + .size = MON_COORDS_SIZE(56, 56), + .y_offset = 5, }, [SPECIES_TENTACOOL] = { - .size = 0x66, - .y_offset = 0x0b, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 11, }, [SPECIES_TENTACRUEL] = { - .size = 0x78, - .y_offset = 0x01, + .size = MON_COORDS_SIZE(56, 64), + .y_offset = 1, }, [SPECIES_GEODUDE] = { - .size = 0x74, - .y_offset = 0x12, + .size = MON_COORDS_SIZE(56, 32), + .y_offset = 18, }, [SPECIES_GRAVELER] = { - .size = 0x86, - .y_offset = 0x0b, + .size = MON_COORDS_SIZE(64, 48), + .y_offset = 11, }, [SPECIES_GOLEM] = { - .size = 0x87, - .y_offset = 0x07, + .size = MON_COORDS_SIZE(64, 56), + .y_offset = 7, }, [SPECIES_PONYTA] = { - .size = 0x67, - .y_offset = 0x07, + .size = MON_COORDS_SIZE(48, 56), + .y_offset = 7, }, [SPECIES_RAPIDASH] = { - .size = 0x88, - .y_offset = 0x00, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 0, }, [SPECIES_SLOWPOKE] = { - .size = 0x65, - .y_offset = 0x0d, + .size = MON_COORDS_SIZE(48, 40), + .y_offset = 13, }, [SPECIES_SLOWBRO] = { - .size = 0x88, - .y_offset = 0x02, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 2, }, [SPECIES_MAGNEMITE] = { - .size = 0x53, - .y_offset = 0x16, + .size = MON_COORDS_SIZE(40, 24), + .y_offset = 22, }, [SPECIES_MAGNETON] = { - .size = 0x75, - .y_offset = 0x10, + .size = MON_COORDS_SIZE(56, 40), + .y_offset = 16, }, [SPECIES_FARFETCHD] = { - .size = 0x76, - .y_offset = 0x0b, + .size = MON_COORDS_SIZE(56, 48), + .y_offset = 11, }, [SPECIES_DODUO] = { - .size = 0x67, - .y_offset = 0x07, + .size = MON_COORDS_SIZE(48, 56), + .y_offset = 7, }, [SPECIES_DODRIO] = { - .size = 0x88, - .y_offset = 0x01, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 1, }, [SPECIES_SEEL] = { - .size = 0x76, - .y_offset = 0x09, + .size = MON_COORDS_SIZE(56, 48), + .y_offset = 9, }, [SPECIES_DEWGONG] = { - .size = 0x87, - .y_offset = 0x07, + .size = MON_COORDS_SIZE(64, 56), + .y_offset = 7, }, [SPECIES_GRIMER] = { - .size = 0x66, - .y_offset = 0x0b, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 11, }, [SPECIES_MUK] = { - .size = 0x86, - .y_offset = 0x0a, + .size = MON_COORDS_SIZE(64, 48), + .y_offset = 10, }, [SPECIES_SHELLDER] = { - .size = 0x55, - .y_offset = 0x10, + .size = MON_COORDS_SIZE(40, 40), + .y_offset = 16, }, [SPECIES_CLOYSTER] = { - .size = 0x87, - .y_offset = 0x04, + .size = MON_COORDS_SIZE(64, 56), + .y_offset = 4, }, [SPECIES_GASTLY] = { - .size = 0x77, - .y_offset = 0x06, + .size = MON_COORDS_SIZE(56, 56), + .y_offset = 6, }, [SPECIES_HAUNTER] = { - .size = 0x87, - .y_offset = 0x07, + .size = MON_COORDS_SIZE(64, 56), + .y_offset = 7, }, [SPECIES_GENGAR] = { - .size = 0x76, - .y_offset = 0x09, + .size = MON_COORDS_SIZE(56, 48), + .y_offset = 9, }, [SPECIES_ONIX] = { - .size = 0x78, - .y_offset = 0x03, + .size = MON_COORDS_SIZE(56, 64), + .y_offset = 3, }, [SPECIES_DROWZEE] = { - .size = 0x66, - .y_offset = 0x09, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 9, }, [SPECIES_HYPNO] = { - .size = 0x87, - .y_offset = 0x04, + .size = MON_COORDS_SIZE(64, 56), + .y_offset = 4, }, [SPECIES_KRABBY] = { - .size = 0x75, - .y_offset = 0x0e, + .size = MON_COORDS_SIZE(56, 40), + .y_offset = 14, }, [SPECIES_KINGLER] = { - .size = 0x87, - .y_offset = 0x05, + .size = MON_COORDS_SIZE(64, 56), + .y_offset = 5, }, [SPECIES_VOLTORB] = { - .size = 0x44, - .y_offset = 0x13, + .size = MON_COORDS_SIZE(32, 32), + .y_offset = 19, }, [SPECIES_ELECTRODE] = { - .size = 0x55, - .y_offset = 0x0e, + .size = MON_COORDS_SIZE(40, 40), + .y_offset = 14, }, [SPECIES_EXEGGCUTE] = { - .size = 0x76, - .y_offset = 0x09, + .size = MON_COORDS_SIZE(56, 48), + .y_offset = 9, }, [SPECIES_EXEGGUTOR] = { - .size = 0x88, - .y_offset = 0x01, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 1, }, [SPECIES_CUBONE] = { - .size = 0x65, - .y_offset = 0x0d, + .size = MON_COORDS_SIZE(48, 40), + .y_offset = 13, }, [SPECIES_MAROWAK] = { - .size = 0x87, - .y_offset = 0x0d, + .size = MON_COORDS_SIZE(64, 56), + .y_offset = 13, }, [SPECIES_HITMONLEE] = { - .size = 0x77, - .y_offset = 0x04, + .size = MON_COORDS_SIZE(56, 56), + .y_offset = 4, }, [SPECIES_HITMONCHAN] = { - .size = 0x67, - .y_offset = 0x04, + .size = MON_COORDS_SIZE(48, 56), + .y_offset = 4, }, [SPECIES_LICKITUNG] = { - .size = 0x86, - .y_offset = 0x08, + .size = MON_COORDS_SIZE(64, 48), + .y_offset = 8, }, [SPECIES_KOFFING] = { - .size = 0x66, - .y_offset = 0x0b, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 11, }, [SPECIES_WEEZING] = { - .size = 0x88, - .y_offset = 0x07, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 7, }, [SPECIES_RHYHORN] = { - .size = 0x76, - .y_offset = 0x09, + .size = MON_COORDS_SIZE(56, 48), + .y_offset = 9, }, [SPECIES_RHYDON] = { - .size = 0x88, - .y_offset = 0x02, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 2, }, [SPECIES_CHANSEY] = { - .size = 0x76, - .y_offset = 0x09, + .size = MON_COORDS_SIZE(56, 48), + .y_offset = 9, }, [SPECIES_TANGELA] = { - .size = 0x66, - .y_offset = 0x08, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 8, }, [SPECIES_KANGASKHAN] = { - .size = 0x88, - .y_offset = 0x00, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 0, }, [SPECIES_HORSEA] = { - .size = 0x45, - .y_offset = 0x10, + .size = MON_COORDS_SIZE(32, 40), + .y_offset = 16, }, [SPECIES_SEADRA] = { - .size = 0x77, - .y_offset = 0x06, + .size = MON_COORDS_SIZE(56, 56), + .y_offset = 6, }, [SPECIES_GOLDEEN] = { - .size = 0x66, - .y_offset = 0x0a, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 10, }, [SPECIES_SEAKING] = { - .size = 0x77, - .y_offset = 0x04, + .size = MON_COORDS_SIZE(56, 56), + .y_offset = 4, }, [SPECIES_STARYU] = { - .size = 0x66, - .y_offset = 0x0d, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 13, }, [SPECIES_STARMIE] = { - .size = 0x67, - .y_offset = 0x0a, + .size = MON_COORDS_SIZE(48, 56), + .y_offset = 10, }, [SPECIES_MR_MIME] = { - .size = 0x76, - .y_offset = 0x08, + .size = MON_COORDS_SIZE(56, 48), + .y_offset = 8, }, [SPECIES_SCYTHER] = { - .size = 0x78, - .y_offset = 0x02, + .size = MON_COORDS_SIZE(56, 64), + .y_offset = 2, }, [SPECIES_JYNX] = { - .size = 0x66, - .y_offset = 0x08, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 8, }, [SPECIES_ELECTABUZZ] = { - .size = 0x88, - .y_offset = 0x04, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 4, }, [SPECIES_MAGMAR] = { - .size = 0x87, - .y_offset = 0x04, + .size = MON_COORDS_SIZE(64, 56), + .y_offset = 4, }, [SPECIES_PINSIR] = { - .size = 0x77, - .y_offset = 0x04, + .size = MON_COORDS_SIZE(56, 56), + .y_offset = 4, }, [SPECIES_TAUROS] = { - .size = 0x88, - .y_offset = 0x05, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 5, }, [SPECIES_MAGIKARP] = { - .size = 0x77, - .y_offset = 0x0b, + .size = MON_COORDS_SIZE(56, 56), + .y_offset = 11, }, [SPECIES_GYARADOS] = { - .size = 0x88, - .y_offset = 0x00, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 0, }, [SPECIES_LAPRAS] = { - .size = 0x87, - .y_offset = 0x04, + .size = MON_COORDS_SIZE(64, 56), + .y_offset = 4, }, [SPECIES_DITTO] = { - .size = 0x54, - .y_offset = 0x11, + .size = MON_COORDS_SIZE(40, 32), + .y_offset = 17, }, [SPECIES_EEVEE] = { - .size = 0x56, - .y_offset = 0x0d, + .size = MON_COORDS_SIZE(40, 48), + .y_offset = 13, }, [SPECIES_VAPOREON] = { - .size = 0x67, - .y_offset = 0x06, + .size = MON_COORDS_SIZE(48, 56), + .y_offset = 6, }, [SPECIES_JOLTEON] = { - .size = 0x66, - .y_offset = 0x0a, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 10, }, [SPECIES_FLAREON] = { - .size = 0x76, - .y_offset = 0x0b, + .size = MON_COORDS_SIZE(56, 48), + .y_offset = 11, }, [SPECIES_PORYGON] = { - .size = 0x56, - .y_offset = 0x0b, + .size = MON_COORDS_SIZE(40, 48), + .y_offset = 11, }, [SPECIES_OMANYTE] = { - .size = 0x45, - .y_offset = 0x0f, + .size = MON_COORDS_SIZE(32, 40), + .y_offset = 15, }, [SPECIES_OMASTAR] = { - .size = 0x67, - .y_offset = 0x07, + .size = MON_COORDS_SIZE(48, 56), + .y_offset = 7, }, [SPECIES_KABUTO] = { - .size = 0x54, - .y_offset = 0x14, + .size = MON_COORDS_SIZE(40, 32), + .y_offset = 20, }, [SPECIES_KABUTOPS] = { - .size = 0x88, - .y_offset = 0x03, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 3, }, [SPECIES_AERODACTYL] = { - .size = 0x88, - .y_offset = 0x01, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 1, }, [SPECIES_SNORLAX] = { - .size = 0x87, - .y_offset = 0x05, + .size = MON_COORDS_SIZE(64, 56), + .y_offset = 5, }, [SPECIES_ARTICUNO] = { - .size = 0x88, - .y_offset = 0x00, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 0, }, [SPECIES_ZAPDOS] = { - .size = 0x88, - .y_offset = 0x04, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 4, }, [SPECIES_MOLTRES] = { - .size = 0x88, - .y_offset = 0x06, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 6, }, [SPECIES_DRATINI] = { - .size = 0x75, - .y_offset = 0x0f, + .size = MON_COORDS_SIZE(56, 40), + .y_offset = 15, }, [SPECIES_DRAGONAIR] = { - .size = 0x87, - .y_offset = 0x06, + .size = MON_COORDS_SIZE(64, 56), + .y_offset = 6, }, [SPECIES_DRAGONITE] = { - .size = 0x88, - .y_offset = 0x00, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 0, }, [SPECIES_MEWTWO] = { - .size = 0x88, - .y_offset = 0x00, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 0, }, [SPECIES_MEW] = { - .size = 0x77, - .y_offset = 0x0d, + .size = MON_COORDS_SIZE(56, 56), + .y_offset = 13, }, [SPECIES_CHIKORITA] = { - .size = 0x75, - .y_offset = 0x0d, + .size = MON_COORDS_SIZE(56, 40), + .y_offset = 13, }, [SPECIES_BAYLEEF] = { - .size = 0x77, - .y_offset = 0x04, + .size = MON_COORDS_SIZE(56, 56), + .y_offset = 4, }, [SPECIES_MEGANIUM] = { - .size = 0x88, - .y_offset = 0x00, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 0, }, [SPECIES_CYNDAQUIL] = { - .size = 0x55, - .y_offset = 0x0e, + .size = MON_COORDS_SIZE(40, 40), + .y_offset = 14, }, [SPECIES_QUILAVA] = { - .size = 0x76, - .y_offset = 0x08, + .size = MON_COORDS_SIZE(56, 48), + .y_offset = 8, }, [SPECIES_TYPHLOSION] = { - .size = 0x78, - .y_offset = 0x00, + .size = MON_COORDS_SIZE(56, 64), + .y_offset = 0, }, [SPECIES_TOTODILE] = { - .size = 0x55, - .y_offset = 0x0f, + .size = MON_COORDS_SIZE(40, 40), + .y_offset = 15, }, [SPECIES_CROCONAW] = { - .size = 0x67, - .y_offset = 0x06, + .size = MON_COORDS_SIZE(48, 56), + .y_offset = 6, }, [SPECIES_FERALIGATR] = { - .size = 0x88, - .y_offset = 0x00, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 0, }, [SPECIES_SENTRET] = { - .size = 0x47, - .y_offset = 0x04, + .size = MON_COORDS_SIZE(32, 56), + .y_offset = 4, }, [SPECIES_FURRET] = { - .size = 0x67, - .y_offset = 0x07, + .size = MON_COORDS_SIZE(48, 56), + .y_offset = 7, }, [SPECIES_HOOTHOOT] = { - .size = 0x55, - .y_offset = 0x0d, + .size = MON_COORDS_SIZE(40, 40), + .y_offset = 13, }, [SPECIES_NOCTOWL] = { - .size = 0x58, - .y_offset = 0x03, + .size = MON_COORDS_SIZE(40, 64), + .y_offset = 3, }, [SPECIES_LEDYBA] = { - .size = 0x56, - .y_offset = 0x0c, + .size = MON_COORDS_SIZE(40, 48), + .y_offset = 12, }, [SPECIES_LEDIAN] = { - .size = 0x67, - .y_offset = 0x04, + .size = MON_COORDS_SIZE(48, 56), + .y_offset = 4, }, [SPECIES_SPINARAK] = { - .size = 0x54, - .y_offset = 0x13, + .size = MON_COORDS_SIZE(40, 32), + .y_offset = 19, }, [SPECIES_ARIADOS] = { - .size = 0x87, - .y_offset = 0x05, + .size = MON_COORDS_SIZE(64, 56), + .y_offset = 5, }, [SPECIES_CROBAT] = { - .size = 0x88, - .y_offset = 0x00, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 0, }, [SPECIES_CHINCHOU] = { - .size = 0x75, - .y_offset = 0x10, + .size = MON_COORDS_SIZE(56, 40), + .y_offset = 16, }, [SPECIES_LANTURN] = { - .size = 0x87, - .y_offset = 0x0b, + .size = MON_COORDS_SIZE(64, 56), + .y_offset = 11, }, [SPECIES_PICHU] = { - .size = 0x45, - .y_offset = 0x0c, + .size = MON_COORDS_SIZE(32, 40), + .y_offset = 12, }, [SPECIES_CLEFFA] = { - .size = 0x44, - .y_offset = 0x14, + .size = MON_COORDS_SIZE(32, 32), + .y_offset = 20, }, [SPECIES_IGGLYBUFF] = { - .size = 0x44, - .y_offset = 0x12, + .size = MON_COORDS_SIZE(32, 32), + .y_offset = 18, }, [SPECIES_TOGEPI] = { - .size = 0x34, - .y_offset = 0x14, + .size = MON_COORDS_SIZE(24, 32), + .y_offset = 20, }, [SPECIES_TOGETIC] = { - .size = 0x46, - .y_offset = 0x09, + .size = MON_COORDS_SIZE(32, 48), + .y_offset = 9, }, [SPECIES_NATU] = { - .size = 0x44, - .y_offset = 0x14, + .size = MON_COORDS_SIZE(32, 32), + .y_offset = 20, }, [SPECIES_XATU] = { - .size = 0x47, - .y_offset = 0x07, + .size = MON_COORDS_SIZE(32, 56), + .y_offset = 7, }, [SPECIES_MAREEP] = { - .size = 0x55, - .y_offset = 0x10, + .size = MON_COORDS_SIZE(40, 40), + .y_offset = 16, }, [SPECIES_FLAAFFY] = { - .size = 0x56, - .y_offset = 0x0a, + .size = MON_COORDS_SIZE(40, 48), + .y_offset = 10, }, [SPECIES_AMPHAROS] = { - .size = 0x77, - .y_offset = 0x05, + .size = MON_COORDS_SIZE(56, 56), + .y_offset = 5, }, [SPECIES_BELLOSSOM] = { - .size = 0x45, - .y_offset = 0x0e, + .size = MON_COORDS_SIZE(32, 40), + .y_offset = 14, }, [SPECIES_MARILL] = { - .size = 0x65, - .y_offset = 0x0e, + .size = MON_COORDS_SIZE(48, 40), + .y_offset = 14, }, [SPECIES_AZUMARILL] = { - .size = 0x76, - .y_offset = 0x09, + .size = MON_COORDS_SIZE(56, 48), + .y_offset = 9, }, [SPECIES_SUDOWOODO] = { - .size = 0x67, - .y_offset = 0x06, + .size = MON_COORDS_SIZE(48, 56), + .y_offset = 6, }, [SPECIES_POLITOED] = { - .size = 0x67, - .y_offset = 0x06, + .size = MON_COORDS_SIZE(48, 56), + .y_offset = 6, }, [SPECIES_HOPPIP] = { - .size = 0x66, - .y_offset = 0x0a, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 10, }, [SPECIES_SKIPLOOM] = { - .size = 0x55, - .y_offset = 0x0f, + .size = MON_COORDS_SIZE(40, 40), + .y_offset = 15, }, [SPECIES_JUMPLUFF] = { - .size = 0x77, - .y_offset = 0x07, + .size = MON_COORDS_SIZE(56, 56), + .y_offset = 7, }, [SPECIES_AIPOM] = { - .size = 0x58, - .y_offset = 0x03, + .size = MON_COORDS_SIZE(40, 64), + .y_offset = 3, }, [SPECIES_SUNKERN] = { - .size = 0x44, - .y_offset = 0x10, + .size = MON_COORDS_SIZE(32, 32), + .y_offset = 16, }, [SPECIES_SUNFLORA] = { - .size = 0x56, - .y_offset = 0x08, + .size = MON_COORDS_SIZE(40, 48), + .y_offset = 8, }, [SPECIES_YANMA] = { - .size = 0x86, - .y_offset = 0x0a, + .size = MON_COORDS_SIZE(64, 48), + .y_offset = 10, }, [SPECIES_WOOPER] = { - .size = 0x54, - .y_offset = 0x10, + .size = MON_COORDS_SIZE(40, 32), + .y_offset = 16, }, [SPECIES_QUAGSIRE] = { - .size = 0x77, - .y_offset = 0x07, + .size = MON_COORDS_SIZE(56, 56), + .y_offset = 7, }, [SPECIES_ESPEON] = { - .size = 0x66, - .y_offset = 0x08, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 8, }, [SPECIES_UMBREON] = { - .size = 0x67, - .y_offset = 0x08, + .size = MON_COORDS_SIZE(48, 56), + .y_offset = 8, }, [SPECIES_MURKROW] = { - .size = 0x66, - .y_offset = 0x0b, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 11, }, [SPECIES_SLOWKING] = { - .size = 0x58, - .y_offset = 0x01, + .size = MON_COORDS_SIZE(40, 64), + .y_offset = 1, }, [SPECIES_MISDREAVUS] = { - .size = 0x55, - .y_offset = 0x0c, + .size = MON_COORDS_SIZE(40, 40), + .y_offset = 12, }, [SPECIES_UNOWN] = { - .size = 0x35, - .y_offset = 0x0f, + .size = MON_COORDS_SIZE(24, 40), + .y_offset = 15, }, [SPECIES_WOBBUFFET] = { - .size = 0x77, - .y_offset = 0x06, + .size = MON_COORDS_SIZE(56, 56), + .y_offset = 6, }, [SPECIES_GIRAFARIG] = { - .size = 0x88, - .y_offset = 0x03, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 3, }, [SPECIES_PINECO] = { - .size = 0x56, - .y_offset = 0x0a, + .size = MON_COORDS_SIZE(40, 48), + .y_offset = 10, }, [SPECIES_FORRETRESS] = { - .size = 0x76, - .y_offset = 0x09, + .size = MON_COORDS_SIZE(56, 48), + .y_offset = 9, }, [SPECIES_DUNSPARCE] = { - .size = 0x74, - .y_offset = 0x11, + .size = MON_COORDS_SIZE(56, 32), + .y_offset = 17, }, [SPECIES_GLIGAR] = { - .size = 0x78, - .y_offset = 0x03, + .size = MON_COORDS_SIZE(56, 64), + .y_offset = 3, }, [SPECIES_STEELIX] = { - .size = 0x88, - .y_offset = 0x00, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 0, }, [SPECIES_SNUBBULL] = { - .size = 0x55, - .y_offset = 0x0d, + .size = MON_COORDS_SIZE(40, 40), + .y_offset = 13, }, [SPECIES_GRANBULL] = { - .size = 0x57, - .y_offset = 0x06, + .size = MON_COORDS_SIZE(40, 56), + .y_offset = 6, }, [SPECIES_QWILFISH] = { - .size = 0x56, - .y_offset = 0x0a, + .size = MON_COORDS_SIZE(40, 48), + .y_offset = 10, }, [SPECIES_SCIZOR] = { - .size = 0x88, - .y_offset = 0x00, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 0, }, [SPECIES_SHUCKLE] = { - .size = 0x66, - .y_offset = 0x09, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 9, }, [SPECIES_HERACROSS] = { - .size = 0x88, - .y_offset = 0x03, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 3, }, [SPECIES_SNEASEL] = { - .size = 0x67, - .y_offset = 0x05, + .size = MON_COORDS_SIZE(48, 56), + .y_offset = 5, }, [SPECIES_TEDDIURSA] = { - .size = 0x46, - .y_offset = 0x0b, + .size = MON_COORDS_SIZE(32, 48), + .y_offset = 11, }, [SPECIES_URSARING] = { - .size = 0x78, - .y_offset = 0x01, + .size = MON_COORDS_SIZE(56, 64), + .y_offset = 1, }, [SPECIES_SLUGMA] = { - .size = 0x45, - .y_offset = 0x0d, + .size = MON_COORDS_SIZE(32, 40), + .y_offset = 13, }, [SPECIES_MAGCARGO] = { - .size = 0x57, - .y_offset = 0x0d, + .size = MON_COORDS_SIZE(40, 56), + .y_offset = 13, }, [SPECIES_SWINUB] = { - .size = 0x43, - .y_offset = 0x14, + .size = MON_COORDS_SIZE(32, 24), + .y_offset = 20, }, [SPECIES_PILOSWINE] = { - .size = 0x66, - .y_offset = 0x08, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 8, }, [SPECIES_CORSOLA] = { - .size = 0x65, - .y_offset = 0x0c, + .size = MON_COORDS_SIZE(48, 40), + .y_offset = 12, }, [SPECIES_REMORAID] = { - .size = 0x55, - .y_offset = 0x0e, + .size = MON_COORDS_SIZE(40, 40), + .y_offset = 14, }, [SPECIES_OCTILLERY] = { - .size = 0x66, - .y_offset = 0x0a, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 10, }, [SPECIES_DELIBIRD] = { - .size = 0x56, - .y_offset = 0x08, + .size = MON_COORDS_SIZE(40, 48), + .y_offset = 8, }, [SPECIES_MANTINE] = { - .size = 0x88, - .y_offset = 0x01, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 1, }, [SPECIES_SKARMORY] = { - .size = 0x88, - .y_offset = 0x00, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 0, }, [SPECIES_HOUNDOUR] = { - .size = 0x56, - .y_offset = 0x0b, + .size = MON_COORDS_SIZE(40, 48), + .y_offset = 11, }, [SPECIES_HOUNDOOM] = { - .size = 0x77, - .y_offset = 0x05, + .size = MON_COORDS_SIZE(56, 56), + .y_offset = 5, }, [SPECIES_KINGDRA] = { - .size = 0x78, - .y_offset = 0x04, + .size = MON_COORDS_SIZE(56, 64), + .y_offset = 4, }, [SPECIES_PHANPY] = { - .size = 0x54, - .y_offset = 0x10, + .size = MON_COORDS_SIZE(40, 32), + .y_offset = 16, }, [SPECIES_DONPHAN] = { - .size = 0x86, - .y_offset = 0x08, + .size = MON_COORDS_SIZE(64, 48), + .y_offset = 8, }, [SPECIES_PORYGON2] = { - .size = 0x55, - .y_offset = 0x0f, + .size = MON_COORDS_SIZE(40, 40), + .y_offset = 15, }, [SPECIES_STANTLER] = { - .size = 0x88, - .y_offset = 0x00, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 0, }, [SPECIES_SMEARGLE] = { - .size = 0x77, - .y_offset = 0x06, + .size = MON_COORDS_SIZE(56, 56), + .y_offset = 6, }, [SPECIES_TYROGUE] = { - .size = 0x46, - .y_offset = 0x09, + .size = MON_COORDS_SIZE(32, 48), + .y_offset = 9, }, [SPECIES_HITMONTOP] = { - .size = 0x67, - .y_offset = 0x05, + .size = MON_COORDS_SIZE(48, 56), + .y_offset = 5, }, [SPECIES_SMOOCHUM] = { - .size = 0x35, - .y_offset = 0x0f, + .size = MON_COORDS_SIZE(24, 40), + .y_offset = 15, }, [SPECIES_ELEKID] = { - .size = 0x76, - .y_offset = 0x0a, + .size = MON_COORDS_SIZE(56, 48), + .y_offset = 10, }, [SPECIES_MAGBY] = { - .size = 0x45, - .y_offset = 0x0d, + .size = MON_COORDS_SIZE(32, 40), + .y_offset = 13, }, [SPECIES_MILTANK] = { - .size = 0x77, - .y_offset = 0x04, + .size = MON_COORDS_SIZE(56, 56), + .y_offset = 4, }, [SPECIES_BLISSEY] = { - .size = 0x77, - .y_offset = 0x06, + .size = MON_COORDS_SIZE(56, 56), + .y_offset = 6, }, [SPECIES_RAIKOU] = { - .size = 0x88, - .y_offset = 0x00, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 0, }, [SPECIES_ENTEI] = { - .size = 0x88, - .y_offset = 0x00, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 0, }, [SPECIES_SUICUNE] = { - .size = 0x88, - .y_offset = 0x00, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 0, }, [SPECIES_LARVITAR] = { - .size = 0x46, - .y_offset = 0x09, + .size = MON_COORDS_SIZE(32, 48), + .y_offset = 9, }, [SPECIES_PUPITAR] = { - .size = 0x56, - .y_offset = 0x09, + .size = MON_COORDS_SIZE(40, 48), + .y_offset = 9, }, [SPECIES_TYRANITAR] = { - .size = 0x88, - .y_offset = 0x00, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 0, }, [SPECIES_LUGIA] = { - .size = 0x88, - .y_offset = 0x00, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 0, }, [SPECIES_HO_OH] = { - .size = 0x88, - .y_offset = 0x00, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 0, }, [SPECIES_CELEBI] = { - .size = 0x55, - .y_offset = 0x0e, + .size = MON_COORDS_SIZE(40, 40), + .y_offset = 14, }, [SPECIES_OLD_UNOWN_B] = { - .size = 0x88, - .y_offset = 0x06, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 6, }, [SPECIES_OLD_UNOWN_C] = { - .size = 0x88, - .y_offset = 0x06, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 6, }, [SPECIES_OLD_UNOWN_D] = { - .size = 0x88, - .y_offset = 0x06 + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 6, }, [SPECIES_OLD_UNOWN_E] = { - .size = 0x88, - .y_offset = 0x06 + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 6, }, [SPECIES_OLD_UNOWN_F] = { - .size = 0x88, - .y_offset = 0x06 + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 6, }, [SPECIES_OLD_UNOWN_G] = { - .size = 0x88, - .y_offset = 0x06 + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 6, }, [SPECIES_OLD_UNOWN_H] = { - .size = 0x88, - .y_offset = 0x06 + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 6, }, [SPECIES_OLD_UNOWN_I] = { - .size = 0x88, - .y_offset = 0x06 + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 6, }, [SPECIES_OLD_UNOWN_J] = { - .size = 0x88, - .y_offset = 0x06 + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 6, }, [SPECIES_OLD_UNOWN_K] = { - .size = 0x88, - .y_offset = 0x06 + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 6, }, [SPECIES_OLD_UNOWN_L] = { - .size = 0x88, - .y_offset = 0x06 + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 6, }, [SPECIES_OLD_UNOWN_M] = { - .size = 0x88, - .y_offset = 0x06 + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 6, }, [SPECIES_OLD_UNOWN_N] = { - .size = 0x88, - .y_offset = 0x06 + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 6, }, [SPECIES_OLD_UNOWN_O] = { - .size = 0x88, - .y_offset = 0x06 + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 6, }, [SPECIES_OLD_UNOWN_P] = { - .size = 0x88, - .y_offset = 0x06 + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 6, }, [SPECIES_OLD_UNOWN_Q] = { - .size = 0x88, - .y_offset = 0x06 + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 6, }, [SPECIES_OLD_UNOWN_R] = { - .size = 0x88, - .y_offset = 0x06 + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 6, }, [SPECIES_OLD_UNOWN_S] = { - .size = 0x88, - .y_offset = 0x06 + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 6, }, [SPECIES_OLD_UNOWN_T] = { - .size = 0x88, - .y_offset = 0x06 + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 6, }, [SPECIES_OLD_UNOWN_U] = { - .size = 0x88, - .y_offset = 0x06 + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 6, }, [SPECIES_OLD_UNOWN_V] = { - .size = 0x88, - .y_offset = 0x06 + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 6, }, [SPECIES_OLD_UNOWN_W] = { - .size = 0x88, - .y_offset = 0x06 + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 6, }, [SPECIES_OLD_UNOWN_X] = { - .size = 0x88, - .y_offset = 0x06 + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 6, }, [SPECIES_OLD_UNOWN_Y] = { - .size = 0x88, - .y_offset = 0x06 + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 6, }, [SPECIES_OLD_UNOWN_Z] = { - .size = 0x88, - .y_offset = 0x06 + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 6, }, [SPECIES_TREECKO] = { - .size = 0x66, - .y_offset = 0x08, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 8, }, [SPECIES_GROVYLE] = { - .size = 0x87, - .y_offset = 0x04, + .size = MON_COORDS_SIZE(64, 56), + .y_offset = 4, }, [SPECIES_SCEPTILE] = { - .size = 0x88, - .y_offset = 0x00, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 0, }, [SPECIES_TORCHIC] = { - .size = 0x56, - .y_offset = 0x08, + .size = MON_COORDS_SIZE(40, 48), + .y_offset = 8, }, [SPECIES_COMBUSKEN] = { - .size = 0x88, - .y_offset = 0x01, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 1, }, [SPECIES_BLAZIKEN] = { - .size = 0x88, - .y_offset = 0x00, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 0, }, [SPECIES_MUDKIP] = { - .size = 0x56, - .y_offset = 0x0c, + .size = MON_COORDS_SIZE(40, 48), + .y_offset = 12, }, [SPECIES_MARSHTOMP] = { - .size = 0x67, - .y_offset = 0x06, + .size = MON_COORDS_SIZE(48, 56), + .y_offset = 6, }, [SPECIES_SWAMPERT] = { - .size = 0x88, - .y_offset = 0x00, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 0, }, [SPECIES_POOCHYENA] = { - .size = 0x55, - .y_offset = 0x0c, + .size = MON_COORDS_SIZE(40, 40), + .y_offset = 12, }, [SPECIES_MIGHTYENA] = { - .size = 0x87, - .y_offset = 0x04, + .size = MON_COORDS_SIZE(64, 56), + .y_offset = 4, }, [SPECIES_ZIGZAGOON] = { - .size = 0x85, - .y_offset = 0x0f, + .size = MON_COORDS_SIZE(64, 40), + .y_offset = 15, }, [SPECIES_LINOONE] = { - .size = 0x78, - .y_offset = 0x03, + .size = MON_COORDS_SIZE(56, 64), + .y_offset = 3, }, [SPECIES_WURMPLE] = { - .size = 0x45, - .y_offset = 0x0e, + .size = MON_COORDS_SIZE(32, 40), + .y_offset = 14, }, [SPECIES_SILCOON] = { - .size = 0x75, - .y_offset = 0x11, + .size = MON_COORDS_SIZE(56, 40), + .y_offset = 17, }, [SPECIES_BEAUTIFLY] = { - .size = 0x86, - .y_offset = 0x09, + .size = MON_COORDS_SIZE(64, 48), + .y_offset = 9, }, [SPECIES_CASCOON] = { - .size = 0x74, - .y_offset = 0x10, + .size = MON_COORDS_SIZE(56, 32), + .y_offset = 16, }, [SPECIES_DUSTOX] = { - .size = 0x86, - .y_offset = 0x0f, + .size = MON_COORDS_SIZE(64, 48), + .y_offset = 15, }, [SPECIES_LOTAD] = { - .size = 0x65, - .y_offset = 0x0e, + .size = MON_COORDS_SIZE(48, 40), + .y_offset = 14, }, [SPECIES_LOMBRE] = { - .size = 0x66, - .y_offset = 0x09, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 9, }, [SPECIES_LUDICOLO] = { - .size = 0x88, - .y_offset = 0x00, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 0, }, [SPECIES_SEEDOT] = { - .size = 0x46, - .y_offset = 0x10, + .size = MON_COORDS_SIZE(32, 48), + .y_offset = 16, }, [SPECIES_NUZLEAF] = { - .size = 0x56, - .y_offset = 0x08, + .size = MON_COORDS_SIZE(40, 48), + .y_offset = 8, }, [SPECIES_SHIFTRY] = { - .size = 0x88, - .y_offset = 0x02, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 2, }, [SPECIES_NINCADA] = { - .size = 0x74, - .y_offset = 0x12, + .size = MON_COORDS_SIZE(56, 32), + .y_offset = 18, }, [SPECIES_NINJASK] = { - .size = 0x86, - .y_offset = 0x0a, + .size = MON_COORDS_SIZE(64, 48), + .y_offset = 10, }, [SPECIES_SHEDINJA] = { - .size = 0x66, - .y_offset = 0x0a, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 10, }, [SPECIES_TAILLOW] = { - .size = 0x64, - .y_offset = 0x10, + .size = MON_COORDS_SIZE(48, 32), + .y_offset = 16, }, [SPECIES_SWELLOW] = { - .size = 0x87, - .y_offset = 0x06, + .size = MON_COORDS_SIZE(64, 56), + .y_offset = 6, }, [SPECIES_SHROOMISH] = { - .size = 0x54, - .y_offset = 0x10, + .size = MON_COORDS_SIZE(40, 32), + .y_offset = 16, }, [SPECIES_BRELOOM] = { - .size = 0x77, - .y_offset = 0x04, + .size = MON_COORDS_SIZE(56, 56), + .y_offset = 4, }, [SPECIES_SPINDA] = { - .size = 0x67, - .y_offset = 0x08, + .size = MON_COORDS_SIZE(48, 56), + .y_offset = 8, }, [SPECIES_WINGULL] = { - .size = 0x84, - .y_offset = 0x18, + .size = MON_COORDS_SIZE(64, 32), + .y_offset = 24, }, [SPECIES_PELIPPER] = { - .size = 0x77, - .y_offset = 0x04, + .size = MON_COORDS_SIZE(56, 56), + .y_offset = 4, }, [SPECIES_SURSKIT] = { - .size = 0x65, - .y_offset = 0x0f, + .size = MON_COORDS_SIZE(48, 40), + .y_offset = 15, }, [SPECIES_MASQUERAIN] = { - .size = 0x88, - .y_offset = 0x01, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 1, }, [SPECIES_WAILMER] = { - .size = 0x75, - .y_offset = 0x0f, + .size = MON_COORDS_SIZE(56, 40), + .y_offset = 15, }, [SPECIES_WAILORD] = { - .size = 0x87, - .y_offset = 0x0a, + .size = MON_COORDS_SIZE(64, 56), + .y_offset = 10, }, [SPECIES_SKITTY] = { - .size = 0x66, - .y_offset = 0x0b, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 11, }, [SPECIES_DELCATTY] = { - .size = 0x66, - .y_offset = 0x08, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 8, }, [SPECIES_KECLEON] = { - .size = 0x67, - .y_offset = 0x07, + .size = MON_COORDS_SIZE(48, 56), + .y_offset = 7, }, [SPECIES_BALTOY] = { - .size = 0x55, - .y_offset = 0x10, + .size = MON_COORDS_SIZE(40, 40), + .y_offset = 16, }, [SPECIES_CLAYDOL] = { - .size = 0x78, - .y_offset = 0x06, + .size = MON_COORDS_SIZE(56, 64), + .y_offset = 6, }, [SPECIES_NOSEPASS] = { - .size = 0x56, - .y_offset = 0x0c, + .size = MON_COORDS_SIZE(40, 48), + .y_offset = 12, }, [SPECIES_TORKOAL] = { - .size = 0x88, - .y_offset = 0x02, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 2, }, [SPECIES_SABLEYE] = { - .size = 0x66, - .y_offset = 0x09, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 9, }, [SPECIES_BARBOACH] = { - .size = 0x46, - .y_offset = 0x0b, + .size = MON_COORDS_SIZE(32, 48), + .y_offset = 11, }, [SPECIES_WHISCASH] = { - .size = 0x76, - .y_offset = 0x09, + .size = MON_COORDS_SIZE(56, 48), + .y_offset = 9, }, [SPECIES_LUVDISC] = { - .size = 0x46, - .y_offset = 0x18, + .size = MON_COORDS_SIZE(32, 48), + .y_offset = 24, }, [SPECIES_CORPHISH] = { - .size = 0x66, - .y_offset = 0x0c, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 12, }, [SPECIES_CRAWDAUNT] = { - .size = 0x88, - .y_offset = 0x01, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 1, }, [SPECIES_FEEBAS] = { - .size = 0x46, - .y_offset = 0x0d, + .size = MON_COORDS_SIZE(32, 48), + .y_offset = 13, }, [SPECIES_MILOTIC] = { - .size = 0x88, - .y_offset = 0x00, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 0, }, [SPECIES_CARVANHA] = { - .size = 0x67, - .y_offset = 0x06, + .size = MON_COORDS_SIZE(48, 56), + .y_offset = 6, }, [SPECIES_SHARPEDO] = { - .size = 0x78, - .y_offset = 0x03, + .size = MON_COORDS_SIZE(56, 64), + .y_offset = 3, }, [SPECIES_TRAPINCH] = { - .size = 0x54, - .y_offset = 0x10, + .size = MON_COORDS_SIZE(40, 32), + .y_offset = 16, }, [SPECIES_VIBRAVA] = { - .size = 0x86, - .y_offset = 0x0c, + .size = MON_COORDS_SIZE(64, 48), + .y_offset = 12, }, [SPECIES_FLYGON] = { - .size = 0x88, - .y_offset = 0x01, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 1, }, [SPECIES_MAKUHITA] = { - .size = 0x65, - .y_offset = 0x0c, + .size = MON_COORDS_SIZE(48, 40), + .y_offset = 12, }, [SPECIES_HARIYAMA] = { - .size = 0x88, - .y_offset = 0x01, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 1, }, [SPECIES_ELECTRIKE] = { - .size = 0x64, - .y_offset = 0x12, + .size = MON_COORDS_SIZE(48, 32), + .y_offset = 18, }, [SPECIES_MANECTRIC] = { - .size = 0x67, - .y_offset = 0x04, + .size = MON_COORDS_SIZE(48, 56), + .y_offset = 4, }, [SPECIES_NUMEL] = { - .size = 0x65, - .y_offset = 0x0f, + .size = MON_COORDS_SIZE(48, 40), + .y_offset = 15, }, [SPECIES_CAMERUPT] = { - .size = 0x87, - .y_offset = 0x09, + .size = MON_COORDS_SIZE(64, 56), + .y_offset = 9, }, [SPECIES_SPHEAL] = { - .size = 0x65, - .y_offset = 0x10, + .size = MON_COORDS_SIZE(48, 40), + .y_offset = 16, }, [SPECIES_SEALEO] = { - .size = 0x86, - .y_offset = 0x0a, + .size = MON_COORDS_SIZE(64, 48), + .y_offset = 10, }, [SPECIES_WALREIN] = { - .size = 0x88, - .y_offset = 0x01, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 1, }, [SPECIES_CACNEA] = { - .size = 0x74, - .y_offset = 0x10, + .size = MON_COORDS_SIZE(56, 32), + .y_offset = 16, }, [SPECIES_CACTURNE] = { - .size = 0x88, - .y_offset = 0x00, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 0, }, [SPECIES_SNORUNT] = { - .size = 0x56, - .y_offset = 0x0b, + .size = MON_COORDS_SIZE(40, 48), + .y_offset = 11, }, [SPECIES_GLALIE] = { - .size = 0x76, - .y_offset = 0x0a, + .size = MON_COORDS_SIZE(56, 48), + .y_offset = 10, }, [SPECIES_LUNATONE] = { - .size = 0x66, - .y_offset = 0x09, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 9, }, [SPECIES_SOLROCK] = { - .size = 0x88, - .y_offset = 0x01, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 1, }, [SPECIES_AZURILL] = { - .size = 0x55, - .y_offset = 0x0f, + .size = MON_COORDS_SIZE(40, 40), + .y_offset = 15, }, [SPECIES_SPOINK] = { - .size = 0x46, - .y_offset = 0x09, + .size = MON_COORDS_SIZE(32, 48), + .y_offset = 9, }, [SPECIES_GRUMPIG] = { - .size = 0x77, - .y_offset = 0x05, + .size = MON_COORDS_SIZE(56, 56), + .y_offset = 5, }, [SPECIES_PLUSLE] = { - .size = 0x56, - .y_offset = 0x0e, + .size = MON_COORDS_SIZE(40, 48), + .y_offset = 14, }, [SPECIES_MINUN] = { - .size = 0x66, - .y_offset = 0x0c, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 12, }, [SPECIES_MAWILE] = { - .size = 0x76, - .y_offset = 0x08, + .size = MON_COORDS_SIZE(56, 48), + .y_offset = 8, }, [SPECIES_MEDITITE] = { - .size = 0x65, - .y_offset = 0x0c, + .size = MON_COORDS_SIZE(48, 40), + .y_offset = 12, }, [SPECIES_MEDICHAM] = { - .size = 0x68, - .y_offset = 0x01, + .size = MON_COORDS_SIZE(48, 64), + .y_offset = 1, }, [SPECIES_SWABLU] = { - .size = 0x76, - .y_offset = 0x11, + .size = MON_COORDS_SIZE(56, 48), + .y_offset = 17, }, [SPECIES_ALTARIA] = { - .size = 0x88, - .y_offset = 0x02, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 2, }, [SPECIES_WYNAUT] = { - .size = 0x55, - .y_offset = 0x0c, + .size = MON_COORDS_SIZE(40, 40), + .y_offset = 12, }, [SPECIES_DUSKULL] = { - .size = 0x66, - .y_offset = 0x0a, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 10, }, [SPECIES_DUSCLOPS] = { - .size = 0x77, - .y_offset = 0x05, + .size = MON_COORDS_SIZE(56, 56), + .y_offset = 5, }, [SPECIES_ROSELIA] = { - .size = 0x76, - .y_offset = 0x08, + .size = MON_COORDS_SIZE(56, 48), + .y_offset = 8, }, [SPECIES_SLAKOTH] = { - .size = 0x74, - .y_offset = 0x12, + .size = MON_COORDS_SIZE(56, 32), + .y_offset = 18, }, [SPECIES_VIGOROTH] = { - .size = 0x78, - .y_offset = 0x00, + .size = MON_COORDS_SIZE(56, 64), + .y_offset = 0, }, [SPECIES_SLAKING] = { - .size = 0x86, - .y_offset = 0x08, + .size = MON_COORDS_SIZE(64, 48), + .y_offset = 8, }, [SPECIES_GULPIN] = { - .size = 0x55, - .y_offset = 0x12, + .size = MON_COORDS_SIZE(40, 40), + .y_offset = 18, }, [SPECIES_SWALOT] = { - .size = 0x66, - .y_offset = 0x08, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 8, }, [SPECIES_TROPIUS] = { - .size = 0x88, - .y_offset = 0x00, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 0, }, [SPECIES_WHISMUR] = { - .size = 0x55, - .y_offset = 0x0e, + .size = MON_COORDS_SIZE(40, 40), + .y_offset = 14, }, [SPECIES_LOUDRED] = { - .size = 0x78, - .y_offset = 0x03, + .size = MON_COORDS_SIZE(56, 64), + .y_offset = 3, }, [SPECIES_EXPLOUD] = { - .size = 0x88, - .y_offset = 0x01, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 1, }, [SPECIES_CLAMPERL] = { - .size = 0x55, - .y_offset = 0x0e, + .size = MON_COORDS_SIZE(40, 40), + .y_offset = 14, }, [SPECIES_HUNTAIL] = { - .size = 0x78, - .y_offset = 0x03, + .size = MON_COORDS_SIZE(56, 64), + .y_offset = 3, }, [SPECIES_GOREBYSS] = { - .size = 0x86, - .y_offset = 0x0b, + .size = MON_COORDS_SIZE(64, 48), + .y_offset = 11, }, [SPECIES_ABSOL] = { - .size = 0x68, - .y_offset = 0x00, + .size = MON_COORDS_SIZE(48, 64), + .y_offset = 0, }, [SPECIES_SHUPPET] = { - .size = 0x56, - .y_offset = 0x0e, + .size = MON_COORDS_SIZE(40, 48), + .y_offset = 14, }, [SPECIES_BANETTE] = { - .size = 0x55, - .y_offset = 0x0c, + .size = MON_COORDS_SIZE(40, 40), + .y_offset = 12, }, [SPECIES_SEVIPER] = { - .size = 0x77, - .y_offset = 0x08, + .size = MON_COORDS_SIZE(56, 56), + .y_offset = 8, }, [SPECIES_ZANGOOSE] = { - .size = 0x87, - .y_offset = 0x05, + .size = MON_COORDS_SIZE(64, 56), + .y_offset = 5, }, [SPECIES_RELICANTH] = { - .size = 0x77, - .y_offset = 0x0b, + .size = MON_COORDS_SIZE(56, 56), + .y_offset = 11, }, [SPECIES_ARON] = { - .size = 0x43, - .y_offset = 0x14, + .size = MON_COORDS_SIZE(32, 24), + .y_offset = 20, }, [SPECIES_LAIRON] = { - .size = 0x75, - .y_offset = 0x0d, + .size = MON_COORDS_SIZE(56, 40), + .y_offset = 13, }, [SPECIES_AGGRON] = { - .size = 0x88, - .y_offset = 0x00, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 0, }, [SPECIES_CASTFORM] = { - .size = 0x34, - .y_offset = 0x11, + .size = MON_COORDS_SIZE(24, 32), + .y_offset = 17, }, [SPECIES_VOLBEAT] = { - .size = 0x66, - .y_offset = 0x08, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 8, }, [SPECIES_ILLUMISE] = { - .size = 0x56, - .y_offset = 0x08, + .size = MON_COORDS_SIZE(40, 48), + .y_offset = 8, }, [SPECIES_LILEEP] = { - .size = 0x67, - .y_offset = 0x07, + .size = MON_COORDS_SIZE(48, 56), + .y_offset = 7, }, [SPECIES_CRADILY] = { - .size = 0x78, - .y_offset = 0x00, + .size = MON_COORDS_SIZE(56, 64), + .y_offset = 0, }, [SPECIES_ANORITH] = { - .size = 0x66, - .y_offset = 0x08, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 8, }, [SPECIES_ARMALDO] = { - .size = 0x88, - .y_offset = 0x00, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 0, }, [SPECIES_RALTS] = { - .size = 0x35, - .y_offset = 0x0f, + .size = MON_COORDS_SIZE(24, 40), + .y_offset = 15, }, [SPECIES_KIRLIA] = { - .size = 0x47, - .y_offset = 0x06, + .size = MON_COORDS_SIZE(32, 56), + .y_offset = 6, }, [SPECIES_GARDEVOIR] = { - .size = 0x78, - .y_offset = 0x01, + .size = MON_COORDS_SIZE(56, 64), + .y_offset = 1, }, [SPECIES_BAGON] = { - .size = 0x56, - .y_offset = 0x0b, + .size = MON_COORDS_SIZE(40, 48), + .y_offset = 11, }, [SPECIES_SHELGON] = { - .size = 0x66, - .y_offset = 0x09, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 9, }, [SPECIES_SALAMENCE] = { - .size = 0x87, - .y_offset = 0x04, + .size = MON_COORDS_SIZE(64, 56), + .y_offset = 4, }, [SPECIES_BELDUM] = { - .size = 0x55, - .y_offset = 0x0f, + .size = MON_COORDS_SIZE(40, 40), + .y_offset = 15, }, [SPECIES_METANG] = { - .size = 0x87, - .y_offset = 0x07, + .size = MON_COORDS_SIZE(64, 56), + .y_offset = 7, }, [SPECIES_METAGROSS] = { - .size = 0x87, - .y_offset = 0x06, + .size = MON_COORDS_SIZE(64, 56), + .y_offset = 6, }, [SPECIES_REGIROCK] = { - .size = 0x78, - .y_offset = 0x04, + .size = MON_COORDS_SIZE(56, 64), + .y_offset = 4, }, [SPECIES_REGICE] = { - .size = 0x88, - .y_offset = 0x02, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 2, }, [SPECIES_REGISTEEL] = { - .size = 0x88, - .y_offset = 0x03, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 3, }, [SPECIES_KYOGRE] = { - .size = 0x87, - .y_offset = 0x04, + .size = MON_COORDS_SIZE(64, 56), + .y_offset = 4, }, [SPECIES_GROUDON] = { - .size = 0x88, - .y_offset = 0x01, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 1, }, [SPECIES_RAYQUAZA] = { - .size = 0x88, - .y_offset = 0x00, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 0, }, [SPECIES_LATIAS] = { - .size = 0x88, - .y_offset = 0x01, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 1, }, [SPECIES_LATIOS] = { - .size = 0x88, - .y_offset = 0x02, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 2, }, [SPECIES_JIRACHI] = { - .size = 0x66, - .y_offset = 0x0d, + .size = MON_COORDS_SIZE(48, 48), + .y_offset = 13, }, [SPECIES_DEOXYS] = { - .size = 0x88, - .y_offset = 0x01, + .size = MON_COORDS_SIZE(64, 64), + .y_offset = 1, }, [SPECIES_CHIMECHO] = { - .size = 0x37, - .y_offset = 0x06, + .size = MON_COORDS_SIZE(24, 56), + .y_offset = 6, }, [SPECIES_EGG] = { - .size = 0x33, - .y_offset = 0x14, + .size = MON_COORDS_SIZE(24, 24), + .y_offset = 20, }, [SPECIES_UNOWN_B] = { - .size = 0x34, - .y_offset = 0x10, + .size = MON_COORDS_SIZE(24, 32), + .y_offset = 16, }, [SPECIES_UNOWN_C] = { - .size = 0x44, - .y_offset = 0x10, + .size = MON_COORDS_SIZE(32, 32), + .y_offset = 16, }, [SPECIES_UNOWN_D] = { - .size = 0x44, - .y_offset = 0x10, + .size = MON_COORDS_SIZE(32, 32), + .y_offset = 16, }, [SPECIES_UNOWN_E] = { - .size = 0x44, - .y_offset = 0x11, + .size = MON_COORDS_SIZE(32, 32), + .y_offset = 17, }, [SPECIES_UNOWN_F] = { - .size = 0x44, - .y_offset = 0x11, + .size = MON_COORDS_SIZE(32, 32), + .y_offset = 17, }, [SPECIES_UNOWN_G] = { - .size = 0x35, - .y_offset = 0x0e, + .size = MON_COORDS_SIZE(24, 40), + .y_offset = 14, }, [SPECIES_UNOWN_H] = { - .size = 0x44, - .y_offset = 0x10, + .size = MON_COORDS_SIZE(32, 32), + .y_offset = 16, }, [SPECIES_UNOWN_I] = { - .size = 0x34, - .y_offset = 0x10, + .size = MON_COORDS_SIZE(24, 32), + .y_offset = 16, }, [SPECIES_UNOWN_J] = { - .size = 0x34, - .y_offset = 0x11, + .size = MON_COORDS_SIZE(24, 32), + .y_offset = 17, }, [SPECIES_UNOWN_K] = { - .size = 0x44, - .y_offset = 0x11, + .size = MON_COORDS_SIZE(32, 32), + .y_offset = 17, }, [SPECIES_UNOWN_L] = { - .size = 0x34, - .y_offset = 0x13, + .size = MON_COORDS_SIZE(24, 32), + .y_offset = 19, }, [SPECIES_UNOWN_M] = { - .size = 0x44, - .y_offset = 0x13, + .size = MON_COORDS_SIZE(32, 32), + .y_offset = 19, }, [SPECIES_UNOWN_N] = { - .size = 0x43, - .y_offset = 0x14, + .size = MON_COORDS_SIZE(32, 24), + .y_offset = 20, }, [SPECIES_UNOWN_O] = { - .size = 0x44, - .y_offset = 0x10, + .size = MON_COORDS_SIZE(32, 32), + .y_offset = 16, }, [SPECIES_UNOWN_P] = { - .size = 0x34, - .y_offset = 0x13, + .size = MON_COORDS_SIZE(24, 32), + .y_offset = 19, }, [SPECIES_UNOWN_Q] = { - .size = 0x43, - .y_offset = 0x15, + .size = MON_COORDS_SIZE(32, 24), + .y_offset = 21, }, [SPECIES_UNOWN_R] = { - .size = 0x34, - .y_offset = 0x13, + .size = MON_COORDS_SIZE(24, 32), + .y_offset = 19, }, [SPECIES_UNOWN_S] = { - .size = 0x45, - .y_offset = 0x0c, + .size = MON_COORDS_SIZE(32, 40), + .y_offset = 12, }, [SPECIES_UNOWN_T] = { - .size = 0x34, - .y_offset = 0x12, + .size = MON_COORDS_SIZE(24, 32), + .y_offset = 18, }, [SPECIES_UNOWN_U] = { - .size = 0x44, - .y_offset = 0x12, + .size = MON_COORDS_SIZE(32, 32), + .y_offset = 18, }, [SPECIES_UNOWN_V] = { - .size = 0x44, - .y_offset = 0x12, + .size = MON_COORDS_SIZE(32, 32), + .y_offset = 18, }, [SPECIES_UNOWN_W] = { - .size = 0x44, - .y_offset = 0x13, + .size = MON_COORDS_SIZE(32, 32), + .y_offset = 19, }, [SPECIES_UNOWN_X] = { - .size = 0x33, - .y_offset = 0x15, + .size = MON_COORDS_SIZE(24, 24), + .y_offset = 21, }, [SPECIES_UNOWN_Y] = { - .size = 0x34, - .y_offset = 0x11, + .size = MON_COORDS_SIZE(24, 32), + .y_offset = 17, }, [SPECIES_UNOWN_Z] = { - .size = 0x34, - .y_offset = 0x10, + .size = MON_COORDS_SIZE(24, 32), + .y_offset = 16, }, [SPECIES_UNOWN_EMARK] = { - .size = 0x35, - .y_offset = 0x0f, + .size = MON_COORDS_SIZE(24, 40), + .y_offset = 15, }, [SPECIES_UNOWN_QMARK] = { - .size = 0x35, - .y_offset = 0x0d, + .size = MON_COORDS_SIZE(24, 40), + .y_offset = 13, }, }; diff --git a/src/data/text/move_names.h b/src/data/text/move_names.h index d45972d51..d63ddb871 100644 --- a/src/data/text/move_names.h +++ b/src/data/text/move_names.h @@ -1,357 +1,357 @@ -const u8 gMoveNames[][13] = { - _("-$$$$$$"), - _("POUND"), - _("KARATE CHOP"), - _("DOUBLESLAP"), - _("COMET PUNCH"), - _("MEGA PUNCH"), - _("PAY DAY"), - _("FIRE PUNCH"), - _("ICE PUNCH"), - _("THUNDERPUNCH"), - _("SCRATCH"), - _("VICEGRIP"), - _("GUILLOTINE"), - _("RAZOR WIND"), - _("SWORDS DANCE"), - _("CUT"), - _("GUST"), - _("WING ATTACK"), - _("WHIRLWIND"), - _("FLY"), - _("BIND"), - _("SLAM"), - _("VINE WHIP"), - _("STOMP"), - _("DOUBLE KICK"), - _("MEGA KICK"), - _("JUMP KICK"), - _("ROLLING KICK"), - _("SAND-ATTACK"), - _("HEADBUTT"), - _("HORN ATTACK"), - _("FURY ATTACK"), - _("HORN DRILL"), - _("TACKLE"), - _("BODY SLAM"), - _("WRAP"), - _("TAKE DOWN"), - _("THRASH"), - _("DOUBLE-EDGE"), - _("TAIL WHIP"), - _("POISON STING"), - _("TWINEEDLE"), - _("PIN MISSILE"), - _("LEER"), - _("BITE"), - _("GROWL"), - _("ROAR"), - _("SING"), - _("SUPERSONIC"), - _("SONICBOOM"), - _("DISABLE"), - _("ACID"), - _("EMBER"), - _("FLAMETHROWER"), - _("MIST"), - _("WATER GUN"), - _("HYDRO PUMP"), - _("SURF"), - _("ICE BEAM"), - _("BLIZZARD"), - _("PSYBEAM"), - _("BUBBLEBEAM"), - _("AURORA BEAM"), - _("HYPER BEAM"), - _("PECK"), - _("DRILL PECK"), - _("SUBMISSION"), - _("LOW KICK"), - _("COUNTER"), - _("SEISMIC TOSS"), - _("STRENGTH"), - _("ABSORB"), - _("MEGA DRAIN"), - _("LEECH SEED"), - _("GROWTH"), - _("RAZOR LEAF"), - _("SOLARBEAM"), - _("POISONPOWDER"), - _("STUN SPORE"), - _("SLEEP POWDER"), - _("PETAL DANCE"), - _("STRING SHOT"), - _("DRAGON RAGE"), - _("FIRE SPIN"), - _("THUNDERSHOCK"), - _("THUNDERBOLT"), - _("THUNDER WAVE"), - _("THUNDER"), - _("ROCK THROW"), - _("EARTHQUAKE"), - _("FISSURE"), - _("DIG"), - _("TOXIC"), - _("CONFUSION"), - _("PSYCHIC"), - _("HYPNOSIS"), - _("MEDITATE"), - _("AGILITY"), - _("QUICK ATTACK"), - _("RAGE"), - _("TELEPORT"), - _("NIGHT SHADE"), - _("MIMIC"), - _("SCREECH"), - _("DOUBLE TEAM"), - _("RECOVER"), - _("HARDEN"), - _("MINIMIZE"), - _("SMOKESCREEN"), - _("CONFUSE RAY"), - _("WITHDRAW"), - _("DEFENSE CURL"), - _("BARRIER"), - _("LIGHT SCREEN"), - _("HAZE"), - _("REFLECT"), - _("FOCUS ENERGY"), - _("BIDE"), - _("METRONOME"), - _("MIRROR MOVE"), - _("SELFDESTRUCT"), - _("EGG BOMB"), - _("LICK"), - _("SMOG"), - _("SLUDGE"), - _("BONE CLUB"), - _("FIRE BLAST"), - _("WATERFALL"), - _("CLAMP"), - _("SWIFT"), - _("SKULL BASH"), - _("SPIKE CANNON"), - _("CONSTRICT"), - _("AMNESIA"), - _("KINESIS"), - _("SOFTBOILED"), - _("HI JUMP KICK"), - _("GLARE"), - _("DREAM EATER"), - _("POISON GAS"), - _("BARRAGE"), - _("LEECH LIFE"), - _("LOVELY KISS"), - _("SKY ATTACK"), - _("TRANSFORM"), - _("BUBBLE"), - _("DIZZY PUNCH"), - _("SPORE"), - _("FLASH"), - _("PSYWAVE"), - _("SPLASH"), - _("ACID ARMOR"), - _("CRABHAMMER"), - _("EXPLOSION"), - _("FURY SWIPES"), - _("BONEMERANG"), - _("REST"), - _("ROCK SLIDE"), - _("HYPER FANG"), - _("SHARPEN"), - _("CONVERSION"), - _("TRI ATTACK"), - _("SUPER FANG"), - _("SLASH"), - _("SUBSTITUTE"), - _("STRUGGLE"), - _("SKETCH"), - _("TRIPLE KICK"), - _("THIEF"), - _("SPIDER WEB"), - _("MIND READER"), - _("NIGHTMARE"), - _("FLAME WHEEL"), - _("SNORE"), - _("CURSE"), - _("FLAIL"), - _("CONVERSION 2"), - _("AEROBLAST"), - _("COTTON SPORE"), - _("REVERSAL"), - _("SPITE"), - _("POWDER SNOW"), - _("PROTECT"), - _("MACH PUNCH"), - _("SCARY FACE"), - _("FAINT ATTACK"), - _("SWEET KISS"), - _("BELLY DRUM"), - _("SLUDGE BOMB"), - _("MUD-SLAP"), - _("OCTAZOOKA"), - _("SPIKES"), - _("ZAP CANNON"), - _("FORESIGHT"), - _("DESTINY BOND"), - _("PERISH SONG"), - _("ICY WIND"), - _("DETECT"), - _("BONE RUSH"), - _("LOCK-ON"), - _("OUTRAGE"), - _("SANDSTORM"), - _("GIGA DRAIN"), - _("ENDURE"), - _("CHARM"), - _("ROLLOUT"), - _("FALSE SWIPE"), - _("SWAGGER"), - _("MILK DRINK"), - _("SPARK"), - _("FURY CUTTER"), - _("STEEL WING"), - _("MEAN LOOK"), - _("ATTRACT"), - _("SLEEP TALK"), - _("HEAL BELL"), - _("RETURN"), - _("PRESENT"), - _("FRUSTRATION"), - _("SAFEGUARD"), - _("PAIN SPLIT"), - _("SACRED FIRE"), - _("MAGNITUDE"), - _("DYNAMICPUNCH"), - _("MEGAHORN"), - _("DRAGONBREATH"), - _("BATON PASS"), - _("ENCORE"), - _("PURSUIT"), - _("RAPID SPIN"), - _("SWEET SCENT"), - _("IRON TAIL"), - _("METAL CLAW"), - _("VITAL THROW"), - _("MORNING SUN"), - _("SYNTHESIS"), - _("MOONLIGHT"), - _("HIDDEN POWER"), - _("CROSS CHOP"), - _("TWISTER"), - _("RAIN DANCE"), - _("SUNNY DAY"), - _("CRUNCH"), - _("MIRROR COAT"), - _("PSYCH UP"), - _("EXTREMESPEED"), - _("ANCIENTPOWER"), - _("SHADOW BALL"), - _("FUTURE SIGHT"), - _("ROCK SMASH"), - _("WHIRLPOOL"), - _("BEAT UP"), - _("FAKE OUT"), - _("UPROAR"), - _("STOCKPILE"), - _("SPIT UP"), - _("SWALLOW"), - _("HEAT WAVE"), - _("HAIL"), - _("TORMENT"), - _("FLATTER"), - _("WILL-O-WISP"), - _("MEMENTO"), - _("FACADE"), - _("FOCUS PUNCH"), - _("SMELLINGSALT"), - _("FOLLOW ME"), - _("NATURE POWER"), - _("CHARGE"), - _("TAUNT"), - _("HELPING HAND"), - _("TRICK"), - _("ROLE PLAY"), - _("WISH"), - _("ASSIST"), - _("INGRAIN"), - _("SUPERPOWER"), - _("MAGIC COAT"), - _("RECYCLE"), - _("REVENGE"), - _("BRICK BREAK"), - _("YAWN"), - _("KNOCK OFF"), - _("ENDEAVOR"), - _("ERUPTION"), - _("SKILL SWAP"), - _("IMPRISON"), - _("REFRESH"), - _("GRUDGE"), - _("SNATCH"), - _("SECRET POWER"), - _("DIVE"), - _("ARM THRUST"), - _("CAMOUFLAGE"), - _("TAIL GLOW"), - _("LUSTER PURGE"), - _("MIST BALL"), - _("FEATHERDANCE"), - _("TEETER DANCE"), - _("BLAZE KICK"), - _("MUD SPORT"), - _("ICE BALL"), - _("NEEDLE ARM"), - _("SLACK OFF"), - _("HYPER VOICE"), - _("POISON FANG"), - _("CRUSH CLAW"), - _("BLAST BURN"), - _("HYDRO CANNON"), - _("METEOR MASH"), - _("ASTONISH"), - _("WEATHER BALL"), - _("AROMATHERAPY"), - _("FAKE TEARS"), - _("AIR CUTTER"), - _("OVERHEAT"), - _("ODOR SLEUTH"), - _("ROCK TOMB"), - _("SILVER WIND"), - _("METAL SOUND"), - _("GRASSWHISTLE"), - _("TICKLE"), - _("COSMIC POWER"), - _("WATER SPOUT"), - _("SIGNAL BEAM"), - _("SHADOW PUNCH"), - _("EXTRASENSORY"), - _("SKY UPPERCUT"), - _("SAND TOMB"), - _("SHEER COLD"), - _("MUDDY WATER"), - _("BULLET SEED"), - _("AERIAL ACE"), - _("ICICLE SPEAR"), - _("IRON DEFENSE"), - _("BLOCK"), - _("HOWL"), - _("DRAGON CLAW"), - _("FRENZY PLANT"), - _("BULK UP"), - _("BOUNCE"), - _("MUD SHOT"), - _("POISON TAIL"), - _("COVET"), - _("VOLT TACKLE"), - _("MAGICAL LEAF"), - _("WATER SPORT"), - _("CALM MIND"), - _("LEAF BLADE"), - _("DRAGON DANCE"), - _("ROCK BLAST"), - _("SHOCK WAVE"), - _("WATER PULSE"), - _("DOOM DESIRE"), - _("PSYCHO BOOST") +const u8 gMoveNames[MOVES_COUNT][MOVE_NAME_LENGTH + 1] = { + [MOVE_NONE] = _("-$$$$$$"), + [MOVE_POUND] = _("POUND"), + [MOVE_KARATE_CHOP] = _("KARATE CHOP"), + [MOVE_DOUBLE_SLAP] = _("DOUBLESLAP"), + [MOVE_COMET_PUNCH] = _("COMET PUNCH"), + [MOVE_MEGA_PUNCH] = _("MEGA PUNCH"), + [MOVE_PAY_DAY] = _("PAY DAY"), + [MOVE_FIRE_PUNCH] = _("FIRE PUNCH"), + [MOVE_ICE_PUNCH] = _("ICE PUNCH"), + [MOVE_THUNDER_PUNCH] = _("THUNDERPUNCH"), + [MOVE_SCRATCH] = _("SCRATCH"), + [MOVE_VICE_GRIP] = _("VICEGRIP"), + [MOVE_GUILLOTINE] = _("GUILLOTINE"), + [MOVE_RAZOR_WIND] = _("RAZOR WIND"), + [MOVE_SWORDS_DANCE] = _("SWORDS DANCE"), + [MOVE_CUT] = _("CUT"), + [MOVE_GUST] = _("GUST"), + [MOVE_WING_ATTACK] = _("WING ATTACK"), + [MOVE_WHIRLWIND] = _("WHIRLWIND"), + [MOVE_FLY] = _("FLY"), + [MOVE_BIND] = _("BIND"), + [MOVE_SLAM] = _("SLAM"), + [MOVE_VINE_WHIP] = _("VINE WHIP"), + [MOVE_STOMP] = _("STOMP"), + [MOVE_DOUBLE_KICK] = _("DOUBLE KICK"), + [MOVE_MEGA_KICK] = _("MEGA KICK"), + [MOVE_JUMP_KICK] = _("JUMP KICK"), + [MOVE_ROLLING_KICK] = _("ROLLING KICK"), + [MOVE_SAND_ATTACK] = _("SAND-ATTACK"), + [MOVE_HEADBUTT] = _("HEADBUTT"), + [MOVE_HORN_ATTACK] = _("HORN ATTACK"), + [MOVE_FURY_ATTACK] = _("FURY ATTACK"), + [MOVE_HORN_DRILL] = _("HORN DRILL"), + [MOVE_TACKLE] = _("TACKLE"), + [MOVE_BODY_SLAM] = _("BODY SLAM"), + [MOVE_WRAP] = _("WRAP"), + [MOVE_TAKE_DOWN] = _("TAKE DOWN"), + [MOVE_THRASH] = _("THRASH"), + [MOVE_DOUBLE_EDGE] = _("DOUBLE-EDGE"), + [MOVE_TAIL_WHIP] = _("TAIL WHIP"), + [MOVE_POISON_STING] = _("POISON STING"), + [MOVE_TWINEEDLE] = _("TWINEEDLE"), + [MOVE_PIN_MISSILE] = _("PIN MISSILE"), + [MOVE_LEER] = _("LEER"), + [MOVE_BITE] = _("BITE"), + [MOVE_GROWL] = _("GROWL"), + [MOVE_ROAR] = _("ROAR"), + [MOVE_SING] = _("SING"), + [MOVE_SUPERSONIC] = _("SUPERSONIC"), + [MOVE_SONIC_BOOM] = _("SONICBOOM"), + [MOVE_DISABLE] = _("DISABLE"), + [MOVE_ACID] = _("ACID"), + [MOVE_EMBER] = _("EMBER"), + [MOVE_FLAMETHROWER] = _("FLAMETHROWER"), + [MOVE_MIST] = _("MIST"), + [MOVE_WATER_GUN] = _("WATER GUN"), + [MOVE_HYDRO_PUMP] = _("HYDRO PUMP"), + [MOVE_SURF] = _("SURF"), + [MOVE_ICE_BEAM] = _("ICE BEAM"), + [MOVE_BLIZZARD] = _("BLIZZARD"), + [MOVE_PSYBEAM] = _("PSYBEAM"), + [MOVE_BUBBLE_BEAM] = _("BUBBLEBEAM"), + [MOVE_AURORA_BEAM] = _("AURORA BEAM"), + [MOVE_HYPER_BEAM] = _("HYPER BEAM"), + [MOVE_PECK] = _("PECK"), + [MOVE_DRILL_PECK] = _("DRILL PECK"), + [MOVE_SUBMISSION] = _("SUBMISSION"), + [MOVE_LOW_KICK] = _("LOW KICK"), + [MOVE_COUNTER] = _("COUNTER"), + [MOVE_SEISMIC_TOSS] = _("SEISMIC TOSS"), + [MOVE_STRENGTH] = _("STRENGTH"), + [MOVE_ABSORB] = _("ABSORB"), + [MOVE_MEGA_DRAIN] = _("MEGA DRAIN"), + [MOVE_LEECH_SEED] = _("LEECH SEED"), + [MOVE_GROWTH] = _("GROWTH"), + [MOVE_RAZOR_LEAF] = _("RAZOR LEAF"), + [MOVE_SOLAR_BEAM] = _("SOLARBEAM"), + [MOVE_POISON_POWDER] = _("POISONPOWDER"), + [MOVE_STUN_SPORE] = _("STUN SPORE"), + [MOVE_SLEEP_POWDER] = _("SLEEP POWDER"), + [MOVE_PETAL_DANCE] = _("PETAL DANCE"), + [MOVE_STRING_SHOT] = _("STRING SHOT"), + [MOVE_DRAGON_RAGE] = _("DRAGON RAGE"), + [MOVE_FIRE_SPIN] = _("FIRE SPIN"), + [MOVE_THUNDER_SHOCK] = _("THUNDERSHOCK"), + [MOVE_THUNDERBOLT] = _("THUNDERBOLT"), + [MOVE_THUNDER_WAVE] = _("THUNDER WAVE"), + [MOVE_THUNDER] = _("THUNDER"), + [MOVE_ROCK_THROW] = _("ROCK THROW"), + [MOVE_EARTHQUAKE] = _("EARTHQUAKE"), + [MOVE_FISSURE] = _("FISSURE"), + [MOVE_DIG] = _("DIG"), + [MOVE_TOXIC] = _("TOXIC"), + [MOVE_CONFUSION] = _("CONFUSION"), + [MOVE_PSYCHIC] = _("PSYCHIC"), + [MOVE_HYPNOSIS] = _("HYPNOSIS"), + [MOVE_MEDITATE] = _("MEDITATE"), + [MOVE_AGILITY] = _("AGILITY"), + [MOVE_QUICK_ATTACK] = _("QUICK ATTACK"), + [MOVE_RAGE] = _("RAGE"), + [MOVE_TELEPORT] = _("TELEPORT"), + [MOVE_NIGHT_SHADE] = _("NIGHT SHADE"), + [MOVE_MIMIC] = _("MIMIC"), + [MOVE_SCREECH] = _("SCREECH"), + [MOVE_DOUBLE_TEAM] = _("DOUBLE TEAM"), + [MOVE_RECOVER] = _("RECOVER"), + [MOVE_HARDEN] = _("HARDEN"), + [MOVE_MINIMIZE] = _("MINIMIZE"), + [MOVE_SMOKESCREEN] = _("SMOKESCREEN"), + [MOVE_CONFUSE_RAY] = _("CONFUSE RAY"), + [MOVE_WITHDRAW] = _("WITHDRAW"), + [MOVE_DEFENSE_CURL] = _("DEFENSE CURL"), + [MOVE_BARRIER] = _("BARRIER"), + [MOVE_LIGHT_SCREEN] = _("LIGHT SCREEN"), + [MOVE_HAZE] = _("HAZE"), + [MOVE_REFLECT] = _("REFLECT"), + [MOVE_FOCUS_ENERGY] = _("FOCUS ENERGY"), + [MOVE_BIDE] = _("BIDE"), + [MOVE_METRONOME] = _("METRONOME"), + [MOVE_MIRROR_MOVE] = _("MIRROR MOVE"), + [MOVE_SELF_DESTRUCT] = _("SELFDESTRUCT"), + [MOVE_EGG_BOMB] = _("EGG BOMB"), + [MOVE_LICK] = _("LICK"), + [MOVE_SMOG] = _("SMOG"), + [MOVE_SLUDGE] = _("SLUDGE"), + [MOVE_BONE_CLUB] = _("BONE CLUB"), + [MOVE_FIRE_BLAST] = _("FIRE BLAST"), + [MOVE_WATERFALL] = _("WATERFALL"), + [MOVE_CLAMP] = _("CLAMP"), + [MOVE_SWIFT] = _("SWIFT"), + [MOVE_SKULL_BASH] = _("SKULL BASH"), + [MOVE_SPIKE_CANNON] = _("SPIKE CANNON"), + [MOVE_CONSTRICT] = _("CONSTRICT"), + [MOVE_AMNESIA] = _("AMNESIA"), + [MOVE_KINESIS] = _("KINESIS"), + [MOVE_SOFT_BOILED] = _("SOFTBOILED"), + [MOVE_HI_JUMP_KICK] = _("HI JUMP KICK"), + [MOVE_GLARE] = _("GLARE"), + [MOVE_DREAM_EATER] = _("DREAM EATER"), + [MOVE_POISON_GAS] = _("POISON GAS"), + [MOVE_BARRAGE] = _("BARRAGE"), + [MOVE_LEECH_LIFE] = _("LEECH LIFE"), + [MOVE_LOVELY_KISS] = _("LOVELY KISS"), + [MOVE_SKY_ATTACK] = _("SKY ATTACK"), + [MOVE_TRANSFORM] = _("TRANSFORM"), + [MOVE_BUBBLE] = _("BUBBLE"), + [MOVE_DIZZY_PUNCH] = _("DIZZY PUNCH"), + [MOVE_SPORE] = _("SPORE"), + [MOVE_FLASH] = _("FLASH"), + [MOVE_PSYWAVE] = _("PSYWAVE"), + [MOVE_SPLASH] = _("SPLASH"), + [MOVE_ACID_ARMOR] = _("ACID ARMOR"), + [MOVE_CRABHAMMER] = _("CRABHAMMER"), + [MOVE_EXPLOSION] = _("EXPLOSION"), + [MOVE_FURY_SWIPES] = _("FURY SWIPES"), + [MOVE_BONEMERANG] = _("BONEMERANG"), + [MOVE_REST] = _("REST"), + [MOVE_ROCK_SLIDE] = _("ROCK SLIDE"), + [MOVE_HYPER_FANG] = _("HYPER FANG"), + [MOVE_SHARPEN] = _("SHARPEN"), + [MOVE_CONVERSION] = _("CONVERSION"), + [MOVE_TRI_ATTACK] = _("TRI ATTACK"), + [MOVE_SUPER_FANG] = _("SUPER FANG"), + [MOVE_SLASH] = _("SLASH"), + [MOVE_SUBSTITUTE] = _("SUBSTITUTE"), + [MOVE_STRUGGLE] = _("STRUGGLE"), + [MOVE_SKETCH] = _("SKETCH"), + [MOVE_TRIPLE_KICK] = _("TRIPLE KICK"), + [MOVE_THIEF] = _("THIEF"), + [MOVE_SPIDER_WEB] = _("SPIDER WEB"), + [MOVE_MIND_READER] = _("MIND READER"), + [MOVE_NIGHTMARE] = _("NIGHTMARE"), + [MOVE_FLAME_WHEEL] = _("FLAME WHEEL"), + [MOVE_SNORE] = _("SNORE"), + [MOVE_CURSE] = _("CURSE"), + [MOVE_FLAIL] = _("FLAIL"), + [MOVE_CONVERSION_2] = _("CONVERSION 2"), + [MOVE_AEROBLAST] = _("AEROBLAST"), + [MOVE_COTTON_SPORE] = _("COTTON SPORE"), + [MOVE_REVERSAL] = _("REVERSAL"), + [MOVE_SPITE] = _("SPITE"), + [MOVE_POWDER_SNOW] = _("POWDER SNOW"), + [MOVE_PROTECT] = _("PROTECT"), + [MOVE_MACH_PUNCH] = _("MACH PUNCH"), + [MOVE_SCARY_FACE] = _("SCARY FACE"), + [MOVE_FAINT_ATTACK] = _("FAINT ATTACK"), + [MOVE_SWEET_KISS] = _("SWEET KISS"), + [MOVE_BELLY_DRUM] = _("BELLY DRUM"), + [MOVE_SLUDGE_BOMB] = _("SLUDGE BOMB"), + [MOVE_MUD_SLAP] = _("MUD-SLAP"), + [MOVE_OCTAZOOKA] = _("OCTAZOOKA"), + [MOVE_SPIKES] = _("SPIKES"), + [MOVE_ZAP_CANNON] = _("ZAP CANNON"), + [MOVE_FORESIGHT] = _("FORESIGHT"), + [MOVE_DESTINY_BOND] = _("DESTINY BOND"), + [MOVE_PERISH_SONG] = _("PERISH SONG"), + [MOVE_ICY_WIND] = _("ICY WIND"), + [MOVE_DETECT] = _("DETECT"), + [MOVE_BONE_RUSH] = _("BONE RUSH"), + [MOVE_LOCK_ON] = _("LOCK-ON"), + [MOVE_OUTRAGE] = _("OUTRAGE"), + [MOVE_SANDSTORM] = _("SANDSTORM"), + [MOVE_GIGA_DRAIN] = _("GIGA DRAIN"), + [MOVE_ENDURE] = _("ENDURE"), + [MOVE_CHARM] = _("CHARM"), + [MOVE_ROLLOUT] = _("ROLLOUT"), + [MOVE_FALSE_SWIPE] = _("FALSE SWIPE"), + [MOVE_SWAGGER] = _("SWAGGER"), + [MOVE_MILK_DRINK] = _("MILK DRINK"), + [MOVE_SPARK] = _("SPARK"), + [MOVE_FURY_CUTTER] = _("FURY CUTTER"), + [MOVE_STEEL_WING] = _("STEEL WING"), + [MOVE_MEAN_LOOK] = _("MEAN LOOK"), + [MOVE_ATTRACT] = _("ATTRACT"), + [MOVE_SLEEP_TALK] = _("SLEEP TALK"), + [MOVE_HEAL_BELL] = _("HEAL BELL"), + [MOVE_RETURN] = _("RETURN"), + [MOVE_PRESENT] = _("PRESENT"), + [MOVE_FRUSTRATION] = _("FRUSTRATION"), + [MOVE_SAFEGUARD] = _("SAFEGUARD"), + [MOVE_PAIN_SPLIT] = _("PAIN SPLIT"), + [MOVE_SACRED_FIRE] = _("SACRED FIRE"), + [MOVE_MAGNITUDE] = _("MAGNITUDE"), + [MOVE_DYNAMIC_PUNCH] = _("DYNAMICPUNCH"), + [MOVE_MEGAHORN] = _("MEGAHORN"), + [MOVE_DRAGON_BREATH] = _("DRAGONBREATH"), + [MOVE_BATON_PASS] = _("BATON PASS"), + [MOVE_ENCORE] = _("ENCORE"), + [MOVE_PURSUIT] = _("PURSUIT"), + [MOVE_RAPID_SPIN] = _("RAPID SPIN"), + [MOVE_SWEET_SCENT] = _("SWEET SCENT"), + [MOVE_IRON_TAIL] = _("IRON TAIL"), + [MOVE_METAL_CLAW] = _("METAL CLAW"), + [MOVE_VITAL_THROW] = _("VITAL THROW"), + [MOVE_MORNING_SUN] = _("MORNING SUN"), + [MOVE_SYNTHESIS] = _("SYNTHESIS"), + [MOVE_MOONLIGHT] = _("MOONLIGHT"), + [MOVE_HIDDEN_POWER] = _("HIDDEN POWER"), + [MOVE_CROSS_CHOP] = _("CROSS CHOP"), + [MOVE_TWISTER] = _("TWISTER"), + [MOVE_RAIN_DANCE] = _("RAIN DANCE"), + [MOVE_SUNNY_DAY] = _("SUNNY DAY"), + [MOVE_CRUNCH] = _("CRUNCH"), + [MOVE_MIRROR_COAT] = _("MIRROR COAT"), + [MOVE_PSYCH_UP] = _("PSYCH UP"), + [MOVE_EXTREME_SPEED] = _("EXTREMESPEED"), + [MOVE_ANCIENT_POWER] = _("ANCIENTPOWER"), + [MOVE_SHADOW_BALL] = _("SHADOW BALL"), + [MOVE_FUTURE_SIGHT] = _("FUTURE SIGHT"), + [MOVE_ROCK_SMASH] = _("ROCK SMASH"), + [MOVE_WHIRLPOOL] = _("WHIRLPOOL"), + [MOVE_BEAT_UP] = _("BEAT UP"), + [MOVE_FAKE_OUT] = _("FAKE OUT"), + [MOVE_UPROAR] = _("UPROAR"), + [MOVE_STOCKPILE] = _("STOCKPILE"), + [MOVE_SPIT_UP] = _("SPIT UP"), + [MOVE_SWALLOW] = _("SWALLOW"), + [MOVE_HEAT_WAVE] = _("HEAT WAVE"), + [MOVE_HAIL] = _("HAIL"), + [MOVE_TORMENT] = _("TORMENT"), + [MOVE_FLATTER] = _("FLATTER"), + [MOVE_WILL_O_WISP] = _("WILL-O-WISP"), + [MOVE_MEMENTO] = _("MEMENTO"), + [MOVE_FACADE] = _("FACADE"), + [MOVE_FOCUS_PUNCH] = _("FOCUS PUNCH"), + [MOVE_SMELLING_SALT] = _("SMELLINGSALT"), + [MOVE_FOLLOW_ME] = _("FOLLOW ME"), + [MOVE_NATURE_POWER] = _("NATURE POWER"), + [MOVE_CHARGE] = _("CHARGE"), + [MOVE_TAUNT] = _("TAUNT"), + [MOVE_HELPING_HAND] = _("HELPING HAND"), + [MOVE_TRICK] = _("TRICK"), + [MOVE_ROLE_PLAY] = _("ROLE PLAY"), + [MOVE_WISH] = _("WISH"), + [MOVE_ASSIST] = _("ASSIST"), + [MOVE_INGRAIN] = _("INGRAIN"), + [MOVE_SUPERPOWER] = _("SUPERPOWER"), + [MOVE_MAGIC_COAT] = _("MAGIC COAT"), + [MOVE_RECYCLE] = _("RECYCLE"), + [MOVE_REVENGE] = _("REVENGE"), + [MOVE_BRICK_BREAK] = _("BRICK BREAK"), + [MOVE_YAWN] = _("YAWN"), + [MOVE_KNOCK_OFF] = _("KNOCK OFF"), + [MOVE_ENDEAVOR] = _("ENDEAVOR"), + [MOVE_ERUPTION] = _("ERUPTION"), + [MOVE_SKILL_SWAP] = _("SKILL SWAP"), + [MOVE_IMPRISON] = _("IMPRISON"), + [MOVE_REFRESH] = _("REFRESH"), + [MOVE_GRUDGE] = _("GRUDGE"), + [MOVE_SNATCH] = _("SNATCH"), + [MOVE_SECRET_POWER] = _("SECRET POWER"), + [MOVE_DIVE] = _("DIVE"), + [MOVE_ARM_THRUST] = _("ARM THRUST"), + [MOVE_CAMOUFLAGE] = _("CAMOUFLAGE"), + [MOVE_TAIL_GLOW] = _("TAIL GLOW"), + [MOVE_LUSTER_PURGE] = _("LUSTER PURGE"), + [MOVE_MIST_BALL] = _("MIST BALL"), + [MOVE_FEATHER_DANCE] = _("FEATHERDANCE"), + [MOVE_TEETER_DANCE] = _("TEETER DANCE"), + [MOVE_BLAZE_KICK] = _("BLAZE KICK"), + [MOVE_MUD_SPORT] = _("MUD SPORT"), + [MOVE_ICE_BALL] = _("ICE BALL"), + [MOVE_NEEDLE_ARM] = _("NEEDLE ARM"), + [MOVE_SLACK_OFF] = _("SLACK OFF"), + [MOVE_HYPER_VOICE] = _("HYPER VOICE"), + [MOVE_POISON_FANG] = _("POISON FANG"), + [MOVE_CRUSH_CLAW] = _("CRUSH CLAW"), + [MOVE_BLAST_BURN] = _("BLAST BURN"), + [MOVE_HYDRO_CANNON] = _("HYDRO CANNON"), + [MOVE_METEOR_MASH] = _("METEOR MASH"), + [MOVE_ASTONISH] = _("ASTONISH"), + [MOVE_WEATHER_BALL] = _("WEATHER BALL"), + [MOVE_AROMATHERAPY] = _("AROMATHERAPY"), + [MOVE_FAKE_TEARS] = _("FAKE TEARS"), + [MOVE_AIR_CUTTER] = _("AIR CUTTER"), + [MOVE_OVERHEAT] = _("OVERHEAT"), + [MOVE_ODOR_SLEUTH] = _("ODOR SLEUTH"), + [MOVE_ROCK_TOMB] = _("ROCK TOMB"), + [MOVE_SILVER_WIND] = _("SILVER WIND"), + [MOVE_METAL_SOUND] = _("METAL SOUND"), + [MOVE_GRASS_WHISTLE] = _("GRASSWHISTLE"), + [MOVE_TICKLE] = _("TICKLE"), + [MOVE_COSMIC_POWER] = _("COSMIC POWER"), + [MOVE_WATER_SPOUT] = _("WATER SPOUT"), + [MOVE_SIGNAL_BEAM] = _("SIGNAL BEAM"), + [MOVE_SHADOW_PUNCH] = _("SHADOW PUNCH"), + [MOVE_EXTRASENSORY] = _("EXTRASENSORY"), + [MOVE_SKY_UPPERCUT] = _("SKY UPPERCUT"), + [MOVE_SAND_TOMB] = _("SAND TOMB"), + [MOVE_SHEER_COLD] = _("SHEER COLD"), + [MOVE_MUDDY_WATER] = _("MUDDY WATER"), + [MOVE_BULLET_SEED] = _("BULLET SEED"), + [MOVE_AERIAL_ACE] = _("AERIAL ACE"), + [MOVE_ICICLE_SPEAR] = _("ICICLE SPEAR"), + [MOVE_IRON_DEFENSE] = _("IRON DEFENSE"), + [MOVE_BLOCK] = _("BLOCK"), + [MOVE_HOWL] = _("HOWL"), + [MOVE_DRAGON_CLAW] = _("DRAGON CLAW"), + [MOVE_FRENZY_PLANT] = _("FRENZY PLANT"), + [MOVE_BULK_UP] = _("BULK UP"), + [MOVE_BOUNCE] = _("BOUNCE"), + [MOVE_MUD_SHOT] = _("MUD SHOT"), + [MOVE_POISON_TAIL] = _("POISON TAIL"), + [MOVE_COVET] = _("COVET"), + [MOVE_VOLT_TACKLE] = _("VOLT TACKLE"), + [MOVE_MAGICAL_LEAF] = _("MAGICAL LEAF"), + [MOVE_WATER_SPORT] = _("WATER SPORT"), + [MOVE_CALM_MIND] = _("CALM MIND"), + [MOVE_LEAF_BLADE] = _("LEAF BLADE"), + [MOVE_DRAGON_DANCE] = _("DRAGON DANCE"), + [MOVE_ROCK_BLAST] = _("ROCK BLAST"), + [MOVE_SHOCK_WAVE] = _("SHOCK WAVE"), + [MOVE_WATER_PULSE] = _("WATER PULSE"), + [MOVE_DOOM_DESIRE] = _("DOOM DESIRE"), + [MOVE_PSYCHO_BOOST] = _("PSYCHO BOOST") }; diff --git a/src/data/tilesets/graphics.h b/src/data/tilesets/graphics.h index f82df8a6e..5e6791a66 100644 --- a/src/data/tilesets/graphics.h +++ b/src/data/tilesets/graphics.h @@ -922,9 +922,11 @@ const u16 gTilesetPalettes_SeaCottage[][16] = INCBIN_U16("data/tilesets/secondary/sea_cottage/palettes/15.gbapal"), }; -const u32 gTilesetTiles_SilphCo[] = INCBIN_U32("data/tilesets/secondary/condominiums/tiles.4bpp.lz"); +// Shared by SilphCo +const u32 gTilesetTiles_Condominiums[] = INCBIN_U32("data/tilesets/secondary/condominiums/tiles.4bpp.lz"); -const u16 gTilesetPalettes_SilphCo[][16] = +// Shared by SilphCo +const u16 gTilesetPalettes_Condominiums[][16] = { INCBIN_U16("data/tilesets/secondary/condominiums/palettes/00.gbapal"), INCBIN_U16("data/tilesets/secondary/condominiums/palettes/01.gbapal"), diff --git a/src/data/tilesets/headers.h b/src/data/tilesets/headers.h index 2e4ddb901..676bd2105 100644 --- a/src/data/tilesets/headers.h +++ b/src/data/tilesets/headers.h @@ -497,8 +497,8 @@ const struct Tileset gTileset_SilphCo = { .isCompressed = TRUE, .isSecondary = TRUE, - .tiles = gTilesetTiles_SilphCo, - .palettes = gTilesetPalettes_SilphCo, + .tiles = gTilesetTiles_Condominiums, + .palettes = gTilesetPalettes_Condominiums, .metatiles = gMetatiles_SilphCo, .metatileAttributes = gMetatileAttributes_SilphCo, .callback = InitTilesetAnim_SilphCo, @@ -585,8 +585,8 @@ const struct Tileset gTileset_Condominiums = { .isCompressed = TRUE, .isSecondary = TRUE, - .tiles = gTilesetTiles_SilphCo, - .palettes = gTilesetPalettes_SilphCo, + .tiles = gTilesetTiles_Condominiums, + .palettes = gTilesetPalettes_Condominiums, .metatiles = gMetatiles_Condominiums, .metatileAttributes = gMetatileAttributes_Condominiums, .callback = NULL, diff --git a/src/field_control_avatar.c b/src/field_control_avatar.c index 31dd27e17..9a7d55edc 100644 --- a/src/field_control_avatar.c +++ b/src/field_control_avatar.c @@ -600,7 +600,7 @@ static const u8 *GetInteractedMetatileScript(struct MapPosition *position, u8 me static const u8 *GetInteractedWaterScript(struct MapPosition *unused1, u8 metatileBehavior, u8 direction) { - if (MetatileBehavior_IsSemiDeepWater(metatileBehavior) == TRUE &&PartyHasMonWithSurf() == TRUE) + if (MetatileBehavior_IsFastWater(metatileBehavior) == TRUE && PartyHasMonWithSurf() == TRUE) return EventScript_CurrentTooFast; if (FlagGet(FLAG_BADGE05_GET) == TRUE && PartyHasMonWithSurf() == TRUE && IsPlayerFacingSurfableFishableWater() == TRUE) return EventScript_UseSurf; diff --git a/src/field_door.c b/src/field_door.c index e9f403d7c..c2cd4e6f0 100644 --- a/src/field_door.c +++ b/src/field_door.c @@ -251,7 +251,11 @@ static const struct DoorGraphics sDoorGraphics[] = { {METATILE_CeruleanCity_Door, DOOR_SOUND_NORMAL, 0, sDoorAnimTiles_Cerulean, sDoorAnimPalettes_Cerulean}, {METATILE_LavenderTown_Door, DOOR_SOUND_NORMAL, 0, sDoorAnimTiles_Lavender, sDoorAnimPalettes_Lavender}, {METATILE_VermilionCity_Door, DOOR_SOUND_NORMAL, 0, sDoorAnimTiles_Vermilion, sDoorAnimPalettes_Vermilion}, - {METATILE_VermilionCity_PokemonFanClubDoor, DOOR_SOUND_NORMAL, 0, sDoorAnimTiles_PokemonFanClub, sDoorAnimPalettes_PokemonFanClub}, +/* Below was presumably intended for the door to the Pokemon Fan Club. The metatile is surrounded by metatiles for the fan club building. + Its animation tiles are similar to the Vermilion door above, and the building on the map uses that metatile instead. The unused tiles + have the pokeball above the door in view, but on the map the pokeball above the door is too high to be in view. + The metatile below was subsequently re-used for the warp to enter the SS Anne from the harbor, which has no door. */ + {METATILE_VermilionCity_SSAnneWarp, DOOR_SOUND_NORMAL, 0, sDoorAnimTiles_PokemonFanClub, sDoorAnimPalettes_PokemonFanClub}, {METATILE_CeladonCity_DeptStoreDoor, DOOR_SOUND_SLIDING, 0, sDoorAnimTiles_DeptStore, sDoorAnimPalettes_DeptStore}, {METATILE_FuchsiaCity_Door, DOOR_SOUND_NORMAL, 0, sDoorAnimTiles_Fuchsia, sDoorAnimPalettes_Fuchsia}, {METATILE_FuchsiaCity_SafariZoneDoor, DOOR_SOUND_SLIDING, 0, sDoorAnimTiles_SafariZone, sDoorAnimPalettes_SafariZone}, diff --git a/src/graphics.c b/src/graphics.c index 0cdca0e46..8a11d58a5 100644 --- a/src/graphics.c +++ b/src/graphics.c @@ -1121,16 +1121,16 @@ const u32 gBerryPouchSpritePalette[] = INCBIN_U32("graphics/berry_pouch/berry_po const u8 gBerryPouchBg1Tilemap[] = INCBIN_U8("graphics/berry_pouch/background.bin.lz"); const u32 gBuyMenuFrame_Gfx[] = INCBIN_U32("graphics/shop_menu/shop_menu.4bpp.lz"); -const u32 gBuyMenuFrame_Tilemap[] = INCBIN_U32("graphics/shop_menu/shop_tilemap.bin"); -const u32 gBuyMenuFrame_TmHmTilemap[] = INCBIN_U32("graphics/shop_menu/shop_tm_hm_tilemap.bin"); +const u32 gBuyMenuFrame_Tilemap[] = INCBIN_U32("graphics/shop_menu/shop_tilemap.bin.lz"); +const u32 gBuyMenuFrame_TmHmTilemap[] = INCBIN_U32("graphics/shop_menu/shop_tm_hm_tilemap.bin.lz"); const u32 gBuyMenuFrame_Pal[] = INCBIN_U32("graphics/shop_menu/shop_menu.gbapal.lz"); const u32 gUnknown_8E861A8[] = INCBIN_U32("graphics/unknown/unknown_E861A8.bin.lz"); -const u8 gUnknown_8E86240[] = INCBIN_U8("graphics/teachy_tv/tiles.4bpp.lz"); -const u8 gUnknown_8E86BE8[] = INCBIN_U8("graphics/teachy_tv/bg1_tilemap.bin.lz"); -const u8 gUnknown_8E86D6C[] = INCBIN_U8("graphics/teachy_tv/bg2_tilemap.bin.lz"); -const u32 gUnknown_8E86F98[] = INCBIN_U32("graphics/teachy_tv/palettes.gbapal.lz"); +const u8 gTeachyTv_Gfx[] = INCBIN_U8("graphics/teachy_tv/tiles.4bpp.lz"); +const u8 gTeachyTvScreen_Tilemap[] = INCBIN_U8("graphics/teachy_tv/screen.bin.lz"); +const u8 gTeachyTvTitle_Tilemap[] = INCBIN_U8("graphics/teachy_tv/title.bin.lz"); +const u32 gTeachyTv_Pal[] = INCBIN_U32("graphics/teachy_tv/tiles.gbapal.lz"); const u32 gUnknown_8E87010[] = INCBIN_U32("graphics/unknown/unknown_E87010.gbapal.lz"); @@ -1237,11 +1237,11 @@ const u16 gMonMarkingsMenu_Pal[] = INCBIN_U16("graphics/misc/markings2.gbapal"); const u16 gMonMarkingsMenu_Gfx[] = INCBIN_U16("graphics/misc/markings2.4bpp"); const u16 gTradeMenu_Pal[] = INCBIN_U16("graphics/trade/menu.gbapal"); -const u16 gTradeButtons_Pal[] = INCBIN_U16("graphics/trade/unknown_DDB444.gbapal"); +const u16 gTradeCursor_Pal[] = INCBIN_U16("graphics/trade/cursor.gbapal"); const u16 gTradeMenu_Gfx[] = INCBIN_U16("graphics/trade/menu.4bpp"); -const u16 gTradeButtons_Gfx[] = INCBIN_U16("graphics/trade/buttons.4bpp"); -const u16 gUnknown_8E9E9DC[] = INCBIN_U16("graphics/unused/unused_DDCEE4.bin"); -const u16 gUnknown_8E9E9FC[] = INCBIN_U16("graphics/trade/unknown_DDCF04.bin"); +const u16 gTradeCursor_Gfx[] = INCBIN_U16("graphics/trade/cursor.4bpp"); +const u16 gTradeUnused_Tilemap[] = INCBIN_U16("graphics/trade/unused.bin"); +const u16 gTradeMenu_Tilemap[] = INCBIN_U16("graphics/trade/menu.bin"); const u16 gTradeMenuMonBox_Tilemap[] = INCBIN_U16("graphics/trade/menu_mon_box.bin"); const u16 gFameCheckerBgPals[] = INCBIN_U16("graphics/fame_checker/bg.gbapal"); @@ -1392,7 +1392,6 @@ const u32 gTradeGba_Gfx[] = INCBIN_U32("graphics/link/gba.4bpp"); const u16 gUnknown_8EAFE80[] = INCBIN_U16("graphics/interface/blank2.gbapal"); -const u16 gBerryCrush_Crusher_Pal[] = INCBIN_U16("graphics/berry_crush/berry_crush.gbapal"); -const u16 gUnknown_8EAFF60[] = INCBIN_U16("graphics/unknown/unknown_EAFF60.gbapal"); -const u32 gBerryCrush_Crusher_Gfx[] = INCBIN_U32("graphics/berry_crush/berry_crush.4bpp.lz"); -const u32 gBerryCrush_Crusher_Tilemap[] = INCBIN_U32("graphics/berry_crush/data_EB0ADC.bin.lz"); +const u16 gBerryCrush_Crusher_Pal[] = INCBIN_U16("graphics/berry_crush/crusher.gbapal"); +const u32 gBerryCrush_Crusher_Gfx[] = INCBIN_U32("graphics/berry_crush/crusher.4bpp.lz"); +const u32 gBerryCrush_TextWindows_Tilemap[] = INCBIN_U32("graphics/berry_crush/text_windows.bin.lz"); diff --git a/src/link.c b/src/link.c index 3125f13fa..323e8570a 100644 --- a/src/link.c +++ b/src/link.c @@ -764,7 +764,7 @@ u8 GetLinkPlayerDataExchangeStatusTimed(int minPlayers, int maxPlayers) { if (gLinkPlayers[0].linkType == LINKTYPE_TRADE_SETUP) { - switch (Trade_CalcLinkPlayerCompatibilityParam()) + switch (GetGameProgressForLinkTrade()) { case TRADE_BOTH_PLAYERS_READY: sPlayerDataExchangeStatus = EXCHANGE_COMPLETE; diff --git a/src/link_rfu_3.c b/src/link_rfu_3.c index 6a9d27606..078a28ff8 100644 --- a/src/link_rfu_3.c +++ b/src/link_rfu_3.c @@ -667,7 +667,7 @@ void InitHostRfuGameData(struct RfuGameData *data, u8 activity, bool32 startedAc data->compatibility.hasNews = FALSE; data->compatibility.hasCard = FALSE; data->compatibility.unknown = FALSE; - data->compatibility.isChampion = FlagGet(FLAG_SYS_CAN_LINK_WITH_RS); + data->compatibility.canLinkNationally = FlagGet(FLAG_SYS_CAN_LINK_WITH_RS); data->compatibility.hasNationalDex = IsNationalPokedexEnabled(); data->compatibility.gameClear = FlagGet(FLAG_SYS_GAME_CLEAR); } diff --git a/src/m4a_1.s b/src/m4a_1.s index 994f8892d..fce796744 100644 --- a/src/m4a_1.s +++ b/src/m4a_1.s @@ -48,10 +48,10 @@ SoundMain_2: adds r1, r2 SoundMain_3: str r1, [sp, 0x14] - ldr r3, [r0, o_SoundInfo_func] + ldr r3, [r0, o_SoundInfo_MPlayMainHead] cmp r3, 0 beq SoundMain_4 - ldr r0, [r0, o_SoundInfo_intp] + ldr r0, [r0, o_SoundInfo_musicPlayerHead] bl _081DD25E ldr r0, [sp, 0x18] SoundMain_4: @@ -169,74 +169,74 @@ _081DCF54: .pool _081DCF60: - ldrb r6, [r4, o_SoundChannel_status] - movs r0, 0xC7 + ldrb r6, [r4, o_SoundChannel_statusFlags] + movs r0, SOUND_CHANNEL_SF_ON tst r0, r6 bne _081DCF6A b _081DD240 _081DCF6A: - movs r0, 0x80 + movs r0, SOUND_CHANNEL_SF_START tst r0, r6 beq _081DCFA0 - movs r0, 0x40 + movs r0, SOUND_CHANNEL_SF_STOP tst r0, r6 bne _081DCFB0 - movs r6, 0x3 - strb r6, [r4, o_SoundChannel_status] + movs r6, SOUND_CHANNEL_SF_ENV_ATTACK + strb r6, [r4, o_SoundChannel_statusFlags] adds r0, r3, 0 - adds r0, 0x10 - ldr r1, [r4, o_SoundChannel_ct] + adds r0, o_WaveData_data + ldr r1, [r4, o_SoundChannel_count] adds r0, r1 - str r0, [r4, o_SoundChannel_cp] - ldr r0, [r3, 0xC] + str r0, [r4, o_SoundChannel_currentPointer] + ldr r0, [r3, o_WaveData_size] subs r0, r1 - str r0, [r4, o_SoundChannel_ct] + str r0, [r4, o_SoundChannel_count] movs r5, 0 - strb r5, [r4, o_SoundChannel_ev] + strb r5, [r4, o_SoundChannel_envelopeVolume] str r5, [r4, o_SoundChannel_fw] - ldrb r2, [r3, 0x3] - movs r0, 0xC0 + ldrb r2, [r3, o_WaveData_flags] + movs r0, WAVE_DATA_FLAG_LOOP tst r0, r2 beq _081DCFF8 - movs r0, 0x10 + movs r0, SOUND_CHANNEL_SF_LOOP orrs r6, r0 - strb r6, [r4, o_SoundChannel_status] + strb r6, [r4, o_SoundChannel_statusFlags] b _081DCFF8 _081DCFA0: - ldrb r5, [r4, o_SoundChannel_ev] - movs r0, 0x4 + ldrb r5, [r4, o_SoundChannel_envelopeVolume] + movs r0, SOUND_CHANNEL_SF_IEC tst r0, r6 beq _081DCFB6 - ldrb r0, [r4, o_SoundChannel_iel] + ldrb r0, [r4, o_SoundChannel_pseudoEchoLength] subs r0, 1 - strb r0, [r4, o_SoundChannel_iel] + strb r0, [r4, o_SoundChannel_pseudoEchoLength] bhi _081DD006 _081DCFB0: movs r0, 0 - strb r0, [r4, o_SoundChannel_status] + strb r0, [r4, o_SoundChannel_statusFlags] b _081DD240 _081DCFB6: - movs r0, 0x40 + movs r0, SOUND_CHANNEL_SF_STOP tst r0, r6 beq _081DCFD6 ldrb r0, [r4, o_SoundChannel_release] muls r5, r0 lsrs r5, 8 - ldrb r0, [r4, o_SoundChannel_iev] + ldrb r0, [r4, o_SoundChannel_pseudoEchoVolume] cmp r5, r0 bhi _081DD006 _081DCFC8: - ldrb r5, [r4, o_SoundChannel_iev] + ldrb r5, [r4, o_SoundChannel_pseudoEchoVolume] cmp r5, 0 beq _081DCFB0 - movs r0, 0x4 + movs r0, SOUND_CHANNEL_SF_IEC orrs r6, r0 - strb r6, [r4, o_SoundChannel_status] + strb r6, [r4, o_SoundChannel_statusFlags] b _081DD006 _081DCFD6: - movs r2, 0x3 + movs r2, SOUND_CHANNEL_SF_ENV ands r2, r6 - cmp r2, 0x2 + cmp r2, SOUND_CHANNEL_SF_ENV_DECAY bne _081DCFF4 ldrb r0, [r4, o_SoundChannel_decay] muls r5, r0 @@ -247,10 +247,10 @@ _081DCFD6: adds r5, r0, 0 beq _081DCFC8 subs r6, 0x1 - strb r6, [r4, o_SoundChannel_status] + strb r6, [r4, o_SoundChannel_statusFlags] b _081DD006 _081DCFF4: - cmp r2, 0x3 + cmp r2, SOUND_CHANNEL_SF_ENV_ATTACK bne _081DD006 _081DCFF8: ldrb r0, [r4, o_SoundChannel_attack] @@ -259,9 +259,9 @@ _081DCFF8: bcc _081DD006 movs r5, 0xFF subs r6, 0x1 - strb r6, [r4, o_SoundChannel_status] + strb r6, [r4, o_SoundChannel_statusFlags] _081DD006: - strb r5, [r4, o_SoundChannel_ev] + strb r5, [r4, o_SoundChannel_envelopeVolume] ldr r0, [sp, 0x18] ldrb r0, [r0, o_SoundChannel_release] adds r0, 0x1 @@ -270,37 +270,37 @@ _081DD006: ldrb r0, [r4, o_SoundChannel_rightVolume] muls r0, r5 lsrs r0, 8 - strb r0, [r4, o_SoundChannel_er] + strb r0, [r4, o_SoundChannel_envelopeVolumeRight] ldrb r0, [r4, o_SoundChannel_leftVolume] muls r0, r5 lsrs r0, 8 - strb r0, [r4, o_SoundChannel_el] - movs r0, 0x10 + strb r0, [r4, o_SoundChannel_envelopeVolumeLeft] + movs r0, SOUND_CHANNEL_SF_LOOP ands r0, r6 str r0, [sp, 0x10] beq _081DD03A adds r0, r3, 0 - adds r0, 0x10 - ldr r1, [r3, 0x8] + adds r0, o_WaveData_data + ldr r1, [r3, o_WaveData_loopStart] adds r0, r1 str r0, [sp, 0xC] - ldr r0, [r3, 0xC] + ldr r0, [r3, o_WaveData_size] subs r0, r1 str r0, [sp, 0x10] _081DD03A: ldr r5, [sp, 0x8] - ldr r2, [r4, o_SoundChannel_ct] - ldr r3, [r4, o_SoundChannel_cp] + ldr r2, [r4, o_SoundChannel_count] + ldr r3, [r4, o_SoundChannel_currentPointer] adr r0, _081DD044 bx r0 .arm _081DD044: str r8, [sp] ldr r9, [r4, o_SoundChannel_fw] - ldrb r10, [r4, o_SoundChannel_er] - ldrb r11, [r4, o_SoundChannel_el] + ldrb r10, [r4, o_SoundChannel_envelopeVolumeRight] + ldrb r11, [r4, o_SoundChannel_envelopeVolumeLeft] ldrb r0, [r4, o_SoundChannel_type] - tst r0, 0x30 + tst r0, TONEDATA_TYPE_CMP | TONEDATA_TYPE_REV beq _081DD068 bl SoundMainRAM_Unk1 b _081DD228 @@ -324,7 +324,7 @@ _081DD07C: moveq r2, 0x4 _081DD0A8: ldr r6, [r5] - ldr r7, [r5, 0x630] + ldr r7, [r5, PCM_DMA_BUF_SIZE] _081DD0B0: ldrsb r0, [r3], 0x1 mul r1, r10, r0 @@ -335,7 +335,7 @@ _081DD0B0: add r7, r1, r7, ror 8 adds r5, r5, 0x40000000 bcc _081DD0B0 - str r7, [r5, 0x630] + str r7, [r5, PCM_DMA_BUF_SIZE] str r6, [r5], 0x4 subs r8, r8, 0x4 bgt _081DD0A8 @@ -343,7 +343,7 @@ _081DD0B0: beq _081DD22C _081DD0EC: ldr r6, [r5] - ldr r7, [r5, 0x630] + ldr r7, [r5, PCM_DMA_BUF_SIZE] _081DD0F4: ldrsb r0, [r3], 0x1 mul r1, r10, r0 @@ -357,7 +357,7 @@ _081DD0F4: _081DD118: adds r5, r5, 0x40000000 bcc _081DD0F4 - str r7, [r5, 0x630] + str r7, [r5, PCM_DMA_BUF_SIZE] str r6, [r5], 0x4 subs r8, r8, 0x4 bgt _081DD07C @@ -383,26 +383,26 @@ _081DD164: ldrne r3, [sp, 0xC] bne _081DD118 _081DD174: - strb r2, [r4, o_SoundChannel_status] + strb r2, [r4, o_SoundChannel_statusFlags] mov r0, r5, lsr 30 bic r5, r5, 0xC0000000 rsb r0, r0, 0x3 mov r0, r0, lsl 3 mov r6, r6, ror r0 mov r7, r7, ror r0 - str r7, [r5, 0x630] + str r7, [r5, PCM_DMA_BUF_SIZE] str r6, [r5], 0x4 b _081DD234 _081DD19C: push {r4,r12} - ldr r1, [r4, o_SoundChannel_freq] + ldr r1, [r4, o_SoundChannel_frequency] mul r4, r12, r1 ldrsb r0, [r3] ldrsb r1, [r3, 0x1]! sub r1, r1, r0 _081DD1B4: ldr r6, [r5] - ldr r7, [r5, 0x630] + ldr r7, [r5, PCM_DMA_BUF_SIZE] _081DD1BC: mul lr, r9, r1 add lr, r0, lr, asr 23 @@ -427,7 +427,7 @@ _081DD1FC: _081DD208: adds r5, r5, 0x40000000 bcc _081DD1BC - str r7, [r5, 0x630] + str r7, [r5, PCM_DMA_BUF_SIZE] str r6, [r5], 0x4 subs r8, r8, 0x4 bgt _081DD1B4 @@ -436,8 +436,8 @@ _081DD208: _081DD228: str r9, [r4, o_SoundChannel_fw] _081DD22C: - str r2, [r4, o_SoundChannel_ct] - str r3, [r4, o_SoundChannel_cp] + str r2, [r4, o_SoundChannel_count] + str r3, [r4, o_SoundChannel_currentPointer] _081DD234: ldr r8, [sp] add r0, pc, 0x1 @@ -469,42 +469,42 @@ _081DD25E: arm_func_start SoundMainRAM_Unk1 SoundMainRAM_Unk1: ldr r6, [r4, o_SoundChannel_wav] - ldrb r0, [r4, o_SoundChannel_status] - tst r0, 0x20 + ldrb r0, [r4, o_SoundChannel_statusFlags] + tst r0, SOUND_CHANNEL_SF_SPECIAL bne _081DD2B4 - orr r0, r0, 0x20 - strb r0, [r4, o_SoundChannel_status] + orr r0, r0, SOUND_CHANNEL_SF_SPECIAL + strb r0, [r4, o_SoundChannel_statusFlags] ldrb r0, [r4, o_SoundChannel_type] - tst r0, 0x10 + tst r0, TONEDATA_TYPE_REV beq _081DD29C - ldr r1, [r6, 0xC] + ldr r1, [r6, o_WaveData_size] add r1, r1, r6, lsl 1 add r1, r1, 0x20 sub r3, r1, r3 - str r3, [r4, o_SoundChannel_cp] + str r3, [r4, o_SoundChannel_currentPointer] _081DD29C: - ldrh r0, [r6] + ldrh r0, [r6, o_WaveData_type] cmp r0, 0 beq _081DD2B4 sub r3, r3, r6 sub r3, r3, 0x10 - str r3, [r4, o_SoundChannel_cp] + str r3, [r4, o_SoundChannel_currentPointer] _081DD2B4: push {r8,r12,lr} mov r10, r10, lsl 16 mov r11, r11, lsl 16 - ldr r1, [r4, o_SoundChannel_freq] + ldr r1, [r4, o_SoundChannel_frequency] ldrb r0, [r4, o_SoundChannel_type] - tst r0, 0x8 + tst r0, TONEDATA_TYPE_FIX movne r8, 0x800000 muleq r8, r12, r1 - ldrh r0, [r6] + ldrh r0, [r6, o_WaveData_type] cmp r0, 0 beq _081DD468 mov r0, 0xFF000000 str r0, [r4, o_SoundChannel_xpi] ldrb r0, [r4, o_SoundChannel_type] - tst r0, 0x10 + tst r0, TONEDATA_TYPE_REV bne _081DD3C0 bl SoundMainRAM_Unk2 mov r0, r1 @@ -513,7 +513,7 @@ _081DD2B4: sub r1, r1, r0 _081DD308: ldr r6, [r5] - ldr r7, [r5, 0x630] + ldr r7, [r5, PCM_DMA_BUF_SIZE] _081DD310: mul lr, r9, r1 add lr, r0, lr, asr 23 @@ -544,7 +544,7 @@ _081DD364: _081DD370: adds r5, r5, 0x40000000 bcc _081DD310 - str r7, [r5, 0x630] + str r7, [r5, PCM_DMA_BUF_SIZE] str r6, [r5], 0x4 ldr r6, [sp] subs r6, r6, 0x4 @@ -557,7 +557,7 @@ _081DD398: cmp r0, 0 beq _081DD4F4 ldr r3, [r4, o_SoundChannel_wav] - ldr r3, [r3, 0x8] + ldr r3, [r3, o_WaveData_loopStart] rsb lr, r2, 0 _081DD3B0: adds r2, r2, r0 @@ -573,7 +573,7 @@ _081DD3C0: sub r1, r1, r0 _081DD3D8: ldr r6, [r5] - ldr r7, [r5, 0x630] + ldr r7, [r5, PCM_DMA_BUF_SIZE] _081DD3E0: mul lr, r9, r1 add lr, r0, lr, asr 23 @@ -604,7 +604,7 @@ _081DD434: _081DD440: adds r5, r5, 0x40000000 bcc _081DD3E0 - str r7, [r5, 0x630] + str r7, [r5, PCM_DMA_BUF_SIZE] str r6, [r5], 0x4 ldr r6, [sp] subs r6, r6, 0x4 @@ -614,7 +614,7 @@ _081DD440: b _081DD4F0 _081DD468: ldrb r0, [r4, o_SoundChannel_type] - tst r0, 0x10 + tst r0, TONEDATA_TYPE_REV beq _081DD4F0 ldrsb r0, [r3, -0x1]! ldrsb r1, [r3, -0x1] @@ -654,7 +654,7 @@ _081DD4F0: pop {r8,r12,pc} _081DD4F4: mov r2, 0 - strb r2, [r4, o_SoundChannel_status] + strb r2, [r4, o_SoundChannel_statusFlags] mov r0, r5, lsr 30 bic r5, r5, 0xC0000000 rsb r0, r0, 0x3 @@ -725,24 +725,24 @@ SoundMainBTM: thumb_func_start RealClearChain RealClearChain: - ldr r3, [r0, 0x2C] + ldr r3, [r0, o_SoundChannel_track] cmp r3, 0 beq _081DD5E2 - ldr r1, [r0, 0x34] - ldr r2, [r0, 0x30] + ldr r1, [r0, o_SoundChannel_nextChannelPointer] + ldr r2, [r0, o_SoundChannel_prevChannelPointer] cmp r2, 0 beq _081DD5D6 - str r1, [r2, 0x34] + str r1, [r2, o_SoundChannel_nextChannelPointer] b _081DD5D8 _081DD5D6: - str r1, [r3, 0x20] + str r1, [r3, o_MusicPlayerTrack_chan] _081DD5D8: cmp r1, 0 beq _081DD5DE - str r2, [r1, 0x30] + str r2, [r1, o_SoundChannel_prevChannelPointer] _081DD5DE: movs r1, 0 - str r1, [r0, 0x2C] + str r1, [r0, o_SoundChannel_track] _081DD5E2: bx lr thumb_func_end RealClearChain @@ -755,22 +755,22 @@ ply_fine: cmp r4, 0 beq ply_fine_done ply_fine_loop: - ldrb r1, [r4] - movs r0, 0xC7 + ldrb r1, [r4, o_SoundChannel_statusFlags] + movs r0, SOUND_CHANNEL_SF_ON tst r0, r1 beq ply_fine_ok - movs r0, 0x40 + movs r0, SOUND_CHANNEL_SF_STOP orrs r1, r0 - strb r1, [r4] + strb r1, [r4, o_SoundChannel_statusFlags] ply_fine_ok: adds r0, r4, 0 bl RealClearChain - ldr r4, [r4, 0x34] + ldr r4, [r4, o_SoundChannel_nextChannelPointer] cmp r4, 0 bne ply_fine_loop ply_fine_done: movs r0, 0 - strb r0, [r5] + strb r0, [r5, o_MusicPlayerTrack_flags] pop {r4,r5} pop {r0} bx r0 @@ -820,10 +820,10 @@ lt_MPlayJumpTableTemplate: .word gMPlayJumpTableTemplate thumb_func_start ld_r3_tp_adr_i ld_r3_tp_adr_i: - ldr r2, [r1, 0x40] + ldr r2, [r1, o_MusicPlayerTrack_cmdPtr] _081DD64A: adds r3, r2, 0x1 - str r3, [r1, 0x40] + str r3, [r1, o_MusicPlayerTrack_cmdPtr] ldrb r3, [r2] b chk_adr_r2 thumb_func_end ld_r3_tp_adr_i @@ -954,13 +954,13 @@ ply_voice: lsls r2, 2 ldr r3, [r0, o_MusicPlayerInfo_tone] adds r2, r3 - ldr r3, [r2] + ldr r3, [r2, o_ToneData_type] bl chk_adr_r2 str r3, [r1, o_MusicPlayerTrack_ToneData_type] - ldr r3, [r2, 0x4] + ldr r3, [r2, o_ToneData_wav] bl chk_adr_r2 str r3, [r1, o_MusicPlayerTrack_ToneData_wav] - ldr r3, [r2, 0x8] + ldr r3, [r2, o_ToneData_attack] bl chk_adr_r2 str r3, [r1, o_MusicPlayerTrack_ToneData_attack] bx r12 @@ -972,7 +972,7 @@ ply_vol: bl ld_r3_tp_adr_i strb r3, [r1, o_MusicPlayerTrack_vol] ldrb r3, [r1, o_MusicPlayerTrack_flags] - movs r2, 0x3 + movs r2, MPT_FLG_VOLCHG orrs r3, r2 strb r3, [r1, o_MusicPlayerTrack_flags] bx r12 @@ -982,10 +982,10 @@ ply_vol: ply_pan: mov r12, lr bl ld_r3_tp_adr_i - subs r3, 0x40 + subs r3, C_V strb r3, [r1, o_MusicPlayerTrack_pan] ldrb r3, [r1, o_MusicPlayerTrack_flags] - movs r2, 0x3 + movs r2, MPT_FLG_VOLCHG orrs r3, r2 strb r3, [r1, o_MusicPlayerTrack_flags] bx r12 @@ -995,10 +995,10 @@ ply_pan: ply_bend: mov r12, lr bl ld_r3_tp_adr_i - subs r3, 0x40 + subs r3, C_V strb r3, [r1, o_MusicPlayerTrack_bend] ldrb r3, [r1, o_MusicPlayerTrack_flags] - movs r2, 0xC + movs r2, MPT_FLG_PITCHG orrs r3, r2 strb r3, [r1, o_MusicPlayerTrack_flags] bx r12 @@ -1010,7 +1010,7 @@ ply_bendr: bl ld_r3_tp_adr_i strb r3, [r1, o_MusicPlayerTrack_bendRange] ldrb r3, [r1, o_MusicPlayerTrack_flags] - movs r2, 0xC + movs r2, MPT_FLG_PITCHG orrs r3, r2 strb r3, [r1, o_MusicPlayerTrack_flags] bx r12 @@ -1033,7 +1033,7 @@ ply_modt: beq _081DD7AA strb r3, [r1, o_MusicPlayerTrack_modT] ldrb r3, [r1, o_MusicPlayerTrack_flags] - movs r2, 0xF + movs r2, MPT_FLG_VOLCHG | MPT_FLG_PITCHG orrs r3, r2 strb r3, [r1, o_MusicPlayerTrack_flags] _081DD7AA: @@ -1044,10 +1044,10 @@ _081DD7AA: ply_tune: mov r12, lr bl ld_r3_tp_adr_i - subs r3, 0x40 + subs r3, C_V strb r3, [r1, o_MusicPlayerTrack_tune] ldrb r3, [r1, o_MusicPlayerTrack_flags] - movs r2, 0xC + movs r2, MPT_FLG_PITCHG orrs r3, r2 strb r3, [r1, o_MusicPlayerTrack_flags] bx r12 @@ -1176,8 +1176,8 @@ _081DD874: movs r3, 0x1 movs r4, 0 _081DD87C: - ldrb r0, [r5] - movs r1, 0x80 + ldrb r0, [r5, o_MusicPlayerTrack_flags] + movs r1, MPT_FLG_EXIST tst r1, r0 bne _081DD886 b _081DD998 @@ -1189,36 +1189,36 @@ _081DD886: cmp r4, 0 beq _081DD8BA _081DD892: - ldrb r1, [r4] - movs r0, 0xC7 + ldrb r1, [r4, o_SoundChannel_statusFlags] + movs r0, SOUND_CHANNEL_SF_ON tst r0, r1 beq _081DD8AE - ldrb r0, [r4, 0x10] + ldrb r0, [r4, o_SoundChannel_gateTime] cmp r0, 0 beq _081DD8B4 subs r0, 0x1 - strb r0, [r4, 0x10] + strb r0, [r4, o_SoundChannel_gateTime] bne _081DD8B4 - movs r0, 0x40 + movs r0, SOUND_CHANNEL_SF_STOP orrs r1, r0 - strb r1, [r4] + strb r1, [r4, o_SoundChannel_statusFlags] b _081DD8B4 _081DD8AE: adds r0, r4, 0 bl ClearChain _081DD8B4: - ldr r4, [r4, 0x34] + ldr r4, [r4, o_SoundChannel_nextChannelPointer] cmp r4, 0 bne _081DD892 _081DD8BA: ldrb r3, [r5, o_MusicPlayerTrack_flags] - movs r0, 0x40 + movs r0, MPT_FLG_START tst r0, r3 beq _081DD938 adds r0, r5, 0 bl Clear64byte - movs r0, 0x80 - strb r0, [r5] + movs r0, MPT_FLG_EXIST + strb r0, [r5, o_MusicPlayerTrack_flags] movs r0, 0x2 strb r0, [r5, o_MusicPlayerTrack_bendRange] movs r0, 0x40 @@ -1321,10 +1321,10 @@ _081DD972: ldrb r1, [r5, o_MusicPlayerTrack_modT] cmp r1, 0 bne _081DD98E - movs r1, 0xC + movs r1, MPT_FLG_PITCHG b _081DD990 _081DD98E: - movs r1, 0x3 + movs r1, MPT_FLG_VOLCHG _081DD990: orrs r0, r1 strb r0, [r5, o_MusicPlayerTrack_flags] @@ -1334,7 +1334,7 @@ _081DD994: _081DD998: subs r6, 0x1 ble _081DD9A4 - movs r0, 0x50 + movs r0, MusicPlayerTrack_size adds r5, r0 lsls r3, 1 b _081DD87C @@ -1351,10 +1351,10 @@ _081DD9A4: _081DD9B6: str r4, [r7, o_MusicPlayerInfo_status] ldrh r0, [r7, o_MusicPlayerInfo_tempoC] - subs r0, 0x96 + subs r0, 150 _081DD9BC: strh r0, [r7, o_MusicPlayerInfo_tempoC] - cmp r0, 0x96 + cmp r0, 150 bcc _081DD9C4 b _081DD874 _081DD9C4: @@ -1365,7 +1365,7 @@ _081DD9C8: movs r1, 0x80 tst r1, r0 beq _081DDA62 - movs r1, 0xF + movs r1, MPT_FLG_VOLCHG | MPT_FLG_PITCHG tst r1, r0 beq _081DDA62 mov r9, r2 @@ -1376,8 +1376,8 @@ _081DD9C8: cmp r4, 0 beq _081DDA58 _081DD9E6: - ldrb r1, [r4, o_SoundChannel_status] - movs r0, 0xC7 + ldrb r1, [r4, o_SoundChannel_statusFlags] + movs r0, SOUND_CHANNEL_SF_ON tst r0, r1 bne _081DD9F6 adds r0, r4, 0 @@ -1385,26 +1385,26 @@ _081DD9E6: b _081DDA52 _081DD9F6: ldrb r0, [r4, o_SoundChannel_type] - movs r6, 0x7 + movs r6, TONEDATA_TYPE_CGB ands r6, r0 ldrb r3, [r5, o_MusicPlayerTrack_flags] - movs r0, 0x3 + movs r0, MPT_FLG_VOLCHG tst r0, r3 beq _081DDA14 bl ChnVolSetAsm cmp r6, 0 beq _081DDA14 - ldrb r0, [r4, o_CgbChannel_mo] + ldrb r0, [r4, o_CgbChannel_modify] movs r1, 0x1 orrs r0, r1 - strb r0, [r4, o_CgbChannel_mo] + strb r0, [r4, o_CgbChannel_modify] _081DDA14: ldrb r3, [r5, o_MusicPlayerTrack_flags] - movs r0, 0xC + movs r0, MPT_FLG_PITCHG tst r0, r3 beq _081DDA52 - ldrb r1, [r4, o_SoundChannel_ky] - movs r0, 0x8 + ldrb r1, [r4, o_SoundChannel_key] + movs r0, o_MusicPlayerTrack_keyM ldrsb r0, [r5, r0] adds r2, r1, r0 bpl _081DDA28 @@ -1418,20 +1418,20 @@ _081DDA28: ldrb r2, [r5, o_MusicPlayerTrack_pitM] adds r0, r6, 0 bl call_r3 - str r0, [r4, o_CgbChannel_fr] - ldrb r0, [r4, o_CgbChannel_mo] - movs r1, 0x2 + str r0, [r4, o_CgbChannel_frequency] + ldrb r0, [r4, o_CgbChannel_modify] + movs r1, CGB_CHANNEL_MO_PIT orrs r0, r1 - strb r0, [r4, o_CgbChannel_mo] + strb r0, [r4, o_CgbChannel_modify] b _081DDA52 _081DDA46: adds r1, r2, 0 ldrb r2, [r5, o_MusicPlayerTrack_pitM] ldr r0, [r4, o_SoundChannel_wav] bl MidiKeyToFreq - str r0, [r4, o_SoundChannel_freq] + str r0, [r4, o_SoundChannel_frequency] _081DDA52: - ldr r4, [r4, o_SoundChannel_np] + ldr r4, [r4, o_SoundChannel_nextChannelPointer] cmp r4, 0 bne _081DD9E6 _081DDA58: @@ -1443,7 +1443,7 @@ _081DDA58: _081DDA62: subs r2, 0x1 ble _081DDA6C - movs r0, 0x50 + movs r0, MusicPlayerTrack_size adds r5, r0 bgt _081DD9C8 _081DDA6C: @@ -1470,7 +1470,7 @@ TrackStop: push {r4-r6,lr} adds r5, r1, 0 ldrb r1, [r5, o_MusicPlayerTrack_flags] - movs r0, 0x80 + movs r0, MPT_FLG_EXIST tst r0, r1 beq TrackStop_Done ldr r4, [r5, o_MusicPlayerTrack_chan] @@ -1478,11 +1478,11 @@ TrackStop: beq TrackStop_3 movs r6, 0 TrackStop_Loop: - ldrb r0, [r4, o_SoundChannel_status] + ldrb r0, [r4, o_SoundChannel_statusFlags] cmp r0, 0 beq TrackStop_2 ldrb r0, [r4, o_SoundChannel_type] - movs r3, 0x7 + movs r3, TONEDATA_TYPE_CGB ands r0, r3 beq TrackStop_1 ldr r3, =SOUND_INFO_PTR @@ -1490,10 +1490,10 @@ TrackStop_Loop: ldr r3, [r3, o_SoundInfo_CgbOscOff] bl call_r3 TrackStop_1: - strb r6, [r4, o_SoundChannel_status] + strb r6, [r4, o_SoundChannel_statusFlags] TrackStop_2: str r6, [r4, o_SoundChannel_track] - ldr r4, [r4, o_SoundChannel_np] + ldr r4, [r4, o_SoundChannel_nextChannelPointer] cmp r4, 0 bne TrackStop_Loop TrackStop_3: @@ -1507,31 +1507,31 @@ TrackStop_Done: thumb_func_start ChnVolSetAsm ChnVolSetAsm: - ldrb r1, [r4, 0x12] - movs r0, 0x14 + ldrb r1, [r4, o_SoundChannel_velocity] + movs r0, o_SoundChannel_rhythmPan ldrsb r2, [r4, r0] movs r3, 0x80 adds r3, r2 muls r3, r1 - ldrb r0, [r5, 0x10] + ldrb r0, [r5, o_MusicPlayerTrack_volMR] muls r0, r3 asrs r0, 14 cmp r0, 0xFF bls _081DDAE8 movs r0, 0xFF _081DDAE8: - strb r0, [r4, 0x2] + strb r0, [r4, o_SoundChannel_rightVolume] movs r3, 0x7F subs r3, r2 muls r3, r1 - ldrb r0, [r5, 0x11] + ldrb r0, [r5, o_MusicPlayerTrack_volML] muls r0, r3 asrs r0, 14 cmp r0, 0xFF bls _081DDAFC movs r0, 0xFF _081DDAFC: - strb r0, [r4, 0x3] + strb r0, [r4, o_SoundChannel_leftVolume] bx lr thumb_func_end ChnVolSetAsm @@ -1601,32 +1601,32 @@ _081DDB68: mov r9, r1 mov r6, r9 ldrb r1, [r6] - movs r0, 0xC0 + movs r0, TONEDATA_TYPE_SPL | TONEDATA_TYPE_RHY tst r0, r1 beq _081DDB80 b _081DDCEA _081DDB80: - movs r0, 0x80 + movs r0, TONEDATA_TYPE_RHY tst r0, r2 beq _081DDB9C - ldrb r1, [r6, 0x3] + ldrb r1, [r6, o_ToneData_pan_sweep] movs r0, 0x80 tst r0, r1 beq _081DDB94 - subs r1, 0xC0 + subs r1, TONEDATA_P_S_PAN lsls r1, 1 str r1, [sp, 0x14] _081DDB94: - ldrb r3, [r6, 0x1] + ldrb r3, [r6, o_SoundChannel_type] b _081DDB9C _081DDB98: mov r9, r4 - ldrb r3, [r5, 0x5] + ldrb r3, [r5, o_MusicPlayerTrack_key] _081DDB9C: str r3, [sp, 0x8] ldr r6, [sp] - ldrb r1, [r6, 0x9] - ldrb r0, [r5, 0x1D] + ldrb r1, [r6, o_MusicPlayerInfo_priority] + ldrb r0, [r5, o_MusicPlayerTrack_priority] adds r0, r1 cmp r0, 0xFF bls _081DDBAC @@ -1634,13 +1634,13 @@ _081DDB9C: _081DDBAC: str r0, [sp, 0x10] mov r6, r9 - ldrb r0, [r6] - movs r6, 0x7 + ldrb r0, [r6, o_ToneData_type] + movs r6, TONEDATA_TYPE_CGB ands r6, r0 str r6, [sp, 0xC] beq _081DDBEC ldr r0, [sp, 0x4] - ldr r4, [r0, 0x1C] + ldr r4, [r0, o_SoundInfo_cgbChans] cmp r4, 0 bne _081DDBC4 b _081DDCEA @@ -1648,21 +1648,21 @@ _081DDBC4: subs r6, 0x1 lsls r0, r6, 6 adds r4, r0 - ldrb r1, [r4] - movs r0, 0xC7 + ldrb r1, [r4, o_CgbChannel_statusFlags] + movs r0, SOUND_CHANNEL_SF_ON tst r0, r1 beq _081DDC40 - movs r0, 0x40 + movs r0, SOUND_CHANNEL_SF_STOP tst r0, r1 bne _081DDC40 - ldrb r1, [r4, 0x13] + ldrb r1, [r4, o_CgbChannel_priority] ldr r0, [sp, 0x10] cmp r1, r0 bcc _081DDC40 beq _081DDBE4 b _081DDCEA _081DDBE4: - ldr r0, [r4, 0x2C] + ldr r0, [r4, o_CgbChannel_track] cmp r0, r5 bcs _081DDC40 b _081DDCEA @@ -1672,35 +1672,35 @@ _081DDBEC: movs r2, 0 mov r8, r2 ldr r4, [sp, 0x4] - ldrb r3, [r4, 0x6] - adds r4, 0x50 + ldrb r3, [r4, o_SoundInfo_maxChans] + adds r4, o_SoundInfo_chans _081DDBFA: - ldrb r1, [r4] - movs r0, 0xC7 + ldrb r1, [r4, o_SoundChannel_statusFlags] + movs r0, SOUND_CHANNEL_SF_ON tst r0, r1 beq _081DDC40 - movs r0, 0x40 + movs r0, SOUND_CHANNEL_SF_STOP tst r0, r1 beq _081DDC14 cmp r2, 0 bne _081DDC18 adds r2, 0x1 - ldrb r6, [r4, 0x13] - ldr r7, [r4, 0x2C] + ldrb r6, [r4, o_SoundChannel_priority] + ldr r7, [r4, o_SoundChannel_track] b _081DDC32 _081DDC14: cmp r2, 0 bne _081DDC34 _081DDC18: - ldrb r0, [r4, 0x13] + ldrb r0, [r4, o_SoundChannel_priority] cmp r0, r6 bcs _081DDC24 adds r6, r0, 0 - ldr r7, [r4, 0x2C] + ldr r7, [r4, o_SoundChannel_track] b _081DDC32 _081DDC24: bhi _081DDC34 - ldr r0, [r4, 0x2C] + ldr r0, [r4, o_SoundChannel_track] cmp r0, r7 bls _081DDC30 adds r7, r0, 0 @@ -1710,7 +1710,7 @@ _081DDC30: _081DDC32: mov r8, r4 _081DDC34: - adds r4, 0x40 + adds r4, SoundChannel_size subs r3, 0x1 bgt _081DDBFA mov r4, r8 @@ -1720,17 +1720,17 @@ _081DDC40: adds r0, r4, 0 bl ClearChain movs r1, 0 - str r1, [r4, 0x30] - ldr r3, [r5, 0x20] - str r3, [r4, 0x34] + str r1, [r4, o_SoundChannel_prevChannelPointer] + ldr r3, [r5, o_MusicPlayerTrack_chan] + str r3, [r4, o_SoundChannel_nextChannelPointer] cmp r3, 0 beq _081DDC54 - str r4, [r3, 0x30] + str r4, [r3, o_SoundChannel_prevChannelPointer] _081DDC54: - str r4, [r5, 0x20] - str r5, [r4, 0x2C] - ldrb r0, [r5, 0x1B] - strb r0, [r5, 0x1C] + str r4, [r5, o_MusicPlayerTrack_chan] + str r5, [r4, o_SoundChannel_track] + ldrb r0, [r5, o_MusicPlayerTrack_lfoDelay] + strb r0, [r5, o_MusicPlayerTrack_lfoDelayC] cmp r0, r1 beq _081DDC66 adds r1, r5, 0 @@ -1739,26 +1739,26 @@ _081DDC66: ldr r0, [sp] adds r1, r5, 0 bl TrkVolPitSet - ldr r0, [r5, 0x4] - str r0, [r4, 0x10] + ldr r0, [r5, o_MusicPlayerTrack_gateTime] + str r0, [r4, o_SoundChannel_gateTime] ldr r0, [sp, 0x10] - strb r0, [r4, 0x13] + strb r0, [r4, o_SoundChannel_priority] ldr r0, [sp, 0x8] - strb r0, [r4, 0x8] + strb r0, [r4, o_SoundChannel_key] ldr r0, [sp, 0x14] - strb r0, [r4, 0x14] + strb r0, [r4, o_SoundChannel_rhythmPan] mov r6, r9 - ldrb r0, [r6] - strb r0, [r4, 0x1] - ldr r7, [r6, 0x4] - str r7, [r4, 0x24] - ldr r0, [r6, 0x8] - str r0, [r4, 0x4] - ldrh r0, [r5, 0x1E] - strh r0, [r4, 0xC] + ldrb r0, [r6, o_ToneData_type] + strb r0, [r4, o_SoundChannel_type] + ldr r7, [r6, o_ToneData_wav] + str r7, [r4, o_SoundChannel_wav] + ldr r0, [r6, o_ToneData_attack] + str r0, [r4, o_SoundChannel_attack] + ldrh r0, [r5, o_MusicPlayerTrack_pseudoEchoVolume] + strh r0, [r4, o_SoundChannel_pseudoEchoVolume] bl ChnVolSetAsm - ldrb r1, [r4, 0x8] - movs r0, 0x8 + ldrb r1, [r4, o_SoundChannel_key] + movs r0, o_MusicPlayerTrack_keyM ldrsb r0, [r5, r0] adds r3, r1, r0 bpl _081DDCA0 @@ -1768,9 +1768,9 @@ _081DDCA0: cmp r6, 0 beq _081DDCCE mov r6, r9 - ldrb r0, [r6, 0x2] - strb r0, [r4, 0x1E] - ldrb r1, [r6, 0x3] + ldrb r0, [r6, o_ToneData_length] + strb r0, [r4, o_CgbChannel_length] + ldrb r1, [r6, o_ToneData_pan_sweep] movs r0, 0x80 tst r0, r1 bne _081DDCBA @@ -1780,29 +1780,29 @@ _081DDCA0: _081DDCBA: movs r1, 0x8 _081DDCBC: - strb r1, [r4, 0x1F] - ldrb r2, [r5, 0x9] + strb r1, [r4, o_CgbChannel_sweep] + ldrb r2, [r5, o_MusicPlayerTrack_pitM] adds r1, r3, 0 ldr r0, [sp, 0xC] ldr r3, [sp, 0x4] - ldr r3, [r3, 0x30] + ldr r3, [r3, o_SoundInfo_MidiKeyToCgbFreq] bl call_r3 b _081DDCDC _081DDCCE: ldr r0, [r5, o_MusicPlayerTrack_unk_3C] - str r0, [r4, 0x18] - ldrb r2, [r5, 0x9] + str r0, [r4, o_SoundChannel_count] + ldrb r2, [r5, o_MusicPlayerTrack_pitM] adds r1, r3, 0 adds r0, r7, 0 bl MidiKeyToFreq _081DDCDC: - str r0, [r4, 0x20] - movs r0, 0x80 - strb r0, [r4] - ldrb r1, [r5] + str r0, [r4, o_SoundChannel_frequency] + movs r0, SOUND_CHANNEL_SF_START + strb r0, [r4, o_SoundChannel_statusFlags] + ldrb r1, [r5, o_MusicPlayerTrack_flags] movs r0, 0xF0 ands r0, r1 - strb r0, [r5] + strb r0, [r5, o_MusicPlayerTrack_flags] _081DDCEA: add sp, 0x18 pop {r0-r7} @@ -1832,23 +1832,23 @@ _081DDD18: ldr r1, [r1, o_MusicPlayerTrack_chan] cmp r1, 0 beq _081DDD40 - movs r4, 0x83 - movs r5, 0x40 + movs r4, SOUND_CHANNEL_SF_START | SOUND_CHANNEL_SF_ENV + movs r5, SOUND_CHANNEL_SF_STOP _081DDD22: - ldrb r2, [r1, o_SoundChannel_status] + ldrb r2, [r1, o_SoundChannel_statusFlags] tst r2, r4 beq _081DDD3A tst r2, r5 bne _081DDD3A - ldrb r0, [r1, o_SoundChannel_mk] + ldrb r0, [r1, o_SoundChannel_midiKey] cmp r0, r3 bne _081DDD3A - movs r0, 0x40 + movs r0, SOUND_CHANNEL_SF_STOP orrs r2, r0 - strb r2, [r1, o_SoundChannel_status] + strb r2, [r1, o_SoundChannel_statusFlags] b _081DDD40 _081DDD3A: - ldr r1, [r1, o_SoundChannel_np] + ldr r1, [r1, o_SoundChannel_nextChannelPointer] cmp r1, 0 bne _081DDD22 _081DDD40: @@ -1864,10 +1864,10 @@ clear_modM: ldrb r2, [r1, o_MusicPlayerTrack_modT] cmp r2, 0 bne _081DDD54 - movs r2, 0xC + movs r2, MPT_FLG_PITCHG b _081DDD56 _081DDD54: - movs r2, 0x3 + movs r2, MPT_FLG_VOLCHG _081DDD56: ldrb r3, [r1, o_MusicPlayerTrack_flags] orrs r3, r2 @@ -1910,28 +1910,8 @@ _081DDD90: .align 2, 0 @ Don't pad with nop. - .bss - .align 3 -sDecodingBuffer: - .space 0x40 - .size sDecodingBuffer, .-sDecodingBuffer - - .global gMPlayTrack_BGM -gMPlayTrack_BGM: - .space 0x320 - .size gMPlayTrack_BGM, .-gMPlayTrack_BGM - - .global gMPlayTrack_SE1 -gMPlayTrack_SE1: - .space 0xF0 - .size gMPlayTrack_SE1, .-gMPlayTrack_SE1 - - .global gMPlayTrack_SE2 -gMPlayTrack_SE2: - .space 0x2D0 - .size gMPlayTrack_SE2, .-gMPlayTrack_SE2 - - .global gMPlayTrack_SE3 -gMPlayTrack_SE3: - .space 0x50 - .size gMPlayTrack_SE3, .-gMPlayTrack_SE3 + .bss + .align 3 +sDecodingBuffer: @ Used as a buffer for audio decoded from compressed DPCM + .space 0x40 + .size sDecodingBuffer, .-sDecodingBuffer diff --git a/src/map_preview_screen.c b/src/map_preview_screen.c index cf74f1950..068ddfedd 100644 --- a/src/map_preview_screen.c +++ b/src/map_preview_screen.c @@ -17,67 +17,67 @@ static EWRAM_DATA bool8 sAllocedBg0TilemapBuffer = FALSE; static void Task_RunMapPreviewScreenForest(u8 taskId); -static const u8 sViridianForestMapPreviewPalette[] = INCBIN_U8("graphics/map_preview/viridian_forest/pal.gbapal"); +static const u8 sViridianForestMapPreviewPalette[] = INCBIN_U8("graphics/map_preview/viridian_forest/tiles.gbapal"); static const u8 sViridianForestMapPreviewTiles[] = INCBIN_U8("graphics/map_preview/viridian_forest/tiles.4bpp.lz"); static const u8 sViridianForestMapPreviewTilemap[] = INCBIN_U8("graphics/map_preview/viridian_forest/tilemap.bin.lz"); -static const u8 sRockTunnelMapPreviewPalette[] = INCBIN_U8("graphics/map_preview/rock_tunnel/pal.gbapal"); +static const u8 sRockTunnelMapPreviewPalette[] = INCBIN_U8("graphics/map_preview/rock_tunnel/tiles.gbapal"); static const u8 sRockTunnelMapPreviewTiles[] = INCBIN_U8("graphics/map_preview/rock_tunnel/tiles.4bpp.lz"); static const u8 sRockTunnelMapPreviewTilemap[] = INCBIN_U8("graphics/map_preview/rock_tunnel/tilemap.bin.lz"); -static const u8 sRocketHideoutMapPreviewPalette[] = INCBIN_U8("graphics/map_preview/rocket_hideout/pal.gbapal"); +static const u8 sRocketHideoutMapPreviewPalette[] = INCBIN_U8("graphics/map_preview/rocket_hideout/tiles.gbapal"); static const u8 sRocketHideoutMapPreviewTiles[] = INCBIN_U8("graphics/map_preview/rocket_hideout/tiles.4bpp.lz"); static const u8 sRocketHideoutMapPreviewTilemap[] = INCBIN_U8("graphics/map_preview/rocket_hideout/tilemap.bin.lz"); -static const u8 sPowerPlantMapPreviewPalette[] = INCBIN_U8("graphics/map_preview/power_plant/pal.gbapal"); +static const u8 sPowerPlantMapPreviewPalette[] = INCBIN_U8("graphics/map_preview/power_plant/tiles.gbapal"); static const u8 sPowerPlantMapPreviewTiles[] = INCBIN_U8("graphics/map_preview/power_plant/tiles.4bpp.lz"); static const u8 sPowerPlantMapPreviewTilemap[] = INCBIN_U8("graphics/map_preview/power_plant/tilemap.bin.lz"); -static const u8 sPokemonMansionMapPreviewPalette[] = INCBIN_U8("graphics/map_preview/pokemon_mansion/pal.gbapal"); +static const u8 sPokemonMansionMapPreviewPalette[] = INCBIN_U8("graphics/map_preview/pokemon_mansion/tiles.gbapal"); static const u8 sPokemonMansionMapPreviewTiles[] = INCBIN_U8("graphics/map_preview/pokemon_mansion/tiles.4bpp.lz"); static const u8 sPokemonMansionMapPreviewTilemap[] = INCBIN_U8("graphics/map_preview/pokemon_mansion/tilemap.bin.lz"); -static const u8 sPokemonTowerMapPreviewPalette[] = INCBIN_U8("graphics/map_preview/pokemon_tower/pal.gbapal"); +static const u8 sPokemonTowerMapPreviewPalette[] = INCBIN_U8("graphics/map_preview/pokemon_tower/tiles.gbapal"); static const u8 sPokemonTowerMapPreviewTiles[] = INCBIN_U8("graphics/map_preview/pokemon_tower/tiles.4bpp.lz"); static const u8 sPokemonTowerMapPreviewTilemap[] = INCBIN_U8("graphics/map_preview/pokemon_tower/tilemap.bin.lz"); -static const u8 sSilphCoMapPreviewPalette[] = INCBIN_U8("graphics/map_preview/silph_co/pal.gbapal"); +static const u8 sSilphCoMapPreviewPalette[] = INCBIN_U8("graphics/map_preview/silph_co/tiles.gbapal"); static const u8 sSilphCoMapPreviewTiles[] = INCBIN_U8("graphics/map_preview/silph_co/tiles.4bpp.lz"); static const u8 sSilphCoMapPreviewTilemap[] = INCBIN_U8("graphics/map_preview/silph_co/tilemap.bin.lz"); -static const u8 sMtMoonMapPreviewPalette[] = INCBIN_U8("graphics/map_preview/mt_moon/pal.gbapal"); +static const u8 sMtMoonMapPreviewPalette[] = INCBIN_U8("graphics/map_preview/mt_moon/tiles.gbapal"); static const u8 sMtMoonMapPreviewTiles[] = INCBIN_U8("graphics/map_preview/mt_moon/tiles.4bpp.lz"); static const u8 sMtMoonMapPreviewTilemap[] = INCBIN_U8("graphics/map_preview/mt_moon/tilemap.bin.lz"); -static const u8 sSeafoamIslandsMapPreviewPalette[] = INCBIN_U8("graphics/map_preview/seafoam_islands/pal.gbapal"); +static const u8 sSeafoamIslandsMapPreviewPalette[] = INCBIN_U8("graphics/map_preview/seafoam_islands/tiles.gbapal"); static const u8 sSeafoamIslandsMapPreviewTiles[] = INCBIN_U8("graphics/map_preview/seafoam_islands/tiles.4bpp.lz"); static const u8 sSeafoamIslandsMapPreviewTilemap[] = INCBIN_U8("graphics/map_preview/seafoam_islands/tilemap.bin.lz"); -static const u8 sRocketWarehouseMapPreviewPalette[] = INCBIN_U8("graphics/map_preview/rocket_warehouse/pal.gbapal"); +static const u8 sRocketWarehouseMapPreviewPalette[] = INCBIN_U8("graphics/map_preview/rocket_warehouse/tiles.gbapal"); static const u8 sRocketWarehouseMapPreviewTiles[] = INCBIN_U8("graphics/map_preview/rocket_warehouse/tiles.4bpp.lz"); static const u8 sRocketWarehouseMapPreviewTilemap[] = INCBIN_U8("graphics/map_preview/rocket_warehouse/tilemap.bin.lz"); -static const u8 sVictoryRoadMapPreviewPalette[] = INCBIN_U8("graphics/map_preview/victory_road/pal.gbapal"); +static const u8 sVictoryRoadMapPreviewPalette[] = INCBIN_U8("graphics/map_preview/victory_road/tiles.gbapal"); static const u8 sVictoryRoadMapPreviewTiles[] = INCBIN_U8("graphics/map_preview/victory_road/tiles.4bpp.lz"); static const u8 sVictoryRoadMapPreviewTilemap[] = INCBIN_U8("graphics/map_preview/victory_road/tilemap.bin.lz"); -static const u8 sMtEmberMapPreviewPalette[] = INCBIN_U8("graphics/map_preview/mt_ember/pal.gbapal"); +static const u8 sMtEmberMapPreviewPalette[] = INCBIN_U8("graphics/map_preview/mt_ember/tiles.gbapal"); static const u8 sMtEmberMapPreviewTiles[] = INCBIN_U8("graphics/map_preview/mt_ember/tiles.4bpp.lz"); static const u8 sMtEmberMapPreviewTilemap[] = INCBIN_U8("graphics/map_preview/mt_ember/tilemap.bin.lz"); -static const u8 sSafariZoneMapPreviewPalette[] = INCBIN_U8("graphics/map_preview/safari_zone/pal.gbapal"); +static const u8 sSafariZoneMapPreviewPalette[] = INCBIN_U8("graphics/map_preview/safari_zone/tiles.gbapal"); static const u8 sSafariZoneMapPreviewTiles[] = INCBIN_U8("graphics/map_preview/safari_zone/tiles.4bpp.lz"); static const u8 sSafariZoneMapPreviewTilemap[] = INCBIN_U8("graphics/map_preview/safari_zone/tilemap.bin.lz"); -static const u8 sMoneanChamberMapPreviewPalette[] = INCBIN_U8("graphics/map_preview/monean_chamber/pal.gbapal"); +static const u8 sMoneanChamberMapPreviewPalette[] = INCBIN_U8("graphics/map_preview/monean_chamber/tiles.gbapal"); static const u8 sMoneanChamberMapPreviewTiles[] = INCBIN_U8("graphics/map_preview/monean_chamber/tiles.4bpp.lz"); static const u8 sMoneanChamberMapPreviewTilemap[] = INCBIN_U8("graphics/map_preview/monean_chamber/tilemap.bin.lz"); -static const u8 sDottedHoleMapPreviewPalette[] = INCBIN_U8("graphics/map_preview/dotted_hole/pal.gbapal"); +static const u8 sDottedHoleMapPreviewPalette[] = INCBIN_U8("graphics/map_preview/dotted_hole/tiles.gbapal"); static const u8 sDottedHoleMapPreviewTiles[] = INCBIN_U8("graphics/map_preview/dotted_hole/tiles.4bpp.lz"); static const u8 sDottedHoleMapPreviewTilemap[] = INCBIN_U8("graphics/map_preview/dotted_hole/tilemap.bin.lz"); -static const u8 sCeruleanCaveMapPreviewPalette[] = INCBIN_U8("graphics/map_preview/cerulean_cave/pal.gbapal"); +static const u8 sCeruleanCaveMapPreviewPalette[] = INCBIN_U8("graphics/map_preview/cerulean_cave/tiles.gbapal"); static const u8 sCeruleanCaveMapPreviewTiles[] = INCBIN_U8("graphics/map_preview/cerulean_cave/tiles.4bpp.lz"); static const u8 sCeruleanCaveMapPreviewTilemap[] = INCBIN_U8("graphics/map_preview/cerulean_cave/tilemap.bin.lz"); -static const u8 sDiglettsCaveMapPreviewPalette[] = INCBIN_U8("graphics/map_preview/digletts_cave/pal.gbapal"); +static const u8 sDiglettsCaveMapPreviewPalette[] = INCBIN_U8("graphics/map_preview/digletts_cave/tiles.gbapal"); static const u8 sDiglettsCaveMapPreviewTiles[] = INCBIN_U8("graphics/map_preview/digletts_cave/tiles.4bpp.lz"); static const u8 sDiglettsCaveMapPreviewTilemap[] = INCBIN_U8("graphics/map_preview/digletts_cave/tilemap.bin.lz"); -static const u8 sLostCaveMapPreviewPalette[] = INCBIN_U8("graphics/map_preview/lost_cave/pal.gbapal"); +static const u8 sLostCaveMapPreviewPalette[] = INCBIN_U8("graphics/map_preview/lost_cave/tiles.gbapal"); static const u8 sLostCaveMapPreviewTiles[] = INCBIN_U8("graphics/map_preview/lost_cave/tiles.4bpp.lz"); static const u8 sLostCaveMapPreviewTilemap[] = INCBIN_U8("graphics/map_preview/lost_cave/tilemap.bin.lz"); -static const u8 sBerryForestMapPreviewPalette[] = INCBIN_U8("graphics/map_preview/berry_forest/pal.gbapal"); +static const u8 sBerryForestMapPreviewPalette[] = INCBIN_U8("graphics/map_preview/berry_forest/tiles.gbapal"); static const u8 sBerryForestMapPreviewTiles[] = INCBIN_U8("graphics/map_preview/berry_forest/tiles.4bpp.lz"); static const u8 sBerryForestMapPreviewTilemap[] = INCBIN_U8("graphics/map_preview/berry_forest/tilemap.bin.lz"); -static const u8 sIcefallCaveMapPreviewPalette[] = INCBIN_U8("graphics/map_preview/icefall_cave/pal.gbapal"); +static const u8 sIcefallCaveMapPreviewPalette[] = INCBIN_U8("graphics/map_preview/icefall_cave/tiles.gbapal"); static const u8 sIcefallCaveMapPreviewTiles[] = INCBIN_U8("graphics/map_preview/icefall_cave/tiles.4bpp.lz"); static const u8 sIcefallCaveMapPreviewTilemap[] = INCBIN_U8("graphics/map_preview/icefall_cave/tilemap.bin.lz"); -static const u8 sAlteringCaveMapPreviewPalette[] = INCBIN_U8("graphics/map_preview/altering_cave/pal.gbapal"); +static const u8 sAlteringCaveMapPreviewPalette[] = INCBIN_U8("graphics/map_preview/altering_cave/tiles.gbapal"); static const u8 sAlteringCaveMapPreviewTiles[] = INCBIN_U8("graphics/map_preview/altering_cave/tiles.4bpp.lz"); static const u8 sAlteringCaveMapPreviewTilemap[] = INCBIN_U8("graphics/map_preview/altering_cave/tilemap.bin.lz"); diff --git a/src/menu.c b/src/menu.c index 8ef713fac..fe1b82f1e 100644 --- a/src/menu.c +++ b/src/menu.c @@ -469,7 +469,7 @@ void MultichoiceList_PrintItems(u8 windowId, u8 fontId, u8 left, u8 top, u8 line CopyWindowToVram(windowId, COPYWIN_GFX); } -void UnionRoomAndTradeMenuPrintOptions(u8 windowId, u8 fontId, u8 lineHeight, u8 itemCount, const struct MenuAction *strs) +void PrintMenuTable(u8 windowId, u8 fontId, u8 lineHeight, u8 itemCount, const struct MenuAction *strs) { u8 left = GetMenuCursorDimensionByFont(fontId, 0); diff --git a/src/metatile_behavior.c b/src/metatile_behavior.c index 81b9fc239..ce2736647 100644 --- a/src/metatile_behavior.c +++ b/src/metatile_behavior.c @@ -4,7 +4,7 @@ static const bool8 sBehaviorSurfable[NUM_METATILE_BEHAVIORS] = { [MB_POND_WATER] = TRUE, - [MB_SEMI_DEEP_WATER] = TRUE, + [MB_FAST_WATER] = TRUE, [MB_DEEP_WATER] = TRUE, [MB_WATERFALL] = TRUE, [MB_OCEAN_WATER] = TRUE, @@ -209,9 +209,10 @@ bool8 MetatileBehavior_IsSurfable(u8 metatileBehavior) return FALSE; } -bool8 MetatileBehavior_IsSemiDeepWater(u8 metatileBehavior) +// Water that's too fast to surf on +bool8 MetatileBehavior_IsFastWater(u8 metatileBehavior) { - if (metatileBehavior == MB_SEMI_DEEP_WATER) + if (metatileBehavior == MB_FAST_WATER) return TRUE; else return FALSE; @@ -476,7 +477,7 @@ bool8 MetatileBehavior_IsMountain(u8 metatileBehavior) bool8 MetatileBehavior_IsDiveable(u8 metatileBehavior) { - if (metatileBehavior >= MB_SEMI_DEEP_WATER && metatileBehavior <= MB_DEEP_WATER) + if (metatileBehavior >= MB_FAST_WATER && metatileBehavior <= MB_DEEP_WATER) return TRUE; else return FALSE; @@ -514,9 +515,9 @@ bool8 MetatileBehavior_IsCrackedIce(u8 metatileBehavior) return FALSE; } -bool8 MetatileBehavior_IsDeepSemiDeepOrSplashingWater(u8 metatileBehavior) +bool8 MetatileBehavior_IsDeepWaterTerrain(u8 metatileBehavior) { - if ((metatileBehavior >= MB_SEMI_DEEP_WATER && metatileBehavior <= MB_DEEP_WATER) + if ((metatileBehavior >= MB_FAST_WATER && metatileBehavior <= MB_DEEP_WATER) || metatileBehavior == MB_OCEAN_WATER) return TRUE; else diff --git a/src/oak_speech.c b/src/oak_speech.c index 7f10528f6..d5b2ba7ba 100644 --- a/src/oak_speech.c +++ b/src/oak_speech.c @@ -17,111 +17,127 @@ #include "data.h" #include "constants/songs.h" +enum +{ + WIN_INTRO_TEXTBOX, + WIN_INTRO_BOYGIRL, + WIN_INTRO_YESNO, + WIN_INTRO_NAMES, + NUM_INTRO_WINDOWS, +}; + struct OakSpeechResources { - void *solidColorsGfx; - void *trainerPicTilemapBuffer; - void *unk_0008; - u8 filler_000C[4]; + void *oakSpeechBackgroundTiles; + void *trainerPicTilemap; + void *pikachuIntroTilemap; + void *unused1; u16 hasPlayerBeenNamed; - u16 unk_0012; - u16 unk_0014[4]; + u16 currentPage; + u16 windowIds[NUM_INTRO_WINDOWS]; u8 textColor[3]; u8 textSpeed; - u8 filler_0020[0x1800]; + u8 unused2[0x1800]; u8 bg2TilemapBuffer[0x400]; u8 bg1TilemapBuffer[0x800]; -}; //size=0x2420 +}; -EWRAM_DATA struct OakSpeechResources * sOakSpeechResources = NULL; +static EWRAM_DATA struct OakSpeechResources *sOakSpeechResources = NULL; -static void Task_OaksSpeech1(u8 taskId); -static void CreateHelpDocsPage1(void); -static void Task_OaksSpeech2(u8 taskId); -static void Task_OakSpeech3(u8 taskId); -static void Task_OakSpeech5(u8 taskId); -static void Task_OakSpeech6(u8 taskId); -static void Task_OakSpeech7(u8 taskId); -static void Task_OakSpeech8(u8 taskId); -static void Task_OakSpeech9(u8 taskId); -static void Task_OakSpeech10(u8 taskId); -static void Task_OakSpeech10(u8 taskId); -static void Task_OakSpeech11(u8 taskId); -static void Task_OakSpeech12(u8 taskId); -static void Task_OakSpeech13(u8 taskId); -static void Task_OakSpeech14(u8 taskId); -static void Task_OakSpeech15(u8 taskId); -static void Task_OakSpeech16(u8 taskId); -static void Task_OakSpeech17(u8 taskId); -static void Task_OakSpeech18(u8 taskId); -static void Task_OakSpeech19(u8 taskId); -static void Task_OakSpeech20(u8 taskId); -static void Task_OakSpeech21(u8 taskId); -static void Task_OakSpeech22(u8 taskId); -static void Task_OakSpeech23(u8 taskId); -static void Task_OakSpeech24(u8 taskId); -static void Task_OakSpeech29(u8 taskId); -static void Task_OakSpeech25(u8 taskId); -static void Task_OakSpeech26(u8 taskId); -static void Task_OakSpeech27(u8 taskId); -static void Task_OakSpeech30(u8 taskId); -static void Task_OakSpeech31(u8 taskId); -static void Task_OakSpeech32(u8 taskId); -static void Task_OakSpeech34(u8 taskId); -static void Task_OakSpeech33(u8 taskId); -static void Task_OakSpeech36(u8 taskId); -static void Task_OakSpeech37(u8 taskId); -static void Task_OakSpeech38(u8 taskId); -static void Task_OakSpeech38_3(u8 taskId); -static void Task_OakSpeech39(u8 taskId); -static void Task_OakSpeech38_1(u8 taskId); -static void Task_OakSpeech38_sub1(u8 taskId); -static void Task_OakSpeech38_2(u8 taskId); -static void Task_OakSpeech38_sub2(u8 taskId); -static void Task_OakSpeech40(u8 taskId); -static void Task_OakSpeech41(u8 taskId); -static void Task_OakSpeech42(u8 taskId); +static void Task_NewGameScene(u8); + +static void ControlsGuide_LoadPage1(void); +static void Task_ControlsGuide_HandleInput(u8); +static void Task_ControlsGuide_ChangePage(u8); +static void Task_ControlsGuide_Clear(u8); + +static void Task_PikachuIntro_LoadPage1(u8); +static void Task_PikachuIntro_HandleInput(u8); +static void Task_PikachuIntro_Clear(u8); + +static void Task_OakSpeech_Init(u8); +static void Task_OakSpeech_WelcomeToTheWorld(u8); +static void Task_OakSpeech_ThisWorld(u8); +static void Task_OakSpeech_ReleaseNidoranFFromPokeBall(u8); +static void Task_OakSpeech_IsInhabitedFarAndWide(u8); +static void Task_OakSpeech_IStudyPokemon(u8); +static void Task_OakSpeech_ReturnNidoranFToPokeBall(u8); +static void Task_OakSpeech_TellMeALittleAboutYourself(u8); +static void Task_OakSpeech_FadeOutOak(u8); +static void Task_OakSpeech_AskPlayerGender(u8); +static void Task_OakSpeech_ShowGenderOptions(u8); +static void Task_OakSpeech_HandleGenderInput(u8); +static void Task_OakSpeech_ClearGenderWindows(u8); +static void Task_OakSpeech_LoadPlayerPic(u8); +static void Task_OakSpeech_YourNameWhatIsIt(u8); +static void Task_OakSpeech_FadeOutForPlayerNamingScreen(u8); +static void Task_OakSpeech_HandleRivalNameInput(u8); +static void Task_OakSpeech_DoNamingScreen(u8); +static void Task_OakSpeech_ConfirmName(u8); +static void Task_OakSpeech_HandleConfirmNameInput(u8); +static void Task_OakSpeech_FadeOutPlayerPic(u8); +static void Task_OakSpeech_FadeOutRivalPic(u8); +static void Task_OakSpeech_FadeInRivalPic(u8); +static void Task_OakSpeech_AskRivalsName(u8); +static void Task_OakSpeech_ReshowPlayersPic(u8); +static void Task_OakSpeech_LetsGo(u8); +static void Task_OakSpeech_FadeOutBGM(u8); +static void Task_OakSpeech_SetUpExitAnimation(u8); +static void Task_OakSpeech_SetUpShrinkPlayerPic(u8); +static void Task_OakSpeech_ShrinkPlayerPic(u8); +static void Task_OakSpeech_SetUpDestroyPlatformSprites(u8); +static void Task_OakSpeech_DestroyPlatformSprites(u8); +static void Task_OakSpeech_SetUpFadePlayerPicWhite(u8); +static void Task_OakSpeech_FadePlayerPicWhite(u8); +static void Task_OakSpeech_FadePlayerPicToBlack(u8); +static void Task_OakSpeech_WaitForFade(u8); +static void Task_OakSpeech_FreeResources(u8); static void CB2_ReturnFromNamingScreen(void); -static void CreateNidoranFSprite(u8 taskId); -static void CreatePikaOrGrassPlatformSpriteAndLinkToCurrentTask(u8 taskId, u8 state); -static void DestroyLinkedPikaOrGrassPlatformSprites(u8 taskId, u8 state); -static void LoadOaksSpeechTrainerPic(u16 whichPic, u16 tileOffset); -static void DestroyOaksSpeechTrainerPic(void); -static void CreateFadeInTask(u8 taskId, u8 state); -static void CreateFadeOutTask(u8 taskId, u8 state); -static void PrintNameChoiceOptions(u8 taskId, u8 state); -static void GetDefaultName(u8 hasPlayerBeenNamed, u8 rivalNameChoice); +static void CreateNidoranFSprite(u8); +static void CreatePikachuOrPlatformSprites(u8, u8); +static void DestroyPikachuOrPlatformSprites(u8, u8); +static void LoadTrainerPic(u16, u16); +static void ClearTrainerPic(void); +static void CreateFadeInTask(u8, u8); +static void CreateFadeOutTask(u8, u8); +static void PrintNameChoiceOptions(u8, u8); +static void GetDefaultName(u8, u8); extern const u8 gText_Controls[]; extern const u8 gText_ABUTTONNext[]; extern const u8 gText_ABUTTONNext_BBUTTONBack[]; extern const u8 gText_Boy[]; extern const u8 gText_Girl[]; +extern const struct OamData gOamData_AffineOff_ObjBlend_32x32; +extern const struct OamData gOamData_AffineOff_ObjNormal_32x32; +extern const struct OamData gOamData_AffineOff_ObjNormal_32x16; +extern const struct OamData gOamData_AffineOff_ObjNormal_16x8; -ALIGNED(4) static const u16 sHelpDocsPalette[] = INCBIN_U16("graphics/oak_speech/help_docs_palette.gbapal"); -static const u32 sOakSpeechGfx_GameStartHelpUI[] = INCBIN_U32("graphics/oak_speech/game_start_help_ui.4bpp.lz"); -static const u32 sNewGameAdventureIntroTilemap[] = INCBIN_U32("graphics/oak_speech/new_game_adventure_intro_tilemap.bin.lz"); -static const u32 sOakSpeechGfx_SolidColors[] = INCBIN_U32("graphics/oak_speech/solid_colors.4bpp.lz"); -static const u32 sOakSpeech_BackgroundTilemap[] = INCBIN_U32("graphics/oak_speech/background_tilemap.bin.lz"); -static const u16 sHelpDocsPage2Tilemap[] = INCBIN_U16("graphics/oak_speech/help_docs_page2_tilemap.bin"); -static const u16 sHelpDocsPage3Tilemap[] = INCBIN_U16("graphics/oak_speech/help_docs_page3_tilemap.bin"); -static const u16 sOakSpeechGfx_LeafPal[] = INCBIN_U16("graphics/oak_speech/leaf_pal.gbapal"); -static const u32 sOakSpeechGfx_LeafPic[] = INCBIN_U32("graphics/oak_speech/leaf_pic.8bpp.lz"); -static const u16 sOakSpeechGfx_RedPal[] = INCBIN_U16("graphics/oak_speech/red_pal.gbapal"); -static const u32 sOakSpeechGfx_RedPic[] = INCBIN_U32("graphics/oak_speech/red_pic.8bpp.lz"); -static const u16 sOakSpeechGfx_OakPal[] = INCBIN_U16("graphics/oak_speech/oak_pal.gbapal"); -static const u32 sOakSpeechGfx_OakPic[] = INCBIN_U32("graphics/oak_speech/oak_pic.8bpp.lz"); -static const u16 sOakSpeechGfx_RivalPal[] = INCBIN_U16("graphics/oak_speech/rival_pal.gbapal"); -static const u32 sOakSpeechGfx_RivalPic[] = INCBIN_U32("graphics/oak_speech/rival_pic.8bpp.lz"); -static const u16 sOakSpeech_GrassPlatformPalette[] = INCBIN_U16("graphics/oak_speech/grass_platform_palette.gbapal"); -static const u16 sOakSpeech_PikaPalette[] = INCBIN_U16("graphics/oak_speech/pika_palette.gbapal"); -static const u32 sOakSpeechGfx_GrassPlatform[] = INCBIN_U32("graphics/oak_speech/grass_platform.4bpp.lz"); -static const u32 sOakSpeechGfx_Pika1[] = INCBIN_U32("graphics/oak_speech/pika1.4bpp.lz"); -static const u32 sOakSpeechGfx_Pika2[] = INCBIN_U32("graphics/oak_speech/pika2.4bpp.lz"); -static const u32 sOakSpeechGfx_PikaEyes[] = INCBIN_U32("graphics/oak_speech/pika_eyes.4bpp.lz"); +static const u16 sOakSpeech_Background_Pals[] = INCBIN_U16("graphics/oak_speech/bg_tiles.gbapal"); // Shared by the Controls Guide, Pikachu Intro and Oak Speech scenes +static const u32 sControlsGuide_PikachuIntro_Background_Tiles[] = INCBIN_U32("graphics/oak_speech/bg_tiles.4bpp.lz"); +static const u32 sPikachuIntro_Background_Tilemap[] = INCBIN_U32("graphics/oak_speech/pikachu_intro/tilemap.bin.lz"); +static const u32 sOakSpeech_Background_Tiles[] = INCBIN_U32("graphics/oak_speech/oak_speech_bg.4bpp.lz"); +static const u32 sOakSpeech_Background_Tilemap[] = INCBIN_U32("graphics/oak_speech/oak_speech_bg.bin.lz"); +static const u16 sControlsGuide_Tilemap_Page2[] = INCBIN_U16("graphics/oak_speech/controls_guide_page_2.bin"); +static const u16 sControlsGuide_Tilemap_Page3[] = INCBIN_U16("graphics/oak_speech/controls_guide_page_3.bin"); +static const u16 sOakSpeech_Leaf_Pal[] = INCBIN_U16("graphics/oak_speech/leaf/pal.gbapal"); +static const u32 sOakSpeech_Leaf_Tiles[] = INCBIN_U32("graphics/oak_speech/leaf/pic.8bpp.lz"); +static const u16 sOakSpeech_Red_Pal[] = INCBIN_U16("graphics/oak_speech/red/pal.gbapal"); +static const u32 sOakSpeech_Red_Tiles[] = INCBIN_U32("graphics/oak_speech/red/pic.8bpp.lz"); +static const u16 sOakSpeech_Oak_Pal[] = INCBIN_U16("graphics/oak_speech/oak/pal.gbapal"); +static const u32 sOakSpeech_Oak_Tiles[] = INCBIN_U32("graphics/oak_speech/oak/pic.8bpp.lz"); +static const u16 sOakSpeech_Rival_Pal[] = INCBIN_U16("graphics/oak_speech/rival/pal.gbapal"); +static const u32 sOakSpeech_Rival_Tiles[] = INCBIN_U32("graphics/oak_speech/rival/pic.8bpp.lz"); +static const u16 sOakSpeech_Platform_Pal[] = INCBIN_U16("graphics/oak_speech/platform.gbapal"); +static const u16 sPikachuIntro_Pikachu_Pal[] = INCBIN_U16("graphics/oak_speech/pikachu_intro/pikachu.gbapal"); +static const u32 sOakSpeech_Platform_Gfx[] = INCBIN_U32("graphics/oak_speech/platform.4bpp.lz"); +static const u32 sPikachuIntro_PikachuBody_Gfx[] = INCBIN_U32("graphics/oak_speech/pikachu_intro/body.4bpp.lz"); +static const u32 sPikachuIntro_PikachuEars_Gfx[] = INCBIN_U32("graphics/oak_speech/pikachu_intro/ears.4bpp.lz"); +static const u32 sPikachuIntro_PikachuEyes_Gfx[] = INCBIN_U32("graphics/oak_speech/pikachu_intro/eyes.4bpp.lz"); -static const struct BgTemplate sBgTemplates[3] = { +static const struct BgTemplate sBgTemplates[] = +{ { .bg = 0, .charBaseIndex = 2, @@ -129,208 +145,344 @@ static const struct BgTemplate sBgTemplates[3] = { .screenSize = 0, .paletteMode = 0, .priority = 0, - .baseTile = 0x000 - }, { + .baseTile = 0 + }, + { .bg = 1, .charBaseIndex = 0, .mapBaseIndex = 30, .screenSize = 0, .paletteMode = 0, .priority = 2, - .baseTile = 0x000 - }, { + .baseTile = 0 + }, + { .bg = 2, .charBaseIndex = 0, .mapBaseIndex = 28, .screenSize = 1, .paletteMode = 1, .priority = 1, - .baseTile = 0x000 + .baseTile = 0 } }; -static const struct WindowTemplate sHelpDocsWindowTemplates1[] = { +enum +{ + CONTROLS_GUIDE_PAGE_1_WINDOW, + NUM_CONTROLS_GUIDE_PAGE_1_WINDOWS, +}; + +static const struct WindowTemplate sControlsGuide_WindowTemplate_Page1[NUM_CONTROLS_GUIDE_PAGE_1_WINDOWS + 1] = +{ + [CONTROLS_GUIDE_PAGE_1_WINDOW] = { - .bg = 0x00, - .tilemapLeft = 0x00, - .tilemapTop = 0x07, - .width = 0x1e, - .height = 0x04, - .paletteNum = 0x0f, - .baseBlock = 0x0001 - }, DUMMY_WIN_TEMPLATE + .bg = 0, + .tilemapLeft = 0, + .tilemapTop = 7, + .width = 30, + .height = 4, + .paletteNum = 15, + .baseBlock = 1 + }, + DUMMY_WIN_TEMPLATE }; -static const struct WindowTemplate sHelpDocsWindowTemplates2[] = { +enum +{ + CONTROLS_GUIDE_PAGES_2_3_WINDOW_TOP, + CONTROLS_GUIDE_PAGES_2_3_WINDOW_MIDDLE, + CONTROLS_GUIDE_PAGES_2_3_WINDOW_BOTTOM, + NUM_CONTROLS_GUIDE_PAGES_2_3_WINDOWS, +}; + +static const struct WindowTemplate sControlsGuide_WindowTemplate_Page2[NUM_CONTROLS_GUIDE_PAGES_2_3_WINDOWS + 1] = +{ + [CONTROLS_GUIDE_PAGES_2_3_WINDOW_TOP] = { - .bg = 0x00, - .tilemapLeft = 0x06, - .tilemapTop = 0x03, - .width = 0x18, - .height = 0x06, - .paletteNum = 0x0f, - .baseBlock = 0x0001 - }, { - .bg = 0x00, - .tilemapLeft = 0x06, - .tilemapTop = 0x0a, - .width = 0x18, - .height = 0x04, - .paletteNum = 0x0f, - .baseBlock = 0x0092 - }, { - .bg = 0x00, - .tilemapLeft = 0x06, - .tilemapTop = 0x0f, - .width = 0x18, - .height = 0x04, - .paletteNum = 0x0f, - .baseBlock = 0x00f3 - }, DUMMY_WIN_TEMPLATE -}; - -static const struct WindowTemplate sHelpDocsWindowTemplates3[] = { + .bg = 0, + .tilemapLeft = 6, + .tilemapTop = 3, + .width = 24, + .height = 6, + .paletteNum = 15, + .baseBlock = 1 + }, + [CONTROLS_GUIDE_PAGES_2_3_WINDOW_MIDDLE] = { - .bg = 0x00, - .tilemapLeft = 0x06, - .tilemapTop = 0x03, - .width = 0x18, - .height = 0x04, - .paletteNum = 0x0f, - .baseBlock = 0x0001 - }, { - .bg = 0x00, - .tilemapLeft = 0x06, - .tilemapTop = 0x08, - .width = 0x18, - .height = 0x04, - .paletteNum = 0x0f, - .baseBlock = 0x0062 - }, { - .bg = 0x00, - .tilemapLeft = 0x06, - .tilemapTop = 0x0d, - .width = 0x18, - .height = 0x06, - .paletteNum = 0x0f, - .baseBlock = 0x00c3 - }, DUMMY_WIN_TEMPLATE -}; - -static const struct WindowTemplate *const sHelpDocsWindowTemplatePtrs[3] = { - sHelpDocsWindowTemplates1, - sHelpDocsWindowTemplates2, - sHelpDocsWindowTemplates3 -}; - -static const struct WindowTemplate sNewGameAdventureIntroWindowTemplates[] = { + .bg = 0, + .tilemapLeft = 6, + .tilemapTop = 10, + .width = 24, + .height = 4, + .paletteNum = 15, + .baseBlock = 146 + }, + [CONTROLS_GUIDE_PAGES_2_3_WINDOW_BOTTOM] = { - .bg = 0x00, - .tilemapLeft = 0x01, - .tilemapTop = 0x04, - .width = 0x1c, - .height = 0x0f, - .paletteNum = 0x0f, - .baseBlock = 0x0001 - }, { - .bg = 0x00, - .tilemapLeft = 0x12, - .tilemapTop = 0x09, - .width = 0x09, - .height = 0x04, - .paletteNum = 0x0f, - .baseBlock = 0x0174 - }, { - .bg = 0x00, - .tilemapLeft = 0x02, - .tilemapTop = 0x02, - .width = 0x06, - .height = 0x04, - .paletteNum = 0x0f, - .baseBlock = 0x0180 - }, { - .bg = 0x00, - .tilemapLeft = 0x02, - .tilemapTop = 0x02, - .width = 0x0c, - .height = 0x0a, - .paletteNum = 0x0f, - .baseBlock = 0x0001 - }, DUMMY_WIN_TEMPLATE + .bg = 0, + .tilemapLeft = 6, + .tilemapTop = 15, + .width = 24, + .height = 4, + .paletteNum = 15, + .baseBlock = 243 + }, + DUMMY_WIN_TEMPLATE }; -static const u8 sTextColor_HelpSystem[4] = { - 0x00, 0x01, 0x02 +static const struct WindowTemplate sControlsGuide_WindowTemplate_Page3[NUM_CONTROLS_GUIDE_PAGES_2_3_WINDOWS + 1] = +{ + [CONTROLS_GUIDE_PAGES_2_3_WINDOW_TOP] = + { + .bg = 0, + .tilemapLeft = 6, + .tilemapTop = 3, + .width = 24, + .height = 4, + .paletteNum = 15, + .baseBlock = 1 + }, + [CONTROLS_GUIDE_PAGES_2_3_WINDOW_MIDDLE] = + { + .bg = 0, + .tilemapLeft = 6, + .tilemapTop = 8, + .width = 24, + .height = 4, + .paletteNum = 15, + .baseBlock = 98 + }, + [CONTROLS_GUIDE_PAGES_2_3_WINDOW_BOTTOM] = + { + .bg = 0, + .tilemapLeft = 6, + .tilemapTop = 13, + .width = 24, + .height = 6, + .paletteNum = 15, + .baseBlock = 195 + }, + DUMMY_WIN_TEMPLATE }; -static const u8 sTextColor_OakSpeech[4] = { - 0x00, 0x02, 0x03 +enum +{ + CONTROLS_GUIDE_PAGE_1, + CONTROLS_GUIDE_PAGE_2, + CONTROLS_GUIDE_PAGE_3, + NUM_CONTROLS_GUIDE_PAGES, }; -static const u8 *const sNewGameAdventureIntroTextPointers[] = { - gNewGameAdventureIntro1, - gNewGameAdventureIntro2, - gNewGameAdventureIntro3 +static const struct WindowTemplate *const sControlsGuide_WindowTemplates[NUM_CONTROLS_GUIDE_PAGES] = +{ + [CONTROLS_GUIDE_PAGE_1] = sControlsGuide_WindowTemplate_Page1, + [CONTROLS_GUIDE_PAGE_2] = sControlsGuide_WindowTemplate_Page2, + [CONTROLS_GUIDE_PAGE_3] = sControlsGuide_WindowTemplate_Page3 }; -static const struct CompressedSpriteSheet sOakSpeech_PikaSpriteSheets[3] = { - { (const void *)sOakSpeechGfx_Pika1, 0x0400, 0x1001 }, - { (const void *)sOakSpeechGfx_Pika2, 0x0200, 0x1002 }, - { (const void *)sOakSpeechGfx_PikaEyes, 0x0080, 0x1003 }, +static const struct WindowTemplate sIntro_WindowTemplates[NUM_INTRO_WINDOWS + 1] = +{ + [WIN_INTRO_TEXTBOX] = + { + .bg = 0, + .tilemapLeft = 1, + .tilemapTop = 4, + .width = 28, + .height = 15, + .paletteNum = 15, + .baseBlock = 1 + }, + [WIN_INTRO_BOYGIRL] = + { + .bg = 0, + .tilemapLeft = 18, + .tilemapTop = 9, + .width = 9, + .height = 4, + .paletteNum = 15, + .baseBlock = 372 + }, + [WIN_INTRO_YESNO] = + { + .bg = 0, + .tilemapLeft = 2, + .tilemapTop = 2, + .width = 6, + .height = 4, + .paletteNum = 15, + .baseBlock = 384 + }, + [WIN_INTRO_NAMES] = + { + .bg = 0, + .tilemapLeft = 2, + .tilemapTop = 2, + .width = 12, + .height = 10, + .paletteNum = 15, + .baseBlock = 1 + }, + DUMMY_WIN_TEMPLATE }; -static const struct CompressedSpriteSheet sOakSpeech_GrassPlatformSpriteSheet = { - (const void *)sOakSpeechGfx_GrassPlatform, 0x0600, 0x1000 +static const u8 sTextColor_White[] = { 0, 1, 2, 0 }; +static const u8 sTextColor_DarkGray[] = { 0, 2, 3, 0 }; + +enum +{ + PIKACHU_INTRO_PAGE_1, + PIKACHU_INTRO_PAGE_2, + PIKACHU_INTRO_PAGE_3, + NUM_PIKACHU_INTRO_PAGES, }; -static const struct SpritePalette sOakSpeech_PikaSpritePal = { - (const void *)sOakSpeech_PikaPalette, 0x1001 +static const u8 *const sPikachuIntro_Strings[NUM_PIKACHU_INTRO_PAGES] = +{ + [PIKACHU_INTRO_PAGE_1] = gPikachuIntro_Text_Page1, + [PIKACHU_INTRO_PAGE_2] = gPikachuIntro_Text_Page2, + [PIKACHU_INTRO_PAGE_3] = gPikachuIntro_Text_Page3 }; -static const struct SpritePalette sOakSpeech_GrassPlatformSpritePal = { - (const void *)sOakSpeech_GrassPlatformPalette, 0x1000 +#define GFX_TAG_PLATFORM 0x1000 +#define GFX_TAG_PIKACHU 0x1001 +#define GFX_TAG_PIKACHU_EARS 0x1002 +#define GFX_TAG_PIKACHU_EYES 0x1003 + +#define PAL_TAG_PLATFORM 0x1000 +#define PAL_TAG_PIKACHU 0x1001 + +enum +{ + SPRITE_TYPE_PIKACHU, + SPRITE_TYPE_PLATFORM, }; -static const union AnimCmd sGrassPlatformAnim1[] = { +enum +{ + PIKACHU_BODY_PLATFORM_LEFT, + PIKACHU_EARS_PLATFORM_MIDDLE, + PIKACHU_EYES_PLATFORM_RIGHT, + NUM_PIKACHU_PLATFORM_SPRITES, +}; + +static const struct CompressedSpriteSheet sPikachuIntro_Pikachu_SpriteSheets[] = +{ + [PIKACHU_BODY_PLATFORM_LEFT] = + { + .data = sPikachuIntro_PikachuBody_Gfx, + .size = 0x400, + .tag = GFX_TAG_PIKACHU + }, + [PIKACHU_EARS_PLATFORM_MIDDLE] = + { + .data = sPikachuIntro_PikachuEars_Gfx, + .size = 0x200, + .tag = GFX_TAG_PIKACHU_EARS + }, + [PIKACHU_EYES_PLATFORM_RIGHT] = + { + .data = sPikachuIntro_PikachuEyes_Gfx, + .size = 0x80, + .tag = GFX_TAG_PIKACHU_EYES + }, +}; + +static const struct CompressedSpriteSheet sOakSpeech_Platform_SpriteSheet = +{ + .data = sOakSpeech_Platform_Gfx, + .size = 0x600, + .tag = GFX_TAG_PLATFORM +}; + +static const struct SpritePalette sPikachuIntro_Pikachu_SpritePalette = +{ + .data = sPikachuIntro_Pikachu_Pal, + .tag = PAL_TAG_PIKACHU +}; + +static const struct SpritePalette sOakSpeech_Platform_SpritePalette = +{ + .data = sOakSpeech_Platform_Pal, + .tag = PAL_TAG_PLATFORM +}; + +static const union AnimCmd sOakSpeech_PlatformLeft_Anim[] = +{ ANIMCMD_FRAME( 0, 0), ANIMCMD_END }; -static const union AnimCmd sGrassPlatformAnim2[] = { +static const union AnimCmd sOakSpeech_PlatformMiddle_Anim[] = +{ ANIMCMD_FRAME(16, 0), ANIMCMD_END }; -static const union AnimCmd sGrassPlatformAnim3[] = { +static const union AnimCmd sOakSpeech_PlatformRight_Anim[] = +{ ANIMCMD_FRAME(32, 0), ANIMCMD_END }; -static const union AnimCmd *const sGrassPlatformAnims1[] = { - sGrassPlatformAnim1 -}; -static const union AnimCmd *const sGrassPlatformAnims2[] = { - sGrassPlatformAnim2 -}; -static const union AnimCmd *const sGrassPlatformAnims3[] = { - sGrassPlatformAnim3 +static const union AnimCmd *const sOakSpeech_PlatformLeft_Anims[] = +{ + sOakSpeech_PlatformLeft_Anim }; -extern const struct OamData gOamData_AffineOff_ObjBlend_32x32; - -static const struct SpriteTemplate sOakSpeech_GrassPlatformSpriteTemplates[3] = { - { 0x1000, 0x1000, &gOamData_AffineOff_ObjBlend_32x32, sGrassPlatformAnims1, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy }, - { 0x1000, 0x1000, &gOamData_AffineOff_ObjBlend_32x32, sGrassPlatformAnims2, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy }, - { 0x1000, 0x1000, &gOamData_AffineOff_ObjBlend_32x32, sGrassPlatformAnims3, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy }, +static const union AnimCmd *const sOakSpeech_PlatformMiddle_Anims[] = +{ + sOakSpeech_PlatformMiddle_Anim }; -static const union AnimCmd sPikaAnim1[] = { +static const union AnimCmd *const sOakSpeech_PlatformRight_Anims[] = +{ + sOakSpeech_PlatformRight_Anim +}; + +static const struct SpriteTemplate sOakSpeech_Platform_SpriteTemplates[] = +{ + [PIKACHU_BODY_PLATFORM_LEFT] = + { + .tileTag = GFX_TAG_PLATFORM, + .paletteTag = PAL_TAG_PLATFORM, + .oam = &gOamData_AffineOff_ObjBlend_32x32, + .anims = sOakSpeech_PlatformLeft_Anims, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy + }, + [PIKACHU_EARS_PLATFORM_MIDDLE] = + { + .tileTag = GFX_TAG_PLATFORM, + .paletteTag = PAL_TAG_PLATFORM, + .oam = &gOamData_AffineOff_ObjBlend_32x32, + .anims = sOakSpeech_PlatformMiddle_Anims, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy + }, + [PIKACHU_EYES_PLATFORM_RIGHT] = + { + .tileTag = GFX_TAG_PLATFORM, + .paletteTag = PAL_TAG_PLATFORM, + .oam = &gOamData_AffineOff_ObjBlend_32x32, + .anims = sOakSpeech_PlatformRight_Anims, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy + }, +}; + +static const union AnimCmd sPikachuIntro_PikachuBody_Anim[] = +{ ANIMCMD_FRAME( 0, 30), ANIMCMD_FRAME(16, 30), ANIMCMD_JUMP(0) }; -static const union AnimCmd sPikaAnim2[] = { +static const union AnimCmd sPikachuIntro_PikachuEars_Anim[] = +{ ANIMCMD_FRAME(0, 60), ANIMCMD_FRAME(0, 60), ANIMCMD_FRAME(0, 60), @@ -349,7 +501,8 @@ static const union AnimCmd sPikaAnim2[] = { ANIMCMD_JUMP(0) }; -static const union AnimCmd sPikaAnim3[] = { +static const union AnimCmd sPikachuIntro_PikachuEyes_Anim[] = +{ ANIMCMD_FRAME(0, 60), ANIMCMD_FRAME(0, 60), ANIMCMD_FRAME(0, 60), @@ -367,32 +520,71 @@ static const union AnimCmd sPikaAnim3[] = { ANIMCMD_JUMP(0) }; -static const union AnimCmd *const sPikaAnims1[] = { - sPikaAnim1 -}; -static const union AnimCmd *const sPikaAnims2[] = { - sPikaAnim2 -}; -static const union AnimCmd *const sPikaAnims3[] = { - sPikaAnim3 +static const union AnimCmd *const sPikachuIntro_PikachuBody_Anims[] = +{ + sPikachuIntro_PikachuBody_Anim }; -extern const struct OamData gOamData_AffineOff_ObjNormal_32x32; -extern const struct OamData gOamData_AffineOff_ObjNormal_32x16; -extern const struct OamData gOamData_AffineOff_ObjNormal_16x8; - -static const struct SpriteTemplate sOakSpeech_PikaSpriteTemplates[3] = { - { 0x1001, 0x1001, &gOamData_AffineOff_ObjNormal_32x32, sPikaAnims1, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy }, - { 0x1002, 0x1001, &gOamData_AffineOff_ObjNormal_32x16, sPikaAnims2, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy }, - { 0x1003, 0x1001, &gOamData_AffineOff_ObjNormal_16x8, sPikaAnims3, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy } +static const union AnimCmd *const sPikachuIntro_PikachuEars_Anims[] = +{ + sPikachuIntro_PikachuEars_Anim }; -static const u8 *const sHelpDocsPtrs[] = { - gNewGame_HelpDocs2, gNewGame_HelpDocs3, gNewGame_HelpDocs4, - gNewGame_HelpDocs5, gNewGame_HelpDocs6, gNewGame_HelpDocs7 +static const union AnimCmd *const sPikachuIntro_PikachuEyes_Anims[] = +{ + sPikachuIntro_PikachuEyes_Anim }; -static const u8 *const sMaleNameChoices[] = { +static const struct SpriteTemplate sPikachuIntro_Pikachu_SpriteTemplates[NUM_PIKACHU_PLATFORM_SPRITES] = +{ + [PIKACHU_BODY_PLATFORM_LEFT] = + { + .tileTag = GFX_TAG_PIKACHU, + .paletteTag = PAL_TAG_PIKACHU, + .oam = &gOamData_AffineOff_ObjNormal_32x32, + .anims = sPikachuIntro_PikachuBody_Anims, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy + }, + [PIKACHU_EARS_PLATFORM_MIDDLE] = + { + .tileTag = GFX_TAG_PIKACHU_EARS, + .paletteTag = PAL_TAG_PIKACHU, + .oam = &gOamData_AffineOff_ObjNormal_32x16, + .anims = sPikachuIntro_PikachuEars_Anims, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy + }, + [PIKACHU_EYES_PLATFORM_RIGHT] = + { + .tileTag = GFX_TAG_PIKACHU_EYES, + .paletteTag = PAL_TAG_PIKACHU, + .oam = &gOamData_AffineOff_ObjNormal_16x8, + .anims = sPikachuIntro_PikachuEyes_Anims, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy + } +}; + +#define CONTROLS_GUIDE_STRINGS_PER_PAGE 3 + +static const u8 *const sControlsGuide_Pages2And3_Strings[CONTROLS_GUIDE_STRINGS_PER_PAGE * 2] = +{ + // Page 2 + gControlsGuide_Text_DPad, + gControlsGuide_Text_AButton, + gControlsGuide_Text_BButton, + // Page 3 + gControlsGuide_Text_StartButton, + gControlsGuide_Text_SelectButton, + gControlsGuide_Text_LRButtons +}; + +static const u8 *const sMaleNameChoices[] = +{ #if defined(FIRERED) gNameChoice_Red, gNameChoice_Fire, @@ -422,7 +614,8 @@ static const u8 *const sMaleNameChoices[] = { gNameChoice_Roak }; -static const u8 *const sFemaleNameChoices[] = { +static const u8 *const sFemaleNameChoices[] = +{ #if defined(FIRERED) gNameChoice_Red, gNameChoice_Fire, @@ -449,7 +642,8 @@ static const u8 *const sFemaleNameChoices[] = { gNameChoice_Suzi }; -static const u8 *const sRivalNameChoices[] = { +static const u8 *const sRivalNameChoices[] = +{ #if defined(FIRERED) gNameChoice_Green, gNameChoice_Gary, @@ -471,14 +665,14 @@ enum OAK_PIC }; -static void VBlankCB_NewGameOaksSpeech(void) +static void VBlankCB_NewGameScene(void) { LoadOam(); ProcessSpriteCopyRequests(); TransferPlttBuffer(); } -static void CB2_NewGameOaksSpeech(void) +static void CB2_NewGameScene(void) { RunTasks(); RunTextPrinters(); @@ -491,14 +685,25 @@ void StartNewGameScene(void) { gPlttBufferUnfaded[0] = RGB_BLACK; gPlttBufferFaded[0] = RGB_BLACK; - CreateTask(Task_OaksSpeech1, 0); - SetMainCallback2(CB2_NewGameOaksSpeech); + CreateTask(Task_NewGameScene, 0); + SetMainCallback2(CB2_NewGameScene); } -#define tTrainerPicPosX data[1] -#define tTrainerPicFadeState data[2] +#define tSpriteTimer data[0] +#define tTrainerPicPosX data[1] +#define tTrainerPicFadeState data[2] +#define tTimer data[3] +#define tNidoranFSpriteId data[4] +#define tTextCursorSpriteId data[5] +#define tPokeBallSpriteId data[6] +#define tPikachuPlatformSpriteId(i) data[7 + i] // Pikachu and the platform are built of three sprites, + // data[8] // so these are used to hold their sprite IDs + // data[9] // +#define tMenuWindowId data[13] +#define tTextboxWindowId data[14] +#define tDelta data[15] -static void Task_OaksSpeech1(u8 taskId) +static void Task_NewGameScene(u8 taskId) { switch (gMain.state) { @@ -517,7 +722,7 @@ static void Task_OaksSpeech1(u8 taskId) break; case 1: sOakSpeechResources = AllocZeroed(sizeof(*sOakSpeechResources)); - OakSpeechNidoranFSetup(1, 1); + OakSpeechNidoranFSetup(1, TRUE); break; case 2: SetGpuReg(REG_OFFSET_WIN0H, 0); @@ -532,13 +737,13 @@ static void Task_OaksSpeech1(u8 taskId) break; case 3: ResetBgsAndClearDma3BusyFlags(0); - InitBgsFromTemplates(1, sBgTemplates, NELEMS(sBgTemplates)); + InitBgsFromTemplates(1, sBgTemplates, ARRAY_COUNT(sBgTemplates)); SetBgTilemapBuffer(1, sOakSpeechResources->bg1TilemapBuffer); SetBgTilemapBuffer(2, sOakSpeechResources->bg2TilemapBuffer); - ChangeBgX(1, 0, 0); - ChangeBgY(1, 0, 0); - ChangeBgX(2, 0, 0); - ChangeBgY(2, 0, 0); + ChangeBgX(1, 0, BG_COORD_SET); + ChangeBgY(1, 0, BG_COORD_SET); + ChangeBgX(2, 0, BG_COORD_SET); + ChangeBgY(2, 0, BG_COORD_SET); gSpriteCoordOffsetX = 0; gSpriteCoordOffsetY = 0; break; @@ -547,39 +752,39 @@ static void Task_OaksSpeech1(u8 taskId) InitStandardTextBoxWindows(); InitTextBoxGfxAndPrinters(); Menu_LoadStdPalAt(0xD0); - LoadPalette(sHelpDocsPalette, 0x000, 0x080); - LoadPalette(GetTextWindowPalette(2) + 15, 0x000, 0x002); + LoadPalette(sOakSpeech_Background_Pals, 0, 0x80); + LoadPalette(GetTextWindowPalette(2) + 15, 0, 2); break; case 5: sOakSpeechResources->textSpeed = GetTextSpeedSetting(); gTextFlags.canABSpeedUpPrint = TRUE; - DecompressAndCopyTileDataToVram(1, sOakSpeechGfx_GameStartHelpUI, 0, 0, 0); + DecompressAndCopyTileDataToVram(1, sControlsGuide_PikachuIntro_Background_Tiles, 0, 0, 0); break; case 6: if (FreeTempTileDataBuffersIfPossible()) return; - ClearDialogWindowAndFrame(0, 1); - FillBgTilemapBufferRect_Palette0(1, 0x0000, 0, 0, 32, 32); + ClearDialogWindowAndFrame(WIN_INTRO_TEXTBOX, TRUE); + FillBgTilemapBufferRect_Palette0(1, 0, 0, 0, 32, 32); CopyBgTilemapBufferToVram(1); break; case 7: CreateTopBarWindowLoadPalette(0, 30, 0, 13, 0x1C4); - FillBgTilemapBufferRect_Palette0(1, 0xD00F, 0, 0, 30, 2); - FillBgTilemapBufferRect_Palette0(1, 0xD002, 0, 2, 30, 1); - FillBgTilemapBufferRect_Palette0(1, 0xD00E, 0, 19, 30, 1); - CreateHelpDocsPage1(); + FillBgTilemapBufferRect_Palette0(1, 0xD00F, 0, 0, 30, 2); + FillBgTilemapBufferRect_Palette0(1, 0xD002, 0, 2, 30, 1); + FillBgTilemapBufferRect_Palette0(1, 0xD00E, 0, 19, 30, 1); + ControlsGuide_LoadPage1(); gPaletteFade.bufferTransferDisabled = FALSE; - gTasks[taskId].data[5] = CreateTextCursorSprite(0, 0xE6, 0x95, 0, 0); - BlendPalettes(PALETTES_ALL, 0x10, 0x00); + gTasks[taskId].tTextCursorSpriteId = CreateTextCursorSprite(0, 230, 149, 0, 0); + BlendPalettes(PALETTES_ALL, 16, RGB_BLACK); break; case 10: BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON); ShowBg(0); ShowBg(1); - SetVBlankCallback(VBlankCB_NewGameOaksSpeech); + SetVBlankCallback(VBlankCB_NewGameScene); PlayBGM(MUS_NEW_GAME_INSTRUCT); - gTasks[taskId].func = Task_OaksSpeech2; + gTasks[taskId].func = Task_ControlsGuide_HandleInput; gMain.state = 0; return; } @@ -587,228 +792,237 @@ static void Task_OaksSpeech1(u8 taskId) gMain.state++; } -static void CreateHelpDocsPage1(void) +static void ControlsGuide_LoadPage1(void) { - TopBarWindowPrintTwoStrings(gText_Controls, gText_ABUTTONNext, 0, 0, 1); - sOakSpeechResources->unk_0014[0] = AddWindow(sHelpDocsWindowTemplatePtrs[sOakSpeechResources->unk_0012]); - PutWindowTilemap(sOakSpeechResources->unk_0014[0]); - FillWindowPixelBuffer(sOakSpeechResources->unk_0014[0], 0x00); - AddTextPrinterParameterized4(sOakSpeechResources->unk_0014[0], FONT_NORMAL, 2, 0, 1, 1, sTextColor_HelpSystem, 0, gNewGame_HelpDocs1); - CopyWindowToVram(sOakSpeechResources->unk_0014[0], COPYWIN_FULL); + TopBarWindowPrintTwoStrings(gText_Controls, gText_ABUTTONNext, FALSE, 0, TRUE); + sOakSpeechResources->windowIds[0] = AddWindow(sControlsGuide_WindowTemplates[sOakSpeechResources->currentPage]); + PutWindowTilemap(sOakSpeechResources->windowIds[0]); + FillWindowPixelBuffer(sOakSpeechResources->windowIds[0], PIXEL_FILL(0)); + AddTextPrinterParameterized4(sOakSpeechResources->windowIds[0], FONT_NORMAL, 2, 0, 1, 1, sTextColor_White, 0, gControlsGuide_Text_Intro); + CopyWindowToVram(sOakSpeechResources->windowIds[0], COPYWIN_FULL); FillBgTilemapBufferRect_Palette0(1, 0x3000, 1, 3, 5, 16); CopyBgTilemapBufferToVram(1); } -static void Task_OakSpeech4(u8 taskId) +static void Task_ControlsGuide_LoadPage(u8 taskId) { - u8 i = 0; - u8 r7 = sOakSpeechResources->unk_0012 - 1; - if (sOakSpeechResources->unk_0012 == 0) + u8 currWindow = 0; + u8 page2Or3 = sOakSpeechResources->currentPage - 1; // 0 if page 2, 1 if page 3 + if (sOakSpeechResources->currentPage == CONTROLS_GUIDE_PAGE_1) { - CreateHelpDocsPage1(); + ControlsGuide_LoadPage1(); } else { - TopBarWindowPrintString(gText_ABUTTONNext_BBUTTONBack, 0, 1); - for (i = 0; i < 3; i++) + TopBarWindowPrintString(gText_ABUTTONNext_BBUTTONBack, 0, TRUE); + for (currWindow = CONTROLS_GUIDE_PAGES_2_3_WINDOW_TOP; currWindow < NUM_CONTROLS_GUIDE_PAGES_2_3_WINDOWS; currWindow++) { - sOakSpeechResources->unk_0014[i] = AddWindow(&sHelpDocsWindowTemplatePtrs[sOakSpeechResources->unk_0012][i]); - PutWindowTilemap(sOakSpeechResources->unk_0014[i]); - FillWindowPixelBuffer(sOakSpeechResources->unk_0014[i], 0x00); - AddTextPrinterParameterized4(sOakSpeechResources->unk_0014[i], FONT_NORMAL, 6, 0, 1, 1, sTextColor_HelpSystem, 0, sHelpDocsPtrs[i + r7 * 3]); - CopyWindowToVram(sOakSpeechResources->unk_0014[i], COPYWIN_FULL); + sOakSpeechResources->windowIds[currWindow] = AddWindow(&sControlsGuide_WindowTemplates[sOakSpeechResources->currentPage][currWindow]); + PutWindowTilemap(sOakSpeechResources->windowIds[currWindow]); + FillWindowPixelBuffer(sOakSpeechResources->windowIds[currWindow], PIXEL_FILL(0)); + AddTextPrinterParameterized4(sOakSpeechResources->windowIds[currWindow], FONT_NORMAL, 6, 0, 1, 1, sTextColor_White, 0, sControlsGuide_Pages2And3_Strings[currWindow + page2Or3 * CONTROLS_GUIDE_STRINGS_PER_PAGE]); + CopyWindowToVram(sOakSpeechResources->windowIds[currWindow], COPYWIN_FULL); } - if (sOakSpeechResources->unk_0012 == 1) - { - CopyToBgTilemapBufferRect(1, sHelpDocsPage2Tilemap, 1, 3, 5, 16); - } - else - { - CopyToBgTilemapBufferRect(1, sHelpDocsPage3Tilemap, 1, 3, 5, 16); - } + if (sOakSpeechResources->currentPage == CONTROLS_GUIDE_PAGE_2) + CopyToBgTilemapBufferRect(1, sControlsGuide_Tilemap_Page2, 1, 3, 5, 16); + else // CONTROLS_GUIDE_PAGE_3 + CopyToBgTilemapBufferRect(1, sControlsGuide_Tilemap_Page3, 1, 3, 5, 16); CopyBgTilemapBufferToVram(1); } - BeginNormalPaletteFade(0xFFFFDFFF, -1, 16, 0, GetTextWindowPalette(2)[15]); - gTasks[taskId].func = Task_OaksSpeech2; + BeginNormalPaletteFade(PALETTES_OBJECTS | 0xDFFF, -1, 16, 0, GetTextWindowPalette(2)[15]); + gTasks[taskId].func = Task_ControlsGuide_HandleInput; } -static void Task_OaksSpeech2(u8 taskId) +static void Task_ControlsGuide_HandleInput(u8 taskId) { - if (!gPaletteFade.active && JOY_NEW((A_BUTTON | B_BUTTON))) + if (!gPaletteFade.active) { - if (JOY_NEW(A_BUTTON)) + if(JOY_NEW((A_BUTTON | B_BUTTON))) { - gTasks[taskId].data[15] = 1; - if (sOakSpeechResources->unk_0012 < 2) + if (JOY_NEW(A_BUTTON)) { - BeginNormalPaletteFade(0xFFFFDFFF, -1, 0, 16, GetTextWindowPalette(2)[15]); + gTasks[taskId].tDelta = 1; + + if (sOakSpeechResources->currentPage < CONTROLS_GUIDE_PAGE_3) + BeginNormalPaletteFade(PALETTES_OBJECTS | 0xDFFF, -1, 0, 16, GetTextWindowPalette(2)[15]); } - } - else - { - if (sOakSpeechResources->unk_0012 != 0) + else // B_BUTTON { - gTasks[taskId].data[15] = -1; - BeginNormalPaletteFade(0xFFFFDFFF, -1, 0, 16, GetTextWindowPalette(2)[15]); + if (sOakSpeechResources->currentPage == CONTROLS_GUIDE_PAGE_1) + return; + + gTasks[taskId].tDelta = -1; + BeginNormalPaletteFade(PALETTES_OBJECTS | 0xDFFF, -1, 0, 16, GetTextWindowPalette(2)[15]); } - else - return; + + PlaySE(SE_SELECT); + gTasks[taskId].func = Task_ControlsGuide_ChangePage; } } - else - return; - PlaySE(SE_SELECT); - gTasks[taskId].func = Task_OakSpeech3; } -static void Task_OakSpeech3(u8 taskId) +static void Task_ControlsGuide_ChangePage(u8 taskId) { - u8 r8 = 0; + u8 numWindows = 0; u8 i; if (!gPaletteFade.active) { - switch (sOakSpeechResources->unk_0012) { - case 0: - r8 = 1; + switch (sOakSpeechResources->currentPage) + { + case CONTROLS_GUIDE_PAGE_1: + numWindows = NUM_CONTROLS_GUIDE_PAGE_1_WINDOWS; break; - case 1: - case 2: - r8 = 3; + case CONTROLS_GUIDE_PAGE_2: + case CONTROLS_GUIDE_PAGE_3: + numWindows = NUM_CONTROLS_GUIDE_PAGES_2_3_WINDOWS; break; } - sOakSpeechResources->unk_0012 += gTasks[taskId].data[15]; - if (sOakSpeechResources->unk_0012 < 3) + sOakSpeechResources->currentPage += gTasks[taskId].tDelta; + if (sOakSpeechResources->currentPage < NUM_CONTROLS_GUIDE_PAGES) { - for (i = 0; i < r8; i++) + for (i = 0; i < numWindows; i++) { - FillWindowPixelBuffer(sOakSpeechResources->unk_0014[i], 0x00); - ClearWindowTilemap(sOakSpeechResources->unk_0014[i]); - CopyWindowToVram(sOakSpeechResources->unk_0014[i], COPYWIN_FULL); - RemoveWindow(sOakSpeechResources->unk_0014[i]); - sOakSpeechResources->unk_0014[i] = 0; + FillWindowPixelBuffer(sOakSpeechResources->windowIds[i], PIXEL_FILL(0)); + ClearWindowTilemap(sOakSpeechResources->windowIds[i]); + CopyWindowToVram(sOakSpeechResources->windowIds[i], COPYWIN_FULL); + RemoveWindow(sOakSpeechResources->windowIds[i]); + sOakSpeechResources->windowIds[i] = 0; } - gTasks[taskId].func = Task_OakSpeech4; + gTasks[taskId].func = Task_ControlsGuide_LoadPage; } else { BeginNormalPaletteFade(PALETTES_ALL, 2, 0, 16, 0); - gTasks[taskId].func = Task_OakSpeech5; + gTasks[taskId].func = Task_ControlsGuide_Clear; } } } -static void Task_OakSpeech5(u8 taskId) +#undef tDelta + +static void Task_ControlsGuide_Clear(u8 taskId) { u8 i = 0; - if (!gPaletteFade.active) { - for (i = 0; i < 3; i++) + for (i = 0; i < NUM_CONTROLS_GUIDE_PAGES_2_3_WINDOWS; i++) { - FillWindowPixelBuffer(sOakSpeechResources->unk_0014[i], 0x00); - ClearWindowTilemap(sOakSpeechResources->unk_0014[i]); - CopyWindowToVram(sOakSpeechResources->unk_0014[i], COPYWIN_FULL); - RemoveWindow(sOakSpeechResources->unk_0014[i]); - sOakSpeechResources->unk_0014[i] = 0; + FillWindowPixelBuffer(sOakSpeechResources->windowIds[i], PIXEL_FILL(0)); + ClearWindowTilemap(sOakSpeechResources->windowIds[i]); + CopyWindowToVram(sOakSpeechResources->windowIds[i], COPYWIN_FULL); + RemoveWindow(sOakSpeechResources->windowIds[i]); + sOakSpeechResources->windowIds[i] = 0; } - FillBgTilemapBufferRect_Palette0(1, 0x000, 0, 2, 30, 18); + FillBgTilemapBufferRect_Palette0(1, 0, 0, 2, 30, 18); CopyBgTilemapBufferToVram(1); - DestroyTextCursorSprite(gTasks[taskId].data[5]); - sOakSpeechResources->unk_0014[0] = RGB_BLACK; - LoadPalette(sOakSpeechResources->unk_0014, 0, 2); - gTasks[taskId].data[3] = 32; - gTasks[taskId].func = Task_OakSpeech6; + DestroyTextCursorSprite(gTasks[taskId].tTextCursorSpriteId); + sOakSpeechResources->windowIds[0] = RGB_BLACK; + LoadPalette(sOakSpeechResources->windowIds, 0, 2); + gTasks[taskId].tTimer = 32; + gTasks[taskId].func = Task_PikachuIntro_LoadPage1; } } -static void Task_OakSpeech6(u8 taskId) +enum { - s16 * data = gTasks[taskId].data; - u32 sp14 = 0; + PIKACHU_INTRO_SET_GPU_REGS, + PIKACHU_INTRO_HANDLE_INPUT, + PIKACHU_INTRO_PRINT_PAGE_TEXT, + PIKACHU_INTRO_FADE_IN_PAGE, + PIKACHU_INTRO_EXIT, +}; - if (data[3] != 0) - data[3]--; +#define tBlendTarget data[15] + +static void Task_PikachuIntro_LoadPage1(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + u32 size = 0; + + if (tTimer != 0) + { + tTimer--; + } else { PlayBGM(MUS_NEW_GAME_INTRO); ClearTopBarWindow(); TopBarWindowPrintString(gText_ABUTTONNext, 0, 1); - sOakSpeechResources->unk_0008 = MallocAndDecompress(sNewGameAdventureIntroTilemap, &sp14); - CopyToBgTilemapBufferRect(1, sOakSpeechResources->unk_0008, 0, 2, 30, 19); + sOakSpeechResources->pikachuIntroTilemap = MallocAndDecompress(sPikachuIntro_Background_Tilemap, &size); + CopyToBgTilemapBufferRect(1, sOakSpeechResources->pikachuIntroTilemap, 0, 2, 30, 19); CopyBgTilemapBufferToVram(1); - Free(sOakSpeechResources->unk_0008); - sOakSpeechResources->unk_0008 = NULL; - data[14] = AddWindow(&sNewGameAdventureIntroWindowTemplates[0]); - PutWindowTilemap(data[14]); - FillWindowPixelBuffer(data[14], 0x00); - CopyWindowToVram(data[14], COPYWIN_FULL); - sOakSpeechResources->unk_0012 = 0; - gMain.state = 0; - data[15] = 16; - AddTextPrinterParameterized4(data[14], FONT_NORMAL, 3, 5, 1, 0, sTextColor_OakSpeech, 0, sNewGameAdventureIntroTextPointers[0]); - data[5] = CreateTextCursorSprite(0, 0xe2, 0x91, 0, 0); - gSprites[data[5]].oam.objMode = ST_OAM_OBJ_BLEND; - gSprites[data[5]].oam.priority = 0; - CreatePikaOrGrassPlatformSpriteAndLinkToCurrentTask(taskId, 0); + Free(sOakSpeechResources->pikachuIntroTilemap); + sOakSpeechResources->pikachuIntroTilemap = NULL; + tTextboxWindowId = AddWindow(&sIntro_WindowTemplates[WIN_INTRO_TEXTBOX]); + PutWindowTilemap(tTextboxWindowId); + FillWindowPixelBuffer(tTextboxWindowId, PIXEL_FILL(0)); + CopyWindowToVram(tTextboxWindowId, COPYWIN_FULL); + sOakSpeechResources->currentPage = PIKACHU_INTRO_PAGE_1; + gMain.state = PIKACHU_INTRO_SET_GPU_REGS; + tBlendTarget = 16; + AddTextPrinterParameterized4(tTextboxWindowId, FONT_NORMAL, 3, 5, 1, 0, sTextColor_DarkGray, 0, sPikachuIntro_Strings[PIKACHU_INTRO_PAGE_1]); + tTextCursorSpriteId = CreateTextCursorSprite(0, 226, 145, 0, 0); + gSprites[tTextCursorSpriteId].oam.objMode = ST_OAM_OBJ_BLEND; + gSprites[tTextCursorSpriteId].oam.priority = 0; + CreatePikachuOrPlatformSprites(taskId, SPRITE_TYPE_PIKACHU); BeginNormalPaletteFade(PALETTES_ALL, 2, 16, 0, 0); - gTasks[taskId].func = Task_OakSpeech7; + gTasks[taskId].func = Task_PikachuIntro_HandleInput; } } -static void Task_OakSpeech7(u8 taskId) +static void Task_PikachuIntro_HandleInput(u8 taskId) { - s16 * data = gTasks[taskId].data; + s16 *data = gTasks[taskId].data; switch (gMain.state) { - case 0: + case PIKACHU_INTRO_SET_GPU_REGS: if (!gPaletteFade.active) { - SetGpuReg(REG_OFFSET_WIN0H, 0x00F0); - SetGpuReg(REG_OFFSET_WIN0V, 0x10A0); - SetGpuReg(REG_OFFSET_WININ, 0x003F); - SetGpuReg(REG_OFFSET_WINOUT, 0x001F); + SetGpuReg(REG_OFFSET_WIN0H, DISPLAY_WIDTH); + SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(16, DISPLAY_HEIGHT)); + SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_CLR | WININ_WIN0_OBJ); + SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ); SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON); - gMain.state = 1; + gMain.state = PIKACHU_INTRO_HANDLE_INPUT; } break; - case 1: + case PIKACHU_INTRO_HANDLE_INPUT: if (JOY_NEW((A_BUTTON | B_BUTTON))) { if (JOY_NEW(A_BUTTON)) { - sOakSpeechResources->unk_0012++; + sOakSpeechResources->currentPage++; } - else if (sOakSpeechResources->unk_0012 != 0) + else // B_BUTTON { - sOakSpeechResources->unk_0012--; - } - else - { - break; + if (sOakSpeechResources->currentPage != PIKACHU_INTRO_PAGE_1) + sOakSpeechResources->currentPage--; + else + break; } PlaySE(SE_SELECT); - if (sOakSpeechResources->unk_0012 == 3) + if (sOakSpeechResources->currentPage == NUM_PIKACHU_INTRO_PAGES) { - gMain.state = 4; + gMain.state = PIKACHU_INTRO_EXIT; } else { SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG0 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG1); - SetGpuReg(REG_OFFSET_BLDALPHA, (16 - data[15]) | data[15]); + SetGpuReg(REG_OFFSET_BLDALPHA, (16 - tBlendTarget) | tBlendTarget); gMain.state++; } } break; - case 2: - data[15] -= 2; - SetGpuReg(REG_OFFSET_BLDALPHA, ((16 - data[15]) << 8) | data[15]); - if (data[15] <= 0) + case PIKACHU_INTRO_PRINT_PAGE_TEXT: + tBlendTarget -= 2; + SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(tBlendTarget, 16 - tBlendTarget)); + if (tBlendTarget <= 0) { - FillWindowPixelBuffer(data[14], 0x00); - AddTextPrinterParameterized4(data[14], FONT_NORMAL, 3, 5, 1, 0, sTextColor_OakSpeech, 0, sNewGameAdventureIntroTextPointers[sOakSpeechResources->unk_0012]); - if (sOakSpeechResources->unk_0012 == 0) + FillWindowPixelBuffer(tTextboxWindowId, PIXEL_FILL(0)); + AddTextPrinterParameterized4(tTextboxWindowId, FONT_NORMAL, 3, 5, 1, 0, sTextColor_DarkGray, 0, sPikachuIntro_Strings[sOakSpeechResources->currentPage]); + if (sOakSpeechResources->currentPage == PIKACHU_INTRO_PAGE_1) { ClearTopBarWindow(); TopBarWindowPrintString(gText_ABUTTONNext, 0, 1); @@ -821,403 +1035,407 @@ static void Task_OakSpeech7(u8 taskId) gMain.state++; } break; - case 3: - data[15] += 2; - SetGpuReg(REG_OFFSET_BLDALPHA, ((16 - data[15]) << 8) | data[15]); - if (data[15] >= 16) + case PIKACHU_INTRO_FADE_IN_PAGE: + tBlendTarget += 2; + SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(tBlendTarget, 16 - tBlendTarget)); + if (tBlendTarget >= 16) { - data[15] = 16; + tBlendTarget = 16; SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BLDALPHA, 0); - gMain.state = 1; + gMain.state = PIKACHU_INTRO_HANDLE_INPUT; } break; - case 4: - DestroyTextCursorSprite(gTasks[taskId].data[5]); + case PIKACHU_INTRO_EXIT: + DestroyTextCursorSprite(gTasks[taskId].tTextCursorSpriteId); PlayBGM(MUS_NEW_GAME_EXIT); - data[15] = 24; + tBlendTarget = 24; gMain.state++; break; default: - if (data[15] != 0) - data[15]--; + if (tBlendTarget != 0) + { + tBlendTarget--; + } else { gMain.state = 0; - sOakSpeechResources->unk_0012 = 0; + sOakSpeechResources->currentPage = 0; SetGpuReg(REG_OFFSET_WIN0H, 0); SetGpuReg(REG_OFFSET_WIN0V, 0); SetGpuReg(REG_OFFSET_WININ, 0); SetGpuReg(REG_OFFSET_WINOUT, 0); ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON); BeginNormalPaletteFade(PALETTES_ALL, 2, 0, 16, RGB_BLACK); - gTasks[taskId].func = Task_OakSpeech8; + gTasks[taskId].func = Task_PikachuIntro_Clear; } break; } } -static void Task_OakSpeech8(u8 taskId) -{ - s16 * data = gTasks[taskId].data; +#undef tBlendTarget +static void Task_PikachuIntro_Clear(u8 taskId) +{ + s16 *data = gTasks[taskId].data; if (!gPaletteFade.active) { DestroyTopBarWindow(); - FillWindowPixelBuffer(data[14], 0x00); - ClearWindowTilemap(data[14]); - CopyWindowToVram(data[14], COPYWIN_FULL); - RemoveWindow(data[14]); - data[14] = 0; - FillBgTilemapBufferRect_Palette0(1, 0x000, 0, 0, 30, 20); + FillWindowPixelBuffer(tTextboxWindowId, PIXEL_FILL(0)); + ClearWindowTilemap(tTextboxWindowId); + CopyWindowToVram(tTextboxWindowId, COPYWIN_FULL); + RemoveWindow(tTextboxWindowId); + tTextboxWindowId = 0; + FillBgTilemapBufferRect_Palette0(1, 0, 0, 0, 30, 20); CopyBgTilemapBufferToVram(1); - DestroyLinkedPikaOrGrassPlatformSprites(taskId, 0); - data[3] = 80; - gTasks[taskId].func = Task_OakSpeech9; + DestroyPikachuOrPlatformSprites(taskId, SPRITE_TYPE_PIKACHU); + tTimer = 80; + gTasks[taskId].func = Task_OakSpeech_Init; } } -static void Task_OakSpeech9(u8 taskId) +static void Task_OakSpeech_Init(u8 taskId) { - s16 * data = gTasks[taskId].data; + s16 *data = gTasks[taskId].data; u32 size = 0; - - if (data[3] != 0) - data[3]--; + if (tTimer != 0) + { + tTimer--; + } else { - sOakSpeechResources->solidColorsGfx = MallocAndDecompress(sOakSpeechGfx_SolidColors, &size); - LoadBgTiles(1, sOakSpeechResources->solidColorsGfx, size, 0); - CopyToBgTilemapBuffer(1, sOakSpeech_BackgroundTilemap, 0, 0); + sOakSpeechResources->oakSpeechBackgroundTiles = MallocAndDecompress(sOakSpeech_Background_Tiles, &size); + LoadBgTiles(1, sOakSpeechResources->oakSpeechBackgroundTiles, size, 0); + CopyToBgTilemapBuffer(1, sOakSpeech_Background_Tilemap, 0, 0); CopyBgTilemapBufferToVram(1); CreateNidoranFSprite(taskId); - LoadOaksSpeechTrainerPic(OAK_PIC, 0); - CreatePikaOrGrassPlatformSpriteAndLinkToCurrentTask(taskId, 1); + LoadTrainerPic(OAK_PIC, 0); + CreatePikachuOrPlatformSprites(taskId, SPRITE_TYPE_PLATFORM); PlayBGM(MUS_ROUTE24); BeginNormalPaletteFade(PALETTES_ALL, 5, 16, 0, RGB_BLACK); - data[3] = 80; + tTimer = 80; ShowBg(2); - gTasks[taskId].func = Task_OakSpeech10; + gTasks[taskId].func = Task_OakSpeech_WelcomeToTheWorld; } } -#define OaksSpeechPrintMessage(str, speed) ({ \ - DrawDialogueFrame(0, FALSE);\ - if (str != gStringVar4) \ - { \ - StringExpandPlaceholders(gStringVar4, str); \ - AddTextPrinterParameterized2(0, FONT_MALE, gStringVar4, speed, NULL, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY); \ - } \ - else \ - { \ - AddTextPrinterParameterized2(0, FONT_MALE, str, speed, NULL, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY); \ - } \ - CopyWindowToVram(0, COPYWIN_FULL); \ +#define OakSpeechPrintMessage(str, speed) ({ \ + DrawDialogueFrame(WIN_INTRO_TEXTBOX, FALSE); \ + if (str != gStringVar4) \ + { \ + StringExpandPlaceholders(gStringVar4, str); \ + AddTextPrinterParameterized2(WIN_INTRO_TEXTBOX, FONT_MALE, gStringVar4, speed, NULL, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY); \ + } \ + else \ + { \ + AddTextPrinterParameterized2(WIN_INTRO_TEXTBOX, FONT_MALE, str, speed, NULL, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_WHITE, TEXT_COLOR_LIGHT_GRAY); \ + } \ + CopyWindowToVram(WIN_INTRO_TEXTBOX, COPYWIN_FULL); \ }) -static void Task_OakSpeech10(u8 taskId) +static void Task_OakSpeech_WelcomeToTheWorld(u8 taskId) { - s16 * data = gTasks[taskId].data; - + s16 *data = gTasks[taskId].data; if (!gPaletteFade.active) { - if (data[3] != 0) - data[3]--; + if (tTimer != 0) + { + tTimer--; + } else { - OaksSpeechPrintMessage(gOakText_WelcomeToTheWorld, sOakSpeechResources->textSpeed); - gTasks[taskId].func = Task_OakSpeech11; + OakSpeechPrintMessage(gOakSpeech_Text_WelcomeToTheWorld, sOakSpeechResources->textSpeed); + gTasks[taskId].func = Task_OakSpeech_ThisWorld; } } } -static void Task_OakSpeech11(u8 taskId) +static void Task_OakSpeech_ThisWorld(u8 taskId) { - if (!IsTextPrinterActive(0)) + if (!IsTextPrinterActive(WIN_INTRO_TEXTBOX)) { - OaksSpeechPrintMessage(gOakText_WorldInhabited1, sOakSpeechResources->textSpeed); - gTasks[taskId].data[3] = 30; - gTasks[taskId].func = Task_OakSpeech12; + OakSpeechPrintMessage(gOakSpeech_Text_ThisWorld, sOakSpeechResources->textSpeed); + gTasks[taskId].tTimer = 30; + gTasks[taskId].func = Task_OakSpeech_ReleaseNidoranFFromPokeBall; } } -static void Task_OakSpeech12(u8 taskId) +static void Task_OakSpeech_ReleaseNidoranFFromPokeBall(u8 taskId) { - s16 * data = gTasks[taskId].data; + s16 *data = gTasks[taskId].data; u8 spriteId; - if (!IsTextPrinterActive(0)) + if (!IsTextPrinterActive(WIN_INTRO_TEXTBOX)) { - if (data[3] != 0) - data[3]--; - // else { - spriteId = gTasks[taskId].data[4]; + if (tTimer != 0) + tTimer--; + spriteId = gTasks[taskId].tNidoranFSpriteId; gSprites[spriteId].invisible = FALSE; - gSprites[spriteId].data[0] = 0; - CreatePokeballSpriteToReleaseMon(spriteId, gSprites[spriteId].oam.paletteNum, 0x64, 0x42, 0, 0, 32, 0xFFFF1FFF); - gTasks[taskId].func = Task_OakSpeech13; - gTasks[taskId].data[3] = 0; - // } + gSprites[spriteId].tSpriteTimer = 0; + CreatePokeballSpriteToReleaseMon(spriteId, gSprites[spriteId].oam.paletteNum, 100, 66, 0, 0, 32, 0xFFFF1FFF); + gTasks[taskId].func = Task_OakSpeech_IsInhabitedFarAndWide; + gTasks[taskId].tTimer = 0; } } -static void Task_OakSpeech13(u8 taskId) +static void Task_OakSpeech_IsInhabitedFarAndWide(u8 taskId) { if (IsCryFinished()) { - if (gTasks[taskId].data[3] >= 96) - gTasks[taskId].func = Task_OakSpeech14; + if (gTasks[taskId].tTimer >= 96) + gTasks[taskId].func = Task_OakSpeech_IStudyPokemon; } - if (gTasks[taskId].data[3] < 0x4000) + if (gTasks[taskId].tTimer < 0x4000) { - gTasks[taskId].data[3]++; - if (gTasks[taskId].data[3] == 32) + gTasks[taskId].tTimer++; + if (gTasks[taskId].tTimer == 32) { - OaksSpeechPrintMessage(gOakText_WorldInhabited2, sOakSpeechResources->textSpeed); + OakSpeechPrintMessage(gOakSpeech_Text_IsInhabitedFarAndWide, sOakSpeechResources->textSpeed); PlayCry_Normal(SPECIES_NIDORAN_F, 0); } } } -static void Task_OakSpeech14(u8 taskId) +static void Task_OakSpeech_IStudyPokemon(u8 taskId) { - if (!IsTextPrinterActive(0)) + if (!IsTextPrinterActive(WIN_INTRO_TEXTBOX)) { - OaksSpeechPrintMessage(gOakText_PetsBattlingStudy, sOakSpeechResources->textSpeed); - gTasks[taskId].func = Task_OakSpeech15; + OakSpeechPrintMessage(gOakSpeech_Text_IStudyPokemon, sOakSpeechResources->textSpeed); + gTasks[taskId].func = Task_OakSpeech_ReturnNidoranFToPokeBall; } } -static void Task_OakSpeech15(u8 taskId) +static void Task_OakSpeech_ReturnNidoranFToPokeBall(u8 taskId) { u8 spriteId; - if (!IsTextPrinterActive(0)) + if (!IsTextPrinterActive(WIN_INTRO_TEXTBOX)) { - ClearDialogWindowAndFrame(0, 1); - spriteId = gTasks[taskId].data[4]; - gTasks[taskId].data[6] = CreateTradePokeballSprite(spriteId, gSprites[spriteId].oam.paletteNum, 0x64, 0x42, 0, 0, 32, 0xFFFF1F3F); - gTasks[taskId].data[3] = 48; - gTasks[taskId].data[0] = 64; - gTasks[taskId].func = Task_OakSpeech16; + ClearDialogWindowAndFrame(WIN_INTRO_TEXTBOX, TRUE); + spriteId = gTasks[taskId].tNidoranFSpriteId; + gTasks[taskId].tPokeBallSpriteId = CreateTradePokeballSprite(spriteId, gSprites[spriteId].oam.paletteNum, 100, 66, 0, 0, 32, 0xFFFF1F3F); + gTasks[taskId].tTimer = 48; + gTasks[taskId].tSpriteTimer = 64; + gTasks[taskId].func = Task_OakSpeech_TellMeALittleAboutYourself; } } -static void Task_OakSpeech16(u8 taskId) +static void Task_OakSpeech_TellMeALittleAboutYourself(u8 taskId) { - s16 * data = gTasks[taskId].data; + s16 *data = gTasks[taskId].data; - if (data[0] != 0) + if (tSpriteTimer != 0) { - if (data[0] < 24) - { - gSprites[data[4]].y--; - } - data[0]--; + if (tSpriteTimer < 24) + gSprites[tNidoranFSpriteId].y--; + tSpriteTimer--; } else { - if (data[3] == 48) + if (tTimer == 48) { - DestroySprite(&gSprites[data[4]]); - DestroySprite(&gSprites[data[6]]); + DestroySprite(&gSprites[tNidoranFSpriteId]); + DestroySprite(&gSprites[tPokeBallSpriteId]); } - if (data[3] != 0) + if (tTimer != 0) { - data[3]--; + tTimer--; } else { - OaksSpeechPrintMessage(gOakText_TellMeALittleAboutYourself, sOakSpeechResources->textSpeed); - gTasks[taskId].func = Task_OakSpeech17; + OakSpeechPrintMessage(gOakSpeech_Text_TellMeALittleAboutYourself, sOakSpeechResources->textSpeed); + gTasks[taskId].func = Task_OakSpeech_FadeOutOak; } } } -static void Task_OakSpeech17(u8 taskId) +static void Task_OakSpeech_FadeOutOak(u8 taskId) { - s16 * data = gTasks[taskId].data; + s16 *data = gTasks[taskId].data; - if (!IsTextPrinterActive(0)) + if (!IsTextPrinterActive(WIN_INTRO_TEXTBOX)) { - ClearDialogWindowAndFrame(0, 1); + ClearDialogWindowAndFrame(WIN_INTRO_TEXTBOX, 1); CreateFadeInTask(taskId, 2); - data[3] = 48; - gTasks[taskId].func = Task_OakSpeech18; + tTimer = 48; + gTasks[taskId].func = Task_OakSpeech_AskPlayerGender; } } -static void Task_OakSpeech18(u8 taskId) +static void Task_OakSpeech_AskPlayerGender(u8 taskId) { - s16 * data = gTasks[taskId].data; + s16 *data = gTasks[taskId].data; if (tTrainerPicFadeState != 0) { - if (data[3] != 0) - data[3]--; + if (tTimer != 0) + { + tTimer--; + } else { tTrainerPicPosX = -60; - DestroyOaksSpeechTrainerPic(); - OaksSpeechPrintMessage(gOakText_AskPlayerGender, sOakSpeechResources->textSpeed); - gTasks[taskId].func = Task_OakSpeech19; + ClearTrainerPic(); + OakSpeechPrintMessage(gOakSpeech_Text_AskPlayerGender, sOakSpeechResources->textSpeed); + gTasks[taskId].func = Task_OakSpeech_ShowGenderOptions; } } } -static void Task_OakSpeech19(u8 taskId) +static void Task_OakSpeech_ShowGenderOptions(u8 taskId) { - if (!IsTextPrinterActive(0)) + if (!IsTextPrinterActive(WIN_INTRO_TEXTBOX)) { - gTasks[taskId].data[13] = AddWindow(&sNewGameAdventureIntroWindowTemplates[1]); - PutWindowTilemap(gTasks[taskId].data[13]); - DrawStdFrameWithCustomTileAndPalette(gTasks[taskId].data[13], 1, GetStdWindowBaseTileNum(), 14); - FillWindowPixelBuffer(gTasks[taskId].data[13], 0x11); + gTasks[taskId].tMenuWindowId = AddWindow(&sIntro_WindowTemplates[WIN_INTRO_BOYGIRL]); + PutWindowTilemap(gTasks[taskId].tMenuWindowId); + DrawStdFrameWithCustomTileAndPalette(gTasks[taskId].tMenuWindowId, TRUE, GetStdWindowBaseTileNum(), 14); + FillWindowPixelBuffer(gTasks[taskId].tMenuWindowId, PIXEL_FILL(1)); sOakSpeechResources->textColor[0] = 1; sOakSpeechResources->textColor[1] = 2; sOakSpeechResources->textColor[2] = 3; - AddTextPrinterParameterized3(gTasks[taskId].data[13], FONT_NORMAL, 8, 1, sOakSpeechResources->textColor, 0, gText_Boy); + AddTextPrinterParameterized3(gTasks[taskId].tMenuWindowId, FONT_NORMAL, 8, 1, sOakSpeechResources->textColor, 0, gText_Boy); sOakSpeechResources->textColor[0] = 1; sOakSpeechResources->textColor[1] = 2; sOakSpeechResources->textColor[2] = 3; - AddTextPrinterParameterized3(gTasks[taskId].data[13], FONT_NORMAL, 8, 17, sOakSpeechResources->textColor, 0, gText_Girl); - Menu_InitCursor(gTasks[taskId].data[13], FONT_NORMAL, 0, 1, GetFontAttribute(FONT_NORMAL, FONTATTR_MAX_LETTER_HEIGHT) + 2, 2, 0); - CopyWindowToVram(gTasks[taskId].data[13], COPYWIN_FULL); - gTasks[taskId].func = Task_OakSpeech20; + AddTextPrinterParameterized3(gTasks[taskId].tMenuWindowId, FONT_NORMAL, 8, 17, sOakSpeechResources->textColor, 0, gText_Girl); + Menu_InitCursor(gTasks[taskId].tMenuWindowId, FONT_NORMAL, 0, 1, GetFontAttribute(FONT_NORMAL, FONTATTR_MAX_LETTER_HEIGHT) + 2, 2, 0); + CopyWindowToVram(gTasks[taskId].tMenuWindowId, COPYWIN_FULL); + gTasks[taskId].func = Task_OakSpeech_HandleGenderInput; } } -static void Task_OakSpeech20(u8 taskId) +static void Task_OakSpeech_HandleGenderInput(u8 taskId) { s8 input = Menu_ProcessInputNoWrapAround(); switch (input) { - case 0: + case 0: // BOY gSaveBlock2Ptr->playerGender = MALE; break; - case 1: + case 1: // GIRL gSaveBlock2Ptr->playerGender = FEMALE; break; - case -1: - case -2: + case MENU_B_PRESSED: + case MENU_NOTHING_CHOSEN: return; } - gTasks[taskId].func = Task_OakSpeech21; + gTasks[taskId].func = Task_OakSpeech_ClearGenderWindows; } -static void Task_OakSpeech21(u8 taskId) +static void Task_OakSpeech_ClearGenderWindows(u8 taskId) { - s16 * data = gTasks[taskId].data; - ClearStdWindowAndFrameToTransparent(data[13], TRUE); - RemoveWindow(data[13]); - data[13] = 0; - ClearDialogWindowAndFrame(0, 1); + s16 *data = gTasks[taskId].data; + ClearStdWindowAndFrameToTransparent(tMenuWindowId, TRUE); + RemoveWindow(tMenuWindowId); + tMenuWindowId = WIN_INTRO_TEXTBOX; + ClearDialogWindowAndFrame(tMenuWindowId, TRUE); FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 30, 20); CopyBgTilemapBufferToVram(0); - gTasks[taskId].func = Task_OakSpeech22; + gTasks[taskId].func = Task_OakSpeech_LoadPlayerPic; } -static void Task_OakSpeech22(u8 taskId) +static void Task_OakSpeech_LoadPlayerPic(u8 taskId) { if (gSaveBlock2Ptr->playerGender == MALE) - LoadOaksSpeechTrainerPic(MALE_PLAYER_PIC, 0); + LoadTrainerPic(MALE_PLAYER_PIC, 0); else - LoadOaksSpeechTrainerPic(FEMALE_PLAYER_PIC, 0); + LoadTrainerPic(FEMALE_PLAYER_PIC, 0); CreateFadeOutTask(taskId, 2); - gTasks[taskId].data[3] = 32; - gTasks[taskId].func = Task_OakSpeech23; + gTasks[taskId].tTimer = 32; + gTasks[taskId].func = Task_OakSpeech_YourNameWhatIsIt; } -static void Task_OakSpeech23(u8 taskId) +static void Task_OakSpeech_YourNameWhatIsIt(u8 taskId) { - s16 * data = gTasks[taskId].data; + s16 *data = gTasks[taskId].data; if (tTrainerPicFadeState != 0) { - if (data[3] != 0) - data[3]--; + if (tTimer != 0) + { + tTimer--; + } else { tTrainerPicPosX = 0; - OaksSpeechPrintMessage(gOakText_AskPlayerName, sOakSpeechResources->textSpeed); - gTasks[taskId].func = Task_OakSpeech24; + OakSpeechPrintMessage(gOakSpeech_Text_YourNameWhatIsIt, sOakSpeechResources->textSpeed); + gTasks[taskId].func = Task_OakSpeech_FadeOutForPlayerNamingScreen; } } } -static void Task_OakSpeech24(u8 taskId) +static void Task_OakSpeech_FadeOutForPlayerNamingScreen(u8 taskId) { - if (!IsTextPrinterActive(0)) + if (!IsTextPrinterActive(WIN_INTRO_TEXTBOX)) { BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); sOakSpeechResources->hasPlayerBeenNamed = FALSE; - gTasks[taskId].func = Task_OakSpeech25; + gTasks[taskId].func = Task_OakSpeech_DoNamingScreen; } } -static void Task_OakSpeech35(u8 taskId) -{ - s16 * data = gTasks[taskId].data; - if (!IsTextPrinterActive(0)) +static void Task_OakSpeech_MoveRivalDisplayNameOptions(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + + if (!IsTextPrinterActive(WIN_INTRO_TEXTBOX)) { if (tTrainerPicPosX > -60) { tTrainerPicPosX -= 2; gSpriteCoordOffsetX += 2; - ChangeBgX(2, 0x200, 2); + ChangeBgX(2, 0x200, BG_COORD_SUB); } else { tTrainerPicPosX = -60; PrintNameChoiceOptions(taskId, sOakSpeechResources->hasPlayerBeenNamed); - gTasks[taskId].func = Task_OakSpeech29; + gTasks[taskId].func = Task_OakSpeech_HandleRivalNameInput; } } } -static void Task_OakSpeech28(u8 taskId) +static void Task_OakSpeech_RepeatNameQuestion(u8 taskId) { PrintNameChoiceOptions(taskId, sOakSpeechResources->hasPlayerBeenNamed); if (sOakSpeechResources->hasPlayerBeenNamed == FALSE) - { - OaksSpeechPrintMessage(gOakText_AskPlayerName, 0); - } + OakSpeechPrintMessage(gOakSpeech_Text_YourNameWhatIsIt, 0); else - { - OaksSpeechPrintMessage(gOakText_AskRivalName, 0); - } - gTasks[taskId].func = Task_OakSpeech29; + OakSpeechPrintMessage(gOakSpeech_Text_YourRivalsNameWhatWasIt, 0); + gTasks[taskId].func = Task_OakSpeech_HandleRivalNameInput; } -static void Task_OakSpeech29(u8 taskId) +#define tNameNotConfirmed data[15] + +static void Task_OakSpeech_HandleRivalNameInput(u8 taskId) { - s16 * data = gTasks[taskId].data; + s16 *data = gTasks[taskId].data; s8 input = Menu_ProcessInput(); switch (input) { - case 1: - case 2: - case 3: - case 4: + case 0: // NEW NAME PlaySE(SE_SELECT); - ClearStdWindowAndFrameToTransparent(data[13], TRUE); - RemoveWindow(data[13]); + BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); + gTasks[taskId].func = Task_OakSpeech_DoNamingScreen; + break; + case 1: // Default name options + case 2: // + case 3: // + case 4: // + PlaySE(SE_SELECT); + ClearStdWindowAndFrameToTransparent(tMenuWindowId, TRUE); + RemoveWindow(tMenuWindowId); GetDefaultName(sOakSpeechResources->hasPlayerBeenNamed, input - 1); - data[15] = 1; - gTasks[taskId].func = Task_OakSpeech26; + tNameNotConfirmed = TRUE; + gTasks[taskId].func = Task_OakSpeech_ConfirmName; break; - case 0: - PlaySE(SE_SELECT); - BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, 0); - gTasks[taskId].func = Task_OakSpeech25; - break; - case -1: + case MENU_B_PRESSED: break; } } -static void Task_OakSpeech25(u8 taskId) +static void Task_OakSpeech_DoNamingScreen(u8 taskId) { if (!gPaletteFade.active) { @@ -1228,275 +1446,302 @@ static void Task_OakSpeech25(u8 taskId) } else { - ClearStdWindowAndFrameToTransparent(gTasks[taskId].data[13], 1); - RemoveWindow(gTasks[taskId].data[13]); + ClearStdWindowAndFrameToTransparent(gTasks[taskId].tMenuWindowId, TRUE); + RemoveWindow(gTasks[taskId].tMenuWindowId); DoNamingScreen(NAMING_SCREEN_RIVAL, gSaveBlock1Ptr->rivalName, 0, 0, 0, CB2_ReturnFromNamingScreen); } - DestroyLinkedPikaOrGrassPlatformSprites(taskId, 1); + DestroyPikachuOrPlatformSprites(taskId, SPRITE_TYPE_PLATFORM); FreeAllWindowBuffers(); } } -static void Task_OakSpeech26(u8 taskId) +static void Task_OakSpeech_ConfirmName(u8 taskId) { - s16 * data = gTasks[taskId].data; - + s16 *data = gTasks[taskId].data; if (!gPaletteFade.active) { - if (data[15] == 1) + if (tNameNotConfirmed == TRUE) { if (sOakSpeechResources->hasPlayerBeenNamed == FALSE) - { - StringExpandPlaceholders(gStringVar4, gOakText_FinalizePlayerName); - } + StringExpandPlaceholders(gStringVar4, gOakSpeech_Text_SoYourNameIsPlayer); else - { - StringExpandPlaceholders(gStringVar4, gOakText_ConfirmRivalName); - } - OaksSpeechPrintMessage(gStringVar4, sOakSpeechResources->textSpeed); - data[15] = 0; - data[3] = 25; + StringExpandPlaceholders(gStringVar4, gOakSpeech_Text_ConfirmRivalName); + OakSpeechPrintMessage(gStringVar4, sOakSpeechResources->textSpeed); + tNameNotConfirmed = FALSE; + tTimer = 25; } - else if (!IsTextPrinterActive(0)) + else if (!IsTextPrinterActive(WIN_INTRO_TEXTBOX)) { - if (data[3] != 0) - data[3]--; + if (tTimer != 0) + { + tTimer--; + } else { - CreateYesNoMenu(&sNewGameAdventureIntroWindowTemplates[2], FONT_NORMAL, 0, 2, GetStdWindowBaseTileNum(), 14, 0); - gTasks[taskId].func = Task_OakSpeech27; + CreateYesNoMenu(&sIntro_WindowTemplates[WIN_INTRO_YESNO], FONT_NORMAL, 0, 2, GetStdWindowBaseTileNum(), 14, 0); + gTasks[taskId].func = Task_OakSpeech_HandleConfirmNameInput; } } } } -static void Task_OakSpeech27(u8 taskId) +static void Task_OakSpeech_HandleConfirmNameInput(u8 taskId) { s8 input = Menu_ProcessInputNoWrapClearOnChoose(); switch (input) { - case 0: + case 0: // YES PlaySE(SE_SELECT); - gTasks[taskId].data[3] = 40; + gTasks[taskId].tTimer = 40; if (sOakSpeechResources->hasPlayerBeenNamed == FALSE) { - ClearDialogWindowAndFrame(0, 1); + ClearDialogWindowAndFrame(WIN_INTRO_TEXTBOX, TRUE); CreateFadeInTask(taskId, 2); - gTasks[taskId].func = Task_OakSpeech30; + gTasks[taskId].func = Task_OakSpeech_FadeOutPlayerPic; } else { - StringExpandPlaceholders(gStringVar4, gOakText_RememberRivalName); - OaksSpeechPrintMessage(gStringVar4, sOakSpeechResources->textSpeed); - gTasks[taskId].func = Task_OakSpeech31; + StringExpandPlaceholders(gStringVar4, gOakSpeech_Text_RememberRivalsName); + OakSpeechPrintMessage(gStringVar4, sOakSpeechResources->textSpeed); + gTasks[taskId].func = Task_OakSpeech_FadeOutRivalPic; } break; - case 1: - case -1: + case 1: // NO + case MENU_B_PRESSED: PlaySE(SE_SELECT); if (sOakSpeechResources->hasPlayerBeenNamed == FALSE) - gTasks[taskId].func = Task_OakSpeech24; + gTasks[taskId].func = Task_OakSpeech_FadeOutForPlayerNamingScreen; else - gTasks[taskId].func = Task_OakSpeech28; + gTasks[taskId].func = Task_OakSpeech_RepeatNameQuestion; break; } } -static void Task_OakSpeech30(u8 taskId) +static void Task_OakSpeech_FadeOutPlayerPic(u8 taskId) { - s16 * data = gTasks[taskId].data; + s16 *data = gTasks[taskId].data; if (tTrainerPicFadeState != 0) { - DestroyOaksSpeechTrainerPic(); - if (data[3] != 0) - data[3]--; + ClearTrainerPic(); + if (tTimer != 0) + tTimer--; else - gTasks[taskId].func = Task_OakSpeech32; + gTasks[taskId].func = Task_OakSpeech_FadeInRivalPic; } } -static void Task_OakSpeech31(u8 taskId) +static void Task_OakSpeech_FadeOutRivalPic(u8 taskId) { - if (!IsTextPrinterActive(0)) + if (!IsTextPrinterActive(WIN_INTRO_TEXTBOX)) { - ClearDialogWindowAndFrame(0, 1); + ClearDialogWindowAndFrame(WIN_INTRO_TEXTBOX, TRUE); CreateFadeInTask(taskId, 2); - gTasks[taskId].func = Task_OakSpeech33; + gTasks[taskId].func = Task_OakSpeech_ReshowPlayersPic; } } -static void Task_OakSpeech32(u8 taskId) +static void Task_OakSpeech_FadeInRivalPic(u8 taskId) { - ChangeBgX(2, 0, 0); + ChangeBgX(2, 0, BG_COORD_SET); gTasks[taskId].tTrainerPicPosX = 0; gSpriteCoordOffsetX = 0; - LoadOaksSpeechTrainerPic(RIVAL_PIC, 0); + LoadTrainerPic(RIVAL_PIC, 0); CreateFadeOutTask(taskId, 2); - gTasks[taskId].func = Task_OakSpeech34; + gTasks[taskId].func = Task_OakSpeech_AskRivalsName; } -static void Task_OakSpeech34(u8 taskId) +static void Task_OakSpeech_AskRivalsName(u8 taskId) { - s16 * data = gTasks[taskId].data; + s16 *data = gTasks[taskId].data; if (tTrainerPicFadeState != 0) { - OaksSpeechPrintMessage(gOakText_IntroduceRival, sOakSpeechResources->textSpeed); + OakSpeechPrintMessage(gOakSpeech_Text_WhatWasHisName, sOakSpeechResources->textSpeed); sOakSpeechResources->hasPlayerBeenNamed = TRUE; - gTasks[taskId].func = Task_OakSpeech35; + gTasks[taskId].func = Task_OakSpeech_MoveRivalDisplayNameOptions; } } -static void Task_OakSpeech33(u8 taskId) +static void Task_OakSpeech_ReshowPlayersPic(u8 taskId) { - s16 * data = gTasks[taskId].data; + s16 *data = gTasks[taskId].data; if (tTrainerPicFadeState != 0) { - DestroyOaksSpeechTrainerPic(); - if (data[3] != 0) - data[3]--; + ClearTrainerPic(); + if (tTimer != 0) + { + tTimer--; + } else { if (gSaveBlock2Ptr->playerGender == MALE) - LoadOaksSpeechTrainerPic(MALE_PLAYER_PIC, 0); + LoadTrainerPic(MALE_PLAYER_PIC, 0); else - LoadOaksSpeechTrainerPic(FEMALE_PLAYER_PIC, 0); + LoadTrainerPic(FEMALE_PLAYER_PIC, 0); gTasks[taskId].tTrainerPicPosX = 0; gSpriteCoordOffsetX = 0; - ChangeBgX(2, 0, 0); + ChangeBgX(2, 0, BG_COORD_SET); CreateFadeOutTask(taskId, 2); - gTasks[taskId].func = Task_OakSpeech36; + gTasks[taskId].func = Task_OakSpeech_LetsGo; } } } -static void Task_OakSpeech36(u8 taskId) +static void Task_OakSpeech_LetsGo(u8 taskId) { if (gTasks[taskId].tTrainerPicFadeState != 0) { - StringExpandPlaceholders(gStringVar4, gOakText_LegendAboutToUnfold); - OaksSpeechPrintMessage(gStringVar4, sOakSpeechResources->textSpeed); - gTasks[taskId].data[3] = 30; - gTasks[taskId].func = Task_OakSpeech37; + StringExpandPlaceholders(gStringVar4, gOakSpeech_Text_LetsGo); + OakSpeechPrintMessage(gStringVar4, sOakSpeechResources->textSpeed); + gTasks[taskId].tTimer = 30; + gTasks[taskId].func = Task_OakSpeech_FadeOutBGM; } } -static void Task_OakSpeech37(u8 taskId) +static void Task_OakSpeech_FadeOutBGM(u8 taskId) { - if (!IsTextPrinterActive(0)) + if (!IsTextPrinterActive(WIN_INTRO_TEXTBOX)) { - if (gTasks[taskId].data[3] != 0) - gTasks[taskId].data[3]--; + if (gTasks[taskId].tTimer != 0) + { + gTasks[taskId].tTimer--; + } else { FadeOutBGM(4); - gTasks[taskId].func = Task_OakSpeech38; + gTasks[taskId].func = Task_OakSpeech_SetUpExitAnimation; } } } -static void Task_OakSpeech38(u8 taskId) +// The sOakSpeechResources struct's currentPage field is reused below as a timer for shrinking the player pic +#define shrinkTimer currentPage + +static void Task_OakSpeech_SetUpExitAnimation(u8 taskId) { - sOakSpeechResources->unk_0012 = 0; - Task_OakSpeech38_1(taskId); - Task_OakSpeech38_2(taskId); - Task_OakSpeech38_3(taskId); + sOakSpeechResources->shrinkTimer = 0; + Task_OakSpeech_SetUpDestroyPlatformSprites(taskId); + Task_OakSpeech_SetUpFadePlayerPicWhite(taskId); + Task_OakSpeech_SetUpShrinkPlayerPic(taskId); } -static void Task_OakSpeech38_3(u8 taskId) +#define tPlayerPicFadeOutTimer data[0] +#define tScaleDelta data[2] +#define tPlayerIsShrunk data[15] + +static void Task_OakSpeech_SetUpShrinkPlayerPic(u8 taskId) { - s16 * data = gTasks[taskId].data; - SetBgAttribute(2, 6, 1); - data[0] = 0; - tTrainerPicPosX = 0; - tTrainerPicFadeState = 256; - data[15] = 0; - gTasks[taskId].func = Task_OakSpeech39; + s16 *data = gTasks[taskId].data; + SetBgAttribute(2, BG_ATTR_WRAPAROUND, 1); + tPlayerPicFadeOutTimer = 0; + data[1] = 0; // assigned, but never read + tScaleDelta = 256; + tPlayerIsShrunk = FALSE; + gTasks[taskId].func = Task_OakSpeech_ShrinkPlayerPic; } -static void Task_OakSpeech39(u8 taskId) +static void Task_OakSpeech_ShrinkPlayerPic(u8 taskId) { - s16 * data = gTasks[taskId].data; + s16 *data = gTasks[taskId].data; s16 x, y; - u16 r0; + u16 oldScaleDelta; - sOakSpeechResources->unk_0012++; - if (sOakSpeechResources->unk_0012 % 20 == 0) + sOakSpeechResources->shrinkTimer++; + if (sOakSpeechResources->shrinkTimer % 20 == 0) { - if (sOakSpeechResources->unk_0012 == 40) + if (sOakSpeechResources->shrinkTimer == 40) PlaySE(SE_WARP_IN); - r0 = tTrainerPicFadeState; - tTrainerPicFadeState -= 32; - x = Q_8_8_inv(r0 - 8); - y = Q_8_8_inv(tTrainerPicFadeState - 16); - SetBgAffine(2, 0x7800, 0x5400, 0x78, 0x54, x, y, 0); - if (tTrainerPicFadeState <= 96) + oldScaleDelta = tScaleDelta; + tScaleDelta -= 32; + x = Q_8_8_inv(oldScaleDelta - 8); + y = Q_8_8_inv(tScaleDelta - 16); + SetBgAffine(2, 0x7800, 0x5400, 120, 84, x, y, 0); + if (tScaleDelta <= 96) { - data[15] = 1; - data[0] = 36; - gTasks[taskId].func = Task_OakSpeech40; + tPlayerIsShrunk = TRUE; + tPlayerPicFadeOutTimer = 36; + gTasks[taskId].func = Task_OakSpeech_FadePlayerPicToBlack; } } } -static void Task_OakSpeech38_1(u8 taskId) +#define tBGFadeStarted data[1] + +static void Task_OakSpeech_SetUpDestroyPlatformSprites(u8 taskId) { - u8 taskId2 = CreateTask(Task_OakSpeech38_sub1, 1); - s16 * data = gTasks[taskId2].data; - data[0] = 0; - data[1] = 0; - data[2] = 0; - data[15] = 0; - BeginNormalPaletteFade(0xFFFF0FCF, 4, 0, 16, RGB_BLACK); + u8 taskId2 = CreateTask(Task_OakSpeech_DestroyPlatformSprites, 1); + s16 *data = gTasks[taskId2].data; + data[0] = 0; // assigned, but never read + tBGFadeStarted = 0; + data[2] = 0; // assigned, but never read + data[15] = 0; // assigned, but never read + BeginNormalPaletteFade(PALETTES_OBJECTS | 0x0FCF, 4, 0, 16, RGB_BLACK); } -static void Task_OakSpeech38_sub1(u8 taskId) +static void Task_OakSpeech_DestroyPlatformSprites(u8 taskId) { - s16 * data = gTasks[taskId].data; + s16 *data = gTasks[taskId].data; if (!gPaletteFade.active) { - if (data[1] != 0) + if (tBGFadeStarted != 0) { DestroyTask(taskId); - DestroyLinkedPikaOrGrassPlatformSprites(taskId, 1); + // As this function's taskId is in fact taskId2 above, in + // Task_OakSpeech_SetUpDestroyPlatformSprites, the platform sprite + // IDs have not been assigned to this task's data[7], data[8] and + // data[9]. + // As a result, the function below will only delete the sprite with + // ID 0. + // This can be verified by looking at the sprite viewer in an + // emulator at the end of the Oak speech. + DestroyPikachuOrPlatformSprites(taskId, SPRITE_TYPE_PLATFORM); } else { - data[1]++; - BeginNormalPaletteFade(0x0000F000, 0, 0, 16, RGB_BLACK); + tBGFadeStarted++; + BeginNormalPaletteFade(0x0000 | 0xF000, 0, 0, 16, RGB_BLACK); } } } -static void Task_OakSpeech38_2(u8 taskId) +#undef tBGFadeStarted + +#define tPlayerPicFadeWhiteTimer data[0] +#define tUnderflowingTimer data[1] +#define tSecondaryTimer data[2] +#define tBlendCoefficient data[14] + +static void Task_OakSpeech_SetUpFadePlayerPicWhite(u8 taskId) { - u8 taskId2 = CreateTask(Task_OakSpeech38_sub2, 2); - s16 * data = gTasks[taskId2].data; - data[0] = 8; - data[1] = 0; - data[2] = 8; - data[14] = 0; - data[15] = 0; + u8 taskId2 = CreateTask(Task_OakSpeech_FadePlayerPicWhite, 2); + s16 *data = gTasks[taskId2].data; + tPlayerPicFadeWhiteTimer = 8; + tUnderflowingTimer = 0; + tSecondaryTimer = 8; + tBlendCoefficient = 0; + data[15] = 0; // assigned, but never read } -static void Task_OakSpeech38_sub2(u8 taskId) +static void Task_OakSpeech_FadePlayerPicWhite(u8 taskId) { - s16 * data = gTasks[taskId].data; + s16 *data = gTasks[taskId].data; u8 i; - if (data[0] != 0) - data[0]--; + if (tPlayerPicFadeWhiteTimer != 0) + { + tPlayerPicFadeWhiteTimer--; + } else { - if (data[1] <= 0 && data[2] != 0) - data[2]--; - BlendPalette(0x40, 0x20, data[14], RGB_WHITE); - data[14]++; - data[1]--; - data[0] = data[2]; - if (data[14] > 14) + if (tUnderflowingTimer <= 0 && tSecondaryTimer != 0) + tSecondaryTimer--; + BlendPalette(0x40, 0x20, tBlendCoefficient, RGB_WHITE); + tBlendCoefficient++; + tUnderflowingTimer--; + tPlayerPicFadeWhiteTimer = tSecondaryTimer; + if (tBlendCoefficient > 14) { for (i = 0; i < 32; i++) { @@ -1508,26 +1753,26 @@ static void Task_OakSpeech38_sub2(u8 taskId) } } -static void Task_OakSpeech40(u8 taskId) +static void Task_OakSpeech_FadePlayerPicToBlack(u8 taskId) { - if (gTasks[taskId].data[0] != 0) - gTasks[taskId].data[0]--; + if (gTasks[taskId].tPlayerPicFadeOutTimer != 0) + { + gTasks[taskId].tPlayerPicFadeOutTimer--; + } else { - BeginNormalPaletteFade(0x00000030, 2, 0, 16, RGB_BLACK); - gTasks[taskId].func = Task_OakSpeech41; + BeginNormalPaletteFade(0x0000 | 0x0030, 2, 0, 16, RGB_BLACK); + gTasks[taskId].func = Task_OakSpeech_WaitForFade; } } -static void Task_OakSpeech41(u8 taskId) +static void Task_OakSpeech_WaitForFade(u8 taskId) { if (!gPaletteFade.active) - { - gTasks[taskId].func = Task_OakSpeech42; - } + gTasks[taskId].func = Task_OakSpeech_FreeResources; } -static void Task_OakSpeech42(u8 taskId) +static void Task_OakSpeech_FreeResources(u8 taskId) { FreeAllWindowBuffers(); OakSpeechNidoranFFreeResources(); @@ -1557,13 +1802,13 @@ static void CB2_ReturnFromNamingScreen(void) break; case 1: ResetBgsAndClearDma3BusyFlags(0); - InitBgsFromTemplates(1, sBgTemplates, NELEMS(sBgTemplates)); + InitBgsFromTemplates(1, sBgTemplates, ARRAY_COUNT(sBgTemplates)); SetBgTilemapBuffer(1, sOakSpeechResources->bg1TilemapBuffer); SetBgTilemapBuffer(2, sOakSpeechResources->bg2TilemapBuffer); - ChangeBgX(1, 0, 0); - ChangeBgY(1, 0, 0); - ChangeBgX(2, 0, 0); - ChangeBgY(2, 0, 0); + ChangeBgX(1, 0, BG_COORD_SET); + ChangeBgY(1, 0, BG_COORD_SET); + ChangeBgX(2, 0, BG_COORD_SET); + ChangeBgY(2, 0, BG_COORD_SET); break; case 2: SetGpuReg(REG_OFFSET_WIN0H, 0); @@ -1578,36 +1823,38 @@ static void CB2_ReturnFromNamingScreen(void) FreeAllWindowBuffers(); InitStandardTextBoxWindows(); InitTextBoxGfxAndPrinters(); - LoadPalette(sHelpDocsPalette, 0, 0xe0); + LoadPalette(sOakSpeech_Background_Pals, 0, 0xE0); break; case 4: - DecompressAndCopyTileDataToVram(1, sOakSpeechGfx_SolidColors, 0, 0, 0); + DecompressAndCopyTileDataToVram(1, sOakSpeech_Background_Tiles, 0, 0, 0); break; case 5: if (FreeTempTileDataBuffersIfPossible()) return; - FillBgTilemapBufferRect_Palette0(1, 0x000, 0, 0, 30, 20); - CopyToBgTilemapBuffer(1, sOakSpeech_BackgroundTilemap, 0, 0); - FillBgTilemapBufferRect_Palette0(2, 0x000, 0, 0, 30, 20); + FillBgTilemapBufferRect_Palette0(1, 0, 0, 0, 30, 20); + CopyToBgTilemapBuffer(1, sOakSpeech_Background_Tilemap, 0, 0); + FillBgTilemapBufferRect_Palette0(2, 0, 0, 0, 30, 20); CopyBgTilemapBufferToVram(1); CopyBgTilemapBufferToVram(2); break; case 6: - taskId = CreateTask(Task_OakSpeech26, 0); + taskId = CreateTask(Task_OakSpeech_ConfirmName, 0); if (sOakSpeechResources->hasPlayerBeenNamed == FALSE) { if (gSaveBlock2Ptr->playerGender == MALE) - LoadOaksSpeechTrainerPic(MALE_PLAYER_PIC, 0); + LoadTrainerPic(MALE_PLAYER_PIC, 0); else - LoadOaksSpeechTrainerPic(FEMALE_PLAYER_PIC, 0); + LoadTrainerPic(FEMALE_PLAYER_PIC, 0); } else - LoadOaksSpeechTrainerPic(RIVAL_PIC, 0); + { + LoadTrainerPic(RIVAL_PIC, 0); + } gTasks[taskId].tTrainerPicPosX = -60; gSpriteCoordOffsetX += 60; - ChangeBgX(2, -0x3C00, 0); - CreatePikaOrGrassPlatformSpriteAndLinkToCurrentTask(taskId, 1); - gTasks[taskId].data[15] = 1; + ChangeBgX(2, 0xFFFFC400, BG_COORD_SET); + CreatePikachuOrPlatformSprites(taskId, SPRITE_TYPE_PLATFORM); + gTasks[taskId].tNameNotConfirmed = TRUE; break; case 7: BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); @@ -1616,9 +1863,9 @@ static void CB2_ReturnFromNamingScreen(void) ShowBg(1); ShowBg(2); EnableInterrupts(INTR_FLAG_VBLANK); - SetVBlankCallback(VBlankCB_NewGameOaksSpeech); + SetVBlankCallback(VBlankCB_NewGameScene); gTextFlags.canABSpeedUpPrint = TRUE; - SetMainCallback2(CB2_NewGameOaksSpeech); + SetMainCallback2(CB2_NewGameScene); return; } @@ -1632,186 +1879,185 @@ static void CreateNidoranFSprite(u8 taskId) DecompressPicFromTable(&gMonFrontPicTable[SPECIES_NIDORAN_F], OakSpeechNidoranFGetBuffer(0), SPECIES_NIDORAN_F); LoadCompressedSpritePaletteUsingHeap(&gMonPaletteTable[SPECIES_NIDORAN_F]); SetMultiuseSpriteTemplateToPokemon(SPECIES_NIDORAN_F, 0); - spriteId = CreateSprite(&gMultiuseSpriteTemplate, 0x60, 0x60, 1); + spriteId = CreateSprite(&gMultiuseSpriteTemplate, 96, 96, 1); gSprites[spriteId].callback = SpriteCallbackDummy; gSprites[spriteId].oam.priority = 1; gSprites[spriteId].invisible = TRUE; - gTasks[taskId].data[4] = spriteId; + gTasks[taskId].tNidoranFSpriteId = spriteId; } -static void SpriteCB_PikaSync(struct Sprite *sprite) +#define sBodySpriteId data[0] + +static void SpriteCB_Pikachu(struct Sprite *sprite) { - sprite->y2 = gSprites[sprite->data[0]].animCmdIndex; + sprite->y2 = gSprites[sprite->sBodySpriteId].animCmdIndex; } -static void CreatePikaOrGrassPlatformSpriteAndLinkToCurrentTask(u8 taskId, u8 state) +static void CreatePikachuOrPlatformSprites(u8 taskId, u8 spriteType) { u8 spriteId; u8 i = 0; - switch (state) + switch (spriteType) { - case 0: - LoadCompressedSpriteSheet(&sOakSpeech_PikaSpriteSheets[0]); - LoadCompressedSpriteSheet(&sOakSpeech_PikaSpriteSheets[1]); - LoadCompressedSpriteSheet(&sOakSpeech_PikaSpriteSheets[2]); - LoadSpritePalette(&sOakSpeech_PikaSpritePal); - spriteId = CreateSprite(&sOakSpeech_PikaSpriteTemplates[0], 0x10, 0x11, 2); + case SPRITE_TYPE_PIKACHU: + LoadCompressedSpriteSheet(&sPikachuIntro_Pikachu_SpriteSheets[PIKACHU_BODY_PLATFORM_LEFT]); + LoadCompressedSpriteSheet(&sPikachuIntro_Pikachu_SpriteSheets[PIKACHU_EARS_PLATFORM_MIDDLE]); + LoadCompressedSpriteSheet(&sPikachuIntro_Pikachu_SpriteSheets[PIKACHU_EYES_PLATFORM_RIGHT]); + LoadSpritePalette(&sPikachuIntro_Pikachu_SpritePalette); + spriteId = CreateSprite(&sPikachuIntro_Pikachu_SpriteTemplates[PIKACHU_BODY_PLATFORM_LEFT], 16, 17, 2); gSprites[spriteId].oam.priority = 0; - gTasks[taskId].data[7] = spriteId; - spriteId = CreateSprite(&sOakSpeech_PikaSpriteTemplates[1], 0x10, 0x09, 3); + gTasks[taskId].tPikachuPlatformSpriteId(PIKACHU_BODY_PLATFORM_LEFT) = spriteId; + spriteId = CreateSprite(&sPikachuIntro_Pikachu_SpriteTemplates[PIKACHU_EARS_PLATFORM_MIDDLE], 16, 9, 3); gSprites[spriteId].oam.priority = 0; - gSprites[spriteId].data[0] = gTasks[taskId].data[7]; - gSprites[spriteId].callback = SpriteCB_PikaSync; - gTasks[taskId].data[8] = spriteId; - spriteId = CreateSprite(&sOakSpeech_PikaSpriteTemplates[2], 0x18, 0x0D, 1); + gSprites[spriteId].sBodySpriteId = gTasks[taskId].tPikachuPlatformSpriteId(PIKACHU_BODY_PLATFORM_LEFT); + gSprites[spriteId].callback = SpriteCB_Pikachu; + gTasks[taskId].tPikachuPlatformSpriteId(PIKACHU_EARS_PLATFORM_MIDDLE) = spriteId; + spriteId = CreateSprite(&sPikachuIntro_Pikachu_SpriteTemplates[PIKACHU_EYES_PLATFORM_RIGHT], 24, 13, 1); gSprites[spriteId].oam.priority = 0; - gSprites[spriteId].data[0] = gTasks[taskId].data[7]; - gSprites[spriteId].callback = SpriteCB_PikaSync; - gTasks[taskId].data[9] = spriteId; + gSprites[spriteId].sBodySpriteId = gTasks[taskId].tPikachuPlatformSpriteId(PIKACHU_BODY_PLATFORM_LEFT); + gSprites[spriteId].callback = SpriteCB_Pikachu; + gTasks[taskId].tPikachuPlatformSpriteId(PIKACHU_EYES_PLATFORM_RIGHT) = spriteId; break; - case 1: - LoadCompressedSpriteSheet(&sOakSpeech_GrassPlatformSpriteSheet); - LoadSpritePalette(&sOakSpeech_GrassPlatformSpritePal); - for (i = 0; i < 3; i++) + case SPRITE_TYPE_PLATFORM: + LoadCompressedSpriteSheet(&sOakSpeech_Platform_SpriteSheet); + LoadSpritePalette(&sOakSpeech_Platform_SpritePalette); + for (i = PIKACHU_BODY_PLATFORM_LEFT; i < NUM_PIKACHU_PLATFORM_SPRITES; i++) { - spriteId = CreateSprite(&sOakSpeech_GrassPlatformSpriteTemplates[i], i * 32 + 88, 0x70, 1); + spriteId = CreateSprite(&sOakSpeech_Platform_SpriteTemplates[i], i * 32 + 88, 112, 1); gSprites[spriteId].oam.priority = 2; gSprites[spriteId].animPaused = TRUE; gSprites[spriteId].coordOffsetEnabled = TRUE; - gTasks[taskId].data[7 + i] = spriteId; + gTasks[taskId].tPikachuPlatformSpriteId(i) = spriteId; } break; } } -static void DestroyLinkedPikaOrGrassPlatformSprites(u8 taskId, u8 state) +static void DestroyPikachuOrPlatformSprites(u8 taskId, u8 spriteType) { u8 i; + for (i = PIKACHU_BODY_PLATFORM_LEFT; i < NUM_PIKACHU_PLATFORM_SPRITES; i++) + DestroySprite(&gSprites[gTasks[taskId].tPikachuPlatformSpriteId(i)]); - for (i = 0; i < 3; i++) + switch (spriteType) { - DestroySprite(&gSprites[gTasks[taskId].data[7 + i]]); - } - - switch (state) - { - case 0: - FreeSpriteTilesByTag(0x1003); - FreeSpriteTilesByTag(0x1002); - FreeSpriteTilesByTag(0x1001); - FreeSpritePaletteByTag(0x1001); + case SPRITE_TYPE_PIKACHU: + FreeSpriteTilesByTag(GFX_TAG_PIKACHU_EYES); + FreeSpriteTilesByTag(GFX_TAG_PIKACHU_EARS); + FreeSpriteTilesByTag(GFX_TAG_PIKACHU); + FreeSpritePaletteByTag(PAL_TAG_PIKACHU); break; - case 1: - FreeSpriteTilesByTag(0x1000); - FreeSpritePaletteByTag(0x1000); + case SPRITE_TYPE_PLATFORM: + FreeSpriteTilesByTag(GFX_TAG_PLATFORM); + FreeSpritePaletteByTag(PAL_TAG_PLATFORM); break; } } -static void LoadOaksSpeechTrainerPic(u16 whichPic, u16 tileOffset) +static void LoadTrainerPic(u16 whichPic, u16 tileOffset) { u32 i; switch (whichPic) { case MALE_PLAYER_PIC: - LoadPalette(sOakSpeechGfx_RedPal, 0x40, 0x40); - LZ77UnCompVram(sOakSpeechGfx_RedPic, (void *)0x06000600 + tileOffset); + LoadPalette(sOakSpeech_Red_Pal, 0x40, 0x40); + LZ77UnCompVram(sOakSpeech_Red_Tiles, (void *)VRAM + 0x600 + tileOffset); break; case FEMALE_PLAYER_PIC: - LoadPalette(sOakSpeechGfx_LeafPal, 0x40, 0x40); - LZ77UnCompVram(sOakSpeechGfx_LeafPic, (void *)0x06000600 + tileOffset); + LoadPalette(sOakSpeech_Leaf_Pal, 0x40, 0x40); + LZ77UnCompVram(sOakSpeech_Leaf_Tiles, (void *)VRAM + 0x600 + tileOffset); break; case RIVAL_PIC: - LoadPalette(sOakSpeechGfx_RivalPal, 0x60, 0x40); - LZ77UnCompVram(sOakSpeechGfx_RivalPic, (void *)0x06000600 + tileOffset); + LoadPalette(sOakSpeech_Rival_Pal, 0x60, 0x40); + LZ77UnCompVram(sOakSpeech_Rival_Tiles, (void *)VRAM + 0x600 + tileOffset); break; case OAK_PIC: - LoadPalette(sOakSpeechGfx_OakPal, 0x60, 0x40); - LZ77UnCompVram(sOakSpeechGfx_OakPic, (void *)0x06000600 + tileOffset); + LoadPalette(sOakSpeech_Oak_Pal, 0x60, 0x40); + LZ77UnCompVram(sOakSpeech_Oak_Tiles, (void *)VRAM + 0x600 + tileOffset); break; default: return; } - sOakSpeechResources->trainerPicTilemapBuffer = AllocZeroed(0x60); + sOakSpeechResources->trainerPicTilemap = AllocZeroed(0x60); for (i = 0; i < 0x60; i++) - ((u8 *)sOakSpeechResources->trainerPicTilemapBuffer)[i] = i; - FillBgTilemapBufferRect(2, 0x000, 0, 0, 32, 32, 0x10); - CopyRectToBgTilemapBufferRect(2, sOakSpeechResources->trainerPicTilemapBuffer, 0, 0, 8, 12, 11, 2, 8, 12, 0x10, (tileOffset / 64) + 0x18, 0x00); + ((u8 *)sOakSpeechResources->trainerPicTilemap)[i] = i; + FillBgTilemapBufferRect(2, 0, 0, 0, 32, 32, 16); + CopyRectToBgTilemapBufferRect(2, sOakSpeechResources->trainerPicTilemap, 0, 0, 8, 12, 11, 2, 8, 12, 16, (tileOffset / 64) + 24, 0); CopyBgTilemapBufferToVram(2); - Free(sOakSpeechResources->trainerPicTilemapBuffer); - sOakSpeechResources->trainerPicTilemapBuffer = 0; + Free(sOakSpeechResources->trainerPicTilemap); + sOakSpeechResources->trainerPicTilemap = 0; } -static void DestroyOaksSpeechTrainerPic(void) +static void ClearTrainerPic(void) { - FillBgTilemapBufferRect(2, 0x000, 11, 1, 8, 12, 0x10); + FillBgTilemapBufferRect(2, 0, 11, 1, 8, 12, 16); CopyBgTilemapBufferToVram(2); } #define tParentTaskId data[0] +#define tBlendTarget1 data[1] +#define tBlendTarget2 data[2] +#define tUnusedState data[3] +#define tFadeTimer data[4] static void Task_SlowFadeIn(u8 taskId) { u8 i = 0; - if (gTasks[taskId].data[1] == 0) + if (gTasks[taskId].tBlendTarget1 == 0) { gTasks[gTasks[taskId].tParentTaskId].tTrainerPicFadeState = 1; DestroyTask(taskId); - for (i = 0; i < 3; i++) - { - gSprites[gTasks[taskId].data[7 + i]].invisible = TRUE; - } + for (i = PIKACHU_BODY_PLATFORM_LEFT; i < NUM_PIKACHU_PLATFORM_SPRITES; i++) + gSprites[gTasks[taskId].tPikachuPlatformSpriteId(i)].invisible = TRUE; } else { - if (gTasks[taskId].data[4] != 0) - gTasks[taskId].data[4]--; + if (gTasks[taskId].tFadeTimer != 0) + { + gTasks[taskId].tFadeTimer--; + } else { - gTasks[taskId].data[4] = gTasks[taskId].data[3]; - gTasks[taskId].data[1]--; - gTasks[taskId].data[2]++; - if (gTasks[taskId].data[1] == 8) + gTasks[taskId].tFadeTimer = gTasks[taskId].tTimer; + gTasks[taskId].tBlendTarget1--; + gTasks[taskId].tBlendTarget2++; + if (gTasks[taskId].tBlendTarget1 == 8) { - for (i = 0; i < 3; i++) - { - gSprites[gTasks[taskId].data[7 + i]].invisible ^= TRUE; - } + for (i = PIKACHU_BODY_PLATFORM_LEFT; i < NUM_PIKACHU_PLATFORM_SPRITES; i++) + gSprites[gTasks[taskId].tPikachuPlatformSpriteId(i)].invisible ^= TRUE; } - SetGpuReg(REG_OFFSET_BLDALPHA, (gTasks[taskId].data[2] * 256) + gTasks[taskId].data[1]); + SetGpuReg(REG_OFFSET_BLDALPHA, (gTasks[taskId].tBlendTarget2 * 256) + gTasks[taskId].tBlendTarget1); } } } -static void CreateFadeInTask(u8 taskId, u8 state) +static void CreateFadeInTask(u8 taskId, u8 delay) { u8 taskId2; u8 i = 0; SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG2 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_OBJ); - SetGpuReg(REG_OFFSET_BLDALPHA, 0x10); + SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16, 0)); SetGpuReg(REG_OFFSET_BLDY, 0); gTasks[taskId].tTrainerPicFadeState = 0; taskId2 = CreateTask(Task_SlowFadeIn, 0); gTasks[taskId2].tParentTaskId = taskId; - gTasks[taskId2].data[1] = 16; - gTasks[taskId2].data[2] = 0; - gTasks[taskId2].data[3] = state; - gTasks[taskId2].data[4] = state; - for (i = 0; i < 3; i++) - { - gTasks[taskId2].data[7 + i] = gTasks[taskId].data[7 + i]; - } + gTasks[taskId2].tBlendTarget1 = 16; + gTasks[taskId2].tBlendTarget2 = 0; + gTasks[taskId2].tUnusedState = delay; // assigned, but never read + gTasks[taskId2].tFadeTimer = delay; + for (i = PIKACHU_BODY_PLATFORM_LEFT; i < NUM_PIKACHU_PLATFORM_SPRITES; i++) + gTasks[taskId2].tPikachuPlatformSpriteId(i) = gTasks[taskId].tPikachuPlatformSpriteId(i); } static void Task_SlowFadeOut(u8 taskId) { u8 i = 0; - if (gTasks[taskId].data[1] == 16) + if (gTasks[taskId].tBlendTarget1 == 16) { if (!gPaletteFade.active) { @@ -1821,81 +2067,77 @@ static void Task_SlowFadeOut(u8 taskId) } else { - if (gTasks[taskId].data[4] != 0) - gTasks[taskId].data[4]--; + if (gTasks[taskId].tFadeTimer != 0) + { + gTasks[taskId].tFadeTimer--; + } else { - gTasks[taskId].data[4] = gTasks[taskId].data[3]; - gTasks[taskId].data[1] += 2; - gTasks[taskId].data[2] -= 2; - if (gTasks[taskId].data[1] == 8) + gTasks[taskId].tFadeTimer = gTasks[taskId].tTimer; + gTasks[taskId].tBlendTarget1 += 2; + gTasks[taskId].tBlendTarget2 -= 2; + if (gTasks[taskId].tBlendTarget1 == 8) { - for (i = 0; i < 3; i++) - { - gSprites[gTasks[taskId].data[7 + i]].invisible ^= TRUE; - } + for (i = PIKACHU_BODY_PLATFORM_LEFT; i < NUM_PIKACHU_PLATFORM_SPRITES; i++) + gSprites[gTasks[taskId].tPikachuPlatformSpriteId(i)].invisible ^= TRUE; } - SetGpuReg(REG_OFFSET_BLDALPHA, (gTasks[taskId].data[2] * 256) + gTasks[taskId].data[1]); + SetGpuReg(REG_OFFSET_BLDALPHA, (gTasks[taskId].tBlendTarget2 * 256) + gTasks[taskId].tBlendTarget1); } } } -static void CreateFadeOutTask(u8 taskId, u8 state) +static void CreateFadeOutTask(u8 taskId, u8 delay) { u8 taskId2; u8 i = 0; SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG2 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_OBJ); - SetGpuReg(REG_OFFSET_BLDALPHA, 0x1000); + SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 16)); SetGpuReg(REG_OFFSET_BLDY, 0); gTasks[taskId].tTrainerPicFadeState = 0; + taskId2 = CreateTask(Task_SlowFadeOut, 0); gTasks[taskId2].tParentTaskId = taskId; - gTasks[taskId2].data[1] = 0; - gTasks[taskId2].data[2] = 16; - gTasks[taskId2].data[3] = state; - gTasks[taskId2].data[4] = state; - for (i = 0; i < 3; i++) - { - gTasks[taskId2].data[7 + i] = gTasks[taskId].data[7 + i]; - } + gTasks[taskId2].tBlendTarget1 = 0; + gTasks[taskId2].tBlendTarget2 = 16; + gTasks[taskId2].tUnusedState = delay; // assigned, but never read + gTasks[taskId2].tFadeTimer = delay; + for (i = PIKACHU_BODY_PLATFORM_LEFT; i < NUM_PIKACHU_PLATFORM_SPRITES; i++) + gTasks[taskId2].tPikachuPlatformSpriteId(i) = gTasks[taskId].tPikachuPlatformSpriteId(i); } static void PrintNameChoiceOptions(u8 taskId, u8 hasPlayerBeenNamed) { - s16 * data = gTasks[taskId].data; - const u8 *const * textPtrs; + s16 *data = gTasks[taskId].data; + const u8 *const *textPtrs; u8 i; - data[13] = AddWindow(&sNewGameAdventureIntroWindowTemplates[3]); - PutWindowTilemap(data[13]); - DrawStdFrameWithCustomTileAndPalette(data[13], 1, GetStdWindowBaseTileNum(), 14); - FillWindowPixelBuffer(gTasks[taskId].data[13], 0x11); - AddTextPrinterParameterized(data[13], FONT_NORMAL, gOtherText_NewName, 8, 1, 0, NULL); + tMenuWindowId = AddWindow(&sIntro_WindowTemplates[WIN_INTRO_NAMES]); + PutWindowTilemap(tMenuWindowId); + DrawStdFrameWithCustomTileAndPalette(tMenuWindowId, 1, GetStdWindowBaseTileNum(), 14); + FillWindowPixelBuffer(gTasks[taskId].tMenuWindowId, PIXEL_FILL(1)); + AddTextPrinterParameterized(tMenuWindowId, FONT_NORMAL, gOtherText_NewName, 8, 1, 0, NULL); if (hasPlayerBeenNamed == FALSE) textPtrs = gSaveBlock2Ptr->playerGender == MALE ? sMaleNameChoices : sFemaleNameChoices; else textPtrs = sRivalNameChoices; - for (i = 0; i < 4; i++) - { - AddTextPrinterParameterized(data[13], FONT_NORMAL, textPtrs[i], 8, 16 * (i + 1) + 1, 0, NULL); - } - Menu_InitCursor(data[13], FONT_NORMAL, 0, 1, 16, 5, 0); - CopyWindowToVram(data[13], COPYWIN_FULL); + for (i = 0; i < ARRAY_COUNT(sRivalNameChoices); i++) + AddTextPrinterParameterized(tMenuWindowId, FONT_NORMAL, textPtrs[i], 8, 16 * (i + 1) + 1, 0, NULL); + Menu_InitCursor(tMenuWindowId, FONT_NORMAL, 0, 1, 16, 5, 0); + CopyWindowToVram(tMenuWindowId, COPYWIN_FULL); } static void GetDefaultName(u8 hasPlayerBeenNamed, u8 rivalNameChoice) { - const u8 * src; - u8 * dest; + const u8 *src; + u8 *dest; u8 i; - if (hasPlayerBeenNamed == FALSE) { if (gSaveBlock2Ptr->playerGender == MALE) - src = sMaleNameChoices[Random() % 19]; + src = sMaleNameChoices[Random() % ARRAY_COUNT(sMaleNameChoices)]; else - src = sFemaleNameChoices[Random() % 19]; + src = sFemaleNameChoices[Random() % ARRAY_COUNT(sFemaleNameChoices)]; dest = gSaveBlock2Ptr->playerName; } else @@ -1908,3 +2150,29 @@ static void GetDefaultName(u8 hasPlayerBeenNamed, u8 rivalNameChoice) for (; i < PLAYER_NAME_LENGTH + 1; i++) dest[i] = EOS; } + +#undef tSpriteTimer +#undef tTrainerPicPosX +#undef tTrainerPicFadeState +#undef tTimer +#undef tNidoranFSpriteId +#undef tTextCursorSpriteId +#undef tPokeBallSpriteId +#undef tMenuWindowId +#undef tTextboxWindowId +#undef tDelta +#undef tPlayerPicFadeOutTimer +#undef tScaleDelta +#undef tPlayerIsShrunk +#undef shrinkTimer +#undef tPlayerPicFadeWhiteTimer +#undef tUnderflowingTimer +#undef tSecondaryTimer +#undef tBlendCoefficient +#undef tNameNotConfirmed +#undef sBodySpriteId +#undef tParentTaskId +#undef tBlendTarget1 +#undef tBlendTarget2 +#undef tUnusedState +#undef tFadeTimer diff --git a/src/party_menu.c b/src/party_menu.c index df37d8eee..a212e79fc 100644 --- a/src/party_menu.c +++ b/src/party_menu.c @@ -4063,7 +4063,7 @@ static bool8 SetUpFieldMove_Surf(void) s16 x, y; GetXYCoordsOneStepInFrontOfPlayer(&x, &y); - if (MetatileBehavior_IsSemiDeepWater(MapGridGetMetatileBehaviorAt(x, y)) != TRUE + if (MetatileBehavior_IsFastWater(MapGridGetMetatileBehaviorAt(x, y)) != TRUE && PartyHasMonWithSurf() == TRUE && IsPlayerFacingSurfableFishableWater() == TRUE) { @@ -4085,7 +4085,7 @@ static void DisplayCantUseSurfMessage(void) else { GetXYCoordsOneStepInFrontOfPlayer(&x, &y); - if (MetatileBehavior_IsSemiDeepWater(MapGridGetMetatileBehaviorAt(x, y)) == TRUE) + if (MetatileBehavior_IsFastWater(MapGridGetMetatileBehaviorAt(x, y)) == TRUE) DisplayPartyMenuStdMessage(PARTY_MSG_CURRENT_TOO_FAST); else if ((gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(ROUTE17)) && ((gSaveBlock1Ptr->location.mapNum == MAP_NUM(ROUTE17)) diff --git a/src/pokemon.c b/src/pokemon.c index e3cae699c..172f51ad5 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -5780,7 +5780,7 @@ bool32 IsHMMove2(u16 move) return FALSE; } -bool8 IsPokeSpriteNotFlipped(u16 species) +bool8 IsMonSpriteNotFlipped(u16 species) { return gBaseStats[species].noFlip; } diff --git a/src/pokemon_special_anim_scene.c b/src/pokemon_special_anim_scene.c index 39dbcf797..a2e58d761 100644 --- a/src/pokemon_special_anim_scene.c +++ b/src/pokemon_special_anim_scene.c @@ -153,31 +153,31 @@ static const struct OamData sOamData_MonSprite = { }; -static const union AffineAnimCmd gUnknown_84599E0[] = { +static const union AffineAnimCmd sAffineAnim_Zoom_0[] = { AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0), AFFINEANIMCMD_END }; -static const union AffineAnimCmd gUnknown_84599F0[] = { +static const union AffineAnimCmd sAffineAnim_Zoom_1[] = { AFFINEANIMCMD_FRAME(0x155, 0x155, 0, 0), AFFINEANIMCMD_END }; -static const union AffineAnimCmd gUnknown_8459A00[] = { +static const union AffineAnimCmd sAffineAnim_Zoom_2[] = { AFFINEANIMCMD_FRAME(0x1AA, 0x1AA, 0, 0), AFFINEANIMCMD_END }; -static const union AffineAnimCmd gUnknown_8459A10[] = { +static const union AffineAnimCmd sAffineAnim_Zoom_3[] = { AFFINEANIMCMD_FRAME(0x200, 0x200, 0, 0), AFFINEANIMCMD_END }; static const union AffineAnimCmd *const sAffineAnimTable_Zoom[] = { - gUnknown_84599E0, - gUnknown_84599F0, - gUnknown_8459A00, - gUnknown_8459A10 + sAffineAnim_Zoom_0, + sAffineAnim_Zoom_1, + sAffineAnim_Zoom_2, + sAffineAnim_Zoom_3 }; static const struct SpriteTemplate sSpriteTemplate_MonSprite = { @@ -236,13 +236,13 @@ static const struct OamData sOamData_LevelUpVertical = { .paletteNum = 0 }; -static const union AnimCmd gUnknown_8459AC0[] = { +static const union AnimCmd sAnim_LevelUpVertical[] = { ANIMCMD_FRAME(0, 3), ANIMCMD_END }; static const union AnimCmd *const sAnimTable_LevelUpVertical[] = { - gUnknown_8459AC0 + sAnim_LevelUpVertical }; static const struct SpriteTemplate sSpriteTemplate_LevelUpVertical = { @@ -295,22 +295,22 @@ static const struct OamData sOamData_UseItem_OutwardSpiralDots = { .paletteNum = 0 }; -static const union AnimCmd gUnknown_8459B0C[] = { +static const union AnimCmd sAnim_UseItem_OutwardSpiralDots_0[] = { ANIMCMD_FRAME(0, 16), ANIMCMD_FRAME(1, 8), ANIMCMD_FRAME(2, 4), ANIMCMD_END }; -static const union AnimCmd gUnknown_8459B1C[] = { +static const union AnimCmd sAnim_UseItem_OutwardSpiralDots_1[] = { ANIMCMD_FRAME(1, 4), ANIMCMD_FRAME(0, 4), ANIMCMD_END }; static const union AnimCmd *const sAnimTable_UseItem_OutwardSpiralDots[] = { - gUnknown_8459B0C, - gUnknown_8459B1C + sAnim_UseItem_OutwardSpiralDots_0, + sAnim_UseItem_OutwardSpiralDots_1 }; static const struct SpriteTemplate sSpriteTemplate_UseItem_OutwardSpiralDots = { diff --git a/src/pokemon_storage_system_graphics.c b/src/pokemon_storage_system_graphics.c index c2423240e..9e97c0e6f 100644 --- a/src/pokemon_storage_system_graphics.c +++ b/src/pokemon_storage_system_graphics.c @@ -76,117 +76,69 @@ static const union AffineAnimCmd *const sAffineAnims_ReleaseMon[] = { [RELEASE_ANIM_COME_BACK] = sAffineAnim_ReleaseMon_ComeBack, }; -static const u16 sWallpaperPalettes_Forest[][16] = { - INCBIN_U16("graphics/pokemon_storage/wallpapers/forest/title.gbapal"), - INCBIN_U16("graphics/pokemon_storage/wallpapers/forest/box.gbapal"), -}; +static const u16 sWallpaperPalettes_Forest[][16] = INCBIN_U16("graphics/pokemon_storage/wallpapers/forest/tiles.gbapal"); static const u32 sWallpaperTiles_Forest[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/forest/tiles.4bpp.lz"); static const u32 sWallpaperTilemap_Forest[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/forest/tilemap.bin.lz"); -static const u16 sWallpaperPalettes_City[][16] = { - INCBIN_U16("graphics/pokemon_storage/wallpapers/city/title.gbapal"), - INCBIN_U16("graphics/pokemon_storage/wallpapers/city/box.gbapal"), -}; +static const u16 sWallpaperPalettes_City[][16] = INCBIN_U16("graphics/pokemon_storage/wallpapers/city/tiles.gbapal"); static const u32 sWallpaperTiles_City[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/city/tiles.4bpp.lz"); static const u32 sWallpaperTilemap_City[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/city/tilemap.bin.lz"); -static const u16 sWallpaperPalettes_Desert[][16] = { - INCBIN_U16("graphics/pokemon_storage/wallpapers/desert/title.gbapal"), - INCBIN_U16("graphics/pokemon_storage/wallpapers/desert/box.gbapal"), -}; +static const u16 sWallpaperPalettes_Desert[][16] = INCBIN_U16("graphics/pokemon_storage/wallpapers/desert/tiles.gbapal"); static const u32 sWallpaperTiles_Desert[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/desert/tiles.4bpp.lz"); static const u32 sWallpaperTilemap_Desert[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/desert/tilemap.bin.lz"); -static const u16 sWallpaperPalettes_Savanna[][16] = { - INCBIN_U16("graphics/pokemon_storage/wallpapers/savanna/title.gbapal"), - INCBIN_U16("graphics/pokemon_storage/wallpapers/savanna/box.gbapal"), -}; +static const u16 sWallpaperPalettes_Savanna[][16] = INCBIN_U16("graphics/pokemon_storage/wallpapers/savanna/tiles.gbapal"); static const u32 sWallpaperTiles_Savanna[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/savanna/tiles.4bpp.lz"); static const u32 sWallpaperTilemap_Savanna[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/savanna/tilemap.bin.lz"); -static const u16 sWallpaperPalettes_Crag[][16] = { - INCBIN_U16("graphics/pokemon_storage/wallpapers/crag/title.gbapal"), - INCBIN_U16("graphics/pokemon_storage/wallpapers/crag/box.gbapal"), -}; +static const u16 sWallpaperPalettes_Crag[][16] = INCBIN_U16("graphics/pokemon_storage/wallpapers/crag/tiles.gbapal"); static const u32 sWallpaperTiles_Crag[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/crag/tiles.4bpp.lz"); static const u32 sWallpaperTilemap_Crag[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/crag/tilemap.bin.lz"); -static const u16 sWallpaperPalettes_Volcano[][16] = { - INCBIN_U16("graphics/pokemon_storage/wallpapers/volcano/title.gbapal"), - INCBIN_U16("graphics/pokemon_storage/wallpapers/volcano/box.gbapal"), -}; +static const u16 sWallpaperPalettes_Volcano[][16] = INCBIN_U16("graphics/pokemon_storage/wallpapers/volcano/tiles.gbapal"); static const u32 sWallpaperTiles_Volcano[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/volcano/tiles.4bpp.lz"); static const u8 sUnusedSpace1[4] = {}; static const u32 sWallpaperTilemap_Volcano[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/volcano/tilemap.bin.lz"); -static const u16 sWallpaperPalettes_Snow[][16] = { - INCBIN_U16("graphics/pokemon_storage/wallpapers/snow/title.gbapal"), - INCBIN_U16("graphics/pokemon_storage/wallpapers/snow/box.gbapal"), -}; +static const u16 sWallpaperPalettes_Snow[][16] = INCBIN_U16("graphics/pokemon_storage/wallpapers/snow/tiles.gbapal"); static const u32 sWallpaperTiles_Snow[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/snow/tiles.4bpp.lz"); static const u32 sWallpaperTilemap_Snow[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/snow/tilemap.bin.lz"); -static const u16 sWallpaperPalettes_Cave[][16] = { - INCBIN_U16("graphics/pokemon_storage/wallpapers/cave/title.gbapal"), - INCBIN_U16("graphics/pokemon_storage/wallpapers/cave/box.gbapal"), -}; +static const u16 sWallpaperPalettes_Cave[][16] = INCBIN_U16("graphics/pokemon_storage/wallpapers/cave/tiles.gbapal"); static const u32 sWallpaperTiles_Cave[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/cave/tiles.4bpp.lz"); static const u32 sWallpaperTilemap_Cave[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/cave/tilemap.bin.lz"); -static const u16 sWallpaperPalettes_Beach[][16] = { - INCBIN_U16("graphics/pokemon_storage/wallpapers/beach/title.gbapal"), - INCBIN_U16("graphics/pokemon_storage/wallpapers/beach/box.gbapal"), -}; +static const u16 sWallpaperPalettes_Beach[][16] = INCBIN_U16("graphics/pokemon_storage/wallpapers/beach/tiles.gbapal"); static const u32 sWallpaperTiles_Beach[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/beach/tiles.4bpp.lz"); static const u32 sWallpaperTilemap_Beach[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/beach/tilemap.bin.lz"); -static const u16 sWallpaperPalettes_Seafloor[][16] = { - INCBIN_U16("graphics/pokemon_storage/wallpapers/seafloor/title.gbapal"), - INCBIN_U16("graphics/pokemon_storage/wallpapers/seafloor/box.gbapal"), -}; +static const u16 sWallpaperPalettes_Seafloor[][16] = INCBIN_U16("graphics/pokemon_storage/wallpapers/seafloor/tiles.gbapal"); static const u32 sWallpaperTiles_Seafloor[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/seafloor/tiles.4bpp.lz"); static const u32 sWallpaperTilemap_Seafloor[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/seafloor/tilemap.bin.lz"); -static const u16 sWallpaperPalettes_River[][16] = { - INCBIN_U16("graphics/pokemon_storage/wallpapers/river/title.gbapal"), - INCBIN_U16("graphics/pokemon_storage/wallpapers/river/box.gbapal"), -}; +static const u16 sWallpaperPalettes_River[][16] = INCBIN_U16("graphics/pokemon_storage/wallpapers/river/tiles.gbapal"); static const u32 sWallpaperTiles_River[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/river/tiles.4bpp.lz"); static const u32 sWallpaperTilemap_River[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/river/tilemap.bin.lz"); -static const u16 sWallpaperPalettes_Sky[][16] = { - INCBIN_U16("graphics/pokemon_storage/wallpapers/sky/title.gbapal"), - INCBIN_U16("graphics/pokemon_storage/wallpapers/sky/box.gbapal"), -}; +static const u16 sWallpaperPalettes_Sky[][16] = INCBIN_U16("graphics/pokemon_storage/wallpapers/sky/tiles.gbapal"); static const u32 sWallpaperTiles_Sky[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/sky/tiles.4bpp.lz"); static const u32 sWallpaperTilemap_Sky[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/sky/tilemap.bin.lz"); -static const u16 sWallpaperPalettes_Stars[][16] = { - INCBIN_U16("graphics/pokemon_storage/wallpapers/stars/title.gbapal"), - INCBIN_U16("graphics/pokemon_storage/wallpapers/stars/box.gbapal"), -}; +static const u16 sWallpaperPalettes_Stars[][16] = INCBIN_U16("graphics/pokemon_storage/wallpapers/stars/tiles.gbapal"); static const u8 sUnusedSpace2[32] = {}; static const u32 sWallpaperTiles_Stars[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/stars/tiles.4bpp.lz"); static const u32 sWallpaperTilemap_Stars[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/stars/tilemap.bin.lz"); -static const u16 sWallpaperPalettes_Pokecenter[][16] = { - INCBIN_U16("graphics/pokemon_storage/wallpapers/pokecenter/title.gbapal"), - INCBIN_U16("graphics/pokemon_storage/wallpapers/pokecenter/box.gbapal"), -}; +static const u16 sWallpaperPalettes_Pokecenter[][16] = INCBIN_U16("graphics/pokemon_storage/wallpapers/pokecenter/tiles.gbapal"); static const u32 sWallpaperTiles_Pokecenter[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/pokecenter/tiles.4bpp.lz"); static const u32 sWallpaperTilemap_Pokecenter[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/pokecenter/tilemap.bin.lz"); -static const u16 sWallpaperPalettes_Tiles[][16] = { - INCBIN_U16("graphics/pokemon_storage/wallpapers/tiles/title.gbapal"), - INCBIN_U16("graphics/pokemon_storage/wallpapers/tiles/box.gbapal"), -}; +static const u16 sWallpaperPalettes_Tiles[][16] = INCBIN_U16("graphics/pokemon_storage/wallpapers/tiles/tiles.gbapal"); static const u32 sWallpaperTiles_Tiles[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/tiles/tiles.4bpp.lz"); static const u32 sWallpaperTilemap_Tiles[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/tiles/tilemap.bin.lz"); -static const u16 sWallpaperPalettes_Simple[][16] = { - INCBIN_U16("graphics/pokemon_storage/wallpapers/simple/title.gbapal"), - INCBIN_U16("graphics/pokemon_storage/wallpapers/simple/box.gbapal"), -}; +static const u16 sWallpaperPalettes_Simple[][16] = INCBIN_U16("graphics/pokemon_storage/wallpapers/simple/tiles.gbapal"); static const u32 sWallpaperTiles_Simple[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/simple/tiles.4bpp.lz"); static const u32 sWallpaperTilemap_Simple[] = INCBIN_U32("graphics/pokemon_storage/wallpapers/simple/tilemap.bin.lz"); diff --git a/src/pokemon_summary_screen.c b/src/pokemon_summary_screen.c index 9f80a54e8..c56f243b2 100644 --- a/src/pokemon_summary_screen.c +++ b/src/pokemon_summary_screen.c @@ -2510,7 +2510,7 @@ static void PrintSkillsPage(void) } #define GetMoveNamePrinterYpos(x) ((x) * 28 + 5) -#define GetMovePpPinterYpos(x) ((x) * 28 + 16) +#define GetMovePpPrinterYpos(x) ((x) * 28 + 16) static void PrintMovesPage(void) { @@ -2567,14 +2567,14 @@ static void PokeSum_PrintMoveName(u8 i) colorIdx = 1; } - AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], FONT_NORMAL, 36, GetMovePpPinterYpos(i), sPrintMoveTextColors[colorIdx], TEXT_SKIP_DRAW, + AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], FONT_NORMAL, 36, GetMovePpPrinterYpos(i), sPrintMoveTextColors[colorIdx], TEXT_SKIP_DRAW, gText_PokeSum_PP); - AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], FONT_NORMAL, 46 + sMonSkillsPrinterXpos->curPp[i], GetMovePpPinterYpos(i), sPrintMoveTextColors[colorIdx], TEXT_SKIP_DRAW, sMonSummaryScreen->summary.moveCurPpStrBufs[i]); + AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], FONT_NORMAL, 46 + sMonSkillsPrinterXpos->curPp[i], GetMovePpPrinterYpos(i), sPrintMoveTextColors[colorIdx], TEXT_SKIP_DRAW, sMonSummaryScreen->summary.moveCurPpStrBufs[i]); if (sMonSummaryScreen->moveIds[i] != MOVE_NONE) { - AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], FONT_NORMAL, 58, GetMovePpPinterYpos(i), sPrintMoveTextColors[colorIdx], TEXT_SKIP_DRAW, gText_Slash); - AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], FONT_NORMAL, 64 + sMonSkillsPrinterXpos->maxPp[i], GetMovePpPinterYpos(i), sPrintMoveTextColors[colorIdx], TEXT_SKIP_DRAW, sMonSummaryScreen->summary.moveMaxPpStrBufs[i]); + AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], FONT_NORMAL, 58, GetMovePpPrinterYpos(i), sPrintMoveTextColors[colorIdx], TEXT_SKIP_DRAW, gText_Slash); + AddTextPrinterParameterized3(sMonSummaryScreen->windowIds[POKESUM_WIN_RIGHT_PANE], FONT_NORMAL, 64 + sMonSkillsPrinterXpos->maxPp[i], GetMovePpPrinterYpos(i), sPrintMoveTextColors[colorIdx], TEXT_SKIP_DRAW, sMonSummaryScreen->summary.moveMaxPpStrBufs[i]); } } @@ -4035,7 +4035,7 @@ static void PokeSum_CreateMonPicSprite(void) FreeSpriteOamMatrix(&gSprites[spriteId]); - if (!IsPokeSpriteNotFlipped(species)) + if (!IsMonSpriteNotFlipped(species)) gSprites[spriteId].hFlip = TRUE; else gSprites[spriteId].hFlip = FALSE; @@ -4162,7 +4162,7 @@ static void PokeSum_CreateMonIconSprite(void) sMonSummaryScreen->monIconSpriteId = CreateMonIcon(species, SpriteCallbackDummy, 24, 32, 0, personality, 1); } - if (!IsPokeSpriteNotFlipped(species)) + if (!IsMonSpriteNotFlipped(species)) gSprites[sMonSummaryScreen->monIconSpriteId].hFlip = TRUE; else gSprites[sMonSummaryScreen->monIconSpriteId].hFlip = FALSE; diff --git a/src/region_map.c b/src/region_map.c index c451453b6..b73982834 100644 --- a/src/region_map.c +++ b/src/region_map.c @@ -406,7 +406,7 @@ static const u32 sPlayerIcon_Red[] = INCBIN_U32("graphics/region_map/player_icon static const u32 sPlayerIcon_Leaf[] = INCBIN_U32("graphics/region_map/player_icon_leaf.4bpp.lz"); static const u32 sRegionMap_Gfx[] = INCBIN_U32("graphics/region_map/region_map.4bpp.lz"); static const u32 sMapEdge_Gfx[] = INCBIN_U32("graphics/region_map/map_edge.4bpp.lz"); -static const u32 sSwitchMapMenu_Gfx[] = INCBIN_U32("graphics/region_map/switch_map_menu.bin.lz"); +static const u32 sSwitchMapMenu_Gfx[] = INCBIN_U32("graphics/region_map/switch_map_menu.4bpp.lz"); static const u32 sKanto_Tilemap[] = INCBIN_U32("graphics/region_map/kanto.bin.lz"); static const u32 sSevii123_Tilemap[] = INCBIN_U32("graphics/region_map/sevii_123.bin.lz"); static const u32 sSevii45_Tilemap[] = INCBIN_U32("graphics/region_map/sevii_45.bin.lz"); diff --git a/src/teachy_tv.c b/src/teachy_tv.c index 86634db83..0f4e79099 100644 --- a/src/teachy_tv.c +++ b/src/teachy_tv.c @@ -40,10 +40,10 @@ struct TeachyTvCtrlBlk struct TeachyTvBuf { MainCallback savedCallback; - u16 buffer1[0x800]; - u16 buffer2[0x800]; - u16 buffer3[0x800]; - u16 buffer4[0x800]; + u16 screenTilemap[BG_SCREEN_SIZE]; + u16 buffer2[BG_SCREEN_SIZE]; + u16 buffer3[BG_SCREEN_SIZE]; + u16 titleTilemap[BG_SCREEN_SIZE]; u8 grassAnimCounterLo; u8 grassAnimCounterHi; u8 grassAnimDisabled; @@ -508,7 +508,7 @@ static void TeachyTvSetupBg(void) ResetAllBgsCoordinatesAndBgCntRegs(); ResetBgsAndClearDma3BusyFlags(0); InitBgsFromTemplates(0, sBgTemplates, 4); - SetBgTilemapBuffer(1, sResources->buffer1); + SetBgTilemapBuffer(1, sResources->screenTilemap); SetBgTilemapBuffer(2, sResources->buffer2); SetBgTilemapBuffer(3, sResources->buffer3); SetGpuReg(REG_OFFSET_DISPCNT, 0x3040); @@ -527,10 +527,10 @@ static void TeachyTvLoadGraphic(void) { u16 src = RGB_BLACK; ResetTempTileDataBuffers(); - DecompressAndCopyTileDataToVram(1, gUnknown_8E86240, 0, 0, 0); - LZDecompressWram(gUnknown_8E86BE8, sResources->buffer1); - LZDecompressWram(gUnknown_8E86D6C, sResources->buffer4); - LoadCompressedPalette(gUnknown_8E86F98, 0, 0x80); + DecompressAndCopyTileDataToVram(1, gTeachyTv_Gfx, 0, 0, 0); + LZDecompressWram(gTeachyTvScreen_Tilemap, sResources->screenTilemap); + LZDecompressWram(gTeachyTvTitle_Tilemap, sResources->titleTilemap); + LoadCompressedPalette(gTeachyTv_Pal, 0, 0x80); LoadPalette(&src, 0, sizeof(src)); LoadSpritePalette(&gSpritePalette_GeneralFieldEffect1); TeachyTvLoadBg3Map(sResources->buffer3); @@ -758,7 +758,7 @@ static void TTVcmd_TransitionRenderBg2TeachyTvGraphicInitNpcPos(u8 taskId) TeachyTvBg2AnimController(); if (++data[2] > 63) { - CopyToBgTilemapBufferRect_ChangePalette(2, sResources->buffer4, 0, 0, 0x20, 0x20, 0x11); + CopyToBgTilemapBufferRect_ChangePalette(2, sResources->titleTilemap, 0, 0, 0x20, 0x20, 0x11); TeachyTvSetSpriteCoordsAndSwitchFrame(data[1], 8, 0x38, 7); ScheduleBgCopyTilemapToVram(2); data[2] = 0; diff --git a/src/trade.c b/src/trade.c index a9b0a0fa8..e7de8d22d 100644 --- a/src/trade.c +++ b/src/trade.c @@ -23,95 +23,192 @@ #include "trade_scene.h" #include "constants/songs.h" #include "constants/moves.h" +#include "constants/trade.h" -#define NUM_TRADED_GIFT_RIBBONS 11 +// IDs for CallTradeMenuFunc +enum { + CB_MAIN_MENU, + CB_SELECTED_MON, + CB_SHOW_MON_SUMMARY, + CB_CONFIRM_TRADE_PROMPT, + CB_CANCEL_TRADE_PROMPT, + CB_READY_WAIT, // Equivalent to CB_IDLE + CB_SET_SELECTED_MONS, + CB_PRINT_IS_THIS_OKAY, + CB_HANDLE_TRADE_CANCELED, + CB_FADE_TO_START_TRADE, + CB_WAIT_TO_START_TRADE, + CB_INIT_EXIT_CANCELED_TRADE, + CB_EXIT_CANCELED_TRADE, + CB_START_LINK_TRADE, + CB_INIT_CONFIRM_TRADE_PROMPT, + CB_UNUSED_CLOSE_MSG, + CB_WAIT_TO_START_RFU_TRADE, + CB_IDLE = 100, +}; -struct TradeMenuResources -{ - /*0x0000*/ u8 bg2hofs; - /*0x0001*/ u8 bg3hofs; - /*0x0002*/ u8 filler_2[0x28 - 2]; - /*0x0028*/ u8 partyIcons[2][PARTY_SIZE]; - /*0x0034*/ u8 tradeMenuCursorSpriteIdx; - /*0x0035*/ u8 tradeMenuCursorPosition; - /*0x0036*/ u8 partyCounts[2]; - /*0x0038*/ bool8 tradeMenuOptionsActive[13]; - /*0x0045*/ bool8 battleableFlags[2][PARTY_SIZE]; - /*0x0051*/ bool8 eggFlags[2][PARTY_SIZE]; - /*0x005D*/ u8 hpBarLevels[2][PARTY_SIZE]; - /*0x0069*/ u8 state; - /*0x006A*/ u8 filler_6A[0x6F - 0x6A]; - /*0x006F*/ u8 tradeMenuCBnum; - /*0x0070*/ u8 unk_70; - /*0x0072*/ u16 cursorStartTile; - /*0x0074*/ u8 menuRedrawState[2]; - /*0x0076*/ u8 menuRedrawCursorPos[2]; - /*0x0078*/ u8 unk_78; - /*0x0079*/ u8 unk_79; - /*0x007A*/ u8 unk_7A; - /*0x007B*/ u8 unk_7B; - /*0x007C*/ u8 filler_7C[0x7E - 0x7C]; - /*0x007E*/ u8 otherPlayerCursorPosition; - /*0x0080*/ u16 linkData[20]; - /*0x00A8*/ u8 loadUISpritesState; - /*0x00A9*/ u8 giftRibbons[NUM_TRADED_GIFT_RIBBONS]; - /*0x00B4*/ u8 filler_B4[0x8D0-0xB4]; - /*0x08D0*/ struct { +// Indexes for sActionTexts +enum { + TEXT_CANCEL, + TEXT_CHOOSE_MON, + TEXT_SUMMARY, + TEXT_TRADE, + TEXT_CANCEL_TRADE, + TEXT_PRESS_B_TO_EXIT, +}; + +// Indexes for sMessages +enum { + MSG_STANDBY, + MSG_CANCELED, + MSG_ONLY_MON1, + MSG_ONLY_MON2, + MSG_WAITING_FOR_FRIEND, + MSG_FRIEND_WANTS_TO_TRADE, + MSG_MON_CANT_BE_TRADED, + MSG_EGG_CANT_BE_TRADED, + MSG_FRIENDS_MON_CANT_BE_TRADED, +}; + +// IDs for QueueAction +enum { + QUEUE_SEND_DATA, + QUEUE_STANDBY, + QUEUE_ONLY_MON1, + QUEUE_ONLY_MON2, + QUEUE_UNUSED1, // Presumably intended for MSG_WAITING_FOR_FRIEND + QUEUE_UNUSED2, // Presumably intended for MSG_FRIEND_WANTS_TO_TRADE + QUEUE_MON_CANT_BE_TRADED, + QUEUE_EGG_CANT_BE_TRADED, + QUEUE_FRIENDS_MON_CANT_BE_TRADED, +}; + +#define QUEUE_DELAY_MSG 3 +#define QUEUE_DELAY_DATA 5 + +#define GFXTAG_MENU_TEXT 200 // Used as a base tag in CB2_CreateTradeMenu and CB2_ReturnToTradeMenuFromSummary +#define GFXTAG_CURSOR 300 +#define GFXTAG_LINK_MON_GLOW 5550 +#define GFXTAG_LINK_MON_SHADOW 5552 +#define GFXTAG_CABLE_END 5554 +#define GFXTAG_GBA_SCREEN 5556 +#define GFXTAG_POKEBALL 5557 + +#define PALTAG_CURSOR 2345 +#define PALTAG_MENU_TEXT 4925 +#define PALTAG_LINK_MON 5551 +#define PALTAG_GBA 5555 +#define PALTAG_POKEBALL 5558 + +// The following tags are offsets from GFXTAG_MENU_TEXT +// They're looped over in CB2_CreateTradeMenu and CB2_ReturnToTradeMenuFromSummary +// and used as indexes into sMenuTextTileBuffers +enum { + GFXTAG_PLAYER_NAME_L, + GFXTAG_PLAYER_NAME_M, + GFXTAG_PLAYER_NAME_R, + GFXTAG_PARTNER_NAME_L, + GFXTAG_PARTNER_NAME_M, + GFXTAG_PARTNER_NAME_R, + GFXTAG_CANCEL_L, + GFXTAG_CANCEL_R, + GFXTAG_CHOOSE_PKMN_L, + GFXTAG_CHOOSE_PKMN_M, + GFXTAG_CHOOSE_PKMN_R, + GFXTAG_CHOOSE_PKMN_EMPTY_1, // 6 sprites to cover the full bottom bar, but only first 3 are needed + GFXTAG_CHOOSE_PKMN_EMPTY_2, + GFXTAG_CHOOSE_PKMN_EMPTY_3, + NUM_MENU_TEXT_SPRITES +}; +#define NUM_PLAYER_NAME_SPRITES (1 + GFXTAG_PLAYER_NAME_R - GFXTAG_PLAYER_NAME_L) +#define NUM_PARTNER_NAME_SPRITES (1 + GFXTAG_PARTNER_NAME_R - GFXTAG_PARTNER_NAME_L) +#define NUM_CHOOSE_PKMN_SPRITES (1 + GFXTAG_CHOOSE_PKMN_EMPTY_3 - GFXTAG_CHOOSE_PKMN_L) + +enum { + CURSOR_ANIM_NORMAL, + CURSOR_ANIM_ON_CANCEL, +}; + +// Values for signaling to/from the link partner +enum { + STATUS_NONE, + STATUS_READY, + STATUS_CANCEL, +}; + +// Checked to confirm DrawSelectedMonScreen has reached final state +#define DRAW_SELECTED_FINISH 5 + +static EWRAM_DATA u8 *sMenuTextTileBuffer = NULL; +static EWRAM_DATA u8 *sMenuTextTileBuffers[NUM_MENU_TEXT_SPRITES] = {}; +EWRAM_DATA struct Mail gLinkPartnerMail[PARTY_SIZE] = {}; +EWRAM_DATA u8 gSelectedTradeMonPositions[2] = {0}; +static EWRAM_DATA struct { + u8 bg2hofs; + u8 bg3hofs; + u8 filler_2[38]; + u8 partySpriteIds[2][PARTY_SIZE]; + u8 cursorSpriteId; + u8 cursorPosition; + u8 partyCounts[2]; + bool8 optionsActive[PARTY_SIZE * 2 + 1]; + bool8 isLiveMon[2][PARTY_SIZE]; + bool8 isEgg[2][PARTY_SIZE]; + u8 hpBarLevels[2][PARTY_SIZE]; + u8 bufferPartyState; + u8 filler_6A[5]; + u8 callbackId; + u8 unk_70; // Never read + u16 bottomTextTileStart; + u8 drawSelectedMonState[2]; + u8 selectedMonIdx[2]; + u8 playerSelectStatus; + u8 partnerSelectStatus; + u8 playerConfirmStatus; + u8 partnerConfirmStatus; + u8 filler_7C[2]; + u8 partnerCursorPosition; + u16 linkData[20]; + u8 timer; + u8 giftRibbons[GIFT_RIBBONS_COUNT]; + u8 filler_B4[0x81C]; + struct { bool8 active; u16 delay; - u8 kind; - } cron[4]; - /*0x08F0*/ u16 tilemapBuffer[BG_SCREEN_SIZE / 2]; -}; + u8 actionId; + } queuedActions[4]; + u16 tilemapBuffer[BG_SCREEN_SIZE / 2]; +} * sTradeMenu = NULL; -enum TradeStatusMsg -{ - TRADESTATMSG_COMMSTANDBY = 0, - TRADESTATMSG_CANCELED, - TRADESTATMSG_ONLYMON, - TRADESTATMSG_ONLYMON2, - TRADESTATMSG_WAITINGFORFRIEND, - TRADESTATMSG_FRIENDWANTSTOTRADE, - TRADESTATMSG_YOURMONCANTBETRADED, - TRADESTATMSG_EGGCANTBETRADED, - TRADESTATMSG_PARTNERMONCANTBETRADED -}; - -static EWRAM_DATA u8 *sSpriteTextTileBuffer = NULL; -static EWRAM_DATA u8 *sSpriteTextTilePtrs[14] = {}; -EWRAM_DATA struct Mail gLinkPartnerMail[6] = {}; -EWRAM_DATA u8 gSelectedTradeMonPositions[2] = {0}; -static EWRAM_DATA struct TradeMenuResources * sTradeMenuResourcesPtr = NULL; - -static void CB2_ReturnFromLinkTrade2(void); -static void VblankCB_Trade(void); +static void CB2_CreateTradeMenu(void); +static void VBlankCB_TradeMenu(void); static void CB2_TradeMenu(void); -static void LoadTradeBackgroundGfxAndPals(u8 state); -static void SetTradeMenuOptionActiveFlags(void); -static u8 shedinja_maker_maybe(void); -static void CB1_HandleBlockReceive(void); +static void LoadTradeBgGfx(u8 state); +static void SetActiveMenuOptions(void); +static u8 BufferTradeParties(void); +static void CB1_UpdateLink(void); static void RunTradeMenuCallback(void); -static void SignalRedrawTradeMenus(u8 a0); -static void HandleRedrawTradeMenuOnSide(u8 side); -static u8 GetNicknameStringWidthByPartyAndMonIdx(u8 *str, u8 whichParty, u8 partyIdx); -static void BuildMovesString(u8 *str, u8 whichParty, u8 partyIdx); +static void SetSelectedMon(u8 cursorPosition); +static void DrawSelectedMonScreen(u8 side); +static u8 GetMonNicknameWidth(u8 *str, u8 whichParty, u8 partyIdx); +static void BufferMovesString(u8 *str, u8 whichParty, u8 partyIdx); static void PrintPartyNicknames(u8 side); -static void PrintLevelAndGenderDirectlyOnVram(u8 a0, u8 partyIdx, u8 a2, u8 a3, u8 a4, u8 a5); -static void PrintPartyLevelsAndGendersDirectlyOnVram(u8 side); +static void PrintLevelAndGender(u8 whichParty, u8 monIdx, u8 x, u8 y, u8 winLeft, u8 winTop); +static void PrintPartyLevelsAndGenders(u8 side); static void PrintTradePartnerPartyNicknames(void); -static void RedrawPartyWindow(u8 a0); -static void TradeMenuAction_Summary(u8 taskId); -static void TradeMenuAction_Trade(u8 taskId); -static void ScheduleLinkTaskWithDelay(u16 delay, u8 kind); -static void RunScheduledLinkTasks(void); -static void PrintTradeErrorOrStatusMessage(u8 strIdx); -static bool8 LoadUISprites(void); -static void RenderTextToVramViaBuffer(const u8 *name, u8 *a1, u8 unused); +static void RedrawPartyWindow(u8 whichParty); +static void Task_DrawSelectionSummary(u8 taskId); +static void Task_DrawSelectionTrade(u8 taskId); +static void QueueAction(u16 delay, u8 actionId); +static void DoQueuedActions(void); +static void PrintTradeMessage(u8 strIdx); +static bool8 LoadUISpriteGfx(void); +static void DrawBottomRowText(const u8 *name, u8 *dest, u8 unused); static void ComputePartyTradeableFlags(u8 side); static void ComputePartyHPBarLevels(u8 side); -static void SetMonIconsAnimByHPBarLevel(void); -static void CopyGiftRibbonsToSav1(void); -static u32 TestWhetherSelectedMonCanBeTraded(struct Pokemon * party, int partyCount, int cursorPos); +static void SetTradePartyHPBarSprites(void); +static void SaveTradeGiftRibbons(void); +static u32 CanTradeSelectedMon(struct Pokemon * party, int partyCount, int cursorPos); static const size_t sSizesAndOffsets[] = { sizeof(struct SaveBlock2), @@ -129,107 +226,107 @@ static const u16 sTradePartyBoxTilemap[] = INCBIN_U16("graphics/trade/party_box_ static const u8 sTradeStripesBG2Tilemap[] = INCBIN_U8("graphics/trade/stripes_bg2_map.bin"); static const u8 sTradeStripesBG3Tilemap[] = INCBIN_U8("graphics/trade/stripes_bg3_map.bin"); -static const struct OamData gOamData_8261C30 = { +static const struct OamData sOamData_MenuText = { .shape = SPRITE_SHAPE(32x16), .size = SPRITE_SIZE(32x16), .priority = 1 }; -static const struct OamData gOamData_8261C38 = { +static const struct OamData sOamData_Cursor = { .shape = SPRITE_SHAPE(64x32), .size = SPRITE_SIZE(64x32), .priority = 1 }; -static const union AnimCmd gSpriteAnim_8261C40[] = { - ANIMCMD_FRAME(0x00, 5), +static const union AnimCmd sAnim_Cursor_Normal[] = { + ANIMCMD_FRAME(0, 5), ANIMCMD_END }; -static const union AnimCmd gSpriteAnim_8261C48[] = { - ANIMCMD_FRAME(0x20, 5), +static const union AnimCmd sAnim_Cursor_OnCancel[] = { + ANIMCMD_FRAME(32, 5), ANIMCMD_END }; -static const union AnimCmd *const gSpriteAnimTable_8261C50[] = { - gSpriteAnim_8261C40, - gSpriteAnim_8261C48 +static const union AnimCmd *const sAnims_Cursor[] = { + [CURSOR_ANIM_NORMAL] = sAnim_Cursor_Normal, + [CURSOR_ANIM_ON_CANCEL] = sAnim_Cursor_OnCancel }; -static const struct SpriteSheet sTradeButtons_SpriteSheet = { - gTradeButtons_Gfx, - 0x800, - 300 +static const struct SpriteSheet sCursor_SpriteSheet = { + .data = gTradeCursor_Gfx, + .size = 0x800, + .tag = GFXTAG_CURSOR }; -static const struct SpritePalette sTradeButtons_SpritePal = { - gTradeButtons_Pal, - 2345 +static const struct SpritePalette sCursor_SpritePalette = { + .data = gTradeCursor_Pal, + .tag = PALTAG_CURSOR }; -static const union AnimCmd gSpriteAnim_8261C68[] = { - ANIMCMD_FRAME(0x00, 5), +static const union AnimCmd sAnim_MenuText_0[] = { + ANIMCMD_FRAME(0, 5), ANIMCMD_END }; -static const union AnimCmd gSpriteAnim_8261C70[] = { - ANIMCMD_FRAME(0x08, 5), +static const union AnimCmd sAnim_MenuText_1[] = { + ANIMCMD_FRAME(8, 5), ANIMCMD_END }; -static const union AnimCmd gSpriteAnim_8261C78[] = { - ANIMCMD_FRAME(0x10, 5), +static const union AnimCmd sAnim_MenuText_2[] = { + ANIMCMD_FRAME(16, 5), ANIMCMD_END }; -static const union AnimCmd gSpriteAnim_8261C80[] = { - ANIMCMD_FRAME(0x18, 5), +static const union AnimCmd sAnim_MenuText_3[] = { + ANIMCMD_FRAME(24, 5), ANIMCMD_END }; -static const union AnimCmd gSpriteAnim_8261C88[] = { - ANIMCMD_FRAME(0x20, 5), +static const union AnimCmd sAnim_MenuText_4[] = { + ANIMCMD_FRAME(32, 5), ANIMCMD_END }; -static const union AnimCmd gSpriteAnim_8261C90[] = { - ANIMCMD_FRAME(0x28, 5), +static const union AnimCmd sAnim_MenuText_5[] = { + ANIMCMD_FRAME(40, 5), ANIMCMD_END }; -static const union AnimCmd *const gSpriteAnimTable_8261C98[] = { - gSpriteAnim_8261C68, - gSpriteAnim_8261C70, - gSpriteAnim_8261C78, - gSpriteAnim_8261C80, - gSpriteAnim_8261C88, - gSpriteAnim_8261C90 +// These anims are not used +static const union AnimCmd *const sAnims_MenuText[] = { + sAnim_MenuText_0, + sAnim_MenuText_1, + sAnim_MenuText_2, + sAnim_MenuText_3, + sAnim_MenuText_4, + sAnim_MenuText_5, }; -static const struct SpriteTemplate sSpriteTemplate_TradeButtons = { - .tileTag = 300, - .paletteTag = 2345, - .oam = &gOamData_8261C38, - .anims = gSpriteAnimTable_8261C50, +static const struct SpriteTemplate sSpriteTemplate_Cursor = { + .tileTag = GFXTAG_CURSOR, + .paletteTag = PALTAG_CURSOR, + .oam = &sOamData_Cursor, + .anims = sAnims_Cursor, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy }; -static const struct SpriteTemplate sSpriteTemplate_Text = { - .tileTag = 200, - .paletteTag = 4925, - .oam = &gOamData_8261C30, - .anims = gSpriteAnimTable_8261C98, +static const struct SpriteTemplate sSpriteTemplate_MenuText = { + .tileTag = GFXTAG_MENU_TEXT, + .paletteTag = PALTAG_MENU_TEXT, + .oam = &sOamData_MenuText, + .anims = sAnims_MenuText, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy }; -static const u16 sTradeTextPal[] = INCBIN_U16("graphics/trade/text.gbapal"); - -static const struct SpritePalette sSpritePalette_Text = { - sTradeTextPal, - 4925 +static const u16 sMenuText_Pal[] = INCBIN_U16("graphics/trade/text.gbapal"); +static const struct SpritePalette sSpritePalette_MenuText = { + .data = sMenuText_Pal, + .tag = PALTAG_MENU_TEXT }; #define DIR_UP 0 @@ -237,7 +334,19 @@ static const struct SpritePalette sSpritePalette_Text = { #define DIR_LEFT 2 #define DIR_RIGHT 3 -static const u8 sCursorMoveDestinations[][4][6] = { +// This is used to determine the next mon to select when the D-Pad is +// pressed in a given direction. +// Note that the mons are laid out like this. +// 0-5 are the player's party and 6-11 are the trading partner's party. +// 12 is the cancel button. +// 0 1 6 7 +// 2 3 8 9 +// 4 5 10 11 +// 12 +// 1st array is the current positions +// 2nd array is directions of input +// 3rd array is the next positions to go to (unoccupied spaces are skipped over) +static const u8 sCursorMoveDestinations[(PARTY_SIZE * 2) + 1][4][PARTY_SIZE] = { // Player's party [0] = { [DIR_UP] = { 4, 2, 12, 12, 0, 0}, @@ -321,138 +430,129 @@ static const u8 sCursorMoveDestinations[][4][6] = { } }; -static const u8 sTradeMonSpriteCoords[][2] = { - {0x01, 0x05}, - {0x08, 0x05}, - {0x01, 0x0a}, - {0x08, 0x0a}, - {0x01, 0x0f}, - {0x08, 0x0f}, +#define COL0_X 1 +#define COL1_X 8 +#define COL2_X 16 +#define COL3_X 23 +#define ROW0_Y 5 +#define ROW1_Y 10 +#define ROW2_Y 15 +#define ROW3_Y 18 - {0x10, 0x05}, - {0x17, 0x05}, - {0x10, 0x0a}, - {0x17, 0x0a}, - {0x10, 0x0f}, - {0x17, 0x0f}, - - {0x17, 0x12}, +static const u8 sTradeMonSpriteCoords[(PARTY_SIZE * 2) + 1][2] = { + [TRADE_PLAYER] = + {COL0_X, ROW0_Y}, + {COL1_X, ROW0_Y}, + {COL0_X, ROW1_Y}, + {COL1_X, ROW1_Y}, + {COL0_X, ROW2_Y}, + {COL1_X, ROW2_Y}, + [TRADE_PARTNER * PARTY_SIZE] = + {COL2_X, ROW0_Y}, + {COL3_X, ROW0_Y}, + {COL2_X, ROW1_Y}, + {COL3_X, ROW1_Y}, + {COL2_X, ROW2_Y}, + {COL3_X, ROW2_Y}, + // Cancel + {COL3_X, ROW3_Y}, }; -static const u8 sTradeMenuGenderLevelPrintCoords[][2][2] = { - { - {0x05, 0x04}, - {0x0c, 0x04}, - }, - { - {0x05, 0x09}, - {0x0c, 0x09}, - }, - { - {0x05, 0x0e}, - {0x0c, 0x0e} - }, - { - {0x14, 0x04}, - {0x1b, 0x04}, - }, - { - {0x14, 0x09}, - {0x1b, 0x09}, - }, - { - {0x14, 0x0e}, - {0x1b, 0x0e}, - }, +static const u8 sTradeMonLevelCoords[PARTY_SIZE * 2][2] = { + [TRADE_PLAYER] = + { 5, 4}, + {12, 4}, + { 5, 9}, + {12, 9}, + { 5, 14}, + {12, 14}, + [TRADE_PARTNER * PARTY_SIZE] = + {20, 4}, + {27, 4}, + {20, 9}, + {27, 9}, + {20, 14}, + {27, 14}, }; -static const u8 sTradeMenuGenderLevelWindowCoords[][2][2] = { - { - {0x01, 0x03}, - {0x08, 0x03}, - }, - { - {0x01, 0x08}, - {0x08, 0x08}, - }, - { - {0x01, 0x0d}, - {0x08, 0x0d} - }, - { - {0x10, 0x03}, - {0x17, 0x03}, - }, - { - {0x10, 0x08}, - {0x17, 0x08}, - }, - { - {0x10, 0x0d}, - {0x17, 0x0d}, - }, +static const u8 sTradeMonBoxCoords[PARTY_SIZE * 2][2] = { + [TRADE_PLAYER] = + { 1, 3}, + { 8, 3}, + { 1, 8}, + { 8, 8}, + { 1, 13}, + { 8, 13}, + [TRADE_PARTNER * PARTY_SIZE] = + {16, 3}, + {23, 3}, + {16, 8}, + {23, 8}, + {16, 13}, + {23, 13}, }; -static const u8 sTradeUnknownSpriteCoords[][4] = { - {0x3c, 0x09, 0xb4, 0x09}, - {0x30, 0x09, 0xa8, 0x09} +// x,y offset for player name, x/y offset for partner name +static const u8 sPlayerNameCoords[][4] = { + {60, 9, 180, 9}, // Unused. For JP characters? + {48, 9, 168, 9}, }; -static const u8 gUnknown_8261E92[] = { - 0x00, 0x0e, 0x0f, 0x1d, - 0x03, 0x05, 0x03, 0x07, - 0x12, 0x05, 0x12, 0x07, - 0x08, 0x07, 0x16, 0x0c, - 0x08, 0x07, 0x16, 0x0c, - 0x06, 0x07, 0x18, 0x0c, - 0x06, 0x07, 0x18, 0x0c, - 0x08, 0x07, 0x16, 0x0c, - 0x07, 0x07, 0x17, 0x0c +static const u8 sUnusedCoords[][2] = +{ + { 0, 14}, + {15, 29}, + { 3, 5}, + { 3, 7}, + {18, 5}, + {18, 7}, + { 8, 7}, + {22, 12}, + { 8, 7}, + {22, 12}, + { 6, 7}, + {24, 12}, + { 6, 7}, + {24, 12}, + { 8, 7}, + {22, 12}, + { 7, 7}, + {23, 12} }; -const u8 sText_Dummy[] = _(""); -const u8 sText_ClrWhtHltTranspShdwDrkGry[] = _("{COLOR WHITE}{HIGHLIGHT TRANSPARENT}{SHADOW DARK_GRAY}"); +static const u8 sText_Dummy[] = _(""); +static const u8 sText_ClrWhtHltTranspShdwDrkGry[] = _("{COLOR WHITE}{HIGHLIGHT TRANSPARENT}{SHADOW DARK_GRAY}"); const u8 gText_MaleSymbol4[] = _("♂"); const u8 gText_FemaleSymbol4[] = _("♀"); const u8 gText_GenderlessSymbol[] = _(""); -const u8 sText_Dummy2[] = _(""); -const u8 sText_Newline[] = _("\n"); -const u8 sText_Slash[] = _("/"); +static const u8 sText_Dummy2[] = _(""); +static const u8 sText_Newline[] = _("\n"); +static const u8 sText_Slash[] = _("/"); -enum TradeUIText -{ - TRADEUITEXT_CANCEL = 0, - TRADEUITEXT_CHOOSE, - TRADEUITEXT_SUMMARY, - TRADEUITEXT_TRADE, - TRADEUITEXT_ASKCANCEL, - TRADEUITEXT_PRESSBTOEXIT -}; - -static const u8 *const sTradeUITextPtrs[] = { - gTradeText_Cancel, - gTradeText_ChooseAPokemon, - gTradeText_Summary, - gTradeText_Trade, - gText_CancelTrade, - gTradeText_PressBButtonToExit +static const u8 *const sActionTexts[] = { + [TEXT_CANCEL] = gTradeText_Cancel, + [TEXT_CHOOSE_MON] = gTradeText_ChooseAPokemon, + [TEXT_SUMMARY] = gTradeText_Summary, // Unused, sMenuAction_SummaryTrade is used instead + [TEXT_TRADE] = gTradeText_Trade, // Unused, sMenuAction_SummaryTrade is used instead + [TEXT_CANCEL_TRADE] = gText_CancelTrade, + [TEXT_PRESS_B_TO_EXIT] = gTradeText_PressBButtonToExit // Unused }; static const struct MenuAction sMenuAction_SummaryTrade[] = { - {gText_TradeAction_Summary, { .void_u8 = TradeMenuAction_Summary }}, - {gText_TradeAction_Trade, { .void_u8 = TradeMenuAction_Trade }} + {gText_TradeAction_Summary, { .void_u8 = Task_DrawSelectionSummary }}, + {gText_TradeAction_Trade, { .void_u8 = Task_DrawSelectionTrade }} }; -static const u8 *const sTradeErrorOrStatusMessagePtrs[] = { - gText_Trade_CommunicationStandby, - gText_TradeHasBeenCanceled, - gText_Trade_OnlyPkmnForBattle, - gText_OnlyPkmnForBattle, // Same as above but without color formatting - gText_WaitingForFriendToFinish, - gText_FriendWantsToTrade, - gText_PkmnCantBeTradedNow, - gText_EggCantBeTradedNow, - gText_OtherTrainersPkmnCantBeTraded +static const u8 *const sMessages[] = { + [MSG_STANDBY] = gText_Trade_CommunicationStandby, + [MSG_CANCELED] = gText_TradeHasBeenCanceled, + [MSG_ONLY_MON1] = gText_Trade_OnlyPkmnForBattle, + [MSG_ONLY_MON2] = gText_OnlyPkmnForBattle, // Same as above but without color formatting + [MSG_WAITING_FOR_FRIEND] = gText_WaitingForFriendToFinish, + [MSG_FRIEND_WANTS_TO_TRADE] = gText_FriendWantsToTrade, + [MSG_MON_CANT_BE_TRADED] = gText_PkmnCantBeTradedNow, + [MSG_EGG_CANT_BE_TRADED] = gText_EggCantBeTradedNow, + [MSG_FRIENDS_MON_CANT_BE_TRADED] = gText_OtherTrainersPkmnCantBeTraded }; static const u8 sTextColor_PartyMonNickname[] = { TEXT_COLOR_TRANSPARENT, TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GRAY }; @@ -651,47 +751,54 @@ static const struct WindowTemplate sWindowTemplate_YesNo = { .baseBlock = 0x24e }; -static const u8 gUnknown_8261FCC[][13] = { - _("かいめの そうしん"), - _("かいめの じゅしん"), - _("ポケモンアイコンセット"), - _("OBJテキストセット"), - _("セルセット"), - _("OBJテキストADD"), - _("システムメッセージADD"), - _("はいけいセット") +static const u8 sDebug_Messages[][13] = { + _("かいめの そうしん"), // "xth communication sent" + _("かいめの じゅしん"), // "xth communication received" + _("ポケモンアイコンセット"), // "pokemon icon set" + _("OBJテキストセット"), // "OBJ text set" + _("セルセット"), // "cell set" + _("OBJテキストADD"), // "OBJ text ADD" + _("システムメッセージADD"), // "system message ADD" + _("はいけいセット"), // "background set" }; -static const u8 gJPText_Shedinja[] = _("ヌケニン"); -static const u8 gUnknown_8262039[] = _("こうかんせいりつ "); -static const u8 gUnknown_8262047[] = _("だめだたらしいよ "); +static const u8 sText_ShedinjaJP[] = _("ヌケニン"); -static const u8 gUnknown_8262055[][2] = { - { 4, 3}, - {19, 3} +static const u8 sDebug_TradeResultTexts[][14] = { + _("こうかんせいりつ "), // "trade successful" + _("だめだたらしいよ "), // "it seems like it didn't work" }; -static void InitTradeMenuResources(void) +// Position of level/gender when just the pokemon to trade are displayed +static const u8 sSelectedMonLevelGenderCoords[][2] = { + [TRADE_PLAYER] = { 4, 3}, + [TRADE_PARTNER] = {19, 3} +}; + +static void InitTradeMenu(void) { - int i; static u16 dummy; ResetSpriteData(); FreeAllSpritePalettes(); ResetTasks(); ResetPaletteFade(); + gPaletteFade.bufferTransferDisabled = TRUE; - SetVBlankCallback(VblankCB_Trade); + + SetVBlankCallback(VBlankCB_TradeMenu); LoadPalette(gStandardMenuPalette, 0xF0, 0x14); LoadPalette(gStandardMenuPalette, 0xD0, 0x14); ResetBgsAndClearDma3BusyFlags(FALSE); - InitBgsFromTemplates(0, sBgTemplates, NELEMS(sBgTemplates)); - SetBgTilemapBuffer(1, sTradeMenuResourcesPtr->tilemapBuffer); + InitBgsFromTemplates(0, sBgTemplates, ARRAY_COUNT(sBgTemplates)); + SetBgTilemapBuffer(1, sTradeMenu->tilemapBuffer); + if (InitWindows(sWindowTemplates)) { + int i; DeactivateAllTextPrinters(); dummy = 590; // ? - for (i = 0; i < NELEMS(sWindowTemplates) - 1; i++) + for (i = 0; i < ARRAY_COUNT(sWindowTemplates) - 1; i++) { ClearWindowTilemap(i); FillWindowPixelBuffer(i, PIXEL_FILL(0)); @@ -700,23 +807,23 @@ static void InitTradeMenuResources(void) LoadStdWindowGfx(0, 0x014, 0xC0); LoadUserWindowGfx(2, 0x001, 0xE0); LoadMonIconPalettes(); - sTradeMenuResourcesPtr->state = 0; - sTradeMenuResourcesPtr->tradeMenuCBnum = 0; - sTradeMenuResourcesPtr->unk_70 = 0; - sTradeMenuResourcesPtr->menuRedrawState[0] = 0; - sTradeMenuResourcesPtr->menuRedrawState[1] = 0; - sTradeMenuResourcesPtr->unk_7A = 0; - sTradeMenuResourcesPtr->unk_7B = 0; - sTradeMenuResourcesPtr->loadUISpritesState = 0; + sTradeMenu->bufferPartyState = 0; + sTradeMenu->callbackId = CB_MAIN_MENU; + sTradeMenu->unk_70 = 0; + sTradeMenu->drawSelectedMonState[TRADE_PLAYER] = 0; + sTradeMenu->drawSelectedMonState[TRADE_PARTNER] = 0; + sTradeMenu->playerConfirmStatus = STATUS_NONE; + sTradeMenu->partnerConfirmStatus = STATUS_NONE; + sTradeMenu->timer = 0; } } void CB2_StartCreateTradeMenu(void) { - SetMainCallback2(CB2_ReturnFromLinkTrade2); + SetMainCallback2(CB2_CreateTradeMenu); } -static void CB2_ReturnFromLinkTrade2(void) +static void CB2_CreateTradeMenu(void) { int i; struct SpriteTemplate temp; @@ -728,14 +835,12 @@ static void CB2_ReturnFromLinkTrade2(void) switch (gMain.state) { case 0: - sTradeMenuResourcesPtr = AllocZeroed(sizeof(*sTradeMenuResourcesPtr)); - InitTradeMenuResources(); - sSpriteTextTileBuffer = AllocZeroed(0xE00); + sTradeMenu = AllocZeroed(sizeof(*sTradeMenu)); + InitTradeMenu(); + sMenuTextTileBuffer = AllocZeroed(NUM_MENU_TEXT_SPRITES * 256); - for (i = 0; i < 14; i++) - { - sSpriteTextTilePtrs[i] = &sSpriteTextTileBuffer[i * 256]; - } + for (i = 0; i < NUM_MENU_TEXT_SPRITES; i++) + sMenuTextTileBuffers[i] = &sMenuTextTileBuffer[i * 256]; gMain.state++; break; @@ -743,17 +848,15 @@ static void CB2_ReturnFromLinkTrade2(void) gPaletteFade.bufferTransferDisabled = FALSE; for (i = 0; i < PARTY_SIZE; i++) - { - CreateMon(&gEnemyParty[i], SPECIES_NONE, 0, 0x20, FALSE, 0, OT_ID_PLAYER_ID, 0); - } + CreateMon(&gEnemyParty[i], SPECIES_NONE, 0, USE_RANDOM_IVS, FALSE, 0, OT_ID_PLAYER_ID, 0); - PrintTradeErrorOrStatusMessage(TRADESTATMSG_COMMSTANDBY); + PrintTradeMessage(MSG_STANDBY); ShowBg(0); if (!gReceivedRemoteLinkPlayers) { - gLinkType = 0x1122; - sTradeMenuResourcesPtr->loadUISpritesState = 0; + gLinkType = LINKTYPE_TRADE_CONNECTING; + sTradeMenu->timer = 0; if (gWirelessCommType) { @@ -775,10 +878,10 @@ static void CB2_ReturnFromLinkTrade2(void) } break; case 2: - sTradeMenuResourcesPtr->loadUISpritesState++; - if (sTradeMenuResourcesPtr->loadUISpritesState > 11) + sTradeMenu->timer++; + if (sTradeMenu->timer > 11) { - sTradeMenuResourcesPtr->loadUISpritesState = 0; + sTradeMenu->timer = 0; gMain.state++; } break; @@ -787,7 +890,7 @@ static void CB2_ReturnFromLinkTrade2(void) { if (IsLinkMaster()) { - if (++sTradeMenuResourcesPtr->loadUISpritesState > 30) + if (++sTradeMenu->timer > 30) { CheckShouldAdvanceLinkState(); gMain.state++; @@ -805,7 +908,7 @@ static void CB2_ReturnFromLinkTrade2(void) DestroyTask_RfuIdle(); CalculatePlayerPartyCount(); gMain.state++; - sTradeMenuResourcesPtr->loadUISpritesState = 0; + sTradeMenu->timer = 0; if (gWirelessCommType) { Rfu_SetLinkRecovery(TRUE); @@ -829,9 +932,9 @@ static void CB2_ReturnFromLinkTrade2(void) } break; case 6: - if (shedinja_maker_maybe()) + if (BufferTradeParties()) { - CopyGiftRibbonsToSav1(); + SaveTradeGiftRibbons(); gMain.state++; } break; @@ -839,13 +942,13 @@ static void CB2_ReturnFromLinkTrade2(void) CalculateEnemyPartyCount(); SetGpuReg(REG_OFFSET_DISPCNT, 0); SetGpuReg(REG_OFFSET_BLDCNT, 0); - sTradeMenuResourcesPtr->partyCounts[0] = gPlayerPartyCount; - sTradeMenuResourcesPtr->partyCounts[1] = gEnemyPartyCount; + sTradeMenu->partyCounts[TRADE_PLAYER] = gPlayerPartyCount; + sTradeMenu->partyCounts[TRADE_PARTNER] = gEnemyPartyCount; - for (i = 0; i < sTradeMenuResourcesPtr->partyCounts[0]; i++) + for (i = 0; i < sTradeMenu->partyCounts[TRADE_PLAYER]; i++) { struct Pokemon * mon = &gPlayerParty[i]; - sTradeMenuResourcesPtr->partyIcons[0][i] = CreateMonIcon(GetMonData(mon, MON_DATA_SPECIES2), + sTradeMenu->partySpriteIds[TRADE_PLAYER][i] = CreateMonIcon(GetMonData(mon, MON_DATA_SPECIES2), SpriteCB_MonIcon, (sTradeMonSpriteCoords[i][0] * 8) + 14, (sTradeMonSpriteCoords[i][1] * 8) - 12, @@ -854,10 +957,10 @@ static void CB2_ReturnFromLinkTrade2(void) TRUE); } - for (i = 0; i < sTradeMenuResourcesPtr->partyCounts[1]; i++) + for (i = 0; i < sTradeMenu->partyCounts[TRADE_PARTNER]; i++) { struct Pokemon * mon = &gEnemyParty[i]; - sTradeMenuResourcesPtr->partyIcons[1][i] = CreateMonIcon(GetMonData(mon, MON_DATA_SPECIES2, NULL), + sTradeMenu->partySpriteIds[TRADE_PARTNER][i] = CreateMonIcon(GetMonData(mon, MON_DATA_SPECIES2, NULL), SpriteCB_MonIcon, (sTradeMonSpriteCoords[i + PARTY_SIZE][0] * 8) + 14, (sTradeMonSpriteCoords[i + PARTY_SIZE][1] * 8) - 12, @@ -869,88 +972,93 @@ static void CB2_ReturnFromLinkTrade2(void) break; case 8: LoadHeldItemIcons(); - DrawHeldItemIconsForTrade(sTradeMenuResourcesPtr->partyCounts, sTradeMenuResourcesPtr->partyIcons[0], 0); + DrawHeldItemIconsForTrade(sTradeMenu->partyCounts, sTradeMenu->partySpriteIds[0], TRADE_PLAYER); gMain.state++; break; case 9: - DrawHeldItemIconsForTrade(sTradeMenuResourcesPtr->partyCounts, sTradeMenuResourcesPtr->partyIcons[0], 1); + DrawHeldItemIconsForTrade(sTradeMenu->partyCounts, sTradeMenu->partySpriteIds[0], TRADE_PARTNER); gMain.state++; break; case 10: - DrawTextWindowAndBufferTiles(gSaveBlock2Ptr->playerName, sSpriteTextTilePtrs[0], 0, 0, gDecompressionBuffer, 3); + DrawTextWindowAndBufferTiles(gSaveBlock2Ptr->playerName, sMenuTextTileBuffers[GFXTAG_PLAYER_NAME_L], 0, 0, gDecompressionBuffer, 3); id = GetMultiplayerId(); - DrawTextWindowAndBufferTiles(gLinkPlayers[id ^ 1].name, sSpriteTextTilePtrs[3], 0, 0, gDecompressionBuffer, 3); - DrawTextWindowAndBufferTiles(sTradeUITextPtrs[TRADEUITEXT_CANCEL], sSpriteTextTilePtrs[6], 0, 0, gDecompressionBuffer, 2); - RenderTextToVramViaBuffer(sTradeUITextPtrs[TRADEUITEXT_CHOOSE], sSpriteTextTilePtrs[8], 24); + DrawTextWindowAndBufferTiles(gLinkPlayers[id ^ 1].name, sMenuTextTileBuffers[GFXTAG_PARTNER_NAME_L], 0, 0, gDecompressionBuffer, 3); + DrawTextWindowAndBufferTiles(sActionTexts[TEXT_CANCEL], sMenuTextTileBuffers[GFXTAG_CANCEL_L], 0, 0, gDecompressionBuffer, 2); + DrawBottomRowText(sActionTexts[TEXT_CHOOSE_MON], sMenuTextTileBuffers[GFXTAG_CHOOSE_PKMN_L], 24); gMain.state++; - sTradeMenuResourcesPtr->loadUISpritesState = 0; + sTradeMenu->timer = 0; break; case 11: - if (LoadUISprites()) + if (LoadUISpriteGfx()) gMain.state++; break; case 12: + // Create player's name text sprites name = gSaveBlock2Ptr->playerName; width = GetStringWidth(FONT_NORMAL_COPY_1, name, 0); xPos = (56 - width) / 2; - for (i = 0; i < 3; i++) + for (i = 0; i < NUM_PLAYER_NAME_SPRITES; i++) { - temp = sSpriteTemplate_Text; - temp.tileTag += i; - CreateSprite(&temp, xPos + sTradeUnknownSpriteCoords[LANGUAGE_ENGLISH - 1][0] + (i * 32), sTradeUnknownSpriteCoords[LANGUAGE_ENGLISH - 1][1], 1); + temp = sSpriteTemplate_MenuText; + temp.tileTag += i + GFXTAG_PLAYER_NAME_L; + CreateSprite(&temp, xPos + sPlayerNameCoords[1][0] + (i * 32), sPlayerNameCoords[1][1], 1); } + + // Create partner's name text sprites id = GetMultiplayerId(); name = gLinkPlayers[id ^ 1].name; width = GetStringWidth(FONT_NORMAL_COPY_1, name, 0); xPos = (56 - width) / 2; - for (i = 0; i < 3; i++) + for (i = 0; i < NUM_PARTNER_NAME_SPRITES; i++) { - temp = sSpriteTemplate_Text; - temp.tileTag += i + 3; - CreateSprite(&temp, xPos + sTradeUnknownSpriteCoords[LANGUAGE_ENGLISH - 1][2] + (i * 32), sTradeUnknownSpriteCoords[LANGUAGE_ENGLISH - 1][3], 1); + temp = sSpriteTemplate_MenuText; + temp.tileTag += i + GFXTAG_PARTNER_NAME_L; + CreateSprite(&temp, xPos + sPlayerNameCoords[1][2] + (i * 32), sPlayerNameCoords[1][3], 1); } gMain.state++; break; case 13: - temp = sSpriteTemplate_Text; - temp.tileTag += 6; + // Create Cancel text sprites + temp = sSpriteTemplate_MenuText; + temp.tileTag += GFXTAG_CANCEL_L; CreateSprite(&temp, 215, 151, 1); - temp = sSpriteTemplate_Text; - temp.tileTag += 7; - CreateSprite(&temp, 247, 151, 1); + temp = sSpriteTemplate_MenuText; + temp.tileTag += GFXTAG_CANCEL_R; + CreateSprite(&temp, 215 + 32, 151, 1); - for (i = 0; i < PARTY_SIZE; i++) + // Create Choose a Pokémon text sprites (only 3 are needed, other 3 are empty) + for (i = 0; i < NUM_CHOOSE_PKMN_SPRITES; i++) { - temp = sSpriteTemplate_Text; - temp.tileTag += i + 8; + temp = sSpriteTemplate_MenuText; + temp.tileTag += i + GFXTAG_CHOOSE_PKMN_L; CreateSprite(&temp, (i * 32) + 24, 150, 1); } - sTradeMenuResourcesPtr->tradeMenuCursorSpriteIdx = CreateSprite(&sSpriteTemplate_TradeButtons, sTradeMonSpriteCoords[0][0] * 8 + 32, sTradeMonSpriteCoords[0][1] * 8, 2); - sTradeMenuResourcesPtr->tradeMenuCursorPosition = 0; + sTradeMenu->cursorSpriteId = CreateSprite(&sSpriteTemplate_Cursor, sTradeMonSpriteCoords[0][0] * 8 + 32, sTradeMonSpriteCoords[0][1] * 8, 2); + sTradeMenu->cursorPosition = 0; gMain.state++; rbox_fill_rectangle(0); break; case 14: - ComputePartyTradeableFlags(0); - PrintPartyNicknames(0); - sTradeMenuResourcesPtr->bg2hofs = 0; - sTradeMenuResourcesPtr->bg3hofs = 0; - SetTradeMenuOptionActiveFlags(); + ComputePartyTradeableFlags(TRADE_PLAYER); + PrintPartyNicknames(TRADE_PLAYER); + sTradeMenu->bg2hofs = 0; + sTradeMenu->bg3hofs = 0; + SetActiveMenuOptions(); gMain.state++; PlayBGM(MUS_GAME_CORNER); break; case 15: - ComputePartyTradeableFlags(1); - PrintPartyNicknames(1); + ComputePartyTradeableFlags(TRADE_PARTNER); + PrintPartyNicknames(TRADE_PARTNER); gMain.state++; // fallthrough case 16: - LoadTradeBackgroundGfxAndPals(0); + LoadTradeBgGfx(0); gMain.state++; break; case 17: - LoadTradeBackgroundGfxAndPals(1); + LoadTradeBgGfx(1); gMain.state++; break; case 18: @@ -959,22 +1067,22 @@ static void CB2_ReturnFromLinkTrade2(void) break; case 19: SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON); - LoadTradeBackgroundGfxAndPals(2); + LoadTradeBgGfx(2); gMain.state++; break; case 20: - ComputePartyHPBarLevels(0); + ComputePartyHPBarLevels(TRADE_PLAYER); gMain.state++; break; case 21: - ComputePartyHPBarLevels(1); - SetMonIconsAnimByHPBarLevel(); + ComputePartyHPBarLevels(TRADE_PARTNER); + SetTradePartyHPBarSprites(); gMain.state++; break; case 22: if (!gPaletteFade.active) { - gMain.callback1 = CB1_HandleBlockReceive; + gMain.callback1 = CB1_UpdateLink; SetMainCallback2(CB2_TradeMenu); } break; @@ -999,12 +1107,12 @@ void CB2_ReturnToTradeMenuFromSummary(void) switch (gMain.state) { case 0: - InitTradeMenuResources(); + InitTradeMenu(); gMain.state++; break; case 1: gMain.state++; - sTradeMenuResourcesPtr->loadUISpritesState = 0; + sTradeMenu->timer = 0; break; case 2: gMain.state++; @@ -1029,14 +1137,14 @@ void CB2_ReturnToTradeMenuFromSummary(void) break; case 7: CalculateEnemyPartyCount(); - sTradeMenuResourcesPtr->partyCounts[0] = gPlayerPartyCount; - sTradeMenuResourcesPtr->partyCounts[1] = gEnemyPartyCount; + sTradeMenu->partyCounts[TRADE_PLAYER] = gPlayerPartyCount; + sTradeMenu->partyCounts[TRADE_PARTNER] = gEnemyPartyCount; ClearWindowTilemap(0); - PrintPartyNicknames(0); - PrintPartyNicknames(1); - for (i = 0; i < sTradeMenuResourcesPtr->partyCounts[0]; i++) + PrintPartyNicknames(TRADE_PLAYER); + PrintPartyNicknames(TRADE_PARTNER); + for (i = 0; i < sTradeMenu->partyCounts[TRADE_PLAYER]; i++) { - sTradeMenuResourcesPtr->partyIcons[0][i] = CreateMonIcon( + sTradeMenu->partySpriteIds[TRADE_PLAYER][i] = CreateMonIcon( GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2, NULL), SpriteCB_MonIcon, sTradeMonSpriteCoords[i][0] * 8 + 14, @@ -1046,13 +1154,13 @@ void CB2_ReturnToTradeMenuFromSummary(void) TRUE ); } - for (i = 0; i < sTradeMenuResourcesPtr->partyCounts[1]; i++) + for (i = 0; i < sTradeMenu->partyCounts[TRADE_PARTNER]; i++) { - sTradeMenuResourcesPtr->partyIcons[1][i] = CreateMonIcon( + sTradeMenu->partySpriteIds[TRADE_PARTNER][i] = CreateMonIcon( GetMonData(&gEnemyParty[i], MON_DATA_SPECIES2, NULL), SpriteCB_MonIcon, - sTradeMonSpriteCoords[i + 6][0] * 8 + 14, - sTradeMonSpriteCoords[i + 6][1] * 8 - 12, + sTradeMonSpriteCoords[i + PARTY_SIZE][0] * 8 + 14, + sTradeMonSpriteCoords[i + PARTY_SIZE][1] * 8 - 12, 1, GetMonData(&gEnemyParty[i], MON_DATA_PERSONALITY), FALSE @@ -1062,82 +1170,87 @@ void CB2_ReturnToTradeMenuFromSummary(void) break; case 8: LoadHeldItemIcons(); - DrawHeldItemIconsForTrade(sTradeMenuResourcesPtr->partyCounts, sTradeMenuResourcesPtr->partyIcons[0], 0); + DrawHeldItemIconsForTrade(sTradeMenu->partyCounts, sTradeMenu->partySpriteIds[0], TRADE_PLAYER); gMain.state++; break; case 9: - DrawHeldItemIconsForTrade(sTradeMenuResourcesPtr->partyCounts, sTradeMenuResourcesPtr->partyIcons[0], 1); + DrawHeldItemIconsForTrade(sTradeMenu->partyCounts, sTradeMenu->partySpriteIds[0], TRADE_PARTNER); gMain.state++; break; case 10: - DrawTextWindowAndBufferTiles(gSaveBlock2Ptr->playerName, sSpriteTextTilePtrs[0], 0, 0, gDecompressionBuffer, 3); + DrawTextWindowAndBufferTiles(gSaveBlock2Ptr->playerName, sMenuTextTileBuffers[GFXTAG_PLAYER_NAME_L], 0, 0, gDecompressionBuffer, 3); id = GetMultiplayerId(); - DrawTextWindowAndBufferTiles(gLinkPlayers[id ^ 1].name, sSpriteTextTilePtrs[3], 0, 0, gDecompressionBuffer, 3); - DrawTextWindowAndBufferTiles(sTradeUITextPtrs[TRADEUITEXT_CANCEL], sSpriteTextTilePtrs[6], 0, 0, gDecompressionBuffer, 2); - RenderTextToVramViaBuffer(sTradeUITextPtrs[TRADEUITEXT_CHOOSE], sSpriteTextTilePtrs[8], 24); + DrawTextWindowAndBufferTiles(gLinkPlayers[id ^ 1].name, sMenuTextTileBuffers[GFXTAG_PARTNER_NAME_L], 0, 0, gDecompressionBuffer, 3); + DrawTextWindowAndBufferTiles(sActionTexts[TEXT_CANCEL], sMenuTextTileBuffers[GFXTAG_CANCEL_L], 0, 0, gDecompressionBuffer, 2); + DrawBottomRowText(sActionTexts[TEXT_CHOOSE_MON], sMenuTextTileBuffers[GFXTAG_CHOOSE_PKMN_L], 24); gMain.state++; - sTradeMenuResourcesPtr->loadUISpritesState = 0; + sTradeMenu->timer = 0; break; case 11: - if (LoadUISprites()) - { + if (LoadUISpriteGfx()) gMain.state++; - } break; case 12: + // Create player's name text sprites name = gSaveBlock2Ptr->playerName; width = GetStringWidth(FONT_NORMAL_COPY_1, name, 0); xPos = (56 - width) / 2; - for (i = 0; i < 3; i++) + for (i = 0; i < NUM_PLAYER_NAME_SPRITES; i++) { - temp = sSpriteTemplate_Text; - temp.tileTag += i; - CreateSprite(&temp, xPos + sTradeUnknownSpriteCoords[LANGUAGE_ENGLISH - 1][0] + (i * 32), sTradeUnknownSpriteCoords[LANGUAGE_ENGLISH - 1][1], 1); + temp = sSpriteTemplate_MenuText; + temp.tileTag += i + GFXTAG_PLAYER_NAME_L; + CreateSprite(&temp, xPos + sPlayerNameCoords[1][0] + (i * 32), sPlayerNameCoords[1][1], 1); } + + // Create partner's name text sprites id = GetMultiplayerId(); name = gLinkPlayers[id ^ 1].name; width = GetStringWidth(FONT_NORMAL_COPY_1, name, 0); xPos = (56 - width) / 2; - for (i = 0; i < 3; i++) + for (i = 0; i < NUM_PARTNER_NAME_SPRITES; i++) { - temp = sSpriteTemplate_Text; - temp.tileTag += i + 3; - CreateSprite(&temp, xPos + sTradeUnknownSpriteCoords[LANGUAGE_ENGLISH - 1][2] + (i * 32), sTradeUnknownSpriteCoords[LANGUAGE_ENGLISH - 1][3], 1); + temp = sSpriteTemplate_MenuText; + temp.tileTag += i + GFXTAG_PARTNER_NAME_L; + CreateSprite(&temp, xPos + sPlayerNameCoords[1][2] + (i * 32), sPlayerNameCoords[1][3], 1); } gMain.state++; break; case 13: - temp = sSpriteTemplate_Text; - temp.tileTag += 6; + // Create Cancel text sprites + temp = sSpriteTemplate_MenuText; + temp.tileTag += GFXTAG_CANCEL_L; CreateSprite(&temp, 215, 151, 1); - temp = sSpriteTemplate_Text; - temp.tileTag += 7; - CreateSprite(&temp, 247, 151, 1); + temp = sSpriteTemplate_MenuText; + temp.tileTag += GFXTAG_CANCEL_R; + CreateSprite(&temp, 215 + 32, 151, 1); - for (i = 0; i < PARTY_SIZE; i++) + // Create Choose a Pokémon text sprites + for (i = 0; i < NUM_CHOOSE_PKMN_SPRITES; i++) { - temp = sSpriteTemplate_Text; - temp.tileTag += i + 8; + temp = sSpriteTemplate_MenuText; + temp.tileTag += i + GFXTAG_CHOOSE_PKMN_L; CreateSprite(&temp, (i * 32) + 24, 150, 1); } - if (sTradeMenuResourcesPtr->tradeMenuCursorPosition < 6) - sTradeMenuResourcesPtr->tradeMenuCursorPosition = GetLastViewedMonIndex(); + if (sTradeMenu->cursorPosition < PARTY_SIZE) + sTradeMenu->cursorPosition = GetLastViewedMonIndex(); else - sTradeMenuResourcesPtr->tradeMenuCursorPosition = GetLastViewedMonIndex() + 6; + sTradeMenu->cursorPosition = GetLastViewedMonIndex() + PARTY_SIZE; - sTradeMenuResourcesPtr->tradeMenuCursorSpriteIdx = CreateSprite(&sSpriteTemplate_TradeButtons, sTradeMonSpriteCoords[sTradeMenuResourcesPtr->tradeMenuCursorPosition][0] * 8 + 32, sTradeMonSpriteCoords[sTradeMenuResourcesPtr->tradeMenuCursorPosition][1] * 8, 2); + sTradeMenu->cursorSpriteId = CreateSprite(&sSpriteTemplate_Cursor, + sTradeMonSpriteCoords[sTradeMenu->cursorPosition][0] * 8 + 32, + sTradeMonSpriteCoords[sTradeMenu->cursorPosition][1] * 8, 2); gMain.state = 16; break; case 16: - LoadTradeBackgroundGfxAndPals(0); + LoadTradeBgGfx(0); gMain.state++; break; case 17: - LoadTradeBackgroundGfxAndPals(1); - sTradeMenuResourcesPtr->bg2hofs = 0; - sTradeMenuResourcesPtr->bg3hofs = 0; - SetTradeMenuOptionActiveFlags(); + LoadTradeBgGfx(1); + sTradeMenu->bg2hofs = 0; + sTradeMenu->bg3hofs = 0; + SetActiveMenuOptions(); gMain.state++; break; case 18: @@ -1148,21 +1261,19 @@ void CB2_ReturnToTradeMenuFromSummary(void) break; case 19: SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON); - LoadTradeBackgroundGfxAndPals(2); + LoadTradeBgGfx(2); gMain.state++; break; case 20: gMain.state++; break; case 21: - SetMonIconsAnimByHPBarLevel(); + SetTradePartyHPBarSprites(); gMain.state++; break; case 22: if (!gPaletteFade.active) - { SetMainCallback2(CB2_TradeMenu); - } break; } @@ -1172,50 +1283,51 @@ void CB2_ReturnToTradeMenuFromSummary(void) UpdatePaletteFade(); } -static void VblankCB_Trade(void) +static void VBlankCB_TradeMenu(void) { LoadOam(); ProcessSpriteCopyRequests(); TransferPlttBuffer(); } -static void TradeMenuCB_9(void) +static void CB_FadeToStartTrade(void) { - if (++sTradeMenuResourcesPtr->loadUISpritesState >= 16) + if (++sTradeMenu->timer >= 16) { BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); - sTradeMenuResourcesPtr->tradeMenuCBnum = 10; + sTradeMenu->callbackId = CB_WAIT_TO_START_TRADE; } } -static void TradeMenuCB_10(void) +static void CB_WaitToStartTrade(void) { if (!gPaletteFade.active) { - gSelectedTradeMonPositions[0] = sTradeMenuResourcesPtr->tradeMenuCursorPosition; - gSelectedTradeMonPositions[1] = sTradeMenuResourcesPtr->otherPlayerCursorPosition; + gSelectedTradeMonPositions[TRADE_PLAYER] = sTradeMenu->cursorPosition; + gSelectedTradeMonPositions[TRADE_PARTNER] = sTradeMenu->partnerCursorPosition; if (gWirelessCommType != 0) { - sTradeMenuResourcesPtr->tradeMenuCBnum = 16; + sTradeMenu->callbackId = CB_WAIT_TO_START_RFU_TRADE; } else { SetCloseLinkCallbackAndType(32); - sTradeMenuResourcesPtr->tradeMenuCBnum = 13; + sTradeMenu->callbackId = CB_START_LINK_TRADE; } } } -static void TradeMenuCB_13(void) +static void CB_StartLinkTrade(void) { gMain.savedCallback = CB2_StartCreateTradeMenu; if (gWirelessCommType != 0) { + // Wireless Link Trade if (IsLinkRfuTaskFinished()) { - Free(sSpriteTextTileBuffer); + Free(sMenuTextTileBuffer); FreeAllWindowBuffers(); - Free(sTradeMenuResourcesPtr); + Free(sTradeMenu); gMain.callback1 = NULL; DestroyWirelessStatusIndicatorSprite(); SetMainCallback2(CB2_LinkTrade); @@ -1223,11 +1335,12 @@ static void TradeMenuCB_13(void) } else { + // Cable Link Trade if (!gReceivedRemoteLinkPlayers) { - Free(sSpriteTextTileBuffer); + Free(sMenuTextTileBuffer); FreeAllWindowBuffers(); - Free(sTradeMenuResourcesPtr); + Free(sTradeMenu); gMain.callback1 = NULL; SetMainCallback2(CB2_LinkTrade); } @@ -1237,11 +1350,14 @@ static void TradeMenuCB_13(void) static void CB2_TradeMenu(void) { RunTradeMenuCallback(); - RunScheduledLinkTasks(); - HandleRedrawTradeMenuOnSide(0); - HandleRedrawTradeMenuOnSide(1); - SetGpuReg(REG_OFFSET_BG2HOFS, sTradeMenuResourcesPtr->bg2hofs++); - SetGpuReg(REG_OFFSET_BG3HOFS, sTradeMenuResourcesPtr->bg3hofs--); + DoQueuedActions(); + + // As long as drawSelectedMonState is 0, these do nothing + DrawSelectedMonScreen(TRADE_PLAYER); + DrawSelectedMonScreen(TRADE_PARTNER); + + SetGpuReg(REG_OFFSET_BG2HOFS, sTradeMenu->bg2hofs++); + SetGpuReg(REG_OFFSET_BG3HOFS, sTradeMenu->bg3hofs--); RunTextPrinters_CheckPrinter0Active(); RunTasks(); AnimateSprites(); @@ -1249,7 +1365,7 @@ static void CB2_TradeMenu(void) UpdatePaletteFade(); } -static void LoadTradeBackgroundGfxAndPals(u8 state) +static void LoadTradeBgGfx(u8 state) { int i; @@ -1258,13 +1374,13 @@ static void LoadTradeBackgroundGfxAndPals(u8 state) case 0: LoadPalette(gTradeMenu_Pal, 0x00, 0x60); LoadBgTiles(1, gTradeMenu_Gfx, 0x1280, 0); - CopyToBgTilemapBufferRect_ChangePalette(1, gUnknown_8E9E9FC, 0, 0, 32, 20, 0); + CopyToBgTilemapBufferRect_ChangePalette(1, gTradeMenu_Tilemap, 0, 0, 32, 20, 0); LoadBgTilemap(2, sTradeStripesBG2Tilemap, 0x800, 0); break; case 1: LoadBgTilemap(3, sTradeStripesBG3Tilemap, 0x800, 0); - PrintPartyLevelsAndGendersDirectlyOnVram(0); - PrintPartyLevelsAndGendersDirectlyOnVram(1); + PrintPartyLevelsAndGenders(TRADE_PLAYER); + PrintPartyLevelsAndGenders(TRADE_PARTNER); CopyBgTilemapBufferToVram(1); break; case 2: @@ -1281,148 +1397,157 @@ static void LoadTradeBackgroundGfxAndPals(u8 state) } } -static void SetTradeMenuOptionActiveFlags(void) +// Determine (based on party counts) where the main menu cursor can go +static void SetActiveMenuOptions(void) { int i; for (i = 0; i < PARTY_SIZE; i++) { - if (i < sTradeMenuResourcesPtr->partyCounts[0]) + if (i < sTradeMenu->partyCounts[TRADE_PLAYER]) { - gSprites[sTradeMenuResourcesPtr->partyIcons[0][i]].invisible = FALSE; - sTradeMenuResourcesPtr->tradeMenuOptionsActive[i] = TRUE; + // Present player pokemon + gSprites[sTradeMenu->partySpriteIds[TRADE_PLAYER][i]].invisible = FALSE; + sTradeMenu->optionsActive[i] = TRUE; } else { - sTradeMenuResourcesPtr->tradeMenuOptionsActive[i] = FALSE; + // Absent player pokemon + sTradeMenu->optionsActive[i] = FALSE; } - if (i < sTradeMenuResourcesPtr->partyCounts[1]) + + if (i < sTradeMenu->partyCounts[TRADE_PARTNER]) { - gSprites[sTradeMenuResourcesPtr->partyIcons[1][i]].invisible = FALSE; - sTradeMenuResourcesPtr->tradeMenuOptionsActive[i + 6] = TRUE; + // Present partner pokemon + gSprites[sTradeMenu->partySpriteIds[TRADE_PARTNER][i]].invisible = FALSE; + sTradeMenu->optionsActive[i + PARTY_SIZE] = TRUE; } else { - sTradeMenuResourcesPtr->tradeMenuOptionsActive[i + 6] = FALSE; + // Absent partner pokemon + sTradeMenu->optionsActive[i + PARTY_SIZE] = FALSE; } } - sTradeMenuResourcesPtr->tradeMenuOptionsActive[12] = TRUE; + + // Cancel is always active + sTradeMenu->optionsActive[PARTY_SIZE * 2] = TRUE; } static void Trade_Memcpy(void *dest, const void *src, size_t size) { int i; - char *_dest = dest; - const char *_src = src; + u8 *_dest = dest; + const u8 *_src = src; for (i = 0; i < size; i++) _dest[i] = _src[i]; } -static bool8 shedinja_maker_maybe(void) +static bool8 BufferTradeParties(void) { u8 id = GetMultiplayerId(); int i; struct Pokemon * mon; - switch (sTradeMenuResourcesPtr->state) + switch (sTradeMenu->bufferPartyState) { case 0: + // The parties are sent in pairs rather than all at once Trade_Memcpy(gBlockSendBuffer, &gPlayerParty[0], 2 * sizeof(struct Pokemon)); - sTradeMenuResourcesPtr->state++; - sTradeMenuResourcesPtr->loadUISpritesState = 0; + sTradeMenu->bufferPartyState++; + sTradeMenu->timer = 0; break; case 1: if (IsLinkTaskFinished()) { if (GetBlockReceivedStatus() == 0) { - sTradeMenuResourcesPtr->state++; + sTradeMenu->bufferPartyState++; } else { ResetBlockReceivedFlags(); - sTradeMenuResourcesPtr->state++; + sTradeMenu->bufferPartyState++; } } break; case 3: if (id == 0) SendBlockRequest(BLOCK_REQ_SIZE_200); - sTradeMenuResourcesPtr->state++; + sTradeMenu->bufferPartyState++; break; case 4: if (GetBlockReceivedStatus() == 3) { Trade_Memcpy(&gEnemyParty[0], gBlockRecvBuffer[id ^ 1], 2 * sizeof(struct Pokemon)); ResetBlockReceivedFlags(); - sTradeMenuResourcesPtr->state++; + sTradeMenu->bufferPartyState++; } break; case 5: Trade_Memcpy(gBlockSendBuffer, &gPlayerParty[2], 2 * sizeof(struct Pokemon)); - sTradeMenuResourcesPtr->state++; + sTradeMenu->bufferPartyState++; break; case 7: if (id == 0) SendBlockRequest(BLOCK_REQ_SIZE_200); - sTradeMenuResourcesPtr->state++; + sTradeMenu->bufferPartyState++; break; case 8: if (GetBlockReceivedStatus() == 3) { Trade_Memcpy(&gEnemyParty[2], gBlockRecvBuffer[id ^ 1], 2 * sizeof(struct Pokemon)); ResetBlockReceivedFlags(); - sTradeMenuResourcesPtr->state++; + sTradeMenu->bufferPartyState++; } break; case 9: Trade_Memcpy(gBlockSendBuffer, &gPlayerParty[4], 2 * sizeof(struct Pokemon)); - sTradeMenuResourcesPtr->state++; + sTradeMenu->bufferPartyState++; break; case 11: if (id == 0) SendBlockRequest(BLOCK_REQ_SIZE_200); - sTradeMenuResourcesPtr->state++; + sTradeMenu->bufferPartyState++; break; case 12: if (GetBlockReceivedStatus() == 3) { Trade_Memcpy(&gEnemyParty[4], gBlockRecvBuffer[id ^ 1], 2 * sizeof(struct Pokemon)); ResetBlockReceivedFlags(); - sTradeMenuResourcesPtr->state++; + sTradeMenu->bufferPartyState++; } break; case 13: Trade_Memcpy(gBlockSendBuffer, gSaveBlock1Ptr->mail, PARTY_SIZE * sizeof(struct Mail) + 4); // why the extra 4 bytes? - sTradeMenuResourcesPtr->state++; + sTradeMenu->bufferPartyState++; break; case 15: if (id == 0) SendBlockRequest(BLOCK_REQ_SIZE_220); - sTradeMenuResourcesPtr->state++; + sTradeMenu->bufferPartyState++; break; case 16: if (GetBlockReceivedStatus() == 3) { Trade_Memcpy(gLinkPartnerMail, gBlockRecvBuffer[id ^ 1], PARTY_SIZE * sizeof(struct Mail)); ResetBlockReceivedFlags(); - sTradeMenuResourcesPtr->state++; + sTradeMenu->bufferPartyState++; } break; case 17: - Trade_Memcpy(gBlockSendBuffer, gSaveBlock1Ptr->giftRibbons, NUM_TRADED_GIFT_RIBBONS); - sTradeMenuResourcesPtr->state++; + Trade_Memcpy(gBlockSendBuffer, gSaveBlock1Ptr->giftRibbons, sizeof(sTradeMenu->giftRibbons)); + sTradeMenu->bufferPartyState++; break; case 19: if (id == 0) SendBlockRequest(BLOCK_REQ_SIZE_40); - sTradeMenuResourcesPtr->state++; + sTradeMenu->bufferPartyState++; break; case 20: if (GetBlockReceivedStatus() == 3) { - Trade_Memcpy(sTradeMenuResourcesPtr->giftRibbons, gBlockRecvBuffer[id ^ 1], NUM_TRADED_GIFT_RIBBONS); + Trade_Memcpy(sTradeMenu->giftRibbons, gBlockRecvBuffer[id ^ 1], sizeof(sTradeMenu->giftRibbons)); ResetBlockReceivedFlags(); - sTradeMenuResourcesPtr->state++; + sTradeMenu->bufferPartyState++; } break; case 21: @@ -1437,24 +1562,23 @@ static bool8 shedinja_maker_maybe(void) { GetMonData(mon, MON_DATA_NICKNAME, name); - if (!StringCompareWithoutExtCtrlCodes(name, gJPText_Shedinja)) - { + if (!StringCompareWithoutExtCtrlCodes(name, sText_ShedinjaJP)) SetMonData(mon, MON_DATA_NICKNAME, gSpeciesNames[SPECIES_SHEDINJA]); - } } } } return TRUE; + // Delay until next state case 2: case 6: case 10: case 14: case 18: - sTradeMenuResourcesPtr->loadUISpritesState++; - if (sTradeMenuResourcesPtr->loadUISpritesState > 10) + sTradeMenu->timer++; + if (sTradeMenu->timer > 10) { - sTradeMenuResourcesPtr->loadUISpritesState = 0; - sTradeMenuResourcesPtr->state++; + sTradeMenu->timer = 0; + sTradeMenu->bufferPartyState++; } break; } @@ -1463,181 +1587,194 @@ static bool8 shedinja_maker_maybe(void) static void PrintIsThisTradeOkay(void) { - RenderTextToVramViaBuffer(gText_IsThisTradeOkay, (u8 *)OBJ_VRAM0 + sTradeMenuResourcesPtr->cursorStartTile * 32, 0x18); + DrawBottomRowText(gText_IsThisTradeOkay, (u8 *)OBJ_VRAM0 + sTradeMenu->bottomTextTileStart * 32, 0x18); } -static void Master_HandleBlockReceivedStatus(u8 mpId, u8 blockReceivedFlags) +static void Leader_ReadLinkBuffer(u8 mpId, u8 status) { - if (blockReceivedFlags & 1) + if (status & 1) { switch (gBlockRecvBuffer[0][0]) { - case 0xEEAA: - sTradeMenuResourcesPtr->unk_78 = 2; + case LINKCMD_REQUEST_CANCEL: + sTradeMenu->playerSelectStatus = STATUS_CANCEL; break; - case 0xAABB: - sTradeMenuResourcesPtr->unk_78 = 1; + case LINKCMD_READY_TO_TRADE: + sTradeMenu->playerSelectStatus = STATUS_READY; break; - case 0xBBBB: - sTradeMenuResourcesPtr->unk_7A = 1; + case LINKCMD_INIT_BLOCK: + sTradeMenu->playerConfirmStatus = STATUS_READY; break; - case 0xBBCC: - sTradeMenuResourcesPtr->unk_7A = 2; + case LINKCMD_READY_CANCEL_TRADE: + sTradeMenu->playerConfirmStatus = STATUS_CANCEL; break; } ResetBlockReceivedFlag(0); } - if (blockReceivedFlags & 2) + if (status & 2) { switch (gBlockRecvBuffer[1][0]) { - case 0xEEAA: - sTradeMenuResourcesPtr->unk_79 = 2; + case LINKCMD_REQUEST_CANCEL: + sTradeMenu->partnerSelectStatus = STATUS_CANCEL; break; - case 0xAABB: - sTradeMenuResourcesPtr->otherPlayerCursorPosition = gBlockRecvBuffer[1][1] + 6; - sTradeMenuResourcesPtr->unk_79 = 1; + case LINKCMD_READY_TO_TRADE: + sTradeMenu->partnerCursorPosition = gBlockRecvBuffer[1][1] + PARTY_SIZE; + sTradeMenu->partnerSelectStatus = STATUS_READY; break; - case 0xBBBB: - sTradeMenuResourcesPtr->unk_7B = 1; + case LINKCMD_INIT_BLOCK: + sTradeMenu->partnerConfirmStatus = STATUS_READY; break; - case 0xBBCC: - sTradeMenuResourcesPtr->unk_7B = 2; + case LINKCMD_READY_CANCEL_TRADE: + sTradeMenu->partnerConfirmStatus = STATUS_CANCEL; break; } ResetBlockReceivedFlag(1); } } -static void Slave_HandleBlockReceivedStatus(u8 mpId, u8 blockReceivedFlags) +static void Follower_ReadLinkBuffer(u8 mpId, u8 status) { - if (blockReceivedFlags & 1) + if (status & 1) { switch (gBlockRecvBuffer[0][0]) { - case 0xEEBB: + case LINKCMD_BOTH_CANCEL_TRADE: BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); - PrintTradeErrorOrStatusMessage(TRADESTATMSG_WAITINGFORFRIEND); - sTradeMenuResourcesPtr->tradeMenuCBnum = 11; + PrintTradeMessage(MSG_WAITING_FOR_FRIEND); + sTradeMenu->callbackId = CB_INIT_EXIT_CANCELED_TRADE; break; - case 0xEECC: - PrintTradeErrorOrStatusMessage(TRADESTATMSG_FRIENDWANTSTOTRADE); - sTradeMenuResourcesPtr->tradeMenuCBnum = 8; + case LINKCMD_PARTNER_CANCEL_TRADE: + PrintTradeMessage(MSG_FRIEND_WANTS_TO_TRADE); + sTradeMenu->callbackId = CB_HANDLE_TRADE_CANCELED; break; - case 0xDDDD: - sTradeMenuResourcesPtr->otherPlayerCursorPosition = gBlockRecvBuffer[0][1] + 6; + case LINKCMD_SET_MONS_TO_TRADE: + sTradeMenu->partnerCursorPosition = gBlockRecvBuffer[0][1] + PARTY_SIZE; rbox_fill_rectangle(0); - SignalRedrawTradeMenus(sTradeMenuResourcesPtr->tradeMenuCursorPosition); - SignalRedrawTradeMenus(sTradeMenuResourcesPtr->otherPlayerCursorPosition); - sTradeMenuResourcesPtr->tradeMenuCBnum = 7; + SetSelectedMon(sTradeMenu->cursorPosition); + SetSelectedMon(sTradeMenu->partnerCursorPosition); + sTradeMenu->callbackId = CB_PRINT_IS_THIS_OKAY; break; - case 0xCCDD: + case LINKCMD_START_TRADE: BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); - sTradeMenuResourcesPtr->tradeMenuCBnum = 10; + sTradeMenu->callbackId = CB_WAIT_TO_START_TRADE; break; - case 0xDDEE: - PrintTradeErrorOrStatusMessage(TRADESTATMSG_CANCELED); - sTradeMenuResourcesPtr->tradeMenuCBnum = 8; + case LINKCMD_PLAYER_CANCEL_TRADE: + PrintTradeMessage(MSG_CANCELED); + sTradeMenu->callbackId = CB_HANDLE_TRADE_CANCELED; } ResetBlockReceivedFlag(0); } - if (blockReceivedFlags & 2) + if (status & 2) ResetBlockReceivedFlag(1); } -static void Master_HandleCommunication(void) +#define QueueLinkData(linkCmd, cursorPosition) \ +{ \ + sTradeMenu->linkData[0] = (linkCmd); \ + sTradeMenu->linkData[1] = (cursorPosition); \ + QueueAction(QUEUE_DELAY_DATA, QUEUE_SEND_DATA); \ +} + +static void Leader_HandleCommunication(void) { - if (sTradeMenuResourcesPtr->unk_78 && sTradeMenuResourcesPtr->unk_79) + if (sTradeMenu->playerSelectStatus != STATUS_NONE + && sTradeMenu->partnerSelectStatus != STATUS_NONE) { - if (sTradeMenuResourcesPtr->unk_78 == 1 && sTradeMenuResourcesPtr->unk_79 == 1) + if (sTradeMenu->playerSelectStatus == STATUS_READY + && sTradeMenu->partnerSelectStatus == STATUS_READY) { - sTradeMenuResourcesPtr->tradeMenuCBnum = 6; - sTradeMenuResourcesPtr->linkData[0] = 0xDDDD; - sTradeMenuResourcesPtr->linkData[1] = sTradeMenuResourcesPtr->tradeMenuCursorPosition; - ScheduleLinkTaskWithDelay(5, 0); - sTradeMenuResourcesPtr->unk_78 = sTradeMenuResourcesPtr->unk_79 = 0; + // Both players have selected a pokemon to trade + sTradeMenu->callbackId = CB_SET_SELECTED_MONS; + QueueLinkData(LINKCMD_SET_MONS_TO_TRADE, sTradeMenu->cursorPosition); + sTradeMenu->playerSelectStatus = sTradeMenu->partnerSelectStatus = STATUS_NONE; } - else if (sTradeMenuResourcesPtr->unk_78 == 1 && sTradeMenuResourcesPtr->unk_79 == 2) + else if (sTradeMenu->playerSelectStatus == STATUS_READY + && sTradeMenu->partnerSelectStatus == STATUS_CANCEL) { - PrintTradeErrorOrStatusMessage(TRADESTATMSG_CANCELED); - sTradeMenuResourcesPtr->linkData[0] = 0xEECC; - sTradeMenuResourcesPtr->linkData[1] = 0; - ScheduleLinkTaskWithDelay(5, 0); - sTradeMenuResourcesPtr->unk_7A = sTradeMenuResourcesPtr->unk_7B = 0; - sTradeMenuResourcesPtr->unk_78 = sTradeMenuResourcesPtr->unk_79 = 0; - sTradeMenuResourcesPtr->tradeMenuCBnum = 8; + // The player has selected a pokemon to trade, + // but the partner has selected Cancel + PrintTradeMessage(MSG_CANCELED); + QueueLinkData(LINKCMD_PARTNER_CANCEL_TRADE, 0); + sTradeMenu->playerConfirmStatus = sTradeMenu->partnerConfirmStatus = STATUS_NONE; + sTradeMenu->playerSelectStatus = sTradeMenu->partnerSelectStatus = STATUS_NONE; + sTradeMenu->callbackId = CB_HANDLE_TRADE_CANCELED; } - else if (sTradeMenuResourcesPtr->unk_78 == 2 && sTradeMenuResourcesPtr->unk_79 == 1) + else if (sTradeMenu->playerSelectStatus == STATUS_CANCEL + && sTradeMenu->partnerSelectStatus == STATUS_READY) { - PrintTradeErrorOrStatusMessage(TRADESTATMSG_FRIENDWANTSTOTRADE); - sTradeMenuResourcesPtr->linkData[0] = 0xDDEE; - sTradeMenuResourcesPtr->linkData[1] = 0; - ScheduleLinkTaskWithDelay(5, 0); - sTradeMenuResourcesPtr->unk_7A = sTradeMenuResourcesPtr->unk_7B = 0; - sTradeMenuResourcesPtr->unk_78 = sTradeMenuResourcesPtr->unk_79 = 0; - sTradeMenuResourcesPtr->tradeMenuCBnum = 8; + // The partner has selected a pokemon to trade, + // but the player has selected cancel + PrintTradeMessage(MSG_FRIEND_WANTS_TO_TRADE); + QueueLinkData(LINKCMD_PLAYER_CANCEL_TRADE, 0); + sTradeMenu->playerConfirmStatus = sTradeMenu->partnerConfirmStatus = STATUS_NONE; + sTradeMenu->playerSelectStatus = sTradeMenu->partnerSelectStatus = STATUS_NONE; + sTradeMenu->callbackId = CB_HANDLE_TRADE_CANCELED; } - else if (sTradeMenuResourcesPtr->unk_78 == 2 && sTradeMenuResourcesPtr->unk_79 == 2) + else if (sTradeMenu->playerSelectStatus == STATUS_CANCEL + && sTradeMenu->partnerSelectStatus == STATUS_CANCEL) { - sTradeMenuResourcesPtr->linkData[0] = 0xEEBB; - sTradeMenuResourcesPtr->linkData[1] = 0; - ScheduleLinkTaskWithDelay(5, 0); + // Both players have selected Cancel + QueueLinkData(LINKCMD_BOTH_CANCEL_TRADE, 0); BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); - sTradeMenuResourcesPtr->unk_78 = sTradeMenuResourcesPtr->unk_79 = 0; - sTradeMenuResourcesPtr->tradeMenuCBnum = 11; + sTradeMenu->playerSelectStatus = sTradeMenu->partnerSelectStatus = STATUS_NONE; + sTradeMenu->callbackId = CB_INIT_EXIT_CANCELED_TRADE; } } - if (sTradeMenuResourcesPtr->unk_7A && sTradeMenuResourcesPtr->unk_7B) + if (sTradeMenu->playerConfirmStatus != STATUS_NONE + && sTradeMenu->partnerConfirmStatus != STATUS_NONE) { - if (sTradeMenuResourcesPtr->unk_7A == 1 && sTradeMenuResourcesPtr->unk_7B == 1) + if (sTradeMenu->playerConfirmStatus == STATUS_READY + && sTradeMenu->partnerConfirmStatus == STATUS_READY) { - sTradeMenuResourcesPtr->linkData[0] = 0xCCDD; - sTradeMenuResourcesPtr->linkData[1] = 0; - ScheduleLinkTaskWithDelay(5, 0); - sTradeMenuResourcesPtr->unk_7A = 0; - sTradeMenuResourcesPtr->unk_7B = 0; - sTradeMenuResourcesPtr->tradeMenuCBnum = 9; + // Both players have confirmed the trade + QueueLinkData(LINKCMD_START_TRADE, 0); + sTradeMenu->playerConfirmStatus = STATUS_NONE; + sTradeMenu->partnerConfirmStatus = STATUS_NONE; + sTradeMenu->callbackId = CB_FADE_TO_START_TRADE; } - if (sTradeMenuResourcesPtr->unk_7A == 2 || sTradeMenuResourcesPtr->unk_7B == 2) + if (sTradeMenu->playerConfirmStatus == STATUS_CANCEL + || sTradeMenu->partnerConfirmStatus == STATUS_CANCEL) { - PrintTradeErrorOrStatusMessage(TRADESTATMSG_CANCELED); - sTradeMenuResourcesPtr->linkData[0] = 0xDDEE; - sTradeMenuResourcesPtr->linkData[1] = 0; - ScheduleLinkTaskWithDelay(5, 0); - sTradeMenuResourcesPtr->unk_7A = 0; - sTradeMenuResourcesPtr->unk_7B = 0; - sTradeMenuResourcesPtr->tradeMenuCBnum = 8; + // One of the players has decided not to confirm the trade, + // or the trade was not allowed. + PrintTradeMessage(MSG_CANCELED); + QueueLinkData(LINKCMD_PLAYER_CANCEL_TRADE, 0); + sTradeMenu->playerConfirmStatus = STATUS_NONE; + sTradeMenu->partnerConfirmStatus = STATUS_NONE; + sTradeMenu->callbackId = CB_HANDLE_TRADE_CANCELED; } } } -static void CB1_HandleBlockReceive(void) +static void CB1_UpdateLink(void) { u8 mpId = GetMultiplayerId(); u8 status; + if ((status = GetBlockReceivedStatus())) { if (mpId == 0) - Master_HandleBlockReceivedStatus(mpId, status); + Leader_ReadLinkBuffer(mpId, status); else - Slave_HandleBlockReceivedStatus(mpId, status); + Follower_ReadLinkBuffer(mpId, status); } if (mpId == 0) - Master_HandleCommunication(); + Leader_HandleCommunication(); } -static u8 TradeMenuGetNewCursorLocation(u8 oldPosition, u8 direction) +static u8 GetNewCursorPosition(u8 oldPosition, u8 direction) { int i; u8 newPosition = 0; - for (i = 0; i < 6; i++) + for (i = 0; i < PARTY_SIZE; i++) { - if (sTradeMenuResourcesPtr->tradeMenuOptionsActive[sCursorMoveDestinations[oldPosition][direction][i]] == TRUE) + if (sTradeMenu->optionsActive[sCursorMoveDestinations[oldPosition][direction][i]] == TRUE) { newPosition = sCursorMoveDestinations[oldPosition][direction][i]; break; @@ -1648,112 +1785,109 @@ static u8 TradeMenuGetNewCursorLocation(u8 oldPosition, u8 direction) } -static void TradeMenuMoveCursor(u8 *tradeMenuCursorPosition, u8 direction) +static void TradeMenuMoveCursor(u8 *cursorPosition, u8 direction) { - u8 newPosition = TradeMenuGetNewCursorLocation(*tradeMenuCursorPosition, direction); + u8 newPosition = GetNewCursorPosition(*cursorPosition, direction); - if (newPosition == 12) // CANCEL + if (newPosition == PARTY_SIZE * 2) // CANCEL { - StartSpriteAnim(&gSprites[sTradeMenuResourcesPtr->tradeMenuCursorSpriteIdx], 1); - gSprites[sTradeMenuResourcesPtr->tradeMenuCursorSpriteIdx].x = 224; - gSprites[sTradeMenuResourcesPtr->tradeMenuCursorSpriteIdx].y = 160; + StartSpriteAnim(&gSprites[sTradeMenu->cursorSpriteId], CURSOR_ANIM_ON_CANCEL); + gSprites[sTradeMenu->cursorSpriteId].x = DISPLAY_WIDTH - 16; + gSprites[sTradeMenu->cursorSpriteId].y = DISPLAY_HEIGHT; } else { - StartSpriteAnim(&gSprites[sTradeMenuResourcesPtr->tradeMenuCursorSpriteIdx], 0); - gSprites[sTradeMenuResourcesPtr->tradeMenuCursorSpriteIdx].x = sTradeMonSpriteCoords[newPosition][0] * 8 + 32; - gSprites[sTradeMenuResourcesPtr->tradeMenuCursorSpriteIdx].y = sTradeMonSpriteCoords[newPosition][1] * 8; + StartSpriteAnim(&gSprites[sTradeMenu->cursorSpriteId], CURSOR_ANIM_NORMAL); + gSprites[sTradeMenu->cursorSpriteId].x = sTradeMonSpriteCoords[newPosition][0] * 8 + 32; + gSprites[sTradeMenu->cursorSpriteId].y = sTradeMonSpriteCoords[newPosition][1] * 8; } - if (*tradeMenuCursorPosition != newPosition) - { + if (*cursorPosition != newPosition) PlaySE(SE_SELECT); - } - *tradeMenuCursorPosition = newPosition; + *cursorPosition = newPosition; } -static void CommunicatePlayerSelectedMonForTrade(void) +static void SetReadyToTrade(void) { - PrintTradeErrorOrStatusMessage(TRADESTATMSG_COMMSTANDBY); - sTradeMenuResourcesPtr->tradeMenuCBnum = 5; + PrintTradeMessage(MSG_STANDBY); + sTradeMenu->callbackId = CB_READY_WAIT; if (GetMultiplayerId() == 1) { - sTradeMenuResourcesPtr->linkData[0] = 0xAABB; - sTradeMenuResourcesPtr->linkData[1] = sTradeMenuResourcesPtr->tradeMenuCursorPosition; - SendBlock(BitmaskAllOtherLinkPlayers(), sTradeMenuResourcesPtr->linkData, 20); + // Communicate to the link leader that we're ready to trade + sTradeMenu->linkData[0] = LINKCMD_READY_TO_TRADE; + sTradeMenu->linkData[1] = sTradeMenu->cursorPosition; + SendBlock(BitmaskAllOtherLinkPlayers(), sTradeMenu->linkData, 20); } else { - sTradeMenuResourcesPtr->unk_78 = 1; + // We are the link leader, no communication necessary + sTradeMenu->playerSelectStatus = STATUS_READY; } } -static void TradeMenuCB_0(void) +static void CB_ProcessMenuInput(void) { int i; if (JOY_REPT(DPAD_UP)) - { - TradeMenuMoveCursor(&sTradeMenuResourcesPtr->tradeMenuCursorPosition, 0); - } + TradeMenuMoveCursor(&sTradeMenu->cursorPosition, DIR_UP); else if (JOY_REPT(DPAD_DOWN)) - { - TradeMenuMoveCursor(&sTradeMenuResourcesPtr->tradeMenuCursorPosition, 1); - } + TradeMenuMoveCursor(&sTradeMenu->cursorPosition, DIR_DOWN); else if (JOY_REPT(DPAD_LEFT)) - { - TradeMenuMoveCursor(&sTradeMenuResourcesPtr->tradeMenuCursorPosition, 2); - } + TradeMenuMoveCursor(&sTradeMenu->cursorPosition, DIR_LEFT); else if (JOY_REPT(DPAD_RIGHT)) - { - TradeMenuMoveCursor(&sTradeMenuResourcesPtr->tradeMenuCursorPosition, 3); - } + TradeMenuMoveCursor(&sTradeMenu->cursorPosition, DIR_RIGHT); if (JOY_NEW(A_BUTTON)) { PlaySE(SE_SELECT); - if (sTradeMenuResourcesPtr->tradeMenuCursorPosition < 6) // PlayerParty + if (sTradeMenu->cursorPosition < PARTY_SIZE) { + // Selected pokemon in player's party DrawTextBorderOuter(1, 1, 14); FillWindowPixelBuffer(1, PIXEL_FILL(1)); - UnionRoomAndTradeMenuPrintOptions(1, FONT_NORMAL_COPY_2, 16, 2, sMenuAction_SummaryTrade); + PrintMenuTable(1, FONT_NORMAL_COPY_2, 16, ARRAY_COUNT(sMenuAction_SummaryTrade), sMenuAction_SummaryTrade); Menu_InitCursor(1, FONT_NORMAL_COPY_2, 0, 0, 16, 2, 0); PutWindowTilemap(1); CopyWindowToVram(1, COPYWIN_FULL); - sTradeMenuResourcesPtr->tradeMenuCBnum = 1; + sTradeMenu->callbackId = CB_SELECTED_MON; } - else if (sTradeMenuResourcesPtr->tradeMenuCursorPosition < 12) + else if (sTradeMenu->cursorPosition < PARTY_SIZE * 2) { + // Selected pokemon in partner's party BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); - sTradeMenuResourcesPtr->tradeMenuCBnum = 2; + sTradeMenu->callbackId = CB_SHOW_MON_SUMMARY; } - else if (sTradeMenuResourcesPtr->tradeMenuCursorPosition == 12) + else if (sTradeMenu->cursorPosition == PARTY_SIZE * 2) { + // Selected Cancel CreateYesNoMenu(&sWindowTemplate_YesNo, FONT_NORMAL_COPY_2, 0, 2, 0x001, 14, 0); - sTradeMenuResourcesPtr->tradeMenuCBnum = 4; - RenderTextToVramViaBuffer(sTradeUITextPtrs[TRADEUITEXT_ASKCANCEL], (void *)OBJ_VRAM0 + sTradeMenuResourcesPtr->cursorStartTile * 32, 24); + sTradeMenu->callbackId = CB_CANCEL_TRADE_PROMPT; + DrawBottomRowText(sActionTexts[TEXT_CANCEL_TRADE], (void *)OBJ_VRAM0 + sTradeMenu->bottomTextTileStart * 32, 24); } } + + // This option is unavailable in Emerald if (JOY_NEW(R_BUTTON)) { for (i = 0; i < 10; i++) - sTradeMenuResourcesPtr->linkData[i] = i; - SendBlock(BitmaskAllOtherLinkPlayers(), sTradeMenuResourcesPtr->linkData, 20); + sTradeMenu->linkData[i] = i; + SendBlock(BitmaskAllOtherLinkPlayers(), sTradeMenu->linkData, 20); } } static void RedrawChooseAPokemonWindow(void) { PrintTradePartnerPartyNicknames(); - sTradeMenuResourcesPtr->tradeMenuCBnum = 0; - gSprites[sTradeMenuResourcesPtr->tradeMenuCursorSpriteIdx].invisible = FALSE; - RenderTextToVramViaBuffer(sTradeUITextPtrs[TRADEUITEXT_CHOOSE], (void *)OBJ_VRAM0 + sTradeMenuResourcesPtr->cursorStartTile * 32, 24); + sTradeMenu->callbackId = CB_MAIN_MENU; + gSprites[sTradeMenu->cursorSpriteId].invisible = FALSE; + DrawBottomRowText(sActionTexts[TEXT_CHOOSE_MON], (void *)OBJ_VRAM0 + sTradeMenu->bottomTextTileStart * 32, 24); } -static void TradeMenuCB_1(void) +static void CB_ProcessSelectedMonInput(void) { switch (Menu_ProcessInputNoWrapAround()) { @@ -1763,37 +1897,37 @@ static void TradeMenuCB_1(void) break; case MENU_NOTHING_CHOSEN: break; - case 0: // SUMMARY + case 0: // Summary BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); - sTradeMenuResourcesPtr->tradeMenuCBnum = 2; + sTradeMenu->callbackId = CB_SHOW_MON_SUMMARY; break; case 1: // Trade - switch (TestWhetherSelectedMonCanBeTraded(gPlayerParty, gPlayerPartyCount, sTradeMenuResourcesPtr->tradeMenuCursorPosition)) + switch (CanTradeSelectedMon(gPlayerParty, gPlayerPartyCount, sTradeMenu->cursorPosition)) { - case 0: // Can trade - CommunicatePlayerSelectedMonForTrade(); - gSprites[sTradeMenuResourcesPtr->tradeMenuCursorSpriteIdx].invisible = TRUE; + case CAN_TRADE_MON: + SetReadyToTrade(); + gSprites[sTradeMenu->cursorSpriteId].invisible = TRUE; break; - case 1: // Don't have enough alive mons - ScheduleLinkTaskWithDelay(3, 3); - sTradeMenuResourcesPtr->tradeMenuCBnum = 8; + case CANT_TRADE_LAST_MON: + QueueAction(QUEUE_DELAY_MSG, QUEUE_ONLY_MON2); + sTradeMenu->callbackId = CB_HANDLE_TRADE_CANCELED; break; - case 2: // Player lacks national dex - case 4: // Partner lacks national dex - ScheduleLinkTaskWithDelay(3, 6); - sTradeMenuResourcesPtr->tradeMenuCBnum = 8; + case CANT_TRADE_NATIONAL: + case CANT_TRADE_INVALID_MON: + QueueAction(QUEUE_DELAY_MSG, QUEUE_MON_CANT_BE_TRADED); + sTradeMenu->callbackId = CB_HANDLE_TRADE_CANCELED; break; - case 3: // Player lacks national dex (egg) - case 5: // Partner lacks national dex (egg) - ScheduleLinkTaskWithDelay(3, 7); - sTradeMenuResourcesPtr->tradeMenuCBnum = 8; + case CANT_TRADE_EGG_YET: + case CANT_TRADE_PARTNER_EGG_YET: + QueueAction(QUEUE_DELAY_MSG, QUEUE_EGG_CANT_BE_TRADED); + sTradeMenu->callbackId = CB_HANDLE_TRADE_CANCELED; break; } break; } } -static void TradeMenuCB_15(void) +static void CB_ChooseMonAfterButtonPress(void) { if (JOY_NEW(A_BUTTON) || JOY_NEW(B_BUTTON)) { @@ -1802,117 +1936,122 @@ static void TradeMenuCB_15(void) } } -static void TradeMenuCB_2(void) +static void CB_ShowTradeMonSummaryScreen(void) { if (!gPaletteFade.active) { - if (sTradeMenuResourcesPtr->tradeMenuCursorPosition < 6) - ShowPokemonSummaryScreen(gPlayerParty, sTradeMenuResourcesPtr->tradeMenuCursorPosition, sTradeMenuResourcesPtr->partyCounts[0] - 1, CB2_ReturnToTradeMenuFromSummary, PSS_MODE_TRADE); + if (sTradeMenu->cursorPosition < PARTY_SIZE) + ShowPokemonSummaryScreen(gPlayerParty, sTradeMenu->cursorPosition, sTradeMenu->partyCounts[0] - 1, CB2_ReturnToTradeMenuFromSummary, PSS_MODE_TRADE); else - ShowPokemonSummaryScreen(gEnemyParty, sTradeMenuResourcesPtr->tradeMenuCursorPosition - 6, sTradeMenuResourcesPtr->partyCounts[1] - 1, CB2_ReturnToTradeMenuFromSummary, PSS_MODE_TRADE); + ShowPokemonSummaryScreen(gEnemyParty, sTradeMenu->cursorPosition - PARTY_SIZE, sTradeMenu->partyCounts[1] - 1, CB2_ReturnToTradeMenuFromSummary, PSS_MODE_TRADE); FreeAllWindowBuffers(); } } -static u8 PlayerHasEnoughPokemonToTrade_HandleMewDeoxys(u8 *flags, u8 partyCount, u8 cursorPos) +static u8 CheckValidityOfTradeMons(u8 *aliveMons, u8 playerPartyCount, u8 cursorPos) { s32 i; - u16 species; - u8 count = 0; - for (i = 0; i < partyCount; i++) + u16 partnerSpecies; + u8 hasLiveMon = 0; + + // Make sure mon to be traded isn't player's last alive mon + for (i = 0; i < playerPartyCount; i++) { if (cursorPos != i) - count += flags[i]; + hasLiveMon += aliveMons[i]; } - species = GetMonData(&gEnemyParty[sTradeMenuResourcesPtr->otherPlayerCursorPosition % 6], MON_DATA_SPECIES); - if ((species == SPECIES_DEOXYS || species == SPECIES_MEW) && !GetMonData(&gEnemyParty[sTradeMenuResourcesPtr->otherPlayerCursorPosition % 6], MON_DATA_EVENT_LEGAL)) - return 2; - if (count != 0) - count = 1; - return count; + + // Partner cant trade illegitimate Deoxys or Mew + partnerSpecies = GetMonData(&gEnemyParty[sTradeMenu->partnerCursorPosition % PARTY_SIZE], MON_DATA_SPECIES); + if ((partnerSpecies == SPECIES_DEOXYS || partnerSpecies == SPECIES_MEW) + && !GetMonData(&gEnemyParty[sTradeMenu->partnerCursorPosition % PARTY_SIZE], MON_DATA_EVENT_LEGAL)) + return PARTNER_MON_INVALID; + + if (hasLiveMon != 0) + hasLiveMon = BOTH_MONS_VALID; + + return hasLiveMon; // PLAYER_MON_INVALID or BOTH_MONS_VALID } static void CommunicateWhetherMonCanBeTraded(void) { int i; - u8 arr[12]; + u8 aliveMons[PARTY_SIZE * 2]; - for (i = 0; i < sTradeMenuResourcesPtr->partyCounts[0]; i++) - { - arr[i] = sTradeMenuResourcesPtr->battleableFlags[0][i]; - } + for (i = 0; i < sTradeMenu->partyCounts[TRADE_PLAYER]; i++) + aliveMons[i] = sTradeMenu->isLiveMon[TRADE_PLAYER][i]; - switch (PlayerHasEnoughPokemonToTrade_HandleMewDeoxys(arr, sTradeMenuResourcesPtr->partyCounts[0], sTradeMenuResourcesPtr->tradeMenuCursorPosition)) + switch (CheckValidityOfTradeMons(aliveMons, sTradeMenu->partyCounts[0], sTradeMenu->cursorPosition)) { - case 0: - ScheduleLinkTaskWithDelay(3, 3); - sTradeMenuResourcesPtr->linkData[0] = 0xBBCC; - ScheduleLinkTaskWithDelay(180, 0); + case PLAYER_MON_INVALID: + QueueAction(QUEUE_DELAY_MSG, QUEUE_ONLY_MON2); + sTradeMenu->linkData[0] = LINKCMD_READY_CANCEL_TRADE; + QueueAction(180, QUEUE_SEND_DATA); break; - case 1: - ScheduleLinkTaskWithDelay(3, 1); - sTradeMenuResourcesPtr->linkData[0] = 0xBBBB; + case BOTH_MONS_VALID: + QueueAction(QUEUE_DELAY_MSG, QUEUE_STANDBY); + sTradeMenu->linkData[0] = LINKCMD_INIT_BLOCK; if (IsLinkTaskFinished()) - { - SendBlock(BitmaskAllOtherLinkPlayers(), sTradeMenuResourcesPtr->linkData, 20); - } + SendBlock(BitmaskAllOtherLinkPlayers(), sTradeMenu->linkData, 20); break; - case 2: - ScheduleLinkTaskWithDelay(3, 8); - sTradeMenuResourcesPtr->linkData[0] = 0xBBCC; - ScheduleLinkTaskWithDelay(180, 0); + case PARTNER_MON_INVALID: + QueueAction(QUEUE_DELAY_MSG, QUEUE_FRIENDS_MON_CANT_BE_TRADED); + sTradeMenu->linkData[0] = LINKCMD_READY_CANCEL_TRADE; + QueueAction(180, QUEUE_SEND_DATA); + break; + default: + // Both pokemon are valid to trade break; } } -static void TradeMenuCB_3(void) +static void CB_ProcessConfirmTradeInput(void) { switch (Menu_ProcessInputNoWrapClearOnChoose()) { - case 0: + case 0: // YES, Confirm selection CommunicateWhetherMonCanBeTraded(); - sTradeMenuResourcesPtr->tradeMenuCBnum = 100; + sTradeMenu->callbackId = CB_IDLE; PutWindowTilemap(17); break; - case 1: + case 1: // NO, Cancel Trade case MENU_B_PRESSED: - ScheduleLinkTaskWithDelay(3, 1); + QueueAction(QUEUE_DELAY_MSG, QUEUE_STANDBY); if (IsLinkTaskFinished()) { - sTradeMenuResourcesPtr->linkData[0] = 0xBBCC; - SendBlock(BitmaskAllOtherLinkPlayers(), sTradeMenuResourcesPtr->linkData, 20); + sTradeMenu->linkData[0] = LINKCMD_READY_CANCEL_TRADE; + SendBlock(BitmaskAllOtherLinkPlayers(), sTradeMenu->linkData, 20); } - sTradeMenuResourcesPtr->tradeMenuCBnum = 100; + sTradeMenu->callbackId = CB_IDLE; PutWindowTilemap(17); break; } } -static void CommitWindows(void) +// Only when choosing Yes to cancel, when No is chosen all are redrawn anyway +static void RestoreNicknamesCoveredByYesNo(void) { int i; - for (i = 0; i < sTradeMenuResourcesPtr->partyCounts[1] - 4; i++) + for (i = 0; i < sTradeMenu->partyCounts[1] - 4; i++) { - PutWindowTilemap(i + 12); - CopyWindowToVram(i + 12, COPYWIN_MAP); + PutWindowTilemap(i + PARTY_SIZE * 2); + CopyWindowToVram(i + PARTY_SIZE * 2, COPYWIN_MAP); } } -static void TradeMenuCB_4(void) +static void CB_ProcessCancelTradeInput(void) { switch (Menu_ProcessInputNoWrapClearOnChoose()) { - case 0: - PrintTradeErrorOrStatusMessage(TRADESTATMSG_WAITINGFORFRIEND); - sTradeMenuResourcesPtr->linkData[0] = 0xEEAA; - sTradeMenuResourcesPtr->linkData[1] = 0; - ScheduleLinkTaskWithDelay(5, 0); - gSprites[sTradeMenuResourcesPtr->tradeMenuCursorSpriteIdx].invisible = TRUE; - sTradeMenuResourcesPtr->tradeMenuCBnum = 100; - CommitWindows(); + case 0: // YES, Cancel + PrintTradeMessage(MSG_WAITING_FOR_FRIEND); + QueueLinkData(LINKCMD_REQUEST_CANCEL, 0); + gSprites[sTradeMenu->cursorSpriteId].invisible = TRUE; + sTradeMenu->callbackId = CB_IDLE; + RestoreNicknamesCoveredByYesNo(); break; - case 1: + case 1: // NO, Continue case MENU_B_PRESSED: PlaySE(SE_SELECT); RedrawChooseAPokemonWindow(); @@ -1920,39 +2059,39 @@ static void TradeMenuCB_4(void) } } -static void TradeMenuCB_6(void) +static void CB_SetSelectedMons(void) { if (GetMultiplayerId() == 0) { rbox_fill_rectangle(0); - SignalRedrawTradeMenus(sTradeMenuResourcesPtr->tradeMenuCursorPosition); - SignalRedrawTradeMenus(sTradeMenuResourcesPtr->otherPlayerCursorPosition); + SetSelectedMon(sTradeMenu->cursorPosition); + SetSelectedMon(sTradeMenu->partnerCursorPosition); } - sTradeMenuResourcesPtr->tradeMenuCBnum = 7; + sTradeMenu->callbackId = CB_PRINT_IS_THIS_OKAY; } -static void TradeMenuCB_7(void) +static void CB_PrintIsThisTradeOkay(void) { - if (sTradeMenuResourcesPtr->menuRedrawState[0] == 5 && sTradeMenuResourcesPtr->menuRedrawState[1] == 5) + if (sTradeMenu->drawSelectedMonState[TRADE_PLAYER] == DRAW_SELECTED_FINISH + && sTradeMenu->drawSelectedMonState[TRADE_PARTNER] == DRAW_SELECTED_FINISH) { PrintIsThisTradeOkay(); - sTradeMenuResourcesPtr->tradeMenuCBnum = 14; + sTradeMenu->callbackId = CB_INIT_CONFIRM_TRADE_PROMPT; } } -static void TradeMenuCB_14(void) +static void CB_InitConfirmTradePrompt(void) { - sTradeMenuResourcesPtr->loadUISpritesState++; - - if (sTradeMenuResourcesPtr->loadUISpritesState > 120) + sTradeMenu->timer++; + if (sTradeMenu->timer > 120) { CreateYesNoMenu(&sWindowTemplate_YesNo, FONT_NORMAL_COPY_2, 0, 2, 1, 14, 0); - sTradeMenuResourcesPtr->loadUISpritesState = 0; - sTradeMenuResourcesPtr->tradeMenuCBnum = 3; + sTradeMenu->timer = 0; + sTradeMenu->callbackId = CB_CONFIRM_TRADE_PROMPT; } } -static void TradeMenuCB_8(void) +static void CB_HandleTradeCanceled(void) { int i; @@ -1968,38 +2107,34 @@ static void TradeMenuCB_8(void) rbox_fill_rectangle(i + 14); } - RedrawPartyWindow(0); - RedrawPartyWindow(1); - sTradeMenuResourcesPtr->tradeMenuCBnum = 0; - gSprites[sTradeMenuResourcesPtr->tradeMenuCursorSpriteIdx].invisible = FALSE; + RedrawPartyWindow(TRADE_PLAYER); + RedrawPartyWindow(TRADE_PARTNER); + sTradeMenu->callbackId = CB_MAIN_MENU; + gSprites[sTradeMenu->cursorSpriteId].invisible = FALSE; } } -static void TradeMenuCB_11(void) +static void CB_InitExitCanceledTrade(void) { if (!gPaletteFade.active) { if (gWirelessCommType) - { SetLinkStandbyCallback(); - } else - { SetCloseLinkCallbackAndType(12); - } - sTradeMenuResourcesPtr->tradeMenuCBnum = 12; + sTradeMenu->callbackId = CB_EXIT_CANCELED_TRADE; } } -static void TradeMenuCB_12(void) +static void CB_ExitCanceledTrade(void) { if (gWirelessCommType) { if (IsLinkTaskFinished()) { - Free(sSpriteTextTileBuffer); - Free(sTradeMenuResourcesPtr); + Free(sMenuTextTileBuffer); + Free(sTradeMenu); FreeAllWindowBuffers(); DestroyWirelessStatusIndicatorSprite(); SetMainCallback2(CB2_ReturnToFieldFromMultiplayer); @@ -2009,167 +2144,187 @@ static void TradeMenuCB_12(void) { if (!gReceivedRemoteLinkPlayers) { - Free(sSpriteTextTileBuffer); - Free(sTradeMenuResourcesPtr); + Free(sMenuTextTileBuffer); + Free(sTradeMenu); FreeAllWindowBuffers(); SetMainCallback2(CB2_ReturnToFieldFromMultiplayer); } } } -static void TradeMenuCB_16(void) +static void CB_WaitToStartRfuTrade(void) { if (!Rfu_SetLinkRecovery(FALSE)) { SetLinkStandbyCallback(); - sTradeMenuResourcesPtr->tradeMenuCBnum = 13; + sTradeMenu->callbackId = CB_START_LINK_TRADE; } } static void RunTradeMenuCallback(void) { - switch (sTradeMenuResourcesPtr->tradeMenuCBnum) + switch (sTradeMenu->callbackId) { - case 0: - TradeMenuCB_0(); + case CB_MAIN_MENU: + CB_ProcessMenuInput(); break; - case 1: - TradeMenuCB_1(); + case CB_SELECTED_MON: + CB_ProcessSelectedMonInput(); break; - case 2: - TradeMenuCB_2(); + case CB_SHOW_MON_SUMMARY: + CB_ShowTradeMonSummaryScreen(); break; - case 3: - TradeMenuCB_3(); + case CB_CONFIRM_TRADE_PROMPT: + CB_ProcessConfirmTradeInput(); break; - case 4: - TradeMenuCB_4(); + case CB_CANCEL_TRADE_PROMPT: + CB_ProcessCancelTradeInput(); break; - case 5: + case CB_READY_WAIT: // nop break; - case 6: - TradeMenuCB_6(); + case CB_SET_SELECTED_MONS: + CB_SetSelectedMons(); break; - case 7: - TradeMenuCB_7(); + case CB_PRINT_IS_THIS_OKAY: + CB_PrintIsThisTradeOkay(); break; - case 8: - TradeMenuCB_8(); + case CB_HANDLE_TRADE_CANCELED: + CB_HandleTradeCanceled(); break; - case 9: - TradeMenuCB_9(); + case CB_FADE_TO_START_TRADE: + CB_FadeToStartTrade(); break; - case 10: - TradeMenuCB_10(); + case CB_WAIT_TO_START_TRADE: + CB_WaitToStartTrade(); break; - case 11: - TradeMenuCB_11(); + case CB_INIT_EXIT_CANCELED_TRADE: + CB_InitExitCanceledTrade(); break; - case 12: - TradeMenuCB_12(); + case CB_EXIT_CANCELED_TRADE: + CB_ExitCanceledTrade(); break; - case 13: - TradeMenuCB_13(); + case CB_START_LINK_TRADE: + CB_StartLinkTrade(); break; - case 14: - TradeMenuCB_14(); + case CB_INIT_CONFIRM_TRADE_PROMPT: + CB_InitConfirmTradePrompt(); break; - case 15: - TradeMenuCB_15(); + case CB_UNUSED_CLOSE_MSG: + CB_ChooseMonAfterButtonPress(); break; - case 16: - TradeMenuCB_16(); + case CB_WAIT_TO_START_RFU_TRADE: + CB_WaitToStartRfuTrade(); break; } + // CB_IDLE is nop } -static void SignalRedrawTradeMenus(u8 monIdx) +static void SetSelectedMon(u8 cursorPosition) { - u8 whichParty = monIdx / PARTY_SIZE; + // cursorPosition 0-5 are the player's mons, 6-11 are the partner's + u8 whichParty = cursorPosition / PARTY_SIZE; - if (sTradeMenuResourcesPtr->menuRedrawState[whichParty] == 0) + if (sTradeMenu->drawSelectedMonState[whichParty] == 0) { - sTradeMenuResourcesPtr->menuRedrawState[whichParty] = 1; - sTradeMenuResourcesPtr->menuRedrawCursorPos[whichParty] = monIdx; + // Start the animation to display just the selected + // pokemon in the middle of the screen + sTradeMenu->drawSelectedMonState[whichParty] = 1; + sTradeMenu->selectedMonIdx[whichParty] = cursorPosition; } } -static void HandleRedrawTradeMenuOnSide(u8 side) +static void DrawSelectedMonScreen(u8 whichParty) { s8 nameStringWidth; u8 nickname[20]; u8 movesString[56]; u8 i; u8 partyIdx; - u8 whichParty; - u8 monIdx = sTradeMenuResourcesPtr->menuRedrawCursorPos[side]; + u8 selectedMonParty; + u8 selectedMonIdx = sTradeMenu->selectedMonIdx[whichParty]; - whichParty = 1; - if (sTradeMenuResourcesPtr->menuRedrawCursorPos[side] < PARTY_SIZE) - whichParty = 0; - partyIdx = monIdx % PARTY_SIZE; + selectedMonParty = TRADE_PARTNER; + if (sTradeMenu->selectedMonIdx[whichParty] < PARTY_SIZE) + selectedMonParty = TRADE_PLAYER; + partyIdx = selectedMonIdx % PARTY_SIZE; nameStringWidth = 0; - switch (sTradeMenuResourcesPtr->menuRedrawState[side]) + switch (sTradeMenu->drawSelectedMonState[whichParty]) { + default: + // Idle while state is 0, and once it reaches the final state (DRAW_SELECTED_FINISH) + break; case 1: - for (i = 0; i < sTradeMenuResourcesPtr->partyCounts[side]; i++) - { - gSprites[sTradeMenuResourcesPtr->partyIcons[0][i + (whichParty * PARTY_SIZE)]].invisible = TRUE; - } + // Erase the rest of the party + for (i = 0; i < sTradeMenu->partyCounts[whichParty]; i++) + gSprites[sTradeMenu->partySpriteIds[selectedMonParty][i]].invisible = TRUE; + for (i = 0; i < PARTY_SIZE; i++) + ClearWindowTilemap(i + (whichParty * PARTY_SIZE + 2)); - for (i = 0; i < 6; i++) - { - ClearWindowTilemap(i + (side * 6 + 2)); - } + // Re-display the selected pokemon + gSprites[sTradeMenu->partySpriteIds[selectedMonParty][partyIdx]].invisible = FALSE; - gSprites[sTradeMenuResourcesPtr->partyIcons[0][partyIdx + (whichParty * PARTY_SIZE)]].invisible = FALSE; - gSprites[sTradeMenuResourcesPtr->partyIcons[0][partyIdx + (whichParty * PARTY_SIZE)]].data[0] = 20; - gSprites[sTradeMenuResourcesPtr->partyIcons[0][partyIdx + (whichParty * PARTY_SIZE)]].data[2] = (sTradeMonSpriteCoords[whichParty * PARTY_SIZE][0] + sTradeMonSpriteCoords[whichParty * PARTY_SIZE + 1][0]) / 2 * 8 + 14; - gSprites[sTradeMenuResourcesPtr->partyIcons[0][partyIdx + (whichParty * PARTY_SIZE)]].data[4] = (sTradeMonSpriteCoords[whichParty * PARTY_SIZE][1] * 8) - 12; - StoreSpriteCallbackInData6(&gSprites[sTradeMenuResourcesPtr->partyIcons[0][partyIdx + (whichParty * PARTY_SIZE)]], SpriteCB_MonIcon); - sTradeMenuResourcesPtr->menuRedrawState[side]++; - TradeMenuBouncePartySprites(&gSprites[sTradeMenuResourcesPtr->partyIcons[0][partyIdx + (whichParty * PARTY_SIZE)]]); - CopyToBgTilemapBufferRect_ChangePalette(1, sTradePartyBoxTilemap, side * 15, 0, 15, 17, 0); + // Move the selected pokemon to the center + gSprites[sTradeMenu->partySpriteIds[selectedMonParty][partyIdx]].data[0] = 20; + gSprites[sTradeMenu->partySpriteIds[selectedMonParty][partyIdx]].data[2] = (sTradeMonSpriteCoords[selectedMonParty * PARTY_SIZE][0] + + sTradeMonSpriteCoords[selectedMonParty * PARTY_SIZE + 1][0]) / 2 * 8 + 14; + gSprites[sTradeMenu->partySpriteIds[selectedMonParty][partyIdx]].data[4] = (sTradeMonSpriteCoords[selectedMonParty * PARTY_SIZE][1] * 8) - 12; + StoreSpriteCallbackInData6(&gSprites[sTradeMenu->partySpriteIds[selectedMonParty][partyIdx]], SpriteCB_MonIcon); + sTradeMenu->drawSelectedMonState[whichParty]++; + Trade_MoveSelectedMonToTarget(&gSprites[sTradeMenu->partySpriteIds[selectedMonParty][partyIdx]]); + + CopyToBgTilemapBufferRect_ChangePalette(1, sTradePartyBoxTilemap, whichParty * 15, 0, 15, 17, 0); CopyBgTilemapBufferToVram(1); CopyBgTilemapBufferToVram(0); - if (whichParty == 0) + if (selectedMonParty == TRADE_PLAYER) PrintTradePartnerPartyNicknames(); break; case 2: - if (gSprites[sTradeMenuResourcesPtr->partyIcons[0][partyIdx + (whichParty * PARTY_SIZE)]].callback == SpriteCB_MonIcon) - sTradeMenuResourcesPtr->menuRedrawState[side] = 3; + // Wait for the selected pokemon's sprite to move to the correct position + if (gSprites[sTradeMenu->partySpriteIds[selectedMonParty][partyIdx]].callback == SpriteCB_MonIcon) + sTradeMenu->drawSelectedMonState[whichParty] = 3; break; case 3: - CopyToBgTilemapBufferRect_ChangePalette(1, sTradeMovesBoxTilemap, whichParty * 15, 0, 15, 17, 0); + // Redisplay the bg box + CopyToBgTilemapBufferRect_ChangePalette(1, sTradeMovesBoxTilemap, selectedMonParty * 15, 0, 15, 17, 0); CopyBgTilemapBufferToVram(1); - gSprites[sTradeMenuResourcesPtr->partyIcons[0][partyIdx + (whichParty * PARTY_SIZE)]].x = (sTradeMonSpriteCoords[whichParty * PARTY_SIZE][0] + sTradeMonSpriteCoords[whichParty * PARTY_SIZE + 1][0]) / 2 * 8 + 14; - gSprites[sTradeMenuResourcesPtr->partyIcons[0][partyIdx + (whichParty * PARTY_SIZE)]].y = (sTradeMonSpriteCoords[whichParty * PARTY_SIZE][1] * 8) - 12; - gSprites[sTradeMenuResourcesPtr->partyIcons[0][partyIdx + (whichParty * PARTY_SIZE)]].x2 = 0; - gSprites[sTradeMenuResourcesPtr->partyIcons[0][partyIdx + (whichParty * PARTY_SIZE)]].y2 = 0; - nameStringWidth = GetNicknameStringWidthByPartyAndMonIdx(nickname, whichParty, partyIdx); - AddTextPrinterParameterized3((side * 2) + 14, FONT_SMALL, (80 - nameStringWidth) / 2, 4, sTextColor_PartyMonNickname, 0, nickname); - BuildMovesString(movesString, whichParty, partyIdx); - AddTextPrinterParameterized4((side * 2) + 15, FONT_NORMAL_COPY_1, 0, 0, 0, 0, sTextColor_PartyMonNickname, 0, movesString); - PutWindowTilemap((side * 2) + 14); - CopyWindowToVram((side * 2) + 14, COPYWIN_FULL); - PutWindowTilemap((side * 2) + 15); - CopyWindowToVram((side * 2) + 15, COPYWIN_FULL); - sTradeMenuResourcesPtr->menuRedrawState[side]++; + + // Finalize the selected pokemon's position + gSprites[sTradeMenu->partySpriteIds[selectedMonParty][partyIdx]].x = (sTradeMonSpriteCoords[selectedMonParty * PARTY_SIZE][0] + + sTradeMonSpriteCoords[selectedMonParty * PARTY_SIZE + 1][0]) / 2 * 8 + 14; + gSprites[sTradeMenu->partySpriteIds[selectedMonParty][partyIdx]].y = (sTradeMonSpriteCoords[selectedMonParty * PARTY_SIZE][1] * 8) - 12; + gSprites[sTradeMenu->partySpriteIds[selectedMonParty][partyIdx]].x2 = 0; + gSprites[sTradeMenu->partySpriteIds[selectedMonParty][partyIdx]].y2 = 0; + + // Print selected pokemon's name and moves + nameStringWidth = GetMonNicknameWidth(nickname, selectedMonParty, partyIdx); + AddTextPrinterParameterized3((whichParty * 2) + 14, FONT_SMALL, (80 - nameStringWidth) / 2, 4, sTextColor_PartyMonNickname, 0, nickname); + BufferMovesString(movesString, selectedMonParty, partyIdx); + AddTextPrinterParameterized4((whichParty * 2) + 15, FONT_NORMAL_COPY_1, 0, 0, 0, 0, sTextColor_PartyMonNickname, 0, movesString); + PutWindowTilemap((whichParty * 2) + 14); + CopyWindowToVram((whichParty * 2) + 14, COPYWIN_FULL); + PutWindowTilemap((whichParty * 2) + 15); + CopyWindowToVram((whichParty * 2) + 15, COPYWIN_FULL); + + sTradeMenu->drawSelectedMonState[whichParty]++; break; case 4: - PrintLevelAndGenderDirectlyOnVram(side, partyIdx, gUnknown_8262055[side][0] + 4, gUnknown_8262055[side][1] + 1, gUnknown_8262055[side][0], gUnknown_8262055[side][1]); - sTradeMenuResourcesPtr->menuRedrawState[side]++; + PrintLevelAndGender(whichParty, partyIdx, + sSelectedMonLevelGenderCoords[whichParty][0] + 4, + sSelectedMonLevelGenderCoords[whichParty][1] + 1, + sSelectedMonLevelGenderCoords[whichParty][0], + sSelectedMonLevelGenderCoords[whichParty][1]); + sTradeMenu->drawSelectedMonState[whichParty]++; break; } } -static u8 GetNicknameStringWidthByPartyAndMonIdx(u8 *dest, u8 whichParty, u8 partyIdx) +static u8 GetMonNicknameWidth(u8 *dest, u8 whichParty, u8 partyIdx) { u8 nickname[POKEMON_NAME_LENGTH]; - if (whichParty == 0) + if (whichParty == TRADE_PLAYER) GetMonData(&gPlayerParty[partyIdx], MON_DATA_NICKNAME, nickname); else GetMonData(&gEnemyParty[partyIdx], MON_DATA_NICKNAME, nickname); @@ -2177,23 +2332,19 @@ static u8 GetNicknameStringWidthByPartyAndMonIdx(u8 *dest, u8 whichParty, u8 par return GetStringWidth(FONT_SMALL, dest, GetFontAttribute(FONT_SMALL, FONTATTR_LETTER_SPACING)); } -static void BuildMovesString(u8 *movesString, u8 whichParty, u8 whichMon) +static void BufferMovesString(u8 *movesString, u8 whichParty, u8 partyIdx) { u16 moves[MAX_MON_MOVES]; u16 i; - if (!sTradeMenuResourcesPtr->eggFlags[whichParty][whichMon]) + if (!sTradeMenu->isEgg[whichParty][partyIdx]) { for (i = 0; i < MAX_MON_MOVES; i++) { - if (!whichParty) - { - moves[i] = GetMonData(&gPlayerParty[whichMon], i + MON_DATA_MOVE1, NULL); - } + if (whichParty == TRADE_PLAYER) + moves[i] = GetMonData(&gPlayerParty[partyIdx], i + MON_DATA_MOVE1, NULL); else - { - moves[i] = GetMonData(&gEnemyParty[whichMon], i + MON_DATA_MOVE1, NULL); - } + moves[i] = GetMonData(&gEnemyParty[partyIdx], i + MON_DATA_MOVE1, NULL); } StringCopy(movesString, sText_Dummy); @@ -2201,9 +2352,7 @@ static void BuildMovesString(u8 *movesString, u8 whichParty, u8 whichMon) for (i = 0; i < MAX_MON_MOVES; i++) { if (moves[i] != MOVE_NONE) - { StringAppend(movesString, gMoveNames[moves[i]]); - } StringAppend(movesString, sText_Newline); } @@ -2231,9 +2380,9 @@ static void PrintPartyNicknames(u8 whichParty) { u8 buff[20]; u8 nickname[30]; - struct Pokemon * party = whichParty == 0 ? gPlayerParty : gEnemyParty; + struct Pokemon * party = (whichParty == TRADE_PLAYER) ? gPlayerParty : gEnemyParty; u8 i; - for (i = 0; i < sTradeMenuResourcesPtr->partyCounts[whichParty]; i++) + for (i = 0; i < sTradeMenu->partyCounts[whichParty]; i++) { GetMonData(&party[i], MON_DATA_NICKNAME, buff); StringCopy_Nickname(nickname, buff); @@ -2241,41 +2390,41 @@ static void PrintPartyNicknames(u8 whichParty) } } -static void PrintLevelAndGenderDirectlyOnVram(u8 whichParty, u8 monIdx, u8 x, u8 y, u8 winLeft, u8 winTop) +static void PrintLevelAndGender(u8 whichParty, u8 monIdx, u8 x, u8 y, u8 winLeft, u8 winTop) { u8 level; - u32 tileNum; + u32 symbolTile; u8 gender; - u8 nickname[12]; + u8 nickname[POKEMON_NAME_LENGTH]; CopyToBgTilemapBufferRect_ChangePalette(1, gTradeMenuMonBox_Tilemap, winLeft, winTop, 6, 3, 0); CopyBgTilemapBufferToVram(1); - if (whichParty == 0) + if (whichParty == TRADE_PLAYER) level = GetMonData(&gPlayerParty[monIdx], MON_DATA_LEVEL, NULL); else level = GetMonData(&gEnemyParty[monIdx], MON_DATA_LEVEL, NULL); - if (sTradeMenuResourcesPtr->eggFlags[whichParty][monIdx] == 0) + if (!sTradeMenu->isEgg[whichParty][monIdx]) { if (level / 10 != 0) - sTradeMenuResourcesPtr->tilemapBuffer[x + (y * 32)] = (level / 10) + 0x60; + sTradeMenu->tilemapBuffer[x + (y * 32)] = (level / 10) + 0x60; - sTradeMenuResourcesPtr->tilemapBuffer[x + (y * 32) + 1] = (level % 10) + 0x70; + sTradeMenu->tilemapBuffer[x + (y * 32) + 1] = (level % 10) + 0x70; } else { - sTradeMenuResourcesPtr->tilemapBuffer[x + (y * 32) - 32] = sTradeMenuResourcesPtr->tilemapBuffer[x + (y * 32) - 33]; - sTradeMenuResourcesPtr->tilemapBuffer[x + (y * 32) - 31] = sTradeMenuResourcesPtr->tilemapBuffer[x + (y * 32) - 36] | 0x400; + sTradeMenu->tilemapBuffer[x + (y * 32) - 32] = sTradeMenu->tilemapBuffer[x + (y * 32) - 33]; + sTradeMenu->tilemapBuffer[x + (y * 32) - 31] = sTradeMenu->tilemapBuffer[x + (y * 32) - 36] | 0x400; } - if (sTradeMenuResourcesPtr->eggFlags[whichParty][monIdx]) + if (sTradeMenu->isEgg[whichParty][monIdx]) { - tileNum = 0x480; + symbolTile = 0x480; } else { - if (whichParty == 0) + if (whichParty == TRADE_PLAYER) { gender = GetMonGender(&gPlayerParty[monIdx]); GetMonData(&gPlayerParty[monIdx], MON_DATA_NICKNAME, nickname); @@ -2289,38 +2438,32 @@ static void PrintLevelAndGenderDirectlyOnVram(u8 whichParty, u8 monIdx, u8 x, u8 switch (gender) { case MON_MALE: - tileNum = !NameHasGenderSymbol(nickname, MON_MALE) ? 0x84 : 0x83; + symbolTile = !NameHasGenderSymbol(nickname, MON_MALE) ? 0x84 : 0x83; break; case MON_FEMALE: - tileNum = !NameHasGenderSymbol(nickname, MON_FEMALE) ? 0x85 : 0x83; + symbolTile = !NameHasGenderSymbol(nickname, MON_FEMALE) ? 0x85 : 0x83; break; default: - tileNum = 0x83; + symbolTile = 0x83; break; } } - sTradeMenuResourcesPtr->tilemapBuffer[(y - 1) * 32 + x + 1] = tileNum; + sTradeMenu->tilemapBuffer[(y - 1) * 32 + x + 1] = symbolTile; } -static void PrintPartyLevelsAndGendersDirectlyOnVram(u8 whichParty) +static void PrintPartyLevelsAndGenders(u8 whichParty) { s32 i; - for (i = 0; i < sTradeMenuResourcesPtr->partyCounts[whichParty]; i++) + for (i = 0; i < sTradeMenu->partyCounts[whichParty]; i++) { - const u8 (*drawCoords)[2]; - const u8 (*winCoords)[2]; - u32 r0 = 3 * whichParty; - const u8 (*drawCoords_p)[2][2] = sTradeMenuGenderLevelPrintCoords; - drawCoords = drawCoords_p[r0]; - winCoords = sTradeMenuGenderLevelWindowCoords[r0]; - - PrintLevelAndGenderDirectlyOnVram( + s32 j = i + PARTY_SIZE * whichParty; + PrintLevelAndGender( whichParty, i, - drawCoords[i][0], - drawCoords[i][1], - winCoords[i][0], - winCoords[i][1] + sTradeMonLevelCoords[j][0], + sTradeMonLevelCoords[j][1], + sTradeMonBoxCoords[j][0], + sTradeMonBoxCoords[j][1] ); } } @@ -2329,13 +2472,13 @@ static void ShowTradePartyMonIcons(u8 whichParty) { int i; - for (i = 0; i < sTradeMenuResourcesPtr->partyCounts[whichParty]; i++) + for (i = 0; i < sTradeMenu->partyCounts[whichParty]; i++) { - gSprites[sTradeMenuResourcesPtr->partyIcons[whichParty][i]].invisible = FALSE; - gSprites[sTradeMenuResourcesPtr->partyIcons[whichParty][i]].x = sTradeMonSpriteCoords[(whichParty * PARTY_SIZE) + i][0] * 8 + 14; - gSprites[sTradeMenuResourcesPtr->partyIcons[whichParty][i]].y = sTradeMonSpriteCoords[(whichParty * PARTY_SIZE) + i][1] * 8 - 12; - gSprites[sTradeMenuResourcesPtr->partyIcons[whichParty][i]].x2 = 0; - gSprites[sTradeMenuResourcesPtr->partyIcons[whichParty][i]].y2 = 0; + gSprites[sTradeMenu->partySpriteIds[whichParty][i]].invisible = FALSE; + gSprites[sTradeMenu->partySpriteIds[whichParty][i]].x = sTradeMonSpriteCoords[(whichParty * PARTY_SIZE) + i][0] * 8 + 14; + gSprites[sTradeMenu->partySpriteIds[whichParty][i]].y = sTradeMonSpriteCoords[(whichParty * PARTY_SIZE) + i][1] * 8 - 12; + gSprites[sTradeMenu->partySpriteIds[whichParty][i]].x2 = 0; + gSprites[sTradeMenu->partySpriteIds[whichParty][i]].y2 = 0; } } @@ -2345,369 +2488,371 @@ static void PrintTradePartnerPartyNicknames(void) PrintPartyNicknames(1); } +// Returning to the party selection screen from the "is this trade ok?" screen static void RedrawPartyWindow(u8 whichParty) { CopyToBgTilemapBufferRect_ChangePalette(1, sTradePartyBoxTilemap, 15 * whichParty, 0, 15, 17, 0); CopyBgTilemapBufferToVram(1); - PrintPartyLevelsAndGendersDirectlyOnVram(whichParty); + PrintPartyLevelsAndGenders(whichParty); PrintPartyNicknames(whichParty); ShowTradePartyMonIcons(whichParty); - RenderTextToVramViaBuffer(sTradeUITextPtrs[TRADEUITEXT_CHOOSE], (void *)OBJ_VRAM0 + 32 * sTradeMenuResourcesPtr->cursorStartTile, 24); - sTradeMenuResourcesPtr->menuRedrawState[whichParty] = 0; + DrawBottomRowText(sActionTexts[TEXT_CHOOSE_MON], (void *)OBJ_VRAM0 + 32 * sTradeMenu->bottomTextTileStart, 24); + sTradeMenu->drawSelectedMonState[whichParty] = 0; } -static void TradeMenuAction_Summary(u8 taskId) +static void Task_DrawSelectionSummary(u8 taskId) { FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 30, 20); CopyBgTilemapBufferToVram(0); } -static void TradeMenuAction_Trade(u8 taskId) +static void Task_DrawSelectionTrade(u8 taskId) { FillBgTilemapBufferRect_Palette0(0, 0, 0, 0, 30, 20); CopyBgTilemapBufferToVram(0); } -static void ScheduleLinkTaskWithDelay(u16 delay, u8 kind) +static void QueueAction(u16 delay, u8 actionId) { int i; - for (i = 0; i < 4; i++) + for (i = 0; i < (int)ARRAY_COUNT(sTradeMenu->queuedActions); i++) { - if (!sTradeMenuResourcesPtr->cron[i].active) + // Find first available spot + if (!sTradeMenu->queuedActions[i].active) { - sTradeMenuResourcesPtr->cron[i].delay = delay; - sTradeMenuResourcesPtr->cron[i].kind = kind; - sTradeMenuResourcesPtr->cron[i].active = TRUE; + sTradeMenu->queuedActions[i].delay = delay; + sTradeMenu->queuedActions[i].actionId = actionId; + sTradeMenu->queuedActions[i].active = TRUE; break; } } } -static void RunScheduledLinkTasks(void) +static void DoQueuedActions(void) { int i; - for (i = 0; i < 4; i++) + for (i = 0; i < (int)ARRAY_COUNT(sTradeMenu->queuedActions); i++) { - if (sTradeMenuResourcesPtr->cron[i].active) + if (sTradeMenu->queuedActions[i].active) { - if (sTradeMenuResourcesPtr->cron[i].delay != 0) + if (sTradeMenu->queuedActions[i].delay != 0) { - sTradeMenuResourcesPtr->cron[i].delay--; + sTradeMenu->queuedActions[i].delay--; } else { - switch (sTradeMenuResourcesPtr->cron[i].kind) + switch (sTradeMenu->queuedActions[i].actionId) { - case 0: - SendBlock(BitmaskAllOtherLinkPlayers(), sTradeMenuResourcesPtr->linkData, 20); + case QUEUE_SEND_DATA: + SendBlock(BitmaskAllOtherLinkPlayers(), sTradeMenu->linkData, 20); break; - case 1: - PrintTradeErrorOrStatusMessage(TRADESTATMSG_COMMSTANDBY); + case QUEUE_STANDBY: + PrintTradeMessage(MSG_STANDBY); break; - case 2: - PrintTradeErrorOrStatusMessage(TRADESTATMSG_ONLYMON); + case QUEUE_ONLY_MON1: + PrintTradeMessage(MSG_ONLY_MON1); break; - case 3: - case 4: - case 5: - PrintTradeErrorOrStatusMessage(TRADESTATMSG_ONLYMON2); + case QUEUE_ONLY_MON2: + case QUEUE_UNUSED1: + case QUEUE_UNUSED2: + PrintTradeMessage(MSG_ONLY_MON2); break; - case 6: - PrintTradeErrorOrStatusMessage(TRADESTATMSG_YOURMONCANTBETRADED); + case QUEUE_MON_CANT_BE_TRADED: + PrintTradeMessage(MSG_MON_CANT_BE_TRADED); break; - case 7: - PrintTradeErrorOrStatusMessage(TRADESTATMSG_EGGCANTBETRADED); + case QUEUE_EGG_CANT_BE_TRADED: + PrintTradeMessage(MSG_EGG_CANT_BE_TRADED); break; - case 8: - PrintTradeErrorOrStatusMessage(TRADESTATMSG_PARTNERMONCANTBETRADED); + case QUEUE_FRIENDS_MON_CANT_BE_TRADED: + PrintTradeMessage(MSG_FRIENDS_MON_CANT_BE_TRADED); break; } - sTradeMenuResourcesPtr->cron[i].active = FALSE; + sTradeMenu->queuedActions[i].active = FALSE; } } } } -static void PrintTradeErrorOrStatusMessage(u8 idx) +static void PrintTradeMessage(u8 messageId) { FillWindowPixelBuffer(0, PIXEL_FILL(1)); - AddTextPrinterParameterized(0, FONT_NORMAL_COPY_2, sTradeErrorOrStatusMessagePtrs[idx], 0, 2, 0xFF, NULL); + AddTextPrinterParameterized(0, FONT_NORMAL_COPY_2, sMessages[messageId], 0, 2, TEXT_SKIP_DRAW, NULL); DrawTextBorderOuter(0, 0x014, 12); PutWindowTilemap(0); CopyWindowToVram(0, COPYWIN_FULL); } -static bool8 LoadUISprites(void) +static bool8 LoadUISpriteGfx(void) { struct SpriteSheet sheet; - if (sTradeMenuResourcesPtr->loadUISpritesState < 14) + if (sTradeMenu->timer < NUM_MENU_TEXT_SPRITES) { - sheet.data = sSpriteTextTilePtrs[sTradeMenuResourcesPtr->loadUISpritesState]; + sheet.data = sMenuTextTileBuffers[sTradeMenu->timer]; sheet.size = 0x100; - sheet.tag = 200 + sTradeMenuResourcesPtr->loadUISpritesState; + sheet.tag = GFXTAG_MENU_TEXT + sTradeMenu->timer; } - switch (sTradeMenuResourcesPtr->loadUISpritesState) + switch (sTradeMenu->timer) { - case 0 ... 7: + case GFXTAG_PLAYER_NAME_L: + case GFXTAG_PLAYER_NAME_M: + case GFXTAG_PLAYER_NAME_R: + case GFXTAG_PARTNER_NAME_L: + case GFXTAG_PARTNER_NAME_M: + case GFXTAG_PARTNER_NAME_R: + case GFXTAG_CANCEL_L: + case GFXTAG_CANCEL_R: LoadSpriteSheet(&sheet); - sTradeMenuResourcesPtr->loadUISpritesState++; + sTradeMenu->timer++; break; - case 8: - sTradeMenuResourcesPtr->cursorStartTile = LoadSpriteSheet(&sheet); - sTradeMenuResourcesPtr->loadUISpritesState++; + case GFXTAG_CHOOSE_PKMN_L: + sTradeMenu->bottomTextTileStart = LoadSpriteSheet(&sheet); + sTradeMenu->timer++; break; - case 9 ... 13: + case GFXTAG_CHOOSE_PKMN_M: + case GFXTAG_CHOOSE_PKMN_R: + case GFXTAG_CHOOSE_PKMN_EMPTY_1: + case GFXTAG_CHOOSE_PKMN_EMPTY_2: + case GFXTAG_CHOOSE_PKMN_EMPTY_3: LoadSpriteSheet(&sheet); - sTradeMenuResourcesPtr->loadUISpritesState++; + sTradeMenu->timer++; break; - case 14: - LoadSpritePalette(&sSpritePalette_Text); - sTradeMenuResourcesPtr->loadUISpritesState++; + case NUM_MENU_TEXT_SPRITES: + LoadSpritePalette(&sSpritePalette_MenuText); + sTradeMenu->timer++; break; - case 15: - LoadSpritePalette(&sTradeButtons_SpritePal); - sTradeMenuResourcesPtr->loadUISpritesState++; + case NUM_MENU_TEXT_SPRITES + 1: + LoadSpritePalette(&sCursor_SpritePalette); + sTradeMenu->timer++; break; - case 16: - LoadSpriteSheet(&sTradeButtons_SpriteSheet); - sTradeMenuResourcesPtr->loadUISpritesState++; + case NUM_MENU_TEXT_SPRITES + 2: + LoadSpriteSheet(&sCursor_SpriteSheet); + sTradeMenu->timer++; break; - case 17: - sTradeMenuResourcesPtr->loadUISpritesState = 0; + case NUM_MENU_TEXT_SPRITES + 3: + sTradeMenu->timer = 0; return TRUE; } return FALSE; } -static void RenderTextToVramViaBuffer(const u8 *name, u8 *dest, u8 unused) +static void DrawBottomRowText(const u8 *name, u8 *dest, u8 unused) { DrawTextWindowAndBufferTiles(name, dest, 0, 0, gDecompressionBuffer, 6); } -static void ComputePartyTradeableFlags(u8 who) +static void ComputePartyTradeableFlags(u8 whichParty) { int i; - switch (who) + switch (whichParty) { - case 0: - for (i = 0; i < sTradeMenuResourcesPtr->partyCounts[who]; i++) + case TRADE_PLAYER: + for (i = 0; i < sTradeMenu->partyCounts[whichParty]; i++) { if (GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG) == TRUE) { - sTradeMenuResourcesPtr->battleableFlags[who][i] = FALSE; - sTradeMenuResourcesPtr->eggFlags[who][i] = TRUE; + sTradeMenu->isLiveMon[whichParty][i] = FALSE; + sTradeMenu->isEgg[whichParty][i] = TRUE; } else if (GetMonData(&gPlayerParty[i], MON_DATA_HP) == 0) { - sTradeMenuResourcesPtr->battleableFlags[who][i] = FALSE; - sTradeMenuResourcesPtr->eggFlags[who][i] = FALSE; + sTradeMenu->isLiveMon[whichParty][i] = FALSE; + sTradeMenu->isEgg[whichParty][i] = FALSE; } else { - sTradeMenuResourcesPtr->battleableFlags[who][i] = TRUE; - sTradeMenuResourcesPtr->eggFlags[who][i] = FALSE; + sTradeMenu->isLiveMon[whichParty][i] = TRUE; + sTradeMenu->isEgg[whichParty][i] = FALSE; } } break; - case 1: - for (i = 0; i < sTradeMenuResourcesPtr->partyCounts[who]; i++) + case TRADE_PARTNER: + for (i = 0; i < sTradeMenu->partyCounts[whichParty]; i++) { if (GetMonData(&gEnemyParty[i], MON_DATA_IS_EGG) == TRUE) { - sTradeMenuResourcesPtr->battleableFlags[who][i] = FALSE; - sTradeMenuResourcesPtr->eggFlags[who][i] = TRUE; + sTradeMenu->isLiveMon[whichParty][i] = FALSE; + sTradeMenu->isEgg[whichParty][i] = TRUE; } else if (GetMonData(&gEnemyParty[i], MON_DATA_HP) == 0) { - sTradeMenuResourcesPtr->battleableFlags[who][i] = FALSE; - sTradeMenuResourcesPtr->eggFlags[who][i] = FALSE; + sTradeMenu->isLiveMon[whichParty][i] = FALSE; + sTradeMenu->isEgg[whichParty][i] = FALSE; } else { - sTradeMenuResourcesPtr->battleableFlags[who][i] = TRUE; - sTradeMenuResourcesPtr->eggFlags[who][i] = FALSE; + sTradeMenu->isLiveMon[whichParty][i] = TRUE; + sTradeMenu->isEgg[whichParty][i] = FALSE; } } break; } } -static void ComputePartyHPBarLevels(u8 who) +static void ComputePartyHPBarLevels(u8 whichParty) { u16 i, curHp, maxHp; - switch (who) + switch (whichParty) { - case 0: - for (i = 0; i < sTradeMenuResourcesPtr->partyCounts[0]; i++) + case TRADE_PLAYER: + for (i = 0; i < sTradeMenu->partyCounts[TRADE_PLAYER]; i++) { curHp = GetMonData(&gPlayerParty[i], MON_DATA_HP); maxHp = GetMonData(&gPlayerParty[i], MON_DATA_MAX_HP); - sTradeMenuResourcesPtr->hpBarLevels[0][i] = GetHPBarLevel(curHp, maxHp); + sTradeMenu->hpBarLevels[TRADE_PLAYER][i] = GetHPBarLevel(curHp, maxHp); } break; - case 1: - for (i = 0; i < sTradeMenuResourcesPtr->partyCounts[1]; i++) + case TRADE_PARTNER: + for (i = 0; i < sTradeMenu->partyCounts[TRADE_PARTNER]; i++) { curHp = GetMonData(&gEnemyParty[i], MON_DATA_HP); maxHp = GetMonData(&gEnemyParty[i], MON_DATA_MAX_HP); - sTradeMenuResourcesPtr->hpBarLevels[1][i] = GetHPBarLevel(curHp, maxHp); + sTradeMenu->hpBarLevels[TRADE_PARTNER][i] = GetHPBarLevel(curHp, maxHp); } break; } } -static void SetMonIconsAnimByHPBarLevel(void) +static void SetTradePartyHPBarSprites(void) { int i, j; for (i = 0; i < 2; i++) { - for (j = 0; j < sTradeMenuResourcesPtr->partyCounts[i]; j++) - { - SetPartyHPBarSprite(&gSprites[sTradeMenuResourcesPtr->partyIcons[i][j]], 4 - sTradeMenuResourcesPtr->hpBarLevels[i][j]); - } + for (j = 0; j < sTradeMenu->partyCounts[i]; j++) + SetPartyHPBarSprite(&gSprites[sTradeMenu->partySpriteIds[i][j]], 4 - sTradeMenu->hpBarLevels[i][j]); } } -static void CopyGiftRibbonsToSav1(void) +static void SaveTradeGiftRibbons(void) { int i; - for (i = 0; i < 11; i++) + for (i = 0; i < (int)ARRAY_COUNT(sTradeMenu->giftRibbons); i++) { - if (gSaveBlock1Ptr->giftRibbons[i] == 0 && sTradeMenuResourcesPtr->giftRibbons[i] != 0) - gSaveBlock1Ptr->giftRibbons[i] = sTradeMenuResourcesPtr->giftRibbons[i]; + if (gSaveBlock1Ptr->giftRibbons[i] == 0 && sTradeMenu->giftRibbons[i] != 0) + gSaveBlock1Ptr->giftRibbons[i] = sTradeMenu->giftRibbons[i]; } } -static u32 TestWhetherSelectedMonCanBeTraded(struct Pokemon * party, int partyCount, int cursorPos) +static u32 CanTradeSelectedMon(struct Pokemon * playerParty, int partyCount, int monIdx) { - int i, sum; - struct LinkPlayer * player; - int species[6]; - int species2[6]; + int i, numMonsLeft; + struct LinkPlayer * partner; + int species[PARTY_SIZE]; + int species2[PARTY_SIZE]; for (i = 0; i < partyCount; i++) { - species2[i] = GetMonData(&party[i], MON_DATA_SPECIES2); - species[i] = GetMonData(&party[i], MON_DATA_SPECIES); + species2[i] = GetMonData(&playerParty[i], MON_DATA_SPECIES2); + species[i] = GetMonData(&playerParty[i], MON_DATA_SPECIES); } + // Cant trade Eggs or non-Kanto mons if player doesn't have National Dex if (!IsNationalPokedexEnabled()) { - if (species2[cursorPos] > SPECIES_MEW) - { - return 2; - } - if (species2[cursorPos] == SPECIES_NONE) - { - return 3; - } + // See comment below + #ifdef BUGFIX + if (species2[monIdx] == SPECIES_EGG) + return CANT_TRADE_EGG_YET; + #endif + + if (species2[monIdx] > KANTO_SPECIES_END) + return CANT_TRADE_NATIONAL; + + // This is meant to be SPECIES_EGG. There are obviously no circumstances + // where you're allowed to trade SPECIES_NONE, so it wouldn't make sense to + // only check this if the National Dex is missing. SPECIES_EGG will accidentally + // be handled instead by the conditional above. Both of these problems are fixed in Emerald. + #ifndef BUGFIX + if (species2[monIdx] == SPECIES_NONE) + return CANT_TRADE_EGG_YET; + #endif } - player = &gLinkPlayers[GetMultiplayerId() ^ 1]; - if ((player->version & 0xFF) != VERSION_RUBY && - (player->version & 0xFF) != VERSION_SAPPHIRE) + partner = &gLinkPlayers[GetMultiplayerId() ^ 1]; + if ((partner->version & 0xFF) != VERSION_RUBY && + (partner->version & 0xFF) != VERSION_SAPPHIRE) { - if ((player->progressFlagsCopy & 0xF) == 0) + // Does partner not have National Dex + if (!(partner->progressFlagsCopy & 0xF)) { - if (species2[cursorPos] == SPECIES_EGG) - { - return 5; - } + if (species2[monIdx] == SPECIES_EGG) + return CANT_TRADE_PARTNER_EGG_YET; - if (species2[cursorPos] > SPECIES_MEW) - { - return 4; - } + if (species2[monIdx] > KANTO_SPECIES_END) + return CANT_TRADE_INVALID_MON; } } - if (species[cursorPos] == SPECIES_DEOXYS || species[cursorPos] == SPECIES_MEW) + if (species[monIdx] == SPECIES_DEOXYS || species[monIdx] == SPECIES_MEW) { - if (!GetMonData(&party[cursorPos], MON_DATA_EVENT_LEGAL)) - { - return 4; - } + if (!GetMonData(&playerParty[monIdx], MON_DATA_EVENT_LEGAL)) + return CANT_TRADE_INVALID_MON; } + // Make Eggs not count for numMonsLeft for (i = 0; i < partyCount; i++) { if (species2[i] == SPECIES_EGG) - { species2[i] = SPECIES_NONE; - } } - for (sum = 0, i = 0; i < partyCount; i++) + // Count alive mons in party, excluding selected trade mon + for (numMonsLeft = 0, i = 0; i < partyCount; i++) { - if (i != cursorPos) - { - sum += species2[i]; - } + if (i != monIdx) + numMonsLeft += species2[i]; } - if (sum != 0) - { - return 0; - } + if (numMonsLeft != 0) + return CAN_TRADE_MON; else - { - return 1; - } + return CANT_TRADE_LAST_MON; } -s32 Trade_CalcLinkPlayerCompatibilityParam(void) +s32 GetGameProgressForLinkTrade(void) { - s32 val; + s32 versionId; // 0: FRLG, 1: RS, 2: Emerald (or anything else) u16 version; if (gReceivedRemoteLinkPlayers) { - val = 0; + versionId = 0; version = (gLinkPlayers[GetMultiplayerId() ^ 1].version & 0xFF); if (version == VERSION_FIRE_RED || version == VERSION_LEAF_GREEN) - { - // this value could actually be anything 0 or less - val = 0; - } + versionId = 0; else if (version == VERSION_RUBY || version == VERSION_SAPPHIRE) - { - val = 1; - } + versionId = 1; else - { - val = 2; - } + versionId = 2; - if (val > 0) + // If trading with RSE, both players must have progessed the story enough + if (versionId > 0) { + // Has player finished the Sevii Islands if (gLinkPlayers[GetMultiplayerId()].progressFlagsCopy & 0xF0) { - if (val == 2) + if (versionId == 2) { + // Is RSE partner champion if (gLinkPlayers[GetMultiplayerId() ^ 1].progressFlagsCopy & 0xF0) - { - return 0; - } + return TRADE_BOTH_PLAYERS_READY; else - { - return 2; - } + return TRADE_PARTNER_NOT_READY; } } else { - return 1; + return TRADE_PLAYER_NOT_READY; } } } - return 0; + return TRADE_BOTH_PLAYERS_READY; } static bool32 IsDeoxysOrMewUntradable(u16 species, bool8 isEventLegal) @@ -2720,109 +2865,90 @@ static bool32 IsDeoxysOrMewUntradable(u16 species, bool8 isEventLegal) return FALSE; } -int GetUnionRoomTradeMessageId(struct RfuGameCompatibilityData playerSub, struct RfuGameCompatibilityData partnerSub, u16 species1, u16 species2, u8 type, u16 species3, u8 isEventLegal) +int GetUnionRoomTradeMessageId(struct RfuGameCompatibilityData player, struct RfuGameCompatibilityData partner, u16 playerSpecies2, u16 partnerSpecies, u8 requestedType, u16 playerSpecies, bool8 isEventLegal) { - u8 playerHasNationalDex = playerSub.hasNationalDex; - u8 playerIsChampion = playerSub.isChampion; - u8 partnerHasNationalDex = partnerSub.hasNationalDex; - u8 partnerIsChampion = partnerSub.isChampion; - u8 partnerVersion = partnerSub.version; + bool8 playerHasNationalDex = player.hasNationalDex; + bool8 playerCanLinkNationally = player.canLinkNationally; + bool8 partnerHasNationalDex = partner.hasNationalDex; + bool8 partnerCanLinkNationally = partner.canLinkNationally; + u8 partnerVersion = partner.version; bool8 isNotFRLG; if (partnerVersion == VERSION_FIRE_RED || partnerVersion == VERSION_LEAF_GREEN) - { isNotFRLG = FALSE; - } else - { isNotFRLG = TRUE; - } + + // If partner is not using FRLG, both players must have progressed the story + // to a certain point (becoming champion in RSE, finishing the Sevii islands in FRLG) if (isNotFRLG) { - if (!playerIsChampion) - { - return 8; - } - else if (!partnerIsChampion) - { - return 9; - } + if (!playerCanLinkNationally) + return UR_TRADE_MSG_CANT_TRADE_WITH_PARTNER_1; + else if (!partnerCanLinkNationally) + return UR_TRADE_MSG_CANT_TRADE_WITH_PARTNER_2; } - if (IsDeoxysOrMewUntradable(species3, isEventLegal)) - { - return 4; - } + // Cannot trade illegitimate Deoxys/Mew + if (IsDeoxysOrMewUntradable(playerSpecies, isEventLegal)) + return UR_TRADE_MSG_MON_CANT_BE_TRADED_2; - if (species2 == SPECIES_EGG) + if (partnerSpecies == SPECIES_EGG) { - if (species1 != species2) - { - return 2; - } + // If partner is trading an Egg then the player must also be trading an Egg + if (playerSpecies2 != partnerSpecies) + return UR_TRADE_MSG_NOT_EGG; } else { - if (gBaseStats[species1].type1 != type && gBaseStats[species1].type2 != type) - { - return 1; - } + // Player's Pokémon must be of the type the partner requested + if (gBaseStats[playerSpecies2].type1 != requestedType + && gBaseStats[playerSpecies2].type2 != requestedType) + return UR_TRADE_MSG_NOT_MON_PARTNER_WANTS; } - if (species1 == SPECIES_EGG && species1 != species2) - { - return 3; - } + // If the player is trading an Egg then the partner must also be trading an Egg + // Odd that this wasn't checked earlier, as by this point we know either the partner doesn't have an Egg or that both do. + if (playerSpecies2 == SPECIES_EGG && playerSpecies2 != partnerSpecies) + return UR_TRADE_MSG_MON_CANT_BE_TRADED_1; + // If the player doesn't have the National Dex then Eggs and non-Kanto Pokémon can't be traded if (!playerHasNationalDex) { - if (species1 == SPECIES_EGG) - { - return 6; - } + if (playerSpecies2 == SPECIES_EGG) + return UR_TRADE_MSG_EGG_CANT_BE_TRADED; - if (species1 > SPECIES_MEW) - { - return 4; - } + if (playerSpecies2 > KANTO_SPECIES_END) + return UR_TRADE_MSG_MON_CANT_BE_TRADED_2; - if (species2 > SPECIES_MEW) - { - return 5; - } + if (partnerSpecies > KANTO_SPECIES_END) + return UR_TRADE_MSG_PARTNERS_MON_CANT_BE_TRADED; } - if (!partnerHasNationalDex && species1 > SPECIES_MEW) - { - return 7; - } + // If the partner doesn't have the National Dex then the player's offer has to be a Kanto Pokémon + if (!partnerHasNationalDex && playerSpecies2 > KANTO_SPECIES_END) + return UR_TRADE_MSG_PARTNER_CANT_ACCEPT_MON; - return 0; + // Trade is allowed + return UR_TRADE_MSG_NONE; } -int CanRegisterMonForTradingBoard(struct RfuGameCompatibilityData playerSub, u16 species2, u16 species, u8 isEventLegal) +int CanRegisterMonForTradingBoard(struct RfuGameCompatibilityData player, u16 species2, u16 species, bool8 isEventLegal) { - u8 canTradeEggAndNational = playerSub.hasNationalDex; + bool8 hasNationalDex = player.hasNationalDex; if (IsDeoxysOrMewUntradable(species, isEventLegal)) - { - return 1; - } + return CANT_REGISTER_MON; - if (canTradeEggAndNational) - { - return 0; - } + if (hasNationalDex) + return CAN_REGISTER_MON; + // Eggs can only be traded if the player has the National Dex if (species2 == SPECIES_EGG) - { - return 2; - } + return CANT_REGISTER_EGG; - if (species2 > SPECIES_MEW && species2 != SPECIES_EGG) - { - return 1; - } + if (species2 > KANTO_SPECIES_END && species2 != SPECIES_EGG) + return CANT_REGISTER_MON; - return 0; + return CAN_REGISTER_MON; } diff --git a/src/trade_scene.c b/src/trade_scene.c index d4788f21e..ad79c7287 100644 --- a/src/trade_scene.c +++ b/src/trade_scene.c @@ -34,15 +34,24 @@ #include "constants/region_map_sections.h" #include "constants/moves.h" -#define TAG_GLOW1_TILES 5550 -#define TAG_GLOW_PAL 5551 -#define TAG_GLOW2_TILES 5552 -#define TAG_UNUSED_5553 5553 -#define TAG_CABLE_END_TILES 5554 -#define TAG_GBA_PAL 5555 -#define TAG_GBA_SCREEN_TILES 5556 -#define TAG_BALL_TILES 5557 -#define TAG_BALL_PAL 5558 +// Values for signaling to/from the link partner +enum { + STATUS_NONE, + STATUS_READY, + STATUS_CANCEL, +}; + +enum { + GFXTAG_LINK_MON_GLOW = 5550, + PALTAG_LINK_MON, + GFXTAG_LINK_MON_SHADOW, + TAG_UNUSED, + GFXTAG_CABLE_END, + PALTAG_GBA, + GFXTAG_GBA_SCREEN, + GFXTAG_POKEBALL, + PALTAG_POKEBALL, +}; struct InGameTrade { /*0x00*/ u8 nickname[POKEMON_NAME_LENGTH + 1]; @@ -50,7 +59,7 @@ struct InGameTrade { /*0x0E*/ u8 ivs[NUM_STATS]; /*0x14*/ u8 abilityNum; /*0x18*/ u32 otId; - /*0x1C*/ u8 conditions[5]; + /*0x1C*/ u8 conditions[CONTEST_CATEGORIES_COUNT]; /*0x24*/ u32 personality; /*0x28*/ u16 heldItem; /*0x2A*/ u8 mailNum; @@ -60,31 +69,31 @@ struct InGameTrade { /*0x38*/ u16 requestedSpecies; }; -struct TradeAnimationResources { - /*0x00*/ struct Pokemon mon; +struct { + /*0x00*/ struct Pokemon tempMon; // Used as a temp variable when swapping Pokémon /*0x64*/ u32 timer; /*0x68*/ u32 monPersonalities[2]; /*0x70*/ u8 filler_70[2]; - /*0x72*/ u8 tradeStatus1; - /*0x73*/ u8 tradeStatus2; + /*0x72*/ u8 playerFinishStatus; + /*0x73*/ u8 partnerFinishStatus; /*0x74*/ u16 linkData[10]; /*0x88*/ u8 linkTimeoutCheck1; /*0x89*/ u8 linkTimeoutCheck2; /*0x8A*/ u16 linkTimeoutTimer; - /*0x8C*/ u16 unk_8C; - /*0x8E*/ u8 pokePicSpriteIdxs[2]; - /*0x90*/ u8 tradeGlow1SpriteId; - /*0x91*/ u8 gbaScreenSpriteId; - /*0x92*/ u8 linkCableEndSpriteId; + /*0x8C*/ u16 neverRead_8C; + /*0x8E*/ u8 monSpriteIds[2]; + /*0x90*/ u8 connectionSpriteId1; // Multi-purpose sprite ids used during the transfer sequence + /*0x91*/ u8 connectionSpriteId2; + /*0x92*/ u8 cableEndSpriteId; /*0x93*/ u8 scheduleLinkTransfer; /*0x94*/ u16 state; /*0x96*/ u8 filler_96[0xD2 - 0x96]; - /*0xD2*/ u8 pokeballSpriteId; - /*0xD3*/ u8 pokeballSpriteId2; + /*0xD2*/ u8 releasePokeballSpriteId; + /*0xD3*/ u8 bouncingPokeballSpriteId; /*0xD4*/ u16 bg2texX; /*0xD6*/ u16 bg2texY; - /*0xD8*/ u16 unk_D8; - /*0xDA*/ u16 unk_DA; + /*0xD8*/ u16 neverRead_D8; + /*0xDA*/ u16 neverRead_DA; /*0xDC*/ u16 bg2srcX; /*0xDE*/ u16 bg2srcY; /*0xE0*/ s16 bg1vofs; @@ -95,7 +104,7 @@ struct TradeAnimationResources { /*0xEA*/ u16 bg2Zoom; /*0xEC*/ u16 bg2alpha; /*0xEE*/ bool8 isLinkTrade; - /*0xF0*/ u16 tradeSpecies[2]; + /*0xF0*/ u16 monSpecies[2]; /*0xF4*/ u16 cachedMapMusic; /*0xF6*/ u8 unk_F6; /*0xF8*/ struct QuestLogEvent_Traded questLogData; @@ -106,159 +115,157 @@ struct TradeAnimationResources { /*0x10A*/ u8 win0top; /*0x10B*/ u8 win0right; /*0x10C*/ u8 win0bottom; -}; +} static EWRAM_DATA * sTradeAnim = NULL; -static EWRAM_DATA struct TradeAnimationResources * sTradeData = NULL; - -static void SpriteCB_TradeGlowCable(struct Sprite *sprite); -static void SpriteCB_TradeGlowWireless(struct Sprite *sprite); -static void SpriteCB_TradeGlowCore(struct Sprite *sprite); -static void SpriteCB_GameLinkCableEnd_Outbound(struct Sprite *sprite); -static void SpriteCB_GameLinkCableEnd_Inbound(struct Sprite *sprite); -static void SpriteCB_TradeGBAScreen(struct Sprite *sprite); +static void SpriteCB_LinkMonGlow(struct Sprite *sprite); +static void SpriteCB_LinkMonGlowWireless(struct Sprite *sprite); +static void SpriteCB_LinkMonShadow(struct Sprite *sprite); +static void SpriteCB_CableEndSending(struct Sprite *sprite); +static void SpriteCB_CableEndReceiving(struct Sprite *sprite); +static void SpriteCB_GbaScreen(struct Sprite *sprite); static void TradeAnimInit_LoadGfx(void); -static void CB2_RunTradeAnim_InGameTrade(void); +static void CB2_InGameTrade(void); static void SetTradeSequenceBgGpuRegs(u8 idx); static void LoadTradeGbaSpriteGfx(void); static void TradeBufferOTnameAndNicknames(void); static u8 DoTradeAnim(void); static u8 DoTradeAnim_Cable(void); static u8 DoTradeAnim_Wireless(void); -static void SpriteCB_TradePokeball_Default(struct Sprite *sprite); -static void SpriteCB_TradePokeball_Outbound(struct Sprite *sprite); -static void SpriteCB_TradePokeball_Outbound2(struct Sprite *sprite); -static void SpriteCB_TradePokeball_Inbound(struct Sprite *sprite); +static void SpriteCB_BouncingPokeball(struct Sprite *sprite); +static void SpriteCB_BouncingPokeballDepart(struct Sprite *sprite); +static void SpriteCB_BouncingPokeballDepartEnd(struct Sprite *sprite); +static void SpriteCB_BouncingPokeballArrive(struct Sprite *sprite); static void BufferInGameTradeMonName(void); static void GetInGameTradeMail(struct Mail * mail, const struct InGameTrade * inGameTrade); -static void CB2_RunTradeAnim_LinkTrade(void); -static void CB2_WaitAndAckTradeComplete(void); -static void CB2_HandleTradeEnded(void); -static void LinkTrade_TearDownAssets(void); -static void Task_WaitFadeAndStartInGameTradeAnim(u8 taskId); +static void CB2_UpdateLinkTrade(void); +static void CB2_WaitTradeComplete(void); +static void CB2_SaveAndEndTrade(void); +static void CB2_FreeTradeAnim(void); +static void Task_InGameTrade(u8 taskId); static void CheckPartnersMonForRibbons(void); static void Task_AnimateWirelessSignal(u8 taskId); static void Task_OpenCenterWhiteColumn(u8 taskId); static void Task_CloseCenterWhiteColumn(u8 taskId); -static const u16 sTradeBallPalette[] = INCBIN_U16("graphics/trade/ball.gbapal"); -static const u8 sTradeBallTiles[] = INCBIN_U8("graphics/trade/ball.4bpp"); -static const u8 sPokeballSymbolTiles[] = INCBIN_U8("graphics/trade/pokeball_symbol.8bpp"); -static const u16 sCableCloseupMap[] = INCBIN_U16("graphics/trade/cable_closeup_map.bin"); -static const u16 sPokeballSymbolMap[] = INCBIN_U16("graphics/trade/pokeball_symbol_map.bin"); -static const u16 sUnref_083308C0[] = INCBIN_U16("graphics/trade/unknown_3308C0.gbapal"); -static const u16 sTradeGbaPal[] = INCBIN_U16("graphics/trade/gba.gbapal"); -static const u16 sShadowPalette[] = INCBIN_U16("graphics/trade/shadow.gbapal"); -static const u16 sBlackPalette[] = INCBIN_U16("graphics/trade/black.gbapal"); -static const u16 sTradeGlowPal[] = INCBIN_U16("graphics/trade/misc.gbapal"); -static const u8 sTradeGlow1Tiles[] = INCBIN_U8("graphics/trade/glow1.4bpp"); -static const u8 sTradeGlow2Tiles[] = INCBIN_U8("graphics/trade/glow2.4bpp"); -static const u8 sTradeCableEndTiles[] = INCBIN_U8("graphics/trade/cable_end.4bpp"); -static const u8 sTradeGBAScreenTiles[] = INCBIN_U8("graphics/trade/gba_screen.4bpp"); -const u16 gTradeOrHatchMonShadowTilemap[] = INCBIN_U16("graphics/trade/shadow_map.bin"); -static const u8 sGbaAffineTiles[] = INCBIN_U8("graphics/trade/gba_affine.8bpp"); -static const u8 sFiller_08335760[64] = {}; -static const u8 sGbaAffineMapCable[] = INCBIN_U8("graphics/trade/gba_affine_map_cable.bin"); -static const u8 sGbaAffineMapWireless[] = INCBIN_U8("graphics/trade/gba_affine_map_wireless.bin"); -static const u16 sGbaMapWireless[] = INCBIN_U16("graphics/trade/gba_map_wireless.bin"); -static const u16 sGbaMapCable[] = INCBIN_U16("graphics/trade/gba_map_cable.bin"); -static const u32 sWirelessCloseupMap[] = INCBIN_U32("graphics/trade/unknown_3379A0.bin.lz"); +static const u16 sPokeball_Pal[] = INCBIN_U16("graphics/trade/pokeball.gbapal"); +static const u8 sPokeball_Gfx[] = INCBIN_U8("graphics/trade/pokeball.4bpp"); +static const u8 sPokeballSymbol_Gfx[] = INCBIN_U8("graphics/trade/pokeball_symbol.8bpp"); // Unused +static const u16 sCableCloseup_Map[] = INCBIN_U16("graphics/trade/cable_closeup_map.bin"); +static const u16 sPokeballSymbol_Map[] = INCBIN_U16("graphics/trade/pokeball_symbol_map.bin"); +static const u16 sUnusedPal1[] = INCBIN_U16("graphics/trade/unused1.gbapal"); +static const u16 sGba_Pal[] = INCBIN_U16("graphics/trade/gba.gbapal"); +static const u16 sShadowPalette[] = INCBIN_U16("graphics/trade/shadow.gbapal"); +static const u16 sBlackPalette[] = INCBIN_U16("graphics/trade/black.gbapal"); +static const u16 sLinkMon_Pal[] = INCBIN_U16("graphics/trade/link_mon.gbapal"); +static const u8 sLinkMonGlow_Gfx[] = INCBIN_U8("graphics/trade/link_mon_glow.4bpp"); +static const u8 sLinkMonShadow_Gfx[] = INCBIN_U8("graphics/trade/link_mon_shadow.4bpp"); +static const u8 sCableEnd_Gfx[] = INCBIN_U8("graphics/trade/cable_end.4bpp"); +static const u8 sGbaScreen_Gfx[] = INCBIN_U8("graphics/trade/gba_screen.4bpp"); +const u16 gTradeOrHatchMonShadowTilemap[] = INCBIN_U16("graphics/trade/shadow_map.bin"); +static const u8 sGbaAffine_Gfx[] = INCBIN_U8("graphics/trade/gba_affine.8bpp"); +static const u8 sEmptyGfx[64] = {}; +static const u8 sGbaAffineMapCable[] = INCBIN_U8("graphics/trade/gba_affine_map_cable.bin"); +static const u8 sGbaAffineMapWireless[] = INCBIN_U8("graphics/trade/gba_affine_map_wireless.bin"); +static const u16 sGbaMapWireless[] = INCBIN_U16("graphics/trade/gba_map_wireless.bin"); +static const u16 sGbaMapCable[] = INCBIN_U16("graphics/trade/gba_map_cable.bin"); +static const u32 sWirelessCloseup_Map[] = INCBIN_U32("graphics/trade/wireless_signal_closeup.bin.lz"); static const u16 sWirelessSignalAnimPals_Outbound[] = INCBIN_U16("graphics/trade/wireless_signal_send.gbapal"); -static const u16 sWirelessSignalAnimPals_Inbound[] = INCBIN_U16("graphics/trade/wireless_signal_receive.gbapal"); -static const u16 sWirelessSignalAnimPals_Off[] = INCBIN_U16("graphics/trade/black.gbapal"); -static const u32 sWirelessSignal4bpp[] = INCBIN_U32("graphics/trade/wireless_signal.4bpp.lz"); -static const u32 sWirelessSignalTilemap[] = INCBIN_U32("graphics/trade/wireless_signal.bin.lz"); +static const u16 sWirelessSignalAnimPals_Inbound[] = INCBIN_U16("graphics/trade/wireless_signal_receive.gbapal"); +static const u16 sWirelessSignalAnimPals_Off[] = INCBIN_U16("graphics/trade/black.gbapal"); +static const u32 sWirelessSignal4bpp[] = INCBIN_U32("graphics/trade/wireless_signal.4bpp.lz"); +static const u32 sWirelessSignalTilemap[] = INCBIN_U32("graphics/trade/wireless_signal.bin.lz"); -static const struct OamData gOamData_826CD00 = { +static const struct OamData sOamData_Pokeball = { .affineMode = ST_OAM_AFFINE_NORMAL, .shape = SPRITE_SHAPE(16x16), .size = SPRITE_SIZE(16x16) }; -static const union AnimCmd gAnimCmd_826CD08[] = { - ANIMCMD_FRAME(0x00, 3), - ANIMCMD_FRAME(0x04, 3), - ANIMCMD_FRAME(0x08, 3), - ANIMCMD_FRAME(0x0c, 3), - ANIMCMD_FRAME(0x10, 3), - ANIMCMD_FRAME(0x14, 3), - ANIMCMD_FRAME(0x18, 3), - ANIMCMD_FRAME(0x1c, 3), - ANIMCMD_FRAME(0x20, 3), - ANIMCMD_FRAME(0x24, 3), - ANIMCMD_FRAME(0x28, 3), - ANIMCMD_FRAME(0x2c, 3), +static const union AnimCmd sAnim_Pokeball_SpinOnce[] = { + ANIMCMD_FRAME( 0, 3), + ANIMCMD_FRAME( 4, 3), + ANIMCMD_FRAME( 8, 3), + ANIMCMD_FRAME(12, 3), + ANIMCMD_FRAME(16, 3), + ANIMCMD_FRAME(20, 3), + ANIMCMD_FRAME(24, 3), + ANIMCMD_FRAME(28, 3), + ANIMCMD_FRAME(32, 3), + ANIMCMD_FRAME(36, 3), + ANIMCMD_FRAME(40, 3), + ANIMCMD_FRAME(44, 3), ANIMCMD_LOOP(1), - ANIMCMD_FRAME(0x00, 3), + ANIMCMD_FRAME( 0, 3), ANIMCMD_END }; -static const union AnimCmd gAnimCmd_826CD44[] = { - ANIMCMD_FRAME(0x00, 3), - ANIMCMD_FRAME(0x04, 3), - ANIMCMD_FRAME(0x08, 3), - ANIMCMD_FRAME(0x0c, 3), - ANIMCMD_FRAME(0x10, 3), - ANIMCMD_FRAME(0x14, 3), - ANIMCMD_FRAME(0x18, 3), - ANIMCMD_FRAME(0x1c, 3), - ANIMCMD_FRAME(0x20, 3), - ANIMCMD_FRAME(0x24, 3), - ANIMCMD_FRAME(0x28, 3), - ANIMCMD_FRAME(0x2c, 3), +static const union AnimCmd sAnim_Pokeball_SpinTwice[] = { + ANIMCMD_FRAME( 0, 3), + ANIMCMD_FRAME( 4, 3), + ANIMCMD_FRAME( 8, 3), + ANIMCMD_FRAME(12, 3), + ANIMCMD_FRAME(16, 3), + ANIMCMD_FRAME(20, 3), + ANIMCMD_FRAME(24, 3), + ANIMCMD_FRAME(28, 3), + ANIMCMD_FRAME(32, 3), + ANIMCMD_FRAME(36, 3), + ANIMCMD_FRAME(40, 3), + ANIMCMD_FRAME(44, 3), ANIMCMD_LOOP(2), - ANIMCMD_FRAME(0x00, 3), + ANIMCMD_FRAME( 0, 3), ANIMCMD_END }; -static const union AnimCmd *const gSpriteAnimTable_826CD80[] = { - gAnimCmd_826CD08, - gAnimCmd_826CD44 +static const union AnimCmd *const sAnims_Pokeball[] = { + sAnim_Pokeball_SpinOnce, + sAnim_Pokeball_SpinTwice }; -static const union AffineAnimCmd gAffineAnimCmd_826CD88[] = { +static const union AffineAnimCmd sAffineAnim_Pokeball_Normal[] = { AFFINEANIMCMD_FRAME(0, 0, 0, 1), AFFINEANIMCMD_END }; -static const union AffineAnimCmd gAffineAnimCmd_826CD98[] = { +static const union AffineAnimCmd sAffineAnim_Pokeball_Squish[] = { AFFINEANIMCMD_FRAME(-8, 0, 0, 20), AFFINEANIMCMD_END }; -static const union AffineAnimCmd gAffineAnimCmd_826CDA8[] = { +static const union AffineAnimCmd sAffineAnim_Pokeball_Unsquish[] = { AFFINEANIMCMD_FRAME(96, 256, 0, 0), AFFINEANIMCMD_FRAME(0, 0, 0, 5), AFFINEANIMCMD_FRAME(8, 0, 0, 20), AFFINEANIMCMD_END }; -static const union AffineAnimCmd *const gSpriteAffineAnimTable_826CDC8[] = { - gAffineAnimCmd_826CD88, - gAffineAnimCmd_826CD98, - gAffineAnimCmd_826CDA8 +static const union AffineAnimCmd *const sAffineAnims_Pokeball[] = { + sAffineAnim_Pokeball_Normal, + sAffineAnim_Pokeball_Squish, + sAffineAnim_Pokeball_Unsquish }; -static const struct SpriteSheet sTradeBallSpriteSheet = { - sTradeBallTiles, - 0x600, - TAG_BALL_TILES +static const struct SpriteSheet sPokeBallSpriteSheet = { + .data = sPokeball_Gfx, + .size = sizeof(sPokeball_Gfx), + .tag = GFXTAG_POKEBALL }; static const struct SpritePalette sTradeBallSpritePal = { - sTradeBallPalette, - TAG_BALL_PAL + .data = sPokeball_Pal, + .tag = PALTAG_POKEBALL }; -static const struct SpriteTemplate sTradePokeballSpriteTemplate = { - .tileTag = TAG_BALL_TILES, - .paletteTag = TAG_BALL_PAL, - .oam = &gOamData_826CD00, - .anims = gSpriteAnimTable_826CD80, - .affineAnims = gSpriteAffineAnimTable_826CDC8, - .callback = SpriteCB_TradePokeball_Default +static const struct SpriteTemplate sSpriteTemplate_Pokeball = { + .tileTag = GFXTAG_POKEBALL, + .paletteTag = PALTAG_POKEBALL, + .oam = &sOamData_Pokeball, + .anims = sAnims_Pokeball, + .affineAnims = sAffineAnims_Pokeball, + .callback = SpriteCB_BouncingPokeball }; -static const struct OamData gOamData_826CDFC = { +static const struct OamData sOamData_LinkMonGlow = { .affineMode = ST_OAM_AFFINE_NORMAL, .objMode = ST_OAM_OBJ_BLEND, .shape = SPRITE_SHAPE(32x32), @@ -266,179 +273,184 @@ static const struct OamData gOamData_826CDFC = { .priority = 1 }; -static const union AnimCmd gAnimCmd_826CE04[] = { - ANIMCMD_FRAME(0, 5, .hFlip = TRUE, .vFlip = TRUE), +static const union AnimCmd sAnim_LinkMonGlow[] = { + ANIMCMD_FRAME(0, 5, .hFlip = TRUE, .vFlip = TRUE), // ? The graphic is a perfect circle, no need to flip ANIMCMD_END }; -static const union AnimCmd *const gSpriteAnimTable_826CE0C[] = { - gAnimCmd_826CE04 +static const union AnimCmd *const sAnims_LinkMonGlow[] = { + sAnim_LinkMonGlow }; -static const union AffineAnimCmd gAffineAnimCmd_826CE10[] = { +static const union AffineAnimCmd sAffineAnim_LinkMonGlow[] = { AFFINEANIMCMD_FRAME(-10, -10, 0, 5), AFFINEANIMCMD_FRAME( 10, 10, 0, 5), AFFINEANIMCMD_JUMP(0) }; -static const union AffineAnimCmd *const gSpriteAffineAnimTable_826CE28[] = { - gAffineAnimCmd_826CE10 +static const union AffineAnimCmd *const sAffineAnims_LinkMonGlow[] = { + sAffineAnim_LinkMonGlow }; -static const struct SpriteSheet sTradeGlow1SpriteSheet = { - sTradeGlow1Tiles, - 0x200, - TAG_GLOW1_TILES +static const struct SpriteSheet sSpriteSheet_LinkMonGlow = { + .data = sLinkMonGlow_Gfx, + .size = sizeof(sLinkMonGlow_Gfx), + .tag = GFXTAG_LINK_MON_GLOW }; -static const struct SpritePalette sTradeGlowSpritePal = { - sTradeGlowPal, - TAG_GLOW_PAL +static const struct SpritePalette sSpritePalette_LinkMon = { + .data = sLinkMon_Pal, + .tag = PALTAG_LINK_MON }; -static const struct SpritePalette sTradeGbaSpritePal = { - sTradeGbaPal, - TAG_GBA_PAL +static const struct SpritePalette sSpritePalette_Gba = { + .data = sGba_Pal, + .tag = PALTAG_GBA }; -static const struct SpriteTemplate sTradeGlow1SpriteTemplate = { - .tileTag = TAG_GLOW1_TILES, - .paletteTag = TAG_GLOW_PAL, - .oam = &gOamData_826CDFC, - .anims = gSpriteAnimTable_826CE0C, - .affineAnims = gSpriteAffineAnimTable_826CE28, - .callback = SpriteCB_TradeGlowCable +static const struct SpriteTemplate sSpriteTemplate_LinkMonGlow = { + .tileTag = GFXTAG_LINK_MON_GLOW, + .paletteTag = PALTAG_LINK_MON, + .oam = &sOamData_LinkMonGlow, + .anims = sAnims_LinkMonGlow, + .affineAnims = sAffineAnims_LinkMonGlow, + .callback = SpriteCB_LinkMonGlow }; -static const struct OamData gOamData_826CE5C = { +static const struct OamData sOamData_LinkMonShadow = { .shape = SPRITE_SHAPE(16x32), .size = SPRITE_SIZE(16x32), .priority = 1 }; -static const union AnimCmd gAnimCmd_826CE64[] = { +static const union AnimCmd sAnim_LinkMonShadow_Big[] = { ANIMCMD_FRAME(0, 5, .hFlip = TRUE, .vFlip = TRUE), ANIMCMD_END }; -static const union AnimCmd gAnimCmd_826CE6C[] = { +static const union AnimCmd sAnim_LinkMonShadow_Small[] = { ANIMCMD_FRAME(8, 5, .hFlip = TRUE, .vFlip = TRUE), ANIMCMD_END }; -static const union AnimCmd *const gSpriteAnimTable_826CE74[] = { - gAnimCmd_826CE64, - gAnimCmd_826CE6C +enum { + ANIM_LINKMON_BIG, + ANIM_LINKMON_SMALL, }; -static const struct SpriteSheet sTradeGlow2SpriteSheet = { - sTradeGlow2Tiles, - 0x300, - TAG_GLOW2_TILES +static const union AnimCmd *const sAnims_LinkMonShadow[] = { + [ANIM_LINKMON_BIG] = sAnim_LinkMonShadow_Big, + [ANIM_LINKMON_SMALL] = sAnim_LinkMonShadow_Small, }; -static const struct SpriteTemplate sGlowBallSpriteTemplate = { - .tileTag = TAG_GLOW2_TILES, - .paletteTag = TAG_GLOW_PAL, - .oam = &gOamData_826CE5C, - .anims = gSpriteAnimTable_826CE74, +static const struct SpriteSheet sSpriteSheet_LinkMonShadow = { + .data = sLinkMonShadow_Gfx, + .size = 0x300, + .tag = GFXTAG_LINK_MON_SHADOW +}; + +static const struct SpriteTemplate sSpriteTemplate_LinkMonShadow = { + .tileTag = GFXTAG_LINK_MON_SHADOW, + .paletteTag = PALTAG_LINK_MON, + .oam = &sOamData_LinkMonShadow, + .anims = sAnims_LinkMonShadow, .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCB_TradeGlowCore + .callback = SpriteCB_LinkMonShadow }; -static const struct OamData gOamData_826CE9C = { +static const struct OamData sOamData_CableEnd = { .shape = SPRITE_SHAPE(16x32), .size = SPRITE_SIZE(16x32), .priority = 1 }; -static const union AnimCmd gAnimCmd_826CEA4[] = { +static const union AnimCmd sAnim_CableEnd[] = { ANIMCMD_FRAME(0, 10), ANIMCMD_END }; -static const union AnimCmd *const gSpriteAnimTable_826CEAC[] = { - gAnimCmd_826CEA4 +static const union AnimCmd *const sAnims_CableEnd[] = { + sAnim_CableEnd }; -static const struct SpriteSheet sTradeCableEndSpriteSheet = { - sTradeCableEndTiles, - 0x100, - TAG_CABLE_END_TILES +static const struct SpriteSheet sSpriteSheet_CableEnd = { + .data = sCableEnd_Gfx, + .size = 0x100, + .tag = GFXTAG_CABLE_END }; -static const struct SpriteTemplate sGameLinkCableEndSpriteTemplate = { - .tileTag = TAG_CABLE_END_TILES, - .paletteTag = TAG_GBA_PAL, - .oam = &gOamData_826CE9C, - .anims = gSpriteAnimTable_826CEAC, +static const struct SpriteTemplate sSpriteTemplate_CableEnd = { + .tileTag = GFXTAG_CABLE_END, + .paletteTag = PALTAG_GBA, + .oam = &sOamData_CableEnd, + .anims = sAnims_CableEnd, .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCB_GameLinkCableEnd_Outbound + .callback = SpriteCB_CableEndSending }; -static const struct OamData gOamData_826CED0 = { +static const struct OamData sOamData_GbaScreen = { .shape = SPRITE_SHAPE(64x32), .size = SPRITE_SIZE(64x32), .priority = 1 }; -static const union AnimCmd gAnimCmd_826CED8[] = { - ANIMCMD_FRAME(0x00, 2, .hFlip = TRUE, .vFlip = TRUE), - ANIMCMD_FRAME(0x20, 2, .hFlip = TRUE, .vFlip = TRUE), - ANIMCMD_FRAME(0x40, 2, .hFlip = TRUE, .vFlip = TRUE), - ANIMCMD_FRAME(0x60, 2, .hFlip = TRUE, .vFlip = TRUE), - ANIMCMD_FRAME(0x40, 2, .hFlip = TRUE, .vFlip = TRUE), - ANIMCMD_FRAME(0x20, 2, .hFlip = TRUE, .vFlip = TRUE), - ANIMCMD_FRAME(0x00, 2, .hFlip = TRUE, .vFlip = TRUE), +static const union AnimCmd sAnim_GbaScreen_Long[] = { + ANIMCMD_FRAME( 0, 2, .hFlip = TRUE, .vFlip = TRUE), + ANIMCMD_FRAME(32, 2, .hFlip = TRUE, .vFlip = TRUE), + ANIMCMD_FRAME(64, 2, .hFlip = TRUE, .vFlip = TRUE), + ANIMCMD_FRAME(96, 2, .hFlip = TRUE, .vFlip = TRUE), + ANIMCMD_FRAME(64, 2, .hFlip = TRUE, .vFlip = TRUE), + ANIMCMD_FRAME(32, 2, .hFlip = TRUE, .vFlip = TRUE), + ANIMCMD_FRAME( 0, 2, .hFlip = TRUE, .vFlip = TRUE), ANIMCMD_LOOP(8), ANIMCMD_END }; -static const union AnimCmd gAnimCmd_826CEFC[] = { - ANIMCMD_FRAME(0x00, 2, .hFlip = TRUE, .vFlip = TRUE), - ANIMCMD_FRAME(0x20, 2, .hFlip = TRUE, .vFlip = TRUE), - ANIMCMD_FRAME(0x40, 2, .hFlip = TRUE, .vFlip = TRUE), - ANIMCMD_FRAME(0x60, 2, .hFlip = TRUE, .vFlip = TRUE), - ANIMCMD_FRAME(0x40, 2, .hFlip = TRUE, .vFlip = TRUE), - ANIMCMD_FRAME(0x20, 2, .hFlip = TRUE, .vFlip = TRUE), - ANIMCMD_FRAME(0x00, 2, .hFlip = TRUE, .vFlip = TRUE), +static const union AnimCmd sAnim_GbaScreen_Short[] = { + ANIMCMD_FRAME( 0, 2, .hFlip = TRUE, .vFlip = TRUE), + ANIMCMD_FRAME(32, 2, .hFlip = TRUE, .vFlip = TRUE), + ANIMCMD_FRAME(64, 2, .hFlip = TRUE, .vFlip = TRUE), + ANIMCMD_FRAME(96, 2, .hFlip = TRUE, .vFlip = TRUE), + ANIMCMD_FRAME(64, 2, .hFlip = TRUE, .vFlip = TRUE), + ANIMCMD_FRAME(32, 2, .hFlip = TRUE, .vFlip = TRUE), + ANIMCMD_FRAME( 0, 2, .hFlip = TRUE, .vFlip = TRUE), ANIMCMD_LOOP(2), ANIMCMD_END }; -static const union AnimCmd *const gSpriteAnimTable_826CF20[] = { - gAnimCmd_826CED8 +static const union AnimCmd *const sAnims_GbaScreen_Long[] = { + sAnim_GbaScreen_Long }; -static const union AnimCmd *const gSpriteAnimTable_826CF24[] = { - gAnimCmd_826CEFC +static const union AnimCmd *const sAnims_GbaScreen_Short[] = { + sAnim_GbaScreen_Short }; static const struct SpriteSheet sTradeGBAScreenSpriteSheet = { - sTradeGBAScreenTiles, - 0x1000, - TAG_GBA_SCREEN_TILES + .data = sGbaScreen_Gfx, + .size = sizeof(sGbaScreen_Gfx), + .tag = GFXTAG_GBA_SCREEN }; -static const struct SpriteTemplate sTradeGBAScreenSpriteTemplate1 = { - .tileTag = TAG_GBA_SCREEN_TILES, - .paletteTag = TAG_GBA_PAL, - .oam = &gOamData_826CED0, - .anims = gSpriteAnimTable_826CF20, +static const struct SpriteTemplate sSpriteTemplate_GbaScreenFlash_Long = { + .tileTag = GFXTAG_GBA_SCREEN, + .paletteTag = PALTAG_GBA, + .oam = &sOamData_GbaScreen, + .anims = sAnims_GbaScreen_Long, .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCB_TradeGBAScreen + .callback = SpriteCB_GbaScreen }; -static const struct SpriteTemplate sTradeGBAScreenSpriteTemplate2 = { - .tileTag = TAG_GBA_SCREEN_TILES, - .paletteTag = TAG_GBA_PAL, - .oam = &gOamData_826CED0, - .anims = gSpriteAnimTable_826CF24, +static const struct SpriteTemplate sSpriteTemplate_GbaScreenFlash_Short = { + .tileTag = GFXTAG_GBA_SCREEN, + .paletteTag = PALTAG_GBA, + .oam = &sOamData_GbaScreen, + .anims = sAnims_GbaScreen_Short, .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCB_TradeGBAScreen + .callback = SpriteCB_GbaScreen }; -static const u16 sTradeGlow2PaletteAnimTable[] = { +static const u16 sLinkMonShadow_Pal[] = { RGB(18, 24, 31), RGB(18, 24, 31), RGB(18, 24, 31), @@ -453,13 +465,13 @@ static const u16 sTradeGlow2PaletteAnimTable[] = { RGB(31, 31, 31) }; -static const union AffineAnimCmd gAffineAnimCmd_826CF78[] = { +static const union AffineAnimCmd sAffineAnim_CrossingMonPic[] = { AFFINEANIMCMD_FRAME(-0x100, 0x100, 0, 0), AFFINEANIMCMD_JUMP(0) }; -static const union AffineAnimCmd *const sSpriteAffineAnimTable_PlayerPokePicAlt[] = { - gAffineAnimCmd_826CF78 +static const union AffineAnimCmd *const sAffineAnims_CrossingMonPics[] = { + sAffineAnim_CrossingMonPic }; #include "data/ingame_trades.h" @@ -588,66 +600,58 @@ static const u8 sWirelessSignalAnimParams[][2] = { {16, -1} }; -// Sprite callback for link cable trade glow -static void SpriteCB_TradeGlowCable(struct Sprite *sprite) +static void SpriteCB_LinkMonGlow(struct Sprite *sprite) { - sprite->data[0]++; - if (sprite->data[0] == 10) + if (++sprite->data[0] == 10) { PlaySE(SE_BALL); sprite->data[0] = 0; } } -// Sprite callback for wireless trade glow -static void SpriteCB_TradeGlowWireless(struct Sprite *sprite) +static void SpriteCB_LinkMonGlowWireless(struct Sprite *sprite) { - if (!sprite->invisible) + if (!sprite->invisible && ++sprite->data[0] == 10) { - sprite->data[0]++; - if (sprite->data[0] == 10) - { - PlaySE(SE_M_SWAGGER2); - sprite->data[0] = 0; - } + PlaySE(SE_M_SWAGGER2); + sprite->data[0] = 0; } } // Palette flash for trade glow core -static void SpriteCB_TradeGlowCore(struct Sprite *sprite) +static void SpriteCB_LinkMonShadow(struct Sprite *sprite) { if (sprite->data[1] == 0) { - sprite->data[0]++; - if (sprite->data[0] == 12) + if (++sprite->data[0] == 12) sprite->data[0] = 0; - LoadPalette(&sTradeGlow2PaletteAnimTable[sprite->data[0]], 16 * (sprite->oam.paletteNum + 16) + 4, 2); + LoadPalette(&sLinkMonShadow_Pal[sprite->data[0]], 16 * (sprite->oam.paletteNum + 16) + 4, 2); } } -// Move down for 10 frames -static void SpriteCB_GameLinkCableEnd_Outbound(struct Sprite *sprite) +// Move cable down offscreen +static void SpriteCB_CableEndSending(struct Sprite *sprite) { sprite->data[0]++; sprite->y2++; + if (sprite->data[0] == 10) DestroySprite(sprite); } -// Move up for 10 frames -static void SpriteCB_GameLinkCableEnd_Inbound(struct Sprite *sprite) +// Move cable up onscreen +static void SpriteCB_CableEndReceiving(struct Sprite *sprite) { sprite->data[0]++; sprite->y2--; + if (sprite->data[0] == 10) DestroySprite(sprite); } -// Play a sound every 15 frames -static void SpriteCB_TradeGBAScreen(struct Sprite *sprite) +static void SpriteCB_GbaScreen(struct Sprite *sprite) { - sprite->data[0]++; - if (sprite->data[0] == 15) + if (++sprite->data[0] == 15) { PlaySE(SE_M_MINIMIZE); sprite->data[0] = 0; @@ -657,7 +661,7 @@ static void SpriteCB_TradeGBAScreen(struct Sprite *sprite) static void SetTradeBGAffine(void) { struct BgAffineDstData affine; - DoBgAffineSet(&affine, sTradeData->bg2texX * 0x100, sTradeData->bg2texY * 0x100, sTradeData->bg2srcX, sTradeData->bg2srcY, sTradeData->sXY, sTradeData->sXY, sTradeData->bg2alpha); + DoBgAffineSet(&affine, sTradeAnim->bg2texX * 0x100, sTradeAnim->bg2texY * 0x100, sTradeAnim->bg2srcX, sTradeAnim->bg2srcY, sTradeAnim->sXY, sTradeAnim->sXY, sTradeAnim->bg2alpha); SetGpuReg(REG_OFFSET_BG2PA, affine.pa); SetGpuReg(REG_OFFSET_BG2PB, affine.pb); SetGpuReg(REG_OFFSET_BG2PC, affine.pc); @@ -666,18 +670,18 @@ static void SetTradeBGAffine(void) SetGpuReg(REG_OFFSET_BG2Y, affine.dy); } -static void TradeAnim_UpdateBgRegs(void) +static void SetTradeGpuRegs(void) { u16 dispcnt; - SetGpuReg(REG_OFFSET_BG1VOFS, sTradeData->bg1vofs); - SetGpuReg(REG_OFFSET_BG1HOFS, sTradeData->bg1hofs); + SetGpuReg(REG_OFFSET_BG1VOFS, sTradeAnim->bg1vofs); + SetGpuReg(REG_OFFSET_BG1HOFS, sTradeAnim->bg1hofs); dispcnt = GetGpuReg(REG_OFFSET_DISPCNT); if ((dispcnt & 7) == DISPCNT_MODE_0) { - SetGpuReg(REG_OFFSET_BG2VOFS, sTradeData->bg2vofs); - SetGpuReg(REG_OFFSET_BG2HOFS, sTradeData->bg2hofs); + SetGpuReg(REG_OFFSET_BG2VOFS, sTradeAnim->bg2vofs); + SetGpuReg(REG_OFFSET_BG2HOFS, sTradeAnim->bg2hofs); } else { @@ -687,86 +691,86 @@ static void TradeAnim_UpdateBgRegs(void) static void VBlankCB_TradeAnim(void) { - TradeAnim_UpdateBgRegs(); + SetTradeGpuRegs(); LoadOam(); ProcessSpriteCopyRequests(); TransferPlttBuffer(); } -static void InitLinkTimeoutTracker(void) +static void ClearLinkTimeoutTimer(void) { - sTradeData->linkTimeoutTimer = 0; - sTradeData->linkTimeoutCheck1 = 0; - sTradeData->linkTimeoutCheck2 = 0; + sTradeAnim->linkTimeoutTimer = 0; + sTradeAnim->linkTimeoutCheck1 = 0; + sTradeAnim->linkTimeoutCheck2 = 0; } static void CheckLinkTimeout(void) { - if (sTradeData->linkTimeoutCheck1 == sTradeData->linkTimeoutCheck2) - sTradeData->linkTimeoutTimer++; + if (sTradeAnim->linkTimeoutCheck1 == sTradeAnim->linkTimeoutCheck2) + sTradeAnim->linkTimeoutTimer++; else - sTradeData->linkTimeoutTimer = 0; + sTradeAnim->linkTimeoutTimer = 0; - if (sTradeData->linkTimeoutTimer > 300) + if (sTradeAnim->linkTimeoutTimer > 300) { CloseLink(); SetMainCallback2(CB2_LinkError); - sTradeData->linkTimeoutTimer = 0; - sTradeData->linkTimeoutCheck2 = 0; - sTradeData->linkTimeoutCheck1 = 0; + sTradeAnim->linkTimeoutTimer = 0; + sTradeAnim->linkTimeoutCheck2 = 0; + sTradeAnim->linkTimeoutCheck1 = 0; } - sTradeData->linkTimeoutCheck2 = sTradeData->linkTimeoutCheck1; + sTradeAnim->linkTimeoutCheck2 = sTradeAnim->linkTimeoutCheck1; } -static u32 GetMultiplayerIdOfLinkTrade(void) +static u32 TradeGetMultiplayerId(void) { if (gReceivedRemoteLinkPlayers) return GetMultiplayerId(); return 0; } -static void LoadTradeMonPic(u8 whichParty, u8 action) +static void LoadTradeMonPic(u8 whichParty, u8 state) { int pos = 0; struct Pokemon * mon = NULL; u16 species; u32 personality; - if (whichParty == 0) + if (whichParty == TRADE_PLAYER) { - mon = &gPlayerParty[gSelectedTradeMonPositions[0]]; - pos = 1; + mon = &gPlayerParty[gSelectedTradeMonPositions[TRADE_PLAYER]]; + pos = B_POSITION_OPPONENT_LEFT; } - /*else*/ if (whichParty == 1) + if (whichParty == TRADE_PARTNER) { - mon = &gEnemyParty[gSelectedTradeMonPositions[1] % PARTY_SIZE]; - pos = 3; + mon = &gEnemyParty[gSelectedTradeMonPositions[TRADE_PARTNER] % PARTY_SIZE]; + pos = B_POSITION_OPPONENT_RIGHT; } - switch (action) + switch (state) { case 0: // Load graphics species = GetMonData(mon, MON_DATA_SPECIES2); personality = GetMonData(mon, MON_DATA_PERSONALITY); - if (whichParty == 0) + if (whichParty == TRADE_PLAYER) HandleLoadSpecialPokePic(&gMonFrontPicTable[species], gMonSpritesGfxPtr->sprites[1], species, personality); else HandleLoadSpecialPokePic_DontHandleDeoxys(&gMonFrontPicTable[species], gMonSpritesGfxPtr->sprites[whichParty * 2 + 1], species, personality); LoadCompressedSpritePalette(GetMonSpritePalStruct(mon)); - sTradeData->tradeSpecies[whichParty] = species; - sTradeData->monPersonalities[whichParty] = personality; + sTradeAnim->monSpecies[whichParty] = species; + sTradeAnim->monPersonalities[whichParty] = personality; break; case 1: // Create sprite SetMultiuseSpriteTemplateToPokemon(GetMonSpritePalStruct(mon)->tag, pos); - sTradeData->pokePicSpriteIdxs[whichParty] = CreateSprite(&gMultiuseSpriteTemplate, 120, 60, 6); - gSprites[sTradeData->pokePicSpriteIdxs[whichParty]].invisible = TRUE; - gSprites[sTradeData->pokePicSpriteIdxs[whichParty]].callback = SpriteCallbackDummy; + sTradeAnim->monSpriteIds[whichParty] = CreateSprite(&gMultiuseSpriteTemplate, 120, 60, 6); + gSprites[sTradeAnim->monSpriteIds[whichParty]].invisible = TRUE; + gSprites[sTradeAnim->monSpriteIds[whichParty]].callback = SpriteCallbackDummy; break; } } @@ -778,37 +782,37 @@ void CB2_LinkTrade(void) case 0: if (!gReceivedRemoteLinkPlayers) { - gLinkType = 0x1144; + gLinkType = LINKTYPE_TRADE_DISCONNECTED; CloseLink(); } - sTradeData = AllocZeroed(sizeof(struct TradeAnimationResources)); + sTradeAnim = AllocZeroed(sizeof(*sTradeAnim)); AllocateMonSpritesGfx(); ResetTasks(); ResetSpriteData(); FreeAllSpritePalettes(); SetVBlankCallback(VBlankCB_TradeAnim); TradeAnimInit_LoadGfx(); - InitLinkTimeoutTracker(); + ClearLinkTimeoutTimer(); gMain.state++; - sTradeData->unk_8C = 0; - sTradeData->state = 0; - sTradeData->isLinkTrade = TRUE; - sTradeData->bg2texX = 64; - sTradeData->bg2texY = 64; - sTradeData->unk_D8 = 0; - sTradeData->unk_DA = 0; - sTradeData->bg2srcX = 120; - sTradeData->bg2srcY = 80; - sTradeData->sXY = 256; - sTradeData->bg2alpha = 0; + sTradeAnim->neverRead_8C = 0; + sTradeAnim->state = 0; + sTradeAnim->isLinkTrade = TRUE; + sTradeAnim->bg2texX = 64; + sTradeAnim->bg2texY = 64; + sTradeAnim->neverRead_D8 = 0; + sTradeAnim->neverRead_DA = 0; + sTradeAnim->bg2srcX = DISPLAY_WIDTH / 2; + sTradeAnim->bg2srcY = DISPLAY_HEIGHT / 2; + sTradeAnim->sXY = 256; + sTradeAnim->bg2alpha = 0; break; case 1: if (!gReceivedRemoteLinkPlayers) { - sTradeData->isCableTrade = TRUE; + sTradeAnim->isCableTrade = TRUE; OpenLink(); gMain.state++; - sTradeData->timer = 0; + sTradeAnim->timer = 0; } else { @@ -816,10 +820,9 @@ void CB2_LinkTrade(void) } break; case 2: - sTradeData->timer++; - if (sTradeData->timer > 60) + if (++sTradeAnim->timer > 60) { - sTradeData->timer = 0; + sTradeAnim->timer = 0; gMain.state++; } break; @@ -828,8 +831,7 @@ void CB2_LinkTrade(void) { if (GetLinkPlayerCount_2() >= GetSavedPlayerCount()) { - sTradeData->timer++; - if (sTradeData->timer > 30) + if (++sTradeAnim->timer > 30) { CheckShouldAdvanceLinkState(); gMain.state++; @@ -847,43 +849,41 @@ void CB2_LinkTrade(void) break; case 4: CheckLinkTimeout(); - if (gReceivedRemoteLinkPlayers == 1 && IsLinkPlayerDataExchangeComplete() == 1) - { + if (gReceivedRemoteLinkPlayers == TRUE && IsLinkPlayerDataExchangeComplete() == TRUE) gMain.state++; - } break; case 5: - sTradeData->tradeStatus1 = 0; - sTradeData->tradeStatus2 = 0; - sTradeData->scheduleLinkTransfer = 0; - LoadTradeMonPic(0, 0); + sTradeAnim->playerFinishStatus = 0; + sTradeAnim->partnerFinishStatus = 0; + sTradeAnim->scheduleLinkTransfer = 0; + LoadTradeMonPic(TRADE_PLAYER, 0); gMain.state++; break; case 6: - LoadTradeMonPic(0, 1); + LoadTradeMonPic(TRADE_PLAYER, 1); gMain.state++; break; case 7: - LoadTradeMonPic(1, 0); + LoadTradeMonPic(TRADE_PARTNER, 0); gMain.state++; break; case 8: - LoadTradeMonPic(1, 1); + LoadTradeMonPic(TRADE_PARTNER, 1); LinkTradeDrawWindow(); gMain.state++; break; case 9: LoadTradeGbaSpriteGfx(); - LoadSpriteSheet(&sTradeBallSpriteSheet); + LoadSpriteSheet(&sPokeBallSpriteSheet); LoadSpritePalette(&sTradeBallSpritePal); gMain.state++; break; case 10: BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); ShowBg(0); - sTradeData->questLogData.speciesSent = GetMonData(&gPlayerParty[gSelectedTradeMonPositions[0]], MON_DATA_SPECIES2); - sTradeData->questLogData.speciesReceived = GetMonData(&gEnemyParty[gSelectedTradeMonPositions[1] % PARTY_SIZE], MON_DATA_SPECIES2); - memcpy(sTradeData->questLogData.partnerName, gLinkPlayers[GetMultiplayerId() ^ 1].name, PLAYER_NAME_LENGTH); + sTradeAnim->questLogData.speciesSent = GetMonData(&gPlayerParty[gSelectedTradeMonPositions[TRADE_PLAYER]], MON_DATA_SPECIES2); + sTradeAnim->questLogData.speciesReceived = GetMonData(&gEnemyParty[gSelectedTradeMonPositions[TRADE_PARTNER] % PARTY_SIZE], MON_DATA_SPECIES2); + memcpy(sTradeAnim->questLogData.partnerName, gLinkPlayers[GetMultiplayerId() ^ 1].name, PLAYER_NAME_LENGTH); gMain.state++; break; case 11: @@ -899,7 +899,7 @@ void CB2_LinkTrade(void) LoadWirelessStatusIndicatorSpriteGfx(); CreateWirelessStatusIndicatorSprite(0, 0); } - SetMainCallback2(CB2_RunTradeAnim_LinkTrade); + SetMainCallback2(CB2_UpdateLinkTrade); } break; } @@ -927,7 +927,7 @@ static void TradeAnimInit_LoadGfx(void) { SetGpuReg(REG_OFFSET_DISPCNT, 0); ResetBgsAndClearDma3BusyFlags(FALSE); - InitBgsFromTemplates(0, sBgTemplates, NELEMS(sBgTemplates)); + InitBgsFromTemplates(0, sBgTemplates, ARRAY_COUNT(sBgTemplates)); ChangeBgX(0, 0, 0); ChangeBgY(0, 0, 0); SetBgTilemapBuffer(0, Alloc(BG_SCREEN_SIZE)); @@ -947,54 +947,54 @@ static void TradeAnimInit_LoadGfx(void) LoadCompressedPalette(gBattleInterface_Textbox_Pal, 0x000, 0x20); } -static void CB2_InitTradeAnim_InGameTrade(void) +static void CB2_InitInGameTrade(void) { u8 otName[11]; switch (gMain.state) { case 0: - gSelectedTradeMonPositions[0] = gSpecialVar_0x8005; - gSelectedTradeMonPositions[1] = 6; + gSelectedTradeMonPositions[TRADE_PLAYER] = gSpecialVar_0x8005; + gSelectedTradeMonPositions[TRADE_PARTNER] = PARTY_SIZE; StringCopy(gLinkPlayers[0].name, gSaveBlock2Ptr->playerName); GetMonData(&gEnemyParty[0], MON_DATA_OT_NAME, otName); StringCopy(gLinkPlayers[1].name, otName); - sTradeData = AllocZeroed(sizeof(*sTradeData)); + sTradeAnim = AllocZeroed(sizeof(*sTradeAnim)); AllocateMonSpritesGfx(); ResetTasks(); ResetSpriteData(); FreeAllSpritePalettes(); SetVBlankCallback(VBlankCB_TradeAnim); TradeAnimInit_LoadGfx(); - sTradeData->isLinkTrade = FALSE; - sTradeData->unk_8C = 0; - sTradeData->state = 0; - sTradeData->bg2texX = 64; - sTradeData->bg2texY = 64; - sTradeData->unk_D8 = 0; - sTradeData->unk_DA = 0; - sTradeData->bg2srcX = 120; - sTradeData->bg2srcY = 80; - sTradeData->sXY = 256; - sTradeData->bg2alpha = 0; - sTradeData->timer = 0; + sTradeAnim->isLinkTrade = FALSE; + sTradeAnim->neverRead_8C = 0; + sTradeAnim->state = 0; + sTradeAnim->bg2texX = 64; + sTradeAnim->bg2texY = 64; + sTradeAnim->neverRead_D8 = 0; + sTradeAnim->neverRead_DA = 0; + sTradeAnim->bg2srcX = DISPLAY_WIDTH / 2; + sTradeAnim->bg2srcY = DISPLAY_HEIGHT / 2; + sTradeAnim->sXY = 256; + sTradeAnim->bg2alpha = 0; + sTradeAnim->timer = 0; gMain.state = 5; break; case 5: - LoadTradeMonPic(0, 0); + LoadTradeMonPic(TRADE_PLAYER, 0); gMain.state++; break; case 6: - LoadTradeMonPic(0, 1); + LoadTradeMonPic(TRADE_PLAYER, 1); gMain.state++; break; case 7: - LoadTradeMonPic(1, 0); + LoadTradeMonPic(TRADE_PARTNER, 0); ShowBg(0); gMain.state++; break; case 8: - LoadTradeMonPic(1, 1); + LoadTradeMonPic(TRADE_PARTNER, 1); FillWindowPixelBuffer(0, PIXEL_FILL(15)); PutWindowTilemap(0); CopyWindowToVram(0, COPYWIN_FULL); @@ -1002,7 +1002,7 @@ static void CB2_InitTradeAnim_InGameTrade(void) break; case 9: LoadTradeGbaSpriteGfx(); - LoadSpriteSheet(&sTradeBallSpriteSheet); + LoadSpriteSheet(&sPokeBallSpriteSheet); LoadSpritePalette(&sTradeBallSpritePal); gMain.state++; break; @@ -1017,7 +1017,7 @@ static void CB2_InitTradeAnim_InGameTrade(void) gMain.state++; break; case 12: - SetMainCallback2(CB2_RunTradeAnim_InGameTrade); + SetMainCallback2(CB2_InGameTrade); break; } @@ -1028,7 +1028,7 @@ static void CB2_InitTradeAnim_InGameTrade(void) UpdatePaletteFade(); } -static void ReceivedMonSetPokedexFlags(u8 partyIdx) +static void UpdatePokedexForReceivedMon(u8 partyIdx) { struct Pokemon * mon = &gPlayerParty[partyIdx]; @@ -1042,7 +1042,7 @@ static void ReceivedMonSetPokedexFlags(u8 partyIdx) } } -static void RS_TryEnableNationalPokedex(void) +static void TryEnableNationalDexFromLinkPartner(void) { u8 mpId = GetMultiplayerId(); // Originally in Ruby but commented out @@ -1062,45 +1062,44 @@ static void TradeMons(u8 playerPartyIdx, u8 partnerPartyIdx) u16 partnerMail = GetMonData(partnerMon, MON_DATA_MAIL); // The mail attached to the sent Pokemon no longer exists in your file. - if (playerMail != 0xFF) + if (playerMail != MAIL_NONE) ClearMailStruct(&gSaveBlock1Ptr->mail[playerMail]); - // This is where the actual trade happens!! - sTradeData->mon = *playerMon; - *playerMon = *partnerMon; - *partnerMon = sTradeData->mon; + SWAP(*playerMon, *partnerMon, sTradeAnim->tempMon); // By default, a Pokemon received from a trade will have 70 Friendship. + // Eggs use Friendship to track egg cycles, so don't set this on Eggs. friendship = 70; if (!GetMonData(playerMon, MON_DATA_IS_EGG)) SetMonData(playerMon, MON_DATA_FRIENDSHIP, &friendship); // Associate your partner's mail with the Pokemon they sent over. - if (partnerMail != 0xFF) + if (partnerMail != MAIL_NONE) GiveMailToMon2(playerMon, &gLinkPartnerMail[partnerMail]); - ReceivedMonSetPokedexFlags(playerPartyIdx); + UpdatePokedexForReceivedMon(playerPartyIdx); if (gReceivedRemoteLinkPlayers) - RS_TryEnableNationalPokedex(); + TryEnableNationalDexFromLinkPartner(); } static void HandleLinkDataSend(void) { - switch (sTradeData->scheduleLinkTransfer) + switch (sTradeAnim->scheduleLinkTransfer) { case 1: if (IsLinkTaskFinished()) { - SendBlock(BitmaskAllOtherLinkPlayers(), sTradeData->linkData, 20); - sTradeData->scheduleLinkTransfer++; + SendBlock(BitmaskAllOtherLinkPlayers(), sTradeAnim->linkData, sizeof(sTradeAnim->linkData)); + sTradeAnim->scheduleLinkTransfer++; } + // fallthrough case 2: - sTradeData->scheduleLinkTransfer = 0; + sTradeAnim->scheduleLinkTransfer = 0; break; } } -static void CB2_RunTradeAnim_InGameTrade(void) +static void CB2_InGameTrade(void) { DoTradeAnim(); RunTasks(); @@ -1115,8 +1114,8 @@ static void SetTradeSequenceBgGpuRegs(u8 state) switch (state) { case 0: - sTradeData->bg2vofs = 0; - sTradeData->bg2hofs = 0xB4; + sTradeAnim->bg2vofs = 0; + sTradeAnim->bg2hofs = 0xB4; SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG2_ON | DISPCNT_OBJ_ON); SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(2) | BGCNT_CHARBASE(1) | BGCNT_SCREENBASE(18) | BGCNT_TXT512x256); LoadPalette(gTradeGba2_Pal, 0x10, 0x60); @@ -1124,12 +1123,12 @@ static void SetTradeSequenceBgGpuRegs(u8 state) DmaCopy16Defvars(3, gTradeOrHatchMonShadowTilemap, (void *)BG_SCREEN_ADDR(18), 0x1000); break; case 1: - sTradeData->bg1hofs = 0; - sTradeData->bg1vofs = 0x15C; + sTradeAnim->bg1hofs = 0; + sTradeAnim->bg1vofs = 0x15C; SetGpuReg(REG_OFFSET_BG1VOFS, 0x15C); SetGpuReg(REG_OFFSET_BG1CNT, BGCNT_PRIORITY(2) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(5) | BGCNT_TXT256x512); SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(2) | BGCNT_CHARBASE(1) | BGCNT_SCREENBASE(18) | BGCNT_TXT256x512); - if (sTradeData->isCableTrade) + if (sTradeAnim->isCableTrade) { DmaCopy16Defvars(3, sGbaMapCable, (void *)BG_SCREEN_ADDR(5), 0x1000); } @@ -1141,18 +1140,18 @@ static void SetTradeSequenceBgGpuRegs(u8 state) SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG1_ON | DISPCNT_OBJ_ON); break; case 2: - sTradeData->bg1vofs = 0; - sTradeData->bg1hofs = 0; - if (!sTradeData->isCableTrade) + sTradeAnim->bg1vofs = 0; + sTradeAnim->bg1hofs = 0; + if (!sTradeAnim->isCableTrade) { SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_1 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG1_ON | DISPCNT_OBJ_ON); - LZ77UnCompVram(sWirelessCloseupMap, (void *)BG_SCREEN_ADDR(5)); + LZ77UnCompVram(sWirelessCloseup_Map, (void *)BG_SCREEN_ADDR(5)); BlendPalettes(0x000000008, 0x10, RGB_BLACK); } else { SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_1 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG1_ON | DISPCNT_OBJ_ON); - DmaCopy16Defvars(3, sCableCloseupMap, (void *)BG_SCREEN_ADDR(5), 0x800); + DmaCopy16Defvars(3, sCableCloseup_Map, (void *)BG_SCREEN_ADDR(5), 0x800); BlendPalettes(0x00000001, 0x10, RGB_BLACK); } break; @@ -1160,19 +1159,19 @@ static void SetTradeSequenceBgGpuRegs(u8 state) LoadPalette(sWirelessSignalAnimPals_Off, 0x30, 0x20); LZ77UnCompVram(sWirelessSignal4bpp, BG_CHAR_ADDR(1)); LZ77UnCompVram(sWirelessSignalTilemap, BG_SCREEN_ADDR(18)); - sTradeData->bg2vofs = 0x50; + sTradeAnim->bg2vofs = 0x50; SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG1_ON | DISPCNT_BG2_ON | DISPCNT_OBJ_ON); break; case 4: SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_1 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG2_ON | DISPCNT_OBJ_ON); SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(3) | BGCNT_CHARBASE(1) | BGCNT_256COLOR | BGCNT_SCREENBASE(18) | BGCNT_AFF128x128); - sTradeData->bg2texX = 0x40; - sTradeData->bg2texY = 0x5C; - sTradeData->sXY = 0x20; - sTradeData->bg2Zoom = 0x400; - sTradeData->bg2alpha = 0; - DmaCopyLarge16(3, sGbaAffineTiles, (void *)BG_CHAR_ADDR(1), 0x2840, 0x1000); - if (sTradeData->isCableTrade) + sTradeAnim->bg2texX = 0x40; + sTradeAnim->bg2texY = 0x5C; + sTradeAnim->sXY = 0x20; + sTradeAnim->bg2Zoom = 0x400; + sTradeAnim->bg2alpha = 0; + DmaCopyLarge16(3, sGbaAffine_Gfx, (void *)BG_CHAR_ADDR(1), 0x2840, 0x1000); + if (sTradeAnim->isCableTrade) { DmaCopy16Defvars(3, sGbaAffineMapCable, (void *)BG_SCREEN_ADDR(18), 0x100); } @@ -1182,21 +1181,21 @@ static void SetTradeSequenceBgGpuRegs(u8 state) } break; case 5: - sTradeData->bg1vofs = 0; - sTradeData->bg1hofs = 0; + sTradeAnim->bg1vofs = 0; + sTradeAnim->bg1hofs = 0; break; case 6: SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_1 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG2_ON | DISPCNT_OBJ_ON); SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(3) | BGCNT_CHARBASE(1) | BGCNT_256COLOR | BGCNT_SCREENBASE(18) | BGCNT_TXT256x256); - sTradeData->bg2texX = 0x40; - sTradeData->bg2texY = 0x5C; - sTradeData->sXY = 0x100; - sTradeData->bg2Zoom = 0x80; - sTradeData->bg2srcX = 0x78; - sTradeData->bg2srcY = 0x50; - sTradeData->bg2alpha = 0; - DmaCopyLarge16(3, sGbaAffineTiles, BG_CHAR_ADDR(1), 0x2840, 0x1000); - if (sTradeData->isCableTrade) + sTradeAnim->bg2texX = 0x40; + sTradeAnim->bg2texY = 0x5C; + sTradeAnim->sXY = 0x100; + sTradeAnim->bg2Zoom = 0x80; + sTradeAnim->bg2srcX = 0x78; + sTradeAnim->bg2srcY = 0x50; + sTradeAnim->bg2alpha = 0; + DmaCopyLarge16(3, sGbaAffine_Gfx, BG_CHAR_ADDR(1), 0x2840, 0x1000); + if (sTradeAnim->isCableTrade) { DmaCopy16Defvars(3, sGbaAffineMapCable, (void *)BG_SCREEN_ADDR(18), 0x100); } @@ -1206,8 +1205,8 @@ static void SetTradeSequenceBgGpuRegs(u8 state) } break; case 7: - sTradeData->bg2vofs = 0; - sTradeData->bg2hofs = 0; + sTradeAnim->bg2vofs = 0; + sTradeAnim->bg2hofs = 0; SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(2) | BGCNT_CHARBASE(1) | BGCNT_SCREENBASE(18) | BGCNT_TXT512x256); LoadPalette(gTradeGba2_Pal, 0x10, 0x60); @@ -1219,12 +1218,12 @@ static void SetTradeSequenceBgGpuRegs(u8 state) static void LoadTradeGbaSpriteGfx(void) { - LoadSpriteSheet(&sTradeGlow1SpriteSheet); - LoadSpriteSheet(&sTradeGlow2SpriteSheet); - LoadSpriteSheet(&sTradeCableEndSpriteSheet); + LoadSpriteSheet(&sSpriteSheet_LinkMonGlow); + LoadSpriteSheet(&sSpriteSheet_LinkMonShadow); + LoadSpriteSheet(&sSpriteSheet_CableEnd); LoadSpriteSheet(&sTradeGBAScreenSpriteSheet); - LoadSpritePalette(&sTradeGlowSpritePal); - LoadSpritePalette(&sTradeGbaSpritePal); + LoadSpritePalette(&sSpritePalette_LinkMon); + LoadSpritePalette(&sSpritePalette_Gba); } static void TradeBufferOTnameAndNicknames(void) @@ -1232,13 +1231,13 @@ static void TradeBufferOTnameAndNicknames(void) u8 nickname[20]; u8 mpId; const struct InGameTrade * inGameTrade; - if (sTradeData->isLinkTrade) + if (sTradeAnim->isLinkTrade) { mpId = GetMultiplayerId(); StringCopy(gStringVar1, gLinkPlayers[mpId ^ 1].name); - GetMonData(&gEnemyParty[gSelectedTradeMonPositions[1] % 6], MON_DATA_NICKNAME, nickname); + GetMonData(&gEnemyParty[gSelectedTradeMonPositions[TRADE_PARTNER] % PARTY_SIZE], MON_DATA_NICKNAME, nickname); StringCopy_Nickname(gStringVar3, nickname); - GetMonData(&gPlayerParty[gSelectedTradeMonPositions[0]], MON_DATA_NICKNAME, nickname); + GetMonData(&gPlayerParty[gSelectedTradeMonPositions[TRADE_PLAYER]], MON_DATA_NICKNAME, nickname); StringCopy_Nickname(gStringVar2, nickname); } else @@ -1251,414 +1250,478 @@ static void TradeBufferOTnameAndNicknames(void) } } +// returns TRUE if it finished a link trade, FALSE if it finished an in-game trade or if sequence is still going static bool8 DoTradeAnim(void) { - if (sTradeData->isCableTrade) + if (sTradeAnim->isCableTrade) return DoTradeAnim_Cable(); else return DoTradeAnim_Wireless(); } +// Below are the states for the main switch in DoTradeAnim_Cable and DoTradeAnim_Wireless +// When DoTradeAnim_Wireless has a unique version of a state used by DoTradeAnim_Cable, it adds the below modifier +#define STATE_WIRELESS 100 +enum { + STATE_START, + STATE_MON_SLIDE_IN, + // 2-9 unused + STATE_SEND_MSG = 10, + STATE_BYE_BYE, + STATE_POKEBALL_DEPART, + STATE_POKEBALL_DEPART_WAIT, + STATE_FADE_OUT_TO_GBA_SEND, + // 15-19 unused + STATE_WAIT_FADE_OUT_TO_GBA_SEND = 20, + STATE_FADE_IN_TO_GBA_SEND, + STATE_WAIT_FADE_IN_TO_GBA_SEND, + STATE_GBA_ZOOM_OUT, + STATE_GBA_FLASH_SEND, + STATE_GBA_STOP_FLASH_SEND, + STATE_PAN_AWAY_GBA, + STATE_CREATE_LINK_MON_LEAVING, + STATE_LINK_MON_TRAVEL_OUT, + STATE_FADE_OUT_TO_CROSSING, + STATE_WAIT_FADE_OUT_TO_CROSSING, + STATE_FADE_IN_TO_CROSSING, + STATE_WAIT_FADE_IN_TO_CROSSING, + STATE_CROSSING_LINK_MONS_ENTER, + STATE_CROSSING_BLEND_WHITE_1, + STATE_CROSSING_BLEND_WHITE_2, + STATE_CROSSING_BLEND_WHITE_3, + STATE_CROSSING_CREATE_MON_PICS, + STATE_CROSSING_MON_PICS_MOVE, + STATE_CROSSING_LINK_MONS_EXIT, + STATE_CREATE_LINK_MON_ARRIVING, + STATE_FADE_OUT_TO_GBA_RECV, + STATE_WAIT_FADE_OUT_TO_GBA_RECV, + STATE_LINK_MON_TRAVEL_IN, + STATE_PAN_TO_GBA, + STATE_DESTROY_LINK_MON, + STATE_LINK_MON_ARRIVED_DELAY, + STATE_MOVE_GBA_TO_CENTER, + STATE_GBA_FLASH_RECV, + STATE_UNUSED, + STATE_GBA_STOP_FLASH_RECV, + STATE_GBA_ZOOM_IN, + STATE_FADE_OUT_TO_NEW_MON, + // 53-59 unused + STATE_WAIT_FADE_OUT_TO_NEW_MON = 60, + STATE_FADE_IN_TO_NEW_MON, + STATE_WAIT_FADE_IN_TO_NEW_MON, + STATE_POKEBALL_ARRIVE, + STATE_FADE_POKEBALL_TO_NORMAL, + STATE_POKEBALL_ARRIVE_WAIT, + STATE_SHOW_NEW_MON, + STATE_NEW_MON_MSG, + STATE_TAKE_CARE_OF_MON, + STATE_AFTER_NEW_MON_DELAY, + STATE_CHECK_RIBBONS, + STATE_END_LINK_TRADE, + STATE_TRY_EVOLUTION, + STATE_FADE_OUT_END, + STATE_WAIT_FADE_OUT_END, + // Special states + STATE_GBA_FLASH_SEND_WIRELESS = STATE_GBA_FLASH_SEND + STATE_WIRELESS, + STATE_GBA_STOP_FLASH_SEND_WIRELESS, + STATE_WAIT_WIRELESS_SIGNAL_SEND, + STATE_PAN_TO_GBA_WIRELESS = STATE_PAN_TO_GBA + STATE_WIRELESS, + STATE_DESTROY_LINK_MON_WIRELESS, + STATE_WAIT_WIRELESS_SIGNAL_RECV, + STATE_DELAY_FOR_MON_ANIM = 167, + STATE_LINK_MON_TRAVEL_OFFSCREEN = 200, + STATE_WAIT_FOR_MON_CRY = 267, +}; + static bool8 DoTradeAnim_Cable(void) { u16 evoTarget; - switch (sTradeData->state) + switch (sTradeAnim->state) { - case 0: - gSprites[sTradeData->pokePicSpriteIdxs[0]].invisible = FALSE; - gSprites[sTradeData->pokePicSpriteIdxs[0]].x2 = -180; - gSprites[sTradeData->pokePicSpriteIdxs[0]].y2 = gMonFrontPicCoords[sTradeData->tradeSpecies[0]].y_offset; - sTradeData->state++; - sTradeData->cachedMapMusic = GetCurrentMapMusic(); + case STATE_START: + gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]].invisible = FALSE; + gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]].x2 = -180; + gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]].y2 = gMonFrontPicCoords[sTradeAnim->monSpecies[TRADE_PLAYER]].y_offset; + sTradeAnim->state++; + sTradeAnim->cachedMapMusic = GetCurrentMapMusic(); PlayNewMapMusic(MUS_EVOLUTION); break; - case 1: - if (sTradeData->bg2hofs > 0) + case STATE_MON_SLIDE_IN: + if (sTradeAnim->bg2hofs > 0) { - gSprites[sTradeData->pokePicSpriteIdxs[0]].x2 += 3; - sTradeData->bg2hofs -= 3; + // Sliding + gSprites[sTradeAnim->monSpriteIds[0]].x2 += 3; + sTradeAnim->bg2hofs -= 3; } else { - gSprites[sTradeData->pokePicSpriteIdxs[0]].x2 = 0; - sTradeData->bg2hofs = 0; - sTradeData->state = 10; + // Pokémon has arrived onscreen + gSprites[sTradeAnim->monSpriteIds[0]].x2 = 0; + sTradeAnim->bg2hofs = 0; + sTradeAnim->state = STATE_SEND_MSG; } break; - case 10: + case STATE_SEND_MSG: StringExpandPlaceholders(gStringVar4, gText_XWillBeSentToY); DrawTextOnTradeWindow(0, gStringVar4, 0); - if (sTradeData->tradeSpecies[0] != SPECIES_EGG) - { - PlayCry_Normal(sTradeData->tradeSpecies[0], 0); - } + if (sTradeAnim->monSpecies[TRADE_PLAYER] != SPECIES_EGG) + PlayCry_Normal(sTradeAnim->monSpecies[TRADE_PLAYER], 0); - sTradeData->state = 11; - sTradeData->timer = 0; + sTradeAnim->state = STATE_BYE_BYE; + sTradeAnim->timer = 0; break; - case 11: - if (++sTradeData->timer == 80) + case STATE_BYE_BYE: + if (++sTradeAnim->timer == 80) { - sTradeData->pokeballSpriteId = CreateTradePokeballSprite(sTradeData->pokePicSpriteIdxs[0], gSprites[sTradeData->pokePicSpriteIdxs[0]].oam.paletteNum, 120, 32, 2, 1, 0x14, 0xfffff); - sTradeData->state++; + sTradeAnim->releasePokeballSpriteId = CreateTradePokeballSprite(sTradeAnim->monSpriteIds[TRADE_PLAYER], gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]].oam.paletteNum, 120, 32, 2, 1, 0x14, 0xfffff); + sTradeAnim->state++; StringExpandPlaceholders(gStringVar4, gText_ByeByeVar1); DrawTextOnTradeWindow(0, gStringVar4, 0); } break; - case 12: - if (gSprites[sTradeData->pokeballSpriteId].callback == SpriteCallbackDummy) + case STATE_POKEBALL_DEPART: + if (gSprites[sTradeAnim->releasePokeballSpriteId].callback == SpriteCallbackDummy) { - sTradeData->pokeballSpriteId2 = CreateSprite(&sTradePokeballSpriteTemplate, 120, 32, 0); - gSprites[sTradeData->pokeballSpriteId2].callback = SpriteCB_TradePokeball_Outbound; - DestroySprite(&gSprites[sTradeData->pokeballSpriteId]); - sTradeData->state++; + sTradeAnim->bouncingPokeballSpriteId = CreateSprite(&sSpriteTemplate_Pokeball, 120, 32, 0); + gSprites[sTradeAnim->bouncingPokeballSpriteId].callback = SpriteCB_BouncingPokeballDepart; + DestroySprite(&gSprites[sTradeAnim->releasePokeballSpriteId]); + sTradeAnim->state++; } break; - case 13: + case STATE_POKEBALL_DEPART_WAIT: // The game waits here for the sprite to finish its animation sequence. break; - case 14: + case STATE_FADE_OUT_TO_GBA_SEND: BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); - sTradeData->state = 20; + sTradeAnim->state = STATE_WAIT_FADE_OUT_TO_GBA_SEND; break; - case 20: + case STATE_WAIT_FADE_OUT_TO_GBA_SEND: if (!gPaletteFade.active) { SetTradeSequenceBgGpuRegs(4); FillWindowPixelBuffer(0, PIXEL_FILL(15)); CopyWindowToVram(0, COPYWIN_FULL); - sTradeData->state++; + sTradeAnim->state++; } break; - case 21: + case STATE_FADE_IN_TO_GBA_SEND: BeginNormalPaletteFade(PALETTES_ALL, -1, 16, 0, RGB_BLACK); - sTradeData->state++; + sTradeAnim->state++; break; - case 22: + case STATE_WAIT_FADE_IN_TO_GBA_SEND: if (!gPaletteFade.active) - { - sTradeData->state = 23; - } + sTradeAnim->state = STATE_GBA_ZOOM_OUT; break; - case 23: - if (sTradeData->bg2Zoom > 0x100) + case STATE_GBA_ZOOM_OUT: + if (sTradeAnim->bg2Zoom > 0x100) { - sTradeData->bg2Zoom -= 0x34; + sTradeAnim->bg2Zoom -= 0x34; } else { SetTradeSequenceBgGpuRegs(1); - sTradeData->bg2Zoom = 0x80; - sTradeData->state++; - sTradeData->timer = 0; + sTradeAnim->bg2Zoom = 0x80; + sTradeAnim->state++; + sTradeAnim->timer = 0; } - sTradeData->sXY = 0x8000 / sTradeData->bg2Zoom; + sTradeAnim->sXY = 0x8000 / sTradeAnim->bg2Zoom; break; - case 24: - if (++sTradeData->timer > 20) + case STATE_GBA_FLASH_SEND: + if (++sTradeAnim->timer > 20) { SetTradeBGAffine(); - sTradeData->gbaScreenSpriteId = CreateSprite(&sTradeGBAScreenSpriteTemplate1, 120, 80, 0); - sTradeData->state++; + sTradeAnim->connectionSpriteId2 = CreateSprite(&sSpriteTemplate_GbaScreenFlash_Long, 120, 80, 0); + sTradeAnim->state++; } break; - case 25: - if (gSprites[sTradeData->gbaScreenSpriteId].animEnded) + case STATE_GBA_STOP_FLASH_SEND: + if (gSprites[sTradeAnim->connectionSpriteId2].animEnded) { - DestroySprite(&gSprites[sTradeData->gbaScreenSpriteId]); + DestroySprite(&gSprites[sTradeAnim->connectionSpriteId2]); SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_BG2); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(12, 4)); - sTradeData->state++; + sTradeAnim->state++; } break; - case 26: - if (--sTradeData->bg1vofs == 316) - { - sTradeData->state++; - } - if (sTradeData->bg1vofs == 328) - { - sTradeData->linkCableEndSpriteId = CreateSprite(&sGameLinkCableEndSpriteTemplate, 128, 65, 0); - } + case STATE_PAN_AWAY_GBA: + if (--sTradeAnim->bg1vofs == 316) + sTradeAnim->state++; + + if (sTradeAnim->bg1vofs == 328) + sTradeAnim->cableEndSpriteId = CreateSprite(&sSpriteTemplate_CableEnd, 128, 65, 0); break; - case 27: - sTradeData->tradeGlow1SpriteId = CreateSprite(&sTradeGlow1SpriteTemplate, 128, 80, 3); - sTradeData->gbaScreenSpriteId = CreateSprite(&sGlowBallSpriteTemplate, 128, 80, 0); - StartSpriteAnim(&gSprites[sTradeData->gbaScreenSpriteId], 1); - sTradeData->state++; + case STATE_CREATE_LINK_MON_LEAVING: + sTradeAnim->connectionSpriteId1 = CreateSprite(&sSpriteTemplate_LinkMonGlow, 128, 80, 3); + sTradeAnim->connectionSpriteId2 = CreateSprite(&sSpriteTemplate_LinkMonShadow, 128, 80, 0); + StartSpriteAnim(&gSprites[sTradeAnim->connectionSpriteId2], ANIM_LINKMON_SMALL); + sTradeAnim->state++; break; - case 28: - if ((sTradeData->bg1vofs -= 2) == 166) - { - sTradeData->state = 200; - } + case STATE_LINK_MON_TRAVEL_OUT: + if ((sTradeAnim->bg1vofs -= 2) == 166) + sTradeAnim->state = STATE_LINK_MON_TRAVEL_OFFSCREEN; SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_1 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG1_ON | DISPCNT_OBJ_ON); break; - case 200: - gSprites[sTradeData->tradeGlow1SpriteId].y -= 2; - gSprites[sTradeData->gbaScreenSpriteId].y -= 2; - if (gSprites[sTradeData->tradeGlow1SpriteId].y < -8) - { - sTradeData->state = 29; - } + case STATE_LINK_MON_TRAVEL_OFFSCREEN: + gSprites[sTradeAnim->connectionSpriteId1].y -= 2; + gSprites[sTradeAnim->connectionSpriteId2].y -= 2; + if (gSprites[sTradeAnim->connectionSpriteId1].y < -8) + sTradeAnim->state = STATE_FADE_OUT_TO_CROSSING; break; - case 29: + case STATE_FADE_OUT_TO_CROSSING: BeginNormalPaletteFade(PALETTES_ALL, -1, 0, 16, RGB_BLACK); - sTradeData->state = 30; + sTradeAnim->state = STATE_WAIT_FADE_OUT_TO_CROSSING; break; - case 30: + case STATE_WAIT_FADE_OUT_TO_CROSSING: if (!gPaletteFade.active) { - DestroySprite(&gSprites[sTradeData->tradeGlow1SpriteId]); - DestroySprite(&gSprites[sTradeData->gbaScreenSpriteId]); + DestroySprite(&gSprites[sTradeAnim->connectionSpriteId1]); + DestroySprite(&gSprites[sTradeAnim->connectionSpriteId2]); SetTradeSequenceBgGpuRegs(2); - sTradeData->state++; + sTradeAnim->state++; } break; - case 31: + case STATE_FADE_IN_TO_CROSSING: BeginNormalPaletteFade(PALETTES_ALL, -1, 16, 0, RGB_BLACK); - sTradeData->tradeGlow1SpriteId = CreateSprite(&sGlowBallSpriteTemplate, 111, 170, 0); - sTradeData->gbaScreenSpriteId = CreateSprite(&sGlowBallSpriteTemplate, 129, -10, 0); - sTradeData->state++; + sTradeAnim->connectionSpriteId1 = CreateSprite(&sSpriteTemplate_LinkMonShadow, 111, 170, 0); + sTradeAnim->connectionSpriteId2 = CreateSprite(&sSpriteTemplate_LinkMonShadow, 129, -10, 0); + sTradeAnim->state++; break; - case 32: + case STATE_WAIT_FADE_IN_TO_CROSSING: if (!gPaletteFade.active) { PlaySE(SE_WARP_OUT); - sTradeData->state++; + sTradeAnim->state++; } - gSprites[sTradeData->tradeGlow1SpriteId].y2 -= 3; - gSprites[sTradeData->gbaScreenSpriteId].y2 += 3; + gSprites[sTradeAnim->connectionSpriteId1].y2 -= 3; + gSprites[sTradeAnim->connectionSpriteId2].y2 += 3; break; - case 33: - gSprites[sTradeData->tradeGlow1SpriteId].y2 -= 3; - gSprites[sTradeData->gbaScreenSpriteId].y2 += 3; - if (gSprites[sTradeData->tradeGlow1SpriteId].y2 <= -90) + case STATE_CROSSING_LINK_MONS_ENTER: + gSprites[sTradeAnim->connectionSpriteId1].y2 -= 3; + gSprites[sTradeAnim->connectionSpriteId2].y2 += 3; + if (gSprites[sTradeAnim->connectionSpriteId1].y2 <= -90) { - gSprites[sTradeData->tradeGlow1SpriteId].data[1] = 1; - gSprites[sTradeData->gbaScreenSpriteId].data[1] = 1; - sTradeData->state++; + gSprites[sTradeAnim->connectionSpriteId1].data[1] = 1; + gSprites[sTradeAnim->connectionSpriteId2].data[1] = 1; + sTradeAnim->state++; } break; - case 34: + case STATE_CROSSING_BLEND_WHITE_1: BlendPalettes(0x1, 16, RGB_WHITEALPHA); - sTradeData->state++; + sTradeAnim->state++; break; - case 35: + case STATE_CROSSING_BLEND_WHITE_2: BlendPalettes(0x1, 0, RGB_WHITEALPHA); - sTradeData->state++; + sTradeAnim->state++; break; - case 36: + case STATE_CROSSING_BLEND_WHITE_3: BlendPalettes(0x1, 16, RGB_WHITEALPHA); - sTradeData->state++; + sTradeAnim->state++; break; - case 37: - if (!IsPokeSpriteNotFlipped(sTradeData->tradeSpecies[0])) + case STATE_CROSSING_CREATE_MON_PICS: + if (!IsMonSpriteNotFlipped(sTradeAnim->monSpecies[TRADE_PLAYER])) { - gSprites[sTradeData->pokePicSpriteIdxs[0]].affineAnims = sSpriteAffineAnimTable_PlayerPokePicAlt; - gSprites[sTradeData->pokePicSpriteIdxs[0]].oam.affineMode = ST_OAM_AFFINE_DOUBLE; - CalcCenterToCornerVec(&gSprites[sTradeData->pokePicSpriteIdxs[0]], 0, 3, 3); - StartSpriteAffineAnim(&gSprites[sTradeData->pokePicSpriteIdxs[0]], 0); + gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]].affineAnims = sAffineAnims_CrossingMonPics; + gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]].oam.affineMode = ST_OAM_AFFINE_DOUBLE; + CalcCenterToCornerVec(&gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]], SPRITE_SHAPE(64x64), SPRITE_SIZE(64x64), ST_OAM_AFFINE_DOUBLE); + StartSpriteAffineAnim(&gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]], 0); } else { - StartSpriteAffineAnim(&gSprites[sTradeData->pokePicSpriteIdxs[0]], 0); + StartSpriteAffineAnim(&gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]], 0); } - StartSpriteAffineAnim(&gSprites[sTradeData->pokePicSpriteIdxs[1]], 0); - gSprites[sTradeData->pokePicSpriteIdxs[0]].x = 60; - gSprites[sTradeData->pokePicSpriteIdxs[1]].x = 180; - gSprites[sTradeData->pokePicSpriteIdxs[0]].y = 192; - gSprites[sTradeData->pokePicSpriteIdxs[1]].y = -32; - gSprites[sTradeData->pokePicSpriteIdxs[0]].invisible = FALSE; - gSprites[sTradeData->pokePicSpriteIdxs[1]].invisible = FALSE; - sTradeData->state++; + StartSpriteAffineAnim(&gSprites[sTradeAnim->monSpriteIds[TRADE_PARTNER]], 0); + gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]].x = 60; + gSprites[sTradeAnim->monSpriteIds[TRADE_PARTNER]].x = 180; + gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]].y = 192; + gSprites[sTradeAnim->monSpriteIds[TRADE_PARTNER]].y = -32; + gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]].invisible = FALSE; + gSprites[sTradeAnim->monSpriteIds[TRADE_PARTNER]].invisible = FALSE; + sTradeAnim->state++; break; - case 38: - gSprites[sTradeData->pokePicSpriteIdxs[0]].y2 -= 3; - gSprites[sTradeData->pokePicSpriteIdxs[1]].y2 += 3; - if (gSprites[sTradeData->pokePicSpriteIdxs[0]].y2 < -160 && gSprites[sTradeData->pokePicSpriteIdxs[0]].y2 >= -163) + case STATE_CROSSING_MON_PICS_MOVE: + gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]].y2 -= 3; + gSprites[sTradeAnim->monSpriteIds[TRADE_PARTNER]].y2 += 3; + if (gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]].y2 < -DISPLAY_HEIGHT + && gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]].y2 >= -DISPLAY_HEIGHT - 3) { PlaySE(SE_WARP_IN); } - if (gSprites[sTradeData->pokePicSpriteIdxs[0]].y2 < -222) + if (gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]].y2 < -222) { - gSprites[sTradeData->tradeGlow1SpriteId].data[1] = 0; - gSprites[sTradeData->gbaScreenSpriteId].data[1] = 0; - sTradeData->state++; - gSprites[sTradeData->pokePicSpriteIdxs[0]].invisible = TRUE; - gSprites[sTradeData->pokePicSpriteIdxs[1]].invisible = TRUE; + gSprites[sTradeAnim->connectionSpriteId1].data[1] = 0; + gSprites[sTradeAnim->connectionSpriteId2].data[1] = 0; + sTradeAnim->state++; + gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]].invisible = TRUE; + gSprites[sTradeAnim->monSpriteIds[TRADE_PARTNER]].invisible = TRUE; BlendPalettes(0x1, 0, RGB_WHITEALPHA); } break; - case 39: - gSprites[sTradeData->tradeGlow1SpriteId].y2 -= 3; - gSprites[sTradeData->gbaScreenSpriteId].y2 += 3; - if (gSprites[sTradeData->tradeGlow1SpriteId].y2 <= -222) + case STATE_CROSSING_LINK_MONS_EXIT: + gSprites[sTradeAnim->connectionSpriteId1].y2 -= 3; + gSprites[sTradeAnim->connectionSpriteId2].y2 += 3; + if (gSprites[sTradeAnim->connectionSpriteId1].y2 <= -222) { BeginNormalPaletteFade(PALETTES_ALL, -1, 0, 16, RGB_BLACK); - sTradeData->state++; - DestroySprite(&gSprites[sTradeData->tradeGlow1SpriteId]); - DestroySprite(&gSprites[sTradeData->gbaScreenSpriteId]); + sTradeAnim->state++; + DestroySprite(&gSprites[sTradeAnim->connectionSpriteId1]); + DestroySprite(&gSprites[sTradeAnim->connectionSpriteId2]); } break; - case 40: + case STATE_CREATE_LINK_MON_ARRIVING: if (!gPaletteFade.active) { - sTradeData->state++; + sTradeAnim->state++; SetTradeSequenceBgGpuRegs(1); - sTradeData->bg1vofs = 166; - sTradeData->tradeGlow1SpriteId = CreateSprite(&sTradeGlow1SpriteTemplate, 128, -20, 3); - sTradeData->gbaScreenSpriteId = CreateSprite(&sGlowBallSpriteTemplate, 128, -20, 0); - StartSpriteAnim(&gSprites[sTradeData->gbaScreenSpriteId], 1); + sTradeAnim->bg1vofs = 166; + sTradeAnim->connectionSpriteId1 = CreateSprite(&sSpriteTemplate_LinkMonGlow, 128, -20, 3); + sTradeAnim->connectionSpriteId2 = CreateSprite(&sSpriteTemplate_LinkMonShadow, 128, -20, 0); + StartSpriteAnim(&gSprites[sTradeAnim->connectionSpriteId2], ANIM_LINKMON_SMALL); } break; - case 41: + case STATE_FADE_OUT_TO_GBA_RECV: BeginNormalPaletteFade(PALETTES_ALL, -1, 16, 0, RGB_BLACK); - sTradeData->state++; + sTradeAnim->state++; break; - case 42: + case STATE_WAIT_FADE_OUT_TO_GBA_RECV: SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG1_ON | DISPCNT_OBJ_ON); if (!gPaletteFade.active) + sTradeAnim->state++; + break; + case STATE_LINK_MON_TRAVEL_IN: + gSprites[sTradeAnim->connectionSpriteId1].y2 += 3; + gSprites[sTradeAnim->connectionSpriteId2].y2 += 3; + if (gSprites[sTradeAnim->connectionSpriteId1].y2 + gSprites[sTradeAnim->connectionSpriteId1].y == 64) + sTradeAnim->state++; + break; + case STATE_PAN_TO_GBA: + if ((sTradeAnim->bg1vofs += 2) > 316) { - sTradeData->state++; + sTradeAnim->bg1vofs = 316; + sTradeAnim->state++; } break; - case 43: - gSprites[sTradeData->tradeGlow1SpriteId].y2 += 3; - gSprites[sTradeData->gbaScreenSpriteId].y2 += 3; - if (gSprites[sTradeData->tradeGlow1SpriteId].y2 + gSprites[sTradeData->tradeGlow1SpriteId].y == 64) + case STATE_DESTROY_LINK_MON: + DestroySprite(&gSprites[sTradeAnim->connectionSpriteId1]); + DestroySprite(&gSprites[sTradeAnim->connectionSpriteId2]); + sTradeAnim->state++; + sTradeAnim->timer = 0; + break; + case STATE_LINK_MON_ARRIVED_DELAY: + if (++sTradeAnim->timer == 10) + sTradeAnim->state++; + break; + case STATE_MOVE_GBA_TO_CENTER: + if (++sTradeAnim->bg1vofs > 348) { - sTradeData->state++; + sTradeAnim->bg1vofs = 348; + sTradeAnim->state++; + } + if (sTradeAnim->bg1vofs == 328 && sTradeAnim->isCableTrade) + { + sTradeAnim->cableEndSpriteId = CreateSprite(&sSpriteTemplate_CableEnd, 128, 65, 0); + gSprites[sTradeAnim->cableEndSpriteId].callback = SpriteCB_CableEndReceiving; } break; - case 44: - if ((sTradeData->bg1vofs += 2) > 316) - { - sTradeData->bg1vofs = 316; - sTradeData->state++; - } + case STATE_GBA_FLASH_RECV: + sTradeAnim->connectionSpriteId2 = CreateSprite(&sSpriteTemplate_GbaScreenFlash_Long, 120, 80, 0); + sTradeAnim->state = STATE_GBA_STOP_FLASH_RECV; break; - case 45: - DestroySprite(&gSprites[sTradeData->tradeGlow1SpriteId]); - DestroySprite(&gSprites[sTradeData->gbaScreenSpriteId]); - sTradeData->state++; - sTradeData->timer = 0; - break; - case 46: - if (++sTradeData->timer == 10) + case STATE_GBA_STOP_FLASH_RECV: + if (gSprites[sTradeAnim->connectionSpriteId2].animEnded) { - sTradeData->state++; - } - break; - case 47: - if (++sTradeData->bg1vofs > 348) - { - sTradeData->bg1vofs = 348; - sTradeData->state++; - } - if (sTradeData->bg1vofs == 328 && sTradeData->isCableTrade) - { - sTradeData->linkCableEndSpriteId = CreateSprite(&sGameLinkCableEndSpriteTemplate, 128, 65, 0); - gSprites[sTradeData->linkCableEndSpriteId].callback = SpriteCB_GameLinkCableEnd_Inbound; - } - break; - case 48: - sTradeData->gbaScreenSpriteId = CreateSprite(&sTradeGBAScreenSpriteTemplate1, 120, 80, 0); - sTradeData->state = 50; - break; - case 50: - if (gSprites[sTradeData->gbaScreenSpriteId].animEnded) - { - DestroySprite(&gSprites[sTradeData->gbaScreenSpriteId]); + DestroySprite(&gSprites[sTradeAnim->connectionSpriteId2]); SetTradeSequenceBgGpuRegs(6); - sTradeData->state++; + sTradeAnim->state++; PlaySE(SE_M_SAND_ATTACK); } break; - case 51: - if (sTradeData->bg2Zoom < 0x400) + case STATE_GBA_ZOOM_IN: + if (sTradeAnim->bg2Zoom < 0x400) { - sTradeData->bg2Zoom += 0x34; + sTradeAnim->bg2Zoom += 0x34; } else { - sTradeData->bg2Zoom = 0x400; - sTradeData->state++; + sTradeAnim->bg2Zoom = 0x400; + sTradeAnim->state++; } - sTradeData->sXY = 0x8000 / sTradeData->bg2Zoom; + sTradeAnim->sXY = 0x8000 / sTradeAnim->bg2Zoom; break; - case 52: + case STATE_FADE_OUT_TO_NEW_MON: BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); - sTradeData->state = 60; + sTradeAnim->state = STATE_WAIT_FADE_OUT_TO_NEW_MON; break; - case 60: + case STATE_WAIT_FADE_OUT_TO_NEW_MON: if (!gPaletteFade.active) { SetTradeSequenceBgGpuRegs(5); SetTradeSequenceBgGpuRegs(7); gPaletteFade.bufferTransferDisabled = TRUE; - sTradeData->state++; + sTradeAnim->state++; } break; - case 61: + case STATE_FADE_IN_TO_NEW_MON: gPaletteFade.bufferTransferDisabled = FALSE; BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); - sTradeData->state++; + sTradeAnim->state++; break; - case 62: + case STATE_WAIT_FADE_IN_TO_NEW_MON: SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG2_ON | DISPCNT_OBJ_ON); if (!gPaletteFade.active) { - sTradeData->state++; + sTradeAnim->state++; } break; - case 63: - sTradeData->pokeballSpriteId2 = CreateSprite(&sTradePokeballSpriteTemplate, 120, -8, 0); - gSprites[sTradeData->pokeballSpriteId2].data[3] = 74; - gSprites[sTradeData->pokeballSpriteId2].callback = SpriteCB_TradePokeball_Inbound; - StartSpriteAnim(&gSprites[sTradeData->pokeballSpriteId2], 1); - StartSpriteAffineAnim(&gSprites[sTradeData->pokeballSpriteId2], 2); - BlendPalettes(1 << (16 + gSprites[sTradeData->pokeballSpriteId2].oam.paletteNum), 16, RGB_WHITEALPHA); - sTradeData->state++; - sTradeData->timer = 0; + case STATE_POKEBALL_ARRIVE: + sTradeAnim->bouncingPokeballSpriteId = CreateSprite(&sSpriteTemplate_Pokeball, 120, -8, 0); + gSprites[sTradeAnim->bouncingPokeballSpriteId].data[3] = 74; + gSprites[sTradeAnim->bouncingPokeballSpriteId].callback = SpriteCB_BouncingPokeballArrive; + StartSpriteAnim(&gSprites[sTradeAnim->bouncingPokeballSpriteId], 1); + StartSpriteAffineAnim(&gSprites[sTradeAnim->bouncingPokeballSpriteId], 2); + BlendPalettes(1 << (16 + gSprites[sTradeAnim->bouncingPokeballSpriteId].oam.paletteNum), 16, RGB_WHITEALPHA); + sTradeAnim->state++; + sTradeAnim->timer = 0; break; - case 64: - BeginNormalPaletteFade(1 << (16 + gSprites[sTradeData->pokeballSpriteId2].oam.paletteNum), 1, 16, 0, RGB_WHITEALPHA); - sTradeData->state++; + case STATE_FADE_POKEBALL_TO_NORMAL: + BeginNormalPaletteFade(1 << (16 + gSprites[sTradeAnim->bouncingPokeballSpriteId].oam.paletteNum), 1, 16, 0, RGB_WHITEALPHA); + sTradeAnim->state++; break; - case 65: - if (gSprites[sTradeData->pokeballSpriteId2].callback == SpriteCallbackDummy) + case STATE_POKEBALL_ARRIVE_WAIT: + if (gSprites[sTradeAnim->bouncingPokeballSpriteId].callback == SpriteCallbackDummy) { - HandleLoadSpecialPokePic(&gMonFrontPicTable[sTradeData->tradeSpecies[1]], gMonSpritesGfxPtr->sprites[3], sTradeData->tradeSpecies[1], sTradeData->monPersonalities[1]); - sTradeData->state++; + HandleLoadSpecialPokePic(&gMonFrontPicTable[sTradeAnim->monSpecies[TRADE_PARTNER]], + gMonSpritesGfxPtr->sprites[B_POSITION_OPPONENT_RIGHT], + sTradeAnim->monSpecies[TRADE_PARTNER], + sTradeAnim->monPersonalities[TRADE_PARTNER]); + sTradeAnim->state++; } break; - case 66: - gSprites[sTradeData->pokePicSpriteIdxs[1]].x = 120; - gSprites[sTradeData->pokePicSpriteIdxs[1]].y = gMonFrontPicCoords[sTradeData->tradeSpecies[1]].y_offset + 60; - gSprites[sTradeData->pokePicSpriteIdxs[1]].x2 = 0; - gSprites[sTradeData->pokePicSpriteIdxs[1]].y2 = 0; - StartSpriteAnim(&gSprites[sTradeData->pokePicSpriteIdxs[1]], 0); - CreatePokeballSpriteToReleaseMon(sTradeData->pokePicSpriteIdxs[1], gSprites[sTradeData->pokePicSpriteIdxs[1]].oam.paletteNum, 120, 84, 2, 1, 20, 0xFFFFF); - FreeSpriteOamMatrix(&gSprites[sTradeData->pokeballSpriteId2]); - DestroySprite(&gSprites[sTradeData->pokeballSpriteId2]); - sTradeData->state++; + case STATE_SHOW_NEW_MON: + gSprites[sTradeAnim->monSpriteIds[TRADE_PARTNER]].x = 120; + gSprites[sTradeAnim->monSpriteIds[TRADE_PARTNER]].y = gMonFrontPicCoords[sTradeAnim->monSpecies[TRADE_PARTNER]].y_offset + 60; + gSprites[sTradeAnim->monSpriteIds[TRADE_PARTNER]].x2 = 0; + gSprites[sTradeAnim->monSpriteIds[TRADE_PARTNER]].y2 = 0; + StartSpriteAnim(&gSprites[sTradeAnim->monSpriteIds[TRADE_PARTNER]], 0); + CreatePokeballSpriteToReleaseMon(sTradeAnim->monSpriteIds[TRADE_PARTNER], gSprites[sTradeAnim->monSpriteIds[TRADE_PARTNER]].oam.paletteNum, 120, 84, 2, 1, 20, 0xFFFFF); + FreeSpriteOamMatrix(&gSprites[sTradeAnim->bouncingPokeballSpriteId]); + DestroySprite(&gSprites[sTradeAnim->bouncingPokeballSpriteId]); + sTradeAnim->state++; break; - case 67: + case STATE_NEW_MON_MSG: SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | @@ -1666,86 +1729,72 @@ static bool8 DoTradeAnim_Cable(void) DISPCNT_OBJ_ON); StringExpandPlaceholders(gStringVar4, gText_XSentOverY); DrawTextOnTradeWindow(0, gStringVar4, 0); - sTradeData->state = 167; - sTradeData->timer = 0; + sTradeAnim->state = STATE_DELAY_FOR_MON_ANIM; + sTradeAnim->timer = 0; break; - // 167 and 267 are extra cases added in for animations - case 167: - if (++sTradeData->timer > 60) + case STATE_DELAY_FOR_MON_ANIM: + if (++sTradeAnim->timer > 60) { - if (sTradeData->tradeSpecies[1] != SPECIES_EGG) - { - PlayCry_Normal(sTradeData->tradeSpecies[1], 0); - } - sTradeData->state = 267; - sTradeData->timer = 0; + if (sTradeAnim->monSpecies[TRADE_PARTNER] != SPECIES_EGG) + PlayCry_Normal(sTradeAnim->monSpecies[TRADE_PARTNER], 0); + sTradeAnim->state = STATE_WAIT_FOR_MON_CRY; + sTradeAnim->timer = 0; } break; - case 267: + case STATE_WAIT_FOR_MON_CRY: if (IsCryFinished()) - { - sTradeData->state = 68; - } + sTradeAnim->state = STATE_TAKE_CARE_OF_MON; break; - case 68: - if (++sTradeData->timer == 10) - { + case STATE_TAKE_CARE_OF_MON: + if (++sTradeAnim->timer == 10) PlayFanfare(MUS_EVOLVED); - } - if (sTradeData->timer == 250) + + if (sTradeAnim->timer == 250) { - sTradeData->state++; + sTradeAnim->state++; StringExpandPlaceholders(gStringVar4, gText_TakeGoodCareOfX); DrawTextOnTradeWindow(0, gStringVar4, 0); - sTradeData->timer = 0; + sTradeAnim->timer = 0; } break; - case 69: - if (++sTradeData->timer == 60) - { - sTradeData->state++; - } + case STATE_AFTER_NEW_MON_DELAY: + if (++sTradeAnim->timer == 60) + sTradeAnim->state++; break; - case 70: + case STATE_CHECK_RIBBONS: CheckPartnersMonForRibbons(); - sTradeData->state++; + sTradeAnim->state++; break; - case 71: - if (sTradeData->isLinkTrade) - { + case STATE_END_LINK_TRADE: + if (sTradeAnim->isLinkTrade) return TRUE; - } else if (JOY_NEW(A_BUTTON)) - { - sTradeData->state++; - } + sTradeAnim->state++; break; - case 72: // Only if in-game trade + case STATE_TRY_EVOLUTION: // Only if in-game trade, link trades use CB2_TryLinkTradeEvolution TradeMons(gSpecialVar_0x8005, 0); - gCB2_AfterEvolution = CB2_RunTradeAnim_InGameTrade; - evoTarget = GetEvolutionTargetSpecies(&gPlayerParty[gSelectedTradeMonPositions[0]], EVO_MODE_TRADE, ITEM_NONE); + gCB2_AfterEvolution = CB2_InGameTrade; + evoTarget = GetEvolutionTargetSpecies(&gPlayerParty[gSelectedTradeMonPositions[TRADE_PLAYER]], EVO_MODE_TRADE, ITEM_NONE); if (evoTarget != SPECIES_NONE) - { - TradeEvolutionScene(&gPlayerParty[gSelectedTradeMonPositions[0]], evoTarget, sTradeData->pokePicSpriteIdxs[1], gSelectedTradeMonPositions[0]); - } - sTradeData->state++; + TradeEvolutionScene(&gPlayerParty[gSelectedTradeMonPositions[TRADE_PLAYER]], evoTarget, sTradeAnim->monSpriteIds[1], gSelectedTradeMonPositions[TRADE_PLAYER]); + sTradeAnim->state++; break; - case 73: + case STATE_FADE_OUT_END: BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); - sTradeData->state++; + sTradeAnim->state++; break; - case 74: + case STATE_WAIT_FADE_OUT_END: if (!gPaletteFade.active) { - PlayNewMapMusic(sTradeData->cachedMapMusic); - if (sTradeData) + PlayNewMapMusic(sTradeAnim->cachedMapMusic); + if (sTradeAnim) { FreeAllWindowBuffers(); Free(GetBgTilemapBuffer(3)); Free(GetBgTilemapBuffer(1)); Free(GetBgTilemapBuffer(0)); FreeMonSpritesGfx(); - FREE_AND_SET_NULL(sTradeData); + FREE_AND_SET_NULL(sTradeAnim); } SetMainCallback2(CB2_ReturnToField); BufferInGameTradeMonName(); @@ -1756,430 +1805,423 @@ static bool8 DoTradeAnim_Cable(void) return FALSE; } +// Task data for Task_AnimateWirelessSignal +#define tIdx data[0] +#define tCounter data[1] +#define tSignalComingBack data[2] + static bool8 DoTradeAnim_Wireless(void) { u16 evoTarget; - switch (sTradeData->state) + switch (sTradeAnim->state) { - case 0: - gSprites[sTradeData->pokePicSpriteIdxs[0]].invisible = FALSE; - gSprites[sTradeData->pokePicSpriteIdxs[0]].x2 = -180; - gSprites[sTradeData->pokePicSpriteIdxs[0]].y2 = gMonFrontPicCoords[sTradeData->tradeSpecies[0]].y_offset; - sTradeData->state++; - sTradeData->cachedMapMusic = GetCurrentMapMusic(); + case STATE_START: + gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]].invisible = FALSE; + gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]].x2 = -180; + gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]].y2 = gMonFrontPicCoords[sTradeAnim->monSpecies[TRADE_PLAYER]].y_offset; + sTradeAnim->state++; + sTradeAnim->cachedMapMusic = GetCurrentMapMusic(); PlayNewMapMusic(MUS_EVOLUTION); break; - case 1: - if (sTradeData->bg2hofs > 0) + case STATE_MON_SLIDE_IN: + if (sTradeAnim->bg2hofs > 0) { - gSprites[sTradeData->pokePicSpriteIdxs[0]].x2 += 3; - sTradeData->bg2hofs -= 3; + gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]].x2 += 3; + sTradeAnim->bg2hofs -= 3; } else { - gSprites[sTradeData->pokePicSpriteIdxs[0]].x2 = 0; - sTradeData->bg2hofs = 0; - sTradeData->state = 10; + gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]].x2 = 0; + sTradeAnim->bg2hofs = 0; + sTradeAnim->state = STATE_SEND_MSG; } break; - case 10: + case STATE_SEND_MSG: StringExpandPlaceholders(gStringVar4, gText_XWillBeSentToY); DrawTextOnTradeWindow(0, gStringVar4, 0); - if (sTradeData->tradeSpecies[0] != SPECIES_EGG) - { - PlayCry_Normal(sTradeData->tradeSpecies[0], 0); - } + if (sTradeAnim->monSpecies[TRADE_PLAYER] != SPECIES_EGG) + PlayCry_Normal(sTradeAnim->monSpecies[TRADE_PLAYER], 0); - sTradeData->state = 11; - sTradeData->timer = 0; + sTradeAnim->state = STATE_BYE_BYE; + sTradeAnim->timer = 0; break; - case 11: - if (++sTradeData->timer == 80) + case STATE_BYE_BYE: + if (++sTradeAnim->timer == 80) { - sTradeData->pokeballSpriteId = CreateTradePokeballSprite(sTradeData->pokePicSpriteIdxs[0], gSprites[sTradeData->pokePicSpriteIdxs[0]].oam.paletteNum, 120, 32, 2, 1, 0x14, 0xfffff); - sTradeData->state++; + sTradeAnim->releasePokeballSpriteId = CreateTradePokeballSprite(sTradeAnim->monSpriteIds[TRADE_PLAYER], gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]].oam.paletteNum, 120, 32, 2, 1, 0x14, 0xfffff); + sTradeAnim->state++; StringExpandPlaceholders(gStringVar4, gText_ByeByeVar1); DrawTextOnTradeWindow(0, gStringVar4, 0); } break; - case 12: - if (gSprites[sTradeData->pokeballSpriteId].callback == SpriteCallbackDummy) + case STATE_POKEBALL_DEPART: + if (gSprites[sTradeAnim->releasePokeballSpriteId].callback == SpriteCallbackDummy) { - sTradeData->pokeballSpriteId2 = CreateSprite(&sTradePokeballSpriteTemplate, 120, 32, 0); - gSprites[sTradeData->pokeballSpriteId2].callback = SpriteCB_TradePokeball_Outbound; - DestroySprite(&gSprites[sTradeData->pokeballSpriteId]); - sTradeData->state++; + sTradeAnim->bouncingPokeballSpriteId = CreateSprite(&sSpriteTemplate_Pokeball, 120, 32, 0); + gSprites[sTradeAnim->bouncingPokeballSpriteId].callback = SpriteCB_BouncingPokeballDepart; + DestroySprite(&gSprites[sTradeAnim->releasePokeballSpriteId]); + sTradeAnim->state++; } break; - case 13: + case STATE_POKEBALL_DEPART_WAIT: // The game waits here for the sprite to finish its animation sequence. break; - case 14: + case STATE_FADE_OUT_TO_GBA_SEND: BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); - sTradeData->state = 20; + sTradeAnim->state = STATE_WAIT_FADE_OUT_TO_GBA_SEND; break; - case 20: + case STATE_WAIT_FADE_OUT_TO_GBA_SEND: if (!gPaletteFade.active) { SetTradeSequenceBgGpuRegs(4); FillWindowPixelBuffer(0, PIXEL_FILL(15)); CopyWindowToVram(0, COPYWIN_FULL); - sTradeData->state++; + sTradeAnim->state++; } break; - case 21: + case STATE_FADE_IN_TO_GBA_SEND: BeginNormalPaletteFade(PALETTES_ALL, -1, 16, 0, RGB_BLACK); - sTradeData->state++; + sTradeAnim->state++; break; - case 22: + case STATE_WAIT_FADE_IN_TO_GBA_SEND: if (!gPaletteFade.active) - { - sTradeData->state = 23; - } + sTradeAnim->state = STATE_GBA_ZOOM_OUT; break; - case 23: - if (sTradeData->bg2Zoom > 0x100) + case STATE_GBA_ZOOM_OUT: + if (sTradeAnim->bg2Zoom > 0x100) { - sTradeData->bg2Zoom -= 0x34; + sTradeAnim->bg2Zoom -= 0x34; } else { SetTradeSequenceBgGpuRegs(1); - sTradeData->bg2Zoom = 0x80; - sTradeData->state = 124; - sTradeData->timer = 0; + sTradeAnim->bg2Zoom = 0x80; + sTradeAnim->state = STATE_GBA_FLASH_SEND_WIRELESS; + sTradeAnim->timer = 0; } - sTradeData->sXY = 0x8000 / sTradeData->bg2Zoom; + sTradeAnim->sXY = 0x8000 / sTradeAnim->bg2Zoom; break; - case 124: - if (++sTradeData->timer > 20) + case STATE_GBA_FLASH_SEND_WIRELESS: + if (++sTradeAnim->timer > 20) { SetTradeSequenceBgGpuRegs(3); - sTradeData->gbaScreenSpriteId = CreateSprite(&sTradeGBAScreenSpriteTemplate2, 120, 80, 0); - sTradeData->state++; + sTradeAnim->connectionSpriteId2 = CreateSprite(&sSpriteTemplate_GbaScreenFlash_Short, 120, 80, 0); + sTradeAnim->state++; } break; - case 125: - if (gSprites[sTradeData->gbaScreenSpriteId].animEnded) + case STATE_GBA_STOP_FLASH_SEND_WIRELESS: + if (gSprites[sTradeAnim->connectionSpriteId2].animEnded) { - DestroySprite(&gSprites[sTradeData->gbaScreenSpriteId]); + DestroySprite(&gSprites[sTradeAnim->connectionSpriteId2]); SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 | BLDCNT_TGT1_OBJ | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG2); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16, 4)); + + // Start wireless signal effect CreateTask(Task_AnimateWirelessSignal, 5); - sTradeData->state++; + sTradeAnim->state++; } break; - case 126: + case STATE_WAIT_WIRELESS_SIGNAL_SEND: if (!FuncIsActiveTask(Task_AnimateWirelessSignal)) - { - sTradeData->state = 26; - } + sTradeAnim->state = STATE_PAN_AWAY_GBA; break; - case 26: - if (--sTradeData->bg1vofs == 316) - { - sTradeData->state++; - } + case STATE_PAN_AWAY_GBA: + if (--sTradeAnim->bg1vofs == 316) + sTradeAnim->state++; break; - case 27: - sTradeData->tradeGlow1SpriteId = CreateSprite(&sTradeGlow1SpriteTemplate, 120, 80, 3); - gSprites[sTradeData->tradeGlow1SpriteId].callback = SpriteCB_TradeGlowWireless; - sTradeData->gbaScreenSpriteId = CreateSprite(&sGlowBallSpriteTemplate, 120, 80, 0); - StartSpriteAnim(&gSprites[sTradeData->gbaScreenSpriteId], 1); - sTradeData->state++; + case STATE_CREATE_LINK_MON_LEAVING: + sTradeAnim->connectionSpriteId1 = CreateSprite(&sSpriteTemplate_LinkMonGlow, 120, 80, 3); + gSprites[sTradeAnim->connectionSpriteId1].callback = SpriteCB_LinkMonGlowWireless; + sTradeAnim->connectionSpriteId2 = CreateSprite(&sSpriteTemplate_LinkMonShadow, 120, 80, 0); + StartSpriteAnim(&gSprites[sTradeAnim->connectionSpriteId2], ANIM_LINKMON_SMALL); + sTradeAnim->state++; break; - case 28: - if ((sTradeData->bg1vofs -= 3) == 166) - { - sTradeData->state = 200; - } + case STATE_LINK_MON_TRAVEL_OUT: + if ((sTradeAnim->bg1vofs -= 3) == 166) + sTradeAnim->state = STATE_LINK_MON_TRAVEL_OFFSCREEN; + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_1 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG1_ON | DISPCNT_OBJ_ON); break; - case 200: - gSprites[sTradeData->tradeGlow1SpriteId].y -= 2; - gSprites[sTradeData->gbaScreenSpriteId].y -= 2; - if (gSprites[sTradeData->tradeGlow1SpriteId].y < -8) - { - sTradeData->state = 29; - } + case STATE_LINK_MON_TRAVEL_OFFSCREEN: + gSprites[sTradeAnim->connectionSpriteId1].y -= 2; + gSprites[sTradeAnim->connectionSpriteId2].y -= 2; + if (gSprites[sTradeAnim->connectionSpriteId1].y < -8) + sTradeAnim->state = STATE_FADE_OUT_TO_CROSSING; break; - case 29: + case STATE_FADE_OUT_TO_CROSSING: BeginNormalPaletteFade(PALETTES_ALL, -1, 0, 16, RGB_BLACK); - sTradeData->state = 30; + sTradeAnim->state = STATE_WAIT_FADE_OUT_TO_CROSSING; break; - case 30: + case STATE_WAIT_FADE_OUT_TO_CROSSING: if (!gPaletteFade.active) { - DestroySprite(&gSprites[sTradeData->tradeGlow1SpriteId]); - DestroySprite(&gSprites[sTradeData->gbaScreenSpriteId]); + DestroySprite(&gSprites[sTradeAnim->connectionSpriteId1]); + DestroySprite(&gSprites[sTradeAnim->connectionSpriteId2]); SetTradeSequenceBgGpuRegs(2); - sTradeData->state++; + sTradeAnim->state++; } break; - case 31: + case STATE_FADE_IN_TO_CROSSING: BeginNormalPaletteFade(PALETTES_ALL, -1, 16, 0, RGB_BLACK); - sTradeData->tradeGlow1SpriteId = CreateSprite(&sGlowBallSpriteTemplate, 111, 170, 0); - sTradeData->gbaScreenSpriteId = CreateSprite(&sGlowBallSpriteTemplate, 129, -10, 0); - sTradeData->state++; + sTradeAnim->connectionSpriteId1 = CreateSprite(&sSpriteTemplate_LinkMonShadow, 111, 170, 0); + sTradeAnim->connectionSpriteId2 = CreateSprite(&sSpriteTemplate_LinkMonShadow, 129, -10, 0); + sTradeAnim->state++; break; - case 32: + case STATE_WAIT_FADE_IN_TO_CROSSING: if (!gPaletteFade.active) { PlaySE(SE_WARP_OUT); - sTradeData->state++; + sTradeAnim->state++; } - gSprites[sTradeData->tradeGlow1SpriteId].y2 -= 3; - gSprites[sTradeData->gbaScreenSpriteId].y2 += 3; + gSprites[sTradeAnim->connectionSpriteId1].y2 -= 3; + gSprites[sTradeAnim->connectionSpriteId2].y2 += 3; break; - case 33: - gSprites[sTradeData->tradeGlow1SpriteId].y2 -= 3; - gSprites[sTradeData->gbaScreenSpriteId].y2 += 3; - if (gSprites[sTradeData->tradeGlow1SpriteId].y2 <= -90) + case STATE_CROSSING_LINK_MONS_ENTER: + gSprites[sTradeAnim->connectionSpriteId1].y2 -= 3; + gSprites[sTradeAnim->connectionSpriteId2].y2 += 3; + if (gSprites[sTradeAnim->connectionSpriteId1].y2 <= -90) { - gSprites[sTradeData->tradeGlow1SpriteId].data[1] = 1; - gSprites[sTradeData->gbaScreenSpriteId].data[1] = 1; - sTradeData->state++; + gSprites[sTradeAnim->connectionSpriteId1].data[1] = 1; + gSprites[sTradeAnim->connectionSpriteId2].data[1] = 1; + sTradeAnim->state++; CreateTask(Task_OpenCenterWhiteColumn, 5); } break; - case 34: + case STATE_CROSSING_BLEND_WHITE_1: BlendPalettes(0x8, 16, RGB_WHITEALPHA); - sTradeData->state++; + sTradeAnim->state++; break; - case 35: + case STATE_CROSSING_BLEND_WHITE_2: BlendPalettes(0x8, 16, RGB_WHITEALPHA); - sTradeData->state++; + sTradeAnim->state++; break; - case 36: + case STATE_CROSSING_BLEND_WHITE_3: BlendPalettes(0x8, 16, RGB_WHITEALPHA); - sTradeData->state++; + sTradeAnim->state++; break; - case 37: - if (!IsPokeSpriteNotFlipped(sTradeData->tradeSpecies[0])) + case STATE_CROSSING_CREATE_MON_PICS: + if (!IsMonSpriteNotFlipped(sTradeAnim->monSpecies[TRADE_PLAYER])) { - gSprites[sTradeData->pokePicSpriteIdxs[0]].affineAnims = sSpriteAffineAnimTable_PlayerPokePicAlt; - gSprites[sTradeData->pokePicSpriteIdxs[0]].oam.affineMode = ST_OAM_AFFINE_DOUBLE; - CalcCenterToCornerVec(&gSprites[sTradeData->pokePicSpriteIdxs[0]], 0, 3, 3); - StartSpriteAffineAnim(&gSprites[sTradeData->pokePicSpriteIdxs[0]], 0); + gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]].affineAnims = sAffineAnims_CrossingMonPics; + gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]].oam.affineMode = ST_OAM_AFFINE_DOUBLE; + CalcCenterToCornerVec(&gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]], SPRITE_SHAPE(64x64), SPRITE_SIZE(64x64), ST_OAM_AFFINE_DOUBLE); + StartSpriteAffineAnim(&gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]], 0); } else { - StartSpriteAffineAnim(&gSprites[sTradeData->pokePicSpriteIdxs[0]], 0); + StartSpriteAffineAnim(&gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]], 0); } - StartSpriteAffineAnim(&gSprites[sTradeData->pokePicSpriteIdxs[1]], 0); - gSprites[sTradeData->pokePicSpriteIdxs[0]].x = 40; - gSprites[sTradeData->pokePicSpriteIdxs[1]].x = 200; - gSprites[sTradeData->pokePicSpriteIdxs[0]].y = 192; - gSprites[sTradeData->pokePicSpriteIdxs[1]].y = -32; - gSprites[sTradeData->pokePicSpriteIdxs[0]].invisible = FALSE; - gSprites[sTradeData->pokePicSpriteIdxs[1]].invisible = FALSE; - sTradeData->state++; + StartSpriteAffineAnim(&gSprites[sTradeAnim->monSpriteIds[TRADE_PARTNER]], 0); + gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]].x = 40; + gSprites[sTradeAnim->monSpriteIds[TRADE_PARTNER]].x = 200; + gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]].y = 192; + gSprites[sTradeAnim->monSpriteIds[TRADE_PARTNER]].y = -32; + gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]].invisible = FALSE; + gSprites[sTradeAnim->monSpriteIds[TRADE_PARTNER]].invisible = FALSE; + sTradeAnim->state++; break; - case 38: - gSprites[sTradeData->pokePicSpriteIdxs[0]].y2 -= 3; - gSprites[sTradeData->pokePicSpriteIdxs[1]].y2 += 3; - if (gSprites[sTradeData->pokePicSpriteIdxs[0]].y2 < -160 && gSprites[sTradeData->pokePicSpriteIdxs[0]].y2 >= -163) + case STATE_CROSSING_MON_PICS_MOVE: + gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]].y2 -= 3; + gSprites[sTradeAnim->monSpriteIds[TRADE_PARTNER]].y2 += 3; + if (gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]].y2 < -DISPLAY_HEIGHT + && gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]].y2 >= -DISPLAY_HEIGHT - 3) { PlaySE(SE_WARP_IN); } - if (gSprites[sTradeData->pokePicSpriteIdxs[0]].y2 < -222) + if (gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]].y2 < -222) { - gSprites[sTradeData->tradeGlow1SpriteId].data[1] = 0; - gSprites[sTradeData->gbaScreenSpriteId].data[1] = 0; - sTradeData->state++; - gSprites[sTradeData->pokePicSpriteIdxs[0]].invisible = TRUE; - gSprites[sTradeData->pokePicSpriteIdxs[1]].invisible = TRUE; + gSprites[sTradeAnim->connectionSpriteId1].data[1] = 0; + gSprites[sTradeAnim->connectionSpriteId2].data[1] = 0; + sTradeAnim->state++; + gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]].invisible = TRUE; + gSprites[sTradeAnim->monSpriteIds[TRADE_PARTNER]].invisible = TRUE; CreateTask(Task_CloseCenterWhiteColumn, 5); } break; - case 39: - gSprites[sTradeData->tradeGlow1SpriteId].y2 -= 3; - gSprites[sTradeData->gbaScreenSpriteId].y2 += 3; - if (gSprites[sTradeData->tradeGlow1SpriteId].y2 <= -222) + case STATE_CROSSING_LINK_MONS_EXIT: + gSprites[sTradeAnim->connectionSpriteId1].y2 -= 3; + gSprites[sTradeAnim->connectionSpriteId2].y2 += 3; + if (gSprites[sTradeAnim->connectionSpriteId1].y2 <= -222) { BeginNormalPaletteFade(PALETTES_ALL, -1, 0, 16, RGB_BLACK); - sTradeData->state++; - DestroySprite(&gSprites[sTradeData->tradeGlow1SpriteId]); - DestroySprite(&gSprites[sTradeData->gbaScreenSpriteId]); + sTradeAnim->state++; + DestroySprite(&gSprites[sTradeAnim->connectionSpriteId1]); + DestroySprite(&gSprites[sTradeAnim->connectionSpriteId2]); } break; - case 40: + case STATE_CREATE_LINK_MON_ARRIVING: if (!gPaletteFade.active) { - sTradeData->state++; + sTradeAnim->state++; SetTradeSequenceBgGpuRegs(1); - sTradeData->bg1vofs = 166; + sTradeAnim->bg1vofs = 166; SetTradeSequenceBgGpuRegs(3); - sTradeData->bg2vofs = 412; - sTradeData->tradeGlow1SpriteId = CreateSprite(&sTradeGlow1SpriteTemplate, 120, -20, 3); - gSprites[sTradeData->tradeGlow1SpriteId].callback = SpriteCB_TradeGlowWireless; - sTradeData->gbaScreenSpriteId = CreateSprite(&sGlowBallSpriteTemplate, 120, -20, 0); - StartSpriteAnim(&gSprites[sTradeData->gbaScreenSpriteId], 1); + sTradeAnim->bg2vofs = 412; + sTradeAnim->connectionSpriteId1 = CreateSprite(&sSpriteTemplate_LinkMonGlow, 120, -20, 3); + gSprites[sTradeAnim->connectionSpriteId1].callback = SpriteCB_LinkMonGlowWireless; + sTradeAnim->connectionSpriteId2 = CreateSprite(&sSpriteTemplate_LinkMonShadow, 120, -20, 0); + StartSpriteAnim(&gSprites[sTradeAnim->connectionSpriteId2], 1); } break; - case 41: + case STATE_FADE_OUT_TO_GBA_RECV: BeginNormalPaletteFade(PALETTES_ALL, -1, 16, 0, RGB_BLACK); - sTradeData->state++; + sTradeAnim->state++; break; - case 42: + case STATE_WAIT_FADE_OUT_TO_GBA_RECV: SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG1_ON | DISPCNT_OBJ_ON); if (!gPaletteFade.active) + sTradeAnim->state++; + break; + case STATE_LINK_MON_TRAVEL_IN: + gSprites[sTradeAnim->connectionSpriteId1].y2 += 4; + gSprites[sTradeAnim->connectionSpriteId2].y2 += 4; + if (gSprites[sTradeAnim->connectionSpriteId1].y2 + gSprites[sTradeAnim->connectionSpriteId1].y == 64) { - sTradeData->state++; + sTradeAnim->state = STATE_PAN_TO_GBA_WIRELESS; + sTradeAnim->timer = 0; } break; - case 43: - gSprites[sTradeData->tradeGlow1SpriteId].y2 += 4; - gSprites[sTradeData->gbaScreenSpriteId].y2 += 4; - if (gSprites[sTradeData->tradeGlow1SpriteId].y2 + gSprites[sTradeData->tradeGlow1SpriteId].y == 64) - { - sTradeData->state = 144; - sTradeData->timer = 0; - } - break; - case 144: + case STATE_PAN_TO_GBA_WIRELESS: SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG1_ON | DISPCNT_BG2_ON | DISPCNT_OBJ_ON); - sTradeData->bg1vofs += 3; - sTradeData->bg2vofs += 3; - if (++sTradeData->timer == 10) + sTradeAnim->bg1vofs += 3; + sTradeAnim->bg2vofs += 3; + if (++sTradeAnim->timer == 10) { u8 taskId = CreateTask(Task_AnimateWirelessSignal, 5); - gTasks[taskId].data[2] = TRUE; + gTasks[taskId].tSignalComingBack = TRUE; } - if (sTradeData->bg1vofs > 316) + if (sTradeAnim->bg1vofs > 316) { - sTradeData->bg1vofs = 316; - sTradeData->state++; + sTradeAnim->bg1vofs = 316; + sTradeAnim->state++; } break; - case 145: - DestroySprite(&gSprites[sTradeData->tradeGlow1SpriteId]); - DestroySprite(&gSprites[sTradeData->gbaScreenSpriteId]); - sTradeData->state++; - sTradeData->timer = 0; + case STATE_DESTROY_LINK_MON_WIRELESS: + DestroySprite(&gSprites[sTradeAnim->connectionSpriteId1]); + DestroySprite(&gSprites[sTradeAnim->connectionSpriteId2]); + sTradeAnim->state++; + sTradeAnim->timer = 0; break; - case 146: + case STATE_WAIT_WIRELESS_SIGNAL_RECV: if (!FuncIsActiveTask(Task_AnimateWirelessSignal)) { - sTradeData->state = 46; - sTradeData->timer = 0; + sTradeAnim->state = STATE_LINK_MON_ARRIVED_DELAY; + sTradeAnim->timer = 0; } break; - case 46: - if (++sTradeData->timer == 10) + case STATE_LINK_MON_ARRIVED_DELAY: + if (++sTradeAnim->timer == 10) + sTradeAnim->state++; + break; + case STATE_MOVE_GBA_TO_CENTER: + if (++sTradeAnim->bg1vofs > 348) { - sTradeData->state++; + sTradeAnim->bg1vofs = 348; + sTradeAnim->state++; } break; - case 47: - if (++sTradeData->bg1vofs > 348) - { - sTradeData->bg1vofs = 348; - sTradeData->state++; - } + case STATE_GBA_FLASH_RECV: + sTradeAnim->connectionSpriteId2 = CreateSprite(&sSpriteTemplate_GbaScreenFlash_Long, 120, 80, 0); + sTradeAnim->state = STATE_GBA_STOP_FLASH_RECV; break; - case 48: - sTradeData->gbaScreenSpriteId = CreateSprite(&sTradeGBAScreenSpriteTemplate1, 120, 80, 0); - sTradeData->state = 50; - break; - case 50: - if (gSprites[sTradeData->gbaScreenSpriteId].animEnded) + case STATE_GBA_STOP_FLASH_RECV: + if (gSprites[sTradeAnim->connectionSpriteId2].animEnded) { - DestroySprite(&gSprites[sTradeData->gbaScreenSpriteId]); + DestroySprite(&gSprites[sTradeAnim->connectionSpriteId2]); SetTradeSequenceBgGpuRegs(6); - sTradeData->state++; + sTradeAnim->state++; PlaySE(SE_M_SAND_ATTACK); } break; - case 51: - if (sTradeData->bg2Zoom < 0x400) + case STATE_GBA_ZOOM_IN: + if (sTradeAnim->bg2Zoom < 0x400) { - sTradeData->bg2Zoom += 0x34; + sTradeAnim->bg2Zoom += 0x34; } else { - sTradeData->bg2Zoom = 0x400; - sTradeData->state++; + sTradeAnim->bg2Zoom = 0x400; + sTradeAnim->state++; } - sTradeData->sXY = 0x8000 / sTradeData->bg2Zoom; + sTradeAnim->sXY = 0x8000 / sTradeAnim->bg2Zoom; break; - case 52: + case STATE_FADE_OUT_TO_NEW_MON: BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); - sTradeData->state = 60; + sTradeAnim->state = 60; break; - - case 60: + case STATE_WAIT_FADE_OUT_TO_NEW_MON: if (!gPaletteFade.active) { SetTradeSequenceBgGpuRegs(5); SetTradeSequenceBgGpuRegs(7); gPaletteFade.bufferTransferDisabled = TRUE; - sTradeData->state++; + sTradeAnim->state++; } break; - case 61: + case STATE_FADE_IN_TO_NEW_MON: gPaletteFade.bufferTransferDisabled = FALSE; BeginNormalPaletteFade(PALETTES_ALL, 0, 16, 0, RGB_BLACK); - sTradeData->state++; + sTradeAnim->state++; break; - case 62: + case STATE_WAIT_FADE_IN_TO_NEW_MON: SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG2_ON | DISPCNT_OBJ_ON); if (!gPaletteFade.active) + sTradeAnim->state++; + break; + case STATE_POKEBALL_ARRIVE: + sTradeAnim->bouncingPokeballSpriteId = CreateSprite(&sSpriteTemplate_Pokeball, 120, -8, 0); + gSprites[sTradeAnim->bouncingPokeballSpriteId].data[3] = 74; + gSprites[sTradeAnim->bouncingPokeballSpriteId].callback = SpriteCB_BouncingPokeballArrive; + StartSpriteAnim(&gSprites[sTradeAnim->bouncingPokeballSpriteId], 1); + StartSpriteAffineAnim(&gSprites[sTradeAnim->bouncingPokeballSpriteId], 2); + BlendPalettes(1 << (16 + gSprites[sTradeAnim->bouncingPokeballSpriteId].oam.paletteNum), 16, RGB_WHITEALPHA); + sTradeAnim->state++; + sTradeAnim->timer = 0; + break; + case STATE_FADE_POKEBALL_TO_NORMAL: + BeginNormalPaletteFade(1 << (16 + gSprites[sTradeAnim->bouncingPokeballSpriteId].oam.paletteNum), 1, 16, 0, RGB_WHITEALPHA); + sTradeAnim->state++; + break; + case STATE_POKEBALL_ARRIVE_WAIT: + if (gSprites[sTradeAnim->bouncingPokeballSpriteId].callback == SpriteCallbackDummy) { - sTradeData->state++; + HandleLoadSpecialPokePic(&gMonFrontPicTable[sTradeAnim->monSpecies[TRADE_PARTNER]], + gMonSpritesGfxPtr->sprites[B_POSITION_OPPONENT_RIGHT], + sTradeAnim->monSpecies[TRADE_PARTNER], + sTradeAnim->monPersonalities[TRADE_PARTNER]); + sTradeAnim->state++; } break; - case 63: - sTradeData->pokeballSpriteId2 = CreateSprite(&sTradePokeballSpriteTemplate, 120, -8, 0); - gSprites[sTradeData->pokeballSpriteId2].data[3] = 74; - gSprites[sTradeData->pokeballSpriteId2].callback = SpriteCB_TradePokeball_Inbound; - StartSpriteAnim(&gSprites[sTradeData->pokeballSpriteId2], 1); - StartSpriteAffineAnim(&gSprites[sTradeData->pokeballSpriteId2], 2); - BlendPalettes(1 << (16 + gSprites[sTradeData->pokeballSpriteId2].oam.paletteNum), 16, RGB_WHITEALPHA); - sTradeData->state++; - sTradeData->timer = 0; + case STATE_SHOW_NEW_MON: + gSprites[sTradeAnim->monSpriteIds[TRADE_PARTNER]].x = 120; + gSprites[sTradeAnim->monSpriteIds[TRADE_PARTNER]].y = gMonFrontPicCoords[sTradeAnim->monSpecies[TRADE_PARTNER]].y_offset + 60; + gSprites[sTradeAnim->monSpriteIds[TRADE_PARTNER]].x2 = 0; + gSprites[sTradeAnim->monSpriteIds[TRADE_PARTNER]].y2 = 0; + StartSpriteAnim(&gSprites[sTradeAnim->monSpriteIds[TRADE_PARTNER]], 0); + CreatePokeballSpriteToReleaseMon(sTradeAnim->monSpriteIds[TRADE_PARTNER], gSprites[sTradeAnim->monSpriteIds[TRADE_PARTNER]].oam.paletteNum, 120, 84, 2, 1, 20, 0xFFFFF); + FreeSpriteOamMatrix(&gSprites[sTradeAnim->bouncingPokeballSpriteId]); + DestroySprite(&gSprites[sTradeAnim->bouncingPokeballSpriteId]); + sTradeAnim->state++; break; - case 64: - BeginNormalPaletteFade(1 << (16 + gSprites[sTradeData->pokeballSpriteId2].oam.paletteNum), 1, 16, 0, RGB_WHITEALPHA); - sTradeData->state++; - break; - case 65: - if (gSprites[sTradeData->pokeballSpriteId2].callback == SpriteCallbackDummy) - { - HandleLoadSpecialPokePic(&gMonFrontPicTable[sTradeData->tradeSpecies[1]], gMonSpritesGfxPtr->sprites[3], sTradeData->tradeSpecies[1], sTradeData->monPersonalities[1]); - sTradeData->state++; - } - break; - case 66: - gSprites[sTradeData->pokePicSpriteIdxs[1]].x = 120; - gSprites[sTradeData->pokePicSpriteIdxs[1]].y = gMonFrontPicCoords[sTradeData->tradeSpecies[1]].y_offset + 60; - gSprites[sTradeData->pokePicSpriteIdxs[1]].x2 = 0; - gSprites[sTradeData->pokePicSpriteIdxs[1]].y2 = 0; - StartSpriteAnim(&gSprites[sTradeData->pokePicSpriteIdxs[1]], 0); - CreatePokeballSpriteToReleaseMon(sTradeData->pokePicSpriteIdxs[1], gSprites[sTradeData->pokePicSpriteIdxs[1]].oam.paletteNum, 120, 84, 2, 1, 20, 0xFFFFF); - FreeSpriteOamMatrix(&gSprites[sTradeData->pokeballSpriteId2]); - DestroySprite(&gSprites[sTradeData->pokeballSpriteId2]); - sTradeData->state++; - break; - case 67: + case STATE_NEW_MON_MSG: SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | @@ -2187,86 +2229,72 @@ static bool8 DoTradeAnim_Wireless(void) DISPCNT_OBJ_ON); StringExpandPlaceholders(gStringVar4, gText_XSentOverY); DrawTextOnTradeWindow(0, gStringVar4, 0); - sTradeData->state = 167; - sTradeData->timer = 0; + sTradeAnim->state = STATE_DELAY_FOR_MON_ANIM; + sTradeAnim->timer = 0; break; - // 167 and 267 are extra cases added in for animations - case 167: - if (++sTradeData->timer > 60) + case STATE_DELAY_FOR_MON_ANIM: + if (++sTradeAnim->timer > 60) { - if (sTradeData->tradeSpecies[1] != SPECIES_EGG) - { - PlayCry_Normal(sTradeData->tradeSpecies[1], 0); - } - sTradeData->state = 267; - sTradeData->timer = 0; + if (sTradeAnim->monSpecies[TRADE_PARTNER] != SPECIES_EGG) + PlayCry_Normal(sTradeAnim->monSpecies[TRADE_PARTNER], 0); + sTradeAnim->state = STATE_WAIT_FOR_MON_CRY; + sTradeAnim->timer = 0; } break; - case 267: + case STATE_WAIT_FOR_MON_CRY: if (IsCryFinished()) - { - sTradeData->state = 68; - } + sTradeAnim->state = STATE_TAKE_CARE_OF_MON; break; - case 68: - if (++sTradeData->timer == 10) - { + case STATE_TAKE_CARE_OF_MON: + if (++sTradeAnim->timer == 10) PlayFanfare(MUS_EVOLVED); - } - if (sTradeData->timer == 250) + + if (sTradeAnim->timer == 250) { - sTradeData->state++; + sTradeAnim->state++; StringExpandPlaceholders(gStringVar4, gText_TakeGoodCareOfX); DrawTextOnTradeWindow(0, gStringVar4, 0); - sTradeData->timer = 0; + sTradeAnim->timer = 0; } break; - case 69: - if (++sTradeData->timer == 60) - { - sTradeData->state++; - } + case STATE_AFTER_NEW_MON_DELAY: + if (++sTradeAnim->timer == 60) + sTradeAnim->state++; break; - case 70: + case STATE_CHECK_RIBBONS: CheckPartnersMonForRibbons(); - sTradeData->state++; + sTradeAnim->state++; break; - case 71: - if (sTradeData->isLinkTrade) - { + case STATE_END_LINK_TRADE: + if (sTradeAnim->isLinkTrade) return TRUE; - } else if (JOY_NEW(A_BUTTON)) - { - sTradeData->state++; - } + sTradeAnim->state++; break; - case 72: // Only if in-game trade + case STATE_TRY_EVOLUTION: // Only if in-game trade, link trades use CB2_TryLinkTradeEvolution TradeMons(gSpecialVar_0x8005, 0); - gCB2_AfterEvolution = CB2_RunTradeAnim_InGameTrade; - evoTarget = GetEvolutionTargetSpecies(&gPlayerParty[gSelectedTradeMonPositions[0]], EVO_MODE_TRADE, ITEM_NONE); + gCB2_AfterEvolution = CB2_InGameTrade; + evoTarget = GetEvolutionTargetSpecies(&gPlayerParty[gSelectedTradeMonPositions[TRADE_PLAYER]], EVO_MODE_TRADE, ITEM_NONE); if (evoTarget != SPECIES_NONE) - { - TradeEvolutionScene(&gPlayerParty[gSelectedTradeMonPositions[0]], evoTarget, sTradeData->pokePicSpriteIdxs[1], gSelectedTradeMonPositions[0]); - } - sTradeData->state++; + TradeEvolutionScene(&gPlayerParty[gSelectedTradeMonPositions[TRADE_PLAYER]], evoTarget, sTradeAnim->monSpriteIds[TRADE_PARTNER], gSelectedTradeMonPositions[TRADE_PLAYER]); + sTradeAnim->state++; break; - case 73: + case STATE_FADE_OUT_END: BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); - sTradeData->state++; + sTradeAnim->state++; break; - case 74: + case STATE_WAIT_FADE_OUT_END: if (!gPaletteFade.active) { - PlayNewMapMusic(sTradeData->cachedMapMusic); - if (sTradeData) + PlayNewMapMusic(sTradeAnim->cachedMapMusic); + if (sTradeAnim) { FreeAllWindowBuffers(); Free(GetBgTilemapBuffer(3)); Free(GetBgTilemapBuffer(1)); Free(GetBgTilemapBuffer(0)); FreeMonSpritesGfx(); - FREE_AND_SET_NULL(sTradeData); + FREE_AND_SET_NULL(sTradeAnim); } SetMainCallback2(CB2_ReturnToField); BufferInGameTradeMonName(); @@ -2277,7 +2305,9 @@ static bool8 DoTradeAnim_Wireless(void) return FALSE; } -static void CB2_TryEvolveAfterTrade(void) +// Try to evolve a Pokémon received in a link trade +// In-game trades resolve evolution during the trade sequence, in STATE_TRY_EVOLUTION +static void CB2_TryLinkTradeEvolution(void) { u16 evoSpecies; switch (gMain.state) @@ -2287,13 +2317,13 @@ static void CB2_TryEvolveAfterTrade(void) gSoftResetDisabled = TRUE; break; case 4: - gCB2_AfterEvolution = CB2_HandleTradeEnded; - evoSpecies = GetEvolutionTargetSpecies(&gPlayerParty[gSelectedTradeMonPositions[0]], EVO_MODE_TRADE, 0); + gCB2_AfterEvolution = CB2_SaveAndEndTrade; + evoSpecies = GetEvolutionTargetSpecies(&gPlayerParty[gSelectedTradeMonPositions[TRADE_PLAYER]], EVO_MODE_TRADE, 0); if (evoSpecies != SPECIES_NONE) - TradeEvolutionScene(&gPlayerParty[gSelectedTradeMonPositions[0]], evoSpecies, sTradeData->pokePicSpriteIdxs[1], gSelectedTradeMonPositions[0]); + TradeEvolutionScene(&gPlayerParty[gSelectedTradeMonPositions[TRADE_PLAYER]], evoSpecies, sTradeAnim->monSpriteIds[TRADE_PARTNER], gSelectedTradeMonPositions[TRADE_PLAYER]); else - SetMainCallback2(CB2_HandleTradeEnded); - gSelectedTradeMonPositions[0] = 0xFF; + SetMainCallback2(CB2_SaveAndEndTrade); + gSelectedTradeMonPositions[TRADE_PLAYER] = 0xFF; break; } if (!HasLinkErrorOccurred()) @@ -2306,25 +2336,25 @@ static void CB2_TryEvolveAfterTrade(void) static void HandleLinkDataReceive(void) { u8 recvStatus; - GetMultiplayerIdOfLinkTrade(); + TradeGetMultiplayerId(); // no effect call, ret val ignored recvStatus = GetBlockReceivedStatus(); if (recvStatus & (1 << 0)) { - if (gBlockRecvBuffer[0][0] == 0xDCBA) - SetMainCallback2(CB2_TryEvolveAfterTrade); - if (gBlockRecvBuffer[0][0] == 0xABCD) - sTradeData->tradeStatus1 = 1; + if (gBlockRecvBuffer[0][0] == LINKCMD_CONFIRM_FINISH_TRADE) + SetMainCallback2(CB2_TryLinkTradeEvolution); + if (gBlockRecvBuffer[0][0] == LINKCMD_READY_FINISH_TRADE) + sTradeAnim->playerFinishStatus = STATUS_READY; ResetBlockReceivedFlag(0); } if (recvStatus & (1 << 1)) { - if (gBlockRecvBuffer[1][0] == 0xABCD) - sTradeData->tradeStatus2 = 1; + if (gBlockRecvBuffer[1][0] == LINKCMD_READY_FINISH_TRADE) + sTradeAnim->partnerFinishStatus = STATUS_READY; ResetBlockReceivedFlag(1); } } -static void SpriteCB_TradePokeball_Default(struct Sprite *sprite) +static void SpriteCB_BouncingPokeball(struct Sprite *sprite) { sprite->y += sprite->data[0] / 10; sprite->data[5] += sprite->data[1]; @@ -2345,39 +2375,36 @@ static void SpriteCB_TradePokeball_Default(struct Sprite *sprite) } } -static void SpriteCB_TradePokeball_Outbound(struct Sprite *sprite) +static void SpriteCB_BouncingPokeballDepart(struct Sprite *sprite) { sprite->y2 += sTradeBallVerticalVelocityTable[sprite->data[0]]; if (sprite->data[0] == 22) PlaySE(SE_BALL_BOUNCE_1); - sprite->data[0]++; - if (sprite->data[0] == 44) + if (++sprite->data[0] == 44) { PlaySE(SE_M_MEGA_KICK); - sprite->callback = SpriteCB_TradePokeball_Outbound2; + sprite->callback = SpriteCB_BouncingPokeballDepartEnd; sprite->data[0] = 0; BeginNormalPaletteFade(1 << (sprite->oam.paletteNum + 16), -1, 0, 16, RGB_WHITEALPHA); } } -static void SpriteCB_TradePokeball_Outbound2(struct Sprite *sprite) +static void SpriteCB_BouncingPokeballDepartEnd(struct Sprite *sprite) { if (sprite->data[1] == 20) StartSpriteAffineAnim(sprite, 1); - sprite->data[1]++; - if (sprite->data[1] > 20) + if (++sprite->data[1] > 20) { sprite->y2 -= sTradeBallVerticalVelocityTable[sprite->data[0]]; - sprite->data[0]++; - if (sprite->data[0] == 23) + if (++sprite->data[0] == 23) { DestroySprite(sprite); - sTradeData->state = 14; + sTradeAnim->state = 14; } } } -static void SpriteCB_TradePokeball_Inbound(struct Sprite *sprite) +static void SpriteCB_BouncingPokeballArrive(struct Sprite *sprite) { if (sprite->data[2] == 0) { @@ -2398,8 +2425,7 @@ static void SpriteCB_TradePokeball_Inbound(struct Sprite *sprite) if (sprite->data[0] == 107) PlaySE(SE_BALL_BOUNCE_4); sprite->y2 += sTradeBallVerticalVelocityTable[sprite->data[0]]; - sprite->data[0]++; - if (sprite->data[0] == 108) + if (++sprite->data[0] == 108) sprite->callback = SpriteCallbackDummy; } } @@ -2434,7 +2460,7 @@ static void CreateInGameTradePokemonInternal(u8 playerSlot, u8 inGameTradeIdx) u8 metLocation = METLOC_IN_GAME_TRADE; struct Pokemon * tradeMon = &gEnemyParty[0]; u8 mailNum; - CreateMon(tradeMon, inGameTrade->species, level, 32, TRUE, inGameTrade->personality, TRUE, inGameTrade->otId); + CreateMon(tradeMon, inGameTrade->species, level, USE_RANDOM_IVS, TRUE, inGameTrade->personality, TRUE, inGameTrade->otId); SetMonData(tradeMon, MON_DATA_HP_IV, &inGameTrade->ivs[0]); SetMonData(tradeMon, MON_DATA_ATK_IV, &inGameTrade->ivs[1]); SetMonData(tradeMon, MON_DATA_DEF_IV, &inGameTrade->ivs[2]); @@ -2497,16 +2523,16 @@ void CreateInGameTradePokemon(void) CreateInGameTradePokemonInternal(gSpecialVar_0x8005, gSpecialVar_0x8004); } -static void CB2_RunTradeAnim_LinkTrade(void) +static void CB2_UpdateLinkTrade(void) { if (DoTradeAnim() == TRUE) { - DestroySprite(&gSprites[sTradeData->pokePicSpriteIdxs[0]]); - FreeSpriteOamMatrix(&gSprites[sTradeData->pokePicSpriteIdxs[1]]); - TradeMons(gSelectedTradeMonPositions[0], gSelectedTradeMonPositions[1] % 6); - sTradeData->linkData[0] = 0xABCD; - sTradeData->scheduleLinkTransfer = 1; - SetMainCallback2(CB2_WaitAndAckTradeComplete); + DestroySprite(&gSprites[sTradeAnim->monSpriteIds[TRADE_PLAYER]]); + FreeSpriteOamMatrix(&gSprites[sTradeAnim->monSpriteIds[TRADE_PARTNER]]); + TradeMons(gSelectedTradeMonPositions[TRADE_PLAYER], gSelectedTradeMonPositions[TRADE_PARTNER] % PARTY_SIZE); + sTradeAnim->linkData[0] = LINKCMD_READY_FINISH_TRADE; + sTradeAnim->scheduleLinkTransfer = 1; + SetMainCallback2(CB2_WaitTradeComplete); } HandleLinkDataSend(); HandleLinkDataReceive(); @@ -2517,16 +2543,18 @@ static void CB2_RunTradeAnim_LinkTrade(void) UpdatePaletteFade(); } -static void CB2_WaitAndAckTradeComplete(void) +static void CB2_WaitTradeComplete(void) { - u8 mpId = GetMultiplayerIdOfLinkTrade(); + u8 mpId = TradeGetMultiplayerId(); HandleLinkDataReceive(); - if (mpId == 0 && sTradeData->tradeStatus1 == 1 && sTradeData->tradeStatus2 == 1) + if (mpId == 0 + && sTradeAnim->playerFinishStatus == STATUS_READY + && sTradeAnim->partnerFinishStatus == STATUS_READY) { - sTradeData->linkData[0] = 0xDCBA; - SendBlock(BitmaskAllOtherLinkPlayers(), sTradeData->linkData, 20); - sTradeData->tradeStatus1 = 2; - sTradeData->tradeStatus2 = 2; + sTradeAnim->linkData[0] = LINKCMD_CONFIRM_FINISH_TRADE; + SendBlock(BitmaskAllOtherLinkPlayers(), sTradeAnim->linkData, sizeof(sTradeAnim->linkData)); + sTradeAnim->playerFinishStatus = STATUS_CANCEL; + sTradeAnim->partnerFinishStatus = STATUS_CANCEL; } RunTasks(); AnimateSprites(); @@ -2534,7 +2562,7 @@ static void CB2_WaitAndAckTradeComplete(void) UpdatePaletteFade(); } -static void CB2_HandleTradeEnded(void) +static void CB2_SaveAndEndTrade(void) { switch (gMain.state) { @@ -2546,24 +2574,20 @@ static void CB2_HandleTradeEnded(void) case 1: SetLinkStandbyCallback(); gMain.state = 100; - sTradeData->timer = 0; + sTradeAnim->timer = 0; break; case 100: - if (++sTradeData->timer > 180) + if (++sTradeAnim->timer > 180) { gMain.state = 101; - sTradeData->timer = 0; + sTradeAnim->timer = 0; } if (IsLinkTaskFinished()) - { gMain.state = 2; - } break; case 101: if (IsLinkTaskFinished()) - { gMain.state = 2; - } break; case 2: gMain.state = 50; @@ -2573,11 +2597,11 @@ static void CB2_HandleTradeEnded(void) case 50: if (InUnionRoom()) { - SetQuestLogEvent(QL_EVENT_LINK_TRADED_UNION, (void *)&sTradeData->questLogData); + SetQuestLogEvent(QL_EVENT_LINK_TRADED_UNION, (void *)&sTradeAnim->questLogData); } else { - SetQuestLogEvent(QL_EVENT_LINK_TRADED, (void *)&sTradeData->questLogData); + SetQuestLogEvent(QL_EVENT_LINK_TRADED, (void *)&sTradeAnim->questLogData); IncrementGameStat(GAME_STAT_POKEMON_TRADES); } if (gWirelessCommType) @@ -2585,13 +2609,11 @@ static void CB2_HandleTradeEnded(void) SetContinueGameWarpStatusToDynamicWarp(); LinkFullSave_Init(); gMain.state++; - sTradeData->timer = 0; + sTradeAnim->timer = 0; break; case 51: - if (++sTradeData->timer == 5) - { + if (++sTradeAnim->timer == 5) gMain.state++; - } break; case 52: if (LinkFullSave_WriteSector()) @@ -2601,38 +2623,35 @@ static void CB2_HandleTradeEnded(void) } else { - sTradeData->timer = 0; + // Save isn't finished, delay again + sTradeAnim->timer = 0; gMain.state = 51; } break; case 4: LinkFullSave_ReplaceLastSector(); gMain.state = 40; - sTradeData->timer = 0; + sTradeAnim->timer = 0; break; case 40: - if (++sTradeData->timer > 50) + if (++sTradeAnim->timer > 50) { if (GetMultiplayerId() == 0) - { - sTradeData->timer = Random() % 30; - } + sTradeAnim->timer = Random() % 30; else - { - sTradeData->timer = 0; - } + sTradeAnim->timer = 0; gMain.state = 41; } break; case 41: - if (sTradeData->timer == 0) + if (sTradeAnim->timer == 0) { SetLinkStandbyCallback(); gMain.state = 42; } else { - sTradeData->timer--; + sTradeAnim->timer--; } break; case 42: @@ -2643,7 +2662,7 @@ static void CB2_HandleTradeEnded(void) } break; case 5: - if (++sTradeData->timer > 60) + if (++sTradeAnim->timer > 60) { gMain.state++; SetLinkStandbyCallback(); @@ -2667,13 +2686,9 @@ static void CB2_HandleTradeEnded(void) if (IsBGMStopped() == TRUE) { if (gWirelessCommType && gMain.savedCallback == CB2_StartCreateTradeMenu) - { SetLinkStandbyCallback(); - } else - { SetCloseLinkCallback(); - } gMain.state++; } break; @@ -2683,13 +2698,13 @@ static void CB2_HandleTradeEnded(void) if (IsLinkRfuTaskFinished()) { gSoftResetDisabled = FALSE; - SetMainCallback2(LinkTrade_TearDownAssets); + SetMainCallback2(CB2_FreeTradeAnim); } } else if (!gReceivedRemoteLinkPlayers) { gSoftResetDisabled = FALSE; - SetMainCallback2(LinkTrade_TearDownAssets); + SetMainCallback2(CB2_FreeTradeAnim); } break; } @@ -2702,7 +2717,7 @@ static void CB2_HandleTradeEnded(void) UpdatePaletteFade(); } -static void LinkTrade_TearDownAssets(void) +static void CB2_FreeTradeAnim(void) { if (!gPaletteFade.active) { @@ -2711,7 +2726,7 @@ static void LinkTrade_TearDownAssets(void) Free(GetBgTilemapBuffer(1)); Free(GetBgTilemapBuffer(0)); FreeMonSpritesGfx(); - FREE_AND_SET_NULL(sTradeData); + FREE_AND_SET_NULL(sTradeAnim); if (gWirelessCommType != 0) DestroyWirelessStatusIndicatorSprite(); SetMainCallback2(gMain.savedCallback); @@ -2725,16 +2740,16 @@ static void LinkTrade_TearDownAssets(void) void DoInGameTradeScene(void) { LockPlayerFieldControls(); - CreateTask(Task_WaitFadeAndStartInGameTradeAnim, 10); + CreateTask(Task_InGameTrade, 10); BeginNormalPaletteFade(PALETTES_ALL, 0, 0, 16, RGB_BLACK); HelpSystem_Disable(); } -static void Task_WaitFadeAndStartInGameTradeAnim(u8 taskId) +static void Task_InGameTrade(u8 taskId) { if (!gPaletteFade.active) { - SetMainCallback2(CB2_InitTradeAnim_InGameTrade); + SetMainCallback2(CB2_InitInGameTrade); gFieldCallback = FieldCB_ContinueScriptHandleMusic; DestroyTask(taskId); } @@ -2742,13 +2757,12 @@ static void Task_WaitFadeAndStartInGameTradeAnim(u8 taskId) static void CheckPartnersMonForRibbons(void) { - u8 nRibbons = 0; + u8 numRibbons = 0; u8 i; - for (i = 0; i < 12; i++) - { - nRibbons += GetMonData(&gEnemyParty[gSelectedTradeMonPositions[1] % 6], MON_DATA_CHAMPION_RIBBON + i); - } - if (nRibbons != 0) + for (i = 0; i < (MON_DATA_UNUSED_RIBBONS - MON_DATA_CHAMPION_RIBBON); i++) + numRibbons += GetMonData(&gEnemyParty[gSelectedTradeMonPositions[TRADE_PARTNER] % PARTY_SIZE], MON_DATA_CHAMPION_RIBBON + i); + + if (numRibbons != 0) FlagSet(FLAG_SYS_RIBBON_GET); } @@ -2760,53 +2774,62 @@ void LoadTradeAnimGfx(void) void DrawTextOnTradeWindow(u8 windowId, const u8 *str, s8 speed) { FillWindowPixelBuffer(windowId, PIXEL_FILL(15)); - sTradeData->textColor[0] = 15; - sTradeData->textColor[1] = 1; - sTradeData->textColor[2] = 6; - AddTextPrinterParameterized4(windowId, FONT_NORMAL, 0, 2, 0, 2, sTradeData->textColor, speed, str); + sTradeAnim->textColor[0] = 15; + sTradeAnim->textColor[1] = 1; + sTradeAnim->textColor[2] = 6; + AddTextPrinterParameterized4(windowId, FONT_NORMAL, 0, 2, 0, 2, sTradeAnim->textColor, speed, str); CopyWindowToVram(windowId, COPYWIN_FULL); } static void Task_AnimateWirelessSignal(u8 taskId) { s16 *data = gTasks[taskId].data; - u16 r2 = 16 * sWirelessSignalAnimParams[data[0]][0]; - if (data[2] == 0) + u16 paletteIdx = 16 * sWirelessSignalAnimParams[tIdx][0]; + + if (!tSignalComingBack) { - if (r2 == 0x100) + if (paletteIdx == 0x100) LoadPalette(sWirelessSignalAnimPals_Off, 0x30, 0x20); else - LoadPalette(&sWirelessSignalAnimPals_Outbound[r2], 0x30, 0x20); + LoadPalette(&sWirelessSignalAnimPals_Outbound[paletteIdx], 0x30, 0x20); } else { - if (r2 == 0x100) + if (paletteIdx == 0x100) LoadPalette(sWirelessSignalAnimPals_Off, 0x30, 0x20); else - LoadPalette(&sWirelessSignalAnimPals_Inbound[r2], 0x30, 0x20); + LoadPalette(&sWirelessSignalAnimPals_Inbound[paletteIdx], 0x30, 0x20); } - if (sWirelessSignalAnimParams[data[0]][0] == 0 && data[1] == 0) + + if (sWirelessSignalAnimParams[tIdx][0] == 0 && tCounter == 0) PlaySE(SE_M_HEAL_BELL); - if (data[1] == sWirelessSignalAnimParams[data[0]][1]) + + if (tCounter == sWirelessSignalAnimParams[tIdx][1]) { - data[0]++; - data[1] = 0; - if (sWirelessSignalAnimParams[data[0]][1] == 0xFF) + tIdx++; + tCounter = 0; + if (sWirelessSignalAnimParams[tIdx][1] == 0xFF) DestroyTask(taskId); } else - data[1]++; + { + tCounter++; + } } +#undef tIdx +#undef tCounter +#undef tSignalComingBack + static void Task_OpenCenterWhiteColumn(u8 taskId) { s16 *data = gTasks[taskId].data; if (data[0] == 0) { - sTradeData->win0left = sTradeData->win0right = 120; - sTradeData->win0top = 0; - sTradeData->win0bottom = 160; + sTradeAnim->win0left = sTradeAnim->win0right = DISPLAY_WIDTH / 2; + sTradeAnim->win0top = 0; + sTradeAnim->win0bottom = DISPLAY_HEIGHT; SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON); SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_OBJ); SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG0 | @@ -2814,17 +2837,15 @@ static void Task_OpenCenterWhiteColumn(u8 taskId) WININ_WIN0_OBJ); } - SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE2(sTradeData->win0left, sTradeData->win0right)); - SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE2(sTradeData->win0top, sTradeData->win0bottom)); + SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE2(sTradeAnim->win0left, sTradeAnim->win0right)); + SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE2(sTradeAnim->win0top, sTradeAnim->win0bottom)); data[0]++; - sTradeData->win0left -= 5; - sTradeData->win0right += 5; + sTradeAnim->win0left -= 5; + sTradeAnim->win0right += 5; - if (sTradeData->win0left < 80) - { + if (sTradeAnim->win0left < 80) DestroyTask(taskId); - } } static void Task_CloseCenterWhiteColumn(u8 taskId) @@ -2833,24 +2854,24 @@ static void Task_CloseCenterWhiteColumn(u8 taskId) if (data[0] == 0) { - sTradeData->win0left = 80; - sTradeData->win0right = 160; + sTradeAnim->win0left = 80; + sTradeAnim->win0right = DISPLAY_WIDTH - 80; SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_OBJ); SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG0 | WININ_WIN0_BG1 | WININ_WIN0_OBJ); } - SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE2(sTradeData->win0left, sTradeData->win0right)); - SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE2(sTradeData->win0top, sTradeData->win0bottom)); + SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE2(sTradeAnim->win0left, sTradeAnim->win0right)); + SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE2(sTradeAnim->win0top, sTradeAnim->win0bottom)); - if (sTradeData->win0left != 120) + if (sTradeAnim->win0left != DISPLAY_WIDTH / 2) { data[0]++; - sTradeData->win0left += 5; - sTradeData->win0right -= 5; + sTradeAnim->win0left += 5; + sTradeAnim->win0right -= 5; - if (sTradeData->win0left >= 116) + if (sTradeAnim->win0left > DISPLAY_WIDTH / 2 - 5) BlendPalettes(0x8, 0, RGB_WHITEALPHA); } else diff --git a/src/union_room.c b/src/union_room.c index decc1eb27..48545c01c 100644 --- a/src/union_room.c +++ b/src/union_room.c @@ -1176,7 +1176,7 @@ static u32 IsTryingToTradeAcrossVersionTooSoon(struct WirelessLink_Group * data, { if (!(gSaveBlock2Ptr->specialSaveWarpFlags & CHAMPION_SAVEWARP)) return UR_TRADE_PLAYER_NOT_READY; - else if (partner->rfu.data.compatibility.isChampion) + else if (partner->rfu.data.compatibility.canLinkNationally) return UR_TRADE_READY; } else diff --git a/src/union_room_chat_display.c b/src/union_room_chat_display.c index b129c6c87..ab789ca83 100644 --- a/src/union_room_chat_display.c +++ b/src/union_room_chat_display.c @@ -1195,7 +1195,7 @@ static void PrintKeyboardSwapTextsOnWin3(void) { FillWindowPixelBuffer(3, PIXEL_FILL(1)); DrawTextBorderOuter(3, 1, 13); - UnionRoomAndTradeMenuPrintOptions(3, FONT_NORMAL, 14, 5, sKeyboardSwapTexts); + PrintMenuTable(3, FONT_NORMAL, 14, 5, sKeyboardSwapTexts); Menu_InitCursor(3, FONT_NORMAL, 0, 0, 14, 5, GetCurrentKeyboardPage()); PutWindowTilemap(3); } diff --git a/sym_bss.txt b/sym_bss.txt index 9f50fd0a7..00c7b1dc6 100644 --- a/sym_bss.txt +++ b/sym_bss.txt @@ -28,6 +28,7 @@ .include "src/ereader_helpers.o" .include "src/digit_obj_util.o" .include "src/m4a_1.o" + .include "data/sound_data.o" .include "src/agb_flash.o" .include "*libgcc.a:dp-bit.o" .include "*libgcc.a:fp-bit.o" diff --git a/tools/gbagfx/convert_png.c b/tools/gbagfx/convert_png.c index 4f1b39e6d..a5fefbd8b 100644 --- a/tools/gbagfx/convert_png.c +++ b/tools/gbagfx/convert_png.c @@ -62,10 +62,7 @@ static unsigned char *ConvertBitDepth(unsigned char *src, int srcBitDepth, int d for (j = 8 - srcBitDepth; j >= 0; j -= srcBitDepth) { - unsigned char pixel = (srcByte >> j) % (1 << srcBitDepth); - - if (pixel >= (1 << destBitDepth)) - FATAL_ERROR("Image exceeds the maximum color value for a %ibpp image.\n", destBitDepth); + unsigned char pixel = (srcByte >> j) % (1 << destBitDepth); *dest |= pixel << destBit; destBit -= destBitDepth; if (destBit < 0)